ZGlmZiAtLWdpdCBhL0FOTk9VTkNFIGIvQU5OT1VOQ0UKaW5kZXggM2ViMDJlNC4uMDAyYmU2OSAxMDA2NDQKLS0tIGEvQU5OT1VOQ0UKKysrIGIvQU5OT1VOQ0UKQEAgLTEsMTQgKzEsMTQgQEAKLVRoaXMgaXMgcmVsZWFzZSA5ODAzMTUgb2YgV2luZSwgdGhlIE1TIFdpbmRvd3MgZW11bGF0b3IuICBUaGlzIGlzIHN0aWxsIGEKK1RoaXMgaXMgcmVsZWFzZSA5ODAzMjkgb2YgV2luZSwgdGhlIE1TIFdpbmRvd3MgZW11bGF0b3IuICBUaGlzIGlzIHN0aWxsIGEKIGRldmVsb3BlcidzIG9ubHkgcmVsZWFzZS4gIFRoZXJlIGFyZSBtYW55IGJ1Z3MgYW5kIG1hbnkgdW5pbXBsZW1lbnRlZCBBUEkKIGZlYXR1cmVzLiAgTW9zdCBhcHBsaWNhdGlvbnMgc3RpbGwgZG8gbm90IHdvcmsgY29ycmVjdGx5LgogCiBQYXRjaGVzIHNob3VsZCBiZSBzdWJtaXR0ZWQgdG8gImp1bGxpYXJkQGxyYy5lcGZsLmNoIi4gIFBsZWFzZSBkb24ndAogZm9yZ2V0IHRvIGluY2x1ZGUgYSBDaGFuZ2VMb2cgZW50cnkuCiAKLVdIQVQnUyBORVcgd2l0aCBXaW5lLTk4MDMxNTogKHNlZSBDaGFuZ2VMb2cgZm9yIGRldGFpbHMpCi0JLSBQcmVsaW1pbmFyeSBJbWFnZUxpc3RzIHN1cHBvcnQuCi0JLSBCZWdpbm5pbmdzIG9mIGVuaGFuY2VkIG1ldGFmaWxlcy4KLQktIE1vcmUgZGVidWdnaW5nIG1hY3JvcyBjaGFuZ2VzLgorV0hBVCdTIE5FVyB3aXRoIFdpbmUtOTgwMzI5OiAoc2VlIENoYW5nZUxvZyBmb3IgZGV0YWlscykKKwktIE1vcmUgSW1hZ2VMaXN0cyBzdXBwb3J0LgorCS0gTW9yZSBXaW4zMiBtZXRhZmlsZSBzdXBwb3J0LgorCS0gU3RpbGwgc29tZSBkZWJ1Z2dpbmcgb3V0cHV0IGNoYW5nZXMuCiAJLSBMb3RzIG9mIGJ1ZyBmaXhlcy4KIAogU2VlIHRoZSBSRUFETUUgZmlsZSBpbiB0aGUgZGlzdHJpYnV0aW9uIGZvciBpbnN0YWxsYXRpb24gaW5zdHJ1Y3Rpb25zLgpAQCAtMTcsMTAgKzE3LDEwIEBACiB0aGUgcmVsZWFzZSBpcyBhdmFpbGFibGUgYXQgdGhlIGZ0cCBzaXRlcy4gIFRoZSBzb3VyY2VzIHdpbGwgYmUgYXZhaWxhYmxlCiBmcm9tIHRoZSBmb2xsb3dpbmcgbG9jYXRpb25zOgogCi0gIGZ0cDovL3N1bnNpdGUudW5jLmVkdS9wdWIvTGludXgvQUxQSEEvd2luZS9kZXZlbG9wbWVudC9XaW5lLTk4MDMxNS50YXIuZ3oKLSAgZnRwOi8vdHN4LTExLm1pdC5lZHUvcHViL2xpbnV4L0FMUEhBL1dpbmUvZGV2ZWxvcG1lbnQvV2luZS05ODAzMTUudGFyLmd6Ci0gIGZ0cDovL2Z0cC5pbmZvbWFnaWMuY29tL3B1Yi9taXJyb3JzL2xpbnV4L3dpbmUvZGV2ZWxvcG1lbnQvV2luZS05ODAzMTUudGFyLmd6Ci0gIGZ0cDovL2Z0cC5wcm9nc29jLnV0cy5lZHUuYXUvcHViL1dpbmUvZGV2ZWxvcG1lbnQvV2luZS05ODAzMTUudGFyLmd6CisgIGZ0cDovL3N1bnNpdGUudW5jLmVkdS9wdWIvTGludXgvQUxQSEEvd2luZS9kZXZlbG9wbWVudC9XaW5lLTk4MDMyOS50YXIuZ3oKKyAgZnRwOi8vdHN4LTExLm1pdC5lZHUvcHViL2xpbnV4L0FMUEhBL1dpbmUvZGV2ZWxvcG1lbnQvV2luZS05ODAzMjkudGFyLmd6CisgIGZ0cDovL2Z0cC5pbmZvbWFnaWMuY29tL3B1Yi9taXJyb3JzL2xpbnV4L3dpbmUvZGV2ZWxvcG1lbnQvV2luZS05ODAzMjkudGFyLmd6CisgIGZ0cDovL2Z0cC5wcm9nc29jLnV0cy5lZHUuYXUvcHViL1dpbmUvZGV2ZWxvcG1lbnQvV2luZS05ODAzMjkudGFyLmd6CiAKIEl0IHNob3VsZCBhbHNvIGJlIGF2YWlsYWJsZSBmcm9tIGFueSBzaXRlIHRoYXQgbWlycm9ycyB0c3gtMTEgb3Igc3Vuc2l0ZS4KIApkaWZmIC0tZ2l0IGEvQ2hhbmdlTG9nIGIvQ2hhbmdlTG9nCmluZGV4IDcxZDZlYzIuLmRjNjE4YzUgMTAwNjQ0Ci0tLSBhL0NoYW5nZUxvZworKysgYi9DaGFuZ2VMb2cKQEAgLTEsNCArMSwxMzIgQEAKIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK1N1biBNYXIgMjkgMTU6MTg6NTcgMTk5OCAgVXdlIEJvbm5lcyA8ZWxla3Ryb24uaWtwLnBoeXNpay50dS1kYXJtc3RhZHQuZGU+CisKKwkqIFttc2Rvcy9pbnQyMS5jXQorCU1vcmUgdmVyYm9zZSBUcmFjZSBtZXNzYWdlcworCitTdW4gTWFyIDI5IDE1OjAzOjMwIDE5OTggIEFsZXhhbmRyZSBKdWxsaWFyZCAgPGp1bGxpYXJkQGxyYy5lcGZsLmNoPgorCisJKiBbbG9hZGVyL25lX2ltYWdlLmNdCisJVGVybWluYXRlIHJlbG9jYXRpb24gY2hhaW5zIG9uIDAgb2Zmc2V0LgorCitTdW4gTWFyIDI5IDAyOjM1OjQ1IDE5OTggIEphbWVzIEp1cmFuICA8anJqMTIwQHBzdS5lZHU+CisKKwkqIFt3aW5kb3dzL2NhcmV0LmNdIFt3aW5kb3dzL2NsYXNzLmNdIFt3aW5kb3dzL2NsaXBib2FyZC5jXQorCUZpeGVkIG1vcmUgVVNFUjMyIG9yZGluYWwgbnVtYmVycyBpbiBmdW5jdGlvbiBkb2N1bWVudGF0aW9uLgorCitTYXQgTWFyIDI4IDIyOjQwOjIzIDE5OTcgIEFuZHJlYXMgTW9ociA8MTAwLjMwOTM2QGdlcm1hbnkubmV0PgorCisJKiBbY29udHJvbHMvZGVza3RvcC5jXQorCVJldHVybiAxIGZvciBXTV9OQ0NSRUFURSBpbiBEZXNrdG9wV25kUHJvYy4KKworCSogW2NvbnRyb2xzL21lbnUuY10KKwlGaXhlZCBjcmFzaCB3aGVuIGRlc3Ryb3lpbmcgYSB0b3AgcG9wdXAgd2luIHRoYXQgd2FzIG9ubHkgY3JlYXRlZAorCWJ1dCBub3Qgc2hvd24uCisKKwkqIFtvbGUvdHlwZWxpYi5jXSBbaWYxNjMyL3R5cGVsaWIuc3BlY10KKwlJbXBsZW1lbnRlZCBPQUJ1aWxkVmVyc2lvbi4KKworCSogW3dpbmRvd3Mvd2luLmNdCisJRmluYWxseSBmaXhlZCB1Z2x5IGJ1ZyBpbiBHZXRQYXJlbnQzMiB0aGF0IGFmZmVjdGVkIHdpbmRvdyBwbGFjZW1lbnQ6CisJRGlkbid0IHJldHVybiAwIGZvciB3aW5kb3dzIHRoYXQgaGF2ZSBuZWl0aGVyIFdTX1BPUFVQIG5vcgorCVdTX0NISUxEIHNldC4gTm93IGl0IGFjdHMgZXhhY3RseSBsaWtlIFdpbmRvd3MgKGF0IGxlYXN0IEkgaG9wZSBzbyA7KQorCitTYXQgTWFyIDI4IDAyOjI2OjQzIDE5OTggIERpbWl0cmllIE8uIFBhdW4gIDxkaW1pQG1haWwuY3MudG9yb250by5lZHU+CisKKwkqIFtERVZFTE9QRVJTLUhJTlRTXSBbZG9jdW1lbnRhdGlvbi9kZWJ1Zy1tc2dzXQorCVVwZGF0ZWQgZG9jdW1lbnRhdGlvbiBvbiBkZWJ1ZyBtZXNzYWdlcworCisJKiBbaW5jbHVkZS9idXR0b24uaF0gW2NvbnRyb2xzL2J1dHRvbi5jXSBbaW5jbHVkZS93aW5kb3dzLmhdCisJW2luY2x1ZGUvY29tYm8uaF0gW2NvbnRyb2xzL2NvbWJvLmNdIFtjb250cm9scy9jb21tY3RybC5jXQorCVtjb250cm9scy9pY29udGl0bGUuY10gW2NvbnRyb2xzL2xpc3Rib3guY10JW2NvbnRyb2xzL21lbnUuY10KKwlbY29udHJvbHMvc2Nyb2xsLmNdIFtjb250cm9scy93aWRnZXRzLmNdIAorCUNoYW5nZWQgc29tZSAxNi1iaXQgY29kZSB0byAzMi1iaXQgY29kZS4gSSBhbSBwb3NpdGl2ZSB0aGlzIHdpbGwKKwlub3QgYnJlYWsgYW55dGhpbmcuCisKKwkqIFtjb250cm9scy91aXRvb2xzLmNdIAorCVJlbmFtZWQgdGhlIHByZWZpeCBvZiBzb21lIGZ1bmN0aW9ucyBmcm9tIFVJVE9PTFNfIHRvIFVJVE9PTFM5NV8KKwl0byByZWZsZWN0IHRoZSBmYWN0IHRoYXQgdGhleSBpbXBsZW1lbnQgV2luOTUgbG9vay4gTWF5YmUgd2Ugd2lsbAorCWhhdmUgYSBVSVRPT0xTMzFfIGluIHRoZSBmdXR1cmUuIEFueWhvdywgdGhlIGNoYW5nZSBpcyBjb21wbGV0ZWx5CisJaW50ZXJuYWwgdG8gdGhpcyBmaWxlLgorCisJKiBbKi8qLmNdCisJQ2hhbmdlZCBhIGxvdCBvZiBbZl1wcmludGYgaW50byBhcHByb3ByaWF0ZSBkZWJ1ZyBtZXNzYWdlcy4KKworRnJpIE1hciAyNyAxOTo1NjoxMiAxOTk4ICBNYXJjdXMgTWVpc3NuZXIgPG1zbWVpc3NuQGNpcC5pbmZvcm1hdGlrLnVuaS1lcmxhbmdlbi5kZT4KKwkqIFtkb2N1bWVudGF0aW9uL3N0YXR1cy9dCisJQWRkZWQgZGlyZWN0ZHJhdyBhbmQgZGlyZWN0c291bmQgc3RhdHVzLgorCisJKiBbaWYxNjMyL3RodW5rLmNdW29sZS8qLmNdW3dpbjMyL2tlcm5lbDMyLmNdCisJQWRkZWQgc29tZSBkb2N1bWVudGF0aW9uLgorCU1vdmVkIEZVTkMwMDQgdG8gdGh1bmsuYyBzaW5jZSBpdCBzZWVtcyB0byBiZSBhIDE2LT4zMiB0aHVuaworCShjYWxsaW5nIGNvbnZlbnRpb25zIGFuZCB0aGUgbGlrZSBzdGlsbCB1bmtub3duKS4KKworRnJpIE1hciAyNyAwOTo1OTozMiAxOTk4ICBNb3J0ZW4gRXJpa3NlbiAgPG1vcnRlbmVAcHZ2Lm9yZz4KKworCSogW2xvYWRlci9yZXNvdXJjZS5jXVt3aW5kb3dzL2tleWJvYXJkLmNdCisJSW1wbGVtZW50ZWQgQ29weUFjY2VsZXJhdG9yVGFibGUoKSBhbmQgQ3JlYXRlQWNjZWxlcmF0b3JUYWJsZSgpLgorCQorCSogW2luY2x1ZGUvY29tcG9iai5oXVtvbGUvY29tcG9iai5jXVtyZWxheTMyL29sZTMyLnNwZWNdCisJQWRkZWQgaW1wbGVtZW50YXRpb24gb2YgU3RyaW5nRnJvbUdVSUQyKCkuIAorCitUdWUgTWFyIDI2IDIzOjEyOjA1IDE5OTggIEVyaWMgS29obCA8ZWtvaGxAYWJvLnJoZWluLXplaXR1bmcuZGU+CisKKwkqIFttaXNjL2ltYWdlbGlzdC5jXVtyZWxheTMyL2NvbWN0bDMyLnNwZWNdCisJSW1wbGVtZW50ZWQgbmV3IGRlYnVnZ2luZyBpbnRlcmZhY2UuCisJQWRkZWQgbWlzc2luZyBmdW5jdGlvbnMgKHNvbWUgYXJlIGVtcHR5IHN0dWJzKS4KKwlDaGFuZ2VkIG9yZGluYWxzIGluIGNvbWN0bDMyLnNwZWMgKG5vdyBkbGwgdmVyc2lvbiA0LjcyIGNvbWF0aWJsZSkuCisKKwkqIFtvYmplY3RzL29lbWJpdG1hcHMuY11baW5jbHVkZS93aW5kb3dzLmhdCisJICBbaW5jbHVkZS9iaXRtYXBzLypdCisJQWRkZWQgbWlzc2luZyByZXN0b3JlIGJpdG1hcHMgZm9yIFdpbjk1IGxvb2suCisJQWRkZWQgbWlzc2luZyBXaW45NSBjdXJzb3JzLgorCitUaHUgTWFyIDI2IDEwOjE4OjIwIDE5OTggIERvdWdsYXMgUmlkZ3dheSAgPHJpZGd3YXlAd2luZWhxLmNvbT4KKworCSogW3Byb2dyYW1zL3ZpZXcvTWFrZWZpbGUuaW5dIFtwcm9ncmFtcy92aWV3L3ZpZXcuY10KKwlGaXggY29tcGlsYXRpb24sIEFsZHVzIHBsYWNlYWJsZSBtZXRhZmlsZSBsb2FkaW5nLgorCisJKiBbZ3JhcGhpY3MvbWV0YWZpbGVkcnYvaW5pdC5jXSBbcmVsYXkzMi9nZGkzMi5zcGVjXSAKKwkgIFtvYmplY3RzL21ldGFmaWxlLmNdCisJSW1wbGVtZW50ZWQgdmFyaW91cyAzMiBiaXQgdmVyc2lvbnMgb2YgcmVndWxhciBtZXRhZmlsZSBBUEkuCisKKwkqIFtvYmplY3RzL2VuaG1ldGFmaWxlLmNdCisJSW1wbGVtZW50ZWQgcmVuZGVyaW5nIG9mIGEgY291cGxlIG9mIGRvemVuIHJlY29yZHMuCisKK1R1ZSBNYXIgMjQgMjA6MDY6MzkgMTk5OCAgTWF0dGhldyBCZWNrZXIgPG1iZWNrZXJAZ2xhc3NjaXR5Lm5ldD4KKworCSogW21lbW9yeS8qLmNdCisJVXBkYXRlZCBkb2N1bWVudGF0aW9uIGZvciBBUEkgbWFucGFnZXMuCisKK01vbiBNYXIgMjMgMDk6MDk6MDAgMTk5OCAgQWxleCBLb3JvYmthIDxhbGV4QHBoYXJtLnN1bnlzYi5lZHU+CisKKwkqIFttaXNjL3dpbnNvY2suY10KKwlGaXhlZCAzMi1iaXQgRE5TIGxvb2t1cC4KKworTW9uIE1hciAyMyAyMzo1NDo0NyAxOTk4ICBMdWl6IE90YXZpbyBMLiBab3J6ZWxsYSAgPHpvcnplbGxhQG5yLmNvbmV4d2FyZS5jb20+CisKKwkqIFttdWx0aW1lZGlhL2luaXQuY10KKwlOZXcgY29kZSBmb3IgdGhlIGluaXRpYWxpemF0aW9uIGFuZCBnYXRoZXJpbmcgb2YgaW5mb3JtYXRpb24gYWJvdXQKKwl0aGUgTUlESSBkZXZpY2VzLCBmb3IgZnV0dXJlIHVzZS4KKworVGh1IE1hciAxOSAwMDo1OToyOSAxOTk4ICBKaW0gUGV0ZXJzb24gPGpzcGV0ZXJAbm9zcGFtLmJpcmNoLmVlLnZ0LmVkdT4KKworCSogW3dpbmRvd3Mvd2luLmNdCisJRWxpbWluYXRlZCBpbmFjY3VyYXRlIHNldHRpbmcgb2YgY3MtPmhNZW51IGluCisJV0lOX0NyZWF0ZVdpbmRvd0V4LCBhbG9uZyB3aXRoIHN1cGVyZmx1b3VzIFNldE1lbnUzMiBjYWxsLgorCitNb24gTWFyIDE2IDE3OjQwOjUzIDE5OTggIFBldHRlciBSZWluaG9sZHRzZW4gPHBlcmVAdGQub3JnLnVpdC5ubz4KKworCSogW2RlYnVnZ2VyL2RiZy55XSBbZGVidWdnZXIvTWFrZWZpbGUuaW5dIFtNYWtlZmlsZS5pbl0KKwlJbnN0YWxsIHdpbmUuc3ltIGluICQoZXhlY19wcmVmaXgpL2xpYiBhbmQgbWFrZSBzdXJlIHRoZSBkZWJ1Z2dlcgorCWZpbmRzIGl0LgorCitTdW4gTWFyIDE1IDIyOjM2OjM1IDE5OTggIE1pY2hhZWwgVmVrc2xlciA8bXZla3NsZXJAdHgudGVjaG5pb24uYWMuaWw+CisKKwkqIFtkdW1teS5jXSBbaWYxNjMyL2dkaS5zcGVjXQorCUZpeGVkIHN0dWIgZGVjbGFyYXRpb24gb2YgR0RJXzUzMiwgc28gSGVicmV3LVdvcmQyIGtpbmQgb2Ygd29ya3MuCisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIFN1biBNYXIgMTUgMDM6NDY6NTAgMTk5OCAgRGltaXRyaWUgTy4gUGF1biAgPGRpbWlAbWFpbC5jcy50b3JvbnRvLmVkdT4KIAogCSogWyovKl0KZGlmZiAtLWdpdCBhL0RFVkVMT1BFUlMtSElOVFMgYi9ERVZFTE9QRVJTLUhJTlRTCmluZGV4IDdmNjhiYTQuLjQwY2NiNmEgMTAwNjQ0Ci0tLSBhL0RFVkVMT1BFUlMtSElOVFMKKysrIGIvREVWRUxPUEVSUy1ISU5UUwpAQCAtMTk4LDQ3ICsxOTgsNDEgQEAKIFRvIGRpc3BsYXkgYSBtZXNzYWdlIG9ubHkgZHVyaW5nIGRlYnVnZ2luZywgeW91IG5vcm1hbGx5IHdyaXRlIHNvbWV0aGluZwogbGlrZSB0aGlzOgogCi0jaWZkZWYgREVCVUdfV0lOCi0JcHJpbnRmKCJhYmMuLi4iKTsKLSNlbmRpZgorICAgICAgICBUUkFDRSh3aW4sImFiYy4uLiIpOyAgb3IKKyAgICAgICAgRklYTUUod2luLCJhYmMuLi4iKTsgIG9yCisgICAgICAgIFdBUk4od2luLCJhYmMuLi4iKTsgICBvcgorICAgICAgICBFUlIod2luLCJhYmMuLi4iKTsKIAotWW91IGNhbiB3cml0ZSB0aGlzIHNob3J0ZXIgKGFuZCBiZXR0ZXIpIGluIHRoaXMgd2F5OgorZGVwZW5kaW5nIG9uIHRoZSBzZXJpb3VzbmVzcyBvZiB0aGUgcHJvYmxlbS4gKGRvY3VtZW50YXRpb24vZGVndWctbXNncworZXhwbGFpbnMgd2hlbiBpdCBpcyBhcHByb3ByaWF0ZSB0byB1c2UgZWFjaCBvZiB0aGVtKQogCi0JZHByaW50Zl93aW4oc3RkZGViLCJhYmMuLi4iKTsKK1RoZXNlIG1hY3JvcyBhcmUgZGVmaW5lZCBpbiBpbmNsdWRlL2RlYnVnLmguIFRoZSBtYWNyby1kZWZpbml0aW9ucyBhcmUKK2dlbmVyYXRlZCBieSB0aGUgc2hlbGwtc2NyaXB0IHRvb2xzL21ha2VfZGVidWcuIEl0IHNjYW5zIHRoZSBzb3VyY2UKK2NvZGUgZm9yIHN5bWJvbHMgb2YgdGhpcyBmb3JtcyBhbmQgcHV0cyB0aGUgbmVjZXNzYXJ5IG1hY3JvCitkZWZpbml0aW9ucyBpbiBpbmNsdWRlL2RlYnVnLmggYW5kIGluY2x1ZGUvZGVidWdkZWZzLmguIFRoZXNlIG1hY3JvcwordGVzdCB3aGV0aGVyIHRoZSBkZWJ1Z2dpbmcgImNoYW5uZWwiIGFzc29jaWF0ZWQgd2l0aCB0aGUgZmlyc3QKK2FyZ3VtZW50IG9mIHRoZXNlIG1hY3JvcyAod2luIGluIHRoZSBhYm92ZSBleGFtcGxlKSBpcyBlbmFibGVkIGFuZAordGh1cyBkZWNpZGUgd2hldGhlciB0byBhY3R1YWxseSBkaXNwbGF5IHRoZSB0ZXh0LiAgSW4gYWRkaXRpb24geW91IGNhbgorY2hhbmdlIHRoZSB0eXBlcyBvZiBkaXNwbGF5ZWQgbWVzc2FnZXMgYnkgc3VwcGx5aW5nIHRoZSAiLWRlYnVnbXNnIgorb3B0aW9uIHRvIFdpbmUuICBJZiB5b3VyIGRlYnVnZ2luZyBjb2RlIGlzIG1vcmUgY29tcGxleCB0aGFuIGp1c3QKK3ByaW50ZiwgeW91IGNhbiB1c2UgdGhlIHN5bWJvbHMgVFJBQ0VfT04oeHh4KSwgV0FSTl9PTih4eHgpLAorRVJSX09OKHh4eCkgYW5kIEZJWE1FX09OKHh4eCkgYXMgd2VsbC4gVGhlc2UgYXJlIHRydWUgd2hlbiBjaGFubmVsIHh4eAoraXMgZW5hYmxlZCwgZWl0aGVyIHBlcm1hbmVudCBvciBpbiB0aGUgY29tbWFuZCBsaW5lLiBUaHVzLCB5b3UgY2FuCit3cml0ZToKIAotQWxsIHN5bWJvbHMgb2YgdGhlIGZvcm0gZHByaW50Zl94eHh4IGFyZSBtYWNyb3MgZGVmaW5lZCBpbiBpbmNsdWRlL2RlYnVnLmggLgotVGhlIG1hY3JvLWRlZmluaXRpb25zIGFyZSBnZW5lcmF0ZWQgYnkgdGhlIHNoZWxsLXNjcmlwdCB0b29scy9tYWtlX2RlYnVnLiBJdAotc2NhbnMgdGhlIHNvdXJjZSBjb2RlIGZvciBzeW1ib2xzIG9mIHRoaXMgZm9ybXMgYW5kIHB1dHMgdGhlIG5lY2Vzc2FyeQotbWFjcm8gZGVmaW5pdGlvbnMgaW4gaW5jbHVkZS9kZWJ1Zy5oIGFuZCBpbmNsdWRlL3N0ZGRlYnVnLmggLiBUaGVzZSBtYWNyb3MKLXRlc3QgZm9yIHRoZSBzeW1ib2wgREVCVUdfWFhYWCAoZS5nLiBkcHJpbnRmX3dpbiByZWZlcnMgdG8gREVCVUdfV0lOKSBiZWluZyAKLWRlZmluZWQgYW5kIHRodXMgZGVjaWRlZCB3aGV0aGVyIHRvIGFjdHVhbGx5IGRpc3BsYXkgdGhlIHRleHQuIElmIHlvdSB3YW50Ci10byBlbmFibGUgc3BlY2lmaWMgdHlwZXMgb2YgbWVzc2FnZXMsIHNpbXBseSBwdXQgdGhlIGNvcnJlc3BvbmRpbmcKLSNkZWZpbmUgREVCVUdfWFhYWCBpbiBpbmNsdWRlL3N0ZGRlYnVnLmggLiBJZiB5b3Ugd2FudCB0byBlbmFibGUgb3IgZGlzYWJsZQotYSBzcGVjaWZpYyB0eXBlIG9mIG1lc3NhZ2UgaW4ganVzdCBvbmUgYy1zb3VyY2UtZmlsZSwgcHV0IHRoZSBjb3JyZXNwb25kaW5nIAotI2RlZmluZSBERUJVR19YWFhYIG9yICN1bmRlZmluZSBERUJVR19YWFhYIGJldHdlZW4gI2luY2x1ZGU8c3RkZGVidWcuaD4gYW5kCi0jaW5jbHVkZSA8ZGVidWcuaD4gaW4gdGhhdCBzcGVjaWZpYyBmaWxlLiBJbiBhZGRpdGlvbiB5b3UgY2FuIGNoYW5nZSB0aGUgCi10eXBlcyBvZiBkaXNwbGF5ZWQgbWVzc2FnZXMgYnkgc3VwcGx5aW5nIHRoZSAiLWRlYnVnbXNnIiBvcHRpb24gdG8gV2luZS4gCi1JZiB5b3VyIGRlYnVnZ2luZyBjb2RlIGlzIG1vcmUgY29tcGxleCB0aGFuIGp1c3QgcHJpbnRmLCB5b3UgY2FuIHVzZSB0aGUKLXN5bWJvbHMgZGVidWdnaW5nX1hYWCBhcyB3ZWxsLiBUaGVzZSBhcmUgdHJ1ZSB3aGVuIFhYWCBpcyBlbmFibGVkLCBlaXRoZXIKLXBlcm1hbmVudCBvciBpbiB0aGUgY29tbWFuZCBsaW5lLiBTbyBpbnN0ZWFkIG9mIHdyaXRpbmcKKwlpZihUUkFDRV9PTih3aW4pKUR1bXBTb21lU3RydWN0dXJlKCZzdHIpOwogCi0jaWZkZWYgREVCVUdfV0lOCi0JRHVtcFNvbWVTdHJ1Y3R1cmUoJnN0cik7Ci0jZW5kaWYKLQotd3JpdGUKLQlpZihkZWJ1Z2dpbmdfd2luKUR1bXBTb21lU3RydWN0dXJlKCZzdHIpOwogRG9uJ3Qgd29ycnkgYWJvdXQgdGhlIGluZWZmaWNpZW5jeSBvZiB0aGUgdGVzdC4gSWYgaXQgaXMgcGVybWFuZW50bHkgCi1kaXNhYmxlZCAodGh1cyBkZWJ1Z2dpbmdfd2luIGlzIDAgYXQgY29tcGlsZSB0aW1lKSwgdGhlIGNvbXBpbGVyIHdpbGwgCitkaXNhYmxlZCAodGhhdCBpcyBUUkFDRV9PTih3aW4pIGlzIDAgYXQgY29tcGlsZSB0aW1lKSwgdGhlIGNvbXBpbGVyIHdpbGwgCiBlbGltaW5hdGUgdGhlIGRlYWQgY29kZS4KIAotVGhlIGZpbGUgaGFuZGxlICJzdGRkZWIiIGlzIGludGVuZGVkIGZvciBkaXNwbGF5aW5nIHN0YW5kYXJkIGluZm9ybWF0aW9uYWwKLW1lc3NhZ2VzLCB3aGVyZWFzICJzdGRuaW1wIiBpcyBpbnRlbmRlZCBmb3IgZGlzcGxheWluZyBtZXNzYWdlcyBjb25jZXJuaW5nCi1ub3QgeWV0IGltcGxlbWVudGVkIGZ1bmN0aW9ucy4KLQogWW91IGhhdmUgdG8gc3RhcnQgdG9vbHMvbWFrZV9kZWJ1ZyBvbmx5IGlmIHlvdSBpbnRyb2R1Y2VkIGEgbmV3IG1hY3JvLAotZS5nLiAgZHByaW50Zl93aW4zMnMgLSBub3QgaWYgeW91IGp1c3QgY2hhbmdlZCBvbmUgb2YgdGhlICNkZWZpbmUKLURFQlVHX1hYWCdzIGluIGluY2x1ZGUvc3RkZGVidWcuaCBvciBpbiBhIHNwZWNpZmljIGZpbGUuCitlLmcuICBUUkFDRSh3aW4zMikuCisKK0ZvciBtb3JlIGluZm8gYWJvdXQgZGVidWdnaW5nIG1lc3NhZ2VzLCByZWFkOgorCitkb2N1bWVudGF0aW9uL2RlYnVnLW1zZ3MKKwogCiBNT1JFIElORk8KID09PT09PT09PQpkaWZmIC0tZ2l0IGEvTWFrZWZpbGUuaW4gYi9NYWtlZmlsZS5pbgppbmRleCAzNDIwNzNmLi4yYjY1ZmFlIDEwMDY0NAotLS0gYS9NYWtlZmlsZS5pbgorKysgYi9NYWtlZmlsZS5pbgpAQCAtMTIxLDYgKzEyMSw3IEBACiAKIGluc3RhbGxfZW11OiBpbnN0YWxsX2xpYgogCSQoSU5TVEFMTF9QUk9HUkFNKSB3aW5lICQoYmluZGlyKS93aW5lCisJJChJTlNUQUxMX0RBVEEpIHdpbmUuc3ltICQobGliZGlyKS93aW5lLnN5bQogCiBpbnN0YWxsX2xpYjogaW5zdGFsbF9pbmNsdWRlcwogCSQoSU5TVEFMTF9EQVRBKSAkKExJQl9UQVJHRVQpICQobGliZGlyKQpkaWZmIC0tZ2l0IGEvUkVMRUFTRS1OT1RFUyBiL1JFTEVBU0UtTk9URVMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc5NTlkYTMuLjAwMDAwMDAKLS0tIGEvUkVMRUFTRS1OT1RFUworKysgL2Rldi9udWxsCkBAIC0xLDExICswLDAgQEAKLVRoaXMgZmlsZSBjb250YWlucyBpbmZvcm1hdGlvbiBhYm91dCB0aGUgY3VycmVudCByZWxlYXNlIG9mIFdpbmUuCi1JZiB5b3UgYXJlIG5ldyB0byBXaW5lLCByZWFkIHRoZSBmaWxlcyBBTk5PVU5DRSBhbmQgUkVBRE1FIGFuZCB0aGUgRkFRIAotbGlzdCBmaXJzdC4KLUlmIHlvdSB3YW50IHRvIGNvbnRyaWJ1dGUgY29kZSB0byBXaW5lLCByZWFkIHRoZSBERVZFTE9QRVItSElOVFMuIFRoZQotcHJpbWFyeSBzb3VyY2Ugb2YgaW5mb3JtYXRpb24gdG8gZGV2ZWxvcGVycyBpcyB0aGUgQ2hhbmdlTG9nIChuZXh0IHRvCi10aGUgc291cmNlLCBvZiBjb3Vyc2UpLgotCi0xLiBCQVIuRVhFIHVzZWQgdG8gd29yaywgYnV0IGRvZXMgbm90IHdvcmsgYW55bW9yZQotTG9vayBhdCB0aGUgQ2hhbmdlTG9nIHRvIHNlZSB3aGF0IGZpbGVzIGhhdmUgYmVlbiBjaGFuZ2VkLiBUcnkgdG8gdW5kbwotdGhlIHBhcnRpY3VsYXIgcGF0Y2ggYW5kIGdvIHBhcnRpYWxseSBiYWNrIHRvIHRoZSBwcmV2aW91cyB2ZXJzaW9uLiBJZgoteW91IGhhdmUgYW55IHN1c3BpY2lvbnMsIHJlcG9ydCB0aGVtIHRvIHRoZSBhdXRob3Igb3IgdG8gdGhlIG5ld3Nncm91cC4KZGlmZiAtLWdpdCBhL2NvbnRyb2xzL2J1dHRvbi5jIGIvY29udHJvbHMvYnV0dG9uLmMKaW5kZXggOWI3NGYxZi4uMTZlNmU5NyAxMDA2NDQKLS0tIGEvY29udHJvbHMvYnV0dG9uLmMKKysrIGIvY29udHJvbHMvYnV0dG9uLmMKQEAgLTY0LDcgKzY0LDcgQEAKICAgICBTZW5kTWVzc2FnZTMyQSggR2V0UGFyZW50MzIoKHduZFB0ciktPmh3bmRTZWxmKSwgV01fQ1RMQ09MT1JCVE4sIFwKICAgICAgICAgICAgICAgICAgICAgKGhkYyksICh3bmRQdHIpLT5od25kU2VsZiApCiAKLXN0YXRpYyBIQklUTUFQMTYgaGJpdG1hcENoZWNrQm94ZXMgPSAwOworc3RhdGljIEhCSVRNQVAzMiBoYml0bWFwQ2hlY2tCb3hlcyA9IDA7CiBzdGF0aWMgV09SRCBjaGVja0JveFdpZHRoID0gMCwgY2hlY2tCb3hIZWlnaHQgPSAwOwogCiAKQEAgLTc0LDcgKzc0LDggQEAKIExSRVNVTFQgV0lOQVBJIEJ1dHRvblduZFByb2MoIEhXTkQzMiBoV25kLCBVSU5UMzIgdU1zZywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdQQVJBTTMyIHdQYXJhbSwgTFBBUkFNIGxQYXJhbSApCiB7Ci0gICAgUkVDVDE2IHJlY3Q7CisgICAgUkVDVDMyIHJlY3Q7CisgICAgUE9JTlQzMiBwdCA9IHsgTE9XT1JEKGxQYXJhbSksIEhJV09SRChsUGFyYW0pIH07CiAgICAgV05EICp3bmRQdHIgPSBXSU5fRmluZFduZFB0cihoV25kKTsKICAgICBCVVRUT05JTkZPICppbmZvUHRyID0gKEJVVFRPTklORk8gKil3bmRQdHItPndFeHRyYTsKICAgICBMT05HIHN0eWxlID0gd25kUHRyLT5kd1N0eWxlICYgMHgwZjsKQEAgLTk4LDkgKzk5LDkgQEAKICAgICBjYXNlIFdNX0NSRUFURToKICAgICAgICAgaWYgKCFoYml0bWFwQ2hlY2tCb3hlcykKICAgICAgICAgewotICAgICAgICAgICAgQklUTUFQMTYgYm1wOwotICAgICAgICAgICAgaGJpdG1hcENoZWNrQm94ZXMgPSBMb2FkQml0bWFwMTYoMCwgTUFLRUlOVFJFU09VUkNFKE9CTV9DSEVDS0JPWEVTKSk7Ci0gICAgICAgICAgICBHZXRPYmplY3QxNiggaGJpdG1hcENoZWNrQm94ZXMsIHNpemVvZihibXApLCAmYm1wICk7CisgICAgICAgICAgICBCSVRNQVAzMiBibXA7CisgICAgICAgICAgICBoYml0bWFwQ2hlY2tCb3hlcyA9IExvYWRCaXRtYXAzMkEoMCwgTUFLRUlOVFJFU09VUkNFKE9CTV9DSEVDS0JPWEVTKSk7CisgICAgICAgICAgICBHZXRPYmplY3QzMkEoIGhiaXRtYXBDaGVja0JveGVzLCBzaXplb2YoYm1wKSwgJmJtcCApOwogICAgICAgICAgICAgY2hlY2tCb3hXaWR0aCAgPSBibXAuYm1XaWR0aCAvIDQ7CiAgICAgICAgICAgICBjaGVja0JveEhlaWdodCA9IGJtcC5ibUhlaWdodCAvIDM7CiAgICAgICAgIH0KQEAgLTEzMyw4ICsxMzQsOCBAQAogICAgICAgICBSZWxlYXNlQ2FwdHVyZSgpOwogICAgICAgICBpZiAoIShpbmZvUHRyLT5zdGF0ZSAmIEJVVFRPTl9ISUdITElHSFRFRCkpIGJyZWFrOwogICAgICAgICBTZW5kTWVzc2FnZTMyQSggaFduZCwgQk1fU0VUU1RBVEUzMiwgRkFMU0UsIDAgKTsKLSAgICAgICAgR2V0Q2xpZW50UmVjdDE2KCBoV25kLCAmcmVjdCApOwotICAgICAgICBpZiAoUHRJblJlY3QxNiggJnJlY3QsIE1BS0VQT0lOVDE2KGxQYXJhbSkgKSkKKyAgICAgICAgR2V0Q2xpZW50UmVjdDMyKCBoV25kLCAmcmVjdCApOworICAgICAgICBpZiAoUHRJblJlY3QzMiggJnJlY3QsIHB0ICkpCiAgICAgICAgIHsKICAgICAgICAgICAgIHN3aXRjaChzdHlsZSkKICAgICAgICAgICAgIHsKQEAgLTE1OSw5ICsxNjAsOCBAQAogICAgIGNhc2UgV01fTU9VU0VNT1ZFOgogICAgICAgICBpZiAoR2V0Q2FwdHVyZTMyKCkgPT0gaFduZCkKICAgICAgICAgewotICAgICAgICAgICAgR2V0Q2xpZW50UmVjdDE2KCBoV25kLCAmcmVjdCApOwotICAgICAgICAgICAgU2VuZE1lc3NhZ2UzMkEoIGhXbmQsIEJNX1NFVFNUQVRFMzIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgUHRJblJlY3QxNiggJnJlY3QsTUFLRVBPSU5UMTYobFBhcmFtKSApLCAwICk7CisgICAgICAgICAgICBHZXRDbGllbnRSZWN0MzIoIGhXbmQsICZyZWN0ICk7CisgICAgICAgICAgICBTZW5kTWVzc2FnZTMyQSggaFduZCwgQk1fU0VUU1RBVEUzMiwgUHRJblJlY3QzMigmcmVjdCwgcHQpLCAwICk7CiAgICAgICAgIH0KICAgICAgICAgYnJlYWs7CiAKQEAgLTE3MCw3ICsxNzAsNyBAQAogICAgICAgICByZXR1cm4gRGVmV2luZG93UHJvYzMyQSggaFduZCwgdU1zZywgd1BhcmFtLCBsUGFyYW0gKTsKIAogICAgIGNhc2UgV01fU0VUVEVYVDoKLSAgICAgICAgREVGV05EX1NldFRleHQoIHduZFB0ciwgKExQU1RSKWxQYXJhbSApOworICAgICAgICBERUZXTkRfU2V0VGV4dCggd25kUHRyLCAoTFBDU1RSKWxQYXJhbSApOwogCWlmKCB3bmRQdHItPmR3U3R5bGUgJiBXU19WSVNJQkxFICkKICAgICAgICAgICAgIFBBSU5UX0JVVFRPTiggd25kUHRyLCBzdHlsZSwgT0RBX0RSQVdFTlRJUkUgKTsKICAgICAgICAgcmV0dXJuIDA7CkBAIC0xOTIsNyArMTkyLDcgQEAKICAgICBjYXNlIFdNX0tJTExGT0NVUzoKICAgICAgICAgaW5mb1B0ci0+c3RhdGUgJj0gfkJVVFRPTl9IQVNGT0NVUzsKIAlQQUlOVF9CVVRUT04oIHduZFB0ciwgc3R5bGUsIE9EQV9GT0NVUyApOwotCUludmFsaWRhdGVSZWN0MTYoIGhXbmQsIE5VTEwsIFRSVUUgKTsKKwlJbnZhbGlkYXRlUmVjdDMyKCBoV25kLCBOVUxMLCBUUlVFICk7CiAgICAgICAgIGJyZWFrOwogCiAgICAgY2FzZSBXTV9TWVNDT0xPUkNIQU5HRToKQEAgLTI5OSw4ICsyOTksOCBAQAogICAgIC8qIGRyYXcgYnV0dG9uIGxhYmVsLCBpZiBhbnk6ICovCiAgICAgaWYgKHduZFB0ci0+dGV4dCAmJiB3bmRQdHItPnRleHRbMF0pCiAgICAgewotICAgICAgICBMT0dCUlVTSDE2IGxiOwotICAgICAgICBHZXRPYmplY3QxNiggR2V0U3lzQ29sb3JCcnVzaDMyKENPTE9SX0JUTkZBQ0UpLCBzaXplb2YobGIpLCAmbGIgKTsKKyAgICAgICAgTE9HQlJVU0gzMiBsYjsKKyAgICAgICAgR2V0T2JqZWN0MzJBKCBHZXRTeXNDb2xvckJydXNoMzIoQ09MT1JfQlRORkFDRSksIHNpemVvZihsYiksICZsYiApOwogICAgICAgICBpZiAod25kUHRyLT5kd1N0eWxlICYgV1NfRElTQUJMRUQgJiYKICAgICAgICAgICAgIEdldFN5c0NvbG9yMzIoQ09MT1JfR1JBWVRFWFQpPT1sYi5sYkNvbG9yKQogICAgICAgICAgICAgLyogZG9uJ3Qgd3JpdGUgZ3JheSB0ZXh0IG9uIGdyYXkgYmtnICovCkBAIC0zNDYsNyArMzQ2LDcgQEAKICAgICBIQklUTUFQMzIgaGJtICA9IENyZWF0ZUJpdG1hcDMyKCA4LCA4LCAxLCAxLCBQYXR0ZXJuICk7CiAgICAgSERDMzIgaGRjTWVtID0gQ3JlYXRlQ29tcGF0aWJsZURDMzIoaERDKTsKICAgICBIQklUTUFQMzIgaGJtTWVtOwotICAgIEhCUlVTSDE2IGhCcjsKKyAgICBIQlJVU0gzMiBoQnI7CiAgICAgUkVDVDMyIHJlY3QscmMyOwogCiAgICAgcmVjdD0qcmM7CkBAIC0zNzUsMTMgKzM3NSwxMyBAQAogCiBzdGF0aWMgdm9pZCBDQl9QYWludCggV05EICp3bmRQdHIsIEhEQzMyIGhEQywgV09SRCBhY3Rpb24gKQogewotICAgIFJFQ1QxNiByYm94LCBydGV4dCwgY2xpZW50OwotICAgIEhCUlVTSDE2IGhCcnVzaDsKKyAgICBSRUNUMzIgcmJveCwgcnRleHQsIGNsaWVudDsKKyAgICBIQlJVU0gzMiBoQnJ1c2g7CiAgICAgaW50IHRleHRsZW4sIGRlbHRhOwogICAgIEJVVFRPTklORk8gKmluZm9QdHIgPSAoQlVUVE9OSU5GTyAqKXduZFB0ci0+d0V4dHJhOwogCiAgICAgdGV4dGxlbiA9IDA7Ci0gICAgR2V0Q2xpZW50UmVjdDE2KHduZFB0ci0+aHduZFNlbGYsICZjbGllbnQpOworICAgIEdldENsaWVudFJlY3QzMih3bmRQdHItPmh3bmRTZWxmLCAmY2xpZW50KTsKICAgICByYm94ID0gcnRleHQgPSBjbGllbnQ7CiAKICAgICBpZiAoaW5mb1B0ci0+aEZvbnQpIFNlbGVjdE9iamVjdDMyKCBoREMsIGluZm9QdHItPmhGb250ICk7CkBAIC00MTUsOCArNDE1LDggQEAKICAgICAgICAgaW50IHggPSAwLCB5ID0gMDsKICAgICAgICAgZGVsdGEgPSAocmJveC5ib3R0b20gLSByYm94LnRvcCAtIGNoZWNrQm94SGVpZ2h0KSA+PiAxOwogCi0gICAgICAgIGlmIChhY3Rpb24gPT0gT0RBX1NFTEVDVCkgRmlsbFJlY3QxNiggaERDLCAmcmJveCwgaEJydXNoICk7Ci0gICAgICAgIGVsc2UgRmlsbFJlY3QxNiggaERDLCAmY2xpZW50LCBoQnJ1c2ggKTsKKyAgICAgICAgaWYgKGFjdGlvbiA9PSBPREFfU0VMRUNUKSBGaWxsUmVjdDMyKCBoREMsICZyYm94LCBoQnJ1c2ggKTsKKyAgICAgICAgZWxzZSBGaWxsUmVjdDMyKCBoREMsICZjbGllbnQsIGhCcnVzaCApOwogCiAgICAgICAgIGlmIChpbmZvUHRyLT5zdGF0ZSAmIEJVVFRPTl9ISUdITElHSFRFRCkgeCArPSAyICogY2hlY2tCb3hXaWR0aDsKICAgICAgICAgaWYgKGluZm9QdHItPnN0YXRlICYgKEJVVFRPTl9DSEVDS0VEIHwgQlVUVE9OXzNTVEFURSkpIHggKz0gY2hlY2tCb3hXaWR0aDsKQEAgLTQzMCw4ICs0MzAsOCBAQAogICAgICAgICB7CiAgICAgICAgICAgICBpZiAod25kUHRyLT5kd1N0eWxlICYgV1NfRElTQUJMRUQpCiAgICAgICAgICAgICAgICAgU2V0VGV4dENvbG9yMzIoIGhEQywgR2V0U3lzQ29sb3IzMihDT0xPUl9HUkFZVEVYVCkgKTsKLSAgICAgICAgICAgIERyYXdUZXh0MTYoIGhEQywgd25kUHRyLT50ZXh0LCB0ZXh0bGVuLCAmcnRleHQsCi0gICAgICAgICAgICAgICAgICAgICAgICBEVF9TSU5HTEVMSU5FIHwgRFRfVkNFTlRFUiApOworICAgICAgICAgICAgRHJhd1RleHQzMkEoIGhEQywgd25kUHRyLT50ZXh0LCB0ZXh0bGVuLCAmcnRleHQsCisJCQkgRFRfU0lOR0xFTElORSB8IERUX1ZDRU5URVIgKTsKIAkgICAgdGV4dGxlbiA9IDA7IC8qIHNraXAgRHJhd1RleHQoKSBiZWxvdyAqLwogICAgICAgICB9CiAgICAgfQpAQCAtNDQxLDE3ICs0NDEsMTcgQEAKICAgICB7CiAJLyogYWdhaW4sIHRoaXMgaXMgd2hhdCBDVEwzRCBleHBlY3RzICovCiAKLSAgICAgICAgU2V0UmVjdEVtcHR5MTYoJnJib3gpOworICAgICAgICBTZXRSZWN0RW1wdHkzMigmcmJveCk7CiAgICAgICAgIGlmKCB0ZXh0bGVuICkKLSAgICAgICAgICAgIERyYXdUZXh0MTYoIGhEQywgd25kUHRyLT50ZXh0LCB0ZXh0bGVuLCAmcmJveCwKLSAgICAgICAgICAgICAgICAgICAgICAgIERUX1NJTkdMRUxJTkUgfCBEVF9DQUxDUkVDVCApOworICAgICAgICAgICAgRHJhd1RleHQzMkEoIGhEQywgd25kUHRyLT50ZXh0LCB0ZXh0bGVuLCAmcmJveCwKKwkJCSBEVF9TSU5HTEVMSU5FIHwgRFRfQ0FMQ1JFQ1QgKTsKICAgICAgICAgdGV4dGxlbiA9IHJib3guYm90dG9tIC0gcmJveC50b3A7CiAgICAgICAgIGRlbHRhID0gKChydGV4dC5ib3R0b20gLSBydGV4dC50b3ApIC0gdGV4dGxlbikvMjsKICAgICAgICAgcmJveC5ib3R0b20gPSAocmJveC50b3AgPSBydGV4dC50b3AgKyBkZWx0YSAtIDEpICsgdGV4dGxlbiArIDI7CiAgICAgICAgIHRleHRsZW4gPSByYm94LnJpZ2h0IC0gcmJveC5sZWZ0OwogICAgICAgICByYm94LnJpZ2h0ID0gKHJib3gubGVmdCArPSAtLXJ0ZXh0LmxlZnQpICsgdGV4dGxlbiArIDI7Ci0gICAgICAgIEludGVyc2VjdFJlY3QxNigmcmJveCwgJnJib3gsICZydGV4dCk7Ci0gICAgICAgIERyYXdGb2N1c1JlY3QxNiggaERDLCAmcmJveCApOworICAgICAgICBJbnRlcnNlY3RSZWN0MzIoJnJib3gsICZyYm94LCAmcnRleHQpOworICAgICAgICBEcmF3Rm9jdXNSZWN0MzIoIGhEQywgJnJib3ggKTsKICAgICB9CiB9CiAKQEAgLTQ4NSwxNCArNDg1LDE0IEBACiAKIHN0YXRpYyB2b2lkIEdCX1BhaW50KCBXTkQgKnduZFB0ciwgSERDMzIgaERDLCBXT1JEIGFjdGlvbiApCiB7Ci0gICAgUkVDVDE2IHJjOworICAgIFJFQ1QzMiByYzsKICAgICBCVVRUT05JTkZPICppbmZvUHRyID0gKEJVVFRPTklORk8gKil3bmRQdHItPndFeHRyYTsKIAogICAgIGlmIChhY3Rpb24gIT0gT0RBX0RSQVdFTlRJUkUpIHJldHVybjsKIAogICAgIEJVVFRPTl9TRU5EX0NUTENPTE9SKCB3bmRQdHIsIGhEQyApOwogCi0gICAgR2V0Q2xpZW50UmVjdDE2KCB3bmRQdHItPmh3bmRTZWxmLCAmcmMpOworICAgIEdldENsaWVudFJlY3QzMiggd25kUHRyLT5od25kU2VsZiwgJnJjKTsKICAgICBHUkFQSF9EcmF3UmVjdGFuZ2xlKCBoREMsIHJjLmxlZnQsIHJjLnRvcCArIDIsIHJjLnJpZ2h0IC0gMSwgcmMuYm90dG9tIC0gMSwKIAkJCSBHZXRTeXNDb2xvclBlbjMyKENPTE9SX1dJTkRPV0ZSQU1FKSApOwogICAgIGlmICh3bmRQdHItPnRleHQpCkBAIC01MDEsNyArNTAxLDcgQEAKICAgICAgICAgaWYgKHduZFB0ci0+ZHdTdHlsZSAmIFdTX0RJU0FCTEVEKQogICAgICAgICAgICAgU2V0VGV4dENvbG9yMzIoIGhEQywgR2V0U3lzQ29sb3IzMihDT0xPUl9HUkFZVEVYVCkgKTsKICAgICAgICAgcmMubGVmdCArPSAxMDsKLSAgICAgICAgRHJhd1RleHQxNiggaERDLCB3bmRQdHItPnRleHQsIC0xLCAmcmMsIERUX1NJTkdMRUxJTkUgfCBEVF9OT0NMSVAgKTsKKyAgICAgICAgRHJhd1RleHQzMkEoIGhEQywgd25kUHRyLT50ZXh0LCAtMSwgJnJjLCBEVF9TSU5HTEVMSU5FIHwgRFRfTk9DTElQICk7CiAgICAgfQogfQogCkBAIC01MTIsMjEgKzUxMiwyMSBAQAogCiBzdGF0aWMgdm9pZCBVQl9QYWludCggV05EICp3bmRQdHIsIEhEQzMyIGhEQywgV09SRCBhY3Rpb24gKQogewotICAgIFJFQ1QxNiByYzsKLSAgICBIQlJVU0gxNiBoQnJ1c2g7CisgICAgUkVDVDMyIHJjOworICAgIEhCUlVTSDMyIGhCcnVzaDsKICAgICBCVVRUT05JTkZPICppbmZvUHRyID0gKEJVVFRPTklORk8gKil3bmRQdHItPndFeHRyYTsKIAogICAgIGlmIChhY3Rpb24gPT0gT0RBX1NFTEVDVCkgcmV0dXJuOwogCi0gICAgR2V0Q2xpZW50UmVjdDE2KCB3bmRQdHItPmh3bmRTZWxmLCAmcmMpOworICAgIEdldENsaWVudFJlY3QzMiggd25kUHRyLT5od25kU2VsZiwgJnJjKTsKIAogICAgIGlmIChpbmZvUHRyLT5oRm9udCkgU2VsZWN0T2JqZWN0MzIoIGhEQywgaW5mb1B0ci0+aEZvbnQgKTsKICAgICBoQnJ1c2ggPSBHZXRDb250cm9sQnJ1c2goIHduZFB0ci0+aHduZFNlbGYsIGhEQywgQ1RMQ09MT1JfQlROICk7CiAKLSAgICBGaWxsUmVjdDE2KCBoREMsICZyYywgaEJydXNoICk7CisgICAgRmlsbFJlY3QzMiggaERDLCAmcmMsIGhCcnVzaCApOwogICAgIGlmICgoYWN0aW9uID09IE9EQV9GT0NVUykgfHwKICAgICAgICAgKChhY3Rpb24gPT0gT0RBX0RSQVdFTlRJUkUpICYmIChpbmZvUHRyLT5zdGF0ZSAmIEJVVFRPTl9IQVNGT0NVUykpKQotICAgICAgICBEcmF3Rm9jdXNSZWN0MTYoIGhEQywgJnJjICk7CisgICAgICAgIERyYXdGb2N1c1JlY3QzMiggaERDLCAmcmMgKTsKIH0KIAogCmRpZmYgLS1naXQgYS9jb250cm9scy9jb21iby5jIGIvY29udHJvbHMvY29tYm8uYwppbmRleCA4Yzg0ZWE2Li4zMDAxYjViIDEwMDY0NAotLS0gYS9jb250cm9scy9jb21iby5jCisrKyBiL2NvbnRyb2xzL2NvbWJvLmMKQEAgLTM1LDkgKzM1LDkgQEAKICNkZWZpbmUgQ0JfR0VURURJVFRFWFRMRU5HVEgoIGxwaGMgKSBcCiAJKFNlbmRNZXNzYWdlMzJBKCAobHBoYyktPmhXbmRFZGl0LCBXTV9HRVRURVhUTEVOR1RILCAwLCAwICkpCiAKLXN0YXRpYyBIQklUTUFQMTYgCWhDb21ib0JtcCA9IDA7Ci1zdGF0aWMgVUlOVDE2CQlDQml0SGVpZ2h0LCBDQml0V2lkdGg7Ci1zdGF0aWMgVUlOVDE2CQlDQml0T2Zmc2V0ID0gODsKK3N0YXRpYyBIQklUTUFQMzIgCWhDb21ib0JtcCA9IDA7CitzdGF0aWMgVUlOVDMyCQlDQml0SGVpZ2h0LCBDQml0V2lkdGg7CitzdGF0aWMgVUlOVDMyCQlDQml0T2Zmc2V0ID0gODsKIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKiAgICAgICAgICAgQ09NQk9fSW5pdApAQCAtNDYsMzEgKzQ2LDMxIEBACiAgKi8KIHN0YXRpYyBCT09MMzIgQ09NQk9fSW5pdCgpCiB7Ci0gIEhEQzE2CQloREM7CisgIEhEQzMyCQloREM7CiAgIAogICBpZiggaENvbWJvQm1wICkgcmV0dXJuIFRSVUU7Ci0gIGlmKCAoaERDID0gQ3JlYXRlQ29tcGF0aWJsZURDMTYoMCkpICkKKyAgaWYoIChoREMgPSBDcmVhdGVDb21wYXRpYmxlREMzMigwKSkgKQogICB7CiAgICAgQk9PTDMyCWJSZXQgPSBGQUxTRTsKLSAgICBpZiggKGhDb21ib0JtcCA9IExvYWRCaXRtYXAxNigwLCBNQUtFSU5UUkVTT1VSQ0UoT0JNX0NPTUJPKSkpICkKKyAgICBpZiggKGhDb21ib0JtcCA9IExvYWRCaXRtYXAzMkEoMCwgTUFLRUlOVFJFU09VUkNFKE9CTV9DT01CTykpKSApCiAgICAgewotICAgICAgQklUTUFQMTYgICAgICBibTsKLSAgICAgIEhCSVRNQVAxNiAgICAgaFByZXZCOwotICAgICAgUkVDVDE2ICAgICAgICByOworICAgICAgQklUTUFQMzIgICAgICBibTsKKyAgICAgIEhCSVRNQVAzMiAgICAgaFByZXZCOworICAgICAgUkVDVDMyICAgICAgICByOwogCi0gICAgICBHZXRPYmplY3QxNiggaENvbWJvQm1wLCBzaXplb2YoYm0pLCAmYm0gKTsKKyAgICAgIEdldE9iamVjdDMyQSggaENvbWJvQm1wLCBzaXplb2YoYm0pLCAmYm0gKTsKICAgICAgIENCaXRIZWlnaHQgPSBibS5ibUhlaWdodDsKICAgICAgIENCaXRXaWR0aCAgPSBibS5ibVdpZHRoOwogCiAgICAgICBUUkFDRShjb21ibywgImNvbWJvIGJpdG1hcCBbJWksJWldXG4iLCBDQml0V2lkdGgsIENCaXRIZWlnaHQgKTsKIAogICAgICAgaFByZXZCID0gU2VsZWN0T2JqZWN0MTYoIGhEQywgaENvbWJvQm1wKTsKLSAgICAgIFNldFJlY3QxNiggJnIsIDAsIDAsIENCaXRXaWR0aCwgQ0JpdEhlaWdodCApOwotICAgICAgSW52ZXJ0UmVjdDE2KCBoREMsICZyICk7Ci0gICAgICBTZWxlY3RPYmplY3QxNiggaERDLCBoUHJldkIgKTsKKyAgICAgIFNldFJlY3QzMiggJnIsIDAsIDAsIENCaXRXaWR0aCwgQ0JpdEhlaWdodCApOworICAgICAgSW52ZXJ0UmVjdDMyKCBoREMsICZyICk7CisgICAgICBTZWxlY3RPYmplY3QzMiggaERDLCBoUHJldkIgKTsKICAgICAgIGJSZXQgPSBUUlVFOwogICAgIH0KLSAgICBEZWxldGVEQzE2KCBoREMgKTsKKyAgICBEZWxldGVEQzMyKCBoREMgKTsKICAgICByZXR1cm4gYlJldDsKICAgfQogICByZXR1cm4gRkFMU0U7CkBAIC0xMzUsMzUgKzEzNSwzNSBAQAogICoKICAqIFNldCB1cCBjb21wb25lbnQgY29vcmRpbmF0ZXMgZ2l2ZW4gdmFsaWQgbHBoYy0+UmVjdENvbWJvLgogICovCi1zdGF0aWMgdm9pZCBDQkNhbGNQbGFjZW1lbnQoIExQSEVBRENPTUJPIGxwaGMsIAotCQkJICAgICBMUFJFQ1QxNiBscHJFZGl0LCBMUFJFQ1QxNiBscHJCdXR0b24sIExQUkVDVDE2IGxwckxCICkKK3N0YXRpYyB2b2lkIENCQ2FsY1BsYWNlbWVudCggTFBIRUFEQ09NQk8gbHBoYywgTFBSRUNUMzIgbHByRWRpdCwgCisJCQkgICAgIExQUkVDVDMyIGxwckJ1dHRvbiwgTFBSRUNUMzIgbHByTEIgKQogewotICAgUkVDVDE2CXJlY3QgPSBscGhjLT5SZWN0Q29tYm87Ci0gICBTSVpFMTYJc2l6ZTsKKyAgIFJFQ1QzMglyZWN0ID0gbHBoYy0+UmVjdENvbWJvOworICAgU0laRTMyCXNpemU7CiAKICAgIC8qIGdldCBjb21ibyBoZWlnaHQgYW5kIHdpZHRoICovCiAKICAgIGlmKCBscGhjLT5lZGl0SGVpZ2h0ICkKLSAgICAgICBzaXplLmN5ID0gKElOVDE2KWxwaGMtPmVkaXRIZWlnaHQ7CisgICAgICAgc2l6ZS5jeSA9IGxwaGMtPmVkaXRIZWlnaHQ7CiAgICBlbHNlCiAgICB7Ci0gICAgICAgSERDMTYJaERDID0gR2V0REMxNiggbHBoYy0+c2VsZi0+aHduZFNlbGYgKTsKLSAgICAgICBIRk9OVDE2CWhQcmV2Rm9udCA9IChIRk9OVDE2KTA7CisgICAgICAgSERDMzIJaERDID0gR2V0REMzMiggbHBoYy0+c2VsZi0+aHduZFNlbGYgKTsKKyAgICAgICBIRk9OVDMyCWhQcmV2Rm9udCA9IDA7CiAKLSAgICAgICBpZiggbHBoYy0+aEZvbnQgKSBoUHJldkZvbnQgPSBTZWxlY3RPYmplY3QxNiggaERDLCBscGhjLT5oRm9udCApOworICAgICAgIGlmKCBscGhjLT5oRm9udCApIGhQcmV2Rm9udCA9IFNlbGVjdE9iamVjdDMyKCBoREMsIGxwaGMtPmhGb250ICk7CiAgICAKLSAgICAgICBHZXRUZXh0RXh0ZW50UG9pbnQxNiggaERDLCAiMCIsIDEsICZzaXplKTsKKyAgICAgICBHZXRUZXh0RXh0ZW50UG9pbnQzMkEoIGhEQywgIjAiLCAxLCAmc2l6ZSk7CiAKICAgICAgICBzaXplLmN5ICs9IHNpemUuY3kgLyA0ICsgNCAqIFNZU01FVFJJQ1NfQ1lCT1JERVI7CiAKLSAgICAgICBpZiggaFByZXZGb250ICkgU2VsZWN0T2JqZWN0MTYoIGhEQywgaFByZXZGb250ICk7Ci0gICAgICAgUmVsZWFzZURDMTYoIGxwaGMtPnNlbGYtPmh3bmRTZWxmLCBoREMgKTsKKyAgICAgICBpZiggaFByZXZGb250ICkgU2VsZWN0T2JqZWN0MzIoIGhEQywgaFByZXZGb250ICk7CisgICAgICAgUmVsZWFzZURDMzIoIGxwaGMtPnNlbGYtPmh3bmRTZWxmLCBoREMgKTsKICAgIH0KICAgIHNpemUuY3ggPSByZWN0LnJpZ2h0IC0gcmVjdC5sZWZ0OwogCiAgICBpZiggQ0JfT1dORVJEUkFXTihscGhjKSApCiAgICB7Ci0gICAgICAgVUlOVDE2CXUgPSBscGhjLT5SZWN0RWRpdC5ib3R0b20gLSBscGhjLT5SZWN0RWRpdC50b3A7CisgICAgICAgVUlOVDMyCXUgPSBscGhjLT5SZWN0RWRpdC5ib3R0b20gLSBscGhjLT5SZWN0RWRpdC50b3A7CiAKICAgICAgICBpZiggbHBoYy0+d1N0YXRlICYgQ0JGX01FQVNVUkVJVEVNICkgLyogZmlyc3QgaW5pdGlhbGl6YXRpb24gKi8KICAgICAgICB7CkBAIC0xOTcsNyArMTk3LDcgQEAKICAgICAgICBscHJCdXR0b24tPmJvdHRvbSA9IGxwckJ1dHRvbi0+dG9wICsgc2l6ZS5jeTsKIAogICAgICAgIGlmKCBpIDwgMCApIHNpemUuY3ggPSAwOwotICAgICAgIGVsc2Ugc2l6ZS5jeCA9IChJTlQxNilpOworICAgICAgIGVsc2Ugc2l6ZS5jeCA9IGk7CiAgICB9CiAKICAgIGlmKCBDQl9HRVRUWVBFKGxwaGMpID09IENCU19EUk9QRE9XTiApCkBAIC0yMTYsNyArMjE2LDcgQEAKICAgIGxwckxCLT5ib3R0b20gPSByZWN0LmJvdHRvbSAtIHJlY3QudG9wOwogCiAgICBpZiggbHBoYy0+ZHJvcHBlZFdpZHRoID4gKGxwckxCLT5yaWdodCAtIGxwckxCLT5sZWZ0KSApCi0gICAgICAgbHByTEItPnJpZ2h0ID0gbHByTEItPmxlZnQgKyAoSU5UMTYpbHBoYy0+ZHJvcHBlZFdpZHRoOworICAgICAgIGxwckxCLT5yaWdodCA9IGxwckxCLT5sZWZ0ICsgbHBoYy0+ZHJvcHBlZFdpZHRoOwogCiAgICBUUkFDRShjb21ibywiWyUwNHhdOiAoJWksJWktJWksJWkpIHBsYWNlbWVudFxuIiwKIAkJQ0JfSFdORChscGhjKSwgbHBoYy0+UmVjdENvbWJvLmxlZnQsIGxwaGMtPlJlY3RDb21iby50b3AsIApAQCAtMjY2LDkgKzI2Niw5IEBACiAgIGlmKCBscGhjLT5vd25lciB8fCAhKGxwY3MtPnN0eWxlICYgV1NfVklTSUJMRSkgKQogICB7CiAgICAgICBVSU5UMzIJbGJlU3R5bGU7Ci0gICAgICBSRUNUMTYJZWRpdFJlY3QsIGJ0blJlY3QsIGxiUmVjdDsKKyAgICAgIFJFQ1QzMgllZGl0UmVjdCwgYnRuUmVjdCwgbGJSZWN0OwogCi0gICAgICBHZXRXaW5kb3dSZWN0MTYoIHduZC0+aHduZFNlbGYsICZscGhjLT5SZWN0Q29tYm8gKTsKKyAgICAgIEdldFdpbmRvd1JlY3QzMiggd25kLT5od25kU2VsZiwgJmxwaGMtPlJlY3RDb21ibyApOwogCiAgICAgICBscGhjLT53U3RhdGUgfD0gQ0JGX01FQVNVUkVJVEVNOwogICAgICAgQ0JDYWxjUGxhY2VtZW50KCBscGhjLCAmZWRpdFJlY3QsICZidG5SZWN0LCAmbGJSZWN0ICk7CkBAIC0yOTQsNyArMjk0LDcgQEAKICAgICAgIGVsc2UJCQkJCS8qIHBvcHVwIGxpc3Rib3ggKi8KICAgICAgIHsKIAlsYmVTdHlsZSB8PSBXU19QT1BVUDsKLQlPZmZzZXRSZWN0MTYoICZsYlJlY3QsIGxwaGMtPlJlY3RDb21iby5sZWZ0LCBscGhjLT5SZWN0Q29tYm8udG9wICk7CisJT2Zmc2V0UmVjdDMyKCAmbGJSZWN0LCBscGhjLT5SZWN0Q29tYm8ubGVmdCwgbHBoYy0+UmVjdENvbWJvLnRvcCApOwogICAgICAgfQogCiAgICAgIC8qIERyb3Bkb3duIENvbWJvTEJveCBpcyBub3QgYSBjaGlsZCB3aW5kb3cgYW5kIHdlIGNhbm5vdCBwYXNzIApAQCAtMzU5LDcgKzM1OSw3IEBACiAgKgogICogUGFpbnQgY29tYm8gYnV0dG9uIChub3JtYWwsIHByZXNzZWQsIGFuZCBkaXNhYmxlZCBzdGF0ZXMpLgogICovCi1zdGF0aWMgdm9pZCBDQlBhaW50QnV0dG9uKExQSEVBRENPTUJPIGxwaGMsIEhEQzE2IGhkYykKK3N0YXRpYyB2b2lkIENCUGFpbnRCdXR0b24oTFBIRUFEQ09NQk8gbHBoYywgSERDMzIgaGRjKQogewogICAgIFJFQ1QzMiAJcjsKICAgICBIQlJVU0gzMiAJaFByZXZCcnVzaDsKQEAgLTQwMSw3ICs0MDEsNyBAQAogICoKICAqIFBhaW50IENCU19EUk9QRE9XTkxJU1QgdGV4dCBmaWVsZCAvIHVwZGF0ZSBlZGl0IGNvbnRyb2wgY29udGVudHMuCiAgKi8KLXN0YXRpYyB2b2lkIENCUGFpbnRUZXh0KExQSEVBRENPTUJPIGxwaGMsIEhEQzE2IGhkYykKK3N0YXRpYyB2b2lkIENCUGFpbnRUZXh0KExQSEVBRENPTUJPIGxwaGMsIEhEQzMyIGhkYykKIHsKICAgIElOVDMyCWlkLCBzaXplID0gMDsKICAgIExQU1RSCXBUZXh0ID0gTlVMTDsKQEAgLTQ0Niw3ICs0NDYsNyBAQAogCWlmKCBoREMgKQogCXsKIAkgICAgUkVDVDMyCXJlY3Q7Ci0JICAgIFVJTlQxNglpdGVtU3RhdGU7CisJICAgIFVJTlQzMglpdGVtU3RhdGU7CiAJICAgIEhGT05UMzIJaFByZXZGb250ID0gKGxwaGMtPmhGb250KSA/IFNlbGVjdE9iamVjdDMyKGhEQywgbHBoYy0+aEZvbnQpIDogMDsKIAogCSAgICBQYXRCbHQzMiggaERDLCAocmVjdC5sZWZ0ID0gbHBoYy0+UmVjdEVkaXQubGVmdCArIFNZU01FVFJJQ1NfQ1hCT1JERVIpLApAQCAtNTA4LDEzICs1MDgsMTMgQEAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICogICAgICAgICAgIENPTUJPX1BhaW50CiAgKi8KLXN0YXRpYyBMUkVTVUxUIENPTUJPX1BhaW50KExQSEVBRENPTUJPIGxwaGMsIEhEQzE2IGhQYXJhbURDKQorc3RhdGljIExSRVNVTFQgQ09NQk9fUGFpbnQoTFBIRUFEQ09NQk8gbHBoYywgSERDMzIgaFBhcmFtREMpCiB7Ci0gIFBBSU5UU1RSVUNUMTYgcHM7Ci0gIEhEQzE2IAloREM7CisgIFBBSU5UU1RSVUNUMzIgcHM7CisgIEhEQzMyIAloREM7CiAgIAogICBoREMgPSAoaFBhcmFtREMpID8gaFBhcmFtREMKLQkJICAgOiBCZWdpblBhaW50MTYoIGxwaGMtPnNlbGYtPmh3bmRTZWxmLCAmcHMpOworCQkgICA6IEJlZ2luUGFpbnQzMiggbHBoYy0+c2VsZi0+aHduZFNlbGYsICZwcyk7CiAgIGlmKCBoREMgJiYgIShscGhjLT53U3RhdGUgJiBDQkZfTk9SRURSQVcpICkKICAgewogICAgICAgSEJSVVNIMzIJaFByZXZCcnVzaCwgaEJrZ0JydXNoOwpAQCAtNTI0LDcgKzUyNCw3IEBACiAgICAgICBpZiggIWhCa2dCcnVzaCApIGhCa2dCcnVzaCA9IEdldFN0b2NrT2JqZWN0MzIoV0hJVEVfQlJVU0gpOwogCiAgICAgICBoUHJldkJydXNoID0gU2VsZWN0T2JqZWN0MzIoIGhEQywgaEJrZ0JydXNoICk7Ci0gICAgICBpZiggIUlzUmVjdEVtcHR5MTYoJmxwaGMtPlJlY3RCdXR0b24pICkKKyAgICAgIGlmKCAhSXNSZWN0RW1wdHkzMigmbHBoYy0+UmVjdEJ1dHRvbikgKQogICAgICAgewogCSAgLyogcGFpbnQgZXZlcnl0aGluZyB0byB0aGUgcmlnaHQgb2YgdGhlIHRleHQgZmllbGQgKi8KIApAQCAtNTQ2LDcgKzU0Niw3IEBACiAgICAgICB9CiAgICAgICBpZiggaFByZXZCcnVzaCApIFNlbGVjdE9iamVjdDMyKCBoREMsIGhQcmV2QnJ1c2ggKTsKICAgfQotICBpZiggIWhQYXJhbURDICkgRW5kUGFpbnQxNihscGhjLT5zZWxmLT5od25kU2VsZiwgJnBzKTsKKyAgaWYoICFoUGFyYW1EQyApIEVuZFBhaW50MzIobHBoYy0+c2VsZi0+aHduZFNlbGYsICZwcyk7CiAgIHJldHVybiAwOwogfQogCkBAIC02NDQsOCArNjQ0LDggQEAKIHN0YXRpYyB2b2lkIENCRHJvcERvd24oIExQSEVBRENPTUJPIGxwaGMgKQogewogICAgSU5UMzIJaW5kZXg7Ci0gICBSRUNUMTYJcmVjdDsKLSAgIExQUkVDVDE2CXBSZWN0ID0gTlVMTDsKKyAgIFJFQ1QzMglyZWN0OworICAgTFBSRUNUMzIJcFJlY3QgPSBOVUxMOwogCiAgICBUUkFDRShjb21ibywiWyUwNHhdOiBkcm9wIGRvd25cbiIsIENCX0hXTkQobHBoYykpOwogCkBAIC02NzAsNyArNjcwLDcgQEAKIAogICAgLyogbm93IHNldCBwb3B1cCBwb3NpdGlvbiAqLwogCi0gICBHZXRXaW5kb3dSZWN0MTYoIGxwaGMtPnNlbGYtPmh3bmRTZWxmLCAmcmVjdCApOworICAgR2V0V2luZG93UmVjdDMyKCBscGhjLT5zZWxmLT5od25kU2VsZiwgJnJlY3QgKTsKICAgIAogICAgcmVjdC50b3AgKz0gbHBoYy0+UmVjdEVkaXQuYm90dG9tIC0gbHBoYy0+UmVjdEVkaXQudG9wIC0gU1lTTUVUUklDU19DWUJPUkRFUjsKICAgIHJlY3QuYm90dG9tID0gcmVjdC50b3AgKyBscGhjLT5SZWN0Q29tYm8uYm90dG9tIC0gCkBAIC02ODQsNyArNjg0LDcgQEAKIAogICAgaWYoICEobHBoYy0+d1N0YXRlICYgQ0JGX05PUkVEUkFXKSApCiAgICAgICAgaWYoIHBSZWN0ICkKLSAgICAgICAgICAgUmVkcmF3V2luZG93MTYoIGxwaGMtPnNlbGYtPmh3bmRTZWxmLCBwUmVjdCwgMCwgUkRXX0lOVkFMSURBVEUgfCAKKyAgICAgICAgICAgUmVkcmF3V2luZG93MzIoIGxwaGMtPnNlbGYtPmh3bmRTZWxmLCBwUmVjdCwgMCwgUkRXX0lOVkFMSURBVEUgfCAKIAkJCSAgIFJEV19FUkFTRSB8IFJEV19VUERBVEVOT1cgfCBSRFdfTk9DSElMRFJFTiApOwogICAgU2hvd1dpbmRvdzMyKCBscGhjLT5oV25kTEJveCwgU1dfU0hPV05BICk7CiB9CkBAIC03MTAsNyArNzEwLDcgQEAKIAogICAgICAgIGlmKCBscGhjLT53U3RhdGUgJiBDQkZfRFJPUFBFRCApIAogICAgICAgIHsKLQkgICBSRUNUMTYJcmVjdDsKKwkgICBSRUNUMzIJcmVjdDsKIAogCSAgIGxwaGMtPndTdGF0ZSAmPSB+Q0JGX0RST1BQRUQ7CiAJICAgU2hvd1dpbmRvdzMyKCBscGhjLT5oV25kTEJveCwgU1dfSElERSApOwpAQCAtNzI0LDcgKzcyNCw3IEBACiAJICAgZWxzZSAKICAgICAgICAgICAgewogCSAgICAgICBpZiggYkJ1dHRvbiApCi0JICAgICAgICAgICBVbmlvblJlY3QxNiggJnJlY3QsICZscGhjLT5SZWN0QnV0dG9uLAorCSAgICAgICAgICAgVW5pb25SZWN0MzIoICZyZWN0LCAmbHBoYy0+UmVjdEJ1dHRvbiwKIAkJCQkgICAgICAgJmxwaGMtPlJlY3RFZGl0ICk7CiAJICAgICAgIGVsc2UKIAkJICAgcmVjdCA9IGxwaGMtPlJlY3RFZGl0OwpAQCAtNzMyLDcgKzczMiw3IEBACiAJICAgfQogCiAJICAgaWYoIGJCdXR0b24gJiYgIShscGhjLT53U3RhdGUgJiBDQkZfTk9SRURSQVcpICkKLQkgICAgICAgUmVkcmF3V2luZG93MTYoIGhXbmQsICZyZWN0LCAwLCBSRFdfSU5WQUxJREFURSB8IAorCSAgICAgICBSZWRyYXdXaW5kb3czMiggaFduZCwgJnJlY3QsIDAsIFJEV19JTlZBTElEQVRFIHwgCiAJCQkgICAgICAgUkRXX0VSQVNFIHwgUkRXX1VQREFURU5PVyB8IFJEV19OT0NISUxEUkVOICk7CiAJICAgQ0JfTk9USUZZKCBscGhjLCBDQk5fQ0xPU0VVUCApOwogICAgICAgIH0KQEAgLTc3OCw3ICs3NzgsNyBAQAogCiAgICBpZiggaERDICkKICAgIHsKLSAgICAgICBDQlBhaW50QnV0dG9uKCBscGhjLCAoSERDMTYpaERDICk7CisgICAgICAgQ0JQYWludEJ1dHRvbiggbHBoYywgaERDICk7CiAgICAgICAgUmVsZWFzZURDMzIoIGxwaGMtPnNlbGYtPmh3bmRTZWxmLCBoREMgKTsKICAgIH0KIH0KQEAgLTg0NSw3ICs4NDUsNyBAQAogCSAgIGNhc2UgKEVOX1NFVEZPQ1VTID4+IDgpOgogCiAJCVRSQUNFKGNvbWJvLCJbJTA0eF06IGVkaXQgWyUwNHhdIGdvdCBmb2N1c1xuIiwgCi0JCQkgICAgIENCX0hXTkQobHBoYyksIChIV05EMTYpbHBoYy0+aFduZEVkaXQgKTsKKwkJCSAgICAgQ0JfSFdORChscGhjKSwgbHBoYy0+aFduZEVkaXQgKTsKIAogCQlpZiggIShscGhjLT53U3RhdGUgJiBDQkZfRk9DVVNFRCkgKSBDT01CT19TZXRGb2N1cyggbHBoYyApOwogCSAgICAgICAgYnJlYWs7CkBAIC04NTMsNyArODUzLDcgQEAKIAkgICBjYXNlIChFTl9LSUxMRk9DVVMgPj4gOCk6CiAKIAkJVFJBQ0UoY29tYm8sIlslMDR4XTogZWRpdCBbJTA0eF0gbG9zdCBmb2N1c1xuIiwKLQkJCSAgICAgQ0JfSFdORChscGhjKSwgKEhXTkQxNilscGhjLT5oV25kRWRpdCApOworCQkJICAgICBDQl9IV05EKGxwaGMpLCBscGhjLT5oV25kRWRpdCApOwogCiAJCS8qIE5PVEU6IGl0IHNlZW1zIHRoYXQgV2luZG93cycgZWRpdCBjb250cm9sIHNlbmRzIGFuCiAJCSAqIHVuZG9jdW1lbnRlZCBtZXNzYWdlIFdNX1VTRVIgKyAweDFCIGluc3RlYWQgb2YgdGhpcwpAQCAtOTI3LDggKzkyNyw3IEBACiB7CiAgICBIV05EMzIJaFduZCA9IGxwaGMtPnNlbGYtPmh3bmRTZWxmOwogCi0gICBUUkFDRShjb21ibywiWyUwNHhdOiBvd25lcmRyYXcgb3AgJTA0eFxuIiwgCi0JCUNCX0hXTkQobHBoYyksIChVSU5UMTYpbXNnICk7CisgICBUUkFDRShjb21ibywiWyUwNHhdOiBvd25lcmRyYXcgb3AgJTA0eFxuIiwgQ0JfSFdORChscGhjKSwgbXNnICk7CiAKICNkZWZpbmUgbHBJUyAgICAoKExQREVMRVRFSVRFTVNUUlVDVDMyKWxQYXJhbSkKIApAQCAtMTAxMCw3ICsxMDA5LDcgQEAKICAqIFRoaXMgZnVuY3Rpb24gc2V0cyB3aW5kb3cgcG9zaXRpb25zIGFjY29yZGluZyB0byB0aGUgdXBkYXRlZCAKICAqIGNvbXBvbmVudCBwbGFjZW1lbnQgc3RydWN0LgogICovCi1zdGF0aWMgdm9pZCBDQlJlc2V0UG9zKCBMUEhFQURDT01CTyBscGhjLCBMUFJFQ1QxNiBsYlJlY3QsIEJPT0wzMiBiUmVkcmF3ICkKK3N0YXRpYyB2b2lkIENCUmVzZXRQb3MoIExQSEVBRENPTUJPIGxwaGMsIExQUkVDVDMyIGxiUmVjdCwgQk9PTDMyIGJSZWRyYXcgKQogewogICAgQk9PTDMyCWJEcm9wID0gKENCX0dFVFRZUEUobHBoYykgIT0gQ0JTX1NJTVBMRSk7CiAKQEAgLTEwMjQsNyArMTAyMyw3IEBACiAgICAgICAgICAgICAgICAgICAgICAgIFNXUF9OT1pPUkRFUiB8IFNXUF9OT0FDVElWQVRFIHwgKChiRHJvcCkgPyBTV1BfTk9SRURSQVcgOiAwKSApOwogCiAgICBpZiggYkRyb3AgKQotICAgICAgIE9mZnNldFJlY3QxNiggbGJSZWN0LCBscGhjLT5SZWN0Q29tYm8ubGVmdCwgbHBoYy0+UmVjdENvbWJvLnRvcCApOworICAgICAgIE9mZnNldFJlY3QzMiggbGJSZWN0LCBscGhjLT5SZWN0Q29tYm8ubGVmdCwgbHBoYy0+UmVjdENvbWJvLnRvcCApOwogCiAgICBsYlJlY3QtPnJpZ2h0IC09IGxiUmVjdC0+bGVmdDsJLyogY29udmVydCB0byB3aWR0aCAqLwogICAgbGJSZWN0LT5ib3R0b20gLT0gbGJSZWN0LT50b3A7CkBAIC0xMDU5LDEwICsxMDU4LDEwIEBACiAgKi8KIHN0YXRpYyB2b2lkIENPTUJPX1NpemUoIExQSEVBRENPTUJPIGxwaGMgKQogewotICBSRUNUMTYJcmVjdDsKLSAgSU5UMTYJCXcsIGg7CisgIFJFQ1QzMglyZWN0OworICBJTlQzMgkJdywgaDsKIAotICBHZXRXaW5kb3dSZWN0MTYoIGxwaGMtPnNlbGYtPmh3bmRTZWxmLCAmcmVjdCApOworICBHZXRXaW5kb3dSZWN0MzIoIGxwaGMtPnNlbGYtPmh3bmRTZWxmLCAmcmVjdCApOwogICB3ID0gcmVjdC5yaWdodCAtIHJlY3QubGVmdDsgaCA9IHJlY3QuYm90dG9tIC0gcmVjdC50b3A7CiAKICAgVFJBQ0UoY29tYm8sIncgPSAlaSwgaCA9ICVpXG4iLCB3LCBoICk7CkBAIC0xMDg2LDkgKzEwODUsOSBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKiAgICAgICAgICAgQ09NQk9fRm9udAogICovCi1zdGF0aWMgdm9pZCBDT01CT19Gb250KCBMUEhFQURDT01CTyBscGhjLCBIRk9OVDE2IGhGb250LCBCT09MMzIgYlJlZHJhdyApCitzdGF0aWMgdm9pZCBDT01CT19Gb250KCBMUEhFQURDT01CTyBscGhjLCBIRk9OVDMyIGhGb250LCBCT09MMzIgYlJlZHJhdyApCiB7Ci0gIFJFQ1QxNiAgICAgICAgcmVjdDsKKyAgUkVDVDMyICAgICAgICByZWN0OwogCiAgIGxwaGMtPmhGb250ID0gaEZvbnQ7CiAKQEAgLTEwOTYsOCArMTA5NSw4IEBACiAgICAgICBTZW5kTWVzc2FnZTMyQSggbHBoYy0+aFduZEVkaXQsIFdNX1NFVEZPTlQsIChXUEFSQU0zMiloRm9udCwgYlJlZHJhdyApOwogICBTZW5kTWVzc2FnZTMyQSggbHBoYy0+aFduZExCb3gsIFdNX1NFVEZPTlQsIChXUEFSQU0zMiloRm9udCwgYlJlZHJhdyApOwogCi0gIEdldFdpbmRvd1JlY3QxNiggbHBoYy0+c2VsZi0+aHduZFNlbGYsICZyZWN0ICk7Ci0gIE9mZnNldFJlY3QxNiggJmxwaGMtPlJlY3RDb21ibywgcmVjdC5sZWZ0IC0gbHBoYy0+UmVjdENvbWJvLmxlZnQsCisgIEdldFdpbmRvd1JlY3QzMiggbHBoYy0+c2VsZi0+aHduZFNlbGYsICZyZWN0ICk7CisgIE9mZnNldFJlY3QzMiggJmxwaGMtPlJlY3RDb21ibywgcmVjdC5sZWZ0IC0gbHBoYy0+UmVjdENvbWJvLmxlZnQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVjdC50b3AgLSBscGhjLT5SZWN0Q29tYm8udG9wICk7CiAgIENCQ2FsY1BsYWNlbWVudCggbHBoYywgJmxwaGMtPlJlY3RFZGl0LAogICAgICAgICAgICAgICAgICAgICAgICAgICZscGhjLT5SZWN0QnV0dG9uLCAmcmVjdCApOwpAQCAtMTExNiwxMSArMTExNSwxMSBAQAogICAgewogICAgICAgIGlmKCBoZWlnaHQgPCAzMjc2OCApCiAgICAgICAgewotICAgICAgICAgICBSRUNUMTYJcmVjdDsKKyAgICAgICAgICAgUkVDVDMyCXJlY3Q7CiAKICAgICAgICAgICAgbHBoYy0+ZWRpdEhlaWdodCA9IGhlaWdodDsKLSAgICAgICAgICAgR2V0V2luZG93UmVjdDE2KCBscGhjLT5zZWxmLT5od25kU2VsZiwgJnJlY3QgKTsKLSAgICAgICAgICAgT2Zmc2V0UmVjdDE2KCAmbHBoYy0+UmVjdENvbWJvLCByZWN0LmxlZnQgLSBscGhjLT5SZWN0Q29tYm8ubGVmdCwKKyAgICAgICAgICAgR2V0V2luZG93UmVjdDMyKCBscGhjLT5zZWxmLT5od25kU2VsZiwgJnJlY3QgKTsKKyAgICAgICAgICAgT2Zmc2V0UmVjdDMyKCAmbHBoYy0+UmVjdENvbWJvLCByZWN0LmxlZnQgLSBscGhjLT5SZWN0Q29tYm8ubGVmdCwKIAkJCQkgICAgICAgICAgIHJlY3QudG9wIC0gbHBoYy0+UmVjdENvbWJvLnRvcCApOwogICAgICAgICAgICBDQkNhbGNQbGFjZW1lbnQoIGxwaGMsICZscGhjLT5SZWN0RWRpdCwKIAkJCSAgICAgICAgICAmbHBoYy0+UmVjdEJ1dHRvbiwgJnJlY3QgKTsKQEAgLTExNTQsNyArMTE1Myw4IEBACiAgKi8KIHN0YXRpYyB2b2lkIENPTUJPX0xCdXR0b25Eb3duKCBMUEhFQURDT01CTyBscGhjLCBMUEFSQU0gbFBhcmFtICkKIHsKLSAgIEJPT0wzMiAgICAgIGJCdXR0b24gPSBQdEluUmVjdDE2KCZscGhjLT5SZWN0QnV0dG9uLCBNQUtFUE9JTlQxNihsUGFyYW0pKTsKKyAgIFBPSU5UMzIgICAgIHB0ID0geyBMT1dPUkQobFBhcmFtKSwgSElXT1JEKGxQYXJhbSkgfTsKKyAgIEJPT0wzMiAgICAgIGJCdXR0b24gPSBQdEluUmVjdDMyKCZscGhjLT5SZWN0QnV0dG9uLCBwdCk7CiAgICBIV05EMzIgICAgICBoV25kID0gbHBoYy0+c2VsZi0+aHduZFNlbGY7CiAKICAgIGlmKCAoQ0JfR0VUVFlQRShscGhjKSA9PSBDQlNfRFJPUERPV05MSVNUKSB8fApAQCAtMTIyMCwxMSArMTIyMCwxMiBAQAogICovCiBzdGF0aWMgdm9pZCBDT01CT19Nb3VzZU1vdmUoIExQSEVBRENPTUJPIGxwaGMsIFdQQVJBTTMyIHdQYXJhbSwgTFBBUkFNIGxQYXJhbSApCiB7Ci0gICBSRUNUMTYJbGJSZWN0OworICAgUE9JTlQzMiAgcHQgPSB7IExPV09SRChsUGFyYW0pLCBISVdPUkQobFBhcmFtKSB9OworICAgUkVDVDMyICAgbGJSZWN0OwogCiAgICBpZiggbHBoYy0+d1N0YXRlICYgQ0JGX0JVVFRPTkRPV04gKQogICAgewotICAgICAgIEJPT0wzMgliQnV0dG9uID0gUHRJblJlY3QxNigmbHBoYy0+UmVjdEJ1dHRvbiwgTUFLRVBPSU5UMTYobFBhcmFtKSk7CisgICAgICAgQk9PTDMyCWJCdXR0b24gPSBQdEluUmVjdDMyKCZscGhjLT5SZWN0QnV0dG9uLCBwdCk7CiAKICAgICAgICBpZiggIWJCdXR0b24gKQogICAgICAgIHsKQEAgLTEyMzMsMTAgKzEyMzQsOSBAQAogICAgICAgIH0KICAgIH0KIAotICAgR2V0Q2xpZW50UmVjdDE2KCBscGhjLT5oV25kTEJveCwgJmxiUmVjdCApOwotICAgTWFwV2luZG93UG9pbnRzMTYoIGxwaGMtPnNlbGYtPmh3bmRTZWxmLCAKLQkJICAgICAgbHBoYy0+aFduZExCb3gsIChMUFBPSU5UMTYpJmxQYXJhbSwgMSApOwotICAgaWYoIFB0SW5SZWN0MTYoJmxiUmVjdCwgTUFLRVBPSU5UMTYobFBhcmFtKSkgKQorICAgR2V0Q2xpZW50UmVjdDMyKCBscGhjLT5oV25kTEJveCwgJmxiUmVjdCApOworICAgTWFwV2luZG93UG9pbnRzMzIoIGxwaGMtPnNlbGYtPmh3bmRTZWxmLCBscGhjLT5oV25kTEJveCwgJnB0LCAxICk7CisgICBpZiggUHRJblJlY3QzMigmbGJSZWN0LCBwdCkgKQogICAgewogICAgICAgIGxwaGMtPndTdGF0ZSAmPSB+Q0JGX0NBUFRVUkU7CiAgICAgICAgUmVsZWFzZUNhcHR1cmUoKTsKQEAgLTEyODMsNyArMTI4Myw3IEBACiAKICAgICAgCWNhc2UgV01fUEFJTlQ6CiAJCS8qIHdQYXJhbSBtYXkgY29udGFpbiBhIHZhbGlkIEhEQyEgKi8KLQkJcmV0dXJuIENPTUJPX1BhaW50KGxwaGMsIChIREMxNil3UGFyYW0pOworCQlyZXR1cm4gQ09NQk9fUGFpbnQobHBoYywgd1BhcmFtKTsKIAogCWNhc2UgV01fRVJBU0VCS0dORDoKIAkJcmV0dXJuIFRSVUU7CkBAIC0xNTY0LDcgKzE1NjQsNyBAQAogCQlyZXR1cm4gKGxwaGMtPndTdGF0ZSAmIENCRl9FVUkpID8gVFJVRSA6IEZBTFNFOwogCiAJY2FzZSAoV01fVVNFUiArIDB4MUIpOgotCSAgICAgICAgV0FSTihjb21ibywgIlslMDR4XTogdW5kb2N1bWVudGVkIG1zZyFcbiIsIChIV05EMTYpaHduZCApOworCSAgICAgICAgV0FSTihjb21ibywgIlslMDR4XTogdW5kb2N1bWVudGVkIG1zZyFcbiIsIGh3bmQgKTsKICAgICB9CiAgICAgcmV0dXJuIERlZldpbmRvd1Byb2MzMkEoaHduZCwgbWVzc2FnZSwgd1BhcmFtLCBsUGFyYW0pOwogICB9CmRpZmYgLS1naXQgYS9jb250cm9scy9jb21tY3RybC5jIGIvY29udHJvbHMvY29tbWN0cmwuYwppbmRleCAwY2U0ZTAwLi5mOTQwMGZkIDEwMDY0NAotLS0gYS9jb250cm9scy9jb21tY3RybC5jCisrKyBiL2NvbnRyb2xzL2NvbW1jdHJsLmMKQEAgLTE1Niw3ICsxNTYsNyBAQAogICAgICAgICBvbGRfbmFtZSA9IGNsYXNzMzItPmxwc3pDbGFzc05hbWU7CiAgICAgICAgIHN0cmNweSggbmFtZSwgKGNoYXIgKiljbGFzczMyLT5scHN6Q2xhc3NOYW1lICk7CiAgICAgICAgIGNsYXNzMzItPmxwc3pDbGFzc05hbWUgPSBuYW1lOwotICAgICAgICBjbGFzczMyLT5oQ3Vyc29yID0gTG9hZEN1cnNvcjE2KCAwLCBJRENfQVJST1cgKTsKKyAgICAgICAgY2xhc3MzMi0+aEN1cnNvciA9IExvYWRDdXJzb3IzMkEoIDAsIChMUENTVFIpSURDX0FSUk9XICk7CiAgICAgICAgIFJlZ2lzdGVyQ2xhc3MzMkEoIGNsYXNzMzIgKTsKICAgICAgICAgY2xhc3MzMi0+bHBzekNsYXNzTmFtZSA9IG9sZF9uYW1lOwkKICAgICB9CmRpZmYgLS1naXQgYS9jb250cm9scy9kZXNrdG9wLmMgYi9jb250cm9scy9kZXNrdG9wLmMKaW5kZXggZmQyOTYzYy4uMTUzNWI5YSAxMDA2NDQKLS0tIGEvY29udHJvbHMvZGVza3RvcC5jCisrKyBiL2NvbnRyb2xzL2Rlc2t0b3AuYwpAQCAtMTQ5LDcgKzE0OSw3IEBACiAJaW5mb1B0ci0+aGJpdG1hcFdhbGxQYXBlciA9IDA7CiAJU2V0RGVza1BhdHRlcm4oKTsKIAlTZXREZXNrV2FsbFBhcGVyMzIoIChMUFNUUiktMSApOwotCWJyZWFrOworCXJldHVybiAxOwogCQogICAgIGNhc2UgV01fRVJBU0VCS0dORDoKIAlpZiAocm9vdFdpbmRvdyA9PSBEZWZhdWx0Um9vdFdpbmRvdyhkaXNwbGF5KSkgcmV0dXJuIDE7CmRpZmYgLS1naXQgYS9jb250cm9scy9pY29udGl0bGUuYyBiL2NvbnRyb2xzL2ljb250aXRsZS5jCmluZGV4IDhjNGE0NzMuLmFlMzM3YWYgMTAwNjQ0Ci0tLSBhL2NvbnRyb2xzL2ljb250aXRsZS5jCisrKyBiL2NvbnRyb2xzL2ljb250aXRsZS5jCkBAIC0yNCwxMSArMjQsMTEgQEAKICAqLwogQk9PTDMyIElDT05USVRMRV9Jbml0KHZvaWQpCiB7Ci0gICAgTE9HRk9OVDE2IGxvZ0ZvbnQ7CisgICAgTE9HRk9OVDMyQSBsb2dGb250OwogCi0gICAgU3lzdGVtUGFyYW1ldGVyc0luZm8xNiggU1BJX0dFVElDT05USVRMRUxPR0ZPTlQsIDAsICZsb2dGb250LCAwICk7Ci0gICAgU3lzdGVtUGFyYW1ldGVyc0luZm8xNiggU1BJX0dFVElDT05USVRMRVdSQVAsIDAsICZiTXVsdGlMaW5lVGl0bGUsIDAgKTsKLSAgICBoSWNvblRpdGxlRm9udCA9IENyZWF0ZUZvbnRJbmRpcmVjdDE2KCAmbG9nRm9udCApOworICAgIFN5c3RlbVBhcmFtZXRlcnNJbmZvMzJBKCBTUElfR0VUSUNPTlRJVExFTE9HRk9OVCwgMCwgJmxvZ0ZvbnQsIDAgKTsKKyAgICBTeXN0ZW1QYXJhbWV0ZXJzSW5mbzMyQSggU1BJX0dFVElDT05USVRMRVdSQVAsIDAsICZiTXVsdGlMaW5lVGl0bGUsIDAgKTsKKyAgICBoSWNvblRpdGxlRm9udCA9IENyZWF0ZUZvbnRJbmRpcmVjdDMyQSggJmxvZ0ZvbnQgKTsKICAgICByZXR1cm4gKGhJY29uVGl0bGVGb250KSA/IFRSVUUgOiBGQUxTRTsKIH0KIApAQCAtMTYxLDcgKzE2MSw3IEBACiAgICAgaFByZXZGb250ID0gU2VsZWN0T2JqZWN0MzIoIGhEQywgaEljb25UaXRsZUZvbnQgKTsKICAgICBpZiggaFByZXZGb250ICkKICAgICB7Ci0gICAgICAgIFJFQ1QxNiAgcmVjdDsKKyAgICAgICAgUkVDVDMyICByZWN0OwogCUlOVDMyCWxlbmd0aDsKIAljaGFyCWJ1ZmZlcls4MF07CiAKQEAgLTE3Myw4ICsxNzMsOCBAQAogICAgICAgICBTZXRUZXh0Q29sb3IzMiggaERDLCB0ZXh0Q29sb3IgKTsKICAgICAgICAgU2V0QmtNb2RlMzIoIGhEQywgVFJBTlNQQVJFTlQgKTsKIAkKLQlEcmF3VGV4dDE2KCBoREMsIGJ1ZmZlciwgbGVuZ3RoLCAmcmVjdCwgRFRfQ0VOVEVSIHwgRFRfTk9QUkVGSVggfAotCQkgICAgRFRfV09SREJSRUFLIHwgKChiTXVsdGlMaW5lVGl0bGUpID8gMCA6IERUX1NJTkdMRUxJTkUpICk7IAorCURyYXdUZXh0MzJBKCBoREMsIGJ1ZmZlciwgbGVuZ3RoLCAmcmVjdCwgRFRfQ0VOVEVSIHwgRFRfTk9QUkVGSVggfAorCQkgICAgIERUX1dPUkRCUkVBSyB8ICgoYk11bHRpTGluZVRpdGxlKSA/IDAgOiBEVF9TSU5HTEVMSU5FKSApOyAKIAogCVNlbGVjdE9iamVjdDMyKCBoREMsIGhQcmV2Rm9udCApOwogICAgIH0KZGlmZiAtLWdpdCBhL2NvbnRyb2xzL2xpc3Rib3guYyBiL2NvbnRyb2xzL2xpc3Rib3guYwppbmRleCBhOTg1NTIwLi41OGI2NTBlIDEwMDY0NAotLS0gYS9jb250cm9scy9saXN0Ym94LmMKKysrIGIvY29udHJvbHMvbGlzdGJveC5jCkBAIC0xMDAsMTQgKzEwMCwxNCBAQAogICAgIExCX0lURU1EQVRBICppdGVtOwogICAgIExCX0RFU0NSICpkZXNjciA9ICooTEJfREVTQ1IgKiopd25kLT53RXh0cmE7CiAKLSAgICBwcmludGYoICJMaXN0Ym94OlxuIiApOwotICAgIHByaW50ZiggImh3bmQ9JTA0eCBkZXNjcj0lMDh4IGhlYXA9JTA4eCBpdGVtcz0lZCB0b3A9JWRcbiIsCi0gICAgICAgICAgICB3bmQtPmh3bmRTZWxmLCAoVUlOVDMyKWRlc2NyLCBkZXNjci0+aGVhcCwgZGVzY3ItPm5iX2l0ZW1zLAotICAgICAgICAgICAgZGVzY3ItPnRvcF9pdGVtICk7CisgICAgRFVNUCggIkxpc3Rib3g6XG4iICk7CisgICAgRFVNUCggImh3bmQ9JTA0eCBkZXNjcj0lMDh4IGhlYXA9JTA4eCBpdGVtcz0lZCB0b3A9JWRcbiIsCisJICB3bmQtPmh3bmRTZWxmLCAoVUlOVDMyKWRlc2NyLCBkZXNjci0+aGVhcCwgZGVzY3ItPm5iX2l0ZW1zLAorCSAgZGVzY3ItPnRvcF9pdGVtICk7CiAgICAgZm9yIChpID0gMCwgaXRlbSA9IGRlc2NyLT5pdGVtczsgaSA8IGRlc2NyLT5uYl9pdGVtczsgaSsrLCBpdGVtKyspCiAgICAgewotICAgICAgICBwcmludGYoICIlNGQ6ICUtNDBzICVkICUwOGx4ICUzZFxuIiwKLSAgICAgICAgICAgICAgICBpLCBpdGVtLT5zdHIsIGl0ZW0tPnNlbGVjdGVkLCBpdGVtLT5kYXRhLCBpdGVtLT5oZWlnaHQgKTsKKyAgICAgICAgRFVNUCggIiU0ZDogJS00MHMgJWQgJTA4bHggJTNkXG4iLAorCSAgICAgIGksIGl0ZW0tPnN0ciwgaXRlbS0+c2VsZWN0ZWQsIGl0ZW0tPmRhdGEsIGl0ZW0tPmhlaWdodCApOwogICAgIH0KIH0KIApkaWZmIC0tZ2l0IGEvY29udHJvbHMvbWVudS5jIGIvY29udHJvbHMvbWVudS5jCmluZGV4IDEyZGUwOWIuLjM1MDhkNGQgMTAwNjQ0Ci0tLSBhL2NvbnRyb2xzL21lbnUuYworKysgYi9jb250cm9scy9tZW51LmMKQEAgLTI2MDcsMTUgKzI2MDcsMTggQEAKIAkvKiB6ZXJvIG91dCBnbG9iYWwgcG9pbnRlciBpbiBjYXNlIHJlc2lkZW50IHBvcHVwIHdpbmRvdwogCSAqIHdhcyBzb21laG93IGRlc3Ryb3llZC4gKi8KIAotCWlmKCBod25kID09IHBUb3BQb3B1cFduZC0+aHduZFNlbGYgKQotCXsJCi0JICAgIEVSUihtZW51LCAicmVzaWRlbnQgcG9wdXAgZGVzdHJveWVkIVxuIik7CisJaWYoIHBUb3BQb3B1cFduZCApCisJeworCSAgICBpZiggaHduZCA9PSBwVG9wUG9wdXBXbmQtPmh3bmRTZWxmICkKKwkgICAgeworCQlFUlIobWVudSwgInJlc2lkZW50IHBvcHVwIGRlc3Ryb3llZCFcbiIpOwogCi0JICAgIHBUb3BQb3B1cFduZCA9IE5VTEw7IAotCSAgICB1U3ViUFduZExldmVsID0gMDsgCisJCXBUb3BQb3B1cFduZCA9IE5VTEw7CisJCXVTdWJQV25kTGV2ZWwgPSAwOworCSAgICB9CisJICAgIGVsc2UKKwkJdVN1YlBXbmRMZXZlbC0tOwogCX0KLQllbHNlCi0JICAgIHVTdWJQV25kTGV2ZWwtLTsKIAlicmVhazsKIAogICAgIGNhc2UgV01fU0hPV1dJTkRPVzoKZGlmZiAtLWdpdCBhL2NvbnRyb2xzL3Njcm9sbC5jIGIvY29udHJvbHMvc2Nyb2xsLmMKaW5kZXggYTNhNTMzYi4uOGU1YTM2NiAxMDA2NDQKLS0tIGEvY29udHJvbHMvc2Nyb2xsLmMKKysrIGIvY29udHJvbHMvc2Nyb2xsLmMKQEAgLTgxLDE4ICs4MSwxOCBAQAogICovCiBzdGF0aWMgdm9pZCBTQ1JPTExfTG9hZEJpdG1hcHModm9pZCkKIHsKLSAgICBoVXBBcnJvdyAgPSBMb2FkQml0bWFwMTYoIDAsIE1BS0VJTlRSRVNPVVJDRShPQk1fVVBBUlJPVykgKTsKLSAgICBoRG5BcnJvdyAgPSBMb2FkQml0bWFwMTYoIDAsIE1BS0VJTlRSRVNPVVJDRShPQk1fRE5BUlJPVykgKTsKLSAgICBoTGZBcnJvdyAgPSBMb2FkQml0bWFwMTYoIDAsIE1BS0VJTlRSRVNPVVJDRShPQk1fTEZBUlJPVykgKTsKLSAgICBoUmdBcnJvdyAgPSBMb2FkQml0bWFwMTYoIDAsIE1BS0VJTlRSRVNPVVJDRShPQk1fUkdBUlJPVykgKTsKLSAgICBoVXBBcnJvd0QgPSBMb2FkQml0bWFwMTYoIDAsIE1BS0VJTlRSRVNPVVJDRShPQk1fVVBBUlJPV0QpICk7Ci0gICAgaERuQXJyb3dEID0gTG9hZEJpdG1hcDE2KCAwLCBNQUtFSU5UUkVTT1VSQ0UoT0JNX0ROQVJST1dEKSApOwotICAgIGhMZkFycm93RCA9IExvYWRCaXRtYXAxNiggMCwgTUFLRUlOVFJFU09VUkNFKE9CTV9MRkFSUk9XRCkgKTsKLSAgICBoUmdBcnJvd0QgPSBMb2FkQml0bWFwMTYoIDAsIE1BS0VJTlRSRVNPVVJDRShPQk1fUkdBUlJPV0QpICk7Ci0gICAgaFVwQXJyb3dJID0gTG9hZEJpdG1hcDE2KCAwLCBNQUtFSU5UUkVTT1VSQ0UoT0JNX1VQQVJST1dJKSApOwotICAgIGhEbkFycm93SSA9IExvYWRCaXRtYXAxNiggMCwgTUFLRUlOVFJFU09VUkNFKE9CTV9ETkFSUk9XSSkgKTsKLSAgICBoTGZBcnJvd0kgPSBMb2FkQml0bWFwMTYoIDAsIE1BS0VJTlRSRVNPVVJDRShPQk1fTEZBUlJPV0kpICk7Ci0gICAgaFJnQXJyb3dJID0gTG9hZEJpdG1hcDE2KCAwLCBNQUtFSU5UUkVTT1VSQ0UoT0JNX1JHQVJST1dJKSApOworICAgIGhVcEFycm93ICA9IExvYWRCaXRtYXAzMkEoIDAsIE1BS0VJTlRSRVNPVVJDRShPQk1fVVBBUlJPVykgKTsKKyAgICBoRG5BcnJvdyAgPSBMb2FkQml0bWFwMzJBKCAwLCBNQUtFSU5UUkVTT1VSQ0UoT0JNX0ROQVJST1cpICk7CisgICAgaExmQXJyb3cgID0gTG9hZEJpdG1hcDMyQSggMCwgTUFLRUlOVFJFU09VUkNFKE9CTV9MRkFSUk9XKSApOworICAgIGhSZ0Fycm93ICA9IExvYWRCaXRtYXAzMkEoIDAsIE1BS0VJTlRSRVNPVVJDRShPQk1fUkdBUlJPVykgKTsKKyAgICBoVXBBcnJvd0QgPSBMb2FkQml0bWFwMzJBKCAwLCBNQUtFSU5UUkVTT1VSQ0UoT0JNX1VQQVJST1dEKSApOworICAgIGhEbkFycm93RCA9IExvYWRCaXRtYXAzMkEoIDAsIE1BS0VJTlRSRVNPVVJDRShPQk1fRE5BUlJPV0QpICk7CisgICAgaExmQXJyb3dEID0gTG9hZEJpdG1hcDMyQSggMCwgTUFLRUlOVFJFU09VUkNFKE9CTV9MRkFSUk9XRCkgKTsKKyAgICBoUmdBcnJvd0QgPSBMb2FkQml0bWFwMzJBKCAwLCBNQUtFSU5UUkVTT1VSQ0UoT0JNX1JHQVJST1dEKSApOworICAgIGhVcEFycm93SSA9IExvYWRCaXRtYXAzMkEoIDAsIE1BS0VJTlRSRVNPVVJDRShPQk1fVVBBUlJPV0kpICk7CisgICAgaERuQXJyb3dJID0gTG9hZEJpdG1hcDMyQSggMCwgTUFLRUlOVFJFU09VUkNFKE9CTV9ETkFSUk9XSSkgKTsKKyAgICBoTGZBcnJvd0kgPSBMb2FkQml0bWFwMzJBKCAwLCBNQUtFSU5UUkVTT1VSQ0UoT0JNX0xGQVJST1dJKSApOworICAgIGhSZ0Fycm93SSA9IExvYWRCaXRtYXAzMkEoIDAsIE1BS0VJTlRSRVNPVVJDRShPQk1fUkdBUlJPV0kpICk7CiB9CiAKIApkaWZmIC0tZ2l0IGEvY29udHJvbHMvdWl0b29scy5jIGIvY29udHJvbHMvdWl0b29scy5jCmluZGV4IGQzZjgxNGUuLjQzNTQ0MjYgMTAwNjQ0Ci0tLSBhL2NvbnRyb2xzL3VpdG9vbHMuYworKysgYi9jb250cm9scy91aXRvb2xzLmMKQEAgLTkyLDIwICs5MiwxNCBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKiAgICAgICAgICAgVUlUT09MU19EcmF3RGlhZ0VkZ2UKICAqCi0gKiBTYW1lIGFzIERyYXdFZGdlLCBidXQgd2l0aCBCRl9ESUFHT05BTAotICogSSB0ZXN0ZWQgaXQgZXh0ZW5zaXZlbHkgYW5kIGFzIGZhciBhcyBJIGNhbiB0ZWxsIGl0IGlzIGlkZW50aWNhbCB0byB0aGUKLSAqIGltcGxlbWVudGFpb24gaW4gV2luOTUuCi0gKiBJIGRvIG5vdCBsaWtlIHRoYXQgSSBjcmVhdGUgYW5kCi0gKiB1c2UgdGhlIDMgUGVucyB0byBkcmF3IHRoZSBkaWFnb25hbHMuIEl0IHdvdWxkIGJlIGJldHRlciB0byBkcmF3IHRoZW0KLSAqIHVzaW5nIHRoZSBicnVzaGVzIHJldHVybmVkIGJ5IEdldFN5c0NvbG9yQnJ1c2ggZnVuYywgYnV0IEkgZGlkIG5vdCBoYXZlCi0gKiB0aGUgcGF0aWVuY2UgdG8gaW1wbGVtZW50IHRoYXQgeWV0LgotICovCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBTYW1lIGFzIERyYXdFZGdlIGludm9rZWQgd2l0aCBCRl9ESUFHT05BTAorICoKICAqIDAzLURlYy0xOTk3OiBDaGFuZ2VkIGJ5IEJlcnRobyBTdHVsdGllbnMKICAqCiAgKiBTZWUgYWxzbyBjb21tZW50cyB3aXRoIFVJVE9PTFNfRHJhd1JlY3RFZGdlKCkKICAqLwotc3RhdGljIEJPT0wzMiBVSVRPT0xTX0RyYXdEaWFnRWRnZShIREMzMiBoZGMsIExQUkVDVDMyIHJjLCBVSU5UMzIgdVR5cGUsIFVJTlQzMiB1RmxhZ3MpCitzdGF0aWMgQk9PTDMyIFVJVE9PTFM5NV9EcmF3RGlhZ0VkZ2UoSERDMzIgaGRjLCBMUFJFQ1QzMiByYywgCisJCQkJICAgICBVSU5UMzIgdVR5cGUsIFVJTlQzMiB1RmxhZ3MpCiB7CiAgICAgUE9JTlQzMiBQb2ludHNbNF07CiAgICAgY2hhciBJbm5lckksIE91dGVySTsKQEAgLTM0NiwxNSArMzQwLDggQEAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICogICAgICAgICAgIFVJVE9PTFNfRHJhd1JlY3RFZGdlCiAgKgotICogU2FtZSBhcyBEcmF3RWRnZSwgYnV0IHdpdGhvdXQgQkZfRElBR09OQUwKLSAqIEkgdGVzdGVkIHRoaXMgZnVuY3Rpb24gYW5kIGl0IHdvcmtzIHZlcnkgd2VsbC4gWW91IHNob3VsZCBub3QgY2hhbmdlIGl0Ci0gKiB1bmxlc3MgeW91IGZpbmQgYSBidWcuIElmIHlvdSBkb24ndCBsaWtlIHRoZSBjb2xvcnMsIGl0IGl0IG5vdCBpdHMgCi0gKiBmYXVsdCAtIHRoZSBzeXN0ZW0gY29sb3JzIGFyZSBub3QgT0suCi0gKiBBZ2FpbiwgSSB0ZXN0ZWQgdGhpcyBmdW5jdGlvbiBvbiBXaW45NSBhbmQgSSBjb21wYXJlZCB0aGUgb3V0cHV0IHdpdGggdGhlCi0gKiBvbmUgZ2VuZXJhdGVkIGJ5IHRoZSBuYXRpdmUgRHJhd0VkZ2UgYW5kIGl0IGlzIGlkZW50aWNhbCBvbiBhbGwgY2FzZXMgdGhhdAotICogSSB0cmllZCwgYW5kIEkgdHJpZWQgcXVpdGUgYSBmZXcuCi0gKi8KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIFNhbWUgYXMgRHJhd0VkZ2UgaW52b2tlZCB3aXRob3V0IEJGX0RJQUdPTkFMCisgKgogICogMjMtTm92LTE5OTc6IENoYW5nZWQgYnkgQmVydGhvIFN0dWx0aWVucwogICoKICAqIFdlbGwsIEkgc3RhcnRlZCB0ZXN0aW5nIHRoaXMgYW5kIGZvdW5kIG91dCB0aGF0IHRoZXJlIGFyZSBhIGZldyB0aGluZ3MKQEAgLTQyNCw3ICs0MTEsOCBAQAogICovCiAKIAotc3RhdGljIEJPT0wzMiBVSVRPT0xTX0RyYXdSZWN0RWRnZShIREMzMiBoZGMsIExQUkVDVDMyIHJjLCBVSU5UMzIgdVR5cGUsIFVJTlQzMiB1RmxhZ3MpCitzdGF0aWMgQk9PTDMyIFVJVE9PTFM5NV9EcmF3UmVjdEVkZ2UoSERDMzIgaGRjLCBMUFJFQ1QzMiByYywgCisJCQkJICAgICBVSU5UMzIgdVR5cGUsIFVJTlQzMiB1RmxhZ3MpCiB7CiAgICAgY2hhciBMVElubmVySSwgTFRPdXRlckk7CiAgICAgY2hhciBSQklubmVySSwgUkJPdXRlckk7CkBAIC01NzUsMTMgKzU2MywxMiBAQAogQk9PTDMyIFdJTkFQSSBEcmF3RWRnZTMyKCBIREMzMiBoZGMsIExQUkVDVDMyIHJjLCBVSU5UMzIgZWRnZSwgVUlOVDMyIGZsYWdzICkKIHsKICAgICBUUkFDRShncmFwaGljcywgIiUwNHggJWQsJWQtJWQsJWQgJTA0eCAlMDR4XG4iLAotICAgICAgICAgICAgICAgICAgICAgIGhkYywgcmMtPmxlZnQsIHJjLT50b3AsIHJjLT5yaWdodCwgcmMtPmJvdHRvbSwKLSAgICAgICAgICAgICAgICAgICAgICBlZGdlLCBmbGFncyApOworCSAgaGRjLCByYy0+bGVmdCwgcmMtPnRvcCwgcmMtPnJpZ2h0LCByYy0+Ym90dG9tLCBlZGdlLCBmbGFncyApOwogCiAgICAgaWYoZmxhZ3MgJiBCRl9ESUFHT05BTCkKLSAgICAgIHJldHVybiBVSVRPT0xTX0RyYXdEaWFnRWRnZShoZGMsIHJjLCBlZGdlLCBmbGFncyk7CisgICAgICByZXR1cm4gVUlUT09MUzk1X0RyYXdEaWFnRWRnZShoZGMsIHJjLCBlZGdlLCBmbGFncyk7CiAgICAgZWxzZQotICAgICAgcmV0dXJuIFVJVE9PTFNfRHJhd1JlY3RFZGdlKGhkYywgcmMsIGVkZ2UsIGZsYWdzKTsKKyAgICAgIHJldHVybiBVSVRPT0xTOTVfRHJhd1JlY3RFZGdlKGhkYywgcmMsIGVkZ2UsIGZsYWdzKTsKIH0KIAogCkBAIC02MjMsNyArNjEwLDcgQEAKICAqIGhvd2V2ZXIgdGhlcmUgYmVjYXVzZSBNUyB1c2VzIGEgVHJ1ZVR5cGUgZm9udCAoTWFybGV0dCkgdG8gZHJhdwogICogdGhlIGJ1dHRvbnMuCiAgKi8KLXN0YXRpYyBCT09MMzIgVUlUT09MU19ERkNfQnV0dG9uUHVzaChIREMzMiBkYywgTFBSRUNUMzIgciwgVUlOVDMyIHVGbGFncykKK3N0YXRpYyBCT09MMzIgVUlUT09MUzk1X0RGQ19CdXR0b25QdXNoKEhEQzMyIGRjLCBMUFJFQ1QzMiByLCBVSU5UMzIgdUZsYWdzKQogewogICAgIFVJTlQzMiBlZGdlOwogICAgIFJFQ1QzMiBteXIgPSAqcjsKQEAgLTYzNiw5ICs2MjMsOSBAQAogICAgIGlmKHVGbGFncyAmIERGQ1NfQ0hFQ0tFRCkKICAgICB7CiAgICAgICAgIGlmKHVGbGFncyAmIERGQ1NfTU9OTykKLSAgICAgICAgICAgIFVJVE9PTFNfRHJhd1JlY3RFZGdlKGRjLCAmbXlyLCBlZGdlLCBCRl9NT05PfEJGX1JFQ1R8QkZfQURKVVNUKTsKKyAgICAgICAgICAgIFVJVE9PTFM5NV9EcmF3UmVjdEVkZ2UoZGMsICZteXIsIGVkZ2UsIEJGX01PTk98QkZfUkVDVHxCRl9BREpVU1QpOwogICAgICAgICBlbHNlCi0gICAgICAgICAgICBVSVRPT0xTX0RyYXdSZWN0RWRnZShkYywgJm15ciwgZWRnZSwgKHVGbGFncyZERkNTX0ZMQVQpfEJGX1JFQ1R8QkZfU09GVHxCRl9BREpVU1QpOworICAgICAgICAgICAgVUlUT09MUzk1X0RyYXdSZWN0RWRnZShkYywgJm15ciwgZWRnZSwgKHVGbGFncyZERkNTX0ZMQVQpfEJGX1JFQ1R8QkZfU09GVHxCRl9BREpVU1QpOwogCiAgICAgICAgIGlmKEdldFN5c0NvbG9yMzIoQ09MT1JfQlROSElHSExJR0hUKSA9PSBSR0IoMjU1LCAyNTUsIDI1NSkpCiAgICAgICAgIHsKQEAgLTY2MiwxMiArNjQ5LDEyIEBACiAgICAgewogICAgICAgICBpZih1RmxhZ3MgJiBERkNTX01PTk8pCiAgICAgICAgIHsKLSAgICAgICAgICAgIFVJVE9PTFNfRHJhd1JlY3RFZGdlKGRjLCAmbXlyLCBlZGdlLCBCRl9NT05PfEJGX1JFQ1R8QkZfQURKVVNUKTsKKyAgICAgICAgICAgIFVJVE9PTFM5NV9EcmF3UmVjdEVkZ2UoZGMsICZteXIsIGVkZ2UsIEJGX01PTk98QkZfUkVDVHxCRl9BREpVU1QpOwogICAgICAgICAgICAgRmlsbFJlY3QzMihkYywgJm15ciwgR2V0U3lzQ29sb3JCcnVzaDMyKENPTE9SX0JUTkZBQ0UpKTsKICAgICAgICAgfQogICAgICAgICBlbHNlCiAgICAgICAgIHsKLSAgICAgICAgICAgIFVJVE9PTFNfRHJhd1JlY3RFZGdlKGRjLCByLCBlZGdlLCAodUZsYWdzJkRGQ1NfRkxBVCkgfCBCRl9NSURETEUgfEJGX1NPRlR8IEJGX1JFQ1QpOworICAgICAgICAgICAgVUlUT09MUzk1X0RyYXdSZWN0RWRnZShkYywgciwgZWRnZSwgKHVGbGFncyZERkNTX0ZMQVQpIHwgQkZfTUlERExFIHxCRl9TT0ZUfCBCRl9SRUNUKTsKICAgICAgICAgfQogICAgIH0KIApAQCAtNjk1LDcgKzY4Miw3IEBACiAgKi8KICNkZWZpbmUgREZDX0NIRUNLUE9JTlRTTUFYICAgICAgNgogCi1zdGF0aWMgQk9PTDMyIFVJVE9PTFNfREZDX0J1dHRvbkNoZWNrKEhEQzMyIGRjLCBMUFJFQ1QzMiByLCBVSU5UMzIgdUZsYWdzKQorc3RhdGljIEJPT0wzMiBVSVRPT0xTOTVfREZDX0J1dHRvbkNoZWNrKEhEQzMyIGRjLCBMUFJFQ1QzMiByLCBVSU5UMzIgdUZsYWdzKQogewogICAgIFJFQ1QzMiBteXI7CiAgICAgaW50IFNtYWxsRGlhbSA9IFVJVE9PTFNfTWFrZVNxdWFyZVJlY3QociwgJm15cik7CkBAIC04MDMsNyArNzkwLDcgQEAKICAqIGhvd2V2ZXIgdGhlcmUgYmVjYXVzZSBNUyB1c2VzIGEgVHJ1ZVR5cGUgZm9udCAoTWFybGV0dCkgdG8gZHJhdwogICogdGhlIGJ1dHRvbnMuCiAgKi8KLXN0YXRpYyBCT09MMzIgVUlUT09MU19ERkNfQnV0dG9uUmFkaW8oSERDMzIgZGMsIExQUkVDVDMyIHIsIFVJTlQzMiB1RmxhZ3MpCitzdGF0aWMgQk9PTDMyIFVJVE9PTFM5NV9ERkNfQnV0dG9uUmFkaW8oSERDMzIgZGMsIExQUkVDVDMyIHIsIFVJTlQzMiB1RmxhZ3MpCiB7CiAgICAgUkVDVDMyIG15cjsKICAgICBpbnQgaTsKQEAgLTkyNCwyNCArOTExLDI0IEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqICAgICAgICAgICBVSVRPT0xTX0RyYXdGcmFtZUJ1dHRvbgogICovCi1zdGF0aWMgQk9PTDMyIFVJVE9PTFNfRHJhd0ZyYW1lQnV0dG9uKEhEQzMyIGhkYywgTFBSRUNUMzIgcmMsIFVJTlQzMiB1U3RhdGUpCitzdGF0aWMgQk9PTDMyIFVJVE9PTFM5NV9EcmF3RnJhbWVCdXR0b24oSERDMzIgaGRjLCBMUFJFQ1QzMiByYywgVUlOVDMyIHVTdGF0ZSkKIHsKICAgICBzd2l0Y2godVN0YXRlICYgMHhmZikKICAgICB7CiAgICAgY2FzZSBERkNTX0JVVFRPTlBVU0g6Ci0gICAgICAgIHJldHVybiBVSVRPT0xTX0RGQ19CdXR0b25QdXNoKGhkYywgcmMsIHVTdGF0ZSk7CisgICAgICAgIHJldHVybiBVSVRPT0xTOTVfREZDX0J1dHRvblB1c2goaGRjLCByYywgdVN0YXRlKTsKIAogICAgIGNhc2UgREZDU19CVVRUT05DSEVDSzoKICAgICBjYXNlIERGQ1NfQlVUVE9OM1NUQVRFOgotICAgICAgICByZXR1cm4gVUlUT09MU19ERkNfQnV0dG9uQ2hlY2soaGRjLCByYywgdVN0YXRlKTsKKyAgICAgICAgcmV0dXJuIFVJVE9PTFM5NV9ERkNfQnV0dG9uQ2hlY2soaGRjLCByYywgdVN0YXRlKTsKIAogICAgIGNhc2UgREZDU19CVVRUT05SQURJT0lNQUdFOgogICAgIGNhc2UgREZDU19CVVRUT05SQURJT01BU0s6CiAgICAgY2FzZSBERkNTX0JVVFRPTlJBRElPOgotICAgICAgICByZXR1cm4gVUlUT09MU19ERkNfQnV0dG9uUmFkaW8oaGRjLCByYywgdVN0YXRlKTsKKyAgICAgICAgcmV0dXJuIFVJVE9PTFM5NV9ERkNfQnV0dG9uUmFkaW8oaGRjLCByYywgdVN0YXRlKTsKIAogICAgIGRlZmF1bHQ6Ci0gICAgICAgIFdBUk4odWl0b29scywgIkludmFsaWQgYnV0dG9uIHN0YXRlOiAweCUwNHhcbiIsIHVTdGF0ZSk7CisgICAgICAgIFdBUk4odWl0b29scywgIkludmFsaWQgYnV0dG9uIHN0YXRlPTB4JTA0eFxuIiwgdVN0YXRlKTsKICAgICB9CiAKICAgICByZXR1cm4gRkFMU0U7CkBAIC05NTMsNyArOTQwLDcgQEAKICAqIERyYXcgY2FwdGlvbiBidXR0b25zICh3aW45NSksIGNvbWluZyBmcm9tIERyYXdGcmFtZUNvbnRyb2woKQogICovCiAKLXN0YXRpYyBCT09MMzIgVUlUT09MU19EcmF3RnJhbWVDYXB0aW9uKEhEQzMyIGRjLCBMUFJFQ1QzMiByLCBVSU5UMzIgdUZsYWdzKQorc3RhdGljIEJPT0wzMiBVSVRPT0xTOTVfRHJhd0ZyYW1lQ2FwdGlvbihIREMzMiBkYywgTFBSRUNUMzIgciwgVUlOVDMyIHVGbGFncykKIHsKICAgICBQT0lOVDMyIExpbmUxWzEwXTsKICAgICBQT0lOVDMyIExpbmUyWzEwXTsKQEAgLTk3NCw3ICs5NjEsNyBAQAogICAgIENPTE9SUkVGIGNscnNhdmU7CiAgICAgU0laRTMyIHNpemU7CiAKLSAgICBVSVRPT0xTX0RGQ19CdXR0b25QdXNoKGRjLCByLCB1RmxhZ3MgJiAweGZmMDApOworICAgIFVJVE9PTFM5NV9ERkNfQnV0dG9uUHVzaChkYywgciwgdUZsYWdzICYgMHhmZjAwKTsKIAogICAgIHN3aXRjaCh1RmxhZ3MgJiAweGZmKQogICAgIHsKQEAgLTEwNzcsNyArMTA2NCw3IEBACiAgICAgICAgIGJyZWFrOwogCiAgICAgZGVmYXVsdDoKLSAgICAgICAgV0FSTih1aXRvb2xzLCAiSW52YWxpZCBjYXB0aW9uOyBmbGFnczogMHglMDR4XG4iLCB1RmxhZ3MpOworICAgICAgICBXQVJOKHVpdG9vbHMsICJJbnZhbGlkIGNhcHRpb247IGZsYWdzPTB4JTA0eFxuIiwgdUZsYWdzKTsKICAgICAgICAgcmV0dXJuIEZBTFNFOwogICAgIH0KIApAQCAtMTEyNiw3ICsxMTEzLDcgQEAKICAqCiAgKiBEcmF3IGEgc2Nyb2xsLWJhciBjb250cm9sIGNvbWluZyBmcm9tIERyYXdGcmFtZUNvbnRyb2woKQogICovCi1zdGF0aWMgQk9PTDMyIFVJVE9PTFNfRHJhd0ZyYW1lU2Nyb2xsKEhEQzMyIGRjLCBMUFJFQ1QzMiByLCBVSU5UMzIgdUZsYWdzKQorc3RhdGljIEJPT0wzMiBVSVRPT0xTOTVfRHJhd0ZyYW1lU2Nyb2xsKEhEQzMyIGRjLCBMUFJFQ1QzMiByLCBVSU5UMzIgdUZsYWdzKQogewogICAgIFBPSU5UMzIgTGluZVs0XTsKICAgICBSRUNUMzIgbXlyOwpAQCAtMTE3NCw3ICsxMTYxLDcgQEAKIAogICAgIGNhc2UgREZDU19TQ1JPTExTSVpFR1JJUDoKICAgICAgICAgLyogVGhpcyBvbmUgYnJlYWtzIHRoZSBmbG93Li4uICovCi0gICAgICAgIFVJVE9PTFNfRHJhd1JlY3RFZGdlKGRjLCByLCBFREdFX0JVTVAsIEJGX01JRERMRSB8ICgodUZsYWdzJihERkNTX01PTk98REZDU19GTEFUKSkgPyBCRl9NT05PIDogMCkpOworICAgICAgICBVSVRPT0xTOTVfRHJhd1JlY3RFZGdlKGRjLCByLCBFREdFX0JVTVAsIEJGX01JRERMRSB8ICgodUZsYWdzJihERkNTX01PTk98REZDU19GTEFUKSkgPyBCRl9NT05PIDogMCkpOwogICAgICAgICBocHNhdmUgPSAoSFBFTjMyKVNlbGVjdE9iamVjdDMyKGRjLCBHZXRTdG9ja09iamVjdDMyKE5VTExfUEVOKSk7CiAgICAgICAgIGhic2F2ZSA9IChIQlJVU0gzMilTZWxlY3RPYmplY3QzMihkYywgR2V0U3RvY2tPYmplY3QzMihOVUxMX0JSVVNIKSk7CiAgICAgICAgIGlmKHVGbGFncyAmIChERkNTX01PTk98REZDU19GTEFUKSkKQEAgLTEyNDcsMTIgKzEyMzQsMTIgQEAKICAgICAgICAgcmV0dXJuIFRSVUU7CiAKICAgICBkZWZhdWx0OgotICAgICAgICBXQVJOKHVpdG9vbHMsICJJbnZhbGlkIHNjcm9sbDsgZmxhZ3M6IDB4JTA0eFxuIiwgdUZsYWdzKTsKKyAgICAgICAgV0FSTih1aXRvb2xzLCAiSW52YWxpZCBzY3JvbGw7IGZsYWdzPTB4JTA0eFxuIiwgdUZsYWdzKTsKICAgICAgICAgcmV0dXJuIEZBTFNFOwogICAgIH0KIAogICAgIC8qIEhlcmUgZG8gdGhlIHJlYWwgc2Nyb2xsLWJhciBjb250cm9scyBlbmQgdXAgKi8KLSAgICBVSVRPT0xTX0RGQ19CdXR0b25QdXNoKGRjLCByLCB1RmxhZ3MgJiAweGZmMDApOworICAgIFVJVE9PTFM5NV9ERkNfQnV0dG9uUHVzaChkYywgciwgdUZsYWdzICYgMHhmZjAwKTsKIAogICAgIGlmKHVGbGFncyAmIERGQ1NfSU5BQ1RJVkUpCiAgICAgewpAQCAtMTI4NCw3ICsxMjcxLDcgQEAKICAqCiAgKiBEcmF3IGEgbWVudSBjb250cm9sIGNvbWluZyBmcm9tIERyYXdGcmFtZUNvbnRyb2woKQogICovCi1zdGF0aWMgQk9PTDMyIFVJVE9PTFNfRHJhd0ZyYW1lTWVudShIREMzMiBkYywgTFBSRUNUMzIgciwgVUlOVDMyIHVGbGFncykKK3N0YXRpYyBCT09MMzIgVUlUT09MUzk1X0RyYXdGcmFtZU1lbnUoSERDMzIgZGMsIExQUkVDVDMyIHIsIFVJTlQzMiB1RmxhZ3MpCiB7CiAgICAgUE9JTlQzMiBQb2ludHNbNl07CiAgICAgUkVDVDMyIG15cjsKQEAgLTEzNDksNyArMTMzNiw3IEBACiAgICAgICAgIGJyZWFrOwogCiAgICAgZGVmYXVsdDoKLSAgICAgICAgV0FSTih1aXRvb2xzLCAiSW52YWxpZCBtZW51OyBmbGFnczogMHglMDR4XG4iLCB1RmxhZ3MpOworICAgICAgICBXQVJOKHVpdG9vbHMsICJJbnZhbGlkIG1lbnU7IGZsYWdzPTB4JTA0eFxuIiwgdUZsYWdzKTsKICAgICAgICAgcmV0dmFsID0gRkFMU0U7CiAgICAgICAgIGJyZWFrOwogICAgIH0KQEAgLTEzODksMTYgKzEzNzYsMTcgQEAKICAgICBzd2l0Y2godVR5cGUpCiAgICAgewogICAgIGNhc2UgREZDX0JVVFRPTjoKLSAgICAgIHJldHVybiBVSVRPT0xTX0RyYXdGcmFtZUJ1dHRvbihoZGMsIHJjLCB1U3RhdGUpOworICAgICAgcmV0dXJuIFVJVE9PTFM5NV9EcmF3RnJhbWVCdXR0b24oaGRjLCByYywgdVN0YXRlKTsKICAgICBjYXNlIERGQ19DQVBUSU9OOgotICAgICAgcmV0dXJuIFVJVE9PTFNfRHJhd0ZyYW1lQ2FwdGlvbihoZGMsIHJjLCB1U3RhdGUpOworICAgICAgcmV0dXJuIFVJVE9PTFM5NV9EcmF3RnJhbWVDYXB0aW9uKGhkYywgcmMsIHVTdGF0ZSk7CiAgICAgY2FzZSBERkNfTUVOVToKLSAgICAgIHJldHVybiBVSVRPT0xTX0RyYXdGcmFtZU1lbnUoaGRjLCByYywgdVN0YXRlKTsKKyAgICAgIHJldHVybiBVSVRPT0xTOTVfRHJhd0ZyYW1lTWVudShoZGMsIHJjLCB1U3RhdGUpOwogICAgIGNhc2UgREZDX1NDUk9MTDoKLSAgICAgIHJldHVybiBVSVRPT0xTX0RyYXdGcmFtZVNjcm9sbChoZGMsIHJjLCB1U3RhdGUpOworICAgICAgcmV0dXJuIFVJVE9PTFM5NV9EcmF3RnJhbWVTY3JvbGwoaGRjLCByYywgdVN0YXRlKTsKICAgICBkZWZhdWx0OgogICAgICAgV0FSTih1aXRvb2xzLCAiKCV4LCVwLCVkLCV4KSwgYmFkIHR5cGUhXG4iLAotCQkgIGhkYyxyYyx1VHlwZSx1U3RhdGUgKTsKKwkgICBoZGMscmMsdVR5cGUsdVN0YXRlICk7CiAgICAgfQogICAgIHJldHVybiBGQUxTRTsKIH0KKwpkaWZmIC0tZ2l0IGEvY29udHJvbHMvd2lkZ2V0cy5jIGIvY29udHJvbHMvd2lkZ2V0cy5jCmluZGV4IGFjYjk1NjAuLmI4ZmNmYzQgMTAwNjQ0Ci0tLSBhL2NvbnRyb2xzL3dpZGdldHMuYworKysgYi9jb250cm9scy93aWRnZXRzLmMKQEAgLTk0LDcgKzk0LDcgQEAKICAgICAgICAgLyogSnVzdCB0byBtYWtlIHN1cmUgdGhlIHN0cmluZyBpcyA+IDB4MTAwMDAgKi8KICAgICAgICAgc3RyY3B5KCBuYW1lLCAoY2hhciAqKWNscy0+bHBzekNsYXNzTmFtZSApOwogICAgICAgICBjbHMtPmxwc3pDbGFzc05hbWUgPSBuYW1lOwotICAgICAgICBjbHMtPmhDdXJzb3IgPSBMb2FkQ3Vyc29yMTYoIDAsIGNscy0+aEN1cnNvciApOworICAgICAgICBjbHMtPmhDdXJzb3IgPSBMb2FkQ3Vyc29yMzJBKCAwLCAoTFBDU1RSKWNscy0+aEN1cnNvciApOwogICAgICAgICBpZiAoIShiaWNBdG9tVGFibGVbaV0gPSBSZWdpc3RlckNsYXNzMzJBKCBjbHMgKSkpIHJldHVybiBGQUxTRTsKICAgICB9CiAKZGlmZiAtLWdpdCBhL2RlYnVnZ2VyL01ha2VmaWxlLmluIGIvZGVidWdnZXIvTWFrZWZpbGUuaW4KaW5kZXggOWIwMTQxNC4uMzUwYzIxOSAxMDA2NDQKLS0tIGEvZGVidWdnZXIvTWFrZWZpbGUuaW4KKysrIGIvZGVidWdnZXIvTWFrZWZpbGUuaW4KQEAgLTEsNCArMSw0IEBACi1ERUZTICAgICAgPSAtRF9fV0lORV9fCitERUZTICAgICAgPSAtRF9fV0lORV9fIC1ETElCRElSPVwiJChsaWJkaXIpXCIKIFRPUFNSQ0RJUiA9IEB0b3Bfc3JjZGlyQAogVE9QT0JKRElSID0gLi4KIFNSQ0RJUiAgICA9IEBzcmNkaXJACmRpZmYgLS1naXQgYS9kZWJ1Z2dlci9icmVhay5jIGIvZGVidWdnZXIvYnJlYWsuYwppbmRleCBiMzMyYWRlLi5mNTg0YmE5IDEwMDY0NAotLS0gYS9kZWJ1Z2dlci9icmVhay5jCisrKyBiL2RlYnVnZ2VyL2JyZWFrLmMKQEAgLTM0OCwxNSArMzQ4LDI0IEBACiAgICAgICAgIGlmIChwTW9kdWxlLT5mbGFncyAmIE5FX0ZGTEFHU19XSU4zMikgIC8qIFBFIG1vZHVsZSAqLwogICAgICAgICB7CiAgICAgICAgICAgICBQRV9NT0RSRUYgKnBlbSA9IFBST0NFU1NfQ3VycmVudCgpLT5tb2RyZWZfbGlzdDsKLSAgICAgICAgICAgIHdoaWxlIChwZW0pCisgICAgICAgICAgICBpZiAoIXBlbSkKICAgICAgICAgICAgIHsKLQkJaWYgKHBlbS0+bW9kdWxlID09IHBNb2R1bGUtPm1vZHVsZTMyKSBicmVhazsKLQkJcGVtID0gcGVtLT5uZXh0OworICAgICAgICAgICAgICAgIGFkZHIuc2VnID0gMDsKKyAgICAgICAgICAgICAgICBhZGRyLm9mZiA9IChEV09SRClSVkFfUFRSKCBwTW9kdWxlLT5tb2R1bGUzMiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPcHRpb25hbEhlYWRlci5BZGRyZXNzT2ZFbnRyeVBvaW50KTsKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmICghcGVtKSBjb250aW51ZTsKLSAgICAgICAgICAgIGFkZHIuc2VnID0gMDsKLSAgICAgICAgICAgIGFkZHIub2ZmID0gKERXT1JEKVJWQV9QVFIoIHBlbS0+bW9kdWxlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT3B0aW9uYWxIZWFkZXIuQWRkcmVzc09mRW50cnlQb2ludCApOworICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHdoaWxlIChwZW0pCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgIGlmIChwZW0tPm1vZHVsZSA9PSBwTW9kdWxlLT5tb2R1bGUzMikgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgcGVtID0gcGVtLT5uZXh0OworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpZiAoIXBlbSkgY29udGludWU7CisgICAgICAgICAgICAgICAgYWRkci5zZWcgPSAwOworICAgICAgICAgICAgICAgIGFkZHIub2ZmID0gKERXT1JEKVJWQV9QVFIoIHBlbS0+bW9kdWxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9wdGlvbmFsSGVhZGVyLkFkZHJlc3NPZkVudHJ5UG9pbnQpOworICAgICAgICAgICAgfQogICAgICAgICAgICAgZnByaW50Ziggc3RkZXJyLCAiV2luMzIgdGFzayAnJXMnOiAiLCBlbnRyeS5zek1vZHVsZSApOwogICAgICAgICAgICAgREVCVUdfQWRkQnJlYWtwb2ludCggJmFkZHIgKTsKICAgICAgICAgfQpkaWZmIC0tZ2l0IGEvZGVidWdnZXIvZGJnLnkgYi9kZWJ1Z2dlci9kYmcueQppbmRleCA1ZmE0YjViLi43YTU0ZTdkIDEwMDY0NAotLS0gYS9kZWJ1Z2dlci9kYmcueQorKysgYi9kZWJ1Z2dlci9kYmcueQpAQCAtOCw2ICs4LDcgQEAKIAogI2luY2x1ZGUgPHN0ZGlvLmg+CiAjaW5jbHVkZSA8c2lnbmFsLmg+CisjaW5jbHVkZSA8c3lzL3N0YXQuaD4KICNpbmNsdWRlIDx1bmlzdGQuaD4KICNpbmNsdWRlICJjbGFzcy5oIgogI2luY2x1ZGUgIm1vZHVsZS5oIgpAQCAtNDM2LDcgKzQzNywxMiBAQAogCWZwcmludGYoc3RkZXJyLCJMb2FkaW5nIHN5bWJvbHM6ICIpOwogCWlmKCBERUJVR19SZWFkRXhlY3V0YWJsZURiZ0luZm8oKSA9PSBGQUxTRSApCiAgICAgICAgIHsKLQkgICAgUFJPRklMRV9HZXRXaW5lSW5pU3RyaW5nKCAid2luZSIsICJTeW1ib2xUYWJsZUZpbGUiLCAid2luZS5zeW0iLAorCSAgICBjaGFyICpzeW1maWxlbmFtZSA9ICJ3aW5lLnN5bSI7CisJICAgIHN0cnVjdCBzdGF0IHN0YXRidWY7CisJICAgIGlmICgtMSA9PSBzdGF0KHN5bWZpbGVuYW1lLCAmc3RhdGJ1ZikgKQorICAgICAgICAgICAgICAgIHN5bWZpbGVuYW1lID0gTElCRElSICJ3aW5lLnN5bSI7CisKKwkgICAgUFJPRklMRV9HZXRXaW5lSW5pU3RyaW5nKCAid2luZSIsICJTeW1ib2xUYWJsZUZpbGUiLCBzeW1maWxlbmFtZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTeW1ib2xUYWJsZUZpbGUsIHNpemVvZihTeW1ib2xUYWJsZUZpbGUpKTsKIAkgICAgREVCVUdfUmVhZFN5bWJvbFRhYmxlKCBTeW1ib2xUYWJsZUZpbGUgKTsKICAgICAgICAgfQpkaWZmIC0tZ2l0IGEvZGVidWdnZXIvc3RhY2suYyBiL2RlYnVnZ2VyL3N0YWNrLmMKaW5kZXggZmU5ZjVjYi4uMzdmNmQ1YSAxMDA2NDQKLS0tIGEvZGVidWdnZXIvc3RhY2suYworKysgYi9kZWJ1Z2dlci9zdGFjay5jCkBAIC0xMTksNiArMTE5LDcgQEAKIAkJCQkJCQlmcmFtZS0+YnAsIFRSVUUgKTsKIAkgICAgZnJhbWVubysrOwogICAgICAgICAgICAgZnByaW50Ziggc3RkZXJyLCAiXG4iICk7CisgICAgICAgICAgICBpZiAoYWRkci5vZmYgPT0gZnJhbWUtPmJwKSBicmVhazsKICAgICAgICAgICAgIGFkZHIub2ZmID0gZnJhbWUtPmJwOwogICAgICAgICB9CiAgICAgfQpkaWZmIC0tZ2l0IGEvZG9jdW1lbnRhdGlvbi9kZWJ1Zy1tc2dzIGIvZG9jdW1lbnRhdGlvbi9kZWJ1Zy1tc2dzCmluZGV4IDA4MTM0NjUuLmRhMDBiN2YgMTAwNjQ0Ci0tLSBhL2RvY3VtZW50YXRpb24vZGVidWctbXNncworKysgYi9kb2N1bWVudGF0aW9uL2RlYnVnLW1zZ3MKQEAgLTEsNSArMSw0IEBACi1Ob3RlOiBUaGUgbmV3IGRlYnVnZ2luZyBpbnRlcmZhY2UgaXMgc3RhcnRpbmcgdG8gdGFrZSBzaGFwZS4KLSAgICAgIEluIGdlbmVyYWwsIEkgdGhpbmsgaXQgY2FuIGJlIGNvbnNpZGVyZWQgdG8gYmUgc3RhYmxlLAorTm90ZTogVGhlIG5ldyBkZWJ1Z2dpbmcgaW50ZXJmYWNlIGNhbiBiZSBjb25zaWRlcmVkIHRvIGJlIHN0YWJsZSwKICAgICAgIHdpdGggdGhlIGV4Y2VwdGlvbiBvZiB0aGUgaW4tbWVtb3J5IG1lc3NhZ2UgY29uc3RydWN0aW9uIGZ1bmN0aW9ucy4KICAgICAgIEhvd2V2ZXIsIHRoZXJlIGlzIHN0aWxsIGEgbG90IG9mIHdvcmsgdG8gYmUgZG9uZSB0byBwb2xpc2gKICAgICAgIHRoaW5ncyB1cCBhbmQgdG8gY29udmVydCB0aGUgcmVtYWluaW5nIGZwcmludGYuIFRvIG1ha2UgbXkgbGlmZSAKQEAgLTgsOSArNywxMyBAQAogICAgICAgUmVhZCB0aGlzIGRvY3VtZW50IGJlZm9yZSB3cml0aW5nIG5ldyBjb2RlLgogICAgICAgQWxzbywgRE8gTk9UIFVTRSBmcHJpbnRmIChvciBwcmludGYpIHRvIG91dHB1dCB0aGluZ3MuIEFsbCB0aGVzZQogICAgICAgd2lsbCBoYXZlIHRvIGJlIHRyYW5zbGF0ZWQgdG8gdGhlIG5ldyBpbnRlcmZhY2UgYW5kIHRoZXJlIGFyZSBhbHJlYWR5Ci0gICAgICBhYm91dCAzMDAwIG9mIHRoZW0hIEFsc28sIGluc3RlYWQgb2Ygd3JpdGluZyBGSVhNRXMgaW4gdGhlIHNvdXJjZSwKLSAgICAgIG91dHB1dCBhIEZJWE1FIG1lc3NhZ2UgaWYgeW91IGNhbi4gQnV0IHJlYWQgb24uLi4KLTE0IE1hciAxOTk4LCBEaW1pdHJpZSBPLiBQYXVuIDxkaW1pQGNzLnRvcm9udG8uZWR1PgorICAgICAgYWJvdXQgMTAwMCBvZiB0aGVtISBBbHNvLCBpbnN0ZWFkIG9mIHdyaXRpbmcgRklYTUVzIGluIHRoZSBzb3VyY2UsCisgICAgICBvdXRwdXQgYSBGSVhNRSBtZXNzYWdlIGlmIHlvdSBjYW4uIAorCisgICAgICBJTVBPUlRBTlQ6IGF0IHRoZSBlbmQgb2YgdGhlIGRvY3VtZW50LCB0aGVyZSBpcyBhICJTdHlsZSBHdWlkZSIKKyAgICAgIGZvciBkZWJ1Z2dpbmcgbWVzc2FnZXMuIFBsZWFzZSByZWFkIGl0LgorCisyOCBNYXIgMTk5OCwgRGltaXRyaWUgTy4gUGF1biA8ZGltaUBjcy50b3JvbnRvLmVkdT4KIAogCiBEZWJ1Z2dpbmcgY2xhc3NlcwpAQCAtMjUsOCArMjgsOSBAQAogCiBFUlIgICAtLSBNZXNzYWdlcyBpbiB0aGlzIGNsYXNzIHJlbGF0ZSB0byBzZXJpb3VzIGVycm9ycyBpbiBXaW5lLgogICAgICAgICAgVGhpcyBzb3J0IG9mIG1lc3NhZ2VzIGFyZSBjbG9zZSB0byBhc3NlcnRzIC0tIHRoYXQgaXMsCi0gICAgICAgICB5b3Ugc2hvdWxkIG91dHB1dCBhIGVycm9yIG1lc3NhZ2Ugd2hlbiB0aGUgY29kZSBkZXRlY3RzIGEKLSAgICAgICAgIGNvbmRpdGlvbiB3aGljaCBzaG91bGQgbm90IGhhcHBlbi4KKyAgICAgICAgIHlvdSBzaG91bGQgb3V0cHV0IGFuIGVycm9yIG1lc3NhZ2Ugd2hlbiB0aGUgY29kZSBkZXRlY3RzIGEKKyAgICAgICAgIGNvbmRpdGlvbiB3aGljaCBzaG91bGQgbm90IGhhcHBlbi4gSW4gb3RoZXIgd29yZHMsIGltcG9ydGFudAorICAgICAgICAgdGhpbmdzIHRoYXQgYXJlIG5vdCB3YXJuaW5ncyAoc2VlIGJlbG93KSwgYXJlIGVycm9ycy4KIAkgRXhhbXBsZXM6IHVuZXhwZWN0ZWQgY2hhbmdlIGluIGludGVybmFsIHN0YXRlLCBldGMuCiAKIFdBUk4gIC0tIFRoZXNlIGFyZSB3YXJuaW5nIG1lc3NhZ2VzLiBZb3Ugc2hvdWxkIHJlcG9ydCBhIHdhcm5pbmcgd2hlbgpAQCAtNjcsOCArNzEsOCBAQAogRGVidWdnaW5nIGNoYW5uZWxzCiAtLS0tLS0tLS0tLS0tLS0tLS0KIAotQWxzbywgd2UgZGl2aWRlIHRoZSBkZWJ1Z2dpbmcgbWVzc2FnZXMgcGVyIGNvbXBvbmVudC4gRWFjaCBjb21wb25lbnQKLWlzIGFzc2lnbmVkIGEgZGVidWdnaW5nIGNoYW5uZWwuIFRoZSBpZGVudGlmaWVyIG9mIHRoZQorQWxzbywgd2UgZGl2aWRlIHRoZSBkZWJ1Z2dpbmcgbWVzc2FnZXMgb24gYSBjb21wb25lbnQgYmFzaXMuIEVhY2gKK2NvbXBvbmVudCBpcyBhc3NpZ25lZCBhIGRlYnVnZ2luZyBjaGFubmVsLiBUaGUgaWRlbnRpZmllciBvZiB0aGUKIGNoYW5uZWwgbXVzdCBiZSBhIHZhbGlkIEMgaWRlbnRpZmllciBidXQgbm90ZSB0aGF0IGl0IG1heSBhbHNvIGJlIGEKIHJlc2VydmUgd29yZCBsaWtlIGludCBvciBzdGF0aWMuCiAKQEAgLTgwLDcgKzg0LDcgQEAKIE5vdGU6IGZvciB0aG9zZSB3aG8ga25vdyB0aGUgb2xkIGludGVyZmFjZSwgdGhlIGNoYW5uZWwvdHlwZSBpcwogICAgICAgd2hhdCBmb2xsb3dlZCB0aGUgXyBpbiB0aGUgZHByaW50Zl94eHggc3RhdGVtZW50cy4KICAgICAgIEZvciBleGFtcGxlLCB0byBvdXRwdXQgYSBtZXNzYWdlIG9uIHRoZSBkZWJ1Z2dpbmcgY2hhbm5lbAotICAgICAgcmVnIGluIHRoZSBvbGQgaW50ZXJmYWNlIHlvdSB3b3VsZCBoYXZlIHRvIHdyaXRlOgorICAgICAgcmVnIGluIHRoZSBvbGQgaW50ZXJmYWNlIHlvdSB3b3VsZCBoYWQgdG8gd3JpdGU6CiAKICAgICAgIGRwcmludGZfcmVnKHN0ZGRlYiwgIkNvdWxkIG5vdCBhY2Nlc3Mga2V5IVxuIik7CiAKQEAgLTg4LDE1ICs5MiwxMiBAQAogICAgICAgSG93ZXZlciwgd2UgYWRkIGFuIG9ydGhvZ29uYWwgcGllY2Ugb2YgaW5mb3JtYXRpb24gdG8gdGhlCiAgICAgICBtZXNzYWdlOiBpdHMgY2xhc3MuIFRoaXMgaXMgdmVyeSBpbXBvcnRhbnQgYXMgaXQgd2lsbCBhbGxvdwogICAgICAgdXMgdG8gc2VsZWN0aXZlbHkgdHVybiBvbiBvciBvZmYgY2VydGFpbiBtZXNzYWdlcyBiYXNlZCBvbiB0aGUKLSAgICAgIHR5cGUgb2YgaW5mb3JtYXRpb24gdGhleSByZXBvcnQuIEZvciB0aGlzIHJlYXNvbiBpdCBpcyBWRVJZCi0gICAgICBpbXBvcnRhbnQgdG8gY2hvb3NlIHRoZSByaWdodCBjbGFzcyBmb3IgdGhlIG1lc3NhZ2UuIAorICAgICAgdHlwZSBvZiBpbmZvcm1hdGlvbiB0aGV5IHJlcG9ydC4gRm9yIHRoaXMgcmVhc29uIGl0IGlzIGVzc2VudGlhbAorICAgICAgdG8gY2hvb3NlIHRoZSByaWdodCBjbGFzcyBmb3IgdGhlIG1lc3NhZ2UuIAogICAgICAgQW55aG93LCBzdXBwb3NlIHdlIGZpZ3VyZWQgdGhhdCB0aGlzIG1lc3NhZ2Ugc2hvdWxkIGJlbG9uZwogICAgICAgaW4gdGhlIFdBUk4gY2xhc3MsIHNvIGluIHRoZSBuZXcgaW50ZXJmYWNlLCB5b3Ugd3JpdGU6CiAKLSAgICAgIFdBUk4ocmVnLCAiQ291bGQgbm90IGFjY2VzcyBrZXkhIik7Ci0KLSAgICAgIE5vdGljZSB0aGUgXG4gaXMgbm8gbG9uZ2VyIHJlcXVpcmVkLgotCisgICAgICBXQVJOKHJlZywgIkNvdWxkIG5vdCBhY2Nlc3Mga2V5IVxuIik7CiAtLS0KIAogSG93IHRvIHVzZSBpdApAQCAtMTE3LDggKzExOCw3IEBACiAKIC4uLgogCi0gIFRSQUNFKGNydGRsbCwgIkNSVERMTF9zZXRidWYoZmlsZSAlcCBidWYgJXApIiwKLQkgICAgICAgZmlsZSwgYnVmKTsKKyAgVFJBQ0UoY3J0ZGxsLCAiQ1JURExMX3NldGJ1ZihmaWxlICVwIGJ1ZiAlcCkiLCBmaWxlLCBidWYpOwogCiAgIFdBUk4oYXNwaSwgIkVycm9yIG9wZW5pbmcgZGV2aWNlIGVycm5vPSVkIiwgc2F2ZV9lcnJvcik7CiAKQEAgLTE0MiwxMCArMTQyLDkgQEAKICAgICAgIGhlIHdpbGwgbW9zdCBsaWtlbHkgbWlzcyB0aG9zZSBiZWNhdXNlIHVzdWFsbHkgdGhlIFRSQUNFIGNsYXNzCiAgICAgICBpcyB0dXJuZWQgb2ZmLiBBIHNpbWlsYXIgYXJndW1lbnQgY2FuIGJlIG1hZGUgaWYgeW91IG1peCBhbnkKICAgICAgIG90aGVyIHR3byBjbGFzc2VzLgotICAgMi4gQWxsIGxpbmVzIGVuZCBieSBkZWZhdWx0IHdpdGggYSBuZXdsaW5lLiBTbyB5b3Ugc2hvdWxkIG5vdAotICAgICAgYWRkIG9uZSBtb3JlLiAgSWYgeW91IGNhbiBOT1Qgb3V0cHV0IGV2ZXJ5dGhpbmcgdGhhdCB5b3Ugd2FudCBpbiAKLSAgICAgIHRoZSBsaW5lIHdpdGggb25seSBvbmUgc3RhdGVtZW50LCB0aGVuIHlvdSBuZWVkIHRvIGJ1aWxkIHRoZSBzdHJpbmcKLSAgICAgIGluIG1lbW9yeS4KKyAgIDIuIEFsbCBsaW5lcyBzaG91bGQgZW5kIHdpdGggYSBuZXdsaW5lLklmIHlvdSBjYW4gTk9UIG91dHB1dCAKKyAgICAgIGV2ZXJ5dGhpbmcgdGhhdCB5b3Ugd2FudCBpbiB0aGUgbGluZSB3aXRoIG9ubHkgb25lIHN0YXRlbWVudCwgCisgICAgICB0aGVuIHlvdSBuZWVkIHRvIGJ1aWxkIHRoZSBzdHJpbmcgaW4gbWVtb3J5LgogICAgICAgUGxlYXNlIHJlYWQgdGhlIHNlY3Rpb24gYmVsb3cgIkluLW1lbW9yeSBtZXNzYWdlcyIgb24gdGhlCiAgICAgICBwcmVmZXJyZWQgd2F5IHRvIGRvIGl0LiBQTEVBU0UgVVNFIFRIQVQgSU5URVJGQUNFIFRPIEJVSUxECiAgICAgICBNRVNTQUdFUyBJTiBNRU1PUlkuIFRoZSByZWFzb24gaXMgdGhhdCB3ZSBhcmUgbm90IHN1cmUgdGhhdApAQCAtMTYwLDE5ICsxNTksMTkgQEAKIFRvIHRlc3Qgd2hldGhlciB0aGUgZGVidWdnaW5nIG91dHB1dCBvZiBjbGFzcyB5eXkgb24gY2hhbm5lbCB4eHggaXMKIGVuYWJsZWQsIHVzZToKIAotVFJBQ0lORyAgdG8gdGVzdCBpZiBUUkFDRSBpcyBlbmFibGVkCi1XQVJOSU5HICB0byB0ZXN0IGlmIFdBUk4gaXMgZW5hYmxlZAotRklYTUlORyAgdG8gdGVzdCBpZiBGSVhNRSBpcyBlbmFibGVkCi1FUlJJTkcgICB0byB0ZXN0IGlmIEVSUiBpcyBlbmFibGVkCitUUkFDRV9PTiAgdG8gdGVzdCBpZiBUUkFDRSBpcyBlbmFibGVkCitXQVJOX09OICAgdG8gdGVzdCBpZiBXQVJOIGlzIGVuYWJsZWQKK0ZJWE1FX09OICB0byB0ZXN0IGlmIEZJWE1FIGlzIGVuYWJsZWQKK0VSUl9PTiAgICB0byB0ZXN0IGlmIEVSUiBpcyBlbmFibGVkCiAKIEV4YW1wbGVzOgogCi1pZihUUkFDSU5HKGF0b20pKXsKK2lmKFRSQUNFX09OKGF0b20pKXsKICAgLi4uYmxhaC4uLgogfQogCi1Ob3RlIHRoYXQgeW91IHNob3VsZCBub3JtYWx5IG5lZWQgdG8gdGVzdCBvbmx5IGlmIFRSQUNJTkcuIEF0IHByZXNlbnQsCi1ub25lIG9mIHRoZSBvdGhlciAzIHRlc3RzIChleGNlcHQgZm9yIEVSUklORyB3aGljaCBpcyB1c2VkIG9ubHkgb25jZSEpCitOb3RlIHRoYXQgeW91IHNob3VsZCBub3JtYWxseSBuZWVkIHRvIHRlc3Qgb25seSBpZiBUUkFDRV9PTi4gQXQgcHJlc2VudCwKK25vbmUgb2YgdGhlIG90aGVyIDMgdGVzdHMgKGV4Y2VwdCBmb3IgRVJSX09OIHdoaWNoIGlzIHVzZWQgb25seSBvbmNlISkKIGFyZSB1c2VkIGluIFdpbmUuCiAKIEluLW1lbW9yeSBtZXNzYWdlcwpAQCAtMjk5LDcgKzI5OCw3IEBACiAKIFRodXMsIHRvIHVzZSBpdCwgZG8gc29tZXRoaW5nIG9uIHRoZSBmb2xsb3dpbmcgbGluZXM6CiAKLSNpbmNsdWRlICJkZWJ1Z3N0ci5oIgorI2luY2x1ZGUgImRlYnVnLmgiCiAKIC4uLgogCkBAIC0zNTEsNiArMzUwLDEwOCBAQAogICAgLSB0aGUgZml4bWUgYW5kIGVyciBjbGFzc2VzIGFyZSBlbmFibGVkIGJ5IGRlZmF1bHQKICAgIC0gdGhlIHRyYWNlIGFuZCB3YXJuICBjbGFzc2VzIGFyZSBkaXNhYmxlZCBieSBkZWZhdWx0CiAgICAtIHRoZXJlIGlzIG5vIHdheSB0byBjb21waWxlIG91dCB0aGUgbWVzc2FnZXMuIEFsbCBhcmUgCi0gICAgIHJ1bnRpbWUgY29uZmlndXJhYmxlLiBUaGlzIHdpbGwgY29tZSBuZXh0IHJlbGVhc2UuCisgICAgIHJ1bnRpbWUgY29uZmlndXJhYmxlLiBUaGlzIHdpbGwgKGhvcGVmdWxseSkgY29tZSBuZXh0IAorICAgICByZWxlYXNlLgogCiAKK0EgRmV3IE5vdGVzIG9uIFN0eWxlCistLS0tLS0tLS0tLS0tLS0tLS0tLQorCitUaGlzIG5ldyBzY2hlbWUgbWFrZXMgY2VydGFpbiB0aGluZ3MgbW9yZSBjb25zaXN0ZW50IGJ1dCB0aGVyZSBpcyBzdGlsbAorcm9vbSBmb3IgaW1wcm92ZW1lbnQgYnkgdXNpbmcgYSBjb21tb24gc3R5bGUgb2YgZGVidWcgbWVzc2FnZXMuIEJlZm9yZQorSSBjb250aW51ZSwgbGV0IG1lIG5vdGUgdGhhdCB0aGUgb3V0cHV0IGZvcm1hdCBpcyB0aGUgZm9sbG93aW5nOgorCit5eXk6eHh4OmZmZiA8bWVzc2FnZT4KKword2hlcmU6IAorICB5eXkgPSB0aGUgY2xhc3MgKGZpeG1lLCBlcnIsIHdhcm4sIHRyYWNlKQorICB4eHggPSB0aGUgY2hhbm5lbCAoYXRvbSwgd2luLCBmb250LCBldGMpCisgIGZmZiA9IHRoZSBmdW5jdGlvbiBuYW1lCit0aGVzZSBmaWVsZHMgYXJlIG91dHB1dCBhdXRvbWF0aWNhbGx5LiBBbGwgeW91IGhhdmUgdG8gcHJvdmlkZSBpcwordGhlIDxtZXNzYWdlPiBwYXJ0LgorCitTbyBoZXJlIGFyZSBzb21lIGlkZWFzOgorCisqIGRvIE5PVCBpbmNsdWRlIHRoZSBuYW1lIG9mIHRoZSBmdW5jdGlvbjogaXQgaXMgaW5jbHVkZWQgYXV0b21hdGljYWxseQorCisqIGlmIHlvdSB3YW50IHRvIG91dHB1dCB0aGUgcGFyYW1ldGVycyBvZiB0aGUgZnVuY3Rpb24sIGRvIGl0IGFzIHRoZSBmaXJzdAordGhpbmcgYW5kIGluY2x1ZGUgdGhlbSBpbiBwYXJlbnRoZXNpcywgbGlrZSB0aGlzOgorCisgICBZWVkoeHh4LCAiKCVkLCVwLGV0YykuLi5cbiIsIHBhcjEsIHBhcjIsIC4uLik7CisKKyogZm9yIHN0dWJzLCB5b3Ugc2hvdWxkIG91dHB1dCBhIEZJWE1FIG1lc3NhZ2UuIEkgc3VnZ2VzdCB0aGlzIHN0eWxlOgorCisgICBGSVhNRSh4eHgsICIoJXgsJWQuLi4pOiBzdHViXG4iLCBwYXIxLCBwYXIyLCAuLi4pOworCisgIFRoYXQgaXMsIHlvdSBvdXRwdXQgdGhlIHBhcmFtZXRlcnMsIHRoZW4gYSA6IGFuZCB0aGVuIGEgc3RyaW5nCitjb250YWluaW5nIHRoZSB3b3JkICJzdHViIi4gSSd2ZSBzZWVuICJlbXB0eSBzdHViIiwgYW5kIG90aGVycywgYnV0IEkKK3RoaW5rIHRoYXQganVzdCAic3R1YiIgc3VmZmljZXMuCisKKyogb3V0cHV0IDEgYW5kIE9OTFkgMSBsaW5lIHBlciBtZXNzYWdlLiBUaGF0IGlzLCB0aGUgZm9ybWF0IHN0cmluZyBzaG91bGQKK2NvbnRhaW4gb25seSAxIFxuIGFuZCBpdCBzaG91bGQgYWx3YXlzIGFwcGVhciBhdCB0aGUgZW5kIG9mIHRoZSBzdHJpbmcuCisodGhlcmUgYXJlIG1hbnkgcmVhc29ucyAgZm9yIHRoaXMgcmVxdWlyZW1lbnQsIG9uZSBvZiB0aGVtIGlzIHRoYXQgZWFjaAorZGVidWcgbWFjcm8gYWRkcyB0aGluZ3MgdG8gdGhlIGJlZ2lubmluZyBvZiB0aGUgbGluZSkKKworKiBpZiB5b3Ugd2FudCB0byBuYW1lIGEgdmFsdWUsIHVzZSA9IGFuZCBOT1QgOi4gVGhhdCBpcywgaW5zdGVhZCBvZgorc2F5aW5nOgorICBGSVhNRSh4eHgsICIoZmQ6ICVkLCBmaWxlOiAlcyk6IHN0dWJcbiIsIGZkLCBuYW1lKTsKK3NheToKKyAgRklYTUUoeHh4LCAiKGZkPSVkLCBmaWxlPSVzKTogc3R1YlxuIiwgZmQsIG5hbWUpOworCit1c2UgOiB0byBzZXBhcmF0ZSBjYXRlZ29yaWVzLgorCisqIHRyeSB0byBhdm9pZCB0aGUgc3R5bGU6CisKKyAgIEZJWE1FKHh4eCwKKyAgICAgICAgICIoZmQ6ICVkLCBmaWxlOiAlcyk6IHN0dWJcbiIsIGZkLCBuYW1lKTsKK2J1dCB1c2U6CisKKyAgRklYTUUoeHh4LCAiKGZkOiAlZCwgZmlsZTogJXMpOiBzdHViXG4iLCBmZCwgbmFtZSk7CisKK1RoZSByZWFzb24gaXMgdGhhdCBpZiB5b3Ugd2FudCB0byBncmVwIGZvciB0aGluZ3MsIHlvdSB3b3VsZCBzZWFyY2ggZm9yCitGSVhNRSBidXQgaW4gdGhlIGZpcnN0IGNhc2UgdGhlcmUgaXMgbm8gYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBhdmFpbGFibGUsCit3aGVyZSBpbiB0aGUgc2Vjb25kIG9uZSwgdGhlcmUgaXMgKGUuZy4gdGhlIHdvcmQgc3R1YikKKworKiBpZiB5b3Ugb3V0cHV0IGEgc3RyaW5nIHMgdGhhdCBtaWdodCBjb250YWluIGNvbnRyb2wgY2hhcmFjdGVycywKKyAgb3IgaWYgcyBtYXkgYmUgbnVsbCwgdXNlIGRlYnVnc3RyX2EgKGZvciBBU0NJSSBzdHJpbmdzLCBvcgorICBkZWJ1Z3N0cl93IGZvciBVbmljb2RlIHN0cmluZ3MpIHRvIGNvbnZlcnQgcyB0byBhIEMgc3RyaW5nLCBsaWtlIAorICB0aGlzOgorCisgICBIQU5ETEUzMiBXSU5BUEkgWW91ckZ1bmMoTFBDU1RSIHMpCit7CisgICBGSVhNRSh4eHgsICIoJXMpOiBzdHViXG4iLCBkZWJ1Z3N0cl9hKHMpKTsKK30KKworKiBpZiB5b3Ugd2FudCB0byBvdXRwdXQgYSByZXNvdXJjZSBpZGVudGlmaWVyLCB1c2UgZGVidWdyZXMgdG8KKyAgY29udmVydCBpdCB0byBhIHN0cmluZyBmaXJzdCwgbGlrZSB0aGlzOgorCisgICBIQU5ETEUzMiBXSU5BUEkgWW91ckZ1bmMoTFBDU1RSIHJlcykKK3sKKyAgIEZJWE1FKHh4eCwgIihyZXM9JXMpOiBzdHViXG4iLCBkZWJ1Z3JlcyhzKSk7Cit9CisKK2lmIHRoZSByZXNvdXJjZSBpZGVudGlmaWVyIGlzIGEgU0VHUFRSLCB1c2UgUFRSX1NFR19UT19MSU4gdG8gZ2V0IGEKK2xpbmVyIHBvaW50ZXIgZmlyc3Q6CisKK0hSU1JDMTYgV0lOQVBJIEZpbmRSZXNvdXJjZTE2KCBITU9EVUxFMTYgaE1vZHVsZSwgU0VHUFRSIG5hbWUsIFNFR1BUUiB0eXBlICkKK3sKK1suLi5dCisgICAgVFJBQ0UocmVzb3VyY2UsICJtb2R1bGU9JTA0eCBuYW1lPSVzIHR5cGU9JXNcbiIsIAorCQkgaE1vZHVsZSwgZGVidWdyZXMoUFRSX1NFR19UT19MSU4obmFtZSkpLCAKKwkJIGRlYnVncmVzKFBUUl9TRUdfVE9fTElOKHR5cGUpKSApOworWy4uLl0KK30KKworKiBmb3IgbWVzc2FnZXMgaW50ZW5kZWQgZm9yIHRoZSB1c2VyIChzcGVjaWZpY2FsbHkgdGhvc2UgdGhhdCByZXBvcnQKKyAgZXJyb3JzIGluIHdpbmUuY29uZiksIHVzZSB0aGUgTVNHIG1hY3JvLiBVc2UgaXQgbGlrZSBhIHByaW50ZjoKKworICAgICAgICAgICBNU0coICJEZWZpbml0aW9uIG9mIGRyaXZlICVkIGlzIGluY29ycmVjdCFcbiIsIGRyaXZlICk7IAorCisgIEhvd2V2ZXIsIG5vdGUgdGhhdCB0aGVyZSBhcmUgX3ZlcnlfIGZldyB2YWxpZCB1c2VzIG9mIHRoaXMgbWFjcm8uCisgIE1vc3QgbWVzc2FnZXMgYXJlIGRlYnVnZ2luZyBtZXNzYWdlcywgc28gY2hhbmNlcyBhcmUgeW91IHdpbGwgbm90CisgIG5lZWQgdG8gdXNlIHRoaXMgbWFjcm8uIEdyZXAgdGhlIHNvdXJjZSB0byBnZXQgYW4gaWRlYSB3aGVyZSBpdAorICBpcyBhcHByb3ByaWF0ZSB0byB1c2UgaXQuCisKKyogZm9yIHN0cnVjdHVyZSBkdW1wcywgdXNlIHRoZSBEVU1QIG1hY3JvLiBVc2UgaXQgbGlrZSBhIHByaW50ZiwKKyAganVzdCBsaWtlIHRoZSBNU0cgbWFjcm8uIFNpbWlsYXJseSwgdGhlcmUgYXJlIG9ubHkgYSBmZXcgdmFsaWQKKyAgdXNlcyBvZiB0aGlzIG1hY3JvLiBHcmVwIHRoZSBzb3VyY2UgdG8gc2VlIHdoZW4gdG8gdXNlIGl0LgpkaWZmIC0tZ2l0IGEvZG9jdW1lbnRhdGlvbi9zdGF0dXMvZGlyZWN0ZHJhdyBiL2RvY3VtZW50YXRpb24vc3RhdHVzL2RpcmVjdGRyYXcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDRiMGUxYQotLS0gL2Rldi9udWxsCisrKyBiL2RvY3VtZW50YXRpb24vc3RhdHVzL2RpcmVjdGRyYXcKQEAgLTAsMCArMSw3NCBAQAorVGhpcyBmaWxlIGNvbnRhaW5zIGluZm9ybWF0aW9uIG9uIHRoZSBjdXJyZW50IGltcGxlbWVudGF0aW9uIG9mIHRoZSBEaXJlY3REcmF3CitBUEkuCisKK1RoZSBEaXJlY3REcmF3IEFQSSBpcyBiZWluZyB1c2VkIGluIGEgbG90IG9mIGN1cnJlbnQgY29tcHV0ZXJnYW1lcy4gSXRzIEFQSQorbGF5ZXIgaXMgcmVwcmVzZW50ZWQgYnkgdGhlIGZ1bmN0aW9ucyBpbiB0aGUgV2luMzIgRExMIGRkcmF3LmRsbCBhbmQgdGhlCitJRGlyZWN0RHJhdyogaW50ZXJmYWNlcyAodGhhdCBjYW4gYmUgY3JlYXRlZCB1c2luZyB0aGUgQVBJIGZ1bmN0aW9ucykuIAorCitXSU5FIGN1cnJlbnRseSBpbXBsZW1lbnRzIGEgdmVyeSBiYXNpYyBzZXQgb2YgdGhlIERpcmVjdERyYXcgZnVuY3Rpb25hbGl0eQoraW4gZ3JhcGhpY3MvZGRyYXcuYy4gVGhpcyBpbXBsZW1lbnRhdGlvbiB1c2VzIHRoZSBYRnJlZTg2LURHQSBleHRlbnNpb24gCit0byBnZXQgdmVyeSBmYXN0IGFjY2VzcyB0byB0aGUgZ3JhcGhpY3MgY2FyZCBmcmFtZWJ1ZmZlciBhbmQgZG91YmxlYnVmZmVyaW5nCitmZWF0dXJlcy4gSXQgaXMgYXMgZmFzdCBhcyB0aGUgTVMgZXF1aXZhbGVudCBmb3IgdGhlIHN0dWZmIHRoYXQgaXMgaW1wbGVtZW50ZWQuCitTZXZlcmFsIGFwcGxpY2F0aW9ucyBhbHJlYWR5IHdvcmssIHNlZSBiZWxvdy4KK1Byb2JsZW1zIG9mIHRoZSBpbXBsZW1lbnRhdGlvbiB1c2luZyBYRnJlZTg2LURHQToKKworCS0gWEZyZWU4NiBjYW5ub3Qgc3dpdGNoIHJlc29sdXRpb24gbm9yIGRlcHRoIG9uIHRoZSBmbHkuCisJICBUaGlzIGlzIGEgcHJvYmxlbSB3aXRoIFggYW5kIHVuYXZvaWRhYmxlLgorCSAgQ3VycmVudCBzb2x1dGlvbiBpcyB0byBwb3AgdXAgYSBNZXNzYWdlQm94IHdpdGggYW4gZXJyb3IgZm9yIAorCSAgbWlzbWF0Y2hlZCBwYXJhbWV0ZXJzIGFuZCBhZHZpY2UgdGhlIHVzZXIgdG8gcmVzdGFydCB0aGUgWCBzZXJ2ZXIKKwkgIHdpdGggdGhlIHNwZWNpZmllZCBkZXB0aCBhbmQvb3Igc2NyZWVuc2l6ZS4KKwktIFRoZSByZXN0IG9mIHRoZSBmdW5jdGlvbmFsaXR5IHRoYXQgaGFzIHRvIGJlIGltcGxlbWVudGVkIHdpbGwgaGF2ZQorCSAgdG8gYmUgZG9uZSBpbiBzb2Z0d2FyZSBhbmQgd2lsbCBiZSB2ZXJ5IHNsb3cuCisJLSBUaGlzIHJlcXVpcmVzIFdJTkUgdG8gYmUgcnVuIGFzIHJvb3QgdXNlciBzbyBYRjg2REdBIGNhbiBtbWFwIHRoZQorCSAgZnJhbWVidWZmZXIgaW50byB0aGUgYWRkcmVzc3NwYWNlIG9mIHRoZSBwcm9jZXNzLgorCS0gQmxvY2tzIGFsbCBvdGhlciBYIHdpbmRvd2VkIGFwcGxpY2F0aW9ucy4KKworVE9ETzoKKwktIEFkZCBtb3JlIGltcGxlbWVudGF0aW9ucyBvZiB0aGUgRGlyZWN0RHJhdyBBUEkuCisJICBQcmltYXJ5IGNhbmRpZGF0ZSBpcyBhIHJhdyBYbGliIGltcGxlbWVudGF0aW9uIChvbmUgd2l0aC9vbmUgd2l0aG91dAorCSAgWFNobSBleHRlbnNpb24pLgorCSAgQW4gYWRkaXRpb25hbCBsYXllciAoYmFzaWNhbGx5IGEgSEFMKSB3aWxsIGJlIHJlcXVpcmVkIHRvIGRlY2lkZSBvbiAKKwkgIGNhc2UtYnktY2FzZSBiYXNpcyB3aGljaCBpbXBsZW1lbnRhdGlvbiB0byB1c2UuCisKK1N0YXR1czoKKyAgIC0gRGlhYmxvIFs2NDB4NDgweDhdOgorICAgICBUaGUgbW92aWVzIHBsYXkgd2l0aCBzcGVlZCBjb21wYXJhYmxlIHRvIHRoZSBNUyBERFJBVyBvbmUuCisgICAgIFRoZSBnYW1lIGRvZXNuJ3Qgd29yaywgaXQgc29tZWhvdyB0cmllcyB0byB3cml0ZSBpbnRvIDIgbGluZXMgX0JFRk9SRV8KKyAgICAgdGhlIHN0YXJ0IG9mIHRoZSBzdXJmYWNlLiBJIGhhdmUgdHJpZWQgdG8gaW52ZXN0aWdhdGUgdGhpcywgYnV0IGl0IGlzCisgICAgIGluIGNvZGUgdGhhdCBpcyBhdXRvbWF0aWNhbGx5IGdlbmVyYXRlZC4KKyAgCisgICAtIFdpbmdDb21tYW5kZXIgNCAvIFdpbjk1IFBhdGNoIFs2NDB4NDgweDhdOgorICAgICBUaGUgaW50cm9tb3ZpZSBwbGF5cywgaW4gOCBiaXQgbW9kZSAodG8gcmVjb25maWd1cmUgd2M0LCBydW4gd2luZQorICAgICAid2M0dy5leGUgLUkiKS4gVGhlIDE2Yml0IG1vZGUgbG9va3MgYnJva2VuIG9uIE15c3RpcXVlLCBidXQgSSB0aGluaworICAgICB0aGlzIGlzIGR1ZSB0byB0aGUgdW51c3VhbCBjb2xvcndlaWdodCAoNTY1IHJnYikgb2YgdGhlIE15c3RpcXVlIGluIDE2Yml0CisgICAgIG1vZGUuIFtTcGVjaWZ5aW5nIGl0IGluIEREUElYRUxGT1JNQVQgZGlkbid0IGhlbHAuXQorCisgICAgIFJlcXVpcmVzIHRvIGJlIHJ1biBpbiA2NDB4NDgweGRlcHRoIG1vZGUgKGRvZXNuJ3Qgc2VlbSB0byBoZWVkCisgICAgIEREU1VSRkFDRURFU0MubFBpdGNoKS4KKyAgICAgWW91IGNhbiBldmVuIGZseSB0aGUgZmlyc3QgbWlzc2lvbiB3aXRoIE1hbmlhYyAoaWdub3JlIHRoZSB3ZWlyZCBzb3VuZHMpLAorICAgICBidXQgaXQgY3Jhc2hlcyBhcyBzb29uIGFzIHlvdSBhcnJpdmUgYXQgQmx1ZSBQb2ludCBTdGF0aW9uLi4uCisgIAorICAgLSBNb25rZXkgSXNsYW5kIDMgWzY0MHg0ODB4OF06CisgICAgIEdvZXMgdG8gdGhlIGVhc3kvaGFyZCBzZWxlY3Rpb24gc2NyZWVuLCB0aGVuIGhhbmdzIGR1ZSB0byBtdWx0aXRocmVhZGVkCisgICAgIHdpbmRvd3MtbWVzc2FnZWhhbmRsaW5nIHByb2JsZW1zLgorICAgCisgICAtIERpc2NXb3JsZCAyIFs2NDB4NDgweDhdOgorICAgICBbQ3Jhc2hlcyB3aXRoICdjbGknIGluIFdJTkUgcmVsZWFzZWQgdmVyc2lvbi4gWWVzLiBQcml2aWxlZ2VkIGluc3RydWN0aW9ucworICAgICAgaW4gMzJiaXQgY29kZS4gV2lsbCB0aGV5IGV2ZXIgbGVhcm4uLi5dCisgICAgIFBsYXlzIHRocm91Z2ggbmVhcmx5IGFsbCBpbnRybyBtb3ZpZXMuIFNvdW5kIGFuZCBhbmltYXRpb24gc2tpcCBhIGxvdCBvZgorICAgICBzdHVmZiAocG9zc2libGUgRGlyZWN0U291bmQgYXN5bmNocm9uaXphdGlvbiBwcm9ibGVtKS4KKyAgIAorICAgLSBYdlQgWzY0MHg0ODB4MTZdOgorICAgICBTaG93cyB0aGUgc3BsYXNoIHNjcmVlbiwgdGhlbiBmYWlscyB3aXRoIG1pc3NpbmcgSm95c3RpY2suIEkgaGF2ZQorICAgICBpbnZlc3RpZ2F0ZWQgYnV0IGZhaWxlZCB0byBmaW5kIGEgcmVhc29uIGZvciB0aGlzLgorICAKKyAgIC0gVG9tYiBSYWlkZXIgMiBEZW1vICh1c2luZyA4IGJpdCByZW5kZXJlcikgWzY0MHg0ODB4OF06CisgICAgIEkgaGF2ZSBwbGF5ZWQgbmVhcmx5IGFsbCBvZiB0aGUgREVNTyBsZXZlbCB1c2luZyBLZXlib2FyZCBDb250cm9scy4KKyAgICAgU291bmQgaXMgYSBiaXQgd2VpcmQuIEtleWJvYXJkL01vdXNlIGhhbmRsaW5nIHRvbyBkdWUgdG8gaW5jb21wbGV0ZQorICAgICBEaXJlY3RJbnB1dC4KKyAgCisgICAtIFdpbmdDb21tYW5kZXIgUHJvcGhlY3kgRGVtbyAodXNpbmcgc29mdHdhcmUgcmVuZGVyZXIpIFs2NDB4NDgweDE2XToKKyAgICAgW0NyYXNoZXMgd2l0aCBhbiBpbnZhbGlkIG9wY29kZSAob3V0YiwgcHJvYmFibHkgdG8gdGVzdCBmb3IgM2RGWCkgaW4gdGhlCisgICAgICBXSU5FIHJlbGVhc2UgdmVyc2lvbi5dCisgICAgIFBsYXlzIHRyYWlsZXIsIGhhbmdzIGluIHNlbGVjdGlvbiBzY3JlZW4gKG5vIGtleWJvYXJkIGlucHV0LCBEaXJlY3RJbnB1dAorICAgICBwcm9ibGVtKS4KZGlmZiAtLWdpdCBhL2RvY3VtZW50YXRpb24vc3RhdHVzL2RpcmVjdHNvdW5kIGIvZG9jdW1lbnRhdGlvbi9zdGF0dXMvZGlyZWN0c291bmQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjRhNzJiZgotLS0gL2Rldi9udWxsCisrKyBiL2RvY3VtZW50YXRpb24vc3RhdHVzL2RpcmVjdHNvdW5kCkBAIC0wLDAgKzEsMzcgQEAKK1RoaXMgZmlsZSBjb250YWlucyBpbmZvcm1hdGlvbiBvbiB0aGUgY3VycmVudCBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgRGlyZWN0U291bmQKK0FQSS4KKworVGhlIERpcmVjdFNvdW5kIEFQSSBjYW4gYmUgZm91bmQgaW4gdGhlIFdpbjMyIERMTCBkc291bmQuZGxsIGFuZCBpbiB0aGUKK0lEaXJlY3RTb3VuZCogaW50ZXJmYWNlcy4gSXQgaXMgaW1wbGVtZW50ZWQgaW4gbXVsdGltZWRpYS9kc291bmQuYy4KKworVGhlIGN1cnJlbnQgaW1wbGVtZW50YXRpb24gdXNlcyB0aGUgTGludXgvRnJlZUJTRCBPcGVuU291bmRTeXN0ZW0uIFNvbWUKK2FwcGxpY2F0aW9ucyBhbHJlYWR5IHdvcmsuIFRoZXJlIGlzIG9ubHkgdGhlIGJhc2ljIHBhcnQgb2YgdGhlIGludGVyZmFjZXMgCitpbXBsZW1lbnRlZCwgYnV0IGl0IGlzIHRoZSBzdHVmZiB1c2VkIGJ5IDkwJSBvZiB0aGUgYXBwbGljYXRpb25zLgorSXQgYWxzbyB1c2VzIG11bHRpdGhyZWFkaW5nLCBzbyBpdCB3aWxsIG9ubHkgd29yayBvbiBzeXN0ZW1zIHdpdGggd29ya2luZworQ3JlYXRlVGhyZWFkLgorCitUZXN0ZWQgd2l0aCBTb3VuZEJsYXN0ZXIoMTYpIGNsb25lIGFuZCBHcmF2aXMgVWx0cmFTb3VuZCBDbGFzc2ljLgorCitUT0RPOgorCS0gQWRkIHN1cHBvcnQgZm9yIG90aGVyIGF1ZGlvc3lzdGVtcy4KKwkJKyBTdW4gQXVkaW8uIChTb2xhcmlzIGFuZCBwcm9iYWJseSB0aGUgKkJTRHMgZXhjZXB0IEZyZWVCU0QuKQorCQkrIHJlbW90ZSBhdWRpbyBzdXBwb3J0IChObyBjbHVlIGFzIHRvIHdoYXQgc3lzdGVtcyB0aGVyZSBhcmUuCisJCSAgVXNlIHNvbWUgYXVkaW8geGV4dGVuc2lvbnM/KQorCS0gQWRkIHN1cHBvcnQgZm9yIG1peGluZyBvZiBkaWZmZXJlbnQgZnJlcXVlbmN5IGFuZCBwYW5uaW5nLgorCS0gRml4IGFsbCB0aGUgbXVsdGl0aHJlYWQgcGVuZGluZyByYWNlIGNvbmRpdGlvbnMgYW5kIHRoZSBsaWtlLgorCS0gU2hhcmUgZmlsZWRlc2NyaXB0b3JzIGFuZCBvdGhlciBzdHVmZiB3aXRoIG1jaXdhdmUvd2F2ZW91dGRldmljZSBjb2RlLgorCisKK0dhbWVzdGF0dXM6CisJLSBXaW5nIENvbW1hbmRlciA0L1c5NToKKwkgIFRoZSBpbnRyb21vdmllIHBsYXlzIHdpdGhvdXQgcHJvYmxlbXMuIE5lYXJseSBsaXBzeW5jaHJvbi4KKwktIERpc2NXb3JsZCAyCisJICBUaGUgc291bmQgd29ya3MsIGJ1dCBub3RpY2VhYmxlIGNodW5rcyBhcmUgbGVmdCBvdXQgKGZyb20gdGhlIHNvdW5kCisJICBhbmQgdGhlIGFuaW1hdGlvbikuIERvbid0IGtub3cgd2h5IHlldC4KKwktIERpYWJsbzoKKwkgIFNvdW5kIHdvcmtzLCBidXQgc2xvd3MgZG93biB0aGUgbW92aWVwbGF5ZXIuIEluIHRoZSAoaGFja2VkIHZlcnNpb24pCisJICBnYW1lIHRoZSBzb3VuZCBpcyBwb3NpdGl2ZWx5IHdlaXJkLgorCS0gTW9ua2V5IElzbGFuZCAzOgorCSAgVGhlIGJhY2tncm91bmQgc291bmQgb2YgdGhlIHN0YXJ0c2NyZWVuIHdvcmtzLgorCS0gV2luZ0NvbW1hbmRlciBQcm9waGVjeSBEZW1vOgorCSAgU291bmQgd29ya3MgZm9yIHRoZSBpbnRyb21vdmllLgpkaWZmIC0tZ2l0IGEvZmlsZXMvZGlyZWN0b3J5LmMgYi9maWxlcy9kaXJlY3RvcnkuYwppbmRleCA4YWIyNzIwLi4xMmMyOTAyIDEwMDY0NAotLS0gYS9maWxlcy9kaXJlY3RvcnkuYworKysgYi9maWxlcy9kaXJlY3RvcnkuYwpAQCAtMzUxLDYgKzM1MSw3IEBACiAgICAgaWYgKCFET1NGU19HZXRGdWxsTmFtZSggcGF0aCwgRkFMU0UsICZmdWxsX25hbWUgKSkgcmV0dXJuIDA7CiAgICAgaWYgKChta2RpciggZnVsbF9uYW1lLmxvbmdfbmFtZSwgMDc3NyApID09IC0xKSAmJiAoZXJybm8gIT0gRUVYSVNUKSkKICAgICB7CisgICAgICBXQVJOIChmaWxlLCAiRXJybm8gJWkgdHJ5aW5nIHRvIGNyZWF0ZSBkaXJlY3RvcnkgJXMuXG4iLCBlcnJubywgZnVsbF9uYW1lLmxvbmdfbmFtZSk7CiAgICAgICAgIEZJTEVfU2V0RG9zRXJyb3IoKTsKICAgICAgICAgcmV0dXJuIEZBTFNFOwogICAgIH0KZGlmZiAtLWdpdCBhL2dyYXBoaWNzL21ldGFmaWxlZHJ2L2luaXQuYyBiL2dyYXBoaWNzL21ldGFmaWxlZHJ2L2luaXQuYwppbmRleCBhMDJkN2ZmLi5jMjZiMDY2IDEwMDY0NAotLS0gYS9ncmFwaGljcy9tZXRhZmlsZWRydi9pbml0LmMKKysrIGIvZ3JhcGhpY3MvbWV0YWZpbGVkcnYvaW5pdC5jCkBAIC0xMSw2ICsxMSw4IEBACiAjaW5jbHVkZSAibWV0YWZpbGUuaCIKICNpbmNsdWRlICJkZWJ1Zy5oIgogCisjaW5jbHVkZSA8c3RyaW5nLmg+CisKIHN0YXRpYyBjb25zdCBEQ19GVU5DVElPTlMgTUZEUlZfRnVuY3MgPQogewogICAgIE1GRFJWX0FyYywgICAgICAgICAgICAgICAgICAgICAgIC8qIHBBcmMgKi8KQEAgLTE3OSwyMiArMTgxLDE5IEBACiAgICAgcmV0dXJuIGRjLT5oU2VsZjsKIH0KIAotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgkgICAgIENsb3NlTWV0YUZpbGUxNiAgIChHREkuMTI2KQotICoKLSAqICBTdG9wIHJlY29yZGluZyBncmFwaGljcyBvcGVyYXRpb25zIGluIG1ldGFmaWxlIGFzc29jaWF0ZWQgd2l0aAotICogIGhkYyBhbmQgcmV0cmlldmUgbWV0YWZpbGUuCi0gKgotICogUkVUVVJOUwotICogIEhhbmRsZSBvZiBuZXdseSBjcmVhdGVkIG1ldGFmaWxlIG9uIHN1Y2Nlc3MsIE5VTEwgb24gZmFpbHVyZS4KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgkgICAgIENyZWF0ZU1ldGFGaWxlMzJBICAgKEdESTMyLjUxKQogICovCi1ITUVUQUZJTEUxNiBXSU5BUEkgQ2xvc2VNZXRhRmlsZTE2KCAKLQkJCQkgICBIREMxNiBoZGMgLyogTWV0YWZpbGUgREMgdG8gY2xvc2UgKi8KK0hEQzMyIFdJTkFQSSBDcmVhdGVNZXRhRmlsZTMyQSggCisJCQkgICAgICBMUENTVFIgZmlsZW5hbWUgLyogRmlsZW5hbWUgb2YgZGlzayBtZXRhZmlsZSAqLwogKQogeworICByZXR1cm4gQ3JlYXRlTWV0YUZpbGUxNiggZmlsZW5hbWUgKTsKK30KKworc3RhdGljIERDICpNRVRBRklMRV9DbG9zZU1ldGFGaWxlKCBIREMzMiBoZGMgKSAKK3sKICAgICBEQyAqZGM7Ci0gICAgSE1FVEFGSUxFMTYgaG1mOwogICAgIEhGSUxFMzIgaEZpbGU7CiAgICAgTUVUQUZJTEVEUlZfUERFVklDRSAqcGh5c0RldjsKICAgICAKQEAgLTIzMSw2ICsyMzAsMjIgQEAKICAgICAgICAgX2xjbG9zZTMyKGhGaWxlKTsKICAgICB9CiAKKyAgICByZXR1cm4gZGM7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCSAgICAgQ2xvc2VNZXRhRmlsZTE2ICAgKEdESS4xMjYpCisgKi8KK0hNRVRBRklMRTE2IFdJTkFQSSBDbG9zZU1ldGFGaWxlMTYoIAorCQkJCSAgIEhEQzE2IGhkYyAvKiBNZXRhZmlsZSBEQyB0byBjbG9zZSAqLworKQoreworICAgIEhNRVRBRklMRTE2IGhtZjsKKyAgICBNRVRBRklMRURSVl9QREVWSUNFICpwaHlzRGV2OworICAgIERDICpkYyA9IE1FVEFGSUxFX0Nsb3NlTWV0YUZpbGUoaGRjKTsKKyAgICBpZiAoIWRjKSByZXR1cm4gMDsKKyAgICBwaHlzRGV2ID0gKE1FVEFGSUxFRFJWX1BERVZJQ0UgKilkYy0+cGh5c0RldjsKKwogICAgIC8qIE5vdyBhbGxvY2F0ZSBhIGdsb2JhbCBoYW5kbGUgZm9yIHRoZSBtZXRhZmlsZSAqLwogCiAgICAgaG1mID0gR0xPQkFMX0NyZWF0ZUJsb2NrKCBHTUVNX01PVkVBQkxFLCBwaHlzRGV2LT5taCwKQEAgLTI0MSwxMiArMjU2LDI1IEBACiAgICAgcmV0dXJuIGhtZjsKIH0KIAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoJICAgICBDbG9zZU1ldGFGaWxlMzIgICAoR0RJMzIuMTcpCisgKgorICogIFN0b3AgcmVjb3JkaW5nIGdyYXBoaWNzIG9wZXJhdGlvbnMgaW4gbWV0YWZpbGUgYXNzb2NpYXRlZCB3aXRoCisgKiAgaGRjIGFuZCByZXRyaWV2ZSBtZXRhZmlsZS4KKyAqCisgKiBSRVRVUk5TCisgKiAgSGFuZGxlIG9mIG5ld2x5IGNyZWF0ZWQgbWV0YWZpbGUgb24gc3VjY2VzcywgTlVMTCBvbiBmYWlsdXJlLgorICovCitITUVUQUZJTEUzMiBXSU5BUEkgQ2xvc2VNZXRhRmlsZTMyKCAKKwkJCQkgICBIREMzMiBoZGMgLyogTWV0YWZpbGUgREMgdG8gY2xvc2UgKi8KKykKK3sKKyAgcmV0dXJuIENsb3NlTWV0YUZpbGUzMihoZGMpOworfQorCiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqCSAgICAgRGVsZXRlTWV0YUZpbGUxNiAgIChHREkuMTI3KQotICoKLSAqICBEZWxldGUgYSBtZW1vcnktYmFzZWQgbWV0YWZpbGUuCi0gKgogICovCiBCT09MMTYgV0lOQVBJIERlbGV0ZU1ldGFGaWxlMTYoIAogCQkJICAgICAgIEhNRVRBRklMRTE2IGhtZiAKQEAgLTI1NiwzICsyODQsNzcgQEAKICAgICByZXR1cm4gIUdsb2JhbEZyZWUxNiggaG1mICk7CiB9CiAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqICAgICAgICAgIERlbGV0ZU1ldGFGaWxlMzIgIChHREkzMi42OSkKKyAqCisgKiAgRGVsZXRlIGEgbWVtb3J5LWJhc2VkIG1ldGFmaWxlLgorICovCisKK0JPT0wzMiBXSU5BUEkgRGVsZXRlTWV0YUZpbGUzMigKKwkgICAgICBITUVUQUZJTEUzMiBobWYKKykgeworICByZXR1cm4gIUdsb2JhbEZyZWUxNiggaG1mICk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorCisgICAgICAgRW5oYW5jZWQgTWV0YWZpbGUgZHJpdmVyIGluaXRpYWxpemF0aW9ucworCisgICAgICAgVGhpcyBwb3NzaWJseSAgc2hvdWxkIGJlIG1vdmVkIHRvIHRoZWlyIG93biBmaWxlL2RpcmVjdG9yeQorICAgICAgIGF0IHNvbWUgcG9pbnQuCisKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qCisgIG5lZWQgd2lkZSB2ZXJzaW9uIGFzIHdlbGwKKyovCitIREMzMiBDcmVhdGVFbmhNZXRhRmlsZTMyQSggCisgICAgSERDMzIgaGRjLCAvKiBvcHRpb25hbCByZWZlcmVuY2UgREMgKi8KKyAgICBMUENTVFIgZmlsZW5hbWUsIC8qIG9wdGlvbmFsIGZpbGVuYW1lIGZvciBkaXNrIG1ldGFmaWxlcyAqLworICAgIGNvbnN0IFJFQ1QzMiAqcmVjdCwgLyogb3B0aW9uYWwgYm91bmRpbmcgcmVjdGFuZ2xlICovCisgICAgTFBDU1RSIGRlc2NyaXB0aW9uIC8qIG9wdGlvbmFsIGRlc2NyaXB0aW9uICovIAorICAgICkKK3sKKyNpZiAwCisgICAgREMgKmRjOworICAgIE1FVEFGSUxFRFJWX1BERVZJQ0UgKnBoeXNEZXY7CisgICAgSEZJTEUzMiBoRmlsZTsKKworICAgIGlmICghKGRjID0gTUZEUlZfQWxsb2NNZXRhRmlsZSgpKSkgcmV0dXJuIDA7CisgICAgcGh5c0RldiA9IChNRVRBRklMRURSVl9QREVWSUNFICopZGMtPnBoeXNEZXY7CisgICAgCisgICAgaWYgKGZpbGVuYW1lKSAgLyogZGlzayBiYXNlZCBtZXRhZmlsZSAqLworICAgIHsKKyAgICAgICAgcGh5c0Rldi0+bWgtPm10VHlwZSA9IE1FVEFGSUxFX0RJU0s7CisgICAgICAgIGlmICgoaEZpbGUgPSBfbGNyZWF0MzIoIGZpbGVuYW1lLCAwICkpID09IEhGSUxFX0VSUk9SMzIpCisgICAgICAgIHsKKyAgICAgICAgICAgIE1GRFJWX0RlbGV0ZURDKCBkYyApOworICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgIH0KKyAgICAgICAgaWYgKF9sd3JpdGUzMiggaEZpbGUsIChMUFNUUilwaHlzRGV2LT5taCwKKyAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKCpwaHlzRGV2LT5taCkpID09IEhGSUxFX0VSUk9SMzIpCisJeworICAgICAgICAgICAgTUZEUlZfRGVsZXRlREMoIGRjICk7CisgICAgICAgICAgICByZXR1cm4gMDsKKwl9CisJcGh5c0Rldi0+bWgtPm10Tm9QYXJhbWV0ZXJzID0gaEZpbGU7IC8qIHN0b3JlIGZpbGUgZGVzY3JpcHRvciBoZXJlICovCisJICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHdpbmRvd3MgcHJvYmFibHkgdXNlcyB0aGlzIHRvbyovCisgICAgfQorICAgIGVsc2UgIC8qIG1lbW9yeSBiYXNlZCBtZXRhZmlsZSAqLworCXBoeXNEZXYtPm1oLT5tdFR5cGUgPSBNRVRBRklMRV9NRU1PUlk7CisKKyAgICBUUkFDRShtZXRhZmlsZSwgInJldHVybmluZyAlMDR4XG4iLCBkYy0+aFNlbGYpOworICAgIHJldHVybiBkYy0+aFNlbGY7CisjZW5kaWYKKyAgICByZXR1cm4gMDsKK30KKworSEVOSE1FVEFGSUxFMzIgQ2xvc2VFbmhNZXRhRmlsZTMyKCAKKyAgICAgICAgICAgICAgIEhEQzMyIGhkYyAgLyogbWV0YWZpbGUgREMgKi8KKwkgICAgICAgKQoreworICAvKiB3cml0ZSBFTVJfRU9GKDB4MCwgMHgxMCwgMHgxNCkgKi8KKyAgcmV0dXJuIDA7Cit9CisKKwpkaWZmIC0tZ2l0IGEvZ3JhcGhpY3MvcGFpbnRpbmcuYyBiL2dyYXBoaWNzL3BhaW50aW5nLmMKaW5kZXggMjUxMWVjNC4uYjZhYzdkOCAxMDA2NDQKLS0tIGEvZ3JhcGhpY3MvcGFpbnRpbmcuYworKysgYi9ncmFwaGljcy9wYWludGluZy5jCkBAIC02OTUsOCArNjk1LDggQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTFBSRUNUMzIgbHByY0Zyb20sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IExQUkVDVDMyIGxwcmNUbyApCiB7Ci0gICAgZnByaW50Ziggc3RkbmltcCwiRHJhd0FuaW1hdGVkUmVjdHMzMigleCwlZCwlcCwlcCksIGVtcHR5IHN0dWIhXG4iLAotICAgICAgICAgICAgIGh3bmQsIGlkQW5pLCBscHJjRnJvbSwgbHByY1RvICk7CisgICAgRklYTUUoZ2RpLCIoJXgsJWQsJXAsJXApOiBlbXB0eSBzdHViIVxuIiwKKwkgIGh3bmQsIGlkQW5pLCBscHJjRnJvbSwgbHByY1RvICk7CiAgICAgcmV0dXJuIFRSVUU7CiB9CiAKZGlmZiAtLWdpdCBhL2dyYXBoaWNzL3dpbjE2ZHJ2L2luaXQuYyBiL2dyYXBoaWNzL3dpbjE2ZHJ2L2luaXQuYwppbmRleCA4YjFhODk2Li40NDQwZDgxIDEwMDY0NAotLS0gYS9ncmFwaGljcy93aW4xNmRydi9pbml0LmMKKysrIGIvZ3JhcGhpY3Mvd2luMTZkcnYvaW5pdC5jCkBAIC0xNzMsMTEgKzE3MywxMiBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmludGVyRW5hYmxlZCwgc2l6ZW9mKHByaW50ZXJFbmFibGVkKSApOwogICAgIGlmIChsc3RyY21waTMyQShwcmludGVyRW5hYmxlZCwib24iKSkKICAgICB7Ci0gICAgICAgIHByaW50ZigiV0lOMTZEUlZfQ3JlYXRlREMgZGlzYWJsZWQgaW4gd2luZS5jb25mIGZpbGVcbiIpOworICAgICAgICBNU0coIldJTjE2RFJWX0NyZWF0ZURDIGRpc2FibGVkIGluIHdpbmUuY29uZiBmaWxlXG4iKTsKICAgICAgICAgcmV0dXJuIEZBTFNFOwogICAgIH0KIAotICAgIFRSQUNFKHdpbjE2ZHJ2LCAiSW4gY3JlYXRkYyBmb3IgKCVzLCVzLCVzKSBpbml0RGF0YSAweCVwXG4iLGRyaXZlciwgZGV2aWNlLCBvdXRwdXQsIGluaXREYXRhKTsKKyAgICBUUkFDRSh3aW4xNmRydiwgIkluIGNyZWF0ZGMgZm9yICglcywlcywlcykgaW5pdERhdGEgMHglcFxuIiwKKwkgIGRyaXZlciwgZGV2aWNlLCBvdXRwdXQsIGluaXREYXRhKTsKIAogICAgIHBoeXNEZXYgPSAoV0lOMTZEUlZfUERFVklDRSAqKUhlYXBBbGxvYyggU3lzdGVtSGVhcCwgMCwgc2l6ZW9mKCpwaHlzRGV2KSApOwogICAgIGlmICghcGh5c0RldikgcmV0dXJuIEZBTFNFOwpAQCAtMjA1LDExICsyMDYsOSBAQAogICAgIGRjLT53LmhWaXNSZ24gPSBDcmVhdGVSZWN0UmduMzIoMCwgMCwgZGMtPncuZGV2Q2Fwcy0+aG9yelJlcywgZGMtPncuZGV2Q2Fwcy0+dmVydFJlcyk7CiAgICAgZGMtPncuYml0c1BlclBpeGVsID0gZGMtPncuZGV2Q2Fwcy0+Yml0c1BpeGVsOwogICAgIAotICAgIHByaW50ZigiR290IGRldmNhcHMgd2lkdGggJWQgaGVpZ2h0ICVkIGJpdHMgJWQgcGxhbmVzICVkXG4iLAotICAgICAgICAgICBkYy0+dy5kZXZDYXBzLT5ob3J6UmVzLAotICAgICAgICAgICBkYy0+dy5kZXZDYXBzLT52ZXJ0UmVzLCAKLSAgICAgICAgICAgZGMtPncuZGV2Q2Fwcy0+Yml0c1BpeGVsLAotICAgICAgICAgICBkYy0+dy5kZXZDYXBzLT5wbGFuZXMpOworICAgIFRSQUNFKHdpbjE2ZHJ2LCAiR290IGRldmNhcHMgd2lkdGggJWQgaGVpZ2h0ICVkIGJpdHMgJWQgcGxhbmVzICVkXG4iLAorCSAgZGMtPncuZGV2Q2Fwcy0+aG9yelJlcywgZGMtPncuZGV2Q2Fwcy0+dmVydFJlcywgCisJICBkYy0+dy5kZXZDYXBzLT5iaXRzUGl4ZWwsIGRjLT53LmRldkNhcHMtPnBsYW5lcyk7CiAKICAgICAvKiBOb3cgd2UgYWxsb2NhdGUgZW5vdWdoIG1lbW9yeSBmb3IgdGhlIFBERVZJQ0Ugc3RydWN0dXJlICovCiAgICAgLyogVGhlIHNpemUgb2YgdGhpcyB2YXJpZXMgYmV0d2VlbiBwcmludGVyIGRyaXZlcnMgKi8KQEAgLTI3NiwxNSArMjc1LDE1IEBACiAJc3dpdGNoKG5Fc2NhcGUpCiAgICAgICAgICAgewogCSAgY2FzZSBFTkFCTEVQQUlSS0VSTklORzoKLQkgICAgZnByaW50ZihzdGRlcnIsIkVzY2FwZTogRU5BQkxFUEFJUktFUk5JTkcgaWdub3JlZC5cbiIpOworCSAgICBGSVhNRSh3aW4xNmRydiwiRXNjYXBlOiBFTkFCTEVQQUlSS0VSTklORyBpZ25vcmVkLlxuIik7CiAgICAgICAgICAgICBuUmV0ID0gMTsKIAkgICAgYnJlYWs7CiAJICBjYXNlIEdFVFBBSVJLRVJOVEFCTEU6Ci0JICAgIGZwcmludGYoc3RkZXJyLCJFc2NhcGU6IEdFVFBBSVJLRVJOVEFCTEUgaWdub3JlZC5cbiIpOworCSAgICBGSVhNRSh3aW4xNmRydiwiRXNjYXBlOiBHRVRQQUlSS0VSTlRBQkxFIGlnbm9yZWQuXG4iKTsKICAgICAgICAgICAgIG5SZXQgPSAwOwogCSAgICBicmVhazsKICAgICAgICAgICBjYXNlIFNFVEFCT1JUUFJPQzoKLQkgICAgcHJpbnRmKCJFc2NhcGU6IFNldEFib3J0UHJvYyBpZ25vcmVkIHNob3VsZCBiZSBzdG9yZWQgaW4gZGMgc29tZXdoZXJlXG4iKTsKKwkgICAgRklYTUUod2luMTZkcnYsIkVzY2FwZTogU2V0QWJvcnRQcm9jIGlnbm9yZWQgc2hvdWxkIGJlIHN0b3JlZCBpbiBkYyBzb21ld2hlcmVcbiIpOwogICAgICAgICAgICAgLyogTWFrZSBjYWxsaW5nIGFwcGxpY2F0aW9uIGJlbGlldmUgdGhpcyB3b3JrZWQgKi8KICAgICAgICAgICAgIG5SZXQgPSAxOwogCSAgICBicmVhazsKQEAgLTMzNSw3ICszMzQsNyBAQAogCX0KICAgICB9CiAgICAgZWxzZQotCWZwcmludGYoc3RkZXJyLCAiRXNjYXBlKG5Fc2NhcGUgPSAlMDR4KVxuIiwgbkVzY2FwZSk7ICAgICAgCisJV0FSTih3aW4xNmRydiwgIkVzY2FwZShuRXNjYXBlID0gJTA0eCkgLSA/Pz9cbiIsIG5Fc2NhcGUpOyAgICAgIAogICAgIHJldHVybiBuUmV0OwogfQogCkBAIC0zNjEsMTIgKzM2MCwxMiBAQAogCiBIUFEgV0lOQVBJIENyZWF0ZVBRKGludCBzaXplKSAKIHsKLSAgICBwcmludGYoIkNyZWF0ZVBROiAlZFxuIixzaXplKTsKKyAgICBGSVhNRSh3aW4xNmRydiwgIiglZCk6IHN0dWJcbiIsc2l6ZSk7CiAgICAgcmV0dXJuIDE7CiB9CiBpbnQgV0lOQVBJIERlbGV0ZVBRKEhQUSBoUFEpIAogewotICAgIHByaW50ZigiRGVsZXRlUFE6ICV4XG4iLCBoUFEpOworICAgIEZJWE1FKHdpbjE2ZHJ2LCAiKCV4KTogc3R1YlxuIiwgaFBRKTsKICAgICByZXR1cm4gMDsKIH0KIGludCBXSU5BUEkgRXh0cmFjdFBRKEhQUSBoUFEpIApAQCAtNDAyLDcgKzQwMSw3IEBACiAgICAgICAgIGZyZWUocXVldWUpOwogICAgIH0KICAgICAKLSAgICBwcmludGYoIkV4dHJhY3RQUTogJXggZ290IHRhZyAlZCBrZXkgJWRcbiIsIGhQUSwgdGFnLCBrZXkpOyAKKyAgICBUUkFDRSh3aW4xNmRydiwgIiV4IGdvdCB0YWcgJWQga2V5ICVkXG4iLCBoUFEsIHRhZywga2V5KTsgCiAKICAgICByZXR1cm4gdGFnOwogfQpAQCAtNDE1LDE3ICs0MTQsMTcgQEAKICAgICBxdWV1ZUl0ZW0tPmtleSA9IGtleTsKICAgICBxdWV1ZUl0ZW0tPnRhZyA9IHRhZzsKICAgICAKLSAgICBwcmludGYoIkluc2VydFBROiAleCAlZCAlZFxuIiwgaFBRLCB0YWcsIGtleSk7CisgICAgRklYTUUod2luMTZkcnYsICIoJXggJWQgJWQpOiBzdHViPz8/XG4iLCBoUFEsIHRhZywga2V5KTsKICAgICByZXR1cm4gVFJVRTsKIH0KIGludCBXSU5BUEkgTWluUFEoSFBRIGhQUSkgCiB7Ci0gICAgcHJpbnRmKCJNaW5QUTogJXhcbiIsIGhQUSk7IAorICAgIEZJWE1FKHdpbjE2ZHJ2LCAiKCV4KTogc3R1YlxuIiwgaFBRKTsgCiAgICAgcmV0dXJuIDA7CiB9CiBpbnQgV0lOQVBJIFNpemVQUShIUFEgaFBRLCBpbnQgc2l6ZWNoYW5nZSkgCiB7ICAKLSAgICBwcmludGYoIlNpemVQUTogJXggJWRcbiIsIGhQUSwgc2l6ZWNoYW5nZSk7IAorICAgIEZJWE1FKHdpbjE2ZHJ2LCAiKCV4ICVkKTogc3R1YlxuIiwgaFBRLCBzaXplY2hhbmdlKTsgCiAgICAgcmV0dXJuIC0xOyAKIH0KIApAQCAtNDY4LDkgKzQ2Nyw5IEBACiAgICAgaWYgKHBzek91dHB1dCA9PSBOVUxMIHx8ICpwc3pPdXRwdXQgPT0gJ1wwJykKICAgICAgIHJldHVybiAtMTsKIAotICAgIFBST0ZJTEVfR2V0V2luZUluaVN0cmluZyggInNwb29sZXIiLCBwc3pPdXRwdXQsICIiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHNDbWQsIHNpemVvZihwc0NtZCkgKTsKLSAgICBwcmludGYoIkdvdCBwcmludGVyU3Bvb2xDb21tYW5kIFwiJXNcIiBmb3Igb3V0cHV0IGRldmljZSBcIiVzXCJcbiIscHNDbWQsIHBzek91dHB1dCk7CisgICAgUFJPRklMRV9HZXRXaW5lSW5pU3RyaW5nKCAic3Bvb2xlciIsIHBzek91dHB1dCwgIiIsIHBzQ21kLCBzaXplb2YocHNDbWQpICk7CisgICAgVFJBQ0Uod2luMTZkcnYsICJHb3QgcHJpbnRlclNwb29sQ29tbWFuZCAnJXMnIGZvciBvdXRwdXQgZGV2aWNlICclcydcbiIsCisJICBwc0NtZCwgcHN6T3V0cHV0KTsKICAgICBpZiAoISpwc0NtZCkKICAgICAgICAgcHNDbWRQID0gcHN6T3V0cHV0OwogICAgIGVsc2UKQEAgLTQ5MSw3ICs0OTAsNyBAQAogICAgICAgICB7CiAgICAgICAgICAgICBwc0NtZFArKzsKIAotICAgICAgICAgICAgcHJpbnRmKCJJbiBjaGlsZCBuZWVkIHRvIGV4ZWMgJXNcbiIscHNDbWRQKTsKKyAgICAgICAgICAgIFRSQUNFKHdpbjE2ZHJ2LCAiSW4gY2hpbGQgbmVlZCB0byBleGVjICVzXG4iLHBzQ21kUCk7CiAgICAgICAgICAgICBjbG9zZSgwKTsKICAgICAgICAgICAgIGR1cDIoZmRzWzBdLDApOwogICAgICAgICAgICAgY2xvc2UgKGZkc1sxXSk7CkBAIC01MDEsMTUgKzUwMCwxNiBAQAogICAgICAgICB9CiAgICAgICAgIGNsb3NlIChmZHNbMF0pOwogICAgICAgICBmZCA9IGZkc1sxXTsKLSAgICAgICAgcHJpbnRmKCJOZWVkIHRvIGV4ZWN1dGUgYSBjb21tYW5kIGFuZCBwaXBlIHRoZSBvdXRwdXQgdG8gaXRcbiIpOworICAgICAgICBUUkFDRSh3aW4xNmRydiwiTmVlZCB0byBleGVjdXRlIGEgY21uZCBhbmQgcGlwZSB0aGUgb3V0cHV0IHRvIGl0XG4iKTsKICAgICB9CiAgICAgZWxzZQogICAgIHsKLSAgICAgICAgcHJpbnRmKCJKdXN0IGFzc3VtZSBpdHMgYSBmaWxlXG4iKTsKKyAgICAgICAgVFJBQ0Uod2luMTZkcnYsICJKdXN0IGFzc3VtZSBpdHMgYSBmaWxlXG4iKTsKIAogICAgICAgICBpZiAoKGZkID0gb3Blbihwc0NtZFAsIE9fQ1JFQVQgfCBPX1RSVU5DIHwgT19XUk9OTFkgLCAwNjAwKSkgPCAwKQogICAgICAgICB7Ci0gICAgICAgICAgICBwcmludGYoIkZhaWxlZCB0byBjcmVhdGUgc3Bvb2wgZmlsZSAlcywgZXJybm8gPSAlZFxuIiwgcHNDbWRQLCBlcnJubyk7CisgICAgICAgICAgICBFUlIod2luMTZkcnYsICJGYWlsZWQgdG8gY3JlYXRlIHNwb29sIGZpbGUgJXMsIGVycm5vID0gJWRcbiIsIAorCQlwc0NtZFAsIGVycm5vKTsKICAgICAgICAgfQogICAgIH0KICAgICByZXR1cm4gZmQ7CkBAIC01MzgsNyArNTM4LDcgQEAKICAgICBIQU5ETEUxNiBoSGFuZGxlID0gKEhBTkRMRTE2KVNQX0VSUk9SOwogICAgIFBQUklOVEpPQiBwUHJpbnRKb2I7CiAKLSAgICBUUkFDRSh3aW4xNmRydiwgIlwiJXNcIiBcIiVzXCIgJTA0eFxuIiwgbHBPdXRwdXQsIGxwVGl0bGUsIGhEQyk7CisgICAgVFJBQ0Uod2luMTZkcnYsICInJXMnICclcycgJTA0eFxuIiwgbHBPdXRwdXQsIGxwVGl0bGUsIGhEQyk7CiAKICAgICBwUHJpbnRKb2IgPSBnUHJpbnRKb2JzVGFibGVbMF07CiAgICAgaWYgKHBQcmludEpvYiA9PSBOVUxMKQpkaWZmIC0tZ2l0IGEvZ3JhcGhpY3Mvd2luMTZkcnYvcHJ0ZHJ2LmMgYi9ncmFwaGljcy93aW4xNmRydi9wcnRkcnYuYwppbmRleCA2OTY4ZjA5Li5iN2ZlNWZmIDEwMDY0NAotLS0gYS9ncmFwaGljcy93aW4xNmRydi9wcnRkcnYuYworKysgYi9ncmFwaGljcy93aW4xNmRydi9wcnRkcnYuYwpAQCAtNTczLDcgKzU3Myw3IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsUDExLCBsUDEyLCBsUDEzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU0VHUFRSX0dFVChsUDE0KSk7CiAgICAgICAgIFNFR1BUUl9GUkVFKGxQMTQpOwotICAgICAgICBwcmludGYoIkNhbGxlZCBTdHJldGNoQmx0IHJldCAlZFxuIix3UmV0KTsKKyAgICAgICAgVFJBQ0Uod2luMTZkcnYsICJDYWxsZWQgU3RyZXRjaEJsdCByZXQgJWRcbiIsd1JldCk7CiAgICAgfQogICAgIHJldHVybiB3UmV0OwogfQpkaWZmIC0tZ2l0IGEvZ3JhcGhpY3Mvd2luZy5jIGIvZ3JhcGhpY3Mvd2luZy5jCmluZGV4IGYxNjc2MzMuLmRhOWMzMTUgMTAwNjQ0Ci0tLSBhL2dyYXBoaWNzL3dpbmcuYworKysgYi9ncmFwaGljcy93aW5nLmMKQEAgLTU3LDcgKzU3LDcgQEAKIAlyZXR1cm47CiAgICAgICB9CiAgICAgfSAKLSAgICBmcHJpbnRmKHN0ZG5pbXAsIldpbkc6IG5vIGpveS5cbiIpOworICAgIEZJWE1FKHdpbmcsIldpbkc6IG5vIGpveS5cbiIpOwogICAgIF9fV2luR09LID0gRmFsc2U7CiAgIH0KIH0KQEAgLTc5LDcgKzc5LDcgQEAKICAqLwogQk9PTDE2IFdJTkFQSSBXaW5HUmVjb21tZW5kRElCRm9ybWF0MTYoQklUTUFQSU5GTyAqZm10KQogewotICBmcHJpbnRmKHN0ZG5pbXAsIldpbkdSZWNvbW1lbmRESUJGb3JtYXQoKVxuIik7CisgIEZJWE1FKHdpbmcsIiglcCk6IHN0dWJcbiIsIGZtdCk7CiAKICAgaWYoIF9fV2luR09LID4gMCAmJiBmbXQgKQogICB7CkBAIC05NSwxNCArOTUsMTYgQEAKIEhCSVRNQVAxNiBXSU5BUEkgV2luR0NyZWF0ZUJpdG1hcDE2KEhEQzE2IHdpbkRDLCBCSVRNQVBJTkZPICpoZWFkZXIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICoqYml0cykKIHsKLSAgZnByaW50ZihzdGRuaW1wLCJXaW5HQ3JlYXRlQml0bWFwOiBlbXB0eSBzdHViISAoZXhwZWN0IGZhaWx1cmUpXG4iKTsKKyAgRklYTUUod2luZywiKCV4LCVwLCVwKTogZW1wdHkgc3R1YiEgKGV4cGVjdCBmYWlsdXJlKVxuIiwgCisJd2luREMsIGhlYWRlciwgYml0cyk7CiAgIGlmKCBfX1dpbkdPSyA+IDAgJiYgaGVhZGVyICkKICAgewogICAgIEJJVE1BUElORk9IRUFERVIqIGJtcGkgPSAmaGVhZGVyLT5ibWlIZWFkZXI7CiAKLSAgICBmcHJpbnRmKHN0ZG5pbXAsImJ5dGVzXHQ9JWlcbnBsYW5lc1x0PSVpXG5icHBcdD0laVxueFx0PSVpXG55XHQ9JWlcbnJsZVx0PTB4JTA4eFxuc2l6ZVx0PSVpXG4iLAotICAgICAoaW50KWJtcGktPmJpU2l6ZSwgYm1waS0+YmlQbGFuZXMsIGJtcGktPmJpQml0Q291bnQsCi0gICAgIChpbnQpYm1waS0+YmlXaWR0aCwgKGludClibXBpLT5iaUhlaWdodCwgKHVuc2lnbmVkKWJtcGktPmJpQ29tcHJlc3Npb24sIChpbnQpYm1waS0+YmlTaXplSW1hZ2UpOworICAgICBGSVhNRSh3aW5nLCJieXRlcz0laSxwbGFuZXM9JWksYnBwPSVpLHg9JWkseT0laSxybGU9MHglMDh4LHNpemU9JWlcbiIsCisJICAgKGludClibXBpLT5iaVNpemUsIGJtcGktPmJpUGxhbmVzLCBibXBpLT5iaUJpdENvdW50LAorCSAgIChpbnQpYm1waS0+YmlXaWR0aCwgKGludClibXBpLT5iaUhlaWdodCwgCisJICAgKHVuc2lnbmVkKWJtcGktPmJpQ29tcHJlc3Npb24sIChpbnQpYm1waS0+YmlTaXplSW1hZ2UpOwogCiAjaWZkZWYgUFJFTElNSU5BUllfV0lORzE2X1NVUFBPUlQKICAgICBpZiggYm1waS0+YmlQbGFuZXMgPT0gX19ibXBpV2luRy5iaVBsYW5lcyAmJiBibXBpLT5iaUJpdENvdW50ID09IF9fYm1waVdpbkcuYmlCaXRDb3VudCAmJgpAQCAtMjA3LDcgKzIwOSw3IEBACiBVSU5UMTYgV0lOQVBJIFdpbkdTZXRESUJDb2xvclRhYmxlMTYoSERDMTYgaFdpbkdEQywgVUlOVDE2IHN0YXJ0LCBVSU5UMTYgbnVtLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJHQlFVQUQqIHBDb2xvcikKIHsKLSAgICAgICAgZnByaW50ZihzdGRuaW1wLCJXaW5HU2V0RElCQ29sb3JUYWJsZTogZW1wdHkgc3R1YiFcbiIpOworICAgICAgICBGSVhNRSh3aW5nLCIoJXgsJWQsJWQsJXApOiBlbXB0eSBzdHViIVxuIixoV2luR0RDLHN0YXJ0LG51bSxwQ29sb3IpOwogICAgICAgICByZXR1cm4gbnVtOwogfQogCkBAIC0yMTUsOSArMjE3LDkgQEAKICAqICBXaW5HR2V0RElCQ29sb3JUYWJsZTE2ICAgKFdJTkcuMTAwNSkKICAqLwogVUlOVDE2IFdJTkFQSSBXaW5HR2V0RElCQ29sb3JUYWJsZTE2KEhEQzE2IHdpbkRDLCBVSU5UMTYgc3RhcnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVUlOVDE2IG51bWVudHJ5LCBSR0JRVUFEKiBjb2xvcnMpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVUlOVDE2IG51bSwgUkdCUVVBRCogY29sb3JzKQogewotCWZwcmludGYoc3RkbmltcCwiV2luR0dldERJQkNvbG9yVGFibGU6IGVtcHR5IHN0dWIhXG4iKTsKKyAgICAgICAgRklYTUUod2luZywiKCV4LCVkLCVkLCVwKTogZW1wdHkgc3R1YiFcbiIsd2luREMsc3RhcnQsbnVtLGNvbG9ycyk7CiAJcmV0dXJuIDA7CiB9CiAKQEAgLTIyNiw3ICsyMjgsNyBAQAogICovCiBIUEFMRVRURTE2IFdJTkFQSSBXaW5HQ3JlYXRlSGFsZlRvbmVQYWxldHRlMTYodm9pZCkKIHsKLSAgICAgICAgZnByaW50ZihzdGRuaW1wLCJXaW5HQ3JlYXRlSGFsZlRvbmVQYWxldHRlOiBlbXB0eSBzdHViIVxuIik7CisgICAgICAgIEZJWE1FKHdpbmcsIih2b2lkKTogZW1wdHkgc3R1YiFcbiIpOwogCXJldHVybiAwOwogfQogCkBAIC0yMzYsNyArMjM4LDcgQEAKIEhQQUxFVFRFMTYgV0lOQVBJIFdpbkdDcmVhdGVIYWxmVG9uZUJydXNoMTYoSERDMTYgd2luREMsIENPTE9SUkVGIGNvbCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV0lOR19ESVRIRVJfVFlQRSB0eXBlKQogewotICAgICAgICBmcHJpbnRmKHN0ZG5pbXAsIldpbkdDcmVhdGVIYWxmVG9uZUJydXNoOiBlbXB0eSBzdHViIVxuIik7CisgICAgICAgIEZJWE1FKHdpbmcsIiguLi4pOiBlbXB0eSBzdHViIVxuIik7CiAJcmV0dXJuIDA7CiB9CiAKQEAgLTI1MCw4ICsyNTIsNiBAQAogewogCiAgICAgICAgIHJldHVybiBTdHJldGNoQmx0MTYoZGVzdERDLCB4RGVzdCwgeURlc3QsIHdpZERlc3QsIGhlaURlc3QsIHNyY0RDLCB4U3JjLCB5U3JjLCB3aWRTcmMsIGhlaVNyYywgU1JDQ09QWSk7Ci0vKiAgICAgICAgZnByaW50ZihzdGRuaW1wLCJXaW5HU3RyZXRjaEJsdDE2OiBlbXB0eSBzdHViIVxuIik7Ki8KLS8qICAgICAgcmV0dXJuIDA7ICovCiB9CiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgpkaWZmIC0tZ2l0IGEvZ3JhcGhpY3MveDExZHJ2L2luaXQuYyBiL2dyYXBoaWNzL3gxMWRydi9pbml0LmMKaW5kZXggNjAwYzk4MC4uMjE5M2ZiOSAxMDA2NDQKLS0tIGEvZ3JhcGhpY3MveDExZHJ2L2luaXQuYworKysgYi9ncmFwaGljcy94MTFkcnYvaW5pdC5jCkBAIC0xMTYsOSArMTE2LDkgQEAKICAgICAvKiBGaW5pc2ggdXAgZGV2aWNlIGNhcHMgKi8KIAogI2lmIDAKLSAgICBwcmludGYoIkRpc3BsYXk6XG5IZWlnaHQgPSAlLTRpIHB4bCwgJS00aSBtbVxuV2lkdGggID0gJS00aSBweGwsICUtNGkgbW1cbiIsCi0JICAgIEhlaWdodE9mU2NyZWVuKHNjcmVlbiksIEhlaWdodE1NT2ZTY3JlZW4oc2NyZWVuKSwKLQkgICAgV2lkdGhPZlNjcmVlbihzY3JlZW4pLCBXaWR0aE1NT2ZTY3JlZW4oc2NyZWVuKSApOworICAgIFRSQUNFKHgxMWRydiwgIkhlaWdodCA9ICUtNGkgcHhsLCAlLTRpIG1tLCBXaWR0aCAgPSAlLTRpIHB4bCwgJS00aSBtbVxuIiwKKwkgIEhlaWdodE9mU2NyZWVuKHNjcmVlbiksIEhlaWdodE1NT2ZTY3JlZW4oc2NyZWVuKSwKKwkgIFdpZHRoT2ZTY3JlZW4oc2NyZWVuKSwgV2lkdGhNTU9mU2NyZWVuKHNjcmVlbikgKTsKICNlbmRpZgogCiAgICAgWDExRFJWX0RldkNhcHMudmVyc2lvbiA9IDB4MzAwOwpkaWZmIC0tZ2l0IGEvZ3JhcGhpY3MveDExZHJ2L3hmb250LmMgYi9ncmFwaGljcy94MTFkcnYveGZvbnQuYwppbmRleCA1NjFmYzllLi4wMWM1NDdkIDEwMDY0NAotLS0gYS9ncmFwaGljcy94MTFkcnYveGZvbnQuYworKysgYi9ncmFwaGljcy94MTFkcnYveGZvbnQuYwpAQCAtMjQsOCArMjQsNiBAQAogI2luY2x1ZGUgImZvbnQuaCIKICNpbmNsdWRlICJkZWJ1Zy5oIgogCi0jZGVmaW5lIERFQlVHX0ZPTlRfSU5JVAkJMQotCiAjZGVmaW5lIFhfUEZPTlRfTUFHSUMJCSgweEZBREUwMDAwKQogI2RlZmluZSBYX0ZNQ19NQUdJQwkJKDB4MDAwMENBRkUpCiAKQEAgLTgyNCw5ICs4MjIsOCBAQAogCQlmaS0+ZGYuZGZQaXRjaEFuZEZhbWlseSB8PSBiRmFtaWx5U3R5bGU7CiAJfQogCi0jaWZkZWYgREVCVUdfRk9OVF9JTklUCiAJVFJBQ0UoZm9udCwidHlwZWZhY2UgXCclc1wnXG4iLCBmci0+bGZGYWNlTmFtZSk7Ci0jZW5kaWYKKwogCWZyLT5mcl9mbGFncyB8PSBGUl9OQU1FU0VUOwogICAgIH0KIApAQCAtODY1LDkgKzg2Miw4IEBACiAJLyogY2hlY2sgaWYgd2UgYWxyZWFkeSBnb3Qgb25lICovCiAJaWYoICFsc3RyY21waTMyQSggcGZhLT5mYVR5cGVGYWNlLCBscEFsaWFzICkgKQogCXsKLSNpZmRlZiBERUJVR19GT05UX0lOSVQKLQkgICAgVFJBQ0UoZm9udCwiXHRyZWR1bmRhbnQgYWxpYXMgJyVzJyAtPiAnJXMnXG4iLCBscEFsaWFzLCBscFR5cGVGYWNlICk7Ci0jZW5kaWYKKwkgICAgVFJBQ0UoZm9udCwiXHRyZWR1bmRhbnQgYWxpYXMgJyVzJyAtPiAnJXMnXG4iLCAKKwkJICBscEFsaWFzLCBscFR5cGVGYWNlICk7CiAJICAgIHJldHVybiBOVUxMOwogCX0gCiAJaWYoIHBmYS0+bmV4dCApIHBmYSA9IHBmYS0+bmV4dDsKQEAgLTg4NSw5ICs4ODEsOCBAQAogICAgICAgICBwZmEtPmZhQWxpYXMgPSBwZmEtPmZhVHlwZUZhY2UgKyBqOwogICAgICAgICBsc3RyY3B5MzJBKCBwZmEtPmZhQWxpYXMsIGxwQWxpYXMgKTsKIAotI2lmZGVmIERFQlVHX0ZPTlRfSU5JVAogICAgICAgICBUUkFDRShmb250LCAiXHRhZGRlZCBhbGlhcyAnJXMnIGZvciAlc1xuIiwgbHBBbGlhcywgbHBUeXBlRmFjZSApOwotI2VuZGlmCisKIAlyZXR1cm4gcGZhOwogICAgIH0KICAgICByZXR1cm4gTlVMTDsKQEAgLTk4NywxMCArOTgyLDkgQEAKIAkJCSAgICBwcmV2ID0gcGZhOwogCQkJfQogCQkJCQkJCi0jaWZkZWYgREVCVUdfRk9OVF9JTklUCiAgICAgICAgICAgICAgICAgICAgICAgICBUUkFDRShmb250LCAiXHRzdWJzdGl0dXRlZCAnJXMnIHdpdGggJXNcbiIsCiAJCQkJCQlmck1hdGNoLT5sZkZhY2VOYW1lLCBscEFsaWFzICk7Ci0jZW5kaWYKKwogCQkJbHN0cmNweW4zMkEoIGZyTWF0Y2gtPmxmRmFjZU5hbWUsIGxwQWxpYXMsIExGX0ZBQ0VTSVpFICk7CiAJCQlmck1hdGNoLT5mcl9mbGFncyB8PSBGUl9OQU1FU0VUOwogCQkgICAgfQpAQCAtMTAwMSw3ICs5OTUsNyBAQAogCQkgICAgfQogCQl9CiAJICAgIH0KLQkgICAgZWxzZSBmcHJpbnRmKHN0ZGVyciwgIlhGT05UX0luaXQ6IG1hbGZvcm1lZCBmb250IGFsaWFzICclcydcbiIsICpidWZmZXIgKTsKKwkgICAgZWxzZSBFUlIoZm9udCwgIiBtYWxmb3JtZWQgZm9udCBhbGlhcyAnJXMnXG4iLCAqYnVmZmVyICk7CiAJfQogCWVsc2UgYnJlYWs7CiAgICAgfSB3aGlsZShUUlVFKTsKQEAgLTEzOTUsOSArMTM4OSw3IEBACiAJICAgZnItPnJlc291cmNlID0gKGNoYXIqKSBIZWFwQWxsb2MoU3lzdGVtSGVhcCwgMCwgaiArIDEgKTsKIAkgICBsc3RyY3B5bjMyQSggZnItPnJlc291cmNlLCB0eXBlZmFjZSwgaiArIDEgKTsKIAotI2lmZGVmIERFQlVHX0ZPTlRfSU5JVAogCSAgIFRSQUNFKGZvbnQsIiAgICBmYW1pbHk6ICVzXG4iLCBmci0+cmVzb3VyY2UgKTsKLSNlbmRpZgogCiAJICAgaWYoIHBmciApIHBmci0+bmV4dCA9IGZyOwogCSAgIGVsc2UgZm9udExpc3QgPSBmcjsKQEAgLTE0MzksMTUgKzE0MzEsMTQgQEAKIAkgICBYRk9OVF9TZXRGb250TWV0cmljKCBmaSwgZnIsIHhfZnMgKTsKICAgICAgICAgICAgVFNYRnJlZUZvbnQoIGRpc3BsYXksIHhfZnMgKTsKIAotI2lmZGVmIERFQlVHX0ZPTlRfSU5JVAogCSAgIFRSQUNFKGZvbnQsIlx0WyUgMmlwdF0gJyVzJ1xuIiwgZmktPmRmLmRmUG9pbnRzLCB0eXBlZmFjZSApOwotI2VuZGlmCisKIAkgICBYRk9OVF9DaGVja0ZJTGlzdCggZnIsIGZpLCBSRU1PVkVfU1VCU0VUUyApOwogCSAgIGZpID0gTlVMTDsJLyogcHJldmVudGluZyByZXVzZSAqLwogICAgICAgICB9CiAgICAgICAgIGVsc2UKICAgICAgICAgewotICAgICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIkZPTlRfSW5pdDogZmFpbGVkIHRvIGxvYWQgJXNcbiIsIGxwc3RyICk7CisgICAgICAgICAgIEVSUihmb250LCAiZmFpbGVkIHRvIGxvYWQgJXNcbiIsIGxwc3RyICk7CiAKICAgICAgICAgICAgWEZPTlRfQ2hlY2tGSUxpc3QoIGZyLCBmaSwgVU5NQVJLX1NVQlNFVFMgKTsKICAgICAgICAgfQpAQCAtMTQ4NCw5ICsxNDc1LDcgQEAKICAgZm9udENhY2hlID0gKGZvbnRPYmplY3QqKSBIZWFwQWxsb2MoU3lzdGVtSGVhcCwgMCwgZm9udENhY2hlU2l6ZSAqIHNpemVvZihmb250T2JqZWN0KSk7CiAgIFhGT05UX0dyb3dGcmVlTGlzdCgwLCBmb250Q2FjaGVTaXplIC0gMSk7CiAKLSNpZmRlZiBERUJVR19GT05UX0lOSVQKLSAgICAgICAgVFJBQ0UoZm9udCwiZG9uZSFcbiIpOwotI2VuZGlmCisgIFRSQUNFKGZvbnQsImRvbmUhXG4iKTsKIAogICAvKiB1cGRhdGUgdGV4dCBjYXBzIHBhcmFtZXRlciAqLwogCkBAIC0xNzE2LDkgKzE3MDUsNyBAQAogICAgIGZyLT5jb3VudCsrOwogICB9CiAKLSNpZmRlZiBERUJVR19GT05UX0lOSVQKICAgaWYoIGkgKSBUUkFDRShmb250LCJcdCAgICBwdXJnZWQgJWkgc3Vic2V0cyBbJWldXG4iLCBpICwgZnItPmNvdW50KTsKLSNlbmRpZgogfQogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKQEAgLTIyMjYsMTAgKzIyMTMsNyBAQAogICovCiBJTlQzMiBXSU5BUEkgQWRkRm9udFJlc291cmNlMzJBKCBMUENTVFIgc3RyICkKIHsKLSAgICBpZiAoSElXT1JEKHN0cikpCS8qIGZvbnQgZmlsZSAqLwotICAgICAgICBmcHJpbnRmKCBzdGRuaW1wLCAiU1RVQjogQWRkRm9udFJlc291cmNlKCclcycpXG4iLCBzdHIgKTsKLSAgICBlbHNlCQkvKiBmb250IHJlc291cmNlIGhhbmRsZSAqLwotICAgICAgICBmcHJpbnRmKCBzdGRuaW1wLCAiU1RVQjogQWRkRm9udFJlc291cmNlKCUwNHgpXG4iLCBMT1dPUkQoc3RyKSApOworICAgIEZJWE1FKGZvbnQsICIoJXMpOiBzdHViXG4iLCBkZWJ1Z3JlcyhzdHIpKTsKICAgICByZXR1cm4gMTsKIH0KIApAQCAtMjIzOSw3ICsyMjIzLDcgQEAKICAqLwogSU5UMzIgV0lOQVBJIEFkZEZvbnRSZXNvdXJjZTMyVyggTFBDV1NUUiBzdHIgKQogewotICAgIGZwcmludGYoIHN0ZG5pbXAsICJTVFVCOiBBZGRGb250UmVzb3VyY2UzMlcoJXApXG4iLCBzdHIgKTsKKyAgICBGSVhNRShmb250LCAiKCVwKTogc3R1YlxuIiwgc3RyICk7CiAgICAgcmV0dXJuIDE7CiB9CiAKQEAgLTIyNDgsMTEgKzIyMzIsNyBAQAogICovCiBCT09MMTYgV0lOQVBJIFJlbW92ZUZvbnRSZXNvdXJjZTE2KCBTRUdQVFIgc3RyICkKIHsKLSAgICBpZiAoSElXT1JEKHN0cikpCi0gICAgICAgIGZwcmludGYoIHN0ZG5pbXAsICJTVFVCOiBSZW1vdmVGb250UmVzb3VyY2UoJyVzJylcbiIsCi0JCShjaGFyICopUFRSX1NFR19UT19MSU4oIHN0cikgKTsKLSAgICBlbHNlCi0gICAgICAgIGZwcmludGYoIHN0ZG5pbXAsICJTVFVCOiBSZW1vdmVGb250UmVzb3VyY2UoJTA0eClcbiIsIExPV09SRChzdHIpICk7CisgICAgRklYTUUoZm9udCwgIiglcyk6IHN0dWJcbiIsCWRlYnVncmVzKFBUUl9TRUdfVE9fTElOKHN0cikpKTsKICAgICByZXR1cm4gVFJVRTsKIH0KIApAQCAtMjI2MiwxMCArMjI0Miw3IEBACiAgKi8KIEJPT0wzMiBXSU5BUEkgUmVtb3ZlRm9udFJlc291cmNlMzJBKCBMUENTVFIgc3RyICkKIHsKLSAgICBpZiAoSElXT1JEKHN0cikpCi0gICAgICAgIGZwcmludGYoIHN0ZG5pbXAsICJTVFVCOiBSZW1vdmVGb250UmVzb3VyY2UoJyVzJylcbiIsIHN0ciApOwotICAgIGVsc2UKLSAgICAgICAgZnByaW50Ziggc3RkbmltcCwgIlNUVUI6IFJlbW92ZUZvbnRSZXNvdXJjZSglMDR4KVxuIiwgTE9XT1JEKHN0cikgKTsKKyAgICBGSVhNRShmb250LCAiKCVzKTogc3R1YlxuIiwgZGVidWdyZXMoc3RyKSk7CiAgICAgcmV0dXJuIFRSVUU7CiB9CiAKQEAgLTIyNzUsNyArMjI1Miw3IEBACiAgKi8KIEJPT0wzMiBXSU5BUEkgUmVtb3ZlRm9udFJlc291cmNlMzJXKCBMUENXU1RSIHN0ciApCiB7Ci0gICAgZnByaW50Ziggc3RkbmltcCwgIlNUVUI6IFJlbW92ZUZvbnRSZXNvdXJjZTMyVyglcClcbiIsIHN0ciApOworICAgIEZJWE1FKGZvbnQsICIoJXApOiBzdHViXG4iLCBzdHIgKTsKICAgICByZXR1cm4gVFJVRTsKIH0KIApkaWZmIC0tZ2l0IGEvaWYxNjMyL2J1aWx0aW4uYyBiL2lmMTYzMi9idWlsdGluLmMKaW5kZXggOTA1Yzk4Mi4uYTBmMmQyZiAxMDA2NDQKLS0tIGEvaWYxNjMyL2J1aWx0aW4uYworKysgYi9pZjE2MzIvYnVpbHRpbi5jCkBAIC0xMDksNyArMTA5LDcgQEAKICAgICB7ICZTVE9SQUdFX0Rlc2NyaXB0b3IsICBETExfRkxBR19OT1RfVVNFRCB9LAogICAgIHsgJlNUUkVTU19EZXNjcmlwdG9yLCAgIDAgfSwKICAgICB7ICZUT09MSEVMUF9EZXNjcmlwdG9yLCAwIH0sCi0gICAgeyAmVFlQRUxJQl9EZXNjcmlwdG9yLCAgMCB9LAorICAgIHsgJlRZUEVMSUJfRGVzY3JpcHRvciwgIERMTF9GTEFHX05PVF9VU0VEIH0sCiAgICAgeyAmVkVSX0Rlc2NyaXB0b3IsICAgICAgMCB9LAogICAgIHsgJlczMlNZU19EZXNjcmlwdG9yLCAgIDAgfSwKICAgICB7ICZXSU4zMlMxNl9EZXNjcmlwdG9yLCAwIH0sCmRpZmYgLS1naXQgYS9pZjE2MzIvZHVtbXkuYyBiL2lmMTYzMi9kdW1teS5jCmluZGV4IDY1YzBkYTguLjdiYWJjYWMgMTAwNjQ0Ci0tLSBhL2lmMTYzMi9kdW1teS5jCisrKyBiL2lmMTYzMi9kdW1teS5jCkBAIC02LDcgKzYsMTAgQEAKIGxvbmcgV0lOQVBJIHN0dWJfR0RJXzM4Mih2b2lkKSB7IGZwcmludGYoc3RkZXJyLCAiV2FybmluZzogR0RJXzM4MjpBQk9SVFBST0MgdW5pbXBsZW1lbnRlZCBzdHViXG4iKTsgcmV0dXJuIDE7IH0KIGxvbmcgV0lOQVBJIHN0dWJfR0RJXzUzMCh2b2lkKSB7IGZwcmludGYoc3RkZXJyLCAiV2FybmluZzogR0RJXzUzMDogdW5pbXBsZW1lbnRlZCBzdHViXG4iKTsgcmV0dXJuIDA7IH0KIGxvbmcgV0lOQVBJIHN0dWJfR0RJXzUzMSh2b2lkKSB7IGZwcmludGYoc3RkZXJyLCAiV2FybmluZzogR0RJXzUzMTogdW5pbXBsZW1lbnRlZCBzdHViXG4iKTsgcmV0dXJuIDA7IH0KLWxvbmcgV0lOQVBJIHN0dWJfR0RJXzUzMih2b2lkKSB7IGZwcmludGYoc3RkZXJyLCAiV2FybmluZzogR0RJXzUzMjogdW5pbXBsZW1lbnRlZCBzdHViXG4iKTsgcmV0dXJuIDA7IH0KK2xvbmcgV0lOQVBJIHN0dWJfR0RJXzUzMihMUElOVDE2IGJ1ZmZlciwgSU5UMTYgeHgpIHsgCisgICAgICBmcHJpbnRmKHN0ZGVyciwgIlNUVUIgR0RJXzUzMiglcCwgJWhkKVxuIixidWZmZXIseHgpOyAKKyAgICAgIHJldHVybiAwOyAKK30KIGxvbmcgV0lOQVBJIHN0dWJfR0RJXzUzNih2b2lkKSB7IGZwcmludGYoc3RkZXJyLCAiV2FybmluZzogR0RJXzUzNjogdW5pbXBsZW1lbnRlZCBzdHViXG4iKTsgcmV0dXJuIDA7IH0KIGxvbmcgV0lOQVBJIHN0dWJfR0RJXzUzOCh2b2lkKSB7IGZwcmludGYoc3RkZXJyLCAiV2FybmluZzogR0RJXzUzODogdW5pbXBsZW1lbnRlZCBzdHViXG4iKTsgcmV0dXJuIDA7IH0KIGxvbmcgV0lOQVBJIHN0dWJfR0RJXzU0MCh2b2lkKSB7IGZwcmludGYoc3RkZXJyLCAiV2FybmluZzogR0RJXzU0MDogdW5pbXBsZW1lbnRlZCBzdHViXG4iKTsgcmV0dXJuIDA7IH0KZGlmZiAtLWdpdCBhL2lmMTYzMi9nZGkuc3BlYyBiL2lmMTYzMi9nZGkuc3BlYwppbmRleCBiZjdmZDZmLi4yYjZjOTYyIDEwMDY0NAotLS0gYS9pZjE2MzIvZ2RpLnNwZWMKKysrIGIvaWYxNjMyL2dkaS5zcGVjCkBAIC0zNTQsNyArMzU0LDcgQEAKICMgU3R1YnMgZm9yIEhlYnJldyB2ZXJzaW9uCiA1MzAgcGFzY2FsMTYgR0RJXzUzMCgpIHN0dWJfR0RJXzUzMAogNTMxIHBhc2NhbDE2IEdESV81MzEoKSBzdHViX0dESV81MzEKLTUzMiBwYXNjYWwxNiBHRElfNTMyKCkgc3R1Yl9HRElfNTMyCis1MzIgcGFzY2FsMTYgR0RJXzUzMihwdHIgd29yZCkgc3R1Yl9HRElfNTMyCiA1MzYgcGFzY2FsMTYgR0RJXzUzNigpIHN0dWJfR0RJXzUzNgogNTM4IHBhc2NhbDE2IEdESV81MzgoKSBzdHViX0dESV81MzgKIDU0MCBwYXNjYWwxNiBHRElfNTQwKCkgc3R1Yl9HRElfNTQwCmRpZmYgLS1naXQgYS9pZjE2MzIva2VybmVsLnNwZWMgYi9pZjE2MzIva2VybmVsLnNwZWMKaW5kZXggODc2Mzk3Zi4uYWIwZWJkZCAxMDA2NDQKLS0tIGEvaWYxNjMyL2tlcm5lbC5zcGVjCisrKyBiL2lmMTYzMi9rZXJuZWwuc3BlYwpAQCAtMjk5LDcgKzI5OSw3IEBACiA0MjAgcGFzY2FsICAgR2V0RmlsZUF0dHJpYnV0ZXMocHRyKSBHZXRGaWxlQXR0cmlidXRlczE2CiA0MjEgcGFzY2FsMTYgU2V0RmlsZUF0dHJpYnV0ZXMocHRyIGxvbmcpIFNldEZpbGVBdHRyaWJ1dGVzMTYKIDQyMiBwYXNjYWwxNiBHZXREaXNrRnJlZVNwYWNlKHB0ciBwdHIgcHRyIHB0ciBwdHIpIEdldERpc2tGcmVlU3BhY2UxNiAKLTQzMSBwYXNjYWwxNiBLRVJORUxfNDMxKHN0ciB3b3JkKSBLRVJORUxfNDMxCis0MzEgcGFzY2FsMTYgSXNQZUZvcm1hdChzdHIgd29yZCkgSXNQZUZvcm1hdAogNDMyIHN0dWIgRmlsZVRpbWVUb0xvY2FsRmlsZVRpbWUKIDQzNCBzdHViIEtFUk5FTF80MzQKIDQzNSBzdHViIEtFUk5FTF80MzUKQEAgLTM1Niw2ICszNTYsNiBAQAogNjIxIHN0dWIgS0VSTkVMXzYyMQogNjI3IHN0dWIgSXNCYWRGbGF0UmVhZFdyaXRlUHRyCiA2MzAgc3R1YiBLRVJORUxfNjMwCi02MzEgcGFzY2FsIEZVTkMwMDQod29yZCB3b3JkIHdvcmQpIEZVTkMwMDQJI0MxNlRoa1NsMDE/Cis2MzEgcmVnaXN0ZXIgRlVOQzAwNCh3b3JkIHdvcmQgd29yZCkgRlVOQzAwNAkjQzE2VGhrU2wwMT8KIDY1MSBzdHViIEtFUk5FTF82NTEJCQkJI1RodW5rQ29ubmVjdDE2PwogNzAwIHBhc2NhbCBLRVJORUxfNzAwKCkgc3R1Yl9LRVJORUxfNzAwCmRpZmYgLS1naXQgYS9pZjE2MzIvdGh1bmsuYyBiL2lmMTYzMi90aHVuay5jCmluZGV4IDU3YWQ3Y2UuLjY4YTUxMWIgMTAwNjQ0Ci0tLSBhL2lmMTYzMi90aHVuay5jCisrKyBiL2lmMTYzMi90aHVuay5jCkBAIC02MTgsOSArNjE4LDE3IEBACiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICogICAgICAgICAgIFRIVU5LX1dPV0NhbGxiYWNrMTZFeAkoV09XMzIuMykoS0VSTkVMMzIuNTUpCisgKiBHZW5lcmljIHRodW5raW5nIHJvdXRpbmUgdG8gY2FsbCAxNiBiaXQgZnVuY3Rpb25zIGZyb20gMzJiaXQgY29kZS4KKyAqIAorICogUkVUVVJOUworICogCVRSVUUgaWYgdGhlIGNhbGwgd2FzIGRvbmUKICAqLwogc3RhdGljIEJPT0wzMiBXSU5BUEkgVEhVTktfV09XQ2FsbGJhY2sxNkV4KAotCUZBUlBST0MxNiBwcm9jLERXT1JEIGR3RmxhZ3MsRFdPUkQgY2JBcmdzLExQVk9JRCB4YXJncyxMUERXT1JEIHBkd3JldAorCUZBUlBST0MxNiBwcm9jLAkJLyogW2luXSAxNmJpdCBmdW5jdGlvbiB0byBjYWxsICovCisJRFdPUkQgZHdGbGFncywJCS8qIFtpbl0gZmxhZ3MgKFdDQl8qKSAqLworCURXT1JEIGNiQXJncywJCS8qIFtpbl0gbnVtYmVyIG9mIGFyZ3VtZW50cyAqLworCUxQVk9JRCB4YXJncywJCS8qIFtpbi9vdXRdIGFyZ3VtZW50cyAqLworCUxQRFdPUkQgcGR3cmV0CQkvKiBbb3V0XSByZXR1cm4gdmFsdWUgb2YgdGhlIDE2Yml0IGNhbGwgKi8KICkgewogICAgIExQRFdPUkQgICAgIGFyZ3MgPSAoTFBEV09SRCl4YXJnczsKICAgICBEV09SRCAgICAgICByZXQsaTsKZGlmZiAtLWdpdCBhL2lmMTYzMi90eXBlbGliLnNwZWMgYi9pZjE2MzIvdHlwZWxpYi5zcGVjCmluZGV4IGI3ODc2ZTguLjdkMmJjY2YgMTAwNjQ0Ci0tLSBhL2lmMTYzMi90eXBlbGliLnNwZWMKKysrIGIvaWYxNjMyL3R5cGVsaWIuc3BlYwpAQCAtMTIsNCArMTIsNCBAQAogMTAgc3R1YiBSRUdJU1RFUlRZUEVMSUIgICAgICAgICAgICAgIAogMTEgc3R1YiBMT0FEUkVHVFlQRUxJQiAgICAgICAgICAgICAgIAogMTQgcGFzY2FsIFF1ZXJ5UGF0aE9mUmVnVHlwZUxpYihwdHIgd29yZCB3b3JkIHdvcmQgcHRyKSBRdWVyeVBhdGhPZlJlZ1R5cGVMaWIKLTE1IHN0dWIgT0FCVUlMRFZFUlNJT04gICAgICAgICAgICAgICAKKzE1IHBhc2NhbCBPQUJ1aWxkVmVyc2lvbigpIE9BQnVpbGRWZXJzaW9uICAgICAgICAgICAgICAgCmRpZmYgLS1naXQgYS9pZjE2MzIvdXNlci5zcGVjIGIvaWYxNjMyL3VzZXIuc3BlYwppbmRleCA0MWJiMDQ1Li4yMzM1YmRiIDEwMDY0NAotLS0gYS9pZjE2MzIvdXNlci5zcGVjCisrKyBiL2lmMTYzMi91c2VyLnNwZWMKQEAgLTM5OSw4ICszOTksOCBAQAogNDM0IHBhc2NhbDE2IElzQ2hhckFscGhhTnVtZXJpYyh3b3JkKSBJc0NoYXJBbHBoYU51bWVyaWMxNgogNDM1IHBhc2NhbDE2IElzQ2hhclVwcGVyKHdvcmQpIElzQ2hhclVwcGVyMTYKIDQzNiBwYXNjYWwxNiBJc0NoYXJMb3dlcih3b3JkKSBJc0NoYXJMb3dlcjE2Ci00MzcgcGFzY2FsMTYgQW5zaVVwcGVyQnVmZihwdHIgd29yZCkgQW5zaVVwcGVyQnVmZjE2Ci00MzggcGFzY2FsMTYgQW5zaUxvd2VyQnVmZihwdHIgd29yZCkgQW5zaUxvd2VyQnVmZjE2Cis0MzcgcGFzY2FsMTYgQW5zaVVwcGVyQnVmZihzdHIgd29yZCkgQW5zaVVwcGVyQnVmZjE2Cis0MzggcGFzY2FsMTYgQW5zaUxvd2VyQnVmZihzdHIgd29yZCkgQW5zaUxvd2VyQnVmZjE2CiA0NDEgcGFzY2FsMTYgSW5zZXJ0TWVudUl0ZW0od29yZCB3b3JkIHdvcmQgcHRyKSBJbnNlcnRNZW51SXRlbTE2CiA0NDMgc3R1YiBHZXRNZW51SXRlbUluZm8KIDQ0NSBwYXNjYWwgICBEZWZGcmFtZVByb2Mod29yZCB3b3JkIHdvcmQgd29yZCBsb25nKSBEZWZGcmFtZVByb2MxNgpkaWZmIC0tZ2l0IGEvaWYxNjMyL3czMnN5cy5zcGVjIGIvaWYxNjMyL3czMnN5cy5zcGVjCmluZGV4IDM3OGM0ODIuLjk4ZGQ2M2QgMTAwNjQ0Ci0tLSBhL2lmMTYzMi93MzJzeXMuc3BlYworKysgYi9pZjE2MzIvdzMyc3lzLnNwZWMKQEAgLTIsMTIgKzIsMTIgQEAKIHR5cGUJd2luMTYKIAogIzEgV0VQCi0yIHN0dWIgSVNQRUZPUk1BVAorMiBwYXNjYWwxNiBJc1BlRm9ybWF0KHN0ciB3b3JkKSBJc1BlRm9ybWF0CiAzIHN0dWIgRVhFQ1BFCiA0IHN0dWIgR0VUUEVFWEVJTkZPCiA1IHJldHVybiBHRVRXMzJTWVNWRVJTSU9OIDAgMHgxMDAKIDYgc3R1YiBMT0FEUEVSRVNPVVJDRQotNyBzdHViIEdFVFBFUkVTT1VSQ0VUQUJMRQorNyBwYXNjYWwxNiBHZXRQRVJlc291cmNlVGFibGUod29yZCkgR2V0UEVSZXNvdXJjZVRhYmxlCiA4IHN0dWIgRVhFQ1BFRVgKIDkgc3R1YiBJVFNNRQogMTAgc3R1YiBXMzJTRVJST1IKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYml0bWFwcy9vYm1fcmVzdG9yZV85NSBiL2luY2x1ZGUvYml0bWFwcy9vYm1fcmVzdG9yZV85NQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44ODZmNjc1Ci0tLSAvZGV2L251bGwKKysrIGIvaW5jbHVkZS9iaXRtYXBzL29ibV9yZXN0b3JlXzk1CkBAIC0wLDAgKzEsMjMgQEAKKy8qIFhQTSAqLworc3RhdGljIGNoYXIgKiBvYm1fcmVzdG9yZV85NVtdID0geworIjE2IDE0IDYgMSIsCisiIAlzIGJ1dHRvbl9oaWdobGlnaHQJYyB3aGl0ZSIsCisiKwlzIGJ1dHRvbl9lZGdlCWMgZ3JleTg1IiwKKyJYCXMgYnV0dG9uX2ZhY2UJYyBncmV5NzUiLAorIm8JcyBidXR0b25fc2hhZG93CWMgZ3JleTUwIiwKKyIuCXMgYnV0dG9uX3RleHQJYyBibGFjayIsCisiTwlzIHdpbmRvd19mcmFtZQljIGJsYWNrIiwKKyIgICAgICAgICAgICAgICBPIiwKKyIgKysrKysrKysrKysrK29PIiwKKyIgK1hYWC4uLi4uLlhYWG9PIiwKKyIgK1hYWC4uLi4uLlhYWG9PIiwKKyIgK1hYWC5YWFhYLlhYWG9PIiwKKyIgK1guLi4uLi5YLlhYWG9PIiwKKyIgK1guLi4uLi5YLlhYWG9PIiwKKyIgK1guWFhYWC4uLlhYWG9PIiwKKyIgK1guWFhYWC5YWFhYWG9PIiwKKyIgK1guWFhYWC5YWFhYWG9PIiwKKyIgK1guLi4uLi5YWFhYWG9PIiwKKyIgK1hYWFhYWFhYWFhYWG9PIiwKKyIgb29vb29vb29vb29vb29PIiwKKyJPT09PT09PT09PT09PT09PIn07CmRpZmYgLS1naXQgYS9pbmNsdWRlL2JpdG1hcHMvb2JtX3Jlc3RvcmVkXzk1IGIvaW5jbHVkZS9iaXRtYXBzL29ibV9yZXN0b3JlZF85NQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40ODg2ZTA2Ci0tLSAvZGV2L251bGwKKysrIGIvaW5jbHVkZS9iaXRtYXBzL29ibV9yZXN0b3JlZF85NQpAQCAtMCwwICsxLDIzIEBACisvKiBYUE0gKi8KK3N0YXRpYyBjaGFyICogb2JtX3Jlc3RvcmVkXzk1W10gPSB7CisiMTYgMTQgNiAxIiwKKyIgCXMgYnV0dG9uX2hpZ2hsaWdodAljIHdoaXRlIiwKKyIrCXMgYnV0dG9uX2VkZ2UJYyBncmV5ODUiLAorIlgJcyBidXR0b25fZmFjZQljIGdyZXk3NSIsCisibwlzIGJ1dHRvbl9zaGFkb3cJYyBncmV5NTAiLAorIi4JcyBidXR0b25fdGV4dAljIGJsYWNrIiwKKyJPCXMgd2luZG93X2ZyYW1lCWMgYmxhY2siLAorIk9PT09PT09PT09PT09PTyAiLAorIk9vb29vb29vb29vb29vKyAiLAorIk9vWFhYWFhYWFhYWFhYKyAiLAorIk9vWFhYWC4uLi4uLlhYKyAiLAorIk9vWFhYWC4uLi4uLlhYKyAiLAorIk9vWFhYWC5YWFhYLlhYKyAiLAorIk9vWFguLi4uLi5YLlhYKyAiLAorIk9vWFguLi4uLi5YLlhYKyAiLAorIk9vWFguWFhYWC4uLlhYKyAiLAorIk9vWFguWFhYWC5YWFhYKyAiLAorIk9vWFguWFhYWC5YWFhYKyAiLAorIk9vWFguLi4uLi5YWFhYKyAiLAorIk8rKysrKysrKysrKysrKyAiLAorIiAgICAgICAgICAgICAgICAifTsKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYml0bWFwcy9vY3JfYXBwc3RhcnRpbmcgYi9pbmNsdWRlL2JpdG1hcHMvb2NyX2FwcHN0YXJ0aW5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJlNDc5M2MKLS0tIC9kZXYvbnVsbAorKysgYi9pbmNsdWRlL2JpdG1hcHMvb2NyX2FwcHN0YXJ0aW5nCkBAIC0wLDAgKzEsNDAgQEAKKy8qIFhQTSAqLworc3RhdGljIGNoYXIgKm9jcl9hcHBzdGFydGluZ1tdID0geworIiAzMiAzMiAzIDEgMCAwIiwKKyIgCXMgTm9uZSBjIE5vbmUiLAorIi4JcyBibGFjayBjIGJsYWNrIiwKKyJYCXMgd2hpdGUgYyB3aGl0ZSIsCisiLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiwKKyIuLiAgICAgICAgICAuLi4uLi4uLi4uICAgICAgICAgICAiLAorIi5YLiAgICAgICAgIC4uWFhYWFhYLi4gICAgICAgICAgICIsCisiLlhYLiAgICAgICAgLi4uLi4uLi4uLiAgICAgICAgICAgIiwKKyIuWFhYLiAgICAgICAgLlhYWFhYWC4gICAgICAgICAgICAiLAorIi5YWFhYLiAgICAgICAuWFhYWFhYLiAgICAgICAgICAgICIsCisiLlhYWFhYLiAgICAgIC5YWFguWFguICAgICAgICAgICAgIiwKKyIuWFhYWFhYLiAgICAgLi5YLlhYLi4gICAgICAgICAgICAiLAorIi5YWFhYWFhYLiAgICAgLi5YWC4uICAgICAgICAgICAgICIsCisiLlhYWFhYWFhYLiAgICAgLi5YLiAgICAgICAgICAgICAgIiwKKyIuWFhYWFguLi4uLiAgIC4uWFguLiAgICAgICAgICAgICAiLAorIi5YWC5YWC4gICAgICAuLlhYWFguLiAgICAgICAgICAgICIsCisiLlguIC5YWC4gICAgIC5YWC5YWFguICAgICAgICAgICAgIiwKKyIuLiAgLlhYLiAgICAgLlguWC5YWC4gICAgICAgICAgICAiLAorIi4gICAgLlhYLiAgICAuLlguWC5YLiAgICAgICAgICAgICIsCisiICAgICAuWFguICAgLi4uLi4uLi4uLiAgICAgICAgICAgIiwKKyIgICAgICAuWFguICAuLlhYWFhYWC4uICAgICAgICAgICAiLAorIiAgICAgIC5YWC4gIC4uLi4uLi4uLi4gICAgICAgICAgICIsCisiICAgICAgIC4uICAgICAgICAgICAgICAgICAgICAgICAgIiwKKyIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLAorIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIsCisiICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiwKKyIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLAorIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIsCisiICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiwKKyIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLAorIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIsCisiICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiwKKyIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLAorIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIsCisiICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiwKKyIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiCit9OworCmRpZmYgLS1naXQgYS9pbmNsdWRlL2JpdG1hcHMvb2NyX2hlbHAgYi9pbmNsdWRlL2JpdG1hcHMvb2NyX2hlbHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmZiYmFiZAotLS0gL2Rldi9udWxsCisrKyBiL2luY2x1ZGUvYml0bWFwcy9vY3JfaGVscApAQCAtMCwwICsxLDQwIEBACisvKiBYUE0gKi8KK3N0YXRpYyBjaGFyICpvY3JfaGVscFtdID0geworIiAzMiAzMiAzIDEgMCAwIiwKKyIgCXMgTm9uZSAgYyBOb25lIiwKKyIuCXMgYmxhY2sgYyBibGFjayIsCisiWAlzIHdoaXRlIGMgd2hpdGUiLAorIi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiwKKyIuLiAgICAgICAgICBYWFhYWFhYICAgICAgICAgICAgICIsCisiLlguICAgICAgICBYLi4uLi4uLlggICAgICAgICAgICAiLAorIi5YWC4gICAgICBYLi4uWFguLi4uWCAgICAgICAgICAgIiwKKyIuWFhYLiAgICBYLi4uWCAgWC4uLi5YICAgICAgICAgICIsCisiLlhYWFguICAgWC4uLlggIFguLi4uWCAgICAgICAgICAiLAorIi5YWFhYWC4gIFguLi5YICBYLi4uLlggICAgICAgICAgIiwKKyIuWFhYWFhYLiBYLi4uWCAgWC4uLlggICAgICAgICAgICIsCisiLlhYWFhYWFguWFhYWFggWC4uLlggICAgICAgICAgICAiLAorIi5YWFhYWFhYWC4gICAgWC4uLlggICAgICAgICAgICAgIiwKKyIuWFhYWFguLi4uLiAgWC4uLlggICAgICAgICAgICAgICIsCisiLlhYLlhYLiAgICAgIFguLi5YICAgICAgICAgICAgICAiLAorIi5YLiAuWFguICAgICBYLi4uWCAgICAgICAgICAgICAgIiwKKyIuLiAgLlhYLiAgICAgIFhYWCAgICAgICAgICAgICAgICIsCisiLiAgICAuWFguICAgIFguLi5YICAgICAgICAgICAgICAiLAorIiAgICAgLlhYLiAgIFguLi4uLlggICAgICAgICAgICAgIiwKKyIgICAgICAuWFguICAgWC4uLlggICAgICAgICAgICAgICIsCisiICAgICAgLlhYLiAgICBYWFggICAgICAgICAgICAgICAiLAorIiAgICAgICAuLiAgICAgICAgICAgICAgICAgICAgICAgIiwKKyIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIsCisiICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLAorIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiwKKyIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIsCisiICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLAorIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiwKKyIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIsCisiICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLAorIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiwKKyIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIsCisiICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLAorIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiwKKyIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIKK307CisKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYml0bWFwcy9vY3Jfbm8gYi9pbmNsdWRlL2JpdG1hcHMvb2NyX25vCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFmZTA3MmYKLS0tIC9kZXYvbnVsbAorKysgYi9pbmNsdWRlL2JpdG1hcHMvb2NyX25vCkBAIC0wLDAgKzEsMzggQEAKKy8qIFhQTSAqLworc3RhdGljIGNoYXIgKm9jcl9ub1tdID0geworIjMyIDMyIDMgMSAxNiAxNiIsCisiIAlzIE5vbmUgYyBOb25lIiwKKyIuCXMgd2hpdGUgYyB3aGl0ZSIsCisiWAlzIGJsYWNrIGMgYmxhY2siLAorIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiwKKyIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIsCisiICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLAorIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiwKKyIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIsCisiICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLAorIiAgICAgICAgICAgICAuLi4uLi4gICAgICAgICAgICAgIiwKKyIgICAgICAgICAgIC4uWFhYWFhYLi4gICAgICAgICAgICIsCisiICAgICAgICAgIC5YWFhYWFhYWFhYLiAgICAgICAgICAiLAorIiAgICAgICAgIC5YWFhYLi4uLlhYWFguICAgICAgICAgIiwKKyIgICAgICAgIC5YWFguLiAgICAuLlhYWC4gICAgICAgICIsCisiICAgICAgIC5YWFhYWC4gICAgICAuWFhYLiAgICAgICAiLAorIiAgICAgICAuWFguWFhYLiAgICAgIC5YWC4gICAgICAgIiwKKyIgICAgICAuWFhYLi5YWFguICAgICAuWFhYLiAgICAgICIsCisiICAgICAgLlhYLiAgLlhYWC4gICAgIC5YWC4gICAgICAiLAorIiAgICAgIC5YWC4gICAuWFhYLiAgICAuWFguICAgICAgIiwKKyIgICAgICAuWFguICAgIC5YWFguICAgLlhYLiAgICAgICIsCisiICAgICAgLlhYLiAgICAgLlhYWC4gIC5YWC4gICAgICAiLAorIiAgICAgIC5YWFguICAgICAuWFhYLi5YWFguICAgICAgIiwKKyIgICAgICAgLlhYLiAgICAgIC5YWFguWFguICAgICAgICIsCisiICAgICAgIC5YWFguICAgICAgLlhYWFhYLiAgICAgICAiLAorIiAgICAgICAgLlhYWC4uICAgIC4uWFhYLiAgICAgICAgIiwKKyIgICAgICAgICAuWFhYWC4uLi5YWFhYLiAgICAgICAgICIsCisiICAgICAgICAgIC5YWFhYWFhYWFhYLiAgICAgICAgICAiLAorIiAgICAgICAgICAgLi5YWFhYWFguLiAgICAgICAgICAgIiwKKyIgICAgICAgICAgICAgLi4uLi4uICAgICAgICAgICAgICIsCisiICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLAorIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiwKKyIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIsCisiICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLAorIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiwKKyIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ9OwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9jb21iby5oIGIvaW5jbHVkZS9jb21iby5oCmluZGV4IGFhODA4ZGMuLjNiMmU4ZTIgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvY29tYm8uaAorKysgYi9pbmNsdWRlL2NvbWJvLmgKQEAgLTMxLDExICszMSwxMSBAQAogICAgVUlOVDMyICAJZHdTdHlsZTsKICAgIEhXTkQzMiAgCWhXbmRFZGl0OwogICAgSFdORDMyICAJaFduZExCb3g7Ci0gICBVSU5UMTYgIAl3U3RhdGU7Ci0gICBIRk9OVDE2IAloRm9udDsKLSAgIFJFQ1QxNiAgCVJlY3RDb21ibzsKLSAgIFJFQ1QxNiAgCVJlY3RFZGl0OwotICAgUkVDVDE2ICAJUmVjdEJ1dHRvbjsKKyAgIFVJTlQzMiAgCXdTdGF0ZTsKKyAgIEhGT05UMzIgCWhGb250OworICAgUkVDVDMyICAJUmVjdENvbWJvOworICAgUkVDVDMyICAJUmVjdEVkaXQ7CisgICBSRUNUMzIgIAlSZWN0QnV0dG9uOwogICAgSU5UMzIgICAJZHJvcHBlZFdpZHRoOwkJLyogbGFzdCB0d28gYXJlIG5vdCB1c2VkIHVubGVzcyBzZXQgKi8KICAgIElOVDMyICAgCWVkaXRIZWlnaHQ7CQkvKiBleHBsaWNpdGx5ICovCiB9IEhFQURDT01CTywqTFBIRUFEQ09NQk87CmRpZmYgLS1naXQgYS9pbmNsdWRlL2NvbW1jdHJsLmggYi9pbmNsdWRlL2NvbW1jdHJsLmgKaW5kZXggMzhlYTk1OS4uMzM0MDRmNSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9jb21tY3RybC5oCisrKyBiL2luY2x1ZGUvY29tbWN0cmwuaApAQCAtOSw2ICs5LDIxIEBACiAKIHZvaWQgV0lOQVBJIEluaXRDb21tb25Db250cm9scyh2b2lkKTsKIAorLyogY29tbW9uIGNvbnRyb2wgc3R5bGVzICovCisKKyNkZWZpbmUgQ0NTX1RPUCAgICAgICAgICAgICAweDAwMDAwMDAxTAorI2RlZmluZSBDQ1NfTk9NT1ZFWSAgICAgICAgIDB4MDAwMDAwMDJMCisjZGVmaW5lIENDU19CT1RUT00gICAgICAgICAgMHgwMDAwMDAwM0wKKyNkZWZpbmUgQ0NTX05PUkVTSVpFICAgICAgICAweDAwMDAwMDA0TAorI2RlZmluZSBDQ1NfTk9QQVJFTlRBTElHTiAgIDB4MDAwMDAwMDhMCisjZGVmaW5lIENDU19BREpVU1RBQkxFICAgICAgMHgwMDAwMDAyMEwKKyNkZWZpbmUgQ0NTX05PRElWSURFUiAgICAgICAweDAwMDAwMDQwTAorI2RlZmluZSBDQ1NfVkVSVCAgICAgICAgICAgIDB4MDAwMDAwODBMCisjZGVmaW5lIENDU19MRUZUICAgICAgICAgICAgKENDU19WRVJUfENDU19UT1ApCisjZGVmaW5lIENDU19SSUdIVCAgICAgICAgICAgKENDU19WRVJUfENDU19CT1RUT00pCisjZGVmaW5lIENDU19OT01PVkVYICAgICAgICAgKENDU19WRVJUfENDU19OT01PVkVZKQorCisKIC8qIFN0YXR1c1dpbmRvdyAqLwogCiAjZGVmaW5lIFNUQVRVU0NMQVNTTkFNRTE2ICAgICAibXNjdGxzX3N0YXR1c2JhciIKQEAgLTM4LDcgKzUzLDYgQEAKICNkZWZpbmUgU0JUX1JUTFJFQURJTkcgICAgICAgIDB4MDQwMAogI2RlZmluZSBTQlRfT1dORVJEUkFXICAgICAgICAgMHgxMDAwCiAKLSNkZWZpbmUgQ0NTX0JPVFRPTSAgICAgICAgICAgIDB4MDAwMwogI2RlZmluZSBTQkFSU19TSVpFR1JJUCAgICAgICAgMHgwMTAwCiAKIC8qIFVwRG93biAqLwpAQCAtMTE3LDE5ICsxMzEsMTkgQEAKIHR5cGVkZWYgc3RydWN0IF9JTUFHRUxJU1QgKkhJTUFHRUxJU1Q7CiAjZW5kaWYgIC8qIF9fV0lORV9fICovCiAKLSNkZWZpbmUgQ0xSX05PTkUgICAgICAweEZGRkZGRkZGCi0jZGVmaW5lIENMUl9ERUZBVUxUICAgMHgwMDAwMDAwMAotI2RlZmluZSBDTFJfSElMSUdIVCAgIENMUl9ERUZBVUxUCisjZGVmaW5lIENMUl9OT05FICAgICAgICAgMHhGRkZGRkZGRgorI2RlZmluZSBDTFJfREVGQVVMVCAgICAgIDB4RkYwMDAwMDAKKyNkZWZpbmUgQ0xSX0hJTElHSFQgICAgICBDTFJfREVGQVVMVAogCi0jZGVmaW5lIElMQ19NQVNLICAgICAgIDB4MDAwMQotI2RlZmluZSBJTENfQ09MT1IgICAgICAweDAwMDAKLSNkZWZpbmUgSUxDX0NPTE9SRERCICAgMHgwMEZFCi0jZGVmaW5lIElMQ19DT0xPUjQgICAgIDB4MDAwNAotI2RlZmluZSBJTENfQ09MT1I4ICAgICAweDAwMDgKLSNkZWZpbmUgSUxDX0NPTE9SMTYgICAgMHgwMDEwCi0jZGVmaW5lIElMQ19DT0xPUjI0ICAgIDB4MDAxOAotI2RlZmluZSBJTENfQ09MT1IzMiAgICAweDAwMjAKLSNkZWZpbmUgSUxDX1BBTEVUVEUgICAgMHgwODAwCisjZGVmaW5lIElMQ19NQVNLICAgICAgICAgMHgwMDAxCisjZGVmaW5lIElMQ19DT0xPUiAgICAgICAgMHgwMDAwCisjZGVmaW5lIElMQ19DT0xPUkREQiAgICAgMHgwMEZFCisjZGVmaW5lIElMQ19DT0xPUjQgICAgICAgMHgwMDA0CisjZGVmaW5lIElMQ19DT0xPUjggICAgICAgMHgwMDA4CisjZGVmaW5lIElMQ19DT0xPUjE2ICAgICAgMHgwMDEwCisjZGVmaW5lIElMQ19DT0xPUjI0ICAgICAgMHgwMDE4CisjZGVmaW5lIElMQ19DT0xPUjMyICAgICAgMHgwMDIwCisjZGVmaW5lIElMQ19QQUxFVFRFICAgICAgMHgwODAwICAvKiBubyBsb25nZXIgc3VwcG9ydGVkIGJ5IE0kICovCiAKICNkZWZpbmUgSUxEX05PUk1BTCAgICAgICAweDAwMDAKICNkZWZpbmUgSUxEX1RSQU5TUEFSRU5UICAweDAwMDEKQEAgLTE0Niw2ICsxNjAsMTAgQEAKIAogI2RlZmluZSBJTkRFWFRPT1ZFUkxBWU1BU0soaSkgICgoaSk8PDgpCiAKKyNkZWZpbmUgSUxDRl9NT1ZFICAgICAgICAoMHgwMDAwMDAwMCkKKyNkZWZpbmUgSUxDRl9TV0FQICAgICAgICAoMHgwMDAwMDAwMSkKKworCiB0eXBlZGVmIHN0cnVjdCBfSU1BR0VJTkZPCiB7CiAgICAgSEJJVE1BUDMyIGhibUltYWdlOwpAQCAtMTU2LDIwICsxNzQsNDggQEAKIH0gSU1BR0VJTkZPOwogCiAKK3R5cGVkZWYgc3RydWN0IF9JTUFHRUxJU1REUkFXUEFSQU1TCit7IAorICAgIERXT1JEICAgICAgIGNiU2l6ZTsgCisgICAgSElNQUdFTElTVCAgaGltbDsgCisgICAgSU5UMzIgICAgICAgaTsgCisgICAgSERDMzIgICAgICAgaGRjRHN0OyAKKyAgICBJTlQzMiAgICAgICB4OyAKKyAgICBJTlQzMiAgICAgICB5OyAKKyAgICBJTlQzMiAgICAgICBjeDsgCisgICAgSU5UMzIgICAgICAgY3k7IAorICAgIElOVDMyICAgICAgIHhCaXRtYXA7ICAgICAgICAvLyB4IG9mZmVzdCBmcm9tIHRoZSB1cHBlcmxlZnQgb2YgYml0bWFwIAorICAgIElOVDMyICAgICAgIHlCaXRtYXA7ICAgICAgICAvLyB5IG9mZnNldCBmcm9tIHRoZSB1cHBlcmxlZnQgb2YgYml0bWFwIAorICAgIENPTE9SUkVGICAgIHJnYkJrOyAKKyAgICBDT0xPUlJFRiAgICByZ2JGZzsgCisgICAgVUlOVDMyICAgICAgZlN0eWxlOyAKKyAgICBEV09SRCAgICAgICBkd1JvcDsgCit9IElNQUdFTElTVERSQVdQQVJBTVMsICpMUElNQUdFTElTVERSQVdQQVJBTVM7IAorCisgCiBJTlQzMiAgICAgIFdJTkFQSSBJbWFnZUxpc3RfQWRkKEhJTUFHRUxJU1QsSEJJVE1BUDMyLEhCSVRNQVAzMik7CiBJTlQzMiAgICAgIFdJTkFQSSBJbWFnZUxpc3RfQWRkTWFza2VkKEhJTUFHRUxJU1QsSEJJVE1BUDMyLENPTE9SUkVGKTsKLQorQk9PTDMyICAgICBXSU5BUEkgSW1hZ2VMaXN0X0JlZ2luRHJhZyhISU1BR0VMSVNULElOVDMyLElOVDMyLElOVDMyKTsKK0JPT0wzMiAgICAgV0lOQVBJIEltYWdlTGlzdF9Db3B5KEhJTUFHRUxJU1QsSU5UMzIsSElNQUdFTElTVCxJTlQzMixJTlQzMik7CiBISU1BR0VMSVNUIFdJTkFQSSBJbWFnZUxpc3RfQ3JlYXRlKElOVDMyLElOVDMyLFVJTlQzMixJTlQzMixJTlQzMik7CiBCT09MMzIgICAgIFdJTkFQSSBJbWFnZUxpc3RfRGVzdHJveShISU1BR0VMSVNUKTsKLQorQk9PTDMyICAgICBXSU5BUEkgSW1hZ2VMaXN0X0RyYWdFbnRlcihIV05EMzIsSU5UMzIsSU5UMzIpOworQk9PTDMyICAgICBXSU5BUEkgSW1hZ2VMaXN0X0RyYWdMZWF2ZShIV05EMzIpOyAKK0JPT0wzMiAgICAgV0lOQVBJIEltYWdlTGlzdF9EcmFnTW92ZShJTlQzMixJTlQzMik7CitCT09MMzIgICAgIFdJTkFQSSBJbWFnZUxpc3RfRHJhZ1Nob3dOb2xvY2sgKEJPT0wzMiBiU2hvdyk7CiBCT09MMzIgICAgIFdJTkFQSSBJbWFnZUxpc3RfRHJhdyhISU1BR0VMSVNULElOVDMyLEhEQzMyLElOVDMyLElOVDMyLFVJTlQzMik7Ci0KK0JPT0wzMiAgICAgV0lOQVBJIEltYWdlTGlzdF9EcmF3RXgoSElNQUdFTElTVCxJTlQzMixIREMzMixJTlQzMixJTlQzMixJTlQzMiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSU5UMzIsQ09MT1JSRUYsQ09MT1JSRUYsVUlOVDMyKTsKK0JPT0wzMiAgICAgV0lOQVBJIEltYWdlTGlzdF9EcmF3SW5kaXJlY3QoSU1BR0VMSVNURFJBV1BBUkFNUyopOyAKK0hJTUFHRUxJU1QgV0lOQVBJIEltYWdlTGlzdF9EdXBsaWNhdGUoSElNQUdFTElTVCk7CitCT09MMzIgICAgIFdJTkFQSSBJbWFnZUxpc3RfRW5kRHJhZyAoVk9JRCk7CiBDT0xPUlJFRiAgIFdJTkFQSSBJbWFnZUxpc3RfR2V0QmtDb2xvcihISU1BR0VMSVNUKTsKLQorSElNQUdFTElTVCBXSU5BUEkgSW1hZ2VMaXN0X0dldERyYWdJbWFnZShQT0lOVDMyKixQT0lOVDMyKik7CitISUNPTjMyICAgIFdJTkFQSSBJbWFnZUxpc3RfR2V0SWNvbihISU1BR0VMSVNULElOVDMyLFVJTlQzMik7CiBCT09MMzIgICAgIFdJTkFQSSBJbWFnZUxpc3RfR2V0SWNvblNpemUoSElNQUdFTElTVCxJTlQzMiosSU5UMzIqKTsKIElOVDMyICAgICAgV0lOQVBJIEltYWdlTGlzdF9HZXRJbWFnZUNvdW50KEhJTUFHRUxJU1QpOwogQk9PTDMyICAgICBXSU5BUEkgSW1hZ2VMaXN0X0dldEltYWdlSW5mbyhISU1BR0VMSVNULElOVDMyLElNQUdFSU5GTyopOwotCitCT09MMzIgICAgIFdJTkFQSSBJbWFnZUxpc3RfR2V0SW1hZ2VSZWN0IChISU1BR0VMSVNULElOVDMyLExQUkVDVDMyKTsKIEhJTUFHRUxJU1QgV0lOQVBJIEltYWdlTGlzdF9Mb2FkSW1hZ2UzMkEoSElOU1RBTkNFMzIsTFBDU1RSLElOVDMyLElOVDMyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDT0xPUlJFRixVSU5UMzIsVUlOVDMyKTsKIEhJTUFHRUxJU1QgV0lOQVBJIEltYWdlTGlzdF9Mb2FkSW1hZ2UzMlcoSElOU1RBTkNFMzIsTFBDV1NUUixJTlQzMixJTlQzMiwKQEAgLTE3NywxNSArMjIzLDIxIEBACiAjZGVmaW5lICAgIEltYWdlTGlzdF9Mb2FkSW1hZ2UgV0lORUxJQl9OQU1FX0FXKEltYWdlTGlzdF9Mb2FkSW1hZ2UpCiBISU1BR0VMSVNUIFdJTkFQSSBJbWFnZUxpc3RfTWVyZ2UoSElNQUdFTElTVCxJTlQzMixISU1BR0VMSVNULElOVDMyLElOVDMyLElOVDMyKTsKIAorQk9PTDMyICAgICBXSU5BUEkgSW1hZ2VMaXN0X1JlbW92ZShISU1BR0VMSVNULElOVDMyKTsKIEJPT0wzMiAgICAgV0lOQVBJIEltYWdlTGlzdF9SZXBsYWNlKEhJTUFHRUxJU1QsSU5UMzIsSEJJVE1BUDMyLEhCSVRNQVAzMik7CiBJTlQzMiAgICAgIFdJTkFQSSBJbWFnZUxpc3RfUmVwbGFjZUljb24oSElNQUdFTElTVCxJTlQzMixISUNPTjMyKTsKIAogQ09MT1JSRUYgICBXSU5BUEkgSW1hZ2VMaXN0X1NldEJrQ29sb3IoSElNQUdFTElTVCxDT0xPUlJFRik7Ci0KK0JPT0wzMiAgICAgV0lOQVBJIEltYWdlTGlzdF9TZXREcmFnQ3Vyc29ySW1hZ2UoSElNQUdFTElTVCxJTlQzMixJTlQzMixJTlQzMik7CitCT09MMzIgICAgIFdJTkFQSSBJbWFnZUxpc3RfU2V0SWNvblNpemUgKEhJTUFHRUxJU1QsSU5UMzIsSU5UMzIpOworQk9PTDMyICAgICBXSU5BUEkgSW1hZ2VMaXN0X1NldEltYWdlQ291bnQgKEhJTUFHRUxJU1QsSU5UMzIpOwogQk9PTDMyICAgICBXSU5BUEkgSW1hZ2VMaXN0X1NldE92ZXJsYXlJbWFnZShISU1BR0VMSVNULElOVDMyLElOVDMyKTsKIAogI2RlZmluZSBJbWFnZUxpc3RfQWRkSWNvbihoaW1sLGhpY29uKSBJbWFnZUxpc3RfUmVwbGFjZUljb24oaGltbCwtMSxoaWNvbikKKyNkZWZpbmUgSW1hZ2VMaXN0X0V4dHJhY3RJY29uKGhpLGhpbWwsaSkgSW1hZ2VMaXN0X0dldEljb24oaGltbCxpLDApCiAjZGVmaW5lIEltYWdlTGlzdF9Mb2FkQml0bWFwKGhpLGxwYm1wLGN4LGNHcm93LGNyTWFzaykgXAogICBJbWFnZUxpc3RfTG9hZEltYWdlKGhpLGxwYm1wLGN4LGNHcm93LGNyTWFzayxJTUFHRV9CSVRNQVAsMCkKKyNkZWZpbmUgSW1hZ2VMaXN0X1JlbW92ZUFsbChoaW1sKSBJbWFnZUxpc3RfUmVtb3ZlKGhpbWwsLTEpCisKIAogI2VuZGlmICAvKiBfX1dJTkVfQ09NTUNUUkxfSCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9jb21tZGxnLmggYi9pbmNsdWRlL2NvbW1kbGcuaAppbmRleCBmMzNhM2FkLi5lNWNhNGY2IDEwMDY0NAotLS0gYS9pbmNsdWRlL2NvbW1kbGcuaAorKysgYi9pbmNsdWRlL2NvbW1kbGcuaApAQCAtMTc0LDcgKzE3NCw4IEBACiAKICNwcmFnbWEgcGFjaygxKQogCi10eXBlZGVmIHN0cnVjdCB7Cit0eXBlZGVmIHN0cnVjdCAKK3sKIAlEV09SRAkJCWxTdHJ1Y3RTaXplOwogCUhXTkQxNgkJCWh3bmRPd25lcjsgICAgICAgICAgLyogY2FsbGVyJ3Mgd2luZG93IGhhbmRsZSAgICovCiAJSERDMTYgICAgICAgICAgCSAgICAgICAgaERDOyAgICAgICAgICAgICAgICAvKiBwcmludGVyIERDL0lDIG9yIE5VTEwgICAgKi8KQEAgLTE5NSw4ICsxOTYsMjcgQEAKIAlzaG9ydAkJCW5TaXplTWluIFdJTkVfUEFDS0VEOyAgIC8qIG1pbmltdW0gcHQgc2l6ZSBhbGxvd2VkICYgKi8KIAlzaG9ydAkJCW5TaXplTWF4IFdJTkVfUEFDS0VEOyAgIC8qIG1heCBwdCBzaXplIGFsbG93ZWQgaWYgICAgKi8KIAkJCQkJCQkvKiBDRl9MSU1JVFNJWkUgaXMgdXNlZCAgICAgICovCi0JfSBDSE9PU0VGT05UOwotdHlwZWRlZiBDSE9PU0VGT05UICpMUENIT09TRUZPTlQ7Cit9IENIT09TRUZPTlQsICpMUENIT09TRUZPTlQ7CisKK3R5cGVkZWYgc3RydWN0Cit7CisJVUlOVDMyICAJbFN0cnVjdFNpemU7IAorCUhXTkQzMiAJCWh3bmRPd25lcjsgCisJSERDMzIgIAkJaERDOyAKKwlMUExPR0ZPTlQzMkEgICAgbHBMb2dGb250OyAKKwlJTlQzMgkJaVBvaW50U2l6ZTsgCisJVUlOVDMyCQlGbGFnczsgCisJQ09MT1JSRUYJcmdiQ29sb3JzOyAKKwlMUEFSQU0JCWxDdXN0RGF0YTsgCisJV05EUFJPQzMyIAlscGZuSG9vazsgCisJTFBDU1RSCQlscFRlbXBsYXRlTmFtZTsgCisJSElOU1RBTkNFMzIJaEluc3RhbmNlOyAKKwlMUFNUUgkJbHBzelN0eWxlOyAKKwlVSU5UMTYJCW5Gb250VHlwZTsgCisJVUlOVDE2CV9fX01JU1NJTkdfQUxJR05NRU5UX187IAorCUlOVDMyICAgCW5TaXplTWluOyAKKwlJTlQzMgkJblNpemVNYXg7IAorfSBDSE9PU0VGT05UMzJBLCAqUENIT09TRUZPTlQzMkE7CiAKICNwcmFnbWEgcGFjayg0KQogCmRpZmYgLS1naXQgYS9pbmNsdWRlL2NvbXBvYmouaCBiL2luY2x1ZGUvY29tcG9iai5oCmluZGV4IGQ1ZjgzM2EuLjY5MjViMWUgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvY29tcG9iai5oCisrKyBiL2luY2x1ZGUvY29tcG9iai5oCkBAIC0yNCw2ICsyNCwxMCBAQAogCiBPTEVTVEFUVVMgV0lOQVBJIFdJTkVfU3RyaW5nRnJvbUNMU0lEKGNvbnN0IENMU0lEICppZCwgTFBTVFIpOwogCitPTEVTVEFUVVMgV0lOQVBJIFN0cmluZ0Zyb21HVUlEMihjb25zdCBSRUZHVUlEICppZCwgTFBPTEVTVFIzMiAqc3RyLCBJTlQzMiBjbWF4KTsKKy8vICNkZWZpbmUgU3RyaW5nRnJvbUdVSUQyIFdJTkVMSUJfTkFNRShTdHJpbmdGcm9tR1VJRDIpCisKKwogI2lmZGVmIElOSVRHVUlECiAjZGVmaW5lIERFRklORV9HVUlEKG5hbWUsIGwsIHcxLCB3MiwgYjEsIGIyLCBiMywgYjQsIGI1LCBiNiwgYjcsIGI4KSBcCiAgICAgICAgIGNvbnN0IEdVSUQgbmFtZSA9XApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9kZWJ1Zy5oIGIvaW5jbHVkZS9kZWJ1Zy5oCmluZGV4IGNkZTE4OTEuLmQ2MDFmZjQgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvZGVidWcuaAorKysgYi9pbmNsdWRlL2RlYnVnLmgKQEAgLTYsOTcgKzYsMTEyIEBACiAKIC8qIERlZmluaXRpb25zIGZvciBjaGFubmVscyBpZGVudGlmaWVycyAqLwogI2RlZmluZSBkYmNoX2FjY2VsIDAKLSNkZWZpbmUgZGJjaF9hc3BpIDEKLSNkZWZpbmUgZGJjaF9hdG9tIDIKLSNkZWZpbmUgZGJjaF9iaXRibHQgMwotI2RlZmluZSBkYmNoX2JpdG1hcCA0Ci0jZGVmaW5lIGRiY2hfY2FyZXQgNQotI2RlZmluZSBkYmNoX2NkYXVkaW8gNgotI2RlZmluZSBkYmNoX2NsYXNzIDcKLSNkZWZpbmUgZGJjaF9jbGlwYm9hcmQgOAotI2RlZmluZSBkYmNoX2NsaXBwaW5nIDkKLSNkZWZpbmUgZGJjaF9jb21ibyAxMAotI2RlZmluZSBkYmNoX2NvbW0gMTEKLSNkZWZpbmUgZGJjaF9jb21tZGxnIDEyCi0jZGVmaW5lIGRiY2hfY29uc29sZSAxMwotI2RlZmluZSBkYmNoX2NydGRsbCAxNAotI2RlZmluZSBkYmNoX2N1cnNvciAxNQotI2RlZmluZSBkYmNoX2RjIDE2Ci0jZGVmaW5lIGRiY2hfZGRlIDE3Ci0jZGVmaW5lIGRiY2hfZGRlbWwgMTgKLSNkZWZpbmUgZGJjaF9kZHJhdyAxOQotI2RlZmluZSBkYmNoX2RpYWxvZyAyMAotI2RlZmluZSBkYmNoX2RsbCAyMQotI2RlZmluZSBkYmNoX2Rvc2ZzIDIyCi0jZGVmaW5lIGRiY2hfZHJpdmVyIDIzCi0jZGVmaW5lIGRiY2hfZHNvdW5kIDI0Ci0jZGVmaW5lIGRiY2hfZWRpdCAyNQotI2RlZmluZSBkYmNoX2V2ZW50IDI2Ci0jZGVmaW5lIGRiY2hfZXhlYyAyNwotI2RlZmluZSBkYmNoX2ZpbGUgMjgKLSNkZWZpbmUgZGJjaF9maXh1cCAyOQotI2RlZmluZSBkYmNoX2ZvbnQgMzAKLSNkZWZpbmUgZGJjaF9nZGkgMzEKLSNkZWZpbmUgZGJjaF9nbG9iYWwgMzIKLSNkZWZpbmUgZGJjaF9ncmFwaGljcyAzMwotI2RlZmluZSBkYmNoX2hlYXAgMzQKLSNkZWZpbmUgZGJjaF9ob29rIDM1Ci0jZGVmaW5lIGRiY2hfaWNvbiAzNgotI2RlZmluZSBkYmNoX2ludCAzNwotI2RlZmluZSBkYmNoX2ludDIxIDM4Ci0jZGVmaW5lIGRiY2hfa2V5IDM5Ci0jZGVmaW5lIGRiY2hfa2V5Ym9hcmQgNDAKLSNkZWZpbmUgZGJjaF9sZHQgNDEKLSNkZWZpbmUgZGJjaF9saXN0Ym94IDQyCi0jZGVmaW5lIGRiY2hfbG9jYWwgNDMKLSNkZWZpbmUgZGJjaF9tY2kgNDQKLSNkZWZpbmUgZGJjaF9tY2lhbmltIDQ1Ci0jZGVmaW5lIGRiY2hfbWNpd2F2ZSA0NgotI2RlZmluZSBkYmNoX21kaSA0NwotI2RlZmluZSBkYmNoX21lbnUgNDgKLSNkZWZpbmUgZGJjaF9tZXNzYWdlIDQ5Ci0jZGVmaW5lIGRiY2hfbWV0YWZpbGUgNTAKLSNkZWZpbmUgZGJjaF9taWRpIDUxCi0jZGVmaW5lIGRiY2hfbW1hdXggNTIKLSNkZWZpbmUgZGJjaF9tbWlvIDUzCi0jZGVmaW5lIGRiY2hfbW1zeXMgNTQKLSNkZWZpbmUgZGJjaF9tbXRpbWUgNTUKLSNkZWZpbmUgZGJjaF9tb2R1bGUgNTYKLSNkZWZpbmUgZGJjaF9tc2cgNTcKLSNkZWZpbmUgZGJjaF9ub25jbGllbnQgNTgKLSNkZWZpbmUgZGJjaF9vbGUgNTkKLSNkZWZpbmUgZGJjaF9wYWxldHRlIDYwCi0jZGVmaW5lIGRiY2hfcHJvZmlsZSA2MQotI2RlZmluZSBkYmNoX3Byb2dyZXNzIDYyCi0jZGVmaW5lIGRiY2hfcHJvcCA2MwotI2RlZmluZSBkYmNoX3JlZyA2NAotI2RlZmluZSBkYmNoX3JlZ2lvbiA2NQotI2RlZmluZSBkYmNoX3JlbGF5IDY2Ci0jZGVmaW5lIGRiY2hfcmVzb3VyY2UgNjcKLSNkZWZpbmUgZGJjaF9zY3JvbGwgNjgKLSNkZWZpbmUgZGJjaF9zZWxlY3RvciA2OQotI2RlZmluZSBkYmNoX3NlbSA3MAotI2RlZmluZSBkYmNoX3NlbmRtc2cgNzEKLSNkZWZpbmUgZGJjaF9zaG0gNzIKLSNkZWZpbmUgZGJjaF9zdGF0aWMgNzMKLSNkZWZpbmUgZGJjaF9zdHJlc3MgNzQKLSNkZWZpbmUgZGJjaF9zdHJpbmcgNzUKLSNkZWZpbmUgZGJjaF90YXNrIDc2Ci0jZGVmaW5lIGRiY2hfdGV4dCA3NwotI2RlZmluZSBkYmNoX3RodW5rIDc4Ci0jZGVmaW5lIGRiY2hfdGltZXIgNzkKLSNkZWZpbmUgZGJjaF90b29saGVscCA4MAotI2RlZmluZSBkYmNoX3R3ZWFrIDgxCi0jZGVmaW5lIGRiY2hfdWl0b29scyA4MgotI2RlZmluZSBkYmNoX3VwZG93biA4MwotI2RlZmluZSBkYmNoX3ZlciA4NAotI2RlZmluZSBkYmNoX3ZpcnR1YWwgODUKLSNkZWZpbmUgZGJjaF92eGQgODYKLSNkZWZpbmUgZGJjaF93aW4gODcKLSNkZWZpbmUgZGJjaF93aW4xNmRydiA4OAotI2RlZmluZSBkYmNoX3dpbjMyIDg5Ci0jZGVmaW5lIGRiY2hfd2luc29jayA5MAotI2RlZmluZSBkYmNoX3gxMSA5MQorI2RlZmluZSBkYmNoX2FkdmFwaSAxCisjZGVmaW5lIGRiY2hfYXNwaSAyCisjZGVmaW5lIGRiY2hfYXRvbSAzCisjZGVmaW5lIGRiY2hfYml0Ymx0IDQKKyNkZWZpbmUgZGJjaF9iaXRtYXAgNQorI2RlZmluZSBkYmNoX2NhcmV0IDYKKyNkZWZpbmUgZGJjaF9jZCA3CisjZGVmaW5lIGRiY2hfY2RhdWRpbyA4CisjZGVmaW5lIGRiY2hfY2xhc3MgOQorI2RlZmluZSBkYmNoX2NsaXBib2FyZCAxMAorI2RlZmluZSBkYmNoX2NsaXBwaW5nIDExCisjZGVmaW5lIGRiY2hfY29tYm8gMTIKKyNkZWZpbmUgZGJjaF9jb21tIDEzCisjZGVmaW5lIGRiY2hfY29tbWRsZyAxNAorI2RlZmluZSBkYmNoX2NvbnNvbGUgMTUKKyNkZWZpbmUgZGJjaF9jcnRkbGwgMTYKKyNkZWZpbmUgZGJjaF9jdXJzb3IgMTcKKyNkZWZpbmUgZGJjaF9kYyAxOAorI2RlZmluZSBkYmNoX2RkZSAxOQorI2RlZmluZSBkYmNoX2RkZW1sIDIwCisjZGVmaW5lIGRiY2hfZGRyYXcgMjEKKyNkZWZpbmUgZGJjaF9kZWJ1ZyAyMgorI2RlZmluZSBkYmNoX2RpYWxvZyAyMworI2RlZmluZSBkYmNoX2RsbCAyNAorI2RlZmluZSBkYmNoX2Rvc2ZzIDI1CisjZGVmaW5lIGRiY2hfZHJpdmVyIDI2CisjZGVmaW5lIGRiY2hfZHNvdW5kIDI3CisjZGVmaW5lIGRiY2hfZWRpdCAyOAorI2RlZmluZSBkYmNoX2V2ZW50IDI5CisjZGVmaW5lIGRiY2hfZXhlYyAzMAorI2RlZmluZSBkYmNoX2ZpbGUgMzEKKyNkZWZpbmUgZGJjaF9maXh1cCAzMgorI2RlZmluZSBkYmNoX2ZvbnQgMzMKKyNkZWZpbmUgZGJjaF9nZGkgMzQKKyNkZWZpbmUgZGJjaF9nbG9iYWwgMzUKKyNkZWZpbmUgZGJjaF9ncmFwaGljcyAzNgorI2RlZmluZSBkYmNoX2hlYXAgMzcKKyNkZWZpbmUgZGJjaF9ob29rIDM4CisjZGVmaW5lIGRiY2hfaWNvbiAzOQorI2RlZmluZSBkYmNoX2ltYWdlbGlzdCA0MAorI2RlZmluZSBkYmNoX2ludCA0MQorI2RlZmluZSBkYmNoX2ludDIxIDQyCisjZGVmaW5lIGRiY2hfaW50MzEgNDMKKyNkZWZpbmUgZGJjaF9rZXkgNDQKKyNkZWZpbmUgZGJjaF9rZXlib2FyZCA0NQorI2RlZmluZSBkYmNoX2xkdCA0NgorI2RlZmluZSBkYmNoX2xpc3Rib3ggNDcKKyNkZWZpbmUgZGJjaF9sb2NhbCA0OAorI2RlZmluZSBkYmNoX21jaSA0OQorI2RlZmluZSBkYmNoX21jaWFuaW0gNTAKKyNkZWZpbmUgZGJjaF9tY2l3YXZlIDUxCisjZGVmaW5lIGRiY2hfbWRpIDUyCisjZGVmaW5lIGRiY2hfbWVudSA1MworI2RlZmluZSBkYmNoX21lc3NhZ2UgNTQKKyNkZWZpbmUgZGJjaF9tZXRhZmlsZSA1NQorI2RlZmluZSBkYmNoX21pZGkgNTYKKyNkZWZpbmUgZGJjaF9tbWF1eCA1NworI2RlZmluZSBkYmNoX21taW8gNTgKKyNkZWZpbmUgZGJjaF9tbXN5cyA1OQorI2RlZmluZSBkYmNoX21tdGltZSA2MAorI2RlZmluZSBkYmNoX21vZHVsZSA2MQorI2RlZmluZSBkYmNoX21wciA2MgorI2RlZmluZSBkYmNoX21zZyA2MworI2RlZmluZSBkYmNoX25vbmNsaWVudCA2NAorI2RlZmluZSBkYmNoX250ZGxsIDY1CisjZGVmaW5lIGRiY2hfb2xlIDY2CisjZGVmaW5lIGRiY2hfcGFsZXR0ZSA2NworI2RlZmluZSBkYmNoX3ByaW50IDY4CisjZGVmaW5lIGRiY2hfcHJvZmlsZSA2OQorI2RlZmluZSBkYmNoX3Byb2dyZXNzIDcwCisjZGVmaW5lIGRiY2hfcHJvcCA3MQorI2RlZmluZSBkYmNoX3JlZyA3MgorI2RlZmluZSBkYmNoX3JlZ2lvbiA3MworI2RlZmluZSBkYmNoX3JlbGF5IDc0CisjZGVmaW5lIGRiY2hfcmVzb3VyY2UgNzUKKyNkZWZpbmUgZGJjaF9zY3JvbGwgNzYKKyNkZWZpbmUgZGJjaF9zZWN1cml0eSA3NworI2RlZmluZSBkYmNoX3NlbGVjdG9yIDc4CisjZGVmaW5lIGRiY2hfc2VtIDc5CisjZGVmaW5lIGRiY2hfc2VuZG1zZyA4MAorI2RlZmluZSBkYmNoX3NoZWxsIDgxCisjZGVmaW5lIGRiY2hfc2htIDgyCisjZGVmaW5lIGRiY2hfc291bmQgODMKKyNkZWZpbmUgZGJjaF9zdGF0aWMgODQKKyNkZWZpbmUgZGJjaF9zdHJlc3MgODUKKyNkZWZpbmUgZGJjaF9zdHJpbmcgODYKKyNkZWZpbmUgZGJjaF90YXNrIDg3CisjZGVmaW5lIGRiY2hfdGV4dCA4OAorI2RlZmluZSBkYmNoX3RocmVhZCA4OQorI2RlZmluZSBkYmNoX3RodW5rIDkwCisjZGVmaW5lIGRiY2hfdGltZXIgOTEKKyNkZWZpbmUgZGJjaF90b29saGVscCA5MgorI2RlZmluZSBkYmNoX3R3ZWFrIDkzCisjZGVmaW5lIGRiY2hfdWl0b29scyA5NAorI2RlZmluZSBkYmNoX3VwZG93biA5NQorI2RlZmluZSBkYmNoX3ZlciA5NgorI2RlZmluZSBkYmNoX3ZpcnR1YWwgOTcKKyNkZWZpbmUgZGJjaF92eGQgOTgKKyNkZWZpbmUgZGJjaF93aW4gOTkKKyNkZWZpbmUgZGJjaF93aW4xNmRydiAxMDAKKyNkZWZpbmUgZGJjaF93aW4zMiAxMDEKKyNkZWZpbmUgZGJjaF93aW5nIDEwMgorI2RlZmluZSBkYmNoX3dpbnNvY2sgMTAzCisjZGVmaW5lIGRiY2hfd25ldCAxMDQKKyNkZWZpbmUgZGJjaF94MTEgMTA1CisjZGVmaW5lIGRiY2hfeDExZHJ2IDEwNgogLyogRGVmaW5pdGlvbnMgZm9yIGNsYXNzZXMgaWRlbnRpZmllcnMgKi8KICNkZWZpbmUgZGJjbF9maXhtZSAwCiAjZGVmaW5lIGRiY2xfZXJyIDEKZGlmZiAtLWdpdCBhL2luY2x1ZGUvZGVidWdkZWZzLmggYi9pbmNsdWRlL2RlYnVnZGVmcy5oCmluZGV4IDkzZjUwOTYuLjYxODljZjUgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvZGVidWdkZWZzLmgKKysrIGIvaW5jbHVkZS9kZWJ1Z2RlZnMuaApAQCAtNCw3ICs0LDcgQEAKICNpbmNsdWRlICJkZWJ1Z3Rvb2xzLmgiCiAjZW5kaWYKIAotI2RlZmluZSBERUJVR19DSEFOTkVMX0NPVU5UIDkyCisjZGVmaW5lIERFQlVHX0NIQU5ORUxfQ09VTlQgMTA3CiAjaWZkZWYgREVCVUdfUlVOVElNRQogc2hvcnQgZGVidWdfbXNnX2VuYWJsZWRbXVtERUJVR19DTEFTU19DT1VOVF0gPSB7CiB7MSwgMSwgMCwgMH0sCkBAIC05OSwxNCArOTksMzEgQEAKIHsxLCAxLCAwLCAwfSwKIHsxLCAxLCAwLCAwfSwKIHsxLCAxLCAwLCAwfSwKK3sxLCAxLCAwLCAwfSwKK3sxLCAxLCAwLCAwfSwKK3sxLCAxLCAwLCAwfSwKK3sxLCAxLCAwLCAwfSwKK3sxLCAxLCAwLCAwfSwKK3sxLCAxLCAwLCAwfSwKK3sxLCAxLCAwLCAwfSwKK3sxLCAxLCAwLCAwfSwKK3sxLCAxLCAwLCAwfSwKK3sxLCAxLCAwLCAwfSwKK3sxLCAxLCAwLCAwfSwKK3sxLCAxLCAwLCAwfSwKK3sxLCAxLCAwLCAwfSwKK3sxLCAxLCAwLCAwfSwKK3sxLCAxLCAwLCAwfSwKIH07CiBjb25zdCBjaGFyKiBkZWJ1Z19jaF9uYW1lW10gPSB7CiAiYWNjZWwiLAorImFkdmFwaSIsCiAiYXNwaSIsCiAiYXRvbSIsCiAiYml0Ymx0IiwKICJiaXRtYXAiLAogImNhcmV0IiwKKyJjZCIsCiAiY2RhdWRpbyIsCiAiY2xhc3MiLAogImNsaXBib2FyZCIsCkBAIC0xMjEsNiArMTM4LDcgQEAKICJkZGUiLAogImRkZW1sIiwKICJkZHJhdyIsCisiZGVidWciLAogImRpYWxvZyIsCiAiZGxsIiwKICJkb3NmcyIsCkBAIC0xMzgsOCArMTU2LDEwIEBACiAiaGVhcCIsCiAiaG9vayIsCiAiaWNvbiIsCisiaW1hZ2VsaXN0IiwKICJpbnQiLAogImludDIxIiwKKyJpbnQzMSIsCiAia2V5IiwKICJrZXlib2FyZCIsCiAibGR0IiwKQEAgLTE1OCwxMCArMTc4LDEzIEBACiAibW1zeXMiLAogIm1tdGltZSIsCiAibW9kdWxlIiwKKyJtcHIiLAogIm1zZyIsCiAibm9uY2xpZW50IiwKKyJudGRsbCIsCiAib2xlIiwKICJwYWxldHRlIiwKKyJwcmludCIsCiAicHJvZmlsZSIsCiAicHJvZ3Jlc3MiLAogInByb3AiLApAQCAtMTcwLDE1ICsxOTMsMTkgQEAKICJyZWxheSIsCiAicmVzb3VyY2UiLAogInNjcm9sbCIsCisic2VjdXJpdHkiLAogInNlbGVjdG9yIiwKICJzZW0iLAogInNlbmRtc2ciLAorInNoZWxsIiwKICJzaG0iLAorInNvdW5kIiwKICJzdGF0aWMiLAogInN0cmVzcyIsCiAic3RyaW5nIiwKICJ0YXNrIiwKICJ0ZXh0IiwKKyJ0aHJlYWQiLAogInRodW5rIiwKICJ0aW1lciIsCiAidG9vbGhlbHAiLApAQCAtMTkxLDggKzIxOCwxMSBAQAogIndpbiIsCiAid2luMTZkcnYiLAogIndpbjMyIiwKKyJ3aW5nIiwKICJ3aW5zb2NrIiwKKyJ3bmV0IiwKICJ4MTEiLAorIngxMWRydiIsCiB9OwogY29uc3QgY2hhciogZGVidWdfY2xfbmFtZVtdID0gewogImZpeG1lIiwKZGlmZiAtLWdpdCBhL2luY2x1ZGUvZGVidWd0b29scy5oIGIvaW5jbHVkZS9kZWJ1Z3Rvb2xzLmgKaW5kZXggYjEzMzgwOS4uOGRlYzRhYyAxMDA2NDQKLS0tIGEvaW5jbHVkZS9kZWJ1Z3Rvb2xzLmgKKysrIGIvaW5jbHVkZS9kZWJ1Z3Rvb2xzLmgKQEAgLTMsMTAgKzMsMTAgQEAKICNkZWZpbmUgX19XSU5FX0RFQlVHVE9PTFNfSAogCiAjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlICJkZWJ1Z3N0ci5oIgogCiAjZGVmaW5lIERFQlVHX1JVTlRJTUUKLSNkZWZpbmUgc3RkZGViICBzdGRvdXQKLSNkZWZpbmUgc3RkbmltcCBzdGRvdXQKKyNkZWZpbmUgc3RkZGViICBzdGRlcnIKIAogI2RlZmluZSBERUJVR19DTEFTU19DT1VOVCA0CiAKQEAgLTMxLDggKzMxLDcgQEAKICAgKGRiZ19jaF9pbmRleChjaCkgPj0wICYmIGRiZ19jbF9pbmRleChjbCkgPj0gMCAmJiBcCiAgICBkZWJ1Z19tc2dfZW5hYmxlZFtkYmdfY2hfaW5kZXgoY2gpXVtkYmdfY2xfaW5kZXgoY2wpXSkKIAotI2RlZmluZSBEUFJJTlRGKGZvcm1hdCwgYXJncy4uLikgXAotICBmcHJpbnRmKHN0ZGRlYiwgZm9ybWF0LCAjIyBhcmdzKQorI2RlZmluZSBEUFJJTlRGKGZvcm1hdCwgYXJncy4uLikgZnByaW50ZihzdGRkZWIsIGZvcm1hdCwgIyMgYXJncykKIAogI2RlZmluZSBEUFJJTlRGXyhjbCwgY2gsIGZvcm1hdCwgYXJncy4uLikgXAogICBpZighREVCVUdHSU5HKGNsLCBjaCkpIDsgXApAQCAtNDMsNiArNDIsOSBAQAogI2RlZmluZSBGSVhNRShjaCwgZm10LCBhcmdzLi4uKSBEUFJJTlRGXyhmaXhtZSwgY2gsIGZtdCwgIyMgYXJncykKICNkZWZpbmUgRVJSKGNoLCBmbXQsIGFyZ3MuLi4pICAgRFBSSU5URl8oZXJyLCBjaCwgZm10LCAjIyBhcmdzKQogCisjZGVmaW5lIERVTVAoZm9ybWF0LCBhcmdzLi4uKSAgIERQUklOVEYoZm9ybWF0LCAjIyBhcmdzKQorI2RlZmluZSBNU0coZm9ybWF0LCBhcmdzLi4uKSAgICBmcHJpbnRmKHN0ZGVyciwgZm9ybWF0LCAjIyBhcmdzKQorCiAjZGVmaW5lIEZJWE1FX09OKGNoKSAgREVCVUdHSU5HKGZpeG1lLCBjaCkKICNkZWZpbmUgRVJSX09OKGNoKSAgICBERUJVR0dJTkcoZXJyLCBjaCkKICNkZWZpbmUgV0FSTl9PTihjaCkgICBERUJVR0dJTkcod2FybiwgY2gpCmRpZmYgLS1naXQgYS9pbmNsdWRlL2hlYXAuaCBiL2luY2x1ZGUvaGVhcC5oCmluZGV4IDgyZjI2ZTIuLjJhZDMwOTggMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvaGVhcC5oCisrKyBiL2luY2x1ZGUvaGVhcC5oCkBAIC00NCw0ICs0NCwyNiBAQAogLyogVXNlIHRoaXMgb25lIG9ubHkgd2hlbiB5b3Ugb3duIHRoZSBsb2NrISAqLwogI2RlZmluZSBTWVNURU1fTE9DS19DT1VOVCgpIChIRUFQX1N5c3RlbUxvY2stPlJlY3Vyc2lvbkNvdW50KQogCisKK3R5cGVkZWYgc3RydWN0Cit7CisgICAgTFBWT0lEIGxwRGF0YTsKKyAgICBEV09SRCBjYkRhdGE7CisgICAgQllURSBjYk92ZXJoZWFkOworICAgIEJZVEUgaVJlZ2lvbkluZGV4OworICAgIFdPUkQgd0ZsYWdzOworICAgIHVuaW9uIHsKKyAgICAgICAgc3RydWN0IHsKKyAgICAgICAgICAgIEhBTkRMRTMyIGhNZW07CisgICAgICAgICAgICBEV09SRCBkd1Jlc2VydmVkWzNdOworICAgICAgICB9IEJsb2NrOworICAgICAgICBzdHJ1Y3QgeworICAgICAgICAgICAgRFdPUkQgZHdDb21taXR0ZWRTaXplOworICAgICAgICAgICAgRFdPUkQgZHdVbkNvbW1pdHRlZFNpemU7CisgICAgICAgICAgICBMUFZPSUQgbHBGaXJzdEJsb2NrOworICAgICAgICAgICAgTFBWT0lEIGxwTGFzdEJsb2NrOworICAgICAgICB9IFJlZ2lvbjsKKyAgICB9IEZvbzsKK30gUFJPQ0VTU19IRUFQX0VOVFJZLCAqTFBQUk9DRVNTX0hFQVBfRU5UUlk7CisKICNlbmRpZiAgLyogX19XSU5FX0hFQVBfSCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9pbWFnZWxpc3QuaCBiL2luY2x1ZGUvaW1hZ2VsaXN0LmgKaW5kZXggODkxMzIyYi4uMzYyY2U0YiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9pbWFnZWxpc3QuaAorKysgYi9pbmNsdWRlL2ltYWdlbGlzdC5oCkBAIC05LDIwICs5LDI0IEBACiAgCiBzdHJ1Y3QgX0lNQUdFTElTVAogewotICAgIEhBTkRMRTMyICBoSGVhcDsKICAgICBIQklUTUFQMzIgaGJtSW1hZ2U7CiAgICAgSEJJVE1BUDMyIGhibU1hc2s7CisgICAgSEJSVVNIMzIgIGhicnVzaEJsZW5kMjU7CisgICAgSEJSVVNIMzIgIGhicnVzaEJsZW5kNTA7CiAgICAgQ09MT1JSRUYgIGNsckJrOworICAgIElOVDMyICAgICBjSW5pdGlhbDsKICAgICBJTlQzMiAgICAgY0dyb3c7CiAgICAgSU5UMzIgICAgIGNNYXhJbWFnZTsKICAgICBJTlQzMiAgICAgY0N1ckltYWdlOwogICAgIElOVDMyICAgICBjeDsKICAgICBJTlQzMiAgICAgY3k7CiAgICAgVUlOVDMyICAgIGZsYWdzOwotICAgIElOVDMyICAgICBuT3ZsSWR4WzRdOworICAgIFVJTlQzMiAgICB1Qml0c1BpeGVsOworICAgIElOVDMyICAgICBuT3ZsSWR4WzE1XTsKIH07CiAgCiB0eXBlZGVmIHN0cnVjdCBfSU1BR0VMSVNUICpISU1BR0VMSVNUOwogIAogIAogI2VuZGlmICAvKiBfX1dJTkVfSU1BR0VMSVNUX0ggKi8KKwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9tZXRhZmlsZWRydi5oIGIvaW5jbHVkZS9tZXRhZmlsZWRydi5oCmluZGV4IGU4OWQwOTEuLmI4MmFjOTggMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbWV0YWZpbGVkcnYuaAorKysgYi9pbmNsdWRlL21ldGFmaWxlZHJ2LmgKQEAgLTksNiArOSw3IEBACiAjaW5jbHVkZSAiZ2RpLmgiCiAKIC8qIEZJWE1FOiBTREsgZG9jcyBzYXlzIHRoZXNlIHNob3VsZCBiZSAxIGFuZCAyICovCisvKiAgRFIgOTgwMzIyOiBtb3N0IHdtZidzIGhhdmUgMSwgc28gSSB0aGluayAwIGFuZCAxIGlzIGNvcnJlY3QgKi8KICNkZWZpbmUgTUVUQUZJTEVfTUVNT1JZIDAKICNkZWZpbmUgTUVUQUZJTEVfRElTSyAgIDEKIApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9tbXN5c3RlbS5oIGIvaW5jbHVkZS9tbXN5c3RlbS5oCmluZGV4IGJlMjlmNWYuLmYyOTMxNzYgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbW1zeXN0ZW0uaAorKysgYi9pbmNsdWRlL21tc3lzdGVtLmgKQEAgLTQ4MSw2ICs0ODEsOCBAQAogI2RlZmluZSBNT01fQ0xPU0UgICAgICAgTU1fTU9NX0NMT1NFCiAjZGVmaW5lIE1PTV9ET05FICAgICAgICBNTV9NT01fRE9ORQogCisvKiBkZXZpY2UgSUQgZm9yIE1JREkgbWFwcGVyICovCisKICNkZWZpbmUgTUlESU1BUFBFUiAgICAgKC0xKQogI2RlZmluZSBNSURJX01BUFBFUiAgICAoLTEpCiAKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbXVsdGltZWRpYS5oIGIvaW5jbHVkZS9tdWx0aW1lZGlhLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGM2MjA3MAotLS0gL2Rldi9udWxsCisrKyBiL2luY2x1ZGUvbXVsdGltZWRpYS5oCkBAIC0wLDAgKzEsODEgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IDE5OTgsIEx1aXogT3RhdmlvIEwuIFpvcnplbGxhCisgKgorICogRmlsZTogICAgICBtdWx0aW1lZGlhLmgKKyAqIFB1cnBvc2U6ICAgbXVsdGltZWRpYSBkZWNsYXJhdGlvbnMKKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqLworI2lmbmRlZiBfX1dJTkVfTVVMVElNRURJQV9IIAorI2RlZmluZSBfX1dJTkVfTVVMVElNRURJQV9ICisKKyNpbmNsdWRlICJtbXN5c3RlbS5oIgorCisjZGVmaW5lIE1BWF9NSURJSU5EUlYgCSgxKQorLyogRm9yIG5vdyBJJ20gbWFraW5nIDE2IHRoZSBtYXhpbXVtIG51bWJlciBvZiBtaWRpIGRldmljZXMgb25lIGNhbgorICogaGF2ZS4gVGhpcyBzaG91bGQgYmUgbW9yZSB0aGFuIGVub3VnaCBmb3IgZXZlcnlib2R5LiBCdXQgYXMgYSBwdXJpc3QsCisgKiBJIGludGVuZCB0byBtYWtlIGl0IHVuYm91bmRlZCBpbiB0aGUgZnV0dXJlLCBhcyBzb29uIGFzIEkgZmlndXJlCisgKiBhIGdvb2Qgd2F5IHRvIGRvIHNvLgorICovCisjZGVmaW5lIE1BWF9NSURJT1VURFJWIAkoMTYpCisjZGVmaW5lIE1BWF9NQ0lNSURJRFJWIAkoMSkKKworI2lmIGRlZmluZWQgKGxpbnV4KQorI2RlZmluZSBfX0hBU19TT1VORENBUkRfSF9fCisjaW5jbHVkZSA8c3lzL3NvdW5kY2FyZC5oPgorI2VsaWYgZGVmaW5lZCAoX19GcmVlQlNEX18pCisjZGVmaW5lIF9fSEFTX1NPVU5EQ0FSRF9IX18KKyNpbmNsdWRlIDxtYWNoaW5lL3NvdW5kY2FyZC5oPgorI2luY2x1ZGUgPHN5cy9lcnJuby5oPgorI2VuZGlmCisKKyNpZiBkZWZpbmVkIChfX0hBU19TT1VORENBUkRfSF9fKQorCisjZGVmaW5lIE1JRElfREVWICIvZGV2L3NlcXVlbmNlciIKKworI2lmZGVmIFNPVU5EX1ZFUlNJT04KKyNkZWZpbmUgSU9DVEwoYSxiLGMpCQlpb2N0bChhLGIsJmMpCisjZWxzZQorI2RlZmluZSBJT0NUTChhLGIsYykJCShjID0gaW9jdGwoYSxiLGMpICkKKyNlbmRpZgorCit0eXBlZGVmIHN0cnVjdCB7CisJaW50CQl1bml4ZGV2OworCWludAkJc3RhdGU7CisJRFdPUkQJCWJ1ZnNpemU7CisJTUlESU9QRU5ERVNDCW1pZGlEZXNjOworCVdPUkQJCXdGbGFnczsKKwlMUE1JRElIRFIgCWxwUXVldWVIZHI7CisJRFdPUkQJCWR3VG90YWxQbGF5ZWQ7Cit9IExJTlVYX01JRElJTjsKKwordHlwZWRlZiBzdHJ1Y3QgeworCWludAkJdW5peGRldjsKKwlpbnQJCXN0YXRlOworCURXT1JECQlidWZzaXplOworCU1JRElPUEVOREVTQwltaWRpRGVzYzsKKwlXT1JECQl3RmxhZ3M7CisJTFBNSURJSERSIAlscFF1ZXVlSGRyOworCURXT1JECQlkd1RvdGFsUGxheWVkOworfSBMSU5VWF9NSURJT1VUOworCit0eXBlZGVmIHN0cnVjdCB7CisJaW50CW5Vc2VDb3VudDsgICAgICAgICAgLyogSW5jcmVtZW50ZWQgZm9yIGVhY2ggc2hhcmVkIG9wZW4gKi8KKwlCT09MMTYJZlNoYXJlYWJsZTsgICAgICAgICAvKiBUUlVFIGlmIGZpcnN0IG9wZW4gd2FzIHNoYXJlYWJsZSAqLworCVdPUkQJd05vdGlmeURldmljZUlEOyAgICAvKiBNQ0kgZGV2aWNlIElEIHdpdGggYSBwZW5kaW5nIG5vdGlmaWNhdGlvbiAqLworCUhBTkRMRTE2IGhDYWxsYmFjazsgICAgICAgICAvKiBDYWxsYmFjayBoYW5kbGUgZm9yIHBlbmRpbmcgbm90aWZpY2F0aW9uICovCisJSE1NSU8xNgloRmlsZTsJICAgICAgICAgICAgLyogbW1pbyBmaWxlIGhhbmRsZSBvcGVuIGFzIEVsZW1lbnQJCSovCisJRFdPUkQJZHdCZWdpbkRhdGE7CisJRFdPUkQJZHdUb3RhbExlbjsKKwlXT1JECXdGb3JtYXQ7CisJV09SRAluVHJhY2tzOworCVdPUkQJblRlbXBvOworCU1DSV9PUEVOX1BBUk1TMTYgb3BlblBhcm1zOworLyogCU1JRElIRFIJTWlkaUhkcjsgKi8KKwlITE9DQUwxNgloTWlkaUhkcjsKKwlXT1JECWR3U3RhdHVzOworfSBMSU5VWF9NQ0lNSURJOworCisjZW5kaWYKKworI2VuZGlmIC8qIF9fV0lORV9NVUxUSU1FRElBX0ggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvbmVleGUuaCBiL2luY2x1ZGUvbmVleGUuaAppbmRleCBjNWMyNjNmLi5mZjgzMzkwIDEwMDY0NAotLS0gYS9pbmNsdWRlL25lZXhlLmgKKysrIGIvaW5jbHVkZS9uZWV4ZS5oCkBAIC0zMSw5ICszMSw3IEBACiAgICAgV09SRCAgZV9vZW1pZDsgICAgICAvKiAyNDogT0VNIGlkZW50aWZpZXIgKGZvciBlX29lbWluZm8pICovCiAgICAgV09SRCAgZV9vZW1pbmZvOyAgICAvKiAyNjogT0VNIGluZm9ybWF0aW9uOyBlX29lbWlkIHNwZWNpZmljICovCiAgICAgV09SRCAgZV9yZXMyWzEwXTsgICAvKiAyODogUmVzZXJ2ZWQgd29yZHMgKi8KLSAgICBXT1JEICBlX2xmYW5ldzsgICAgIC8qIDNjOiBPZmZzZXQgdG8gZXh0ZW5kZWQgaGVhZGVyICovCi0gICAgV09SRCAgZV94eHg7ICAgICAgICAvKiAzZTogV2luZSBpbnRlcm5hbCBwYWQgKHNvbWUgcHJvZ3JhbXMgZXhwZWN0Ci0gICAgICAgICAgICAgICAgICAgICAgICAgKiAgICAgdGhpcyB0byBiZSAwKSAqLworICAgIERXT1JEIGVfbGZhbmV3OyAgICAgLyogM2M6IE9mZnNldCB0byBleHRlbmRlZCBoZWFkZXIgKi8KIH0gSU1BR0VfRE9TX0hFQURFUiwqTFBJTUFHRV9ET1NfSEVBREVSOwogCiAjZGVmaW5lCUlNQUdFX0RPU19TSUdOQVRVUkUJMHg1QTRECQkvKiBNWiAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9wZWV4ZS5oIGIvaW5jbHVkZS9wZWV4ZS5oCmluZGV4IDc4YWRmM2IuLjg0OGVkOTQgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvcGVleGUuaAorKysgYi9pbmNsdWRlL3BlZXhlLmgKQEAgLTU5LDQxICs1OSw0MiBAQAogCSAqIFN0YW5kYXJkIGZpZWxkcy4KIAkgKi8KIAotCVdPUkQJTWFnaWM7Ci0JQllURQlNYWpvckxpbmtlclZlcnNpb247Ci0JQllURQlNaW5vckxpbmtlclZlcnNpb247Ci0JRFdPUkQJU2l6ZU9mQ29kZTsKLQlEV09SRAlTaXplT2ZJbml0aWFsaXplZERhdGE7Ci0JRFdPUkQJU2l6ZU9mVW5pbml0aWFsaXplZERhdGE7Ci0JRFdPUkQJQWRkcmVzc09mRW50cnlQb2ludDsKLQlEV09SRAlCYXNlT2ZDb2RlOwotCURXT1JECUJhc2VPZkRhdGE7CisJV09SRAlNYWdpYzsJCQkJLyogMDAgKi8KKwlCWVRFCU1ham9yTGlua2VyVmVyc2lvbjsJCS8qIDAyICovCisJQllURQlNaW5vckxpbmtlclZlcnNpb247CQkvKiAwMyAqLworCURXT1JECVNpemVPZkNvZGU7CQkJLyogMDQgKi8KKwlEV09SRAlTaXplT2ZJbml0aWFsaXplZERhdGE7CQkvKiAwOCAqLworCURXT1JECVNpemVPZlVuaW5pdGlhbGl6ZWREYXRhOwkvKiAwQyAqLworCURXT1JECUFkZHJlc3NPZkVudHJ5UG9pbnQ7CQkvKiAxMCAqLworCURXT1JECUJhc2VPZkNvZGU7CQkJLyogMTQgKi8KKwlEV09SRAlCYXNlT2ZEYXRhOwkJCS8qIDE4ICovCiAKIAkvKgogCSAqIE5UIGFkZGl0aW9uYWwgZmllbGRzLgogCSAqLwogCi0JRFdPUkQJSW1hZ2VCYXNlOwotCURXT1JECVNlY3Rpb25BbGlnbm1lbnQ7Ci0JRFdPUkQJRmlsZUFsaWdubWVudDsKLQlXT1JECU1ham9yT3BlcmF0aW5nU3lzdGVtVmVyc2lvbjsKLQlXT1JECU1pbm9yT3BlcmF0aW5nU3lzdGVtVmVyc2lvbjsKLQlXT1JECU1ham9ySW1hZ2VWZXJzaW9uOwotCVdPUkQJTWlub3JJbWFnZVZlcnNpb247Ci0JV09SRAlNYWpvclN1YnN5c3RlbVZlcnNpb247Ci0JV09SRAlNaW5vclN1YnN5c3RlbVZlcnNpb247Ci0JRFdPUkQJUmVzZXJ2ZWQxOwotCURXT1JECVNpemVPZkltYWdlOwotCURXT1JECVNpemVPZkhlYWRlcnM7Ci0JRFdPUkQJQ2hlY2tTdW07Ci0JV09SRAlTdWJzeXN0ZW07Ci0JV09SRAlEbGxDaGFyYWN0ZXJpc3RpY3M7Ci0JRFdPUkQJU2l6ZU9mU3RhY2tSZXNlcnZlOwotCURXT1JECVNpemVPZlN0YWNrQ29tbWl0OwotCURXT1JECVNpemVPZkhlYXBSZXNlcnZlOwotCURXT1JECVNpemVPZkhlYXBDb21taXQ7Ci0JRFdPUkQJTG9hZGVyRmxhZ3M7Ci0JRFdPUkQJTnVtYmVyT2ZSdmFBbmRTaXplczsKKwlEV09SRAlJbWFnZUJhc2U7CQkJLyogMUMgKi8KKwlEV09SRAlTZWN0aW9uQWxpZ25tZW50OwkJLyogMjAgKi8KKwlEV09SRAlGaWxlQWxpZ25tZW50OwkJCS8qIDI0ICovCisJV09SRAlNYWpvck9wZXJhdGluZ1N5c3RlbVZlcnNpb247CS8qIDI4ICovCisJV09SRAlNaW5vck9wZXJhdGluZ1N5c3RlbVZlcnNpb247CS8qIDJBICovCisJV09SRAlNYWpvckltYWdlVmVyc2lvbjsJCS8qIDJDICovCisJV09SRAlNaW5vckltYWdlVmVyc2lvbjsJCS8qIDJFICovCisJV09SRAlNYWpvclN1YnN5c3RlbVZlcnNpb247CQkvKiAzMCAqLworCVdPUkQJTWlub3JTdWJzeXN0ZW1WZXJzaW9uOwkJLyogMzIgKi8KKwlEV09SRAlSZXNlcnZlZDE7CQkJLyogMzQgKi8KKwlEV09SRAlTaXplT2ZJbWFnZTsJCQkvKiAzOCAqLworCURXT1JECVNpemVPZkhlYWRlcnM7CQkJLyogM0MgKi8KKwlEV09SRAlDaGVja1N1bTsJCQkvKiA0MCAqLworCVdPUkQJU3Vic3lzdGVtOwkJCS8qIDQ0ICovCisJV09SRAlEbGxDaGFyYWN0ZXJpc3RpY3M7CQkvKiA0NiAqLworCURXT1JECVNpemVPZlN0YWNrUmVzZXJ2ZTsJCS8qIDQ4ICovCisJRFdPUkQJU2l6ZU9mU3RhY2tDb21taXQ7CQkvKiA0QyAqLworCURXT1JECVNpemVPZkhlYXBSZXNlcnZlOwkJLyogNTAgKi8KKwlEV09SRAlTaXplT2ZIZWFwQ29tbWl0OwkJLyogNTQgKi8KKwlEV09SRAlMb2FkZXJGbGFnczsJCQkvKiA1OCAqLworCURXT1JECU51bWJlck9mUnZhQW5kU2l6ZXM7CQkvKiA1QyAqLworCQkJCQkJLyogNjA6ICovCiAJSU1BR0VfREFUQV9ESVJFQ1RPUlkgRGF0YURpcmVjdG9yeVtJTUFHRV9OVU1CRVJPRl9ESVJFQ1RPUllfRU5UUklFU107CiB9IElNQUdFX09QVElPTkFMX0hFQURFUiwqTFBJTUFHRV9PUFRJT05BTF9IRUFERVI7CiAKQEAgLTE0MCw5ICsxNDEsOSBAQAogI2RlZmluZQlJTUFHRV9TVUJTWVNURU1fUE9TSVhfQ1VJCTcKIAogdHlwZWRlZiBzdHJ1Y3QgX0lNQUdFX05UX0hFQURFUlMgewotCURXT1JECQkJU2lnbmF0dXJlOwotCUlNQUdFX0ZJTEVfSEVBREVSCUZpbGVIZWFkZXI7Ci0JSU1BR0VfT1BUSU9OQUxfSEVBREVSCU9wdGlvbmFsSGVhZGVyOworCURXT1JECQkJU2lnbmF0dXJlOwkvKiAwMDogUEVcMFwwICovCisJSU1BR0VfRklMRV9IRUFERVIJRmlsZUhlYWRlcjsJLyogMDQ6IEZpbGVoZWFkZXIgKi8KKwlJTUFHRV9PUFRJT05BTF9IRUFERVIJT3B0aW9uYWxIZWFkZXI7CS8qIDE4OiBPcHRpb25hbCBIZWFkZXIgKi8KIH0gSU1BR0VfTlRfSEVBREVSUywqTFBJTUFHRV9OVF9IRUFERVJTOwogCiAKQEAgLTE2MSwxOSArMTYyLDIwIEBACiAjZGVmaW5lCUlNQUdFX1NJWkVPRl9TSE9SVF9OQU1FCTgKIAogdHlwZWRlZiBzdHJ1Y3QgX0lNQUdFX1NFQ1RJT05fSEVBREVSIHsKLQlCWVRFCU5hbWVbSU1BR0VfU0laRU9GX1NIT1JUX05BTUVdOworCUJZVEUJTmFtZVtJTUFHRV9TSVpFT0ZfU0hPUlRfTkFNRV07CS8qIDAwOiAqLwogCXVuaW9uIHsKLQkJRFdPUkQJUGh5c2ljYWxBZGRyZXNzOwotCQlEV09SRAlWaXJ0dWFsU2l6ZTsKKwkJRFdPUkQJUGh5c2ljYWxBZGRyZXNzOwkvKiAwNDogKi8KKwkJRFdPUkQJVmlydHVhbFNpemU7CQkvKiAwNDogKi8KIAl9IE1pc2M7Ci0JRFdPUkQJVmlydHVhbEFkZHJlc3M7Ci0JRFdPUkQJU2l6ZU9mUmF3RGF0YTsKLQlEV09SRAlQb2ludGVyVG9SYXdEYXRhOwotCURXT1JECVBvaW50ZXJUb1JlbG9jYXRpb25zOwotCURXT1JECVBvaW50ZXJUb0xpbmVudW1iZXJzOwotCVdPUkQJTnVtYmVyT2ZSZWxvY2F0aW9uczsKLQlXT1JECU51bWJlck9mTGluZW51bWJlcnM7Ci0JRFdPUkQJQ2hhcmFjdGVyaXN0aWNzOworCURXT1JECVZpcnR1YWxBZGRyZXNzOwkJCS8qIDA4OiAqLworCURXT1JECVNpemVPZlJhd0RhdGE7CQkJLyogMEM6ICovCisJRFdPUkQJUG9pbnRlclRvUmF3RGF0YTsJCS8qIDEwOiAqLworCURXT1JECVBvaW50ZXJUb1JlbG9jYXRpb25zOwkJLyogMTQ6ICovCisJRFdPUkQJUG9pbnRlclRvTGluZW51bWJlcnM7CQkvKiAxODogKi8KKwlXT1JECU51bWJlck9mUmVsb2NhdGlvbnM7CQkvKiAxQzogKi8KKwlXT1JECU51bWJlck9mTGluZW51bWJlcnM7CQkvKiAxRTogKi8KKwlEV09SRAlDaGFyYWN0ZXJpc3RpY3M7CQkvKiAyMDogKi8KKwkJCQkJCS8qIDI0OiAqLwogfSBJTUFHRV9TRUNUSU9OX0hFQURFUiwqTFBJTUFHRV9TRUNUSU9OX0hFQURFUjsKIAogI2RlZmluZQlJTUFHRV9TSVpFT0ZfU0VDVElPTl9IRUFERVIgNDAKZGlmZiAtLWdpdCBhL2luY2x1ZGUvdmVyc2lvbi5oIGIvaW5jbHVkZS92ZXJzaW9uLmgKaW5kZXggOGY1MjAyYS4uNGZjYWNmNiAxMDA2NDQKLS0tIGEvaW5jbHVkZS92ZXJzaW9uLmgKKysrIGIvaW5jbHVkZS92ZXJzaW9uLmgKQEAgLTEgKzEgQEAKLSNkZWZpbmUgV0lORV9SRUxFQVNFX0lORk8gIldpbmUgcmVsZWFzZSA5ODAzMTUiCisjZGVmaW5lIFdJTkVfUkVMRUFTRV9JTkZPICJXaW5lIHJlbGVhc2UgOTgwMzI5IgpkaWZmIC0tZ2l0IGEvaW5jbHVkZS93aW5kb3dzLmggYi9pbmNsdWRlL3dpbmRvd3MuaAppbmRleCA1OTQ0ZjgzLi4yMWJmMjdkIDEwMDY0NAotLS0gYS9pbmNsdWRlL3dpbmRvd3MuaAorKysgYi9pbmNsdWRlL3dpbmRvd3MuaApAQCAtODE3LDYgKzgxNyw4IEBACiAjZGVmaW5lIElESUdOT1JFICAgICAgICAgICAgNQogI2RlZmluZSBJRFlFUyAgICAgICAgICAgICAgIDYKICNkZWZpbmUgSUROTyAgICAgICAgICAgICAgICA3CisjZGVmaW5lIElEQ0xPU0UgICAgICAgICAgICAgOAorI2RlZmluZSBJREhFTFAgICAgICAgICAgICAgIDkgICAgICAKIAogCiB0eXBlZGVmIHN0cnVjdApAQCAtMjQ5NSw2ICsyNDk3LDkgQEAKICNkZWZpbmUgSURDX1NJWkVORVNXICAgICBNQUtFSU5UUkVTT1VSQ0UoMzI2NDMpCiAjZGVmaW5lIElEQ19TSVpFV0UgICAgICAgTUFLRUlOVFJFU09VUkNFKDMyNjQ0KQogI2RlZmluZSBJRENfU0laRU5TICAgICAgIE1BS0VJTlRSRVNPVVJDRSgzMjY0NSkKKyNkZWZpbmUgSURDX05PICAgICAgICAgICBNQUtFSU5UUkVTT1VSQ0UoMzI2NDgpCisjZGVmaW5lIElEQ19BUFBTVEFSVElORyAgTUFLRUlOVFJFU09VUkNFKDMyNjUwKQorI2RlZmluZSBJRENfSEVMUCAgICAgICAgIE1BS0VJTlRSRVNPVVJDRSgzMjY1MSkKIAogLyogT0VNIFJlc291cmNlIE9yZGluYWwgTnVtYmVycyAqLwogI2RlZmluZSBPQk1fQ0xPU0UgICAgICAgICAgIDMyNzU0CkBAIC0yNTU5LDYgKzI1NjQsOSBAQAogI2RlZmluZSBPQ1JfU0laRU5TICAgICAgICAgIDMyNjQ1CiAjZGVmaW5lIE9DUl9TSVpFQUxMICAgICAgICAgMzI2NDYKICNkZWZpbmUgT0NSX0lDT0NVUiAgICAgICAgICAzMjY0NworI2RlZmluZSBPQ1JfTk8gICAgICAgICAgICAgIDMyNjQ4CisjZGVmaW5lIE9DUl9BUFBTVEFSVElORyAgICAgMzI2NTAKKyNkZWZpbmUgT0NSX0hFTFAgICAgICAgICAgICAzMjY1MSAgLyogb25seSBkZWZpbmVkIGluIHdpbmUgKi8KIAogI2RlZmluZSBPSUNfU0FNUExFICAgICAgICAgIDMyNTEyCiAjZGVmaW5lIE9JQ19IQU5EICAgICAgICAgICAgMzI1MTMKZGlmZiAtLWdpdCBhL2luY2x1ZGUvd2luc29jay5oIGIvaW5jbHVkZS93aW5zb2NrLmgKaW5kZXggNjNhMTg3OC4uZjhiZjdlZiAxMDA2NDQKLS0tIGEvaW5jbHVkZS93aW5zb2NrLmgKKysrIGIvaW5jbHVkZS93aW5zb2NrLmgKQEAgLTUxOCw3ICs1MTgsOSBAQAogI2RlZmluZSBXU01TR19BU1lOQ19QUk9UT0JZTlVNICAweDAwMjAKICNkZWZpbmUgV1NNU0dfQVNZTkNfU0VSVkJZTkFNRSAgMHgwMTAwCiAjZGVmaW5lIFdTTVNHX0FTWU5DX1NFUlZCWVBPUlQgIDB4MDIwMAotI2RlZmluZSBXU01TR19BU1lOQ19XSU4zMgkweDEwMDAKKyNkZWZpbmUgV1NNU0dfQVNZTkNfUlFNQVNLCTB4MGZmZgorCisjZGVmaW5lIFdTTVNHX1dJTjMyX0FPUAkJMHgxMDAwCiAjZGVmaW5lIFdTTVNHX0RFQURfQU9QCQkweDgwMDAKIAogdHlwZWRlZiBzdHJ1Y3QgX19zb3AJLyogV1NBQXN5bmNTZWxlY3QoKSBjb250cm9sIHN0cnVjdCAqLwpkaWZmIC0tZ2l0IGEvbG9hZGVyL21haW4uYyBiL2xvYWRlci9tYWluLmMKaW5kZXggZDJhNjQyMy4uMzVhYzA1ZCAxMDA2NDQKLS0tIGEvbG9hZGVyL21haW4uYworKysgYi9sb2FkZXIvbWFpbi5jCkBAIC04Miw2ICs4Miw3IEBACiBCT09MMzIgTUFJTl9Vc2VySW5pdCh2b2lkKQogewogICAgIGV4dGVybiBCT09MMzIgV0lER0VUU19Jbml0KHZvaWQpOworICAgIGV4dGVybiBCT09MMzIgTVVMVElNRURJQV9Jbml0KHZvaWQpOwogCiAgICAgaW50IHF1ZXVlU2l6ZTsKIApAQCAtMTM0LDYgKzEzNSw5IEBACiAgICAgLyogSW5pdGlhbGl6ZSBtZW51cyAqLwogICAgIGlmICghTUVOVV9Jbml0KCkpIHJldHVybiBGQUxTRTsKIAorICAgIC8qIEluaXRpYWxpemUgbXVsdGltZWRpYSAqLworICAgIGlmICghTVVMVElNRURJQV9Jbml0KCkpIHJldHVybiBGQUxTRTsKKwogICAgIC8qIENyZWF0ZSBkZXNrdG9wIHdpbmRvdyAqLwogICAgIGlmICghV0lOX0NyZWF0ZURlc2t0b3BXaW5kb3coKSkgcmV0dXJuIEZBTFNFOwogCmRpZmYgLS1naXQgYS9sb2FkZXIvbW9kdWxlLmMgYi9sb2FkZXIvbW9kdWxlLmMKaW5kZXggN2E4ZDU4NS4uNjQ4MjYxMCAxMDA2NDQKLS0tIGEvbG9hZGVyL21vZHVsZS5jCisrKyBiL2xvYWRlci9tb2R1bGUuYwpAQCAtMTE1LDg2ICsxMTUsODYgQEAKICAgICB9CiAKICAgICAgIC8qIER1bXAgdGhlIG1vZHVsZSBpbmZvICovCi0KLSAgICBwcmludGYoICJNb2R1bGUgJTA0eDpcbiIsIGhNb2R1bGUgKTsKLSAgICBwcmludGYoICJjb3VudD0lZCBmbGFncz0lMDR4IGhlYXA9JWQgc3RhY2s9JWRcbiIsCi0gICAgICAgICAgICBwTW9kdWxlLT5jb3VudCwgcE1vZHVsZS0+ZmxhZ3MsCi0gICAgICAgICAgICBwTW9kdWxlLT5oZWFwX3NpemUsIHBNb2R1bGUtPnN0YWNrX3NpemUgKTsKLSAgICBwcmludGYoICJjczppcD0lMDR4OiUwNHggc3M6c3A9JTA0eDolMDR4IGRzPSUwNHggbmIgc2VnPSVkIG1vZHJlZnM9JWRcbiIsCi0gICAgICAgICAgIHBNb2R1bGUtPmNzLCBwTW9kdWxlLT5pcCwgcE1vZHVsZS0+c3MsIHBNb2R1bGUtPnNwLCBwTW9kdWxlLT5kZ3JvdXAsCi0gICAgICAgICAgIHBNb2R1bGUtPnNlZ19jb3VudCwgcE1vZHVsZS0+bW9kcmVmX2NvdW50ICk7Ci0gICAgcHJpbnRmKCAib3NfZmxhZ3M9JWQgc3dhcF9hcmVhPSVkIHZlcnNpb249JTA0eFxuIiwKLSAgICAgICAgICAgIHBNb2R1bGUtPm9zX2ZsYWdzLCBwTW9kdWxlLT5taW5fc3dhcF9hcmVhLAotICAgICAgICAgICAgcE1vZHVsZS0+ZXhwZWN0ZWRfdmVyc2lvbiApOworICAgIERVTVAoICItLS1cbiIgKTsKKyAgICBEVU1QKCAiTW9kdWxlICUwNHg6XG4iLCBoTW9kdWxlICk7CisgICAgRFVNUCggImNvdW50PSVkIGZsYWdzPSUwNHggaGVhcD0lZCBzdGFjaz0lZFxuIiwKKwkgIHBNb2R1bGUtPmNvdW50LCBwTW9kdWxlLT5mbGFncywKKwkgIHBNb2R1bGUtPmhlYXBfc2l6ZSwgcE1vZHVsZS0+c3RhY2tfc2l6ZSApOworICAgIERVTVAoICJjczppcD0lMDR4OiUwNHggc3M6c3A9JTA0eDolMDR4IGRzPSUwNHggbmIgc2VnPSVkIG1vZHJlZnM9JWRcbiIsCisJICBwTW9kdWxlLT5jcywgcE1vZHVsZS0+aXAsIHBNb2R1bGUtPnNzLCBwTW9kdWxlLT5zcCwgcE1vZHVsZS0+ZGdyb3VwLAorCSAgcE1vZHVsZS0+c2VnX2NvdW50LCBwTW9kdWxlLT5tb2RyZWZfY291bnQgKTsKKyAgICBEVU1QKCAib3NfZmxhZ3M9JWQgc3dhcF9hcmVhPSVkIHZlcnNpb249JTA0eFxuIiwKKwkgIHBNb2R1bGUtPm9zX2ZsYWdzLCBwTW9kdWxlLT5taW5fc3dhcF9hcmVhLAorCSAgcE1vZHVsZS0+ZXhwZWN0ZWRfdmVyc2lvbiApOwogICAgIGlmIChwTW9kdWxlLT5mbGFncyAmIE5FX0ZGTEFHU19XSU4zMikKLSAgICAgICAgcHJpbnRmKCAiUEUgbW9kdWxlPSUwOHhcbiIsIHBNb2R1bGUtPm1vZHVsZTMyICk7CisgICAgICAgIERVTVAoICJQRSBtb2R1bGU9JTA4eFxuIiwgcE1vZHVsZS0+bW9kdWxlMzIgKTsKIAogICAgICAgLyogRHVtcCB0aGUgZmlsZSBpbmZvICovCi0KLSAgICBwcmludGYoICJGaWxlbmFtZTogJyVzJ1xuIiwgTkVfTU9EVUxFX05BTUUocE1vZHVsZSkgKTsKKyAgICBEVU1QKCAiLS0tXG4iICk7CisgICAgRFVNUCggIkZpbGVuYW1lOiAnJXMnXG4iLCBORV9NT0RVTEVfTkFNRShwTW9kdWxlKSApOwogCiAgICAgICAvKiBEdW1wIHRoZSBzZWdtZW50IHRhYmxlICovCi0KLSAgICBwcmludGYoICJcblNlZ21lbnQgdGFibGU6XG4iICk7CisgICAgRFVNUCggIi0tLVxuIiApOworICAgIERVTVAoICJTZWdtZW50IHRhYmxlOlxuIiApOwogICAgIHBTZWcgPSBORV9TRUdfVEFCTEUoIHBNb2R1bGUgKTsKICAgICBmb3IgKGkgPSAwOyBpIDwgcE1vZHVsZS0+c2VnX2NvdW50OyBpKyssIHBTZWcrKykKLSAgICAgICAgcHJpbnRmKCAiJTAyeDogcG9zPSVkIHNpemU9JWQgZmxhZ3M9JTA0eCBtaW5zaXplPSVkIHNlbD0lMDR4XG4iLAotICAgICAgICAgICAgICAgIGkgKyAxLCBwU2VnLT5maWxlcG9zLCBwU2VnLT5zaXplLCBwU2VnLT5mbGFncywKLSAgICAgICAgICAgICAgICBwU2VnLT5taW5zaXplLCBwU2VnLT5zZWxlY3RvciApOworICAgICAgICBEVU1QKCAiJTAyeDogcG9zPSVkIHNpemU9JWQgZmxhZ3M9JTA0eCBtaW5zaXplPSVkIHNlbD0lMDR4XG4iLAorCSAgICAgIGkgKyAxLCBwU2VnLT5maWxlcG9zLCBwU2VnLT5zaXplLCBwU2VnLT5mbGFncywKKwkgICAgICBwU2VnLT5taW5zaXplLCBwU2VnLT5zZWxlY3RvciApOwogCiAgICAgICAvKiBEdW1wIHRoZSByZXNvdXJjZSB0YWJsZSAqLwotCi0gICAgcHJpbnRmKCAiXG5SZXNvdXJjZSB0YWJsZTpcbiIgKTsKKyAgICBEVU1QKCAiLS0tXG4iICk7CisgICAgRFVNUCggIlJlc291cmNlIHRhYmxlOlxuIiApOwogICAgIGlmIChwTW9kdWxlLT5yZXNfdGFibGUpCiAgICAgewogICAgICAgICBwd29yZCA9IChXT1JEICopKChCWVRFICopcE1vZHVsZSArIHBNb2R1bGUtPnJlc190YWJsZSk7Ci0gICAgICAgIHByaW50ZiggIkFsaWdubWVudDogJWRcbiIsICpwd29yZCsrICk7CisgICAgICAgIERVTVAoICJBbGlnbm1lbnQ6ICVkXG4iLCAqcHdvcmQrKyApOwogICAgICAgICB3aGlsZSAoKnB3b3JkKQogICAgICAgICB7CiAgICAgICAgICAgICBzdHJ1Y3QgcmVzb3VyY2VfdHlwZWluZm9fcyAqcHRyID0gKHN0cnVjdCByZXNvdXJjZV90eXBlaW5mb19zICopcHdvcmQ7CiAgICAgICAgICAgICBzdHJ1Y3QgcmVzb3VyY2VfbmFtZWluZm9fcyAqcG5hbWUgPSAoc3RydWN0IHJlc291cmNlX25hbWVpbmZvX3MgKikocHRyICsgMSk7Ci0gICAgICAgICAgICBwcmludGYoICJpZD0lMDR4IGNvdW50PSVkXG4iLCBwdHItPnR5cGVfaWQsIHB0ci0+Y291bnQgKTsKKyAgICAgICAgICAgIERVTVAoICJpZD0lMDR4IGNvdW50PSVkXG4iLCBwdHItPnR5cGVfaWQsIHB0ci0+Y291bnQgKTsKICAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBwdHItPmNvdW50OyBpKyssIHBuYW1lKyspCi0gICAgICAgICAgICAgICAgcHJpbnRmKCAib2Zmc2V0PSVkIGxlbj0lZCBpZD0lMDR4XG4iLAotICAgICAgICAgICAgICAgICAgICAgICBwbmFtZS0+b2Zmc2V0LCBwbmFtZS0+bGVuZ3RoLCBwbmFtZS0+aWQgKTsKKyAgICAgICAgICAgICAgICBEVU1QKCAib2Zmc2V0PSVkIGxlbj0lZCBpZD0lMDR4XG4iLAorCQkgICAgICBwbmFtZS0+b2Zmc2V0LCBwbmFtZS0+bGVuZ3RoLCBwbmFtZS0+aWQgKTsKICAgICAgICAgICAgIHB3b3JkID0gKFdPUkQgKilwbmFtZTsKICAgICAgICAgfQogICAgIH0KLSAgICBlbHNlIHByaW50ZiggIk5vbmVcbiIgKTsKKyAgICBlbHNlIERVTVAoICJOb25lXG4iICk7CiAKICAgICAgIC8qIER1bXAgdGhlIHJlc2lkZW50IG5hbWUgdGFibGUgKi8KLQotICAgIHByaW50ZiggIlxuUmVzaWRlbnQtbmFtZSB0YWJsZTpcbiIgKTsKKyAgICBEVU1QKCAiLS0tXG4iICk7CisgICAgRFVNUCggIlJlc2lkZW50LW5hbWUgdGFibGU6XG4iICk7CiAgICAgcHN0ciA9IChjaGFyICopcE1vZHVsZSArIHBNb2R1bGUtPm5hbWVfdGFibGU7CiAgICAgd2hpbGUgKCpwc3RyKQogICAgIHsKLSAgICAgICAgcHJpbnRmKCAiJSouKnM6ICVkXG4iLCAqcHN0ciwgKnBzdHIsIHBzdHIgKyAxLAotICAgICAgICAgICAgICAgICooV09SRCAqKShwc3RyICsgKnBzdHIgKyAxKSApOworICAgICAgICBEVU1QKCAiJSouKnM6ICVkXG4iLCAqcHN0ciwgKnBzdHIsIHBzdHIgKyAxLAorCSAgICAgICooV09SRCAqKShwc3RyICsgKnBzdHIgKyAxKSApOwogICAgICAgICBwc3RyICs9ICpwc3RyICsgMSArIHNpemVvZihXT1JEKTsKICAgICB9CiAKICAgICAgIC8qIER1bXAgdGhlIG1vZHVsZSByZWZlcmVuY2UgdGFibGUgKi8KLQotICAgIHByaW50ZiggIlxuTW9kdWxlIHJlZiB0YWJsZTpcbiIgKTsKKyAgICBEVU1QKCAiLS0tXG4iICk7CisgICAgRFVNUCggIk1vZHVsZSByZWYgdGFibGU6XG4iICk7CiAgICAgaWYgKHBNb2R1bGUtPm1vZHJlZl90YWJsZSkKICAgICB7CiAgICAgICAgIHB3b3JkID0gKFdPUkQgKikoKEJZVEUgKilwTW9kdWxlICsgcE1vZHVsZS0+bW9kcmVmX3RhYmxlKTsKICAgICAgICAgZm9yIChpID0gMDsgaSA8IHBNb2R1bGUtPm1vZHJlZl9jb3VudDsgaSsrLCBwd29yZCsrKQogICAgICAgICB7Ci0JICAgIHByaW50ZiggIiVkOiAlMDR4IC0+ICclcydcbiIsIGksICpwd29yZCwKKwkgICAgRFVNUCggIiVkOiAlMDR4IC0+ICclcydcbiIsIGksICpwd29yZCwKIAkJICAgIE1PRFVMRV9HZXRNb2R1bGVOYW1lKCpwd29yZCkpOwogICAgICAgICB9CiAgICAgfQotICAgIGVsc2UgcHJpbnRmKCAiTm9uZVxuIiApOworICAgIGVsc2UgRFVNUCggIk5vbmVcbiIgKTsKIAogICAgICAgLyogRHVtcCB0aGUgZW50cnkgdGFibGUgKi8KLQotICAgIHByaW50ZiggIlxuRW50cnkgdGFibGU6XG4iICk7CisgICAgRFVNUCggIi0tLVxuIiApOworICAgIERVTVAoICJFbnRyeSB0YWJsZTpcbiIgKTsKICAgICBwc3RyID0gKGNoYXIgKilwTW9kdWxlICsgcE1vZHVsZS0+ZW50cnlfdGFibGU7CiAgICAgb3JkaW5hbCA9IDE7CiAgICAgd2hpbGUgKCpwc3RyKQogICAgIHsKLSAgICAgICAgcHJpbnRmKCAiQnVuZGxlICVkLSVkOiAlMDJ4XG4iLCBvcmRpbmFsLCBvcmRpbmFsICsgKnBzdHIgLSAxLCBwc3RyWzFdKTsKKyAgICAgICAgRFVNUCggIkJ1bmRsZSAlZC0lZDogJTAyeFxuIiwgb3JkaW5hbCwgb3JkaW5hbCArICpwc3RyIC0gMSwgcHN0clsxXSk7CiAgICAgICAgIGlmICghcHN0clsxXSkKICAgICAgICAgewogICAgICAgICAgICAgb3JkaW5hbCArPSAqcHN0cjsKQEAgLTIwNCwzNCArMjA0LDM0IEBACiAgICAgICAgIHsKICAgICAgICAgICAgIHN0cnVjdCBlbnRyeV90YWJfbW92YWJsZV9zICpwZSA9IChzdHJ1Y3QgZW50cnlfdGFiX21vdmFibGVfcyopKHBzdHIrMik7CiAgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgKnBzdHI7IGkrKywgcGUrKykKLSAgICAgICAgICAgICAgICBwcmludGYoICIlZDogJTAyeDolMDR4IChtb3ZlYWJsZSlcbiIsCi0gICAgICAgICAgICAgICAgICAgICAgICBvcmRpbmFsKyssIHBlLT5zZWdfbnVtYmVyLCBwZS0+b2Zmc2V0ICk7CisgICAgICAgICAgICAgICAgRFVNUCggIiVkOiAlMDJ4OiUwNHggKG1vdmVhYmxlKVxuIiwKKwkJICAgICAgb3JkaW5hbCsrLCBwZS0+c2VnX251bWJlciwgcGUtPm9mZnNldCApOwogICAgICAgICAgICAgcHN0ciA9IChjaGFyICopcGU7CiAgICAgICAgIH0KICAgICAgICAgZWxzZSAgLyogZml4ZWQgKi8KICAgICAgICAgewogICAgICAgICAgICAgc3RydWN0IGVudHJ5X3RhYl9maXhlZF9zICpwZSA9IChzdHJ1Y3QgZW50cnlfdGFiX2ZpeGVkX3MqKShwc3RyKzIpOwogICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8ICpwc3RyOyBpKyssIHBlKyspCi0gICAgICAgICAgICAgICAgcHJpbnRmKCAiJWQ6ICUwNHggKGZpeGVkKVxuIiwKLSAgICAgICAgICAgICAgICAgICAgICAgIG9yZGluYWwrKywgcGUtPm9mZnNldFswXSArIChwZS0+b2Zmc2V0WzFdIDw8IDgpICk7CisgICAgICAgICAgICAgICAgRFVNUCggIiVkOiAlMDR4IChmaXhlZClcbiIsCisJCSAgICAgIG9yZGluYWwrKywgcGUtPm9mZnNldFswXSArIChwZS0+b2Zmc2V0WzFdIDw8IDgpICk7CiAgICAgICAgICAgICBwc3RyID0gKGNoYXIgKilwZTsKICAgICAgICAgfQogICAgIH0KIAogICAgIC8qIER1bXAgdGhlIG5vbi1yZXNpZGVudCBuYW1lcyB0YWJsZSAqLwotCi0gICAgcHJpbnRmKCAiXG5Ob24tcmVzaWRlbnQgbmFtZXMgdGFibGU6XG4iICk7CisgICAgRFVNUCggIi0tLVxuIiApOworICAgIERVTVAoICJOb24tcmVzaWRlbnQgbmFtZXMgdGFibGU6XG4iICk7CiAgICAgaWYgKHBNb2R1bGUtPm5ybmFtZV9oYW5kbGUpCiAgICAgewogICAgICAgICBwc3RyID0gKGNoYXIgKilHbG9iYWxMb2NrMTYoIHBNb2R1bGUtPm5ybmFtZV9oYW5kbGUgKTsKICAgICAgICAgd2hpbGUgKCpwc3RyKQogICAgICAgICB7Ci0gICAgICAgICAgICBwcmludGYoICIlKi4qczogJWRcbiIsICpwc3RyLCAqcHN0ciwgcHN0ciArIDEsCisgICAgICAgICAgICBEVU1QKCAiJSouKnM6ICVkXG4iLCAqcHN0ciwgKnBzdHIsIHBzdHIgKyAxLAogICAgICAgICAgICAgICAgICAgICooV09SRCAqKShwc3RyICsgKnBzdHIgKyAxKSApOwogICAgICAgICAgICAgcHN0ciArPSAqcHN0ciArIDEgKyBzaXplb2YoV09SRCk7CiAgICAgICAgIH0KICAgICB9Ci0gICAgcHJpbnRmKCAiXG4iICk7CisgICAgRFVNUCggIlxuIiApOwogfQogCiAKZGlmZiAtLWdpdCBhL2xvYWRlci9uZV9pbWFnZS5jIGIvbG9hZGVyL25lX2ltYWdlLmMKaW5kZXggYzQ3ZmQ0Yy4uM2YwMGUyMiAxMDA2NDQKLS0tIGEvbG9hZGVyL25lX2ltYWdlLmMKKysrIGIvbG9hZGVyL25lX2ltYWdlLmMKQEAgLTI4OSw3ICsyODksNyBAQAogCQllbHNlCiAgICAgICAgICAgICAgICAgICAgICoodW5zaWduZWQgY2hhciopc3AgPSAodW5zaWduZWQgY2hhcikoKGludClhZGRyZXNzICYgMHhGRik7CiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB3aGlsZSAob2Zmc2V0ICE9IDB4ZmZmZiAmJiAhYWRkaXRpdmUpOworICAgICAgICAgICAgd2hpbGUgKG9mZnNldCAmJiBvZmZzZXQgIT0gMHhmZmZmICYmICFhZGRpdGl2ZSk7CiAgICAgICAgICAgICBicmVhazsKIAogCSAgY2FzZSBORV9SQUREUl9PRkZTRVQxNjoKQEAgLTMwMSw3ICszMDEsNyBAQAogCQkqc3AgPSBMT1dPUkQoYWRkcmVzcyk7CiAJCWlmIChhZGRpdGl2ZSkgKnNwICs9IG9mZnNldDsKIAkgICAgfSAKLQkgICAgd2hpbGUgKG9mZnNldCAhPSAweGZmZmYgJiYgIWFkZGl0aXZlKTsKKwkgICAgd2hpbGUgKG9mZnNldCAmJiBvZmZzZXQgIT0gMHhmZmZmICYmICFhZGRpdGl2ZSk7CiAJICAgIGJyZWFrOwogCSAgICAKIAkgIGNhc2UgTkVfUkFERFJfUE9JTlRFUjMyOgpAQCAtMzE0LDcgKzMxNCw3IEBACiAJCWlmIChhZGRpdGl2ZSkgKnNwICs9IG9mZnNldDsKIAkJKihzcCsxKSA9IEhJV09SRChhZGRyZXNzKTsKIAkgICAgfSAKLQkgICAgd2hpbGUgKG9mZnNldCAhPSAweGZmZmYgJiYgIWFkZGl0aXZlKTsKKwkgICAgd2hpbGUgKG9mZnNldCAmJiBvZmZzZXQgIT0gMHhmZmZmICYmICFhZGRpdGl2ZSk7CiAJICAgIGJyZWFrOwogCSAgICAKIAkgIGNhc2UgTkVfUkFERFJfU0VMRUNUT1I6CkBAIC0zMjgsNyArMzI4LDYgQEAKIAkJaWYoYWRkaXRpdmUgJiYgb2Zmc2V0KQogICAgICAgICAJZnByaW50ZihzdGRlcnIsIkFkZGl0aXZlIHNlbGVjdG9yIHRvICU0LjR4LlBsZWFzZSByZXBvcnRcbiIsb2Zmc2V0KTsKIAkgICAgfSAKLSAgICAgICAgICAgIC8qIEZJWE1FOiBRdWlja2VuIDUgaGFzIGEgemVybyBvZmZzZXQgZml4dXAuICBUaGlzIHNlZW1zIHRvIHdvcmsgKi8KIAkgICAgd2hpbGUgKG9mZnNldCAmJiBvZmZzZXQgIT0gMHhmZmZmICYmICFhZGRpdGl2ZSk7CiAJICAgIGJyZWFrOwogCSAgICAKZGlmZiAtLWdpdCBhL2xvYWRlci9uZV9yZXNvdXJjZS5jIGIvbG9hZGVyL25lX3Jlc291cmNlLmMKaW5kZXggMDA1ZjgyOC4uYWJmNjg4YyAxMDA2NDQKLS0tIGEvbG9hZGVyL25lX3Jlc291cmNlLmMKKysrIGIvbG9hZGVyL25lX3Jlc291cmNlLmMKQEAgLTQ1OSw4ICs0NTksOCBAQAogICAgICAgICBwVHlwZUluZm8gPSAoTkVfVFlQRUlORk8gKilwTmFtZUluZm87CiAgICAgfQogCi0gICAgVFJBQ0UocmVzb3VyY2UsICJbJTA0eF06IG5vIGludHJpbnNpYyByZXNvdXJjZSBmb3IgJTA0eFxuIiwgCisgICAgVFJBQ0UocmVzb3VyY2UsICJbJTA0eF06IG5vIGludHJpbnNpYyByZXNvdXJjZSBmb3IgJTA0eCwgYXNzdW1pbmcgRGlyZWN0UmVzQWxsb2MoKSFcbiIsIAogCQkgaE1vZHVsZSwgaGFuZGxlICk7Ci0gICAgR2xvYmFsRnJlZTE2KCBoYW5kbGUgKTsgLyogaXQgY291bGQgaGF2ZSBiZWVuIERpcmVjdFJlc0FsbG9jKCknZWQgKi8KKyAgICBHbG9iYWxGcmVlMTYoIGhhbmRsZSApOyAKICAgICByZXR1cm4gaGFuZGxlOwogfQpkaWZmIC0tZ2l0IGEvbG9hZGVyL3Jlc291cmNlLmMgYi9sb2FkZXIvcmVzb3VyY2UuYwppbmRleCAzMjE5ZDc4Li4yNGQ4N2YyIDEwMDY0NAotLS0gYS9sb2FkZXIvcmVzb3VyY2UuYworKysgYi9sb2FkZXIvcmVzb3VyY2UuYwpAQCAtMjAsOSArMjAsOSBAQAogI2luY2x1ZGUgInRhc2suaCIKICNpbmNsdWRlICJtb2R1bGUuaCIKICNpbmNsdWRlICJyZXNvdXJjZS5oIgotI2luY2x1ZGUgImRlYnVnc3RyLmgiCiAjaW5jbHVkZSAiZGVidWcuaCIKICNpbmNsdWRlICJsaWJyZXMuaCIKKyNpbmNsdWRlICJ3aW5lcnJvci5oIgogCiBleHRlcm4gV09SRCBXSU5FX0xhbmd1YWdlSWQ7CiAKQEAgLTQxNCw2ICs0MTQsNyBAQAogSEFDQ0VMMTYgV0lOQVBJIExvYWRBY2NlbGVyYXRvcnMxNihISU5TVEFOQ0UxNiBpbnN0YW5jZSwgU0VHUFRSIGxwVGFibGVOYW1lKQogewogICAgIEhSU1JDMTYJaFJzcmM7CisgICAgSEFDQ0VMMTYgICAgaEFjY2VsOwogCiAgICAgaWYgKEhJV09SRChscFRhYmxlTmFtZSkpCiAgICAgICAgIFRSQUNFKGFjY2VsLCAiJTA0eCAnJXMnXG4iLApAQCAtNDIyLDggKzQyMywxMiBAQAogICAgICAgICBUUkFDRShhY2NlbCwgIiUwNHggJTA0eFxuIiwKICAgICAgICAgICAgICAgICAgICAgICAgaW5zdGFuY2UsIExPV09SRChscFRhYmxlTmFtZSkgKTsKIAotICAgIGlmICghKGhSc3JjID0gRmluZFJlc291cmNlMTYoIGluc3RhbmNlLCBscFRhYmxlTmFtZSwgUlRfQUNDRUxFUkFUT1IgKSkpCisgICAgaWYgKCEoaFJzcmMgPSBGaW5kUmVzb3VyY2UxNiggaW5zdGFuY2UsIGxwVGFibGVOYW1lLCBSVF9BQ0NFTEVSQVRPUiApKSkgeworICAgICAgV0FSTihhY2NlbCwgImNvdWxkbid0IGZpbmQgYWNjZWxlcmF0b3IgdGFibGUgcmVzb3VyY2VcbiIpOwogICAgICAgcmV0dXJuIDA7CisgICAgfQorCisgICAgVFJBQ0UoYWNjZWwsICJyZXR1cm5pbmcgSEFDQ0VMIDB4JXhcbiIsIGhSc3JjKTsKICAgICByZXR1cm4gTG9hZFJlc291cmNlMTYoaW5zdGFuY2UsaFJzcmMpOwogfQogCkBAIC00MzksMTggKzQ0NCwyNiBAQAogSEFDQ0VMMzIgV0lOQVBJIExvYWRBY2NlbGVyYXRvcnMzMlcoSElOU1RBTkNFMzIgaW5zdGFuY2UsTFBDV1NUUiBscFRhYmxlTmFtZSkKIHsKICAgICBIUlNSQzMyIGhSc3JjOworICAgIEhBQ0NFTDMyIGhSZXR2YWw7CiAKICAgICBpZiAoSElXT1JEKGxwVGFibGVOYW1lKSkKLSAgICAgICAgVFJBQ0UoYWNjZWwsICIlMDR4ICclcydcbiIsCi0gICAgICAgICAgICAgICAgICAgICAgaW5zdGFuY2UsIChjaGFyICopKCBscFRhYmxlTmFtZSApICk7CisgICAgICAgIFRSQUNFKGFjY2VsLCAiJXAgJyVzJ1xuIiwKKyAgICAgICAgICAgICAgICAgICAgICAoTFBWT0lEKWluc3RhbmNlLCAoY2hhciAqKSggbHBUYWJsZU5hbWUgKSApOwogICAgIGVsc2UKLSAgICAgICAgVFJBQ0UoYWNjZWwsICIlMDR4ICUwNHhcbiIsCi0gICAgICAgICAgICAgICAgICAgICAgIGluc3RhbmNlLCBMT1dPUkQobHBUYWJsZU5hbWUpICk7CisgICAgICAgIFRSQUNFKGFjY2VsLCAiJXAgMHglMDR4XG4iLAorICAgICAgICAgICAgICAgICAgICAgICAoTFBWT0lEKWluc3RhbmNlLCBMT1dPUkQobHBUYWJsZU5hbWUpICk7CiAKICAgICBpZiAoIShoUnNyYyA9IEZpbmRSZXNvdXJjZTMyVyggaW5zdGFuY2UsIGxwVGFibGVOYW1lLCAKLQkJKExQQ1dTVFIpUlRfQUNDRUxFUkFUT1IgKSkpCi0gICAgICByZXR1cm4gMDsKLSAgICByZXR1cm4gTG9hZFJlc291cmNlMzIoIGluc3RhbmNlLCBoUnNyYyApOworCQkJCSAgIChMUENXU1RSKVJUX0FDQ0VMRVJBVE9SICkpKSB7CisgICAgICBXQVJOKGFjY2VsLCAiY291bGRuJ3QgZmluZCBhY2NlbGVyYXRvciB0YWJsZSByZXNvdXJjZVxuIik7CisgICAgICBoUmV0dmFsID0gMDsKKyAgICB9CisgICAgZWxzZSB7CisgICAgICBoUmV0dmFsID0gTG9hZFJlc291cmNlMzIoIGluc3RhbmNlLCBoUnNyYyApOworICAgIH0KKworICAgIFRSQUNFKGFjY2VsLCAicmV0dXJuaW5nIEhBQ0NFTCAweCV4XG4iLCBoUnNyYyk7CisgICAgcmV0dXJuIGhSZXR2YWw7CiB9CiAKIEhBQ0NFTDMyIFdJTkFQSSBMb2FkQWNjZWxlcmF0b3JzMzJBKEhJTlNUQU5DRTMyIGluc3RhbmNlLExQQ1NUUiBscFRhYmxlTmFtZSkKQEAgLTQ3MSwyNSArNDg0LDEyOSBAQAogICovCiBJTlQzMiBXSU5BUEkgQ29weUFjY2VsZXJhdG9yVGFibGUzMkEoSEFDQ0VMMzIgc3JjLCBMUEFDQ0VMMzIgZHN0LCBJTlQzMiBlbnRyaWVzKQogewotICBmcHJpbnRmKHN0ZGVyciwiQ29weUFjY2VsZXJhdG9yVGFibGUzMkE6IG5vdCBpbXBsZW1lbnRlZDogJWRcbiIsIGVudHJpZXMpOwotICByZXR1cm4gMDsKKyAgcmV0dXJuIENvcHlBY2NlbGVyYXRvclRhYmxlMzJXKHNyYywgZHN0LCBlbnRyaWVzKTsKIH0KIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqICAgICAgICAgICAgIENvcHlBY2NlbGVyYXRvclRhYmxlMzJXICAgKFVTRVIzMi41OSkKKyAqCisgKiBCeSBtb3J0ZW5lQHB2di5vcmcgOTgwMzIxCiAgKi8KLUlOVDMyIFdJTkFQSSBDb3B5QWNjZWxlcmF0b3JUYWJsZTMyVyhIQUNDRUwzMiBzcmMsIExQQUNDRUwzMiBkc3QsIElOVDMyIGVudHJpZXMpCitJTlQzMiBXSU5BUEkgQ29weUFjY2VsZXJhdG9yVGFibGUzMlcoSEFDQ0VMMzIgc3JjLCBMUEFDQ0VMMzIgZHN0LAorCQkJCSAgICAgSU5UMzIgZW50cmllcykKIHsKLSAgZnByaW50ZihzdGRlcnIsIkNvcHlBY2NlbGVyYXRvclRhYmxlMzJXOiBub3QgaW1wbGVtZW50ZWQ6ICVkXG4iLCBlbnRyaWVzKTsKLSAgcmV0dXJuIDA7CisgIGludCBpOworICBMUEFDQ0VMMzIgYWNjZWwgPSAoTFBBQ0NFTDMyKXNyYzsKKyAgQk9PTDMyIGRvbmUgPSBGQUxTRTsKKworICAvKiBEbyBwYXJhbWV0ZXIgY2hlY2tpbmcgdG8gYXZvaWQgdGhlIGV4cGxvc2lvbnMgYW5kIHRoZSBzY3JlYW1pbmcKKyAgICAgYXMgZmFyIGFzIHBvc3NpYmxlLiAqLworICBpZigoZHN0ICYmIChlbnRyaWVzIDwgMSkpIHx8IChzcmMgPT0gKEhBQ0NFTDMyKU5VTEwpKSB7CisgICAgV0FSTihhY2NlbCwgIkFwcGxpY2F0aW9uIHNlbnQgaW52YWxpZCBwYXJhbWV0ZXJzICglcCAlcCAlZCkuXG4iLAorCSAoTFBWT0lEKXNyYywgKExQVk9JRClkc3QsIGVudHJpZXMpOworICAgIHJldHVybiAwOworICB9CisKKworICBpPTA7CisgIHdoaWxlKCFkb25lKSB7CisgICAgLyogU3BpdCBvdXQgc29tZSBkZWJ1Z2dpbmcgaW5mb3JtYXRpb24uICovCisgICAgVFJBQ0UoYWNjZWwsICJhY2NlbCAlZDogdHlwZSAweCUwMngsIGV2ZW50ICclYycsIElEdmFsIDB4JTA0eC5cbiIsCisJICBpLCBhY2NlbFtpXS5mVmlydCwgYWNjZWxbaV0ua2V5LCBhY2NlbFtpXS5jbWQpOworCisgICAgLyogQ29weSBkYXRhIHRvIHRoZSBkZXN0aW5hdGlvbiBzdHJ1Y3R1cmUgYXJyYXkgKGlmIGRzdCA9PSBOVUxMLAorICAgICAgIHdlJ3JlIGp1c3Qgc3VwcG9zZWQgdG8gY291bnQgdGhlIG51bWJlciBvZiBlbnRyaWVzKS4gKi8KKyAgICBpZihkc3QpIHsKKyAgICAgIG1lbWNweSgmZHN0W2ldLCAmYWNjZWxbaV0sIHNpemVvZihBQ0NFTDMyKSk7CisKKyAgICAgIC8qIENoZWNrIGlmIHdlJ3ZlIHJlYWNoZWQgdGhlIGVuZCBvZiB0aGUgYXBwbGljYXRpb24gc3VwcGxpZWQKKyAgICAgICAgIGFjY2VsZXJhdG9yIHRhYmxlLiAqLworICAgICAgaWYoaSsxID09IGVudHJpZXMpIHsKKwkvKiBUdXJuIG9mZiB0aGUgaGlnaCBvcmRlciBiaXQsIGp1c3QgaW4gY2FzZS4gKi8KKwlkc3RbaV0uZlZpcnQgJj0gMHg3ZjsKKwlkb25lID0gVFJVRTsKKyAgICAgIH0KKyAgICB9CisKKyAgICAvKiBUaGUgaGlnaGVzdCBvcmRlciBiaXQgc2VlbXMgdG8gbWFyayB0aGUgZW5kIG9mIHRoZSBhY2NlbGVyYXRvcgorICAgICAgIHJlc291cmNlIHRhYmxlLiAoPykgKi8KKyAgICBpZigoYWNjZWxbaV0uZlZpcnQgJiAweDgwKSAhPSAwKSBkb25lID0gVFJVRTsKKworICAgIGkrKzsKKyAgfQorCisgIHJldHVybiBpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiAgICAgICAgICAgICAgICAgICAgQ3JlYXRlQWNjZWxlcmF0b3JUYWJsZSAgIChVU0VSMzIuNjQpCisgKgorICogQnkgbW9ydGVuZUBwdnYub3JnIDk4MDMyMQorICovCitIQUNDRUwzMiBXSU5BUEkgQ3JlYXRlQWNjZWxlcmF0b3JUYWJsZTMyQShMUEFDQ0VMMzIgbHBhY2NlbCwgSU5UMzIgY0VudHJpZXMpCit7CisgIEhBQ0NFTDMyIGhBY2NlbDsKKworICAvKiBEbyBwYXJhbWV0ZXIgY2hlY2tpbmcganVzdCBpbiBjYXNlIHNvbWVvbmUncyB0cnlpbmcgdG8gYmUKKyAgICAgZnVubnkuICovCisgIGlmKGNFbnRyaWVzIDwgMSkgeworICAgIFdBUk4oYWNjZWwsICJBcHBsaWNhdGlvbiBzZW50IGludmFsaWQgcGFyYW1ldGVycyAoJXAgJWQpLlxuIiwKKwkgbHBhY2NlbCwgY0VudHJpZXMpOworICAgIFNldExhc3RFcnJvcihFUlJPUl9JTlZBTElEX1BBUkFNRVRFUik7CisgICAgcmV0dXJuIChIQUNDRUwzMilOVUxMOworICB9CisgIEZJWE1FKGFjY2VsLCAic2hvdWxkIGNoZWNrIHRoYXQgdGhlIGFjY2VsZXJhdG9yIGRlc2NyaXB0aW9ucyBhcmUgdmFsaWQsIgorCSIgcmV0dXJuIE5VTEwgYW5kIFNldExhc3RFcnJvcigpIGlmIG5vdC5cbiIpOworCisKKyAgLyogQWxsb2NhdGUgbWVtb3J5IGFuZCBjb3B5IHRoZSB0YWJsZS4gKi8KKyAgaEFjY2VsID0gKEhBQ0NFTDMyKUhlYXBBbGxvYyhHZXRQcm9jZXNzSGVhcCgpLCAwLAorCQkJICAgICAgIGNFbnRyaWVzICogc2l6ZW9mKEFDQ0VMMzIpKTsKKyAgVFJBQ0UoYWNjZWwsICJoYW5kbGUgJXBcbiIsIChMUFZPSUQpaEFjY2VsKTsKKyAgaWYoIWhBY2NlbCkgeworICAgIFdBUk4oYWNjZWwsICJPdXQgb2YgbWVtb3J5LlxuIik7CisgICAgU2V0TGFzdEVycm9yKEVSUk9SX05PVF9FTk9VR0hfTUVNT1JZKTsKKyAgICByZXR1cm4gKEhBQ0NFTDMyKU5VTEw7CisgIH0KKyAgbWVtY3B5KChMUEFDQ0VMMzIpaEFjY2VsLCBscGFjY2VsLCBjRW50cmllcyAqIHNpemVvZihBQ0NFTDMyKSk7CisKKyAgLyogU2V0IHRoZSBlbmQtb2YtdGFibGUgdGVybWluYXRvci4gKi8KKyAgKChMUEFDQ0VMMzIpaEFjY2VsKVtjRW50cmllcy0xXS5mVmlydCB8PSAweDgwOworCisgIFRSQUNFKGFjY2VsLCAiQWxsb2NhdGVkIGFjY2VsZXJhdG9yIGhhbmRsZSAleFxuIiwgaEFjY2VsKTsKKyAgcmV0dXJuIGhBY2NlbDsKIH0KIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqICAgICAgICAgICAgIERlc3Ryb3lBY2NlbGVyYXRvclRhYmxlICAgKFVTRVIzMi4xMzApCisgKgorICogQnkgbW9ydGVuZUBwdnYub3JnIDk4MDMyMQogICovCiBCT09MMzIgV0lOQVBJIERlc3Ryb3lBY2NlbGVyYXRvclRhYmxlKCBIQUNDRUwzMiBoYW5kbGUgKQogewotICBmcHJpbnRmKHN0ZGVyciwiRGVzdHJveUFjY2VsZXJhdG9yVGFibGU6IG5vdCBpbXBsZW1lbnRlZFxuIik7CisgIEZJWE1FKGFjY2VsLCAic3R1YiAoaGFuZGxlIDB4JXgpXG4iLCBoYW5kbGUpOworCisKKyAgLyogV2VpcmQuLiBJIHRob3VnaHQgdGhpcyBzaG91bGQgd29yay4gQWNjb3JkaW5nIHRvIHRoZSBBUEkKKyAgICAgc3BlY2lmaWNhdGlvbiwgRGVzdHJveUFjY2VsZXJhdG9yVGFibGUoKSBzaG91bGQgb25seSBiZSBjYWxsZWQgb24KKyAgICAgSEFDQ0VMMzIncyBtYWRlIGJ5IENyZWF0ZUFjY2VsZXJhdG9yVGFibGUoKSwgYnV0IE1pY3Jvc29mdCBWaXN1YWwKKyAgICAgU3R1ZGlvIDk3IGNhbGxzIHRoaXMgZnVuY3Rpb24gd2l0aCBhIHNlcmllcyBvZiBkaWZmZXJlbnQgaGFuZGxlCisgICAgIHZhbHVlcyB3aXRob3V0IGV2ZXIgY2FsbGluZyBDcmVhdGVBY2NlbGVyYXRvclRhYmxlKCkuIFNvbWV0aGluZworICAgICBpcyB2ZXJ5IGZpc2h5IGluIERlbm1hcmsuLi4gKi8KKyAgLyogVXBkYXRlOiBsb29rcyBsaWtlIHRoZSBjYWxscyB0byB0aGlzIGZ1bmN0aW9uIG1hdGNoZXMgdGhlIGNhbGxzCisgICAgIHRvIExvYWRBY2NlbGVyYXRvcnMoKSBpbiBNJCBWaXN1YWwgU3R1ZGlvLCBleGNlcHQgdGhhdCB0aGUgaGFuZGxlCisgICAgIHZhbHVlcyBhcmUgb2ZmIGJ5IHNvbWUgdmFyaWFibGUgc2l6ZSBmcm9tIHRoZSBIQUNDRUwncyByZXR1cm5lZAorICAgICBmcm9tIExvYWRBY2NlbGVyYXRvcnMoKS4gV1RIPyAqLworICAKKyAgLyogUGFyYW1ldGVyIGNoZWNraW5nIHRvIGF2b2lkIGFueSBlbWJhcmFzc2luZyBzaXR1YXRpb25zLiAqLworLyogICBpZighaGFuZGxlKSB7ICovCisvKiAgICAgV0FSTihhY2NlbCwgIkFwcGxpY2F0aW9uIHNlbnQgTlVMTCBwdHIuXG4iKTsgKi8KKy8qICAgICBTZXRMYXN0RXJyb3IoRVJST1JfSU5WQUxJRF9QQVJBTUVURVIpOyAqLworLyogICAgIHJldHVybiBGQUxTRTsgKi8KKy8qICAgfSAqLworICAKKy8qICAgSGVhcEZyZWUoR2V0UHJvY2Vzc0hlYXAoKSwgMCwgKExQQUNDRUwzMiloYW5kbGUpOyAqLworCiAgIHJldHVybiBUUlVFOwogfQogICAKQEAgLTU4Niw5ICs3MDMsOCBAQAogCWZwcmludGYoc3RkZXJyLCJMb2FkU3RyaW5nIC8vIGFuZCB0cnkgdG8gb2J0YWluIHN0cmluZyAnJXMnXG4iLCBwICsgMSk7CiAjZW5kaWYKICAgICB9Ci0jaWYgMAotICAgIFRSQUNFKHJlc291cmNlLCInJXMnIGNvcGllZCAhXG4iLCBidWZmZXIpOwotI2VuZGlmCisKKyAgICBUUkFDRShyZXNvdXJjZSwiJyVzJyBjb3BpZWQgIVxuIiwgKGNoYXIgKilidWZmZXIpOwogICAgIHJldHVybiBpOwogfQogCmRpZmYgLS1naXQgYS9sb2FkZXIvc2lnbmFsLmMgYi9sb2FkZXIvc2lnbmFsLmMKaW5kZXggZWY4NTBhZC4uOTMxYTQ2MSAxMDA2NDQKLS0tIGEvbG9hZGVyL3NpZ25hbC5jCisrKyBiL2xvYWRlci9zaWduYWwuYwpAQCAtNzQsMTEgKzc0LDEwIEBACiB9CiAjZW5kaWYgLyogbGludXggJiYgX19pMzg2X18gKi8KIAotCiAvKiBTaWduYWwgc3RhY2sgKi8KIAogc3RhdGljIGNoYXIgU0lHTkFMX1N0YWNrWzE2Mzg0XTsKLQorc3RhdGljIHNpZ3NldF90IGFzeW5jX3NpZ25hbF9zZXQ7CiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKiAgICAgICAgICAgICAgU0lHTkFMX2NoaWxkCkBAIC0xNTUsNiArMTU0LDggQEAKIHsKICAgICBleHRlcm4gdm9pZCBTWU5DX1NldHVwU2lnbmFscyh2b2lkKTsKIAorICAgIHNpZ2VtcHR5c2V0KCZhc3luY19zaWduYWxfc2V0KTsKKwogI2lmIGRlZmluZWQoX19OZXRCU0RfXykgfHwgZGVmaW5lZChfX0ZyZWVCU0RfXykgfHwgZGVmaW5lZChfX09wZW5CU0RfXykgfHwgZGVmaW5lZCAoX19zdnI0X18pIHx8IGRlZmluZWQoX1NDT19EUykKICAgICBzdHJ1Y3Qgc2lnYWx0c3RhY2sgc3M7CiAgICAgc3Muc3Nfc3AgICAgPSBTSUdOQUxfU3RhY2s7CkBAIC0xNjksMTEgKzE3MCwxOSBAQAogICAgIAogICAgIFNJR05BTF9TZXRIYW5kbGVyKCBTSUdDSExELCAodm9pZCAoKikoKSlTSUdOQUxfY2hpbGQsIDEpOwogI2lmZGVmIENPTkZJR19JUEMKKyAgICBzaWdhZGRzZXQoJmFzeW5jX3NpZ25hbF9zZXQsIFNJR1VTUjIpOwogICAgIFNJR05BTF9TZXRIYW5kbGVyKCBTSUdVU1IyLCAodm9pZCAoKikoKSlzdG9wX3dhaXQsIDEpOyAJLyogRm9yIElQQyAqLwogI2VuZGlmCiAjaWZkZWYgU0lHSU8KKyAgICBzaWdhZGRzZXQoJmFzeW5jX3NpZ25hbF9zZXQsIFNJR0lPKTsKICAgICBTSUdOQUxfU2V0SGFuZGxlciggU0lHSU8sICAgKHZvaWQgKCopKCkpV0lOU09DS19zaWdpbywgMCk7IAogI2VuZGlmCisKKyAgICBzaWdhZGRzZXQoJmFzeW5jX3NpZ25hbF9zZXQsIFNJR0FMUk0pOworCisgICAgLyogaWdub3JlIFNJR1BJUEUgc28gdGhhdCBXSU5TT0NLIGNhbiBnZXQgYSBFUElQRSBlcnJvciBpbnN0ZWFkICAqLworICAgIHNpZ25hbCAoU0lHUElQRSwgU0lHX0lHTik7CisKICAgICBTWU5DX1NldHVwU2lnbmFscygpOwogICAgIHJldHVybiBUUlVFOwogfQpAQCAtMTg0LDEzICsxOTMsNiBAQAogICovCiB2b2lkIFNJR05BTF9NYXNrQXN5bmNFdmVudHMoIEJPT0wzMiBmbGFnICkKIHsKLSAgc2lnc2V0X3QgCXNldDsKLSAgc2lnZW1wdHlzZXQoJnNldCk7Ci0jaWZkZWYgU0lHSU8KLSAgc2lnYWRkc2V0KCZzZXQsIFNJR0lPKTsKLSNlbmRpZgotI2lmZGVmIENPTkZJR19JUEMKLSAgc2lnYWRkc2V0KCZzZXQsIFNJR1VTUjIpOwotI2VuZGlmCi0gIHNpZ3Byb2NtYXNrKCAoZmxhZykgPyBTSUdfQkxPQ0sgOiBTSUdfVU5CTE9DSyAsICZzZXQsIE5VTEwpOworICBzaWdwcm9jbWFzayggKGZsYWcpID8gU0lHX0JMT0NLIDogU0lHX1VOQkxPQ0sgLCAmYXN5bmNfc2lnbmFsX3NldCwgTlVMTCk7CiB9CisKZGlmZiAtLWdpdCBhL2xvYWRlci90YXNrLmMgYi9sb2FkZXIvdGFzay5jCmluZGV4IGJkYTQ2MjYuLjMxMjE4YjYgMTAwNjQ0Ci0tLSBhL2xvYWRlci90YXNrLmMKKysrIGIvbG9hZGVyL3Rhc2suYwpAQCAtNDg2LDcgKzQ4Niw3IEBACiAgICAgbWVtc2V0KCBwVGFzay0+cGRiLmZpbGVIYW5kbGVzLCAweGZmLCBzaXplb2YocFRhc2stPnBkYi5maWxlSGFuZGxlcykgKTsKICAgICBwVGFzay0+cGRiLmVudmlyb25tZW50ICAgID0gaEVudmlyb25tZW50OwogICAgIHBUYXNrLT5wZGIubmJGaWxlcyAgICAgICAgPSAyMDsKLSAgICBsc3RyY3B5bjMyQSggcFRhc2stPnBkYi5jbWRMaW5lLCBjbWRMaW5lLCAxMjcgKTsKKyAgICBsc3RyY3B5bjMyQSggcFRhc2stPnBkYi5jbWRMaW5lLCBjbWRMaW5lLCBzaXplb2YocFRhc2stPnBkYi5jbWRMaW5lKSApOwogCiAgICAgICAvKiBHZXQgdGhlIGNvbXBhdGliaWxpdHkgZmxhZ3MgKi8KIApAQCAtODM5LDcgKzgzOSw3IEBACiAgICAgICAgICAqIGVzOmJ4ICBwb2ludGVyIHRvIGNvbW1hbmQtbGluZSBpbnNpZGUgUFNQCiAgICAgICAgICAqLwogICAgICAgICBFQVhfcmVnKGNvbnRleHQpID0gMTsKLSAgICAgICAgRUJYX3JlZyhjb250ZXh0KSA9IDB4ODE7CisgICAgICAgIEVCWF9yZWcoY29udGV4dCkgPSBwVGFzay0+cGRiLmNtZExpbmVbMF0gPyAweDgxIDogMHg4MDsKICAgICAgICAgRUNYX3JlZyhjb250ZXh0KSA9IHBNb2R1bGUtPnN0YWNrX3NpemU7CiAgICAgICAgIEVEWF9yZWcoY29udGV4dCkgPSBwVGFzay0+bkNtZFNob3c7CiAgICAgICAgIEVTSV9yZWcoY29udGV4dCkgPSAoRFdPUkQpcFRhc2stPmhQcmV2SW5zdGFuY2U7CkBAIC0xMDA1LDcgKzEwMDUsOCBAQAogewogICAgIEJZVEUgKnRodW5rLCpsZnVuYzsKICAgICBTRUdQVFIgdGh1bmthZGRyOwotICAgIAorCisgICAgaWYgKCFoSW5zdGFuY2UpIHJldHVybiAwOwogICAgIGlmIChfX3dpbmVsaWIpIHJldHVybiBmdW5jOyAvKiBmdW5jIGNhbiBiZSBjYWxsZWQgZGlyZWN0bHkgaW4gV2luZWxpYiAqLwogICAgIHRodW5rYWRkciA9IFRBU0tfQWxsb2NUaHVuayggaEN1cnJlbnRUYXNrICk7CiAgICAgaWYgKCF0aHVua2FkZHIpIHJldHVybiAoRkFSUFJPQzE2KTA7CkBAIC0xMzU4LDggKzEzNTksOCBAQAogV09SRCBXSU5BUEkgU2V0U2lnSGFuZGxlciggRkFSUFJPQzE2IG5ld2hhbmRsZXIsIEZBUlBST0MxNiogb2xkaGFuZGxlciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVJTlQxNiAqb2xkbW9kZSwgVUlOVDE2IG5ld21vZGUsIFVJTlQxNiBmbGFnICkKIHsKLSAgICBmcHJpbnRmKHN0ZG5pbXAsIlNldFNpZ0hhbmRsZXIoJXAsJXAsJXAsJWQsJWQpLCB1bmltcGxlbWVudGVkLlxuIiwKLSAgICAgICAgICAgIG5ld2hhbmRsZXIsb2xkaGFuZGxlcixvbGRtb2RlLG5ld21vZGUsZmxhZyApOworICAgIEZJWE1FKHRhc2ssIiglcCwlcCwlcCwlZCwlZCksIHVuaW1wbGVtZW50ZWQuXG4iLAorCSAgbmV3aGFuZGxlcixvbGRoYW5kbGVyLG9sZG1vZGUsbmV3bW9kZSxmbGFnICk7CiAKICAgICBpZiAoZmxhZyAhPSAxKSByZXR1cm4gMDsKICAgICBpZiAoIW5ld21vZGUpIG5ld2hhbmRsZXIgPSBOVUxMOyAgLyogRGVmYXVsdCBoYW5kbGVyICovCmRpZmYgLS1naXQgYS9tZW1vcnkvYXRvbS5jIGIvbWVtb3J5L2F0b20uYwppbmRleCBkYzgyMTYyLi42ZGE5Njk0IDEwMDY0NAotLS0gYS9tZW1vcnkvYXRvbS5jCisrKyBiL21lbW9yeS9hdG9tLmMKQEAgLTQyLDkgKzQyLDE4IEBACiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICogICAgICAgICAgIEFUT01fSW5pdFRhYmxlCisgKgorICogTk9URVMKKyAqCVNob3VsZCB0aGlzIHZhbGlkYXRlIHRoZSB2YWx1ZSBvZiBlbnRyaWVzIHRvIGJlIDAgPCB4IDwgMHgzZmZmPworICoKKyAqIFJFVFVSTlMKKyAqCUhhbmRsZTogU3VjY2VzcworICoJMDogRmFpbHVyZQogICovCi1zdGF0aWMgSEFORExFMTYgQVRPTV9Jbml0VGFibGUoIFdPUkQgc2VsZWN0b3IsIFdPUkQgZW50cmllcyApCi17CitzdGF0aWMgSEFORExFMTYgQVRPTV9Jbml0VGFibGUoCisgICAgICAgICAgICAgICAgV09SRCBzZWxlY3RvciwgLyogW2luXSBTZWdtZW50ICovCisgICAgICAgICAgICAgICAgV09SRCBlbnRyaWVzICAgLyogW2luXSBTaXplIG9mIGF0b20gdGFibGUgKi8KKykgewogICAgIGludCBpOwogICAgIEhBTkRMRTE2IGhhbmRsZTsKICAgICBBVE9NVEFCTEUgKnRhYmxlOwpAQCAtODEsOSArOTAsMTUgQEAKICAqCiAgKiBSZXR1cm4gYSBwb2ludGVyIHRvIHRoZSBhdG9tIHRhYmxlIG9mIGEgZ2l2ZW4gc2VnbWVudCwgY3JlYXRpbmcKICAqIGl0IGlmIG5lY2Vzc2FyeS4KKyAqCisgKiBSRVRVUk5TCisgKglQb2ludGVyIHRvIHRhYmxlOiBTdWNjZXNzCisgKglOVUxMOiBGYWlsdXJlCiAgKi8KLXN0YXRpYyBBVE9NVEFCTEUgKiBBVE9NX0dldFRhYmxlKCBXT1JEIHNlbGVjdG9yLCBCT09MMzIgY3JlYXRlICkKLXsKK3N0YXRpYyBBVE9NVEFCTEUgKkFUT01fR2V0VGFibGUoCisgICAgICAgICAgICAgICAgICBXT1JEIHNlbGVjdG9yLCAvKiBbaW5dIFNlZ21lbnQgKi8KKyAgICAgICAgICAgICAgICAgIEJPT0wzMiBjcmVhdGUgIC8qIFtpbl0gQ3JlYXRlICovCispIHsKICAgICBJTlNUQU5DRURBVEEgKnB0ciA9IChJTlNUQU5DRURBVEEgKilQVFJfU0VHX09GRl9UT19MSU4oIHNlbGVjdG9yLCAwICk7CiAgICAgaWYgKCFwdHItPmF0b210YWJsZSkKICAgICB7CkBAIC0xMDEsMTcgKzExNiwyNCBAQAogICoKICAqIE1ha2UgYW4gQVRPTUVOVFJZIHBvaW50ZXIgZnJvbSBhIGhhbmRsZSAob2J0YWluZWQgZnJvbSBHZXRBdG9tSGFuZGxlKCkpLgogICovCi1zdGF0aWMgQVRPTUVOVFJZICogQVRPTV9NYWtlUHRyKCBXT1JEIHNlbGVjdG9yLCBIQU5ETEUxNiBoYW5kbGUgKQoteworc3RhdGljIEFUT01FTlRSWSAqQVRPTV9NYWtlUHRyKAorICAgICAgICAgICAgICAgICAgV09SRCBzZWxlY3RvciwgIC8qIFtpbl0gU2VnbWVudCAqLworICAgICAgICAgICAgICAgICAgSEFORExFMTYgaGFuZGxlIC8qIFtpbl0gSGFuZGxlICovCispIHsKICAgICByZXR1cm4gKEFUT01FTlRSWSAqKVBUUl9TRUdfT0ZGX1RPX0xJTiggc2VsZWN0b3IsIGhhbmRsZSApOwogfQogCiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICogICAgICAgICAgIEFUT01fSGFzaAorICogUkVUVVJOUworICoJVGhlIGhhc2ggdmFsdWUgZm9yIHRoZSBpbnB1dCBzdHJpbmcKICAqLwotc3RhdGljIFdPUkQgQVRPTV9IYXNoKCBXT1JEIGVudHJpZXMsIExQQ1NUUiBzdHIsIFdPUkQgbGVuICkKLXsKK3N0YXRpYyBXT1JEIEFUT01fSGFzaCgKKyAgICAgICAgICAgIFdPUkQgZW50cmllcywgLyogW2luXSBUb3RhbCBudW1iZXIgb2YgZW50cmllcyAqLworICAgICAgICAgICAgTFBDU1RSIHN0ciwgICAvKiBbaW5dIFBvaW50ZXIgdG8gc3RyaW5nIHRvIGhhc2ggKi8KKyAgICAgICAgICAgIFdPUkQgbGVuICAgICAgLyogW2luXSBMZW5ndGggb2Ygc3RyaW5nICovCispIHsKICAgICBXT1JEIGksIGhhc2ggPSAwOwogCiAgICAgZm9yIChpID0gMDsgaSA8IGxlbjsgaSsrKSBoYXNoIF49IHRvdXBwZXIoc3RyW2ldKSArIGk7CkBAIC0xMjEsOSArMTQzLDE1IEBACiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICogICAgICAgICAgIEFUT01fQWRkQXRvbQorICoKKyAqIFJFVFVSTlMKKyAqCUF0b206IFN1Y2Nlc3MKKyAqCTA6IEZhaWx1cmUKICAqLwotc3RhdGljIEFUT00gQVRPTV9BZGRBdG9tKCBXT1JEIHNlbGVjdG9yLCBMUENTVFIgc3RyICkKLXsKK3N0YXRpYyBBVE9NIEFUT01fQWRkQXRvbSgKKyAgICAgICAgICAgIFdPUkQgc2VsZWN0b3IsIC8qIFtpbl0gU2VnbWVudCAqLworICAgICAgICAgICAgTFBDU1RSIHN0ciAgICAgLyogW2luXSBQb2ludGVyIHRvIHRoZSBzdHJpbmcgdG8gYWRkICovCispIHsKICAgICBXT1JEIGhhc2g7CiAgICAgSEFORExFMTYgZW50cnk7CiAgICAgQVRPTUVOVFJZICogZW50cnlQdHI7CkBAIC0xNjMsOSArMTkxLDE0IEBACiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICogICAgICAgICAgIEFUT01fRGVsZXRlQXRvbQorICogUkVUVVJOUworICoJMDogU3VjY2VzcworICoJQXRvbTogRmFpbHVyZQogICovCi1zdGF0aWMgQVRPTSBBVE9NX0RlbGV0ZUF0b20oIFdPUkQgc2VsZWN0b3IsIEFUT00gYXRvbSApCi17CitzdGF0aWMgQVRPTSBBVE9NX0RlbGV0ZUF0b20oCisgICAgICAgICAgICBXT1JEIHNlbGVjdG9yLCAvKiBbaW5dIFNlZ21lbnQgKi8KKyAgICAgICAgICAgIEFUT00gYXRvbSAgICAgIC8qIFtpbl0gQXRvbSB0byBkZWxldGUgKi8KKykgewogICAgIEFUT01FTlRSWSAqIGVudHJ5UHRyOwogICAgIEFUT01UQUJMRSAqIHRhYmxlOwogICAgIEhBTkRMRTE2IGVudHJ5LCAqcHJldkVudHJ5OwpAQCAtMTk5LDkgKzIzMiwxNCBAQAogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqICAgICAgICAgICBBVE9NX0ZpbmRBdG9tCisgKiBSRVRVUk5TCisgKglBdG9tOiBTdWNjZXNzCisgKgkwOiBGYWlsdXJlCiAgKi8KLXN0YXRpYyBBVE9NIEFUT01fRmluZEF0b20oIFdPUkQgc2VsZWN0b3IsIExQQ1NUUiBzdHIgKQoteworc3RhdGljIEFUT00gQVRPTV9GaW5kQXRvbSgKKyAgICAgICAgICAgIFdPUkQgc2VsZWN0b3IsIC8qIFtpbl0gU2VnbWVudCAqLworICAgICAgICAgICAgTFBDU1RSIHN0ciAgICAgLyogW2luXSBQb2ludGVyIHRvIHN0cmluZyB0byBmaW5kICovCispIHsKICAgICBBVE9NVEFCTEUgKiB0YWJsZTsKICAgICBXT1JEIGhhc2g7CiAgICAgSEFORExFMTYgZW50cnk7CkBAIC0yMjYsMTAgKzI2NCwxNiBAQAogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqICAgICAgICAgICBBVE9NX0dldEF0b21OYW1lCisgKiBSRVRVUk5TCisgKglMZW5ndGggb2Ygc3RyaW5nIGNvcGllZCB0byBidWZmZXI6IFN1Y2Nlc3MKKyAqCTA6IEZhaWx1cmUKICAqLwotc3RhdGljIFVJTlQzMiBBVE9NX0dldEF0b21OYW1lKCBXT1JEIHNlbGVjdG9yLCBBVE9NIGF0b20sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExQU1RSIGJ1ZmZlciwgSU5UMzIgY291bnQgKQoteworc3RhdGljIFVJTlQzMiBBVE9NX0dldEF0b21OYW1lKAorICAgICAgICAgICAgICBXT1JEIHNlbGVjdG9yLCAvKiBbaW5dICBTZWdtZW50ICovCisgICAgICAgICAgICAgIEFUT00gYXRvbSwgICAgIC8qIFtpbl0gIEF0b20gaWRlbnRpZmllciAqLworICAgICAgICAgICAgICBMUFNUUiBidWZmZXIsICAvKiBbb3V0XSBQb2ludGVyIHRvIGJ1ZmZlciBmb3IgYXRvbSBzdHJpbmcgKi8KKyAgICAgICAgICAgICAgSU5UMzIgY291bnQgICAgLyogW2luXSAgU2l6ZSBvZiBidWZmZXIgKi8KKykgewogICAgIEFUT01UQUJMRSAqIHRhYmxlOwogICAgIEFUT01FTlRSWSAqIGVudHJ5UHRyOwogICAgIEhBTkRMRTE2IGVudHJ5OwpAQCAtMzAyLDE1ICszNDYsMjMgQEAKIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKiAgICAgICAgICAgQWRkQXRvbTMyQSAgIChLRVJORUwzMi4wKQorICogQWRkcyBhIHN0cmluZyB0byB0aGUgYXRvbSB0YWJsZSBhbmQgcmV0dXJucyB0aGUgYXRvbSBpZGVudGlmeWluZyB0aGUKKyAqIHN0cmluZy4KKyAqCisgKiBSRVRVUk5TCisgKglBdG9tOiBTdWNjZXNzCisgKgkwOiBGYWlsdXJlCiAgKi8KLUFUT00gV0lOQVBJIEFkZEF0b20zMkEoIExQQ1NUUiBzdHIgKQoteworQVRPTSBXSU5BUEkgQWRkQXRvbTMyQSgKKyAgICAgICAgICAgIExQQ1NUUiBzdHIgLyogW2luXSBQb2ludGVyIHRvIHN0cmluZyB0byBhZGQgKi8KKykgewogICAgIHJldHVybiBHbG9iYWxBZGRBdG9tMzJBKCBzdHIgKTsgIC8qIEZJWE1FICovCiB9CiAKIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKiAgICAgICAgICAgQWRkQXRvbTMyVyAgIChLRVJORUwzMi4xKQorICogU2VlIEFkZEF0b20zMkEKICAqLwogQVRPTSBXSU5BUEkgQWRkQXRvbTMyVyggTFBDV1NUUiBzdHIgKQogewpAQCAtMzI5LDkgKzM4MSwxNiBAQAogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqICAgICAgICAgICBEZWxldGVBdG9tMzIgICAoS0VSTkVMMzIuNjkpCisgKiBEZWNyZW1lbnRzIHRoZSByZWZlcmVuY2UgY291bnQgb2YgYSBzdHJpbmcgYXRvbS4gIElmIGNvdW50IGJlY29tZXMKKyAqIHplcm8sIHRoZSBzdHJpbmcgYXNzb2NpYXRlZCB3aXRoIHRoZSBhdG9tIGlzIHJlbW92ZWQgZnJvbSB0aGUgdGFibGUuCisgKgorICogUkVUVVJOUworICoJMDogU3VjY2VzcworICoJQXRvbTogRmFpbHVyZQogICovCi1BVE9NIFdJTkFQSSBEZWxldGVBdG9tMzIoIEFUT00gYXRvbSApCi17CitBVE9NIFdJTkFQSSBEZWxldGVBdG9tMzIoCisgICAgICAgICAgICBBVE9NIGF0b20gLyogW2luXSBBdG9tIHRvIGRlbGV0ZSAqLworKSB7CiAgICAgcmV0dXJuIEdsb2JhbERlbGV0ZUF0b20oIGF0b20gKTsgIC8qIEZJWE1FICovCiB9CiAKQEAgLTM0OCwxNSArNDA3LDIzIEBACiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICogICAgICAgICAgIEZpbmRBdG9tMzJBICAgKEtFUk5FTDMyLjExNykKKyAqIFNlYXJjaGVzIHRoZSBsb2NhbCBhdG9tIHRhYmxlIGZvciB0aGUgc3RyaW5nIGFuZCByZXR1cm5zIHRoZSBhdG9tCisgKiBhc3NvY2lhdGVkIHdpdGggdGhhdCBzdHJpbmcuCisgKgorICogUkVUVVJOUworICoJQXRvbTogU3VjY2VzcworICoJMDogRmFpbHVyZQogICovCi1BVE9NIFdJTkFQSSBGaW5kQXRvbTMyQSggTFBDU1RSIHN0ciApCi17CitBVE9NIFdJTkFQSSBGaW5kQXRvbTMyQSgKKyAgICAgICAgICAgIExQQ1NUUiBzdHIgLyogW2luXSBQb2ludGVyIHRvIHN0cmluZyB0byBmaW5kICovCispIHsKICAgICByZXR1cm4gR2xvYmFsRmluZEF0b20zMkEoIHN0ciApOyAgLyogRklYTUUgKi8KIH0KIAogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqICAgICAgICAgICBGaW5kQXRvbTMyVyAgIChLRVJORUwzMi4xMTgpCisgKiBTZWUgRmluZEF0b20zMkEKICAqLwogQVRPTSBXSU5BUEkgRmluZEF0b20zMlcoIExQQ1dTVFIgc3RyICkKIHsKQEAgLTM3NSwxNSArNDQyLDI0IEBACiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICogICAgICAgICAgIEdldEF0b21OYW1lMzJBICAgKEtFUk5FTDMyLjE0OSkKKyAqIFJldHJpZXZlcyBhIGNvcHkgb2YgdGhlIHN0cmluZyBhc3NvY2lhdGVkIHdpdGggdGhlIGF0b20uCisgKgorICogUkVUVVJOUworICoJTGVuZ3RoIG9mIHN0cmluZzogU3VjY2VzcworICoJMDogRmFpbHVyZQogICovCi1VSU5UMzIgV0lOQVBJIEdldEF0b21OYW1lMzJBKCBBVE9NIGF0b20sIExQU1RSIGJ1ZmZlciwgSU5UMzIgY291bnQgKQoteworVUlOVDMyIFdJTkFQSSBHZXRBdG9tTmFtZTMyQSgKKyAgICAgICAgICAgICAgQVRPTSBhdG9tLCAgICAvKiBbaW5dICBBdG9tICovCisgICAgICAgICAgICAgIExQU1RSIGJ1ZmZlciwgLyogW291dF0gUG9pbnRlciB0byBzdHJpbmcgZm9yIGF0b20gc3RyaW5nICovCisgICAgICAgICAgICAgIElOVDMyIGNvdW50ICAgLyogW2luXSAgU2l6ZSBvZiBidWZmZXIgKi8KKykgewogICAgIHJldHVybiBHbG9iYWxHZXRBdG9tTmFtZTMyQSggYXRvbSwgYnVmZmVyLCBjb3VudCApOyAgLyogRklYTUUgKi8KIH0KIAogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqICAgICAgICAgICBHZXRBdG9tTmFtZTMyVyAgIChLRVJORUwzMi4xNTApCisgKiBTZWUgR2V0QXRvbU5hbWUzMkEKICAqLwogVUlOVDMyIFdJTkFQSSBHZXRBdG9tTmFtZTMyVyggQVRPTSBhdG9tLCBMUFdTVFIgYnVmZmVyLCBJTlQzMiBjb3VudCApCiB7CkBAIC00MDcsOSArNDgzLDE2IEBACiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICogICAgICAgICAgIEdsb2JhbEFkZEF0b20zMkEgICAoS0VSTkVMMzIuMzEzKQorICogQWRkcyBhIGNoYXJhY3RlciBzdHJpbmcgdG8gdGhlIGdsb2JhbCBhdG9tIHRhYmxlIGFuZCByZXR1cm5zIGEgdW5pcXVlCisgKiB2YWx1ZSBpZGVudGlmeWluZyB0aGUgc3RyaW5nLgorICoKKyAqIFJFVFVSTlMKKyAqCUF0b206IFN1Y2Nlc3MKKyAqCTA6IEZhaWx1cmUKICAqLwotQVRPTSBXSU5BUEkgR2xvYmFsQWRkQXRvbTMyQSggTFBDU1RSIHN0ciApCi17CitBVE9NIFdJTkFQSSBHbG9iYWxBZGRBdG9tMzJBKAorICAgICAgICAgICAgTFBDU1RSIHN0ciAvKiBbaW5dIFBvaW50ZXIgdG8gc3RyaW5nIHRvIGFkZCAqLworKSB7CiAgICAgaWYgKCFISVdPUkQoc3RyKSkgcmV0dXJuIChBVE9NKUxPV09SRChzdHIpOyAgLyogSW50ZWdlciBhdG9tICovCiAgICAgcmV0dXJuIEFUT01fQWRkQXRvbSggVVNFUl9IZWFwU2VsLCBzdHIgKTsKIH0KQEAgLTQxNyw2ICs1MDAsNyBAQAogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqICAgICAgICAgICBHbG9iYWxBZGRBdG9tMzJXICAgKEtFUk5FTDMyLjMxNCkKKyAqIFNlZSBHbG9iYWxBZGRBdG9tMzJBCiAgKi8KIEFUT00gV0lOQVBJIEdsb2JhbEFkZEF0b20zMlcoIExQQ1dTVFIgc3RyICkKIHsKQEAgLTQyOSw5ICs1MTMsMTYgQEAKIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKiAgICAgICAgICAgR2xvYmFsRGVsZXRlQXRvbSAgIChVU0VSLjI2OSkgKEtFUk5FTDMyLjMxNykKKyAqIERlY3JlbWVudHMgdGhlIHJlZmVyZW5jZSBjb3VudCBvZiBhIHN0cmluZyBhdG9tLiAgSWYgdGhlIGNvdW50IGlzCisgKiB6ZXJvLCB0aGUgc3RyaW5nIGFzc29jaWF0ZWQgd2l0aCB0aGUgYXRvbSBpcyByZW1vdmVkIGZyb20gdGhlIHRhYmxlLgorICoKKyAqIFJFVFVSTlMKKyAqCTA6IFN1Y2Nlc3MKKyAqCUF0b206IEZhaWx1cmUKICAqLwotQVRPTSBXSU5BUEkgR2xvYmFsRGVsZXRlQXRvbSggQVRPTSBhdG9tICkKLXsKK0FUT00gV0lOQVBJIEdsb2JhbERlbGV0ZUF0b20oCisgICAgICAgICAgICBBVE9NIGF0b20gLyogW2luXSBBdG9tIHRvIGRlbGV0ZSAqLworKSB7CiAjaWZkZWYgQ09ORklHX0lQQwogICAgIHJldHVybiBEREVfR2xvYmFsRGVsZXRlQXRvbSggYXRvbSApOwogI2Vsc2UKQEAgLTQ1Niw5ICs1NDcsMTYgQEAKIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKiAgICAgICAgICAgR2xvYmFsRmluZEF0b20zMkEgICAoS0VSTkVMMzIuMzE4KQorICogU2VhcmNoZXMgdGhlIGF0b20gdGFibGUgZm9yIHRoZSBzdHJpbmcgYW5kIHJldHVybnMgdGhlIGF0b20KKyAqIGFzc29jaWF0ZWQgd2l0aCBpdC4KKyAqCisgKiBSRVRVUk5TCisgKglBdG9tOiBTdWNjZXNzCisgKgkwOiBGYWlsdXJlCiAgKi8KLUFUT00gV0lOQVBJIEdsb2JhbEZpbmRBdG9tMzJBKCBMUENTVFIgc3RyICkKLXsKK0FUT00gV0lOQVBJIEdsb2JhbEZpbmRBdG9tMzJBKAorICAgICAgICAgICAgTFBDU1RSIHN0ciAvKiBbaW5dIFBvaW50ZXIgdG8gc3RyaW5nIHRvIHNlYXJjaCBmb3IgKi8KKykgewogICAgIGlmICghSElXT1JEKHN0cikpIHJldHVybiAoQVRPTSlMT1dPUkQoc3RyKTsgIC8qIEludGVnZXIgYXRvbSAqLwogICAgIHJldHVybiBBVE9NX0ZpbmRBdG9tKCBVU0VSX0hlYXBTZWwsIHN0ciApOwogfQpAQCAtNDY2LDYgKzU2NCw3IEBACiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICogICAgICAgICAgIEdsb2JhbEZpbmRBdG9tMzJXICAgKEtFUk5FTDMyLjMxOSkKKyAqIFNlZSBHbG9iYWxGaW5kQXRvbTMyQQogICovCiBBVE9NIFdJTkFQSSBHbG9iYWxGaW5kQXRvbTMyVyggTFBDV1NUUiBzdHIgKQogewpAQCAtNDkxLDE0ICs1OTAsMjQgQEAKIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKiAgICAgICAgICAgR2xvYmFsR2V0QXRvbU5hbWUzMkEgICAoS0VSTkVMMzIuMzIzKQorICogUmV0cmlldmVzIGEgY29weSBvZiB0aGUgc3RyaW5nIGFzc29jaWF0ZWQgd2l0aCBhbiBhdG9tLgorICoKKyAqIFJFVFVSTlMKKyAqCUxlbmd0aCBvZiBzdHJpbmcgaW4gY2hhcmFjdGVyczogU3VjY2VzcworICoJMDogRmFpbHVyZQogICovCi1VSU5UMzIgV0lOQVBJIEdsb2JhbEdldEF0b21OYW1lMzJBKCBBVE9NIGF0b20sIExQU1RSIGJ1ZmZlciwgSU5UMzIgY291bnQgKQoteworVUlOVDMyIFdJTkFQSSBHbG9iYWxHZXRBdG9tTmFtZTMyQSgKKyAgICAgICAgICAgICAgQVRPTSBhdG9tLCAgICAvKiBbaW5dICBBdG9tIGlkZW50aWZpZXIgKi8KKyAgICAgICAgICAgICAgTFBTVFIgYnVmZmVyLCAvKiBbb3V0XSBQb2ludGVyIHRvIGJ1ZmZlciBmb3IgYXRvbSBzdHJpbmcgKi8KKyAgICAgICAgICAgICAgSU5UMzIgY291bnQgICAvKiBbaW5dICBTaXplIG9mIGJ1ZmZlciAqLworKSB7CiAgICAgcmV0dXJuIEFUT01fR2V0QXRvbU5hbWUoIFVTRVJfSGVhcFNlbCwgYXRvbSwgYnVmZmVyLCBjb3VudCApOwogfQogCisKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICogICAgICAgICAgIEdsb2JhbEdldEF0b21OYW1lMzJXICAgKEtFUk5FTDMyLjMyNCkKKyAqIFNlZSBHbG9iYWxHZXRBdG9tTmFtZTMyQQogICovCiBVSU5UMzIgV0lOQVBJIEdsb2JhbEdldEF0b21OYW1lMzJXKCBBVE9NIGF0b20sIExQV1NUUiBidWZmZXIsIElOVDMyIGNvdW50ICkKIHsKZGlmZiAtLWdpdCBhL21lbW9yeS9nbG9iYWwuYyBiL21lbW9yeS9nbG9iYWwuYwppbmRleCA5NjBlM2RhLi41NGE0YjQ2IDEwMDY0NAotLS0gYS9tZW1vcnkvZ2xvYmFsLmMKKysrIGIvbWVtb3J5L2dsb2JhbC5jCkBAIC04MSwxMSArODEsMTEgQEAKICAgICBmb3IgKGkgPSBnbG9iYWxBcmVuYVNpemUtMSA7IGk+PTAgOyBpLS0pIHsKIAlpZiAocEdsb2JhbEFyZW5hW2ldLnNpemUhPTAgJiYgKHBHbG9iYWxBcmVuYVtpXS5oYW5kbGUgJiAweDgwMDApKXsKIAkgICAgcHJpbnRlZD0xOwotCSAgICBwcmludGYoIjB4JTA4eCwgIixwR2xvYmFsQXJlbmFbaV0uaGFuZGxlKTsKKwkgICAgRFVNUCgiMHglMDh4LCAiLHBHbG9iYWxBcmVuYVtpXS5oYW5kbGUpOwogCX0KICAgICB9CiAgICAgaWYgKHByaW50ZWQpCi0JcHJpbnRmKCJcbiIpOworCURVTVAoIlxuIik7CiB9CiAKIApAQCAtMjcxLDkgKzI3MSwxNCBAQAogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqICAgICAgICAgICBHbG9iYWxBbGxvYzE2ICAgKEtFUk5FTC4xNSkKKyAqIFJFVFVSTlMKKyAqCUhhbmRsZTogU3VjY2VzcworICoJTlVMTDogRmFpbHVyZQogICovCi1IR0xPQkFMMTYgV0lOQVBJIEdsb2JhbEFsbG9jMTYoIFVJTlQxNiBmbGFncywgRFdPUkQgc2l6ZSApCi17CitIR0xPQkFMMTYgV0lOQVBJIEdsb2JhbEFsbG9jMTYoCisgICAgICAgICAgICAgICAgIFVJTlQxNiBmbGFncywgLyogW2luXSBPYmplY3QgYWxsb2NhdGlvbiBhdHRyaWJ1dGVzICovCisgICAgICAgICAgICAgICAgIERXT1JEIHNpemUgICAgLyogW2luXSBOdW1iZXIgb2YgYnl0ZXMgdG8gYWxsb2NhdGUgKi8KKykgewogICAgIEhBTkRMRTE2IG93bmVyID0gR2V0Q3VycmVudFBEQigpOwogCiAgICAgaWYgKGZsYWdzICYgR01FTV9EREVTSEFSRSkKQEAgLTI4NCw5ICsyODksMTUgQEAKIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKiAgICAgICAgICAgR2xvYmFsUmVBbGxvYzE2ICAgKEtFUk5FTC4xNikKKyAqIFJFVFVSTlMKKyAqCUhhbmRsZTogU3VjY2VzcworICoJTlVMTDogRmFpbHVyZQogICovCi1IR0xPQkFMMTYgV0lOQVBJIEdsb2JhbFJlQWxsb2MxNiggSEdMT0JBTDE2IGhhbmRsZSwgRFdPUkQgc2l6ZSwgVUlOVDE2IGZsYWdzICkKLXsKK0hHTE9CQUwxNiBXSU5BUEkgR2xvYmFsUmVBbGxvYzE2KAorICAgICAgICAgICAgICAgICBIR0xPQkFMMTYgaGFuZGxlLCAvKiBbaW5dIEhhbmRsZSBvZiBnbG9iYWwgbWVtb3J5IG9iamVjdCAqLworICAgICAgICAgICAgICAgICBEV09SRCBzaXplLCAgICAgICAvKiBbaW5dIE5ldyBzaXplIG9mIGJsb2NrICovCisgICAgICAgICAgICAgICAgIFVJTlQxNiBmbGFncyAgICAgIC8qIFtpbl0gSG93IHRvIHJlYWxsb2NhdGUgb2JqZWN0ICovCispIHsKICAgICBXT1JEIHNlbGNvdW50OwogICAgIERXT1JEIG9sZHNpemU7CiAgICAgdm9pZCAqcHRyOwpAQCAtMzAwLDE0ICszMTEsMTMgQEAKICNpZmRlZiBDT05GSUdfSVBDCiAgICAgaWYgKGZsYWdzICYgR01FTV9EREVTSEFSRSB8fCBpc19kZGVfaGFuZGxlKGhhbmRsZSkpCiAgICAgewotCWZwcmludGYoc3RkbmltcCwKLSAgICAgICAgICAgICAgICJHbG9iYWxSZUFsbG9jMTY6IHNoYXJlZCBtZW1vcnkgcmVhbGxvY2F0aW5nIHVuaW1wbGVtZW50ZWRcbiIpOyAKKwlGSVhNRShnbG9iYWwsICJzaGFyZWQgbWVtb3J5IHJlYWxsb2NhdGluZyB1bmltcGxlbWVudGVkXG4iKTsgCiAJcmV0dXJuIDA7CiAgICAgfQogI2VuZGlmICAvKiBDT05GSUdfSVBDICovCiAKICAgICBpZiAoIVZBTElEX0hBTkRMRShoYW5kbGUpKSB7Ci0gICAgCWZwcmludGYoc3RkZXJyLCIgSW52YWxpZCBoYW5kbGUgMHglMDR4IHBhc3NlZCB0byBHbG9iYWxSZUFsbG9jMTYhXG4iLGhhbmRsZSk7CisgICAgCVdBUk4oZ2xvYmFsLCAiSW52YWxpZCBoYW5kbGUgMHglMDR4IVxuIiwgaGFuZGxlKTsKICAgICAJcmV0dXJuIDA7CiAgICAgfQogICAgIHBBcmVuYSA9IEdFVF9BUkVOQV9QVFIoIGhhbmRsZSApOwpAQCAtMzk4LDkgKzQwOCwxMyBAQAogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqICAgICAgICAgICBHbG9iYWxGcmVlMTYgICAoS0VSTkVMLjE3KQorICogUkVUVVJOUworICoJTlVMTDogU3VjY2VzcworICoJSGFuZGxlOiBGYWlsdXJlCiAgKi8KLUhHTE9CQUwxNiBXSU5BUEkgR2xvYmFsRnJlZTE2KCBIR0xPQkFMMTYgaGFuZGxlICkKLXsKK0hHTE9CQUwxNiBXSU5BUEkgR2xvYmFsRnJlZTE2KAorICAgICAgICAgICAgICAgICBIR0xPQkFMMTYgaGFuZGxlIC8qIFtpbl0gSGFuZGxlIG9mIGdsb2JhbCBtZW1vcnkgb2JqZWN0ICovCispIHsKICAgICB2b2lkICpwdHI7CiAKICAgICBpZiAoIVZBTElEX0hBTkRMRShoYW5kbGUpKSB7CkBAIC00NTQsOSArNDY4LDE0IEBACiAgKiAgICAgICAgICAgR2xvYmFsTG9jazE2ICAgKEtFUk5FTC4xOCkKICAqCiAgKiBUaGlzIGlzIHRoZSBHbG9iYWxMb2NrMTYoKSBmdW5jdGlvbiB1c2VkIGJ5IDMyLWJpdCBjb2RlLgorICogCisgKiBSRVRVUk5TCisgKglQb2ludGVyIHRvIGZpcnN0IGJ5dGUgb2YgbWVtb3J5IGJsb2NrCisgKglOVUxMOiBGYWlsdXJlCiAgKi8KLUxQVk9JRCBXSU5BUEkgR2xvYmFsTG9jazE2KCBIR0xPQkFMMTYgaGFuZGxlICkKLXsKK0xQVk9JRCBXSU5BUEkgR2xvYmFsTG9jazE2KAorICAgICAgICAgICAgICBIR0xPQkFMMTYgaGFuZGxlIC8qIFtpbl0gSGFuZGxlIG9mIGdsb2JhbCBtZW1vcnkgb2JqZWN0ICovCispIHsKICAgICBpZiAoIWhhbmRsZSkgcmV0dXJuIDA7CiAgICAgaWYgKCFWQUxJRF9IQU5ETEUoaGFuZGxlKSkKIAlyZXR1cm4gKExQVk9JRCkwOwpAQCAtNDcwLDkgKzQ4OSwxNiBAQAogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqICAgICAgICAgICBHbG9iYWxVbmxvY2sxNiAgIChLRVJORUwuMTkpCisgKiBOT1RFUworICoJU2hvdWxkIHRoZSByZXR1cm4gdmFsdWVzIGJlIGNhc3QgdG8gYm9vbGVhbnM/CisgKgorICogUkVUVVJOUworICoJVFJVRTogT2JqZWN0IGlzIHN0aWxsIGxvY2tlZAorICoJRkFMU0U6IE9iamVjdCBpcyB1bmxvY2tlZAogICovCi1CT09MMTYgV0lOQVBJIEdsb2JhbFVubG9jazE2KCBIR0xPQkFMMTYgaGFuZGxlICkKLXsKK0JPT0wxNiBXSU5BUEkgR2xvYmFsVW5sb2NrMTYoCisgICAgICAgICAgICAgIEhHTE9CQUwxNiBoYW5kbGUgLyogW2luXSBIYW5kbGUgb2YgZ2xvYmFsIG1lbW9yeSBvYmplY3QgKi8KKykgewogICAgIEdMT0JBTEFSRU5BICpwQXJlbmEgPSBHRVRfQVJFTkFfUFRSKGhhbmRsZSk7CiAgICAgaWYgKCFWQUxJRF9IQU5ETEUoaGFuZGxlKSkgewogCWZwcmludGYoc3RkZXJyLCJJbnZhbGlkIGhhbmRsZSAweCUwNHggcGFzc2VkIHRvIEdsb2JhbFVubG9jazE2IVxuIixoYW5kbGUpOwpAQCAtNDg2LDkgKzUxMiwxMyBAQAogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqICAgICAgICAgICBHbG9iYWxTaXplMTYgICAoS0VSTkVMLjIwKQorICogUkVUVVJOUworICoJU2l6ZSBpbiBieXRlcyBvZiBvYmplY3QKKyAqCTA6IEZhaWx1cmUKICAqLwotRFdPUkQgV0lOQVBJIEdsb2JhbFNpemUxNiggSEdMT0JBTDE2IGhhbmRsZSApCi17CitEV09SRCBXSU5BUEkgR2xvYmFsU2l6ZTE2KAorICAgICAgICAgICAgIEhHTE9CQUwxNiBoYW5kbGUgLyogW2luXSBIYW5kbGUgb2YgZ2xvYmFsIG1lbW9yeSBvYmplY3QgKi8KKykgewogICAgIFRSQUNFKGdsb2JhbCwgIiUwNHhcbiIsIGhhbmRsZSApOwogICAgIGlmICghaGFuZGxlKSByZXR1cm4gMDsKICAgICBpZiAoIVZBTElEX0hBTkRMRShoYW5kbGUpKQpAQCAtNDk5LDkgKzUyOSwxNiBAQAogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqICAgICAgICAgICBHbG9iYWxIYW5kbGUxNiAgIChLRVJORUwuMjEpCisgKiBOT1RFUworICoJV2h5IGlzIEdsb2JhbEhhbmRsZVRvU2VsIHVzZWQgaGVyZSB3aXRoIHRoZSBzZWwgYXMgaW5wdXQ/CisgKgorICogUkVUVVJOUworICoJSGFuZGxlOiBTdWNjZXNzCisgKglOVUxMOiBGYWlsdXJlCiAgKi8KLURXT1JEIFdJTkFQSSBHbG9iYWxIYW5kbGUxNiggV09SRCBzZWwgKQoteworRFdPUkQgV0lOQVBJIEdsb2JhbEhhbmRsZTE2KAorICAgICAgICAgICAgIFdPUkQgc2VsIC8qIFtpbl0gQWRkcmVzcyBvZiBnbG9iYWwgbWVtb3J5IGJsb2NrICovCispIHsKICAgICBUUkFDRShnbG9iYWwsICIlMDR4XG4iLCBzZWwgKTsKICAgICBpZiAoIVZBTElEX0hBTkRMRShzZWwpKSB7CiAJZnByaW50ZihzdGRlcnIsIkludmFsaWQgaGFuZGxlIDB4JTA0eCBwYXNzZWQgdG8gR2xvYmFsSGFuZGxlMTYhXG4iLHNlbCk7CkBAIC01MjMsMTEgKzU2MCwyMCBAQAogICAgIHJldHVybiAwOwogfQogCisKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICogICAgICAgICAgIEdsb2JhbEZsYWdzMTYgICAoS0VSTkVMLjIyKQorICogTk9URVMKKyAqCVNob3VsZCB0aGlzIHJldHVybiBHTUVNX0lOVkFMSURfSEFORExFIGluc3RlYWQgb2YgMCBvbiBpbnZhbGlkCisgKgloYW5kbGU/CisgKgorICogUkVUVVJOUworICoJVmFsdWUgc3BlY2lmeWluZyBmbGFncyBhbmQgbG9jayBjb3VudAorICoJR01FTV9JTlZBTElEX0hBTkRMRTogSW52YWxpZCBoYW5kbGUKICAqLwotVUlOVDE2IFdJTkFQSSBHbG9iYWxGbGFnczE2KCBIR0xPQkFMMTYgaGFuZGxlICkKLXsKK1VJTlQxNiBXSU5BUEkgR2xvYmFsRmxhZ3MxNigKKyAgICAgICAgICAgICAgSEdMT0JBTDE2IGhhbmRsZSAvKiBbaW5dIEhhbmRsZSBvZiBnbG9iYWwgbWVtb3J5IG9iamVjdCAqLworKSB7CiAgICAgR0xPQkFMQVJFTkEgKnBBcmVuYTsKIAogICAgIFRSQUNFKGdsb2JhbCwgIiUwNHhcbiIsIGhhbmRsZSApOwpAQCAtNjYyLDEyICs3MDgsMTUgQEAKIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKiAgICAgICAgICAgR2xvYmFsRE9TQWxsb2MgICAoS0VSTkVMLjE4NCkKKyAqIFJFVFVSTlMKKyAqCUFkZHJlc3MgKEhXPVBhcmFncmFwaCBzZWdtZW50OyBMVz1TZWxlY3RvcikKICAqLwotRFdPUkQgV0lOQVBJIEdsb2JhbERPU0FsbG9jKERXT1JEIHNpemUpCi17CitEV09SRCBXSU5BUEkgR2xvYmFsRE9TQWxsb2MoCisgICAgICAgICAgICAgRFdPUkQgc2l6ZSAvKiBbaW5dIE51bWJlciBvZiBieXRlcyB0byBiZSBhbGxvY2F0ZWQgKi8KKykgewogICAgVUlOVDE2ICAgIHVQYXJhZ3JhcGg7CiAgICBMUFZPSUQgICAgbHBCbG9jayA9IERPU01FTV9HZXRCbG9jayggc2l6ZSwgJnVQYXJhZ3JhcGggKTsKLSAgIAorCiAgICBpZiggbHBCbG9jayApCiAgICB7CiAgICAgICAgSE1PRFVMRTE2IGhNb2R1bGUgPSBHZXRNb2R1bGVIYW5kbGUxNigiS0VSTkVMIik7CkBAIC02ODAsMTEgKzcyOSwxNiBAQAogICAgcmV0dXJuIDA7CiB9CiAKKwogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKiAgICAgICAgICAgR2xvYmFsRE9TRnJlZSAgICAgIChLRVJORUwuMTg1KQorICogUkVUVVJOUworICoJTlVMTDogU3VjY2VzcworICoJc2VsOiBGYWlsdXJlCiAgKi8KLVdPUkQgV0lOQVBJIEdsb2JhbERPU0ZyZWUoV09SRCBzZWwpCi17CitXT1JEIFdJTkFQSSBHbG9iYWxET1NGcmVlKAorICAgICAgICAgICAgV09SRCBzZWwgLyogW2luXSBTZWxlY3RvciAqLworKSB7CiAgICBEV09SRCAgIGJsb2NrID0gR2V0U2VsZWN0b3JCYXNlKHNlbCk7CiAKICAgIGlmKCBibG9jayAmJiBibG9jayA8IDB4MTAwMDAwICkgCkBAIC02OTcsNiArNzUxLDcgQEAKICAgIHJldHVybiBzZWw7CiB9CiAKKwogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKiAgICAgICAgICAgR2xvYmFsUGFnZUxvY2sgICAoS0VSTkVMLjE5MSkKICAqLwpAQCAtOTY2LDkgKzEwMjEsMTQgQEAKIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKiAgICAgICAgICAgR2xvYmFsQWxsb2MzMiAgIChLRVJORUwzMi4zMTUpCisgKiBSRVRVUk5TCisgKglIYW5kbGU6IFN1Y2Nlc3MKKyAqCU5VTEw6IEZhaWx1cmUKICAqLwotSEdMT0JBTDMyIFdJTkFQSSBHbG9iYWxBbGxvYzMyKFVJTlQzMiBmbGFncywgRFdPUkQgc2l6ZSkKLXsKK0hHTE9CQUwzMiBXSU5BUEkgR2xvYmFsQWxsb2MzMigKKyAgICAgICAgICAgICAgICAgVUlOVDMyIGZsYWdzLCAvKiBbaW5dIE9iamVjdCBhbGxvY2F0aW9uIGF0dHJpYnV0ZXMgKi8KKyAgICAgICAgICAgICAgICAgRFdPUkQgc2l6ZSAgICAvKiBbaW5dIE51bWJlciBvZiBieXRlcyB0byBhbGxvY2F0ZSAqLworKSB7CiAgICBQR0xPQkFMMzJfSU5URVJOICAgICBwaW50ZXJuOwogICAgRFdPUkQJCWhwZmxhZ3M7CiAgICBMUFZPSUQgICAgICAgICAgICAgICBwYWxsb2M7CkBAIC0xMDA5LDkgKzEwNjksMTMgQEAKIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKiAgICAgICAgICAgR2xvYmFsTG9jazMyICAgKEtFUk5FTDMyLjMyNikKKyAqIFJFVFVSTlMKKyAqCVBvaW50ZXIgdG8gZmlyc3QgYnl0ZSBvZiBibG9jaworICoJTlVMTDogRmFpbHVyZQogICovCi1MUFZPSUQgV0lOQVBJIEdsb2JhbExvY2szMihIR0xPQkFMMzIgaG1lbSkKLXsKK0xQVk9JRCBXSU5BUEkgR2xvYmFsTG9jazMyKAorICAgICAgICAgICAgICBIR0xPQkFMMzIgaG1lbSAvKiBbaW5dIEhhbmRsZSBvZiBnbG9iYWwgbWVtb3J5IG9iamVjdCAqLworKSB7CiAgICBQR0xPQkFMMzJfSU5URVJOIHBpbnRlcm47CiAgICBMUFZPSUQgICAgICAgICAgIHBhbGxvYzsKIApAQCAtMTAzOSw5ICsxMTAzLDEzIEBACiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICogICAgICAgICAgIEdsb2JhbFVubG9jazMyICAgKEtFUk5FTDMyLjMzMikKKyAqIFJFVFVSTlMKKyAqCVRSVUU6IE9iamVjdCBpcyBzdGlsbCBsb2NrZWQKKyAqCUZBTFNFOiBPYmplY3QgaXMgdW5sb2NrZWQKICAqLwotQk9PTDMyIFdJTkFQSSBHbG9iYWxVbmxvY2szMihIR0xPQkFMMzIgaG1lbSkKLXsKK0JPT0wzMiBXSU5BUEkgR2xvYmFsVW5sb2NrMzIoCisgICAgICAgICAgICAgIEhHTE9CQUwzMiBobWVtIC8qIFtpbl0gSGFuZGxlIG9mIGdsb2JhbCBtZW1vcnkgb2JqZWN0ICovCispIHsKICAgIFBHTE9CQUwzMl9JTlRFUk4gICAgICAgcGludGVybjsKICAgIEJPT0wzMiAgICAgICAgICAgICAgICAgbG9ja2VkOwogCkBAIC0xMDcwLDkgKzExMzgsMTkgQEAKIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKiAgICAgICAgICAgR2xvYmFsSGFuZGxlMzIgICAoS0VSTkVMMzIuMzI1KQorICogUmV0dXJucyB0aGUgaGFuZGxlIGFzc29jaWF0ZWQgd2l0aCB0aGUgc3BlY2lmaWVkIHBvaW50ZXIuCisgKgorICogTk9URVMKKyAqCVNpbmNlIHRoZXJlIGluIG9ubHkgb25lIGdvdG8sIGNhbiBpdCBiZSByZW1vdmVkIGFuZCB0aGUgcmV0dXJuCisgKgliZSBwdXQgJ2lubGluZSc/CisgKgorICogUkVUVVJOUworICoJSGFuZGxlOiBTdWNjZXNzCisgKglOVUxMOiBGYWlsdXJlCiAgKi8KLUhHTE9CQUwzMiBXSU5BUEkgR2xvYmFsSGFuZGxlMzIoTFBDVk9JRCBwbWVtKQoteworSEdMT0JBTDMyIFdJTkFQSSBHbG9iYWxIYW5kbGUzMigKKyAgICAgICAgICAgICAgICAgTFBDVk9JRCBwbWVtIC8qIFtpbl0gUG9pbnRlciB0byBnbG9iYWwgbWVtb3J5IGJsb2NrICovCispIHsKICAgICBIR0xPQkFMMzIgaGFuZGxlOwogCiAgICAgaWYgKCFIRUFQX0lzSW5zaWRlSGVhcCggR2V0UHJvY2Vzc0hlYXAoKSwgMCwgcG1lbSApKSBnb3RvIGVycm9yOwpAQCAtMTA5NCw5ICsxMTcyLDE1IEBACiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICogICAgICAgICAgIEdsb2JhbFJlQWxsb2MzMiAgIChLRVJORUwzMi4zMjgpCisgKiBSRVRVUk5TCisgKglIYW5kbGU6IFN1Y2Nlc3MKKyAqCU5VTEw6IEZhaWx1cmUKICAqLwotSEdMT0JBTDMyIFdJTkFQSSBHbG9iYWxSZUFsbG9jMzIoSEdMT0JBTDMyIGhtZW0sIERXT1JEIHNpemUsIFVJTlQzMiBmbGFncykKLXsKK0hHTE9CQUwzMiBXSU5BUEkgR2xvYmFsUmVBbGxvYzMyKAorICAgICAgICAgICAgICAgICBIR0xPQkFMMzIgaG1lbSwgLyogW2luXSBIYW5kbGUgb2YgZ2xvYmFsIG1lbW9yeSBvYmplY3QgKi8KKyAgICAgICAgICAgICAgICAgRFdPUkQgc2l6ZSwgICAgIC8qIFtpbl0gTmV3IHNpemUgb2YgYmxvY2sgKi8KKyAgICAgICAgICAgICAgICAgVUlOVDMyIGZsYWdzICAgIC8qIFtpbl0gSG93IHRvIHJlYWxsb2NhdGUgb2JqZWN0ICovCispIHsKICAgIExQVk9JRCAgICAgICAgICAgICAgIHBhbGxvYzsKICAgIEhHTE9CQUwzMiAgICAgICAgICAgIGhuZXc7CiAgICBQR0xPQkFMMzJfSU5URVJOICAgICBwaW50ZXJuOwpAQCAtMTE3Nyw5ICsxMjYxLDEzIEBACiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICogICAgICAgICAgIEdsb2JhbEZyZWUzMiAgIChLRVJORUwzMi4zMjIpCisgKiBSRVRVUk5TCisgKglOVUxMOiBTdWNjZXNzCisgKglIYW5kbGU6IEZhaWx1cmUKICAqLwotSEdMT0JBTDMyIFdJTkFQSSBHbG9iYWxGcmVlMzIoSEdMT0JBTDMyIGhtZW0pCi17CitIR0xPQkFMMzIgV0lOQVBJIEdsb2JhbEZyZWUzMigKKyAgICAgICAgICAgICAgICAgSEdMT0JBTDMyIGhtZW0gLyogW2luXSBIYW5kbGUgb2YgZ2xvYmFsIG1lbW9yeSBvYmplY3QgKi8KKykgewogICAgUEdMT0JBTDMyX0lOVEVSTiBwaW50ZXJuOwogICAgSEdMT0JBTDMyICAgICAgICBocmV0dXJuZWQgPSAwOwogICAgCkBAIC0xMjExLDkgKzEyOTksMTMgQEAKIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKiAgICAgICAgICAgR2xvYmFsU2l6ZTMyICAgKEtFUk5FTDMyLjMyOSkKKyAqIFJFVFVSTlMKKyAqCVNpemUgaW4gYnl0ZXMgb2YgdGhlIGdsb2JhbCBtZW1vcnkgb2JqZWN0CisgKgkwOiBGYWlsdXJlCiAgKi8KLURXT1JEIFdJTkFQSSBHbG9iYWxTaXplMzIoSEdMT0JBTDMyIGhtZW0pCi17CitEV09SRCBXSU5BUEkgR2xvYmFsU2l6ZTMyKAorICAgICAgICAgICAgIEhHTE9CQUwzMiBobWVtIC8qIFtpbl0gSGFuZGxlIG9mIGdsb2JhbCBtZW1vcnkgb2JqZWN0ICovCispIHsKICAgIERXT1JEICAgICAgICAgICAgICAgIHJldHZhbDsKICAgIFBHTE9CQUwzMl9JTlRFUk4gICAgIHBpbnRlcm47CiAKQEAgLTEyODAsOSArMTM3MiwxOCBAQAogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqICAgICAgICAgICBHbG9iYWxGbGFnczMyICAgKEtFUk5FTDMyLjMyMSkKKyAqIFJldHVybnMgaW5mb3JtYXRpb24gYWJvdXQgdGhlIHNwZWNpZmllZCBnbG9iYWwgbWVtb3J5IG9iamVjdAorICoKKyAqIE5PVEVTCisgKglTaG91bGQgdGhpcyByZXR1cm4gR01FTV9JTlZBTElEX0hBTkRMRSBvbiBpbnZhbGlkIGhhbmRsZT8KKyAqCisgKiBSRVRVUk5TCisgKglWYWx1ZSBzcGVjaWZ5aW5nIGFsbG9jYXRpb24gZmxhZ3MgYW5kIGxvY2sgY291bnQKKyAqCUdNRU1fSU5WQUxJRF9IQU5ETEU6IEZhaWx1cmUKICAqLwotVUlOVDMyIFdJTkFQSSBHbG9iYWxGbGFnczMyKEhHTE9CQUwzMiBobWVtKQoteworVUlOVDMyIFdJTkFQSSBHbG9iYWxGbGFnczMyKAorICAgICAgICAgICAgICBIR0xPQkFMMzIgaG1lbSAvKiBbaW5dIEhhbmRsZSB0byBnbG9iYWwgbWVtb3J5IG9iamVjdCAqLworKSB7CiAgICBEV09SRCAgICAgICAgICAgICAgICByZXR2YWw7CiAgICBQR0xPQkFMMzJfSU5URVJOICAgICBwaW50ZXJuOwogICAgCkBAIC0xMzAyLDcgKzE0MDMsNyBAQAogICAgICAgfQogICAgICAgZWxzZQogICAgICAgewotCSBXQVJOKGdsb2JhbCwiaW52YWxpZCBoYW5kbGVcbiIpOworCSBXQVJOKGdsb2JhbCwiSW52YWxpZCBoYW5kbGU6ICUwNHgiLCBobWVtKTsKIAkgcmV0dmFsPTA7CiAgICAgICB9CiAgICAgICAvKiBIZWFwVW5sb2NrKEdldFByb2Nlc3NIZWFwKCkpOyAqLwpAQCAtMTMyMiw5ICsxNDIzLDEyIEBACiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICogICAgICAgICAgIEdsb2JhbE1lbW9yeVN0YXR1cyAgIChLRVJORUwzMi4zMjcpCisgKiBSRVRVUk5TCisgKglOb25lCiAgKi8KLVZPSUQgV0lOQVBJIEdsb2JhbE1lbW9yeVN0YXR1cyggTFBNRU1PUllTVEFUVVMgbHBtZW0gKQoteworVk9JRCBXSU5BUEkgR2xvYmFsTWVtb3J5U3RhdHVzKAorICAgICAgICAgICAgTFBNRU1PUllTVEFUVVMgbHBtZW0KKykgewogI2lmZGVmIGxpbnV4CiAgICAgRklMRSAqZiA9IGZvcGVuKCAiL3Byb2MvbWVtaW5mbyIsICJyIiApOwogICAgIGlmIChmKQpAQCAtMTM4MCw2ICsxNDg0LDcgQEAKICAgICBscG1lbS0+ZHdBdmFpbFZpcnR1YWwgID0gMzIqMTAyNCoxMDI0OwogfQogCisKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKiAgICAgICAgICAgV09XR2xvYmFsQWxsb2NMb2NrIChLRVJORUwzMi42MikKICAqCkBAIC0xMzkzLDYgKzE0OTgsNyBAQAogICAgIHJldHVybiBXSU4xNl9HbG9iYWxMb2NrMTYoeGhtZW0pOwogfQogCisKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKiAgICAgICAgICAgV09XR2xvYmFsVW5sb2NrRnJlZSAoS0VSTkVMMzIuNjQpCiAgKgpkaWZmIC0tZ2l0IGEvbWVtb3J5L2hlYXAuYyBiL21lbW9yeS9oZWFwLmMKaW5kZXggZTY1N2QzOC4uNDQ2YjYzZCAxMDA2NDQKLS0tIGEvbWVtb3J5L2hlYXAuYworKysgYi9tZW1vcnkvaGVhcC5jCkBAIC0xMDYsNDIgKzEwNiw0MiBAQAogICAgIFNVQkhFQVAgKnN1YmhlYXA7CiAgICAgY2hhciAqcHRyOwogCi0gICAgcHJpbnRmKCAiSGVhcDogJTA4bHhcbiIsIChEV09SRCloZWFwICk7Ci0gICAgcHJpbnRmKCAiTmV4dDogJTA4bHggIFN1Yi1oZWFwczogJTA4bHgiLAotICAgICAgICAgICAgKERXT1JEKWhlYXAtPm5leHQsIChEV09SRCkmaGVhcC0+c3ViaGVhcCApOworICAgIERVTVAoICJIZWFwOiAlMDhseFxuIiwgKERXT1JEKWhlYXAgKTsKKyAgICBEVU1QKCAiTmV4dDogJTA4bHggIFN1Yi1oZWFwczogJTA4bHgiLAorCSAgKERXT1JEKWhlYXAtPm5leHQsIChEV09SRCkmaGVhcC0+c3ViaGVhcCApOwogICAgIHN1YmhlYXAgPSAmaGVhcC0+c3ViaGVhcDsKICAgICB3aGlsZSAoc3ViaGVhcC0+bmV4dCkKICAgICB7Ci0gICAgICAgIHByaW50ZiggIiAtPiAlMDhseCIsIChEV09SRClzdWJoZWFwLT5uZXh0ICk7CisgICAgICAgIERVTVAoICIgLT4gJTA4bHgiLCAoRFdPUkQpc3ViaGVhcC0+bmV4dCApOwogICAgICAgICBzdWJoZWFwID0gc3ViaGVhcC0+bmV4dDsKICAgICB9CiAKLSAgICBwcmludGYoICJcbkZyZWUgbGlzdHM6XG4gQmxvY2sgICBTdGF0ICAgU2l6ZSAgICBJZFxuIiApOworICAgIERVTVAoICJcbkZyZWUgbGlzdHM6XG4gQmxvY2sgICBTdGF0ICAgU2l6ZSAgICBJZFxuIiApOwogICAgIGZvciAoaSA9IDA7IGkgPCBIRUFQX05CX0ZSRUVfTElTVFM7IGkrKykKLSAgICAgICAgcHJpbnRmKCAiJTA4bHggZnJlZSAlMDhseCAlMDR4IHByZXY9JTA4bHggbmV4dD0lMDhseFxuIiwKLSAgICAgICAgICAgICAgICAoRFdPUkQpJmhlYXAtPmZyZWVMaXN0W2ldLmFyZW5hLCBoZWFwLT5mcmVlTGlzdFtpXS5hcmVuYS5zaXplLAotICAgICAgICAgICAgICAgIGhlYXAtPmZyZWVMaXN0W2ldLmFyZW5hLnRocmVhZElkLAotICAgICAgICAgICAgICAgIChEV09SRCloZWFwLT5mcmVlTGlzdFtpXS5hcmVuYS5wcmV2LAotICAgICAgICAgICAgICAgIChEV09SRCloZWFwLT5mcmVlTGlzdFtpXS5hcmVuYS5uZXh0ICk7CisgICAgICAgIERVTVAoICIlMDhseCBmcmVlICUwOGx4ICUwNHggcHJldj0lMDhseCBuZXh0PSUwOGx4XG4iLAorCSAgICAgIChEV09SRCkmaGVhcC0+ZnJlZUxpc3RbaV0uYXJlbmEsIGhlYXAtPmZyZWVMaXN0W2ldLmFyZW5hLnNpemUsCisJICAgICAgaGVhcC0+ZnJlZUxpc3RbaV0uYXJlbmEudGhyZWFkSWQsCisJICAgICAgKERXT1JEKWhlYXAtPmZyZWVMaXN0W2ldLmFyZW5hLnByZXYsCisJICAgICAgKERXT1JEKWhlYXAtPmZyZWVMaXN0W2ldLmFyZW5hLm5leHQgKTsKIAogICAgIHN1YmhlYXAgPSAmaGVhcC0+c3ViaGVhcDsKICAgICB3aGlsZSAoc3ViaGVhcCkKICAgICB7CiAgICAgICAgIERXT1JEIGZyZWVTaXplID0gMCwgdXNlZFNpemUgPSAwLCBhcmVuYVNpemUgPSBzdWJoZWFwLT5oZWFkZXJTaXplOwotICAgICAgICBwcmludGYoICJcblxuU3ViLWhlYXAgJTA4bHg6IHNpemU9JTA4bHggY29tbWl0dGVkPSUwOGx4XG4iLAotICAgICAgICAgICAgICAgIChEV09SRClzdWJoZWFwLCBzdWJoZWFwLT5zaXplLCBzdWJoZWFwLT5jb21taXRTaXplICk7Ci0KLSAgICAgICAgcHJpbnRmKCAiXG4gQmxvY2sgICBTdGF0ICAgU2l6ZSAgICBJZFxuIiApOworICAgICAgICBEVU1QKCAiXG5cblN1Yi1oZWFwICUwOGx4OiBzaXplPSUwOGx4IGNvbW1pdHRlZD0lMDhseFxuIiwKKwkgICAgICAoRFdPUkQpc3ViaGVhcCwgc3ViaGVhcC0+c2l6ZSwgc3ViaGVhcC0+Y29tbWl0U2l6ZSApOworCQorICAgICAgICBEVU1QKCAiXG4gQmxvY2sgICBTdGF0ICAgU2l6ZSAgICBJZFxuIiApOwogICAgICAgICBwdHIgPSAoY2hhciopc3ViaGVhcCArIHN1YmhlYXAtPmhlYWRlclNpemU7CiAgICAgICAgIHdoaWxlIChwdHIgPCAoY2hhciAqKXN1YmhlYXAgKyBzdWJoZWFwLT5zaXplKQogICAgICAgICB7CiAgICAgICAgICAgICBpZiAoKihEV09SRCAqKXB0ciAmIEFSRU5BX0ZMQUdfRlJFRSkKICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICBBUkVOQV9GUkVFICpwQXJlbmEgPSAoQVJFTkFfRlJFRSAqKXB0cjsKLSAgICAgICAgICAgICAgICBwcmludGYoICIlMDhseCBmcmVlICUwOGx4ICUwNHggcHJldj0lMDhseCBuZXh0PSUwOGx4XG4iLAotICAgICAgICAgICAgICAgICAgICAgICAgKERXT1JEKXBBcmVuYSwgcEFyZW5hLT5zaXplICYgQVJFTkFfU0laRV9NQVNLLAotICAgICAgICAgICAgICAgICAgICAgICAgcEFyZW5hLT50aHJlYWRJZCwgKERXT1JEKXBBcmVuYS0+cHJldiwKLSAgICAgICAgICAgICAgICAgICAgICAgIChEV09SRClwQXJlbmEtPm5leHQpOworICAgICAgICAgICAgICAgIERVTVAoICIlMDhseCBmcmVlICUwOGx4ICUwNHggcHJldj0lMDhseCBuZXh0PSUwOGx4XG4iLAorCQkgICAgICAoRFdPUkQpcEFyZW5hLCBwQXJlbmEtPnNpemUgJiBBUkVOQV9TSVpFX01BU0ssCisJCSAgICAgIHBBcmVuYS0+dGhyZWFkSWQsIChEV09SRClwQXJlbmEtPnByZXYsCisJCSAgICAgIChEV09SRClwQXJlbmEtPm5leHQpOwogICAgICAgICAgICAgICAgIHB0ciArPSBzaXplb2YoKnBBcmVuYSkgKyAocEFyZW5hLT5zaXplICYgQVJFTkFfU0laRV9NQVNLKTsKICAgICAgICAgICAgICAgICBhcmVuYVNpemUgKz0gc2l6ZW9mKEFSRU5BX0ZSRUUpOwogICAgICAgICAgICAgICAgIGZyZWVTaXplICs9IHBBcmVuYS0+c2l6ZSAmIEFSRU5BX1NJWkVfTUFTSzsKQEAgLTE0OSwxMCArMTQ5LDEwIEBACiAgICAgICAgICAgICBlbHNlIGlmICgqKERXT1JEICopcHRyICYgQVJFTkFfRkxBR19QUkVWX0ZSRUUpCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgQVJFTkFfSU5VU0UgKnBBcmVuYSA9IChBUkVOQV9JTlVTRSAqKXB0cjsKLSAgICAgICAgICAgICAgICBwcmludGYoICIlMDhseCBVc2VkICUwOGx4ICUwNHggYmFjaz0lMDhseCBFSVA9JTA4bHhcbiIsCi0gICAgICAgICAgICAgICAgICAgICAgICAoRFdPUkQpcEFyZW5hLCBwQXJlbmEtPnNpemUgJiBBUkVOQV9TSVpFX01BU0ssCi0gICAgICAgICAgICAgICAgICAgICAgICBwQXJlbmEtPnRocmVhZElkLCAqKChEV09SRCAqKXBBcmVuYSAtIDEpLAotICAgICAgICAgICAgICAgICAgICAgICAgcEFyZW5hLT5jYWxsZXJFSVAgKTsKKyAgICAgICAgICAgICAgICBEVU1QKCAiJTA4bHggVXNlZCAlMDhseCAlMDR4IGJhY2s9JTA4bHggRUlQPSUwOGx4XG4iLAorCQkgICAgICAoRFdPUkQpcEFyZW5hLCBwQXJlbmEtPnNpemUgJiBBUkVOQV9TSVpFX01BU0ssCisJCSAgICAgIHBBcmVuYS0+dGhyZWFkSWQsICooKERXT1JEICopcEFyZW5hIC0gMSksCisJCSAgICAgIHBBcmVuYS0+Y2FsbGVyRUlQICk7CiAgICAgICAgICAgICAgICAgcHRyICs9IHNpemVvZigqcEFyZW5hKSArIChwQXJlbmEtPnNpemUgJiBBUkVOQV9TSVpFX01BU0spOwogICAgICAgICAgICAgICAgIGFyZW5hU2l6ZSArPSBzaXplb2YoQVJFTkFfSU5VU0UpOwogICAgICAgICAgICAgICAgIHVzZWRTaXplICs9IHBBcmVuYS0+c2l6ZSAmIEFSRU5BX1NJWkVfTUFTSzsKQEAgLTE2MCwxNyArMTYwLDE3IEBACiAgICAgICAgICAgICBlbHNlCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgQVJFTkFfSU5VU0UgKnBBcmVuYSA9IChBUkVOQV9JTlVTRSAqKXB0cjsKLSAgICAgICAgICAgICAgICBwcmludGYoICIlMDhseCB1c2VkICUwOGx4ICUwNHggRUlQPSUwOGx4XG4iLAotICAgICAgICAgICAgICAgICAgICAgICAgKERXT1JEKXBBcmVuYSwgcEFyZW5hLT5zaXplICYgQVJFTkFfU0laRV9NQVNLLAotICAgICAgICAgICAgICAgICAgICAgICAgcEFyZW5hLT50aHJlYWRJZCwgcEFyZW5hLT5jYWxsZXJFSVAgKTsKKyAgICAgICAgICAgICAgICBEVU1QKCAiJTA4bHggdXNlZCAlMDhseCAlMDR4IEVJUD0lMDhseFxuIiwKKwkJICAgICAgKERXT1JEKXBBcmVuYSwgcEFyZW5hLT5zaXplICYgQVJFTkFfU0laRV9NQVNLLAorCQkgICAgICBwQXJlbmEtPnRocmVhZElkLCBwQXJlbmEtPmNhbGxlckVJUCApOwogICAgICAgICAgICAgICAgIHB0ciArPSBzaXplb2YoKnBBcmVuYSkgKyAocEFyZW5hLT5zaXplICYgQVJFTkFfU0laRV9NQVNLKTsKICAgICAgICAgICAgICAgICBhcmVuYVNpemUgKz0gc2l6ZW9mKEFSRU5BX0lOVVNFKTsKICAgICAgICAgICAgICAgICB1c2VkU2l6ZSArPSBwQXJlbmEtPnNpemUgJiBBUkVOQV9TSVpFX01BU0s7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KLSAgICAgICAgcHJpbnRmKCAiXG5Ub3RhbDogU2l6ZT0lMDhseCBDb21taXR0ZWQ9JTA4bHggRnJlZT0lMDhseCBVc2VkPSUwOGx4IEFyZW5hcz0lMDhseCAoJWxkJSUpXG5cbiIsCi0gICAgICAgICAgICAgICAgc3ViaGVhcC0+c2l6ZSwgc3ViaGVhcC0+Y29tbWl0U2l6ZSwgZnJlZVNpemUsIHVzZWRTaXplLAotICAgICAgICAgICAgICAgIGFyZW5hU2l6ZSwgKGFyZW5hU2l6ZSAqIDEwMCkgLyBzdWJoZWFwLT5zaXplICk7CisgICAgICAgIERVTVAoICJcblRvdGFsOiBTaXplPSUwOGx4IENvbW1pdHRlZD0lMDhseCBGcmVlPSUwOGx4IFVzZWQ9JTA4bHggQXJlbmFzPSUwOGx4ICglbGQlJSlcblxuIiwKKwkgICAgICBzdWJoZWFwLT5zaXplLCBzdWJoZWFwLT5jb21taXRTaXplLCBmcmVlU2l6ZSwgdXNlZFNpemUsCisJICAgICAgYXJlbmFTaXplLCAoYXJlbmFTaXplICogMTAwKSAvIHN1YmhlYXAtPnNpemUgKTsKICAgICAgICAgc3ViaGVhcCA9IHN1YmhlYXAtPm5leHQ7CiAgICAgfQogfQpAQCAtMTc4LDkgKzE3OCwxMyBAQAogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqICAgICAgICAgICBIRUFQX0dldFB0cgorICogUkVUVVJOUworICoJUG9pbnRlciB0byB0aGUgaGVhcAorICoJTlVMTDogRmFpbHVyZQogICovCi1zdGF0aWMgSEVBUCAqSEVBUF9HZXRQdHIoIEhBTkRMRTMyIGhlYXAgKQoteworc3RhdGljIEhFQVAgKkhFQVBfR2V0UHRyKAorICAgICAgICAgICAgIEhBTkRMRTMyIGhlYXAgLyogW2luXSBIYW5kbGUgdG8gdGhlIGhlYXAgKi8KKykgewogICAgIEhFQVAgKmhlYXBQdHIgPSAoSEVBUCAqKWhlYXA7CiAgICAgaWYgKCFoZWFwUHRyIHx8IChoZWFwUHRyLT5tYWdpYyAhPSBIRUFQX01BR0lDKSkKICAgICB7CkBAIC0yMTgsMTEgKzIyMiwxNiBAQAogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqICAgICAgICAgICBIRUFQX0ZpbmRTdWJIZWFwCi0gKgogICogRmluZCB0aGUgc3ViLWhlYXAgY29udGFpbmluZyBhIGdpdmVuIGFkZHJlc3MuCisgKgorICogUkVUVVJOUworICoJUG9pbnRlcjogU3VjY2VzcworICoJTlVMTDogRmFpbHVyZQogICovCi1zdGF0aWMgU1VCSEVBUCAqSEVBUF9GaW5kU3ViSGVhcCggSEVBUCAqaGVhcCwgTFBDVk9JRCBwdHIgKQoteworc3RhdGljIFNVQkhFQVAgKkhFQVBfRmluZFN1YkhlYXAoCisgICAgICAgICAgICAgICAgSEVBUCAqaGVhcCwgLyogW2luXSBIZWFwIHBvaW50ZXIgKi8KKyAgICAgICAgICAgICAgICBMUENWT0lEIHB0ciAvKiBbaW5dIEFkZHJlc3MgKi8KKykgewogICAgIFNVQkhFQVAgKnN1YiA9ICZoZWFwLT5zdWJoZWFwOwogICAgIHdoaWxlIChzdWIpCiAgICAgewpAQCAtNzE3LDExICs3MjYsMjAgQEAKIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKiAgICAgICAgICAgSEVBUF9Jc0luc2lkZUhlYXAKKyAqIENoZWNrcyB3aGV0aGVyIHRoZSBwb2ludGVyIHBvaW50cyB0byBhIGJsb2NrIGluc2lkZSBhIGdpdmVuIGhlYXAuCiAgKgotICogQ2hlY2sgd2hldGhlciB0aGUgcG9pbnRlciBpcyB0byBhIGJsb2NrIGluc2lkZSBhIGdpdmVuIGhlYXAuCisgKiBOT1RFUworICoJU2hvdWxkIHRoaXMgcmV0dXJuIEJPT0wzMj8KKyAqCisgKiBSRVRVUk5TCisgKgkhMDogU3VjY2VzcworICoJMDogRmFpbHVyZQogICovCi1pbnQgSEVBUF9Jc0luc2lkZUhlYXAoIEhBTkRMRTMyIGhlYXAsIERXT1JEIGZsYWdzLCBMUENWT0lEIHB0ciApCi17CitpbnQgSEVBUF9Jc0luc2lkZUhlYXAoCisgICAgSEFORExFMzIgaGVhcCwgLyogW2luXSBIZWFwICovCisgICAgRFdPUkQgZmxhZ3MsICAgLyogW2luXSBGbGFncyAqLworICAgIExQQ1ZPSUQgcHRyICAgIC8qIFtpbl0gUG9pbnRlciAqLworKSB7CiAgICAgSEVBUCAqaGVhcFB0ciA9IEhFQVBfR2V0UHRyKCBoZWFwICk7CiAgICAgU1VCSEVBUCAqc3ViaGVhcDsKICAgICBpbnQgcmV0OwpAQCAtNzgzLDkgKzgwMSwxNSBAQAogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqICAgICAgICAgICBIZWFwQ3JlYXRlICAgKEtFUk5FTDMyLjMzNikKKyAqIFJFVFVSTlMKKyAqCUhhbmRsZSBvZiBoZWFwOiBTdWNjZXNzCisgKglOVUxMOiBGYWlsdXJlCiAgKi8KLUhBTkRMRTMyIFdJTkFQSSBIZWFwQ3JlYXRlKCBEV09SRCBmbGFncywgRFdPUkQgaW5pdGlhbFNpemUsIERXT1JEIG1heFNpemUgKQoteworSEFORExFMzIgV0lOQVBJIEhlYXBDcmVhdGUoCisgICAgICAgICAgICAgICAgRFdPUkQgZmxhZ3MsICAgICAgIC8qIFtpbl0gSGVhcCBhbGxvY2F0aW9uIGZsYWcgKi8KKyAgICAgICAgICAgICAgICBEV09SRCBpbml0aWFsU2l6ZSwgLyogW2luXSBJbml0aWFsIGhlYXAgc2l6ZSAqLworICAgICAgICAgICAgICAgIERXT1JEIG1heFNpemUgICAgICAvKiBbaW5dIE1heGltdW0gaGVhcCBzaXplICovCispIHsKICAgICBpbnQgaTsKICAgICBIRUFQICpoZWFwOwogICAgIFNVQkhFQVAgKnN1YmhlYXA7CkBAIC04NDQsOSArODY4LDEzIEBACiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICogICAgICAgICAgIEhlYXBEZXN0cm95ICAgKEtFUk5FTDMyLjMzNykKKyAqIFJFVFVSTlMKKyAqCVRSVUU6IFN1Y2Nlc3MKKyAqCUZBTFNFOiBGYWlsdXJlCiAgKi8KLUJPT0wzMiBXSU5BUEkgSGVhcERlc3Ryb3koIEhBTkRMRTMyIGhlYXAgKQoteworQk9PTDMyIFdJTkFQSSBIZWFwRGVzdHJveSgKKyAgICAgICAgICAgICAgSEFORExFMzIgaGVhcCAvKiBbaW5dIEhhbmRsZSBvZiBoZWFwICovCispIHsKICAgICBIRUFQICpoZWFwUHRyID0gSEVBUF9HZXRQdHIoIGhlYXAgKTsKICAgICBTVUJIRUFQICpzdWJoZWFwOwogCkBAIC04NjgsOSArODk2LDE1IEBACiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICogICAgICAgICAgIEhlYXBBbGxvYyAgIChLRVJORUwzMi4zMzQpCisgKiBSRVRVUk5TCisgKglQb2ludGVyIHRvIGFsbG9jYXRlZCBtZW1vcnkgYmxvY2sKKyAqCU5VTEw6IEZhaWx1cmUKICAqLwotTFBWT0lEIFdJTkFQSSBIZWFwQWxsb2MoIEhBTkRMRTMyIGhlYXAsIERXT1JEIGZsYWdzLCBEV09SRCBzaXplICkKLXsKK0xQVk9JRCBXSU5BUEkgSGVhcEFsbG9jKAorICAgICAgICAgICAgICBIQU5ETEUzMiBoZWFwLCAvKiBbaW5dIEhhbmRsZSBvZiBwcml2YXRlIGhlYXAgYmxvY2sgKi8KKyAgICAgICAgICAgICAgRFdPUkQgZmxhZ3MsICAgLyogW2luXSBIZWFwIGFsbG9jYXRpb24gY29udHJvbCBmbGFncyAqLworICAgICAgICAgICAgICBEV09SRCBzaXplICAgICAvKiBbaW5dIE51bWJlciBvZiBieXRlcyB0byBhbGxvY2F0ZSAqLworKSB7CiAgICAgQVJFTkFfRlJFRSAqcEFyZW5hOwogICAgIEFSRU5BX0lOVVNFICpwSW5Vc2U7CiAgICAgU1VCSEVBUCAqc3ViaGVhcDsKQEAgLTkyNyw5ICs5NjEsMTUgQEAKIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKiAgICAgICAgICAgSGVhcEZyZWUgICAoS0VSTkVMMzIuMzM4KQorICogUkVUVVJOUworICoJVFJVRTogU3VjY2VzcworICoJRkFMU0U6IEZhaWx1cmUKICAqLwotQk9PTDMyIFdJTkFQSSBIZWFwRnJlZSggSEFORExFMzIgaGVhcCwgRFdPUkQgZmxhZ3MsIExQVk9JRCBwdHIgKQoteworQk9PTDMyIFdJTkFQSSBIZWFwRnJlZSgKKyAgICAgICAgICAgICAgSEFORExFMzIgaGVhcCwgLyogW2luXSBIYW5kbGUgb2YgaGVhcCAqLworICAgICAgICAgICAgICBEV09SRCBmbGFncywgICAvKiBbaW5dIEhlYXAgZnJlZWluZyBmbGFncyAqLworICAgICAgICAgICAgICBMUFZPSUQgcHRyICAgICAvKiBbaW5dIEFkZHJlc3Mgb2YgbWVtb3J5IHRvIGZyZWUgKi8KKykgewogICAgIEFSRU5BX0lOVVNFICpwSW5Vc2U7CiAgICAgU1VCSEVBUCAqc3ViaGVhcDsKICAgICBIRUFQICpoZWFwUHRyID0gSEVBUF9HZXRQdHIoIGhlYXAgKTsKQEAgLTk2Niw5ICsxMDA2LDE2IEBACiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICogICAgICAgICAgIEhlYXBSZUFsbG9jICAgKEtFUk5FTDMyLjM0MCkKKyAqIFJFVFVSTlMKKyAqCVBvaW50ZXIgdG8gcmVhbGxvY2F0ZWQgbWVtb3J5IGJsb2NrCisgKglOVUxMOiBGYWlsdXJlCiAgKi8KLUxQVk9JRCBXSU5BUEkgSGVhcFJlQWxsb2MoIEhBTkRMRTMyIGhlYXAsIERXT1JEIGZsYWdzLCBMUFZPSUQgcHRyLCBEV09SRCBzaXplICkKLXsKK0xQVk9JRCBXSU5BUEkgSGVhcFJlQWxsb2MoCisgICAgICAgICAgICAgIEhBTkRMRTMyIGhlYXAsIC8qIFtpbl0gSGFuZGxlIG9mIGhlYXAgYmxvY2sgKi8KKyAgICAgICAgICAgICAgRFdPUkQgZmxhZ3MsICAgLyogW2luXSBIZWFwIHJlYWxsb2NhdGlvbiBmbGFncyAqLworICAgICAgICAgICAgICBMUFZPSUQgcHRyLCAgICAvKiBbaW5dIEFkZHJlc3Mgb2YgbWVtb3J5IHRvIHJlYWxsb2NhdGUgKi8KKyAgICAgICAgICAgICAgRFdPUkQgc2l6ZSAgICAgLyogW2luXSBOdW1iZXIgb2YgYnl0ZXMgdG8gcmVhbGxvY2F0ZSAqLworKSB7CiAgICAgQVJFTkFfSU5VU0UgKnBBcmVuYTsKICAgICBEV09SRCBvbGRTaXplOwogICAgIEhFQVAgKmhlYXBQdHI7CkBAIC0xMDkxLDkgKzExMzgsMTUgQEAKIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKiAgICAgICAgICAgSGVhcExvY2sgICAoS0VSTkVMMzIuMzM5KQorICogQXR0ZW1wdHMgdG8gYWNxdWlyZSB0aGUgY3JpdGljYWwgc2VjdGlvbiBvYmplY3QgZm9yIGEgc3BlY2lmaWVkIGhlYXAuCisgKgorICogUkVUVVJOUworICoJVFJVRTogU3VjY2VzcworICoJRkFMU0U6IEZhaWx1cmUKICAqLwotQk9PTDMyIFdJTkFQSSBIZWFwTG9jayggSEFORExFMzIgaGVhcCApCi17CitCT09MMzIgV0lOQVBJIEhlYXBMb2NrKAorICAgICAgICAgICAgICBIQU5ETEUzMiBoZWFwIC8qIFtpbl0gSGFuZGxlIG9mIGhlYXAgdG8gbG9jayBmb3IgZXhjbHVzaXZlIGFjY2VzcyAqLworKSB7CiAgICAgSEVBUCAqaGVhcFB0ciA9IEhFQVBfR2V0UHRyKCBoZWFwICk7CiAgICAgaWYgKCFoZWFwUHRyKSByZXR1cm4gRkFMU0U7CiAgICAgRW50ZXJDcml0aWNhbFNlY3Rpb24oICZoZWFwUHRyLT5jcml0U2VjdGlvbiApOwpAQCAtMTEwMyw5ICsxMTU2LDE1IEBACiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICogICAgICAgICAgIEhlYXBVbmxvY2sgICAoS0VSTkVMMzIuMzQyKQorICogUmVsZWFzZXMgb3duZXJzaGlwIG9mIHRoZSBjcml0aWNhbCBzZWN0aW9uIG9iamVjdC4KKyAqCisgKiBSRVRVUk5TCisgKglUUlVFOiBTdWNjZXNzCisgKglGQUxTRTogRmFpbHVyZQogICovCi1CT09MMzIgV0lOQVBJIEhlYXBVbmxvY2soIEhBTkRMRTMyIGhlYXAgKQoteworQk9PTDMyIFdJTkFQSSBIZWFwVW5sb2NrKAorICAgICAgICAgICAgICBIQU5ETEUzMiBoZWFwIC8qIFtpbl0gSGFuZGxlIHRvIHRoZSBoZWFwIHRvIHVubG9jayAqLworKSB7CiAgICAgSEVBUCAqaGVhcFB0ciA9IEhFQVBfR2V0UHRyKCBoZWFwICk7CiAgICAgaWYgKCFoZWFwUHRyKSByZXR1cm4gRkFMU0U7CiAgICAgTGVhdmVDcml0aWNhbFNlY3Rpb24oICZoZWFwUHRyLT5jcml0U2VjdGlvbiApOwpAQCAtMTExNSw5ICsxMTc0LDE1IEBACiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICogICAgICAgICAgIEhlYXBTaXplICAgKEtFUk5FTDMyLjM0MSkKKyAqIFJFVFVSTlMKKyAqCVNpemUgaW4gYnl0ZXMgb2YgYWxsb2NhdGVkIG1lbW9yeQorICoJMDogRmFpbHVyZQogICovCi1EV09SRCBXSU5BUEkgSGVhcFNpemUoIEhBTkRMRTMyIGhlYXAsIERXT1JEIGZsYWdzLCBMUFZPSUQgcHRyICkKLXsKK0RXT1JEIFdJTkFQSSBIZWFwU2l6ZSgKKyAgICAgICAgICAgICBIQU5ETEUzMiBoZWFwLCAvKiBbaW5dIEhhbmRsZSBvZiBoZWFwICovCisgICAgICAgICAgICAgRFdPUkQgZmxhZ3MsICAgLyogW2luXSBIZWFwIHNpemUgY29udHJvbCBmbGFncyAqLworICAgICAgICAgICAgIExQVk9JRCBwdHIgICAgIC8qIFtpbl0gQWRkcmVzcyBvZiBtZW1vcnkgdG8gcmV0dXJuIHNpemUgZm9yICovCispIHsKICAgICBEV09SRCByZXQ7CiAgICAgSEVBUCAqaGVhcFB0ciA9IEhFQVBfR2V0UHRyKCBoZWFwICk7CiAKQEAgLTExNDUsMTEgKzEyMTAsMjIgQEAKIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKiAgICAgICAgICAgSGVhcFZhbGlkYXRlICAgKEtFUk5FTDMyLjM0MykKKyAqIFZhbGlkYXRlcyBhIHNwZWNpZmllZCBoZWFwLgorICoKKyAqIE5PVEVTCisgKglGbGFncyBpcyBpZ25vcmVkLgorICoKKyAqIFJFVFVSTlMKKyAqCVRSVUU6IFN1Y2Nlc3MKKyAqCUZBTFNFOiBGYWlsdXJlCiAgKi8KLUJPT0wzMiBXSU5BUEkgSGVhcFZhbGlkYXRlKCBIQU5ETEUzMiBoZWFwLCBEV09SRCBmbGFncywgTFBDVk9JRCBibG9jayApCi17CitCT09MMzIgV0lOQVBJIEhlYXBWYWxpZGF0ZSgKKyAgICAgICAgICAgICAgSEFORExFMzIgaGVhcCwgLyogW2luXSBIYW5kbGUgdG8gdGhlIGhlYXAgKi8KKyAgICAgICAgICAgICAgRFdPUkQgZmxhZ3MsICAgLyogW2luXSBCaXQgZmxhZ3MgdGhhdCBjb250cm9sIGFjY2VzcyBkdXJpbmcgb3BlcmF0aW9uICovCisgICAgICAgICAgICAgIExQQ1ZPSUQgYmxvY2sgIC8qIFtpbl0gT3B0aW9uYWwgcG9pbnRlciB0byBtZW1vcnkgYmxvY2sgdG8gdmFsaWRhdGUgKi8KKykgewogICAgIFNVQkhFQVAgKnN1YmhlYXA7Ci0gICAgSEVBUCAqaGVhcFB0ciA9IChIRUFQICopaGVhcDsKKyAgICBIRUFQICpoZWFwUHRyID0gSEVBUF9HZXRQdHIoaGVhcCk7CiAKICAgICBpZiAoIWhlYXBQdHIgfHwgKGhlYXBQdHItPm1hZ2ljICE9IEhFQVBfTUFHSUMpKQogICAgIHsKQEAgLTExNTksNiArMTIzNSw3IEBACiAKICAgICBpZiAoYmxvY2spCiAgICAgeworICAgICAgICAvKiBPbmx5IGNoZWNrIHRoaXMgc2luZ2xlIG1lbW9yeSBibG9jayAqLwogICAgICAgICBpZiAoIShzdWJoZWFwID0gSEVBUF9GaW5kU3ViSGVhcCggaGVhcFB0ciwgYmxvY2sgKSkgfHwKICAgICAgICAgICAgICgoY2hhciAqKWJsb2NrIDwgKGNoYXIgKilzdWJoZWFwICsgc3ViaGVhcC0+aGVhZGVyU2l6ZQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBzaXplb2YoQVJFTkFfSU5VU0UpKSkKQEAgLTExOTcsOSArMTI3NCwxNiBAQAogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqICAgICAgICAgICBIZWFwV2FsayAgIChLRVJORUwzMi4zNDQpCisgKiBFbnVtZXJhdGVzIHRoZSBtZW1vcnkgYmxvY2tzIGluIGEgc3BlY2lmaWVkIGhlYXAuCisgKgorICogUkVUVVJOUworICoJVFJVRTogU3VjY2VzcworICoJRkFMU0U6IEZhaWx1cmUKICAqLwotQk9PTDMyIFdJTkFQSSBIZWFwV2FsayggSEFORExFMzIgaGVhcCwgdm9pZCAqZW50cnkgKQoteworQk9PTDMyIFdJTkFQSSBIZWFwV2FsaygKKyAgICAgICAgICAgICAgSEFORExFMzIgaGVhcCwgICAgICAgICAgICAgICAvKiBbaW5dICBIYW5kbGUgdG8gaGVhcCB0byBlbnVtZXJhdGUgKi8KKyAgICAgICAgICAgICAgTFBQUk9DRVNTX0hFQVBfRU5UUlkgKmVudHJ5ICAvKiBbb3V0XSBQb2ludGVyIHRvIHN0cnVjdHVyZSBvZiBlbnVtZXJhdGlvbiBpbmZvICovCispIHsKICAgICBmcHJpbnRmKCBzdGRlcnIsICJIZWFwV2FsayglMDh4KTogbm90IGltcGxlbWVudGVkXG4iLCBoZWFwICk7CiAgICAgcmV0dXJuIEZBTFNFOwogfQpkaWZmIC0tZ2l0IGEvbWVtb3J5L2xvY2FsLmMgYi9tZW1vcnkvbG9jYWwuYwppbmRleCA0NzlkMzgyLi45MTA2NjVmIDEwMDY0NAotLS0gYS9tZW1vcnkvbG9jYWwuYworKysgYi9tZW1vcnkvbG9jYWwuYwpAQCAtMjY2LDQzICsyNjYsNDMgQEAKIAogICAgIGlmICghcEluZm8pCiAgICAgewotICAgICAgICBwcmludGYoICJMb2NhbCBIZWFwIGNvcnJ1cHRlZCEgIGRzPSUwNHhcbiIsIGRzICk7CisgICAgICAgIERVTVAoICJMb2NhbCBIZWFwIGNvcnJ1cHRlZCEgIGRzPSUwNHhcbiIsIGRzICk7CiAgICAgICAgIHJldHVybjsKICAgICB9Ci0gICAgcHJpbnRmKCAiTG9jYWwgSGVhcCAgZHM9JTA0eCBmaXJzdD0lMDR4IGxhc3Q9JTA0eCBpdGVtcz0lZFxuIiwKLSAgICAgICAgICAgIGRzLCBwSW5mby0+Zmlyc3QsIHBJbmZvLT5sYXN0LCBwSW5mby0+aXRlbXMgKTsKKyAgICBEVU1QKCAiTG9jYWwgSGVhcCAgZHM9JTA0eCBmaXJzdD0lMDR4IGxhc3Q9JTA0eCBpdGVtcz0lZFxuIiwKKwkgIGRzLCBwSW5mby0+Zmlyc3QsIHBJbmZvLT5sYXN0LCBwSW5mby0+aXRlbXMgKTsKIAogICAgIGFyZW5hID0gcEluZm8tPmZpcnN0OwogICAgIGZvciAoOzspCiAgICAgewogICAgICAgICBMT0NBTEFSRU5BICpwQXJlbmEgPSBBUkVOQV9QVFIocHRyLGFyZW5hKTsKLSAgICAgICAgcHJpbnRmKCAiICAlMDR4OiBwcmV2PSUwNHggbmV4dD0lMDR4IHR5cGU9JWRcbiIsIGFyZW5hLAotICAgICAgICAgICAgICAgIHBBcmVuYS0+cHJldiAmIH4zLCBwQXJlbmEtPm5leHQsIHBBcmVuYS0+cHJldiAmIDMgKTsKKyAgICAgICAgRFVNUCggIiAgJTA0eDogcHJldj0lMDR4IG5leHQ9JTA0eCB0eXBlPSVkXG4iLCBhcmVuYSwKKwkgICAgICBwQXJlbmEtPnByZXYgJiB+MywgcEFyZW5hLT5uZXh0LCBwQXJlbmEtPnByZXYgJiAzICk7CiAgICAgICAgIGlmIChhcmVuYSA9PSBwSW5mby0+Zmlyc3QpCiAJewotICAgICAgICAgICAgcHJpbnRmKCAiICAgICAgICBzaXplPSVkIGZyZWVfcHJldj0lMDR4IGZyZWVfbmV4dD0lMDR4XG4iLAotICAgICAgICAgICAgICAgICAgICBwQXJlbmEtPnNpemUsIHBBcmVuYS0+ZnJlZV9wcmV2LCBwQXJlbmEtPmZyZWVfbmV4dCApOworICAgICAgICAgICAgRFVNUCggIiAgICAgICAgc2l6ZT0lZCBmcmVlX3ByZXY9JTA0eCBmcmVlX25leHQ9JTA0eFxuIiwKKwkJICBwQXJlbmEtPnNpemUsIHBBcmVuYS0+ZnJlZV9wcmV2LCBwQXJlbmEtPmZyZWVfbmV4dCApOwogCX0KICAgICAgICAgaWYgKChwQXJlbmEtPnByZXYgJiAzKSA9PSBMT0NBTF9BUkVOQV9GUkVFKQogICAgICAgICB7Ci0gICAgICAgICAgICBwcmludGYoICIgICAgICAgIHNpemU9JWQgZnJlZV9wcmV2PSUwNHggZnJlZV9uZXh0PSUwNHhcbiIsCi0gICAgICAgICAgICAgICAgICAgIHBBcmVuYS0+c2l6ZSwgcEFyZW5hLT5mcmVlX3ByZXYsIHBBcmVuYS0+ZnJlZV9uZXh0ICk7CisgICAgICAgICAgICBEVU1QKCAiICAgICAgICBzaXplPSVkIGZyZWVfcHJldj0lMDR4IGZyZWVfbmV4dD0lMDR4XG4iLAorCQkgIHBBcmVuYS0+c2l6ZSwgcEFyZW5hLT5mcmVlX3ByZXYsIHBBcmVuYS0+ZnJlZV9uZXh0ICk7CiAgICAgICAgICAgICBpZiAocEFyZW5hLT5uZXh0ID09IGFyZW5hKSBicmVhazsgIC8qIGxhc3Qgb25lICovCiAgICAgICAgICAgICBpZiAoQVJFTkFfUFRSKHB0cixwQXJlbmEtPmZyZWVfbmV4dCktPmZyZWVfcHJldiAhPSBhcmVuYSkKICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBwcmludGYoICIqKiogYXJlbmEtPmZyZWVfbmV4dC0+ZnJlZV9wcmV2ICE9IGFyZW5hXG4iICk7CisgICAgICAgICAgICAgICAgRFVNUCggIioqKiBhcmVuYS0+ZnJlZV9uZXh0LT5mcmVlX3ByZXYgIT0gYXJlbmFcbiIgKTsKICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgIH0KICAgICAgICAgfQogICAgICAgICBpZiAocEFyZW5hLT5uZXh0ID09IGFyZW5hKQogICAgICAgICB7Ci0gICAgICAgICAgICBwcmludGYoICIqKiogbGFzdCBibG9jayBpcyBub3QgbWFya2VkIGZyZWVcbiIgKTsKKwkgICAgRFVNUCggIioqKiBsYXN0IGJsb2NrIGlzIG5vdCBtYXJrZWQgZnJlZVxuIiApOwogICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIH0KICAgICAgICAgaWYgKChBUkVOQV9QVFIocHRyLHBBcmVuYS0+bmV4dCktPnByZXYgJiB+MykgIT0gYXJlbmEpCiAgICAgICAgIHsKLSAgICAgICAgICAgIHByaW50ZiggIioqKiBhcmVuYS0+bmV4dC0+cHJldiAhPSBhcmVuYSAoJTA0eCwgJTA0eClcbiIsCi0JCSAgIHBBcmVuYS0+bmV4dCwgQVJFTkFfUFRSKHB0cixwQXJlbmEtPm5leHQpLT5wcmV2KTsKKyAgICAgICAgICAgIERVTVAoICIqKiogYXJlbmEtPm5leHQtPnByZXYgIT0gYXJlbmEgKCUwNHgsICUwNHgpXG4iLAorCQkgIHBBcmVuYS0+bmV4dCwgQVJFTkFfUFRSKHB0cixwQXJlbmEtPm5leHQpLT5wcmV2KTsKICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICB9CiAgICAgICAgIGFyZW5hID0gcEFyZW5hLT5uZXh0OwpAQCAtNzE3LDcgKzcxNyw3IEBACiAgICAgICAgICAgICAgICAgICAgIC8qIEZyZWUgdGhlIG9sZCBsb2NhdGlvbiAqLyAgCiAgICAgICAgICAgICAgICAgICAgIExPQ0FMX0ZyZWVBcmVuYShkcywgbW92ZWFyZW5hKTsKICAgICAgICAgICAgICAgICAgICAgLyogVXBkYXRlIGhhbmRsZSB0YWJsZSBlbnRyeSAqLwotICAgICAgICAgICAgICAgICAgICBwRW50cnktPmFkZHIgPSBmaW5hbGFyZW5hICsgQVJFTkFfSEVBREVSX1NJWkU7CisgICAgICAgICAgICAgICAgICAgIHBFbnRyeS0+YWRkciA9IGZpbmFsYXJlbmEgKyBBUkVOQV9IRUFERVJfU0laRSArIHNpemVvZihITE9DQUwxNikgOwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICBlbHNlIGlmKChBUkVOQV9QVFIocHRyLCBwTW92ZUFyZW5hLT5wcmV2ICYgfjMpLT5wcmV2ICYgMykKIAkJCSAgICAgICA9PSBMT0NBTF9BUkVOQV9GUkVFKQpAQCAtNzI3LDcgKzcyNyw3IEBACiAgICAgICAgICAgICAgICAgICAgIGZpbmFsYXJlbmEgPSBwTW92ZUFyZW5hLT5wcmV2ICYgfjM7CiAgICAgICAgICAgICAgICAgICAgIExPQ0FMX0dyb3dBcmVuYURvd253YXJkKCBkcywgbW92ZWFyZW5hLCBtb3Zlc2l6ZSApOwogICAgICAgICAgICAgICAgICAgICAvKiBVcGRhdGUgaGFuZGxlIHRhYmxlIGVudHJ5ICovCi0gICAgICAgICAgICAgICAgICAgIHBFbnRyeS0+YWRkciA9IGZpbmFsYXJlbmEgKyBBUkVOQV9IRUFERVJfU0laRTsKKyAgICAgICAgICAgICAgICAgICAgcEVudHJ5LT5hZGRyID0gZmluYWxhcmVuYSArIEFSRU5BX0hFQURFUl9TSVpFICsgc2l6ZW9mKEhMT0NBTDE2KSA7CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfQogICAgICAgICB9CkBAIC0xMjQ2LDcgKzEyNDYsMTIgQEAKICAgICB9CiAgICAgaWYoSEFORExFX01PVkVBQkxFKGhhbmRsZSkpIHNpemUgKz0gc2l6ZW9mKEhMT0NBTDE2KTsKICAgICBobWVtID0gTE9DQUxfR2V0QmxvY2soIGRzLCBzaXplLCBmbGFncyApOwotICAgIHB0ciA9IFBUUl9TRUdfT0ZGX1RPX0xJTiggZHMsIDAgKTsgIC8qIFJlbG9hZCBwdHIgKi8KKyAgICBwdHIgPSBQVFJfU0VHX09GRl9UT19MSU4oIGRzLCAwICk7ICAvKiBSZWxvYWQgcHRyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAgIGlmKEhBTkRMRV9NT1ZFQUJMRShoYW5kbGUpKSAgICAgICAgIC8qIExPQ0FMX0dldEJsb2NrIG1pZ2h0IGhhdmUgdHJpZ2dlcmVkICAgICovCisgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogYSBjb21wYWN0aW9uLCB3aGljaCBtaWdodCBpbiB0dXJuIGhhdmUgKi8KKyAgICAgIGJsb2NraGFuZGxlID0gcEVudHJ5LT5hZGRyIDsgICAgICAvKiBtb3ZlZCB0aGUgdmVyeSBibG9jayB3ZSBhcmUgcmVzaXppbmcgICAqLworICAgICAgYXJlbmEgPSBBUkVOQV9IRUFERVIoIGJsb2NraGFuZGxlICk7ICAgLyogdGh1cywgd2UgcmVsb2FkIGFyZW5hLCB0b28gICAgICAgICovCisgICAgfQogICAgIGlmICghaG1lbSkKICAgICB7CiAgICAgICAgIC8qIFJlbW92ZSB0aGUgYmxvY2sgZnJvbSB0aGUgaGVhcCBhbmQgdHJ5IGFnYWluICovCkBAIC0xNTY5LDEyICsxNTc0LDEyIEBACiAKICAgICBpZiAoIShwSW5mbyA9IExPQ0FMX0dldEhlYXAoIGRzICkpKQogICAgIHsKLSAgICAgICAgZnByaW50Ziggc3RkZXJyLCAiTE9DQUxfTm90aWZ5KCUwNHgpOiBMb2NhbCBoZWFwIG5vdCBmb3VuZFxuIiwgZHMgKTsKKyAgICAgICAgRVJSKGxvY2FsLCAiKCUwNHgpOiBMb2NhbCBoZWFwIG5vdCBmb3VuZFxuIiwgZHMgKTsKIAlMT0NBTF9QcmludEhlYXAoIGRzICk7CiAJcmV0dXJuIDA7CiAgICAgfQogICAgIFRSQUNFKGxvY2FsLCAiKCUwNHgpOiAlMDhseFxuIiwgZHMsIChEV09SRClmdW5jICk7Ci0gICAgZnByaW50ZihzdGRuaW1wLCAiTG9jYWxOb3RpZnkoKTogSGFsZiBpbXBsZW1lbnRlZFxuIik7CisgICAgRklYTUUobG9jYWwsICJIYWxmIGltcGxlbWVudGVkXG4iKTsKICAgICBvbGROb3RpZnkgPSBwSW5mby0+bm90aWZ5OwogICAgIHBJbmZvLT5ub3RpZnkgPSBmdW5jOwogICAgIHJldHVybiBvbGROb3RpZnk7CkBAIC0xNjMzLDcgKzE2MzgsNyBAQAogCiAgICAgaWYgKCEocEluZm8gPSBMT0NBTF9HZXRIZWFwKCBDVVJSRU5UX0RTICkpKQogICAgIHsKLSAgICAgICAgZnByaW50Ziggc3RkZXJyLCAiTG9jYWxIYW5kbGVEZWx0YTogTG9jYWwgaGVhcCBub3QgZm91bmRcbiIpOworICAgICAgICBFUlIobG9jYWwsICJMb2NhbCBoZWFwIG5vdCBmb3VuZFxuIik7CiAJTE9DQUxfUHJpbnRIZWFwKCBDVVJSRU5UX0RTICk7CiAJcmV0dXJuIDA7CiAgICAgfQpAQCAtMTcwNyw5ICsxNzEyLDE0IEBACiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICogICAgICAgICAgIExvY2FsQWxsb2MzMiAgIChLRVJORUwzMi4zNzEpCisgKiBSRVRVUk5TCisgKglIYW5kbGU6IFN1Y2Nlc3MKKyAqCU5VTEw6IEZhaWx1cmUKICAqLwotSExPQ0FMMzIgV0lOQVBJIExvY2FsQWxsb2MzMiggVUlOVDMyIGZsYWdzLCBEV09SRCBzaXplICkKLXsKK0hMT0NBTDMyIFdJTkFQSSBMb2NhbEFsbG9jMzIoCisgICAgICAgICAgICAgICAgVUlOVDMyIGZsYWdzLCAvKiBbaW5dIEFsbG9jYXRpb24gYXR0cmlidXRlcyAqLworICAgICAgICAgICAgICAgIERXT1JEIHNpemUgICAgLyogW2luXSBOdW1iZXIgb2YgYnl0ZXMgdG8gYWxsb2NhdGUgKi8KKykgewogICAgIHJldHVybiAoSExPQ0FMMzIpR2xvYmFsQWxsb2MzMiggZmxhZ3MsIHNpemUgKTsKIH0KIApAQCAtMTcyNSw0NSArMTczNSw3MCBAQAogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqICAgICAgICAgICBMb2NhbEZsYWdzMzIgICAoS0VSTkVMMzIuMzc0KQorICogUkVUVVJOUworICoJVmFsdWUgc3BlY2lmeWluZyBhbGxvY2F0aW9uIGZsYWdzIGFuZCBsb2NrIGNvdW50LgorICoJTE1FTV9JTlZBTElEX0hBTkRMRTogRmFpbHVyZQogICovCi1VSU5UMzIgV0lOQVBJIExvY2FsRmxhZ3MzMiggSExPQ0FMMzIgaGFuZGxlICkKLXsKK1VJTlQzMiBXSU5BUEkgTG9jYWxGbGFnczMyKAorICAgICAgICAgICAgICBITE9DQUwzMiBoYW5kbGUgLyogW2luXSBIYW5kbGUgb2YgbWVtb3J5IG9iamVjdCAqLworKSB7CiAgICAgcmV0dXJuIEdsb2JhbEZsYWdzMzIoIChIR0xPQkFMMzIpaGFuZGxlICk7CiB9CiAKIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKiAgICAgICAgICAgTG9jYWxGcmVlMzIgICAoS0VSTkVMMzIuMzc1KQorICogUkVUVVJOUworICoJTlVMTDogU3VjY2VzcworICoJSGFuZGxlOiBGYWlsdXJlCiAgKi8KLUhMT0NBTDMyIFdJTkFQSSBMb2NhbEZyZWUzMiggSExPQ0FMMzIgaGFuZGxlICkKLXsKK0hMT0NBTDMyIFdJTkFQSSBMb2NhbEZyZWUzMigKKyAgICAgICAgICAgICAgICBITE9DQUwzMiBoYW5kbGUgLyogW2luXSBIYW5kbGUgb2YgbWVtb3J5IG9iamVjdCAqLworKSB7CiAgICAgcmV0dXJuIChITE9DQUwzMilHbG9iYWxGcmVlMzIoIChIR0xPQkFMMzIpaGFuZGxlICk7CiB9CiAKIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKiAgICAgICAgICAgTG9jYWxIYW5kbGUzMiAgIChLRVJORUwzMi4zNzYpCisgKiBSRVRVUk5TCisgKglIYW5kbGU6IFN1Y2Nlc3MKKyAqCU5VTEw6IEZhaWx1cmUKICAqLwotSExPQ0FMMzIgV0lOQVBJIExvY2FsSGFuZGxlMzIoIExQQ1ZPSUQgcHRyICkKLXsKK0hMT0NBTDMyIFdJTkFQSSBMb2NhbEhhbmRsZTMyKAorICAgICAgICAgICAgICAgIExQQ1ZPSUQgcHRyIC8qIFtpbl0gQWRkcmVzcyBvZiBsb2NhbCBtZW1vcnkgb2JqZWN0ICovCispIHsKICAgICByZXR1cm4gKEhMT0NBTDMyKUdsb2JhbEhhbmRsZTMyKCBwdHIgKTsKIH0KIAogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqICAgICAgICAgICBMb2NhbExvY2szMiAgIChLRVJORUwzMi4zNzcpCisgKiBMb2NrcyBhIGxvY2FsIG1lbW9yeSBvYmplY3QgYW5kIHJldHVybnMgcG9pbnRlciB0byB0aGUgZmlyc3QgYnl0ZQorICogb2YgdGhlIG1lbW9yeSBibG9jay4KKyAqCisgKiBSRVRVUk5TCisgKglQb2ludGVyOiBTdWNjZXNzCisgKglOVUxMOiBGYWlsdXJlCiAgKi8KLUxQVk9JRCBXSU5BUEkgTG9jYWxMb2NrMzIoIEhMT0NBTDMyIGhhbmRsZSApCi17CitMUFZPSUQgV0lOQVBJIExvY2FsTG9jazMyKAorICAgICAgICAgICAgICBITE9DQUwzMiBoYW5kbGUgLyogW2luXSBBZGRyZXNzIG9mIGxvY2FsIG1lbW9yeSBvYmplY3QgKi8KKykgewogICAgIHJldHVybiBHbG9iYWxMb2NrMzIoIChIR0xPQkFMMzIpaGFuZGxlICk7CiB9CiAKIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKiAgICAgICAgICAgTG9jYWxSZUFsbG9jMzIgICAoS0VSTkVMMzIuMzc4KQorICogUkVUVVJOUworICoJSGFuZGxlOiBTdWNjZXNzCisgKglOVUxMOiBGYWlsdXJlCiAgKi8KLUhMT0NBTDMyIFdJTkFQSSBMb2NhbFJlQWxsb2MzMiggSExPQ0FMMzIgaGFuZGxlLCBEV09SRCBzaXplLCBVSU5UMzIgZmxhZ3MgKQoteworSExPQ0FMMzIgV0lOQVBJIExvY2FsUmVBbGxvYzMyKAorICAgICAgICAgICAgICAgIEhMT0NBTDMyIGhhbmRsZSwgLyogW2luXSBIYW5kbGUgb2YgbWVtb3J5IG9iamVjdCAqLworICAgICAgICAgICAgICAgIERXT1JEIHNpemUsICAgICAgLyogW2luXSBOZXcgc2l6ZSBvZiBibG9jayAqLworICAgICAgICAgICAgICAgIFVJTlQzMiBmbGFncyAgICAgLyogW2luXSBIb3cgdG8gcmVhbGxvY2F0ZSBvYmplY3QgKi8KKykgewogICAgIHJldHVybiAoSExPQ0FMMzIpR2xvYmFsUmVBbGxvYzMyKCAoSEdMT0JBTDMyKWhhbmRsZSwgc2l6ZSwgZmxhZ3MgKTsKIH0KIApAQCAtMTc3OSwxNyArMTgxNCwyNSBAQAogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqICAgICAgICAgICBMb2NhbFNpemUzMiAgIChLRVJORUwzMi4zODApCisgKiBSRVRVUk5TCisgKglTaXplOiBTdWNjZXNzCisgKgkwOiBGYWlsdXJlCiAgKi8KLVVJTlQzMiBXSU5BUEkgTG9jYWxTaXplMzIoIEhMT0NBTDMyIGhhbmRsZSApCi17CitVSU5UMzIgV0lOQVBJIExvY2FsU2l6ZTMyKAorICAgICAgICAgICAgICBITE9DQUwzMiBoYW5kbGUgLyogW2luXSBIYW5kbGUgb2YgbWVtb3J5IG9iamVjdCAqLworKSB7CiAgICAgcmV0dXJuIEdsb2JhbFNpemUzMiggKEhHTE9CQUwzMiloYW5kbGUgKTsKIH0KIAogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqICAgICAgICAgICBMb2NhbFVubG9jazMyICAgKEtFUk5FTDMyLjM4MSkKKyAqIFJFVFVSTlMKKyAqCVRSVUU6IE9iamVjdCBpcyBzdGlsbCBsb2NrZWQKKyAqCUZBTFNFOiBPYmplY3QgaXMgdW5sb2NrZWQKICAqLwotQk9PTDMyIFdJTkFQSSBMb2NhbFVubG9jazMyKCBITE9DQUwzMiBoYW5kbGUgKQoteworQk9PTDMyIFdJTkFQSSBMb2NhbFVubG9jazMyKAorICAgICAgICAgICAgICBITE9DQUwzMiBoYW5kbGUgLyogW2luXSBIYW5kbGUgb2YgbWVtb3J5IG9iamVjdCAqLworKSB7CiAgICAgcmV0dXJuIEdsb2JhbFVubG9jazMyKCAoSEdMT0JBTDMyKWhhbmRsZSApOwogfQpkaWZmIC0tZ2l0IGEvbWVtb3J5L3N0cmluZy5jIGIvbWVtb3J5L3N0cmluZy5jCmluZGV4IDY1ZTU3MDkuLjZlMDYzYTggMTAwNjQ0Ci0tLSBhL21lbW9yeS9zdHJpbmcuYworKysgYi9tZW1vcnkvc3RyaW5nLmMKQEAgLTExLDcgKzExLDYgQEAKICNpbmNsdWRlICJ3aW5lcnJvci5oIgogI2luY2x1ZGUgImxkdC5oIgogI2luY2x1ZGUgImRlYnVnLmgiCi0jaW5jbHVkZSAiZGVidWdzdHIuaCIKIAogc3RhdGljIGNvbnN0IEJZVEUgU1RSSU5HX09lbTJBbnNpWzI1Nl0gPQogIlwwMDBcMDAxXDAwMlwwMDNcMDA0XDAwNVwwMDZcMDA3XDAxMFwwMTFcMDEyXDAxM1wwMTRcMDE1XDAxNlwyNDQiCmRpZmYgLS1naXQgYS9tZW1vcnkvdmlydHVhbC5jIGIvbWVtb3J5L3ZpcnR1YWwuYwppbmRleCA5MzdlNDgyLi5mMTI4Y2MxIDEwMDY0NAotLS0gYS9tZW1vcnkvdmlydHVhbC5jCisrKyBiL21lbW9yeS92aXJ0dWFsLmMKQEAgLTEzNywyOCArMTM3LDI4IEBACiAgICAgVUlOVDMyIGFkZHIgPSB2aWV3LT5iYXNlOwogICAgIEJZVEUgcHJvdCA9IHZpZXctPnByb3RbMF07CiAKLSAgICBwcmludGYoICJWaWV3OiAlMDh4IC0gJTA4eCVzIiwKLSAgICAgICAgICAgICB2aWV3LT5iYXNlLCB2aWV3LT5iYXNlICsgdmlldy0+c2l6ZSAtIDEsCi0gICAgICAgICAgICAgKHZpZXctPmZsYWdzICYgVkZMQUdfU1lTVEVNKSA/ICIgKHN5c3RlbSkiIDogIiIgKTsKKyAgICBEVU1QKCAiVmlldzogJTA4eCAtICUwOHglcyIsCisJICB2aWV3LT5iYXNlLCB2aWV3LT5iYXNlICsgdmlldy0+c2l6ZSAtIDEsCisJICAodmlldy0+ZmxhZ3MgJiBWRkxBR19TWVNURU0pID8gIiAoc3lzdGVtKSIgOiAiIiApOwogICAgIGlmICh2aWV3LT5tYXBwaW5nICYmIHZpZXctPm1hcHBpbmctPmZpbGUpCi0gICAgICAgIHByaW50ZiggIiAlcyBAICUwOHhcbiIsIHZpZXctPm1hcHBpbmctPmZpbGUtPnVuaXhfbmFtZSwgdmlldy0+b2Zmc2V0ICk7CisgICAgICAgIERVTVAoICIgJXMgQCAlMDh4XG4iLCB2aWV3LT5tYXBwaW5nLT5maWxlLT51bml4X25hbWUsIHZpZXctPm9mZnNldCApOwogICAgIGVsc2UKLSAgICAgICAgcHJpbnRmKCAiIChhbm9ueW1vdXMpXG4iKTsKKyAgICAgICAgRFVNUCggIiAoYW5vbnltb3VzKVxuIik7CiAKICAgICBmb3IgKGNvdW50ID0gaSA9IDE7IGkgPCB2aWV3LT5zaXplID4+IHBhZ2Vfc2hpZnQ7IGkrKywgY291bnQrKykKICAgICB7CiAgICAgICAgIGlmICh2aWV3LT5wcm90W2ldID09IHByb3QpIGNvbnRpbnVlOwotICAgICAgICBwcmludGYoICIgICAgICAlMDh4IC0gJTA4eCAlc1xuIiwKLSAgICAgICAgICAgICAgICBhZGRyLCBhZGRyICsgKGNvdW50IDw8IHBhZ2Vfc2hpZnQpIC0gMSwKLSAgICAgICAgICAgICAgICBWSVJUVUFMX0dldFByb3RTdHIocHJvdCkgKTsKKyAgICAgICAgRFVNUCggIiAgICAgICUwOHggLSAlMDh4ICVzXG4iLAorCSAgICAgIGFkZHIsIGFkZHIgKyAoY291bnQgPDwgcGFnZV9zaGlmdCkgLSAxLAorCSAgICAgIFZJUlRVQUxfR2V0UHJvdFN0cihwcm90KSApOwogICAgICAgICBhZGRyICs9IChjb3VudCA8PCBwYWdlX3NoaWZ0KTsKICAgICAgICAgcHJvdCA9IHZpZXctPnByb3RbaV07CiAgICAgICAgIGNvdW50ID0gMDsKICAgICB9CiAgICAgaWYgKGNvdW50KQotICAgICAgICBwcmludGYoICIgICAgICAlMDh4IC0gJTA4eCAlc1xuIiwKLSAgICAgICAgICAgICAgICBhZGRyLCBhZGRyICsgKGNvdW50IDw8IHBhZ2Vfc2hpZnQpIC0gMSwKLSAgICAgICAgICAgICAgICBWSVJUVUFMX0dldFByb3RTdHIocHJvdCkgKTsKKyAgICAgICAgRFVNUCggIiAgICAgICUwOHggLSAlMDh4ICVzXG4iLAorCSAgICAgIGFkZHIsIGFkZHIgKyAoY291bnQgPDwgcGFnZV9zaGlmdCkgLSAxLAorCSAgICAgIFZJUlRVQUxfR2V0UHJvdFN0cihwcm90KSApOwogfQogCiAKQEAgLTE2OCw3ICsxNjgsNyBAQAogdm9pZCBWSVJUVUFMX0R1bXAodm9pZCkKIHsKICAgICBGSUxFX1ZJRVcgKnZpZXcgPSBWSVJUVUFMX0ZpcnN0VmlldzsKLSAgICBwcmludGYoICJcbkR1bXAgb2YgYWxsIHZpcnR1YWwgbWVtb3J5IHZpZXdzOlxuXG4iICk7CisgICAgRFVNUCggIlxuRHVtcCBvZiBhbGwgdmlydHVhbCBtZW1vcnkgdmlld3M6XG5cbiIgKTsKICAgICB3aGlsZSAodmlldykKICAgICB7CiAgICAgICAgIFZJUlRVQUxfRHVtcFZpZXcoIHZpZXcgKTsKQEAgLTE4MSw5ICsxODEsMTQgQEAKICAqICAgICAgICAgICBWSVJUVUFMX0ZpbmRWaWV3CiAgKgogICogRmluZCB0aGUgdmlldyBjb250YWluaW5nIGEgZ2l2ZW4gYWRkcmVzcy4KKyAqCisgKiBSRVRVUk5TCisgKglWaWV3OiBTdWNjZXNzCisgKglOVUxMOiBGYWlsdXJlCiAgKi8KLXN0YXRpYyBGSUxFX1ZJRVcgKlZJUlRVQUxfRmluZFZpZXcoIFVJTlQzMiBhZGRyICkKLXsKK3N0YXRpYyBGSUxFX1ZJRVcgKlZJUlRVQUxfRmluZFZpZXcoCisgICAgICAgICAgICAgICAgICBVSU5UMzIgYWRkciAvKiBbaW5dIEFkZHJlc3MgKi8KKykgewogICAgIEZJTEVfVklFVyAqdmlldyA9IFZJUlRVQUxfRmlyc3RWaWV3OwogICAgIHdoaWxlICh2aWV3KQogICAgIHsKQEAgLTI0NSwxMSArMjUwLDE0IEBACiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICogICAgICAgICAgIFZJUlRVQUxfRGVsZXRlVmlldworICogRGVsZXRlcyBhIHZpZXcuCiAgKgotICogRGVsZXRlIGFuIHZpZXcuCisgKiBSRVRVUk5TCisgKglOb25lCiAgKi8KLXN0YXRpYyB2b2lkIFZJUlRVQUxfRGVsZXRlVmlldyggRklMRV9WSUVXICp2aWV3ICkKLXsKK3N0YXRpYyB2b2lkIFZJUlRVQUxfRGVsZXRlVmlldygKKyAgICAgICAgICAgIEZJTEVfVklFVyAqdmlldyAvKiBbaW5dIFZpZXcgKi8KKykgewogICAgIEZJTEVfbXVubWFwKCAodm9pZCAqKXZpZXctPmJhc2UsIDAsIHZpZXctPnNpemUgKTsKICAgICBpZiAodmlldy0+bmV4dCkgdmlldy0+bmV4dC0+cHJldiA9IHZpZXctPnByZXY7CiAgICAgaWYgKHZpZXctPnByZXYpIHZpZXctPnByZXYtPm5leHQgPSB2aWV3LT5uZXh0OwpAQCAtMjgxLDkgKzI4OSwxNSBAQAogICogICAgICAgICAgIFZJUlRVQUxfR2V0V2luMzJQcm90CiAgKgogICogQ29udmVydCBwYWdlIHByb3RlY3Rpb25zIHRvIFdpbjMyIGZsYWdzLgorICoKKyAqIFJFVFVSTlMKKyAqCU5vbmUKICAqLwotc3RhdGljIHZvaWQgVklSVFVBTF9HZXRXaW4zMlByb3QoIEJZVEUgdnByb3QsIERXT1JEICpwcm90ZWN0LCBEV09SRCAqc3RhdGUgKQoteworc3RhdGljIHZvaWQgVklSVFVBTF9HZXRXaW4zMlByb3QoCisgICAgICAgICAgICBCWVRFIHZwcm90LCAgICAgLyogW2luXSBQYWdlIHByb3RlY3Rpb24gZmxhZ3MgKi8KKyAgICAgICAgICAgIERXT1JEICpwcm90ZWN0LCAvKiBbb3V0XSBMb2NhdGlvbiB0byBzdG9yZSBXaW4zMiBwcm90ZWN0aW9uIGZsYWdzICovCisgICAgICAgICAgICBEV09SRCAqc3RhdGUgICAgLyogW291dF0gTG9jYXRpb24gdG8gc3RvcmUgbWVtIHN0YXRlIGZsYWcgKi8KKykgewogICAgIGlmIChwcm90ZWN0KSB7CiAgICAgCSpwcm90ZWN0ID0gVklSVFVBTF9XaW4zMkZsYWdzW3Zwcm90ICYgMHgwZl07CiAgICAgCWlmICh2cHJvdCAmIFZQUk9UX0dVQVJEKSAqcHJvdGVjdCB8PSBQQUdFX0dVQVJEOwpAQCAtMjk4LDkgKzMxMiwxMyBAQAogICogICAgICAgICAgIFZJUlRVQUxfR2V0UHJvdAogICoKICAqIEJ1aWxkIHBhZ2UgcHJvdGVjdGlvbnMgZnJvbSBXaW4zMiBmbGFncy4KKyAqCisgKiBSRVRVUk5TCisgKglWYWx1ZSBvZiBwYWdlIHByb3RlY3Rpb24gZmxhZ3MKICAqLwotc3RhdGljIEJZVEUgVklSVFVBTF9HZXRQcm90KCBEV09SRCBwcm90ZWN0ICkKLXsKK3N0YXRpYyBCWVRFIFZJUlRVQUxfR2V0UHJvdCgKKyAgICAgICAgICAgIERXT1JEIHByb3RlY3QgIC8qIFtpbl0gV2luMzIgcHJvdGVjdGlvbiBmbGFncyAqLworKSB7CiAgICAgQllURSB2cHJvdDsKIAogICAgIHN3aXRjaChwcm90ZWN0ICYgMHhmZikKQEAgLTM0MSwxMCArMzU5LDE3IEBACiAgKiAgICAgICAgICAgVklSVFVBTF9TZXRQcm90CiAgKgogICogQ2hhbmdlIHRoZSBwcm90ZWN0aW9uIG9mIGEgcmFuZ2Ugb2YgcGFnZXMuCisgKgorICogUkVUVVJOUworICoJVFJVRTogU3VjY2VzcworICoJRkFMU0U6IEZhaWx1cmUKICAqLwotc3RhdGljIEJPT0wzMiBWSVJUVUFMX1NldFByb3QoIEZJTEVfVklFVyAqdmlldywgVUlOVDMyIGJhc2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVUlOVDMyIHNpemUsIEJZVEUgdnByb3QgKQoteworc3RhdGljIEJPT0wzMiBWSVJUVUFMX1NldFByb3QoCisgICAgICAgICAgICAgIEZJTEVfVklFVyAqdmlldywgLyogW2luXSBQb2ludGVyIHRvIHZpZXcgKi8KKyAgICAgICAgICAgICAgVUlOVDMyIGJhc2UsICAgICAvKiBbaW5dIFN0YXJ0aW5nIGFkZHJlc3MgKi8KKyAgICAgICAgICAgICAgVUlOVDMyIHNpemUsICAgICAvKiBbaW5dIFNpemUgaW4gYnl0ZXMgKi8KKyAgICAgICAgICAgICAgQllURSB2cHJvdCAgICAgICAvKiBbaW5dIFByb3RlY3Rpb25zIHRvIHVzZSAqLworKSB7CiAgICAgVFJBQ0UodmlydHVhbCwgIiUwOHgtJTA4eCAlc1xuIiwKICAgICAgICAgICAgICAgICAgICAgIGJhc2UsIGJhc2UgKyBzaXplIC0gMSwgVklSVFVBTF9HZXRQcm90U3RyKCB2cHJvdCApICk7CiAKQEAgLTM2Miw5ICszODcsMTYgQEAKICAqICAgICAgICAgICAgIFZJUlRVQUxfQ2hlY2tGbGFncwogICoKICAqIENoZWNrIHRoYXQgYWxsIHBhZ2VzIGluIGEgcmFuZ2UgaGF2ZSB0aGUgZ2l2ZW4gZmxhZ3MuCisgKgorICogUkVUVVJOUworICoJVFJVRTogVGhleSBkbworICoJRkFMU0U6IFRoZXkgZG8gbm90CiAgKi8KLXN0YXRpYyBCT09MMzIgVklSVFVBTF9DaGVja0ZsYWdzKCBVSU5UMzIgYmFzZSwgVUlOVDMyIHNpemUsIEJZVEUgZmxhZ3MgKQoteworc3RhdGljIEJPT0wzMiBWSVJUVUFMX0NoZWNrRmxhZ3MoCisgICAgICAgICAgICAgIFVJTlQzMiBiYXNlLCAvKiBbaW5dIFN0YXJ0aW5nIGFkZHJlc3MgKi8KKyAgICAgICAgICAgICAgVUlOVDMyIHNpemUsIC8qIFtpbl0gU2l6ZSBpbiBieXRlcyAqLworICAgICAgICAgICAgICBCWVRFIGZsYWdzICAgLyogW2luXSBGbGFncyB0byBjaGVjayBmb3IgKi8KKykgewogICAgIEZJTEVfVklFVyAqdmlldzsKICAgICBVSU5UMzIgcGFnZTsKIApAQCAtNDQ0LDEwICs0NzYsMTAgQEAKICAqCU5VTEw6IEZhaWx1cmUKICAqLwogTFBWT0lEIFdJTkFQSSBWaXJ0dWFsQWxsb2MoCi0gICAgICAgICAgICAgIExQVk9JRCBhZGRyLCAgLyogQWRkcmVzcyBvZiByZWdpb24gdG8gcmVzZXJ2ZSBvciBjb21taXQgKi8KLSAgICAgICAgICAgICAgRFdPUkQgc2l6ZSwgICAvKiBTaXplIG9mIHJlZ2lvbiAqLwotICAgICAgICAgICAgICBEV09SRCB0eXBlLCAgIC8qIFR5cGUgb2YgYWxsb2NhdGlvbiAqLwotICAgICAgICAgICAgICBEV09SRCBwcm90ZWN0IC8qIFR5cGUgb2YgYWNjZXNzIHByb3RlY3Rpb24gKi8KKyAgICAgICAgICAgICAgTFBWT0lEIGFkZHIsICAvKiBbaW5dIEFkZHJlc3Mgb2YgcmVnaW9uIHRvIHJlc2VydmUgb3IgY29tbWl0ICovCisgICAgICAgICAgICAgIERXT1JEIHNpemUsICAgLyogW2luXSBTaXplIG9mIHJlZ2lvbiAqLworICAgICAgICAgICAgICBEV09SRCB0eXBlLCAgIC8qIFtpbl0gVHlwZSBvZiBhbGxvY2F0aW9uICovCisgICAgICAgICAgICAgIERXT1JEIHByb3RlY3QgLyogW2luXSBUeXBlIG9mIGFjY2VzcyBwcm90ZWN0aW9uICovCiApIHsKICAgICBGSUxFX1ZJRVcgKnZpZXc7CiAgICAgVUlOVDMyIGJhc2UsIHB0ciwgdmlld19zaXplOwpAQCAtNTY4LDkgKzYwMCw5IEBACiAgKglGQUxTRTogRmFpbHVyZQogICovCiBCT09MMzIgV0lOQVBJIFZpcnR1YWxGcmVlKAotICAgICAgICAgICAgICBMUFZPSUQgYWRkciwgLyogQWRkcmVzcyBvZiByZWdpb24gb2YgY29tbWl0dGVkIHBhZ2VzICovCi0gICAgICAgICAgICAgIERXT1JEIHNpemUsICAvKiBTaXplIG9mIHJlZ2lvbiAqLwotICAgICAgICAgICAgICBEV09SRCB0eXBlICAgLyogVHlwZSBvZiBvcGVyYXRpb24gKi8KKyAgICAgICAgICAgICAgTFBWT0lEIGFkZHIsIC8qIFtpbl0gQWRkcmVzcyBvZiByZWdpb24gb2YgY29tbWl0dGVkIHBhZ2VzICovCisgICAgICAgICAgICAgIERXT1JEIHNpemUsICAvKiBbaW5dIFNpemUgb2YgcmVnaW9uICovCisgICAgICAgICAgICAgIERXT1JEIHR5cGUgICAvKiBbaW5dIFR5cGUgb2Ygb3BlcmF0aW9uICovCiApIHsKICAgICBGSUxFX1ZJRVcgKnZpZXc7CiAgICAgVUlOVDMyIGJhc2U7CkBAIC02MTIsNyArNjQ0LDYgQEAKICAgICB9CiAKICAgICAvKiBEZWNvbW1pdCB0aGUgcGFnZXMgKi8KLQogICAgIHJldHVybiBWSVJUVUFMX1NldFByb3QoIHZpZXcsIGJhc2UsIHNpemUsIDAgKTsKIH0KIApAQCAtNjI5LDggKzY2MCw4IEBACiAgKglGQUxTRTogRmFpbHVyZQogICovCiBCT09MMzIgV0lOQVBJIFZpcnR1YWxMb2NrKAotICAgICAgICAgICAgICBMUFZPSUQgYWRkciwgLyogQWRkcmVzcyBvZiBmaXJzdCBieXRlIG9mIHJhbmdlIHRvIGxvY2sgKi8KLSAgICAgICAgICAgICAgRFdPUkQgc2l6ZSAgIC8qIE51bWJlciBvZiBieXRlcyBpbiByYW5nZSB0byBsb2NrICovCisgICAgICAgICAgICAgIExQVk9JRCBhZGRyLCAvKiBbaW5dIEFkZHJlc3Mgb2YgZmlyc3QgYnl0ZSBvZiByYW5nZSB0byBsb2NrICovCisgICAgICAgICAgICAgIERXT1JEIHNpemUgICAvKiBbaW5dIE51bWJlciBvZiBieXRlcyBpbiByYW5nZSB0byBsb2NrICovCiApIHsKICAgICByZXR1cm4gVFJVRTsKIH0KQEAgLTY0OCw4ICs2NzksOCBAQAogICoJRkFMU0U6IEZhaWx1cmUKICAqLwogQk9PTDMyIFdJTkFQSSBWaXJ0dWFsVW5sb2NrKAotICAgICAgICAgICAgICBMUFZPSUQgYWRkciwgLyogQWRkcmVzcyBvZiBmaXJzdCBieXRlIG9mIHJhbmdlICovCi0gICAgICAgICAgICAgIERXT1JEIHNpemUgICAvKiBOdW1iZXIgb2YgYnl0ZXMgaW4gcmFuZ2UgKi8KKyAgICAgICAgICAgICAgTFBWT0lEIGFkZHIsIC8qIFtpbl0gQWRkcmVzcyBvZiBmaXJzdCBieXRlIG9mIHJhbmdlICovCisgICAgICAgICAgICAgIERXT1JEIHNpemUgICAvKiBbaW5dIE51bWJlciBvZiBieXRlcyBpbiByYW5nZSAqLwogKSB7CiAgICAgcmV0dXJuIFRSVUU7CiB9CkBAIC02NjQsMTAgKzY5NSwxMCBAQAogICoJRkFMU0U6IEZhaWx1cmUKICAqLwogQk9PTDMyIFdJTkFQSSBWaXJ0dWFsUHJvdGVjdCgKLSAgICAgICAgICAgICAgTFBWT0lEIGFkZHIsICAgICAvKiBBZGRyZXNzIG9mIHJlZ2lvbiBvZiBjb21taXR0ZWQgcGFnZXMgKi8KLSAgICAgICAgICAgICAgRFdPUkQgc2l6ZSwgICAgICAvKiBTaXplIG9mIHJlZ2lvbiAqLwotICAgICAgICAgICAgICBEV09SRCBuZXdfcHJvdCwgIC8qIERlc2lyZWQgYWNjZXNzIHByb3RlY3Rpb24gKi8KLSAgICAgICAgICAgICAgTFBEV09SRCBvbGRfcHJvdCAvKiBBZGRyZXNzIG9mIHZhcmlhYmxlIHRvIGdldCBvbGQgcHJvdGVjdGlvbiAqLworICAgICAgICAgICAgICBMUFZPSUQgYWRkciwgICAgIC8qIFtpbl0gQWRkcmVzcyBvZiByZWdpb24gb2YgY29tbWl0dGVkIHBhZ2VzICovCisgICAgICAgICAgICAgIERXT1JEIHNpemUsICAgICAgLyogW2luXSBTaXplIG9mIHJlZ2lvbiAqLworICAgICAgICAgICAgICBEV09SRCBuZXdfcHJvdCwgIC8qIFtpbl0gRGVzaXJlZCBhY2Nlc3MgcHJvdGVjdGlvbiAqLworICAgICAgICAgICAgICBMUERXT1JEIG9sZF9wcm90IC8qIFtvdXRdIEFkZHJlc3Mgb2YgdmFyaWFibGUgdG8gZ2V0IG9sZCBwcm90ZWN0aW9uICovCiApIHsKICAgICBGSUxFX1ZJRVcgKnZpZXc7CiAgICAgVUlOVDMyIGJhc2UsIGk7CkBAIC03MTYsMTEgKzc0NywxMSBAQAogICoJRkFMU0U6IEZhaWx1cmUKICAqLwogQk9PTDMyIFdJTkFQSSBWaXJ0dWFsUHJvdGVjdEV4KAotICAgICAgICAgICAgICBIQU5ETEUzMiBoYW5kbGUsIC8qIEhhbmRsZSBvZiBwcm9jZXNzICovCi0gICAgICAgICAgICAgIExQVk9JRCBhZGRyLCAgICAgLyogQWRkcmVzcyBvZiByZWdpb24gb2YgY29tbWl0dGVkIHBhZ2VzICovCi0gICAgICAgICAgICAgIERXT1JEIHNpemUsICAgICAgLyogU2l6ZSBvZiByZWdpb24gKi8KLSAgICAgICAgICAgICAgRFdPUkQgbmV3X3Byb3QsICAvKiBEZXNpcmVkIGFjY2VzcyBwcm90ZWN0aW9uICovCi0JICAgICAgTFBEV09SRCBvbGRfcHJvdCAvKiBBZGRyZXNzIG9mIHZhcmlhYmxlIHRvIGdldCBvbGQgcHJvdGVjdGlvbiAqLworICAgICAgICAgICAgICBIQU5ETEUzMiBoYW5kbGUsIC8qIFtpbl0gIEhhbmRsZSBvZiBwcm9jZXNzICovCisgICAgICAgICAgICAgIExQVk9JRCBhZGRyLCAgICAgLyogW2luXSAgQWRkcmVzcyBvZiByZWdpb24gb2YgY29tbWl0dGVkIHBhZ2VzICovCisgICAgICAgICAgICAgIERXT1JEIHNpemUsICAgICAgLyogW2luXSAgU2l6ZSBvZiByZWdpb24gKi8KKyAgICAgICAgICAgICAgRFdPUkQgbmV3X3Byb3QsICAvKiBbaW5dICBEZXNpcmVkIGFjY2VzcyBwcm90ZWN0aW9uICovCisgICAgICAgICAgICAgIExQRFdPUkQgb2xkX3Byb3QgLyogW291dF0gQWRkcmVzcyBvZiB2YXJpYWJsZSB0byBnZXQgb2xkIHByb3RlY3Rpb24gKi8KICkgewogICAgIEJPT0wzMiByZXQgPSBGQUxTRTsKIApAQCAtNzQ1LDkgKzc3Niw5IEBACiAgKglOdW1iZXIgb2YgYnl0ZXMgcmV0dXJuZWQgaW4gaW5mb3JtYXRpb24gYnVmZmVyCiAgKi8KIERXT1JEIFdJTkFQSSBWaXJ0dWFsUXVlcnkoCi0gICAgICAgICAgICAgTFBDVk9JRCBhZGRyLCAvKiBBZGRyZXNzIG9mIHJlZ2lvbiAqLwotICAgICAgICAgICAgIExQTUVNT1JZX0JBU0lDX0lORk9STUFUSU9OIGluZm8sIC8qIEFkZHJlc3Mgb2YgaW5mbyBidWZmZXIgKi8KLSAgICAgICAgICAgICBEV09SRCBsZW4gICAgIC8qIFNpemUgb2YgYnVmZmVyICovCisgICAgICAgICAgICAgTFBDVk9JRCBhZGRyLCAgICAgICAgICAgICAgICAgICAgLyogW2luXSAgQWRkcmVzcyBvZiByZWdpb24gKi8KKyAgICAgICAgICAgICBMUE1FTU9SWV9CQVNJQ19JTkZPUk1BVElPTiBpbmZvLCAvKiBbb3V0XSBBZGRyZXNzIG9mIGluZm8gYnVmZmVyICovCisgICAgICAgICAgICAgRFdPUkQgbGVuICAgICAgICAgICAgICAgICAgICAgICAgLyogW2luXSAgU2l6ZSBvZiBidWZmZXIgKi8KICkgewogICAgIEZJTEVfVklFVyAqdmlldyA9IFZJUlRVQUxfRmlyc3RWaWV3OwogICAgIFVJTlQzMiBiYXNlID0gUk9VTkRfQUREUiggYWRkciApOwpAQCAtODE0LDEwICs4NDUsMTAgQEAKICAqCU51bWJlciBvZiBieXRlcyByZXR1cm5lZCBpbiBpbmZvcm1hdGlvbiBidWZmZXIKICAqLwogRFdPUkQgV0lOQVBJIFZpcnR1YWxRdWVyeUV4KAotICAgICAgICAgICAgIEhBTkRMRTMyIGhhbmRsZSwgLyogSGFuZGxlIG9mIHByb2Nlc3MgKi8KLSAgICAgICAgICAgICBMUENWT0lEIGFkZHIsICAgIC8qIEFkZHJlc3Mgb2YgcmVnaW9uICovCi0gICAgICAgICAgICAgTFBNRU1PUllfQkFTSUNfSU5GT1JNQVRJT04gaW5mbywgLyogQWRkcmVzcyBvZiBpbmZvIGJ1ZmZlciAqLwotICAgICAgICAgICAgIERXT1JEIGxlbiAgICAgICAgLyogU2l6ZSBvZiBidWZmZXIgKi8KKyAgICAgICAgICAgICBIQU5ETEUzMiBoYW5kbGUsICAgICAgICAgICAgICAgICAvKiBbaW5dIEhhbmRsZSBvZiBwcm9jZXNzICovCisgICAgICAgICAgICAgTFBDVk9JRCBhZGRyLCAgICAgICAgICAgICAgICAgICAgLyogW2luXSBBZGRyZXNzIG9mIHJlZ2lvbiAqLworICAgICAgICAgICAgIExQTUVNT1JZX0JBU0lDX0lORk9STUFUSU9OIGluZm8sIC8qIFtvdXRdIEFkZHJlc3Mgb2YgaW5mbyBidWZmZXIgKi8KKyAgICAgICAgICAgICBEV09SRCBsZW4gICAgICAgICAgICAgICAgICAgICAgICAvKiBbaW5dIFNpemUgb2YgYnVmZmVyICovCiApIHsKICAgICBEV09SRCByZXQgPSBsZW47CiAKQEAgLTg1OCw4ICs4ODksOCBAQAogICogICAgICBUUlVFOiBPdGhlcndpc2UKICAqLwogQk9PTDMyIFdJTkFQSSBJc0JhZFdyaXRlUHRyMzIoCi0JICAgICAgTFBWT0lEIHB0ciwgLyogYWRkcmVzcyBvZiBtZW1vcnkgYmxvY2sgKi8KLQkgICAgICBVSU5UMzIgc2l6ZSAvKiBzaXplIG9mIGJsb2NrICovCisgICAgICAgICAgICAgIExQVk9JRCBwdHIsIC8qIFtpbl0gQWRkcmVzcyBvZiBtZW1vcnkgYmxvY2sgKi8KKyAgICAgICAgICAgICAgVUlOVDMyIHNpemUgLyogW2luXSBTaXplIG9mIGJsb2NrIGluIGJ5dGVzICovCiApIHsKICAgICByZXR1cm4gIVZJUlRVQUxfQ2hlY2tGbGFncyggKFVJTlQzMilwdHIsIHNpemUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZQUk9UX1dSSVRFIHwgVlBST1RfQ09NTUlUVEVEICk7CkBAIC04NjgsMjcgKzg5OSw0MiBAQAogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqICAgICAgICAgICAgIElzQmFkSHVnZVJlYWRQdHIzMiAgIChLRVJORUwzMi4zNTIpCisgKiBSRVRVUk5TCisgKglGQUxTRTogUHJvY2VzcyBoYXMgcmVhZCBhY2Nlc3MgdG8gZW50aXJlIGJsb2NrCisgKiAgICAgIFRSVUU6IE90aGVyd2lzZQogICovCi1CT09MMzIgV0lOQVBJIElzQmFkSHVnZVJlYWRQdHIzMiggTFBDVk9JRCBwdHIsIFVJTlQzMiBzaXplICkKLXsKK0JPT0wzMiBXSU5BUEkgSXNCYWRIdWdlUmVhZFB0cjMyKAorICAgICAgICAgICAgICBMUENWT0lEIHB0ciwgLyogW2luXSBBZGRyZXNzIG9mIG1lbW9yeSBibG9jayAqLworICAgICAgICAgICAgICBVSU5UMzIgc2l6ZSAgLyogW2luXSBTaXplIG9mIGJsb2NrICovCispIHsKICAgICByZXR1cm4gSXNCYWRSZWFkUHRyMzIoIHB0ciwgc2l6ZSApOwogfQogCiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICogICAgICAgICAgICAgSXNCYWRIdWdlV3JpdGVQdHIzMiAgIChLRVJORUwzMi4zNTMpCisgKiBSRVRVUk5TCisgKglGQUxTRTogUHJvY2VzcyBoYXMgd3JpdGUgYWNjZXNzIHRvIGVudGlyZSBibG9jaworICogICAgICBUUlVFOiBPdGhlcndpc2UKICAqLwotQk9PTDMyIFdJTkFQSSBJc0JhZEh1Z2VXcml0ZVB0cjMyKCBMUFZPSUQgcHRyLCBVSU5UMzIgc2l6ZSApCi17CitCT09MMzIgV0lOQVBJIElzQmFkSHVnZVdyaXRlUHRyMzIoCisgICAgICAgICAgICAgIExQVk9JRCBwdHIsIC8qIFtpbl0gQWRkcmVzcyBvZiBtZW1vcnkgYmxvY2sgKi8KKyAgICAgICAgICAgICAgVUlOVDMyIHNpemUgLyogW2luXSBTaXplIG9mIGJsb2NrICovCispIHsKICAgICByZXR1cm4gSXNCYWRXcml0ZVB0cjMyKCBwdHIsIHNpemUgKTsKIH0KIAogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqICAgICAgICAgICAgIElzQmFkQ29kZVB0cjMyICAgKEtFUk5FTDMyLjM1MSkKKyAqCisgKiBSRVRVUk5TCisgKglGQUxTRTogUHJvY2VzcyBoYXMgcmVhZCBhY2Nlc3MgdG8gc3BlY2lmaWVkIG1lbW9yeQorICoJVFJVRTogT3RoZXJ3aXNlCiAgKi8KLUJPT0wzMiBXSU5BUEkgSXNCYWRDb2RlUHRyMzIoIEZBUlBST0MzMiBwdHIgKQoteworQk9PTDMyIFdJTkFQSSBJc0JhZENvZGVQdHIzMigKKyAgICAgICAgICAgICAgRkFSUFJPQzMyIHB0ciAvKiBbaW5dIEFkZHJlc3Mgb2YgZnVuY3Rpb24gKi8KKykgewogICAgIHJldHVybiAhVklSVFVBTF9DaGVja0ZsYWdzKCAoVUlOVDMyKXB0ciwgMSwgVlBST1RfRVhFQyB8IFZQUk9UX0NPTU1JVFRFRCApOwogfQogCkBAIC05MDEsOCArOTQ3LDggQEAKICAqCVRSVUU6IEVsc2UKICAqLwogQk9PTDMyIFdJTkFQSSBJc0JhZFN0cmluZ1B0cjMyQSgKLSAgICAgICAgICAgICAgTFBDU1RSIHN0ciwgLyogQWRkcmVzcyBvZiBzdHJpbmcgKi8KLSAgICAgICAgICAgICAgVUlOVDMyIG1heCAgLyogTWF4aW11bSBzaXplIG9mIHN0cmluZyAqLworICAgICAgICAgICAgICBMUENTVFIgc3RyLCAvKiBbaW5dIEFkZHJlc3Mgb2Ygc3RyaW5nICovCisgICAgICAgICAgICAgIFVJTlQzMiBtYXggIC8qIFtpbl0gTWF4aW11bSBzaXplIG9mIHN0cmluZyAqLwogKSB7CiAgICAgRklMRV9WSUVXICp2aWV3OwogICAgIFVJTlQzMiBwYWdlLCBjb3VudDsKQEAgLTkyOSwxNSArOTc1LDEwIEBACiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICogICAgICAgICAgICAgSXNCYWRTdHJpbmdQdHIzMlcgICAoS0VSTkVMMzIuMzU2KQotICoKLSAqIFJFVFVSTlMKLSAqCUZBTFNFOiBSZWFkIGFjY2VzcyB0byBhbGwgYnl0ZXMgaW4gc3RyaW5nCi0gKglUUlVFOiBFbHNlCisgKiBTZWUgSXNCYWRTdHJpbmdQdHIzMkEKICAqLwotQk9PTDMyIFdJTkFQSSBJc0JhZFN0cmluZ1B0cjMyVygKLSAgICAgICAgICAgICAgTFBDV1NUUiBzdHIsIC8qIEFkZHJlc3Mgb2Ygc3RyaW5nICovCi0gICAgICAgICAgICAgIFVJTlQzMiBtYXggICAvKiBNYXhpbXVtIHNpemUgb2Ygc3RyaW5nICovCi0pIHsKK0JPT0wzMiBXSU5BUEkgSXNCYWRTdHJpbmdQdHIzMlcoIExQQ1dTVFIgc3RyLCBVSU5UMzIgbWF4ICkKK3sKICAgICBGSUxFX1ZJRVcgKnZpZXc7CiAgICAgVUlOVDMyIHBhZ2UsIGNvdW50OwogCkBAIC05NjYsMTcgKzEwMDcsMTcgQEAKICAqIENyZWF0ZXMgYSBuYW1lZCBvciB1bm5hbWVkIGZpbGUtbWFwcGluZyBvYmplY3QgZm9yIHRoZSBzcGVjaWZpZWQgZmlsZQogICoKICAqIFJFVFVSTlMKLSAqCUhhbmRsZSBvZiB0aGUgZmlsZS1tYXBwaW5nIG9iamVjdAotICoJMDogTWFwcGluZyBvYmplY3QgZGlkIG5vdCBleGlzdAorICoJSGFuZGxlOiBTdWNjZXNzCisgKgkwOiBNYXBwaW5nIG9iamVjdCBkb2VzIG5vdCBleGlzdAogICoJTlVMTDogRmFpbHVyZQogICovCiBIQU5ETEUzMiBXSU5BUEkgQ3JlYXRlRmlsZU1hcHBpbmczMkEoCi0gICAgICAgICAgICAgICAgSEZJTEUzMiBoRmlsZSwgICAvKiBIYW5kbGUgb2YgZmlsZSB0byBtYXAgKi8KLSAgICAgICAgICAgICAgICBMUFNFQ1VSSVRZX0FUVFJJQlVURVMgYXR0ciwgLyogT3B0aW9uYWwgc2VjdXJpdHkgYXR0cmlidXRlcyAqLwotICAgICAgICAgICAgICAgIERXT1JEIHByb3RlY3QsICAgLyogUHJvdGVjdGlvbiBmb3IgbWFwcGluZyBvYmplY3QgKi8KLSAgICAgICAgICAgICAgICBEV09SRCBzaXplX2hpZ2gsIC8qIEhpZ2gtb3JkZXIgMzIgYml0cyBvZiBvYmplY3Qgc2l6ZSAqLwotICAgICAgICAgICAgICAgIERXT1JEIHNpemVfbG93LCAgLyogTG93LW9yZGVyIDMyIGJpdHMgb2Ygb2JqZWN0IHNpemUgKi8KLSAgICAgICAgICAgICAgICBMUENTVFIgbmFtZSAgICAgIC8qIE5hbWUgb2YgZmlsZS1tYXBwaW5nIG9iamVjdCAqLworICAgICAgICAgICAgICAgIEhGSUxFMzIgaEZpbGUsICAgLyogW2luXSBIYW5kbGUgb2YgZmlsZSB0byBtYXAgKi8KKyAgICAgICAgICAgICAgICBMUFNFQ1VSSVRZX0FUVFJJQlVURVMgYXR0ciwgLyogW2luXSBPcHRpb25hbCBzZWN1cml0eSBhdHRyaWJ1dGVzICovCisgICAgICAgICAgICAgICAgRFdPUkQgcHJvdGVjdCwgICAvKiBbaW5dIFByb3RlY3Rpb24gZm9yIG1hcHBpbmcgb2JqZWN0ICovCisgICAgICAgICAgICAgICAgRFdPUkQgc2l6ZV9oaWdoLCAvKiBbaW5dIEhpZ2gtb3JkZXIgMzIgYml0cyBvZiBvYmplY3Qgc2l6ZSAqLworICAgICAgICAgICAgICAgIERXT1JEIHNpemVfbG93LCAgLyogW2luXSBMb3ctb3JkZXIgMzIgYml0cyBvZiBvYmplY3Qgc2l6ZSAqLworICAgICAgICAgICAgICAgIExQQ1NUUiBuYW1lICAgICAgLyogW2luXSBOYW1lIG9mIGZpbGUtbWFwcGluZyBvYmplY3QgKi8KICkgewogICAgIEZJTEVfTUFQUElORyAqbWFwcGluZyA9IE5VTEw7CiAgICAgSEFORExFMzIgaGFuZGxlOwpAQCAtMTA4NCwxMCArMTEyNSwxMSBAQAogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqICAgICAgICAgICAgIENyZWF0ZUZpbGVNYXBwaW5nMzJXICAgKEtFUk5FTDMyLjQ3KQorICogU2VlIENyZWF0ZUZpbGVNYXBwaW5nMzJBCiAgKi8KLUhBTkRMRTMyIFdJTkFQSSBDcmVhdGVGaWxlTWFwcGluZzMyVyhIRklMRTMyIGhGaWxlLCBMUFNFQ1VSSVRZX0FUVFJJQlVURVMgYXR0ciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEV09SRCBwcm90ZWN0LCBEV09SRCBzaXplX2hpZ2gsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRFdPUkQgc2l6ZV9sb3csIExQQ1dTVFIgbmFtZSApCitIQU5ETEUzMiBXSU5BUEkgQ3JlYXRlRmlsZU1hcHBpbmczMlcoIEhGSUxFMzIgaEZpbGUsIExQU0VDVVJJVFlfQVRUUklCVVRFUyBhdHRyLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRFdPUkQgcHJvdGVjdCwgRFdPUkQgc2l6ZV9oaWdoLCAgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERXT1JEIHNpemVfbG93LCBMUENXU1RSIG5hbWUgKQogewogICAgIExQU1RSIG5hbWVBID0gSEVBUF9zdHJkdXBXdG9BKCBHZXRQcm9jZXNzSGVhcCgpLCAwLCBuYW1lICk7CiAgICAgSEFORExFMzIgcmV0ID0gQ3JlYXRlRmlsZU1hcHBpbmczMkEoIGhGaWxlLCBhdHRyLCBwcm90ZWN0LApAQCAtMTA5OSwxNiArMTE0MSwxNiBAQAogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqICAgICAgICAgICAgIE9wZW5GaWxlTWFwcGluZzMyQSAgIChLRVJORUwzMi4zOTcpCi0gKiBPcGVucyBhIG5hbWVkIGZpbGUtbWFwcGluZyBvYmplY3QKKyAqIE9wZW5zIGEgbmFtZWQgZmlsZS1tYXBwaW5nIG9iamVjdC4KICAqCiAgKiBSRVRVUk5TCi0gKglPcGVuIGhhbmRsZSB0byBzcGVjaWZpZWQgZmlsZS1tYXBwaW5nIG9iamVjdAorICoJSGFuZGxlOiBTdWNjZXNzCiAgKglOVUxMOiBGYWlsdXJlCiAgKi8KIEhBTkRMRTMyIFdJTkFQSSBPcGVuRmlsZU1hcHBpbmczMkEoCi0gICAgICAgICAgICAgICAgRFdPUkQgYWNjZXNzLCAgIC8qIEFjY2VzcyBtb2RlICovCi0gICAgICAgICAgICAgICAgQk9PTDMyIGluaGVyaXQsIC8qIEluaGVyaXQgZmxhZyAqLwotICAgICAgICAgICAgICAgIExQQ1NUUiBuYW1lICAgICAvKiBOYW1lIG9mIGZpbGUtbWFwcGluZyBvYmplY3QgKi8KKyAgICAgICAgICAgICAgICBEV09SRCBhY2Nlc3MsICAgLyogW2luXSBBY2Nlc3MgbW9kZSAqLworICAgICAgICAgICAgICAgIEJPT0wzMiBpbmhlcml0LCAvKiBbaW5dIEluaGVyaXQgZmxhZyAqLworICAgICAgICAgICAgICAgIExQQ1NUUiBuYW1lICAgICAvKiBbaW5dIE5hbWUgb2YgZmlsZS1tYXBwaW5nIG9iamVjdCAqLwogKSB7CiAgICAgSEFORExFMzIgaGFuZGxlID0gMDsKICAgICBLMzJPQkogKm9iajsKQEAgLTExMjUsNiArMTE2Nyw3IEBACiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICogICAgICAgICAgICAgT3BlbkZpbGVNYXBwaW5nMzJXICAgKEtFUk5FTDMyLjM5OCkKKyAqIFNlZSBPcGVuRmlsZU1hcHBpbmczMkEKICAqLwogSEFORExFMzIgV0lOQVBJIE9wZW5GaWxlTWFwcGluZzMyVyggRFdPUkQgYWNjZXNzLCBCT09MMzIgaW5oZXJpdCwgTFBDV1NUUiBuYW1lKQogewpAQCAtMTE2MCwxMSArMTIwMywxMSBAQAogICoJTlVMTDogRmFpbHVyZQogICovCiBMUFZPSUQgV0lOQVBJIE1hcFZpZXdPZkZpbGUoCi0gICAgICAgICAgICAgIEhBTkRMRTMyIG1hcHBpbmcsICAvKiBGaWxlLW1hcHBpbmcgb2JqZWN0IHRvIG1hcCAqLwotICAgICAgICAgICAgICBEV09SRCBhY2Nlc3MsICAgICAgLyogQWNjZXNzIG1vZGUgKi8KLSAgICAgICAgICAgICAgRFdPUkQgb2Zmc2V0X2hpZ2gsIC8qIEhpZ2gtb3JkZXIgMzIgYml0cyBvZiBmaWxlIG9mZnNldCAqLwotICAgICAgICAgICAgICBEV09SRCBvZmZzZXRfbG93LCAgLyogTG93LW9yZGVyIDMyIGJpdHMgb2YgZmlsZSBvZmZzZXQgKi8KLSAgICAgICAgICAgICAgRFdPUkQgY291bnQgICAgICAgIC8qIE51bWJlciBvZiBieXRlcyB0byBtYXAgKi8KKyAgICAgICAgICAgICAgSEFORExFMzIgbWFwcGluZywgIC8qIFtpbl0gRmlsZS1tYXBwaW5nIG9iamVjdCB0byBtYXAgKi8KKyAgICAgICAgICAgICAgRFdPUkQgYWNjZXNzLCAgICAgIC8qIFtpbl0gQWNjZXNzIG1vZGUgKi8KKyAgICAgICAgICAgICAgRFdPUkQgb2Zmc2V0X2hpZ2gsIC8qIFtpbl0gSGlnaC1vcmRlciAzMiBiaXRzIG9mIGZpbGUgb2Zmc2V0ICovCisgICAgICAgICAgICAgIERXT1JEIG9mZnNldF9sb3csICAvKiBbaW5dIExvdy1vcmRlciAzMiBiaXRzIG9mIGZpbGUgb2Zmc2V0ICovCisgICAgICAgICAgICAgIERXT1JEIGNvdW50ICAgICAgICAvKiBbaW5dIE51bWJlciBvZiBieXRlcyB0byBtYXAgKi8KICkgewogICAgIHJldHVybiBNYXBWaWV3T2ZGaWxlRXgoIG1hcHBpbmcsIGFjY2Vzcywgb2Zmc2V0X2hpZ2gsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb2Zmc2V0X2xvdywgY291bnQsIE5VTEwgKTsKQEAgLTExODAsMTIgKzEyMjMsMTIgQEAKICAqCU5VTEw6IEZhaWx1cmUKICAqLwogTFBWT0lEIFdJTkFQSSBNYXBWaWV3T2ZGaWxlRXgoCi0gICAgICAgICAgICAgIEhBTkRMRTMyIGhhbmRsZSwgICAvKiBGaWxlLW1hcHBpbmcgb2JqZWN0IHRvIG1hcCAqLwotICAgICAgICAgICAgICBEV09SRCBhY2Nlc3MsICAgICAgLyogQWNjZXNzIG1vZGUgKi8KLSAgICAgICAgICAgICAgRFdPUkQgb2Zmc2V0X2hpZ2gsIC8qIEhpZ2gtb3JkZXIgMzIgYml0cyBvZiBmaWxlIG9mZnNldCAqLwotICAgICAgICAgICAgICBEV09SRCBvZmZzZXRfbG93LCAgLyogTG93LW9yZGVyIDMyIGJpdHMgb2YgZmlsZSBvZmZzZXQgKi8KLSAgICAgICAgICAgICAgRFdPUkQgY291bnQsICAgICAgIC8qIE51bWJlciBvZiBieXRlcyB0byBtYXAgKi8KLSAgICAgICAgICAgICAgTFBWT0lEIGFkZHIgICAgICAgIC8qIFN1Z2dlc3RlZCBzdGFydGluZyBhZGRyZXNzIGZvciBtYXBwZWQgdmlldyAqLworICAgICAgICAgICAgICBIQU5ETEUzMiBoYW5kbGUsICAgLyogW2luXSBGaWxlLW1hcHBpbmcgb2JqZWN0IHRvIG1hcCAqLworICAgICAgICAgICAgICBEV09SRCBhY2Nlc3MsICAgICAgLyogW2luXSBBY2Nlc3MgbW9kZSAqLworICAgICAgICAgICAgICBEV09SRCBvZmZzZXRfaGlnaCwgLyogW2luXSBIaWdoLW9yZGVyIDMyIGJpdHMgb2YgZmlsZSBvZmZzZXQgKi8KKyAgICAgICAgICAgICAgRFdPUkQgb2Zmc2V0X2xvdywgIC8qIFtpbl0gTG93LW9yZGVyIDMyIGJpdHMgb2YgZmlsZSBvZmZzZXQgKi8KKyAgICAgICAgICAgICAgRFdPUkQgY291bnQsICAgICAgIC8qIFtpbl0gTnVtYmVyIG9mIGJ5dGVzIHRvIG1hcCAqLworICAgICAgICAgICAgICBMUFZPSUQgYWRkciAgICAgICAgLyogW2luXSBTdWdnZXN0ZWQgc3RhcnRpbmcgYWRkcmVzcyBmb3IgbWFwcGVkIHZpZXcgKi8KICkgewogICAgIEZJTEVfTUFQUElORyAqbWFwcGluZzsKICAgICBGSUxFX1ZJRVcgKnZpZXc7CkBAIC0xMjc4LDggKzEzMjEsOCBAQAogICoJRkFMU0U6IEZhaWx1cmUKICAqLwogQk9PTDMyIFdJTkFQSSBGbHVzaFZpZXdPZkZpbGUoCi0gICAgICAgICAgICAgIExQQ1ZPSUQgYmFzZSwgLyogU3RhcnQgYWRkcmVzcyBvZiBieXRlIHJhbmdlIHRvIGZsdXNoICovCi0gICAgICAgICAgICAgIERXT1JEIGNiRmx1c2ggLyogTnVtYmVyIG9mIGJ5dGVzIGluIHJhbmdlICovCisgICAgICAgICAgICAgIExQQ1ZPSUQgYmFzZSwgLyogW2luXSBTdGFydCBhZGRyZXNzIG9mIGJ5dGUgcmFuZ2UgdG8gZmx1c2ggKi8KKyAgICAgICAgICAgICAgRFdPUkQgY2JGbHVzaCAvKiBbaW5dIE51bWJlciBvZiBieXRlcyBpbiByYW5nZSAqLwogKSB7CiAgICAgRklMRV9WSUVXICp2aWV3OwogICAgIFVJTlQzMiBhZGRyID0gUk9VTkRfQUREUiggYmFzZSApOwpAQCAtMTI5OCwxMSArMTM0MSwyMSBAQAogICAgIHJldHVybiBGQUxTRTsKIH0KIAorCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqICAgICAgICAgICAgIFVubWFwVmlld09mRmlsZSAgIChLRVJORUwzMi41NDApCisgKiBVbm1hcHMgYSBtYXBwZWQgdmlldyBvZiBhIGZpbGUuCisgKgorICogTk9URVMKKyAqCVNob3VsZCBhZGRyIGJlIGFuIExQQ1ZPSUQ/CisgKgorICogUkVUVVJOUworICoJVFJVRTogU3VjY2VzcworICoJRkFMU0U6IEZhaWx1cmUKICAqLwotQk9PTDMyIFdJTkFQSSBVbm1hcFZpZXdPZkZpbGUoIExQVk9JRCBhZGRyICkKLXsKK0JPT0wzMiBXSU5BUEkgVW5tYXBWaWV3T2ZGaWxlKAorICAgICAgICAgICAgICBMUFZPSUQgYWRkciAvKiBbaW5dIEFkZHJlc3Mgd2hlcmUgbWFwcGVkIHZpZXcgYmVnaW5zICovCispIHsKICAgICBGSUxFX1ZJRVcgKnZpZXc7CiAgICAgVUlOVDMyIGJhc2UgPSBST1VORF9BRERSKCBhZGRyICk7CiAgICAgaWYgKCEodmlldyA9IFZJUlRVQUxfRmluZFZpZXcoIGJhc2UgKSkgfHwgKGJhc2UgIT0gdmlldy0+YmFzZSkpCmRpZmYgLS1naXQgYS9taXNjL2NvbW1kbGcuYyBiL21pc2MvY29tbWRsZy5jCmluZGV4IDg1YzBmMmIuLjVlM2NhNTEgMTAwNjQ0Ci0tLSBhL21pc2MvY29tbWRsZy5jCisrKyBiL21pc2MvY29tbWRsZy5jCkBAIC0xMTU2LDcgKzExNTYsNyBAQAogICovCiBCT09MMzIgV0lOQVBJIFByaW50RGxnMzJBKCBMUFBSSU5URExHMzJBIHByaW50ZGxnICkKIHsKLSAgICBmcHJpbnRmKCBzdGRuaW1wLCAiUHJpbnREbGczMkE6IGVtcHR5IHN0dWJcbiIgKTsKKyAgICBGSVhNRShjb21tZGxnLCAiZW1wdHkgc3R1YlxuIiApOwogICAgIHJldHVybiBGQUxTRTsKIH0KIApAQCAtMTE2Niw3ICsxMTY2LDcgQEAKICAqLwogQk9PTDMyIFdJTkFQSSBQcmludERsZzMyVyggTFBQUklOVERMRzMyVyBwcmludGRsZyApCiB7Ci0gICAgZnByaW50Ziggc3RkbmltcCwgIlByaW50RGxnMzJBOiBlbXB0eSBzdHViXG4iICk7CisgICAgRklYTUUoY29tbWRsZywgImVtcHR5IHN0dWJcbiIgKTsKICAgICByZXR1cm4gRkFMU0U7CiB9CiAKQEAgLTMyMzEsNyArMzIzMSwxMCBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKiAgICAgICAgICAgQ2hvb3NlRm9udEEgICAoQ09NRExHMzIuMykKICAqLwotRFdPUkQgV0lOQVBJIENob29zZUZvbnQzMkEoQ0hPT1NFRk9OVCBwQ2hvb3NlZm9udCkKK0RXT1JEIFdJTkFQSSBDaG9vc2VGb250MzJBKFBDSE9PU0VGT05UMzJBIHBDaG9vc2Vmb250KQogeworCUZJWE1FKGNvbW1kbGcsImVtcHR5IHN0dWIhXG4iKTsKKworCUNvbW1EbGdMYXN0RXJyb3IgPSBDREVSUl9ESUFMT0dGQUlMVVJFOwogCXJldHVybiBOVUxMOwogfQpkaWZmIC0tZ2l0IGEvbWlzYy9jcnRkbGwuYyBiL21pc2MvY3J0ZGxsLmMKaW5kZXggYWM1YmVlYi4uZTRjZGRhMCAxMDA2NDQKLS0tIGEvbWlzYy9jcnRkbGwuYworKysgYi9taXNjL2NydGRsbC5jCkBAIC0xOTcsNyArMTk3LDcgQEAKICAgICBEV09SRCAqYXJncyA9IChEV09SRCAqKUVTUF9yZWcoY29udGV4dCk7CiAgICAgUEVYQ0VQVElPTl9GUkFNRSBlbmRmcmFtZSA9IChQRVhDRVBUSU9OX0ZSQU1FKWFyZ3NbMV07CiAgICAgRFdPUkQgbnIgPSBhcmdzWzJdOwotICAgIGZwcmludGYoc3RkZXJyLCIoJXAsJWxkKVxuIixlbmRmcmFtZSxucik7CisgICAgVFJBQ0UoY3J0ZGxsLCIoJXAsJWxkKVxuIixlbmRmcmFtZSxucik7CiB9CiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKQEAgLTExMTEsNyArMTExMSw3IEBACiAJY2FzZSBDUlRETExfTENfVElNRTogY2F0ZWdvcnlzdHI9IkxDX1RJTUUiO2JyZWFrOwogCWRlZmF1bHQ6IGNhdGVnb3J5c3RyID0gIlVOS05PV04/IjticmVhazsKIAl9Ci0JZnByaW50ZihzdGRlcnIsIkNSVERMTF9zZXRsb2NhbGUoJXMsJXMpLHN0dWIhXG4iLGNhdGVnb3J5c3RyLGxvY2FsZSk7CisJRklYTUUoY3J0ZGxsLCIoJXMsJXMpLHN0dWIhXG4iLGNhdGVnb3J5c3RyLGxvY2FsZSk7CiAJcmV0dXJuICJDIjsKIH0KIApAQCAtMTM0OCw4ICsxMzQ4LDcgQEAKICAqLwogSU5UMzIgX19jZGVjbCBDUlRETExfYXRleGl0KExQVk9JRCB4KQogewotCS8qIEZJWE1FICovCi0JZnByaW50ZihzdGRuaW1wLCJDUlRETEwuYXRleGl0KCVwKSwgU1RVQi5cbiIseCk7CisJRklYTUUoY3J0ZGxsLCIoJXApLCBTVFVCLlxuIix4KTsKIAlyZXR1cm4gMDsgLyogc3VjY2Vzc2Z1bCAqLwogfQogCmRpZmYgLS1naXQgYS9taXNjL2ltYWdlbGlzdC5jIGIvbWlzYy9pbWFnZWxpc3QuYwppbmRleCBmMjEyYTljLi5kYjRjOGI0IDEwMDY0NAotLS0gYS9taXNjL2ltYWdlbGlzdC5jCisrKyBiL21pc2MvaW1hZ2VsaXN0LmMKQEAgLTQsMTggKzQsNDMgQEAKICAqICBDb3B5cmlnaHQgMTk5OCBFcmljIEtvaGwKICAqCiAgKiAgVE9ETzoKLSAqICAgIC0gVXNlIGRldmljZSBpbmRlcGVuZGVudCBiaXRtYXBzIChESUJzKSBpbnN0ZWFkIG9mIGRldmljZQotICogICAgICBkZXBlbmRlbnQgYml0bWFwcyAoRERCcykuCi0gKiAgICAtIEZpeCBpbWFnZSBzZWxlY3Rpb24gKEltYWdlTGlzdF9EcmF3KS4KLSAqICAgIC0gSW1wcm92ZSBlcnJvciBjaGVja2luZy4KLSAqICAgIC0gQWRkIG1pc3NpbmcgZnVuY3Rpb25zLgotICogICAgLSBNYW55IG1hbnkgb3RoZXIgdGhpbmdzLiAodW5kb2N1bWVudGVkIGZ1bmN0aW9ucykKKyAqICAgIC0gSW1wcm92ZSB0aGUgZG9jdW1lbnRhdGlvbi4KKyAqICAgIC0gRml4IEltYWdlTGlzdF9EcmF3SW5kaXJlY3QuCisgKiAgICAgICAgLSBEcmF3aW5nIHNlbGVjdGVkIGltYWdlcyBpcyBhd2Z1bGx5IHNsb3cgc2luY2UgaXQgaGFzIHRvCisgKiAgICAgICAgICBiZSBkb25lIHBpeGVsIGJ5IHBpeGVsLgorICogICAgLSBGaXggSW1hZ2VMaXN0X0dldEljb24gKGFsbW9zdCBmaXhlZCkuCisgKiAgICAtIEZpeCBhbGwgb3RoZXIgc3R1YnMuCisgKiAgICAtIEZpeCBkcmFnIGZ1bmN0aW9ucy4KKyAqICAgIC0gSW1wcm92ZSBlcnJvciBjaGVja2luZyBpbiBtb3N0IGZ1bmN0aW9ucy4KKyAqICAgIC0gQWRkIEltYWdlTGlzdF9TZXRGaWx0ZXIgKHVuZG9jdW1lbnRlZCkuCisgKiAgICAgIEJUVyBkb2VzIGFueWJvZHkga25vdyBhbnl0aGluZyBhYm91dCB0aGlzIGZ1bmN0aW9uPz8/CisgKiAgICAgICAgLSBJdCByZW1vdmVzIDEyIEJ5dGVzIGZyb20gdGhlIHN0YWNrICgzIFBhcmFtZXRlcnMpLgorICogICAgICAgIC0gRmlyc3QgcGFyYW1ldGVyIFNIT1VMRCBiZSBhIEhJTUFHRUxJU1QuCisgKiAgICAgICAgLSBTZWNvbmQgcGFyYW1ldGVyIENPVUxEIGJlIGFuIGluZGV4Pz8/Pz8KKyAqICAgICAgICAtIFRoaXJkIHBhcmFtZXRlci4uLi4gPz8/Pz8/Pz8/Pz8/Pz8/Pz8/Pz8/CisgKiAgICAtIEFkZCB1bmRvY3VtZW50ZWQgZnVuY3Rpb25zLgorICogICAgICAgIEFyZSB0aGVyZSBhbnkgb3RoZXIgdW5kb2N1bWVudGVkIEltYWdlTGlzdCBmdW5jdGlvbnM/CisgKgorICogIFRlc3Rpbmc6CisgKiAgICAtIFRlc3QgSW1hZ2VMaXN0X0xvYWRJbWFnZUEvVyB3aXRoIEljb25zIGFuZCBDdXJzb3JzLgorICogICAgLSBUZXN0IEltYWdlTGlzdF9Db3B5LgorICogICAgLSBUZXN0IEltYWdlTGlzdF9EdXBsaWNhdGUuCisgKiAgICAtIFRlc3QgSW1hZ2VMaXN0X1JlbW92ZS4KKyAqICAgIC0gVGVzdCBJbWFnZUxpc3RfU2V0SW1hZ2VDb3VudC4KKyAqICAgIC0gVGVzdCBJbWFnZUxpc3RfR2V0SW1hZ2VSZWN0ICh1bmRvY3VtZW50ZWQpLgorICogICAgLSBUZXN0IGFsbCB0aGUgb3RoZXIgZnVuY3Rpb25zLgorICoKKyAqICBDb21tZW50czoKKyAqICAgIC0gSW1hZ2VMaXN0X0RyYXcsIEltYWdlTGlzdF9EcmF3RXggYW5kIEltYWdlTGlzdF9HZXRJY29uIHVzZQorICogICAgICBJbWFnZUxpc3RfRHJhd0luZGlyZWN0LiBTaW5jZSBJbWFnZUxpc3RfRHJhd0luZGlyZWN0IGlzIHN0aWxsCisgKiAgICAgIHBhcnRpYWxseSBpbWxlbWVudGVkLCB0aGUgZnVuY3Rpb25zIG1lbnRpb25lZCBhYm92ZSB3aWxsIGJlIAorICogICAgICBsaW1pdGVkIGluIGZ1bmN0aW9uYWxpdHkgdG9vLgogICovCiAKIC8qIFRoaXMgbXVzdCBiZSBkZWZpbmVkIGJlY2F1c2UgdGhlIEhJTUFHRUxJU1QgdHlwZSBpcyBqdXN0IGEgcG9pbnRlcgotICogdG8gdGhlIF9JTUFHRUxJU1QgZGF0YSBzdHJ1Y3R1cmUuIEJ1dCBNUyBkb2VzIG5vdCB3YW50IHVzIHRvIGtub3cKKyAqIHRvIHRoZSBfSU1BR0VMSVNUIGRhdGEgc3RydWN0dXJlLiBCdXQgTSQgZG9lcyBub3Qgd2FudCB1cyB0byBrbm93CiAgKiBhbnl0aGluZyBhYm91dCBpdHMgY29udGVudHMuIEFwcGxpY2F0aW9ucyBqdXN0IHNlZSBhIHBvaW50ZXIgdG8KLSAqIGEgc3RydWN0IHdpdGhvdXQgYW55IGNvbnRlbnQuIEl0J3MganVzdCB0byBrZWVwIGNvbXBhdGliaWxpdHkuCisgKiBhbiBlbXB0eSBzdHJ1Y3R1cmUuIEl0J3MganVzdCB0byBrZWVwIGNvbXBhdGliaWxpdHkuCiAgKi8KICNkZWZpbmUgX19XSU5FX0lNQUdFTElTVF9DCiAgCkBAIC0yNSwzNiArNTAsNTEgQEAKICAqLwogI2RlZmluZSBfX0dFVF9JQ09OX0lORk9fSEFDS19fIAogIAotI2luY2x1ZGUgPHN0ZGxpYi5oPgogI2luY2x1ZGUgIndpbmRvd3MuaCIKICNpbmNsdWRlICJpbWFnZWxpc3QuaCIKICNpbmNsdWRlICJjb21tY3RybC5oIgogI2luY2x1ZGUgImRlYnVnLmgiCisjaW5jbHVkZSAiaGVhcC5oIgogCiAjaWZkZWYgX19HRVRfSUNPTl9JTkZPX0hBQ0tfXwogI2luY2x1ZGUgImJpdG1hcC5oIgogI2VuZGlmCiAKIAorI2RlZmluZSBfTUFYKGEsYikgKCgoYSk+KGIpKT8oYSk6KGIpKQorI2RlZmluZSBfTUlOKGEsYikgKCgoYSk+KGIpKT8oYik6KGEpKQorCisjZGVmaW5lIE1BWF9PVkVSTEFZSU1BR0UgMTUKKworCisvKgorICogaW50ZXJuYWwgSW1hZ2VMaXN0IGRhdGEgdXNlZCBmb3IgZHJhZ2dpbmcKKyAqLworc3RhdGljIEhJTUFHRUxJU1QgaGltbEludGVybmFsRHJhZyA9IE5VTEw7CitzdGF0aWMgSU5UMzIgICAgICBuSW50ZXJuYWxEcmFnSG90c3BvdFggPSAwOworc3RhdGljIElOVDMyICAgICAgbkludGVybmFsRHJhZ0hvdHNwb3RZID0gMDsKK3N0YXRpYyBIQ1VSU09SMzIgIGhjdXJJbnRlcm5hbCA9IDA7CisKKwogc3RhdGljIHZvaWQKLUlNQUdFTElTVF9Hcm93Qml0bWFwcyAoSElNQUdFTElTVCBoaW1sLCBJTlQzMiBuSW1hZ2VDb3VudCkKK0lNQUdFTElTVF9JbnRlcm5hbEdyb3dCaXRtYXBzIChISU1BR0VMSVNUIGhpbWwsIElOVDMyIG5JbWFnZUNvdW50KQogewotICAgIEhEQzMyICAgICBoZGNTY3JlZW4sIGhkY0ltYWdlTGlzdCwgaGRjQml0bWFwOworICAgIEhEQzMyICAgICBoZGNJbWFnZUxpc3QsIGhkY0JpdG1hcDsKICAgICBIQklUTUFQMzIgaGJtTmV3Qml0bWFwOwotICAgIElOVDMyICAgICBuTmV3V2lkdGg7CisgICAgSU5UMzIgICAgIG5OZXdXaWR0aCwgbk5ld0NvdW50OwogCi0gICAgLyogbm8gc3BhY2UgbGVmdCBmb3IgbmV3IEltYWdlKHMpID09PiBjcmVhdGUgbmV3IEJpdG1hcChzKSAqLwotICAgIHByaW50ZiAoIklNQUdFTElTVF9Hcm93Qml0bWFwczogQ3JlYXRlIGdyb3duIGJpdG1hcHMhIVxuIik7CisgICAgVFJBQ0UoaW1hZ2VsaXN0LCAiQ3JlYXRlIGdyb3duIGJpdG1hcHMhXG4iKTsKIAotICAgIG5OZXdXaWR0aCA9IChoaW1sLT5jQ3VySW1hZ2UgKyBuSW1hZ2VDb3VudCArIGhpbWwtPmNHcm93KSAqIGhpbWwtPmN4OworICAgIG5OZXdDb3VudCA9IGhpbWwtPmNDdXJJbWFnZSArIG5JbWFnZUNvdW50ICsgaGltbC0+Y0dyb3c7CisgICAgbk5ld1dpZHRoID0gbk5ld0NvdW50ICogaGltbC0+Y3g7CiAKLSAgICBoZGNTY3JlZW4gPSBHZXREQzMyIChHZXREZXNrdG9wV2luZG93MzIgKCkpOwotICAgIGhkY0ltYWdlTGlzdCA9IENyZWF0ZUNvbXBhdGlibGVEQzMyIChoZGNTY3JlZW4pOwotICAgIGhkY0JpdG1hcCA9IENyZWF0ZUNvbXBhdGlibGVEQzMyIChoZGNTY3JlZW4pOwotICAgIFJlbGVhc2VEQzMyIChoZGNTY3JlZW4sIEdldERlc2t0b3BXaW5kb3czMiAoKSk7CisgICAgaGRjSW1hZ2VMaXN0ID0gQ3JlYXRlQ29tcGF0aWJsZURDMzIgKDApOworICAgIGhkY0JpdG1hcCA9IENyZWF0ZUNvbXBhdGlibGVEQzMyICgwKTsKIAogICAgIGhibU5ld0JpdG1hcCA9Ci0gICAgICAgIENyZWF0ZUNvbXBhdGlibGVCaXRtYXAzMiAoaGRjSW1hZ2VMaXN0LCBuTmV3V2lkdGgsIGhpbWwtPmN5KTsKKyAgICAgICAgQ3JlYXRlQml0bWFwMzIgKG5OZXdXaWR0aCwgaGltbC0+Y3ksIDEsIGhpbWwtPnVCaXRzUGl4ZWwsIE5VTEwpOworICAgIGlmIChoYm1OZXdCaXRtYXAgPT0gMCkKKyAgICAgICAgRVJSIChpbWFnZWxpc3QsICJFcnJvciBjcmVhdGluZyBuZXcgaW1hZ2UgYml0bWFwIVxuIik7CiAKICAgICBTZWxlY3RPYmplY3QzMiAoaGRjSW1hZ2VMaXN0LCBoaW1sLT5oYm1JbWFnZSk7CiAgICAgU2VsZWN0T2JqZWN0MzIgKGhkY0JpdG1hcCwgaGJtTmV3Qml0bWFwKTsKQEAgLTY2LDcgKzEwNiwxMSBAQAogCiAgICAgaWYgKGhpbWwtPmhibU1hc2spIHsKICAgICAgICAgaGJtTmV3Qml0bWFwID0gCi0gICAgICAgICAgICBDcmVhdGVDb21wYXRpYmxlQml0bWFwMzIgKGhkY0ltYWdlTGlzdCwgbk5ld1dpZHRoLCBoaW1sLT5jeSk7IAorICAgICAgICAgICAgQ3JlYXRlQml0bWFwMzIgKG5OZXdXaWR0aCwgaGltbC0+Y3ksIDEsIDEsIE5VTEwpOworCisgICAgICAgIGlmIChoYm1OZXdCaXRtYXAgPT0gMCkKKyAgICAgICAgICAgIEVSUiAoaW1hZ2VsaXN0LCAiRXJyb3IgY3JlYXRpbmcgbmV3IG1hc2sgYml0bWFwISIpOworCiAgICAgICAgIFNlbGVjdE9iamVjdDMyIChoZGNJbWFnZUxpc3QsIGhpbWwtPmhibU1hc2spOwogICAgICAgICBTZWxlY3RPYmplY3QzMiAoaGRjQml0bWFwLCBoYm1OZXdCaXRtYXApOwogICAgICAgICBCaXRCbHQzMiAoaGRjQml0bWFwLCAwLCAwLCBoaW1sLT5jQ3VySW1hZ2UgKiBoaW1sLT5jeCwgaGltbC0+Y3ksCkBAIC03NSwxMyArMTE5LDU3IEBACiAgICAgICAgIGhpbWwtPmhibU1hc2sgPSBoYm1OZXdCaXRtYXA7CiAgICAgfQogCisgICAgaGltbC0+Y01heEltYWdlID0gbk5ld0NvdW50OworCiAgICAgRGVsZXRlREMzMiAoaGRjSW1hZ2VMaXN0KTsKICAgICBEZWxldGVEQzMyIChoZGNCaXRtYXApOwogfQogCiAKLUlOVDMyIFdJTkFQSQotSW1hZ2VMaXN0X0FkZCAoSElNQUdFTElTVCBoaW1sLCBIQklUTUFQMzIgaGJtSW1hZ2UsIEhCSVRNQVAzMiBoYm1NYXNrKQorc3RhdGljIHZvaWQKK0lNQUdFTElTVF9JbnRlcm5hbERyYXdNYXNrIChISU1BR0VMSVNUIGhpbWwsIElOVDMyIGksIEhEQzMyIGhkYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBJTlQzMiB4LCBJTlQzMiB5KQoreworICAgIEhEQzMyIGhkY0ltYWdlTGlzdDsKKworICAgIGlmIChoaW1sLT5oYm1NYXNrKQorICAgIHsKKyAgICAgICAgaGRjSW1hZ2VMaXN0ID0gQ3JlYXRlQ29tcGF0aWJsZURDMzIgKDApOworICAgICAgICBTZWxlY3RPYmplY3QzMiAoaGRjSW1hZ2VMaXN0LCBoaW1sLT5oYm1NYXNrKTsKKyAgICAgICAgQml0Qmx0MzIgKGhkYywgeCwgeSwgaGltbC0+Y3gsIGhpbWwtPmN5LCBoZGNJbWFnZUxpc3QsCisgICAgICAgICAgICAgICAgICBoaW1sLT5jeCAqIGksIDAsIFNSQ0NPUFkpOworICAgICAgICBEZWxldGVEQzMyIChoZGNJbWFnZUxpc3QpOworICAgIH0gIAorfQorCisKK3N0YXRpYyB2b2lkCitJTUFHRUxJU1RfSW50ZXJuYWxEcmF3SW1hZ2UgKEhJTUFHRUxJU1QgaGltbCwgSU5UMzIgaSwgSERDMzIgaGRjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJTlQzMiB4LCBJTlQzMiB5LCBVSU5UMzIgZlN0eWxlKQoreworICAgIEhEQzMyIGhkY0ltYWdlTGlzdDsKKworICAgIGhkY0ltYWdlTGlzdCA9IENyZWF0ZUNvbXBhdGlibGVEQzMyICgwKTsKKyAgICBTZWxlY3RPYmplY3QzMiAoaGRjSW1hZ2VMaXN0LCBoaW1sLT5oYm1JbWFnZSk7CisgICAgQml0Qmx0MzIgKGhkYywgeCwgeSwgaGltbC0+Y3gsIGhpbWwtPmN5LCBoZGNJbWFnZUxpc3QsCisgICAgICAgICAgICAgIGhpbWwtPmN4ICogaSwgMCwgU1JDQ09QWSk7CisgICAgRGVsZXRlREMzMiAoaGRjSW1hZ2VMaXN0KTsKK30KKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoJIAkJIEltYWdlTGlzdF9BZGQgICBbQ09NQ1RMMzIuMzldCisgKgorICogIEFkZCBhbiBpbWFnZSAoYW5kIGEgbWFzaykgdG8gYW4gaW1hZ2UgbGlzdC4KKyAqCisgKiAgUkVUVVJOUworICogICAgSW5kZXggb2YgdGhlIGZpcnN0IGltYWdlIHRoYXQgd2FzIGFkZGVkLCAtMSBpZiBhbiBlcnJvciBvY2N1cnJlZC4KKyAqLworCitJTlQzMiBXSU5BUEkgSW1hZ2VMaXN0X0FkZCAoCisJSElNQUdFTElTVCBoaW1sLCAgICAgLyogaW1hZ2VsaXN0IGhhbmRsZSAqLworCUhCSVRNQVAzMiBoYm1JbWFnZSwgIC8qIGltYWdlIGJpdG1hcCAqLworCUhCSVRNQVAzMiBoYm1NYXNrKSAgIC8qIG1hc2sgYml0bWFwICovCiB7CiAgICAgSERDMzIgICAgaGRjSW1hZ2VMaXN0LCBoZGNJbWFnZSwgaGRjTWFzazsKICAgICBJTlQzMiAgICBuRmlyc3RJbmRleCwgbkltYWdlQ291bnQ7CkBAIC04OSwxMSArMTc3LDE0IEBACiAgICAgQ09MT1JSRUYgY2xyQ29sb3I7CiAgICAgQklUTUFQMzIgYm1wOwogCisgICAgaWYgKGhpbWwgPT0gTlVMTCkgcmV0dXJuICgtMSk7CisKICAgICBHZXRPYmplY3QzMkEgKGhibUltYWdlLCBzaXplb2YoQklUTUFQMzIpLCAoTFBWT0lEKSZibXApOwogICAgIG5JbWFnZUNvdW50ID0gYm1wLmJtV2lkdGggLyBoaW1sLT5jeDsKIAogICAgIGlmIChoaW1sLT5jQ3VySW1hZ2UgKyBuSW1hZ2VDb3VudCA+PSBoaW1sLT5jTWF4SW1hZ2UpCi0gICAgICAgIElNQUdFTElTVF9Hcm93Qml0bWFwcyAoaGltbCwgbkltYWdlQ291bnQpOworICAgICAgICBJTUFHRUxJU1RfSW50ZXJuYWxHcm93Qml0bWFwcyAoaGltbCwgbkltYWdlQ291bnQpOworLy8gICAgICAgIEltYWdlTGlzdF9TZXRJbWFnZUNvdW50IChoaW1sLCBoaW1sLT5jQ3VySW1hZ2UgKyBuSW1hZ2VDb3VudCk7CiAKICAgICBoZGNJbWFnZUxpc3QgPSBDcmVhdGVDb21wYXRpYmxlREMzMiAoMCk7CiAgICAgaGRjSW1hZ2UgPSBDcmVhdGVDb21wYXRpYmxlREMzMiAoMCk7CkBAIC0xMDQsMjIgKzE5NSwyOCBAQAogICAgIEJpdEJsdDMyIChoZGNJbWFnZUxpc3QsIGhpbWwtPmNDdXJJbWFnZSAqIGhpbWwtPmN4LCAwLAogICAgICAgICAgICAgICBibXAuYm1XaWR0aCwgaGltbC0+Y3ksIGhkY0ltYWdlLCAwLCAwLCBTUkNDT1BZKTsKICAgICAgICAgICAKLSAgICBpZiAoaGltbC0+aGJtTWFzaykgewotICAgICAgICBpZiAoaGJtTWFzaykgeworICAgIGlmIChoaW1sLT5oYm1NYXNrKQorICAgIHsKKyAgICAgICAgaWYgKGhibU1hc2spCisgICAgICAgIHsKICAgICAgICAgICAgIFNlbGVjdE9iamVjdDMyIChoZGNJbWFnZUxpc3QsIGhpbWwtPmhibU1hc2spOwogICAgICAgICAgICAgU2VsZWN0T2JqZWN0MzIgKGhkY0ltYWdlLCBoYm1NYXNrKTsKICAgICAgICAgICAgIEJpdEJsdDMyIChoZGNJbWFnZUxpc3QsIGhpbWwtPmNDdXJJbWFnZSAqIGhpbWwtPmN4LCAwLAogICAgICAgICAgICAgICAgICAgICAgIGJtcC5ibVdpZHRoLCBoaW1sLT5jeSwgaGRjSW1hZ2UsIDAsIDAsIFNSQ0NPUFkpOwogICAgICAgICB9Ci0gICAgICAgIGVsc2UgeworICAgICAgICBlbHNlCisgICAgICAgIHsKICAgICAgICAgICAgIC8qIGNyZWF0ZSBtYXNrIGZyb20gdGhlIGltYWdlbGlzdCdzIGJhY2tncm91bmQgY29sb3IgKi8KICAgICAgICAgICAgIGhkY01hc2sgPSBDcmVhdGVDb21wYXRpYmxlREMzMiAoMCk7CiAgICAgICAgICAgICBTZWxlY3RPYmplY3QzMiAoaGRjTWFzaywgaGltbC0+aGJtTWFzayk7CiAgICAgICAgICAgICBuU3RhcnRYID0gaGltbC0+Y0N1ckltYWdlICogaGltbC0+Y3g7Ci0gICAgICAgICAgICBmb3IgKG5SdW5ZID0gMDsgblJ1blkgPCBoaW1sLT5jeTsgblJ1blkrKykgewotICAgICAgICAgICAgICAgIGZvciAoblJ1blggPSAwOyBuUnVuWCA8IGJtcC5ibVdpZHRoOyBuUnVuWCsrKSB7Ci0gICAgICAgICAgICAgICAgICAgIGNsckNvbG9yID0gR2V0UGl4ZWwzMiAoaGRjSW1hZ2UsIG5SdW5YLCBuUnVuWSk7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChjbHJDb2xvciA9PSBoaW1sLT5jbHJCaykgeworICAgICAgICAgICAgZm9yIChuUnVuWSA9IDA7IG5SdW5ZIDwgaGltbC0+Y3k7IG5SdW5ZKyspCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgZm9yIChuUnVuWCA9IDA7IG5SdW5YIDwgYm1wLmJtV2lkdGg7IG5SdW5YKyspCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBjbHJDb2xvciA9IEdldFBpeGVsMzIgKGhkY0ltYWdlTGlzdCwgblN0YXJ0WCArIG5SdW5YLCBuUnVuWSk7CisgICAgICAgICAgICAgICAgICAgIGlmIChjbHJDb2xvciA9PSBoaW1sLT5jbHJCaykKKyAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgU2V0UGl4ZWwzMiAoaGRjSW1hZ2VMaXN0LCBuU3RhcnRYICsgblJ1blgsIG5SdW5ZLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJHQigwLCAwLCAwKSk7CiAgICAgICAgICAgICAgICAgICAgICAgICBTZXRQaXhlbDMyIChoZGNNYXNrLCBuU3RhcnRYICsgblJ1blgsIG5SdW5ZLCAKQEAgLTE0NCwyMCArMjQxLDM0IEBACiB9CiAKIAotSU5UMzIgV0lOQVBJCi1JbWFnZUxpc3RfQWRkTWFza2VkIChISU1BR0VMSVNUIGhpbWwsIEhCSVRNQVAzMiBoYm1JbWFnZSwgQ09MT1JSRUYgY3JNYXNrKQorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCSAJCSBJbWFnZUxpc3RfQWRkTWFza2VkICAgW0NPTUNUTDMyLjQxXQorICoKKyAqICBBZGRzIGFuIGltYWdlIHRvIGFuIGltYWdlbGlzdCBhbmQgY3JlYXRlcyBhIG1hc2sgZnJvbSB0aGUgZ2l2ZW4KKyAqICBtYXNrIGNvbG9yLgorICoKKyAqICBSRVRVUk5TCisgKiAgICBJbmRleCBvZiB0aGUgZmlyc3QgaW1hZ2UgdGhhdCB3YXMgYWRkZWQsIC0xIGlmIGFuIGVycm9yIG9jY3VycmVkLgorICovCisKK0lOVDMyIFdJTkFQSSBJbWFnZUxpc3RfQWRkTWFza2VkICgKKwlISU1BR0VMSVNUIGhpbWwsICAgIC8qIGltYWdlIGxpc3QgaGFuZGxlICovCisJSEJJVE1BUDMyIGhibUltYWdlLCAvKiBiaXRtYXAgaGFuZGxlICovCisJQ09MT1JSRUYgY2xyTWFzaykgICAvKiBiYWNrcm91bmQgY29sb3Igb2YgdGhlIGltYWdlICovCiB7CiAgICAgSERDMzIgICAgaGRjSW1hZ2VMaXN0LCBoZGNJbWFnZSwgaGRjTWFzazsKICAgICBJTlQzMiAgICBuSW5kZXgsIG5JbWFnZUNvdW50OwogICAgIEJJVE1BUDMyIGJtcDsKICAgICBJTlQzMiAgICBuU3RhcnRYLCBuUnVuWCwgblJ1blk7Ci0gICAgQ09MT1JSRUYgY3JDb2xvcjsKKyAgICBDT0xPUlJFRiBjbHJDb2xvcjsKKworICAgIGlmIChoaW1sID09IE5VTEwpIHJldHVybiAoLTEpOwogCiAgICAgR2V0T2JqZWN0MzJBIChoYm1JbWFnZSwgc2l6ZW9mKEJJVE1BUDMyKSwgJmJtcCk7CiAgICAgbkltYWdlQ291bnQgPSBibXAuYm1XaWR0aCAvIGhpbWwtPmN4OwogCiAgICAgaWYgKGhpbWwtPmNDdXJJbWFnZSArIG5JbWFnZUNvdW50ID49IGhpbWwtPmNNYXhJbWFnZSkKLSAgICAgICAgSU1BR0VMSVNUX0dyb3dCaXRtYXBzIChoaW1sLCBuSW1hZ2VDb3VudCk7CisgICAgICAgIElNQUdFTElTVF9JbnRlcm5hbEdyb3dCaXRtYXBzIChoaW1sLCBuSW1hZ2VDb3VudCk7CiAKICAgICBuSW5kZXggPSBoaW1sLT5jQ3VySW1hZ2U7CiAgICAgaGltbC0+Y0N1ckltYWdlICs9IG5JbWFnZUNvdW50OwpAQCAtMTY3LDE4ICsyNzgsMjIgQEAKIAogICAgIFNlbGVjdE9iamVjdDMyIChoZGNJbWFnZUxpc3QsIGhpbWwtPmhibUltYWdlKTsKICAgICBTZWxlY3RPYmplY3QzMiAoaGRjSW1hZ2UsIGhibUltYWdlKTsKLSAgICBCaXRCbHQzMiAoaGRjSW1hZ2VMaXN0LCBuSW5kZXggKiBoaW1sLT5jeCwgMCwKLSAgICAgICAgICAgICAgYm1wLmJtV2lkdGgsIGhpbWwtPmN5LCBoZGNJbWFnZSwgMCwgMCwgU1JDQ09QWSk7CisgICAgQml0Qmx0MzIgKGhkY0ltYWdlTGlzdCwgbkluZGV4ICogaGltbC0+Y3gsIDAsIGJtcC5ibVdpZHRoLCBoaW1sLT5jeSwKKyAgICAgICAgICAgICAgaGRjSW1hZ2UsIDAsIDAsIFNSQ0NPUFkpOwogCi0gICAgaWYgKGhpbWwtPmhibU1hc2spIHsKKyAgICBpZiAoaGltbC0+aGJtTWFzaykKKyAgICB7CiAgICAgICAgIC8qIGNyZWF0ZSBNYXNrICovCiAgICAgICAgIGhkY01hc2sgPSBDcmVhdGVDb21wYXRpYmxlREMzMiAoMCk7CiAgICAgICAgIFNlbGVjdE9iamVjdDMyIChoZGNNYXNrLCBoaW1sLT5oYm1NYXNrKTsKICAgICAgICAgblN0YXJ0WCA9IG5JbmRleCAqIGhpbWwtPmN4OwotICAgICAgICBmb3IgKG5SdW5ZID0gMDsgblJ1blkgPCBoaW1sLT5jeTsgblJ1blkrKykgewotICAgICAgICAgICAgZm9yIChuUnVuWCA9IDA7IG5SdW5YIDwgYm1wLmJtV2lkdGg7IG5SdW5YKyspIHsKLSAgICAgICAgICAgICAgICBjckNvbG9yID0gR2V0UGl4ZWwzMiAoaGRjSW1hZ2UsIG5SdW5YLCBuUnVuWSk7Ci0gICAgICAgICAgICAgICAgaWYgKGNyQ29sb3IgPT0gY3JNYXNrKSB7CisgICAgICAgIGZvciAoblJ1blkgPSAwOyBuUnVuWSA8IGhpbWwtPmN5OyBuUnVuWSsrKQorICAgICAgICB7CisgICAgICAgICAgICBmb3IgKG5SdW5YID0gMDsgblJ1blggPCBibXAuYm1XaWR0aDsgblJ1blgrKykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjbHJDb2xvciA9IEdldFBpeGVsMzIgKGhkY0ltYWdlTGlzdCwgblN0YXJ0WCArIG5SdW5YLCBuUnVuWSk7CisgICAgICAgICAgICAgICAgaWYgKGNsckNvbG9yID09IGNsck1hc2spCisgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICBTZXRQaXhlbDMyIChoZGNJbWFnZUxpc3QsIG5TdGFydFggKyBuUnVuWCwgblJ1blksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJHQigwLCAwLCAwKSk7CiAgICAgICAgICAgICAgICAgICAgIFNldFBpeGVsMzIgKGhkY01hc2ssIG5TdGFydFggKyBuUnVuWCwgblJ1blksCkBAIC0xOTgsMTAyICszMTMsNTgxIEBACiB9CiAKIAotSElNQUdFTElTVCBXSU5BUEkKLUltYWdlTGlzdF9DcmVhdGUgKElOVDMyIGN4LCBJTlQzMiBjeSwgVUlOVDMyIGZsYWdzLCBJTlQzMiBjSW5pdGlhbCwgSU5UMzIgY0dyb3cpCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoJIAkJIEltYWdlTGlzdF9CZWdpbkRyYWcgICBbQ09NQ1RMMzIuNDJdCisgKgorICogQ3JlYXRlcyBhIHRlbXBvcmFyeSBpbWFnZWxpc3Qgd2l0aCBhbiBpbWFnZSBpbiBpdCwgd2hpY2ggd2lsbCBiZSB1c2VkCisgKiBhcyBhIGRyYWcgaW1hZ2UuCisgKi8KKworQk9PTDMyIFdJTkFQSSBJbWFnZUxpc3RfQmVnaW5EcmFnICgKKwlISU1BR0VMSVNUIGhpbWxUcmFjaywgLyogSGFuZGxlIG9mIHRoZSBzb3VyY2UgaW1hZ2VsaXN0ICovCisJSU5UMzIgaVRyYWNrLCAgICAgICAgIC8qIEluZGV4IG9mIHRoZSBpbWFnZSBpbiB0aGUgc291cmNlIGltYWdlbGlzdCAqLworCUlOVDMyIGR4SG90c3BvdCwgICAgICAvKiBQb3NpdGlvbiBvZiB0aGUgaG90IHNwb3Qgb2YgdGhlICovCisJSU5UMzIgZHlIb3RzcG90KSAgICAgIC8qIGRyYWcgaW1hZ2UgKi8KK3sKKyAgICBIREMzMiBoZGNTcmMsIGhkY0RzdDsKKworICAgIEZJWE1FKGltYWdlbGlzdCwgIkltYWdlTGlzdF9CZWdpbkRyYWc6IHBhcnRpYWxseSBpbXBsZW1lbnRlZCFcbiIpOworCisgICAgaWYgKGhpbWxUcmFjayA9PSBOVUxMKSByZXR1cm4gKEZBTFNFKTsKKyAgICBpZiAoaGltbEludGVybmFsRHJhZykKKyAgICAgICAgSW1hZ2VMaXN0X0VuZERyYWcgKCk7CisKKyAgICBoaW1sSW50ZXJuYWxEcmFnID0gSW1hZ2VMaXN0X0NyZWF0ZSAoaGltbFRyYWNrLT5jeCwgaGltbFRyYWNrLT5jeSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGltbFRyYWNrLT5mbGFncywgMSwgMSk7CisgICAgaWYgKGhpbWxJbnRlcm5hbERyYWcgPT0gTlVMTCkKKyAgICB7CisgICAgICAgIEVSUihpbWFnZWxpc3QsICJFcnJvciBjcmVhdGluZyBkcmFnIGltYWdlIGxpc3QhXG4iKTsKKyAgICAgICAgcmV0dXJuIChGQUxTRSk7CisgICAgfQorCisgICAgbkludGVybmFsRHJhZ0hvdHNwb3RYID0gZHhIb3RzcG90OworICAgIG5JbnRlcm5hbERyYWdIb3RzcG90WSA9IGR5SG90c3BvdDsKKworICAgIGhkY1NyYyA9IENyZWF0ZUNvbXBhdGlibGVEQzMyICgwKTsKKyAgICBoZGNEc3QgPSBDcmVhdGVDb21wYXRpYmxlREMzMiAoMCk7CisKKyAgICAvKiBjb3B5IGltYWdlICovCisgICAgU2VsZWN0T2JqZWN0MzIgKGhkY1NyYywgaGltbFRyYWNrLT5oYm1JbWFnZSk7CisgICAgU2VsZWN0T2JqZWN0MzIgKGhkY0RzdCwgaGltbEludGVybmFsRHJhZy0+aGJtSW1hZ2UpOworICAgIFN0cmV0Y2hCbHQzMiAoaGRjRHN0LCAwLCAwLCBoaW1sSW50ZXJuYWxEcmFnLT5jeCwgaGltbEludGVybmFsRHJhZy0+Y3ksIGhkY1NyYywKKyAgICAgICAgICAgICAgICAgIGlUcmFjayAqIGhpbWxUcmFjay0+Y3gsIDAsIGhpbWxUcmFjay0+Y3gsIGhpbWxUcmFjay0+Y3ksIFNSQ0NPUFkpOworCisgICAgLyogY29weSBtYXNrICovCisgICAgU2VsZWN0T2JqZWN0MzIgKGhkY1NyYywgaGltbFRyYWNrLT5oYm1NYXNrKTsKKyAgICBTZWxlY3RPYmplY3QzMiAoaGRjRHN0LCBoaW1sSW50ZXJuYWxEcmFnLT5oYm1NYXNrKTsKKyAgICBTdHJldGNoQmx0MzIgKGhkY0RzdCwgMCwgMCwgaGltbEludGVybmFsRHJhZy0+Y3gsIGhpbWxJbnRlcm5hbERyYWctPmN5LCBoZGNTcmMsCisgICAgICAgICAgICAgICAgICBpVHJhY2sgKiBoaW1sVHJhY2stPmN4LCAwLCBoaW1sVHJhY2stPmN4LCBoaW1sVHJhY2stPmN5LCBTUkNDT1BZKTsKKworICAgIERlbGV0ZURDMzIgKGhkY1NyYyk7CisgICAgRGVsZXRlREMzMiAoaGRjRHN0KTsKKworICAgIGhpbWxJbnRlcm5hbERyYWctPmNDdXJJbWFnZSA9IDE7CisKKyAgICByZXR1cm4gKFRSVUUpOworfQorCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgkgCQkgSW1hZ2VMaXN0X0NvcHkgICBbQ09NQ1RMMzIuNDNdCisgKgorICogIENvcGllcyBhbiBpbWFnZSBvZiB0aGUgc291cmNlIGltYWdlbGlzdCB0byBhbiBpbWFnZSBvZiB0aGUgCisgKiAgZGVzdGluYXRpb24gaW1hZ2VsaXN0LiBJbWFnZXMgY2FuIGJlIGNvcGllZCBvciBzd2FwcGVkLgorICogIENvcHlpbmcgZnJvbSBvbmUgaW1hZ2VsaXN0IHRvIGFub3RoZXIgaXMgYWxsb3dlZCwgaW4gY29udHJhcnkgdG8KKyAqICBNJCdzIG9yaWdpbmFsIGltcGxlbWVudGF0aW9uLiBUaGV5IGp1c3QgYWxsb3cgY29weWluZyBvciBzd2FwcGluZworICogIHdpdGhpbiBvbmUgaW1hZ2VsaXN0IChoaW1sRHN0IGFuZCBoaW1sU3JjIG11c3QgYmUgdGhlIHNhbWUpLgorICovCisKK0JPT0wzMiBXSU5BUEkgSW1hZ2VMaXN0X0NvcHkgKAorCUhJTUFHRUxJU1QgaGltbERzdCwgIC8qIEhhbmRsZSBvZiB0aGUgZGVzdGluYXRpb24gaW1hZ2VsaXN0ICovCisJSU5UMzIgaURzdCwgICAgICAgICAgLyogSW5kZXggb2YgdGhlIGRlc3RpbmF0aW9uIGltYWdlICovCisJSElNQUdFTElTVCBoaW1sU3JjLCAgLyogSGFuZGVsIG9kIHRoZSBzb3VyY2UgaW1hZ2VsaXN0ICovCisJSU5UMzIgaVNyYywgICAgICAgICAgLyogSW5kZXggb2YgdGhlIHNvdXJjZSBpbWFnZSAqLworCUlOVDMyIHVGbGFncykgICAgICAgIC8qIEZsYWdzIHVzZWQgZm9yIHRoZSBjb3B5IG9wZXJhdGlvbiAqLworeworICAgIEhEQzMyIGhkY1NyYywgaGRjRHN0OyAgICAKKworICAgIFRSQUNFKGltYWdlbGlzdCwgImlEc3Q9JWQgIGlTcmM9JWRcbiIsIGlEc3QsIGlTcmMpOworCisgICAgaWYgKChoaW1sU3JjID09IE5VTEwpIHx8IChoaW1sRHN0ID09IE5VTEwpKSByZXR1cm4gKEZBTFNFKTsKKyAgICBpZiAoKGlEc3QgPCAwKSB8fCAoaURzdCA+PSBoaW1sRHN0LT5jQ3VySW1hZ2UpKSByZXR1cm4gKEZBTFNFKTsKKyAgICBpZiAoKGlTcmMgPCAwKSB8fCAoaVNyYyA+PSBoaW1sU3JjLT5jQ3VySW1hZ2UpKSByZXR1cm4gKEZBTFNFKTsKKworICAgIGhkY1NyYyA9IENyZWF0ZUNvbXBhdGlibGVEQzMyICgwKTsKKyAgICBpZiAoaGltbERzdCA9PSBoaW1sU3JjKQorICAgICAgICBoZGNEc3QgPSBoZGNTcmM7CisgICAgZWxzZQorICAgICAgICBoZGNEc3QgPSBDcmVhdGVDb21wYXRpYmxlREMzMiAoMCk7CisKKyAgICBpZiAodUZsYWdzICYgSUxDRl9TV0FQKQorICAgIHsKKyAgICAgICAgLyogc3dhcCAqLworICAgICAgICBIQklUTUFQMzIgaGJtVGVtcEltYWdlLCBoYm1UZW1wTWFzazsKKworICAgICAgICAvKiBjcmVhdGUgdGVtcG9yYXJ5IGJpdG1hcHMgKi8KKyAgICAgICAgaGJtVGVtcEltYWdlID0gQ3JlYXRlQml0bWFwMzIgKGhpbWxTcmMtPmN4LCBoaW1sU3JjLT5jeSwgMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhpbWxTcmMtPnVCaXRzUGl4ZWwsIE5VTEwpOworICAgICAgICBoYm1UZW1wTWFzayA9IENyZWF0ZUJpdG1hcDMyIChoaW1sU3JjLT5jeCwgaGltbFNyYy0+Y3ksIDEsIDEsIE5VTEwpOworCisgICAgICAgIC8qIGNvcHkgKGFuZCBzdHJldGNoKSBkZXN0aW5hdGlvbiB0byB0ZW1wb3JhcnkgYml0bWFwcy4oc2F2ZSkgKi8KKyAgICAgICAgLyogaW1hZ2UgKi8KKyAgICAgICAgU2VsZWN0T2JqZWN0MzIgKGhkY1NyYywgaGltbERzdC0+aGJtSW1hZ2UpOworICAgICAgICBTZWxlY3RPYmplY3QzMiAoaGRjRHN0LCBoYm1UZW1wSW1hZ2UpOworICAgICAgICBTdHJldGNoQmx0MzIgKGhkY0RzdCwgMCwgMCwgaGltbFNyYy0+Y3gsIGhpbWxTcmMtPmN5LAorICAgICAgICAgICAgICAgICAgICAgIGhkY1NyYywgaURzdCAqIGhpbWxEc3QtPmN4LCAwLCBoaW1sRHN0LT5jeCwgaGltbERzdC0+Y3ksCisgICAgICAgICAgICAgICAgICAgICAgU1JDQ09QWSk7CisgICAgICAgIC8qIG1hc2sgKi8KKyAgICAgICAgU2VsZWN0T2JqZWN0MzIgKGhkY1NyYywgaGltbERzdC0+aGJtTWFzayk7CisgICAgICAgIFNlbGVjdE9iamVjdDMyIChoZGNEc3QsIGhibVRlbXBNYXNrKTsKKyAgICAgICAgU3RyZXRjaEJsdDMyIChoZGNEc3QsIDAsIDAsIGhpbWxTcmMtPmN4LCBoaW1sU3JjLT5jeSwKKyAgICAgICAgICAgICAgICAgICAgICBoZGNTcmMsIGlEc3QgKiBoaW1sRHN0LT5jeCwgMCwgaGltbERzdC0+Y3gsIGhpbWxEc3QtPmN5LAorICAgICAgICAgICAgICAgICAgICAgIFNSQ0NPUFkpOworCisgICAgICAgIC8qIGNvcHkgKGFuZCBzdHJldGNoKSBzb3VyY2UgdG8gZGVzdGluYXRpb24gKi8KKyAgICAgICAgLyogaW1hZ2UgKi8KKyAgICAgICAgU2VsZWN0T2JqZWN0MzIgKGhkY1NyYywgaGltbFNyYy0+aGJtSW1hZ2UpOworICAgICAgICBTZWxlY3RPYmplY3QzMiAoaGRjRHN0LCBoaW1sRHN0LT5oYm1JbWFnZSk7CisgICAgICAgIFN0cmV0Y2hCbHQzMiAoaGRjRHN0LCBpRHN0ICogaGltbERzdC0+Y3gsIDAsIGhpbWxEc3QtPmN4LCBoaW1sRHN0LT5jeSwKKyAgICAgICAgICAgICAgICAgICAgICBoZGNTcmMsIGlTcmMgKiBoaW1sU3JjLT5jeCwgMCwgaGltbFNyYy0+Y3gsIGhpbWxTcmMtPmN5LAorICAgICAgICAgICAgICAgICAgICAgIFNSQ0NPUFkpOworICAgICAgICAvKiBtYXNrICovCisgICAgICAgIFNlbGVjdE9iamVjdDMyIChoZGNTcmMsIGhpbWxTcmMtPmhibU1hc2spOworICAgICAgICBTZWxlY3RPYmplY3QzMiAoaGRjRHN0LCBoaW1sRHN0LT5oYm1NYXNrKTsKKyAgICAgICAgU3RyZXRjaEJsdDMyIChoZGNEc3QsIGlEc3QgKiBoaW1sRHN0LT5jeCwgMCwgaGltbERzdC0+Y3gsIGhpbWxEc3QtPmN5LAorICAgICAgICAgICAgICAgICAgICAgIGhkY1NyYywgaVNyYyAqIGhpbWxTcmMtPmN4LCAwLCBoaW1sU3JjLT5jeCwgaGltbFNyYy0+Y3ksCisgICAgICAgICAgICAgICAgICAgICAgU1JDQ09QWSk7CisKKyAgICAgICAgLyogY29weSAod2l0aG91dCBzdHJldGNoaW5nKSB0ZW1wb3JhcnkgYml0bWFwcyB0byBzb3VyY2UgKHJlc3RvcmUpICovCisgICAgICAgIC8qIGltYWdlICovCisgICAgICAgIFNlbGVjdE9iamVjdDMyIChoZGNTcmMsIGhibVRlbXBJbWFnZSk7CisgICAgICAgIFNlbGVjdE9iamVjdDMyIChoZGNEc3QsIGhpbWxTcmMtPmhibUltYWdlKTsKKyAgICAgICAgQml0Qmx0MzIgKGhkY0RzdCwgaVNyYyAqIGhpbWxTcmMtPmN4LCAwLCBoaW1sU3JjLT5jeCwgaGltbFNyYy0+Y3ksCisgICAgICAgICAgICAgICAgICBoZGNTcmMsIDAsIDAsIFNSQ0NPUFkpOworICAgICAgICAvKiBtYXNrICovCisgICAgICAgIFNlbGVjdE9iamVjdDMyIChoZGNTcmMsIGhibVRlbXBNYXNrKTsKKyAgICAgICAgU2VsZWN0T2JqZWN0MzIgKGhkY0RzdCwgaGltbFNyYy0+aGJtTWFzayk7CisgICAgICAgIEJpdEJsdDMyIChoZGNEc3QsIGlTcmMgKiBoaW1sU3JjLT5jeCwgMCwgaGltbFNyYy0+Y3gsIGhpbWxTcmMtPmN5LAorICAgICAgICAgICAgICAgICAgaGRjU3JjLCAwLCAwLCBTUkNDT1BZKTsKKworICAgICAgICAvKiBkZWxldGUgdGVtcG9yYXJ5IGJpdG1hcHMgKi8KKyAgICAgICAgRGVsZXRlT2JqZWN0MzIgKGhibVRlbXBNYXNrKTsKKyAgICAgICAgRGVsZXRlT2JqZWN0MzIgKGhibVRlbXBJbWFnZSk7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIC8qIGNvcHkgaW1hZ2UgKi8KKyAgICAgICAgU2VsZWN0T2JqZWN0MzIgKGhkY1NyYywgaGltbFNyYy0+aGJtSW1hZ2UpOworICAgICAgICBpZiAoaGltbFNyYyA9PSBoaW1sRHN0KQorICAgICAgICAgICAgaGRjRHN0ID0gaGRjU3JjOworICAgICAgICBlbHNlCisgICAgICAgICAgICBTZWxlY3RPYmplY3QzMiAoaGRjRHN0LCBoaW1sRHN0LT5oYm1JbWFnZSk7CisgICAgICAgIFN0cmV0Y2hCbHQzMiAoaGRjRHN0LCBpRHN0ICogaGltbERzdC0+Y3gsIDAsIGhpbWxEc3QtPmN4LCBoaW1sRHN0LT5jeSwKKyAgICAgICAgICAgICAgICAgICAgICBoZGNTcmMsIGlTcmMgKiBoaW1sU3JjLT5jeCwgMCwgaGltbFNyYy0+Y3gsIGhpbWxTcmMtPmN5LAorICAgICAgICAgICAgICAgICAgICAgIFNSQ0NPUFkpOworCisgICAgICAgIC8qIGNvcHkgbWFzayAqLworICAgICAgICBTZWxlY3RPYmplY3QzMiAoaGRjU3JjLCBoaW1sU3JjLT5oYm1NYXNrKTsKKyAgICAgICAgaWYgKGhpbWxTcmMgPT0gaGltbERzdCkKKyAgICAgICAgICAgIGhkY0RzdCA9IGhkY1NyYzsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgU2VsZWN0T2JqZWN0MzIgKGhkY0RzdCwgaGltbERzdC0+aGJtTWFzayk7CisgICAgICAgIFN0cmV0Y2hCbHQzMiAoaGRjRHN0LCBpRHN0ICogaGltbERzdC0+Y3gsIDAsIGhpbWxEc3QtPmN4LCBoaW1sRHN0LT5jeSwKKyAgICAgICAgICAgICAgICAgICAgICBoZGNTcmMsIGlTcmMgKiBoaW1sU3JjLT5jeCwgMCwgaGltbFNyYy0+Y3gsIGhpbWxTcmMtPmN5LAorICAgICAgICAgICAgICAgICAgICAgIFNSQ0NPUFkpOworICAgIH0KKworICAgIERlbGV0ZURDMzIgKGhkY1NyYyk7CisgICAgaWYgKGhpbWxTcmMgIT0gaGltbERzdCkKKyAgICAgICAgRGVsZXRlREMzMiAoaGRjRHN0KTsKKworICAgIHJldHVybiAoVFJVRSk7Cit9CisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCSAJCSBJbWFnZUxpc3RfQ3JlYXRlICAgW0NPTUNUTDMyLjQ0XQorICoKKyAqICBDcmVhdGVzIGFuIGltYWdlbGlzdCBvZiB0aGUgZ2l2ZW4gaW1hZ2Ugc2l6ZSBhbmQgbnVtYmVyIG9mIGltYWdlcy4KKyAqCisgKiAgUkVUVVJOUworICogICAgSGFuZGxlIG9mIHRoZSBjcmVhdGVkIGltYWdlIGxpc3QsIDAgaWYgYW4gZXJyb3Igb2NjdXJyZWQuCisgKi8KKworSElNQUdFTElTVCBXSU5BUEkgSW1hZ2VMaXN0X0NyZWF0ZSAoCisJSU5UMzIgY3gsICAgICAgICAvKiBXaWR0aCBvZiBhbiBpbWFnZSAqLworCUlOVDMyIGN5LCAgICAgICAgLyogSGVpZ2h0IG9mIGFuIGltYWdlICovCisJVUlOVDMyIGZsYWdzLCAgICAvKiBGbGFncyBmb3IgaW1hZ2VsaXN0IGNyZWF0aW9uICovCisJSU5UMzIgY0luaXRpYWwsICAvKiBJbml0aWFsIG51bWJlciBvZiBpbWFnZXMgaW4gdGhlIGltYWdsaXN0ICovCisJSU5UMzIgY0dyb3cpICAgICAvKiBOdW1iZXIgb2YgaW1hZ2VzIHRoYXQgaXMgYWRkZWQgdG8gdGhlICovCisJICAgICAgICAgICAgICAgICAvKiBpbWFnZWxpc3Qgd2hlbiBpdCBncm93cyAqLwogewogICAgIEhJTUFHRUxJU1QgaGltbDsKLSAgICBIQU5ETEUzMiBoSGVhcDsKLSAgICBIREMzMiBoZGNEZXNrdG9wOwotICAgIEhXTkQzMiBod25kRGVza3RvcDsKKyAgICBIREMzMiAgICAgIGhkYzsKKyAgICBJTlQzMiAgICAgIG5Db3VudDsKIAotICAgIGhIZWFwID0gR2V0UHJvY2Vzc0hlYXAgKCk7Ci0gICAgaGltbCA9IChISU1BR0VMSVNUKSBIZWFwQWxsb2MgKGhIZWFwLCAwLCBzaXplb2Yoc3RydWN0IF9JTUFHRUxJU1QpKTsKKyAgICBoaW1sID0gKEhJTUFHRUxJU1QpTG9jYWxBbGxvYzMyIChMTUVNX0ZJWEVEIHwgTE1FTV9aRVJPSU5JVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2Yoc3RydWN0IF9JTUFHRUxJU1QpKTsKICAgICBpZiAoIWhpbWwpCi0gICAgICAgIHJldHVybiAoMCk7Ci0gICAgaGltbC0+aEhlYXAgPSBoSGVhcDsKKyAgICAgICAgcmV0dXJuIChOVUxMKTsKICAgICBoaW1sLT5jeCA9IGN4OwogICAgIGhpbWwtPmN5ID0gY3k7CiAgICAgaGltbC0+ZmxhZ3MgPSBmbGFnczsKICAgICBoaW1sLT5jTWF4SW1hZ2UgPSBjSW5pdGlhbCArIGNHcm93OworICAgIGhpbWwtPmNJbml0aWFsID0gY0luaXRpYWw7CiAgICAgaGltbC0+Y0dyb3cgPSBjR3JvdzsKICAgICBoaW1sLT5jQ3VySW1hZ2UgPSAwOwotICAgIGhpbWwtPmNsckJrID0gQ0xSX05PTkU7ICAvKiA/Pz8gb3IgQ0xSX0RFRkFVTFQgKi8KLSAgICBoaW1sLT5uT3ZsSWR4WzBdID0gLTE7Ci0gICAgaGltbC0+bk92bElkeFsxXSA9IC0xOwotICAgIGhpbWwtPm5PdmxJZHhbMl0gPSAtMTsKLSAgICBoaW1sLT5uT3ZsSWR4WzNdID0gLTE7CisgICAgaGltbC0+Y2xyQmsgPSBDTFJfTk9ORTsKIAotICAgIGh3bmREZXNrdG9wID0gR2V0RGVza3RvcFdpbmRvdzMyKCk7Ci0gICAgaGRjRGVza3RvcCA9IEdldERDMzIgKGh3bmREZXNrdG9wKTsKLSAgICAKKyAgICAvKiBpbml0aWFsaXplIG92ZXJsYXkgbWFzayBpbmRpY2VzICovCisgICAgZm9yIChuQ291bnQgPSAwOyBuQ291bnQgPD0gTUFYX09WRVJMQVlJTUFHRTsgbkNvdW50KyspCisgICAgICAgIGhpbWwtPm5PdmxJZHhbbkNvdW50XSA9IC0xOworCisgICAgaGRjID0gQ3JlYXRlQ29tcGF0aWJsZURDMzIgKDApOworICAgIGhpbWwtPnVCaXRzUGl4ZWwgPSAoVUlOVDMyKUdldERldmljZUNhcHMzMiAoaGRjLCBCSVRTUElYRUwpOworICAgIERlbGV0ZURDMzIgKGhkYyk7CisKKyAgICBUUkFDRShpbWFnZWxpc3QsICJJbWFnZTogJWQgQml0cyBwZXIgUGl4ZWxcbiIsIGhpbWwtPnVCaXRzUGl4ZWwpOworCiAgICAgaGltbC0+aGJtSW1hZ2UgPQotICAgICAgICBDcmVhdGVDb21wYXRpYmxlQml0bWFwMzIgKGhkY0Rlc2t0b3AsIGhpbWwtPmN4ICogaGltbC0+Y01heEltYWdlLCAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoaW1sLT5jeSk7CisgICAgICAgIENyZWF0ZUJpdG1hcDMyIChoaW1sLT5jeCAqIGhpbWwtPmNNYXhJbWFnZSwgaGltbC0+Y3ksCisgICAgICAgICAgICAgICAgICAgICAgICAxLCBoaW1sLT51Qml0c1BpeGVsLCBOVUxMKTsKKyAgICBpZiAoaGltbC0+aGJtSW1hZ2UgPT0gMCkKKyAgICB7CisgICAgICAgIEVSUihpbWFnZWxpc3QsICJFcnJvciBjcmVhdGluZyBpbWFnZSBiaXRtYXAhXG4iKTsKKyAgICAgICAgcmV0dXJuICgwKTsKKyAgICB9CisKICAgICBpZiAoaGltbC0+ZmxhZ3MgJiBJTENfTUFTSykKKyAgICB7CiAgICAgICAgIGhpbWwtPmhibU1hc2sgPSAKLSAgICAgICAgICAgIENyZWF0ZUNvbXBhdGlibGVCaXRtYXAzMiAoaGRjRGVza3RvcCwgaGltbC0+Y3ggKiBoaW1sLT5jTWF4SW1hZ2UsIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoaW1sLT5jeSk7IAorICAgICAgICAgICAgQ3JlYXRlQml0bWFwMzIgKGhpbWwtPmN4ICogaGltbC0+Y01heEltYWdlLCBoaW1sLT5jeSwgMSwgMSwgTlVMTCk7CisgICAgICAgIGlmIChoaW1sLT5oYm1NYXNrID09IDApCisgICAgICAgIHsKKyAgICAgICAgICAgIEVSUihpbWFnZWxpc3QsICJFcnJvciBjcmVhdGluZyBtYXNrIGJpdG1hcCFcbiIpOworICAgICAgICAgICAgaWYgKGhpbWwtPmhibUltYWdlKQorICAgICAgICAgICAgICAgIERlbGV0ZU9iamVjdDMyIChoaW1sLT5oYm1JbWFnZSk7CisgICAgICAgICAgICByZXR1cm4gKDApOworICAgICAgICB9CisgICAgfQogICAgIGVsc2UKICAgICAgICAgaGltbC0+aGJtTWFzayA9IDA7CiAKLSAgICBSZWxlYXNlREMzMiAoaHduZERlc2t0b3AsIGhkY0Rlc2t0b3ApOwotICAgIAogICAgIHJldHVybiAoaGltbCk7ICAgIAogfQogCiAKLUJPT0wzMiBXSU5BUEkKLUltYWdlTGlzdF9EZXN0cm95IChISU1BR0VMSVNUIGhpbWwpCi17CisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoJIAkJIEltYWdlTGlzdF9EZXN0cm95ICAgW0NPTUNUTDMyLjQ1XQorICoKKyAqICBEZXN0cm95IHRoZSBnaXZlbiBpbWFnZWxpc3QuCisgKgorICogIFJFVFVSTlMKKyAqICAgIFRSVUUgaWYgdGhlIGltYWdlIGxpc3Qgd2FzIGRlc3RyeWVkLCBGQUxTRSBpZiBhbiBlcnJvciBvY2N1cnJlZC4KKyAqLworCitCT09MMzIgV0lOQVBJIEltYWdlTGlzdF9EZXN0cm95ICgKKwlISU1BR0VMSVNUIGhpbWwpICAvKiBIYW5kbGUgb2YgdGhlIGltYWdlbGlzdCAqLworeyAKKyAgICBpZiAoaGltbCA9PSBOVUxMKSByZXR1cm4gKEZBTFNFKTsKKwogICAgIGlmIChoaW1sLT5oYm1JbWFnZSkKICAgICAgICAgRGVsZXRlT2JqZWN0MzIgKGhpbWwtPmhibUltYWdlKTsKICAgICBpZiAoaGltbC0+aGJtTWFzaykKICAgICAgICAgRGVsZXRlT2JqZWN0MzIgKGhpbWwtPmhibU1hc2spOwogICAgICAgICAKLSAgICBIZWFwRnJlZSAoaGltbC0+aEhlYXAsIDAsIChMUFZPSUQpaGltbCk7CisgICAgTG9jYWxGcmVlMzIgKChITE9DQUwzMiloaW1sKTsKICAgICByZXR1cm4gKFRSVUUpOwogfQogCiAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgkgCQkgSW1hZ2VMaXN0X0RyYWdFbnRlciAgIFtDT01DVEwzMi40Nl0KKyAqCisgKiAgRklYTUUKKyAqICAgIFRoaXMgaXMgc3RpbGwgYW4gZW1wdHkgc3R1Yi4KKyAqLworCitCT09MMzIgV0lOQVBJIEltYWdlTGlzdF9EcmFnRW50ZXIgKAorCUhXTkQzMiBod25kTG9jaywgCisJSU5UMzIgeCwgCisJSU5UMzIgeSkKK3sKKyAgICBGSVhNRSAoaW1hZ2VsaXN0LCAiZW1wdHkgc3R1YiFcbiIpOworCisgICAgaGN1ckludGVybmFsID0gR2V0Q3Vyc29yMzIgKCk7CisKKworICAgIFNob3dDdXJzb3IzMiAoVFJVRSk7CisKKyAgICByZXR1cm4gKEZBTFNFKTsKK30KKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoJIAkJIEltYWdlTGlzdF9EcmFnTGVhdmUgICBbQ09NQ1RMMzIuNDddCisgKi8KKworQk9PTDMyIFdJTkFQSSBJbWFnZUxpc3RfRHJhZ0xlYXZlICgKKwlIV05EMzIgaHduZExvY2spCit7CisgICAgRklYTUUgKGltYWdlbGlzdCwgImVtcHR5IHN0dWIhXG4iKTsKKworCisKKyAgICBTZXRDdXJzb3IzMiAoaGN1ckludGVybmFsKTsKKyAgICBoY3VySW50ZXJuYWwgPSAwOworIAorICAgIFNob3dDdXJzb3IzMiAoRkFMU0UpOworCisgICAgcmV0dXJuIChGQUxTRSk7Cit9CisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCSAJCSBJbWFnZUxpc3RfRHJhZ01vdmUgICBbQ09NQ1RMMzIuNDhdCisgKi8KKworQk9PTDMyIFdJTkFQSSBJbWFnZUxpc3RfRHJhZ01vdmUgKAorCUlOVDMyIHgsCisJSU5UMzIgeSkKK3sKKyAgICBGSVhNRSAoaW1hZ2VsaXN0LCAiZW1wdHkgc3R1YiFcbiIpOworCisvLyAgICBpZiAoaGN1ckludGVybmFsKQorLy8gICAgICAgIFNldEN1cnNvcjMyIChoY3VySW50ZXJuYWwpOworLy8gICAgSW1hZ2VMaXN0X0RyYXcgKGhpbWxJbnRlcm5hbERyYWcsIDAsIHgsIHksIDApOworCisKKyAgICByZXR1cm4gKEZBTFNFKTsKK30KKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoJIAkJIEltYWdlTGlzdF9EcmFnU2hvd05vbG9jayAgIFtDT01DVEwzMi40OV0KKyAqLwogCiBCT09MMzIgV0lOQVBJCi1JbWFnZUxpc3RfRHJhdyAoSElNQUdFTElTVCBoaW1sLCBJTlQzMiBpLCBIREMzMiBoZGMsIAotICAgICAgICAgICAgICAgIElOVDMyIHgsIElOVDMyIHksIFVJTlQzMiBmU3R5bGUpCitJbWFnZUxpc3RfRHJhZ1Nob3dOb2xvY2sgKEJPT0wzMiBiU2hvdykKIHsKLSAgICBIREMzMiAgICAgaGRjSW1hZ2VMaXN0LGhkY01hc2s7Ci0gICAgSEJJVE1BUDMyIGhibU1hc2s7Ci0gICAgSEJSVVNIMzIgaEJydXNoLCBoT2xkQnJ1c2g7Ci0gICAgSU5UMzIgbk92bElkeDsKKyAgICBGSVhNRSAoaW1hZ2VsaXN0LCAiZW1wdHkgc3R1YiFcbiIpOworCisgICAgcmV0dXJuIChGQUxTRSk7Cit9CisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCSAJCSBJbWFnZUxpc3RfRHJhdyAgIFtDT01DVEwzMi41MF0KKyAqLworCitCT09MMzIgV0lOQVBJIEltYWdlTGlzdF9EcmF3ICgKKwlISU1BR0VMSVNUIGhpbWwsCisJSU5UMzIgaSwKKwlIREMzMiBoZGMsIAorCUlOVDMyIHgsCisJSU5UMzIgeSwKKwlVSU5UMzIgZlN0eWxlKQoreworICAgIElNQUdFTElTVERSQVdQQVJBTVMgaW1sZHA7CisKKyAgICBpbWxkcC5jYlNpemUgID0gc2l6ZW9mKElNQUdFTElTVERSQVdQQVJBTVMpOworICAgIGltbGRwLmhpbWwgICAgPSBoaW1sOworICAgIGltbGRwLmkgICAgICAgPSBpOworICAgIGltbGRwLmhkY0RzdCAgPSBoZGMsCisgICAgaW1sZHAueCAgICAgICA9IHg7CisgICAgaW1sZHAueSAgICAgICA9IHk7CisgICAgaW1sZHAuY3ggICAgICA9IDA7CisgICAgaW1sZHAuY3kgICAgICA9IDA7CisgICAgaW1sZHAueEJpdG1hcCA9IDA7CisgICAgaW1sZHAueUJpdG1hcCA9IDA7CisgICAgaW1sZHAucmdiQmsgICA9IENMUl9ERUZBVUxUOworICAgIGltbGRwLnJnYkZnICAgPSBDTFJfREVGQVVMVDsKKyAgICBpbWxkcC5mU3R5bGUgID0gZlN0eWxlOworICAgIGltbGRwLmR3Um9wICAgPSAwOworCisgICAgcmV0dXJuIChJbWFnZUxpc3RfRHJhd0luZGlyZWN0ICgmaW1sZHApKTsKK30KKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoJIAkJIEltYWdlTGlzdF9EcmF3RXggICBbQ09NQ1RMMzIuNTFdCisgKi8KKworQk9PTDMyIFdJTkFQSSBJbWFnZUxpc3RfRHJhd0V4ICgKKwlISU1BR0VMSVNUIGhpbWwsCisJSU5UMzIgaSwKKwlIREMzMiBoZGMsCisJSU5UMzIgeCwKKwlJTlQzMiB5LAorCUlOVDMyIHhPZmZzLAorCUlOVDMyIHlPZmZzLAorCUNPTE9SUkVGIHJnYkJrLAorCUNPTE9SUkVGIHJnYkZnLAorCVVJTlQzMiBmU3R5bGUpCit7CisgICAgSU1BR0VMSVNURFJBV1BBUkFNUyBpbWxkcDsKKworICAgIGltbGRwLmNiU2l6ZSAgPSBzaXplb2YoSU1BR0VMSVNURFJBV1BBUkFNUyk7CisgICAgaW1sZHAuaGltbCAgICA9IGhpbWw7CisgICAgaW1sZHAuaSAgICAgICA9IGk7CisgICAgaW1sZHAuaGRjRHN0ICA9IGhkYywKKyAgICBpbWxkcC54ICAgICAgID0geDsKKyAgICBpbWxkcC55ICAgICAgID0geTsKKyAgICBpbWxkcC5jeCAgICAgID0geE9mZnM7CisgICAgaW1sZHAuY3kgICAgICA9IHlPZmZzOworICAgIGltbGRwLnhCaXRtYXAgPSAwOworICAgIGltbGRwLnlCaXRtYXAgPSAwOworICAgIGltbGRwLnJnYkJrICAgPSByZ2JCazsKKyAgICBpbWxkcC5yZ2JGZyAgID0gcmdiRmc7CisgICAgaW1sZHAuZlN0eWxlICA9IGZTdHlsZTsKKyAgICBpbWxkcC5kd1JvcCAgID0gMDsKKworICAgIHJldHVybiAoSW1hZ2VMaXN0X0RyYXdJbmRpcmVjdCAoJmltbGRwKSk7Cit9CisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCSAJCSBJbWFnZUxpc3RfRHJhd2luZGlyZWN0ICAgW0NPTUNUTDMyLjUyXQorICovCisKK0JPT0wzMiBXSU5BUEkgSW1hZ2VMaXN0X0RyYXdJbmRpcmVjdCAoCisJSU1BR0VMSVNURFJBV1BBUkFNUyAqcGltbGRwKQoreworICAgIEhJTUFHRUxJU1QgaGltbExvY2FsOworICAgIEhEQzMyICAgICAgaGRjSW1hZ2VMaXN0LGhkY01hc2ssIGhkY1RlbXBJbWFnZTsKKyAgICBIQklUTUFQMzIgIGhibU1hc2ssIGhibVRlbXBJbWFnZTsKKyAgICBIQlJVU0gzMiAgIGhCcnVzaCwgaE9sZEJydXNoOworICAgIElOVDMyICAgICAgbk92bElkeCwgblN0YXJ0WCwgblJ1blgsIG5SdW5ZOworICAgIENPTE9SUkVGICAgY2xyQmxlbmQsIGNsckltYWdlOworICAgIEJPT0wzMiAgICAgYkltYWdlOyAgICAgICAvKiBkcmF3IGltYWdlID8gKi8KKyAgICBCT09MMzIgICAgIGJJbWFnZVRyYW5zOyAgLyogZHJhdyBpbWFnZSB0cmFuc3BhcmVudCA/ICovCisgICAgQk9PTDMyICAgICBiTWFzazsgICAgICAgIC8qIGRyYXcgbWFzayA/ICovCisgICAgQk9PTDMyICAgICBiTWFza1RyYW5zOyAgIC8qIGRyYXcgbWFzayB0cmFuc3BhcmVudCA/ICovCisgICAgQk9PTDMyICAgICBiQmxlbmQgPSBGQUxTRTsKKworICAgIGlmIChwaW1sZHAgPT0gTlVMTCkgcmV0dXJuIChGQUxTRSk7CisgICAgaWYgKHBpbWxkcC0+Y2JTaXplIDwgc2l6ZW9mKElNQUdFTElTVERSQVdQQVJBTVMpKSByZXR1cm4gKEZBTFNFKTsKKworICAgIGhpbWxMb2NhbCA9IHBpbWxkcC0+aGltbDsKKyAgICAKKyAgICAvKiBJTERfTk9STUFMIHN0YXRlICovCisgICAgYkltYWdlICAgICAgPSBUUlVFOworICAgIGJJbWFnZVRyYW5zID0gRkFMU0U7CisgICAgYk1hc2sgICAgICAgPSBGQUxTRTsKKyAgICBiTWFza1RyYW5zICA9IEZBTFNFOworICAgIGlmICgoaGltbExvY2FsLT5jbHJCayA9PSBDTFJfTk9ORSkgJiYgKGhpbWxMb2NhbC0+aGJtTWFzaykpCisgICAgeworICAgICAgICBiSW1hZ2VUcmFucyA9IFRSVUU7CisgICAgICAgIGJNYXNrID0gVFJVRTsKKyAgICAgICAgYk1hc2tUcmFucyA9IFRSVUU7CisgICAgfQorICAgIAorICAgIC8qIElMRF9JTUFHRSBzdGF0ZSAoY2hhbmdlcykgKi8KKyAgICBpZiAocGltbGRwLT5mU3R5bGUgJiBJTERfSU1BR0UpCisgICAgeworICAgICAgICBiTWFzayA9IEZBTFNFOworICAgICAgICBiSW1hZ2UgPSBUUlVFOworICAgICAgICBiSW1hZ2VUcmFucyA9IEZBTFNFOworICAgIH0KKyAgICAKKyAgICAvKiBJTERfTUFTSyBzdGF0ZSAoY2hhbmdlcykgKi8KKyAgICBpZiAoKHBpbWxkcC0+ZlN0eWxlICYgSUxEX01BU0spICYmIChoaW1sTG9jYWwtPmhibU1hc2spKQorICAgIHsKKyAgICAgICAgYk1hc2sgID0gVFJVRTsKKyAgICAgICAgYk1hc2tUcmFucyA9IEZBTFNFOworICAgICAgICBiSW1hZ2UgPSBGQUxTRTsKKyAgICB9CisgICAgaWYgKChwaW1sZHAtPmZTdHlsZSAmIElMRF9UUkFOU1BBUkVOVCkgJiYgKGhpbWxMb2NhbC0+aGJtTWFzaykpCisgICAgICAgIGJNYXNrVHJhbnMgPSBUUlVFOworICAgIGlmICgoaGltbExvY2FsLT5jbHJCayA9PSBDTFJfTk9ORSkgJiYgKGhpbWxMb2NhbC0+aGJtTWFzaykpCisgICAgICAgIGJNYXNrVHJhbnMgPSBUUlVFOworCisKKyAgICBpZiAoKHBpbWxkcC0+ZlN0eWxlICYgSUxEX0JMRU5EMjUpIHx8IChwaW1sZHAtPmZTdHlsZSAmIElMRF9CTEVORDUwKSkKKyAgICAgICAgYkJsZW5kID0gVFJVRTsKIAogICAgIGhkY0ltYWdlTGlzdCA9IENyZWF0ZUNvbXBhdGlibGVEQzMyICgwKTsKLSAgCi0gICAgaWYgKGhpbWwtPmhibU1hc2spIHsgIAotICAgICAgICBTZWxlY3RPYmplY3QzMiAoaGRjSW1hZ2VMaXN0LCBoaW1sLT5oYm1NYXNrKTsKLSAgICAgICAgQml0Qmx0MzIgKGhkYywgeCwgeSwgaGltbC0+Y3gsIGhpbWwtPmN5LCBoZGNJbWFnZUxpc3QsCi0gICAgICAgICAgICAgICAgICBoaW1sLT5jeCAqIGksIDAsIFNSQ0FORCk7ICAKLSAgICB9ICAKIAotICAgIFNlbGVjdE9iamVjdDMyIChoZGNJbWFnZUxpc3QsIGhpbWwtPmhibUltYWdlKTsKIAotICAgIEJpdEJsdDMyIChoZGMsIHgsIHksIGhpbWwtPmN4LCBoaW1sLT5jeSwgaGRjSW1hZ2VMaXN0LAotICAgICAgICAgICAgICBoaW1sLT5jeCAqIGksIDAsIFNSQ1BBSU5UKTsKKyAgICBpZiAoYk1hc2spCisgICAgeworICAgICAgICAvKiBkcmF3IHRoZSBtYXNrICovCisgICAgICAgIFNlbGVjdE9iamVjdDMyIChoZGNJbWFnZUxpc3QsIGhpbWxMb2NhbC0+aGJtTWFzayk7CisgICAgICAgIAorICAgICAgICBCaXRCbHQzMiAocGltbGRwLT5oZGNEc3QsIHBpbWxkcC0+eCwgcGltbGRwLT55LCBwaW1sZHAtPmhpbWwtPmN4LAorICAgICAgICAgICAgICAgICAgcGltbGRwLT5oaW1sLT5jeSwgaGRjSW1hZ2VMaXN0LAorICAgICAgICAgICAgICAgICAgcGltbGRwLT5oaW1sLT5jeCAqIHBpbWxkcC0+aSwgMCwKKyAgICAgICAgICAgICAgICAgIGJNYXNrVHJhbnMgPyBTUkNBTkQgOiBTUkNDT1BZKTsKKyAgICB9CisgICAgaWYgKGJJbWFnZSkKKyAgICB7CisgICAgICAgIC8qIGRyYXcgdGhlIGltYWdlICovCisgICAgICAgIFNlbGVjdE9iamVjdDMyIChoZGNJbWFnZUxpc3QsIGhpbWxMb2NhbC0+aGJtSW1hZ2UpOworICAgICAgICBpZiAoIWJCbGVuZCkKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKCFiSW1hZ2VUcmFucykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBoQnJ1c2ggPSBDcmVhdGVTb2xpZEJydXNoMzIgKGhpbWxMb2NhbC0+Y2xyQmspOworICAgICAgICAgICAgICAgIGhPbGRCcnVzaCA9IFNlbGVjdE9iamVjdDMyIChwaW1sZHAtPmhkY0RzdCwgaEJydXNoKTsKKyAgICAgICAgICAgICAgICBQYXRCbHQzMiAocGltbGRwLT5oZGNEc3QsIHBpbWxkcC0+eCwgcGltbGRwLT55LAorICAgICAgICAgICAgICAgICAgICAgICAgICBoaW1sTG9jYWwtPmN4LCBoaW1sTG9jYWwtPmN5LCBQQVRDT1BZKTsKKyAgICAgICAgICAgICAgICBEZWxldGVPYmplY3QzMiAoU2VsZWN0T2JqZWN0MzIgKHBpbWxkcC0+aGRjRHN0LCBoT2xkQnJ1c2gpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIEJpdEJsdDMyIChwaW1sZHAtPmhkY0RzdCwgcGltbGRwLT54LCBwaW1sZHAtPnksIGhpbWxMb2NhbC0+Y3gsCisgICAgICAgICAgICAgICAgICAgICAgaGltbExvY2FsLT5jeSwgaGRjSW1hZ2VMaXN0LCBoaW1sTG9jYWwtPmN4ICogcGltbGRwLT5pLCAwLAorICAgICAgICAgICAgICAgICAgICAgIFNSQ1BBSU5UKTsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChwaW1sZHAtPnJnYkZnID09IENMUl9ERUZBVUxUKQorICAgICAgICAgICAgICAgIGNsckJsZW5kID0gKEdldFN5c0NvbG9yMzIgKENPTE9SX0hJR0hMSUdIVCkgJiAweEZFRkVGRUZFKT4+MTsKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICBjbHJCbGVuZCA9IChwaW1sZHAtPnJnYkZnICYgMHhGRUZFRkVGRSk+PjE7CisKKyAgICAgICAgICAgIGhkY1RlbXBJbWFnZSA9IENyZWF0ZUNvbXBhdGlibGVEQzMyICgwKTsKKyAgICAgICAgICAgIGhibVRlbXBJbWFnZSA9IENyZWF0ZUJpdG1hcDMyIChoaW1sTG9jYWwtPmN4LCBoaW1sTG9jYWwtPmN5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEsIGhpbWxMb2NhbC0+dUJpdHNQaXhlbCwgTlVMTCk7CisgICAgICAgICAgICBTZWxlY3RPYmplY3QzMiAoaGRjVGVtcEltYWdlLCBoYm1UZW1wSW1hZ2UpOworICAgICAgICAgICAgUGF0Qmx0MzIgKGhkY1RlbXBJbWFnZSwgMCwgMCwgaGltbExvY2FsLT5jeCwgaGltbExvY2FsLT5jeSwgQkxBQ0tORVNTKTsKKworI2lmIDAKKyAgICAgICAgICAgIGlmIChiSW1hZ2VUcmFucykKKyAgICAgICAgICAgIHsKKyNlbmRpZgorICAgICAgICAgICAgICAgIGhkY01hc2sgPSBDcmVhdGVDb21wYXRpYmxlREMzMiAoMCk7ICAgICAgICAgICAKKyAgICAgICAgICAgICAgICBTZWxlY3RPYmplY3QzMiAoaGRjTWFzaywgaGltbExvY2FsLT5oYm1NYXNrKTsKKyAgICAgICAgICAgICAgICBuU3RhcnRYID0gcGltbGRwLT5pICogaGltbExvY2FsLT5jeDsKKworICAgICAgICAgICAgICAgIGZvciAoblJ1blkgPSAwOyBuUnVuWSA8IGhpbWxMb2NhbC0+Y3k7IG5SdW5ZKyspCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBmb3IgKG5SdW5YID0gMDsgblJ1blggPCBoaW1sTG9jYWwtPmN4OyBuUnVuWCsrKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoR2V0UGl4ZWwzMiAoaGRjTWFzaywgblN0YXJ0WCArIG5SdW5YLCBuUnVuWSkgPT0gMCkKKyAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbHJJbWFnZSA9IEdldFBpeGVsMzIgKGhkY0ltYWdlTGlzdCwgblN0YXJ0WCArIG5SdW5YLCBuUnVuWSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xySW1hZ2UgPSAoKGNsckltYWdlICYgMHhGRUZFRkVGRSk+PjEpICsgY2xyQmxlbmQ7CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBTZXRQaXhlbDMyIChoZGNUZW1wSW1hZ2UsIG5SdW5YLCBuUnVuWSwgY2xySW1hZ2UpOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgRGVsZXRlREMzMiAoaGRjTWFzayk7CisgICAgICAgICAgICAgICAgQml0Qmx0MzIgKHBpbWxkcC0+aGRjRHN0LCBwaW1sZHAtPngsIHBpbWxkcC0+eSwgaGltbExvY2FsLT5jeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgaGltbExvY2FsLT5jeSwgaGRjVGVtcEltYWdlLCAwLCAwLCBTUkNQQUlOVCk7CisjaWYgMAorICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworCisgICAgICAgICAgICB9CisjZW5kaWYKKworICAgICAgICAgICAgRGVsZXRlT2JqZWN0MzIgKGhibVRlbXBJbWFnZSk7CisgICAgICAgICAgICBEZWxldGVEQzMyIChoZGNUZW1wSW1hZ2UpOworICAgICAgICB9CisgICAgfSAgIAogCiAgICAgLyogRHJhdyBvdmVybGF5IGltYWdlICovCi0gICAgaWYgKGZTdHlsZSAmIDB4MDcwMCkgewotICAgICAgICBuT3ZsSWR4ID0gKGZTdHlsZSAmIDB4MDcwMCkgPj4gODsKLSAgICAgICAgaWYgKChuT3ZsSWR4ID49IDEpICYmIChuT3ZsSWR4IDw9IDQpKSB7Ci0gICAgICAgICAgICBuT3ZsSWR4ID0gaGltbC0+bk92bElkeFtuT3ZsSWR4IC0gMV07Ci0gICAgICAgICAgICBpZiAoKG5PdmxJZHggPj0gMCkgJiYgKG5PdmxJZHggPD0gaGltbC0+Y0N1ckltYWdlKSkgewotCi0gICAgICAgICAgICAgICAgaWYgKGhpbWwtPmhibU1hc2spIHsgIAotICAgICAgICAgICAgICAgICAgICBTZWxlY3RPYmplY3QzMiAoaGRjSW1hZ2VMaXN0LCBoaW1sLT5oYm1NYXNrKTsKLSAgICAgICAgICAgICAgICAgICAgQml0Qmx0MzIgKGhkYywgeCwgeSwgaGltbC0+Y3gsIGhpbWwtPmN5LCBoZGNJbWFnZUxpc3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoaW1sLT5jeCAqIG5PdmxJZHgsIDAsIFNSQ0FORCk7ICAKKyAgICBpZiAocGltbGRwLT5mU3R5bGUgJiAweDA3MDApCisgICAgeworICAgICAgICBuT3ZsSWR4ID0gKHBpbWxkcC0+ZlN0eWxlICYgMHgwNzAwKSA+PiA4OworICAgICAgICBpZiAoKG5PdmxJZHggPj0gMSkgJiYgKG5PdmxJZHggPD0gTUFYX09WRVJMQVlJTUFHRSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIG5PdmxJZHggPSBwaW1sZHAtPmhpbWwtPm5PdmxJZHhbbk92bElkeCAtIDFdOworICAgICAgICAgICAgaWYgKChuT3ZsSWR4ID49IDApICYmIChuT3ZsSWR4IDw9IHBpbWxkcC0+aGltbC0+Y0N1ckltYWdlKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAocGltbGRwLT5oaW1sLT5oYm1NYXNrKQorICAgICAgICAgICAgICAgIHsgIAorICAgICAgICAgICAgICAgICAgICBTZWxlY3RPYmplY3QzMiAoaGRjSW1hZ2VMaXN0LCBwaW1sZHAtPmhpbWwtPmhibU1hc2spOworICAgICAgICAgICAgICAgICAgICBCaXRCbHQzMiAocGltbGRwLT5oZGNEc3QsIHBpbWxkcC0+eCwgcGltbGRwLT55LCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBpbWxkcC0+aGltbC0+Y3gsIHBpbWxkcC0+aGltbC0+Y3ksIGhkY0ltYWdlTGlzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBpbWxkcC0+aGltbC0+Y3ggKiBuT3ZsSWR4LCAwLCBTUkNBTkQpOyAgCiAgICAgICAgICAgICAgICAgfSAgCi0gICAgICAgICAgICAgICAgU2VsZWN0T2JqZWN0MzIgKGhkY0ltYWdlTGlzdCwgaGltbC0+aGJtSW1hZ2UpOwotICAgICAgICAgICAgICAgIEJpdEJsdDMyIChoZGMsIHgsIHksIGhpbWwtPmN4LCBoaW1sLT5jeSwgaGRjSW1hZ2VMaXN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICBoaW1sLT5jeCAqIG5PdmxJZHgsIDAsIFNSQ1BBSU5UKTsKLQorICAgICAgICAgICAgICAgIFNlbGVjdE9iamVjdDMyIChoZGNJbWFnZUxpc3QsIHBpbWxkcC0+aGltbC0+aGJtSW1hZ2UpOworICAgICAgICAgICAgICAgIEJpdEJsdDMyIChwaW1sZHAtPmhkY0RzdCwgcGltbGRwLT54LCBwaW1sZHAtPnksIAorICAgICAgICAgICAgICAgICAgICAgICAgICBwaW1sZHAtPmhpbWwtPmN4LCBwaW1sZHAtPmhpbWwtPmN5LCBoZGNJbWFnZUxpc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgIHBpbWxkcC0+aGltbC0+Y3ggKiBuT3ZsSWR4LCAwLCBTUkNQQUlOVCk7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KICAgICB9CkBAIC0zMDQsNDIgKzg5OCwxNjYgQEAKIH0KIAogCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoJIAkJIEltYWdlTGlzdF9EdXBsaWNhdGUgICBbQ09NQ1RMMzIuNTNdCisgKgorICogIER1cGxpY2F0ZXMgYW4gaW1hZ2UgbGlzdC4KKyAqCisgKiAgUkVUVVJOUworICogICAgSGFuZGxlIG9mIGR1cGxpY2F0ZSBpbWFnZSBsaXN0LCAwIGlmIGFuIGVycm9yIG9jY3VycmVkLgorICovCiAKLUNPTE9SUkVGIFdJTkFQSQotSW1hZ2VMaXN0X0dldEJrQ29sb3IgKEhJTUFHRUxJU1QgaGltbCkKK0hJTUFHRUxJU1QgV0lOQVBJIEltYWdlTGlzdF9EdXBsaWNhdGUgKAorCUhJTUFHRUxJU1QgaGltbFNyYykKK3sKKyAgICBISU1BR0VMSVNUIGhpbWxEc3Q7CisgICAgSERDMzIgaGRjU3JjLCBoZGNEc3Q7CisKKyAgICBpZiAoaGltbFNyYyA9PSBOVUxMKSB7CisgICAgICAgIEVSUiAoaW1hZ2VsaXN0LCAiSW52YWxpZCBpbWFnZSBsaXN0IGhhbmRsZSFcbiIpOworICAgICAgICByZXR1cm4gKE5VTEwpOworICAgIH0KKworICAgIGhpbWxEc3QgPSBJbWFnZUxpc3RfQ3JlYXRlIChoaW1sU3JjLT5jeCwgaGltbFNyYy0+Y3ksIGhpbWxTcmMtPmZsYWdzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoaW1sU3JjLT5jSW5pdGlhbCwgaGltbFNyYy0+Y0dyb3cpOworCisgICAgaWYgKGhpbWxEc3QpCisgICAgeworICAgICAgICBoZGNTcmMgPSBDcmVhdGVDb21wYXRpYmxlREMzMiAoMCk7CisgICAgICAgIGhkY0RzdCA9IENyZWF0ZUNvbXBhdGlibGVEQzMyICgwKTsKKyAgICAgICAgU2VsZWN0T2JqZWN0MzIgKGhkY1NyYywgaGltbFNyYy0+aGJtSW1hZ2UpOworICAgICAgICBTZWxlY3RPYmplY3QzMiAoaGRjRHN0LCBoaW1sRHN0LT5oYm1JbWFnZSk7CisgICAgICAgIEJpdEJsdDMyIChoZGNEc3QsIDAsIDAsIGhpbWxTcmMtPmNDdXJJbWFnZSAqIGhpbWxTcmMtPmN4LCBoaW1sU3JjLT5jeSwKKyAgICAgICAgICAgICAgICAgIGhkY1NyYywgMCwgMCwgU1JDQ09QWSk7CisKKyAgICAgICAgaWYgKGhpbWxEc3QtPmhibU1hc2spCisgICAgICAgIHsKKyAgICAgICAgICAgIFNlbGVjdE9iamVjdDMyIChoZGNTcmMsIGhpbWxTcmMtPmhibU1hc2spOworICAgICAgICAgICAgU2VsZWN0T2JqZWN0MzIgKGhkY0RzdCwgaGltbERzdC0+aGJtTWFzayk7CisgICAgICAgICAgICBCaXRCbHQzMiAoaGRjRHN0LCAwLCAwLCBoaW1sU3JjLT5jQ3VySW1hZ2UgKiBoaW1sU3JjLT5jeCwKKyAgICAgICAgICAgICAgICAgICAgICBoaW1sU3JjLT5jeSwgaGRjU3JjLCAwLCAwLCBTUkNDT1BZKTsKKyAgICAgICAgfQorCisgICAgICAgIERlbGV0ZURDMzIgKGhkY0RzdCk7CisgICAgICAgIERlbGV0ZURDMzIgKGhkY1NyYyk7CisgICAgfQorCisgICAgcmV0dXJuIChoaW1sRHN0KTsKK30KKworCitCT09MMzIgV0lOQVBJIEltYWdlTGlzdF9FbmREcmFnIChWT0lEKQoreworICAgIEZJWE1FIChpbWFnZWxpc3QsICJwYXJ0aWFsbHkgaW1wbGVtZW50ZWQhXG4iKTsKKworICAgIGlmIChoaW1sSW50ZXJuYWxEcmFnKQorICAgIHsKKworICAgICAgICBJbWFnZUxpc3RfRGVzdHJveSAoaGltbEludGVybmFsRHJhZyk7CisgICAgICAgIGhpbWxJbnRlcm5hbERyYWcgPSBOVUxMOworCisgICAgICAgIG5JbnRlcm5hbERyYWdIb3RzcG90WCA9IDA7CisgICAgICAgIG5JbnRlcm5hbERyYWdIb3RzcG90WSA9IDA7CisKKyAgICB9CisKKyAgICByZXR1cm4gKFRSVUUpOworfQorCisKK0NPTE9SUkVGIFdJTkFQSSBJbWFnZUxpc3RfR2V0QmtDb2xvciAoCisJSElNQUdFTElTVCBoaW1sKQogewogICAgIHJldHVybiAoaGltbC0+Y2xyQmspOwogfQogCiAKLUhJQ09OMzIgV0lOQVBJCi1JbWFnZUxpc3RfR2V0SWNvbiAoSElNQUdFTElTVCBoaW1sLCBJTlQzMiBpLCBVSU5UMzIgZmxhZ3MpCitISU1BR0VMSVNUIFdJTkFQSSBJbWFnZUxpc3RfR2V0RHJhZ0ltYWdlICgKKwlQT0lOVDMyICpwcHQsCisJUE9JTlQzMiAqcHB0SG90c3BvdCkKIHsKKyAgICBGSVhNRSAoaW1hZ2VsaXN0LCAicGFydGlhbGx5IGltbGVtZW50ZWQhXG4iKTsKIAorICAgIGlmIChoaW1sSW50ZXJuYWxEcmFnKQorICAgICAgICByZXR1cm4gKGhpbWxJbnRlcm5hbERyYWcpOwogCi0gICAgcmV0dXJuICgwKTsKKyAgICByZXR1cm4gKE5VTEwpOwogfQogCiAKLUJPT0wzMiBXSU5BUEkKLUltYWdlTGlzdF9HZXRJY29uU2l6ZSAoSElNQUdFTElTVCBoaW1sLCBJTlQzMiAqY3gsIElOVDMyICpjeSkKK0hJQ09OMzIgV0lOQVBJIEltYWdlTGlzdF9HZXRJY29uICgKKwlISU1BR0VMSVNUIGhpbWwsIAorCUlOVDMyIGksIAorCVVJTlQzMiBmU3R5bGUpCiB7Ci0gICAgKmN4ID0gaGltbC0+Y3g7Ci0gICAgKmN5ID0gaGltbC0+Y3k7CisgICAgSUNPTklORk8gaWk7CisgICAgSElDT04zMiAgaEljb247CisgICAgSERDMzIgICAgaGRjOworICAgIElOVDMyICAgIG5XaWR0aCwgbkhlaWdodDsKKworICAgIG5XaWR0aCA9IEdldFN5c3RlbU1ldHJpY3MzMiAoU01fQ1hJQ09OKTsKKyAgICBuSGVpZ2h0ID0gR2V0U3lzdGVtTWV0cmljczMyIChTTV9DWUlDT04pOworCisgICAgaWkuZkljb24gPSBUUlVFOworICAgIGlpLnhIb3RzcG90ID0gMDsKKyAgICBpaS55SG90c3BvdCA9IDA7CisgICAgaWkuaGJtTWFzayAgPSBDcmVhdGVCaXRtYXAzMiAobldpZHRoLCBuSGVpZ2h0LCAxLCAxLCBOVUxMKTsKKyAgICBpaS5oYm1Db2xvciA9IENyZWF0ZUJpdG1hcDMyIChuV2lkdGgsIG5IZWlnaHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMSwgMSwgTlVMTCk7CisKKyAgICBoZGMgPSBDcmVhdGVDb21wYXRpYmxlREMzMigwKTsKKworICAgIC8qIGRyYXcgaW1hZ2UqLworICAgIFNlbGVjdE9iamVjdDMyIChoZGMsIGlpLmhibUNvbG9yKTsKKyAgICBQYXRCbHQzMiAoaGRjLCAwLCAwLCBuV2lkdGgsIG5IZWlnaHQsIEJMQUNLTkVTUyk7CisgICAgSW1hZ2VMaXN0X0RyYXcgKGhpbWwsIGksIGhkYywgMCwgMCwgZlN0eWxlIHwgSUxEX1RSQU5TUEFSRU5UKTsKKworICAgIC8qIGRyYXcgbWFzayovCisgICAgU2VsZWN0T2JqZWN0MzIgKGhkYywgaWkuaGJtTWFzayk7CisgICAgUGF0Qmx0MzIgKGhkYywgMCwgMCwgbldpZHRoLCBuSGVpZ2h0LCBXSElURU5FU1MpOworICAgIEltYWdlTGlzdF9EcmF3IChoaW1sLCBpLCBoZGMsIDAsIDAsIGZTdHlsZSB8IElMRF9NQVNLKTsKKworICAgIGhJY29uID0gQ3JlYXRlSWNvbkluZGlyZWN0ICgmaWkpOyAgICAKKworICAgIERlbGV0ZURDMzIgKGhkYyk7CisgICAgRGVsZXRlT2JqZWN0MzIgKGlpLmhibU1hc2spOworICAgIERlbGV0ZU9iamVjdDMyIChpaS5oYm1Db2xvcik7CisKKyAgICByZXR1cm4gKGhJY29uKTsKK30KKworCitCT09MMzIgV0lOQVBJIEltYWdlTGlzdF9HZXRJY29uU2l6ZSAoCisJSElNQUdFTElTVCBoaW1sLAorCUlOVDMyICpjeCwKKwlJTlQzMiAqY3kpCit7CisKKyAgICBpZiAoaGltbCA9PSBOVUxMKSByZXR1cm4gKEZBTFNFKTsKKworICAgIGlmIChjeCkKKyAgICAgICAgKmN4ID0gaGltbC0+Y3g7CisgICAgCisgICAgaWYgKGN5KQorICAgICAgICAqY3kgPSBoaW1sLT5jeTsKICAgICByZXR1cm4gKFRSVUUpOwogfQogCiAKLUlOVDMyIFdJTkFQSQotSW1hZ2VMaXN0X0dldEltYWdlQ291bnQgKEhJTUFHRUxJU1QgaGltbCkKK0lOVDMyIFdJTkFQSSBJbWFnZUxpc3RfR2V0SW1hZ2VDb3VudCAoCisJSElNQUdFTElTVCBoaW1sKQogewogICAgIHJldHVybiAoaGltbC0+Y0N1ckltYWdlKTsKIH0KIAogCi1CT09MMzIgV0lOQVBJCi1JbWFnZUxpc3RfR2V0SW1hZ2VJbmZvIChISU1BR0VMSVNUIGhpbWwsIElOVDMyIGksIElNQUdFSU5GTyAqcEltYWdlSW5mbykKK0JPT0wzMiBXSU5BUEkgSW1hZ2VMaXN0X0dldEltYWdlSW5mbyAoCisJSElNQUdFTElTVCBoaW1sLAorCUlOVDMyIGksCisJSU1BR0VJTkZPICpwSW1hZ2VJbmZvKQogeworICAgIGlmICgoaGltbCA9PSBOVUxMKSB8fCAocEltYWdlSW5mbyA9PSBOVUxMKSkgcmV0dXJuIChGQUxTRSk7CisKICAgICBwSW1hZ2VJbmZvLT5oYm1JbWFnZSA9IGhpbWwtPmhibUltYWdlOwogICAgIHBJbWFnZUluZm8tPmhibU1hc2sgID0gaGltbC0+aGJtTWFzazsKICAgICAKQEAgLTM1MiwxNSArMTA3MCw0MSBAQAogfQogCiAKLUhJTUFHRUxJU1QgV0lOQVBJCi1JbWFnZUxpc3RfTG9hZEltYWdlMzJBIChISU5TVEFOQ0UzMiBoaSwgTFBDU1RSIGxwYm1wLCBJTlQzMiBjeCwgSU5UMzIgY0dyb3csIAotICAgICAgICAgICAgICAgICAgICAgICAgQ09MT1JSRUYgY2xyTWFzaywgVUlOVDMyIHVUeXBlLCBVSU5UMzIgdUZsYWdzKQorLyogSSBkb24ndCBrbm93IGlmIGl0IGlzIHJlYWxseSBhIEJPT0wzMiBvciBzb21ldGhpbmcgZWxzZSEhIT8/ICovCisKK0JPT0wzMiBXSU5BUEkgSW1hZ2VMaXN0X0dldEltYWdlUmVjdCAoCisJSElNQUdFTElTVCBoaW1sLAorCUlOVDMyIGksCisJTFBSRUNUMzIgbHBSZWN0KQoreworICAgIGlmIChoaW1sID09IE5VTEwpIHJldHVybiAoRkFMU0UpOworICAgIGlmICgoaSA8IDApIHx8IChpID49IGhpbWwtPmNDdXJJbWFnZSkpIHJldHVybiAoRkFMU0UpOworICAgIGlmIChscFJlY3QgPT0gTlVMTCkgcmV0dXJuIChGQUxTRSk7CisKKyAgICBscFJlY3QtPmxlZnQgPSBpICogaGltbC0+Y3g7CisgICAgbHBSZWN0LT50b3AgPSAwOworICAgIGxwUmVjdC0+cmlnaHQgPSBscFJlY3QtPmxlZnQgKyBoaW1sLT5jeDsKKyAgICBscFJlY3QtPmJvdHRvbSA9IGhpbWwtPmN5OworCisgICAgcmV0dXJuIChUUlVFKTsKK30KKworCitISU1BR0VMSVNUIFdJTkFQSSBJbWFnZUxpc3RfTG9hZEltYWdlMzJBICgKKwlISU5TVEFOQ0UzMiBoaSwKKwlMUENTVFIgbHBibXAsCisJSU5UMzIgY3gsCisJSU5UMzIgY0dyb3csIAorCUNPTE9SUkVGIGNsck1hc2ssCisJVUlOVDMyIHVUeXBlLAorCVVJTlQzMiB1RmxhZ3MpCiB7CiAgICAgSElNQUdFTElTVCBoaW1sID0gTlVMTDsKICAgICBIQU5ETEUzMiAgIGhhbmRsZTsKICAgICBJTlQzMiAgICAgIG5JbWFnZUNvdW50OwogCiAgICAgaGFuZGxlID0gTG9hZEltYWdlMzJBIChoaSwgbHBibXAsIHVUeXBlLCAwLCAwLCB1RmxhZ3MpOworICAgIGlmICghaGFuZGxlKSByZXR1cm4gKE5VTEwpOwogCiAgICAgaWYgKHVUeXBlID09IElNQUdFX0JJVE1BUCkgewogICAgICAgICBCSVRNQVAzMiBibXA7CkBAIC00MDgsMTUgKzExNTIsMjQgQEAKIH0KIAogCi1ISU1BR0VMSVNUIFdJTkFQSQotSW1hZ2VMaXN0X0xvYWRJbWFnZTMyVyAoSElOU1RBTkNFMzIgaGksIExQQ1dTVFIgbHBibXAsIElOVDMyIGN4LCBJTlQzMiBjR3JvdywgCi0gICAgICAgICAgICAgICAgICAgICAgICBDT0xPUlJFRiBjbHJNYXNrLCBVSU5UMzIgdVR5cGUsIFVJTlQzMiB1RmxhZ3MpCitISU1BR0VMSVNUIFdJTkFQSSBJbWFnZUxpc3RfTG9hZEltYWdlMzJXICgKKwlISU5TVEFOQ0UzMiBoaSwKKwlMUENXU1RSIGxwYm1wLAorCUlOVDMyIGN4LAorCUlOVDMyIGNHcm93LAorCUNPTE9SUkVGIGNsck1hc2ssCisJVUlOVDMyIHVUeXBlLAorCVVJTlQzMiB1RmxhZ3MpCiB7CiAgICAgSElNQUdFTElTVCBoaW1sID0gTlVMTDsKICAgICBIQU5ETEUzMiAgIGhhbmRsZTsKICAgICBJTlQzMiAgICAgIG5JbWFnZUNvdW50OwogCiAgICAgaGFuZGxlID0gTG9hZEltYWdlMzJXIChoaSwgbHBibXAsIHVUeXBlLCAwLCAwLCB1RmxhZ3MpOworICAgIGlmICghaGFuZGxlKSB7CisgICAgICAgIEVSUiAoaW1hZ2VsaXN0LCAiRXJyb3IgbG9hZGluZyBpbWFnZSFcbiIpOworICAgICAgICByZXR1cm4gKE5VTEwpOworICAgIH0KIAogICAgIGlmICh1VHlwZSA9PSBJTUFHRV9CSVRNQVApIHsKICAgICAgICAgQklUTUFQMzIgYm1wOwpAQCAtNDY0LDE2ICsxMjE3LDU5IEBACiB9CiAKIAotSElNQUdFTElTVCBXSU5BUEkKLUltYWdlTGlzdF9NZXJnZSAoSElNQUdFTElTVCBoaW1sMSwgSU5UMzIgaTEsIEhJTUFHRUxJU1QgaGltbDIsIElOVDMyIGkyLAotICAgICAgICAgICAgICAgICBJTlQzMiB4T2ZmcywgSU5UMzIgeU9mZnMpCitISU1BR0VMSVNUIFdJTkFQSSBJbWFnZUxpc3RfTWVyZ2UgKAorCUhJTUFHRUxJU1QgaGltbDEsCisJSU5UMzIgaTEsCisJSElNQUdFTElTVCBoaW1sMiwKKwlJTlQzMiBpMiwKKwlJTlQzMiB4T2ZmcywKKwlJTlQzMiB5T2ZmcykKIHsKICAgICBISU1BR0VMSVNUIGhpbWxEc3QgPSBOVUxMOwogICAgIEhEQzMyICAgICAgaGRjU3JjSW1hZ2UsIGhkY0RzdEltYWdlOworICAgIElOVDMyICAgICAgY3hEc3QsIGN5RHN0OworICAgIElOVDMyICAgICAgeE9mZjEsIHlPZmYxLCB4T2ZmMiwgeU9mZjI7CiAgICAgSU5UMzIgICAgICBuWDEsIG5YMjsKIAotICAgIGhpbWxEc3QgPSBJbWFnZUxpc3RfQ3JlYXRlIChoaW1sMS0+Y3gsIGhpbWwxLT5jeSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSUxDX01BU0sgfCBJTENfQ09MT1IsIDEsIDEpOworICAgIGlmICgoaGltbDEgPT0gTlVMTCkgfHwgKGhpbWwyID09IE5VTEwpKSByZXR1cm4gKE5VTEwpOworCisgICAgLyogY2hlY2sgaW5kaWNlcyAqLworCisKKyAgICBpZiAoeE9mZnMgPiAwKSB7CisgICAgICAgIGN4RHN0ID0gX01BWCAoaGltbDEtPmN4LCB4T2ZmcyArIGhpbWwyLT5jeCk7CisgICAgICAgIHhPZmYxID0gMDsKKyAgICAgICAgeE9mZjIgPSB4T2ZmczsKKyAgICB9CisgICAgZWxzZSBpZiAoeE9mZnMgPCAwKSB7CisgICAgICAgIGN4RHN0ID0gX01BWCAoaGltbDItPmN4LCBoaW1sMS0+Y3ggLSB4T2Zmcyk7CisgICAgICAgIHhPZmYxID0gLXhPZmZzOworICAgICAgICB4T2ZmMiA9IDA7CisgICAgfQorICAgIGVsc2UgeworICAgICAgICBjeERzdCA9IDA7CisgICAgICAgIHhPZmYxID0gMDsKKyAgICAgICAgeE9mZjIgPSAwOworICAgIH0KKworICAgIGlmICh5T2ZmcyA+IDApIHsKKyAgICAgICAgY3lEc3QgPSBfTUFYIChoaW1sMS0+Y3ksIHlPZmZzICsgaGltbDItPmN5KTsKKyAgICAgICAgeU9mZjEgPSAwOworICAgICAgICB5T2ZmMiA9IHlPZmZzOworICAgIH0KKyAgICBlbHNlIGlmICh5T2ZmcyA8IDApIHsKKyAgICAgICAgY3lEc3QgPSBfTUFYIChoaW1sMi0+Y3ksIGhpbWwxLT5jeSAtIHlPZmZzKTsKKyAgICAgICAgeU9mZjEgPSAteU9mZnM7CisgICAgICAgIHlPZmYyID0gMDsKKyAgICB9CisgICAgZWxzZSB7CisgICAgICAgIGN5RHN0ID0gMDsKKyAgICAgICAgeU9mZjEgPSAwOworICAgICAgICB5T2ZmMiA9IDA7CisgICAgfQorCisgICAgaGltbERzdCA9IEltYWdlTGlzdF9DcmVhdGUgKGN4RHN0LCBjeURzdCwgSUxDX01BU0sgfCBJTENfQ09MT1IsIDEsIDEpOworCiAgICAgaWYgKGhpbWxEc3QpIHsKICAgICAgICAgaGRjU3JjSW1hZ2UgPSBDcmVhdGVDb21wYXRpYmxlREMzMiAoMCk7CiAgICAgICAgIGhkY0RzdEltYWdlID0gQ3JlYXRlQ29tcGF0aWJsZURDMzIgKDApOwpAQCAtNDgzLDI4ICsxMjc5LDI5IEBACiAgICAgICAgIC8qIGNvcHkgaW1hZ2UgKi8KICAgICAgICAgU2VsZWN0T2JqZWN0MzIgKGhkY1NyY0ltYWdlLCBoaW1sMS0+aGJtSW1hZ2UpOwogICAgICAgICBTZWxlY3RPYmplY3QzMiAoaGRjRHN0SW1hZ2UsIGhpbWxEc3QtPmhibUltYWdlKTsKLSAgICAgICAgQml0Qmx0MzIgKGhkY0RzdEltYWdlLCAwLCAwLCBoaW1sRHN0LT5jeCwgaGltbERzdC0+Y3ksIAotICAgICAgICAgICAgICAgICAgaGRjU3JjSW1hZ2UsIG5YMSwgMCwgU1JDQ09QWSk7ICAvKiBTUkNDT1BZICovCisgICAgICAgIEJpdEJsdDMyIChoZGNEc3RJbWFnZSwgMCwgMCwgY3hEc3QsIGN5RHN0LCAKKyAgICAgICAgICAgICAgICAgIGhkY1NyY0ltYWdlLCAwLCAwLCBCTEFDS05FU1MpOworICAgICAgICBCaXRCbHQzMiAoaGRjRHN0SW1hZ2UsIHhPZmYxLCB5T2ZmMSwgaGltbDEtPmN4LCBoaW1sMS0+Y3ksIAorICAgICAgICAgICAgICAgICAgaGRjU3JjSW1hZ2UsIG5YMSwgMCwgU1JDQ09QWSk7CiAKICAgICAgICAgU2VsZWN0T2JqZWN0MzIgKGhkY1NyY0ltYWdlLCBoaW1sMi0+aGJtTWFzayk7Ci0gICAgICAgIEJpdEJsdDMyIChoZGNEc3RJbWFnZSwgeE9mZnMsIHlPZmZzLCAKLSAgICAgICAgICAgICAgICAgIGhpbWxEc3QtPmN4IC0geE9mZnMsIGhpbWxEc3QtPmN5IC0geU9mZnMsIAorICAgICAgICBCaXRCbHQzMiAoaGRjRHN0SW1hZ2UsIHhPZmYyLCB5T2ZmMiwgaGltbDItPmN4LCBoaW1sMi0+Y3ksIAogICAgICAgICAgICAgICAgICAgaGRjU3JjSW1hZ2UsIG5YMiwgMCwgU1JDQU5EKTsKIAogICAgICAgICBTZWxlY3RPYmplY3QzMiAoaGRjU3JjSW1hZ2UsIGhpbWwyLT5oYm1JbWFnZSk7Ci0gICAgICAgIEJpdEJsdDMyIChoZGNEc3RJbWFnZSwgeE9mZnMsIHlPZmZzLCAKLSAgICAgICAgICAgICAgICAgIGhpbWxEc3QtPmN4IC0geE9mZnMsIGhpbWxEc3QtPmN5IC0geU9mZnMsIAorICAgICAgICBCaXRCbHQzMiAoaGRjRHN0SW1hZ2UsIHhPZmYyLCB5T2ZmMiwgaGltbDItPmN4LCBoaW1sMi0+Y3ksIAogICAgICAgICAgICAgICAgICAgaGRjU3JjSW1hZ2UsIG5YMiwgMCwgU1JDUEFJTlQpOwogCiAgICAgICAgIC8qIGNvcHkgbWFzayAqLwogICAgICAgICBTZWxlY3RPYmplY3QzMiAoaGRjU3JjSW1hZ2UsIGhpbWwxLT5oYm1NYXNrKTsKICAgICAgICAgU2VsZWN0T2JqZWN0MzIgKGhkY0RzdEltYWdlLCBoaW1sRHN0LT5oYm1NYXNrKTsKLSAgICAgICAgQml0Qmx0MzIgKGhkY0RzdEltYWdlLCAwLCAwLCBoaW1sRHN0LT5jeCwgaGltbERzdC0+Y3ksIAorICAgICAgICBCaXRCbHQzMiAoaGRjRHN0SW1hZ2UsIDAsIDAsIGN4RHN0LCBjeURzdCwgCisgICAgICAgICAgICAgICAgICBoZGNTcmNJbWFnZSwgMCwgMCwgV0hJVEVORVNTKTsKKyAgICAgICAgQml0Qmx0MzIgKGhkY0RzdEltYWdlLCB4T2ZmMSwgeU9mZjEsIGhpbWwxLT5jeCwgaGltbDEtPmN5LCAKICAgICAgICAgICAgICAgICAgIGhkY1NyY0ltYWdlLCBuWDEsIDAsIFNSQ0NPUFkpOwogCiAgICAgICAgIFNlbGVjdE9iamVjdDMyIChoZGNTcmNJbWFnZSwgaGltbDItPmhibU1hc2spOwotICAgICAgICBCaXRCbHQzMiAoaGRjRHN0SW1hZ2UsIHhPZmZzLCB5T2ZmcywgCi0gICAgICAgICAgICAgICAgICBoaW1sRHN0LT5jeCAtIHhPZmZzLCBoaW1sRHN0LT5jeSAtIHlPZmZzLCAKKyAgICAgICAgQml0Qmx0MzIgKGhkY0RzdEltYWdlLCB4T2ZmMiwgeU9mZjIsIGhpbWwyLT5jeCwgaGltbDItPmN5LCAKICAgICAgICAgICAgICAgICAgIGhkY1NyY0ltYWdlLCBuWDIsIDAsIFNSQ0FORCk7CiAKICAgICAgICAgRGVsZXRlREMzMiAoaGRjU3JjSW1hZ2UpOwpAQCAtNTE1LDMyICsxMzEyLDE3NiBAQAogfQogCiAKKyNpZiAwCisjaWYgX19JU3RyZWFtX0lOVEVSRkFDRV9ERUZJTkVEX18KK0hJTUFHRUxJU1QgV0lOQVBJIEltYWdlTGlzdF9SZWFkICgKKwlMUFNUUkVBTSBwc3RtKQoreworICAgIEZJWE1FIChpbWFnZWxpc3QsICJlbXB0eSBzdHViIVxuIik7CiAKLUJPT0wzMiBXSU5BUEkKLUltYWdlTGlzdF9SZXBsYWNlIChISU1BR0VMSVNUIGhpbWwsIElOVDMyIGksICBIQklUTUFQMzIgaGJtSW1hZ2UsIAotICAgICAgICAgICAgICAgICAgIEhCSVRNQVAzMiBoYm1NYXNrKQorCisgICAgcmV0dXJuIChOVUxMKTsKK30KKyNlbmRpZiAvKiBfX0lTdHJlYW1fSU5URVJGQUNFX0RFRklORURfXyAqLworI2VuZGlmIC8qIDAgKi8KKworCitCT09MMzIgV0lOQVBJIEltYWdlTGlzdF9SZW1vdmUgKAorCUhJTUFHRUxJU1QgaGltbCwKKwlJTlQzMiBpKQoreworICAgIEhCSVRNQVAzMiBoYm1OZXdJbWFnZSwgaGJtTmV3TWFzazsKKyAgICBIREMzMiAgICAgaGRjU3JjLCBoZGNEc3Q7CisgICAgSU5UMzIgICAgIGN4TmV3LCBuQ291bnQ7CisKKyAgICBpZiAoKGkgPCAtMSkgfHwgKGkgPj0gaGltbC0+Y0N1ckltYWdlKSkgeworICAgICAgICBFUlIgKGltYWdlbGlzdCwgIkluZGV4IG91dCBvZiByYW5nZSEgJWRcbiIsIGkpOworICAgICAgICByZXR1cm4gKEZBTFNFKTsKKyAgICB9CisKKyAgICBpZiAoaGltbC0+Y0N1ckltYWdlID09IDApIHsKKyAgICAgICAgRVJSIChpbWFnZWxpc3QsICJMaXN0IGlzIGFscmVhZHkgZW1wdHkhXG4iKTsKKyAgICAgICAgcmV0dXJuIChGQUxTRSk7CisgICAgfQorCisgICAgaWYgKGkgPT0gLTEpIHsKKyAgICAgICAgLyogcmVtb3ZlIGFsbCAqLworICAgICAgICBUUkFDRSAoaW1hZ2VsaXN0LCAiUmVtb3ZlIGFsbCFcbiIpOworCisgICAgICAgIGhpbWwtPmNNYXhJbWFnZSA9IGhpbWwtPmNJbml0aWFsICsgaGltbC0+Y0dyb3c7CisgICAgICAgIGhpbWwtPmNDdXJJbWFnZSA9IDA7CisgICAgICAgIGZvciAobkNvdW50ID0gMDsgbkNvdW50IDw9IE1BWF9PVkVSTEFZSU1BR0U7IG5Db3VudCsrKQorICAgICAgICAgICAgIGhpbWwtPm5PdmxJZHhbbkNvdW50XSA9IC0xOworCisgICAgICAgIERlbGV0ZU9iamVjdDMyIChoaW1sLT5oYm1JbWFnZSk7CisgICAgICAgIGhpbWwtPmhibUltYWdlID0KKyAgICAgICAgICAgIENyZWF0ZUJpdG1hcDMyIChoaW1sLT5jTWF4SW1hZ2UgKiBoaW1sLT5jeCwgaGltbC0+Y3ksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgMSwgaGltbC0+dUJpdHNQaXhlbCwgTlVMTCk7CisKKyAgICAgICAgaWYgKGhpbWwtPmhibU1hc2spIHsKKyAgICAgICAgICAgIERlbGV0ZU9iamVjdDMyIChoaW1sLT5oYm1NYXNrKTsKKyAgICAgICAgICAgIGhpbWwtPmhibU1hc2sgPQorICAgICAgICAgICAgICAgIENyZWF0ZUJpdG1hcDMyIChoaW1sLT5jTWF4SW1hZ2UgKiBoaW1sLT5jeCwgaGltbC0+Y3ksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEsIDEsIE5VTEwpOworICAgICAgICB9CisgICAgfQorICAgIGVsc2UgeworICAgICAgICAvKiBkZWxldGUgb25lIGltYWdlICovCisgICAgICAgIFRSQUNFIChpbWFnZWxpc3QsICJSZW1vdmUgc2luZ2xlIGltYWdlISAlZFxuIiwgaSk7CisKKyAgICAgICAgLyogY3JlYXRlIG5ldyBiaXRtYXAocykgKi8KKyAgICAgICAgY3hOZXcgPSAoaGltbC0+Y0N1ckltYWdlICsgaGltbC0+Y0dyb3cgLSAxKSAqIGhpbWwtPmN4OworCisgICAgICAgIGZwcmludGYgKHN0ZGVyciwgIiAtIE51bWJlciBvZiBpbWFnZXM6ICVkIC8gJWQgKE9sZC9OZXcpXG4iLAorICAgICAgICAgICAgICAgICBoaW1sLT5jQ3VySW1hZ2UsIGhpbWwtPmNDdXJJbWFnZSAtIDEpOworICAgICAgICBmcHJpbnRmIChzdGRlcnIsICIgLSBNYXguIG51bWJlciBvZiBpbWFnZXM6ICVkIC8gJWQgKE9sZC9OZXcpXG4iLAorICAgICAgICAgICAgICAgICBoaW1sLT5jTWF4SW1hZ2UsIGhpbWwtPmNDdXJJbWFnZSArIGhpbWwtPmNHcm93IC0gMSk7CisgICAgICAgIAorICAgICAgICBoYm1OZXdJbWFnZSA9CisgICAgICAgICAgICBDcmVhdGVCaXRtYXAzMiAoY3hOZXcsIGhpbWwtPmN5LCAxLCBoaW1sLT51Qml0c1BpeGVsLCBOVUxMKTsKKworICAgICAgICBpZiAoaGltbC0+aGJtTWFzaykKKyAgICAgICAgICAgIGhibU5ld01hc2sgPSBDcmVhdGVCaXRtYXAzMiAoY3hOZXcsIGhpbWwtPmN5LCAxLCAxLCBOVUxMKTsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgaGJtTmV3TWFzayA9IDA7ICAvKiBKdXN0IHRvIGtlZXAgY29tcGlsZXIgaGFwcHkhICovCisKKyAgICAgICAgaGRjU3JjID0gQ3JlYXRlQ29tcGF0aWJsZURDMzIgKDApOworICAgICAgICBoZGNEc3QgPSBDcmVhdGVDb21wYXRpYmxlREMzMiAoMCk7CisKKyAgICAgICAgLyogY29weSBhbGwgaW1hZ2VzIGFuZCBtYXNrcyBwcmlvciB0byB0aGUgInJlbW92ZWQiIGltYWdlICovCisgICAgICAgIGlmIChpID4gMCkgeworICAgICAgICAgICAgVFJBQ0UgKGltYWdlbGlzdCwgIlByZSBpbWFnZSBjb3B5OiBDb3B5ICVkIGltYWdlc1xuIiwgaSk7CisgICAgICAgCisgICAgICAgICAgICBTZWxlY3RPYmplY3QzMiAoaGRjU3JjLCBoaW1sLT5oYm1JbWFnZSk7CisgICAgICAgICAgICBTZWxlY3RPYmplY3QzMiAoaGRjRHN0LCBoYm1OZXdJbWFnZSk7CisgICAgICAgICAgICBCaXRCbHQzMiAoaGRjRHN0LCAwLCAwLCBpICogaGltbC0+Y3gsIGhpbWwtPmN5LAorICAgICAgICAgICAgICAgICAgICAgIGhkY1NyYywgMCwgMCwgU1JDQ09QWSk7CisKKyAgICAgICAgICAgIGlmIChoaW1sLT5oYm1NYXNrKSB7CisgICAgICAgICAgICAgICAgU2VsZWN0T2JqZWN0MzIgKGhkY1NyYywgaGltbC0+aGJtTWFzayk7CisgICAgICAgICAgICAgICAgU2VsZWN0T2JqZWN0MzIgKGhkY0RzdCwgaGJtTmV3TWFzayk7CisgICAgICAgICAgICAgICAgQml0Qmx0MzIgKGhkY0RzdCwgMCwgMCwgaSAqIGhpbWwtPmN4LCBoaW1sLT5jeSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgaGRjU3JjLCAwLCAwLCBTUkNDT1BZKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIC8qIGNvcHkgYWxsIGltYWdlcyBhbmQgbWFza3MgYmVoaW5kIHRoZSByZW1vdmVkIGltYWdlICovCisgICAgICAgIGlmIChpIDwgaGltbC0+Y0N1ckltYWdlIC0gMSkgeworICAgICAgICAgICAgVFJBQ0UgKGltYWdlbGlzdCwgIlBvc3QgaW1hZ2UgY29weSFcbiIpOworICAgICAgICAgICAgU2VsZWN0T2JqZWN0MzIgKGhkY1NyYywgaGltbC0+aGJtSW1hZ2UpOworICAgICAgICAgICAgU2VsZWN0T2JqZWN0MzIgKGhkY0RzdCwgaGJtTmV3SW1hZ2UpOworICAgICAgICAgICAgQml0Qmx0MzIgKGhkY0RzdCwgaSAqIGhpbWwtPmN4LCAwLCAoaGltbC0+Y0N1ckltYWdlIC0gaSAtIDEpICogaGltbC0+Y3gsCisgICAgICAgICAgICAgICAgICAgICAgaGltbC0+Y3ksIGhkY1NyYywgKGkgKyAxKSAqIGhpbWwtPmN4LCAwLCBTUkNDT1BZKTsKKworICAgICAgICAgICAgaWYgKGhpbWwtPmhibU1hc2spIHsKKyAgICAgICAgICAgICAgICBTZWxlY3RPYmplY3QzMiAoaGRjU3JjLCBoaW1sLT5oYm1NYXNrKTsKKyAgICAgICAgICAgICAgICBTZWxlY3RPYmplY3QzMiAoaGRjRHN0LCBoYm1OZXdNYXNrKTsKKyAgICAgICAgICAgICAgICBCaXRCbHQzMiAoaGRjRHN0LCBpICogaGltbC0+Y3gsIDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgIChoaW1sLT5jQ3VySW1hZ2UgLSBpIC0gMSkgKiBoaW1sLT5jeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgaGltbC0+Y3ksIGhkY1NyYywgKGkgKyAxKSAqIGhpbWwtPmN4LCAwLCBTUkNDT1BZKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIERlbGV0ZURDMzIgKGhkY1NyYyk7CisgICAgICAgIERlbGV0ZURDMzIgKGhkY0RzdCk7CisKKyAgICAgICAgLyogZGVsZXRlIG9sZCBpbWFnZXMgYW5kIGluc2VydCBuZXcgb25lcyAqLworICAgICAgICBEZWxldGVPYmplY3QzMiAoaGltbC0+aGJtSW1hZ2UpOworICAgICAgICBoaW1sLT5oYm1JbWFnZSA9IGhibU5ld0ltYWdlOworICAgICAgICBpZiAoaGltbC0+aGJtTWFzaykgeworICAgICAgICAgICAgRGVsZXRlT2JqZWN0MzIgKGhpbWwtPmhibU1hc2spOworICAgICAgICAgICAgaGltbC0+aGJtTWFzayA9IGhibU5ld01hc2s7CisgICAgICAgIH0KKworICAgICAgICBoaW1sLT5jQ3VySW1hZ2UtLTsKKyAgICAgICAgaGltbC0+Y01heEltYWdlID0gaGltbC0+Y0N1ckltYWdlICsgaGltbC0+Y0dyb3c7CisKKyAgICAgICAgVFJBQ0UgKGltYWdlbGlzdCwgIk51bWJlciBvZiBpbWFnZXM6ICVkXG4iLCBoaW1sLT5jQ3VySW1hZ2UpOworICAgICAgICBUUkFDRSAoaW1hZ2VsaXN0LCAiTWF4LiBudW1iZXIgb2YgaW1hZ2VzOiAlZFxuIiwgaGltbC0+Y01heEltYWdlKTsKKyAgICB9CisKKyAgICByZXR1cm4gKFRSVUUpOworfQorCisKK0JPT0wzMiBXSU5BUEkgSW1hZ2VMaXN0X1JlcGxhY2UgKAorCUhJTUFHRUxJU1QgaGltbCwKKwlJTlQzMiBpLAorCUhCSVRNQVAzMiBoYm1JbWFnZSwgCisJSEJJVE1BUDMyIGhibU1hc2spCiB7CiAgICAgSERDMzIgaGRjSW1hZ2VMaXN0LCBoZGNJbWFnZTsKKyAgICBCSVRNQVAzMiBibXA7CiAKLSAgICBpZiAoKGkgPj0gaGltbC0+Y0N1ckltYWdlKSB8fCAoaSA8IDApKSByZXR1cm4gKEZBTFNFKTsKKyAgICBpZiAoaGltbCA9PSBOVUxMKSB7CisgICAgICAgIEVSUiAoaW1hZ2VsaXN0LCAiSW52YWxpZCBpbWFnZSBsaXN0IGhhbmRsZSFcbiIpOworICAgICAgICByZXR1cm4gKEZBTFNFKTsKKyAgICB9CisgICAgCisgICAgaWYgKChpID49IGhpbWwtPmNDdXJJbWFnZSkgfHwgKGkgPCAwKSkgeworICAgICAgICBFUlIgKGltYWdlbGlzdCwgIkludmFsaWQgaW1hZ2UgaW5kZXghXG4iKTsKKyAgICAgICAgcmV0dXJuIChGQUxTRSk7CisgICAgfQogCiAgICAgaGRjSW1hZ2VMaXN0ID0gQ3JlYXRlQ29tcGF0aWJsZURDMzIgKDApOwogICAgIGhkY0ltYWdlID0gQ3JlYXRlQ29tcGF0aWJsZURDMzIgKDApOworICAgIEdldE9iamVjdDMyQSAoaGJtSW1hZ2UsIHNpemVvZihCSVRNQVAzMiksIChMUFZPSUQpJmJtcCk7CiAKICAgICAvKiBSZXBsYWNlIEltYWdlICovCiAgICAgU2VsZWN0T2JqZWN0MzIgKGhkY0ltYWdlTGlzdCwgaGltbC0+aGJtSW1hZ2UpOwogICAgIFNlbGVjdE9iamVjdDMyIChoZGNJbWFnZSwgaGJtSW1hZ2UpOwogCi0gICAgQml0Qmx0MzIgKGhkY0ltYWdlTGlzdCwgaSAqIGhpbWwtPmN4LCAwLAotICAgICAgICAgICAgICBoaW1sLT5jeCwgaGltbC0+Y3ksIGhkY0ltYWdlLCAwLCAwLCBTUkNDT1BZKTsKKyAgICBTdHJldGNoQmx0MzIgKGhkY0ltYWdlTGlzdCwgaSAqIGhpbWwtPmN4LCAwLCBoaW1sLT5jeCwgaGltbC0+Y3ksCisgICAgICAgICAgICAgICAgICBoZGNJbWFnZSwgMCwgMCwgYm1wLmJtV2lkdGgsIGJtcC5ibUhlaWdodCwgU1JDQ09QWSk7CiAKLSAgICBpZiAoaGltbC0+aGJtTWFzaykgeworICAgIGlmIChoaW1sLT5oYm1NYXNrKQorICAgIHsKICAgICAgICAgLyogUmVwbGFjZSBNYXNrICovCiAgICAgICAgIFNlbGVjdE9iamVjdDMyIChoZGNJbWFnZUxpc3QsIGhpbWwtPmhibU1hc2spOwogICAgICAgICBTZWxlY3RPYmplY3QzMiAoaGRjSW1hZ2UsIGhibU1hc2spOwogCi0gICAgICAgIEJpdEJsdDMyIChoZGNJbWFnZUxpc3QsIGkgKiBoaW1sLT5jeCwgMCwKLSAgICAgICAgICAgICAgICAgIGhpbWwtPmN4LCBoaW1sLT5jeSwgaGRjSW1hZ2UsIDAsIDAsIFNSQ0NPUFkpOworICAgICAgICBTdHJldGNoQmx0MzIgKGhkY0ltYWdlTGlzdCwgaSAqIGhpbWwtPmN4LCAwLCBoaW1sLT5jeCwgaGltbC0+Y3ksCisgICAgICAgICAgICAgICAgICAgICAgaGRjSW1hZ2UsIDAsIDAsIGJtcC5ibVdpZHRoLCBibXAuYm1IZWlnaHQsIFNSQ0NPUFkpOwogICAgIH0KIAogICAgIERlbGV0ZURDMzIgKGhkY0ltYWdlKTsKQEAgLTU1MCw4ICsxNDkxLDEwIEBACiB9CiAKIAotSU5UMzIgV0lOQVBJCi1JbWFnZUxpc3RfUmVwbGFjZUljb24gKEhJTUFHRUxJU1QgaGltbCwgSU5UMzIgaSwgSElDT04zMiBoSWNvbikKK0lOVDMyIFdJTkFQSSBJbWFnZUxpc3RfUmVwbGFjZUljb24gKAorCUhJTUFHRUxJU1QgaGltbCwKKwlJTlQzMiBpLAorCUhJQ09OMzIgaEljb24pCiB7CiAgICAgSERDMzIgICAgIGhkY0ltYWdlTGlzdCwgaGRjSW1hZ2U7CiAgICAgSU5UMzIgICAgIG5JbmRleDsKQEAgLTU4MSw3ICsxNTI0LDcgQEAKIAogICAgIGlmIChpID09IC0xKSB7CiAgICAgICAgIGlmIChoaW1sLT5jQ3VySW1hZ2UgKyAxID49IGhpbWwtPmNNYXhJbWFnZSkKLSAgICAgICAgICAgIElNQUdFTElTVF9Hcm93Qml0bWFwcyAoaGltbCwgMSk7CisgICAgICAgICAgICBJTUFHRUxJU1RfSW50ZXJuYWxHcm93Qml0bWFwcyAoaGltbCwgMSk7CiAgICAgICAgIG5JbmRleCA9IGhpbWwtPmNDdXJJbWFnZTsKICAgICAgICAgaGltbC0+Y0N1ckltYWdlICsrOwogICAgIH0KQEAgLTU5NCwyMiArMTUzNywyNSBAQAogI2lmZGVmIF9fR0VUX0lDT05fSU5GT19IQUNLX18KICAgICBTZWxlY3RPYmplY3QzMiAoaGRjSW1hZ2VMaXN0LCBoaW1sLT5oYm1JbWFnZSk7CiAgICAgU2VsZWN0T2JqZWN0MzIgKGhkY0ltYWdlLCBoYm1JbWFnZSk7CisgICAgU3RyZXRjaEJsdDMyIChoZGNJbWFnZUxpc3QsIG5JbmRleCAqIGhpbWwtPmN4LCAwLCBoaW1sLT5jeCwgaGltbC0+Y3ksCisgICAgICAgICAgICAgICAgICBoZGNJbWFnZSwgMCwgMCwgcHRyLT5uV2lkdGgsIHB0ci0+bkhlaWdodCwgU1JDQ09QWSk7CiAjZWxzZQogICAgIFNlbGVjdE9iamVjdDMyIChoZGNJbWFnZSwgaWktPmhibUNvbG9yKTsKKyAgICBTdHJldGNoQmx0MzIgKGhkY0ltYWdlTGlzdCwgbkluZGV4ICogaGltbC0+Y3gsIDAsIGhpbWwtPmN4LCBoaW1sLT5jeSwKKyAgICAgICAgICAgICAgICAgIGhkY0ltYWdlLCAwLCAwLCBibXAuYm1XaWR0aCwgYm1wLmJtSGVpZ2h0LCBTUkNDT1BZKTsKICNlbmRpZgogCi0gICAgQml0Qmx0MzIgKGhkY0ltYWdlTGlzdCwgbkluZGV4ICogaGltbC0+Y3gsIDAsCi0gICAgICAgICAgICAgIGhpbWwtPmN4LCBoaW1sLT5jeSwgaGRjSW1hZ2UsIDAsIDAsIFNSQ0NPUFkpOwotCiAgICAgaWYgKGhpbWwtPmhibU1hc2spIHsKICNpZmRlZiBfX0dFVF9JQ09OX0lORk9fSEFDS19fCiAgICAgICAgIFNlbGVjdE9iamVjdDMyIChoZGNJbWFnZUxpc3QsIGhpbWwtPmhibU1hc2spOwogICAgICAgICBTZWxlY3RPYmplY3QzMiAoaGRjSW1hZ2UsIGhibU1hc2spOworICAgICAgICBTdHJldGNoQmx0MzIgKGhkY0ltYWdlTGlzdCwgbkluZGV4ICogaGltbC0+Y3gsIDAsIGhpbWwtPmN4LCBoaW1sLT5jeSwKKyAgICAgICAgICAgICAgICAgICAgICBoZGNJbWFnZSwgMCwgMCwgcHRyLT5uV2lkdGgsIHB0ci0+bkhlaWdodCwgU1JDQ09QWSk7CiAjZWxzZQogICAgICAgICBTZWxlY3RPYmplY3QzMiAoaGRjSW1hZ2UsIGlpLT5oYm1NYXNrKTsKKyAgICAgICAgU3RyZXRjaEJsdDMyIChoZGNJbWFnZUxpc3QsIG5JbmRleCAqIGhpbWwtPmN4LCAwLCBoaW1sLT5jeCwgaGltbC0+Y3ksCisgICAgICAgICAgICAgICAgICAgICAgaGRjSW1hZ2UsIDAsIDAsIGJtcC5ibVdpZHRoLCBibXAuYm1IZWlnaHQsIFNSQ0NPUFkpOwogI2VuZGlmCi0gICAgICAgIEJpdEJsdDMyIChoZGNJbWFnZUxpc3QsIG5JbmRleCAqIGhpbWwtPmN4LCAwLAotICAgICAgICAgICAgICAgICAgaGltbC0+Y3gsIGhpbWwtPmN5LCBoZGNJbWFnZSwgMCwgMCwgU1JDQ09QWSk7CiAgICAgfQogCiAgICAgRGVsZXRlREMzMiAoaGRjSW1hZ2VMaXN0KTsKQEAgLTYyMyw4ICsxNTY5LDkgQEAKIH0KIAogCi1DT0xPUlJFRiBXSU5BUEkKLUltYWdlTGlzdF9TZXRCa0NvbG9yIChISU1BR0VMSVNUIGhpbWwsIENPTE9SUkVGIGNsckJrKQorQ09MT1JSRUYgV0lOQVBJIEltYWdlTGlzdF9TZXRCa0NvbG9yICgKKwlISU1BR0VMSVNUIGhpbWwsCisJQ09MT1JSRUYgY2xyQmspCiB7CiAgICAgQ09MT1JSRUYgY2xyT2xkQms7CiAKQEAgLTYzNCwxNCArMTU4MSwxNTAgQEAKIH0KIAogCi0KLUJPT0wzMiBXSU5BUEkKLUltYWdlTGlzdF9TZXRPdmVybGF5SW1hZ2UgKEhJTUFHRUxJU1QgaGltbCwgSU5UMzIgaUltYWdlLCBJTlQzMiBpT3ZlcmxheSkKK0JPT0wzMiBXSU5BUEkgSW1hZ2VMaXN0X1NldERyYWdDdXJzb3JJbWFnZSAoCisJSElNQUdFTElTVCBoaW1sRHJhZywKKwlJTlQzMiBpRHJhZywKKwlJTlQzMiBkeEhvdHNwb3QsCisJSU5UMzIgZHlIb3RzcG90KQogewotICAgIGlmICgoaU92ZXJsYXkgPCAxKSB8fCAoaU92ZXJsYXkgPiA0KSkgcmV0dXJuIChGQUxTRSk7CisgICAgRklYTUUgKGltYWdlbGlzdCwgImVtcHR5IHN0dWIhXG4iKTsKKworICAgIHJldHVybiAoRkFMU0UpOworfQorCisKKyNpZiAwCitCT09MMzIgV0lOQVBJIEltYWdlTGlzdF9TZXRGaWx0ZXIgKAorCUhJTUFHRUxJU1QgaGltbCwgCisJSU5UMzIgaUluZGV4LCAKKwlJTlQzMiBpRmlsdGVyKQoreworICAgIEZJWE1FIChpbWFnZWxpc3QsICJlbXB0eSBzdHViIVxuIik7CisKKworfQorI2VuZGlmIC8qIDAgKi8KKworCitCT09MMzIgV0lOQVBJIEltYWdlTGlzdF9TZXRJY29uU2l6ZSAoCisJSElNQUdFTElTVCBoaW1sLCAKKwlJTlQzMiBjeCwgCisJSU5UMzIgY3kpCit7CisgICAgSU5UMzIgbkNvdW50OworCisgICAgLyogcmVtb3ZlIGFsbCBpbWFnZXMqLworICAgIGhpbWwtPmNNYXhJbWFnZSAgPSBoaW1sLT5jSW5pdGlhbCArIGhpbWwtPmNHcm93OworICAgIGhpbWwtPmNDdXJJbWFnZSAgPSAwOworICAgIGhpbWwtPmN4ICAgICAgICAgPSBjeDsKKyAgICBoaW1sLT5jeSAgICAgICAgID0gY3k7CisKKyAgICAvKiBpbml0aWFsaXplIG92ZXJsYXkgbWFzayBpbmRpY2VzICovCisgICAgZm9yIChuQ291bnQgPSAwOyBuQ291bnQgPCBNQVhfT1ZFUkxBWUlNQUdFOyBuQ291bnQrKykKKyAgICAgICAgaGltbC0+bk92bElkeFtuQ291bnRdID0gLTE7CisKKyAgICBEZWxldGVPYmplY3QzMiAoaGltbC0+aGJtSW1hZ2UpOworICAgIGhpbWwtPmhibUltYWdlID0KKyAgICAgICAgQ3JlYXRlQml0bWFwMzIgKGhpbWwtPmNNYXhJbWFnZSAqIGhpbWwtPmN4LCBoaW1sLT5jeSwKKyAgICAgICAgICAgICAgICAgICAgICAgIDEsIGhpbWwtPnVCaXRzUGl4ZWwsIE5VTEwpOworCisgICAgaWYgKGhpbWwtPmhibU1hc2spIHsKKyAgICAgICAgRGVsZXRlT2JqZWN0MzIgKGhpbWwtPmhibU1hc2spOworICAgICAgICBoaW1sLT5oYm1NYXNrID0KKyAgICAgICAgICAgIENyZWF0ZUJpdG1hcDMyIChoaW1sLT5jTWF4SW1hZ2UgKiBoaW1sLT5jeCwgaGltbC0+Y3ksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgMSwgMSwgTlVMTCk7CisgICAgfQorCisgICAgcmV0dXJuIChUUlVFKTsKK30KKworCitCT09MMzIgV0lOQVBJIEltYWdlTGlzdF9TZXRJbWFnZUNvdW50ICgKKwlISU1BR0VMSVNUIGhpbWwsIAorCUlOVDMyIGlJbWFnZUNvdW50KQoreworICAgIEhEQzMyICAgICBoZGNJbWFnZUxpc3QsIGhkY0JpdG1hcDsKKyAgICBIQklUTUFQMzIgaGJtTmV3Qml0bWFwOworICAgIElOVDMyICAgICBuTmV3V2lkdGg7CisKKyAgICBpZiAoaGltbCA9PSBOVUxMKSByZXR1cm4gKEZBTFNFKTsKKyAgICBpZiAoaGltbC0+Y0N1ckltYWdlIDw9IGlJbWFnZUNvdW50KSByZXR1cm4gKEZBTFNFKTsKKyAgICBpZiAoaGltbC0+Y01heEltYWdlID4gaUltYWdlQ291bnQpIHJldHVybiAoVFJVRSk7CisKKyAgICBuTmV3V2lkdGggPSAoaUltYWdlQ291bnQgKyBoaW1sLT5jR3JvdykgKiBoaW1sLT5jeDsKKworICAgIGhkY0ltYWdlTGlzdCA9IENyZWF0ZUNvbXBhdGlibGVEQzMyICgwKTsKKyAgICBoZGNCaXRtYXAgPSBDcmVhdGVDb21wYXRpYmxlREMzMiAoMCk7CisKKyAgICBoYm1OZXdCaXRtYXAgPQorICAgICAgICBDcmVhdGVCaXRtYXAzMiAobk5ld1dpZHRoLCBoaW1sLT5jeSwgMSwgaGltbC0+dUJpdHNQaXhlbCwgTlVMTCk7CisgICAgaWYgKGhibU5ld0JpdG1hcCA9PSAwKQorICAgIHsKKyAgICAgICAgU2VsZWN0T2JqZWN0MzIgKGhkY0ltYWdlTGlzdCwgaGltbC0+aGJtSW1hZ2UpOworICAgICAgICBTZWxlY3RPYmplY3QzMiAoaGRjQml0bWFwLCBoYm1OZXdCaXRtYXApOworICAgICAgICBCaXRCbHQzMiAoaGRjQml0bWFwLCAwLCAwLCBoaW1sLT5jQ3VySW1hZ2UgKiBoaW1sLT5jeCwgaGltbC0+Y3ksCisgICAgICAgICAgICAgICAgICBoZGNJbWFnZUxpc3QsIDAsIDAsIFNSQ0NPUFkpOworICAgICAgICBEZWxldGVPYmplY3QzMiAoaGltbC0+aGJtSW1hZ2UpOworICAgICAgICBoaW1sLT5oYm1JbWFnZSA9IGhibU5ld0JpdG1hcDsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgV0FSTiAoaW1hZ2VsaXN0LCAiQ291bGQgbm90IGNyZWF0ZSBuZXcgaW1hZ2UgYml0bWFwICFcbiIpOworICAgIH0KKworICAgIGlmIChoaW1sLT5oYm1NYXNrKQorICAgIHsKKyAgICAgICAgaGJtTmV3Qml0bWFwID0gCisgICAgICAgICAgICBDcmVhdGVCaXRtYXAzMiAobk5ld1dpZHRoLCBoaW1sLT5jeSwgMSwgMSwgTlVMTCk7CisKKyAgICAgICAgaWYgKGhibU5ld0JpdG1hcCAhPSAwKQorICAgICAgICB7CisgICAgICAgICAgICBTZWxlY3RPYmplY3QzMiAoaGRjSW1hZ2VMaXN0LCBoaW1sLT5oYm1NYXNrKTsKKyAgICAgICAgICAgIFNlbGVjdE9iamVjdDMyIChoZGNCaXRtYXAsIGhibU5ld0JpdG1hcCk7CisgICAgICAgICAgICBCaXRCbHQzMiAoaGRjQml0bWFwLCAwLCAwLCBoaW1sLT5jQ3VySW1hZ2UgKiBoaW1sLT5jeCwgaGltbC0+Y3ksCisgICAgICAgICAgICAgICAgICAgICAgaGRjSW1hZ2VMaXN0LCAwLCAwLCBTUkNDT1BZKTsKKyAgICAgICAgICAgIERlbGV0ZU9iamVjdDMyIChoaW1sLT5oYm1NYXNrKTsKKyAgICAgICAgICAgIGhpbWwtPmhibU1hc2sgPSBoYm1OZXdCaXRtYXA7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBXQVJOIChpbWFnZWxpc3QsICJDb3VsZCBub3QgY3JlYXRlIG5ldyBtYXNrIGJpdG1hcCFcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgRGVsZXRlREMzMiAoaGRjSW1hZ2VMaXN0KTsKKyAgICBEZWxldGVEQzMyIChoZGNCaXRtYXApOworCisgICAgLyogVXBkYXRlIG1heCBpbWFnZSBjb3VudCAqLworICAgIGhpbWwtPmNNYXhJbWFnZSA9IGlJbWFnZUNvdW50ICsgaGltbC0+Y3g7CisKKyAgICByZXR1cm4gKFRSVUUpOworfQorCisKK0JPT0wzMiBXSU5BUEkgSW1hZ2VMaXN0X1NldE92ZXJsYXlJbWFnZSAoCisJSElNQUdFTElTVCBoaW1sLCAKKwlJTlQzMiBpSW1hZ2UsIAorCUlOVDMyIGlPdmVybGF5KQoreworICAgIGlmICgoaU92ZXJsYXkgPCAxKSB8fCAoaU92ZXJsYXkgPiBNQVhfT1ZFUkxBWUlNQUdFKSkgcmV0dXJuIChGQUxTRSk7CiAgICAgaWYgKChpSW1hZ2UgPCAwKSB8fCAoaUltYWdlID4gaGltbC0+Y0N1ckltYWdlKSkgcmV0dXJuIChGQUxTRSk7CiAgICAgCiAgICAgaGltbC0+bk92bElkeFtpT3ZlcmxheSAtIDFdID0gaUltYWdlOwogICAgIHJldHVybiAoVFJVRSk7CiB9CiAKKworI2lmIDAKKyNpZiBfX0lTdHJlYW1fSU5URVJGQUNFX0RFRklORURfXworQk9PTDMyIFdJTkFQSSBJbWFnZUxpc3RfV3JpdGUgKAorCUhJTUFHRUxJU1QgaGltbCwgCisJTFBTVFJFQU0gcHN0bSkKK3sKKyAgICBGSVhNRSAoaW1hZ2VsaXN0LCAiZW1wdHkgc3R1YiFcbiIpOworCisKKyAgICByZXR1cm4gKEZBTFNFKTsKK30KKyNlbmRpZiAgLyogX19JU3RyZWFtX0lOVEVSRkFDRV9ERUZJTkVEX18gKi8KKyNlbmRpZiAgLyogMCAqLwpkaWZmIC0tZ2l0IGEvbWlzYy9tYWluLmMgYi9taXNjL21haW4uYwppbmRleCAyZWNiNzIwLi4yOTJhNGQwIDEwMDY0NAotLS0gYS9taXNjL21haW4uYworKysgYi9taXNjL21haW4uYwpAQCAtMzI3LDcgKzMyNyw3IEBACiAgICAgICAgIGlmICghc3RyY21wKCBhcmd2W2ldLCAiLWRpc3BsYXkiICkpIGRpc3BsYXlfbmFtZSA9IGFyZ3ZbaSsxXTsKICAgICAgICAgaWYgKCFzdHJjbXAoIGFyZ3ZbaV0sICItdiIgKSB8fCAhc3RyY21wKCBhcmd2W2ldLCAiLXZlcnNpb24iICkpCiAgICAgICAgIHsKLSAgICAgICAgICAgIHByaW50ZiggIiVzXG4iLCBXSU5FX1JFTEVBU0VfSU5GTyApOworICAgICAgICAgICAgTVNHKCAiJXNcbiIsIFdJTkVfUkVMRUFTRV9JTkZPICk7CiAgICAgICAgICAgICBleGl0KDApOwogICAgICAgICB9CiAgICAgfQpAQCAtNjgzLDYgKzY4Myw5IEBACiAJCQkqKEJPT0wzMiAqKSBscHZQYXJhbSA9IEZBTFNFOwogCQlicmVhazsKIAorCWNhc2UgU1BJX0dFVERSQUdGVUxMV0lORE9XUzoKKwkgICooQk9PTDMyICopIGxwdlBhcmFtID0gRkFMU0U7CisJCQogCWNhc2UgU1BJX0dFVEdSSURHUkFOVUxBUklUWToKIAkJKihJTlQzMiopbHB2UGFyYW09R2V0UHJvZmlsZUludDMyQSgiZGVza3RvcCIsIkdyaWRHcmFudWxhcml0eSIsMSk7CiAJCWJyZWFrOwpAQCAtMTA2Nyw1ICsxMDcwLDUgQEAKICovCiB2b2lkIFdJTkFQSSBGaWxlQ0RSKEZBUlBST0MxNiB4KQogewotCXByaW50ZigiRmlsZUNEUiglOHgpXG4iLCAoaW50KSB4KTsKKwlGSVhNRShmaWxlLCIoJTh4KTogc3R1YlxuIiwgKGludCkgeCk7CiB9CmRpZmYgLS1naXQgYS9taXNjL21wci5jIGIvbWlzYy9tcHIuYwppbmRleCAzNjkxZTYxLi5lNWNmMjZlIDEwMDY0NAotLS0gYS9taXNjL21wci5jCisrKyBiL21pc2MvbXByLmMKQEAgLTE0LDkgKzE0LDggQEAKIAlMUFdPUkQJcGNiUGFzc3dvcmQsCiAJQllURQluVHlwZQogKSB7Ci0JZnByaW50ZihzdGRuaW1wLCJXTmV0R2V0Q2FjaGVkUGFzc3dvcmQoJXMsJWQsJXAsJWQsJWQpXG4iLAotCQlwYlJlc291cmNlLGNiUmVzb3VyY2UscGJQYXNzd29yZCwqcGNiUGFzc3dvcmQsblR5cGUKLQkpOworCUZJWE1FKG1wciwiKCVzLCVkLCVwLCVkLCVkKTogc3R1YlxuIiwKKwkJcGJSZXNvdXJjZSxjYlJlc291cmNlLHBiUGFzc3dvcmQsKnBjYlBhc3N3b3JkLG5UeXBlKTsKIAlyZXR1cm4gMDsKIH0KIApAQCAtMjQsOSArMjMsNiBAQAogCUxQTkVUUkVTT1VSQ0UzMkEgbHBOZXRSZXNvdXJjZSwKIAlMUE5FVENPTk5FQ1RJTkZPU1RSVUNUIGxwTmV0Q29ubmVjdEluZm9TdHJ1Y3QKICkgewotCWZwcmludGYoc3RkbmltcCwiTXVsdGluZXRHZXRDb25uZWN0aW9uUGVyZm9ybWFuY2UoJXAsJXApXG4iLAotCQkJbHBOZXRSZXNvdXJjZSwKLQkJCWxwTmV0Q29ubmVjdEluZm9TdHJ1Y3QKLQkpOworCUZJWE1FKG1wciwiKCVwLCVwKTogc3R1YlxuIixscE5ldFJlc291cmNlLGxwTmV0Q29ubmVjdEluZm9TdHJ1Y3QpOwogCXJldHVybiAxOwogfQpkaWZmIC0tZ2l0IGEvbWlzYy9uZXR3b3JrLmMgYi9taXNjL25ldHdvcmsuYwppbmRleCA2MDFjYTA3Li43YWY4YjRjIDEwMDY0NAotLS0gYS9taXNjL25ldHdvcmsuYworKysgYi9taXNjL25ldHdvcmsuYwpAQCAtOSwxNCArOSwxNCBAQAogI2luY2x1ZGUgIndpbmVycm9yLmgiCiAjaW5jbHVkZSAiZHJpdmUuaCIKICNpbmNsdWRlICJ3bmV0LmgiCisjaW5jbHVkZSAiZGVidWcuaCIKIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKiAgICAgICAgICAgICAgV05ldEVycm9yVGV4dCAgICAgICBbVVNFUi40OTldCiAgKi8KIGludCBXSU5BUEkgV05ldEVycm9yVGV4dChXT1JEIG5FcnJvcixMUFNUUiBscHN6VGV4dCxXT1JEIGNiVGV4dCkKIHsKLQlwcmludGYoIkVNUFRZIFNUVUIgISEhIFdOZXRFcnJvclRleHQoJXgsJXAsJXgpXG4iLAotCQluRXJyb3IsbHBzelRleHQsY2JUZXh0KTsKKyAgICAgICAgRklYTUUod25ldCwgIigleCwlcCwleCk6IHN0dWJcbiIsbkVycm9yLGxwc3pUZXh0LGNiVGV4dCk7CiAJcmV0dXJuIEZBTFNFOwogfQogCkBAIC0yNSw4ICsyNSw4IEBACiAgKi8KIGludCBXSU5BUEkgV05ldE9wZW5Kb2IoTFBTVFIgc3pRdWV1ZSxMUFNUUiBzekpvYlRpdGxlLFdPUkQgbkNvcGllcyxMUFdPUkQgcGZoKQogewotCXByaW50ZigiRU1QVFkgU1RVQiAhISEgV05ldE9wZW5Kb2IoJyVzJywnJXMnLCV4LCVwKVxuIiwKLQkJc3pRdWV1ZSxzekpvYlRpdGxlLG5Db3BpZXMscGZoKTsKKwlGSVhNRSh3bmV0LCAiKCclcycsJyVzJywleCwlcCk6IHN0dWJcbiIsCisJICAgICAgc3pRdWV1ZSxzekpvYlRpdGxlLG5Db3BpZXMscGZoKTsKIAlyZXR1cm4gV05fTkVUX0VSUk9SOwogfQogCkBAIC0zNSw4ICszNSw3IEBACiAgKi8KIGludCBXSU5BUEkgV05ldENsb3NlSm9iKFdPUkQgZmgsTFBXT1JEIHBpZEpvYixMUFNUUiBzelF1ZXVlKQogewotCXByaW50ZigiRU1QVFkgU1RVQiAhISEgV05ldENsb3NlSm9iKCV4LCVwLCclcycpXG4iLAotCQlmaCxwaWRKb2Isc3pRdWV1ZSk7CisJRklYTUUod25ldCwgIigleCwlcCwnJXMnKTogc3R1YlxuIixmaCxwaWRKb2Isc3pRdWV1ZSk7CiAJcmV0dXJuIFdOX05FVF9FUlJPUjsKIH0KIApAQCAtNDUsOCArNDQsNyBAQAogICovCiBpbnQgV0lOQVBJIFdOZXRBYm9ydEpvYihMUFNUUiBzelF1ZXVlLFdPUkQgd0pvYklkKQogewotCXByaW50ZigiRU1QVFkgU1RVQiAhISEgV05ldEFib3J0Sm9iKCclcycsJXgpXG4iLAotCQlzelF1ZXVlLHdKb2JJZCk7CisJRklYTUUod25ldCwgIignJXMnLCV4KTogc3R1YlxuIixzelF1ZXVlLHdKb2JJZCk7CiAJcmV0dXJuIFdOX05FVF9FUlJPUjsKIH0KIApAQCAtNTUsOCArNTMsNyBAQAogICovCiBpbnQgV0lOQVBJIFdOZXRIb2xkSm9iKExQU1RSIHN6UXVldWUsV09SRCB3Sm9iSWQpCiB7Ci0JcHJpbnRmKCJFTVBUWSBTVFVCICEhISBXTmV0SG9sZEpvYignJXMnLCV4KVxuIiwKLQkJc3pRdWV1ZSx3Sm9iSWQpOworCUZJWE1FKHduZXQsICIoJyVzJywleCk6IHN0dWJcbiIsc3pRdWV1ZSx3Sm9iSWQpOwogCXJldHVybiBXTl9ORVRfRVJST1I7CiB9CiAKQEAgLTY1LDggKzYyLDcgQEAKICAqLwogaW50IFdJTkFQSSBXTmV0UmVsZWFzZUpvYihMUFNUUiBzelF1ZXVlLFdPUkQgd0pvYklkKQogewotCXByaW50ZigiRU1QVFkgU1RVQiAhISEgV05ldFJlbGVhc2VKb2IoJyVzJywleClcbiIsCi0JCXN6UXVldWUsd0pvYklkKTsKKwlGSVhNRSh3bmV0LCAiKCclcycsJXgpOiBzdHViXG4iLHN6UXVldWUsd0pvYklkKTsKIAlyZXR1cm4gV05fTkVUX0VSUk9SOwogfQogCkBAIC03NSw4ICs3MSw3IEBACiAgKi8KIGludCBXSU5BUEkgV05ldENhbmNlbEpvYihMUFNUUiBzelF1ZXVlLFdPUkQgd0pvYklkKQogewotCXByaW50ZigiRU1QVFkgU1RVQiAhISEgV05ldENhbmNlbEpvYignJXMnLCV4KVxuIiwKLQkJc3pRdWV1ZSx3Sm9iSWQpOworCUZJWE1FKHduZXQsICIoJyVzJywleCk6IHN0dWJcbiIsc3pRdWV1ZSx3Sm9iSWQpOwogCXJldHVybiBXTl9ORVRfRVJST1I7CiB9CiAKQEAgLTg1LDggKzgwLDcgQEAKICAqLwogaW50IFdJTkFQSSBXTmV0U2V0Sm9iQ29waWVzKExQU1RSIHN6UXVldWUsV09SRCB3Sm9iSWQsV09SRCBuQ29waWVzKQogewotCXByaW50ZigiRU1QVFkgU1RVQiAhISEgV05ldFNldEpvYkNvcGllcygnJXMnLCV4LCV4KVxuIiwKLQkJc3pRdWV1ZSx3Sm9iSWQsbkNvcGllcyk7CisJRklYTUUod25ldCwgIignJXMnLCV4LCV4KTogc3R1YlxuIixzelF1ZXVlLHdKb2JJZCxuQ29waWVzKTsKIAlyZXR1cm4gV05fTkVUX0VSUk9SOwogfQogCkBAIC05NSw4ICs4OSw3IEBACiAgKi8KIGludCBXSU5BUEkgV05ldFdhdGNoUXVldWUoSFdORDE2IGhXbmQsTFBTVFIgc3pMb2NhbCxMUFNUUiBzelVzZXIsV09SRCBuUXVldWUpCiB7Ci0JcHJpbnRmKCJFTVBUWSBTVFVCICEhISBXTmV0V2F0Y2hRdWV1ZSglMDR4LCclcycsJyVzJywleClcbiIsCi0JCWhXbmQsc3pMb2NhbCxzelVzZXIsblF1ZXVlKTsKKwlGSVhNRSh3bmV0LCAiKCUwNHgsJyVzJywnJXMnLCV4KTogc3R1YlxuIixoV25kLHN6TG9jYWwsc3pVc2VyLG5RdWV1ZSk7CiAJcmV0dXJuIFdOX05FVF9FUlJPUjsKIH0KIApAQCAtMTA1LDcgKzk4LDcgQEAKICAqLwogaW50IFdJTkFQSSBXTmV0VW53YXRjaFF1ZXVlKExQU1RSIHN6UXVldWUpCiB7Ci0JcHJpbnRmKCJFTVBUWSBTVFVCICEhISBXTmV0VW53YXRjaFF1ZXVlKCclcycpXG4iLCBzelF1ZXVlKTsKKwlGSVhNRSh3bmV0LCAiKCclcycpOiBzdHViXG4iLCBzelF1ZXVlKTsKIAlyZXR1cm4gV05fTkVUX0VSUk9SOwogfQogCkBAIC0xMTQsOCArMTA3LDcgQEAKICAqLwogaW50IFdJTkFQSSBXTmV0TG9ja1F1ZXVlRGF0YShMUFNUUiBzelF1ZXVlLExQU1RSIHN6VXNlcix2b2lkICpscGxwUXVldWVTdHJ1Y3QpCiB7Ci0JcHJpbnRmKCJFTVBUWSBTVFVCICEhISBXTmV0TG9ja1F1ZXVlRGF0YSgnJXMnLCclcycsJXApXG4iLAotCQlzelF1ZXVlLHN6VXNlcixscGxwUXVldWVTdHJ1Y3QpOworCUZJWE1FKHduZXQsICIoJyVzJywnJXMnLCVwKTogc3R1YlxuIixzelF1ZXVlLHN6VXNlcixscGxwUXVldWVTdHJ1Y3QpOwogCXJldHVybiBXTl9ORVRfRVJST1I7CiB9CiAKQEAgLTEyNCw3ICsxMTYsNyBAQAogICovCiBpbnQgV0lOQVBJIFdOZXRVbmxvY2tRdWV1ZURhdGEoTFBTVFIgc3pRdWV1ZSkKIHsKLQlwcmludGYoIkVNUFRZIFNUVUIgISEhIFdOZXRVbmxvY2tRdWV1ZURhdGEoJyVzJylcbiIsc3pRdWV1ZSk7CisJRklYTUUod25ldCwgIignJXMnKTogc3R1YlxuIixzelF1ZXVlKTsKIAlyZXR1cm4gV05fTkVUX0VSUk9SOwogfQogCkBAIC0xNzAsMTAgKzE2MiwxMSBAQAogCXN3aXRjaCAoY2FwYWJpbGl0eSkgewogCQljYXNlIFdOTkNfU1BFQ19WRVJTSU9OOgogCQl7Ci0JCQlyZXR1cm4gMHgzMGE7IC8qIFdmVyAzLjExIChhbmQgYXBwYXJlbnRseSBvdGhlciAzLjF4KSAqLworCQkJcmV0dXJuIDB4MzBhOyAvKiBXZlcgMy4xMShhbmQgYXBwYXJlbnRseSBvdGhlciAzLjF4KSAqLwogCQl9CiAJCWNhc2UgV05OQ19ORVRfVFlQRToKLQkJLyogaGkgYnl0ZSA9IG5ldHdvcmsgdHlwZSwgbG8gYnl0ZSA9IG5ldHdvcmsgdmVuZG9yIChOZXR3YXJlID0gMHgwMykgWzE1IHR5cGVzXSAqLworCQkvKiBoaSBieXRlID0gbmV0d29yayB0eXBlLCAKKyAgICAgICAgICAgICAgICAgICBsbyBieXRlID0gbmV0d29yayB2ZW5kb3IgKE5ldHdhcmUgPSAweDAzKSBbMTUgdHlwZXNdICovCiAJCXJldHVybiBXTk5DX05FVF9NdWx0aU5ldCB8IFdOTkNfU1VCTkVUX1dpbldvcmtncm91cHM7CiAKIAkJY2FzZSBXTk5DX0RSSVZFUl9WRVJTSU9OOgpAQCAtMjE5LDcgKzIxMiw4IEBACiAJCXJldHVybglXTk5DX0VSUl9HZXRFcnJvcnxXTk5DX0VSUl9HZXRFcnJvclRleHQ7CiAKIAkJY2FzZSBXTk5DX1BSSU5UTUdSRVhUOgotCQkvKiByZXR1cm5zIHRoZSBQcmludCBNYW5hZ2VyIHZlcnNpb24gaW4gbWFqb3IgYW5kIG1pbm9yIGZvcm1hdCBpZiBQcmludCBNYW5hZ2VyIGZ1bmN0aW9ucyBhcmUgYXZhaWxhYmxlICovCisJCS8qIHJldHVybnMgdGhlIFByaW50IE1hbmFnZXIgdmVyc2lvbiBpbiBtYWpvciBhbmQgCisgICAgICAgICAgICAgICAgICAgbWlub3IgZm9ybWF0IGlmIFByaW50IE1hbmFnZXIgZnVuY3Rpb25zIGFyZSBhdmFpbGFibGUgKi8KIAkJcmV0dXJuIDB4MzBlOyAvKiBwcmludG1hbiB2ZXJzaW9uIG9mIFdmVyAzLjExICovCiAKIAkJY2FzZSAweGZmZmY6CkBAIC0yMzgsNyArMjMyLDcgQEAKICAqLwogaW50IFdJTkFQSSBXTmV0RGV2aWNlTW9kZShIV05EMTYgaFduZE93bmVyKQogewotCXByaW50ZigiRU1QVFkgU1RVQiAhISEgV05ldERldmljZU1vZGUoJTA0eClcbiIsaFduZE93bmVyKTsKKwlGSVhNRSh3bmV0LCAiKCUwNHgpOiBzdHViXG4iLGhXbmRPd25lcik7CiAJcmV0dXJuIFdOX05PX05FVFdPUks7CiB9CiAKQEAgLTI0Nyw4ICsyNDEsNyBAQAogICovCiBpbnQgV0lOQVBJIFdOZXRCcm93c2VEaWFsb2coSFdORDE2IGhQYXJlbnQsV09SRCBuVHlwZSxMUFNUUiBzelBhdGgpCiB7Ci0JcHJpbnRmKCJFTVBUWSBTVFVCICEhISBXTmV0QnJvd3NlRGlhbG9nKCUwNHgsJXgsJyVzJylcbiIsCi0JCWhQYXJlbnQsblR5cGUsc3pQYXRoKTsKKwlGSVhNRSh3bmV0LCAiKCUwNHgsJXgsJyVzJyk6IHN0dWJcbiIsaFBhcmVudCxuVHlwZSxzelBhdGgpOwogCXJldHVybiBXTl9OT19ORVRXT1JLOwogfQogCkBAIC0yNTcsOCArMjUwLDcgQEAKICAqLwogVUlOVDE2IFdJTkFQSSBXTmV0R2V0VXNlcihMUFNUUiBscExvY2FsTmFtZSwgTFBTVFIgbHBVc2VyTmFtZSwgRFdPUkQgKmxwU2l6ZSkKIHsKLQlwcmludGYoIkVNUFRZIFNUVUIgISEhIFdOZXRHZXRVc2VyKCVwLCAlcCwgJXApO1xuIiwgCi0JCQkJCQkJbHBMb2NhbE5hbWUsIGxwVXNlck5hbWUsIGxwU2l6ZSk7CisJRklYTUUod25ldCwgIiglcCwgJXAsICVwKTogc3R1YlxuIiwgbHBMb2NhbE5hbWUsIGxwVXNlck5hbWUsIGxwU2l6ZSk7CiAJcmV0dXJuIFdOX05PX05FVFdPUks7CiB9CiAKQEAgLTI2OCw4ICsyNjAsOCBAQAogVUlOVDE2IFdJTkFQSSBXTmV0QWRkQ29ubmVjdGlvbihMUFNUUiBscE5ldFBhdGgsIExQU1RSIGxwUGFzc1dvcmQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExQU1RSIGxwTG9jYWxOYW1lKQogewotCXByaW50ZigiRU1QVFkgU1RVQiAhISEgV05ldEFkZENvbm5lY3Rpb24oJyVzJywgJXAsICclcycpO1xuIiwKLQkJCQkJCQlscE5ldFBhdGgsIGxwUGFzc1dvcmQsIGxwTG9jYWxOYW1lKTsKKwlGSVhNRSh3bmV0LCAiKCclcycsICVwLCAnJXMnKTogc3R1YlxuIiwKKwkgICAgICBscE5ldFBhdGgsbHBQYXNzV29yZCxscExvY2FsTmFtZSk7CiAJcmV0dXJuIFdOX05PX05FVFdPUks7CiB9CiAKQEAgLTI3OSw4ICsyNzEsNyBAQAogICovCiBVSU5UMTYgV0lOQVBJIFdOZXRDYW5jZWxDb25uZWN0aW9uKExQU1RSIGxwTmFtZSwgQk9PTDE2IGJGb3JjZSkKIHsKLSAgICBwcmludGYoIkVNUFRZIFNUVUIgISEhIFdOZXRDYW5jZWxDb25uZWN0aW9uKCclcycsICUwNFgpO1xuIiwKLSAgICAgICAgICAgbHBOYW1lLCBiRm9yY2UpOworICAgIEZJWE1FKHduZXQsICIoJyVzJywgJTA0WCk6IHN0dWJcbiIsIGxwTmFtZSwgYkZvcmNlKTsKICAgICByZXR1cm4gV05fTk9fTkVUV09SSzsKIH0KIApAQCAtMjg5LDcgKzI4MCw3IEBACiAgKi8KIGludCBXSU5BUEkgV05ldEdldEVycm9yKExQV09SRCBuRXJyb3IpCiB7Ci0JcHJpbnRmKCJFTVBUWSBTVFVCICEhISBXTmV0R2V0RXJyb3IoJXApXG4iLG5FcnJvcik7CisJRklYTUUod25ldCwgIiglcCk6IHN0dWJcbiIsbkVycm9yKTsKIAlyZXR1cm4gV05fTk9fTkVUV09SSzsKIH0KIApAQCAtMjk4LDggKzI4OSw3IEBACiAgKi8KIGludCBXSU5BUEkgV05ldEdldEVycm9yVGV4dChXT1JEIG5FcnJvciwgTFBTVFIgbHBCdWZmZXIsIExQV09SRCBuQnVmZmVyU2l6ZSkKIHsKLQlwcmludGYoIkVNUFRZIFNUVUIgISEhIFdOZXRHZXRFcnJvclRleHQoJXgsJXAsJXApXG4iLAotCQluRXJyb3IsbHBCdWZmZXIsbkJ1ZmZlclNpemUpOworCUZJWE1FKHduZXQsICIoJXgsJXAsJXApOiBzdHViXG4iLG5FcnJvcixscEJ1ZmZlcixuQnVmZmVyU2l6ZSk7CiAJcmV0dXJuIFdOX05FVF9FUlJPUjsKIH0KIApAQCAtMzA4LDggKzI5OCw3IEBACiAgKi8KIGludCBXSU5BUEkgV05ldFJlc3RvcmVDb25uZWN0aW9uKEhXTkQxNiBod25kT3duZXIsTFBTVFIgbHBzekRldmljZSkKIHsKLQlwcmludGYoIkVNUFRZIFNUVUIgISEhIFdOZXRSZXN0b3JlQ29ubmVjdGlvbiglMDR4LCclcycpXG4iLAotCQlod25kT3duZXIsbHBzekRldmljZSk7CisJRklYTUUod25ldCwgIiglMDR4LCclcycpOiBzdHViXG4iLGh3bmRPd25lcixscHN6RGV2aWNlKTsKIAlyZXR1cm4gV05fTk9fTkVUV09SSzsKIH0KIApAQCAtMzE4LDggKzMwNyw3IEBACiAgKi8KIGludCBXSU5BUEkgV05ldFdyaXRlSm9iKEhBTkRMRTE2IGhKb2Isdm9pZCAqbHBEYXRhLExQV09SRCBscGNiRGF0YSkKIHsKLQlwcmludGYoIkVNUFRZIFNUVUIgISEhIFdOZXRXcml0ZUpvYiglMDR4LCVwLCVwKVxuIiwKLQkJaEpvYixscERhdGEsbHBjYkRhdGEpOworCUZJWE1FKHduZXQsICIoJTA0eCwlcCwlcCk6IHN0dWJcbiIsaEpvYixscERhdGEsbHBjYkRhdGEpOwogCXJldHVybiBXTl9OT19ORVRXT1JLOwogfQogCkBAIC0zMjgsNyArMzE2LDcgQEAKICAqLwogVUlOVDE2IFdJTkFQSSBXTmV0Q29ubmVjdERpYWxvZyhIV05EMTYgaFduZFBhcmVudCwgV09SRCBpVHlwZSkKIHsKLQlwcmludGYoIkVNUFRZIFNUVUIgISEhIFdOZXRDb25uZWN0RGlhbG9nKCUwNHgsICU0WClcbiIsIGhXbmRQYXJlbnQsIGlUeXBlKTsKKwlGSVhNRSh3bmV0LCAiKCUwNHgsICU0WCk6IHN0dWJcbiIsIGhXbmRQYXJlbnQsIGlUeXBlKTsKIAlyZXR1cm4gV05fU1VDQ0VTUzsKIH0KIApAQCAtMzM3LDggKzMyNSw3IEBACiAgKi8KIGludCBXSU5BUEkgV05ldERpc2Nvbm5lY3REaWFsb2coSFdORDE2IGh3bmRPd25lciwgV09SRCBpVHlwZSkKIHsKLQlwcmludGYoIkVNUFRZIFNUVUIgISEhIFdOZXREaXNjb25uZWN0RGlhbG9nKCUwNHgsJXgpXG4iLAotCQlod25kT3duZXIsaVR5cGUpOworCUZJWE1FKHduZXQsICIoJTA0eCwleCk6IHN0dWJcbiIsaHduZE93bmVyLGlUeXBlKTsKIAlyZXR1cm4gV05fTk9fTkVUV09SSzsKIH0KIApAQCAtMzQ3LDggKzMzNCw3IEBACiAgKi8KIFVJTlQxNiBXSU5BUEkgV05ldENvbm5lY3Rpb25EaWFsb2coSFdORDE2IGhXbmRQYXJlbnQsIFdPUkQgaVR5cGUpCiB7Ci0JcHJpbnRmKCJFTVBUWSBTVFVCICEhISBXTmV0Q29ubmVjdGlvbkRpYWxvZyglMDR4LCAlNFgpXG4iLCAKLQkJaFduZFBhcmVudCwgaVR5cGUpOworCUZJWE1FKHduZXQsICIoJTA0eCwgJTRYKTogc3R1YlxuIiwgaFduZFBhcmVudCwgaVR5cGUpOwogCXJldHVybiBXTl9TVUNDRVNTOwogfQogCkBAIC0zNTcsOCArMzQzLDcgQEAKICAqLwogaW50IFdJTkFQSSBXTmV0Vmlld1F1ZXVlRGlhbG9nKEhXTkQxNiBod25kT3duZXIsTFBTVFIgbHBzelF1ZXVlKQogewotCXByaW50ZigiRU1QVFkgU1RVQiAhISEgV05ldFZpZXdRdWV1ZURpYWxvZyglMDR4LCclcycpXG4iLAotCQlod25kT3duZXIsbHBzelF1ZXVlKTsKKwlGSVhNRSh3bmV0LCAiKCUwNHgsJyVzJyk6IHN0dWJcbiIsaHduZE93bmVyLGxwc3pRdWV1ZSk7CiAJcmV0dXJuIFdOX05PX05FVFdPUks7CiB9CiAKQEAgLTM2OCw4ICszNTMsOCBAQAogaW50IFdJTkFQSSBXTmV0UHJvcGVydHlEaWFsb2coSFdORDE2IGh3bmRQYXJlbnQsV09SRCBpQnV0dG9uLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV09SRCBuUHJvcFNlbCxMUFNUUiBscHN6TmFtZSxXT1JEIG5UeXBlKQogewotCXByaW50ZigiRU1QVFkgU1RVQiAhISEgV05ldFByb3BlcnR5RGlhbG9nKCUwNHgsJXgsJXgsJyVzJywleClcbiIsCi0JCWh3bmRQYXJlbnQsaUJ1dHRvbixuUHJvcFNlbCxscHN6TmFtZSxuVHlwZSk7CisJRklYTUUod25ldCwgIiglMDR4LCV4LCV4LCclcycsJXgpOiBzdHViXG4iLAorCSAgICAgIGh3bmRQYXJlbnQsaUJ1dHRvbixuUHJvcFNlbCxscHN6TmFtZSxuVHlwZSk7CiAJcmV0dXJuIFdOX05PX05FVFdPUks7CiB9CiAKQEAgLTM3OCw4ICszNjMsNyBAQAogICovCiBpbnQgV0lOQVBJIFdOZXRHZXREaXJlY3RvcnlUeXBlKExQU1RSIGxwTmFtZSx2b2lkICpscFR5cGUpCiB7Ci0JcHJpbnRmKCJFTVBUWSBTVFVCICEhISBXTmV0R2V0RGlyZWN0b3J5VHlwZSgnJXMnLCVwKVxuIiwKLQkJbHBOYW1lLGxwVHlwZSk7CisJRklYTUUod25ldCwgIignJXMnLCVwKTogc3R1YlxuIixscE5hbWUsbHBUeXBlKTsKIAlyZXR1cm4gV05fTk9fTkVUV09SSzsKIH0KIApAQCAtMzg4LDggKzM3Miw3IEBACiAgKi8KIGludCBXSU5BUEkgV05ldERpcmVjdG9yeU5vdGlmeShIV05EMTYgaHduZE93bmVyLHZvaWQgKmxwRGlyLFdPUkQgd09wZXIpCiB7Ci0JcHJpbnRmKCJFTVBUWSBTVFVCICEhISBXTmV0RGlyZWN0b3J5Tm90aWZ5KCUwNHgsJXAsJXgpXG4iLAotCQlod25kT3duZXIsbHBEaXIsd09wZXIpOworCUZJWE1FKHduZXQsICIoJTA0eCwlcCwleCk6IHN0dWJcbiIsaHduZE93bmVyLGxwRGlyLHdPcGVyKTsKIAlyZXR1cm4gV05fTk9fTkVUV09SSzsKIH0KIApAQCAtMzk5LDggKzM4Miw4IEBACiBpbnQgV0lOQVBJIFdOZXRHZXRQcm9wZXJ0eVRleHQoSFdORDE2IGh3bmRQYXJlbnQsV09SRCBpQnV0dG9uLFdPUkQgblByb3BTZWwsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFBTVFIgbHBzek5hbWUsV09SRCBuVHlwZSkKIHsKLQlwcmludGYoIkVNUFRZIFNUVUIgISEhIFdOZXRHZXRQcm9wZXJ0eVRleHQoJTA0eCwleCwleCwnJXMnLCV4KVxuIiwKLQkJaHduZFBhcmVudCxpQnV0dG9uLG5Qcm9wU2VsLGxwc3pOYW1lLG5UeXBlKTsKKwlGSVhNRSh3bmV0LCAiKCUwNHgsJXgsJXgsJyVzJywleCk6IHN0dWJcbiIsCisJICAgICAgaHduZFBhcmVudCxpQnV0dG9uLG5Qcm9wU2VsLGxwc3pOYW1lLG5UeXBlKTsKIAlyZXR1cm4gV05fTk9fTkVUV09SSzsKIH0KIApAQCAtNDEwLDggKzM5Myw4IEBACiBVSU5UMTYgV0lOQVBJIFdOZXRBZGRDb25uZWN0aW9uMihMUFNUUiBscE5ldFBhdGgsIExQU1RSIGxwUGFzc1dvcmQsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFBTVFIgbHBMb2NhbE5hbWUsIExQU1RSIGxwVXNlck5hbWUpCiB7Ci0JcHJpbnRmKCJFTVBUWSBTVFVCICEhISBXTmV0QWRkQ29ubmVjdGlvbjIoJyVzJywgJXAsICclcycsICclcycpO1xuIiwKLQkJCQkJbHBOZXRQYXRoLCBscFBhc3NXb3JkLCBscExvY2FsTmFtZSwgbHBVc2VyTmFtZSk7CisJRklYTUUod25ldCwgIignJXMnLCAlcCwgJyVzJywgJyVzJyk6IHN0dWJcbiIsCisJICAgICAgbHBOZXRQYXRoLCBscFBhc3NXb3JkLCBscExvY2FsTmFtZSwgbHBVc2VyTmFtZSk7CiAJcmV0dXJuIFdOX05PX05FVFdPUks7CiB9CiAKQEAgLTQyMCw3ICs0MDMsNyBAQAogICovCiBVSU5UMTYgV0lOQVBJIFdOZXRDbG9zZUVudW0oSEFORExFMTYgaEVudW0pCiB7Ci0JcHJpbnRmKCJFTVBUWSBTVFVCICEhISBXTmV0Q2xvc2VFbnVtKCUwNHgpO1xuIiwgaEVudW0pOworCUZJWE1FKHduZXQsICIoJTA0eCk6IHN0dWJcbiIsIGhFbnVtKTsKIAlyZXR1cm4gV05fTk9fTkVUV09SSzsKIH0KIApAQCAtNDMwLDggKzQxMyw4IEBACiBVSU5UMTYgV0lOQVBJIFdOZXRFbnVtUmVzb3VyY2UoSEFORExFMTYgaEVudW0sIERXT1JEIGNSZXF1LCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEV09SRCAqbHBDb3VudCwgTFBWT0lEIGxwQnVmKQogewotCXByaW50ZigiRU1QVFkgU1RVQiAhISEgV05ldEVudW1SZXNvdXJjZSglMDR4LCAlMDhsWCwgJXAsICVwKTtcbiIsIAotCQkJCQkJCWhFbnVtLCBjUmVxdSwgbHBDb3VudCwgbHBCdWYpOworCUZJWE1FKHduZXQsICIoJTA0eCwgJTA4bFgsICVwLCAlcCk6IHN0dWJcbiIsIAorCSAgICAgIGhFbnVtLCBjUmVxdSwgbHBDb3VudCwgbHBCdWYpOwogCXJldHVybiBXTl9OT19ORVRXT1JLOwogfQogCkBAIC00NDEsOCArNDI0LDggQEAKIFVJTlQxNiBXSU5BUEkgV05ldE9wZW5FbnVtMTYoRFdPUkQgZHdTY29wZSwgRFdPUkQgZHdUeXBlLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFBORVRSRVNPVVJDRTE2IGxwTmV0LCBIQU5ETEUxNiAqbHBoRW51bSkKIHsKLQlwcmludGYoIkVNUFRZIFNUVUIgISEhIFdOZXRPcGVuRW51bSglMDhsWCwgJTA4bFgsICVwLCAlcCk7XG4iLAotICAgICAgICAgICAgICAgZHdTY29wZSwgZHdUeXBlLCBscE5ldCwgbHBoRW51bSk7CisJRklYTUUod25ldCwgIiglMDhsWCwgJTA4bFgsICVwLCAlcCk6IHN0dWJcbiIsCisJICAgICAgZHdTY29wZSwgZHdUeXBlLCBscE5ldCwgbHBoRW51bSk7CiAJcmV0dXJuIFdOX05PX05FVFdPUks7CiB9CiAKQEAgLTQ1Miw4ICs0MzUsOCBAQAogVUlOVDMyIFdJTkFQSSBXTmV0T3BlbkVudW0zMkEoRFdPUkQgZHdTY29wZSwgRFdPUkQgZHdUeXBlLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExQTkVUUkVTT1VSQ0UzMkEgbHBOZXQsIEhBTkRMRTMyICpscGhFbnVtKQogewotCXByaW50ZigiRU1QVFkgU1RVQiAhISEgV05ldE9wZW5FbnVtQSglMDhsWCwgJTA4bFgsICVwLCAlcCk7XG4iLAotICAgICAgICAgICAgICAgZHdTY29wZSwgZHdUeXBlLCBscE5ldCwgbHBoRW51bSk7CisJRklYTUUod25ldCwgIiglMDhsWCwgJTA4bFgsICVwLCAlcCk6IHN0dWJcbiIsCisJICAgICAgZHdTY29wZSwgZHdUeXBlLCBscE5ldCwgbHBoRW51bSk7CiAJcmV0dXJuIFdOX05PX05FVFdPUks7CiB9CiAKQEAgLTQ3Myw4ICs0NTYsNiBAQAogV05ldEdldFJlc291cmNlSW5mb3JtYXRpb24zMkEoCiAJTFBORVRSRVNPVVJDRTMyQSBuZXRyZXMsTFBWT0lEIGJ1ZixMUERXT1JEIGJ1ZmxlbixMUFNUUiBzeXN0ZW1zdHIKICkgewotCWZwcmludGYoc3RkZXJyLCJXTmV0R2V0UmVzb3VyY2VJbmZvcm1hdGlvbkEoJXAsJXAsJXAsJXApLHN0dWIhXG4iLAotCQluZXRyZXMsYnVmLGJ1ZmxlbixzeXN0ZW1zdHIKLQkpOworCUZJWE1FKHduZXQsIiglcCwlcCwlcCwlcCk6IHN0dWIhXG4iLG5ldHJlcyxidWYsYnVmbGVuLHN5c3RlbXN0cik7CiAJcmV0dXJuIFdOX05PX05FVFdPUks7CiB9CmRpZmYgLS1naXQgYS9taXNjL250ZGxsLmMgYi9taXNjL250ZGxsLmMKaW5kZXggZjQ4ZjM3MC4uZTUyZTIwMSAxMDA2NDQKLS0tIGEvbWlzYy9udGRsbC5jCisrKyBiL21pc2MvbnRkbGwuYwpAQCAtMjAxLDcgKzIwMSw3IEBACiAgKi8KIExQVk9JRCBXSU5BUEkgUnRsTm9ybWFsaXplUHJvY2Vzc1BhcmFtcyhMUFZPSUQgeCkKIHsKLSAgICBmcHJpbnRmKHN0ZG5pbXAsIlJ0bE5vcm1hbGl6ZVByb2Nlc3NQYXJhbXMoJXApLCBzdHViLlxuIix4KTsKKyAgICBGSVhNRShudGRsbCwiKCVwKSwgc3R1Yi5cbiIseCk7CiAgICAgcmV0dXJuIHg7CiB9CiAKQEAgLTQ5MCw5ICs0OTAsNyBAQAogewogCUxQU1RSCWZyb21BID0gSEVBUF9zdHJkdXBXdG9BKEdldFByb2Nlc3NIZWFwKCksMCxmcm9tKTsKIAotCWZwcmludGYoc3RkZXJyLCJSdGxEb3NQYXRoTmFtZVRvTnRQYXRoTmFtZV9VKCVzLCVwLCUwOGx4LCUwOGx4KVxuIiwKLQkJZnJvbUEsdXMseDIseDMKLQkpOworCUZJWE1FKG50ZGxsLCIoJXMsJXAsJTA4bHgsJTA4bHgpXG4iLGZyb21BLHVzLHgyLHgzKTsKIAlpZiAodXMpCiAJCVJ0bEluaXRVbmljb2RlU3RyaW5nKHVzLEhFQVBfc3RyZHVwVyhHZXRQcm9jZXNzSGVhcCgpLDAsZnJvbSkpOwogCXJldHVybiBUUlVFOwpAQCAtNTAzLDkgKzUwMSw4IEBACiAgKi8KIERXT1JEIFdJTkFQSSBOdE9wZW5GaWxlKERXT1JEIHgxLERXT1JEIGZsYWdzLERXT1JEIHgzLERXT1JEIHg0LERXT1JEIGFsaWdubWVudCxEV09SRCB4NikKIHsKLQlmcHJpbnRmKHN0ZGVyciwiTnRPcGVuRmlsZSglMDhseCwlMDhseCwlMDhseCwlMDhseCwlMDhseCwlMDhseClcbiIsCi0JCXgxLGZsYWdzLHgzLHg0LGFsaWdubWVudCx4NgotCSk7CisJRklYTUUobnRkbGwsIiglMDhseCwlMDhseCwlMDhseCwlMDhseCwlMDhseCwlMDhseClcbiIsCisJICAgICAgeDEsZmxhZ3MseDMseDQsYWxpZ25tZW50LHg2KTsKIAkvKiByZXR1cm5zIGZpbGUgaW8gY29tcGxldGlvbiBzdGF0dXMgKi8KIAlyZXR1cm4gMDsKIH0KZGlmZiAtLWdpdCBhL21pc2MvcHJpbnRkcnYuYyBiL21pc2MvcHJpbnRkcnYuYwppbmRleCAzYzczNTgxLi4yNDY2MDEwIDEwMDY0NAotLS0gYS9taXNjL3ByaW50ZHJ2LmMKKysrIGIvbWlzYy9wcmludGRydi5jCkBAIC0xMSwyMCArMTEsMjAgQEAKICNpbmNsdWRlICJ3aW5kb3dzLmgiCiAjaW5jbHVkZSAid2luLmgiCiAjaW5jbHVkZSAid2luZXJyb3IuaCIKLQorI2luY2x1ZGUgImRlYnVnLmgiCiAKIElOVDE2IFdJTkFQSSBTdGFydERvYzE2KCBIREMxNiBoZGMsIGNvbnN0IERPQ0lORk8xNiAqbHBkb2MgKQogewogICBJTlQxNiByZXRWYWw7Ci0gIHByaW50ZigiSW4gc3RhcnRkb2MxNiglcClcbiIsIGxwZG9jICk7Ci0gIHByaW50ZigiSW4gU3RhcnREb2MxNiAlZCAweCVseDoweCVwIDB4JWx4OjB4JXBcbiIsbHBkb2MtPmNiU2l6ZSwKLQkgbHBkb2MtPmxwc3pEb2NOYW1lLFBUUl9TRUdfVE9fTElOKGxwZG9jLT5scHN6RG9jTmFtZSksCi0JIGxwZG9jLT5scHN6T3V0cHV0LFBUUl9TRUdfVE9fTElOKGxwZG9jLT5scHN6T3V0cHV0KSk7Ci0gIHByaW50ZigiSW4gU3RhcnREb2MxNiAlZCAlcyAlc1xuIixscGRvYy0+Y2JTaXplLAotCSAoTFBTVFIpUFRSX1NFR19UT19MSU4obHBkb2MtPmxwc3pEb2NOYW1lKSwKLQkgKExQU1RSKVBUUl9TRUdfVE9fTElOKGxwZG9jLT5scHN6T3V0cHV0KSk7CisgIFRSQUNFKHByaW50LCIoJXApXG4iLCBscGRvYyApOworICBUUkFDRShwcmludCwiJWQgMHglbHg6MHglcCAweCVseDoweCVwXG4iLGxwZG9jLT5jYlNpemUsCisJbHBkb2MtPmxwc3pEb2NOYW1lLFBUUl9TRUdfVE9fTElOKGxwZG9jLT5scHN6RG9jTmFtZSksCisJbHBkb2MtPmxwc3pPdXRwdXQsUFRSX1NFR19UT19MSU4obHBkb2MtPmxwc3pPdXRwdXQpKTsKKyAgVFJBQ0UocHJpbnQsICIlZCAlcyAlc1xuIixscGRvYy0+Y2JTaXplLAorCShMUFNUUilQVFJfU0VHX1RPX0xJTihscGRvYy0+bHBzekRvY05hbWUpLAorCShMUFNUUilQVFJfU0VHX1RPX0xJTihscGRvYy0+bHBzek91dHB1dCkpOwogICByZXRWYWwgPSAgRXNjYXBlMTYoaGRjLCBTVEFSVERPQywgc2l6ZW9mKERPQ0lORk8xNiksIGxwZG9jLT5scHN6RG9jTmFtZSwgMCk7Ci0gIHByaW50ZigiRXNjYXBlMTYgcmV0dXJuZWQgJWRcbiIscmV0VmFsKTsKKyAgVFJBQ0UocHJpbnQsIkVzY2FwZTE2IHJldHVybmVkICVkXG4iLHJldFZhbCk7CiAgIHJldHVybiByZXRWYWw7CiB9CiAKZGlmZiAtLWdpdCBhL21pc2Mvc2hlbGwuYyBiL21pc2Mvc2hlbGwuYwppbmRleCBhN2FlNGMwLi41NDVlY2RjIDEwMDY0NAotLS0gYS9taXNjL3NoZWxsLmMKKysrIGIvbWlzYy9zaGVsbC5jCkBAIC0yMyw3ICsyMyw2IEBACiAjaW5jbHVkZSAic3lzbWV0cmljcy5oIgogI2luY2x1ZGUgInNobG9iai5oIgogI2luY2x1ZGUgImRlYnVnLmgiCi0jaW5jbHVkZSAiZGVidWdzdHIuaCIKICNpbmNsdWRlICJ3aW5yZWcuaCIKIAogc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCBTSEVMTF9QZW9wbGVbXSA9CkBAIC0xNDA2LDEyICsxNDA1LDYgQEAKICAgICByZXR1cm4gQ2FsbE5leHRIb29rRXgxNiggV0hfU0hFTEwsIGNvZGUsIHdQYXJhbSwgbFBhcmFtICk7CiB9CiAKLUxSRVNVTFQgV0lOQVBJIEZVTkMwMDQoSU5UMTYgY29kZSwgV1BBUkFNMTYgd1BhcmFtLCAvKkxQQVJBTSovV09SRCBsUGFyYW0pCi17Ci0JRklYTUUocmVnLCIoJWQsJWQsJWQpLFNUVUIhXG4iLGNvZGUsd1BhcmFtLGxQYXJhbSk7Ci0JcmV0dXJuIFNoZWxsSG9va1Byb2MoY29kZSx3UGFyYW0sKERXT1JEKWxQYXJhbSk7Ci19Ci0KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKgkJCQlSZWdpc3RlclNoZWxsSG9vawlbU0hFTEwuMTAyXQogICovCkBAIC0xNDYwLDkgKzE0NTMsOCBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU0hGSUxFSU5GTzMyQSAqcHNmaSwgVUlOVDMyIHNpemVvZnBzZmksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVSU5UMzIgZmxhZ3MgKQogewotCWZwcmludGYoc3RkbmltcCwiU0hHZXRGaWxlSW5mbzMyQSglcywweCUwOGx4LCVwLCVkLDB4JTA4eClcbiIsCi0JCXBhdGgsZHdGaWxlQXR0cmlidXRlcyxwc2ZpLHNpemVvZnBzZmksZmxhZ3MKLQkpOworCUZJWE1FKHNoZWxsLCIoJXMsMHglMDhseCwlcCwlZCwweCUwOHgpOiBzdHViXG4iLAorCSAgICAgIHBhdGgsZHdGaWxlQXR0cmlidXRlcyxwc2ZpLHNpemVvZnBzZmksZmxhZ3MpOwogCXJldHVybiBUUlVFOwogfQogCkBAIC0xNDcxLDcgKzE0NjMsNyBAQAogICovCiBVSU5UMzIgV0lOQVBJIFNIQXBwQmFyTWVzc2FnZTMyKERXT1JEIG1zZywgUEFQUEJBUkRBVEEgZGF0YSkKIHsKLSAgICBmcHJpbnRmKHN0ZG5pbXAsIlNIQXBwQmFyTWVzc2FnZTMyKDB4JTA4bHgsJXApXG4iLCBtc2csIGRhdGEpOworICAgIEZJWE1FKHNoZWxsLCIoMHglMDhseCwlcCk6IHN0dWJcbiIsIG1zZywgZGF0YSk7CiAjaWYgMAogICAgIHN3aXRjaCAobXNnKSB7CiAgICAgICAgIGNhc2UgQUJNX0FDVElWQVRFOgpAQCAtMTU0OSw4ICsxNTQxLDcgQEAKIHZvaWQgV0lOQVBJIENvbnRyb2xfUnVuRExMIChIV05EMzIgaHduZCwgTFBDVk9JRCBjb2RlLCBMUENTVFIgY21kLCBEV09SRCBhcmc0KQogewogICBUUkFDRShleGVjLCAiKCUwOHgsICVwLCBcIiVzXCIsICUwOGx4KVxuIiwKLQkJaHduZCwgY29kZSA/IGNvZGUgOiAiKG51bGwpIiwKLQkJY21kID8gY21kIDogIihudWxsKSIsIGFyZzQpOworCWh3bmQsIGNvZGUgPyBjb2RlIDogIihudWxsKSIsIGNtZCA/IGNtZCA6ICIobnVsbCkiLCBhcmc0KTsKIH0KIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKQEAgLTE1NTgsNyArMTU0OSw3IEBACiAKIHZvaWQgV0lOQVBJIEZyZWVJY29uTGlzdCggRFdPUkQgZHcgKQogewotICAgIGZwcmludGYoIHN0ZG5pbXAsICJGcmVlSWNvbkxpc3Q6IGVtcHR5IHN0dWJcbiIgKTsKKyAgICBGSVhNRShyZWcsICJlbXB0eSBzdHViXG4iICk7CiB9CiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCkBAIC0xNTc0LDcgKzE1NjUsNyBAQAogCiAgICAgV0lORV9TdHJpbmdGcm9tQ0xTSUQoKExQQ0xTSUQpcmNsc2lkLHhjbHNpZCk7CiAgICAgV0lORV9TdHJpbmdGcm9tQ0xTSUQoKExQQ0xTSUQpaWlkLHhpaWQpOwotICAgIGZwcmludGYoc3RkZXJyLCJTSEVMTDMyX0RsbEdldENsYXNzT2JqZWN0KCVzLCVzLCVwKVxuIix4Y2xzaWQseGlpZCxwcHYpOworICAgIFRSQUNFKHNoZWxsLCIoJXMsJXMsJXApXG4iLHhjbHNpZCx4aWlkLHBwdik7CiAKICAgICAqcHB2ID0gTlVMTDsKIC8qIFNESyBleGFtcGxlIGNvZGUgbG9va3MgbGlrZSB0aGlzOgpAQCAtMTU5NSwxMyArMTU4NiwxMyBAQAogICovCiAgIAogICAgIGlmICghbWVtY21wKHJjbHNpZCwmQ0xTSURfU2hlbGxEZXNrdG9wLHNpemVvZihDTFNJRF9TaGVsbERlc2t0b3ApKSkgewotICAgIAlmcHJpbnRmKHN0ZGVyciwiCXJlcXVlc3RlZCBDTFNJRF9TaGVsbERlc2t0b3AsIGNyZWF0aW5nIGl0LlxuIik7CisgICAgCVRSQUNFKHNoZWxsLCIgICByZXF1ZXN0ZWQgQ0xTSURfU2hlbGxEZXNrdG9wLCBjcmVhdGluZyBpdC5cbiIpOwogCSpwcHYgPSBJU2hlbGxGb2xkZXJfQ29uc3RydWN0b3IoKTsKLQkvKiBGSVhNRTogSW5pdGlhbGl6ZSB0aGlzIGZvbGRlciB0byBiZSB0aGUgc2hlbGwgZGVza3RvcCBmb2xkZXIgKi8KKwlGSVhNRShzaGVsbCwiSW5pdGlhbGl6ZSB0aGlzIGZvbGRlciB0byBiZSB0aGUgc2hlbGwgZGVza3RvcCBmb2xkZXJcbiIpOwogCXJldHVybiAwOwogICAgIH0KIAotICAgIGZwcmludGYgKHN0ZG5pbXAsICIJLT4gY2xzaWQgbm90IGZvdW5kLiByZXR1cm5pbmcgRV9PVVRPRk1FTU9SWS5cbiIpOworICAgIEZJWE1FKHNoZWxsLCAiICAgLT4gY2xzaWQgbm90IGZvdW5kLiByZXR1cm5pbmcgRV9PVVRPRk1FTU9SWS5cbiIpOwogICAgIHJldHVybiBocmVzOwogfQogCkBAIC0xNjMzLDcgKzE2MjQsNyBAQAogICogaGVhcCAoUHJvY2Vzc0hlYXApLgogICovCiBEV09SRCBXSU5BUEkgU0hHZXRNYWxsb2MoTFBNQUxMT0MzMiAqbHBtYWwpIHsKLQlmcHJpbnRmKHN0ZGVyciwiU0hHZXRNYWxsb2MoKVxuIik7CisJVFJBQ0Uoc2hlbGwsIiglcClcbiIsIGxwbWFsKTsKIAlyZXR1cm4gQ29HZXRNYWxsb2MzMigwLGxwbWFsKTsKIH0KIApAQCAtMTY0NCwxMSArMTYzNSw5IEBACiAgKiBuRm9sZGVyIGlzIGEgQ1NJRExfeHh4eHguCiAgKi8KIEhSRVNVTFQgV0lOQVBJIFNIR2V0U3BlY2lhbEZvbGRlckxvY2F0aW9uKEhXTkQzMiBod25kT3duZXIsIElOVDMyIG5Gb2xkZXIsIExQSVRFTUlETElTVCAqIHBwaWRsKSB7Ci0JZnByaW50ZihzdGRlcnIsIlNIR2V0U3BlY2lhbEZvbGRlckxvY2F0aW9uKCUwNHgsJWQsJXApLHN0dWIhXG4iLAotCQlod25kT3duZXIsbkZvbGRlcixwcGlkbAotCSk7CisJRklYTUUoc2hlbGwsIiglMDR4LCVkLCVwKSxzdHViIVxuIiwgaHduZE93bmVyLG5Gb2xkZXIscHBpZGwpOwogCSpwcGlkbCA9IChMUElURU1JRExJU1QpSGVhcEFsbG9jKEdldFByb2Nlc3NIZWFwKCksMCwyKnNpemVvZihJVEVNSURMSVNUKSk7Ci0JLyogRklYTUU6IHdlIHJldHVybiBvbmx5IHRoZSBlbXB0eSBJVEVNSURMSVNUIGN1cnJlbnRseS4gKi8KKwlGSVhNRShzaGVsbCwgIndlIHJldHVybiBvbmx5IHRoZSBlbXB0eSBJVEVNSURMSVNUIGN1cnJlbnRseS5cbiIpOwogCSgqcHBpZGwpLT5ta2lkLmNiID0gMDsKIAlyZXR1cm4gTk9FUlJPUjsKIH0KQEAgLTE2NTgsOCArMTY0NywxMiBAQAogICogcmV0dXJucyB0aGUgcGF0aCBmcm9tIGEgcGFzc2VkIFBJREwuCiAgKi8KIEJPT0wzMiBXSU5BUEkgU0hHZXRQYXRoRnJvbUlETGlzdChMUENJVEVNSURMSVNUIHBpZGwsTFBTVFIgcHN6UGF0aCkgewotCWZwcmludGYoc3RkZXJyLCJTSEdldFBhdGhGcm9tSURMaXN0KCVwLCVwKSxzdHViIVxuIixwaWRsLHBzelBhdGgpOworCUZJWE1FKHNoZWxsLCIoJXAsJXApLHN0dWIhXG4iLHBpZGwscHN6UGF0aCk7CiAJbHN0cmNweTMyQShwc3pQYXRoLCJFOlxcIik7IC8qIEZJWE1FICovCiAJcmV0dXJuIE5PRVJST1I7CiB9CiAKKworCisKKwpkaWZmIC0tZ2l0IGEvbWlzYy9zaGVsbG9yZC5jIGIvbWlzYy9zaGVsbG9yZC5jCmluZGV4IGVkYWEyZDcuLjhjYmZhNDAgMTAwNjQ0Ci0tLSBhL21pc2Mvc2hlbGxvcmQuYworKysgYi9taXNjL3NoZWxsb3JkLmMKQEAgLTM2NSw3ICszNjUsNyBAQAogICogdW5rbm93bgogICovCiB2b2lkIFdJTkFQSSBTSEVMTDMyXzE3NShEV09SRCB4MSxEV09SRCB4MixEV09SRCB4MyxEV09SRCB4NCkgewotICAgIGZwcmludGYoc3RkbmltcCwiU0hFTEwzMl8xNzUoMHglMDhseCwweCUwOGx4LDB4JTA4bHgsMHglMDhseCksc3R1YlxuIiwKKyAgICBmcHJpbnRmKHN0ZGVyciwiU0hFTEwzMl8xNzUoMHglMDhseCwweCUwOGx4LDB4JTA4bHgsMHglMDhseCksc3R1YlxuIiwKICAgICAJeDEseDIseDMseDQKICAgICApOwogfQpkaWZmIC0tZ2l0IGEvbWlzYy9zb3VuZC5jIGIvbWlzYy9zb3VuZC5jCmluZGV4IDQ1MmE2ZjcuLjlkZTgxZjAgMTAwNjQ0Ci0tLSBhL21pc2Mvc291bmQuYworKysgYi9taXNjL3NvdW5kLmMKQEAgLTYsOTggKzYsOTkgQEAKICNpbmNsdWRlIDxzdGRsaWIuaD4KICNpbmNsdWRlIDxzdGRpby5oPgogI2luY2x1ZGUgIndpbmRvd3MuaCIKKyNpbmNsdWRlICJkZWJ1Zy5oIgogCiBJTlQxNiBXSU5BUEkgT3BlblNvdW5kMTYodm9pZCkKIHsKLSAgcHJpbnRmKCJPcGVuU291bmQxNigpXG4iKTsKKyAgRklYTUUoc291bmQsICIodm9pZCk6IHN0dWJcbiIpOwogICByZXR1cm4gLTE7CiB9CiAKIHZvaWQgV0lOQVBJIE9wZW5Tb3VuZDMyKHZvaWQpCiB7Ci0gIHByaW50ZigiT3BlblNvdW5kMzIoKVxuIik7CisgIEZJWE1FKHNvdW5kLCAiKHZvaWQpOiBzdHViXG4iKTsKIH0KIAogdm9pZCBXSU5BUEkgQ2xvc2VTb3VuZCh2b2lkKQogewotICBwcmludGYoIkNsb3NlU291bmQoKVxuIik7CisgIEZJWE1FKHNvdW5kLCAiKHZvaWQpOiBzdHViXG4iKTsKIH0KIAogSU5UMTYgV0lOQVBJIFNldFZvaWNlUXVldWVTaXplMTYoSU5UMTYgblZvaWNlLCBJTlQxNiBuQnl0ZXMpCiB7Ci0gIHByaW50ZigiU2V0Vm9pY2VRdWV1ZVNpemUxNiAoJWQsJWQpXG4iLG5Wb2ljZSxuQnl0ZXMpOworICBGSVhNRShzb3VuZCwgIiglZCwlZCk6IHN0dWJcbiIsblZvaWNlLG5CeXRlcyk7CiAgIHJldHVybiAwOwogfQogCiBEV09SRCBXSU5BUEkgU2V0Vm9pY2VRdWV1ZVNpemUzMihEV09SRCBuVm9pY2UsIERXT1JEIG5CeXRlcykKIHsKLSAgcHJpbnRmKCJTZXRWb2ljZVF1ZXVlU2l6ZTMyICglbGQsJWxkKVxuIixuVm9pY2UsbkJ5dGVzKTsKKyAgRklYTUUoc291bmQsICIoJWxkLCVsZCk6IHN0dWJcbiIsblZvaWNlLG5CeXRlcyk7CiAgIHJldHVybiAwOwogfQogCiBJTlQxNiBXSU5BUEkgU2V0Vm9pY2VOb3RlMTYoSU5UMTYgblZvaWNlLCBJTlQxNiBuVmFsdWUsIElOVDE2IG5MZW5ndGgsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSU5UMTYgbkNkb3RzKQogewotICBwcmludGYoIlNldFZvaWNlTm90ZTE2ICglZCwlZCwlZCwlZClcbiIsblZvaWNlLG5WYWx1ZSxuTGVuZ3RoLG5DZG90cyk7CisgIEZJWE1FKHNvdW5kLCAiKCVkLCVkLCVkLCVkKTogc3R1YlxuIixuVm9pY2UsblZhbHVlLG5MZW5ndGgsbkNkb3RzKTsKICAgcmV0dXJuIDA7CiB9CiAKIERXT1JEIFdJTkFQSSBTZXRWb2ljZU5vdGUzMihEV09SRCBuVm9pY2UsIERXT1JEIG5WYWx1ZSwgRFdPUkQgbkxlbmd0aCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEV09SRCBuQ2RvdHMpCiB7Ci0gIHByaW50ZigiU2V0Vm9pY2VOb3RlMzIgKCVsZCwlbGQsJWxkLCVsZClcbiIsblZvaWNlLG5WYWx1ZSxuTGVuZ3RoLG5DZG90cyk7CisgIEZJWE1FKHNvdW5kLCAiKCVsZCwlbGQsJWxkLCVsZCk6IHN0dWJcbiIsblZvaWNlLG5WYWx1ZSxuTGVuZ3RoLG5DZG90cyk7CiAgIHJldHVybiAwOwogfQogCiBJTlQxNiBXSU5BUEkgU2V0Vm9pY2VBY2NlbnQxNihJTlQxNiBuVm9pY2UsIElOVDE2IG5UZW1wbywgSU5UMTYgblZvbHVtZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElOVDE2IG5Nb2RlLCBJTlQxNiBuUGl0Y2gpCiB7Ci0gIHByaW50ZigiU2V0Vm9pY2VBY2NlbnQxNiglZCwlZCwlZCwlZCwlZClcbiIsIG5Wb2ljZSwgblRlbXBvLCAKLQkgblZvbHVtZSwgbk1vZGUsIG5QaXRjaCk7CisgIEZJWE1FKHNvdW5kLCAiKCVkLCVkLCVkLCVkLCVkKTogc3R1YlxuIiwgblZvaWNlLCBuVGVtcG8sIAorCW5Wb2x1bWUsIG5Nb2RlLCBuUGl0Y2gpOwogICByZXR1cm4gMDsKIH0KIAogRFdPUkQgV0lOQVBJIFNldFZvaWNlQWNjZW50MzIoRFdPUkQgblZvaWNlLCBEV09SRCBuVGVtcG8sIERXT1JEIG5Wb2x1bWUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEV09SRCBuTW9kZSwgRFdPUkQgblBpdGNoKQogewotICBwcmludGYoIlNldFZvaWNlQWNjZW50MzIoJWxkLCVsZCwlbGQsJWxkLCVsZClcbiIsIG5Wb2ljZSwgblRlbXBvLCAKLQkgblZvbHVtZSwgbk1vZGUsIG5QaXRjaCk7CisgIEZJWE1FKHNvdW5kLCAiKCVsZCwlbGQsJWxkLCVsZCwlbGQpOiBzdHViXG4iLCBuVm9pY2UsIG5UZW1wbywgCisJblZvbHVtZSwgbk1vZGUsIG5QaXRjaCk7CiAgIHJldHVybiAwOwogfQogCiBJTlQxNiBXSU5BUEkgU2V0Vm9pY2VFbnZlbG9wZTE2KElOVDE2IG5Wb2ljZSwgSU5UMTYgblNoYXBlLCBJTlQxNiBuUmVwZWF0KQogewotICBwcmludGYoIlNldFZvaWNlRW52ZWxvcGUxNiglZCwlZCwlZClcbiIsblZvaWNlLG5TaGFwZSxuUmVwZWF0KTsKKyAgRklYTUUoc291bmQsICIoJWQsJWQsJWQpOiBzdHViXG4iLG5Wb2ljZSxuU2hhcGUsblJlcGVhdCk7CiAgIHJldHVybiAwOwogfQogCiBEV09SRCBXSU5BUEkgU2V0Vm9pY2VFbnZlbG9wZTMyKERXT1JEIG5Wb2ljZSwgRFdPUkQgblNoYXBlLCBEV09SRCBuUmVwZWF0KQogewotICBwcmludGYoIlNldFZvaWNlRW52ZWxvcGUzMiglbGQsJWxkLCVsZClcbiIsblZvaWNlLG5TaGFwZSxuUmVwZWF0KTsKKyAgRklYTUUoc291bmQsICIoJWxkLCVsZCwlbGQpOiBzdHViXG4iLG5Wb2ljZSxuU2hhcGUsblJlcGVhdCk7CiAgIHJldHVybiAwOwogfQogCiBJTlQxNiBXSU5BUEkgU2V0U291bmROb2lzZTE2KElOVDE2IG5Tb3VyY2UsIElOVDE2IG5EdXJhdGlvbikKIHsKLSAgcHJpbnRmKCJTZXRTb3VuZE5vaXNlMTYoJWQsJWQpXG4iLG5Tb3VyY2UsbkR1cmF0aW9uKTsKKyAgRklYTUUoc291bmQsICIoJWQsJWQpOiBzdHViXG4iLG5Tb3VyY2UsbkR1cmF0aW9uKTsKICAgcmV0dXJuIDA7CiB9CiAKIERXT1JEIFdJTkFQSSBTZXRTb3VuZE5vaXNlMzIoRFdPUkQgblNvdXJjZSwgRFdPUkQgbkR1cmF0aW9uKQogewotICBwcmludGYoIlNldFNvdW5kTm9pc2UzMiglbGQsJWxkKVxuIixuU291cmNlLG5EdXJhdGlvbik7CisgIEZJWE1FKHNvdW5kLCAiKCVsZCwlbGQpOiBzdHViXG4iLG5Tb3VyY2UsbkR1cmF0aW9uKTsKICAgcmV0dXJuIDA7CiB9CiAKIElOVDE2IFdJTkFQSSBTZXRWb2ljZVNvdW5kMTYoSU5UMTYgblZvaWNlLCBEV09SRCBsRnJlcXVlbmN5LCBJTlQxNiBuRHVyYXRpb24pCiB7Ci0gIHByaW50ZigiU2V0Vm9pY2VTb3VuZDE2KCVkLCAlbGQsICVkKVxuIixuVm9pY2UsbEZyZXF1ZW5jeSwgbkR1cmF0aW9uKTsKKyAgRklYTUUoc291bmQsICIoJWQsICVsZCwgJWQpOiBzdHViXG4iLG5Wb2ljZSxsRnJlcXVlbmN5LCBuRHVyYXRpb24pOwogICByZXR1cm4gMDsKIH0KIAogRFdPUkQgV0lOQVBJIFNldFZvaWNlU291bmQzMihEV09SRCBuVm9pY2UsIERXT1JEIGxGcmVxdWVuY3ksIERXT1JEIG5EdXJhdGlvbikKIHsKLSAgcHJpbnRmKCJTZXRWb2ljZVNvdW5kMzIoJWxkLCAlbGQsICVsZClcbiIsblZvaWNlLGxGcmVxdWVuY3ksIG5EdXJhdGlvbik7CisgIEZJWE1FKHNvdW5kLCAiKCVsZCwgJWxkLCAlbGQpOiBzdHViXG4iLG5Wb2ljZSxsRnJlcXVlbmN5LCBuRHVyYXRpb24pOwogICByZXR1cm4gMDsKIH0KIApAQCAtMTEzLDc3ICsxMTQsODEgQEAKIAogSU5UMTYgV0lOQVBJIFdhaXRTb3VuZFN0YXRlMTYoSU5UMTYgeCkKIHsKLSAgICBmcHJpbnRmKHN0ZGVyciwgIldhaXRTb3VuZFN0YXRlMTYoJWQpXG4iLCB4KTsKKyAgICBGSVhNRShzb3VuZCwgIiglZCk6IHN0dWJcbiIsIHgpOwogICAgIHJldHVybiAwOwogfQogCiBEV09SRCBXSU5BUEkgV2FpdFNvdW5kU3RhdGUzMihEV09SRCB4KQogewotICAgIGZwcmludGYoc3RkZXJyLCAiV2FpdFNvdW5kU3RhdGUzMiglbGQpXG4iLCB4KTsKKyAgICBGSVhNRShzb3VuZCwgIiglbGQpOiBzdHViXG4iLCB4KTsKICAgICByZXR1cm4gMDsKIH0KIAogSU5UMTYgV0lOQVBJIFN5bmNBbGxWb2ljZXMxNih2b2lkKQogewotICAgIGZwcmludGYoc3RkZXJyLCAiU3luY0FsbFZvaWNlczE2KClcbiIpOworICAgIEZJWE1FKHNvdW5kLCAiKHZvaWQpOiBzdHViXG4iKTsKICAgICByZXR1cm4gMDsKIH0KIAogRFdPUkQgV0lOQVBJIFN5bmNBbGxWb2ljZXMzMih2b2lkKQogewotICAgIGZwcmludGYoc3RkZXJyLCAiU3luY0FsbFZvaWNlczMyKClcbiIpOworICAgIEZJWE1FKHNvdW5kLCAiKHZvaWQpOiBzdHViXG4iKTsKICAgICByZXR1cm4gMDsKIH0KIAogSU5UMTYgV0lOQVBJIENvdW50Vm9pY2VOb3RlczE2KElOVDE2IHgpCiB7Ci0gICAgZnByaW50ZihzdGRlcnIsICJDb3VudFZvaWNlTm90ZXMxNiglZClcbiIsIHgpOworICAgIEZJWE1FKHNvdW5kLCAiKCVkKTogc3R1YlxuIiwgeCk7CiAgICAgcmV0dXJuIDA7CiB9CiAKIERXT1JEIFdJTkFQSSBDb3VudFZvaWNlTm90ZXMzMihEV09SRCB4KQogewotICAgIGZwcmludGYoc3RkZXJyLCAiQ291bnRWb2ljZU5vdGVzMzIoJWxkKVxuIiwgeCk7CisgICAgRklYTUUoc291bmQsICIoJWxkKTogc3R1YlxuIiwgeCk7CiAgICAgcmV0dXJuIDA7CiB9CiAKIExQSU5UMTYgV0lOQVBJIEdldFRocmVzaG9sZEV2ZW50MTYodm9pZCkKIHsKLSAgICBmcHJpbnRmKHN0ZGVyciwgIkdldFRocmVzaG9sZEV2ZW50MTYoKVxuIik7CisgICAgRklYTUUoc291bmQsICIodm9pZCk6IHN0dWJcbiIpOwogICAgIHJldHVybiBOVUxMOwogfQogCiBMUERXT1JEIFdJTkFQSSBHZXRUaHJlc2hvbGRFdmVudDMyKHZvaWQpCiB7Ci0gICAgZnByaW50ZihzdGRlcnIsICJHZXRUaHJlc2hvbGRFdmVudDMyKClcbiIpOworICAgIEZJWE1FKHNvdW5kLCAiKHZvaWQpOiBzdHViXG4iKTsKICAgICByZXR1cm4gTlVMTDsKIH0KIAogSU5UMTYgV0lOQVBJIEdldFRocmVzaG9sZFN0YXR1czE2KHZvaWQpCiB7Ci0gICAgZnByaW50ZihzdGRlcnIsICJHZXRUaHJlc2hvbGRTdGF0dXMxNigpXG4iKTsKKyAgICBGSVhNRShzb3VuZCwgIih2b2lkKTogc3R1YlxuIik7CiAgICAgcmV0dXJuIDA7CiB9CiAKIERXT1JEIFdJTkFQSSBHZXRUaHJlc2hvbGRTdGF0dXMzMih2b2lkKQogewotICAgIGZwcmludGYoc3RkZXJyLCAiR2V0VGhyZXNob2xkU3RhdHVzMzIoKVxuIik7CisgICAgRklYTUUoc291bmQsICIodm9pZCk6IHN0dWJcbiIpOwogICAgIHJldHVybiAwOwogfQogCiBJTlQxNiBXSU5BUEkgU2V0Vm9pY2VUaHJlc2hvbGQxNihJTlQxNiBhLCBJTlQxNiBiKQogewotCWZwcmludGYoc3RkZXJyLCAiU2V0Vm9pY2VUaHJlc2hvbGQxNiglZCwlZClcbiIsIGEsIGIpOwotICAgICAgICByZXR1cm4gMDsKKyAgICBGSVhNRShzb3VuZCwgIiglZCwlZCk6IHN0dWJcbiIsIGEsIGIpOworICAgIHJldHVybiAwOwogfQogCiBEV09SRCBXSU5BUEkgU2V0Vm9pY2VUaHJlc2hvbGQzMihEV09SRCBhLCBEV09SRCBiKQogewotICAgIGZwcmludGYoc3RkZXJyLCAiU2V0Vm9pY2VUaHJlc2hvbGQzMiglbGQsJWxkKVxuIiwgYSwgYik7CisgICAgRklYTUUoc291bmQsICIoJWxkLCVsZCk6IHN0dWJcbiIsIGEsIGIpOwogICAgIHJldHVybiAwOwogfQogCiB2b2lkIFdJTkFQSSBEb0JlZXAodm9pZCkKIHsKLQlmcHJpbnRmKHN0ZGVyciwgIkJFRVAhXG4iKTsKKyAgICBGSVhNRShzb3VuZCwgIih2b2lkKTogc3R1YiFcbiIpOwogfQorCisKKworCmRpZmYgLS1naXQgYS9taXNjL3ZlcnNpb24uYyBiL21pc2MvdmVyc2lvbi5jCmluZGV4IDk3MWU3NTguLjc3Yzc5ODYgMTAwNjQ0Ci0tLSBhL21pc2MvdmVyc2lvbi5jCisrKyBiL21pc2MvdmVyc2lvbi5jCkBAIC0xMSw2ICsxMSw3IEBACiAjaW5jbHVkZSAid2luYmFzZS5oIgogI2luY2x1ZGUgInByb2Nlc3MuaCIKICNpbmNsdWRlICJvcHRpb25zLmgiCisjaW5jbHVkZSAiZGVidWcuaCIKIAogdHlwZWRlZiBlbnVtCiB7CkBAIC05OCwxMSArOTksMTEgQEAKICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgfQogICAgIH0KLSAgICBmcHJpbnRmKCBzdGRlcnIsICJJbnZhbGlkIHdpbnZlciB2YWx1ZSAnJXMnIHNwZWNpZmllZC5cbiIsIGFyZyApOwotICAgIGZwcmludGYoIHN0ZGVyciwgIlZhbGlkIHZlcnNpb25zIGFyZToiICk7CisgICAgTVNHKCJJbnZhbGlkIHdpbnZlciB2YWx1ZSAnJXMnIHNwZWNpZmllZC5cbiIsIGFyZyApOworICAgIE1TRygiVmFsaWQgdmVyc2lvbnMgYXJlOiIgKTsKICAgICBmb3IgKGkgPSAwOyBpIDwgTkJfVkVSU0lPTlM7IGkrKykKLSAgICAgICAgZnByaW50Ziggc3RkZXJyLCAiICclcyclYyIsIFZlcnNpb25OYW1lc1tpXSwKLSAgICAgICAgICAgICAgICAgKGkgPT0gTkJfVkVSU0lPTlMgLSAxKSA/ICdcbicgOiAnLCcgKTsKKyAgICAgICAgTVNHKCIgJyVzJyVjIiwgVmVyc2lvbk5hbWVzW2ldLAorCSAgICAoaSA9PSBOQl9WRVJTSU9OUyAtIDEpID8gJ1xuJyA6ICcsJyApOwogfQogCiAKQEAgLTEzNCw5ICsxMzUsOSBAQAogICAgICAgICAvKiBOVCAzLjUxICovCiAgICAgICAgIGlmIChwZWhlYWRlci0+T3B0aW9uYWxIZWFkZXIuTWlub3JTdWJzeXN0ZW1WZXJzaW9uID09IDUxKSByZXR1cm4gTlQzNTE7CiAgICAgfQotICAgIGZwcmludGYoc3RkZXJyLCJWRVJTSU9OX0dldFZlcnNpb246IHVua25vd24gc3Vic3lzdGVtIHZlcnNpb246ICUwNHguJTA0eCwgcGxlYXNlIHJlcG9ydC5cbiIsCi0gICAgICAgICAgICBwZWhlYWRlci0+T3B0aW9uYWxIZWFkZXIuTWFqb3JTdWJzeXN0ZW1WZXJzaW9uLAotICAgICAgICAgICAgcGVoZWFkZXItPk9wdGlvbmFsSGVhZGVyLk1pbm9yU3Vic3lzdGVtVmVyc2lvbiApOworICAgIEVSUih2ZXIsInVua25vd24gc3Vic3lzdGVtIHZlcnNpb246ICUwNHguJTA0eCwgcGxlYXNlIHJlcG9ydC5cbiIsCisJcGVoZWFkZXItPk9wdGlvbmFsSGVhZGVyLk1ham9yU3Vic3lzdGVtVmVyc2lvbiwKKwlwZWhlYWRlci0+T3B0aW9uYWxIZWFkZXIuTWlub3JTdWJzeXN0ZW1WZXJzaW9uICk7CiAgICAgcmV0dXJuIGRlZmF1bHRWZXJzaW9uOwogfQogCkBAIC0xNjksNyArMTcwLDcgQEAKICAgICBWRVJTSU9OIHZlciA9IFZFUlNJT05fR2V0VmVyc2lvbigpOwogICAgIGlmICh2LT5kd09TVmVyc2lvbkluZm9TaXplICE9IHNpemVvZihPU1ZFUlNJT05JTkZPMzJBKSkKICAgICB7Ci0gICAgICAgIGZwcmludGYoc3RkZXJyLCJ3cm9uZyBPU1ZFUlNJT05JTkZPIHNpemUgZnJvbSBhcHAiKTsKKyAgICAgICAgV0FSTih2ZXIsIndyb25nIE9TVkVSU0lPTklORk8gc2l6ZSBmcm9tIGFwcCIpOwogICAgICAgICByZXR1cm4gRkFMU0U7CiAgICAgfQogICAgIHYtPmR3TWFqb3JWZXJzaW9uID0gVmVyc2lvbkRhdGFbdmVyXS5nZXRWZXJzaW9uRXguZHdNYWpvclZlcnNpb247CkBAIC0xODksNyArMTkwLDcgQEAKICAgICBWRVJTSU9OIHZlciA9IFZFUlNJT05fR2V0VmVyc2lvbigpOwogICAgIGlmICh2LT5kd09TVmVyc2lvbkluZm9TaXplIT1zaXplb2YoT1NWRVJTSU9OSU5GTzMyVykpCiAgICAgewotICAgICAgICBmcHJpbnRmKHN0ZGVyciwid3JvbmcgT1NWRVJTSU9OSU5GTyBzaXplIGZyb20gYXBwIik7CisgICAgICAgIFdBUk4odmVyLCJ3cm9uZyBPU1ZFUlNJT05JTkZPIHNpemUgZnJvbSBhcHAiKTsKICAgICAgICAgcmV0dXJuIEZBTFNFOwogICAgIH0KICAgICB2LT5kd01ham9yVmVyc2lvbiA9IFZlcnNpb25EYXRhW3Zlcl0uZ2V0VmVyc2lvbkV4LmR3TWFqb3JWZXJzaW9uOwpAQCAtMjI4LDcgKzIyOSw3IEBACiAgICAgICBicmVhazsKIAogICBkZWZhdWx0OgotICAgICAgZnByaW50ZihzdGRlcnIsICJVbmtub3duIG1vZGUgc2V0PyBUaGlzIHNob3VsZG4ndCBoYXBwZW4uIENoZWNrIEdldFdpbkZsYWdzKCkhXG4iKTsKKyAgICAgIEVSUih2ZXIsICJVbmtub3duIG1vZGUgc2V0PyBUaGlzIHNob3VsZG4ndCBoYXBwZW4uIENoZWNrIEdldFdpbkZsYWdzKCkhXG4iKTsKICAgICAgIGJyZWFrOwogICB9CiAgIGlmIChzaS53UHJvY2Vzc29yTGV2ZWwgPj0gNCkgcmVzdWx0IHw9IFdGX0hBU0NQVUlEOwpAQCAtMjQ1LDggKzI0Niw4IEBACiAgKi8KIEJPT0wxNiBXSU5BUEkgR2V0V2luRGVidWdJbmZvKFdJTkRFQlVHSU5GTyAqbHB3ZGksIFVJTlQxNiBmbGFncykKIHsKLSAgICBwcmludGYoIkdldFdpbkRlYnVnSW5mbyglOGx4LCVkKSBzdHViIHJldHVybmluZyAwXG4iLAotICAgICAgICAgICAodW5zaWduZWQgbG9uZylscHdkaSwgZmxhZ3MpOworICAgIEZJWE1FKHZlciwgIiglOGx4LCVkKTogc3R1YiByZXR1cm5pbmcgMFxuIiwKKwkgICh1bnNpZ25lZCBsb25nKWxwd2RpLCBmbGFncyk7CiAgICAgLyogMCBtZWFucyBub3QgaW4gZGVidWdnaW5nIG1vZGUvdmVyc2lvbiAqLwogICAgIC8qIENhbiB0aGlzIHR5cGUgb2YgZGVidWdnaW5nIGJlIHVzZWQgaW4gd2luZSA/ICovCiAgICAgLyogQ29uc3RhbnRzOiBXRElfT1BUSU9OUyBXRElfRklMVEVSIFdESV9BTExPQ0JSRUFLICovCkBAIC0yNTksNyArMjYwLDcgQEAKICAqLwogQk9PTDE2IFdJTkFQSSBTZXRXaW5EZWJ1Z0luZm8oV0lOREVCVUdJTkZPICpscHdkaSkKIHsKLSAgICBwcmludGYoIlNldFdpbkRlYnVnSW5mbyglOGx4KSBzdHViIHJldHVybmluZyAwXG4iLCAodW5zaWduZWQgbG9uZylscHdkaSk7CisgICAgRklYTUUodmVyLCAiKCU4bHgpOiBzdHViIHJldHVybmluZyAwXG4iLCAodW5zaWduZWQgbG9uZylscHdkaSk7CiAgICAgLyogMCBtZWFucyBub3QgaW4gZGVidWdnaW5nIG1vZGUvdmVyc2lvbiAqLwogICAgIC8qIENhbiB0aGlzIHR5cGUgb2YgZGVidWdnaW5nIGJlIHVzZWQgaW4gd2luZSA/ICovCiAgICAgLyogQ29uc3RhbnRzOiBXRElfT1BUSU9OUyBXRElfRklMVEVSIFdESV9BTExPQ0JSRUFLICovCkBAIC0yOTYsNSArMjk3LDYgQEAKICAqLwogdm9pZCBXSU5BUEkgRGlhZ091dHB1dChMUENTVFIgc3RyKQogewotCWZwcmludGYoc3RkZXJyLCJESUFHT1VUUFVUOiVzXG4iLHN0cik7CisgICAgICAgIC8qIEZJWE1FICovCisJRFBSSU5URigiRElBR09VVFBVVDolc1xuIixzdHIpOwogfQpkaWZmIC0tZ2l0IGEvbWlzYy93MzJzeXMuYyBiL21pc2MvdzMyc3lzLmMKaW5kZXggNDI3YjQ3ZS4uZmJmMzk0MCAxMDA2NDQKLS0tIGEvbWlzYy93MzJzeXMuYworKysgYi9taXNjL3czMnN5cy5jCkBAIC04LDEyICs4LDE0IEBACiAjaW5jbHVkZSAid2luZG93cy5oIgogI2luY2x1ZGUgInczMnN5cy5oIgogCi0KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICogICAgICAgICAgIEdldFdpbjMyc0luZm8gICAoVzMyU1lTLjEyKQorICogUkVUVVJOUworICogIDAgb24gc3VjY2VzcywgMSBvbiBmYWlsdXJlCiAgKi8KLVdPUkQgV0lOQVBJIEdldFdpbjMyc0luZm8oIExQV0lOMzJTSU5GTyBscEluZm8pCi17CitXT1JEIFdJTkFQSSBHZXRXaW4zMnNJbmZvKAorCUxQV0lOMzJTSU5GTyBscEluZm8JLyogW291dF0gV2luMzJTIHNwZWNpYWwgaW5mb3JtYXRpb24gKi8KKykgewogICAgIGxwSW5mby0+Yk1ham9yID0gMTsKICAgICBscEluZm8tPmJNaW5vciA9IDM7CiAgICAgbHBJbmZvLT53QnVpbGROdW1iZXIgPSAwOwpAQCAtMjEsMyArMjMsMTUgQEAKIAogICAgIHJldHVybiAwOwogfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqICAgICAgICAgICBHZXRQRVJlc291cmNlVGFibGUgICAoVzMyU1lTLjcpCisgKiByZXRyaWV2ZXMgdGhlIHJlc291cmNldGFibGUgZnJvbSB0aGUgcGFzc2VkIGZpbGVkZXNjcmlwdG9yCisgKiBSRVRVUk5TCisgKglkdW5ubyB3aGF0LgorICovCitXT1JEIFdJTkFQSSBHZXRQRVJlc291cmNlVGFibGUoCisJSEZJTEUxNiBoZgkJLyogW2luXSBmaWxlZGVzY3JpcHRvciB0byBvcGVuZWQgZXhlY3V0ZWFibGUgKi8KKykgeworCXJldHVybiAwOworfQpkaWZmIC0tZ2l0IGEvbWlzYy93aW5kZWJ1Zy5jIGIvbWlzYy93aW5kZWJ1Zy5jCmluZGV4IDNmMTdmOWIuLjllNTRkZmMgMTAwNjQ0Ci0tLSBhL21pc2Mvd2luZGVidWcuYworKysgYi9taXNjL3dpbmRlYnVnLmMKQEAgLTExLDcgKzExLDcgQEAKICNpbmNsdWRlICJtb2R1bGUuaCIKIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiAgICAgICAgICAgV2luTm90aWZ5ICAgICAgIChXSU5ERUJVRy4xKQorICogICAgICAgICAgIFdpbk5vdGlmeSAgICAgICAoV0lOREVCVUcuMykKICAqICB3cml0dGVuIHdpdGhvdXQgX2FueV8gZG9jdQogICovCiB2b2lkIFdpbk5vdGlmeShDT05URVhUICpjb250ZXh0KQpkaWZmIC0tZ2l0IGEvbWlzYy93aW5zb2NrLmMgYi9taXNjL3dpbnNvY2suYwppbmRleCBlYzc4YjRiLi45ZjlmZGNmIDEwMDY0NAotLS0gYS9taXNjL3dpbnNvY2suYworKysgYi9taXNjL3dpbnNvY2suYwpAQCAtMTcwNCw3ICsxNzA0LDcgQEAKIAogICBpZiggcHdzaSApCiAgICAgcmV0dXJuIF9fV1NBc3luY0RCUXVlcnkocHdzaSwgaFduZCwgdU1zZywgdHlwZSwgYWRkciwgbGVuLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwsICh2b2lkKilzYnVmLCBidWZsZW4sIFdTTVNHX0FTWU5DX0hPU1RCWUFERFIgfCBXU01TR19BU1lOQ19XSU4zMik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCwgKHZvaWQqKXNidWYsIGJ1ZmxlbiwgV1NNU0dfQVNZTkNfSE9TVEJZQUREUiB8IFdTTVNHX1dJTjMyX0FPUCk7CiAgIHJldHVybiAwOwogfQogCkBAIC0xNzM4LDcgKzE3MzgsNyBAQAogCSAgICAgICAobmFtZSk/bmFtZTpOVUxMX1NUUklORywgKGludClidWZsZW4gKTsKICAgaWYoIHB3c2kgKQogICAgIHJldHVybiBfX1dTQXN5bmNEQlF1ZXJ5KHB3c2ksIGhXbmQsIHVNc2csIDAsIG5hbWUsIDAsCi0gCQkJICAgIE5VTEwsICh2b2lkKilzYnVmLCBidWZsZW4sIFdTTVNHX0FTWU5DX0hPU1RCWU5BTUUgfCBXU01TR19BU1lOQ19XSU4zMik7CisgCQkJICAgIE5VTEwsICh2b2lkKilzYnVmLCBidWZsZW4sIFdTTVNHX0FTWU5DX0hPU1RCWU5BTUUgfCBXU01TR19XSU4zMl9BT1ApOwogICByZXR1cm4gMDsKIH0gICAgICAgICAgICAgICAgICAgICAKIApAQCAtMTc3Myw3ICsxNzczLDcgQEAKIAogICBpZiggcHdzaSApCiAgICAgcmV0dXJuIF9fV1NBc3luY0RCUXVlcnkocHdzaSwgaFduZCwgdU1zZywgMCwgbmFtZSwgMCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMLCAodm9pZCopc2J1ZiwgYnVmbGVuLCBXU01TR19BU1lOQ19QUk9UT0JZTkFNRSB8IFdTTVNHX0FTWU5DX1dJTjMyKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMLCAodm9pZCopc2J1ZiwgYnVmbGVuLCBXU01TR19BU1lOQ19QUk9UT0JZTkFNRSB8IFdTTVNHX1dJTjMyX0FPUCk7CiAgIHJldHVybiAwOwogfQogCkBAIC0xODA4LDcgKzE4MDgsNyBAQAogCiAgIGlmKCBwd3NpICkKICAgICByZXR1cm4gX19XU0FzeW5jREJRdWVyeShwd3NpLCBoV25kLCB1TXNnLCBudW1iZXIsIE5VTEwsIDAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCwgKHZvaWQqKXNidWYsIGJ1ZmxlbiwgV1NNU0dfQVNZTkNfUFJPVE9CWU5VTSB8IFdTTVNHX0FTWU5DX1dJTjMyKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMLCAodm9pZCopc2J1ZiwgYnVmbGVuLCBXU01TR19BU1lOQ19QUk9UT0JZTlVNIHwgV1NNU0dfV0lOMzJfQU9QKTsKICAgcmV0dXJuIDA7CiB9CiAKQEAgLTE4NTMsNyArMTg1Myw3IEBACiAKICAgICAgIGlmKCBpICkKICAgICAgICAgICByZXR1cm4gX19XU0FzeW5jREJRdWVyeShwd3NpLCBoV25kLCB1TXNnLCAwLCBwd3NpLT5idWZmZXIsIDAsCi0gICAgICAgICAgICAgICAgIHB3c2ktPmJ1ZmZlciArIGksICh2b2lkKilzYnVmLCBidWZsZW4sIFdTTVNHX0FTWU5DX1NFUlZCWU5BTUUgfCBXU01TR19BU1lOQ19XSU4zMik7CisgICAgICAgICAgICAgICAgIHB3c2ktPmJ1ZmZlciArIGksICh2b2lkKilzYnVmLCBidWZsZW4sIFdTTVNHX0FTWU5DX1NFUlZCWU5BTUUgfCBXU01TR19XSU4zMl9BT1ApOwogICB9CiAgIHJldHVybiAwOwogfQpAQCAtMTg5OCw3ICsxODk4LDcgQEAKIAogICAgICAgaWYoIGkgKQogCSAgcmV0dXJuIF9fV1NBc3luY0RCUXVlcnkocHdzaSwgaFduZCwgdU1zZywgcG9ydCwgcHdzaS0+YnVmZmVyLCAwLAotCQkgTlVMTCwgKHZvaWQqKXNidWYsIGJ1ZmxlbiwgV1NNU0dfQVNZTkNfU0VSVkJZUE9SVCB8IFdTTVNHX0FTWU5DX1dJTjMyKTsKKwkJIE5VTEwsICh2b2lkKilzYnVmLCBidWZsZW4sIFdTTVNHX0FTWU5DX1NFUlZCWVBPUlQgfCBXU01TR19XSU4zMl9BT1ApOwogICB9CiAgIHJldHVybiAwOwogfQpAQCAtMjM3NywxMyArMjM3NywxMiBAQAogICAgICAgY2hhciB0eXBlPSAqKHVuc2lnbmVkIGNoYXIqKShpbmJ1ZisxNSk7IC8qIDB4MjogZG9uJ3QgZnJhZ21lbnQqLwogI2VuZGlmICAgICAgCiAgICAgICAKLSAgICAgIGZwcmludGYoc3RkbmltcCwiV3NDb250cm9sKElDTVBfRUNITykgdG8gMHglMDh4IHN0dWIgXG4iLAotCSAgICAgIGFkZHIpOworICAgICAgRklYTUUod2luc29jaywiKElDTVBfRUNITykgdG8gMHglMDh4IHN0dWIgXG4iLCBhZGRyKTsKICAgICAgIGJyZWFrOwogICAgIH0KICAgZGVmYXVsdDoKLSAgICBmcHJpbnRmKHN0ZG5pbXAsIldzQ29udHJvbCglbHgsJWx4LCVwLCVwLCVwLCVwKSBzdHViXG4iLAotCSAgICBwcm90b2NvbGwsYWN0aW9uLGluYnVmLGluYnVmbGVuLG91dGJ1ZixvdXRidWZsZW4pOworICAgIEZJWE1FKHdpbnNvY2ssIiglbHgsJWx4LCVwLCVwLCVwLCVwKSBzdHViXG4iLAorCSAgcHJvdG9jb2xsLGFjdGlvbixpbmJ1ZixpbmJ1ZmxlbixvdXRidWYsb3V0YnVmbGVuKTsKICAgfQogICByZXR1cm4gRkFMU0U7CiB9CkBAIC0yMzkyLDggKzIzOTEsOCBAQAogICovCiB2b2lkIFdJTkFQSSBXU19zX3BlcnJvcihMUENTVFIgbWVzc2FnZSkKIHsKLSAgICBmcHJpbnRmKHN0ZG5pbXAsInNfcGVycm9yICVzIHN0dWJcbiIsbWVzc2FnZSk7Ci0JcmV0dXJuOworICAgIEZJWE1FKHdpbnNvY2ssIiglcyk6IHN0dWJcbiIsbWVzc2FnZSk7CisgICAgcmV0dXJuOwogfQogCiAKQEAgLTI2MDcsNiArMjYwNiw3IEBACiAJY2FzZSBFTkVUVU5SRUFDSDoJcmV0dXJuIFdTQUVORVRVTlJFQUNIOwogCWNhc2UgRU5FVFJFU0VUOgkJcmV0dXJuIFdTQUVORVRSRVNFVDsKIAljYXNlIEVDT05OQUJPUlRFRDoJcmV0dXJuIFdTQUVDT05OQUJPUlRFRDsKKwljYXNlIEVQSVBFOgogCWNhc2UgRUNPTk5SRVNFVDoJcmV0dXJuIFdTQUVDT05OUkVTRVQ7CiAJY2FzZSBFTk9CVUZTOgkJcmV0dXJuIFdTQUVOT0JVRlM7CiAJY2FzZSBFSVNDT05OOgkJcmV0dXJuIFdTQUVJU0NPTk47CmRpZmYgLS1naXQgYS9taXNjL3dpbnNvY2tfZG5zLmMgYi9taXNjL3dpbnNvY2tfZG5zLmMKaW5kZXggYjAwYjRlZi4uOGE0MmE3OSAxMDA2NDQKLS0tIGEvbWlzYy93aW5zb2NrX2Rucy5jCisrKyBiL21pc2Mvd2luc29ja19kbnMuYwpAQCAtNDMsOCArNDMsNiBAQAogI2RlZmluZSBGQVNZTkMgRklPQVNZTkMKICNlbmRpZgogCi0jZGVmaW5lIF9fV1NfQVNZTkNfREVCVUcJMAotCiB0eXBlZGVmIHN0cnVjdCAgICAgICAgICAvKiBhc3luYyBETlMgb3AgY29udHJvbCBzdHJ1Y3QgKi8KIHsKICAgd3NfYXN5bmNfb3AqICB3c19hb3A7CkBAIC0xMzUsNyArMTMzLDcgQEAKIHsKICAgICAvKiBTSUdJTyBzYWZlLCBoVGFzayA9PSAwIGNhbmNlbHMgYWxsIG91dHN0YW5kaW5nIGFzeW5jIG9wcyAqLwogCi0gICAgaW50IG51bSA9IDA7CisgICAgaW50IG51bSA9IDAsIG51bV9kZWFkID0gMDsKICAgICB3c19hc3luY19vcCogICBwLCAqbmV4dDsKIAogICAgIFRSQUNFKHdpbnNvY2ssIiBjYW5jZWxsaW5nIGFzeW5jIEROUyByZXF1ZXN0cy4uLiBcbiIpOwpAQCAtMTQ5LDEzICsxNDcsMTYgQEAKIAluZXh0ID0gcC0+bmV4dDsKIAlpZighaFRhc2sgfHwgIWhXbmRUYXNrIHx8IChoVGFzayA9PSBoV25kVGFzaykpCiAJeworCSAgICBudW0rKzsKKwkgICAgaWYoIHAtPmZsYWdzICYgV1NNU0dfREVBRF9BT1AgKQorCQludW1fZGVhZCsrOworCiAJICAgIFdJTlNPQ0tfY2FuY2VsX2FzeW5jX29wKHApOwogCSAgICBpZiggX19vcGZyZWUgKSBfX29wZnJlZShwKTsKLQkgICAgbnVtKys7CiAJfQogICAgIH0KICAgICBTSUdOQUxfTWFza0FzeW5jRXZlbnRzKCBGQUxTRSApOwotICAgIFRSQUNFKHdpbnNvY2ssIiAtPiAlaSB0b3RhbFxuIiwgbnVtICk7CisgICAgVFJBQ0Uod2luc29jaywiIC0+ICVpIHRvdGFsICglaSBhY3RpdmUpXG4iLCBudW0sIG51bSAtIG51bV9kZWFkICk7CiB9CiAKIHZvaWQgV0lOU09DS19saW5rX2FzeW5jX29wKHdzX2FzeW5jX29wKiBwX2FvcCkKQEAgLTI3OCwxMSArMjc5LDExIEBACiAgICAgewogCWlmKCAoaW50KUxPV09SRChsTGVuZ3RoKSA8PSBwX2FvcC0+YnVmbGVuICkKIAl7Ci0gICAgICAgICAgICBjaGFyKiBidWZmZXIgPSAocF9hb3AtPmZsYWdzICYgV1NNU0dfQVNZTkNfV0lOMzIpCisgICAgICAgICAgICBjaGFyKiBidWZmZXIgPSAocF9hb3AtPmZsYWdzICYgV1NNU0dfV0lOMzJfQU9QKQogCQkgID8gcF9hb3AtPmIubGluX2Jhc2UgOiAoY2hhciopUFRSX1NFR19UT19MSU4ocF9hb3AtPmIuc2VnX2Jhc2UpOwogCiAgICAgICAgICAgICByZWFkKHBfYW9wLT5mZFswXSwgYnVmZmVyLCBMT1dPUkQobExlbmd0aCkpOwotICAgICAgICAgICAgc3dpdGNoKCBwX2FvcC0+ZmxhZ3MgKQorICAgICAgICAgICAgc3dpdGNoKCBwX2FvcC0+ZmxhZ3MgJiBXU01TR19BU1lOQ19SUU1BU0sgKQogICAgICAgICAgICAgewogCQljYXNlIFdTTVNHX0FTWU5DX0hPU1RCWU5BTUU6CiAJCWNhc2UgV1NNU0dfQVNZTkNfSE9TVEJZQUREUjoKQEAgLTMwMSwxMCArMzAyLDEwIEBACiAgICAgICAgIGVsc2UgbExlbmd0aCA9ICAoKFVJTlQzMilMT1dPUkQobExlbmd0aCkpIHwgKCh1bnNpZ25lZClXU0FFTk9CVUZTIDw8IDE2KTsKICAgICB9IC8qIGZhaWx1cmUgKi8KIAotI2lmIF9fV1NfQVNZTkNfREVCVUcKLSAgICBwcmludGYoIkROUyBhb3AgY29tcGxldGVkOiBoV25kIFslMDR4XSwgdU1zZyBbJTA0eF0sIGFvcCBbJTA0eF0sIGV2ZW50IFslMDh4XVxuIiwKLSAgICAgICAgIHBfYW9wLT5oV25kLCBwX2FvcC0+dU1zZywgX193c19nZXRoYW5kbGUocF9hb3ApLCAoTFBBUkFNKWxMZW5ndGgpOwotI2VuZGlmCisgICAgIC8qIHdhcyBhIF9fV1NfQVNZTkNfREVCVUcgc3RhdGVtZW50ICovCisgICAgIFRSQUNFKHdpbnNvY2ssICJETlMgYW9wIGNvbXBsZXRlZDogaFduZCBbJTA0eF0sIHVNc2cgWyUwNHhdLCAiCisgCSAgImFvcCBbJTA0eF0sIGV2ZW50IFslMDhseF1cbiIsCisgCSAgcF9hb3AtPmhXbmQsIHBfYW9wLT51TXNnLCBfX3dzX2dldGhhbmRsZShwX2FvcCksIChMUEFSQU0pbExlbmd0aCk7CiAKICAgICAvKiBGSVhNRTogdXBkYXRlIG51bV9hc3luY19ycSAqLwogICAgIEVWRU5UX0RlbGV0ZUlPKCBwX2FvcC0+ZmRbMF0sIEVWRU5UX0lPX1JFQUQgKTsKQEAgLTM2Niw3ICszNjcsNyBAQAogCQkvKiBjaGlsZCBwcm9jZXNzICovCiAKIAkJY2xvc2UoYXN5bmNfY3RsLndzX2FvcC0+ZmRbMF0pOyAgLyogcmVhZCBlbmRwb2ludCAqLwotCQlzd2l0Y2goIGZsYWcgKQorCQlzd2l0Y2goIGZsYWcgJiBXU01TR19BU1lOQ19SUU1BU0sgKQogCQl7CiAJCSAgICBjYXNlIFdTTVNHX0FTWU5DX0hPU1RCWUFERFI6CiAJCSAgICBjYXNlIFdTTVNHX0FTWU5DX0hPU1RCWU5BTUU6CkBAIC00MDMsOSArNDA0LDkgQEAKICAgICBraWxsKGdldHBwaWQoKSwgU0lHSU8pOyAgICAvKiBzaW11bGF0ZSBhc3luYyBJL08gKi8KICNlbmRpZgogCi0jaWYgX19XU19BU1lOQ19ERUJVRwotICAgIHByaW50ZigiaGFuZGxlciAtIG5vdGlmeSBhb3AgWyVkLCBidWYgJWRdXG4iLCBhc3luY19jdGwuaWxlbmd0aCwgYXN5bmNfY3RsLndzX2FvcC0+YnVmbGVuKTsKLSNlbmRpZgorICAgIC8qIHdhcyBhIF9fV1NfQVNZTkNfREVCVUcgc3RhdGVtZW50ICovCisgICAgVFJBQ0Uod2luc29jaywgImhhbmRsZXIgLSBub3RpZnkgYW9wIFslZCwgYnVmICVkXVxuIiwgCisJICBhc3luY19jdGwuaWxlbmd0aCwgYXN5bmNfY3RsLndzX2FvcC0+YnVmbGVuKTsKICAgICByZXR1cm4gMTsKIH0KIApAQCAtNDIxLDkgKzQyMiw5IEBACiAgICAgIGtpbGwoZ2V0cHBpZCgpLCBTSUdJTyk7ICAgIC8qIHNpbXVsYXRlIGFzeW5jIEkvTyAqLwogI2VuZGlmCiAKLSNpZiBfX1dTX0FTWU5DX0RFQlVHCi0gICAgcHJpbnRmKCJoYW5kbGVyIC0gZmFpbGVkIGFvcCBbJWQsIGJ1ZiAlZF1cbiIsIGFzeW5jX2N0bC5pbGVuZ3RoLCBhc3luY19jdGwud3NfYW9wLT5idWZsZW4pOwotI2VuZGlmCisgICAgLyogd2FzIGEgX19XU19BU1lOQ19ERUJVRyBzdGF0ZW1lbnQgKi8KKyAgICBUUkFDRSh3aW5zb2NrLCAiaGFuZGxlciAtIGZhaWxlZCBhb3AgWyVkLCBidWYgJWRdXG4iLCAKKwkgIGFzeW5jX2N0bC5pbGVuZ3RoLCBhc3luY19jdGwud3NfYW9wLT5idWZsZW4pOwogfQogCiB2b2lkIGR1bXBfd3NfaG9zdGVudF9vZmZzZXQoc3RydWN0IHdzX2hvc3RlbnQqIHdzaGUpCkBAIC00MzIsMTYgKzQzMywxNiBAQAogICBjaGFyKgkJYmFzZSA9IChjaGFyKil3c2hlOwogICB1bnNpZ25lZCoJcHRyOwogCi0gIHByaW50ZigiaF9uYW1lID0gJTA4eFx0WyVzXVxuIiwgKHVuc2lnbmVkKXdzaGUtPmhfbmFtZSwgYmFzZSArICh1bnNpZ25lZCl3c2hlLT5oX25hbWUpOwotICBwcmludGYoImhfYWxpYXNlcyA9ICUwOHhcdFslMDh4XVxuIiwgKHVuc2lnbmVkKXdzaGUtPmhfYWxpYXNlcywgCi0JCQkJICAgICAgICh1bnNpZ25lZCkoYmFzZSArICh1bnNpZ25lZCl3c2hlLT5oX2FsaWFzZXMpKTsKKyAgRFVNUCgiaF9uYW1lID0gJTA4eFx0WyVzXVxuIiwgCisgICAgICAgKHVuc2lnbmVkKXdzaGUtPmhfbmFtZSwgYmFzZSArICh1bnNpZ25lZCl3c2hlLT5oX25hbWUpOworICBEVU1QKCJoX2FsaWFzZXMgPSAlMDh4XHRbJTA4eF1cbiIsIAorICAgICAgICh1bnNpZ25lZCl3c2hlLT5oX2FsaWFzZXMsICh1bnNpZ25lZCkoYmFzZSsodW5zaWduZWQpd3NoZS0+aF9hbGlhc2VzKSk7CiAgIHB0ciA9ICh1bnNpZ25lZCopKGJhc2UgKyAodW5zaWduZWQpd3NoZS0+aF9hbGlhc2VzKTsKICAgZm9yKGkgPSAwOyBwdHJbaV07IGkrKyApCiAgIHsKLQlwcmludGYoIiVpIC0gJTA4eCAiLCBpICsgMSwgcHRyW2ldKTsKLQlwcmludGYoIiBbJXNdXG4iLCAoKGNoYXIqKWJhc2UpICsgcHRyW2ldKTsKKwlEVU1QKCIlaSAtICUwOHggWyVzXVxuIiwgaSArIDEsIHB0cltpXSwgKChjaGFyKiliYXNlKSArIHB0cltpXSk7CiAgIH0KLSAgcHJpbnRmKCJoX2xlbmd0aCA9ICVpXG4iLCB3c2hlLT5oX2xlbmd0aCk7CisgIERVTVAoImhfbGVuZ3RoID0gJWlcbiIsIHdzaGUtPmhfbGVuZ3RoKTsKIH0KIAogdm9pZCBXU19kb19hc3luY19nZXRob3N0KExQV1NJTkZPIHB3c2ksIHVuc2lnbmVkIGZsYWcgKQpAQCAtNDYwLDcgKzQ2MSw3IEBACiAKICAgaWYoIHBfaGUgKSAvKiBjb252ZXJ0IHRvIHRoZSBXaW5zb2NrIGZvcm1hdCB3aXRoIGludGVybmFsIHBvaW50ZXJzIGFzIG9mZnNldHMgKi8KICAgICAgIHNpemUgPSBXU19kdXBfaGUocHdzaSwgcF9oZSwgV1NfRFVQX09GRlNFVCB8IAotCQkgICAgICgoZmxhZyAmIFdTTVNHX0FTWU5DX1dJTjMyKSA/IFdTX0RVUF9MSU5FQVIgOiBXU19EVVBfU0VHUFRSKSApOworCQkgICAgICgoZmxhZyAmIFdTTVNHX1dJTjMyX0FPUCkgPyBXU19EVVBfTElORUFSIDogV1NfRFVQX1NFR1BUUikgKTsKICAgaWYoIHNpemUgKQogICB7CiAgICAgICBhc3luY19jdGwuYnVmZmVyID0gcHdzaS0+YnVmZmVyOwpAQCAtNDg0LDcgKzQ4NSw3IEBACiAKICAgaWYoIHBfcGUgKSAvKiBjb252ZXJ0IHRvIHRoZSBXaW5zb2NrIGZvcm1hdCB3aXRoIGludGVybmFsIHBvaW50ZXJzIGFzIG9mZnNldHMgKi8KICAgICAgIHNpemUgPSBXU19kdXBfcGUocHdzaSwgcF9wZSwgV1NfRFVQX09GRlNFVCB8Ci0JCSAgICAgKChmbGFnICYgV1NNU0dfQVNZTkNfV0lOMzIpID8gV1NfRFVQX0xJTkVBUiA6IFdTX0RVUF9TRUdQVFIpICk7CisJCSAgICAgKChmbGFnICYgV1NNU0dfV0lOMzJfQU9QKSA/IFdTX0RVUF9MSU5FQVIgOiBXU19EVVBfU0VHUFRSKSApOwogICBpZiggc2l6ZSApCiAgIHsKICAgICAgIGFzeW5jX2N0bC5idWZmZXIgPSBwd3NpLT5idWZmZXI7CkBAIC01MDYsNyArNTA3LDcgQEAKIAogICBpZiggcF9zZSApIC8qIGNvbnZlcnQgdG8gdGhlIFdpbnNvY2sgZm9ybWF0IHdpdGggaW50ZXJuYWwgcG9pbnRlcnMgYXMgb2Zmc2V0cyAqLwogICAgICAgc2l6ZSA9IFdTX2R1cF9zZShwd3NpLCBwX3NlLCBXU19EVVBfT0ZGU0VUIHwKLQkJICAgICAgKChmbGFnICYgV1NNU0dfQVNZTkNfV0lOMzIpID8gV1NfRFVQX0xJTkVBUiA6IFdTX0RVUF9TRUdQVFIpICk7CisJCSAgICAgICgoZmxhZyAmIFdTTVNHX1dJTjMyX0FPUCkgPyBXU19EVVBfTElORUFSIDogV1NfRFVQX1NFR1BUUikgKTsKICAgaWYoIHNpemUgKQogICB7CiAgICAgICBhc3luY19jdGwuYnVmZmVyID0gcHdzaS0+YnVmZmVyOwpAQCAtNTE4LDE0ICs1MTksMTQgQEAKIAogLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gaGVscGVyIGZ1bmN0aW9ucyAtCiAgKgotICogUmF3IHJlc3VsdHMgZnJvbSBwaXBlIGNvbnRhaW4gaW50ZXJuYWwgcG9pbnRlcnMgc3RvcmVkIGFzCisgKiBSYXcgcmVzdWx0cyBmcm9tIHRoZSBwaXBlIGNvbnRhaW4gaW50ZXJuYWwgcG9pbnRlcnMgc3RvcmVkIGFzCiAgKiBvZmZzZXRzIHJlbGF0aXZlIHRvIHRoZSBiZWdpbm5pbmcgb2YgdGhlIGJ1ZmZlciBhbmQgd2UgbmVlZAogICogdG8gYXBwbHkgYSBmaXh1cCBiZWZvcmUgcGFzc2luZyB0aGVtIHRvIGFwcGxpY2F0aW9ucy4KICAqCiAgKiBOT1RFOiBJdCBpcyBwb3NzaWJsZSB0byBleHBsb2l0IHRoZSBmYWN0IHRoYXQgZm9yaygpIGRvZXNuJ3QgCiAgKiBjaGFuZ2UgdGhlIGJ1ZmZlciBhZGRyZXNzIGJ5IHN0b3JpbmcgZml4ZWQgdXAgcG9pbnRlcnMgcmlnaHQgCiAgKiBpbiB0aGUgaGFuZGxlci4gSG93ZXZlciwgdGhpcyB3aWxsIGdldCBpbiB0aGUgd2F5IGlmIHdlIGV2ZXIgCi0gKiBnZXQgYXJvdW5kIHRvIGltcGxlbWVudGluZyBETlMgaGVscGVyIGRhZW1vbiBhLWxhIE5ldHNjYXBlLgorICogZ2V0IGFyb3VuZCB0byBpbXBsZW1lbnRpbmcgRE5TIGhlbHBlciBkYWVtb24gYS1sYSBOZXRzY2FwZSA0LnguCiAgKi8KIAogdm9pZCBmaXh1cF93c2hlKHN0cnVjdCB3c19ob3N0ZW50KiBwX3dzaGUsIHZvaWQqIGJhc2UpCmRpZmYgLS1naXQgYS9tc2Rvcy9kcG1pLmMgYi9tc2Rvcy9kcG1pLmMKaW5kZXggOTE0NjZjMS4uNWFlYTE1MyAxMDA2NDQKLS0tIGEvbXNkb3MvZHBtaS5jCisrKyBiL21zZG9zL2RwbWkuYwpAQCAtMjEzLDE0ICsyMTMsMTIgQEAKICAgICB9CiAKICAgICBpZiAoRUZMX3JlZyhjb250ZXh0KSYxKQotICAgICAgICBmcHJpbnRmKHN0ZG5pbXAsCi0gICAgICAgICAgICAgICAgIlJlYWxNb2RlSW50ICUwMng6IEVBWD0lMDhseCBFQlg9JTA4bHggRUNYPSUwOGx4IEVEWD0lMDhseFxuIgotICAgICAgICAgICAgICAgICIgICAgICAgICAgICAgICAgRVNJPSUwOGx4IEVEST0lMDhseCBEUz0lMDRseCBFUz0lMDRseFxuIiwKLSAgICAgICAgICAgICAgICBCTF9yZWcoY29udGV4dCksIEVBWF9yZWcoJnJlYWxtb2RlX2N0eCksCi0gICAgICAgICAgICAgICAgRUJYX3JlZygmcmVhbG1vZGVfY3R4KSwgRUNYX3JlZygmcmVhbG1vZGVfY3R4KSwKLSAgICAgICAgICAgICAgICBFRFhfcmVnKCZyZWFsbW9kZV9jdHgpLCBFU0lfcmVnKCZyZWFsbW9kZV9jdHgpLAotICAgICAgICAgICAgICAgIEVESV9yZWcoJnJlYWxtb2RlX2N0eCksIERTX3JlZygmcmVhbG1vZGVfY3R4KSwKLSAgICAgICAgICAgICAgICBFU19yZWcoJnJlYWxtb2RlX2N0eCkgKTsKKyAgICAgIEZJWE1FKGludDMxLCIlMDJ4OiBFQVg9JTA4bHggRUJYPSUwOGx4IEVDWD0lMDhseCBFRFg9JTA4bHhcbiIsCisJICAgIEJMX3JlZyhjb250ZXh0KSwgRUFYX3JlZygmcmVhbG1vZGVfY3R4KSwgRUJYX3JlZygmcmVhbG1vZGVfY3R4KSwgCisJICAgIEVDWF9yZWcoJnJlYWxtb2RlX2N0eCksIEVEWF9yZWcoJnJlYWxtb2RlX2N0eCkpOworICAgICAgRklYTUUoaW50MzEsIiAgICAgIEVTST0lMDhseCBFREk9JTA4bHggRFM9JTA0bHggRVM9JTA0bHhcbiIsCisJICAgIEVTSV9yZWcoJnJlYWxtb2RlX2N0eCksIEVESV9yZWcoJnJlYWxtb2RlX2N0eCksIAorCSAgICBEU19yZWcoJnJlYWxtb2RlX2N0eCksIEVTX3JlZygmcmVhbG1vZGVfY3R4KSApOwogICAgIElOVF9TZXRSZWFsTW9kZUNvbnRleHQoIGNhbGwsICZyZWFsbW9kZV9jdHggKTsKIH0KIApAQCAtMzU5LDE3ICszNTcsMTIgQEAKICAgICAgICAgU0VUX0NGTEFHKGNvbnRleHQpOwogICAgICAgICBicmVhazsKICAgICBjYXNlIDB4MDIwMDogLyogZ2V0IHJlYWwgbW9kZSBpbnRlcnJ1cHQgdmVjdG9yICovCi0JZnByaW50ZihzdGRuaW1wLAotCQkiaW50MzE6IGdldCByZWFsbW9kZSBpbnRlcnVwdCB2ZWN0b3IoMHglMDJ4KSB1bmltcGxlbWVudGVkLlxuIiwKLQkJQkxfcmVnKGNvbnRleHQpCi0JKTsKKwlGSVhNRShpbnQzMSwiZ2V0IHJlYWxtb2RlIGludGVydXB0IHZlY3RvcigweCUwMngpIHVuaW1wbGVtZW50ZWQuXG4iLAorCSAgICAgIEJMX3JlZyhjb250ZXh0KSk7CiAgICAgCVNFVF9DRkxBRyhjb250ZXh0KTsKICAgICAgICAgYnJlYWs7CiAgICAgY2FzZSAweDAyMDE6IC8qIHNldCByZWFsIG1vZGUgaW50ZXJydXB0IHZlY3RvciAqLwotCWZwcmludGYoc3RkbmltcCwKLQkJImludDMxOiBzZXQgcmVhbG1vZGUgaW50ZXJ1cHQgdmVjdG9yKDB4JTAyeCwweCUwNHg6MHglMDR4KSB1bmltcGxlbWVudGVkXG4iLAotCQlCTF9yZWcoY29udGV4dCksQ1hfcmVnKGNvbnRleHQpLERYX3JlZyhjb250ZXh0KQotCSk7CisJRklYTUUoaW50MzEsICJzZXQgcmVhbG1vZGUgaW50ZXJ1cHQgdmVjdG9yKDB4JTAyeCwweCUwNHg6MHglMDR4KSB1bmltcGxlbWVudGVkXG4iLCBCTF9yZWcoY29udGV4dCksQ1hfcmVnKGNvbnRleHQpLERYX3JlZyhjb250ZXh0KSk7CiAgICAgCVNFVF9DRkxBRyhjb250ZXh0KTsKICAgICAgICAgYnJlYWs7CiAgICAgY2FzZSAweDAyMDQ6ICAvKiBHZXQgcHJvdGVjdGVkIG1vZGUgaW50ZXJydXB0IHZlY3RvciAqLwpAQCAtMzkxLDExICszODQsMTAgQEAKICAgICBjYXNlIDB4MDMwMTogIC8qIENhbGwgcmVhbCBtb2RlIHByb2NlZHVyZSB3aXRoIGZhciByZXR1cm4gKi8KICAgICAgICAgewogICAgICAgICAgICAgUkVBTE1PREVDQUxMICpwID0gKFJFQUxNT0RFQ0FMTCAqKVBUUl9TRUdfT0ZGX1RPX0xJTiggRVNfcmVnKGNvbnRleHQpLCBESV9yZWcoY29udGV4dCkgKTsKLSAgICAgICAgICAgIGZwcmludGYoc3RkbmltcCwKLSAgICAgICAgICAgICAgICAgICAgIlJlYWxNb2RlQ2FsbDogRUFYPSUwOGx4IEVCWD0lMDhseCBFQ1g9JTA4bHggRURYPSUwOGx4XG4iCi0gICAgICAgICAgICAgICAgICAgICIgICAgICAgICAgICAgIEVTST0lMDhseCBFREk9JTA4bHggRVM9JTA0eCBEUz0lMDR4IENTOklQPSUwNHg6JTA0eFxuIiwKLSAgICAgICAgICAgICAgICAgICAgcC0+ZWF4LCBwLT5lYngsIHAtPmVjeCwgcC0+ZWR4LAotICAgICAgICAgICAgICAgICAgICBwLT5lc2ksIHAtPmVkaSwgcC0+ZXMsIHAtPmRzLCBwLT5jcywgcC0+aXAgKTsKKyAgICAgICAgICAgIEZJWE1FKGludDMxLCAiUmVhbE1vZGVDYWxsOiBFQVg9JTA4bHggRUJYPSUwOGx4IEVDWD0lMDhseCBFRFg9JTA4bHhcbiIsCisJCXAtPmVheCwgcC0+ZWJ4LCBwLT5lY3gsIHAtPmVkeCk7CisgICAgICAgICAgICBGSVhNRShpbnQzMSwgIiAgICAgICAgICAgICAgRVNJPSUwOGx4IEVEST0lMDhseCBFUz0lMDR4IERTPSUwNHggQ1M6SVA9JTA0eDolMDR4XG4iLAorCQlwLT5lc2ksIHAtPmVkaSwgcC0+ZXMsIHAtPmRzLCBwLT5jcywgcC0+aXAgKTsKICAgICAgICAgICAgIFNFVF9DRkxBRyhjb250ZXh0KTsKICAgICAgICAgfQogICAgICAgICBicmVhazsKQEAgLTQwMywxMSArMzk1LDggQEAKICAgICBjYXNlIDB4MDMwMjogIC8qIENhbGwgcmVhbCBtb2RlIHByb2NlZHVyZSB3aXRoIGludGVycnVwdCByZXR1cm4gKi8KICAgICAgICAgewogICAgICAgICAgICAgUkVBTE1PREVDQUxMICpwID0gKFJFQUxNT0RFQ0FMTCAqKVBUUl9TRUdfT0ZGX1RPX0xJTiggRVNfcmVnKGNvbnRleHQpLCBESV9yZWcoY29udGV4dCkgKTsKLSAgICAgICAgICAgIGZwcmludGYoc3RkbmltcCwKLSAgICAgICAgICAgICAgICAgICAgIlJlYWxNb2RlQ2FsbElyZXQ6IEVBWD0lMDhseCBFQlg9JTA4bHggRUNYPSUwOGx4IEVEWD0lMDhseFxuIgotICAgICAgICAgICAgICAgICAgICAiICAgICAgICAgICAgICAgICAgRVNJPSUwOGx4IEVEST0lMDhseCBFUz0lMDR4IERTPSUwNHggQ1M6SVA9JTA0eDolMDR4XG4iLAotICAgICAgICAgICAgICAgICAgICBwLT5lYXgsIHAtPmVieCwgcC0+ZWN4LCBwLT5lZHgsCi0gICAgICAgICAgICAgICAgICAgIHAtPmVzaSwgcC0+ZWRpLCBwLT5lcywgcC0+ZHMsIHAtPmNzLCBwLT5pcCApOworICAgICAgICAgICAgRklYTUUoaW50MzEsICJSZWFsTW9kZUNhbGxJcmV0OiBFQVg9JTA4bHggRUJYPSUwOGx4IEVDWD0lMDhseCBFRFg9JTA4bHhcbiIsIHAtPmVheCwgcC0+ZWJ4LCBwLT5lY3gsIHAtPmVkeCk7CisgICAgICAgICAgICBGSVhNRShpbnQzMSwgIiAgICAgICAgICAgICAgICAgIEVTST0lMDhseCBFREk9JTA4bHggRVM9JTA0eCBEUz0lMDR4IENTOklQPSUwNHg6JTA0eFxuIiwgcC0+ZXNpLCBwLT5lZGksIHAtPmVzLCBwLT5kcywgcC0+Y3MsIHAtPmlwICk7CiAgICAgICAgICAgICBTRVRfQ0ZMQUcoY29udGV4dCk7CiAgICAgICAgIH0KICAgICAgICAgYnJlYWs7CkBAIC00MTUsMjIgKzQwNCwxOCBAQAogICAgIGNhc2UgMHgwMzAzOiAgLyogQWxsb2NhdGUgUmVhbCBNb2RlIENhbGxiYWNrIEFkZHJlc3MgKi8KICAgICAgICAgewogICAgICAgICAgICAgUkVBTE1PREVDQUxMICpwID0gKFJFQUxNT0RFQ0FMTCAqKVBUUl9TRUdfT0ZGX1RPX0xJTiggRVNfcmVnKGNvbnRleHQpLCBESV9yZWcoY29udGV4dCkgKTsKLSAgICAgICAgICAgIGZwcmludGYoc3RkbmltcCwKLSAgICAgICAgICAgICAgICAgICAgIkFsbG9jUk1DQjogRUFYPSUwOGx4IEVCWD0lMDhseCBFQ1g9JTA4bHggRURYPSUwOGx4XG4iCi0gICAgICAgICAgICAgICAgICAgICIgICAgICAgICAgIEVTST0lMDhseCBFREk9JTA4bHggRVM9JTA0eCBEUz0lMDR4IENTOklQPSUwNHg6JTA0eFxuIgotCQkgICAgIglGdW5jdGlvbiB0byBjYWxsOiAlMDR4OiUwNHhcbiIsCi0gICAgICAgICAgICAgICAgICAgIHAtPmVheCwgcC0+ZWJ4LCBwLT5lY3gsIHAtPmVkeCwKLSAgICAgICAgICAgICAgICAgICAgcC0+ZXNpLCBwLT5lZGksIHAtPmVzLCBwLT5kcywgcC0+Y3MsIHAtPmlwLAotCQkgICAgKFdPUkQpRFNfcmVnKGNvbnRleHQpLCBTSV9yZWcoY29udGV4dCkgKTsKKyAgICAgICAgICAgIEZJWE1FKGludDMxLCAiQWxsb2NSTUNCOiBFQVg9JTA4bHggRUJYPSUwOGx4IEVDWD0lMDhseCBFRFg9JTA4bHhcbiIsIHAtPmVheCwgcC0+ZWJ4LCBwLT5lY3gsIHAtPmVkeCk7CisJICAgIEZJWE1FKGludDMxLCAiICAgICAgICAgICBFU0k9JTA4bHggRURJPSUwOGx4IEVTPSUwNHggRFM9JTA0eCBDUzpJUD0lMDR4OiUwNHhcbiIsIHAtPmVzaSwgcC0+ZWRpLCBwLT5lcywgcC0+ZHMsIHAtPmNzLCBwLT5pcCk7CisJICAgIEZJWE1FKGludDMxLCAiICAgICAgICAgICBGdW5jdGlvbiB0byBjYWxsOiAlMDR4OiUwNHhcbiIsCisJCShXT1JEKURTX3JlZyhjb250ZXh0KSwgU0lfcmVnKGNvbnRleHQpICk7CiAgICAgICAgICAgICBTRVRfQ0ZMQUcoY29udGV4dCk7CiAgICAgICAgIH0KICAgICAgICAgYnJlYWs7CiAKICAgICBjYXNlIDB4MDMwNDogIC8qIEZyZWUgUmVhbCBNb2RlIENhbGxiYWNrIEFkZHJlc3MgKi8KIAl7Ci0JICAgIGZwcmludGYoc3RkbmltcCwKLQkJICAgICJGcmVlUk1DQjogY2FsbGJhY2sgYWRkcmVzczogJTA0eDolMDR4XG4iLAotCQkgICAgQ1hfcmVnKGNvbnRleHQpLCBEWF9yZWcoY29udGV4dCkpOworCSAgICBGSVhNRShpbnQzMSwgIkZyZWVSTUNCOiBjYWxsYmFjayBhZGRyZXNzOiAlMDR4OiUwNHhcbiIsCisJCSAgQ1hfcmVnKGNvbnRleHQpLCBEWF9yZWcoY29udGV4dCkpOwogCSAgICBTRVRfQ0ZMQUcoY29udGV4dCk7CiAJfQogCWJyZWFrOwpkaWZmIC0tZ2l0IGEvbXNkb3MvaW50MjEuYyBiL21zZG9zL2ludDIxLmMKaW5kZXggY2UxYjUxYy4uZTIyNmNjMSAxMDA2NDQKLS0tIGEvbXNkb3MvaW50MjEuYworKysgYi9tc2Rvcy9pbnQyMS5jCkBAIC0yMDksNyArMjA5LDggQEAKICAgICBUUkFDRShpbnQyMSwgIiglZClcbiIsIEJYX3JlZyhjb250ZXh0KSk7CiAgICAgCiAgICAgY3Vycl9kcml2ZSA9IERSSVZFX0dldEN1cnJlbnREcml2ZSgpOwotICAgIERYX3JlZyhjb250ZXh0KSA9IDB4MDE0MCArIGN1cnJfZHJpdmUgKyAoKGN1cnJfZHJpdmUgPiAxKSA/IDB4MDgwMCA6IDApOyAvKiBubyBmbG9wcHkgKi8KKyAgICBEWF9yZWcoY29udGV4dCkgPSAweDAxNDAgKyBjdXJyX2RyaXZlICsgKChjdXJyX2RyaXZlID4gMSkgPyAweDA4MDAgOiAwKTsgCisgICAgLyogbm8gZmxvcHB5ICovCiAgICAgLyogYml0cyAwLTUgYXJlIGN1cnJlbnQgZHJpdmUKICAgICAgKiBiaXQgNiAtIGZpbGUgaGFzIE5PVCBiZWVuIHdyaXR0ZW4uLkZJWE1FOiBjb3JyZWN0PwogICAgICAqIGJpdCA4IC0gZ2VuZXJhdGUgaW50MjQgaWYgbm8gZGlza3NwYWNlIG9uIHdyaXRlLyByZWFkIHBhc3QgZW5kIG9mIGZpbGUKQEAgLTMwNSw2ICszMDYsMjIgQEAKICAgICBEWF9yZWcoY29udGV4dCkgPSAoc3lzdGltZS53U2Vjb25kIDw8IDgpIHwgKHN5c3RpbWUud01pbGxpc2Vjb25kcyAvIDEwKTsKIH0KIAorLyogTWFueSBjYWxscyB0cmFuc2xhdGUgYSBkcml2ZSBhcmd1bWVudCBsaWtlIHRoaXM6CisgICBkcml2ZSBudW1iZXIgKDAwaCA9IGRlZmF1bHQsIDAxaCA9IEE6LCBldGMpCisgICAqLyAgCitzdGF0aWMgY2hhciBkcml2ZXN0cmluZ1tdPSJkZWZhdWx0IjsKKworY2hhciAqSU5UMjFfRHJpdmVOYW1lKGludCBkcml2ZSkKK3sKKworICAgIGlmKGRyaXZlID4wKQorICAgICAgeworCWRyaXZlc3RyaW5nWzBdPSAodW5zaWduZWQgY2hhcilkcml2ZSArICdAJzsKKwlkcml2ZXN0cmluZ1sxXT0nOic7CisJZHJpdmVzdHJpbmdbMl09MDsKKyAgICAgIH0KKyAgICByZXR1cm4gZHJpdmVzdHJpbmc7Cit9CiBzdGF0aWMgQk9PTDMyIElOVDIxX0NyZWF0ZUZpbGUoIENPTlRFWFQgKmNvbnRleHQgKQogewogICAgIEFYX3JlZyhjb250ZXh0KSA9IF9sY3JlYXQxNiggUFRSX1NFR19PRkZfVE9fTElOKCBEU19yZWcoY29udGV4dCksCkBAIC0zNTYsNyArMzczLDcgQEAKIAkgIGludCByZXN1bHQscmV0cmllcz1zaGFyaW5nX3JldHJpZXM7CiAJICB7CiAjaWYgZGVmaW5lZChfX3N2cjRfXykgfHwgZGVmaW5lZChfU0NPX0RTKQotICAgICAgICAgICAgICBwcmludGYoIlNob3VsZCBjYWxsIGZsb2NrIGFuZCBuZWVkcyBwb3J0aW5nIHRvIGxvY2tmXG4iKTsKKyAgICAgICAgICAgICAgRVJSKGludDIxLCAiU2hvdWxkIGNhbGwgZmxvY2sgYW5kIG5lZWRzIHBvcnRpbmcgdG8gbG9ja2ZcbiIpOwogICAgICAgICAgICAgICByZXN1bHQgPSAwOwogICAgICAgICAgICAgICByZXRyaWVzID0gMDsKICNlbHNlCkBAIC03NjAsMTIgKzc3NywxMiBAQAogCiBzdGF0aWMgdm9pZCBEZWxldGVGaWxlRkNCKCBDT05URVhUICpjb250ZXh0ICkKIHsKLSAgICBmcHJpbnRmKCBzdGRlcnIsICJEZWxldGVGaWxlRkNCOiBub3QgaW1wbGVtZW50ZWQgeWV0XG4iICk7CisgICAgRklYTUUoaW50MjEsICIoJXApOiBub3QgaW1wbGVtZW50ZWQgeWV0XG4iLCBjb250ZXh0KTsKIH0KIAogc3RhdGljIHZvaWQgUmVuYW1lRmlsZUZDQiggQ09OVEVYVCAqY29udGV4dCApCiB7Ci0gICAgZnByaW50Ziggc3RkZXJyLCAiUmVuYW1lRmlsZUZDQjogbm90IGltcGxlbWVudGVkIHlldFxuIiApOworICAgIEZJWE1FKGludDIxLCAiKCVwKTogbm90IGltcGxlbWVudGVkIHlldFxuIiwgY29udGV4dCk7CiB9CiAKIApAQCAtNzc2LDYgKzc5MywxMCBAQAogICAgIHN3aXRjaCAoIEFYX3JlZyhjb250ZXh0KSAmIDB4ZmYgKQogICAgIHsKICAgICAgICAgY2FzZSAweDAwOiAvKiBMT0NLICovCisJICBUUkFDRShpbnQyMSwibG9jayBoYW5kbGUgJWQgb2Zmc2V0ICVsZCBsZW5ndGggJWxkXG4iLAorCQlCWF9yZWcoY29udGV4dCksCisJCU1BS0VMT05HKERYX3JlZyhjb250ZXh0KSxDWF9yZWcoY29udGV4dCkpLAorCQlNQUtFTE9ORyhESV9yZWcoY29udGV4dCksU0lfcmVnKGNvbnRleHQpKSkgOwogCSAgaWYgKCFMb2NrRmlsZShCWF9yZWcoY29udGV4dCksCiAgICAgICAgICAgICAgICAgICAgICAgICBNQUtFTE9ORyhEWF9yZWcoY29udGV4dCksQ1hfcmVnKGNvbnRleHQpKSwgMCwKICAgICAgICAgICAgICAgICAgICAgICAgIE1BS0VMT05HKERJX3JlZyhjb250ZXh0KSxTSV9yZWcoY29udGV4dCkpLCAwKSkgewpAQCAtNzg1LDYgKzgwNiwxMCBAQAogICAgICAgICAgIGJyZWFrOwogCiAJY2FzZSAweDAxOiAvKiBVTkxPQ0sgKi8KKwkgIFRSQUNFKGludDIxLCJ1bmxvY2sgaGFuZGxlICVkIG9mZnNldCAlbGQgbGVuZ3RoICVsZFxuIiwKKwkJQlhfcmVnKGNvbnRleHQpLAorCQlNQUtFTE9ORyhEWF9yZWcoY29udGV4dCksQ1hfcmVnKGNvbnRleHQpKSwKKwkJTUFLRUxPTkcoRElfcmVnKGNvbnRleHQpLFNJX3JlZyhjb250ZXh0KSkpIDsKIAkgIGlmICghVW5sb2NrRmlsZShCWF9yZWcoY29udGV4dCksCiAgICAgICAgICAgICAgICAgICAgICAgICAgIE1BS0VMT05HKERYX3JlZyhjb250ZXh0KSxDWF9yZWcoY29udGV4dCkpLCAwLAogICAgICAgICAgICAgICAgICAgICAgICAgICBNQUtFTE9ORyhESV9yZWcoY29udGV4dCksU0lfcmVnKGNvbnRleHQpKSwgMCkpIHsKQEAgLTg2NiwxNSArODkxLDE3IEBACiB7CiAgICAgQk9PTDMyCWJTZXRET1NFeHRlbmRlZEVycm9yID0gRkFMU0U7CiAKLSAgICBUUkFDRShpbnQyMSwgIkFYPSUwNHggQlg9JTA0eCBDWD0lMDR4IERYPSUwNHggIgorICAgIC8qICAgIFRSQUNFKGludDIxLCAiQVg9JTA0eCBCWD0lMDR4IENYPSUwNHggRFg9JTA0eCAiCiAgICAgICAgICAgICAgICAgICJTST0lMDR4IERJPSUwNHggRFM9JTA0eCBFUz0lMDR4IEVGTD0lMDhseFxuIiwKICAgICAgICAgICAgICAgICAgQVhfcmVnKGNvbnRleHQpLCBCWF9yZWcoY29udGV4dCksIENYX3JlZyhjb250ZXh0KSwKICAgICAgICAgICAgICAgICAgRFhfcmVnKGNvbnRleHQpLCBTSV9yZWcoY29udGV4dCksIERJX3JlZyhjb250ZXh0KSwKICAgICAgICAgICAgICAgICAgKFdPUkQpRFNfcmVnKGNvbnRleHQpLCAoV09SRClFU19yZWcoY29udGV4dCksCiAgICAgICAgICAgICAgICAgIEVGTF9yZWcoY29udGV4dCkgKTsKLQorCQkgKi8KICAgICBpZiAoQUhfcmVnKGNvbnRleHQpID09IDB4NTkpICAvKiBHZXQgZXh0ZW5kZWQgZXJyb3IgaW5mbyAqLwogICAgIHsKKyAgICAgICAgVFJBQ0UoaW50MjEsICJHRVQgRVhURU5ERUQgRVJST1IgY29kZSAweCUwMnggY2xhc3MgMHglMDJ4IGFjdGlvbiAweCUwMnggbG9jdXMgJTAyeFxuIiwKKwkgICAgICBET1NfRXh0ZW5kZWRFcnJvciwgRE9TX0Vycm9yQ2xhc3MsIERPU19FcnJvckFjdGlvbiwgRE9TX0Vycm9yTG9jdXMpOwogICAgICAgICBBWF9yZWcoY29udGV4dCkgPSBET1NfRXh0ZW5kZWRFcnJvcjsKICAgICAgICAgQkhfcmVnKGNvbnRleHQpID0gRE9TX0Vycm9yQ2xhc3M7CiAgICAgICAgIEJMX3JlZyhjb250ZXh0KSA9IERPU19FcnJvckFjdGlvbjsKQEAgLTg4OCw2ICs5MTUsNyBAQAogICAgIHN3aXRjaChBSF9yZWcoY29udGV4dCkpIAogICAgIHsKICAgICBjYXNlIDB4MDA6IC8qIFRFUk1JTkFURSBQUk9HUkFNICovCisgICAgICAgIFRSQUNFKGludDIxLCJURVJNSU5BVEUgUFJPR1JBTVxuIik7CiAgICAgICAgIFRBU0tfS2lsbEN1cnJlbnRUYXNrKCAwICk7CiAgICAgICAgIGJyZWFrOwogCkBAIC05MjAsOSArOTQ4LDEzIEBACiAgICAgICAgICAgICAgICAgICAiU1dJVENIQVIiIC0gU0VUIFNXSVRDSCBDSEFSQUNURVIKICAgICAgICAgICAgICAgICAgICJBVkFJTERFViIgLSBTUEVDSUZZIFxERVZcIFBSRUZJWCBVU0UgKi8KICAgICBjYXNlIDB4NTQ6IC8qIEdFVCBWRVJJRlkgRkxBRyAqLworICAgIGNhc2UgMHg0ODogLyogQUxMT0NBVEUgTUVNT1JZICovCisgICAgY2FzZSAweDQ5OiAvKiBGUkVFIE1FTU9SWSAqLworICAgIGNhc2UgMHg0YTogLyogUkVTSVpFIE1FTU9SWSBCTE9DSyAqLwogICAgICAgICBJTlRfQkFSRiggY29udGV4dCwgMHgyMSApOwogICAgICAgICBicmVhazsKICAgICBjYXNlIDB4MmU6IC8qIFNFVCBWRVJJRlkgRkxBRyAqLworICAgICAgICBUUkFDRShpbnQyMSwiU0VUIFZFUklGWSBGTEFHIGlnbm9yZWRcbiIpOwogICAgIAkvKiB3ZSBjYW5ub3QgY2hhbmdlIHRoZSBiZWhhdmlvdXIgYW55d2F5LCBzbyBqdXN0IGlnbm9yZSBpdCAqLwogICAgIAlicmVhazsKIApAQCAtOTM5LDE1ICs5NzEsMTkgQEAKICAgICAgICAgYnJlYWs7CiAKICAgICBjYXNlIDB4MGQ6IC8qIERJU0sgQlVGRkVSIEZMVVNIICovCisJVFJBQ0UoaW50MjEsIkRJU0sgQlVGRkVSIEZMVVNIIGlnbm9yZWRcbiIpOwogICAgICAgICBSRVNFVF9DRkxBRyhjb250ZXh0KTsgLyogZG9zIDYrIG9ubHkgKi8KICAgICAgICAgYnJlYWs7CiAKICAgICBjYXNlIDB4MGU6IC8qIFNFTEVDVCBERUZBVUxUIERSSVZFICovCisJVFJBQ0UoaW50MjEsIlNFTEVDVCBERUZBVUxUIERSSVZFICVkXG4iLCBETF9yZWcoY29udGV4dCkpOwogICAgICAgICBEUklWRV9TZXRDdXJyZW50RHJpdmUoIERMX3JlZyhjb250ZXh0KSApOwogICAgICAgICBBTF9yZWcoY29udGV4dCkgPSBNQVhfRE9TX0RSSVZFUzsKICAgICAgICAgYnJlYWs7CiAKICAgICBjYXNlIDB4MTE6IC8qIEZJTkQgRklSU1QgTUFUQ0hJTkcgRklMRSBVU0lORyBGQ0IgKi8KKwlUUkFDRShpbnQyMSwiRklORCBGSVJTVCBNQVRDSElORyBGSUxFIFVTSU5HIEZDQiAlcFxuIiwgCisJICAgICAgUFRSX1NFR19PRkZfVE9fTElOKERTX3JlZyhjb250ZXh0KSwgRFhfcmVnKGNvbnRleHQpKSk7CiAgICAgICAgIGlmICghSU5UMjFfRmluZEZpcnN0RkNCKGNvbnRleHQpKQogICAgICAgICB7CiAgICAgICAgICAgICBBTF9yZWcoY29udGV4dCkgPSAweGZmOwpAQCAtMTAwMyw4ICsxMDM5LDggQEAKICAgICAgICAgYnJlYWs7CiAKICAgICBjYXNlIDB4MmI6IC8qIFNFVCBTWVNURU0gREFURSAqLwotICAgICAgICBmcHJpbnRmKCBzdGRuaW1wLCAiU2V0U3lzdGVtRGF0ZSglMDJkLyUwMmQvJTA0ZCk6IG5vdCBhbGxvd2VkXG4iLAotICAgICAgICAgICAgICAgICBETF9yZWcoY29udGV4dCksIERIX3JlZyhjb250ZXh0KSwgQ1hfcmVnKGNvbnRleHQpICk7CisgICAgICAgIEZJWE1FKGludDIxLCAiU2V0U3lzdGVtRGF0ZSglMDJkLyUwMmQvJTA0ZCk6IG5vdCBhbGxvd2VkXG4iLAorCSAgICAgIERMX3JlZyhjb250ZXh0KSwgREhfcmVnKGNvbnRleHQpLCBDWF9yZWcoY29udGV4dCkgKTsKICAgICAgICAgQUxfcmVnKGNvbnRleHQpID0gMDsgIC8qIExldCdzIHByZXRlbmQgd2Ugc3VjY2VlZGVkICovCiAgICAgICAgIGJyZWFrOwogCkBAIC0xMDEzLDEzICsxMDQ5LDE0IEBACiAgICAgICAgIGJyZWFrOwogCiAgICAgY2FzZSAweDJkOiAvKiBTRVQgU1lTVEVNIFRJTUUgKi8KLSAgICAgICAgZnByaW50Ziggc3RkbmltcCwgIlNldFN5c3RlbVRpbWUoJTAyZDolMDJkOiUwMmQuJTAyZCk6IG5vdCBhbGxvd2VkXG4iLAotICAgICAgICAgICAgICAgICBDSF9yZWcoY29udGV4dCksIENMX3JlZyhjb250ZXh0KSwKLSAgICAgICAgICAgICAgICAgREhfcmVnKGNvbnRleHQpLCBETF9yZWcoY29udGV4dCkgKTsKKyAgICAgICAgRklYTUUoaW50MjEsICJTZXRTeXN0ZW1UaW1lKCUwMmQ6JTAyZDolMDJkLiUwMmQpOiBub3QgYWxsb3dlZFxuIiwKKwkgICAgICBDSF9yZWcoY29udGV4dCksIENMX3JlZyhjb250ZXh0KSwKKwkgICAgICBESF9yZWcoY29udGV4dCksIERMX3JlZyhjb250ZXh0KSApOwogICAgICAgICBBTF9yZWcoY29udGV4dCkgPSAwOyAgLyogTGV0J3MgcHJldGVuZCB3ZSBzdWNjZWVkZWQgKi8KICAgICAgICAgYnJlYWs7CiAKICAgICBjYXNlIDB4MmY6IC8qIEdFVCBESVNLIFRSQU5TRkVSIEFSRUEgQUREUkVTUyAqLworICAgICAgICBUUkFDRShpbnQyMSwiR0VUIERJU0sgVFJBTlNGRVIgQVJFQSBBRERSRVNTXG4iKTsKICAgICAgICAgewogICAgICAgICAgICAgVERCICpwVGFzayA9IChUREIgKilHbG9iYWxMb2NrMTYoIEdldEN1cnJlbnRUYXNrKCkgKTsKICAgICAgICAgICAgIEVTX3JlZyhjb250ZXh0KSA9IFNFTEVDVE9ST0YoIHBUYXNrLT5kdGEgKTsKQEAgLTEwMjgsNiArMTA2NSw4IEBACiAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgCiAgICAgY2FzZSAweDMwOiAvKiBHRVQgRE9TIFZFUlNJT04gKi8KKyAgICAgICAgVFJBQ0UoaW50MjEsIkdFVCBET1MgVkVSU0lPTiAlcyByZXF1ZXN0ZWRcbiIsCisJICAgICAgKEFMX3JlZyhjb250ZXh0KSA9PSAweDAwKT8iT0VNIG51bWJlciI6InZlcnNpb24gZmxhZyIpOwogICAgICAgICBBWF9yZWcoY29udGV4dCkgPSAoSElXT1JEKEdldFZlcnNpb24xNigpKSA+PiA4KSB8CiAgICAgICAgICAgICAgICAgICAgICAgICAgIChISVdPUkQoR2V0VmVyc2lvbjE2KCkpIDw8IDgpOwogICAgICAgICBCWF9yZWcoY29udGV4dCkgPSAweDAwMTI7ICAgICAvKiAweDEyMzQ1NiBpcyBXaW5lJ3Mgc2VyaWFsICMgKi8KQEAgLTEwMzUsMTAgKzEwNzQsMTMgQEAKICAgICAgICAgYnJlYWs7CiAKICAgICBjYXNlIDB4MzE6IC8qIFRFUk1JTkFURSBBTkQgU1RBWSBSRVNJREVOVCAqLworICAgICAgICBUUkFDRShpbnQyMSwiVEVSTUlOQVRFIEFORCBTVEFZIFJFU0lERU5UIHN0dWJcbiIpOwogICAgICAgICBJTlRfQkFSRiggY29udGV4dCwgMHgyMSApOwogICAgICAgICBicmVhazsKIAogICAgIGNhc2UgMHgzMjogLyogR0VUIERPUyBEUklWRSBQQVJBTUVURVIgQkxPQ0sgRk9SIFNQRUNJRklDIERSSVZFICovCisgICAgICAgIFRSQUNFKGludDIxLCJHRVQgRE9TIERSSVZFIFBBUkFNRVRFUiBCTE9DSyBGT1IgRFJJVkUgJXNcbiIsCisJICAgICAgSU5UMjFfRHJpdmVOYW1lKCBETF9yZWcoY29udGV4dCkpKTsKICAgICAgICAgR2V0RHJpdmVQQihjb250ZXh0LCBET1NfR0VUX0RSSVZFKCBETF9yZWcoY29udGV4dCkgKSApOwogICAgICAgICBicmVhazsKIApAQCAtMTA0NiwyMiArMTA4OCwyNyBAQAogICAgICAgICBzd2l0Y2ggKEFMX3JlZyhjb250ZXh0KSkKICAgICAgICAgewogCSAgICAgIGNhc2UgMHgwMDogLyogR0VUIENVUlJFTlQgRVhURU5ERUQgQlJFQUsgU1RBVEUgKi8KKwkJVFJBQ0UoaW50MjEsIkdFVCBDVVJSRU5UIEVYVEVOREVEIEJSRUFLIFNUQVRFIHN0dWJcbiIpOwogICAgICAgICAgICAgICAgIERMX3JlZyhjb250ZXh0KSA9IDA7CiAJCWJyZWFrOwogCiAJICAgICAgY2FzZSAweDAxOiAvKiBTRVQgRVhURU5ERUQgQlJFQUsgU1RBVEUgKi8KKwkJVFJBQ0UoaW50MjEsIlNFVCBDVVJSRU5UIEVYVEVOREVEIEJSRUFLIFNUQVRFIHN0dWJcbiIpOwogCQlicmVhazsJCQogCQkKIAkgICAgICBjYXNlIDB4MDI6IC8qIEdFVCBBTkQgU0VUIEVYVEVOREVEIENPTlRST0wtQlJFQUsgQ0hFQ0tJTkcgU1RBVEUqLworCQlUUkFDRShpbnQyMSwiR0VUIEFORCBTRVQgRVhURU5ERUQgQ09OVFJPTC1CUkVBSyBDSEVDS0lORyBTVEFURSBzdHViXG4iKTsKIAkJRExfcmVnKGNvbnRleHQpID0gMDsKIAkJYnJlYWs7CiAKIAkgICAgICBjYXNlIDB4MDU6IC8qIEdFVCBCT09UIERSSVZFICovCisJCVRSQUNFKGludDIxLCJHRVQgQk9PVCBEUklWRVxuIik7CiAJCURMX3JlZyhjb250ZXh0KSA9IDM7CiAJCS8qIGM6IGlzIFdpbmUncyBib290ZHJpdmUgKGE6IGlzIDEpKi8KIAkJYnJlYWs7CiAJCQkJCiAJICAgICAgY2FzZSAweDA2OiAvKiBHRVQgVFJVRSBWRVJTSU9OIE5VTUJFUiAqLworCQlUUkFDRShpbnQyMSwiR0VUIFRSVUUgVkVSU0lPTiBOVU1CRVJcbiIpOwogCQlCWF9yZWcoY29udGV4dCkgPSAoSElXT1JEKEdldFZlcnNpb24xNigpID4+IDgpKSB8CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKEhJV09SRChHZXRWZXJzaW9uMTYoKSA8PCA4KSk7CiAJCURYX3JlZyhjb250ZXh0KSA9IDB4MDA7CkBAIC0xMDc0LDEyICsxMTIxLDE0IEBACiAgICAgICAgIGJyZWFrOwkKIAkgICAgCiAgICAgY2FzZSAweDM0OiAvKiBHRVQgQUREUkVTUyBPRiBJTkRPUyBGTEFHICovCisgICAgICAgIFRSQUNFKGludDIxLCJHRVQgQUREUkVTUyBPRiBJTkRPUyBGTEFHXG4iKTsKICAgICAgICAgaWYgKCFoZWFwKSBJTlQyMV9DcmVhdGVIZWFwKCk7CiAgICAgICAgIEVTX3JlZyhjb250ZXh0KSA9IERvc0hlYXBIYW5kbGU7CiAgICAgICAgIEJYX3JlZyhjb250ZXh0KSA9IChpbnQpJmhlYXAtPkluRG9zRmxhZyAtIChpbnQpaGVhcDsKICAgICAgICAgYnJlYWs7CiAKICAgICBjYXNlIDB4MzU6IC8qIEdFVCBJTlRFUlJVUFQgVkVDVE9SICovCisgICAgICAgIFRSQUNFKGludDIxLCJHRVQgSU5URVJSVVBUIFZFQ1RPUiAweCUwMnhcbiIsQUxfcmVnKGNvbnRleHQpKTsKICAgICAgICAgewogICAgICAgICAgICAgRkFSUFJPQzE2IGFkZHIgPSBJTlRfR2V0SGFuZGxlciggQUxfcmVnKGNvbnRleHQpICk7CiAgICAgICAgICAgICBFU19yZWcoY29udGV4dCkgPSBTRUxFQ1RPUk9GKGFkZHIpOwpAQCAtMTA4OCw0MyArMTEzNyw2MCBAQAogICAgICAgICBicmVhazsKIAogICAgIGNhc2UgMHgzNjogLyogR0VUIEZSRUUgRElTSyBTUEFDRSAqLworCVRSQUNFKGludDIxLCJHRVQgRlJFRSBESVNLIFNQQUNFIEZPUiBEUklWRSAlc1xuIiwKKwkgICAgICBJTlQyMV9Ecml2ZU5hbWUoIERMX3JlZyhjb250ZXh0KSkpOwogICAgICAgICBpZiAoIUlOVDIxX0dldEZyZWVEaXNrU3BhY2UoY29udGV4dCkpIEFYX3JlZyhjb250ZXh0KSA9IDB4ZmZmZjsKICAgICAgICAgYnJlYWs7CiAKICAgICBjYXNlIDB4Mzg6IC8qIEdFVCBDT1VOVFJZLVNQRUNJRklDIElORk9STUFUSU9OICovCisJVFJBQ0UoaW50MjEsIkdFVCBDT1VOVFJZLVNQRUNJRklDIElORk9STUFUSU9OIGZvciBjb3VudHJ5IDB4JTAyeFxuIiwKKwkgICAgICBBTF9yZWcoY29udGV4dCkpOwogICAgICAgICBBWF9yZWcoY29udGV4dCkgPSAweDAyOyAvKiBubyBjb3VudHJ5IHN1cHBvcnQgYXZhaWxhYmxlICovCiAgICAgICAgIFNFVF9DRkxBRyhjb250ZXh0KTsKICAgICAgICAgYnJlYWs7CiAKICAgICBjYXNlIDB4Mzk6IC8qICJNS0RJUiIgLSBDUkVBVEUgU1VCRElSRUNUT1JZICovCisgICAgICAgIFRSQUNFKGludDIxLCJNS0RJUiAlc1xuIiwKKwkgICAgICAoTFBDU1RSKVBUUl9TRUdfT0ZGX1RPX0xJTiggRFNfcmVnKGNvbnRleHQpLCBEWF9yZWcoY29udGV4dCkpKTsKICAgICAgICAgYlNldERPU0V4dGVuZGVkRXJyb3IgPSAoIUNyZWF0ZURpcmVjdG9yeTE2KCBQVFJfU0VHX09GRl9UT19MSU4oIERTX3JlZyhjb250ZXh0KSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRFhfcmVnKGNvbnRleHQpICksIE5VTEwpKTsKICAgICAgICAgYnJlYWs7CiAJCiAgICAgY2FzZSAweDNhOiAvKiAiUk1ESVIiIC0gUkVNT1ZFIFNVQkRJUkVDVE9SWSAqLworICAgICAgICBUUkFDRShpbnQyMSwiUk1ESVIgJXNcbiIsCisJICAgICAgKExQQ1NUUilQVFJfU0VHX09GRl9UT19MSU4oIERTX3JlZyhjb250ZXh0KSwgRFhfcmVnKGNvbnRleHQpKSk7CiAgICAgICAgIGJTZXRET1NFeHRlbmRlZEVycm9yID0gKCFSZW1vdmVEaXJlY3RvcnkxNiggUFRSX1NFR19PRkZfVE9fTElOKCBEU19yZWcoY29udGV4dCksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERYX3JlZyhjb250ZXh0KSApKSk7CiAgICAgICAgIGJyZWFrOwogCiAgICAgY2FzZSAweDNiOiAvKiAiQ0hESVIiIC0gU0VUIENVUlJFTlQgRElSRUNUT1JZICovCisgICAgICAgIFRSQUNFKGludDIxLCJDSERJUiAlc1xuIiwKKwkgICAgICAoTFBDU1RSKVBUUl9TRUdfT0ZGX1RPX0xJTiggRFNfcmVnKGNvbnRleHQpLCBEWF9yZWcoY29udGV4dCkpKTsKICAgICAgICAgYlNldERPU0V4dGVuZGVkRXJyb3IgPSAhSU5UMjFfQ2hhbmdlRGlyKGNvbnRleHQpOwogICAgICAgICBicmVhazsKIAkKICAgICBjYXNlIDB4M2M6IC8qICJDUkVBVCIgLSBDUkVBVEUgT1IgVFJVTkNBVEUgRklMRSAqLworICAgICAgICBUUkFDRShpbnQyMSwiQ1JFQVQgZmxhZyAweCUwMnggJXNcbiIsQ1hfcmVnKGNvbnRleHQpLAorCSAgICAgIChMUENTVFIpUFRSX1NFR19PRkZfVE9fTElOKCBEU19yZWcoY29udGV4dCksIERYX3JlZyhjb250ZXh0KSkpOwogICAgICAgICBBWF9yZWcoY29udGV4dCkgPSBfbGNyZWF0MTYoIFBUUl9TRUdfT0ZGX1RPX0xJTiggRFNfcmVnKGNvbnRleHQpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRFhfcmVnKGNvbnRleHQpICksIENYX3JlZyhjb250ZXh0KSApOwogICAgICAgICBiU2V0RE9TRXh0ZW5kZWRFcnJvciA9IChBWF9yZWcoY29udGV4dCkgPT0gKFdPUkQpSEZJTEVfRVJST1IxNik7CiAgICAgICAgIGJyZWFrOwogCiAgICAgY2FzZSAweDNkOiAvKiAiT1BFTiIgLSBPUEVOIEVYSVNUSU5HIEZJTEUgKi8KKyAgICAgICAgVFJBQ0UoaW50MjEsIk9QRU4gbW9kZSAweCUwMnggJXNcbiIsQUxfcmVnKGNvbnRleHQpLAorCSAgICAgIChMUENTVFIpUFRSX1NFR19PRkZfVE9fTElOKCBEU19yZWcoY29udGV4dCksIERYX3JlZyhjb250ZXh0KSkpOwogICAgICAgICBPcGVuRXhpc3RpbmdGaWxlKGNvbnRleHQpOwogICAgICAgICBicmVhazsKIAogICAgIGNhc2UgMHgzZTogLyogIkNMT1NFIiAtIENMT1NFIEZJTEUgKi8KKyAgICAgICAgVFJBQ0UoaW50MjEsIkNMT1NFIGhhbmRsZSAlZFxuIixCWF9yZWcoY29udGV4dCkpOwogICAgICAgICBiU2V0RE9TRXh0ZW5kZWRFcnJvciA9ICgoQVhfcmVnKGNvbnRleHQpID0gX2xjbG9zZTE2KCBCWF9yZWcoY29udGV4dCkgKSkgIT0gMCk7CiAgICAgICAgIGJyZWFrOwogCiAgICAgY2FzZSAweDNmOiAvKiAiUkVBRCIgLSBSRUFEIEZST00gRklMRSBPUiBERVZJQ0UgKi8KKyAgICAgICAgVFJBQ0UoaW50MjEsIlJFQUQgZnJvbSAlZCB0byAlbGQgZm9yICVkIGJ5dGVcbiIsQlhfcmVnKGNvbnRleHQpLAorCSAgICAgIFBUUl9TRUdfT0ZGX1RPX1NFR1BUUiggRFNfcmVnKGNvbnRleHQpLERYX3JlZyhjb250ZXh0KSksQ1hfcmVnKGNvbnRleHQpICk7CiAgICAgICAgIHsKICAgICAgICAgICAgIExPTkcgcmVzdWx0ID0gV0lOMTZfaHJlYWQoIEJYX3JlZyhjb250ZXh0KSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBUUl9TRUdfT0ZGX1RPX1NFR1BUUiggRFNfcmVnKGNvbnRleHQpLApAQCAtMTEzNiw2ICsxMjAyLDkgQEAKICAgICAgICAgYnJlYWs7CiAKICAgICBjYXNlIDB4NDA6IC8qICJXUklURSIgLSBXUklURSBUTyBGSUxFIE9SIERFVklDRSAqLworICAgICAgICBUUkFDRShpbnQyMSwiV1JJVEUgZnJvbSAlbGQgdG8gaGFuZGxlICVkIGZvciAlZCBieXRlXG4iLAorCSAgICAgIFBUUl9TRUdfT0ZGX1RPX1NFR1BUUiggRFNfcmVnKGNvbnRleHQpLERYX3JlZyhjb250ZXh0KSksCisJICAgICAgQlhfcmVnKGNvbnRleHQpLENYX3JlZyhjb250ZXh0KSApOwogICAgICAgICB7CiAgICAgICAgICAgICBMT05HIHJlc3VsdCA9IF9od3JpdGUxNiggQlhfcmVnKGNvbnRleHQpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBUUl9TRUdfT0ZGX1RPX0xJTiggRFNfcmVnKGNvbnRleHQpLApAQCAtMTE0NywxMSArMTIxNiwxNyBAQAogICAgICAgICBicmVhazsKIAogICAgIGNhc2UgMHg0MTogLyogIlVOTElOSyIgLSBERUxFVEUgRklMRSAqLworICAgICAgICBUUkFDRShpbnQyMSwiVU5MSU5LJXNcbiIsCisJICAgICAgKExQQ1NUUilQVFJfU0VHX09GRl9UT19MSU4oIERTX3JlZyhjb250ZXh0KSwgRFhfcmVnKGNvbnRleHQpKSk7CiAgICAgICAgIGJTZXRET1NFeHRlbmRlZEVycm9yID0gKCFEZWxldGVGaWxlMzJBKCBQVFJfU0VHX09GRl9UT19MSU4oIERTX3JlZyhjb250ZXh0KSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEWF9yZWcoY29udGV4dCkgKSkpOwogICAgICAgICBicmVhazsKIAogICAgIGNhc2UgMHg0MjogLyogIkxTRUVLIiAtIFNFVCBDVVJSRU5UIEZJTEUgUE9TSVRJT04gKi8KKyAgICAgICAgVFJBQ0UoaW50MjEsIkxTRUVLIGhhbmRsZSAlZCBvZmZzZXQgJWxkIGZyb20gJXNcbiIsCisJICAgICAgQlhfcmVnKGNvbnRleHQpLCBNQUtFTE9ORyhEWF9yZWcoY29udGV4dCksQ1hfcmVnKGNvbnRleHQpKSwKKwkgICAgICAoQUxfcmVnKGNvbnRleHQpPT0wKT8ic3RhcnQgb2YgZmlsZSI6KEFMX3JlZyhjb250ZXh0KT09MSk/CisJICAgICAgImN1cnJlbnQgZmlsZSBwb3NpdGlvbiI6ImVuZCBvZiBmaWxlIik7CiAgICAgICAgIHsKICAgICAgICAgICAgIExPTkcgc3RhdHVzID0gX2xsc2VlazE2KCBCWF9yZWcoY29udGV4dCksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTUFLRUxPTkcoRFhfcmVnKGNvbnRleHQpLENYX3JlZyhjb250ZXh0KSksCkBAIC0xMTY5LDYgKzEyNDQsOCBAQAogICAgICAgICBzd2l0Y2ggKEFMX3JlZyhjb250ZXh0KSkKICAgICAgICAgewogICAgICAgICBjYXNlIDB4MDA6CisgICAgICAgICAgICBUUkFDRShpbnQyMSwiR0VUIEZJTEUgQVRUUklCVVRFUyBmb3IgJXNcbiIsIAorCQkgIChMUENTVFIpUFRSX1NFR19PRkZfVE9fTElOKCBEU19yZWcoY29udGV4dCksIERYX3JlZyhjb250ZXh0KSkpOwogICAgICAgICAgICAgQVhfcmVnKGNvbnRleHQpID0gKFdPUkQpR2V0RmlsZUF0dHJpYnV0ZXMzMkEoCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQVFJfU0VHX09GRl9UT19MSU4oRFNfcmVnKGNvbnRleHQpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERYX3JlZyhjb250ZXh0KSkpOwpAQCAtMTE3NywxMSArMTI1NCwxNiBAQAogICAgICAgICAgICAgYnJlYWs7CiAKICAgICAgICAgY2FzZSAweDAxOgorICAgICAgICAgICAgVFJBQ0UoaW50MjEsIlNFVCBGSUxFIEFUVFJJQlVURVMgMHglMDJ4IGZvciAlc1xuIiwgQ1hfcmVnKGNvbnRleHQpLAorCQkgIChMUENTVFIpUFRSX1NFR19PRkZfVE9fTElOKCBEU19yZWcoY29udGV4dCksIERYX3JlZyhjb250ZXh0KSkpOwogICAgICAgICAgICAgYlNldERPU0V4dGVuZGVkRXJyb3IgPSAKIAkJKCFTZXRGaWxlQXR0cmlidXRlczMyQSggUFRSX1NFR19PRkZfVE9fTElOKERTX3JlZyhjb250ZXh0KSwgCiAJCQkJCQkJICAgRFhfcmVnKGNvbnRleHQpKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAkJCSAgIENYX3JlZyhjb250ZXh0KSApKTsKICAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIDB4MDI6CisgICAgICAgICAgICBUUkFDRShpbnQyMSwiR0VUIENPTVBSRVNTRUQgRklMRSBTSVpFIGZvciAlcyBzdHViXG4iLAorCQkgIChMUENTVFIpUFRSX1NFR19PRkZfVE9fTElOKCBEU19yZWcoY29udGV4dCksIERYX3JlZyhjb250ZXh0KSkpOwogICAgICAgICB9CiAgICAgICAgIGJyZWFrOwogCQpAQCAtMTE5NiwxNyArMTI3OCwxOCBAQAogICAgICAgICAgICAgYnJlYWs7CiAJY2FzZSAweDA1OnsJLyogSU9DVEwgLSBXUklURSBUTyBCTE9DSyBERVZJQ0UgQ09OVFJPTCBDSEFOTkVMICovCiAJICAgIEJZVEUgKmRhdGFwdHIgPSBQVFJfU0VHX09GRl9UT19MSU4oRFNfcmVnKGNvbnRleHQpLERYX3JlZyhjb250ZXh0KSk7Ci0JICAgIGludAlpOwogCSAgICBpbnQJZHJpdmUgPSBET1NfR0VUX0RSSVZFKEJMX3JlZyhjb250ZXh0KSk7CiAKLQkgICAgZnByaW50ZihzdGRuaW1wLCJwcm9ncmFtIHRyaWVkIHRvIHdyaXRlIHRvIGJsb2NrIGRldmljZSBjb250cm9sIGNoYW5uZWwgb2YgZHJpdmUgJWQ6XG4iLGRyaXZlKTsKLQkgICAgZm9yIChpPTA7aTxDWF9yZWcoY29udGV4dCk7aSsrKQorCSAgICBGSVhNRShpbnQyMSwicHJvZ3JhbSB0cmllZCB0byB3cml0ZSB0byBibG9jayBkZXZpY2UgY29udHJvbCBjaGFubmVsIG9mIGRyaXZlICVkOlxuIixkcml2ZSk7CisJICAgIC8qIGZvciAoaT0wO2k8Q1hfcmVnKGNvbnRleHQpO2krKykKIAkgICAgCWZwcmludGYoc3RkbmltcCwiJTAyeCAiLGRhdGFwdHJbaV0pOwotCSAgICBmcHJpbnRmKHN0ZG5pbXAsIlxuIik7CisJICAgIGZwcmludGYoc3RkbmltcCwiXG4iKTsqLwogCSAgICBBWF9yZWcoY29udGV4dCk9Q1hfcmVnKGNvbnRleHQpOwogCSAgICBicmVhazsKIAl9CiAgICAgICAgIGNhc2UgMHgwODogICAvKiBDaGVjayBpZiBkcml2ZSBpcyByZW1vdmFibGUuICovCisgICAgICAgICAgICBUUkFDRShpbnQyMSwiSU9DVEwgLSBDSEVDSyBJRiBCTE9DSyBERVZJQ0UgUkVNT1ZBQkxFIGZvciBkcml2ZSAlc1xuIiwKKwkJIElOVDIxX0RyaXZlTmFtZSggQkxfcmVnKGNvbnRleHQpKSk7CiAgICAgICAgICAgICBzd2l0Y2goR2V0RHJpdmVUeXBlMTYoIERPU19HRVRfRFJJVkUoIEJMX3JlZyhjb250ZXh0KSApKSkKICAgICAgICAgICAgIHsKICAgICAgICAgICAgIGNhc2UgRFJJVkVfQ0FOTk9UREVURVJNSU5FOgpAQCAtMTIyNCw2ICsxMzA3LDggQEAKICAgICAgICAgICAgIGJyZWFrOwogCiAgICAgICAgIGNhc2UgMHgwOTogICAvKiBDSEVDSyBJRiBCTE9DSyBERVZJQ0UgUkVNT1RFICovCisgICAgICAgICAgICBUUkFDRShpbnQyMSwiSU9DVEwgLSBDSEVDSyBJRiBCTE9DSyBERVZJQ0UgUkVNT1RFIGZvciBkcml2ZSAlc1xuIiwKKwkJIElOVDIxX0RyaXZlTmFtZSggQkxfcmVnKGNvbnRleHQpKSk7IAogICAgICAgICAgICAgc3dpdGNoKEdldERyaXZlVHlwZTE2KCBET1NfR0VUX0RSSVZFKCBCTF9yZWcoY29udGV4dCkgKSkpCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICBjYXNlIERSSVZFX0NBTk5PVERFVEVSTUlORToKQEAgLTEyNDEsNiArMTMyNiw3IEBACiAgICAgICAgICAgICBicmVhazsKIAogICAgICAgICBjYXNlIDB4MGE6IC8qIGNoZWNrIGlmIGhhbmRsZSAoQlgpIGlzIHJlbW90ZSAqLworICAgICAgICAgICAgVFJBQ0UoaW50MjEsIklPQ1RMIC0gQ0hFQ0sgSUYgSEFORExFICVkIElTIFJFTU9URVxuIixCWF9yZWcoY29udGV4dCkpOwogICAgICAgICAgICAgLyogcmV0dXJucyBEWCwgYml0IDE1IHNldCBpZiByZW1vdGUsIGJpdCAxNCBzZXQgaWYgZGF0ZS90aW1lCiAgICAgICAgICAgICAgKiBub3Qgc2V0IG9uIGNsb3NlCiAgICAgICAgICAgICAgKi8KQEAgLTEyNDgsNiArMTMzNCw4IEBACiAgICAgICAgICAgICBicmVhazsKIAogICAgICAgICBjYXNlIDB4MGI6ICAgLyogU0VUIFNIQVJJTkcgUkVUUlkgQ09VTlQgKi8KKyAgICAgICAgICAgIFRSQUNFKGludDIxLCJJT0NUTCAtIFNFVCBTSEFSSU5HIFJFVFJZIENPVU5UIHBhdXNlICVkIHJldHJpZXMgJWRcbiIsCisJCSBDWF9yZWcoY29udGV4dCksIERYX3JlZyhjb250ZXh0KSk7CiAgICAgICAgICAgICBpZiAoIUNYX3JlZyhjb250ZXh0KSkKICAgICAgICAgICAgIHsgCiAgICAgICAgICAgICAgICAgQVhfcmVnKGNvbnRleHQpID0gMTsKQEAgLTEyNjEsMTYgKzEzNDksMjIgQEAKICAgICAgICAgICAgIGJyZWFrOwogCiAgICAgICAgIGNhc2UgMHgwZDoKKyAgICAgICAgICAgIFRSQUNFKGludDIxLCJJT0NUTCAtIEdFTkVSSUMgQkxPQ0sgREVWSUNFIFJFUVVFU1QgJXNcbiIsCisJCSAgSU5UMjFfRHJpdmVOYW1lKCBCTF9yZWcoY29udGV4dCkpKTsKICAgICAgICAgICAgIGJTZXRET1NFeHRlbmRlZEVycm9yID0gaW9jdGxHZW5lcmljQmxrRGV2UmVxKGNvbnRleHQpOwogICAgICAgICAgICAgYnJlYWs7CiAKIAljYXNlIDB4MGU6IC8qIGdldCBsb2dpY2FsIGRyaXZlIG1hcHBpbmcgKi8KKyAgICAgICAgICAgIFRSQUNFKGludDIxLCJJT0NUTCAtIEdFVCBMT0dJQ0FMIERSSVZFIE1BUCBmb3IgZHJpdmUgJXNcbiIsCisJCSAgSU5UMjFfRHJpdmVOYW1lKCBCTF9yZWcoY29udGV4dCkpKTsKIAkgICAgQUxfcmVnKGNvbnRleHQpID0gMDsgLyogZHJpdmUgaGFzIG5vIG1hcHBpbmcgLSBGSVhNRTogbWF5IGJlIHdyb25nKi8KIAkgICAgYnJlYWs7CiAKICAgICAgICAgY2FzZSAweDBGOiAgIC8qIFNldCBsb2dpY2FsIGRyaXZlIG1hcHBpbmcgKi8KIAkgICAgewogCSAgICBpbnQgZHJpdmU7CisgICAgICAgICAgICBUUkFDRShpbnQyMSwiSU9DVEwgLSBTRVQgTE9HSUNBTCBEUklWRSBNQVAgZm9yIGRyaXZlICVzXG4iLAorCQkgIElOVDIxX0RyaXZlTmFtZSggQkxfcmVnKGNvbnRleHQpKSk7IAogCSAgICBkcml2ZSA9IERPU19HRVRfRFJJVkUgKCBCTF9yZWcoY29udGV4dCkgKTsKIAkgICAgaWYgKCAhIERSSVZFX1NldExvZ2ljYWxNYXBwaW5nICggZHJpdmUsIGRyaXZlKzEgKSApCiAJICAgIHsKQEAgLTEyODcsMjQgKzEzODEsMjUgQEAKICAgICAgICAgYnJlYWs7CiAKICAgICBjYXNlIDB4NDU6IC8qICJEVVAiIC0gRFVQTElDQVRFIEZJTEUgSEFORExFICovCisgICAgICAgIFRSQUNFKGludDIxLCJEVVAgLSBEVVBMSUNBVEUgRklMRSBIQU5ETEUgJWRcbiIsQlhfcmVnKGNvbnRleHQpKTsKICAgICAgICAgYlNldERPU0V4dGVuZGVkRXJyb3IgPSAoKEFYX3JlZyhjb250ZXh0KSA9IEZJTEVfRHVwKEJYX3JlZyhjb250ZXh0KSkpID09IChXT1JEKUhGSUxFX0VSUk9SMTYpOwogICAgICAgICBicmVhazsKIAogICAgIGNhc2UgMHg0NjogLyogIkRVUDIiLCAiRk9SQ0VEVVAiIC0gRk9SQ0UgRFVQTElDQVRFIEZJTEUgSEFORExFICovCisgICAgICAgIFRSQUNFKGludDIxLCJGT1JDRURVUCAtIEZPUkNFIERVUExJQ0FURSBGSUxFIEhBTkRMRSAlZCB0byAlZFxuIiwKKwkgICAgICBCWF9yZWcoY29udGV4dCksQ1hfcmVnKGNvbnRleHQpKTsKICAgICAgICAgYlNldERPU0V4dGVuZGVkRXJyb3IgPSAoRklMRV9EdXAyKCBCWF9yZWcoY29udGV4dCksIENYX3JlZyhjb250ZXh0KSApID09IEhGSUxFX0VSUk9SMzIpOwogICAgICAgICBicmVhazsKIAogICAgIGNhc2UgMHg0NzogLyogIkNXRCIgLSBHRVQgQ1VSUkVOVCBESVJFQ1RPUlkgKi8KKyAgICAgICAgVFJBQ0UoaW50MjEsIkNXRCAtIEdFVCBDVVJSRU5UIERJUkVDVE9SWSBmb3IgZHJpdmUgJXNcbiIsCisJICAgICAgSU5UMjFfRHJpdmVOYW1lKCBETF9yZWcoY29udGV4dCkpKTsKICAgICAgICAgYlNldERPU0V4dGVuZGVkRXJyb3IgPSAhSU5UMjFfR2V0Q3VycmVudERpcmVjdG9yeShjb250ZXh0KTsKICAgICAgICAgYnJlYWs7CiAKLSAgICBjYXNlIDB4NDg6IC8qIEFMTE9DQVRFIE1FTU9SWSAqLwotICAgIGNhc2UgMHg0OTogLyogRlJFRSBNRU1PUlkgKi8KLSAgICBjYXNlIDB4NGE6IC8qIFJFU0laRSBNRU1PUlkgQkxPQ0sgKi8KLSAgICAgICAgSU5UX0JBUkYoIGNvbnRleHQsIDB4MjEgKTsKLSAgICAgICAgYnJlYWs7Ci0JCiAgICAgY2FzZSAweDRiOiAvKiAiRVhFQyIgLSBMT0FEIEFORC9PUiBFWEVDVVRFIFBST0dSQU0gKi8KKyAgICAgICAgVFJBQ0UoaW50MjEsIkVYRUMgJXNcbiIsCisJICAgICAgKExQQ1NUUilQVFJfU0VHX09GRl9UT19MSU4oIERTX3JlZyhjb250ZXh0KSxEWF9yZWcoY29udGV4dCkgKSk7CiAgICAgICAgIEFYX3JlZyhjb250ZXh0KSA9IFdpbkV4ZWMxNiggUFRSX1NFR19PRkZfVE9fTElOKCBEU19yZWcoY29udGV4dCksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEWF9yZWcoY29udGV4dCkgKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTV19OT1JNQUwgKTsKQEAgLTEzMTIsMTggKzE0MDcsMjMgQEAKICAgICAgICAgYnJlYWs7CQkKIAkKICAgICBjYXNlIDB4NGM6IC8qICJFWElUIiAtIFRFUk1JTkFURSBXSVRIIFJFVFVSTiBDT0RFICovCisgICAgICAgIFRSQUNFKGludDIxLCJFWElUIHdpdGggcmV0dXJuIGNvZGUgJWRcbiIsQUxfcmVnKGNvbnRleHQpKTsKICAgICAgICAgVEFTS19LaWxsQ3VycmVudFRhc2soIEFMX3JlZyhjb250ZXh0KSApOwogICAgICAgICBicmVhazsKIAogICAgIGNhc2UgMHg0ZDogLyogR0VUIFJFVFVSTiBDT0RFICovCisgICAgICAgIFRSQUNFKGludDIxLCJHRVQgUkVUVVJOIENPREUgKEVSUk9STEVWRUwpXG4iKTsKICAgICAgICAgQVhfcmVnKGNvbnRleHQpID0gMDsgLyogbm9ybWFsIGV4aXQgKi8KICAgICAgICAgYnJlYWs7CiAKICAgICBjYXNlIDB4NGU6IC8qICJGSU5ERklSU1QiIC0gRklORCBGSVJTVCBNQVRDSElORyBGSUxFICovCisgICAgICAgIFRSQUNFKGludDIxLCJGSU5ERklSU1QgbWFzayAweCUwNHggc3BlYyAlc1xuIixDWF9yZWcoY29udGV4dCksCisJICAgICAgKExQQ1NUUilQVFJfU0VHX09GRl9UT19MSU4oIERTX3JlZyhjb250ZXh0KSwgRFhfcmVnKGNvbnRleHQpKSk7CiAgICAgICAgIGlmICghSU5UMjFfRmluZEZpcnN0KGNvbnRleHQpKSBicmVhazsKICAgICAgICAgLyogZmFsbCB0aHJvdWdoICovCiAKICAgICBjYXNlIDB4NGY6IC8qICJGSU5ETkVYVCIgLSBGSU5EIE5FWFQgTUFUQ0hJTkcgRklMRSAqLworICAgICAgICBUUkFDRShpbnQyMSwiRklORE5FWFRcbiIpOwogICAgICAgICBpZiAoIUlOVDIxX0ZpbmROZXh0KGNvbnRleHQpKQogICAgICAgICB7CiAgICAgICAgICAgICBET1NfRVJST1IoIEVSX05vTW9yZUZpbGVzLCBFQ19NZWRpYUVycm9yLCBTQV9BYm9ydCwgRUxfRGlzayApOwpAQCAtMTMzNCwxMyArMTQzNCwyMCBAQAogICAgICAgICBicmVhazsKIAogICAgIGNhc2UgMHg1MTogLyogR0VUIFBTUCBBRERSRVNTICovCisgICAgICAgIFRSQUNFKGludDIxLCJHRVQgQ1VSUkVOVCBQUk9DRVNTIElEIChHRVQgUFNQIEFERFJFU1MpXG4iKTsKKyAgICAgICAgLyogRklYTUU6IHNob3VsZCB3ZSByZXR1cm4gdGhlIG9yaWdpbmFsIERPUyBQU1AgdXBvbiAqLworICAgICAgICAvKiAgICAgICAgV2luZG93cyBzdGFydHVwID8gKi8KKyAgICAgICAgQlhfcmVnKGNvbnRleHQpID0gR2V0Q3VycmVudFBEQigpOworICAgICAgICBicmVhazsKICAgICBjYXNlIDB4NjI6IC8qIEdFVCBQU1AgQUREUkVTUyAqLworICAgICAgICBUUkFDRShpbnQyMSwiR0VUIENVUlJFTlQgUFNQIEFERFJFU1NcbiIpOwogICAgICAgICAvKiBGSVhNRTogc2hvdWxkIHdlIHJldHVybiB0aGUgb3JpZ2luYWwgRE9TIFBTUCB1cG9uICovCiAgICAgICAgIC8qICAgICAgICBXaW5kb3dzIHN0YXJ0dXAgPyAqLwogICAgICAgICBCWF9yZWcoY29udGV4dCkgPSBHZXRDdXJyZW50UERCKCk7CiAgICAgICAgIGJyZWFrOwogCiAgICAgY2FzZSAweDUyOiAvKiAiU1lTVkFSUyIgLSBHRVQgTElTVCBPRiBMSVNUUyAqLworICAgICAgICBUUkFDRShpbnQyMSwiU1lTVkFSUyAtIEdFVCBMSVNUIE9GIExJU1RTXG4iKTsKICAgICAgICAgewogICAgICAgICAgICAgICAgIFNFR1BUUiBsb2w7CiAgICAgICAgICAgICAgICAgbG9sID0gSU5UMjFfR2V0TGlzdE9mTGlzdHMoKTsKQEAgLTEzNTAsNiArMTQ1Nyw5IEBACiAgICAgICAgIGJyZWFrOwogCiAgICAgY2FzZSAweDU2OiAvKiAiUkVOQU1FIiAtIFJFTkFNRSBGSUxFICovCisgICAgICAgIFRSQUNFKGludDIxLCJSRU5BTUUgJXMgdG8gJXNcbiIsCisJICAgICAgKExQQ1NUUilQVFJfU0VHX09GRl9UT19MSU4oRFNfcmVnKGNvbnRleHQpLERYX3JlZyhjb250ZXh0KSksCisJICAgICAgKExQQ1NUUilQVFJfU0VHX09GRl9UT19MSU4oRVNfcmVnKGNvbnRleHQpLERJX3JlZyhjb250ZXh0KSkpOwogICAgICAgICBiU2V0RE9TRXh0ZW5kZWRFcnJvciA9IAogCQkoIU1vdmVGaWxlMzJBKCBQVFJfU0VHX09GRl9UT19MSU4oRFNfcmVnKGNvbnRleHQpLERYX3JlZyhjb250ZXh0KSksCiAJCQkgICAgICAgUFRSX1NFR19PRkZfVE9fTElOKEVTX3JlZyhjb250ZXh0KSxESV9yZWcoY29udGV4dCkpKSk7CkBAIC0xMzYxLDYgKzE0NzEsOCBAQAogICAgICAgICBjYXNlIDB4MDA6ICAvKiBHZXQgKi8KICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICBGSUxFVElNRSBmaWxldGltZTsKKyAgICAgICAgICAgICAgICBUUkFDRShpbnQyMSwiR0VUIEZJTEUgREFURSBBTkQgVElNRSBmb3IgaGFuZGxlICVkXG4iLAorCQkgICAgICBCWF9yZWcoY29udGV4dCkpOwogICAgICAgICAgICAgICAgIGlmICghR2V0RmlsZVRpbWUoIEJYX3JlZyhjb250ZXh0KSwgTlVMTCwgTlVMTCwgJmZpbGV0aW1lICkpCiAJCSAgICAgYlNldERPU0V4dGVuZGVkRXJyb3IgPSBUUlVFOwogICAgICAgICAgICAgICAgIGVsc2UgRmlsZVRpbWVUb0Rvc0RhdGVUaW1lKCAmZmlsZXRpbWUsICZEWF9yZWcoY29udGV4dCksCkBAIC0xMzcxLDYgKzE0ODMsOCBAQAogICAgICAgICBjYXNlIDB4MDE6ICAvKiBTZXQgKi8KICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICBGSUxFVElNRSBmaWxldGltZTsKKyAgICAgICAgICAgICAgICBUUkFDRShpbnQyMSwiU0VUIEZJTEUgREFURSBBTkQgVElNRSBmb3IgaGFuZGxlICVkXG4iLAorCQkgICAgICBCWF9yZWcoY29udGV4dCkpOwogICAgICAgICAgICAgICAgIERvc0RhdGVUaW1lVG9GaWxlVGltZSggRFhfcmVnKGNvbnRleHQpLCBDWF9yZWcoY29udGV4dCksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZmlsZXRpbWUgKTsKICAgICAgICAgICAgICAgICBiU2V0RE9TRXh0ZW5kZWRFcnJvciA9IApAQCAtMTM4MSw2ICsxNDk1LDggQEAKICAgICAgICAgYnJlYWs7CiAKICAgICBjYXNlIDB4NTg6IC8qIEdFVCBPUiBTRVQgTUVNT1JZL1VNQiBBTExPQ0FUSU9OIFNUUkFURUdZICovCisJVFJBQ0UoaW50MjEsIkdFVCBPUiBTRVQgTUVNT1JZL1VNQiBBTExPQ0FUSU9OIFNUUkFURUdZIHN1YmZ1bmN0aW9uICVkXG4iLAorCSAgICAgIEFMX3JlZyhjb250ZXh0KSk7CiAgICAgICAgIHN3aXRjaCAoQUxfcmVnKGNvbnRleHQpKQogICAgICAgICB7CiAgICAgICAgIGNhc2UgMHgwMDoKQEAgLTEzOTcsMTAgKzE1MTMsMTMgQEAKICAgICAgICAgYnJlYWs7CiAKICAgICBjYXNlIDB4NWE6IC8qIENSRUFURSBURU1QT1JBUlkgRklMRSAqLworICAgICAgICBUUkFDRShpbnQyMSwiQ1JFQVRFIFRFTVBPUkFSWSBGSUxFXG4iKTsKICAgICAgICAgYlNldERPU0V4dGVuZGVkRXJyb3IgPSAhSU5UMjFfQ3JlYXRlVGVtcEZpbGUoY29udGV4dCk7CiAgICAgICAgIGJyZWFrOwogCiAgICAgY2FzZSAweDViOiAvKiBDUkVBVEUgTkVXIEZJTEUgKi8KKyAgICAgICAgVFJBQ0UoaW50MjEsIkNSRUFURSBORVcgRklMRSAweCUwMnggZm9yICVzXG4iLCBDWF9yZWcoY29udGV4dCksCisJICAgICAgKExQQ1NUUilQVFJfU0VHX09GRl9UT19MSU4oIERTX3JlZyhjb250ZXh0KSwgRFhfcmVnKGNvbnRleHQpKSk7CiAgICAgICAgIGJTZXRET1NFeHRlbmRlZEVycm9yID0gKChBWF9yZWcoY29udGV4dCkgPSAKIAkJX2xjcmVhdF91bmlxKCBQVFJfU0VHX09GRl9UT19MSU4oRFNfcmVnKGNvbnRleHQpLERYX3JlZyhjb250ZXh0KSksIDAgKSkgCiAJCQkJCQkJCT09IChXT1JEKUhGSUxFX0VSUk9SMTYpOwpAQCAtMTQwOCw2ICsxNTI3LDcgQEAKIAogICAgIGNhc2UgMHg1ZDogLyogTkVUV09SSyAqLwogICAgIGNhc2UgMHg1ZToKKyAgICAgICAgVFJBQ0UoaW50MjEsIk5ldHdvcmsgZnVuY3Rpb24gQVg9JTA0eFxuIixBWF9yZWcoY29udGV4dCkpOwogICAgICAgICAvKiBuZXR3b3JrIHNvZnR3YXJlIG5vdCBpbnN0YWxsZWQgKi8KICAgICAgICAgRE9TX0VSUk9SKCBFUl9Ob05ldHdvcmssIEVDX05vdEZvdW5kLCBTQV9BYm9ydCwgRUxfTmV0d29yayApOwogCWJTZXRET1NFeHRlbmRlZEVycm9yID0gVFJVRTsKQEAgLTE0MTcsNiArMTUzNyw3IEBACiAgICAgICAgIHN3aXRjaCAoQUxfcmVnKGNvbnRleHQpKQogICAgICAgICB7CiAgICAgICAgIGNhc2UgMHgwNzogLyogRU5BQkxFIERSSVZFICovCisgICAgICAgICAgICBUUkFDRShpbnQyMSwiRU5BQkxFIERSSVZFICVjOlxuIiwoRExfcmVnKGNvbnRleHQpKydBJykpOwogICAgICAgICAgICAgaWYgKCFEUklWRV9FbmFibGUoIERMX3JlZyhjb250ZXh0KSApKQogICAgICAgICAgICAgewogICAgICAgICAgICAgICAgIERPU19FUlJPUiggRVJfSW52YWxpZERyaXZlLCBFQ19NZWRpYUVycm9yLCBTQV9BYm9ydCwgRUxfRGlzayApOwpAQCAtMTQyNSw2ICsxNTQ2LDcgQEAKICAgICAgICAgICAgIGJyZWFrOwogCiAgICAgICAgIGNhc2UgMHgwODogLyogRElTQUJMRSBEUklWRSAqLworICAgICAgICAgICAgVFJBQ0UoaW50MjEsIkRJU0FCTEUgRFJJVkUgJWM6XG4iLChETF9yZWcoY29udGV4dCkrJ0EnKSk7CiAgICAgICAgICAgICBpZiAoIURSSVZFX0Rpc2FibGUoIERMX3JlZyhjb250ZXh0KSApKQogICAgICAgICAgICAgewogICAgICAgICAgICAgICAgIERPU19FUlJPUiggRVJfSW52YWxpZERyaXZlLCBFQ19NZWRpYUVycm9yLCBTQV9BYm9ydCwgRUxfRGlzayApOwpAQCAtMTQzNCw2ICsxNTU2LDcgQEAKIAogICAgICAgICBkZWZhdWx0OgogICAgICAgICAgICAgLyogbmV0d29yayBzb2Z0d2FyZSBub3QgaW5zdGFsbGVkICovCisgICAgICAgICAgICBUUkFDRShpbnQyMSwiTkVUV09SSyBmdW5jdGlvbiBBWD0lMDR4IG5vdCBpbXBsZW1lbnRlZFxuIixBWF9yZWcoY29udGV4dCkpOwogICAgICAgICAgICAgRE9TX0VSUk9SKCBFUl9Ob05ldHdvcmssIEVDX05vdEZvdW5kLCBTQV9BYm9ydCwgRUxfTmV0d29yayApOwogCSAgICBiU2V0RE9TRXh0ZW5kZWRFcnJvciA9IFRSVUU7CiAgICAgICAgICAgICBicmVhazsKQEAgLTE0NDEsNiArMTU2NCw4IEBACiAgICAgICAgIGJyZWFrOwogCiAgICAgY2FzZSAweDYwOiAvKiAiVFJVRU5BTUUiIC0gQ0FOT05JQ0FMSVpFIEZJTEVOQU1FIE9SIFBBVEggKi8KKyAgICAgICAgVFJBQ0UoaW50MjEsIlRSVUVOQU1FICVzXG4iLAorCSAgICAgIChMUENTVFIpUFRSX1NFR19PRkZfVE9fTElOKERTX3JlZyhjb250ZXh0KSxTSV9yZWcoY29udGV4dCkpKTsKICAgICAgICAgewogICAgICAgICAgICAgaWYgKCFHZXRGdWxsUGF0aE5hbWUzMkEoIFBUUl9TRUdfT0ZGX1RPX0xJTihEU19yZWcoY29udGV4dCksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNJX3JlZyhjb250ZXh0KSksIDEyOCwKQEAgLTE0NjAsMjAgKzE1ODUsMjUgQEAKIAogICAgIGNhc2UgMHg2NTp7LyogR0VUIEVYVEVOREVEIENPVU5UUlkgSU5GT1JNQVRJT04gKi8KICAgICAJZXh0ZXJuIFdPUkQgV0lORV9MYW5ndWFnZUlkOwotCUJZVEUgICAgKmRhdGFwdHI9UFRSX1NFR19PRkZfVE9fTElOKEVTX3JlZyhjb250ZXh0KSxESV9yZWcoY29udGV4dCkpOzsKKwlCWVRFICAgICpkYXRhcHRyPVBUUl9TRUdfT0ZGX1RPX0xJTihFU19yZWcoY29udGV4dCksRElfcmVnKGNvbnRleHQpKTsKKwlUUkFDRShpbnQyMSwiR0VUIEVYVEVOREVEIENPVU5UUlkgSU5GT1JNQVRJT04gY29kZSBwYWdlICVkIGNvdW50cnkgJWRcbiIsCisJICAgICAgQlhfcmVnKGNvbnRleHQpLCBEWF9yZWcoY29udGV4dCkpOwogICAgIAlzd2l0Y2ggKEFMX3JlZyhjb250ZXh0KSkgewogCWNhc2UgMHgwMToKKwkgICAgVFJBQ0UoaW50MjEsIlx0Z2V0IGdlbmVyYWwgaW50ZXJuYXRpb25hbGl6YXRpb24gaW5mb1xuIik7CiAJICAgIGRhdGFwdHJbMF0gPSAweDE7CiAJICAgICooV09SRCopKGRhdGFwdHIrMSkgPSA0MTsKIAkgICAgKihXT1JEKikoZGF0YXB0ciszKSA9IFdJTkVfTGFuZ3VhZ2VJZDsKIAkgICAgKihXT1JEKikoZGF0YXB0cis1KSA9IENvZGVQYWdlOwogCSAgICBicmVhazsKIAljYXNlIDB4MDY6CisJICAgIFRSQUNFKGludDIxLCJcdGdldCBwb2ludGVyIHRvIGNvbGxhdGluZyBzZXF1ZW5jZSB0YWJsZVxuIik7CiAJICAgIGRhdGFwdHJbMF0gPSAweDA2OwogCSAgICAqKERXT1JEKikoZGF0YXB0cisxKSA9IE1BS0VMT05HKERPU01FTV9Db2xsYXRlVGFibGUgJiAweEZGRkYsRE9TTUVNX0FsbG9jU2VsZWN0b3IoRE9TTUVNX0NvbGxhdGVUYWJsZT4+MTYpKTsKIAkgICAgQ1hfcmVnKGNvbnRleHQpICAgICAgICAgPSAyNTg7LypGSVhNRTogc2l6ZSBvZiB0YWJsZT8qLwogCSAgICBicmVhazsKIAlkZWZhdWx0OgorCSAgICBUUkFDRShpbnQyMSwiXHR1bmltcGxlbWVudGVkIGZ1bmN0aW9uICVkXG4iLEFMX3JlZyhjb250ZXh0KSk7CiAgICAgICAgICAgICBJTlRfQkFSRiggY29udGV4dCwgMHgyMSApOwogICAgICAgICAgICAgU0VUX0NGTEFHKGNvbnRleHQpOwogICAgIAkgICAgYnJlYWs7CkBAIC0xNDg0LDEwICsxNjE0LDEzIEBACiAgICAgICAgIHN3aXRjaCAoQUxfcmVnKGNvbnRleHQpKQogICAgICAgICB7CiAgICAgICAgIGNhc2UgMHgwMToKKwkgICAgVFJBQ0UoaW50MjEsIkdFVCBHTE9CQUwgQ09ERSBQQUdFIFRBQkxFXG4iKTsKICAgICAgICAgICAgIERYX3JlZyhjb250ZXh0KSA9IEJYX3JlZyhjb250ZXh0KSA9IENvZGVQYWdlOwogICAgICAgICAgICAgUkVTRVRfQ0ZMQUcoY29udGV4dCk7CiAgICAgICAgICAgICBicmVhazsJCQkKICAgICAgICAgY2FzZSAweDAyOiAKKwkgICAgVFJBQ0UoaW50MjEsIlNFVCBHTE9CQUwgQ09ERSBQQUdFIFRBQkxFIGFjdGl2ZSBwYWdlICVkIHN5c3RlbSBwYWdlICVkXG4iLAorCQkgIEJYX3JlZyhjb250ZXh0KSxEWF9yZWcoY29udGV4dCkpOwogICAgICAgICAgICAgQ29kZVBhZ2UgPSBCWF9yZWcoY29udGV4dCk7CiAgICAgICAgICAgICBSRVNFVF9DRkxBRyhjb250ZXh0KTsKICAgICAgICAgICAgIGJyZWFrOwpAQCAtMTQ5NSwxMiArMTYyOCwxNCBAQAogICAgICAgICBicmVhazsKIAogICAgIGNhc2UgMHg2NzogLyogU0VUIEhBTkRMRSBDT1VOVCAqLworICAgICAgICBUUkFDRShpbnQyMSwiU0VUIEhBTkRMRSBDT1VOVCB0byAlZFxuIixCWF9yZWcoY29udGV4dCkgKTsKICAgICAgICAgU2V0SGFuZGxlQ291bnQxNiggQlhfcmVnKGNvbnRleHQpICk7CiAgICAgICAgIGlmIChET1NfRXh0ZW5kZWRFcnJvcikgYlNldERPU0V4dGVuZGVkRXJyb3IgPSBUUlVFOwogICAgICAgICBicmVhazsKIAogICAgIGNhc2UgMHg2ODogLyogIkZGTFVTSCIgLSBDT01NSVQgRklMRSAqLwogICAgIGNhc2UgMHg2YTogLyogQ09NTUlUIEZJTEUgKi8KKyAgICAgICAgVFJBQ0UoaW50MjEsIkZGTFVTSC9DT01NSVQgaGFuZGxlICVkXG4iLEJYX3JlZyhjb250ZXh0KSk7CiAgICAgICAgIGJTZXRET1NFeHRlbmRlZEVycm9yID0gKCFGbHVzaEZpbGVCdWZmZXJzKCBCWF9yZWcoY29udGV4dCkgKSk7CiAgICAgICAgIGJyZWFrOwkJCiAJCkBAIC0xNTA4LDExICsxNjQzLDE1IEBACiAgICAgICAgIHN3aXRjaCAoQUxfcmVnKGNvbnRleHQpKQogICAgICAgICB7CiAgICAgICAgIGNhc2UgMHgwMDoKKwkgICAgVFJBQ0UoaW50MjEsIkdFVCBESVNLIFNFUklBTCBOVU1CRVIgZm9yIGRyaXZlICVzXG4iLAorCQkgIElOVDIxX0RyaXZlTmFtZShCTF9yZWcoY29udGV4dCkpKTsKICAgICAgICAgICAgIGlmICghSU5UMjFfR2V0RGlza1NlcmlhbE51bWJlcihjb250ZXh0KSkgYlNldERPU0V4dGVuZGVkRXJyb3IgPSBUUlVFOwogICAgICAgICAgICAgZWxzZSBBWF9yZWcoY29udGV4dCkgPSAwOwogICAgICAgICAgICAgYnJlYWs7CiAKICAgICAgICAgY2FzZSAweDAxOgorCSAgICBUUkFDRShpbnQyMSwiU0VUIERJU0sgU0VSSUFMIE5VTUJFUiBmb3IgZHJpdmUgJXNcbiIsCisJCSAgSU5UMjFfRHJpdmVOYW1lKEJMX3JlZyhjb250ZXh0KSkpOwogICAgICAgICAgICAgaWYgKCFJTlQyMV9TZXREaXNrU2VyaWFsTnVtYmVyKGNvbnRleHQpKSBiU2V0RE9TRXh0ZW5kZWRFcnJvciA9IFRSVUU7CiAgICAgICAgICAgICBlbHNlIEFYX3JlZyhjb250ZXh0KSA9IDE7CiAgICAgICAgICAgICBicmVhazsKQEAgLTE1MjAsNiArMTY1OSw4IEBACiAgICAgICAgIGJyZWFrOwogICAgIAogICAgIGNhc2UgMHg2QzogLyogRXh0ZW5kZWQgT3Blbi9DcmVhdGUqLworICAgICAgICBUUkFDRShpbnQyMSwiRVhURU5ERUQgT1BFTi9DUkVBVEUgJXNcbiIsCisJICAgICAgKExQQ1NUUilQVFJfU0VHX09GRl9UT19MSU4oIERTX3JlZyhjb250ZXh0KSwgRElfcmVnKGNvbnRleHQpKSk7CiAgICAgICAgIGJTZXRET1NFeHRlbmRlZEVycm9yID0gSU5UMjFfRXh0ZW5kZWRPcGVuQ3JlYXRlRmlsZShjb250ZXh0KTsKICAgICAgICAgYnJlYWs7CiAJCkBAIC0xNTI3LDMzICsxNjY4LDQwIEBACiAgICAgICAgIHN3aXRjaChBTF9yZWcoY29udGV4dCkpCiAgICAgICAgIHsKICAgICAgICAgY2FzZSAweDM5OiAgLyogQ3JlYXRlIGRpcmVjdG9yeSAqLworCSAgICBUUkFDRShpbnQyMSwiTE9ORyBGSUxFTkFNRSAtIE1BS0UgRElSRUNUT1JZICVzXG4iLAorCQkgIChMUENTVFIpUFRSX1NFR19PRkZfVE9fTElOKCBEU19yZWcoY29udGV4dCksRFhfcmVnKGNvbnRleHQpKSk7CiAgICAgICAgICAgICBiU2V0RE9TRXh0ZW5kZWRFcnJvciA9ICghQ3JlYXRlRGlyZWN0b3J5MzJBKCAKIAkJCQkJUFRSX1NFR19PRkZfVE9fTElOKCBEU19yZWcoY29udGV4dCksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERYX3JlZyhjb250ZXh0KSApLCBOVUxMKSk7CiAgICAgICAgICAgICBicmVhazsKICAgICAgICAgY2FzZSAweDNhOiAgLyogUmVtb3ZlIGRpcmVjdG9yeSAqLworCSAgICBUUkFDRShpbnQyMSwiTE9ORyBGSUxFTkFNRSAtIFJFTU9WRSBESVJFQ1RPUlkgJXNcbiIsCisJCSAgKExQQ1NUUilQVFJfU0VHX09GRl9UT19MSU4oIERTX3JlZyhjb250ZXh0KSxEWF9yZWcoY29udGV4dCkpKTsKICAgICAgICAgICAgIGJTZXRET1NFeHRlbmRlZEVycm9yID0gKCFSZW1vdmVEaXJlY3RvcnkzMkEoIAogCQkJCQlQVFJfU0VHX09GRl9UT19MSU4oIERTX3JlZyhjb250ZXh0KSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRFhfcmVnKGNvbnRleHQpICkpKTsKICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICBjYXNlIDB4NDM6ICAvKiBHZXQvU2V0IGZpbGUgYXR0cmlidXRlcyAqLworCSAgVFJBQ0UoaW50MjEsIkxPTkcgRklMRU5BTUUgLUVYVEVOREVEIEdFVC9TRVQgRklMRSBBVFRSSUJVVEVTICVzXG4iLAorCQkoTFBDU1RSKVBUUl9TRUdfT0ZGX1RPX0xJTiggRFNfcmVnKGNvbnRleHQpLERYX3JlZyhjb250ZXh0KSkpOwogICAgICAgICBzd2l0Y2ggKEJMX3JlZyhjb250ZXh0KSkKICAgICAgICAgewogICAgICAgICBjYXNlIDB4MDA6IC8qIEdldCBmaWxlIGF0dHJpYnV0ZXMgKi8KKyAgICAgICAgICAgIFRSQUNFKGludDIxLCJcdHJldHJpZXZlIGF0dHJpYnV0ZXNcbiIpOwogICAgICAgICAgICAgQ1hfcmVnKGNvbnRleHQpID0gKFdPUkQpR2V0RmlsZUF0dHJpYnV0ZXMzMkEoCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQVFJfU0VHX09GRl9UT19MSU4oRFNfcmVnKGNvbnRleHQpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERYX3JlZyhjb250ZXh0KSkpOwogICAgICAgICAgICAgaWYgKENYX3JlZyhjb250ZXh0KSA9PSAweGZmZmYpIGJTZXRET1NFeHRlbmRlZEVycm9yID0gVFJVRTsKICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICBjYXNlIDB4MDE6CisgICAgICAgICAgICBUUkFDRShpbnQyMSwiXHRzZXQgYXR0cmlidXRlcyAweCUwNHhcbiIsQ1hfcmVnKGNvbnRleHQpKTsKICAgICAgICAgICAgIGJTZXRET1NFeHRlbmRlZEVycm9yID0gKCFTZXRGaWxlQXR0cmlidXRlczMyQSggCiAJCQkJICAJUFRSX1NFR19PRkZfVE9fTElOKERTX3JlZyhjb250ZXh0KSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRFhfcmVnKGNvbnRleHQpKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDWF9yZWcoY29udGV4dCkgICkgKTsKICAgICAgICAgICAgIGJyZWFrOwogCWRlZmF1bHQ6Ci0JICBmcHJpbnRmKCBzdGRlcnIsIAotCQkgICAiVW5pbXBsZW1lbnRlZCBpbnQyMSBsb25nIGZpbGUgbmFtZSBmdW5jdGlvbjpcbiIpOworCSAgRklYTUUoaW50MjEsICJVbmltcGxlbWVudGVkIGxvbmcgZmlsZSBuYW1lIGZ1bmN0aW9uOlxuIik7CiAJICBJTlRfQkFSRiggY29udGV4dCwgMHgyMSApOwogCSAgU0VUX0NGTEFHKGNvbnRleHQpOwogCSAgQUxfcmVnKGNvbnRleHQpID0gMDsKQEAgLTE1NjEsMTAgKzE3MDksMTQgQEAKIAl9CiAJYnJlYWs7CiAgICAgICAgIGNhc2UgMHg0NzogIC8qIEdldCBjdXJyZW50IGRpcmVjdG9yeSAqLworCSAgICBUUkFDRShpbnQyMSwiIExPTkcgRklMRU5BTUUgLSBHRVQgQ1VSUkVOVCBESVJFQ1RPUlkgZm9yIGRyaXZlICVzXG4iLAorCQkgIElOVDIxX0RyaXZlTmFtZShETF9yZWcoY29udGV4dCkpKTsKIAkgICAgYlNldERPU0V4dGVuZGVkRXJyb3IgPSAhSU5UMjFfR2V0Q3VycmVudERpcmVjdG9yeShjb250ZXh0KTsKICAgICAgICAgICAgIGJyZWFrOwogCiAgICAgICAgIGNhc2UgMHg0ZTogIC8qIEZpbmQgZmlyc3QgZmlsZSAqLworCSAgICBUUkFDRShpbnQyMSwiIExPTkcgRklMRU5BTUUgLSBGSU5EIEZJUlNUIE1BVENISU5HIEZJTEUgZm9yICVzXG4iLAorCQkgIChMUENTVFIpUFRSX1NFR19PRkZfVE9fTElOKERTX3JlZyhjb250ZXh0KSxEWF9yZWcoY29udGV4dCkpKTsKICAgICAgICAgICAgIC8qIEZJWE1FOiB1c2UgYXR0cmlidXRlcyBpbiBDWCAqLwogICAgICAgICAgICAgaWYgKChBWF9yZWcoY29udGV4dCkgPSBGaW5kRmlyc3RGaWxlMTYoCiAgICAgICAgICAgICAgICAgICAgUFRSX1NFR19PRkZfVE9fTElOKERTX3JlZyhjb250ZXh0KSxEWF9yZWcoY29udGV4dCkpLApAQCAtMTU3NCwxNSArMTcyNiwyMSBAQAogCQliU2V0RE9TRXh0ZW5kZWRFcnJvciA9IFRSVUU7CiAgICAgICAgICAgICBicmVhazsKICAgICAgICAgY2FzZSAweDRmOiAgLyogRmluZCBuZXh0IGZpbGUgKi8KKwkgICAgVFJBQ0UoaW50MjEsIkxPTkcgRklMRU5BTUUgLSBGSU5EIE5FWFQgTUFUQ0hJTkcgRklMRSBmb3IgaGFuZGxlICVkXG4iLAorCQkgIEJYX3JlZyhjb250ZXh0KSk7CiAgICAgICAgICAgICBpZiAoIUZpbmROZXh0RmlsZTE2KCBCWF9yZWcoY29udGV4dCksCiAgICAgICAgICAgICAgICAgICAgIChXSU4zMl9GSU5EX0RBVEEzMkEgKilQVFJfU0VHX09GRl9UT19MSU4oRVNfcmVnKGNvbnRleHQpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERJX3JlZyhjb250ZXh0KSkpKQogCQliU2V0RE9TRXh0ZW5kZWRFcnJvciA9IFRSVUU7CiAgICAgICAgICAgICBicmVhazsKICAgICAgICAgY2FzZSAweGExOiAgLyogRmluZCBjbG9zZSAqLworCSAgICBUUkFDRShpbnQyMSwiTE9ORyBGSUxFTkFNRSAtIEZJTkRDTE9TRSBmb3IgaGFuZGxlICVkXG4iLAorCQkgIEJYX3JlZyhjb250ZXh0KSk7CiAgICAgICAgICAgICBiU2V0RE9TRXh0ZW5kZWRFcnJvciA9ICghRmluZENsb3NlMTYoIEJYX3JlZyhjb250ZXh0KSApKTsKICAgICAgICAgICAgIGJyZWFrOwogCWNhc2UgMHhhMDoKKwkgICAgVFJBQ0UoaW50MjEsIkxPTkcgRklMRU5BTUUgLSBHRVQgVk9MVU1FIElORk9STUFUSU9OIGZvciBkcml2ZSAlcyBzdHViXG4iLAorCQkgIChMUENTVFIpUFRSX1NFR19PRkZfVE9fTElOKCBEU19yZWcoY29udGV4dCksRFhfcmVnKGNvbnRleHQpKSk7CiAJICAgIGJyZWFrOwogICAgICAgICBjYXNlIDB4NjA6ICAKIAkgIHN3aXRjaChDTF9yZWcoY29udGV4dCkpCkBAIC0xNTk3LDggKzE3NTUsNyBAQAogCSAgICAgIGVsc2UgQVhfcmVnKGNvbnRleHQpID0gMDsKIAkgICAgICBicmVhazsKIAkgICAgZGVmYXVsdDoKLQkgICAgICBmcHJpbnRmKCBzdGRlcnIsIAotCQkgICAgICAgIlVuaW1wbGVtZW50ZWQgaW50MjEgbG9uZyBmaWxlIG5hbWUgZnVuY3Rpb246XG4iKTsKKwkgICAgICBGSVhNRShpbnQyMSwgIlVuaW1wbGVtZW50ZWQgbG9uZyBmaWxlIG5hbWUgZnVuY3Rpb246XG4iKTsKIAkgICAgICBJTlRfQkFSRiggY29udGV4dCwgMHgyMSApOwogCSAgICAgIFNFVF9DRkxBRyhjb250ZXh0KTsKIAkgICAgICBBTF9yZWcoY29udGV4dCkgPSAwOwpAQCAtMTYwNiwxMSArMTc2MywxNSBAQAogCSAgfQogCSAgICBicmVhazsKICAgICAgICAgY2FzZSAweDZjOiAgLyogQ3JlYXRlIG9yIG9wZW4gZmlsZSAqLworICAgICAgICAgICAgVFJBQ0UoaW50MjEsIkxPTkcgRklMRU5BTUUgLSBDUkVBVEUgT1IgT1BFTiBGSUxFICVzXG4iLAorCQkgKExQQ1NUUilQVFJfU0VHX09GRl9UT19MSU4oIERTX3JlZyhjb250ZXh0KSwgU0lfcmVnKGNvbnRleHQpKSk7IAogCSAgLyogdHJhbnNsYXRlIERvcyA3IGFjdGlvbiB0byBEb3MgNiBhY3Rpb24gKi8KIAkgICAgYlNldERPU0V4dGVuZGVkRXJyb3IgPSBJTlQyMV9FeHRlbmRlZE9wZW5DcmVhdGVGaWxlKGNvbnRleHQpOwogCSAgICBicmVhazsKIAogICAgICAgICBjYXNlIDB4M2I6ICAvKiBDaGFuZ2UgZGlyZWN0b3J5ICovCisgICAgICAgICAgICBUUkFDRShpbnQyMSwiTE9ORyBGSUxFTkFNRSAtIENIQU5HRSBESVJFQ1RPUlkgJXNcbiIsCisJCSAoTFBDU1RSKVBUUl9TRUdfT0ZGX1RPX0xJTiggRFNfcmVnKGNvbnRleHQpLCBEWF9yZWcoY29udGV4dCkpKTsgCiAJICAgIGlmICghU2V0Q3VycmVudERpcmVjdG9yeTMyQShQVFJfU0VHX09GRl9UT19MSU4oCiAJICAgIAkJCQkJRFNfcmVnKGNvbnRleHQpLAogCQkJCSAgICAgICAgCURYX3JlZyhjb250ZXh0KQpAQCAtMTYyMSw2ICsxNzgyLDggQEAKIAkgICAgfQogCSAgICBicmVhazsKICAgICAgICAgY2FzZSAweDQxOiAgLyogRGVsZXRlIGZpbGUgKi8KKyAgICAgICAgICAgIFRSQUNFKGludDIxLCJMT05HIEZJTEVOQU1FIC0gREVMRVRFIEZJTEUgJXNcbiIsCisJCSAoTFBDU1RSKVBUUl9TRUdfT0ZGX1RPX0xJTiggRFNfcmVnKGNvbnRleHQpLCBEWF9yZWcoY29udGV4dCkpKTsgCiAJICAgIGlmICghRGVsZXRlRmlsZTMyQShQVFJfU0VHX09GRl9UT19MSU4oCiAJICAgIAkJCQlEU19yZWcoY29udGV4dCksCiAJCQkJCURYX3JlZyhjb250ZXh0KSkKQEAgLTE2MzAsOCArMTc5MywxMSBAQAogCSAgICB9CiAJICAgIGJyZWFrOwogICAgICAgICBjYXNlIDB4NTY6ICAvKiBNb3ZlIChyZW5hbWUpIGZpbGUgKi8KKyAgICAgICAgICAgIFRSQUNFKGludDIxLCJMT05HIEZJTEVOQU1FIC0gUkVOQU1FIEZJTEUgJXMgdG8gJXMgc3R1YlxuIiwKKwkJICAoTFBDU1RSKVBUUl9TRUdfT0ZGX1RPX0xJTiggRFNfcmVnKGNvbnRleHQpLCBEWF9yZWcoY29udGV4dCkpLAorCQkgIChMUENTVFIpUFRSX1NFR19PRkZfVE9fTElOKCBFU19yZWcoY29udGV4dCksIERJX3JlZyhjb250ZXh0KSkpOyAKICAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgIGZwcmludGYoIHN0ZGVyciwgIlVuaW1wbGVtZW50ZWQgaW50MjEgbG9uZyBmaWxlIG5hbWUgZnVuY3Rpb246XG4iKTsKKyAgICAgICAgICAgIEZJWE1FKGludDIxLCAiVW5pbXBsZW1lbnRlZCBsb25nIGZpbGUgbmFtZSBmdW5jdGlvbjpcbiIpOwogICAgICAgICAgICAgSU5UX0JBUkYoIGNvbnRleHQsIDB4MjEgKTsKICAgICAgICAgICAgIFNFVF9DRkxBRyhjb250ZXh0KTsKICAgICAgICAgICAgIEFMX3JlZyhjb250ZXh0KSA9IDA7CkBAIC0xNjY1LDYgKzE4MzEsMTAgQEAKIAlTRVRfQ0ZMQUcoY29udGV4dCk7CiAgICAgfQogCisgICAgaWYgKChFRkxfcmVnKGNvbnRleHQpICYgMHgwMDAxKSkKKyAgICAgIFRSQUNFKGludDIxLCAiZmFpbGVkLCBlcnJvcmNvZGUgMHglMDJ4IGNsYXNzIDB4JTAyeCBhY3Rpb24gMHglMDJ4IGxvY3VzICUwMnhcbiIsCisJICBET1NfRXh0ZW5kZWRFcnJvciwgRE9TX0Vycm9yQ2xhc3MsIERPU19FcnJvckFjdGlvbiwgRE9TX0Vycm9yTG9jdXMpOworIAogICAgIFRSQUNFKGludDIxLCAicmV0dXJuaW5nOiBBWD0lMDR4IEJYPSUwNHggQ1g9JTA0eCBEWD0lMDR4ICIKICAgICAgICAgICAgICAgICAgIlNJPSUwNHggREk9JTA0eCBEUz0lMDR4IEVTPSUwNHggRUZMPSUwOGx4XG4iLAogICAgICAgICAgICAgICAgICBBWF9yZWcoY29udGV4dCksIEJYX3JlZyhjb250ZXh0KSwgQ1hfcmVnKGNvbnRleHQpLApAQCAtMTY3NSw2ICsxODQ1LDYgQEAKIAogRkFSUFJPQzE2IFdJTkFQSSBHZXRTZXRLZXJuZWxET1NQcm9jKEZBUlBST0MxNiBEb3NQcm9jKQogewotCWZwcmludGYoc3RkZXJyLCAiR2V0U2V0S2VybmVsRE9TUHJvYyhEb3NQcm9jOiAlMDh4KTtcbiIsIChVSU5UMzIpRG9zUHJvYyk7CisJRklYTUUoaW50MjEsICIoRG9zUHJvYz0lMDh4KTtcbiIsIChVSU5UMzIpRG9zUHJvYyk7CiAJcmV0dXJuIE5VTEw7CiB9CmRpZmYgLS1naXQgYS9tc2Rvcy9pbnQ1Yy5jIGIvbXNkb3MvaW50NWMuYwppbmRleCBlNWNjZTU3Li4wYTMyODA4IDEwMDY0NAotLS0gYS9tc2Rvcy9pbnQ1Yy5jCisrKyBiL21zZG9zL2ludDVjLmMKQEAgLTE4LDcgKzE4LDcgQEAKIHsKICAgICBCWVRFKiBwdHI7CiAgICAgcHRyID0gKEJZVEUqKSBQVFJfU0VHX09GRl9UT19MSU4oRVNfcmVnKGNvbnRleHQpLEJYX3JlZyhjb250ZXh0KSk7Ci0gICAgZnByaW50ZihzdGRuaW1wLCJOZXRCSU9TQ2FsbDogY29tbWFuZCBjb2RlICUwMnggKGlnbm9yZWQpXG4iLCpwdHIpOworICAgIEZJWE1FKGludCwiKCVwKTogY29tbWFuZCBjb2RlICUwMnggKGlnbm9yZWQpXG4iLGNvbnRleHQsICpwdHIpOwogICAgIEFMX3JlZyhjb250ZXh0KSA9ICoocHRyKzB4MDEpID0gMHhGQjsgLyogTmV0QklPUyBlbXVsYXRvciBub3QgZm91bmQgKi8KIH0KIApkaWZmIC0tZ2l0IGEvbXVsdGltZWRpYS9NYWtlZmlsZS5pbiBiL211bHRpbWVkaWEvTWFrZWZpbGUuaW4KaW5kZXggY2M3NDQ2ZC4uYTA0Y2I1NSAxMDA2NDQKLS0tIGEvbXVsdGltZWRpYS9NYWtlZmlsZS5pbgorKysgYi9tdWx0aW1lZGlhL01ha2VmaWxlLmluCkBAIC04LDYgKzgsNyBAQAogQ19TUkNTID0gXAogCWF1ZGlvLmMgXAogCWRzb3VuZC5jIFwKKwlpbml0LmMgXAogCWpveXN0aWNrLmMgXAogCW1jaWFuaW0uYyBcCiAJbWNpY2RhLmMgXApkaWZmIC0tZ2l0IGEvbXVsdGltZWRpYS9pbml0LmMgYi9tdWx0aW1lZGlhL2luaXQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kYzMxZWZiCi0tLSAvZGV2L251bGwKKysrIGIvbXVsdGltZWRpYS9pbml0LmMKQEAgLTAsMCArMSwxODEgQEAKKy8qCisgKiBJbml0aWFsaXphdGlvbiBwcm9jZWR1cmVzIGZvciBtdWx0aW1lZGlhCisgKgorICogQ29weXJpZ2h0IDE5OTggTHVpeiBPdGF2aW8gTC4gWm9yemVsbGEKKyAqLworCisjaW5jbHVkZSA8dW5pc3RkLmg+CisjaW5jbHVkZSA8ZmNudGwuaD4KKyNpbmNsdWRlIDxzeXMvaW9jdGwuaD4KKyNpbmNsdWRlICJ3aW5kb3dzLmgiCisjaW5jbHVkZSAibXVsdGltZWRpYS5oIgorI2luY2x1ZGUgIm1tc3lzdGVtLmgiCisjaW5jbHVkZSAieG1hbGxvYy5oIgorI2luY2x1ZGUgImRlYnVnLmgiCisKKyNpZiBkZWZpbmVkIChfX0hBU19TT1VORENBUkRfSF9fKQorCitleHRlcm4gaW50IE1PRE1fTlVNREVWUzsKK2V4dGVybiBMUE1JRElPVVRDQVBTMTYgbWlkaURldmljZXNbTUFYX01JRElPVVREUlZdOworCisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiAJCQl1bml4VG9XaW5kb3dzRGV2aWNlVHlwZSAgCQlbaW50ZXJuYWxdCisgKgorICogcmV0dXJuIHRoZSBXaW5kb3dzIGVxdWl2YWxlbnQgdG8gYSBVbml4IERldmljZSBUeXBlCisgKgorICovCisjaWYgZGVmaW5lZCAoX19IQVNfU09VTkRDQVJEX0hfXykKK2ludCB1bml4VG9XaW5kb3dzRGV2aWNlVHlwZShpbnQgdHlwZSkKK3sKKyAgLyogTU9EX01JRElQT1JUICAgICBvdXRwdXQgcG9ydCAKKyAgICogTU9EX1NZTlRIICAgICAgICBnZW5lcmljIGludGVybmFsIHN5bnRoIAorICAgKiBNT0RfU1FTWU5USCAgICAgIHNxdWFyZSB3YXZlIGludGVybmFsIHN5bnRoIAorICAgKiBNT0RfRk1TWU5USCAgICAgIEZNIGludGVybmFsIHN5bnRoIAorICAgKiBNT0RfTUFQUEVSICAgICAgIE1JREkgbWFwcGVyCisgICAqLworCisgIC8qIEZJWE1FIElzIHRoaXMgcmVhbGx5IHRoZSBjb3JyZWN0IGVxdWl2YWxlbmNlIGZyb20gVU5JWCB0byBXaW5kb3dzIFNvdW5kIHR5cGUgKi8KKworICBzd2l0Y2ggKHR5cGUpIHsKKyAgY2FzZSBTWU5USF9UWVBFX0ZNOiAgICAgcmV0dXJuIE1PRF9GTVNZTlRIOworICBjYXNlIFNZTlRIX1RZUEVfU0FNUExFOiByZXR1cm4gTU9EX1NZTlRIOworICBjYXNlIFNZTlRIX1RZUEVfTUlESTogICByZXR1cm4gTU9EX01JRElQT1JUOworICBkZWZhdWx0OgorICAgIEVSUihtaWRpLCAiQ2Fubm90IGRldGVybWluZSB0aGUgdHlwZSBvZiB0aGlzIG1pZGkgZGV2aWNlLiBBc3N1bWluZyBGTSBTeW50aFxuIik7CisgICAgcmV0dXJuIE1PRF9GTVNZTlRIOworICB9Cit9CisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiAJCQlNdWx0aW1lZGlhSW5pdAkJCQlbaW50ZXJuYWxdCisgKgorICogSW5pdGlhbGl6ZXMgdGhlIE1JREkgZGV2aWNlcyBpbmZvcm1hdGlvbiB2YXJpYWJsZXMKKyAqCisgKi8KK0JPT0wzMiBNVUxUSU1FRElBX0luaXQgKHZvaWQpCit7CisjaWYgZGVmaW5lZCAoX19IQVNfU09VTkRDQVJEX0hfXykKKyAgaW50IGksIHN0YXR1cywgbnVtc3ludGhkZXZzLCBudW1taWRpZGV2czsKKyAgc3RydWN0IHN5bnRoX2luZm8gc2luZm87CisgIHN0cnVjdCBtaWRpX2luZm8gbWluZm87CisgIGludCBmZDsgICAgICAgIC8qIGZpbGUgZGVzY3JpcHRvciBmb3IgTUlESV9ERVYgKi8KKyAgTFBNSURJT1VUQ0FQUzE2IHRtcGxwQ2FwcyA9IE5VTEw7CisKKyAgVFJBQ0UgKG1pZGksICJJbml0aWFsaXppbmcgdGhlIE1JREkgdmFyaWFibGVzLlxuIik7CisgIC8qIHRyeSB0byBvcGVuIGRldmljZSAqLworICBmZCA9IG9wZW4oTUlESV9ERVYsIE9fV1JPTkxZKTsKKyAgaWYgKGZkID09IC0xKSB7CisgICAgVFJBQ0UgKG1pZGksICJObyBzb3VuZGNhcmRzIGZvdW5kczogdW5hYmxlIHRvIG9wZW4gYCVzJy5cbiIsIE1JRElfREVWKTsKKyAgICByZXR1cm4gVFJVRTsKKyAgfQorCisgIC8qIGZpbmQgaG93IG1hbnkgU3ludGggZGV2aWNlcyBhcmUgdGhlcmUgaW4gdGhlIHN5c3RlbSAqLworICBzdGF0dXMgPSBpb2N0bChmZCwgU05EQ1RMX1NFUV9OUlNZTlRIUywgJm51bXN5bnRoZGV2cyk7CisKKyAgaWYgKG51bXN5bnRoZGV2cyA+IE1BWF9NSURJT1VURFJWKSB7CisgICAgRVJSIChtaWRpLCAiTUFYX01JRElPVVREUlYgd2FzIGVub3VnaCBmb3IgdGhlIG51bWJlciBvZiBkZXZpY2VzLiBTb21lIEZNIGRldmljZXMgd2lsbCBub3QgYmUgYXZhaWxhYmxlLlxuIik7CisgICAgbnVtc3ludGhkZXZzID0gTUFYX01JRElPVVREUlY7CisgIH0KKyAgCisgIGlmIChzdGF0dXMgPT0gLTEpIHsKKyAgICBFUlIgKG1pZGksICJpb2N0bCBmYWlsZWQuXG4iKTsKKyAgICByZXR1cm4gVFJVRTsKKyAgfQorCisgIGZvciAoaSA9IDAgOyBpIDwgbnVtc3ludGhkZXZzIDsgaSsrKSB7CisgICAgc2luZm8uZGV2aWNlID0gaTsKKyAgICBzdGF0dXMgPSBpb2N0bChmZCwgU05EQ1RMX1NZTlRIX0lORk8sICZzaW5mbyk7CisgICAgaWYgKHN0YXR1cyA9PSAtMSkgeworICAgICAgRVJSKG1pZGksICJpb2N0bCBmYWlsZWQuXG4iKTsKKyAgICAgIHJldHVybiBUUlVFOworICAgIH0KKworICAgIHRtcGxwQ2FwcyA9IHhtYWxsb2MgKHNpemVvZiAoTUlESU9VVENBUFMxNikpOworICAgIC8qIFdlIGFsc28gaGF2ZSB0aGUgaW5mb3JtYXRpb24gc2luZm8uc3ludGhfc3VidHlwZSwgbm90IHVzZWQgaGVyZQorICAgICAqLworICAgIAorICAgIC8qIE1hbnVmYWMgSUQuIFdlIGRvIG5vdCBoYXZlIGFjY2VzcyB0byB0aGlzIHdpdGggc291bmRjYXJkLmgKKyAgICAgKiBEb2VzIG5vdCBzZWVtIHRvIGJlIGEgcHJvYmxlbSwgYmVjYXVzZSBpbiBtbXN5c3RlbS5oIG9ubHkKKyAgICAgKiBNaWNyb3NvZnQncyBJRCBpcyBsaXN0ZWQuCisgICAgICovCisgICAgdG1wbHBDYXBzLT53TWlkID0gMHgwMEZGOyAKKyAgICB0bXBscENhcHMtPndQaWQgPSAweDAwMDE7IAkvKiBGSVhNRSBQcm9kdWN0IElEICAqLworICAgIHRtcGxwQ2Fwcy0+dkRyaXZlclZlcnNpb24gPSAweDAwMTsgLyogUHJvZHVjdCBWZXJzaW9uLiBXZSBzaW1wbHkgc2F5ICIxIiAqLworICAgIHN0cmNweSh0bXBscENhcHMtPnN6UG5hbWUsIHNpbmZvLm5hbWUpOworCisgICAgdG1wbHBDYXBzLT53VGVjaG5vbG9neSA9IHVuaXhUb1dpbmRvd3NEZXZpY2VUeXBlIChzaW5mby5zeW50aF90eXBlKTsKKyAgICB0bXBscENhcHMtPndWb2ljZXMgICAgID0gc2luZm8ubnJfdm9pY2VzOworCisgICAgLyogRklYTUUgSXMgaXQgcG9zc2libGUgdG8ga25vdyB0aGUgbWF4aW11bQorICAgICAqIG51bWJlciBvZiBzaW11bHRhbmVvdXMgbm90ZXMgb2YgYSBzb3VuZGNhcmQgPworICAgICAqIEkgYmVsZWl2ZSB3ZSBkb24ndCBoYXZlIHRoaXMgaW5mb3JtYXRpb24sIGJ1dAorICAgICAqIGl0J3MgcHJvYmFibHkgZXF1YWwgb3IgbW9yZSB0aGFuIHdWb2ljZXMKKyAgICAgKi8KKyAgICB0bXBscENhcHMtPndOb3RlcyAgICAgID0gc2luZm8ubnJfdm9pY2VzOyAgCisKKyAgICAvKiBGSVhNRSBEbyB3ZSBoYXZlIHRoaXMgaW5mb3JtYXRpb24/CisgICAgICogQXNzdW1pbmcgdGhlIHNvdW5kY2FyZHMgY2FuIGhhbmRsZQorICAgICAqIE1JRElDQVBTX1ZPTFVNRSBhbmQgTUlESUNBUFNfTFJWT0xVTUUgYnV0CisgICAgICogbm90IE1JRElDQVBTX0NBQ0hFLgorICAgICAqLworICAgIHRtcGxwQ2Fwcy0+ZHdTdXBwb3J0ICAgPSBNSURJQ0FQU19WT0xVTUV8TUlESUNBUFNfTFJWT0xVTUU7CisgICAgCisgICAgbWlkaURldmljZXNbaV0gPSB0bXBscENhcHM7CisgICAgCisgICAgVFJBQ0UobWlkaSwidGVjaG4gPSAlZCB2b2ljZXM9JWQgbm90ZXMgPSAlZCBzdXBwb3J0ID0gJWxkXG4iLHRtcGxwQ2Fwcy0+d1RlY2hub2xvZ3ksdG1wbHBDYXBzLT53Vm9pY2VzLHRtcGxwQ2Fwcy0+d05vdGVzLHRtcGxwQ2Fwcy0+ZHdTdXBwb3J0KTsKKyAgfQorICAKKyAgLyogZmluZCBob3cgbWFueSBNSURJIGRldmljZXMgYXJlIHRoZXJlIGluIHRoZSBzeXN0ZW0gKi8KKyAgc3RhdHVzID0gaW9jdGwoZmQsIFNORENUTF9TRVFfTlJNSURJUywgJm51bW1pZGlkZXZzKTsKKyAgaWYgKHN0YXR1cyA9PSAtMSkgeworICAgIEVSUihtaWRpLCAiaW9jdGwgZmFpbGVkLlxuIik7CisgICAgcmV0dXJuIFRSVUU7CisgIH0KKworICBpZiAobnVtc3ludGhkZXZzICsgbnVtbWlkaWRldnMgPiBNQVhfTUlESU9VVERSVikgeworICAgIEVSUihtaWRpLCAiTUFYX01JRElPVVREUlYgd2FzIGVub3VnaCBmb3IgdGhlIG51bWJlciBvZiBkZXZpY2VzLiBTb21lIE1JREkgZGV2aWNlcyB3aWxsIG5vdCBiZSBhdmFpbGFibGUuXG4iKTsKKyAgICBudW1taWRpZGV2cyA9IE1BWF9NSURJT1VURFJWIC0gbnVtc3ludGhkZXZzOworICB9CisKKyAgLyogd2luZG93cyBkb2VzIG5vdCBzZWVtIHRvIGRpZmVyZW50aWF0ZSBTeW50aCBmcm9tIE1JREkgZGV2aWNlcyAqLworICBNT0RNX05VTURFVlMgPSBudW1zeW50aGRldnMgKyBudW1taWRpZGV2czsKKyAgCisgIGZvciAoaSA9IDAgOyBpIDwgbnVtbWlkaWRldnMgOyBpKyspIHsKKyAgICBtaW5mby5kZXZpY2UgPSBpOworICAgIHN0YXR1cyA9IGlvY3RsKGZkLCBTTkRDVExfTUlESV9JTkZPLCAmbWluZm8pOworICAgIGlmIChzdGF0dXMgPT0gLTEpIHsKKyAgICAgIEVSUihtaWRpLCAiaW9jdGwgZmFpbGVkLlxuIik7CisgICAgICByZXR1cm4gVFJVRTsKKyAgICB9CisgICAgLyogVGhpcyB3aG9sZSBwYXJ0IGlzIHNvbWV3aGF0IG9ic2N1cmUgdG8gbWUuIEknbGwga2VlcCB0cnlpbmcgdG8gZGlnCisgICAgICAgaW5mbyBhYm91dCBpdC4gSWYgeW91IGhhcHBlbiB0byBrbm93LCBwbGVhc2UgdGVsbCB1cy4gVGhlIHZlcnkgZGVzY3JpdGl2ZQorICAgICAgIG1pbmZvLmRldl90eXBlIHdhcyBub3QgdXNlZCBoZXJlLgorICAgICAqLworICAgIHRtcGxwQ2Fwcy0+d01pZCA9IDB4MDBGRjsgCS8qIE1hbnVmYWMgSUQuIFdlIGRvIG5vdCBoYXZlIGFjY2VzcyB0byB0aGlzIHdpdGggc291bmRjYXJkLmgKKwkJCQkgICBEb2VzIG5vdCBzZWVtIHRvIGJlIGEgcHJvYmxlbSwgYmVjYXVzZSBpbiBtbXN5c3RlbS5oIG9ubHkKKwkJCQkgICBNaWNyb3NvZnQncyBJRCBpcyBsaXN0ZWQgKi8KKyAgICB0bXBscENhcHMtPndQaWQgPSAweDAwMDE7IAkvKiBGSVhNRSBQcm9kdWN0IElEICovCisgICAgdG1wbHBDYXBzLT52RHJpdmVyVmVyc2lvbiA9IDB4MDAxOyAvKiBQcm9kdWN0IFZlcnNpb24uIFdlIHNpbXBseSBzYXkgIjEiICovCisgICAgc3RyY3B5KHRtcGxwQ2Fwcy0+c3pQbmFtZSwgbWluZm8ubmFtZSk7CisKKyAgICB0bXBscENhcHMtPndUZWNobm9sb2d5ID0gIE1PRF9NSURJUE9SVDsgLyogRklYTUUgSXMgdGhpcyByaWdodD8gKi8KKyAgICB0bXBscENhcHMtPndWb2ljZXMgICAgID0gMTY7ICAgICAgICAgICAgLyogRG9lcyBpdCBtYWtlIGFueSBkaWZmZXJlbmNlPyAqLworICAgIHRtcGxwQ2Fwcy0+d05vdGVzICAgICAgPSAxNjsgICAgICAgICAgICAvKiBEb2VzIGl0IG1ha2UgYW55IGRpZmZlcmVuY2U/ICovCisgICAgdG1wbHBDYXBzLT5kd1N1cHBvcnQgICA9IE1JRElDQVBTX1ZPTFVNRXxNSURJQ0FQU19MUlZPTFVNRTsgLyogRklYTUUgRG9lcyBpdCBtYWtlIGFueSBkaWZmZXJlbmNlPyAqLworCisgICAgbWlkaURldmljZXNbbnVtc3ludGhkZXZzICsgaV0gPSB0bXBscENhcHM7CisKKyAgICBUUkFDRShtaWRpLCJ0ZWNobiA9ICVkIHZvaWNlcz0lZCBub3RlcyA9ICVkIHN1cHBvcnQgPSAlbGRcbiIsdG1wbHBDYXBzLT53VGVjaG5vbG9neSx0bXBscENhcHMtPndWb2ljZXMsdG1wbHBDYXBzLT53Tm90ZXMsdG1wbHBDYXBzLT5kd1N1cHBvcnQpOworICB9CisgIAorICAvKiBjbG9zZSBmaWxlIGFuZCBleGl0ICovCisgIGNsb3NlKGZkKTsKKworI2VuZGlmIC8qIF9fSEFTX1NPVU5EQ0FSRF9IX18gKi8KKyAgCisgIHJldHVybiBUUlVFOworICAKK30KZGlmZiAtLWdpdCBhL211bHRpbWVkaWEvbWNpYW5pbS5jIGIvbXVsdGltZWRpYS9tY2lhbmltLmMKaW5kZXggODBkODk3MC4uN2I5Mzc5YiAxMDA2NDQKLS0tIGEvbXVsdGltZWRpYS9tY2lhbmltLmMKKysrIGIvbXVsdGltZWRpYS9tY2lhbmltLmMKQEAgLTU0Miw4ICs1NDIsNyBAQAogc3RhdGljIERXT1JEIEFOSU1fbWNpU2V0KFVJTlQxNiB3RGV2SUQsIERXT1JEIGR3RmxhZ3MsIExQTUNJX1NFVF9QQVJNUyBscFBhcm1zKQogewogI2lmIGRlZmluZWQobGludXgpIHx8IGRlZmluZWQoX19GcmVlQlNEX18pCi0JVFJBQ0UobWNpYW5pbSwiKCV1LCAlMDhsWCwgJXApO1xuIiwgCi0JCXdEZXZJRCwgZHdGbGFncywgbHBQYXJtcyk7CisJVFJBQ0UobWNpYW5pbSwiKCV1LCAlMDhsWCwgJXApO1xuIiwgd0RldklELCBkd0ZsYWdzLCBscFBhcm1zKTsKIAlpZiAobHBQYXJtcyA9PSBOVUxMKSByZXR1cm4gTUNJRVJSX0lOVEVSTkFMOwogLyoKIAlwcmludGYoIkFOSU1fbWNpU2V0IC8vIGR3VGltZUZvcm1hdD0lMDhsWFxuIiwgbHBQYXJtcy0+ZHdUaW1lRm9ybWF0KTsKZGlmZiAtLWdpdCBhL211bHRpbWVkaWEvbWNpY2RhLmMgYi9tdWx0aW1lZGlhL21jaWNkYS5jCmluZGV4IGEzZmEwNGYuLjM5YTFmMDkgMTAwNjQ0Ci0tLSBhL211bHRpbWVkaWEvbWNpY2RhLmMKKysrIGIvbXVsdGltZWRpYS9tY2ljZGEuYwpAQCAtOTMzLDggKzkzMyw3IEBACiBzdGF0aWMgRFdPUkQgQ0RBVURJT19tY2lTZXQoVUlOVDE2IHdEZXZJRCwgRFdPUkQgZHdGbGFncywgTFBNQ0lfU0VUX1BBUk1TIGxwUGFybXMpCiB7CiAjaWYgZGVmaW5lZChsaW51eCkgfHwgZGVmaW5lZChfX0ZyZWVCU0RfXykKLSAgICAJVFJBQ0UoY2RhdWRpbywiKCUwNFgsICUwOGxYLCAlcCk7XG4iLCAKLQkJd0RldklELCBkd0ZsYWdzLCBscFBhcm1zKTsKKyAgICAJVFJBQ0UoY2RhdWRpbywiKCUwNFgsICUwOGxYLCAlcCk7XG4iLCB3RGV2SUQsIGR3RmxhZ3MsIGxwUGFybXMpOwogCWlmIChscFBhcm1zID09IE5VTEwpIHJldHVybiBNQ0lFUlJfSU5URVJOQUw7CiAvKgogCXByaW50ZigiQ0RBVURJT19tY2lTZXQgLy8gZHdUaW1lRm9ybWF0PSUwOGxYXG4iLCBscFBhcm1zLT5kd1RpbWVGb3JtYXQpOwpkaWZmIC0tZ2l0IGEvbXVsdGltZWRpYS9tY2lzdHJpbmcuYyBiL211bHRpbWVkaWEvbWNpc3RyaW5nLmMKaW5kZXggNjJmNGNmNy4uMzMxOGQ2NSAxMDA2NDQKLS0tIGEvbXVsdGltZWRpYS9tY2lzdHJpbmcuYworKysgYi9tdWx0aW1lZGlhL21jaXN0cmluZy5jCkBAIC0xMjksNyArMTI5LDcgQEAKIAkJKTsKIAkJYnJlYWs7CiAJZGVmYXVsdDoKLQkJZnByaW50ZihzdGRuaW1wLF9fRklMRV9fIjpNQ0lTVFJfU3RhdHVzOm1pc3NpbmcgdGltZWZvcm1hdCBmb3IgJWxkLCByZXBvcnQuXG4iLHRpbWVmKTsKKwkJRklYTUUobWNpLCAibWlzc2luZyB0aW1lZm9ybWF0IGZvciAlbGQsIHJlcG9ydC5cbiIsdGltZWYpOwogCQlzdHJjcHkoYnVmLCIwIik7IC8qIGhtbSAqLwogCQlicmVhazsKIAl9CkBAIC0xNjUsNyArMTY1LDcgQEAKIAkJY2FzZSBNQ0lfU0VRX1NNUFRFOl9NQ0lfU1RSKCJzbXB0ZSIpO2JyZWFrOwogCQljYXNlIE1DSV9TRVFfRklMRTpfTUNJX1NUUigiZmlsZSIpO2JyZWFrOwogCQljYXNlIE1DSV9TRVFfTUlESTpfTUNJX1NUUigibWlkaSIpO2JyZWFrOwotCQlkZWZhdWx0OmZwcmludGYoc3RkbmltcCxfX0ZJTEVfXyI6TUNJU1RSX1N0YXR1czptaXNzaW5nIHNlcXVlbmNlciBtb2RlICVsZFxuIixkd1JldHVybik7CisJCWRlZmF1bHQ6RklYTUUobWNpLCJtaXNzaW5nIHNlcXVlbmNlciBtb2RlICVsZFxuIixkd1JldHVybik7CiAJCX0KIAkJYnJlYWs7CiAJY2FzZSBfTUNJU1RSX21vZGU6CkBAIC0yMDgsNyArMjA4LDcgQEAKIAkJY2FzZSBNQ0lfRk9STUFUX01TRjpfTUNJX1NUUigibXNmIik7YnJlYWs7CiAJCWNhc2UgTUNJX0ZPUk1BVF9UTVNGOl9NQ0lfU1RSKCJ0bXNmIik7YnJlYWs7CiAJCWRlZmF1bHQ6Ci0JCQlmcHJpbnRmKHN0ZG5pbXAsX19GSUxFX18iOk1DSVNUUl9TdGF0dXM6bWlzc2luZyB0aW1lZm9ybWF0IGZvciAlZCwgcmVwb3J0LlxuIix0aW1lZik7CisJCQlGSVhNRShtY2ksIm1pc3NpbmcgdGltZWZtdCBmb3IgJWQsIHJlcG9ydC5cbiIsdGltZWYpOwogCQkJYnJlYWs7CiAJCX0KIAkJYnJlYWs7CkBAIC0yMzMsMTEgKzIzMywxMiBAQAogCQljYXNlIE1DSV9ERVZUWVBFX09USEVSOl9NQ0lfU1RSKCJvdGhlciIpO2JyZWFrOwogCQljYXNlIE1DSV9ERVZUWVBFX1dBVkVGT1JNX0FVRElPOl9NQ0lfU1RSKCJ3YXZlZm9ybSBhdWRpbyIpO2JyZWFrOwogCQljYXNlIE1DSV9ERVZUWVBFX1NFUVVFTkNFUjpfTUNJX1NUUigic2VxdWVuY2VyIik7YnJlYWs7Ci0JCWRlZmF1bHQ6ZnByaW50ZihzdGRuaW1wLF9fRklMRV9fIjpfTUNJU1RSX2NvbnZyZXR1cm46dW5rbm93biBkZXZpY2UgdHlwZSAlbGQsIHJlcG9ydC5cbiIsZHdSZXR1cm4pO2JyZWFrOworCQlkZWZhdWx0OkZJWE1FKG1jaSwidW5rbm93biBkZXZpY2UgdHlwZSAlbGQsIHJlcG9ydC5cbiIsCisJCQkgICAgICBkd1JldHVybik7YnJlYWs7CiAJCX0KIAkJYnJlYWs7CiAJZGVmYXVsdDoKLQkJZnByaW50ZihzdGRuaW1wLF9fRklMRV9fIjpfTUNJU1RSX2NvbnZyZXR1cm46dW5rbm93biByZXN1bHR0eXBlICVkLCByZXBvcnQuXG4iLHR5cGUpOworCQlGSVhNRShtY2ksInVua25vd24gcmVzdWx0dHlwZSAlZCwgcmVwb3J0LlxuIix0eXBlKTsKIAkJYnJlYWs7CiAJfQogfQpAQCAtMzg4LDcgKzM4OSw3IEBACiAJCQkJfSBlbHNlIGlmIChzc2NhbmYoa2V5d29yZHNbaSsxXSwiJWxkIiwmc3QpKSB7CiAJCQkJCXBVLT5hbmltb3BlblBhcmFtcy5kd1N0eWxlIHw9IHN0OyAKIAkJCQl9IGVsc2UKLQkJCQkJZnByaW50ZihzdGRuaW1wLF9fRklMRV9fIjpNQ0lTVFJfT3Blbjp1bmtub3duICdzdHlsZScga2V5d29yZCAlcywgcGxlYXNlIHJlcG9ydC5cbiIsa2V5d29yZHNbaSsxXSk7CisJCQkJCUZJWE1FKG1jaSwidW5rbm93biAnc3R5bGUnIGtleXdvcmQgJXMsIHBsZWFzZSByZXBvcnQuXG4iLGtleXdvcmRzW2krMV0pOwogCQkJCWkrPTI7CiAJCQkJY29udGludWU7CiAJCQl9CkBAIC00MjAsMTMgKzQyMSwxNCBAQAogCQkJCX0gZWxzZSBpZiAoc3NjYW5mKGtleXdvcmRzW2krMV0sIiVsZCIsJnN0KSkgewogCQkJCQlwVS0+b3ZseW9wZW5QYXJhbXMuZHdTdHlsZSB8PSBzdDsgCiAJCQkJfSBlbHNlCi0JCQkJCWZwcmludGYoc3RkbmltcCxfX0ZJTEVfXyI6TUNJU1RSX09wZW46dW5rbm93biAnc3R5bGUnIGtleXdvcmQgJXMsIHBsZWFzZSByZXBvcnQuXG4iLGtleXdvcmRzW2krMV0pOworCQkJCQlGSVhNRShtY2ksInVua25vd24gJ3N0eWxlJyBrZXl3b3JkICVzLCBwbGVhc2UgcmVwb3J0LlxuIixrZXl3b3Jkc1tpKzFdKTsKIAkJCQlpKz0yOwogCQkJCWNvbnRpbnVlOwogCQkJfQogCQkJYnJlYWs7CiAJCX0KLQkJZnByaW50ZihzdGRuaW1wLF9fRklMRV9fIjpNQ0lTVFJfT3Blbjp1bmtub3duIHBhcmFtZXRlciBwYXNzZWQgJXMsIHBsZWFzZSByZXBvcnQuXG4iLGtleXdvcmRzW2ldKTsKKwkJRklYTUUobWNpLCJ1bmtub3duIHBhcmFtZXRlciBwYXNzZWQgJXMsIHBsZWFzZSByZXBvcnQuXG4iLAorCQkgICAgICBrZXl3b3Jkc1tpXSk7CiAJCWkrKzsKIAl9CiAJX01DSV9DQUxMX0RSSVZFUiggTUNJX09QRU4sIFNFR1BUUl9HRVQocFUpICk7CkBAIC02MTksNyArNjIxLDcgQEAKIAkJCUlURU0xKCJsZXZlbCIsTUNJX1dBVkVfU1RBVFVTX0xFVkVMLF9NQ0lTVFJfaW50KTsKIAkJCWJyZWFrOwogCQl9Ci0JCWZwcmludGYoc3RkbmltcCxfX0ZJTEVfXyI6TUNJU1RSX1N0YXR1czp1bmtub3duIGtleXdvcmQgJyVzJ1xuIixrZXl3b3Jkc1tpXSk7CisJCUZJWE1FKG1jaSwidW5rbm93biBrZXl3b3JkICclcydcbiIsa2V5d29yZHNbaV0pOwogCQlpKys7CiAJfQogCWlmICghc3RhdHVzUGFyYW1zLT5kd0l0ZW0pIApAQCAtMTA1OCw3ICsxMDYwLDcgQEAKIAkJcGFyc2VzdHI9IiVkOiVkOiVkOiVkIjsKIAkJbnJhcmdzPTQ7CiAJCWJyZWFrOwotCWRlZmF1bHQ6ZnByaW50ZihzdGRuaW1wLCJtY2lTZW5kU3RyaW5nOlBMQVk6dW5rbm93biB0aW1lZm9ybWF0ICVkLCBwbGVhc2UgcmVwb3J0LlxuIix0aW1lZik7CisJZGVmYXVsdDpGSVhNRShtY2ksInVua25vd24gdGltZWZvcm1hdCAlZCwgcGxlYXNlIHJlcG9ydC5cbiIsdGltZWYpOwogCQlwYXJzZXN0cj0iJWQiOwogCQlucmFyZ3M9MTsKIAkJYnJlYWs7CkBAIC0xMTQ3LDcgKzExNDksNyBAQAogCQlwYXJzZXN0cj0iJWQ6JWQ6JWQ6JWQiOwogCQlucmFyZ3M9NDsKIAkJYnJlYWs7Ci0JZGVmYXVsdDpmcHJpbnRmKHN0ZG5pbXAsIm1jaVNlbmRTdHJpbmc6UExBWTp1bmtub3duIHRpbWVmb3JtYXQgJWQsIHBsZWFzZSByZXBvcnQuXG4iLHRpbWVmKTsKKwlkZWZhdWx0OkZJWE1FKG1jaSwidW5rbm93biB0aW1lZm9ybWF0ICVkLCBwbGVhc2UgcmVwb3J0LlxuIix0aW1lZik7CiAJCXBhcnNlc3RyPSIlZCI7CiAJCW5yYXJncz0xOwogCQlicmVhazsKQEAgLTEyNDQsNyArMTI0Niw3IEBACiAJCXBhcnNlc3RyPSIlZDolZDolZDolZCI7CiAJCW5yYXJncz00OwogCQlicmVhazsKLQlkZWZhdWx0OmZwcmludGYoc3RkbmltcCwibWNpU2VuZFN0cmluZzpTRUVLOnVua25vd24gdGltZWZvcm1hdCAlZCwgcGxlYXNlIHJlcG9ydC5cbiIsdGltZWYpOworCWRlZmF1bHQ6RklYTUUobWNpLCJ1bmtub3duIHRpbWVmb3JtYXQgJWQsIHBsZWFzZSByZXBvcnQuXG4iLHRpbWVmKTsKIAkJcGFyc2VzdHI9IiVkIjsKIAkJbnJhcmdzPTE7CiAJCWJyZWFrOwpAQCAtMTUyOSw3ICsxNTMxLDcgQEAKIAkJcGFyc2VzdHI9IiVkOiVkOiVkOiVkIjsKIAkJbnJhcmdzPTQ7CiAJCWJyZWFrOwotCWRlZmF1bHQ6ZnByaW50ZihzdGRuaW1wLCJtY2lTZW5kU3RyaW5nOkRFTEVURTp1bmtub3duIHRpbWVmb3JtYXQgJWQsIHBsZWFzZSByZXBvcnQuXG4iLHRpbWVmKTsKKwlkZWZhdWx0OkZJWE1FKG1jaSwidW5rbm93biB0aW1lZm9ybWF0ICVkLCBwbGVhc2UgcmVwb3J0LlxuIix0aW1lZik7CiAJCXBhcnNlc3RyPSIlZCI7CiAJCW5yYXJncz0xOwogCQlicmVhazsKQEAgLTIyMDQsOSArMjIwNiw4IEBACiAgCQlmcmVlKGtleXdvcmRzKTtmcmVlKGNtZCk7CiAgCQlyZXR1cm4JcmVzOwogIAl9Ci0JZnByaW50ZihzdGRuaW1wLCJtY2lTZW5kU3RyaW5nKCclcycsICVwLCAldSwgJVgpIC8vIHVuaW1wbGVtZW50ZWQsIHBsZWFzZSByZXBvcnQuXG4iLCBscHN0ckNvbW1hbmQsIAotCQlscHN0clJldHVyblN0cmluZywgdVJldHVybkxlbmd0aCwgaHduZENhbGxiYWNrCi0JKTsKKwlGSVhNRShtY2ksIignJXMnLCAlcCwgJXUsICVYKTogdW5pbXBsZW1lbnRlZCwgcGxlYXNlIHJlcG9ydC5cbiIsIAorCSAgICAgIGxwc3RyQ29tbWFuZCwgbHBzdHJSZXR1cm5TdHJpbmcsIHVSZXR1cm5MZW5ndGgsIGh3bmRDYWxsYmFjayk7CiAJZnJlZShrZXl3b3Jkcyk7ZnJlZShjbWQpOwogCXJldHVybiBNQ0lFUlJfTUlTU0lOR19DT01NQU5EX1NUUklORzsKIH0KZGlmZiAtLWdpdCBhL211bHRpbWVkaWEvbWlkaS5jIGIvbXVsdGltZWRpYS9taWRpLmMKaW5kZXggZjI1M2Q1Ni4uMGEyZjg5NyAxMDA2NDQKLS0tIGEvbXVsdGltZWRpYS9taWRpLmMKKysrIGIvbXVsdGltZWRpYS9taWRpLmMKQEAgLTE0LDc0ICsxNCwyOCBAQAogI2luY2x1ZGUgPHN5cy9pb2N0bC5oPgogI2luY2x1ZGUgIndpbmRvd3MuaCIKICNpbmNsdWRlICJsZHQuaCIKKyNpbmNsdWRlICJtdWx0aW1lZGlhLmgiCiAjaW5jbHVkZSAidXNlci5oIgogI2luY2x1ZGUgImRyaXZlci5oIgogI2luY2x1ZGUgIm1tc3lzdGVtLmgiCiAjaW5jbHVkZSAieG1hbGxvYy5oIgogI2luY2x1ZGUgImRlYnVnLmgiCiAKLSNpZmRlZiBsaW51eAotI2luY2x1ZGUgPGxpbnV4L3NvdW5kY2FyZC5oPgotI2VsaWYgX19GcmVlQlNEX18KLSNpbmNsdWRlIDxtYWNoaW5lL3NvdW5kY2FyZC5oPgotI2luY2x1ZGUgPHN5cy9lcnJuby5oPgotI2VuZGlmCi0KLSNpZiBkZWZpbmVkKGxpbnV4KSB8fCBkZWZpbmVkKF9fRnJlZUJTRF9fKQotI2RlZmluZSBNSURJX0RFViAiL2Rldi9zZXF1ZW5jZXIiCi0KLSNpZmRlZiBTT1VORF9WRVJTSU9OCi0jZGVmaW5lIElPQ1RMKGEsYixjKQkJaW9jdGwoYSxiLCZjKQotI2Vsc2UKLSNkZWZpbmUgSU9DVEwoYSxiLGMpCQkoYyA9IGlvY3RsKGEsYixjKSApCi0jZW5kaWYKLQotI2RlZmluZSBNQVhfTUlESUlORFJWIAkoMSkKLSNkZWZpbmUgTUFYX01JRElPVVREUlYgCSgxKQotI2RlZmluZSBNQVhfTUNJTUlESURSViAJKDEpCi0KLXR5cGVkZWYgc3RydWN0IHsKLQlpbnQJCXVuaXhkZXY7Ci0JaW50CQlzdGF0ZTsKLQlEV09SRAkJYnVmc2l6ZTsKLQlNSURJT1BFTkRFU0MJbWlkaURlc2M7Ci0JV09SRAkJd0ZsYWdzOwotCUxQTUlESUhEUiAJbHBRdWV1ZUhkcjsKLQlEV09SRAkJZHdUb3RhbFBsYXllZDsKLX0gTElOVVhfTUlESUlOOwotCi10eXBlZGVmIHN0cnVjdCB7Ci0JaW50CQl1bml4ZGV2OwotCWludAkJc3RhdGU7Ci0JRFdPUkQJCWJ1ZnNpemU7Ci0JTUlESU9QRU5ERVNDCW1pZGlEZXNjOwotCVdPUkQJCXdGbGFnczsKLQlMUE1JRElIRFIgCWxwUXVldWVIZHI7Ci0JRFdPUkQJCWR3VG90YWxQbGF5ZWQ7Ci19IExJTlVYX01JRElPVVQ7Ci0KLXR5cGVkZWYgc3RydWN0IHsKLQlpbnQJblVzZUNvdW50OyAgICAgICAgICAvKiBJbmNyZW1lbnRlZCBmb3IgZWFjaCBzaGFyZWQgb3BlbiAqLwotCUJPT0wxNglmU2hhcmVhYmxlOyAgICAgICAgIC8qIFRSVUUgaWYgZmlyc3Qgb3BlbiB3YXMgc2hhcmVhYmxlICovCi0JV09SRAl3Tm90aWZ5RGV2aWNlSUQ7ICAgIC8qIE1DSSBkZXZpY2UgSUQgd2l0aCBhIHBlbmRpbmcgbm90aWZpY2F0aW9uICovCi0JSEFORExFMTYgaENhbGxiYWNrOyAgICAgICAgIC8qIENhbGxiYWNrIGhhbmRsZSBmb3IgcGVuZGluZyBub3RpZmljYXRpb24gKi8KLQlITU1JTzE2CWhGaWxlOwkJCQkvKiBtbWlvIGZpbGUgaGFuZGxlIG9wZW4gYXMgRWxlbWVudAkJKi8KLQlEV09SRAlkd0JlZ2luRGF0YTsKLQlEV09SRAlkd1RvdGFsTGVuOwotCVdPUkQJd0Zvcm1hdDsKLQlXT1JECW5UcmFja3M7Ci0JV09SRAluVGVtcG87Ci0JTUNJX09QRU5fUEFSTVMxNiBvcGVuUGFybXM7Ci0vKiAJTUlESUhEUglNaWRpSGRyOyAqLwotCUhMT0NBTDE2CWhNaWRpSGRyOwotCVdPUkQJZHdTdGF0dXM7Ci19IExJTlVYX01DSU1JREk7CisjaWYgZGVmaW5lZCAoX19IQVNfU09VTkRDQVJEX0hfXykKIAogc3RhdGljIExJTlVYX01JRElJTglNaWRpSW5EZXZbTUFYX01JRElJTkRSVl07CiBzdGF0aWMgTElOVVhfTUlESU9VVAlNaWRpT3V0RGV2W01BWF9NSURJT1VURFJWXTsKIHN0YXRpYyBMSU5VWF9NQ0lNSURJCU1DSU1pZGlEZXZbTUFYX01DSU1JRElEUlZdOworCiAjZW5kaWYKIAorLyogdGhpcyBpcyB0aGUgdG90YWwgbnVtYmVyIG9mIE1JREkgZGV2aWNlcyBmb3VuZCAqLworaW50IE1PRE1fTlVNREVWUyA9IDA7CisKKy8qIHRoaXMgc3RydWN0dXJlIGhvbGRzIHBvaW50ZXJzIHdpdGggaW5mb3JtYXRpb24gZm9yIGVhY2ggTUlESQorICogZGV2aWNlIGZvdW5kLgorICovCitMUE1JRElPVVRDQVBTMTYgbWlkaURldmljZXNbTUFYX01JRElPVVREUlZdOwogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqIAkJCU1JRElfTm90aWZ5Q2xpZW50CQkJW2ludGVybmFsXQpAQCAtODM1LDEyICs3ODksMTMgQEAKICNlbmRpZgogfQogCisKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICogCQkJCU1JRElfbWNpSW5mbwkJCVtpbnRlcm5hbF0KICAqLwogc3RhdGljIERXT1JEIE1JRElfbWNpSW5mbyhVSU5UMTYgd0RldklELCBEV09SRCBkd0ZsYWdzLCBMUE1DSV9JTkZPX1BBUk1TMTYgbHBQYXJtcykKIHsKLSNpZiBkZWZpbmVkKGxpbnV4KSB8fCBkZWZpbmVkKF9fRnJlZUJTRF9fKQorIyBpZiBkZWZpbmVkKF9fRnJlZUJTRF9fKSB8fCBkZWZpbmVkIChsaW51eCkKIAlUUkFDRShtaWRpLCAiKCUwNFgsICUwOGxYLCAlcCk7XG4iLCB3RGV2SUQsIGR3RmxhZ3MsIGxwUGFybXMpOwogCWlmIChscFBhcm1zID09IE5VTEwpIHJldHVybiBNQ0lFUlJfSU5URVJOQUw7CiAJbHBQYXJtcy0+bHBzdHJSZXR1cm4gPSBOVUxMOwpAQCAtMTA0NywzNSArMTAwMiw0MiBAQAogCXJldHVybiBNTVNZU0VSUl9OT1RTVVBQT1JURUQ7CiB9CiAKLQotCiAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KIAotCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqIAkJCQltb2RHZXREZXZDYXBzCQkJW2ludGVybmFsXQogICovCiBzdGF0aWMgRFdPUkQgbW9kR2V0RGV2Q2FwcyhXT1JEIHdEZXZJRCwgTFBNSURJT1VUQ0FQUzE2IGxwQ2FwcywgRFdPUkQgZHdTaXplKQogeworICBMUE1JRElPVVRDQVBTMTYgdG1wbHBDYXBzOworCiAJVFJBQ0UobWlkaSwgIiglMDRYLCAlcCwgJTA4bFgpO1xuIiwgd0RldklELCBscENhcHMsIGR3U2l6ZSk7CisgIGlmICh3RGV2SUQgPT0gKFdPUkQpIE1JRElfTUFQUEVSKSB7IAogCWxwQ2Fwcy0+d01pZCA9IDB4MDBGRjsgCS8qIE1hbnVmYWMgSUQgKi8KIAlscENhcHMtPndQaWQgPSAweDAwMDE7IAkvKiBQcm9kdWN0IElEICovCiAJbHBDYXBzLT52RHJpdmVyVmVyc2lvbiA9IDB4MDAxOyAvKiBQcm9kdWN0IFZlcnNpb24gKi8KLQlzdHJjcHkobHBDYXBzLT5zelBuYW1lLCAiTGludXggTUlESU9VVCBEcml2ZXIgdjAuMDEiKTsKLS8qIEZJWE1FCi0gICBWYWx1ZXMgYXJlIHRoZSBzYW1lIGFzIEkgZ2V0IHdpdGggQm9ybGFuZCBUQyA0LjUKKyAgICBzdHJjcHkobHBDYXBzLT5zelBuYW1lLCAiTUlESSBNYXBlciAobm90IGZ1bmN0aW9uYWwgeWV0KSIpOworICAgIGxwQ2Fwcy0+d1RlY2hub2xvZ3kgPSBNT0RfRk1TWU5USDsgLyogRklYTUUgRG9lcyBpdCBtYWtlIGFueSBkaWZmZXJlbmNlID8gKi8KKyAgICBscENhcHMtPndWb2ljZXMgICAgID0gMTQ7ICAgICAgIC8qIEZJWE1FICovCisgICAgbHBDYXBzLT53Tm90ZXMgICAgICA9IDE0OyAgICAgICAvKiBGSVhNRSAqLworICAgIGxwQ2Fwcy0+ZHdTdXBwb3J0ICAgPSBNSURJQ0FQU19WT0xVTUV8TUlESUNBUFNfTFJWT0xVTUU7IC8qIEZJWE1FIERvZXMgaXQgbWFrZSBhbnkgZGlmZmVyZW5jZSA/ICovCisgIH0gZWxzZSB7CisgICAgLyogRklYTUUgVGhlcmUgaXMgYSB3YXkgdG8gZG8gaXQgc28gZWFzaWx5LCBidXQgSSdtIHRvbworICAgICAqIHNsZWVweSB0byB0aGluayBhbmQgSSB3YW50IHRvIHRlc3QKICovCi0KLQlscENhcHMtPndUZWNobm9sb2d5ID0gTU9EX0ZNU1lOVEg7Ci0JbHBDYXBzLT53Vm9pY2VzICAgICA9IDE0OyAgICAgICAvKiBtYWtlIGl0IGlvY3RsICovCi0JbHBDYXBzLT53Tm90ZXMgICAgICA9IDE0OyAgICAgICAvKiBtYWtlIGl0IGlvY3RsICovCi0JbHBDYXBzLT5kd1N1cHBvcnQgICA9IE1JRElDQVBTX1ZPTFVNRXxNSURJQ0FQU19MUlZPTFVNRTsKLQlUUkFDRShtaWRpLCJ0ZWNobiA9ICVkIHZvaWNlcz0lZCBub3RlcyA9ICVkIHN1cHBvcnQgPSAlbGRcbiIsbHBDYXBzLT53VGVjaG5vbG9neSxscENhcHMtPndWb2ljZXMsbHBDYXBzLT53Tm90ZXMsbHBDYXBzLT5kd1N1cHBvcnQpOwotCisgICAgdG1wbHBDYXBzID0gbWlkaURldmljZXMgW3dEZXZJRF07CisgICAgbHBDYXBzLT53TWlkID0gdG1wbHBDYXBzLT53TWlkOyAgCisgICAgbHBDYXBzLT53UGlkID0gdG1wbHBDYXBzLT53UGlkOyAgCisgICAgbHBDYXBzLT52RHJpdmVyVmVyc2lvbiA9IHRtcGxwQ2Fwcy0+dkRyaXZlclZlcnNpb247ICAKKyAgICBzdHJjcHkobHBDYXBzLT5zelBuYW1lLCB0bXBscENhcHMtPnN6UG5hbWUpOyAgICAKKyAgICBscENhcHMtPndUZWNobm9sb2d5ID0gdG1wbHBDYXBzLT53VGVjaG5vbG9neTsKKyAgICBscENhcHMtPndWb2ljZXMgPSB0bXBscENhcHMtPndWb2ljZXM7ICAKKyAgICBscENhcHMtPndOb3RlcyA9IHRtcGxwQ2Fwcy0+d05vdGVzOyAgCisgICAgbHBDYXBzLT5kd1N1cHBvcnQgPSB0bXBscENhcHMtPmR3U3VwcG9ydDsgIAorICB9CiAJcmV0dXJuIE1NU1lTRVJSX05PRVJST1I7CiB9CiAKLQogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKiAJCQltb2RPcGVuCQkJCQlbaW50ZXJuYWxdCiAgKi8KQEAgLTEwOTEsNyArMTA1Myw3IEBACiAJfQogCWlmICh3RGV2SUQ+PSBNQVhfTUlESU9VVERSVikgewogCQlUUkFDRShtaWRpLCJNQVhfTUlESU9VVERSViByZWFjaGVkICFcbiIpOwotCQlyZXR1cm4gTU1TWVNFUlJfQUxMT0NBVEVEOworCQlyZXR1cm4gTU1TWVNFUlJfQUxMT0NBVEVEOyAvKiBGSVhNRSBpc24ndCBNTVNZU0VSUl9CQURERVZJQ0VJRCB0aGUgcmlnaHQgYW5zd2VyID8gKi8KIAl9CiAJTWlkaU91dERldlt3RGV2SURdLnVuaXhkZXYgPSAwOwogCW1pZGkgPSBvcGVuIChNSURJX0RFViwgT19XUk9OTFksIDApOwpAQCAtMTMxMSw3ICsxMjczLDcgQEAKIAljYXNlIE1PRE1fR0VUREVWQ0FQUzoKIAkJcmV0dXJuIG1vZEdldERldkNhcHMod0RldklELChMUE1JRElPVVRDQVBTMTYpZHdQYXJhbTEsZHdQYXJhbTIpOwogCWNhc2UgTU9ETV9HRVROVU1ERVZTOgotCQlyZXR1cm4gMTsKKwkJcmV0dXJuIE1PRE1fTlVNREVWUzsKIAljYXNlIE1PRE1fR0VUVk9MVU1FOgogCQlyZXR1cm4gMDsKIAljYXNlIE1PRE1fU0VUVk9MVU1FOgpkaWZmIC0tZ2l0IGEvbXVsdGltZWRpYS9tbWlvLmMgYi9tdWx0aW1lZGlhL21taW8uYwppbmRleCA4N2Y5YjFlLi5jNzExN2EwIDEwMDY0NAotLS0gYS9tdWx0aW1lZGlhL21taW8uYworKysgYi9tdWx0aW1lZGlhL21taW8uYwpAQCAtNDU1LDggKzQ1NSw3IEBACiAJCQkJIGZjY0lPUHJvYywgcElPUHJvYywgZHdGbGFncyk7CiAKIAlpZiAoZHdGbGFncyAmIE1NSU9fR0xPQkFMUFJPQykgewotCQlmcHJpbnRmKHN0ZG5pbXAsICJtbWlvSW5zdGFsbElPUHJvYzogZ2xvYmFsIHByb2NlZHVyZXMgbm90ICIKLQkJCQkiaW1wbGVtZW50ZWRcbiIpOworCQlGSVhNRShtbWlvLCAiIGdsb2JhbCBwcm9jZWR1cmVzIG5vdCBpbXBsZW1lbnRlZFxuIik7CiAJfQogCiAJLyoganVzdCBoYW5kbGUgdGhlIGtub3duIHByb2NlZHVyZXMgZm9yIG5vdyAqLwpkaWZmIC0tZ2l0IGEvbXVsdGltZWRpYS9tbXN5c3RlbS5jIGIvbXVsdGltZWRpYS9tbXN5c3RlbS5jCmluZGV4IDEyZTU1ZDcuLmYxM2FlZmEgMTAwNjQ0Ci0tLSBhL211bHRpbWVkaWEvbW1zeXN0ZW0uYworKysgYi9tdWx0aW1lZGlhL21tc3lzdGVtLmMKQEAgLTk2LDcgKzk2LDggQEAKIGludCBXSU5BUEkgTU1TWVNURU1fV0VQKEhJTlNUQU5DRTE2IGhJbnN0YW5jZSwgV09SRCB3RGF0YVNlZywKICAgICAgICAgICAgICAgICAgICAgICAgIFdPUkQgY2JIZWFwU2l6ZSwgTFBTVFIgbHBDbWRMaW5lKQogewotCWZwcmludGYoc3RkZXJyLCAiU1RVQjogVW5sb2FkaW5nIE1NU3lzdGVtIERMTCAuLi4gaEluc3Q9JTA0WCBcbiIsIGhJbnN0YW5jZSk7CisJRklYTUUobW1zeXMsICJTVFVCOiBVbmxvYWRpbmcgTU1TeXN0ZW0gRExMIC4uLiBoSW5zdD0lMDRYIFxuIiwKKwkgICAgICBoSW5zdGFuY2UpOwogCXJldHVybihUUlVFKTsKIH0KIApAQCAtMTIyLDkgKzEyMyw5IEBACiBCT09MMzIgV0lOQVBJIFBsYXlTb3VuZDMyQShMUENTVFIgcHN6U291bmQsIEhNT0RVTEUzMiBobW9kLCBEV09SRCBmZHdTb3VuZCkKIHsKICAgVFJBQ0UobW1zeXMsICJwc3pTb3VuZD0nJXAnIGhtb2Q9JTA0WCBmZHdTb3VuZD0lMDhsWFxuIiwKLQkgICAgICAgcHN6U291bmQsIGhtb2QsIGZkd1NvdW5kKTsKKwlwc3pTb3VuZCwgaG1vZCwgZmR3U291bmQpOwogICBpZihobW9kICE9IDAgfHwgIShmZHdTb3VuZCAmIFNORF9GSUxFTkFNRSkpIHsKLSAgICBmcHJpbnRmKHN0ZGVyciwgIlBsYXlTb3VuZEE6IG9ubHkgZGlzayBzb3VuZCBmaWxlcyBhcmUgc3VwcG9ydGVkXG4iKTsKKyAgICBGSVhNRShtbXN5cywgIm9ubHkgZGlzayBzb3VuZCBmaWxlcyBhcmUgc3VwcG9ydGVkXG4iKTsKICAgICByZXR1cm4gRkFMU0U7CiAgIH0gZWxzZQogICAgIHJldHVybiAgc25kUGxheVNvdW5kKHBzelNvdW5kLCAoVUlOVDE2KSBmZHdTb3VuZCk7CkBAIC00MDYsNyArNDA3LDcgQEAKICAqLwogVUlOVDE2IFdJTkFQSSBtaXhlckdldERldkNhcHMxNihVSU5UMTYgZGV2aWQsTFBNSVhFUkNBUFMxNiBtaXhjYXBzLFVJTlQxNiBzaXplKSAKIHsKLQlmcHJpbnRmKHN0ZGVyciwibWl4ZXJHZXREZXZDYXBzIVxuIik7CisJRklYTUUobW1zeXMsInNob3VsZCB0aGlzIGJlIGEgZml4bWU/XG4iKTsKIAlyZXR1cm4gbWl4TWVzc2FnZShkZXZpZCxNWERNX0dFVERFVkNBUFMsMEwsKERXT1JEKW1peGNhcHMsKERXT1JEKXNpemUpOwogfQogCkBAIC00MTksOSArNDIwLDggQEAKIAlITUlYRVIxNglobWl4MTY7CiAJVUlOVDMyCQlyZXQ7CiAKLQlmcHJpbnRmKHN0ZGVyciwibWl4ZXJPcGVuMzIoJXAsJWQsJTA4bHgsJTA4bHgsJTA4bHgpXG4iLAotCQlscGhtaXgsdURldmljZUlELGR3Q2FsbGJhY2ssZHdJbnN0YW5jZSxmZHdPcGVuCi0JKTsKKwlGSVhNRShtbXN5cywiKCVwLCVkLCUwOGx4LCUwOGx4LCUwOGx4KTogc2VtaSBzdHViP1xuIiwKKwkgICAgICBscGhtaXgsdURldmljZUlELGR3Q2FsbGJhY2ssZHdJbnN0YW5jZSxmZHdPcGVuKTsKIAlyZXQgPSBtaXhlck9wZW4xNigmaG1peDE2LHVEZXZpY2VJRCxkd0NhbGxiYWNrLGR3SW5zdGFuY2UsZmR3T3Blbik7CiAJaWYgKGxwaG1peCkgKmxwaG1peCA9IGhtaXgxNjsKIAlyZXR1cm4gcmV0OwpAQCAtNDM4LDkgKzQzOCw4IEBACiAJQk9PTDMyCQltYXBwZXJmbGFnID0gKHVEZXZpY2VJRD09MCk7CiAJRFdPUkQJCWR3UmV0OwogCi0JZnByaW50ZihzdGRlcnIsIm1peGVyT3BlbiglcCwlZCwlMDhseCwlMDhseCwlMDhseClcbiIsCi0JCWxwaG1peCx1RGV2aWNlSUQsZHdDYWxsYmFjayxkd0luc3RhbmNlLGZkd09wZW4KLQkpOworCVRSQUNFKG1tc3lzLCIoJXAsJWQsJTA4bHgsJTA4bHgsJTA4bHgpXG4iLAorCSAgICAgIGxwaG1peCx1RGV2aWNlSUQsZHdDYWxsYmFjayxkd0luc3RhbmNlLGZkd09wZW4pOwogCWhtaXggPSBVU0VSX0hFQVBfQUxMT0Moc2l6ZW9mKE1JWEVST1BFTkRFU0MpKTsKIAlpZiAobHBobWl4KSAqbHBobWl4ID0gaG1peDsKIAlscG1vZCA9IChMUE1JWEVST1BFTkRFU0MpVVNFUl9IRUFQX0xJTl9BRERSKGhtaXgpOwpAQCAtNDcyLDcgKzQ3MSw3IEBACiBVSU5UMTYgV0lOQVBJIG1peGVyQ2xvc2UxNihITUlYRVIxNiBobWl4KSB7CiAJTFBNSVhFUk9QRU5ERVNDCWxwbW9kOwogCi0JZnByaW50ZihzdGRlcnIsIm1peGVyQ2xvc2UoJTA0eClcbiIsaG1peCk7CisJRklYTUUobW1zeXMsIiglMDR4KTogc2VtaS1zdHViP1xuIixobWl4KTsKIAlscG1vZCA9IChMUE1JWEVST1BFTkRFU0MpVVNFUl9IRUFQX0xJTl9BRERSKGhtaXgpOwogCXJldHVybiBtaXhNZXNzYWdlKGxwbW9kLT51RGV2aWNlSUQsTVhETV9DTE9TRSxscG1vZC0+ZHdJbnN0YW5jZSwwTCwwTCk7CiB9CkBAIC00OTIsNyArNDkxLDcgQEAKICAqIAkJCQltaXhlckdldElECiAgKi8KIFVJTlQxNiBXSU5BUEkgbWl4ZXJHZXRJRDE2KEhNSVhFUk9CSjE2IGhtaXgsTFBVSU5UMTYgbHBpZCxEV09SRCBmZHdJRCkgewotCWZwcmludGYoc3RkZXJyLCJtaXhlckdldElEKCUwNHgpXG4iLGhtaXgpOworCUZJWE1FKG1tc3lzLCIoJTA0eCk6IHNlbWktc3R1YlxuIixobWl4KTsKIAlyZXR1cm4gX2dldF9taXhlcklEX2Zyb21faGFuZGxlKGhtaXgsZmR3SUQpOwogfQogCkBAIC01MDAsOSArNDk5LDcgQEAKICAqIAkJCQltaXhlckdldENvbnRyb2xEZXRhaWxzQQlbV0lOTU0uOTldCiAgKi8KIFVJTlQzMiBtaXhlckdldENvbnRyb2xEZXRhaWxzMzJBKEhNSVhFUk9CSjMyIGhtaXgsTFBNSVhFUkNPTlRST0xERVRBSUxTMzIgbHBtY2QsRFdPUkQgZmR3RGV0YWlscykgewotCWZwcmludGYoc3RkZXJyLCJtaXhlckdldENvbnRyb2xEZXRhaWxzKCUwNHgsJXAsJTA4bHgpLHN0dWIhXG4iLAotCQlobWl4LGxwbWNkLGZkd0RldGFpbHMKLQkpOworCUZJWE1FKG1tc3lzLCIoJTA0eCwlcCwlMDhseCk6IHN0dWIhXG4iLGhtaXgsbHBtY2QsZmR3RGV0YWlscyk7CiAJcmV0dXJuIE1NU1lTRVJSX05PVEVOQUJMRUQ7CiB9CiAKQEAgLTUxMCw5ICs1MDcsNyBAQAogICogCQkJCW1peGVyR2V0Q29udHJvbERldGFpbHNXCVtXSU5NTS4xMDBdCiAgKi8KIFVJTlQzMiBtaXhlckdldENvbnRyb2xEZXRhaWxzMzJXKEhNSVhFUk9CSjMyIGhtaXgsTFBNSVhFUkNPTlRST0xERVRBSUxTMzIgbHBtY2QsRFdPUkQgZmR3RGV0YWlscykgewotCWZwcmludGYoc3RkZXJyLCJtaXhlckdldENvbnRyb2xEZXRhaWxzKCUwNHgsJXAsJTA4bHgpLHN0dWIhXG4iLAotCQlobWl4LGxwbWNkLGZkd0RldGFpbHMKLQkpOworCUZJWE1FKG1tc3lzLCIoJTA0eCwlcCwlMDhseCk6IHN0dWIhXG4iLAlobWl4LGxwbWNkLGZkd0RldGFpbHMpOwogCXJldHVybiBNTVNZU0VSUl9OT1RFTkFCTEVEOwogfQogCkBAIC01MjAsOSArNTE1LDcgQEAKICAqIAkJCQltaXhlckdldENvbnRyb2xEZXRhaWxzCVtNTVNZU1RFTS44MDhdCiAgKi8KIFVJTlQxNiBtaXhlckdldENvbnRyb2xEZXRhaWxzMTYoSE1JWEVST0JKMTYgaG1peCxMUE1JWEVSQ09OVFJPTERFVEFJTFMxNiBscG1jZCxEV09SRCBmZHdEZXRhaWxzKSB7Ci0JZnByaW50ZihzdGRlcnIsIm1peGVyR2V0Q29udHJvbERldGFpbHMoJTA0eCwlcCwlMDhseCksc3R1YiFcbiIsCi0JCWhtaXgsbHBtY2QsZmR3RGV0YWlscwotCSk7CisJRklYTUUobW1zeXMsIiglMDR4LCVwLCUwOGx4KTogc3R1YiFcbiIsaG1peCxscG1jZCxmZHdEZXRhaWxzKTsKIAlyZXR1cm4gTU1TWVNFUlJfTk9URU5BQkxFRDsKIH0KIApAQCAtNTMwLDkgKzUyMyw3IEBACiAgKiAJCQkJbWl4ZXJHZXRMaW5lQ29udHJvbHNBCVtXSU5NTS4xMDRdCiAgKi8KIFVJTlQzMiBXSU5BUEkgbWl4ZXJHZXRMaW5lQ29udHJvbHMzMkEoSE1JWEVST0JKMzIgaG1peCxMUE1JWEVSTElORUNPTlRST0xTMzJBIGxwbWxjLERXT1JEIGZkd0NvbnRyb2xzKSB7Ci0JZnByaW50ZihzdGRlcnIsIm1peGVyR2V0TGluZUNvbnRyb2xzQSglMDR4LCVwLCUwOGx4KSxzdHViIVxuIiwKLQkJaG1peCxscG1sYyxmZHdDb250cm9scwotCSk7CisJRklYTUUobW1zeXMsIiglMDR4LCVwLCUwOGx4KTogc3R1YiFcbiIsaG1peCxscG1sYyxmZHdDb250cm9scyk7CiAJcmV0dXJuIE1NU1lTRVJSX05PVEVOQUJMRUQ7CiB9CiAKQEAgLTU0MCw5ICs1MzEsNyBAQAogICogCQkJCW1peGVyR2V0TGluZUNvbnRyb2xzVwlbV0lOTU0uMTA1XQogICovCiBVSU5UMzIgV0lOQVBJIG1peGVyR2V0TGluZUNvbnRyb2xzMzJXKEhNSVhFUk9CSjMyIGhtaXgsTFBNSVhFUkxJTkVDT05UUk9MUzMyVyBscG1sYyxEV09SRCBmZHdDb250cm9scykgewotCWZwcmludGYoc3RkZXJyLCJtaXhlckdldExpbmVDb250cm9sc0EoJTA0eCwlcCwlMDhseCksc3R1YiFcbiIsCi0JCWhtaXgsbHBtbGMsZmR3Q29udHJvbHMKLQkpOworCUZJWE1FKG1tc3lzLCIoJTA0eCwlcCwlMDhseCk6IHN0dWIhXG4iLGhtaXgsbHBtbGMsZmR3Q29udHJvbHMpOwogCXJldHVybiBNTVNZU0VSUl9OT1RFTkFCTEVEOwogfQogCkBAIC01NTAsOSArNTM5LDcgQEAKICAqIAkJCQltaXhlckdldExpbmVDb250cm9scwlbTU1TWVNURU0uODA3XQogICovCiBVSU5UMTYgV0lOQVBJIG1peGVyR2V0TGluZUNvbnRyb2xzMTYoSE1JWEVST0JKMTYgaG1peCxMUE1JWEVSTElORUNPTlRST0xTMTYgbHBtbGMsRFdPUkQgZmR3Q29udHJvbHMpIHsKLQlmcHJpbnRmKHN0ZGVyciwibWl4ZXJHZXRMaW5lQ29udHJvbHMoJTA0eCwlcCwlMDhseCksc3R1YiFcbiIsCi0JCWhtaXgsbHBtbGMsZmR3Q29udHJvbHMKLQkpOworCUZJWE1FKG1tc3lzLCIoJTA0eCwlcCwlMDhseCk6IHN0dWIhXG4iLGhtaXgsbHBtbGMsZmR3Q29udHJvbHMpOwogCXJldHVybiBNTVNZU0VSUl9OT1RFTkFCTEVEOwogfQogCkBAIC01NjQsOSArNTUxLDcgQEAKIAlVSU5UMzIJCXJldDsKIAogCW1sMTYuZHdEZXN0aW5hdGlvbiA9IGxwbWwtPmR3RGVzdGluYXRpb247Ci0JZnByaW50ZihzdGRlcnIsIm1peGVyR2V0TGluZUluZm9BKCUwNHgsJXAsJTA4bHgpLHN0dWIhXG4iLAotCQlobWl4LGxwbWwsZmR3SW5mbwotCSk7CisJRklYTUUobW1zeXMsIiglMDR4LCVwLCUwOGx4KTogc3R1YiFcbiIsaG1peCxscG1sLGZkd0luZm8pOwogCXJldCA9IG1peGVyR2V0TGluZUluZm8xNihobWl4LCZtbDE2LGZkd0luZm8pOwogCWxwbWwtPmNiU3RydWN0ID0gc2l6ZW9mKCpscG1sKTsKIAlscG1sLT5kd1NvdXJjZSA9IG1sMTYuZHdTb3VyY2U7CkBAIC01OTYsOSArNTgxLDcgQEAKIAlVSU5UMzIJCXJldDsKIAogCW1sMTYuZHdEZXN0aW5hdGlvbiA9IGxwbWwtPmR3RGVzdGluYXRpb247Ci0JZnByaW50ZihzdGRlcnIsIm1peGVyR2V0TGluZUluZm9XKCUwNHgsJXAsJTA4bHgpLHN0dWIhXG4iLAotCQlobWl4LGxwbWwsZmR3SW5mbwotCSk7CisJRklYTUUobW1zeXMsIiglMDR4LCVwLCUwOGx4KTogc3R1YiFcbiIsaG1peCxscG1sLGZkd0luZm8pOwogCXJldCA9IG1peGVyR2V0TGluZUluZm8xNihobWl4LCZtbDE2LGZkd0luZm8pOwogCWxwbWwtPmNiU3RydWN0ID0gc2l6ZW9mKCpscG1sKTsKIAlscG1sLT5kd1NvdXJjZSA9IG1sMTYuZHdTb3VyY2U7CkBAIC02MjYsOSArNjA5LDggQEAKIFVJTlQxNiBXSU5BUEkgbWl4ZXJHZXRMaW5lSW5mbzE2KEhNSVhFUk9CSjE2IGhtaXgsTFBNSVhFUkxJTkUxNiBscG1sLERXT1JEIGZkd0luZm8pIHsKIAlVSU5UMTYgZGV2aWQgPSAgX2dldF9taXhlcklEX2Zyb21faGFuZGxlKGhtaXgsZmR3SW5mbyk7CiAKLQlmcHJpbnRmKHN0ZGVyciwibWl4ZXJHZXRMaW5lSW5mbzE2KCUwNHgsJXBbbGluZSAlMDhseF0sJTA4bHgpXG4iLAotCQlobWl4LGxwbWwsbHBtbC0+ZHdEZXN0aW5hdGlvbixmZHdJbmZvCi0JKTsKKwlGSVhNRShtbXN5cywiKCUwNHgsJXBbbGluZSAlMDhseF0sJTA4bHgpIC0gc2VtaS1zdHViP1xuIiwKKwkgICAgICBobWl4LGxwbWwsbHBtbC0+ZHdEZXN0aW5hdGlvbixmZHdJbmZvKTsKIAlyZXR1cm4gbWl4TWVzc2FnZShkZXZpZCxNWERNX0dFVExJTkVJTkZPLDAsKERXT1JEKWxwbWwsZmR3SW5mbyk7CiB9CiAKQEAgLTYzNiw5ICs2MTgsNyBAQAogICogCQkJCW1peGVyU2V0Q29udHJvbERldGFpbHMJW1dJTk1NLjExMV0KICAqLwogVUlOVDMyIFdJTkFQSSBtaXhlclNldENvbnRyb2xEZXRhaWxzMzIoSE1JWEVST0JKMzIgaG1peCxMUE1JWEVSQ09OVFJPTERFVEFJTFMzMiBscG1jZCxEV09SRCBmZHdEZXRhaWxzKSB7Ci0JZnByaW50ZihzdGRlcnIsIm1peGVyU2V0Q29udHJvbERldGFpbHMzMiglMDR4LCVwLCUwOGx4KSxzdHViIVxuIiwKLQkJaG1peCxscG1jZCxmZHdEZXRhaWxzCi0JKTsKKwlGSVhNRShtbXN5cywiKCUwNHgsJXAsJTA4bHgpOiBzdHViIVxuIixobWl4LGxwbWNkLGZkd0RldGFpbHMpOwogCXJldHVybiBNTVNZU0VSUl9OT1RFTkFCTEVEOwogfQogCkBAIC02NDYsOSArNjI2LDcgQEAKICAqIAkJCQltaXhlclNldENvbnRyb2xEZXRhaWxzCVtNTVNZU1RFTS44MDldCiAgKi8KIFVJTlQxNiBXSU5BUEkgbWl4ZXJTZXRDb250cm9sRGV0YWlsczE2KEhNSVhFUk9CSjE2IGhtaXgsTFBNSVhFUkNPTlRST0xERVRBSUxTMTYgbHBtY2QsRFdPUkQgZmR3RGV0YWlscykgewotCWZwcmludGYoc3RkZXJyLCJtaXhlclNldENvbnRyb2xEZXRhaWxzMTYoJTA0eCwlcCwlMDhseCksc3R1YiFcbiIsCi0JCWhtaXgsbHBtY2QsZmR3RGV0YWlscwotCSk7CisJRklYTUUobW1zeXMsIiglMDR4LCVwLCUwOGx4KTogc3R1YiFcbiIsaG1peCxscG1jZCxmZHdEZXRhaWxzKTsKIAlyZXR1cm4gTU1TWVNFUlJfTk9URU5BQkxFRDsKIH0KIApAQCAtNjY0LDcgKzY0Miw4IEBACiAJCXVEZXZpY2VJRCA9IGxwbW9kLT51RGV2aWNlSUQ7CiAJZWxzZQogCQl1RGV2aWNlSUQgPSAwOwotCWZwcmludGYoc3RkZXJyLCJtaXhlck1lc3NhZ2UoJTA0bHgsJWQsJTA4bHgsJTA4bHgpXG4iLChEV09SRClobWl4LHVNc2csZHdQYXJhbTEsZHdQYXJhbTIpOworCUZJWE1FKG1tc3lzLCIoJTA0bHgsJWQsJTA4bHgsJTA4bHgpOiBzZW1pLXN0dWI/XG4iLAorCSAgICAgIChEV09SRClobWl4LHVNc2csZHdQYXJhbTEsZHdQYXJhbTIpOwogCXJldHVybiBtaXhNZXNzYWdlKHVEZXZpY2VJRCx1TXNnLDBMLGR3UGFyYW0xLGR3UGFyYW0yKTsKIH0KIApAQCAtNjgwLDcgKzY1OSw4IEBACiAJCXVEZXZpY2VJRCA9IGxwbW9kLT51RGV2aWNlSUQ7CiAJZWxzZQogCQl1RGV2aWNlSUQgPSAwOwotCWZwcmludGYoc3RkZXJyLCJtaXhlck1lc3NhZ2UoJTA0eCwlZCwlMDhseCwlMDhseClcbiIsaG1peCx1TXNnLGR3UGFyYW0xLGR3UGFyYW0yKTsKKwlGSVhNRShtbXN5cywiKCUwNHgsJWQsJTA4bHgsJTA4bHgpIC0gc2VtaS1zdHViP1xuIiwKKwkgICAgICBobWl4LHVNc2csZHdQYXJhbTEsZHdQYXJhbTIpOwogCXJldHVybiBtaXhNZXNzYWdlKHVEZXZpY2VJRCx1TXNnLDBMLGR3UGFyYW0xLGR3UGFyYW0yKTsKIH0KIApAQCAtNzk3LDkgKzc3Nyw4IEBACiAJY2FzZSBBVVhETV9HRVRERVZDQVBTOgogCQlyZXR1cm4gYXV4R2V0RGV2Q2FwczMyQSh1RGV2aWNlSUQsKExQQVVYQ0FQUzMyQSlkdzEsZHcyKTsKIAlkZWZhdWx0OgotCQlmcHJpbnRmKHN0ZGVyciwidW5oYW5kbGVkIGF1eE1lc3NhZ2UzMiglMDR4LCUwNHgsJTA4bHgsJTA4bHgpXG4iLAotCQkJdURldmljZUlELHVNZXNzYWdlLGR3MSxkdzIKLQkJKTsKKwkJRVJSKG1tc3lzLCIoJTA0eCwlMDR4LCUwOGx4LCUwOGx4KTogdW5oYW5kbGVkIG1lc3NhZ2VcbiIsCisJCSAgICB1RGV2aWNlSUQsdU1lc3NhZ2UsZHcxLGR3Mik7CiAJCWJyZWFrOwogCX0KIAlyZXR1cm4gYXV4TWVzc2FnZSh1RGV2aWNlSUQsdU1lc3NhZ2UsMEwsZHcxLGR3Mik7CkBAIC04MjIsOSArODAxLDggQEAKIAljYXNlIEFVWERNX0dFVERFVkNBUFM6CiAJCXJldHVybiBhdXhHZXREZXZDYXBzMTYodURldmljZUlELChMUEFVWENBUFMxNilQVFJfU0VHX1RPX0xJTihkdzEpLGR3Mik7CiAJZGVmYXVsdDoKLQkJZnByaW50ZihzdGRlcnIsInVuaGFuZGxlZCBhdXhNZXNzYWdlMzIoJTA0eCwlMDR4LCUwOGx4LCUwOGx4KVxuIiwKLQkJCXVEZXZpY2VJRCx1TWVzc2FnZSxkdzEsZHcyCi0JCSk7CisJCUVSUihtbXN5cywiKCUwNHgsJTA0eCwlMDhseCwlMDhseCk6IHVuaGFuZGxlZCBtZXNzYWdlXG4iLAorCQkgICAgdURldmljZUlELHVNZXNzYWdlLGR3MSxkdzIpOwogCQlicmVhazsKIAl9CiAJcmV0dXJuIGF1eE1lc3NhZ2UodURldmljZUlELCB1TWVzc2FnZSwgMEwsIGR3MSwgZHcyKTsKQEAgLTEyNTQsNyArMTIzMiw3IEBACiAJCQl9IGVsc2UgewogI2lmIHRlc3RpbmcxNgogCQkJCUhEUlZSMTYgaGRydjsKLQkJCQlmcHJpbnRmKHN0ZGVyciwidHJ5aW5nIHRvIGxvYWQgZHJpdmVyLi4uXG4iKTsKKwkJCQlUUkFDRShtbXN5cywidHJ5aW5nIHRvIGxvYWQgZHJpdmVyLi4uXG4iKTsKIAkJCQloZHJ2ID0gT3BlbkRyaXZlcihzdHIsIm1jaSIsTlVMTCk7CiAJCQkJaWYgKGhkcnYpIHsKIAkJCQkJSE1PRFVMRTE2CWhtb2Q7CkBAIC0xMzE3LDcgKzEyOTUsNyBAQAogICogCQkJbWNpR2V0RHJpdmVyRGF0YQkJCVtNTVNZU1RFTS43MDhdCiAgKi8KIERXT1JEIFdJTkFQSSBtY2lHZXREcml2ZXJEYXRhMTYoSERSVlIxNiBoZHJ2KSB7Ci0JZnByaW50ZihzdGRlcnIsIm1jaUdldERyaXZlckRhdGEoJTA0eCksc3R1YiFcbiIsaGRydik7CisgICAgICAgIEZJWE1FKG1tc3lzLCIoJTA0eCk6IHN0dWIhXG4iLGhkcnYpOwogCXJldHVybiAweDQyOwogfQogCkBAIC0xMzI1LDcgKzEzMDMsNyBAQAogICogCQkJbWNpU2V0RHJpdmVyRGF0YQkJCVtNTVNZU1RFTS43MDddCiAgKi8KIERXT1JEIFdJTkFQSSBtY2lTZXREcml2ZXJEYXRhMTYoSERSVlIxNiBoZHJ2LERXT1JEIGRhdGEpIHsKLQlmcHJpbnRmKHN0ZGVyciwibWNpU2V0RHJpdmVyRGF0YSglMDR4LCUwOGx4KSxzdHViIVxuIixoZHJ2LGRhdGEpOworCUZJWE1FKG1tc3lzLCIoJTA0eCwlMDhseCk6IHN0dWIhXG4iLGhkcnYsZGF0YSk7CiAJcmV0dXJuIDA7CiB9CiAKQEAgLTE0MzYsMTEgKzE0MTQsOSBAQAogICAgICAgTFBCWVRFICAgICAgICAgIGxtZW07CiAgICAgICBzdGF0aWMgICAgICAgICAgbWNpZGV2dHlwZSA9IDA7CiAKLSAgICAgIGZwcmludGYoc3RkZXJyLCJtY2lMb2FkQ29tbWFuZFJlc291cmNlMTYoJTA0eCwlcywlZCksc3R1YiFcbiIsCi0gICAgICAgICAgICAgIGhpbnN0LHJlc25hbWUsdHlwZQotICAgICAgKTsKKyAgICAgIEZJWE1FKG1tc3lzLCIoJTA0eCwlcywlZCk6IHN0dWIhXG4iLGhpbnN0LHJlc25hbWUsdHlwZSk7CiAgICAgICBpZiAoIWxzdHJjbXBpMzJBKHJlc25hbWUsImNvcmUiKSkgewotICAgICAgICAgICAgICBmcHJpbnRmKHN0ZGVyciwibWNpTG9hZENvbW1hbmRSZXNvdXJjZSguLi4sXCJjb3JlXCIsLi4uKSwgaGF2ZSB0byB1c2UgaW50ZXJuYWwgdGFibGVzLi4uIChub3QgdGhlcmUgeWV0KVxuIik7CisgICAgICAgICAgICAgIEZJWE1FKG1tc3lzLCIoLi4uLFwiY29yZVwiLC4uLiksIGhhdmUgdG8gdXNlIGludGVybmFsIHRhYmxlcy4uLiAobm90IHRoZXJlIHlldClcbiIpOwogICAgICAgICAgICAgICByZXR1cm4gMDsKICAgICAgIH0KICAgICAgIC8qIGlmIGZpbGUgZXhpc3RzICJyZXNuYW1lLm1jaSIsIHRoZW4gbG9hZCByZXNvdXJjZSAicmVzbmFtZSIgZnJvbSBpdApAQCAtMTQ1NywyMiArMTQzMywyMiBAQAogICAgICAgaHJzcmMgPSBGaW5kUmVzb3VyY2UxNihoaW5zdCxTRUdQVFJfR0VUKHNlZ3N0ciksdHlwZSk7CiAgICAgICBTRUdQVFJfRlJFRShzZWdzdHIpOwogICAgICAgaWYgKCFocnNyYykgewotICAgICAgICAgICAgICBmcHJpbnRmKHN0ZGVyciwibWNpTG9hZENvbW1hbmRSZXNvdXJjZTpubyBzcGVjaWFsIGNvbW1hbmRsaXN0IGZvdW5kIGluIHJlc291cmNlXG4iKTsKKyAgICAgICAgICAgICAgV0FSTihtbXN5cywibm8gc3BlY2lhbCBjb21tYW5kbGlzdCBmb3VuZCBpbiByZXNvdXJjZVxuIik7CiAgICAgICAgICAgICAgIHJldHVybiBNQ0lfTk9fQ09NTUFORF9UQUJMRTsKICAgICAgIH0KICAgICAgIGhtZW0gPSBMb2FkUmVzb3VyY2UxNihoaW5zdCxocnNyYyk7CiAgICAgICBpZiAoIWhtZW0pIHsKLSAgICAgICAgICAgICAgZnByaW50ZihzdGRlcnIsIm1jaUxvYWRDb21tYW5kUmVzb3VyY2U6Y291bGRuJ3QgbG9hZCByZXNvdXJjZT8/XG4iKTsKKyAgICAgICAgICAgICAgV0FSTihtbXN5cywiY291bGRuJ3QgbG9hZCByZXNvdXJjZT8/XG4iKTsKICAgICAgICAgICAgICAgcmV0dXJuIE1DSV9OT19DT01NQU5EX1RBQkxFOwogICAgICAgfQogICAgICAgeG1lbSA9IFdJTjE2X0xvY2tSZXNvdXJjZTE2KGhtZW0pOwogICAgICAgaWYgKCF4bWVtKSB7Ci0gICAgICAgICAgICAgIGZwcmludGYoc3RkZXJyLCJtY2lMb2FkQ29tbWFuZFJlc291cmNlOmNvdWxkbid0IGxvY2sgcmVzb3VyY2U/P1xuIik7CisgICAgICAgICAgICAgIFdBUk4obW1zeXMsImNvdWxkbid0IGxvY2sgcmVzb3VyY2U/P1xuIik7CiAgICAgICAgICAgICAgIEZyZWVSZXNvdXJjZTE2KGhtZW0pOwogICAgICAgICAgICAgICByZXR1cm4gTUNJX05PX0NPTU1BTkRfVEFCTEU7CiAgICAgICB9CiAgICAgICBsbWVtID0gUFRSX1NFR19UT19MSU4oeG1lbSk7Ci0gICAgICBmcHJpbnRmKHN0ZGVyciwiZmlyc3QgcmVzb3VyY2UgZW50cnkgaXMgJXNcbiIsKGNoYXIqKWxtZW0pOworICAgICAgVFJBQ0UobW1zeXMsImZpcnN0IHJlc291cmNlIGVudHJ5IGlzICVzXG4iLChjaGFyKilsbWVtKTsKICAgICAgIC8qIHBhcnNlIHJlc291cmNlLCByZWdpc3RlciBzdHVmZiwgcmV0dXJuIHVuaXF1ZSBpZCAqLwogICAgICAgcmV0dXJuICsrbWNpZGV2dHlwZTsKIH0KQEAgLTE1NDMsMTYgKzE1MTksMTUgQEAKIERXT1JEIFdJTkFQSSBtY2lTZW5kQ29tbWFuZDMyQShVSU5UMzIgd0RldklELCBVSU5UMzIgd01zZywgRFdPUkQgZHdQYXJhbTEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRFdPUkQgZHdQYXJhbTIpCiB7Ci0gICAgZnByaW50ZihzdGRlcnIsIm1jaVNlbmRDb21tYW5kMzJBKCUwOHgsJXMsJTA4bHgsJTA4bHgpLHN0dWIhXG4iLAotCSAgICB3RGV2SUQsX21jaUNvbW1hbmRUb1N0cmluZyh3TXNnKSxkd1BhcmFtMSxkd1BhcmFtMgotICAgICk7CisgICAgRklYTUUobW1zeXMsIiglMDh4LCVzLCUwOGx4LCUwOGx4KTogc3R1YiFcbiIsCisJICB3RGV2SUQsX21jaUNvbW1hbmRUb1N0cmluZyh3TXNnKSxkd1BhcmFtMSxkd1BhcmFtMik7CiAgICAgc3dpdGNoICh3TXNnKSB7CiAgICAgY2FzZSBNQ0lfT1BFTjogewogICAgIAlMUE1DSV9PUEVOX1BBUk1TMzJBCWxwbW9wID0gKExQTUNJX09QRU5fUEFSTVMzMkEpZHdQYXJhbTI7Ci0gICAgCWZwcmludGYoc3RkZXJyLCIJTUNJX09QRU4oJXMsJXMsJXMpXG4iLAotCQkoZHdQYXJhbTEmTUNJX09QRU5fVFlQRSkgICA/bHBtb3AtPmxwc3RyRGV2aWNlVHlwZToiPG51bGw+IiwKLQkJKGR3UGFyYW0xJk1DSV9PUEVOX0VMRU1FTlQpPyhISVdPUkQobHBtb3AtPmxwc3RyRWxlbWVudE5hbWUpP2xwbW9wLT5scHN0ckVsZW1lbnROYW1lOiI8aWQ+Iik6IjxudWxsPiIsCi0JCShkd1BhcmFtMSZNQ0lfT1BFTl9BTElBUykgID9scG1vcC0+bHBzdHJBbGlhczoiPG51bGw+IgorICAgIAlUUkFDRShtbXN5cywiCU1DSV9PUEVOKCVzLCVzLCVzKVxuIiwKKwkgICAgICAoZHdQYXJhbTEmTUNJX09QRU5fVFlQRSkgICA/bHBtb3AtPmxwc3RyRGV2aWNlVHlwZToiPG51bGw+IiwKKwkgICAgICAoZHdQYXJhbTEmTUNJX09QRU5fRUxFTUVOVCk/KEhJV09SRChscG1vcC0+bHBzdHJFbGVtZW50TmFtZSk/bHBtb3AtPmxwc3RyRWxlbWVudE5hbWU6IjxpZD4iKToiPG51bGw+IiwKKwkgICAgICAoZHdQYXJhbTEmTUNJX09QRU5fQUxJQVMpICA/bHBtb3AtPmxwc3RyQWxpYXM6IjxudWxsPiIKIAkpOwogCWJyZWFrOwogICAgIH0KQEAgLTIwNDMsNyArMjAxOCw3IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXT1JEICogbHB3UGF0Y2hBcnJheSwgVUlOVDE2IHVGbGFncykKIHsKICAgICAgICAgLyogbm90IHJlYWxseSBuZWNlc3NhcnkgdG8gc3VwcG9ydCB0aGlzICovCi0JZnByaW50ZihzdGRuaW1wLCAibWlkaU91dENhY2hlUGF0Y2hlczogbm90IHN1cHBvcnRlZCB5ZXRcbiIpOworCUZJWE1FKG1tc3lzLCAibm90IHN1cHBvcnRlZCB5ZXRcbiIpOwogCXJldHVybiBNTVNZU0VSUl9OT1RTVVBQT1JURUQ7CiB9CiAKQEAgLTIwNjIsNyArMjAzNyw3IEBACiBVSU5UMTYgV0lOQVBJIG1pZGlPdXRDYWNoZURydW1QYXRjaGVzMTYoSE1JRElPVVQxNiBoTWlkaU91dCwgVUlOVDE2IHVQYXRjaCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXT1JEICogbHB3S2V5QXJyYXksIFVJTlQxNiB1RmxhZ3MpCiB7Ci0JZnByaW50ZihzdGRuaW1wLCAibWlkaU91dENhY2hlRHJ1bVBhdGNoZXNpOiBub3Qgc3VwcG9ydGVkIHlldFxuIik7CisJRklYTUUobW1zeXMsICJub3Qgc3VwcG9ydGVkIHlldFxuIik7CiAJcmV0dXJuIE1NU1lTRVJSX05PVFNVUFBPUlRFRDsKIH0KIApAQCAtMjEwMiw3ICsyMDc3LDcgQEAKIAlpZiAobHBEZXNjID09IE5VTEwpIHJldHVybiBNTVNZU0VSUl9JTlZBTEhBTkRMRTsKIAlzd2l0Y2ggKHVNZXNzYWdlKSB7CiAJY2FzZSBNT0RNX09QRU46Ci0JCWZwcmludGYoc3RkZXJyLCJtaWRpT3V0TWVzc2FnZTMyOiBjYW4ndCBoYW5kbGUgTU9ETV9PUEVOIVxuIik7CisJCUZJWE1FKG1tc3lzLCJjYW4ndCBoYW5kbGUgTU9ETV9PUEVOIVxuIik7CiAJCXJldHVybiAwOwogCWNhc2UgTU9ETV9HRVRERVZDQVBTOgogCQlyZXR1cm4gbWlkaU91dEdldERldkNhcHMzMkEoaE1pZGlPdXQsKExQTUlESU9VVENBUFMzMkEpZHdQYXJhbTEsZHdQYXJhbTIpOwpAQCAtMjExNyw5ICsyMDkyLDggQEAKIAkJLyogbm8gYXJndW1lbnQgY29udmVyc2lvbiBuZWVkZWQgKi8KIAkJYnJlYWs7CiAJZGVmYXVsdDoKLQkJZnByaW50ZihzdGRlcnIsInVuaGFuZGxlZCBtaWRpT3V0TWVzc2FnZTMyKCUwNHgsJTA0eCwlMDhseCwlMDhseClcbiIsCi0JCQloTWlkaU91dCx1TWVzc2FnZSxkd1BhcmFtMSxkd1BhcmFtMgotCQkpOworCSAgICAgICAgRVJSKG1tc3lzLCIoJTA0eCwlMDR4LCUwOGx4LCUwOGx4KTogdW5oYW5kbGVkIG1lc3NhZ2VcbiIsCisJCSAgICBoTWlkaU91dCx1TWVzc2FnZSxkd1BhcmFtMSxkd1BhcmFtMik7CiAJCWJyZWFrOwogCX0KIAlyZXR1cm4gbW9kTWVzc2FnZSgwLCB1TWVzc2FnZSwgbHBEZXNjLT5kd0luc3RhbmNlLCBkd1BhcmFtMSwgZHdQYXJhbTIpOwpAQCAtMjEzOSw3ICsyMTEzLDcgQEAKIAlpZiAobHBEZXNjID09IE5VTEwpIHJldHVybiBNTVNZU0VSUl9JTlZBTEhBTkRMRTsKIAlzd2l0Y2ggKHVNZXNzYWdlKSB7CiAJY2FzZSBNT0RNX09QRU46Ci0JCWZwcmludGYoc3RkZXJyLCJtaWRpT3V0TWVzc2FnZTE2OiBjYW4ndCBoYW5kbGUgTU9ETV9PUEVOIVxuIik7CisJCUZJWE1FKG1tc3lzLCJjYW4ndCBoYW5kbGUgTU9ETV9PUEVOIVxuIik7CiAJCXJldHVybiAwOwogCWNhc2UgTU9ETV9HRVROVU1ERVZTOgogCWNhc2UgTU9ETV9SRVNFVDoKQEAgLTIxNTYsOSArMjEzMCw4IEBACiAJY2FzZSBNT0RNX1VOUFJFUEFSRToKIAkJcmV0dXJuIG1pZGlPdXRVbnByZXBhcmVIZWFkZXIxNihoTWlkaU91dCwoTFBNSURJSERSKVBUUl9TRUdfVE9fTElOKGR3UGFyYW0xKSxkd1BhcmFtMik7CiAJZGVmYXVsdDoKLQkJZnByaW50ZihzdGRlcnIsInVuaGFuZGxlZCBtaWRpT3V0TWVzc2FnZTE2KCUwNHgsJTA0eCwlMDhseCwlMDhseClcbiIsCi0JCQloTWlkaU91dCx1TWVzc2FnZSxkd1BhcmFtMSxkd1BhcmFtMgotCQkpOworCQlFUlIobW1zeXMsIiglMDR4LCUwNHgsJTA4bHgsJTA4bHgpOiB1bmhhbmRsZWQgbWVzc2FnZVxuIiwKKwkJICAgIGhNaWRpT3V0LHVNZXNzYWdlLGR3UGFyYW0xLGR3UGFyYW0yKTsKIAkJYnJlYWs7CiAJfQogCXJldHVybiBtb2RNZXNzYWdlKDAsIHVNZXNzYWdlLCBscERlc2MtPmR3SW5zdGFuY2UsIGR3UGFyYW0xLCBkd1BhcmFtMik7CkBAIC0yNDc0LDcgKzI0NDcsNyBAQAogCWlmIChscERlc2MgPT0gTlVMTCkgcmV0dXJuIE1NU1lTRVJSX0lOVkFMSEFORExFOwogCXN3aXRjaCAodU1lc3NhZ2UpIHsKIAljYXNlIE1JRE1fT1BFTjoKLQkJZnByaW50ZihzdGRlcnIsIm1pZGlJbk1lc3NhZ2UzMjogY2FuJ3QgaGFuZGxlIE1JRE1fT1BFTiFcbiIpOworCQlGSVhNRShtbXN5cywiY2FuJ3QgaGFuZGxlIE1JRE1fT1BFTiFcbiIpOwogCQlyZXR1cm4gMDsKIAljYXNlIE1JRE1fR0VUREVWQ0FQUzoKIAkJcmV0dXJuIG1pZGlJbkdldERldkNhcHMzMkEoaE1pZGlJbiwoTFBNSURJSU5DQVBTMzJBKWR3UGFyYW0xLGR3UGFyYW0yKTsKQEAgLTI0OTIsOSArMjQ2NSw4IEBACiAJY2FzZSBNSURNX0FEREJVRkZFUjoKIAkJcmV0dXJuIG1pZGlJbkFkZEJ1ZmZlcjMyKGhNaWRpSW4sKExQTUlESUhEUilkd1BhcmFtMSxkd1BhcmFtMik7CiAJZGVmYXVsdDoKLQkJZnByaW50ZihzdGRlcnIsInVuaGFuZGxlZCBtaWRpSW5NZXNzYWdlMzIoJTA0eCwlMDR4LCUwOGx4LCUwOGx4KVxuIiwKLQkJCWhNaWRpSW4sdU1lc3NhZ2UsZHdQYXJhbTEsZHdQYXJhbTIKLQkJKTsKKwkJRVJSKG1tc3lzLCIoJTA0eCwlMDR4LCUwOGx4LCUwOGx4KTogdW5oYW5kbGVkIG1lc3NhZ2VcbiIsCisJCSAgICBoTWlkaUluLHVNZXNzYWdlLGR3UGFyYW0xLGR3UGFyYW0yKTsKIAkJYnJlYWs7CiAJfQogCXJldHVybiBtaWRNZXNzYWdlKDAsIHVNZXNzYWdlLCBscERlc2MtPmR3SW5zdGFuY2UsIGR3UGFyYW0xLCBkd1BhcmFtMik7CkBAIC0yNTEzLDcgKzI0ODUsNyBAQAogCWlmIChscERlc2MgPT0gTlVMTCkgcmV0dXJuIE1NU1lTRVJSX0lOVkFMSEFORExFOwogCXN3aXRjaCAodU1lc3NhZ2UpIHsKIAljYXNlIE1JRE1fT1BFTjoKLQkJZnByaW50ZihzdGRlcnIsIm1pZGlJbk1lc3NhZ2UxNjogY2FuJ3QgaGFuZGxlIE1JRE1fT1BFTiFcbiIpOworCQlXQVJOKG1tc3lzLCJjYW4ndCBoYW5kbGUgTUlETV9PUEVOIVxuIik7CiAJCXJldHVybiAwOwogCWNhc2UgTUlETV9HRVRERVZDQVBTOgogCQlyZXR1cm4gbWlkaUluR2V0RGV2Q2FwczE2KGhNaWRpSW4sKExQTUlESUlOQ0FQUzE2KVBUUl9TRUdfVE9fTElOKGR3UGFyYW0xKSxkd1BhcmFtMik7CkBAIC0yNTMxLDkgKzI1MDMsOCBAQAogCWNhc2UgTUlETV9BRERCVUZGRVI6CiAJCXJldHVybiBtaWRpSW5BZGRCdWZmZXIxNihoTWlkaUluLChMUE1JRElIRFIpUFRSX1NFR19UT19MSU4oZHdQYXJhbTEpLGR3UGFyYW0yKTsKIAlkZWZhdWx0OgotCQlmcHJpbnRmKHN0ZGVyciwidW5oYW5kbGVkIG1pZGlJbk1lc3NhZ2UxNiglMDR4LCUwNHgsJTA4bHgsJTA4bHgpXG4iLAotCQkJaE1pZGlJbix1TWVzc2FnZSxkd1BhcmFtMSxkd1BhcmFtMgotCQkpOworCQlFUlIobW1zeXMsIiglMDR4LCUwNHgsJTA4bHgsJTA4bHgpOiB1bmhhbmRsZWQgbWVzc2FnZVxuIiwKKwkJICAgIGhNaWRpSW4sdU1lc3NhZ2UsZHdQYXJhbTEsZHdQYXJhbTIpOwogCQlicmVhazsKIAl9CiAJcmV0dXJuIG1pZE1lc3NhZ2UoMCwgdU1lc3NhZ2UsIGxwRGVzYy0+ZHdJbnN0YW5jZSwgZHdQYXJhbTEsIGR3UGFyYW0yKTsKQEAgLTMwOTQsMTIgKzMwNjUsMTEgQEAKIAkJLyogRklYTUU6IFVOSUNPREUvQU5TST8gKi8KIAkJcmV0dXJuIHdhdmVPdXRHZXREZXZDYXBzMzJBKGhXYXZlT3V0LChMUFdBVkVPVVRDQVBTMzJBKWR3UGFyYW0xLGR3UGFyYW0yKTsKIAljYXNlIFdPRE1fT1BFTjoKLQkJZnByaW50ZihzdGRlcnIsIndhdmVPdXRNZXNzYWdlMzIgY2FuJ3QgaGFuZGxlIFdPRE1fT1BFTiwgcGxlYXNlIHJlcG9ydC5cbiIpOworCQlGSVhNRShtbXN5cywiY2FuJ3QgaGFuZGxlIFdPRE1fT1BFTiwgcGxlYXNlIHJlcG9ydC5cbiIpOwogCQlicmVhazsKIAlkZWZhdWx0OgotCQlmcHJpbnRmKHN0ZGVyciwidW5oYW5kbGVkIHdhdmVPdXRNZXNzYWdlMzIoMHglMDR4LDB4JTA0eCwlMDhseCwlMDhseClcbiIsCi0JCQloV2F2ZU91dCx1TWVzc2FnZSxkd1BhcmFtMSxkd1BhcmFtMgotCQkpOworCQlFUlIobW1zeXMsIigweCUwNHgsMHglMDR4LCUwOGx4LCUwOGx4KTogdW5oYW5kbGVkIG1lc3NhZ2VcbiIsCisJCSAgICBoV2F2ZU91dCx1TWVzc2FnZSxkd1BhcmFtMSxkd1BhcmFtMik7CiAJCWJyZWFrOwogCX0KIAlyZXR1cm4gd29kTWVzc2FnZSggbHBEZXNjLT51RGV2aWNlSUQsIHVNZXNzYWdlLCBscERlc2MtPmR3SW5zdGFuY2UsIGR3UGFyYW0xLCBkd1BhcmFtMik7CkBAIC0zMTQzLDEyICszMTEzLDExIEBACiAJY2FzZSBXT0RNX1dSSVRFOgogCQlyZXR1cm4gd2F2ZU91dFdyaXRlMTYoaFdhdmVPdXQsKExQV0FWRUhEUilQVFJfU0VHX1RPX0xJTihkd1BhcmFtMSksZHdQYXJhbTIpOwogCWNhc2UgV09ETV9PUEVOOgotCQlmcHJpbnRmKHN0ZGVyciwid2F2ZU91dE1lc3NhZ2UxNiBjYW4ndCBoYW5kbGUgV09ETV9PUEVOLCBwbGVhc2UgcmVwb3J0LlxuIik7CisJCUZJWE1FKG1tc3lzLCJjYW4ndCBoYW5kbGUgV09ETV9PUEVOLCBwbGVhc2UgcmVwb3J0LlxuIik7CiAJCWJyZWFrOwogCWRlZmF1bHQ6Ci0JCWZwcmludGYoc3RkZXJyLCJ1bmhhbmRsZWQgd2F2ZU91dE1lc3NhZ2UxNigweCUwNHgsMHglMDR4LCUwOGx4LCUwOGx4KVxuIiwKLQkJCWhXYXZlT3V0LHVNZXNzYWdlLGR3UGFyYW0xLGR3UGFyYW0yCi0JCSk7CisJCUVSUihtbXN5cywiKDB4JTA0eCwweCUwNHgsJTA4bHgsJTA4bHgpOiB1bmhhbmRsZWQgbWVzc2FnZVxuIiwKKwkJICAgIGhXYXZlT3V0LHVNZXNzYWdlLGR3UGFyYW0xLGR3UGFyYW0yKTsKIAl9CiAJcmV0dXJuIHdvZE1lc3NhZ2UoIGxwRGVzYy0+dURldmljZUlELCB1TWVzc2FnZSwgbHBEZXNjLT5kd0luc3RhbmNlLCBkd1BhcmFtMSwgZHdQYXJhbTIpOwogfQpAQCAtMzU4OSwxMyArMzU1OCwxMyBAQAogewogCUxQV0FWRU9QRU5ERVNDCWxwRGVzYzsKIAotCWZwcmludGYoc3RkZXJyLCAid2F2ZUluTWVzc2FnZTMyKCUwNFgsICUwNFgsICUwOGxYLCAlMDhsWCksRklYTUUhXG4iLCAKLQkJCWhXYXZlSW4sIHVNZXNzYWdlLCBkd1BhcmFtMSwgZHdQYXJhbTIpOworCUZJWE1FKG1tc3lzLCAiKCUwNFgsICUwNFgsICUwOGxYLCAlMDhsWCksRklYTUUhXG4iLCAKKwkgICAgICBoV2F2ZUluLCB1TWVzc2FnZSwgZHdQYXJhbTEsIGR3UGFyYW0yKTsKIAlscERlc2MgPSAoTFBXQVZFT1BFTkRFU0MpIFVTRVJfSEVBUF9MSU5fQUREUihoV2F2ZUluKTsKIAlpZiAobHBEZXNjID09IE5VTEwpIHJldHVybiBNTVNZU0VSUl9JTlZBTEhBTkRMRTsKIAlzd2l0Y2ggKHVNZXNzYWdlKSB7CiAJY2FzZSBXSURNX09QRU46Ci0JCWZwcmludGYoc3RkZXJyLCJ3YXZlSW5NZXNzYWdlMzI6IGNhbm5vdCBoYW5kbGUgV0lETV9PUEVOLCBwbGVhc2UgcmVwb3J0LlxuIik7CisJCUZJWE1FKG1tc3lzLCAiY2Fubm90IGhhbmRsZSBXSURNX09QRU4sIHBsZWFzZSByZXBvcnQuXG4iKTsKIAkJYnJlYWs7CiAJY2FzZSBXSURNX0dFVE5VTURFVlM6CiAJY2FzZSBXSURNX0dFVFBPUzoKQEAgLTM2MTMsNyArMzU4Miw4IEBACiAJCS8qRklYTUU6IEFOU0kvVU5JQ09ERSAqLwogCQlyZXR1cm4gd2F2ZUluR2V0RGV2Q2FwczMyQShoV2F2ZUluLChMUFdBVkVJTkNBUFMzMkEpZHdQYXJhbTEsZHdQYXJhbTIpOwogCWRlZmF1bHQ6Ci0JCWZwcmludGYoc3RkZXJyLCJ1bmhhbmRsZWQgd2F2ZUluTWVzc2FnZTMyKCUwNHgsJTA0eCwlMDhseCwlMDhseClcbiIsaFdhdmVJbix1TWVzc2FnZSxkd1BhcmFtMSxkd1BhcmFtMik7CisJCUVSUihtbXN5cywiKCUwNHgsJTA0eCwlMDhseCwlMDhseCk6IHVuaGFuZGxlZCBtZXNzYWdlXG4iLAorCQkgICAgaFdhdmVJbix1TWVzc2FnZSxkd1BhcmFtMSxkd1BhcmFtMik7CiAJCWJyZWFrOwogCX0KIAlyZXR1cm4gd2lkTWVzc2FnZShscERlc2MtPnVEZXZpY2VJRCwgdU1lc3NhZ2UsIGxwRGVzYy0+ZHdJbnN0YW5jZSwgZHdQYXJhbTEsIGR3UGFyYW0yKTsKQEAgLTM2MjcsMTMgKzM1OTcsMTMgQEAKIHsKIAlMUFdBVkVPUEVOREVTQwlscERlc2M7CiAKLQlmcHJpbnRmKHN0ZGVyciwgIndhdmVJbk1lc3NhZ2UoJTA0WCwgJTA0WCwgJTA4bFgsICUwOGxYKSxGSVhNRSFcbiIsIAotCQkJaFdhdmVJbiwgdU1lc3NhZ2UsIGR3UGFyYW0xLCBkd1BhcmFtMik7CisJRklYTUUobW1zeXMsICIoJTA0WCwgJTA0WCwgJTA4bFgsICUwOGxYKSxGSVhNRSFcbiIsIAorCSAgICAgIGhXYXZlSW4sIHVNZXNzYWdlLCBkd1BhcmFtMSwgZHdQYXJhbTIpOwogCWxwRGVzYyA9IChMUFdBVkVPUEVOREVTQykgVVNFUl9IRUFQX0xJTl9BRERSKGhXYXZlSW4pOwogCWlmIChscERlc2MgPT0gTlVMTCkgcmV0dXJuIE1NU1lTRVJSX0lOVkFMSEFORExFOwogCXN3aXRjaCAodU1lc3NhZ2UpIHsKIAljYXNlIFdJRE1fT1BFTjoKLQkJZnByaW50ZihzdGRlcnIsIndhdmVJbk1lc3NhZ2UxNjogY2Fubm90IGhhbmRsZSBXSURNX09QRU4sIHBsZWFzZSByZXBvcnQuXG4iKTsKKwkJRklYTUUobW1zeXMsImNhbm5vdCBoYW5kbGUgV0lETV9PUEVOLCBwbGVhc2UgcmVwb3J0LlxuIik7CiAJCWJyZWFrOwogCWNhc2UgV0lETV9HRVROVU1ERVZTOgogCWNhc2UgV0lETV9DTE9TRToKQEAgLTM2NTQsNyArMzYyNCw4IEBACiAJY2FzZSBXSURNX0FEREJVRkZFUjoKIAkJcmV0dXJuIHdhdmVJbkFkZEJ1ZmZlcjE2KGhXYXZlSW4sKExQV0FWRUhEUilQVFJfU0VHX1RPX0xJTihkd1BhcmFtMSksZHdQYXJhbTIpOwogCWRlZmF1bHQ6Ci0JCWZwcmludGYoc3RkZXJyLCJ1bmhhbmRsZWQgd2F2ZUluTWVzc2FnZTE2KCUwNHgsJTA0eCwlMDhseCwlMDhseClcbiIsaFdhdmVJbix1TWVzc2FnZSxkd1BhcmFtMSxkd1BhcmFtMik7CisJCUVSUihtbXN5cywiKCUwNHgsJTA0eCwlMDhseCwlMDhseCk6IHVuaGFuZGxlZCBtZXNzYWdlXG4iLAorCQkgICAgaFdhdmVJbix1TWVzc2FnZSxkd1BhcmFtMSxkd1BhcmFtMik7CiAJCWJyZWFrOwogCX0KIAlyZXR1cm4gd2lkTWVzc2FnZShscERlc2MtPnVEZXZpY2VJRCwgdU1lc3NhZ2UsIGxwRGVzYy0+ZHdJbnN0YW5jZSwgZHdQYXJhbTEsIGR3UGFyYW0yKTsKQEAgLTM3MTYsOSArMzY4Nyw3IEBACiAgKiAJCQkJbW1UaHJlYWRDcmVhdGUJCVtNTVNZU1RFTS4xMTIwXQogICovCiBMUkVTVUxUIFdJTkFQSSBtbVRocmVhZENyZWF0ZTE2KExQVk9JRCB4MSwgTFBXT1JEIHgyLCBEV09SRCB4MywgRFdPUkQgeDQpIHsKLQlmcHJpbnRmKHN0ZGVyciwibW1UaHJlYWRDcmVhdGUxNiglcCwlcCwlMDhseCwlMDhseCksc3R1YiFcbiIsCi0JCXgxLHgyLHgzLHg0Ci0JKTsKKwlGSVhNRShtbXN5cywiKCVwLCVwLCUwOGx4LCUwOGx4KTogc3R1YiFcbiIseDEseDIseDMseDQpOwogCSp4MiA9IDB4YmFiZTsKIAlyZXR1cm4gMDsKIH0KQEAgLTM3MjcsNyArMzY5Niw3IEBACiAgKiAJCQkJbW1UaHJlYWRHZXRUYXNrCQlbTU1TWVNURU0uMTEyNV0KICAqLwogTFJFU1VMVCBXSU5BUEkgbW1UaHJlYWRHZXRUYXNrMTYoV09SRCBobmQpIHsKLQlmcHJpbnRmKHN0ZGVyciwibW1UaHJlYWRHZXRUYXNrMTYoJTA0eCksc3R1YiFcbiIsaG5kKTsKKwlGSVhNRShtbXN5cywiKCUwNHgpOiBzdHViIVxuIixobmQpOwogCXJldHVybiBHZXRDdXJyZW50VGFzaygpOwogfQogCkBAIC0zNzM1LDcgKzM3MDQsNyBAQAogICogCQkJCW1tVGhyZWFkU2lnbmFsCQlbTU1TWVNURU0uMTEyMV0KICAqLwogTFJFU1VMVCBXSU5BUEkgbW1UaHJlYWRTaWduYWwxNihXT1JEIGhuZCkgewotCWZwcmludGYoc3RkZXJyLCJtbVRocmVhZFNpZ25hbDE2KCUwNHgpLCBzdHViIVxuIixobmQpOworCUZJWE1FKG1tc3lzLCIoJTA0eCk6IHN0dWIhXG4iLGhuZCk7CiAJcmV0dXJuIDA7CiB9CiAKQEAgLTM3NDMsNyArMzcxMiw3IEBACiAgKiAJCQkJbW1UYXNrQ3JlYXRlCQlbTU1TWVNURU0uOTAwXQogICovCiBMUkVTVUxUIFdJTkFQSSBtbVRhc2tDcmVhdGUxNihMUFdPUkQgbHBobmQsRFdPUkQgeDEsRFdPUkQgeDIpIHsKLQlmcHJpbnRmKHN0ZGVyciwibW1UYXNrQ3JlYXRlMTYoJXAsJTA4bHgsJTA4bHgpLHN0dWIhXG4iLGxwaG5kLHgxLHgyKTsKKwlGSVhNRShtbXN5cywiKCVwLCUwOGx4LCUwOGx4KTogc3R1YiFcbiIsbHBobmQseDEseDIpOwogCSpscGhuZCA9IDB4Y2FmZTsKIAlyZXR1cm4gMDsKIH0KQEAgLTM3NTIsNyArMzcyMSw3IEBACiAgKiAJCQkJbW1UYXNrU2lnbmFsCQlbTU1TWVNURU0uOTAzXQogICovCiBMUkVTVUxUIFdJTkFQSSBtbVRhc2tTaWduYWwxNihIVEFTSzE2IGh0KSB7Ci0JZnByaW50ZihzdGRlcnIsIm1tVGFza1NpZ25hbCglMDR4KSxzdHViIVxuIixodCk7CisJRklYTUUobW1zeXMsIiglMDR4KTogc3R1YiFcbiIsaHQpOwogCXJldHVybiBQb3N0QXBwTWVzc2FnZTE2KGh0LDB4NDAwLDAsMCk7CiB9CiAKQEAgLTM3NjAsNyArMzcyOSw3IEBACiAgKiAJCQkJbWNpRHJpdmVyWWllbGQJCVtNTVNZU1RFTS43MTBdCiAgKi8KIExSRVNVTFQgV0lOQVBJIG1jaURyaXZlcllpZWxkMTYoSEFORExFMTYgaG5kKSB7Ci0JZnByaW50ZihzdGRlcnIsIm1jaURyaXZlcllpZWxkMTYoJTA0eCksc3R1YiFcbiIsaG5kKTsKKwlGSVhNRShtbXN5cywiKCUwNHgpOiBzdHViIVxuIixobmQpOwogCXJldHVybiAwOwogfQogCmRpZmYgLS1naXQgYS9vYmplY3RzL2N1cnNvcmljb24uYyBiL29iamVjdHMvY3Vyc29yaWNvbi5jCmluZGV4IGYxYmIzMmIuLmMyNTMzM2YgMTAwNjQ0Ci0tLSBhL29iamVjdHMvY3Vyc29yaWNvbi5jCisrKyBiL29iamVjdHMvY3Vyc29yaWNvbi5jCkBAIC0yOTQsNyArMjk0LDcgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiSWNvbiA/ICJpY29uIiA6ICJjdXJzb3IiLCBjRmxhZyA/ICJtb25vIiA6ICIiICk7CiAgICAgaWYgKGR3VmVyc2lvbiA9PSAweDAwMDIwMDAwKQogICAgIHsKLQlmcHJpbnRmKHN0ZG5pbXAsIlx0Mi54eCByZXNvdXJjZXMgYXJlIG5vdCBzdXBwb3J0ZWRcbiIpOworCUZJWE1FKGN1cnNvciwiXHQyLnh4IHJlc291cmNlcyBhcmUgbm90IHN1cHBvcnRlZFxuIik7CiAJcmV0dXJuIDA7CiAgICAgfQogCkBAIC0zMTMsNyArMzEzLDcgQEAKIAkgKGJtaS0+Ym1pSGVhZGVyLmJpU2l6ZSAhPSBzaXplb2YoQklUTUFQSU5GT0hFQURFUikgIHx8CiAJICBibWktPmJtaUhlYWRlci5iaUNvbXByZXNzaW9uICE9IEJJX1JHQikgKQogICAgIHsKLSAgICAgICAgICBmcHJpbnRmKHN0ZGVyciwiXHRpbnZhbGlkIHJlc291cmNlIGJpdG1hcCBoZWFkZXIuXG4iKTsKKyAgICAgICAgICBXQVJOKGN1cnNvciwiXHRpbnZhbGlkIHJlc291cmNlIGJpdG1hcCBoZWFkZXIuXG4iKTsKICAgICAgICAgICByZXR1cm4gMDsKICAgICB9CiAKQEAgLTM4MCw3ICszODAsNyBAQAogCiAgICAgaWYoICFoWG9yQml0cyB8fCAhaEFuZEJpdHMgKSAKICAgICB7Ci0JZnByaW50ZihzdGRlcnIsIlx0dW5hYmxlIHRvIGNyZWF0ZSBhbiBpY29uIGJpdG1hcC5cbiIpOworCVdBUk4oY3Vyc29yLCJcdHVuYWJsZSB0byBjcmVhdGUgYW4gaWNvbiBiaXRtYXAuXG4iKTsKIAlyZXR1cm4gMDsKICAgICB9CiAKQEAgLTk5Niw3ICs5OTYsNyBAQAogICAgICAgICBpZiAoIShwdHIgPSAoQ1VSU09SSUNPTklORk8qKUdsb2JhbExvY2sxNiggaEN1cnNvciApKSkgcmV0dXJuIEZBTFNFOwogICAgICAgICBpZiAocHRyLT5iUGxhbmVzICogcHRyLT5iQml0c1BlclBpeGVsICE9IDEpCiAgICAgICAgIHsKLSAgICAgICAgICAgIGZwcmludGYoIHN0ZGVyciwgIkN1cnNvciAlMDR4IGhhcyBtb3JlIHRoYW4gMSBicHAhXG4iLCBoQ3Vyc29yICk7CisgICAgICAgICAgICBXQVJOKGN1cnNvciwgIkN1cnNvciAlMDR4IGhhcyBtb3JlIHRoYW4gMSBicHAhXG4iLCBoQ3Vyc29yICk7CiAgICAgICAgICAgICByZXR1cm4gRkFMU0U7CiAgICAgICAgIH0KIApAQCAtMTM3NCw3ICsxMzc0LDcgQEAKIAkgICAgIHJldHVybiAoV09SRClMb29rdXBJY29uSWRGcm9tRGlyZWN0b3J5RXgxNiggbHBEaXIsIFRSVUUsCiAJCQkgIFNZU01FVFJJQ1NfQ1hJQ09OLCBTWVNNRVRSSUNTX0NZSUNPTiwgMCApOwogCWRlZmF1bHQ6Ci0JICAgICBmcHJpbnRmKCBzdGRlcnIsICJHZXRJY29uSUQ6IGludmFsaWQgcmVzIHR5cGUgJWxkXG4iLCByZXNUeXBlICk7CisJICAgICBXQVJOKGN1cnNvciwgImludmFsaWQgcmVzIHR5cGUgJWxkXG4iLCByZXNUeXBlICk7CiAgICAgfQogICAgIHJldHVybiAwOwogfQpAQCAtMTM4Niw3ICsxMzg2LDggQEAKICAqLwogSEdMT0JBTDE2IFdJTkFQSSBMb2FkQ3Vyc29ySWNvbkhhbmRsZXIoIEhHTE9CQUwxNiBoUmVzb3VyY2UsIEhNT0RVTEUxNiBoTW9kdWxlLCBIUlNSQzE2IGhSc3JjICkKIHsKLSAgICBmcHJpbnRmKHN0ZGVyciwiaE1vZHVsZVslMDR4XTogb2xkIDIueCByZXNvdXJjZXMgYXJlIG5vdCBzdXBwb3J0ZWQhXG4iLCBoTW9kdWxlKTsKKyAgICBGSVhNRShjdXJzb3IsIiglMDR4LCUwNHgsJTA0eCk6IG9sZCAyLnggcmVzb3VyY2VzIGFyZSBub3Qgc3VwcG9ydGVkIVxuIiwgCisJICBoUmVzb3VyY2UsIGhNb2R1bGUsIGhSc3JjKTsKICAgICByZXR1cm4gKEhHTE9CQUwxNikwOwogfQogCmRpZmYgLS1naXQgYS9vYmplY3RzL2VuaG1ldGFmaWxlLmMgYi9vYmplY3RzL2VuaG1ldGFmaWxlLmMKaW5kZXggMzRjMTcwMC4uODI2NjI3NSAxMDA2NDQKLS0tIGEvb2JqZWN0cy9lbmhtZXRhZmlsZS5jCisrKyBiL29iamVjdHMvZW5obWV0YWZpbGUuYwpAQCAtNiw4ICs2LDEwIEBACiAjaW5jbHVkZSA8c3RkaW8uaD4KICNpbmNsdWRlIDxzdHJpbmcuaD4KICNpbmNsdWRlICJ3aW5kb3dzLmgiCisjaW5jbHVkZSAiZ2RpLmgiCiAjaW5jbHVkZSAid2luYmFzZS5oIgogI2luY2x1ZGUgIndpbm50LmgiCisjaW5jbHVkZSAiZGVidWcuaCIKIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKiAgICAgICAgICBHZXRFbmhNZXRhRmlsZTMyQSAoR0RJMzIuMTc0KQpAQCAtMTgsMjAgKzIwLDIwIEBACiAJICAgICBMUENTVFIgbHBzek1ldGFGaWxlICAvKiBmaWxlbmFtZSBvZiBlbmhhbmNlZCBtZXRhZmlsZSAqLwogICAgICkKIHsKLSAgSEVOSE1FVEFGSUxFMzIgaG1mID0gTlVMTDsKKyAgSEVOSE1FVEFGSUxFMzIgaG1mID0gMDsKICAgRU5ITUVUQUhFQURFUiBoOwogICBjaGFyICpwOwogICBEV09SRCByZWFkOwogICBIRklMRTMyIGhmID0gQ3JlYXRlRmlsZTMyQShscHN6TWV0YUZpbGUsIEdFTkVSSUNfUkVBRCwgMCwgMCwgCi0JCQkgICAgIE9QRU5fRVhJU1RJTkcsIDAsIE5VTEwpOworCQkJICAgICBPUEVOX0VYSVNUSU5HLCAwLCAwKTsKICAgaWYgKCFSZWFkRmlsZShoZiwgJmgsIHNpemVvZihFTkhNRVRBSEVBREVSKSwgJnJlYWQsIE5VTEwpKSAKLSAgICByZXR1cm4gTlVMTDsKLSAgaWYgKHJlYWQhPXNpemVvZihFTkhNRVRBSEVBREVSKSkgcmV0dXJuIE5VTEw7CisgICAgcmV0dXJuIDA7CisgIGlmIChyZWFkIT1zaXplb2YoRU5ITUVUQUhFQURFUikpIHJldHVybiAwOwogICBTZXRGaWxlUG9pbnRlcihoZiwgMCwgTlVMTCwgRklMRV9CRUdJTik7IAogICAvKiAgaG1mID0gQ3JlYXRlRmlsZU1hcHBpbmczMkEoIGhmLCBOVUxMLCBOVUxMLCBOVUxMLCBOVUxMLCAidGVtcCIpOyAqLwogICBobWYgPSBHbG9iYWxBbGxvYzMyKEdITkQsIGgubkJ5dGVzKTsKICAgcCA9IEdsb2JhbExvY2szMihobWYpOwotICBpZiAoIVJlYWRGaWxlKGhmLCBwLCBoLm5CeXRlcywgJnJlYWQsIE5VTEwpKSByZXR1cm4gTlVMTDsKKyAgaWYgKCFSZWFkRmlsZShoZiwgcCwgaC5uQnl0ZXMsICZyZWFkLCBOVUxMKSkgcmV0dXJuIDA7CiAgIEdsb2JhbFVubG9jazMyKGhtZik7CiAgIHJldHVybiBobWY7CiB9CkBAIC02OCw3ICs3MCw3IEBACiBVSU5UMzIgR2V0RW5oTWV0YUZpbGVEZXNjcmlwdGlvbjMyQSggCiAgICAgICAgSEVOSE1FVEFGSUxFMzIgaG1mLCAvKiBlbmhhbmNlZCBtZXRhZmlsZSAqLwogICAgICAgIFVJTlQzMiBzaXplLCAvKiBzaXplIG9mIGJ1ZiAqLyAKLSAgICAgICBMUENTVFIgYnVmIC8qIGJ1ZmZlciB0byByZWNlaXZlIGRlc2NyaXB0aW9uICovCisgICAgICAgTFBTVFIgYnVmIC8qIGJ1ZmZlciB0byByZWNlaXZlIGRlc2NyaXB0aW9uICovCiAgICAgKQogewogICBMUEVOSE1FVEFIRUFERVIgcCA9IEdsb2JhbExvY2szMihobWYpOwpAQCAtODcsMzkgKzg5LDI0MiBAQAogICogIFJFVFVSTlMKICAqICAgIFRSVUUgb24gc3VjY2VzcywgRkFMU0Ugb24gZXJyb3IuCiAgKiAgQlVHUwotICogICAgVW5pbXBsZW1lbnRlZAorICogICAgTWFueSB1bmltcGxlbWVudGVkIHJlY29yZHMuCiAgKi8KIEJPT0wzMiBQbGF5RW5oTWV0YUZpbGVSZWNvcmQzMiggCiAgICAgIEhEQzMyIGhkYywgCiAgICAgIC8qIGRldmljZSBjb250ZXh0IGluIHdoaWNoIHRvIHJlbmRlciBFTUYgcmVjb3JkICovCi0gICAgIExQSEFORExFVEFCTEUzMiBscEhhbmRsZXRhYmxlLCAKKyAgICAgTFBIQU5ETEVUQUJMRTMyIGhhbmRsZXRhYmxlLCAKICAgICAgLyogYXJyYXkgb2YgaGFuZGxlcyB0byBiZSB1c2VkIGluIHJlbmRlcmluZyByZWNvcmQgKi8KLSAgICAgY29uc3QgRU5ITUVUQVJFQ09SRCAqbHBFbmhNZXRhUmVjb3JkLCAvKiBFTUYgcmVjb3JkIHRvIHJlbmRlciAqLwotICAgICBVSU5UMzIgbkhhbmRsZXMgIC8qIHNpemUgb2YgaGFuZGxlIGFycmF5ICovCisgICAgIGNvbnN0IEVOSE1FVEFSRUNPUkQgKm1yLCAvKiBFTUYgcmVjb3JkIHRvIHJlbmRlciAqLworICAgICBVSU5UMzIgaGFuZGxlcyAgLyogc2l6ZSBvZiBoYW5kbGUgYXJyYXkgKi8KICAgICAgKSAKIHsKICAgaW50IHR5cGU7Ci0gIGZwcmludGYoc3Rkb3V0LCAKLSAgIlBsYXlFbmhNZXRhRmlsZVJlY29yZChoZGMgPSAlMDh4LCBoYW5kbGV0YWJsZSA9ICVwLCByZWNvcmQgPSAlcCwgbnVtSGFuZGxlcyA9ICVkXG4iLCAKLQkgIGhkYywgbHBIYW5kbGV0YWJsZSwgbHBFbmhNZXRhUmVjb3JkLCBuSGFuZGxlcyk7Ci0gIC8qICBTZXRMYXN0RXJyb3IoRV9OT1RJTVBMKTsgKi8KLSAgaWYgKCFscEVuaE1ldGFSZWNvcmQpIHJldHVybiBGQUxTRTsKKyAgVFJBQ0UobWV0YWZpbGUsIAorCSJoZGMgPSAlMDh4LCBoYW5kbGV0YWJsZSA9ICVwLCByZWNvcmQgPSAlcCwgbnVtSGFuZGxlcyA9ICVkXG4iLCAKKwkgIGhkYywgaGFuZGxldGFibGUsIG1yLCBoYW5kbGVzKTsKKyAgaWYgKCFtcikgcmV0dXJuIEZBTFNFOwogCi0gIHR5cGUgPSBscEVuaE1ldGFSZWNvcmQtPmlUeXBlOworICB0eXBlID0gbXItPmlUeXBlOwogCisgIFRSQUNFKG1ldGFmaWxlLCAiIHR5cGU9JWRcbiIsIHR5cGUpOwogICBzd2l0Y2godHlwZSkgCiAgICAgewogICAgIGNhc2UgRU1SX0hFQURFUjoKLSAgICAgIHByaW50ZigiSGVhZGVyIG9rIVxuIik7Ci0gICAgICByZXR1cm4gVFJVRTsKLSAgICAgIGJyZWFrOworICAgICAgeworCUVOSE1FVEFIRUFERVIgKmggPSAoTFBFTkhNRVRBSEVBREVSKSBtcjsKKwlicmVhazsKKyAgICAgIH0KICAgICBjYXNlIEVNUl9FT0Y6Ci0gICAgICBwcmludGYoIkVvZiBvayFcbiIpOwotICAgICAgcmV0dXJuIFRSVUU7CisgICAgICBicmVhazsKKworICAgIGNhc2UgRU1SX0dESUNPTU1FTlQ6CisgICAgICAvKiBhcHBsaWNhdGlvbiBkZWZpbmVkIGFuZCBwcm9jZXNzZWQgKi8KKyAgICAgIGJyZWFrOworCisgICAgY2FzZSBFTVJfU0VUTUFQTU9ERToKKyAgICAgIHsKKwlEV09SRCBtb2RlID0gbXItPmRQYXJtWzBdOworCVNldE1hcE1vZGUzMihoZGMsIG1vZGUpOworCWJyZWFrOworICAgICAgfQorICAgIGNhc2UgRU1SX1NFVEJLTU9ERToKKyAgICAgIHsKKwlEV09SRCBtb2RlID0gbXItPmRQYXJtWzBdOworCVNldEJrTW9kZTMyKGhkYywgbW9kZSk7CisJYnJlYWs7CisgICAgICB9CisgICAgY2FzZSBFTVJfU0VUQktDT0xPUjoKKyAgICAgIHsKKwlEV09SRCBtb2RlID0gbXItPmRQYXJtWzBdOworCVNldEJrQ29sb3IzMihoZGMsIG1vZGUpOworCWJyZWFrOworICAgICAgfQorICAgIGNhc2UgRU1SX1NFVFBPTFlGSUxMTU9ERToKKyAgICAgIHsKKwlEV09SRCBtb2RlID0gbXItPmRQYXJtWzBdOworCVNldFBvbHlGaWxsTW9kZTMyKGhkYywgbW9kZSk7CisJYnJlYWs7CisgICAgICB9CisgICAgY2FzZSBFTVJfU0VUUk9QMjoKKyAgICAgIHsKKwlEV09SRCBtb2RlID0gbXItPmRQYXJtWzBdOworCVNldFJPUDIzMihoZGMsIG1vZGUpOworCWJyZWFrOworICAgICAgfQorICAgIGNhc2UgRU1SX1NFVFNUUkVUQ0hCTFRNT0RFOgorICAgICAgeworCURXT1JEIG1vZGUgPSBtci0+ZFBhcm1bMF07CisJU2V0U3RyZXRjaEJsdE1vZGUzMihoZGMsIG1vZGUpOworCWJyZWFrOworICAgICAgfQorICAgIGNhc2UgRU1SX1NFVFRFWFRBTElHTjoKKyAgICAgIHsKKwlEV09SRCBhbGlnbiA9IG1yLT5kUGFybVswXTsKKwlTZXRUZXh0QWxpZ24zMihoZGMsIGFsaWduKTsKKwlicmVhazsKKyAgICAgIH0KKyAgICBjYXNlIEVNUl9TRVRURVhUQ09MT1I6CisgICAgICB7CisJRFdPUkQgY29sb3IgPSBtci0+ZFBhcm1bMF07CisJU2V0VGV4dENvbG9yMzIoaGRjLCBjb2xvcik7CisJYnJlYWs7CisgICAgICB9CisgICAgY2FzZSBFTVJfU0FWRURDOgorICAgICAgeworCVNhdmVEQzMyKGhkYyk7CisJYnJlYWs7CisgICAgICB9CisgICAgY2FzZSBFTVJfUkVTVE9SRURDOgorICAgICAgeworCVJlc3RvcmVEQzMyKGhkYywgbXItPmRQYXJtWzBdKTsKKwlicmVhazsKKyAgICAgIH0KKyAgICBjYXNlIEVNUl9JTlRFUlNFQ1RDTElQUkVDVDoKKyAgICAgIHsKKwlJTlQzMiBsZWZ0ID0gbXItPmRQYXJtWzBdLCB0b3AgPSBtci0+ZFBhcm1bMV0sIHJpZ2h0ID0gbXItPmRQYXJtWzJdLAorCSAgICAgIGJvdHRvbSA9IG1yLT5kUGFybVszXTsKKwlJbnRlcnNlY3RDbGlwUmVjdDMyKGhkYywgbGVmdCwgdG9wLCByaWdodCwgYm90dG9tKTsKKwlicmVhazsKKyAgICAgIH0KKworICAgIGNhc2UgRU1SX1NFTEVDVE9CSkVDVDoKKyAgICAgIHsKKwlEV09SRCBvYmogPSBtci0+ZFBhcm1bMF07CisJU2VsZWN0T2JqZWN0MzIoaGRjLCAoaGFuZGxldGFibGUtPm9iamVjdEhhbmRsZSlbb2JqXSk7CisJYnJlYWs7CisgICAgICB9CisgICAgY2FzZSBFTVJfREVMRVRFT0JKRUNUOgorICAgICAgeworCURXT1JEIG9iaiA9IG1yLT5kUGFybVswXTsKKwlEZWxldGVPYmplY3QzMiggKGhhbmRsZXRhYmxlLT5vYmplY3RIYW5kbGUpW29ial0pOworCShoYW5kbGV0YWJsZS0+b2JqZWN0SGFuZGxlKVtvYmpdID0gMDsKKwlicmVhazsKKyAgICAgIH0KKworICAgIGNhc2UgRU1SX1NFVFdJTkRPV09SR0VYOgorICAgICAgeworCURXT1JEIHggPSBtci0+ZFBhcm1bMF0sIHkgPSBtci0+ZFBhcm1bMV07CisJU2V0V2luZG93T3JnRXgzMihoZGMsIHgsIHksIE5VTEwpOworCWJyZWFrOworICAgICAgfQorICAgIGNhc2UgRU1SX1NFVFdJTkRPV0VYVEVYOgorICAgICAgeworCURXT1JEIHggPSBtci0+ZFBhcm1bMF0sIHkgPSBtci0+ZFBhcm1bMV07CisJU2V0V2luZG93RXh0RXgzMihoZGMsIHgsIHksIE5VTEwpOworCWJyZWFrOworICAgICAgfQorICAgIGNhc2UgRU1SX1NFVFZJRVdQT1JUT1JHRVg6CisgICAgICB7CisJRFdPUkQgeCA9IG1yLT5kUGFybVswXSwgeSA9IG1yLT5kUGFybVsxXTsKKwlTZXRWaWV3cG9ydE9yZ0V4MzIoaGRjLCB4LCB5LCBOVUxMKTsKKwlicmVhazsKKyAgICAgIH0KKyAgICBjYXNlIEVNUl9TRVRWSUVXUE9SVEVYVEVYOgorICAgICAgeworCURXT1JEIHggPSBtci0+ZFBhcm1bMF0sIHkgPSBtci0+ZFBhcm1bMV07CisJU2V0Vmlld3BvcnRFeHRFeDMyKGhkYywgeCwgeSwgTlVMTCk7CisJYnJlYWs7CisgICAgICB9CisKKyAgICBjYXNlIEVNUl9DUkVBVEVQRU46CisgICAgICB7CisJRFdPUkQgb2JqID0gbXItPmRQYXJtWzBdOworCShoYW5kbGV0YWJsZS0+b2JqZWN0SGFuZGxlKVtvYmpdID0gCisJICBDcmVhdGVQZW5JbmRpcmVjdDMyKChMT0dQRU4zMiAqKSAmKG1yLT5kUGFybVsxXSkpOworCWJyZWFrOworICAgICAgfQorICAgIGNhc2UgRU1SX0VYVENSRUFURVBFTjoKKyAgICAgIHsKKwlEV09SRCBvYmogPSBtci0+ZFBhcm1bMF07CisJRFdPUkQgc3R5bGUgPSBtci0+ZFBhcm1bMV0sIGJydXNoID0gbXItPmRQYXJtWzJdOworCUxPR0JSVVNIMzIgKmIgPSAoTE9HQlJVU0gzMiAqKSAmbXItPmRQYXJtWzNdOworCS8qIEZJWE1FOiBvdGhlciBhcmdzIG5vdCBoYW5kbGVkICovCisJKGhhbmRsZXRhYmxlLT5vYmplY3RIYW5kbGUpW29ial0gPSAKKwkgIEV4dENyZWF0ZVBlbjMyKHN0eWxlLCBicnVzaCwgYiwgMCwgTlVMTCk7CisJYnJlYWs7CisgICAgICB9CisgICAgY2FzZSBFTVJfQ1JFQVRFQlJVU0hJTkRJUkVDVDoKKyAgICAgIHsKKwlEV09SRCBvYmogPSBtci0+ZFBhcm1bMF07CisJKGhhbmRsZXRhYmxlLT5vYmplY3RIYW5kbGUpW29ial0gPSAKKwkgIENyZWF0ZUJydXNoSW5kaXJlY3QzMigoTE9HQlJVU0gzMiAqKSAmKG1yLT5kUGFybVsxXSkpOworCWJyZWFrOworICAgICAgfQorICAgIGNhc2UgRU1SX0VYVENSRUFURUZPTlRJTkRJUkVDVFc6CisJeworCURXT1JEIG9iaiA9IG1yLT5kUGFybVswXTsKKwkoaGFuZGxldGFibGUtPm9iamVjdEhhbmRsZSlbb2JqXSA9IAorCSAgQ3JlYXRlRm9udEluZGlyZWN0MzJXKChMT0dGT05UMzJXICopICYobXItPmRQYXJtWzFdKSk7CisJYnJlYWs7CisJfQorCisgICAgY2FzZSBFTVJfTU9WRVRPRVg6CisgICAgICB7CisJRFdPUkQgeCA9IG1yLT5kUGFybVswXSwgeSA9IG1yLT5kUGFybVsxXTsKKwlNb3ZlVG9FeDMyKGhkYywgeCwgeSwgTlVMTCk7CisJYnJlYWs7CisgICAgICB9CisgICAgY2FzZSBFTVJfTElORVRPOgorICAgICAgeworCURXT1JEIHggPSBtci0+ZFBhcm1bMF0sIHkgPSBtci0+ZFBhcm1bMV07CisgICAgICAgIExpbmVUbzMyKGhkYywgeCwgeSk7CisJYnJlYWs7CisgICAgICB9CisgICAgY2FzZSBFTVJfUkVDVEFOR0xFOgorICAgICAgeworCUlOVDMyIGxlZnQgPSBtci0+ZFBhcm1bMF0sIHRvcCA9IG1yLT5kUGFybVsxXSwgcmlnaHQgPSBtci0+ZFBhcm1bMl0sCisJICAgICAgYm90dG9tID0gbXItPmRQYXJtWzNdOworCVJlY3RhbmdsZTMyKGhkYywgbGVmdCwgdG9wLCByaWdodCwgYm90dG9tKTsKKwlicmVhazsKKyAgICAgIH0KKyAgICBjYXNlIEVNUl9FTExJUFNFOgorICAgICAgeworCUlOVDMyIGxlZnQgPSBtci0+ZFBhcm1bMF0sIHRvcCA9IG1yLT5kUGFybVsxXSwgcmlnaHQgPSBtci0+ZFBhcm1bMl0sCisJICAgICAgYm90dG9tID0gbXItPmRQYXJtWzNdOworCUVsbGlwc2UzMihoZGMsIGxlZnQsIHRvcCwgcmlnaHQsIGJvdHRvbSk7CisJYnJlYWs7CisgICAgICB9CisKKyAgICBjYXNlIEVNUl9QT0xZR09OMTY6CisgICAgICB7CisJLyogRklYTUU6IDAtMyA6IGEgYm91bmRpbmcgcmVjdGFuZ2xlPyAqLworCUlOVDMyIGNvdW50ID0gbXItPmRQYXJtWzRdOworCVBvbHlnb24xNihoZGMsIChQT0lOVDE2ICopJm1yLT5kUGFybVs1XSwgY291bnQpOworCWJyZWFrOworICAgICAgfQorI2lmIDAKKyAgICBjYXNlIEVNUl9QT0xZUE9MWUdPTjE2OgorICAgICAgeworCUlOVDMyIHBvbHlnb25zID0gbXItPmRQYXJtW3pdOworCUxQUE9JTlQxNiBwdHMgPSAoTFBQT0lOVDE2KSAmbXItPmRQYXJtW3hdOworCUxQSU5UMTYgY291bnRzID0gKExQSU5UMTYpICZtci0+ZFBhcm1beV07CisJUG9seVBvbHlnb24xNihoZGMsIHB0cywgY291bnRzLCBwb2x5Z29ucyk7CisJYnJlYWs7CisgICAgICB9CisjZW5kaWYKKyAgICBjYXNlIEVNUl9FWFRURVhUT1VUVzoKKyAgICAgIHsKKwkvKiAwLTM6ID8/PyAqLworCURXT1JEIGZsYWdzID0gbXItPmRQYXJtWzRdOworCS8qIDUsIDY6ID8/PyAqLworCURXT1JEIHggPSBtci0+ZFBhcm1bN10sIHkgPSBtci0+ZFBhcm1bOF07CisJRFdPUkQgY291bnQgPSBtci0+ZFBhcm1bOV07CisJLyogMTAtMTY6ID8/PyAqLworCUxQV1NUUiBzdHIgPSAoTFBXU1RSKSYgbXItPmRQYXJtWzE3XTsKKwkvKiB0cmFpbGluZyBpbmZvOiBkeCBhcnJheT8gKi8KKwlFeHRUZXh0T3V0MzJXKGhkYywgeCwgeSwgZmxhZ3MsIC8qIGxwUmVjdCAqLyBOVUxMLCAKKwkJICAgICAgc3RyLCBjb3VudCwgLyogbHBEeCAqLyBOVUxMKTsgCisJYnJlYWs7CisgICAgICB9CisKKyAgICBkZWZhdWx0OgorICAgICAgRklYTUUobWV0YWZpbGUsICJ0eXBlICVkIGlzIHVuaW1wbGVtZW50ZWRcbiIsIHR5cGUpOworICAgICAgLyogIFNldExhc3RFcnJvcihFX05PVElNUEwpOyAqLwogICAgICAgYnJlYWs7CiAgICAgfQotICBwcmludGYoIkkgZHVubm8gJWRcbiIsIHR5cGUpOwotICByZXR1cm4gRkFMU0U7CisgIHJldHVybiBUUlVFOwogfQogCiAKQEAgLTEzOCw3ICszNDMsNyBAQAogICogIHJldHVybnMgRkFMU0UuCiAgKgogICogQlVHUwotICogICBEb2Vzbid0IGZyZWUgb2JqZWN0cywgaWdub3JlcyByZWN0LgorICogICBJZ25vcmVzIHJlY3QuCiAgKi8KIEJPT0wzMiBFbnVtRW5oTWV0YUZpbGUzMiggCiAgICAgIEhEQzMyIGhkYywgLyogZGV2aWNlIGNvbnRleHQgdG8gcGFzcyB0byBfRW5oTWV0YUZ1bmNfICovCkBAIC0xNTQsMTEgKzM1OSwxMiBAQAogICBIQU5ETEVUQUJMRTMyICpodCA9IChIQU5ETEVUQUJMRTMyICopR2xvYmFsQWxsb2MzMihHUFRSLCBzaXplb2YoSEFORExFVEFCTEUzMikqY291bnQpOwogICBodC0+b2JqZWN0SGFuZGxlWzBdID0gaG1mOwogICB3aGlsZSAocmV0KSB7Ci0gICAgLyogICBwcmludGYoIkVudW1FbmhNZXRhRmlsZTogdHlwZSA9ICVsZCBzaXplID0gJWxkXG4iLCBwLT5pVHlwZSwgcC0+blNpemUpOyovCiAgICAgcmV0ID0gKCpjYWxsYmFjaykoaGRjLCBodCwgcCwgY291bnQsIGRhdGEpOyAKICAgICBpZiAocC0+aVR5cGUgPT0gRU1SX0VPRikgYnJlYWs7CiAgICAgcCA9ICh2b2lkICopIHAgKyBwLT5uU2l6ZTsKICAgfQorICBHbG9iYWxGcmVlMzIoaHQpOworICBHbG9iYWxVbmxvY2szMihobWYpOwogICByZXR1cm4gcmV0OwogfQogCkBAIC0xODEsNyArMzg3LDggQEAKIHsKICAgTFBFTkhNRVRBUkVDT1JEIHAgPSBHbG9iYWxMb2NrMzIoaG1mKTsKICAgSU5UMzIgY291bnQgPSAoKExQRU5ITUVUQUhFQURFUikgcCktPm5IYW5kbGVzOwotICBIQU5ETEVUQUJMRTMyICpodCA9IChIQU5ETEVUQUJMRTMyICopR2xvYmFsQWxsb2MzMihHUFRSLCBzaXplb2YoSEFORExFVEFCTEUzMikqY291bnQpOworICBIQU5ETEVUQUJMRTMyICpodCA9IChIQU5ETEVUQUJMRTMyICopR2xvYmFsQWxsb2MzMihHUFRSLCAKKwkJCQkgICAgc2l6ZW9mKEhBTkRMRVRBQkxFMzIpKmNvdW50KTsKICAgaHQtPm9iamVjdEhhbmRsZVswXSA9IGhtZjsKICAgd2hpbGUgKDEpIHsKICAgICBQbGF5RW5oTWV0YUZpbGVSZWNvcmQzMihoZGMsIGh0LCBwLCBjb3VudCk7CkBAIC0xOTEsMzUgKzM5OCwxOCBAQAogICByZXR1cm4gRkFMU0U7CiB9CiAKLS8qCi0gIG5lZWQgd2lkZSB2ZXJzaW9uIGFzIHdlbGwKLSovCi1IREMzMiBDcmVhdGVFbmhNZXRhRmlsZTMyQSggCi0gICAgSERDMzIgaGRjUmVmLCAvKiBvcHRpb25hbCByZWZlcmVuY2UgREMgKi8KLSAgICBMUENTVFIgbHBGaWxlbmFtZSwgLyogb3B0aW9uYWwgZmlsZW5hbWUgZm9yIGRpc2sgbWV0YWZpbGVzICovCi0gICAgY29uc3QgUkVDVDMyICpscFJlY3QsIC8qIG9wdGlvbmFsIGJvdW5kaW5nIHJlY3RhbmdsZSAqLwotICAgIExQQ1NUUiBscERlc2NyaXB0aW9uIC8qIG9wdGlvbmFsIGRlc2NyaXB0aW9uICovIAotICAgICkKLXsKLSAgcmV0dXJuIE5VTEw7Ci19Ci0KLUhFTkhNRVRBRklMRTMyIENsb3NlRW5oTWV0YUZpbGUzMiggCi0gICAgICAgICAgICAgICBIREMzMiBoZGMgIC8qIG1ldGFmaWxlIERDICovCi0JICAgICAgICkKLXsKLSAgcmV0dXJuIE5VTEw7Ci19Ci0KLQogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKiAgRGVsZXRlRW5oTWV0YUZpbGUzMiAoR0RJMzIuNjgpCiAgKi8KIEJPT0wzMiBEZWxldGVFbmhNZXRhRmlsZTMyKEhFTkhNRVRBRklMRTMyIGhtZikgewotICByZXR1cm4gRkFMU0U7CisgIHJldHVybiAhR2xvYmFsRnJlZTMyKGhtZik7CiB9CiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICogIENvcHlFbmhNZXRhRmlsZUEgKEdESTMyLjIxKQogICovCitIRU5ITUVUQUZJTEUzMiBDb3B5RW5oTWV0YUZpbGUzMkEoSEVOSE1FVEFGSUxFMzIgaG1mLCBMUENTVFIgZmlsZSkgeworICByZXR1cm4gMDsKK30KKwogCmRpZmYgLS1naXQgYS9vYmplY3RzL2ZvbnQuYyBiL29iamVjdHMvZm9udC5jCmluZGV4IGFmYTM3NGQuLjU2NGE0M2MgMTAwNjQ0Ci0tLSBhL29iamVjdHMvZm9udC5jCisrKyBiL29iamVjdHMvZm9udC5jCkBAIC0xMyw3ICsxMyw2IEBACiAjaW5jbHVkZSAibWV0YWZpbGUuaCIKICNpbmNsdWRlICJvcHRpb25zLmgiCiAjaW5jbHVkZSAiZGVidWcuaCIKLSNpbmNsdWRlICJkZWJ1Z3N0ci5oIgogCiAjZGVmaW5lIEVOVU1fVU5JQ09ERQkweDAwMDAwMDAxCiAKQEAgLTIzMSw3ICsyMzAsNyBAQAogCSAgICBHRElfSEVBUF9VTkxPQ0soIGhGb250ICk7CiAJfQogICAgIH0KLSAgICBlbHNlIGZwcmludGYoc3RkZXJyLCJDcmVhdGVGb250SW5kaXJlY3QoTlVMTCkgPT4gTlVMTFxuIik7CisgICAgZWxzZSBXQVJOKGZvbnQsIihOVUxMKSA9PiBOVUxMXG4iKTsKIAogICAgIHJldHVybiBoRm9udDsKIH0KQEAgLTEwMjUsOCArMTAyNCw3IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFBBQkMzMiBhYmMgKQogewogICAgIC8qIE5vIFRydWVUeXBlIGZvbnRzIGluIFdpbmUgc28gZmFyICovCi0gICAgZnByaW50Ziggc3RkbmltcCwgIlNUVUI6IEdldENoYXJBQkNXaWR0aHMoJTA0eCwlMDR4LCUwNHgsJXApXG4iLAotICAgICAgICAgICAgIGhkYywgZmlyc3RDaGFyLCBsYXN0Q2hhciwgYWJjICk7CisgICAgRklYTUUoZm9udCwgIiglMDR4LCUwNHgsJTA0eCwlcCk6IHN0dWJcbiIsIGhkYywgZmlyc3RDaGFyLCBsYXN0Q2hhciwgYWJjICk7CiAgICAgcmV0dXJuIEZBTFNFOwogfQogCkBAIC0xMDQ4LDggKzEwNDYsOCBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMUEdMWVBITUVUUklDUzE2IGxwZ20sIERXT1JEIGNiQnVmZmVyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMUFZPSUQgbHBCdWZmZXIsIGNvbnN0IE1BVDIgKmxwbWF0MiApCiB7Ci0gICAgZnByaW50Ziggc3RkbmltcCwiR2V0R2x5cGhPdXRMaW5lMTYoJTA0eCwgJyVjJywgJTA0eCwgJXAsICVsZCwgJXAsICVwKSAvLyAtIGVtcHR5IHN0dWIhXG4iLAotICAgICAgICAgICAgIGhkYywgdUNoYXIsIGZ1Rm9ybWF0LCBscGdtLCBjYkJ1ZmZlciwgbHBCdWZmZXIsIGxwbWF0MiApOworICAgIEZJWE1FKGZvbnQsIiglMDR4LCAnJWMnLCAlMDR4LCAlcCwgJWxkLCAlcCwgJXApOiBlbXB0eSBzdHViIVxuIiwKKwkgIGhkYywgdUNoYXIsIGZ1Rm9ybWF0LCBscGdtLCBjYkJ1ZmZlciwgbHBCdWZmZXIsIGxwbWF0MiApOwogICAgIHJldHVybiAoRFdPUkQpLTE7IC8qIGZhaWx1cmUgKi8KIH0KIApAQCAtMTA2MSw4ICsxMDU5LDggQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExQR0xZUEhNRVRSSUNTMzIgbHBnbSwgRFdPUkQgY2JCdWZmZXIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMUFZPSUQgbHBCdWZmZXIsIGNvbnN0IE1BVDIgKmxwbWF0MiApCiB7Ci0gICAgZnByaW50Ziggc3RkbmltcCwiR2V0R2x5cGhPdXRMaW5lMzJBKCUwNHgsICclYycsICUwNHgsICVwLCAlbGQsICVwLCAlcCkgLy8gLSBlbXB0eSBzdHViIVxuIiwKLSAgICAgICAgICAgICBoZGMsIHVDaGFyLCBmdUZvcm1hdCwgbHBnbSwgY2JCdWZmZXIsIGxwQnVmZmVyLCBscG1hdDIgKTsKKyAgICBGSVhNRShmb250LCIoJTA0eCwgJyVjJywgJTA0eCwgJXAsICVsZCwgJXAsICVwKTogZW1wdHkgc3R1YiFcbiIsCisJICBoZGMsIHVDaGFyLCBmdUZvcm1hdCwgbHBnbSwgY2JCdWZmZXIsIGxwQnVmZmVyLCBscG1hdDIgKTsKICAgICByZXR1cm4gKERXT1JEKS0xOyAvKiBmYWlsdXJlICovCiB9CiAKQEAgLTEwNzMsOCArMTA3MSw4IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMUEdMWVBITUVUUklDUzMyIGxwZ20sIERXT1JEIGNiQnVmZmVyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFBWT0lEIGxwQnVmZmVyLCBjb25zdCBNQVQyICpscG1hdDIgKQogewotICAgIGZwcmludGYoIHN0ZG5pbXAsIkdldEdseXBoT3V0TGluZTMyVyglMDR4LCAnJWMnLCAlMDR4LCAlcCwgJWxkLCAlcCwgJXApIC8vIC0gZW1wdHkgc3R1YiFcbiIsCi0gICAgICAgICAgICAgaGRjLCB1Q2hhciwgZnVGb3JtYXQsIGxwZ20sIGNiQnVmZmVyLCBscEJ1ZmZlciwgbHBtYXQyICk7CisgICAgRklYTUUoZm9udCwiKCUwNHgsICclYycsICUwNHgsICVwLCAlbGQsICVwLCAlcCk6IGVtcHR5IHN0dWIhXG4iLAorCSAgaGRjLCB1Q2hhciwgZnVGb3JtYXQsIGxwZ20sIGNiQnVmZmVyLCBscEJ1ZmZlciwgbHBtYXQyICk7CiAgICAgcmV0dXJuIChEV09SRCktMTsgLyogZmFpbHVyZSAqLwogfQogCkBAIC0xMTAxLDggKzEwOTksOCBAQAogICAgICAqIGVudW1iZXJlZCB3aXRoIEVudW1Gb250cy9FbnVtRm9udEZhbWlsaWVzCiAgICAgICogbHBzekN1cnJlbnRQYXRoIGNhbiBiZSBOVUxMCiAgICAgICovCi0gICAgZnByaW50ZihzdGRuaW1wLCJDcmVhdGVTY2FsYWJsZUZvbnRSZXNvdXJjZSglbGQsJXMsJXMsJXMpIC8vIGVtcHR5IHN0dWJcbiIsCi0gICAgICAgICAgICBmSGlkZGVuLCBscHN6UmVzb3VyY2VGaWxlLCBscHN6Rm9udEZpbGUsIGxwc3pDdXJyZW50UGF0aCApOworICAgIEZJWE1FKGZvbnQsIiglbGQsJXMsJXMsJXMpOiBlbXB0eSBzdHViXG4iLAorCSAgZkhpZGRlbiwgbHBzelJlc291cmNlRmlsZSwgbHBzekZvbnRGaWxlLCBscHN6Q3VycmVudFBhdGggKTsKICAgICByZXR1cm4gRkFMU0U7IC8qIGNyZWF0ZSBmYWlsZWQgKi8KIH0KIApAQCAtMTExNCw4ICsxMTEyLDggQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExQQ1dTVFIgbHBzekZvbnRGaWxlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFBDV1NUUiBscHN6Q3VycmVudFBhdGggKQogewotICAgIGZwcmludGYoc3RkbmltcCwiQ3JlYXRlU2NhbGFibGVGb250UmVzb3VyY2UzMlcoJWxkLCVwLCVwLCVwKSAvLyBlbXB0eSBzdHViXG4iLAotICAgICAgICAgICAgZkhpZGRlbiwgbHBzelJlc291cmNlRmlsZSwgbHBzekZvbnRGaWxlLCBscHN6Q3VycmVudFBhdGggKTsKKyAgICBGSVhNRShmb250LCIoJWxkLCVwLCVwLCVwKTogZW1wdHkgc3R1YlxuIiwKKwkgIGZIaWRkZW4sIGxwc3pSZXNvdXJjZUZpbGUsIGxwc3pGb250RmlsZSwgbHBzekN1cnJlbnRQYXRoICk7CiAgICAgcmV0dXJuIEZBTFNFOyAvKiBjcmVhdGUgZmFpbGVkICovCiB9CiAKQEAgLTExNDksOCArMTE0NywxMCBAQAogewogICAgIC8qIEF0IHRoaXMgdGltZSBrZXJuaW5nIGlzIGlnbm9yZWQgKHNldCB0byAwKSAqLwogICAgIGludCBpOwotICAgIGZwcmludGYoc3RkbmltcCwiR2V0S2VybmluZ1BhaXJzMTY6IGFsbW9zdCBlbXB0eSBzdHViIVxuIik7Ci0gICAgZm9yIChpID0gMDsgaSA8IGNQYWlyczsgaSsrKSBscEtlcm5pbmdQYWlyc1tpXS5pS2VybkFtb3VudCA9IDA7CisgICAgRklYTUUoZm9udCwiKCV4LCVkLCVwKTogYWxtb3N0IGVtcHR5IHN0dWIhXG4iLAorCSAgaERDLCBjUGFpcnMsIGxwS2VybmluZ1BhaXJzKTsKKyAgICBmb3IgKGkgPSAwOyBpIDwgY1BhaXJzOyBpKyspIAorICAgICAgICBscEtlcm5pbmdQYWlyc1tpXS5pS2VybkFtb3VudCA9IDA7CiAgICAgcmV0dXJuIDA7CiB9CiAKQEAgLTExNjMsOCArMTE2MywxMCBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFBLRVJOSU5HUEFJUjMyIGxwS2VybmluZ1BhaXJzICkKIHsKICAgICBpbnQgaTsKLSAgICBmcHJpbnRmKHN0ZG5pbXAsIkdldEtlcm5pbmdQYWlyczMyOiBhbG1vc3QgZW1wdHkgc3R1YiFcbiIpOwotICAgIGZvciAoaSA9IDA7IGkgPCBjUGFpcnM7IGkrKykgbHBLZXJuaW5nUGFpcnNbaV0uaUtlcm5BbW91bnQgPSAwOworICAgIEZJWE1FKGZvbnQsIigleCwlbGQsJXApOiBhbG1vc3QgZW1wdHkgc3R1YiFcbiIsCisJICBoREMsIGNQYWlycywgbHBLZXJuaW5nUGFpcnMpOworICAgIGZvciAoaSA9IDA7IGkgPCBjUGFpcnM7IGkrKykgCisgICAgICAgIGxwS2VybmluZ1BhaXJzW2ldLmlLZXJuQW1vdW50ID0gMDsKICAgICByZXR1cm4gMDsKIH0KIApAQCAtMTE3OSw5ICsxMTgxLDcgQEAKIH0KIAogQk9PTDMyIFdJTkFQSSBUcmFuc2xhdGVDaGFyU2V0SW5mbyhMUERXT1JEIGxwU3JjLExQQ0hBUlNFVElORk8gbHBDcyxEV09SRCBkd0ZsYWdzKSB7Ci0gICAgZnByaW50ZihzdGRlcnIsIlRyYW5zbGF0ZUNoYXJTZXRJbmZvKCVwLCVwLDB4JTA4bHgpLCBzdHViLlxuIiwKLSAgICAJbHBTcmMsbHBDcyxkd0ZsYWdzCi0gICAgKTsKKyAgICBGSVhNRShmb250LCIoJXAsJXAsMHglMDhseCksIHN0dWIuXG4iLGxwU3JjLGxwQ3MsZHdGbGFncyk7CiAgICAgcmV0dXJuIFRSVUU7CiB9CiAKQEAgLTExOTEsNyArMTE5MSw3IEBACiAgKi8KIERXT1JEIFdJTkFQSSBHZXRGb250TGFuZ3VhZ2VJbmZvMzIoSERDMzIgaGRjKSB7CiAJLyogcmV0dXJuIHZhbHVlIDAgaXMgY29ycmVjdCBmb3IgbW9zdCBjYXNlcyBhbnl3YXkgKi8KLQlmcHJpbnRmKHN0ZGVyciwiR2V0Rm9udExhbmd1YWdlSW5mbzpzdHViIVxuIik7CisgICAgICAgIEZJWE1FKGZvbnQsIigleCk6c3R1YiFcbiIsIGhkYyk7CiAJcmV0dXJuIDA7CiB9CiAKQEAgLTEyMDAsNiArMTIwMCw2IEBACiAgKi8KIERXT1JEIFdJTkFQSSBHZXRGb250TGFuZ3VhZ2VJbmZvMTYoSERDMTYgaGRjKSB7CiAJLyogcmV0dXJuIHZhbHVlIDAgaXMgY29ycmVjdCBmb3IgbW9zdCBjYXNlcyBhbnl3YXkgKi8KLQlmcHJpbnRmKHN0ZGVyciwiR2V0Rm9udExhbmd1YWdlSW5mbzpzdHViIVxuIik7CisJRklYTUUoZm9udCwiKCV4KTpzdHViIVxuIixoZGMpOwogCXJldHVybiAwOwogfQpkaWZmIC0tZ2l0IGEvb2JqZWN0cy9tZXRhZmlsZS5jIGIvb2JqZWN0cy9tZXRhZmlsZS5jCmluZGV4IDY4NmQ1Y2QuLmNkMGE4MGIgMTAwNjQ0Ci0tLSBhL29iamVjdHMvbWV0YWZpbGUuYworKysgYi9vYmplY3RzL21ldGFmaWxlLmMKQEAgLTcyOCw3ICs3MjgsNyBAQAogCSAgewogCSAgIFRSQUNFKG1ldGFmaWxlLCIlcyAgbGVuOiAlbGRcbiIsCiAgICAgICAgICAgICAgc290LG1yLT5yZFNpemUpOwotICAgICAgICAgICBmcHJpbnRmKHN0ZGVyciwKKyAgICAgICAgICAgV0FSTihtZXRhZmlsZSwKIAkgICAgICJQbGVhc2UgcmVwb3J0OiBQbGF5TWV0YUZpbGUvRXh0VGV4dE91dCBsZW49JWxkIHNsZW49JWQgcmRTaXplPSVsZCBvcHQ9JTA0eFxuIiwKIAkJICAgbGVuLHMxLG1yLT5yZFNpemUsbXItPnJkUGFyYW1bM10pOwogICAgICAgICAgICBkeHggPSBOVUxMOyAvKiBzaG91bGQndCBoYXBwZW4gLS0gYnV0IGlmLCB3ZSBjb250aW51ZSB3aXRoIE5VTEwgW2ZvciB3b3JrYXJvdW5kXSAqLwpAQCAtODYwLDcgKzg2MCw3IEBACiAgICAgICAgCVNldFRleHRKdXN0aWZpY2F0aW9uMzIoaGRjLCAqKG1yLT5yZFBhcmFtICsgMSksICoobXItPnJkUGFyYW0pKTsKIAlicmVhazsKIAotI2RlZmluZSBNRVRBX1VOSU1QKHgpIGNhc2UgeDogZnByaW50ZihzdGRlcnIsIlBsYXlNZXRhRmlsZVJlY29yZDpyZWNvcmQgdHlwZSAiI3giIG5vdCBpbXBsZW1lbnRlZC5cbiIpO2JyZWFrOworI2RlZmluZSBNRVRBX1VOSU1QKHgpIGNhc2UgeDogRklYTUUobWV0YWZpbGUsICJQbGF5TWV0YUZpbGVSZWNvcmQ6cmVjb3JkIHR5cGUgIiN4IiBub3QgaW1wbGVtZW50ZWQuXG4iKTticmVhazsKICAgICBNRVRBX1VOSU1QKE1FVEFfRlJBTUVSRUdJT04pCiAgICAgTUVUQV9VTklNUChNRVRBX0RSQVdURVhUKQogICAgIE1FVEFfVU5JTVAoTUVUQV9TRVRESUJUT0RFVikKQEAgLTg4MCwxMiArODgwLDIzIEBACiAjdW5kZWYgTUVUQV9VTklNUAogCiAgICAgZGVmYXVsdDoKLQlmcHJpbnRmKHN0ZGRlYiwiUGxheU1ldGFGaWxlUmVjb3JkOiBVbmtub3duIHJlY29yZCB0eXBlICV4XG4iLAorCVdBUk4obWV0YWZpbGUsICJQbGF5TWV0YUZpbGVSZWNvcmQ6IFVua25vd24gcmVjb3JkIHR5cGUgJXhcbiIsCiAJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtci0+cmRGdW5jdGlvbik7CiAgICAgfQogfQogCiAKK0JPT0wzMiBXSU5BUEkgUGxheU1ldGFGaWxlUmVjb3JkMzIoIAorICAgICBIREMzMiBoZGMsIAorICAgICBIQU5ETEVUQUJMRTMyICpoYW5kbGV0YWJsZSwgCisgICAgIE1FVEFSRUNPUkQgKm1ldGFyZWNvcmQsIAorICAgICBVSU5UMzIgaGFuZGxlcyAgCisgICAgKQoreworICBQbGF5TWV0YUZpbGVSZWNvcmQxNihoZGMsIGhhbmRsZXRhYmxlLCBtZXRhcmVjb3JkLCBoYW5kbGVzKTsKKyAgcmV0dXJuIFRSVUU7Cit9CisKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqICAgICAgICAgR2V0TWV0YUZpbGVCaXRzICAgKEdESS4xNTkpCiAgKgpAQCAtOTM4LDYgKzk0OSwyMSBAQAogfQogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiAgICAgICAgIFNldE1ldGFGaWxlQml0c0V4ICAgIChHREkzMi4zMjMpCisgKi8KK0hNRVRBRklMRTMyIFdJTkFQSSBTZXRNZXRhRmlsZUJpdHNFeCggCisgICAgIFVJTlQzMiBzaXplLCAvKiBzaXplIG9mIG1ldGFmaWxlLCBpbiBieXRlcyAqLworICAgICBjb25zdCBCWVRFICpscERhdGEgLyogcG9pbnRlciB0byBtZXRhZmlsZSBkYXRhICovICAKKyAgICApCit7CisgIEhNRVRBRklMRTMyIGhtZiA9IEdsb2JhbEFsbG9jMTYoR0hORCwgc2l6ZSk7CisgIEJZVEUgKnAgPSBHbG9iYWxMb2NrMTYoaG1mKSA7CisgIG1lbWNweShwLCBscERhdGEsIHNpemUpOworICBHbG9iYWxVbmxvY2sxNihobWYpOworICByZXR1cm4gaG1mOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKiAgICAgICAgIE1GX01ldGFfQ3JlYXRlUmVnaW9uCiAgKgogICogIEhhbmRsZXMgTUVUQV9DUkVBVEVSRUdJT04gZm9yIFBsYXlNZXRhRmlsZVJlY29yZCgpLgpAQCAtOTg2LDEzICsxMDEyLDEzIEBACiAKIAllbmQgPSBzdGFydCArICpzdGFydCArIDM7CiAJaWYoZW5kID4gKFdPUkQgKiltciArIG1yLT5yZFNpemUpIHsKLQkgICAgZnByaW50ZihzdGRlcnIsICJNRVRBX0NSRUFURVJFR0lPTjogZW5kIHBvaW50cyBvdXRzaWRlIHJlY29yZC5cbiIpOworCSAgICBXQVJOKG1ldGFmaWxlLCAiTUVUQV9DUkVBVEVSRUdJT046IGVuZCBwb2ludHMgb3V0c2lkZSByZWNvcmQuXG4iKTsKIAkgICAgRGVsZXRlT2JqZWN0MzIoIGhyZ24yICk7CiAJICAgIHJldHVybiBGQUxTRTsKICAgICAgICAgfQogCiAJaWYoKnN0YXJ0ICE9ICplbmQpIHsKLQkgICAgZnByaW50ZihzdGRlcnIsICJNRVRBX0NSRUFURVJFR0lPTjogbWlzbWF0Y2hlZCBkZWxpbWl0ZXJzLlxuIik7CisJICAgIFdBUk4obWV0YWZpbGUsICJNRVRBX0NSRUFURVJFR0lPTjogbWlzbWF0Y2hlZCBkZWxpbWl0ZXJzLlxuIik7CiAJICAgIERlbGV0ZU9iamVjdDMyKCBocmduMiApOwogCSAgICByZXR1cm4gRkFMU0U7CiAJfQpAQCAtMTAzNyw3ICsxMDYzLDcgQEAKIAkgICAgcmV0dXJuIEZBTFNFOwogICAgICAgICBicmVhazsKICAgICBkZWZhdWx0OgotICAgICAgICBmcHJpbnRmKCBzdGRlcnIsICJVbmtub3duIG1ldGFmaWxlIHR5cGUgJWRcbiIsIHBoeXNEZXYtPm1oLT5tdFR5cGUgKTsKKyAgICAgICAgRVJSKG1ldGFmaWxlLCAiVW5rbm93biBtZXRhZmlsZSB0eXBlICVkXG4iLCBwaHlzRGV2LT5taC0+bXRUeXBlICk7CiAgICAgICAgIHJldHVybiBGQUxTRTsKICAgICB9CiAKQEAgLTE1NTQsNyArMTU4MCw3IEBACiAKICAgICBsZW4gPSBHZXRSZWdpb25EYXRhKCBocmduLCAwLCBOVUxMICk7CiAgICAgaWYoICEocmduZGF0YSA9IEhlYXBBbGxvYyggU3lzdGVtSGVhcCwgMCwgbGVuICkpICkgewotICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIk1GX0NyZWF0ZVJlZ2lvbjogY2FuJ3QgYWxsb2MgcmduZGF0YSBidWZmZXJcbiIpOworICAgICAgICBXQVJOKG1ldGFmaWxlLCAiTUZfQ3JlYXRlUmVnaW9uOiBjYW4ndCBhbGxvYyByZ25kYXRhIGJ1ZmZlclxuIik7CiAJcmV0dXJuIC0xOwogICAgIH0KICAgICBHZXRSZWdpb25EYXRhKCBocmduLCBsZW4sIHJnbmRhdGEgKTsKQEAgLTE1NjQsNyArMTU5MCw3IEBACiAgICAgICovCiAgICAgbGVuID0gc2l6ZW9mKE1FVEFSRUNPUkQpICsgMjAgKyAocmduZGF0YS0+cmRoLm5Db3VudCAqIDEyKTsKICAgICBpZiggIShtciA9IEhlYXBBbGxvYyggU3lzdGVtSGVhcCwgMCwgbGVuICkpICkgewotICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIk1GX0NyZWF0ZVJlZ2lvbjogY2FuJ3QgYWxsb2MgTUVUQVJFQ09SRCBidWZmZXJcbiIpOworICAgICAgICBXQVJOKG1ldGFmaWxlLCAiTUZfQ3JlYXRlUmVnaW9uOiBjYW4ndCBhbGxvYyBNRVRBUkVDT1JEIGJ1ZmZlclxuIik7CiAJSGVhcEZyZWUoIFN5c3RlbUhlYXAsIDAsIHJnbmRhdGEgKTsKIAlyZXR1cm4gLTE7CiAgICAgfQpAQCAtMTYxOSw3ICsxNjQ1LDcgQEAKICAgICBIZWFwRnJlZSggU3lzdGVtSGVhcCwgMCwgcmduZGF0YSApOwogICAgIGlmKCFyZXQpIAogICAgIHsKLSAgICAgICAgZnByaW50ZihzdGRlcnIsICJNRl9DcmVhdGVSZWdpb246IE1GX1dyaXRlUmVjb3JkIGZhaWxlZFxuIik7CisgICAgICAgIFdBUk4obWV0YWZpbGUsICJNRl9DcmVhdGVSZWdpb246IE1GX1dyaXRlUmVjb3JkIGZhaWxlZFxuIik7CiAJcmV0dXJuIC0xOwogICAgIH0KICAgICByZXR1cm4gTUZfQWRkSGFuZGxlREMoIGRjICk7CmRpZmYgLS1naXQgYS9vYmplY3RzL3BhbGV0dGUuYyBiL29iamVjdHMvcGFsZXR0ZS5jCmluZGV4IDhlMjU5NzAuLjM3NzVlOWYgMTAwNjQ0Ci0tLSBhL29iamVjdHMvcGFsZXR0ZS5jCisrKyBiL29iamVjdHMvcGFsZXR0ZS5jCkBAIC0xMTUsNyArMTE1LDcgQEAKICAqLwogSFBBTEVUVEUzMiBXSU5BUEkgQ3JlYXRlSGFsZnRvbmVQYWxldHRlKEhEQzMyIGhkYykKIHsKLSAgZnByaW50ZihzdGRuaW1wLCJDcmVhdGVIYWxmdG9uZVBhbGV0dGU6IGVtcHR5IHN0dWIhXG4iKTsKKyAgRklYTUUocGFsZXR0ZSwiKCV4KTogZW1wdHkgc3R1YiFcbiIsIGhkYyk7CiAgIHJldHVybiBOVUxMOwogfQogCkBAIC0zMTIsOCArMzEyLDcgQEAKIFVJTlQzMiBXSU5BUEkgU2V0U3lzdGVtUGFsZXR0ZVVzZTMyKCBIREMzMiBoZGMsIFVJTlQzMiB1c2UgKQogewogICAgIFVJTlQzMiBvbGQgPSBTeXN0ZW1QYWxldHRlVXNlOwotICAgIGZwcmludGYoIHN0ZG5pbXAsIlNldFN5c3RlbVBhbGV0dGVVc2UoJTA0eCwlMDR4KSAvLyBlbXB0eSBzdHViICEhIVxuIiwKLSAgICAgICAgICAgICBoZGMsIHVzZSApOworICAgIEZJWE1FKHBhbGV0dGUsIiglMDR4LCUwNHgpOiBlbXB0eSBzdHViICEhIVxuIiwgaGRjLCB1c2UgKTsKICAgICBTeXN0ZW1QYWxldHRlVXNlID0gdXNlOwogICAgIHJldHVybiBvbGQ7CiB9CkBAIC01MzYsOSArNTM1LDkgQEAKICAgICB9CiAgICAgZWxzZSBUUkFDRShwYWxldHRlLCAiICBza2lwcGluZyAoaExhc3RSZWFsaXplZFBhbGV0dGUgPSAlMDR4KVxuIiwKIAkJCSBoTGFzdFJlYWxpemVkUGFsZXR0ZSk7Ci0gICAgCiAgICAgR0RJX0hFQVBfVU5MT0NLKCBoZGMgKTsKLSAgICBGSVhNRShwYWxldHRlLCAiICAgcmVhbGl6ZWQgJWkgY29sb3JzIC0gbm90IGltcG1lbmVudGVkP1xuIiwgcmVhbGl6ZWQgKTsKKworICAgIFRSQUNFKHBhbGV0dGUsICIgICByZWFsaXplZCAlaSBjb2xvcnMuXG4iLCByZWFsaXplZCApOwogICAgIHJldHVybiAoVUlOVDE2KXJlYWxpemVkOwogfQogCmRpZmYgLS1naXQgYS9vYmplY3RzL3RleHQuYyBiL29iamVjdHMvdGV4dC5jCmluZGV4IDRmODMyMDkuLmM2ZThiMjYgMTAwNjQ0Ci0tLSBhL29iamVjdHMvdGV4dC5jCisrKyBiL29iamVjdHMvdGV4dC5jCkBAIC0zMjAsMTAgKzMyMCw4IEBACiBJTlQzMiBEcmF3VGV4dEV4MzJBKCBIREMzMiBoZGMsIExQQ1NUUiBzdHIsIElOVDMyIGNvdW50LAogICAgICAgICAgICAgICAgICAgICAgTFBSRUNUMzIgcmVjdCwgVUlOVDMyIGZsYWdzLCBMUERSQVdURVhUUEFSQU1TIGR0cCApCiB7Ci0gICAgZnByaW50ZihzdGRlcnIsIkRyYXdUZXh0RXgzMkEoJWQsJyVzJywlZCwlcCwweCUwOHgsJXApXG4iLAotICAgIAloZGMsc3RyLGNvdW50LHJlY3QsZmxhZ3MsZHRwCi0gICAgKTsKLSAgICAvKkZJWE1FOiBpZ25vcmVzIGV4dGVuZGVkIGZ1bmN0aW9uYWxpdHkgLi4uICovCisgICAgVFJBQ0UodGV4dCwiKCVkLCclcycsJWQsJXAsMHglMDh4LCVwKVxuIixoZGMsc3RyLGNvdW50LHJlY3QsZmxhZ3MsZHRwKTsKKyAgICBGSVhNRSh0ZXh0LCJpZ25vcmVzIGV4dGVuZGVkIGZ1bmN0aW9uYWxpdHlcbiIpOwogICAgIHJldHVybiBEcmF3VGV4dDMyQShoZGMsc3RyLGNvdW50LHJlY3QsZmxhZ3MpOwogfQogCkBAIC0zMzMsMTAgKzMzMSw4IEBACiBJTlQzMiBEcmF3VGV4dEV4MzJXKCBIREMzMiBoZGMsIExQQ1dTVFIgc3RyLCBJTlQzMiBjb3VudCwKICAgICAgICAgICAgICAgICAgICAgIExQUkVDVDMyIHJlY3QsIFVJTlQzMiBmbGFncywgTFBEUkFXVEVYVFBBUkFNUyBkdHAgKQogewotICAgIGZwcmludGYoc3RkZXJyLCJEcmF3VGV4dEV4MzJBKCVkLCVwLCVkLCVwLDB4JTA4eCwlcClcbiIsCi0gICAgCWhkYyxzdHIsY291bnQscmVjdCxmbGFncyxkdHAKLSAgICApOwotICAgIC8qRklYTUU6IGlnbm9yZXMgZXh0ZW5kZWQgZnVuY3Rpb25hbGl0eSAuLi4gKi8KKyAgICBUUkFDRSh0ZXh0LCIoJWQsJXAsJWQsJXAsMHglMDh4LCVwKVxuIixoZGMsc3RyLGNvdW50LHJlY3QsZmxhZ3MsZHRwKTsKKyAgICBGSVhNRSh0ZXh0LCJpZ25vcmVzIGV4dGVuZGVkIGZ1bmN0aW9uYWxpdHlcbiIpOwogICAgIHJldHVybiBEcmF3VGV4dDMyVyhoZGMsc3RyLGNvdW50LHJlY3QsZmxhZ3MpOwogfQogCkBAIC03MTksOCArNzE1LDggQEAKICAqLwogSU5UMzIgV0lOQVBJIEdldFRleHRDaGFyc2V0MzIoSERDMzIgaGRjKQogewotICAgIGZwcmludGYoc3RkbmltcCwiR2V0VGV4dENoYXJzZXQoMHgleClcbiIsaGRjKTsKLSAgICByZXR1cm4gREVGQVVMVF9DSEFSU0VUOyAvKiBGSVhNRSAqLworICAgIEZJWE1FKHRleHQsIigweCV4KTogc3R1YlxuIixoZGMpOworICAgIHJldHVybiBERUZBVUxUX0NIQVJTRVQ7IAogfQogCiBJTlQxNiBXSU5BUEkgR2V0VGV4dENoYXJzZXQxNihIREMxNiBoZGMpCkBAIC03MzMsNyArNzI5LDcgQEAKICAqLwogSU5UMzIgV0lOQVBJIEdldFRleHRDaGFyc2V0SW5mbyhIREMzMiBoZGMsTFBDSEFSU0VUSU5GTyBjc2ksRFdPUkQgZmxhZ3MpCiB7Ci0gICAgZnByaW50ZihzdGRuaW1wLCJHZXRUZXh0Q2hhcnNldEluZm8oMHgleCwlcCwlMDhseCksIHN0dWIhXG4iLGhkYyxjc2ksZmxhZ3MpOworICAgIEZJWE1FKHRleHQsIigweCV4LCVwLCUwOGx4KTogc3R1YiFcbiIsaGRjLGNzaSxmbGFncyk7CiAgICAgaWYgKGNzaSkgewogCWNzaS0+Y2lDaGFyc2V0ID0gREVGQVVMVF9DSEFSU0VUOwogCWNzaS0+Y2lBQ1AgPSBHZXRBQ1AoKTsKZGlmZiAtLWdpdCBhL29sZS9jb21wb2JqLmMgYi9vbGUvY29tcG9iai5jCmluZGV4IDE5MDQ3ZmEuLjJmMTBlMzEgMTAwNjQ0Ci0tLSBhL29sZS9jb21wb2JqLmMKKysrIGIvb2xlL2NvbXBvYmouYwpAQCAtMzAsNiArMzAsOSBAQAogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqICAgICAgICAgICBDb0J1aWxkVmVyc2lvbiBbQ09NUE9CSi4xXQorICoKKyAqIFJFVFVSTlMKKyAqCUN1cnJlbnQgYnVpbHQgdmVyc2lvbiwgaGl3b3JkIGlzIG1ham9ybnVtYmVyLCBsb3dvcmQgaXMgbWlub3JudW1iZXIKICAqLwogRFdPUkQgV0lOQVBJIENvQnVpbGRWZXJzaW9uKCkKIHsKQEAgLTM5LDcgKzQyLDcgQEAKIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKiAgICAgICAgICAgQ29Jbml0aWFsaXplCVtDT01QT0JKLjJdCi0gKiBscFJlc2VydmVkIGlzIGFuIElNYWxsb2MgcG9pbnRlciBpbiAxNmJpdCBPTEUuCisgKiBTZXQgdGhlIHdpbjE2IElNYWxsb2MgdXNlZCBmb3IgbWVtb3J5IG1hbmFnZW1lbnQKICAqLwogSFJFU1VMVCBXSU5BUEkgQ29Jbml0aWFsaXplMTYoCiAJTFBNQUxMT0MxNiBscFJlc2VydmVkCS8qIFtpbl0gcG9pbnRlciB0byB3aW4xNiBtYWxsb2MgaW50ZXJmYWNlICovCkBAIC01MCw3ICs1Myw3IEBACiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICogICAgICAgICAgIENvSW5pdGlhbGl6ZQkoT0xFMzIuMjYpCi0gKiBscFJlc2VydmVkIGlzIGFuIElNYWxsb2MgcG9pbnRlciBpbiAzMmJpdCBPTEUuCisgKiBTZXQgdGhlIHdpbjMyIElNYWxsb2MgdXNlZCBmb3IgbWVtb3J5bWFuYWdlbWVudAogICovCiBIUkVTVUxUIFdJTkFQSSBDb0luaXRpYWxpemUzMigKIAlMUE1BTExPQzMyIGxwUmVzZXJ2ZWQJLyogW2luXSBwb2ludGVyIHRvIHdpbjMyIG1hbGxvYyBpbnRlcmZhY2UgKi8KQEAgLTYxLDYgKzY0LDcgQEAKIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKiAgICAgICAgICAgQ29Vbml0aWFsaXplICAgW0NPTVBPQkouM10KKyAqIERvbid0IGtub3cgd2hhdCBpdCBkb2VzLgogICovCiB2b2lkIFdJTkFQSSBDb1VuaXRpYWxpemUoKQogewpAQCAtNjksNiArNzMsOCBAQAogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqICAgICAgICAgICBDb0dldE1hbGxvYyAgICBbQ09NUE9CSi40XQorICogUkVUVVJOUworICoJVGhlIGN1cnJlbnQgd2luMTYgSU1hbGxvYwogICovCiBIUkVTVUxUIFdJTkFQSSBDb0dldE1hbGxvYzE2KAogCURXT1JEIGR3TWVtQ29udGV4dCwJLyogW2luXSB1bmtub3duICovCkBAIC04Miw2ICs4OCw4IEBACiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICogICAgICAgICAgIENvR2V0TWFsbG9jICAgIChPTEUzMi40XQorICogUkVUVVJOUworICoJVGhlIGN1cnJlbnQgd2luMzIgSU1hbGxvYwogICovCiBIUkVTVUxUIFdJTkFQSSBDb0dldE1hbGxvYzMyKAogCURXT1JEIGR3TWVtQ29udGV4dCwJLyogW2luXSB1bmtub3duICovCkBAIC0xMDQsMjAgKzExMiwzMSBAQAogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqICAgICAgICAgICBJc0VxdWFsR1VJRCBbQ09NUE9CSi4xOF0KKyAqIENvbXBhcmVzIHR3byBVbmlxdWUgSWRlbnRpZmllcnMKKyAqIFJFVFVSTlMKKyAqCVRSVUUgaWYgZXF1YWwKICAqLwotQk9PTDE2IFdJTkFQSSBJc0VxdWFsR1VJRChHVUlEKiBnMSwgR1VJRCogZzIpCi17CitCT09MMTYgV0lOQVBJIElzRXF1YWxHVUlEKAorCUdVSUQqIGcxLAkvKiBbaW5dIHVuaXF1ZSBpZCAxICovCisJR1VJRCogZzIJLyogW2luXSB1bmlxdWUgaWQgMiAqLworKSB7CiAgICAgcmV0dXJuICFtZW1jbXAoIGcxLCBnMiwgc2l6ZW9mKEdVSUQpICk7CiB9CiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICogICAgICAgICAgIENMU0lERnJvbVN0cmluZyBbQ09NUE9CSi4yMF0KKyAqIENvbnZlcnRzIGEgdW5pcXVlIGlkZW50aWZpZXIgZnJvbSBpdCdzIHN0cmluZyByZXByZXNlbnRhdGlvbiBpbnRvIAorICogdGhlIEdVSUQgc3RydWN0LgorICogUkVUVVJOUworICoJdGhlIGNvbnZlcnRlZCBHVUlECiAgKi8KIAogLyogQ2xhc3MgaWQ6IERXT1JELVdPUkQtV09SRC1CWVRFU1syXS1CWVRFU1s2XSAqLwogCi1PTEVTVEFUVVMgV0lOQVBJIENMU0lERnJvbVN0cmluZzE2KGNvbnN0IExQQ09MRVNUUjE2IGlkc3RyLCBDTFNJRCAqaWQpCi17CitPTEVTVEFUVVMgV0lOQVBJIENMU0lERnJvbVN0cmluZzE2KAorCUxQQ09MRVNUUjE2IGlkc3RyLAkvKiBbaW5dIHN0cmluZyByZXByZXNlbnRhdGlvbiBvZiBndWlkICovCisJQ0xTSUQgKmlkCQkvKiBbb3V0XSBHVUlEIGNvbnZlcnRlZCBmcm9tIHN0cmluZyAqLworKSB7CiAgIEJZVEUgKnMgPSAoQllURSAqKSBpZHN0cjsKICAgQllURSAqcDsKICAgaW50CWk7CkBAIC0xODIsOSArMjAxLDE1IEBACiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICogICAgICAgICAgIENMU0lERnJvbVN0cmluZyAoT0xFMzIuMykKKyAqIENvbnZlcnRzIGEgdW5pcXVlIGlkZW50aWZpZXIgZnJvbSBpdCdzIHN0cmluZyByZXByZXNlbnRhdGlvbiBpbnRvIAorICogdGhlIEdVSUQgc3RydWN0LgorICogUkVUVVJOUworICoJdGhlIGNvbnZlcnRlZCBHVUlECiAgKi8KLU9MRVNUQVRVUyBXSU5BUEkgQ0xTSURGcm9tU3RyaW5nMzIoY29uc3QgTFBDT0xFU1RSMzIgaWRzdHIsIENMU0lEICppZCkKLXsKK09MRVNUQVRVUyBXSU5BUEkgQ0xTSURGcm9tU3RyaW5nMzIoCisJTFBDT0xFU1RSMzIgaWRzdHIsCS8qIFtpbl0gc3RyaW5nIHJlcHJlc2VudGF0aW9uIG9mIEdVSUQgKi8KKwlDTFNJRCAqaWQJCS8qIFtvdXRdIEdVSUQgcmVwcmVzZW50ZWQgYnkgYWJvdmUgc3RyaW5nICovCispIHsKICAgICBMUE9MRVNUUjE2ICAgICAgeGlkID0gSEVBUF9zdHJkdXBXdG9BKEdldFByb2Nlc3NIZWFwKCksMCxpZHN0cik7CiAgICAgT0xFU1RBVFVTICAgICAgIHJldCA9IENMU0lERnJvbVN0cmluZzE2KHhpZCxpZCk7CiAKQEAgLTE5MywxMCArMjE4LDE1IEBACiB9CiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogICAgICAgICAgIFN0cmluZ0Zyb21DTFNJRCBbQ09NUE9CSi4xOV0KKyAqICAgICAgICAgICBXSU5FX1N0cmluZ0Zyb21DTFNJRCAJCQkJW2ludGVybmFsXQorICogQ29udmVydHMgYSBHVUlEIGludG8gdGhlIHJlc3BlY3RpdmUgc3RyaW5nIHJlcHJlc2VudGF0aW9uLgorICogUkVUVVJOUworICoJdGhlIHN0cmluZyByZXByZXNlbnRhdGlvbiBhbmQgT0xFU1RBVFVTCiAgKi8KLU9MRVNUQVRVUyBXSU5BUEkgV0lORV9TdHJpbmdGcm9tQ0xTSUQoY29uc3QgQ0xTSUQgKmlkLCBMUFNUUiBpZHN0cikKLXsKK09MRVNUQVRVUyBXSU5BUEkgV0lORV9TdHJpbmdGcm9tQ0xTSUQoCisJY29uc3QgQ0xTSUQgKmlkLAkvKiBbaW5dIEdVSUQgdG8gYmUgY29udmVydGVkICovCisJTFBTVFIgaWRzdHIJCS8qIFtvdXRdIHBvaW50ZXIgdG8gYnVmZmVyIHRvIGNvbnRhaW4gY29udmVydGVkIGd1aWQgKi8KKykgewogICBzdGF0aWMgY29uc3QgY2hhciAqaGV4ID0gIjAxMjM0NTY3ODlBQkNERUYiOwogICBjaGFyICpzOwogICBpbnQJaTsKQEAgLTIyNCw4ICsyNTQsMTggQEAKICAgcmV0dXJuIE9MRV9PSzsKIH0KIAotT0xFU1RBVFVTIFdJTkFQSSBTdHJpbmdGcm9tQ0xTSUQxNihjb25zdCBDTFNJRCAqaWQsIExQT0xFU1RSMTYgKmlkc3RyKQoteworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiAgICAgICAgICAgU3RyaW5nRnJvbUNMU0lEIAlbQ09NUE9CSi4xOV0KKyAqIENvbnZlcnRzIGEgR1VJRCBpbnRvIHRoZSByZXNwZWN0aXZlIHN0cmluZyByZXByZXNlbnRhdGlvbi4KKyAqIFRoZSB0YXJnZXQgc3RyaW5nIGlzIGFsbG9jYXRlZCB1c2luZyB0aGUgT0xFIElNYWxsb2MuCisgKiBSRVRVUk5TCisgKgl0aGUgc3RyaW5nIHJlcHJlc2VudGF0aW9uIGFuZCBPTEVTVEFUVVMKKyAqLworT0xFU1RBVFVTIFdJTkFQSSBTdHJpbmdGcm9tQ0xTSUQxNigKKwljb25zdCBDTFNJRCAqaWQsCS8qIFtpbl0gdGhlIEdVSUQgdG8gYmUgY29udmVydGVkICovCisJTFBPTEVTVFIxNiAqaWRzdHIJLyogW291dF0gYSBwb2ludGVyIHRvIGEgdG8tYmUtYWxsb2NhdGVkIHNlZ21lbnRlZCBwb2ludGVyIHBvaW50aW5nIHRvIHRoZSByZXN1bHRpbmcgc3RyaW5nICovCisKKykgewogICAgIExQTUFMTE9DMTYJbWxsYzsKICAgICBPTEVTVEFUVVMJcmV0OwogICAgIERXT1JECWFyZ3NbMl07CkBAIC0yNTQsOCArMjk0LDE3IEBACiAgICAgcmV0dXJuIFdJTkVfU3RyaW5nRnJvbUNMU0lEKGlkLFBUUl9TRUdfVE9fTElOKCppZHN0cikpOwogfQogCi1PTEVTVEFUVVMgV0lOQVBJIFN0cmluZ0Zyb21DTFNJRDMyKGNvbnN0IENMU0lEICppZCwgTFBPTEVTVFIzMiAqaWRzdHIpCi17CisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqICAgICAgICAgICBTdHJpbmdGcm9tQ0xTSUQgCVtPTEUzMi4xNTFdCisgKiBDb252ZXJ0cyBhIEdVSUQgaW50byB0aGUgcmVzcGVjdGl2ZSBzdHJpbmcgcmVwcmVzZW50YXRpb24uCisgKiBUaGUgdGFyZ2V0IHN0cmluZyBpcyBhbGxvY2F0ZWQgdXNpbmcgdGhlIE9MRSBJTWFsbG9jLgorICogUkVUVVJOUworICoJdGhlIHN0cmluZyByZXByZXNlbnRhdGlvbiBhbmQgT0xFU1RBVFVTCisgKi8KK09MRVNUQVRVUyBXSU5BUEkgU3RyaW5nRnJvbUNMU0lEMzIoCisJY29uc3QgQ0xTSUQgKmlkLAkvKiBbaW5dIHRoZSBHVUlEIHRvIGJlIGNvbnZlcnRlZCAqLworCUxQT0xFU1RSMzIgKmlkc3RyCS8qIFtvdXRdIGEgcG9pbnRlciB0byBhIHRvLWJlLWFsbG9jYXRlZCBwb2ludGVyIHBvaW50aW5nIHRvIHRoZSByZXN1bHRpbmcgc3RyaW5nICovCispIHsKIAljaGFyICAgICAgICAgICAgYnVmWzgwXTsKIAlPTEVTVEFUVVMgICAgICAgcmV0OwogCUxQTUFMTE9DMzIJbWxsYzsKQEAgLTI3MSwyMyArMzIwLDUwIEBACiAJcmV0dXJuIHJldDsKIH0KIAotT0xFU1RBVFVTIFdJTkFQSSBTdHJpbmdGcm9tR1VJRDIoCi0JY29uc3QgQ0xTSUQgKmlkLCBMUE9MRVNUUjE2IGlkc3RyLCBJTlQxNiBtYXgKLSkgewotCWNoYXIJCWJ1Zls4MF07Ci0JT0xFU1RBVFVTCXJldCA9IFdJTkVfU3RyaW5nRnJvbUNMU0lEKGlkLGJ1Zik7CisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqICAgICAgICAgICBTdHJpbmdGcm9tR1VJRDIgKE9MRTMyLjE1MikKKyAqCisgKiBDb252ZXJ0cyBhIGdsb2JhbCB1bmlxdWUgaWRlbnRpZmllciBpbnRvIGEgc3RyaW5nIG9mIGFuIEFQSS0KKyAqIHNwZWNpZmllZCBmaXhlZCBmb3JtYXQuCisgKgorICogbW9ydGVuZUBwdnYub3JnIDk4MDMxOAorICovCitPTEVTVEFUVVMgV0lOQVBJCitTdHJpbmdGcm9tR1VJRDIoY29uc3QgUkVGR1VJRCAqaWQsIExQT0xFU1RSMzIgKnN0ciwgSU5UMzIgY21heCkKK3sKKyAgaW50IGNoYXJzX2luX3N0cmluZyA9IHN0cmxlbigiW0RERERERERELVdXV1ctV1dXVy1XV1dXLVdXV1dERERERERERF0iKSsxOworICBEV09SRCBkd3RtcFsyXTsKKyAgV09SRCB3dG1wWzRdOwogCi0JaWYgKCFyZXQpCi0JCWxzdHJjcHluMzJBKGlkc3RyLGJ1ZixtYXgpOwotCXJldHVybiByZXQ7CisgIGlmKGNtYXggPj0gY2hhcnNfaW5fc3RyaW5nKSB7CisgICAgZHd0bXBbMF0gPSAqKERXT1JEICopaWQ7CisgICAgd3RtcFswXSA9ICooV09SRCAqKShpZCArIHNpemVvZihEV09SRCkpOworICAgIHd0bXBbMV0gPSAqKFdPUkQgKikoaWQgKyBzaXplb2YoRFdPUkQpICsgc2l6ZW9mKFdPUkQpKTsKKyAgICB3dG1wWzJdID0gKihXT1JEICopKGlkICsgc2l6ZW9mKERXT1JEKSArIDIqc2l6ZW9mKFdPUkQpKTsKKyAgICB3dG1wWzNdID0gKihXT1JEICopKGlkICsgc2l6ZW9mKERXT1JEKSArIDMqc2l6ZW9mKFdPUkQpKTsKKyAgICBkd3RtcFsxXSA9ICooRFdPUkQgKikoaWQgKyBzaXplb2YoRFdPUkQpICsgNCpzaXplb2YoV09SRCkpOworICAgIHNwcmludGYoKihjaGFyICoqKXN0ciwgIlslMDhseC0lMDR4LSUwNHgtJTA0eC0lMDR4JTA4bHhdIiwKKwkgICAgZHd0bXBbMF0sIHd0bXBbMF0sIHd0bXBbMV0sIHd0bXBbMl0sIHd0bXBbM10sIGR3dG1wWzFdKTsKKyAgICBUUkFDRShvbGUsICInJXMnXG4iLCAqc3RyKTsKKyAgICByZXR1cm4gY2hhcnNfaW5fc3RyaW5nOworICB9CisgIGVsc2UgeworICAgIFdBUk4ob2xlLCAiVG9vIGxpdHRsZSBzcGFjZSBpbiB0aGUgc3RyaW5nOiBuZWVkICVkIGNoYXJzLCBnb3Q6ICVkXG4iLAorCSBjaGFyc19pbl9zdHJpbmcsIGNtYXgpOworICAgIHJldHVybiAwOworICB9CiB9CiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICogICAgICAgICAgIENMU0lERnJvbVByb2dJRCBbQ09NUE9CSi42MV0KKyAqIENvbnZlcnRzIGEgcHJvZ3JhbSBpZCBpbnRvIHRoZSByZXNwZWN0aXZlIEdVSUQuIChCeSB1c2luZyBhIHJlZ2lzdHJ5IGxvb2t1cCkKKyAqIFJFVFVSTlMKKyAqCXJpaWQgYXNzb2NpYXRlZCB3aXRoIHRoZSBwcm9naWQKICAqLwotCi1PTEVTVEFUVVMgV0lOQVBJIENMU0lERnJvbVByb2dJRDE2KExQQ1NUUiBwcm9naWQsTFBDTFNJRCByaWlkKQoteworT0xFU1RBVFVTIFdJTkFQSSBDTFNJREZyb21Qcm9nSUQxNigKKwlMUENPTEVTVFIxNiBwcm9naWQsCS8qIFtpbl0gcHJvZ3JhbSBpZCBhcyBmb3VuZCBpbiByZWdpc3RyeSAqLworCUxQQ0xTSUQgcmlpZAkJLyogW291dF0gYXNzb2NpYXRlZCBDTFNJRCAqLworKSB7CiAJY2hhcgkqYnVmLGJ1ZjJbODBdOwogCURXT1JECWJ1ZjJsZW47CiAJSFJFU1VMVAllcnI7CkBAIC0zMTEsOSArMzg3LDE0IEBACiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICogICAgICAgICAgIENMU0lERnJvbVByb2dJRCAoT0xFMzIuMikKKyAqIENvbnZlcnRzIGEgcHJvZ3JhbSBpZCBpbnRvIHRoZSByZXNwZWN0aXZlIEdVSUQuIChCeSB1c2luZyBhIHJlZ2lzdHJ5IGxvb2t1cCkKKyAqIFJFVFVSTlMKKyAqCXJpaWQgYXNzb2NpYXRlZCB3aXRoIHRoZSBwcm9naWQKICAqLwotT0xFU1RBVFVTIFdJTkFQSSBDTFNJREZyb21Qcm9nSUQzMihMUENPTEVTVFIzMiBwcm9naWQsTFBDTFNJRCByaWlkKQoteworT0xFU1RBVFVTIFdJTkFQSSBDTFNJREZyb21Qcm9nSUQzMigKKwlMUENPTEVTVFIzMiBwcm9naWQsCS8qIFtpbl0gcHJvZ3JhbSBpZCBhcyBmb3VuZCBpbiByZWdpc3RyeSAqLworCUxQQ0xTSUQgcmlpZAkJLyogW291dF0gYXNzb2NpYXRlZCBDTFNJRCAqLworKSB7CiAJTFBPTEVTVFIxNiBwaWQgPSBIRUFQX3N0cmR1cFd0b0EoR2V0UHJvY2Vzc0hlYXAoKSwwLHByb2dpZCk7CiAJT0xFU1RBVFVTICAgICAgIHJldCA9IENMU0lERnJvbVByb2dJRDE2KHBpZCxyaWlkKTsKIApAQCAtMzIxLDExICs0MDIsMTcgQEAKIAlyZXR1cm4gcmV0OwogfQogCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqICAgICAgICAgICBMb29rdXBFVGFzayAoQ09NUE9CSi45NCkKKyAqLwogT0xFU1RBVFVTIFdJTkFQSSBMb29rdXBFVGFzayhMUFZPSUQgcDEsTFBWT0lEIHAyKSB7CiAJZnByaW50ZihzdGRlcnIsIkxvb2t1cEVUYXNrKCVwLCVwKSxzdHViIVxuIixwMSxwMik7CiAJcmV0dXJuIDA7CiB9CiAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogICAgICAgICAgIExvb2t1cEVUYXNrIChDT01QT0JKLjIwMSkKKyAqLwogT0xFU1RBVFVTIFdJTkFQSSBDYWxsT2JqZWN0SW5XT1coTFBWT0lEIHAxLExQVk9JRCBwMikgewogCWZwcmludGYoc3RkZXJyLCJDYWxsT2JqZWN0SW5XT1coJXAsJXApLHN0dWIhXG4iLHAxLHAyKTsKIAlyZXR1cm4gMDsKQEAgLTMzMywxNiArNDIwLDIwIEBACiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICoJCUNvUmVnaXN0ZXJDbGFzc09iamVjdCBbQ09NUE9CSi41XQorICogRG9uJ3Qga25vdyB3aGVyZSBpdCByZWdpc3RlcnMgaXQgLi4uCiAgKi8KIE9MRVNUQVRVUyBXSU5BUEkgQ29SZWdpc3RlckNsYXNzT2JqZWN0MTYoCi0JUkVGQ0xTSUQgcmNsc2lkLCBMUFVOS05PV04gcFVuayxEV09SRCBkd0Nsc0NvbnRleHQsRFdPUkQgZmxhZ3MsCisJUkVGQ0xTSUQgcmNsc2lkLAorCUxQVU5LTk9XTiBwVW5rLAorCURXT1JEIGR3Q2xzQ29udGV4dCwKKwlEV09SRCBmbGFncywKIAlMUERXT1JEIGxwZHdSZWdpc3RlcgogKSB7CiAJY2hhcglidWZbODBdOwogCiAJV0lORV9TdHJpbmdGcm9tQ0xTSUQocmNsc2lkLGJ1Zik7CiAKLQlmcHJpbnRmKHN0ZGVyciwiQ29SZWdpc3RlckNsYXNzT2JqZWN0KCVzLCVwLDB4JTA4bHgsMHglMDhseCwlcCksc3R1YlxuIiwKKwlGSVhNRShvbGUsIiglcywlcCwweCUwOGx4LDB4JTA4bHgsJXApLHN0dWJcbiIsCiAJCWJ1ZixwVW5rLGR3Q2xzQ29udGV4dCxmbGFncyxscGR3UmVnaXN0ZXIKIAkpOwogCXJldHVybiAwOwpAQCAtMzUwLDE2ICs0NDEsMjAgQEAKIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKgkJQ29SZWdpc3RlckNsYXNzT2JqZWN0IChPTEUzMi4zNikKKyAqIERvbid0IGtub3cgd2hlcmUgaXQgcmVnaXN0ZXJzIGl0IC4uLgogICovCiBPTEVTVEFUVVMgV0lOQVBJIENvUmVnaXN0ZXJDbGFzc09iamVjdDMyKAotCVJFRkNMU0lEIHJjbHNpZCwgTFBVTktOT1dOIHBVbmssRFdPUkQgZHdDbHNDb250ZXh0LERXT1JEIGZsYWdzLAorCVJFRkNMU0lEIHJjbHNpZCwKKwlMUFVOS05PV04gcFVuaywKKwlEV09SRCBkd0Nsc0NvbnRleHQsCisJRFdPUkQgZmxhZ3MsCiAJTFBEV09SRCBscGR3UmVnaXN0ZXIKICkgewogICAgIGNoYXIgYnVmWzgwXTsKIAogICAgIFdJTkVfU3RyaW5nRnJvbUNMU0lEKHJjbHNpZCxidWYpOwogCi0gICAgZnByaW50ZihzdGRlcnIsIkNvUmVnaXN0ZXJDbGFzc09iamVjdCglcywlcCwweCUwOGx4LDB4JTA4bHgsJXApLHN0dWJcbiIsCisgICAgRklYTUUob2xlLCIoJXMsJXAsMHglMDhseCwweCUwOGx4LCVwKSxzdHViXG4iLAogCSAgICBidWYscFVuayxkd0Nsc0NvbnRleHQsZmxhZ3MsbHBkd1JlZ2lzdGVyCiAgICAgKTsKICAgICByZXR1cm4gMDsKQEAgLTM2OSwyMSArNDY0LDM1IEBACiAgKgkJQ29SZWdpc3Rlck1lc3NhZ2VGaWx0ZXIgW0NPTVBPQkouMjddCiAgKi8KIE9MRVNUQVRVUyBXSU5BUEkgQ29SZWdpc3Rlck1lc3NhZ2VGaWx0ZXIxNigKLQlMUE1FU1NBR0VGSUxURVIgbHBNZXNzYWdlRmlsdGVyLExQTUVTU0FHRUZJTFRFUiAqbHBscE1lc3NhZ2VGaWx0ZXIKKwlMUE1FU1NBR0VGSUxURVIgbHBNZXNzYWdlRmlsdGVyLAorCUxQTUVTU0FHRUZJTFRFUiAqbHBscE1lc3NhZ2VGaWx0ZXIKICkgewotCWZwcmludGYoc3RkZXJyLCJDb1JlZ2lzdGVyTWVzc2FnZUZpbHRlciglcCwlcCksc3R1YiFcbiIsCi0JCWxwTWVzc2FnZUZpbHRlcixscGxwTWVzc2FnZUZpbHRlcgotCSk7CisJRklYTUUob2xlLCIoJXAsJXApLHN0dWIhXG4iLGxwTWVzc2FnZUZpbHRlcixscGxwTWVzc2FnZUZpbHRlcik7CiAJcmV0dXJuIDA7CiB9CiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICogICAgICAgICAgIENvQ3JlYXRlSW5zdGFuY2UgW0NPTVBPQkouMTMsIE9MRTMyLjddCiAgKi8KLUhSRVNVTFQgV0lOQVBJIENvQ3JlYXRlSW5zdGFuY2UoUkVGQ0xTSUQgcmNsc2lkLCBMUFVOS05PV04gcFVua091dGVyLAotCQkJCURXT1JEIGR3Q2xzQ29udGV4dCwgUkVGSUlEIHJpaWQsIExQVk9JRCAqcHB2KQotewotCWZwcmludGYoc3RkZXJyLCAiQ29DcmVhdGVJbnN0YW5jZSgpOiBzdHViICFcbiIpOworSFJFU1VMVCBXSU5BUEkgQ29DcmVhdGVJbnN0YW5jZSgKKwlSRUZDTFNJRCByY2xzaWQsCisJTFBVTktOT1dOIHBVbmtPdXRlciwKKwlEV09SRCBkd0Nsc0NvbnRleHQsCisJUkVGSUlEIHJpaWQsCisJTFBWT0lEICpwcHYKKykgeworCWNoYXIgYnVmWzgwXSx4YnVmWzgwXTsKKworCWlmIChyY2xzaWQpCisJCVdJTkVfU3RyaW5nRnJvbUNMU0lEKHJjbHNpZCxidWYpOworCWVsc2UKKwkJc3ByaW50ZihidWYsIjxyY2xzaWQtMHglMDhseD4iLChEV09SRClyY2xzaWQpOworCWlmIChyaWlkKQorCQlXSU5FX1N0cmluZ0Zyb21DTFNJRChyaWlkLHhidWYpOworCWVsc2UKKwkJc3ByaW50Zih4YnVmLCI8cmlpZC0weCUwOGx4PiIsKERXT1JEKXJpaWQpOworCisJRklYTUUob2xlLCIoJXMsJXAsMHglMDhseCwlcywlcCk6IHN0dWIgIVxuIixidWYscFVua091dGVyLGR3Q2xzQ29udGV4dCx4YnVmLHBwdik7CiAJKnBwdiA9IE5VTEw7CiAJcmV0dXJuIFNfT0s7CiB9CkBAIC0zOTMsMTYgKzUwMiwxNyBAQAogICovCiB2b2lkIFdJTkFQSSBDb0ZyZWVVbnVzZWRMaWJyYXJpZXMoKQogewotCWZwcmludGYoc3RkZXJyLCAiQ29GcmVlVW51c2VkTGlicmFyaWVzKCk6IHN0dWIgIVxuIik7CisJRklYTUUob2xlLCIoKSwgc3R1YiAhXG4iKTsKIH0KIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKiAgICAgICAgICAgQ29GaWxlVGltZU5vdyBbQ09NUE9CSi44MiwgT0xFMzIuMTBdCi0gKgotICoJc3RvcmVzIHRoZSBjdXJyZW50IHN5c3RlbSB0aW1lIGluIGxwRmlsZVRpbWUKKyAqIFJFVFVSTlMKKyAqCXRoZSBjdXJyZW50IHN5c3RlbSB0aW1lIGluIGxwRmlsZVRpbWUKICAqLwotSFJFU1VMVCBXSU5BUEkgQ29GaWxlVGltZU5vdyhGSUxFVElNRSAqbHBGaWxlVGltZSkKLXsKK0hSRVNVTFQgV0lOQVBJIENvRmlsZVRpbWVOb3coCisJRklMRVRJTUUgKmxwRmlsZVRpbWUJLyogW291dF0gdGhlIGN1cnJlbnQgdGltZSAqLworKSB7CiAJRE9TRlNfVW5peFRpbWVUb0ZpbGVUaW1lKHRpbWUoTlVMTCksIGxwRmlsZVRpbWUsIDApOwogCXJldHVybiBTX09LOwogfQpAQCAtNDEwLDcgKzUyMCw3IEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqICAgICAgICAgICBDb1Rhc2tNZW1BbGxvYyAoT0xFMzIuNDMpCiAgKiBSRVRVUk5TCi0gKiAgcG9pbnRlciB0byBuZXdseSBhbGxvY2F0ZWQgYmxvY2sKKyAqIAlwb2ludGVyIHRvIG5ld2x5IGFsbG9jYXRlZCBibG9jawogICovCiBMUFZPSUQgV0lOQVBJIENvVGFza01lbUFsbG9jKAogCVVMT05HIHNpemUJLyogW2luXSBzaXplIG9mIG1lbW9yeWJsb2NrIHRvIGJlIGFsbG9jYXRlZCAqLwpkaWZmIC0tZ2l0IGEvb2xlL29sZTJubHMuYyBiL29sZS9vbGUybmxzLmMKaW5kZXggMTlkN2E2YS4uYTBkNTYwOCAxMDA2NDQKLS0tIGEvb2xlL29sZTJubHMuYworKysgYi9vbGUvb2xlMm5scy5jCkBAIC0yODIsNyArMjgyLDcgQEAKIAkJaSsrOwogCX0KIAlpZiAoIXJldFN0cmluZykgewotCQlmcHJpbnRmKHN0ZGVyciwiVW5rb3duIExDIHR5cGUgJWxYXG4iLExDVHlwZSk7CisJCVdBUk4ob2xlLCJVbmtvd24gTEMgdHlwZSAlbFhcbiIsTENUeXBlKTsKIAkJcmV0dXJuIDA7CiAJfQogCkBAIC0xNzg3LDcgKzE3ODcsNyBAQAogICAgIH0gIC8qIHN3aXRjaCAqLwogCiAJaWYoIWZvdW5kKSB7Ci0JCWZwcmludGYoc3RkZXJyLCInJXMnIG5vdCBzdXBwb3J0ZWQgZm9yIHlvdXIgbGFuZ3VhZ2UuXG4iLAorCQlFUlIob2xlLCInJXMnIG5vdCBzdXBwb3J0ZWQgZm9yIHlvdXIgbGFuZ3VhZ2UuXG4iLAogCQkJcmV0U3RyaW5nKTsKIAkJcmV0U3RyaW5nID0gIjxXSU5FLU5MUy11bmtub3duPiI7CiAJCS8qcmV0dXJuIDA7Ki8KQEAgLTE4MzEsMTEgKzE4MzEsOSBAQAogewogCWludCBsZW4scmV0OwogCWlmKGZkd1N0eWxlICYgTk9STV9JR05PUkVOT05TUEFDRSkKLQl7Ci0JCWZwcmludGYoc3RkbmltcCwgIkNvbXBhcmVTdHJpbmdBOiBJR05PUkVOT05TUEFDRSBub3Qgc3VwcHJ0ZWRcbiIpOwotCX0KKwkJRklYTUUob2xlLCAiSUdOT1JFTk9OU1BBQ0Ugbm90IHN1cHBydGVkXG4iKTsKIAlpZihmZHdTdHlsZSAmIE5PUk1fSUdOT1JFU1lNQk9MUykKLQkJZnByaW50ZihzdGRuaW1wLCAiQ29tcGFyZVN0cmluZ0E6IElHTk9SRVNZTUJPTFMgbm90IHN1cHBvcnRlZFxuIik7CisJCUZJWE1FKG9sZSwgIklHTk9SRVNZTUJPTFMgbm90IHN1cHBvcnRlZFxuIik7CiAJLyogSXMgc3RyY21wIGRlZmF1bHRpbmcgdG8gc3RyaW5nIHNvcnQgb3IgdG8gd29yZCBzb3J0Pz8gKi8KIAkvKiBGSVhNRTogSGFuZGxlIE5PUk1fU1RSSU5HU09SVCAqLwogCWwxID0gKGwxPT0tMSk/c3RybGVuKHMxKTpsMTsKQEAgLTE4NjEsOSArMTg1OSw5IEBACiB7CiAJaW50IGxlbixyZXQ7CiAJaWYoZmR3U3R5bGUgJiBOT1JNX0lHTk9SRU5PTlNQQUNFKQotCQlmcHJpbnRmKHN0ZG5pbXAsIkNvbXBhcmVTdHJpbmdXOklHTk9SRU5PTlNQQUNFIG5vdCBzdXBwcnRlZFxuIik7CisJCUZJWE1FKG9sZSwiSUdOT1JFTk9OU1BBQ0Ugbm90IHN1cHBydGVkXG4iKTsKIAlpZihmZHdTdHlsZSAmIE5PUk1fSUdOT1JFU1lNQk9MUykKLQkJZnByaW50ZihzdGRuaW1wLCJDb21wYXJlU3RyaW5nVzpJR05PUkVTWU1CT0xTIG5vdCBzdXBwb3J0ZWRcbiIpOworCQlGSVhNRShvbGUsIklHTk9SRVNZTUJPTFMgbm90IHN1cHBvcnRlZFxuIik7CiAKIAkvKiBJcyBzdHJjbXAgZGVmYXVsdGluZyB0byBzdHJpbmcgc29ydCBvciB0byB3b3JkIHNvcnQ/PyAqLwogCS8qIEZJWE1FOiBIYW5kbGUgTk9STV9TVFJJTkdTT1JUICovCkBAIC0xODg1LDcgKzE4ODMsNyBAQAogICovCiBCT09MMTYgV0lOQVBJIFNldExvY2FsZUluZm9BKERXT1JEIGxjaWQsIERXT1JEIGxjdHlwZSwgTFBDU1RSIGRhdGEpCiB7Ci0gICAgZnByaW50ZihzdGRuaW1wLCJTZXRMb2NhbGVJbmZvQSglbGQsJWxkLCVzKVxuIixsY2lkLGxjdHlwZSxkYXRhKTsKKyAgICBGSVhNRShvbGUsIiglbGQsJWxkLCVzKTogc3R1YlxuIixsY2lkLGxjdHlwZSxkYXRhKTsKICAgICByZXR1cm4gVFJVRTsKIH0KIApAQCAtMTkwOSw4ICsxOTA3LDcgQEAKIAlXQ0hBUglidWZmZXJbMjAwXTsKIAlIS0VZCXhoa2V5OwogCi0JVFJBQ0Uod2luMzIsIiglcCwlMDhseClcbiIsCi0gICAgICAgICAgICAgICAgICAgICAgbHBmbkxvY2FsZUVudW0sZmxhZ3MgKTsKKwlUUkFDRSh3aW4zMiwiKCVwLCUwOGx4KVxuIixscGZuTG9jYWxlRW51bSxmbGFncyApOwogCS8qIHNlZSBpZiB3ZSBjYW4gcmV1c2UgdGhlIFdpbjk1IHJlZ2lzdHJ5IGVudHJpZXMuLi4uICovCiAJaWYgKEVSUk9SX1NVQ0NFU1M9PVJlZ09wZW5LZXkzMkEoSEtFWV9MT0NBTF9NQUNISU5FLCJcXFN5c3RlbVxcQ3VycmVudENvbnRyb2xTZXRcXGNvbnRyb2xcXE5sc1xcTG9jYWxlXFwiLCZ4aGtleSkpIHsKIAkJaT0wOwpAQCAtMjAwMywxMCArMjAwMCwxMCBAQAogCiAJc3dpdGNoIChkd0luZm9UeXBlKSB7CiAJY2FzZSBDVF9DVFlQRTI6Ci0JCWZwcmludGYoc3RkZXJyLCJHZXRTdHJpbmdUeXBlMzJBOkNUX0NUWVBFMiBub3Qgc3VwcG9ydGVkLlxuIik7CisJCUZJWE1FKG9sZSwiQ1RfQ1RZUEUyIG5vdCBzdXBwb3J0ZWQuXG4iKTsKIAkJcmV0dXJuIEZBTFNFOwogCWNhc2UgQ1RfQ1RZUEUzOgotCQlmcHJpbnRmKHN0ZGVyciwiR2V0U3RyaW5nVHlwZTMyQTpDVF9DVFlQRTMgbm90IHN1cHBvcnRlZC5cbiIpOworCQlGSVhNRShvbGUsIkNUX0NUWVBFMyBub3Qgc3VwcG9ydGVkLlxuIik7CiAJCXJldHVybiBGQUxTRTsKIAlkZWZhdWx0OmJyZWFrOwogCX0KQEAgLTIwNTAsMTAgKzIwNDcsMTAgQEAKIAogCXN3aXRjaCAoZHdJbmZvVHlwZSkgewogCWNhc2UgQ1RfQ1RZUEUyOgotCQlmcHJpbnRmKHN0ZGVyciwiR2V0U3RyaW5nVHlwZTMyVzpDVF9DVFlQRTIgbm90IHN1cHBvcnRlZC5cbiIpOworCQlGSVhNRShvbGUsIkNUX0NUWVBFMiBub3Qgc3VwcG9ydGVkLlxuIik7CiAJCXJldHVybiBGQUxTRTsKIAljYXNlIENUX0NUWVBFMzoKLQkJZnByaW50ZihzdGRlcnIsIkdldFN0cmluZ1R5cGUzMlc6Q1RfQ1RZUEUzIG5vdCBzdXBwb3J0ZWQuXG4iKTsKKwkJRklYTUUob2xlLCJDVF9DVFlQRTMgbm90IHN1cHBvcnRlZC5cbiIpOwogCQlyZXR1cm4gRkFMU0U7CiAJZGVmYXVsdDpicmVhazsKIAl9CkBAIC0yMTYzLDEwICsyMTYwLDkgQEAKIAl9CiAJaWYgKG1hcGZsYWdzKQogCSAgewotCSAgICBmcHJpbnRmKHN0ZGVyciwKLQkJICAgICJMQ01hcFN0cmluZ0EoMHglMDRseCwweCUwOGx4LCVwLCVkLCVwLCVkKVxuIiwKLQkJICAgIGxjaWQsbWFwZmxhZ3Msc3Jjc3RyLHNyY2xlbixkc3RzdHIsZHN0bGVuKTsKLQkJZnByaW50ZihzdGRlcnIsIgl1bmltcGxlbWVudGVkIGZsYWdzOiAweCUwOGx4XG4iLG1hcGZsYWdzKTsKKwkgICAgRklYTUUob2xlLCIoMHglMDRseCwweCUwOGx4LCVwLCVkLCVwLCVkKTogIgorCQkgICJ1bmltcGxlbWVudGVkIGZsYWdzOiAweCUwOGx4XG4iLAorCQkgIGxjaWQsbWFwZmxhZ3Msc3Jjc3RyLHNyY2xlbixkc3RzdHIsZHN0bGVuLG1hcGZsYWdzKTsKIAkgIH0KIAlyZXR1cm4gbGVuOwogfQpAQCAtMjIwMiwxMCArMjE5OCw5IEBACiAJfQogCWlmIChtYXBmbGFncykKIAkgIHsKLQkgICAgZnByaW50ZihzdGRlcnIsCi0JCSAgICAiTENNYXBTdHJpbmdXKDB4JTA0bHgsMHglMDhseCwlcCwlZCwlcCwlZClcbiIsCi0JCSAgICBsY2lkLG1hcGZsYWdzLHNyY3N0cixzcmNsZW4sZHN0c3RyLGRzdGxlbik7Ci0JCWZwcmludGYoc3RkZXJyLCIJdW5pbXBsZW1lbnRlZCBmbGFnczogMHglMDhseFxuIixtYXBmbGFncyk7CisJICAgIEZJWE1FKG9sZSwiKDB4JTA0bHgsMHglMDhseCwlcCwlZCwlcCwlZCk6ICIKKwkJICAidW5pbXBsZW1lbnRlZCBmbGFnczogMHglMDhseFxuIiwKKwkJICBsY2lkLG1hcGZsYWdzLHNyY3N0cixzcmNsZW4sZHN0c3RyLGRzdGxlbixtYXBmbGFncyk7CiAJICB9CiAJcmV0dXJuIGxlbjsKIH0KQEAgLTIyNTUsMTYgKzIyNTAsMTYgQEAKIHsKICAgIElOVDMyIGlucG9zLCBvdXRwb3M7CiAgICBpbnQgY291bnQsIHR5cGUsIGlucXVvdGUsIE92ZXJmbG93OwotICBjaGFyIGJ1Zls0MF07Ci0gIGludCBidWZsZW47CisgICBjaGFyIGJ1Zls0MF07CisgICBpbnQgYnVmbGVuOwogCiAgICBjb25zdCBjaGFyICogX2RnZm10W10gPSB7ICIlZCIsICIlMDJkIiB9OwogICAgY29uc3QgY2hhciAqKiBkZ2ZtdCA9IF9kZ2ZtdCAtIDE7IAogCiAgICAvKiByZXBvcnQsIGZvciBkZWJ1Z2dpbmcgKi8KLSAgIFRSQUNFKG9sZSwgImZ1bmMoJTh4LCU4eCwgdGltZShkPSVkLGg9JWQsbT0lZCxzPSVkKSwgZm10OlwnJXNcJyAoYXQgJXApLCAlcCAoJTlzKSwgbGVuPSVsZClcbiIsIGxvY2FsZSwgZmxhZ3MsCi0JCXh0aW1lLT53RGF5LCB4dGltZS0+d0hvdXIsIHh0aW1lLT53TWludXRlLCB4dGltZS0+d1NlY29uZCwKLQkJZm9ybWF0LCBmb3JtYXQsIGRhdGUsIGRhdGUsIGRhdGVsZW4pOworICAgVFJBQ0Uob2xlLCAiZnVuYyglI2x4LCUjbHgsIHRpbWUoZD0lZCxoPSVkLG09JWQscz0lZCksIGZtdDpcJyVzXCcgKGF0ICVwKSwgJXAgKCU5cyksIGxlbj0lZClcbiIsIGxvY2FsZSwgZmxhZ3MsCisJIHh0aW1lLT53RGF5LCB4dGltZS0+d0hvdXIsIHh0aW1lLT53TWludXRlLCB4dGltZS0+d1NlY29uZCwKKwkgZm9ybWF0LCBmb3JtYXQsIGRhdGUsIGRhdGUsIGRhdGVsZW4pOwogICAKICAgIC8qIGluaXRhbGl6ZSBzdGF0ZSB2YXJpYWJsZXMgYW5kIG91dHB1dCBidWZmZXIgKi8KICAgIGlucG9zID0gb3V0cG9zID0gMDsKQEAgLTI1NzEsMTMgKzI1NjYsMTEgQEAKIAkJCSAgICAgIExQQ1NUUiBmb3JtYXQsIAogCQkJICAgICAgTFBTVFIgdGltZXN0cixJTlQzMiB0aW1lbGVuKSAKIHsKLSAgIElOVDMyIHJldDsKICAgIExQQ1NUUiByZWFsZm9ybWF0OwogICAgY2hhciBmbXRfYnVmWzQwXTsKICAgIAogICAgVFJBQ0Uob2xlLCJHZXRUaW1lRm9ybWF0KDB4JTA0bHgsMHglMDhseCwlcCwlcywlcCwlZClcbiIsCi0JCWxvY2FsZSxmbGFncyx4dGltZSxmb3JtYXQsdGltZXN0cix0aW1lbGVuCi0JKTsKKwkgbG9jYWxlLGZsYWdzLHh0aW1lLGZvcm1hdCx0aW1lc3RyLHRpbWVsZW4pOwogICAgCiAgICBpZiAoZm9ybWF0KSB7CiAgICAgICByZWFsZm9ybWF0ID0gZm9ybWF0OwpkaWZmIC0tZ2l0IGEvb2xlL29sZWNsaS5jIGIvb2xlL29sZWNsaS5jCmluZGV4IGU1MTA5NTEuLjAxMGYxZWIgMTAwNjQ0Ci0tLSBhL29sZS9vbGVjbGkuYworKysgYi9vbGUvb2xlY2xpLmMKQEAgLTIwLDcgKzIwLDcgQEAKIE9MRVNUQVRVUyBXSU5BUEkgT2xlUmVnaXN0ZXJDbGllbnREb2MxNihMUENTVFIgY2xhc3NuYW1lLCBMUENTVFIgZG9jbmFtZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMT05HIHJlc2VydmVkLCBMSENMSUVOVERPQyAqaFJldCApCiB7Ci0gICAgZnByaW50ZihzdGRuaW1wLCJPbGVSZWdpc3RlckNsaWVudERvYzolcyAlc1xuIixjbGFzc25hbWUsZG9jbmFtZSk7CisgICAgRklYTUUob2xlLCIoJXMsJXMsLi4uKTogc3R1YlxuIixjbGFzc25hbWUsZG9jbmFtZSk7CiAgICAgKmhSZXQ9KytPTEVfY3VycmVudF9oYW5kbGU7CiAgICAgcmV0dXJuIE9MRV9PSzsKIH0KQEAgLTMxLDcgKzMxLDcgQEAKIE9MRVNUQVRVUyBXSU5BUEkgT2xlUmVnaXN0ZXJDbGllbnREb2MzMihMUENTVFIgY2xhc3NuYW1lLCBMUENTVFIgZG9jbmFtZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMT05HIHJlc2VydmVkLCBMSENMSUVOVERPQyAqaFJldCApCiB7Ci0gICAgZnByaW50ZihzdGRuaW1wLCJPbGVSZWdpc3RlckNsaWVudERvYzolcyAlc1xuIixjbGFzc25hbWUsZG9jbmFtZSk7CisgICAgRklYTUUob2xlLCIoJXMsJXMsLi4uKTogc3R1YlxuIixjbGFzc25hbWUsZG9jbmFtZSk7CiAgICAgKmhSZXQ9KytPTEVfY3VycmVudF9oYW5kbGU7CiAgICAgcmV0dXJuIE9MRV9PSzsKIH0KQEAgLTQxLDcgKzQxLDcgQEAKICAqLwogT0xFU1RBVFVTIFdJTkFQSSBPbGVSZW5hbWVDbGllbnREb2MxNihMSENMSUVOVERPQyBoRG9jLCBMUENTVFIgbmV3TmFtZSkKIHsKLSAgICBmcHJpbnRmKHN0ZG5pbXAsIk9sZVJlbmFtZUNsaWVudERvYzogJWxkICVzXG4iLGhEb2MsIG5ld05hbWUpOworICAgIEZJWE1FKG9sZSwiKCVsZCwlcywuLi4pOiBzdHViXG4iLGhEb2MsIG5ld05hbWUpOwogICAgIHJldHVybiBPTEVfT0s7CiB9CiAKQEAgLTUwLDcgKzUwLDcgQEAKICAqLwogT0xFU1RBVFVTIFdJTkFQSSBPbGVSZW5hbWVDbGllbnREb2MzMihMSENMSUVOVERPQyBoRG9jLCBMUENTVFIgbmV3TmFtZSkKIHsKLSAgICBmcHJpbnRmKHN0ZG5pbXAsIk9sZVJlbmFtZUNsaWVudERvYzogJWxkICVzXG4iLGhEb2MsIG5ld05hbWUpOworICAgIEZJWE1FKG9sZSwiKCVsZCwlcywuLi4pOiBzdHViXG4iLGhEb2MsIG5ld05hbWUpOwogICAgIHJldHVybiBPTEVfT0s7CiB9CiAKQEAgLTU5LDcgKzU5LDcgQEAKICAqLwogT0xFU1RBVFVTIFdJTkFQSSBPbGVSZXZva2VDbGllbnREb2MxNihMSENMSUVOVERPQyBoU2VydmVyRG9jKQogewotICAgIGZwcmludGYoc3RkbmltcCwiT2xlUmV2b2tlQ2xpZW50RG9jOiVsZFxuIixoU2VydmVyRG9jKTsKKyAgICBGSVhNRShvbGUsIiglbGQpOiBzdHViXG4iLGhTZXJ2ZXJEb2MpOwogICAgIHJldHVybiBPTEVfT0s7CiB9CiAKQEAgLTY4LDcgKzY4LDcgQEAKICAqLwogT0xFU1RBVFVTIFdJTkFQSSBPbGVSZXZva2VDbGllbnREb2MzMihMSENMSUVOVERPQyBoU2VydmVyRG9jKQogewotICAgIGZwcmludGYoc3RkbmltcCwiT2xlUmV2b2tlQ2xpZW50RG9jOiVsZFxuIixoU2VydmVyRG9jKTsKKyAgICBGSVhNRShvbGUsIiglbGQpOiBzdHViXG4iLGhTZXJ2ZXJEb2MpOwogICAgIHJldHVybiBPTEVfT0s7CiB9CiAKQEAgLTc5LDkgKzc5LDggQEAKIAlMUENTVFIgbmFtZSxMUE9MRUNMSUVOVCBvbGVjbGksTEhDTElFTlRET0MgaGNsaWVudGRvYyxMUENTVFIgeG5hbWUsCiAJTFBPTEVPQkpFQ1QgKmxwb2xlb2IsT0xFT1BUX1JFTkRFUiByZW5kZXIsT0xFQ0xJUEZPUk1BVCBjbGlwZm9ybWF0CiApIHsKLQlmcHJpbnRmKHN0ZG5pbXAsIk9sZUNyZWF0ZUxpbmtGcm9tQ2xpcCglcywlcCwlMDhseCwlcywlcCwlZCwlbGQpLHN0dWIhXG4iLAotCQluYW1lLG9sZWNsaSxoY2xpZW50ZG9jLHhuYW1lLGxwb2xlb2IscmVuZGVyLGNsaXBmb3JtYXQKLQkpOworCUZJWE1FKG9sZSwiKCVzLCVwLCUwOGx4LCVzLCVwLCVkLCVsZCk6IHN0dWIhXG4iLAorCSAgICAgIG5hbWUsb2xlY2xpLGhjbGllbnRkb2MseG5hbWUsbHBvbGVvYixyZW5kZXIsY2xpcGZvcm1hdCk7CiAJcmV0dXJuIE9MRV9PSzsKIH0KIApAQCAtODksMTggKzg4LDE0IEBACiAgKiAgICAgICAgICAgT2xlUXVlcnlMaW5rRnJvbUNsaXAzMgogICovCiBPTEVTVEFUVVMgV0lOQVBJIE9sZVF1ZXJ5TGlua0Zyb21DbGlwMzIoTFBDU1RSIG5hbWUsT0xFT1BUX1JFTkRFUiByZW5kZXIsT0xFQ0xJUEZPUk1BVCBjbGlwZm9ybWF0KSB7Ci0JZnByaW50ZihzdGRuaW1wLCJPbGVRdWVyeUxpbmtGcm9tQ2xpcCglcywlZCwlbGQpLHN0dWIhXG4iLAotCQluYW1lLHJlbmRlcixjbGlwZm9ybWF0Ci0JKTsKKwlGSVhNRShvbGUsIiglcywlZCwlbGQpOiBzdHViIVxuIixuYW1lLHJlbmRlcixjbGlwZm9ybWF0KTsKIAlyZXR1cm4gT0xFX09LOwogfQogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKiAgICAgICAgICAgT2xlUXVlcnlDcmVhdGVGcm9tQ2xpcDMyCiAgKi8KIE9MRVNUQVRVUyBXSU5BUEkgT2xlUXVlcnlDcmVhdGVGcm9tQ2xpcDMyKExQQ1NUUiBuYW1lLE9MRU9QVF9SRU5ERVIgcmVuZGVyLE9MRUNMSVBGT1JNQVQgY2xpcGZvcm1hdCkgewotCWZwcmludGYoc3RkbmltcCwiT2xlUXVlcnlDcmVhdGVGcm9tQ2xpcCglcywlZCwlbGQpLHN0dWIhXG4iLAotCQluYW1lLHJlbmRlcixjbGlwZm9ybWF0Ci0JKTsKKwlGSVhNRShvbGUsIiglcywlZCwlbGQpOiBzdHViIVxuIixuYW1lLHJlbmRlcixjbGlwZm9ybWF0KTsKIAlyZXR1cm4gT0xFX09LOwogfQogCkBAIC0xMjksNyArMTI0LDcgQEAKICAqICAgICAgICAgICBPbGVTZXRIb3N0TmFtZXMKICAqLwogT0xFU1RBVFVTIFdJTkFQSSBPbGVTZXRIb3N0TmFtZXMzMihMUE9MRU9CSkVDVCBvbGVvYixMUENTVFIgbmFtZTEsTFBDU1RSIG5hbWUyKSB7Ci0JZnByaW50ZihzdGRuaW1wLCJPbGVTZXRIb3N0TmFtZXMoJXAsJXMsJXMpLHN0dWJcbiIsb2xlb2IsbmFtZTEsbmFtZTIpOworCUZJWE1FKG9sZSwiKCVwLCVzLCVzKTogc3R1YlxuIixvbGVvYixuYW1lMSxuYW1lMik7CiAJcmV0dXJuIE9MRV9PSzsKIH0KIApAQCAtMTM3LDEyICsxMzIsMTEgQEAKICAqICAgICAgICAgICBPbGVRdWVyeVR5cGUzMgogICovCiBPTEVTVEFUVVMgV0lOQVBJIE9sZVF1ZXJ5VHlwZTMyKExQT0xFT0JKRUNUIG9sZW9iLExPTkcqeGxvbmcpIHsKLQlmcHJpbnRmKHN0ZG5pbXAsIk9sZVF1ZXJ5VHlwZSglcCwlcCksc3R1YiFcbiIsb2xlb2IseGxvbmcpOworCUZJWE1FKG9sZSwiKCVwLCVwKTogc3R1YiFcbiIsb2xlb2IseGxvbmcpOwogCWlmICghb2xlb2IpCiAJCXJldHVybiAweDEwOwotCWZwcmludGYoc3RkZGViLCJDYWxsaW5nIE9MRU9CSkVDVC5RdWVyeVR5cGUgKCVwKSAoJXAsJXApXG4iLAotCQlvbGVvYi0+bHB2dGJsLT5RdWVyeVR5cGUsb2xlb2IseGxvbmcKLQkpOworCVRSQUNFKG9sZSwiQ2FsbGluZyBPTEVPQkpFQ1QuUXVlcnlUeXBlICglcCkgKCVwLCVwKVxuIiwKKwkgICAgICBvbGVvYi0+bHB2dGJsLT5RdWVyeVR5cGUsb2xlb2IseGxvbmcpOwogCXJldHVybiBvbGVvYi0+bHB2dGJsLT5RdWVyeVR5cGUob2xlb2IseGxvbmcpOwogfQogCkBAIC0xNTMsOSArMTQ3LDggQEAKIAlMUENTVFIgbmFtZSxMUE9MRUNMSUVOVCBvbGVjbGksTEhDTElFTlRET0MgaGNsaWVudGRvYyxMUENTVFIgeG5hbWUsCiAJTFBPTEVPQkpFQ1QgKmxwb2xlb2IsT0xFT1BUX1JFTkRFUiByZW5kZXIsIE9MRUNMSVBGT1JNQVQgY2xpcGZvcm1hdAogKSB7Ci0JZnByaW50ZihzdGRuaW1wLCJPbGVDcmVhdGVMaW5rRnJvbUNsaXAoJXMsJXAsJTA4bHgsJXMsJXAsJWQsJWxkKSxzdHViIVxuIiwKLQkJbmFtZSxvbGVjbGksaGNsaWVudGRvYyx4bmFtZSxscG9sZW9iLHJlbmRlcixjbGlwZm9ybWF0Ci0JKTsKKwlGSVhNRShvbGUsIiglcywlcCwlMDhseCwlcywlcCwlZCwlbGQpOiBzdHViIVxuIiwKKwkgICAgICBuYW1lLG9sZWNsaSxoY2xpZW50ZG9jLHhuYW1lLGxwb2xlb2IscmVuZGVyLGNsaXBmb3JtYXQpOwogCS8qIGNsaXBiIHR5cGUsIG9iamVjdCBrcmVpZXJlbiBlbnRzcHJlY2hlbmQgZXRjLiAqLwogCXJldHVybiBPTEVfT0s7CiB9CmRpZmYgLS1naXQgYS9vbGUvb2xlc3ZyLmMgYi9vbGUvb2xlc3ZyLmMKaW5kZXggZjYwNGE0YS4uNjJiNWUwYSAxMDA2NDQKLS0tIGEvb2xlL29sZXN2ci5jCisrKyBiL29sZS9vbGVzdnIuYwpAQCAtMjAsNyArMjAsNyBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMSFNFUlZFUiAqaFJldCwgSElOU1RBTkNFMTYgaFNlcnZlciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT0xFX1NFUlZFUl9VU0UgdXNlICkKIHsKLSAgICBGSVhNRShvbGUsIiVzIC0gc3R1YlxuIixuYW1lKTsKKyAgICBGSVhNRShvbGUsIiglcywuLi4pOiBzdHViXG4iLG5hbWUpOwogICAgICpoUmV0PSsrT0xFX2N1cnJlbnRfaGFuZGxlOwogICAgIC8qIHJldHVybiBPTEVfRVJST1JfTUVNT1JZLCBPTEVfRVJST1JfUFJPVEVDVF9PTkxZIGlmIHlvdSB3YW50IGl0IGZhaWwqLwogICAgIHJldHVybiBPTEVfT0s7CkBAIC0zMSw3ICszMSw3IEBACiAgKi8KIE9MRVNUQVRVUyBXSU5BUEkgT2xlQmxvY2tTZXJ2ZXIxNihMSFNFUlZFUiBoU2VydmVyKQogewotICAgIGZwcmludGYoc3RkbmltcCwiT2xlQmxvY2tTZXJ2ZXI6JWxkXG4iLGhTZXJ2ZXIpOworICAgIEZJWE1FKG9sZSwiKCVsZCk6IHN0dWJcbiIsaFNlcnZlcik7CiAgICAgcmV0dXJuIE9MRV9PSzsKIH0KIApAQCAtNDAsNyArNDAsNyBAQAogICovCiBPTEVTVEFUVVMgV0lOQVBJIE9sZUJsb2NrU2VydmVyMzIoTEhTRVJWRVIgaFNlcnZlcikKIHsKLSAgICBmcHJpbnRmKHN0ZG5pbXAsIk9sZUJsb2NrU2VydmVyOiVsZFxuIixoU2VydmVyKTsKKyAgICBGSVhNRShvbGUsIiglbGQpOiBzdHViXG4iLGhTZXJ2ZXIpOwogICAgIHJldHVybiBPTEVfT0s7CiB9CiAKQEAgLTQ5LDcgKzQ5LDcgQEAKICAqLwogT0xFU1RBVFVTIFdJTkFQSSBPbGVVbmJsb2NrU2VydmVyMTYoTEhTRVJWRVIgaFNlcnZlciwgQk9PTDE2ICpibG9jaykKIHsKLSAgICBmcHJpbnRmKHN0ZG5pbXAsIk9sZVVuYmxvY2tTZXJ2ZXI6JWxkXG4iLGhTZXJ2ZXIpOworICAgIEZJWE1FKG9sZSwiKCVsZCk6IHN0dWJcbiIsaFNlcnZlcik7CiAgICAgLyogbm8gbW9yZSBibG9ja2VkIG1lc3NhZ2VzIDopICovCiAgICAgKmJsb2NrPUZBTFNFOwogICAgIHJldHVybiBPTEVfT0s7CkBAIC02MCw3ICs2MCw3IEBACiAgKi8KIE9MRVNUQVRVUyBXSU5BUEkgT2xlVW5ibG9ja1NlcnZlcjMyKExIU0VSVkVSIGhTZXJ2ZXIsIEJPT0wzMiAqYmxvY2spCiB7Ci0gICAgZnByaW50ZihzdGRuaW1wLCJPbGVVbmJsb2NrU2VydmVyOiVsZFxuIixoU2VydmVyKTsKKyAgICBGSVhNRShvbGUsIiglbGQpOiBzdHViXG4iLGhTZXJ2ZXIpOwogICAgIC8qIG5vIG1vcmUgYmxvY2tlZCBtZXNzYWdlcyA6KSAqLwogICAgICpibG9jaz1GQUxTRTsKICAgICByZXR1cm4gT0xFX09LOwpAQCAtNzMsOCArNzMsNyBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMUE9MRVNFUlZFUkRPQyBkb2N1bWVudCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTEhTRVJWRVJET0MgKmhSZXQpCiB7Ci0gICAgRklYTUUob2xlLCIlbGQsJXMgLSBzdHViXG4iLCAKLQkJaFNlcnZlciwgZG9jbmFtZSk7CisgICAgRklYTUUob2xlLCIoJWxkLCVzKTogc3R1YlxuIixoU2VydmVyLCBkb2NuYW1lKTsKICAgICAqaFJldD0rK09MRV9jdXJyZW50X2hhbmRsZTsKICAgICByZXR1cm4gT0xFX09LOwogfQpAQCAtOTMsNyArOTIsNyBAQAogICovCiBPTEVTVEFUVVMgV0lOQVBJIE9sZVJldm9rZVNlcnZlckRvYzMyKExIU0VSVkVSRE9DIGhTZXJ2ZXJEb2MpCiB7Ci0gICAgZnByaW50ZihzdGRuaW1wLCJPbGVSZXZva2VTZXJ2ZXJEb2M6JWxkXG4iLGhTZXJ2ZXJEb2MpOworICAgIEZJWE1FKG9sZSwiKCVsZCk6IHN0dWJcbiIsaFNlcnZlckRvYyk7CiAgICAgcmV0dXJuIE9MRV9PSzsKIH0KIApAQCAtMTA3LDkgKzEwNiw3IEBACiB9CiAKIE9MRVNUQVRVUyBXSU5BUEkgT2xlUmVnaXN0ZXJTZXJ2ZXIzMihMUENTVFIgc3ZybmFtZSxMUE9MRVNFUlZFUiBvbGVzdnIsTEhTRVJWRVIqIGhSZXQsSElOU1RBTkNFMzIgaGluc3QsT0xFX1NFUlZFUl9VU0Ugb3N1KSB7Ci0JZnByaW50ZihzdGRlcnIsIk9sZVJlZ2lzdGVyU2VydmVyKCVzLCVwLCVwLCUwOHgsJWQpLHN0dWIhXG4iLAotCQlzdnJuYW1lLG9sZXN2cixoUmV0LGhpbnN0LG9zdQotCSk7CisJRklYTUUob2xlLCIoJXMsJXAsJXAsJTA4eCwlZCk6IHN0dWIhXG4iLHN2cm5hbWUsb2xlc3ZyLGhSZXQsaGluc3Qsb3N1KTsKICAgICAJKmhSZXQ9KytPTEVfY3VycmVudF9oYW5kbGU7CiAJcmV0dXJuIE9MRV9PSzsKIH0KQEAgLTExOCw3ICsxMTUsNyBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMUE9MRVNFUlZFUkRPQyBkb2N1bWVudCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTEhTRVJWRVJET0MgKmhSZXQpCiB7Ci0gICAgZnByaW50ZihzdGRuaW1wLCJPbGVSZWdpc3RlclNlcnZlckRvYzolbGQsJXNcbiIsIGhTZXJ2ZXIsIGRvY25hbWUpOworICAgIEZJWE1FKG9sZSwiKCVsZCwlcyk6IHN0dWJcbiIsIGhTZXJ2ZXIsIGRvY25hbWUpOwogICAgICpoUmV0PSsrT0xFX2N1cnJlbnRfaGFuZGxlOwogICAgIHJldHVybiBPTEVfT0s7CiB9CkBAIC0xMjksNiArMTI2LDYgQEAKICAqLwogT0xFU1RBVFVTIFdJTkFQSSBPbGVSZW5hbWVTZXJ2ZXJEb2MzMihMSFNFUlZFUkRPQyBoRG9jLCBMUENTVFIgbmV3TmFtZSkKIHsKLSAgICBmcHJpbnRmKHN0ZGVyciwiT2xlUmVuYW1lU2VydmVyRG9jOiAlbGQgJXM7IHN0dWIuXG4iLGhEb2MsIG5ld05hbWUpOworICAgIEZJWE1FKG9sZSwiKCVsZCwlcyk6IHN0dWIuXG4iLGhEb2MsIG5ld05hbWUpOwogICAgIHJldHVybiBPTEVfT0s7CiB9CmRpZmYgLS1naXQgYS9vbGUvc3RvcmFnZS5jIGIvb2xlL3N0b3JhZ2UuYwppbmRleCAzMzc3Zjc5Li4xOWY0ZmJkIDEwMDY0NAotLS0gYS9vbGUvc3RvcmFnZS5jCisrKyBiL29sZS9zdG9yYWdlLmMKQEAgLTIzLDcgKzIzLDYgQEAKICNpbmNsdWRlICJtb2R1bGUuaCIKICNpbmNsdWRlICJsZHQuaCIKICNpbmNsdWRlICJkZWJ1Zy5oIgotI2luY2x1ZGUgImRlYnVnc3RyLmgiCiAKIHN0YXRpYyBjb25zdCBCWVRFIFNUT1JBR0VfbWFnaWNbOF0gICA9ezB4ZDAsMHhjZiwweDExLDB4ZTAsMHhhMSwweGIxLDB4MWEsMHhlMX07CiBzdGF0aWMgY29uc3QgQllURSBTVE9SQUdFX25vdG1hZ2ljWzhdPXsweDBlLDB4MTEsMHhmYywweDBkLDB4ZDAsMHhjZiwweDExLDB4ZTB9OwpkaWZmIC0tZ2l0IGEvb2xlL3R5cGVsaWIuYyBiL29sZS90eXBlbGliLmMKaW5kZXggMTZjZDcyYy4uZDk4OGQwMyAxMDA2NDQKLS0tIGEvb2xlL3R5cGVsaWIuYworKysgYi9vbGUvdHlwZWxpYi5jCkBAIC0xNSwxNyArMTUsMzAgQEAKICNpbmNsdWRlICJjb21wb2JqLmgiCiAjaW5jbHVkZSAiZGVidWcuaCIKIAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCVF1ZXJ5UGF0aE9mUmVnVHlwZUxpYgkJCShUWVBFTElCLjE0KQorICogUkVUVVJOUworICoJcGF0aCBvZiB0eXBlbGliCisgKi8KIEhSRVNVTFQgV0lOQVBJCi1RdWVyeVBhdGhPZlJlZ1R5cGVMaWIoUkVGR1VJRCBndWlkLFdPUkQgd01haiwgV09SRCB3TWluLCBMQ0lEIGxjaWQsTFBTVFIgcGF0aCkgCi17CitRdWVyeVBhdGhPZlJlZ1R5cGVMaWIoCQorCVJFRkdVSUQgZ3VpZCwJLyogW2luXSByZWZlcmVuY2VkIGd1aWQgKi8KKwlXT1JEIHdNYWosCS8qIFtpbl0gbWFqb3IgdmVyc2lvbiAqLworCVdPUkQgd01pbiwJLyogW2luXSBtaW5vciB2ZXJzaW9uICovCisJTENJRCBsY2lkLAkvKiBbaW5dIGxvY2FsZSBpZCAqLworCUxQU1RSIHBhdGgJLyogW291dF0gcGF0aCBvZiB0eXBlbGliICovCispIHsKIAljaGFyCXhndWlkWzgwXTsKIAogCWlmIChISVdPUkQoZ3VpZCkpCiAJCVdJTkVfU3RyaW5nRnJvbUNMU0lEKGd1aWQseGd1aWQpOwogCWVsc2UKLQkJc3ByaW50Zih4Z3VpZCwiPGd1aWQgMHglMDhseD4iLGd1aWQpOwotCWZwcmludGYoc3RkZXJyLCJRdWVyeVBhdGhPZlJlZ1R5cGVMaWIoJXMsJWQsJWQsMHglMDR4LCVwKSxzdHViIVxuIiwKLQkJeGd1aWQsd01haix3TWluLGxjaWQscGF0aAotCSk7CisJCXNwcmludGYoeGd1aWQsIjxndWlkIDB4JTA4bHg+IiwoRFdPUkQpZ3VpZCk7CisJRklYTUUob2xlLCIoJXMsJWQsJWQsMHglMDR4LCVwKSxzdHViIVxuIix4Z3VpZCx3TWFqLHdNaW4sbGNpZCxwYXRoKTsKIAlyZXR1cm4gRV9GQUlMOwogfQorCitEV09SRCBXSU5BUEkgT0FCdWlsZFZlcnNpb24oKQoreworCXJldHVybiBNQUtFTE9ORygweGJkMywgMHgzKTsKK30KZGlmZiAtLWdpdCBhL3Byb2dyYW1zL25vdGVwYWQvVE9ETyBiL3Byb2dyYW1zL25vdGVwYWQvVE9ETwppbmRleCBhMTRhMmI0Li5iYjU1ZjQ4IDEwMDY0NAotLS0gYS9wcm9ncmFtcy9ub3RlcGFkL1RPRE8KKysrIGIvcHJvZ3JhbXMvbm90ZXBhZC9UT0RPCkBAIC0xLDIgKzEsNCBAQAogCisgLSBOb3RlcGFkIHNlZ2ZhdWx0cyB3aGVuIHNlbGVjdGluZyAiRmluZCIgYnV0dG9uIGluICJTZWFyY2giIGRpYWxvZy4KKyAKICAtIGNyZWF0ZSBuZXcgKi5yYyBmaWxlcyBmb3IgYWxsIGxhbmd1YWdlcyB5b3Uga25vdy4KZGlmZiAtLWdpdCBhL3Byb2dyYW1zL25vdGVwYWQvZGlhbG9nLmMgYi9wcm9ncmFtcy9ub3RlcGFkL2RpYWxvZy5jCmluZGV4IGNkZTlhNmIuLjYyNzkwZDggMTAwNjQ0Ci0tLSBhL3Byb2dyYW1zL25vdGVwYWQvZGlhbG9nLmMKKysrIGIvcHJvZ3JhbXMvbm90ZXBhZC9kaWFsb2cuYwpAQCAtMTUsMTIgKzE1LDE0IEBACiAjaW5jbHVkZSAibGljZW5zZS5oIgogI2luY2x1ZGUgImRpYWxvZy5oIgogI2luY2x1ZGUgInZlcnNpb24uaCIKKyNpbmNsdWRlICJkZWJ1Zy5oIgogCiBzdGF0aWMgTFJFU1VMVCBESUFMT0dfUEFHRVNFVFVQX0RsZ1Byb2MoSFdORCBoRGxnLCBVSU5UIG1zZywgV1BBUkFNIHdQYXJhbSwgTFBBUkFNIGxQYXJhbSk7CiAKIFZPSUQgRElBTE9HX0ZpbGVOZXcoVk9JRCkKIHsKLSAgZnByaW50ZihzdGRlcnIsICJGaWxlTmV3KClcbiIpOworLy8gIGRwcmludGZfZml4bWUoR2xvYmFsLCAiRmlsZU5ldygpIG5vdCB5ZXQgaW1wbGVtZW50ZWRcbiIpOworICBwcmludGYoIkZpbGVOZXcoKVxuIik7CiB9CiAKIFZPSUQgRElBTE9HX0ZpbGVPcGVuKFZPSUQpCkBAIC02NSw3ICs2Nyw5IEBACiAgCSAgb3BlbmZpbGVuYW1lLmxwVGVtcGxhdGVOYW1lICAgID0gMDsKIAogICAJICBpZiAoR2V0T3BlbkZpbGVOYW1lKCZvcGVuZmlsZW5hbWUpKSB7Ci0JICBwcmludGYoIk9wZW5maWxlOiAlc1xuIiwgb3BlbmZpbGVuYW1lLmxwc3RyRmlsZSk7CisgICAgICAgICAgICBsc3RyY3B5bihHbG9iYWxzLnN6RmlsZU5hbWUsIG9wZW5maWxlbmFtZS5scHN0ckZpbGUsIAorICAgICAgICAgICAgICAgICAgICAgc3RybGVuKG9wZW5maWxlbmFtZS5scHN0ckZpbGUpKzEpOworICAgICAgICAgIHByaW50ZigiT3BlbkZpbGU6ICVzXG4iLCBHbG9iYWxzLnN6RmlsZU5hbWUpOwogCSAgfQogfQogCkBAIC03Niw3ICs4MCw3IEBACiAKIFZPSUQgRElBTE9HX0ZpbGVTYXZlQXMoVk9JRCkKIHsKLSAgICAgICAgICBPUEVORklMRU5BTUUgc2F2ZWZpbGVuYW1lOworICAgICAgICAgIE9QRU5GSUxFTkFNRSBzYXZlYXM7CiAgICAgICAgICAgQ0hBUiBzelBhdGhbTUFYX1BBVEhOQU1FX0xFTl07CiAgICAgICAgICAgQ0hBUiBzekRpcltNQVhfUEFUSE5BTUVfTEVOXTsKICAgICAgICAgICBDSEFSIHN6ekZpbHRlclsyICogTUFYX1NUUklOR19MRU4gKyAxMDBdOwpAQCAtOTQsMzQgKzk4LDM4IEBACiAKICAgICAgICAgICBHZXRXaW5kb3dzRGlyZWN0b3J5KHN6RGlyLCBzaXplb2Yoc3pEaXIpKTsKIAotICAgICAgICAgIHNhdmVmaWxlbmFtZS5sU3RydWN0U2l6ZSAgICAgICA9IDA7Ci0gICAgICAgICAgc2F2ZWZpbGVuYW1lLmh3bmRPd25lciAgICAgICAgID0gR2xvYmFscy5oTWFpblduZDsKLSAgICAgICAgICBzYXZlZmlsZW5hbWUuaEluc3RhbmNlICAgICAgICAgPSBHbG9iYWxzLmhJbnN0YW5jZTsKLSAgICAgICAgICBzYXZlZmlsZW5hbWUubHBzdHJGaWx0ZXIgICAgICAgPSBzenpGaWx0ZXI7Ci0gICAgICAgICAgc2F2ZWZpbGVuYW1lLmxwc3RyQ3VzdG9tRmlsdGVyID0gMDsKLSAgICAgICAgICBzYXZlZmlsZW5hbWUubk1heEN1c3RGaWx0ZXIgICAgPSAwOwotICAgICAgICAgIHNhdmVmaWxlbmFtZS5uRmlsdGVySW5kZXggICAgICA9IDA7Ci0gICAgICAgICAgc2F2ZWZpbGVuYW1lLmxwc3RyRmlsZSAgICAgICAgID0gc3pQYXRoOwotICAgICAgICAgIHNhdmVmaWxlbmFtZS5uTWF4RmlsZSAgICAgICAgICA9IHNpemVvZihzelBhdGgpOwotICAgICAgICAgIHNhdmVmaWxlbmFtZS5scHN0ckZpbGVUaXRsZSAgICA9IDA7Ci0gICAgICAgICAgc2F2ZWZpbGVuYW1lLm5NYXhGaWxlVGl0bGUgICAgID0gMDsKLSAgICAgICAgICBzYXZlZmlsZW5hbWUubHBzdHJJbml0aWFsRGlyICAgPSBzekRpcjsKLSAgICAgICAgICBzYXZlZmlsZW5hbWUubHBzdHJUaXRsZSAgICAgICAgPSAwOwotICAgICAgICAgIHNhdmVmaWxlbmFtZS5GbGFncyAgICAgICAgICAgICA9IDA7Ci0gICAgICAgICAgc2F2ZWZpbGVuYW1lLm5GaWxlT2Zmc2V0ICAgICAgID0gMDsKLSAgICAgICAgICBzYXZlZmlsZW5hbWUubkZpbGVFeHRlbnNpb24gICAgPSAwOwotICAgICAgICAgIHNhdmVmaWxlbmFtZS5scHN0ckRlZkV4dCAgICAgICA9IDA7Ci0gICAgICAgICAgc2F2ZWZpbGVuYW1lLmxDdXN0RGF0YSAgICAgICAgID0gMDsKLSAgICAgICAgICBzYXZlZmlsZW5hbWUubHBmbkhvb2sgICAgICAgICAgPSAwOwotICAgICAgICAgIHNhdmVmaWxlbmFtZS5scFRlbXBsYXRlTmFtZSAgICA9IDA7CisgICAgICAgICAgc2F2ZWFzLmxTdHJ1Y3RTaXplICAgICAgID0gMDsKKyAgICAgICAgICBzYXZlYXMuaHduZE93bmVyICAgICAgICAgPSBHbG9iYWxzLmhNYWluV25kOworICAgICAgICAgIHNhdmVhcy5oSW5zdGFuY2UgICAgICAgICA9IEdsb2JhbHMuaEluc3RhbmNlOworICAgICAgICAgIHNhdmVhcy5scHN0ckZpbHRlciAgICAgICA9IHN6ekZpbHRlcjsKKyAgICAgICAgICBzYXZlYXMubHBzdHJDdXN0b21GaWx0ZXIgPSAwOworICAgICAgICAgIHNhdmVhcy5uTWF4Q3VzdEZpbHRlciAgICA9IDA7CisgICAgICAgICAgc2F2ZWFzLm5GaWx0ZXJJbmRleCAgICAgID0gMDsKKyAgICAgICAgICBzYXZlYXMubHBzdHJGaWxlICAgICAgICAgPSBzelBhdGg7CisgICAgICAgICAgc2F2ZWFzLm5NYXhGaWxlICAgICAgICAgID0gc2l6ZW9mKHN6UGF0aCk7CisgICAgICAgICAgc2F2ZWFzLmxwc3RyRmlsZVRpdGxlICAgID0gMDsKKyAgICAgICAgICBzYXZlYXMubk1heEZpbGVUaXRsZSAgICAgPSAwOworICAgICAgICAgIHNhdmVhcy5scHN0ckluaXRpYWxEaXIgICA9IHN6RGlyOworICAgICAgICAgIHNhdmVhcy5scHN0clRpdGxlICAgICAgICA9IDA7CisgICAgICAgICAgc2F2ZWFzLkZsYWdzICAgICAgICAgICAgID0gMDsKKyAgICAgICAgICBzYXZlYXMubkZpbGVPZmZzZXQgICAgICAgPSAwOworICAgICAgICAgIHNhdmVhcy5uRmlsZUV4dGVuc2lvbiAgICA9IDA7CisgICAgICAgICAgc2F2ZWFzLmxwc3RyRGVmRXh0ICAgICAgID0gMDsKKyAgICAgICAgICBzYXZlYXMubEN1c3REYXRhICAgICAgICAgPSAwOworICAgICAgICAgIHNhdmVhcy5scGZuSG9vayAgICAgICAgICA9IDA7CisgICAgICAgICAgc2F2ZWFzLmxwVGVtcGxhdGVOYW1lICAgID0gMDsKIAotICAgICAgICAgIGlmIChHZXRTYXZlRmlsZU5hbWUoJnNhdmVmaWxlbmFtZSkpOworICAgICAgICAgIGlmIChHZXRTYXZlRmlsZU5hbWUoJnNhdmVhcykpIHsKKyAgICAgICAgICAgIGxzdHJjcHluKEdsb2JhbHMuc3pGaWxlTmFtZSwgc2F2ZWFzLmxwc3RyRmlsZSwgCisgICAgICAgICAgICAgICAgICAgICBzdHJsZW4oc2F2ZWFzLmxwc3RyRmlsZSkrMSk7CisgICAgICAgICAgICBwcmludGYoIlNhdmVBcyglcylcbiIsIEdsb2JhbHMuc3pGaWxlTmFtZSk7CisgICAgICAgICAgfQogfQogCiBWT0lEIERJQUxPR19GaWxlUHJpbnQoVk9JRCkKIHsKIAlQUklOVERMRyBwcmludGVyOwotCXByaW50ZXIubFN0cnVjdFNpemUgICAgICAgICAgID0gMDsKKwlwcmludGVyLmxTdHJ1Y3RTaXplICAgICAgICAgICA9IHNpemVvZihwcmludGVyKTsKICAgICAgICAgcHJpbnRlci5od25kT3duZXIgICAgICAgICAgICAgPSBHbG9iYWxzLmhNYWluV25kOwogICAgICAgICBwcmludGVyLmhJbnN0YW5jZSAgICAgICAgICAgICA9IEdsb2JhbHMuaEluc3RhbmNlOwogICAgICAgICBwcmludGVyLmhEZXZNb2RlICAgICAgICAgICAgICA9IDA7CkBAIC0xNDEsNyArMTQ5LDkgQEAKIAlwcmludGVyLmhQcmludFRlbXBsYXRlICAgICAgICA9IDA7CiAJcHJpbnRlci5oU2V0dXBUZW1wbGF0ZSAgICAgICAgPSAwOwogCQotCWlmKFByaW50RGxnMTYoJnByaW50ZXIpKTsKKwlpZihQcmludERsZzE2KCZwcmludGVyKSkgeworICAgICAgICAgIC8qIGRvIG5vdGhpbmcgKi8KKyAgICAgICAgfTsKIH0KIAogVk9JRCBESUFMT0dfRmlsZVBhZ2VTZXR1cChWT0lEKQpAQCAtMjA1LDYgKzIxNSw5IEBACiB7CiAgICAgICAgICAgRklORFJFUExBQ0UgZmluZDsKIAkgIENIQVIgc3pGaW5kW01BWF9QQVRITkFNRV9MRU5dOworICAgICAgICAgIAorICAgICAgICAgIGxzdHJjcHluKHN6RmluZCwgR2xvYmFscy5zekZpbmRUZXh0LCBzdHJsZW4oR2xvYmFscy5zekZpbmRUZXh0KSsxKTsKKyAgICAgICAgICAKIAkgIGZpbmQubFN0cnVjdFNpemUgICAgICAgICAgICAgICA9IDA7CiAgICAgICAgICAgZmluZC5od25kT3duZXIgICAgICAgICAgICAgICAgID0gR2xvYmFscy5oTWFpblduZDsKICAgICAgICAgICBmaW5kLmhJbnN0YW5jZSAgICAgICAgICAgICAgICAgPSBHbG9iYWxzLmhJbnN0YW5jZTsKQEAgLTIxNCw3ICsyMjcsMTQgQEAKICAgICAgICAgICBmaW5kLmxDdXN0RGF0YSAgICAgICAgICAgICAgICAgPSAwOwogICAgICAgICAgIGZpbmQubHBmbkhvb2sgICAgICAgICAgICAgICAgICA9IDA7CiAgICAgICAgICAgZmluZC5scFRlbXBsYXRlTmFtZSAgICAgICAgICAgID0gMDsKLQkgIEZpbmRUZXh0KCZmaW5kKTsKKworCSAgaWYgKEZpbmRUZXh0KCZmaW5kKSkgeworICAgICAgICAgICAgIGxzdHJjcHluKEdsb2JhbHMuc3pGaW5kVGV4dCwgc3pGaW5kLCBzdHJsZW4oc3pGaW5kKSsxKTsKKyAgICAgICAgICB9IAorICAgICAgICAgICAgIGVsc2UgCisgICAgICAgICAgeyAKKyAgICAgICAgICAgICAvKiBkbyBub3RoaW5nICovIAorICAgICAgICAgIH07CiB9CiAKIFZPSUQgRElBTE9HX1NlYXJjaE5leHQoVk9JRCkKZGlmZiAtLWdpdCBhL3Byb2dyYW1zL25vdGVwYWQvbWFpbi5jIGIvcHJvZ3JhbXMvbm90ZXBhZC9tYWluLmMKaW5kZXggYTdmOGNlYS4uODg0OTNjNCAxMDA2NDQKLS0tIGEvcHJvZ3JhbXMvbm90ZXBhZC9tYWluLmMKKysrIGIvcHJvZ3JhbXMvbm90ZXBhZC9tYWluLmMKQEAgLTExNCwxNyArMTE0LDYgQEAKICAqICAgICAgICAgICBXaW5NYWluCiAgKi8KIAotdm9pZCBEdW1wR2xvYmFscyh2b2lkKSB7Ci0KLSAgICBwcmludGYoIkR1bXBHbG9iYWxzKClcbiIpOwotICAgIHByaW50ZigiIEdsb2JhbHMubHBzekluaUZpbGU6ICVzXG4iLCBHbG9iYWxzLmxwc3pJbmlGaWxlKTsgCi0gICAgcHJpbnRmKCIgR2xvYmFscy5scHN6SWNvRmlsZTogJXNcbiIsIEdsb2JhbHMubHBzekljb0ZpbGUpOwotICAgIHByaW50ZigiR2xvYmFscy5scHN6TGFuZ3VhZ2U6ICVzXG4iLCBHbG9iYWxzLmxwc3pMYW5ndWFnZSk7Ci0gICAgcHJpbnRmKCIgICBHbG9iYWxzLmhJbnN0YW5jZTogJWlcbiIsIEdsb2JhbHMuaEluc3RhbmNlKTsKLSAgICBwcmludGYoIiAgIEdsb2JhbHMuaE1haW5NZW51OiAlaVxuIiwgR2xvYmFscy5oTWFpbk1lbnUpOwotICAgIAotfQotIAogaW50IFBBU0NBTCBXaW5NYWluIChIQU5ETEUgaEluc3RhbmNlLCBIQU5ETEUgcHJldiwgTFBTVFIgY21kbGluZSwgaW50IHNob3cpCiB7CiAgICAgTVNHICAgICAgbXNnOwpAQCAtMTM5LDE0ICsxMjgsMTIgQEAKICAgICAgIExJQldJTkVfUmVnaXN0ZXJfU3coKTsKICAgICAjZW5kaWYKIAotICAgIHByaW50ZigiV2luTWFpbigpXG4iKTsKLSAgICAKICAgICAvKiBTZXR1cCBHbG9iYWxzICovCiAKICAgICBHbG9iYWxzLmxwc3pJbmlGaWxlICAgPSAibm90ZXBhZC5pbmkiOwogICAgIEdsb2JhbHMubHBzekljb0ZpbGUgICA9ICJub3RlcGFkLmljbyI7CiAKLSAgLyogU2VsZWN0IExhbmd1YWdlICovCisgICAgLyogU2VsZWN0IExhbmd1YWdlICovCiAgICAgTEFOR1VBR0VfSW5pdCgpOwogCiAgICAgR2xvYmFscy5oSW5zdGFuY2UgICAgID0gaEluc3RhbmNlOwpAQCAtMTU1LDIwICsxNDIsMjIgQEAKICAgICBpZiAoIUdsb2JhbHMuaE1haW5JY29uKSBHbG9iYWxzLmhNYWluSWNvbiA9IAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExvYWRJY29uKDAsIE1BS0VJTlRSRVNPVVJDRShERUZBVUxUSUNPTikpOwogCi0gICAgRHVtcEdsb2JhbHMoKTsJCQkJICAKLQkJCQkgIAorICAgIGxzdHJjcHluKEdsb2JhbHMuc3pGaW5kVGV4dCwgIlwwIiwgMSk7CisgICAgbHN0cmNweW4oR2xvYmFscy5zekZpbGVOYW1lLCAiXDAiLCAxKTsKKwogICAgIGlmICghcHJldil7Ci0JY2xhc3Muc3R5bGUgPSBDU19IUkVEUkFXIHwgQ1NfVlJFRFJBVzsKLQljbGFzcy5scGZuV25kUHJvYyA9IE5PVEVQQURfV25kUHJvYzsKLQljbGFzcy5jYkNsc0V4dHJhID0gMDsKLQljbGFzcy5jYlduZEV4dHJhID0gMDsKLQljbGFzcy5oSW5zdGFuY2UgID0gR2xvYmFscy5oSW5zdGFuY2U7Ci0JY2xhc3MuaEljb24gICAgICA9IExvYWRJY29uICgwLCBJRElfQVBQTElDQVRJT04pOwotCWNsYXNzLmhDdXJzb3IgICAgPSBMb2FkQ3Vyc29yICgwLCBJRENfQVJST1cpOworCWNsYXNzLnN0eWxlICAgICAgICAgPSBDU19IUkVEUkFXIHwgQ1NfVlJFRFJBVzsKKwljbGFzcy5scGZuV25kUHJvYyAgID0gTk9URVBBRF9XbmRQcm9jOworCWNsYXNzLmNiQ2xzRXh0cmEgICAgPSAwOworCWNsYXNzLmNiV25kRXh0cmEgICAgPSAwOworCWNsYXNzLmhJbnN0YW5jZSAgICAgPSBHbG9iYWxzLmhJbnN0YW5jZTsKKwljbGFzcy5oSWNvbiAgICAgICAgID0gTG9hZEljb24gKDAsIElESV9BUFBMSUNBVElPTik7CisJY2xhc3MuaEN1cnNvciAgICAgICA9IExvYWRDdXJzb3IgKDAsIElEQ19BUlJPVyk7CiAJY2xhc3MuaGJyQmFja2dyb3VuZCA9IEdldFN0b2NrT2JqZWN0IChXSElURV9CUlVTSCk7Ci0JY2xhc3MubHBzek1lbnVOYW1lID0gImJsYVwwIjsKKwljbGFzcy5scHN6TWVudU5hbWUgID0gMDsKIAljbGFzcy5scHN6Q2xhc3NOYW1lID0gKFNFR1BUUiljbGFzc05hbWU7CiAgICAgfQorCiAgICAgaWYgKCFSZWdpc3RlckNsYXNzICgmY2xhc3MpKQogCXJldHVybiBGQUxTRTsKIApkaWZmIC0tZ2l0IGEvcHJvZ3JhbXMvbm90ZXBhZC9tYWluLmggYi9wcm9ncmFtcy9ub3RlcGFkL21haW4uaAppbmRleCA2OWU3NDE5Li43Yzc2YjMwIDEwMDY0NAotLS0gYS9wcm9ncmFtcy9ub3RlcGFkL21haW4uaAorKysgYi9wcm9ncmFtcy9ub3RlcGFkL21haW4uaApAQCAtMzEsNiArMzEsOCBAQAogICBMUENTVFIgIGxwc3pMYW5ndWFnZTsKICAgVUlOVCAgICB3U3RyaW5nVGFibGVPZmZzZXQ7CiAgIEJPT0wgICAgYldyYXBMb25nTGluZXM7CisgIENIQVIgICAgc3pGaW5kVGV4dFtNQVhfUEFUSE5BTUVfTEVOXTsKKyAgQ0hBUiAgICBzekZpbGVOYW1lW01BWF9QQVRITkFNRV9MRU5dOwogfSBOT1RFUEFEX0dMT0JBTFM7CiAKIGV4dGVybiBOT1RFUEFEX0dMT0JBTFMgR2xvYmFsczsKZGlmZiAtLWdpdCBhL3Byb2dyYW1zL3ZpZXcvTWFrZWZpbGUuaW4gYi9wcm9ncmFtcy92aWV3L01ha2VmaWxlLmluCmluZGV4IDVlZmQ5ZjkuLmIyMjJhZWYgMTAwNjQ0Ci0tLSBhL3Byb2dyYW1zL3ZpZXcvTWFrZWZpbGUuaW4KKysrIGIvcHJvZ3JhbXMvdmlldy9NYWtlZmlsZS5pbgpAQCAtMTMsNiArMTMsOSBAQAogCXZpZXcuYyBcCiAJd2lubWFpbi5jCiAKK1JDX1NSQ1MgPSBcCisJdmlld3JjLnJjCisKIGFsbDogY2hlY2tfd2luZXJjICQoUFJPR1JBTVMpCiAKIGRlcGVuZDo6ICQoUkNfU1JDUzoucmM9LmgpCmRpZmYgLS1naXQgYS9wcm9ncmFtcy92aWV3L2dsb2JhbHMuaCBiL3Byb2dyYW1zL3ZpZXcvZ2xvYmFscy5oCmluZGV4IGRlYTFjNjAuLjk4ODk5MTEgMTAwNjQ0Ci0tLSBhL3Byb2dyYW1zL3ZpZXcvZ2xvYmFscy5oCisrKyBiL3Byb2dyYW1zL3ZpZXcvZ2xvYmFscy5oCkBAIC0xNiw3ICsxNiw3IEBACiBleHRlcm4gY2hhciAgICAgIHN6VGl0bGVbXTsgICAgICAvKiBUaGUgdGl0bGUgYmFyIHRleHQgKi8KIAogCi0KKyNpZmRlZiBXSU5FTElCCiB0eXBlZGVmIHN0cnVjdAogewogCURXT1JECWtleSBXSU5FX1BBQ0tFRDsKQEAgLTI2LDYgKzI2LDE4IEBACiAJRFdPUkQJcmVzZXJ2ZWQgV0lORV9QQUNLRUQ7CiAJV09SRAljaGVja3N1bSBXSU5FX1BBQ0tFRDsKIH0gQVBNRklMRUhFQURFUiBXSU5FX1BBQ0tFRDsKKyNlbHNlCisjcHJhZ21hIHBhY2soIDIgKQordHlwZWRlZiBzdHJ1Y3QKK3sKKwlEV09SRAkJa2V5OworCVdPUkQJCWhtZjsKKwlTTUFMTF9SRUNUCWJib3g7CisJV09SRAkJaW5jaDsKKwlEV09SRAkJcmVzZXJ2ZWQ7CisJV09SRAkJY2hlY2tzdW07Cit9IEFQTUZJTEVIRUFERVI7CisjZW5kaWYKIAogI2RlZmluZSBBUE1IRUFERVJfS0VZCTB4OUFDNkNERDdsCiAKZGlmZiAtLWdpdCBhL3Byb2dyYW1zL3ZpZXcvdmlldy5jIGIvcHJvZ3JhbXMvdmlldy92aWV3LmMKaW5kZXggM2YxNTBiNi4uZDQ5NDgzYyAxMDA2NDQKLS0tIGEvcHJvZ3JhbXMvdmlldy92aWV3LmMKKysrIGIvcHJvZ3JhbXMvdmlldy92aWV3LmMKQEAgLTExLDYgKzExLDcgQEAKIAogI2luY2x1ZGUgImdsb2JhbHMuaCIgICAgICAgIAogI2luY2x1ZGUgInJlc291cmNlLmgiCisjaW5jbHVkZSA8c3RkaW8uaD4KIAogQk9PTCBGaWxlSXNQbGFjZWFibGUoIExQQ1NUUiBzekZpbGVOYW1lICk7CiBITUVUQUZJTEUgR2V0UGxhY2VhYmxlTWV0YUZpbGUoIExQQ1NUUiBzekZpbGVOYW1lICk7CkBAIC02NywxMiArNjgsNyBAQAogCSAgICBpZiAoRmlsZU9wZW4oaHduZCwgZmlsZW5hbWUpKSB7CiAJICAgICAgaXNBbGR1cyA9IEZpbGVJc1BsYWNlYWJsZShmaWxlbmFtZSk7CiAJICAgICAgaWYgKGlzQWxkdXMpIHsKLSNpZiAxCiAJCWhtZiA9IEdldFBsYWNlYWJsZU1ldGFGaWxlKGZpbGVuYW1lKTsKLSNlbHNlCi0JCU1lc3NhZ2VCb3goaHduZCwgIlRoaXMgaXMgYW4gQWxkdXMgcGxhY2VhYmxlIG1ldGFmaWxlOiBJIGNhbid0IGRlYWwgd2l0aCB0aG9zZSEiLAotCQkJICAgIkFsZHVzIiwgTUJfT0spOwotI2VuZGlmCiAJICAgICAgfSBlbHNlIHsKIAkJUkVDVCByOwogCQlobWYgPSBHZXRNZXRhRmlsZShmaWxlbmFtZSk7CkBAIC0xNDIsNTQgKzEzOCw1OCBAQAogICByZXR1cm4gKGFwbWgua2V5ID09IEFQTUhFQURFUl9LRVkpOwogfQogCi0vKiB0aGlzIGNvZGUgZG9lc24ndCB3b3JrICovCi0jaWYgMQogSE1FVEFGSUxFIEdldFBsYWNlYWJsZU1ldGFGaWxlKCBMUENTVFIgc3pGaWxlTmFtZSApCiB7Ci0gIEhBTkRMRSBoRGF0YTsKICAgTFBTVFIJbHBEYXRhOwogICBNRVRBSEVBREVSIG1mSGVhZGVyOwogICBBUE1GSUxFSEVBREVSCUFQTUhlYWRlcjsKLSAgSE1FVEFGSUxFIGhtZiA9IE5VTEw7CiAgIEhGSUxFCWZoOworICBITUVUQUZJTEUgaG1mOwogICBPRlNUUlVDVCBpbm9mOworICBXT1JEIGNoZWNrc3VtLCAqcDsKKyAgaW50IGk7CiAKLSAgaWYoIChmaCA9IE9wZW5GaWxlKCBzekZpbGVOYW1lLCAmaW5vZiwgT0ZfUkVBRCApICkgPT0gSEZJTEVfRVJST1IgKSByZXR1cm4gTlVMTDsKKyAgaWYoIChmaCA9IE9wZW5GaWxlKCBzekZpbGVOYW1lLCAmaW5vZiwgT0ZfUkVBRCApICkgPT0gSEZJTEVfRVJST1IgKSByZXR1cm4gMDsKICAgX2xsc2VlayhmaCwgMCwgMCk7Ci0gIGlmICghX2xyZWFkKGZoLCAoTFBTVFIpJkFQTUhlYWRlciwgc2l6ZW9mKEFQTUZJTEVIRUFERVIpKSkgcmV0dXJuIE5VTEw7CisgIGlmICghX2xyZWFkKGZoLCAoTFBTVFIpJkFQTUhlYWRlciwgc2l6ZW9mKEFQTUZJTEVIRUFERVIpKSkgcmV0dXJuIDA7CiAgIF9sbHNlZWsoZmgsIHNpemVvZihBUE1GSUxFSEVBREVSKSwgMCk7Ci0gIHByaW50Zigic2l6ZW9mKEFQTUZJTEVIRUFERVIpICVkXG4iLCBzaXplb2YoQVBNRklMRUhFQURFUikpOwotICBpZiAoIV9scmVhZChmaCwgKExQU1RSKSZtZkhlYWRlciwgc2l6ZW9mKE1FVEFIRUFERVIpKSkgcmV0dXJuIE5VTEw7CisgIGNoZWNrc3VtID0gMDsKKyAgcCA9IChXT1JEICopICZBUE1IZWFkZXI7CiAKLSAgaWYgKCEoaERhdGEgPSBHbG9iYWxBbGxvYyhHSE5ELCAobWZIZWFkZXIubXRTaXplICogMkwpKSkpIHJldHVybiBOVUxMOwotCi0gIGlmICghKGxwRGF0YSA9IEdsb2JhbExvY2soaERhdGEpKSkKLSAgewotICAgIEdsb2JhbEZyZWUoaERhdGEpOwotICAgIHJldHVybiBOVUxMOworICBmb3IoaT0wOyBpPDEwOyBpKyspIAorICAgIGNoZWNrc3VtIF49ICpwKys7CisgIGlmIChjaGVja3N1bSAhPSBBUE1IZWFkZXIuY2hlY2tzdW0pIHsKKyAgICBjaGFyIG1zZ1sxMjhdOworICAgIHNwcmludGYobXNnLCAiQ29tcHV0ZWQgY2hlY2tzdW0gJTA0eCAhPSBzdG9yZWQgY2hlY2tzdW0gJTA0eFxuIiwgCisJICAgY2hlY2tzdW0sIEFQTUhlYWRlci5jaGVja3N1bSk7CisgICAgLyogICAgTWVzc2FnZUJveChod25kLCBtc2csICJDaGVja3N1bSBmYWlsZWQiLCBNQl9PSyk7ICovCisgICAgcmV0dXJuIDA7CiAgIH0KIAorICBpZiAoIV9scmVhZChmaCwgKExQU1RSKSZtZkhlYWRlciwgc2l6ZW9mKE1FVEFIRUFERVIpKSkgcmV0dXJuIDA7CisKKyAgaWYgKCEobHBEYXRhID0gR2xvYmFsQWxsb2MoR1BUUiwgKG1mSGVhZGVyLm10U2l6ZSAqIDJMKSkpKSByZXR1cm4gMDsKKwogICBfbGxzZWVrKGZoLCBzaXplb2YoQVBNRklMRUhFQURFUiksIDApOwogICBpZiAoIV9scmVhZChmaCwgbHBEYXRhLCAoVUlOVCkobWZIZWFkZXIubXRTaXplICogMkwpKSkKICAgewotICAgIEdsb2JhbFVubG9jayhoRGF0YSk7Ci0gICAgR2xvYmFsRnJlZShoRGF0YSk7CisgICAgR2xvYmFsRnJlZShscERhdGEpOworICAgIF9sY2xvc2UoZmgpOwogICAgIHJldHVybiBOVUxMOwogICB9CiAgIF9sY2xvc2UoZmgpOwotICBHbG9iYWxVbmxvY2soaERhdGEpOwogCi0gIGlmICghKGhtZiA9IChITUVUQUZJTEUpIFNldE1ldGFGaWxlQml0cyhoRGF0YSkpKSByZXR1cm4gTlVMTDsKKyAgaWYgKCEoaG1mID0gU2V0TWV0YUZpbGVCaXRzRXgobWZIZWFkZXIubXRTaXplKjIsIGxwRGF0YSkpKSAKKyAgICByZXR1cm4gTlVMTDsKIAogICAKICAgd2lkdGggPSBBUE1IZWFkZXIuYmJveC5yaWdodCAtIEFQTUhlYWRlci5iYm94LmxlZnQ7CiAgIGhlaWdodCA9IEFQTUhlYWRlci5iYm94LmJvdHRvbSAtIEFQTUhlYWRlci5iYm94LnRvcDsKIAotICBwcmludGYoIk9rISB3aWR0aCAlZCBoZWlnaHQgJWRcbiIsIHdpZHRoLCBoZWlnaHQpOworICAvKiAgcHJpbnRmKCJPayEgd2lkdGggJWQgaGVpZ2h0ICVkXG4iLCB3aWR0aCwgaGVpZ2h0KTsgKi8KICAgZGVsdGF4ID0gMDsKICAgZGVsdGF5ID0gMCA7CiAgIHJldHVybiBobWY7CiB9Ci0jZW5kaWYKIAogCmRpZmYgLS1naXQgYS9wcm9ncmFtcy93aW5oZWxwL0NoYW5nZUxvZyBiL3Byb2dyYW1zL3dpbmhlbHAvQ2hhbmdlTG9nCmluZGV4IDNkMDcyYmEuLmM2OWJjNWYgMTAwNjQ0Ci0tLSBhL3Byb2dyYW1zL3dpbmhlbHAvQ2hhbmdlTG9nCisrKyBiL3Byb2dyYW1zL3dpbmhlbHAvQ2hhbmdlTG9nCkBAIC0xLDggKzEsMTMgQEAKK01vbiBNYXIgMjMgMTc6MDA6MzYgMTk5OCAgTWFyY2VsIEJhdXIgPG1iYXVyQGcyNi5ldGh6LmNoPgorCisgICAgICAgICogQWRkZWQgcHJlbGltaW5hcnkgUHJpbnQoKSBkaWFsb2cgaW4gW21hY3JvLmNdCisKIFN1biBKYW4gMTggMjM6MDU6MDQgMTk5OCAgS2FybCBCYWNrc3Ry9m0gPGthcmxfYkBnZW9jaXRpZXMuY29tPgorCiAgICAgICAgICogW1N3LnJjXQogICAgICAgICBBZGRlZCBTd2VkaXNoIGxhbmd1YWdlIHN1cHBvcnQuCiAKLUZyaSBKdWwgNCAxMjowMDowMCAxOTk3ICBIZW5yaWsgT2xzZW4gPEhlbnJpay5PbHNlbkBpYWVzdGUuZGs+CitGcmkgSnVsICA0IDEyOjAwOjAwIDE5OTcgIEhlbnJpayBPbHNlbiA8SGVucmlrLk9sc2VuQGlhZXN0ZS5kaz4KIAogCSogW0RhLnJjXSAobmV3KQogCUFkZGVkIERhbmlzaCBsYW5ndWFnZSBzdXBwb3J0LgpkaWZmIC0tZ2l0IGEvcHJvZ3JhbXMvd2luaGVscC9tYWNyby5jIGIvcHJvZ3JhbXMvd2luaGVscC9tYWNyby5jCmluZGV4IGQzM2RkY2MuLjJjNDNiYTMgMTAwNjQ0Ci0tLSBhL3Byb2dyYW1zL3dpbmhlbHAvbWFjcm8uYworKysgYi9wcm9ncmFtcy93aW5oZWxwL21hY3JvLmMKQEAgLTEyLDYgKzEyLDcgQEAKICNlbmRpZgogI2luY2x1ZGUgIndpbmhlbHAuaCIKICNpbmNsdWRlICJtYWNyby5oIgorI2luY2x1ZGUgImRlYnVnLmgiCiAKIFZPSUQgTUFDUk9fQWJvdXQoVk9JRCkKIHsKQEAgLTQ2MCw3ICs0NjEsMzEgQEAKIAogVk9JRCBNQUNST19QcmludChWT0lEKQogewotICBmcHJpbnRmKHN0ZGVyciwgIlByaW50KClcbiIpOworICAgIFBSSU5URExHIHByaW50ZXI7CisgICAgCisgICAgcHJpbnRlci5sU3RydWN0U2l6ZSAgICAgICAgID0gc2l6ZW9mKHByaW50ZXIpOworICAgIHByaW50ZXIuaHduZE93bmVyICAgICAgICAgICA9IEdsb2JhbHMuYWN0aXZlX3dpbi0+aE1haW5XbmQ7CisgICAgcHJpbnRlci5oSW5zdGFuY2UgICAgICAgICAgID0gR2xvYmFscy5oSW5zdGFuY2U7CisgICAgcHJpbnRlci5oRGV2TW9kZSAgICAgICAgICAgID0gMDsKKyAgICBwcmludGVyLmhEZXZOYW1lcyAgICAgICAgICAgPSAwOworICAgIHByaW50ZXIuaERDICAgICAgICAgICAgICAgICA9IDA7CisgICAgcHJpbnRlci5GbGFncyAgICAgICAgICAgICAgID0gMDsKKyAgICBwcmludGVyLm5Gcm9tUGFnZSAgICAgICAgICAgPSAwOworICAgIHByaW50ZXIublRvUGFnZSAgICAgICAgICAgICA9IDA7CisgICAgcHJpbnRlci5uTWluUGFnZSAgICAgICAgICAgID0gMDsKKyAgICBwcmludGVyLm5NYXhQYWdlICAgICAgICAgICAgPSAwOworICAgIHByaW50ZXIubkNvcGllcyAgICAgICAgICAgICA9IDA7CisgICAgcHJpbnRlci5sQ3VzdERhdGEgICAgICAgICAgID0gMDsKKyAgICBwcmludGVyLmxwZm5QcmludEhvb2sgICAgICAgPSAwOworICAgIHByaW50ZXIubHBmblNldHVwSG9vayAgICAgICA9IDA7CisgICAgcHJpbnRlci5scFByaW50VGVtcGxhdGVOYW1lID0gMDsKKyAgICBwcmludGVyLmxwU2V0dXBUZW1wbGF0ZU5hbWUgPSAwOworICAgIHByaW50ZXIuaFByaW50VGVtcGxhdGUgICAgICA9IDA7CisgICAgcHJpbnRlci5oU2V0dXBUZW1wbGF0ZSAgICAgID0gMDsKKyAgICAgICAgCisgICAgaWYgKFByaW50RGxnMTYoJnByaW50ZXIpKSB7CisgICAgICAgIGZwcmludGYoc3RkZXJyLCAiUHJpbnQoKVxuIik7CisgICAgfTsKIH0KIAogVk9JRCBNQUNST19QcmludGVyU2V0dXAoVk9JRCkKZGlmZiAtLWdpdCBhL3Byb2dyYW1zL3dpbmhlbHAvd2luaGVscC5jIGIvcHJvZ3JhbXMvd2luaGVscC93aW5oZWxwLmMKaW5kZXggY2Q4YTIyYi4uYTIxZjdkZSAxMDA2NDQKLS0tIGEvcHJvZ3JhbXMvd2luaGVscC93aW5oZWxwLmMKKysrIGIvcHJvZ3JhbXMvd2luaGVscC93aW5oZWxwLmMKQEAgLTE3LDkgKzE3LDEwIEBACiBWT0lEIExJQldJTkVfUmVnaXN0ZXJfRW4odm9pZCk7CiBWT0lEIExJQldJTkVfUmVnaXN0ZXJfRmkodm9pZCk7CiBWT0lEIExJQldJTkVfUmVnaXN0ZXJfRnIodm9pZCk7CitWT0lEIExJQldJTkVfUmVnaXN0ZXJfSHUodm9pZCk7CiBWT0lEIExJQldJTkVfUmVnaXN0ZXJfSXQodm9pZCk7CiBWT0lEIExJQldJTkVfUmVnaXN0ZXJfS28odm9pZCk7Ci1WT0lEIExJQldJTkVfUmVnaXN0ZXJfSHUodm9pZCk7CitWT0lEIExJQldJTkVfUmVnaXN0ZXJfU3codm9pZCk7CiBWT0lEIExJQldJTkVfUmVnaXN0ZXJfVmEodm9pZCk7CiAKIHN0YXRpYyBCT09MICAgIFdJTkhFTFBfUmVnaXN0ZXJXaW5DbGFzc2VzKCk7CmRpZmYgLS1naXQgYS9yZWxheTMyL2NvbWN0bDMyLnNwZWMgYi9yZWxheTMyL2NvbWN0bDMyLnNwZWMKaW5kZXggNmUyMjRkMi4uMzRmOTY4ZCAxMDA2NDQKLS0tIGEvcmVsYXkzMi9jb21jdGwzMi5zcGVjCisrKyBiL3JlbGF5MzIvY29tY3RsMzIuc3BlYwpAQCAtNCw2ICs0LDcgQEAKICMgRnVuY3Rpb25zIGV4cG9ydGVkIGJ5IHRoZSBXaW45NSBjb21jdGwzMi5kbGwgCiAjICh0aGVzZSBuZWVkIHRvIGhhdmUgdGhlc2UgZXhhY3Qgb3JkaW5hbHMsIGJlY2F1c2Ugc29tZSB3aW45NSBkbGxzIAogIyAgaW1wb3J0IGNvbWN0bDMyLmRsbCBieSBvcmRpbmFsKQorIyAgIFRoaXMgbGlzdCB3YXMgY3JlYXRlZCBmcm9tIGEgY29tY3RsMzIuZGxsIHY0LjcyIChJRTQuMDEpLgogCiAgIDIgc3R1YiBNZW51SGVscAogICAzIHN0dWIgU2hvd0hpZGVNZW51Q3RsCkBAIC0xMiw2MiArMTMsMTQwIEBACiAgIDYgc3RkY2FsbCBDcmVhdGVTdGF0dXNXaW5kb3dBKGxvbmcgcHRyIGxvbmcgbG9uZykgQ3JlYXRlU3RhdHVzV2luZG93MzJBCiAgIDcgc3R1YiBDcmVhdGVUb29sYmFyCiAgIDggc3R1YiBDcmVhdGVNYXBwZWRCaXRtYXAKLSAgOSBzdHViIENjdGwxNjMyX1RodW5rRGF0YTMyCi0gMTAgc3R1YiBDcmVhdGVQcm9wZXJ0eVNoZWV0UGFnZQotIDExIHN0dWIgQ3JlYXRlUHJvcGVydHlTaGVldFBhZ2VBCi0gMTIgc3R1YiBDcmVhdGVQcm9wZXJ0eVNoZWV0UGFnZVcKKyMgIDkgc3R1YiBDT01DVEwzMl85CisjIDEwIHN0dWIgQ09NQ1RMMzJfMTAKKyMgMTEgc3R1YiBDT01DVEwzMl8xMQorIDEyIHN0dWIgQ2N0bDE2MzJfVGh1bmtEYXRhMzIKICAxMyBzdHViIE1ha2VEcmFnTGlzdAogIDE0IHN0dWIgTEJJdGVtRnJvbVB0CiAgMTUgc3R1YiBEcmF3SW5zZXJ0CiAgMTYgc3RkY2FsbCBDcmVhdGVVcERvd25Db250cm9sKGxvbmcgbG9uZyBsb25nIGxvbmcgbG9uZyBsb25nIGxvbmcgbG9uZyBsb25nIGxvbmcgbG9uZyBsb25nKSBDcmVhdGVVcERvd25Db250cm9sCiAgMTcgc3RkY2FsbCBJbml0Q29tbW9uQ29udHJvbHMoKSBJbml0Q29tbW9uQ29udHJvbHMKLSMgMTggcGFzY2FsMTYgQ3JlYXRlU3RhdHVzV2luZG93KHdvcmQgcHRyIHdvcmQgd29yZCkgQ3JlYXRlU3RhdHVzV2luZG93MTYKLSAxOCBzdHViIENyZWF0ZVN0YXR1c1dpbmRvdwotIDE5IHN0ZGNhbGwgQ3JlYXRlU3RhdHVzV2luZG93Vyhsb25nIHB0ciBsb25nIGxvbmcpIENyZWF0ZVN0YXR1c1dpbmRvdzMyVwotIDIwIHN0dWIgQ3JlYXRlVG9vbGJhckV4Ci0gMjEgc3R1YiBEZXN0cm95UHJvcGVydHlTaGVldFBhZ2UKLSAyMiBzdHViIERsbEdldFZlcnNpb24KLSMgMjMgcGFzY2FsMTYgRHJhd1N0YXR1c1RleHQod29yZCBwdHIgcHRyIHdvcmQpIERyYXdTdGF0dXNUZXh0MTYKLSAyMyBzdHViIERyYXdTdGF0dXNUZXh0Ci0gMjQgc3RkY2FsbCBEcmF3U3RhdHVzVGV4dFcobG9uZyBwdHIgcHRyIGxvbmcpIERyYXdTdGF0dXNUZXh0MzJXCi0gMjUgc3RkY2FsbCBJbWFnZUxpc3RfQWRkKHB0ciBsb25nIGxvbmcpIEltYWdlTGlzdF9BZGQKLSAyNiBzdHViIEltYWdlTGlzdF9BZGRJY29uCi0gMjcgc3RkY2FsbCBJbWFnZUxpc3RfQWRkTWFza2VkKHB0ciBsb25nIGxvbmcpIEltYWdlTGlzdF9BZGRNYXNrZWQKLSAyOCBzdHViIEltYWdlTGlzdF9CZWdpbkRyYWcKLSAyOSBzdHViIEltYWdlTGlzdF9Db3B5Ci0gMzAgc3RkY2FsbCBJbWFnZUxpc3RfQ3JlYXRlKGxvbmcgbG9uZyBsb25nIGxvbmcgbG9uZykgSW1hZ2VMaXN0X0NyZWF0ZQotIDMxIHN0ZGNhbGwgSW1hZ2VMaXN0X0Rlc3Ryb3kocHRyKSBJbWFnZUxpc3RfRGVzdHJveQotIDMyIHN0dWIgSW1hZ2VMaXN0X0RyYWdFbnRlcgotIDMzIHN0dWIgSW1hZ2VMaXN0X0RyYWdMZWF2ZQotIDM0IHN0dWIgSW1hZ2VMaXN0X0RyYWdNb3ZlCi0gMzUgc3R1YiBJbWFnZUxpc3RfRHJhZ1Nob3dOb2xvY2sKLSAzNiBzdGRjYWxsIEltYWdlTGlzdF9EcmF3KHB0ciBsb25nIGxvbmcgbG9uZyBsb25nIGxvbmcpIEltYWdlTGlzdF9EcmF3Ci0gMzcgc3R1YiBJbWFnZUxpc3RfRHJhd0V4Ci0gMzggc3R1YiBJbWFnZUxpc3RfRW5kRHJhZwotIDM5IHN0ZGNhbGwgSW1hZ2VMaXN0X0dldEJrQ29sb3IocHRyKSBJbWFnZUxpc3RfR2V0QmtDb2xvcgotIDQwIHN0dWIgSW1hZ2VMaXN0X0dldERyYWdJbWFnZQotIDQxIHN0dWIgSW1hZ2VMaXN0X0dldEljb24KLSA0MiBzdGRjYWxsIEltYWdlTGlzdF9HZXRJY29uU2l6ZShwdHIgcHRyIHB0cikgSW1hZ2VMaXN0X0dldEljb25TaXplCi0gNDMgc3RkY2FsbCBJbWFnZUxpc3RfR2V0SW1hZ2VDb3VudChwdHIpIEltYWdlTGlzdF9HZXRJbWFnZUNvdW50Ci0gNDQgc3RkY2FsbCBJbWFnZUxpc3RfR2V0SW1hZ2VJbmZvKHB0ciBsb25nIHB0cikgSW1hZ2VMaXN0X0dldEltYWdlSW5mbwotIDQ1IHN0dWIgSW1hZ2VMaXN0X0dldEltYWdlUmVjdAotIDQ2IHN0dWIgSW1hZ2VMaXN0X0xvYWRJbWFnZQotIDQ3IHN0ZGNhbGwgSW1hZ2VMaXN0X0xvYWRJbWFnZUEobG9uZyBwdHIgbG9uZyBsb25nIGxvbmcgbG9uZyBsb25nKSBJbWFnZUxpc3RfTG9hZEltYWdlMzJBCi0gNDggc3RkY2FsbCBJbWFnZUxpc3RfTG9hZEltYWdlVyhsb25nIHB0ciBsb25nIGxvbmcgbG9uZyBsb25nIGxvbmcpIEltYWdlTGlzdF9Mb2FkSW1hZ2UzMlcKLSA0OSBzdGRjYWxsIEltYWdlTGlzdF9NZXJnZShwdHIgbG9uZyBwdHIgbG9uZyBsb25nIGxvbmcpIEltYWdlTGlzdF9NZXJnZQotIDUwIHN0dWIgSW1hZ2VMaXN0X1JlYWQKLSA1MSBzdHViIEltYWdlTGlzdF9SZW1vdmUKLSA1MiBzdGRjYWxsIEltYWdlTGlzdF9SZXBsYWNlKHB0ciBsb25nIGxvbmcgbG9uZykgSW1hZ2VMaXN0X1JlcGxhY2UKLSA1MyBzdGRjYWxsIEltYWdlTGlzdF9SZXBsYWNlSWNvbihwdHIgbG9uZyBsb25nKSBJbWFnZUxpc3RfUmVwbGFjZUljb24KLSA1NCBzdGRjYWxsIEltYWdlTGlzdF9TZXRCa0NvbG9yKHB0ciBsb25nKSBJbWFnZUxpc3RfU2V0QmtDb2xvcgotIDU1IHN0dWIgSW1hZ2VMaXN0X1NldERyYWdDdXJzb3JJbWFnZQotIDU2IHN0dWIgSW1hZ2VMaXN0X1NldEZpbHRlcgotIDU3IHN0dWIgSW1hZ2VMaXN0X1NldEljb25TaXplCi0gNTggc3R1YiBJbWFnZUxpc3RfU2V0SW1hZ2VDb3VudAotIDU5IHN0ZGNhbGwgSW1hZ2VMaXN0X1NldE92ZXJsYXlJbWFnZShwdHIgbG9uZyBsb25nKSBJbWFnZUxpc3RfU2V0T3ZlcmxheUltYWdlCi0gNjAgc3R1YiBJbWFnZUxpc3RfV3JpdGUKLSA2MSBzdHViIEluaXRDb21tb25Db250cm9sc0V4Ci0gNjIgc3R1YiBQcm9wZXJ0eVNoZWV0Ci0gNjMgc3R1YiBQcm9wZXJ0eVNoZWV0QQotIDY0IHN0dWIgUHJvcGVydHlTaGVldFcKLSA2NSBzdHViIF9UcmFja01vdXNlRXZlbnQKKyAxOCBzdHViIENyZWF0ZVByb3BlcnR5U2hlZXRQYWdlCisgMTkgc3R1YiBDcmVhdGVQcm9wZXJ0eVNoZWV0UGFnZUEKKyAyMCBzdHViIENyZWF0ZVByb3BlcnR5U2hlZXRQYWdlVworIyAyMSBwYXNjYWwxNiBDcmVhdGVTdGF0dXNXaW5kb3cod29yZCBwdHIgd29yZCB3b3JkKSBDcmVhdGVTdGF0dXNXaW5kb3cxNgorIDIxIHN0dWIgQ3JlYXRlU3RhdHVzV2luZG93CisgMjIgc3RkY2FsbCBDcmVhdGVTdGF0dXNXaW5kb3dXKGxvbmcgcHRyIGxvbmcgbG9uZykgQ3JlYXRlU3RhdHVzV2luZG93MzJXCisgMjMgc3R1YiBDcmVhdGVUb29sYmFyRXgKKyAyNCBzdHViIERlc3Ryb3lQcm9wZXJ0eVNoZWV0UGFnZQorIDI1IHN0dWIgRGxsR2V0VmVyc2lvbgorIDI2IHN0dWIgRGxsSW5zdGFsbAorIyAyNyBwYXNjYWwxNiBEcmF3U3RhdHVzVGV4dCh3b3JkIHB0ciBwdHIgd29yZCkgRHJhd1N0YXR1c1RleHQxNgorIDI3IHN0dWIgRHJhd1N0YXR1c1RleHQKKyAyOCBzdGRjYWxsIERyYXdTdGF0dXNUZXh0Vyhsb25nIHB0ciBwdHIgbG9uZykgRHJhd1N0YXR1c1RleHQzMlcKKyAyOSBzdHViIEZsYXRTQl9FbmFibGVTY3JvbGxCYXIKKyAzMCBzdHViIEZsYXRTQl9HZXRTY3JvbGxJbmZvCisgMzEgc3R1YiBGbGF0U0JfR2V0U2Nyb2xsUG9zCisgMzIgc3R1YiBGbGF0U0JfR2V0U2Nyb2xsUHJvcAorIDMzIHN0dWIgRmxhdFNCX0dldFNjcm9sbFJhbmdlCisgMzQgc3R1YiBGbGF0U0JfU2V0U2Nyb2xsSW5mbworIDM1IHN0dWIgRmxhdFNCX1NldFNjcm9sbFBvcworIDM2IHN0dWIgRmxhdFNCX1NldFNjcm9sbFByb3AKKyAzNyBzdHViIEZsYXRTQl9TZXRTY3JvbGxSYW5nZQorIDM4IHN0dWIgRmxhdFNCX1Nob3dTY3JvbGxCYXIKKyAzOSBzdGRjYWxsIEltYWdlTGlzdF9BZGQocHRyIGxvbmcgbG9uZykgSW1hZ2VMaXN0X0FkZAorIDQwIHN0dWIgSW1hZ2VMaXN0X0FkZEljb24KKyA0MSBzdGRjYWxsIEltYWdlTGlzdF9BZGRNYXNrZWQocHRyIGxvbmcgbG9uZykgSW1hZ2VMaXN0X0FkZE1hc2tlZAorIDQyIHN0ZGNhbGwgSW1hZ2VMaXN0X0JlZ2luRHJhZyhwdHIgbG9uZyBsb25nIGxvbmcpIEltYWdlTGlzdF9CZWdpbkRyYWcKKyA0MyBzdGRjYWxsIEltYWdlTGlzdF9Db3B5KHB0ciBsb25nIHB0ciBsb25nIGxvbmcpIEltYWdlTGlzdF9Db3B5CisgNDQgc3RkY2FsbCBJbWFnZUxpc3RfQ3JlYXRlKGxvbmcgbG9uZyBsb25nIGxvbmcgbG9uZykgSW1hZ2VMaXN0X0NyZWF0ZQorIDQ1IHN0ZGNhbGwgSW1hZ2VMaXN0X0Rlc3Ryb3kocHRyKSBJbWFnZUxpc3RfRGVzdHJveQorIDQ2IHN0ZGNhbGwgSW1hZ2VMaXN0X0RyYWdFbnRlcihsb25nIGxvbmcgbG9uZykgSW1hZ2VMaXN0X0RyYWdFbnRlcgorIDQ3IHN0ZGNhbGwgSW1hZ2VMaXN0X0RyYWdMZWF2ZShsb25nKSBJbWFnZUxpc3RfRHJhZ0xlYXZlCisgNDggc3RkY2FsbCBJbWFnZUxpc3RfRHJhZ01vdmUobG9uZyBsb25nKSBJbWFnZUxpc3RfRHJhZ01vdmUKKyA0OSBzdGRjYWxsIEltYWdlTGlzdF9EcmFnU2hvd05vbG9jayhsb25nKSBJbWFnZUxpc3RfRHJhZ1Nob3dOb2xvY2sKKyA1MCBzdGRjYWxsIEltYWdlTGlzdF9EcmF3KHB0ciBsb25nIGxvbmcgbG9uZyBsb25nIGxvbmcpIEltYWdlTGlzdF9EcmF3CisgNTEgc3RkY2FsbCBJbWFnZUxpc3RfRHJhd0V4KHB0ciBsb25nIGxvbmcgbG9uZyBsb25nIGxvbmcgbG9uZyBsb25nIGxvbmcgbG9uZykgSW1hZ2VMaXN0X0RyYXdFeAorIDUyIHN0ZGNhbGwgSW1hZ2VMaXN0X0RyYXdJbmRpcmVjdChwdHIpIEltYWdlTGlzdF9EcmF3SW5kaXJlY3QKKyA1MyBzdGRjYWxsIEltYWdlTGlzdF9EdXBsaWNhdGUocHRyKSBJbWFnZUxpc3RfRHVwbGljYXRlCisgNTQgc3RkY2FsbCBJbWFnZUxpc3RfRW5kRHJhZygpIEltYWdlTGlzdF9FbmREcmFnIAorIDU1IHN0ZGNhbGwgSW1hZ2VMaXN0X0dldEJrQ29sb3IocHRyKSBJbWFnZUxpc3RfR2V0QmtDb2xvcgorIDU2IHN0ZGNhbGwgSW1hZ2VMaXN0X0dldERyYWdJbWFnZShwdHIgcHRyKSBJbWFnZUxpc3RfR2V0RHJhZ0ltYWdlCisgNTcgc3RkY2FsbCBJbWFnZUxpc3RfR2V0SWNvbihwdHIgbG9uZyBsb25nKSBJbWFnZUxpc3RfR2V0SWNvbgorIDU4IHN0ZGNhbGwgSW1hZ2VMaXN0X0dldEljb25TaXplKHB0ciBwdHIgcHRyKSBJbWFnZUxpc3RfR2V0SWNvblNpemUKKyA1OSBzdGRjYWxsIEltYWdlTGlzdF9HZXRJbWFnZUNvdW50KHB0cikgSW1hZ2VMaXN0X0dldEltYWdlQ291bnQKKyA2MCBzdGRjYWxsIEltYWdlTGlzdF9HZXRJbWFnZUluZm8ocHRyIGxvbmcgcHRyKSBJbWFnZUxpc3RfR2V0SW1hZ2VJbmZvCisgNjEgc3RkY2FsbCBJbWFnZUxpc3RfR2V0SW1hZ2VSZWN0KHB0ciBsb25nIHB0cikgSW1hZ2VMaXN0X0dldEltYWdlUmVjdAorIDYyIHN0dWIgSW1hZ2VMaXN0X0xvYWRJbWFnZQorIDYzIHN0ZGNhbGwgSW1hZ2VMaXN0X0xvYWRJbWFnZUEobG9uZyBwdHIgbG9uZyBsb25nIGxvbmcgbG9uZyBsb25nKSBJbWFnZUxpc3RfTG9hZEltYWdlMzJBCisgNjQgc3RkY2FsbCBJbWFnZUxpc3RfTG9hZEltYWdlVyhsb25nIHB0ciBsb25nIGxvbmcgbG9uZyBsb25nIGxvbmcpIEltYWdlTGlzdF9Mb2FkSW1hZ2UzMlcKKyA2NSBzdGRjYWxsIEltYWdlTGlzdF9NZXJnZShwdHIgbG9uZyBwdHIgbG9uZyBsb25nIGxvbmcpIEltYWdlTGlzdF9NZXJnZQorIDY2IHN0dWIgSW1hZ2VMaXN0X1JlYWQKKyA2NyBzdGRjYWxsIEltYWdlTGlzdF9SZW1vdmUocHRyIGxvbmcpIEltYWdlTGlzdF9SZW1vdmUKKyA2OCBzdGRjYWxsIEltYWdlTGlzdF9SZXBsYWNlKHB0ciBsb25nIGxvbmcgbG9uZykgSW1hZ2VMaXN0X1JlcGxhY2UKKyA2OSBzdGRjYWxsIEltYWdlTGlzdF9SZXBsYWNlSWNvbihwdHIgbG9uZyBsb25nKSBJbWFnZUxpc3RfUmVwbGFjZUljb24KKyA3MCBzdGRjYWxsIEltYWdlTGlzdF9TZXRCa0NvbG9yKHB0ciBsb25nKSBJbWFnZUxpc3RfU2V0QmtDb2xvcgorIyA3MQorIyA3MgorIyA3MworIyA3NCBzdHViIEdldFNpemUgIyAxIHBhcmFtZXRlcgorIDc1IHN0ZGNhbGwgSW1hZ2VMaXN0X1NldERyYWdDdXJzb3JJbWFnZShwdHIgbG9uZyBsb25nIGxvbmcpIEltYWdlTGlzdF9TZXREcmFnQ3Vyc29ySW1hZ2UKKyA3NiBzdHViIEltYWdlTGlzdF9TZXRGaWx0ZXIKKyA3NyBzdGRjYWxsIEltYWdlTGlzdF9TZXRJY29uU2l6ZShwdHIgbG9uZyBsb25nKSBJbWFnZUxpc3RfU2V0SWNvblNpemUKKyA3OCBzdGRjYWxsIEltYWdlTGlzdF9TZXRJbWFnZUNvdW50KHB0ciBsb25nKSBJbWFnZUxpc3RfU2V0SW1hZ2VDb3VudAorIDc5IHN0ZGNhbGwgSW1hZ2VMaXN0X1NldE92ZXJsYXlJbWFnZShwdHIgbG9uZyBsb25nKSBJbWFnZUxpc3RfU2V0T3ZlcmxheUltYWdlCisgODAgc3R1YiBJbWFnZUxpc3RfV3JpdGUKKyA4MSBzdHViIEluaXRDb21tb25Db250cm9sc0V4CisgODIgc3R1YiBJbml0aWFsaXplRmxhdFNCCisgODMgc3R1YiBQcm9wZXJ0eVNoZWV0CisgODQgc3R1YiBQcm9wZXJ0eVNoZWV0QQorIDg1IHN0dWIgUHJvcGVydHlTaGVldFcKKyA4NiBzdHViIFVuaW5pdGlhbGl6ZUZsYXRTQgorIDg3IHN0dWIgX1RyYWNrTW91c2VFdmVudAorCisjMTUxCisjMTUyIHN0dWIgRnJlZU1SVUxpc3QgICMgMSBwYXJhbWV0ZXIKKyMxNTMKKyMxNTQKKyMxNTUgc3R1YiBGaW5kTVJVU3RyaW5nQSAgIyAzIHBhcmFtZXRlcnMKKyMxNTYKKyMxNTcKKyMxNjMKKyMxNjQKKyMxNjcKKyMxNjkgc3R1YiBGaW5kTVJVRGF0YQorIzIzMyAtIDIzNgorCisjMzIwCisjMzIxCisjMzIyCisjMzIzCisjMzI0CisjMzI1CisjMzI2CisjMzI3CisjMzI4CisjMzI5IHN0dWIgRFBBX0NyZWF0ZQorIzMzMCBzdHViIERQQV9EZXN0cm95CisjMzMxCisjMzMyIHN0dWIgRFBBX0dldFB0cgorIzMzMworIzMzNCBzdHViIERQQV9JbnNlcnRQdHIKKyMzMzUKKyMzMzYgc3R1YiBEUEFfRGVsZXRlUHRyCisjMzM3CisjMzM4CisjMzM5IHN0dWIgRFBBX1NlYXJjaAorIzM0MAorIzM0MQorIzM0MgorCisjMzUwIHN0dWIgU3RyQ2hyQQorIzM1MQorIzM1MiBzdHViIFN0ckNtcEEKKyMzNTMKKyMzNTQgc3R1YiBTdHJTdHJBCisjMzU1CisjMzU2CisjMzU3IHN0dWIgU3RyVG9JbnRBCisjMzU4IC0gMzY5CisKKyMzNzIgLSAzNzUKKyMzNzYgc3R1YiBJbnRsU3RyRXFXb3JrZXJBCisjMzc3IHN0dWIgSW50bFN0ckVxV29ya2VyVworIzM4MgorIzM4MyBzdHViIERvUmVhZGVyTW9kZQorIzM4NCAtIDM5MAorIzQwMCAtIDQwNAorIzQxMCAtIDQxMwpkaWZmIC0tZ2l0IGEvcmVsYXkzMi9nZGkzMi5zcGVjIGIvcmVsYXkzMi9nZGkzMi5zcGVjCmluZGV4IDFhYjRlNGIuLjUxYTU1Y2UgMTAwNjQ0Ci0tLSBhL3JlbGF5MzIvZ2RpMzIuc3BlYworKysgYi9yZWxheTMyL2dkaTMyLnNwZWMKQEAgLTE4LDcgKzE4LDcgQEAKICAxNCBzdGRjYWxsIENob3JkKGxvbmcgbG9uZyBsb25nIGxvbmcgbG9uZyBsb25nIGxvbmcgbG9uZyBsb25nKSBDaG9yZDMyCiAgMTUgc3RkY2FsbCBDbG9zZUVuaE1ldGFGaWxlKGxvbmcpIENsb3NlRW5oTWV0YUZpbGUzMgogIDE2IHN0ZGNhbGwgQ2xvc2VGaWd1cmUobG9uZykgQ2xvc2VGaWd1cmUzMgotIDE3IHN0dWIgQ2xvc2VNZXRhRmlsZQorIDE3IHN0ZGNhbGwgQ2xvc2VNZXRhRmlsZShsb25nKSBDbG9zZU1ldGFGaWxlMzIKICAxOCBzdHViIENvbG9yTWF0Y2hUb1RhcmdldAogIDE5IHN0ZGNhbGwgQ29tYmluZVJnbihsb25nIGxvbmcgbG9uZyBsb25nKSBDb21iaW5lUmduMzIKICAyMCBzdHViIENvbWJpbmVUcmFuc2Zvcm0KQEAgLTU0LDcgKzU0LDcgQEAKICA0OCBzdGRjYWxsIENyZWF0ZUhhdGNoQnJ1c2gobG9uZyBsb25nKSBDcmVhdGVIYXRjaEJydXNoMzIKICA0OSBzdGRjYWxsIENyZWF0ZUlDQShzdHIgc3RyIHN0ciBwdHIpIENyZWF0ZUlDMzJBCiAgNTAgc3RkY2FsbCBDcmVhdGVJQ1cod3N0ciB3c3RyIHdzdHIgcHRyKSBDcmVhdGVJQzMyVwotIDUxIHN0dWIgQ3JlYXRlTWV0YUZpbGVBCisgNTEgc3RkY2FsbCBDcmVhdGVNZXRhRmlsZUEoc3RyKSBDcmVhdGVNZXRhRmlsZTMyQQogIDUyIHN0dWIgQ3JlYXRlTWV0YUZpbGVXCiAgNTMgc3RkY2FsbCBDcmVhdGVQYWxldHRlKHB0cikgQ3JlYXRlUGFsZXR0ZTMyCiAgNTQgc3RkY2FsbCBDcmVhdGVQYXR0ZXJuQnJ1c2gobG9uZykgQ3JlYXRlUGF0dGVybkJydXNoMzIKQEAgLTczLDcgKzczLDcgQEAKICA2NiBzdHViIERlbGV0ZUNvbG9yU3BhY2UKICA2NyBzdGRjYWxsIERlbGV0ZURDKGxvbmcpIERlbGV0ZURDMzIKICA2OCBzdGRjYWxsIERlbGV0ZUVuaE1ldGFGaWxlKGxvbmcpIERlbGV0ZUVuaE1ldGFGaWxlMzIKLSA2OSBzdHViIERlbGV0ZU1ldGFGaWxlCisgNjkgc3RkY2FsbCBEZWxldGVNZXRhRmlsZShsb25nKSBEZWxldGVNZXRhRmlsZTMyCiAgNzAgc3RkY2FsbCBEZWxldGVPYmplY3QobG9uZykJRGVsZXRlT2JqZWN0MzIKICA3MSBzdHViIERlc2NyaWJlUGl4ZWxGb3JtYXQKICA3MiBzdHViIERldmljZUNhcGFiaWxpdGllc0V4QQpAQCAtMjcwLDcgKzI3MCw3IEBACiAyNjMgc3RkY2FsbCBQbGF5RW5oTWV0YUZpbGUobG9uZyBsb25nIHB0cikgUGxheUVuaE1ldGFGaWxlMzIKIDI2NCBzdGRjYWxsIFBsYXlFbmhNZXRhRmlsZVJlY29yZChsb25nIHB0ciBwdHIgbG9uZykgUGxheUVuaE1ldGFGaWxlUmVjb3JkMzIKIDI2NSBzdGRjYWxsIFBsYXlNZXRhRmlsZShsb25nIGxvbmcpIFBsYXlNZXRhRmlsZTMyCi0yNjYgc3R1YiBQbGF5TWV0YUZpbGVSZWNvcmQKKzI2NiBzdGRjYWxsIFBsYXlNZXRhRmlsZVJlY29yZChsb25nIHB0ciBwdHIgbG9uZykgUGxheU1ldGFGaWxlUmVjb3JkMzIKIDI2NyBzdHViIFBsZ0JsdAogMjY4IHN0dWIgUG9seUJlemllcgogMjY5IHN0dWIgUG9seUJlemllclRvCkBAIC0zMjgsNyArMzI4LDcgQEAKIDMyMCBzdHViIFNldElDTVByb2ZpbGVXCiAzMjEgc3RkY2FsbCBTZXRNYXBNb2RlKGxvbmcgbG9uZykgU2V0TWFwTW9kZTMyCiAzMjIgc3RkY2FsbCBTZXRNYXBwZXJGbGFncyhsb25nIGxvbmcpIFNldE1hcHBlckZsYWdzMzIKLTMyMyBzdHViIFNldE1ldGFGaWxlQml0c0V4CiszMjMgc3RkY2FsbCBTZXRNZXRhRmlsZUJpdHNFeChsb25nIHB0cikgU2V0TWV0YUZpbGVCaXRzRXgKIDMyNCBzdHViIFNldE1ldGFSZ24KIDMyNSBzdHViIFNldE1pdGVyTGltaXQKIDMyNiBzdGRjYWxsIFNldFBhbGV0dGVFbnRyaWVzKGxvbmcgbG9uZyBsb25nIHB0cikgU2V0UGFsZXR0ZUVudHJpZXMzMgpkaWZmIC0tZ2l0IGEvcmVsYXkzMi9rZXJuZWwzMi5zcGVjIGIvcmVsYXkzMi9rZXJuZWwzMi5zcGVjCmluZGV4IDllMWNmOTIuLjhiMGYxYjMgMTAwNjQ0Ci0tLSBhL3JlbGF5MzIva2VybmVsMzIuc3BlYworKysgYi9yZWxheTMyL2tlcm5lbDMyLnNwZWMKQEAgLTE1Nyw4ICsxNTcsOCBAQAogMTY1IHN0dWIgQ3JlYXRlTWFpbHNsb3RXCiAxNjYgc3RkY2FsbCBDcmVhdGVNdXRleEEocHRyIGxvbmcgc3RyKSBDcmVhdGVNdXRleDMyQQogMTY3IHN0ZGNhbGwgQ3JlYXRlTXV0ZXhXKHB0ciBsb25nIHdzdHIpIENyZWF0ZU11dGV4MzJXCi0xNjggc3R1YiBDcmVhdGVOYW1lZFBpcGVBCi0xNjkgc3R1YiBDcmVhdGVOYW1lZFBpcGVXCisxNjggc3RkY2FsbCBDcmVhdGVOYW1lZFBpcGVBKHN0ciBsb25nIGxvbmcgbG9uZyBsb25nIGxvbmcgbG9uZyBwdHIpIENyZWF0ZU5hbWVkUGlwZUEKKzE2OSBzdGRjYWxsIENyZWF0ZU5hbWVkUGlwZVcod3N0ciBsb25nIGxvbmcgbG9uZyBsb25nIGxvbmcgbG9uZyBwdHIpIENyZWF0ZU5hbWVkUGlwZVcKIDE3MCBzdHViIENyZWF0ZVBpcGUKIDE3MSBzdGRjYWxsIENyZWF0ZVByb2Nlc3NBKHN0ciBzdHIgcHRyIHB0ciBsb25nIGxvbmcgcHRyIHN0ciBwdHIgcHRyKSBDcmVhdGVQcm9jZXNzMzJBCiAxNzIgc3RkY2FsbCBDcmVhdGVQcm9jZXNzVyh3c3RyIHdzdHIgcHRyIHB0ciBsb25nIGxvbmcgcHRyIHdzdHIgcHRyIHB0cikgQ3JlYXRlUHJvY2VzczMyVwpkaWZmIC0tZ2l0IGEvcmVsYXkzMi9vbGUzMi5zcGVjIGIvcmVsYXkzMi9vbGUzMi5zcGVjCmluZGV4IDlmY2QzYjMuLjczNTBjMTAgMTAwNjQ0Ci0tLSBhL3JlbGF5MzIvb2xlMzIuc3BlYworKysgYi9yZWxheTMyL29sZTMyLnNwZWMKQEAgLTE1Miw3ICsxNTIsNyBAQAogMTQ5IHN0dWIgU3RnT3BlblN0b3JhZ2VPbklMb2NrQnl0ZXMKIDE1MCBzdHViIFN0Z1NldFRpbWVzCiAxNTEgc3RkY2FsbCBTdHJpbmdGcm9tQ0xTSUQocHRyIHB0cikgU3RyaW5nRnJvbUNMU0lEMzIKLTE1MiBzdHViIFN0cmluZ0Zyb21HVUlEMgorMTUyIHN0ZGNhbGwgU3RyaW5nRnJvbUdVSUQyKHB0ciBwdHIgbG9uZykgU3RyaW5nRnJvbUdVSUQyCiAxNTMgc3R1YiBTdHJpbmdGcm9tSUlECiAxNTQgc3R1YiBVdENvbnZlcnREdnRkMTZ0b0R2dGQzMgogMTU1IHN0dWIgVXRDb252ZXJ0RHZ0ZDMydG9EdnRkMTYKZGlmZiAtLWdpdCBhL3JlbGF5MzIvdXNlcjMyLnNwZWMgYi9yZWxheTMyL3VzZXIzMi5zcGVjCmluZGV4IGFjMzk5NDIuLjMzNDBkZDEgMTAwNjQ0Ci0tLSBhL3JlbGF5MzIvdXNlcjMyLnNwZWMKKysrIGIvcmVsYXkzMi91c2VyMzIuc3BlYwpAQCAtNTc5LDcgKzU3OSw3IEBACiA1NzQgc3R1YiBWa0tleVNjYW5FeEEKIDU3NSBzdHViIFZrS2V5U2NhbkV4VwogNTc2IHN0ZGNhbGwgVmtLZXlTY2FuVyhsb25nKSBWa0tleVNjYW4zMlcKLTU3NyBzdHViIFdhaXRGb3JJbnB1dElkbGUKKzU3NyBzdGRjYWxsIFdhaXRGb3JJbnB1dElkbGUobG9uZyBsb25nKSBXYWl0Rm9ySW5wdXRJZGxlCiA1Nzggc3RkY2FsbCBXYWl0TWVzc2FnZSgpIFdhaXRNZXNzYWdlCiA1Nzkgc3RkY2FsbCBXaW5IZWxwQShsb25nIHN0ciBsb25nIGxvbmcpIFdpbkhlbHAzMkEKIDU4MCBzdGRjYWxsIFdpbkhlbHBXKGxvbmcgd3N0ciBsb25nIGxvbmcpIFdpbkhlbHAzMlcKZGlmZiAtLWdpdCBhL3NjaGVkdWxlci90aHJlYWQuYyBiL3NjaGVkdWxlci90aHJlYWQuYwppbmRleCAzYTkyMDUyLi44Nzc0YjgzIDEwMDY0NAotLS0gYS9zY2hlZHVsZXIvdGhyZWFkLmMKKysrIGIvc2NoZWR1bGVyL3RocmVhZC5jCkBAIC01NTAsNyArNTUwLDcgQEAKICAqLwogQk9PTDMyIFdJTkFQSSBUZXJtaW5hdGVUaHJlYWQoSEFORExFMzIgaGFuZGxlLERXT1JEIGV4aXRjb2RlKQogewotICAgIGZwcmludGYoc3RkbmltcCwiVGVybWluYXRlVGhyZWFkKDB4JTA4eCwlbGQpLCBTVFVCIVxuIixoYW5kbGUsZXhpdGNvZGUpOworICAgIEZJWE1FKHRocmVhZCwiKDB4JTA4eCwlbGQpOiBTVFVCIVxuIixoYW5kbGUsZXhpdGNvZGUpOwogICAgIHJldHVybiBUUlVFOwogfQogCkBAIC01NzMsNyArNTczLDcgQEAKICAqLwogQk9PTDMyIFdJTkFQSSBSZXN1bWVUaHJlYWQoIEhBTkRMRTMyIGhhbmRsZSApCiB7Ci0gICAgZnByaW50ZihzdGRuaW1wLCJSZXN1bWVUaHJlYWQoMHglMDh4KSwgU1RVQiFcbiIsaGFuZGxlKTsKKyAgICBGSVhNRSh0aHJlYWQsIigweCUwOHgpOiBTVFVCIVxuIixoYW5kbGUpOwogICAgIHJldHVybiBUUlVFOwogfQogCkBAIC01ODIsNyArNTgyLDcgQEAKICAqLwogQk9PTDMyIFdJTkFQSSBTdXNwZW5kVGhyZWFkKCBIQU5ETEUzMiBoYW5kbGUgKQogewotICAgIGZwcmludGYoc3RkbmltcCwiU3VzcGVuZFRocmVhZCgweCUwOHgpLCBTVFVCIVxuIixoYW5kbGUpOworICAgIEZJWE1FKHRocmVhZCwiKDB4JTA4eCk6IFNUVUIhXG4iLGhhbmRsZSk7CiAgICAgcmV0dXJuIFRSVUU7CiB9CiAKZGlmZiAtLWdpdCBhL3dpbjMyL2FkdmFwaS5jIGIvd2luMzIvYWR2YXBpLmMKaW5kZXggNTBjYWU1My4uZDg0YTJmMSAxMDA2NDQKLS0tIGEvd2luMzIvYWR2YXBpLmMKKysrIGIvd2luMzIvYWR2YXBpLmMKQEAgLTE4LDEwICsxOCw3IEBACiAgKi8KIEJPT0wzMiBXSU5BUEkgU3RhcnRTZXJ2aWNlQ3RybERpc3BhdGNoZXIzMkEoTFBTRVJWSUNFX1RBQkxFX0VOVFJZMzJBIHNlcnZlbnQpCiB7Ci0JZnByaW50ZihzdGRlcnIsIlN0YXJ0U2VydmljZUN0cmxEaXNwYXRjaGVyQSglcCAoJXMpKSwgU1RVQi5cbiIsCi0JCXNlcnZlbnQsCi0JCXNlcnZlbnQtPmxwU2VydmljZU5hbWUKLQkpOworCUZJWE1FKGFkdmFwaSwiKCVwICclcycpOiBTVFVCLlxuIixzZXJ2ZW50LHNlcnZlbnQtPmxwU2VydmljZU5hbWUpOwogCXJldHVybiBUUlVFOwogfQogCkBAIC0zMywxMCArMzAsNyBAQAogCWNoYXIJYnVmZmVyWzIwMF07CiAKIAlsc3RyY3B5bld0b0EoYnVmZmVyLHNlcnZlbnQtPmxwU2VydmljZU5hbWUsMjAwKTsKLQlmcHJpbnRmKHN0ZGVyciwiU3RhcnRTZXJ2aWNlQ3RybERpc3BhdGNoZXJBKCVwICglcykpLCBTVFVCLlxuIiwKLQkJc2VydmVudCwKLQkJYnVmZmVyCi0JKTsKKwlGSVhNRShhZHZhcGksIiglcCAnJXMnKTogU1RVQi5cbiIsc2VydmVudCxidWZmZXIpOwogCXJldHVybiBUUlVFOwogfQogCkBAIC00Nyw5ICs0MSw3IEBACiBCT09MMzIgV0lOQVBJIE9wZW5Qcm9jZXNzVG9rZW4oSEFORExFMzIgcHJvY2VzcyxEV09SRCBkZXNpcmVkYWNjZXNzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEhBTkRMRTMyICp0aGFuZGxlKQogewotCWZwcmludGYoc3RkbmltcCwiT3BlblByb2Nlc3NUb2tlbiglMDh4LCUwOGx4LCVwKSxzdHViIVxuIiwKLQkJcHJvY2VzcyxkZXNpcmVkYWNjZXNzLHRoYW5kbGUKLQkpOworCUZJWE1FKGFkdmFwaSwiKCUwOHgsJTA4bHgsJXApOnN0dWIhXG4iLHByb2Nlc3MsZGVzaXJlZGFjY2Vzcyx0aGFuZGxlKTsKIAlyZXR1cm4gVFJVRTsKIH0KIApAQCAtNTksOSArNTEsOCBAQAogQk9PTDMyIFdJTkFQSSBPcGVuVGhyZWFkVG9rZW4oIEhBTkRMRTMyIHRocmVhZCxEV09SRCBkZXNpcmVkYWNjZXNzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJPT0wzMiBvcGVuYXNzZWxmLEhBTkRMRTMyICp0aGFuZGxlICkKIHsKLQlmcHJpbnRmKHN0ZG5pbXAsIk9wZW5UaHJlYWRUb2tlbiglMDh4LCUwOGx4LCVkLCVwKSxzdHViIVxuIiwKLQkJdGhyZWFkLGRlc2lyZWRhY2Nlc3Msb3BlbmFzc2VsZix0aGFuZGxlCi0JKTsKKwlGSVhNRShhZHZhcGksIiglMDh4LCUwOGx4LCVkLCVwKTogc3R1YiFcbiIsCisJICAgICAgdGhyZWFkLGRlc2lyZWRhY2Nlc3Msb3BlbmFzc2VsZix0aGFuZGxlKTsKIAlyZXR1cm4gVFJVRTsKIH0KIApAQCAtNzAsOSArNjEsNyBAQAogICovCiBCT09MMzIgV0lOQVBJIExvb2t1cFByaXZpbGVnZVZhbHVlMzJBKExQQ1NUUiBzeXN0ZW0sTFBDU1RSIG5hbWUsTFBWT0lEIGJsYSkKIHsKLQlmcHJpbnRmKHN0ZG5pbXAsIkxvb2t1cFByaXZpbGVnZVZhbHVlMzJBKCVzLCVzLCVwKSxzdHViXG4iLAotCQlzeXN0ZW0sbmFtZSxibGEKLQkpOworCUZJWE1FKGFkdmFwaSwiKCVzLCVzLCVwKTogc3R1YlxuIixzeXN0ZW0sbmFtZSxibGEpOwogCXJldHVybiBUUlVFOwogfQogCkBAIC05MywxNiArODIsMTUgQEAKIAlIQU5ETEUzMiB0b2tlbiwvKlRPS0VOX0lORk9STUFUSU9OX0NMQVNTKi8gRFdPUkQgdG9rZW5pbmZvY2xhc3MsTFBWT0lEIHRva2VuaW5mbywKIAlEV09SRCB0b2tlbmluZm9sZW5ndGgsTFBEV09SRCByZXRsZW4KICkgewotCWZwcmludGYoc3RkZXJyLCJHZXRUb2tlbkluZm9ybWF0aW9uKCUwOHgsJWxkLCVwLCVsZCwlcClcbiIsCi0JCXRva2VuLHRva2VuaW5mb2NsYXNzLHRva2VuaW5mbyx0b2tlbmluZm9sZW5ndGgscmV0bGVuCi0JKTsKKwlGSVhNRShhZHZhcGksIiglMDh4LCVsZCwlcCwlbGQsJXApOiBzdHViXG4iLAorCSAgICAgIHRva2VuLHRva2VuaW5mb2NsYXNzLHRva2VuaW5mbyx0b2tlbmluZm9sZW5ndGgscmV0bGVuKTsKIAlyZXR1cm4gVFJVRTsKIH0KIAogLypTQ19IQU5ETEUqLwogRFdPUkQgV0lOQVBJIE9wZW5TQ01hbmFnZXJBKExQQ1NUUiBtYWNoaW5lLExQQ1NUUiBkYm5hbWUsRFdPUkQgZGVzaXJlZGFjY2VzcykKIHsKLQlmcHJpbnRmKHN0ZGVyciwiT3BlblNDTWFuYWdlckEoJXMsJXMsJTA4bHgpXG4iLG1hY2hpbmUsZGJuYW1lLGRlc2lyZWRhY2Nlc3MpOworCUZJWE1FKGFkdmFwaSwiKCVzLCVzLCUwOGx4KTogc3R1YlxuIixtYWNoaW5lLGRibmFtZSxkZXNpcmVkYWNjZXNzKTsKIAlyZXR1cm4gMDsKIH0KIApAQCAtMTEwLDcgKzk4LDcgQEAKIHsKIAlMUFNUUgltYWNoaW5lQSA9IEhFQVBfc3RyZHVwV3RvQShHZXRQcm9jZXNzSGVhcCgpLDAsbWFjaGluZSk7CiAJTFBTVFIJZGJuYW1lQSA9IEhFQVBfc3RyZHVwV3RvQShHZXRQcm9jZXNzSGVhcCgpLDAsZGJuYW1lKTsKLQlmcHJpbnRmKHN0ZGVyciwiT3BlblNDTWFuYWdlclcoJXMsJXMsJTA4bHgpXG4iLG1hY2hpbmVBLGRibmFtZUEsZGVzaXJlZGFjY2Vzcyk7CisJRklYTUUoYWR2YXBpLCIoJXMsJXMsJTA4bHgpOiBzdHViXG4iLG1hY2hpbmVBLGRibmFtZUEsZGVzaXJlZGFjY2Vzcyk7CiAJSGVhcEZyZWUoR2V0UHJvY2Vzc0hlYXAoKSwwLG1hY2hpbmVBKTsKIAlIZWFwRnJlZShHZXRQcm9jZXNzSGVhcCgpLDAsZGJuYW1lQSk7CiAJcmV0dXJuIDA7CmRpZmYgLS1naXQgYS93aW4zMi9jb2RlX3BhZ2UuYyBiL3dpbjMyL2NvZGVfcGFnZS5jCmluZGV4IDZlZjMzMzUuLjA1ZTFhYzIgMTAwNjQ0Ci0tLSBhL3dpbjMyL2NvZGVfcGFnZS5jCisrKyBiL3dpbjMyL2NvZGVfcGFnZS5jCkBAIC0xMTgsMTAgKzExOCwxMCBAQAogICAgIGludCBlb3MgPSAwOwogICAgIGludCBkb250X2NvcHk9IChkc3RsZW49PTApOwogICAgIGlmIChwYWdlIT1HZXRBQ1AoKSAmJiBwYWdlIT1DUF9PRU1DUCAmJiBwYWdlIT1DUF9BQ1ApCi0JZnByaW50ZihzdGRuaW1wLCJDb252ZXJzaW9uIGluIENQICVkIG5vdCBzdXBwb3J0ZWRcbiIscGFnZSk7CisJRklYTUUod2luMzIsIkNvbnZlcnNpb24gaW4gQ1AgJWQgbm90IHN1cHBvcnRlZFxuIixwYWdlKTsKICNpZiAwCiAgICAgaWYgKGZsYWdzKQotCWZwcmludGYoc3RkbmltcCwiV2lkZUNoYXJUb011bHRpQnl0ZSBmbGFncyAlbHggbm90IHN1cHBvcnRlZFxuIixmbGFncyk7CisJRklYTUUod2luMzIsImZsYWdzICVseCBub3Qgc3VwcG9ydGVkXG4iLGZsYWdzKTsKICNlbmRpZgogICAgIGlmKHVzZWQpCiAJKnVzZWQ9MDsKQEAgLTIwNyw5ICsyMDcsNyBAQAogICovCiBCT09MMzIgV0lOQVBJIEVudW1TeXN0ZW1Db2RlUGFnZXMzMkEoQ09ERVBBR0VfRU5VTVBST0MzMkEgbHBmbkNvZGVQYWdlRW51bSxEV09SRCBmbGFncykKIHsKLQlUUkFDRSh3aW4zMiwiKCVwLCUwOGx4KVxuIiwKLQkJbHBmbkNvZGVQYWdlRW51bSxmbGFncwotCSk7CisJVFJBQ0Uod2luMzIsIiglcCwlMDhseClcbiIsbHBmbkNvZGVQYWdlRW51bSxmbGFncyk7CiAJbHBmbkNvZGVQYWdlRW51bSgiNDM3Iik7CiAJcmV0dXJuIFRSVUU7CiB9CkBAIC0yMjEsOCArMjE5LDcgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRFdPUkQgZmxhZ3MpCiB7CiAgICAgV0NIQVIJKmNwOwotICAgIFRSQUNFKHdpbjMyLCIoJXAsJTA4bHgpXG4iLAotICAgICAgICAgICAgICAgICAgbHBmbkNvZGVQYWdlRW51bSxmbGFncyApOworICAgIFRSQUNFKHdpbjMyLCIoJXAsJTA4bHgpXG4iLGxwZm5Db2RlUGFnZUVudW0sZmxhZ3MgKTsKIAogICAgIGNwID0gSEVBUF9zdHJkdXBBdG9XKCBHZXRQcm9jZXNzSGVhcCgpLCAwLCAiNDM3IiApOwogICAgIGxwZm5Db2RlUGFnZUVudW0oY3ApOwpkaWZmIC0tZ2l0IGEvd2luMzIvY29uc29sZS5jIGIvd2luMzIvY29uc29sZS5jCmluZGV4IDNiYmY5ZjYuLjZjMjcxOWIgMTAwNjQ0Ci0tLSBhL3dpbjMyL2NvbnNvbGUuYworKysgYi93aW4zMi9jb25zb2xlLmMKQEAgLTE2NCw3ICsxNjQsNyBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERXT1JEIGR3RmxhZ3MsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFBWT0lEIGxwU2NyZWVuQnVmZmVyRGF0YSkKIHsKLQlmcHJpbnRmKHN0ZGVyciwgIkNyZWF0ZUNvbnNvbGVTY3JlZW5CdWZmZXIoKTogc3R1YiAhXG4iKTsKKwlGSVhNRShjb25zb2xlLCAiKC4uLik6IHN0dWIgIVxuIik7CiAJcmV0dXJuIElOVkFMSURfSEFORExFX1ZBTFVFMzI7CiB9CiAKQEAgLTE5Myw3ICsxOTMsNyBAQAogICovCiBCT09MMzIgV0lOQVBJIFNldENvbnNvbGVBY3RpdmVTY3JlZW5CdWZmZXIoSEFORExFMzIgaENvbnNvbGVPdXRwdXQpCiB7Ci0JZnByaW50ZihzdGRlcnIsICJTZXRDb25zb2xlQWN0aXZlU2NyZWVuQnVmZmVyKCk6IHN0dWIgIVxuIik7CisJRklYTUUoY29uc29sZSwgIigleCk6IHN0dWIhXG4iLCBoQ29uc29sZU91dHB1dCk7CiAJcmV0dXJuIDA7CiB9CiAKQEAgLTI5NCw3ICsyOTQsNyBAQAogCQl0Y3NldGF0dHIoKnNsYXZlLCBUQ1NBRFJBSU4sICZ0ZXJtKTsKIAkJc3ByaW50ZihidWYsICItU3h4JWQiLCAqbWFzdGVyKTsKIAkJZXhlY2xwKCJ4dGVybSIsICJ4dGVybSIsIGJ1ZiwgTlVMTCk7Ci0JCWZwcmludGYoc3RkZXJyLCAiZXJyb3IgY3JlYXRpbmcgQWxsb2NDb25zb2xlIHh0ZXJtXG4iKTsKKwkJRVJSKGNvbnNvbGUsICJlcnJvciBjcmVhdGluZyBBbGxvY0NvbnNvbGUgeHRlcm1cbiIpOwogCQlleGl0KDEpOwogCX0KIApAQCAtMzEwLDcgKzMxMCw3IEBACiAJCQl1c2xlZXAoMTAwKTsKIAkJfQogCQlpZiAoaSA+IDEwMDAwKSB7Ci0JCQlmcHJpbnRmKHN0ZGVyciwgImNhbid0IHJlYWQgeHRlcm0gV0lEXG4iKTsKKwkJCVdBUk4oY29uc29sZSwgImNhbid0IHJlYWQgeHRlcm0gV0lEXG4iKTsKIAkJCWtpbGwoKnBpZCwgU0lHS0lMTCk7CiAJCQlyZXR1cm4gRkFMU0U7CiAJCX0KQEAgLTQ2MSwxMSArNDYxLDExIEBACiB9CiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogICAgICAgICAgICBTZXRDb25zb2xlTW9kZSAgIChLRVJORUwzMi4xODgpCisgKiAgICAgICAgICAgIFNldENvbnNvbGVNb2RlICAgKEtFUk5FTDMyLjYyOCkKICAqLwogQk9PTDMyIFdJTkFQSSBTZXRDb25zb2xlTW9kZShIQU5ETEUzMiBoY29uLERXT1JEIG1vZGUpCiB7Ci0JZnByaW50ZihzdGRuaW1wLCJTZXRDb25zb2xlTW9kZSglMDh4LCUwOGx4KVxuIixoY29uLG1vZGUpOworCUZJWE1FKGNvbnNvbGUsIiglMDh4LCUwOGx4KTogc3R1YlxuIixoY29uLG1vZGUpOwogCXJldHVybiBUUlVFOwogfQogCkBAIC00NzcsNyArNDc3LDcgQEAKIAlQREIzMiAqcGRiID0gUFJPQ0VTU19DdXJyZW50KCk7CiAJQ09OU09MRSAqY29uc29sZT0gKENPTlNPTEUgKilwZGItPmNvbnNvbGU7CiAKLQlpZihjb25zb2xlLT50aXRsZSkgCisJaWYoY29uc29sZSAmJiBjb25zb2xlLT50aXRsZSkgCiAJICB7CiAJICAgIGxzdHJjcHluMzJBKHRpdGxlLGNvbnNvbGUtPnRpdGxlLHNpemUpOwogCSAgICByZXR1cm4gc3RybGVuKHRpdGxlKTsKQEAgLTQ5Miw3ICs0OTIsNyBAQAogewogCVBEQjMyICpwZGIgPSBQUk9DRVNTX0N1cnJlbnQoKTsKIAlDT05TT0xFICpjb25zb2xlPSAoQ09OU09MRSAqKXBkYi0+Y29uc29sZTsKLQlpZihjb25zb2xlLT50aXRsZSkgCisJaWYoY29uc29sZSAmJiBjb25zb2xlLT50aXRsZSkgCiAJICB7CiAJICAgIGxzdHJjcHluQXRvVyh0aXRsZSxjb25zb2xlLT50aXRsZSxzaXplKTsKIAkgICAgcmV0dXJuIChsc3RybGVuMzJXKHRpdGxlKSk7CkBAIC02NjMsNyArNjYzLDcgQEAKICAqLwogQk9PTDMyIFdJTkFQSSBGbHVzaENvbnNvbGVJbnB1dEJ1ZmZlcihIQU5ETEUzMiBoQ29uc29sZUlucHV0KQogewotICAgIGZwcmludGYoc3RkZXJyLCJGbHVzaENvbnNvbGVJbnB1dEJ1ZmZlciglZClcbiIsaENvbnNvbGVJbnB1dCk7CisgICAgRklYTUUoY29uc29sZSwiKCVkKTogc3R1YlxuIixoQ29uc29sZUlucHV0KTsKICAgICByZXR1cm4gVFJVRTsKIH0KIApAQCAtNjk1LDcgKzY5NSw3IEBACiBCT09MMzIgV0lOQVBJIEdldE51bWJlck9mQ29uc29sZU1vdXNlQnV0dG9ucyhMUERXT1JEIG5yb2ZidXR0b25zKQogewogICAgICpucm9mYnV0dG9ucyA9IDI7Ci0gICAgZnByaW50ZihzdGRlcnIsIkdldE51bWJlck9mQ29uc29sZU1vdXNlQnV0dG9uczogU1RVQiByZXR1cm5pbmcgMlxuIik7CisgICAgRklYTUUoY29uc29sZSwiKCVwKTogU1RVQiByZXR1cm5pbmcgMlxuIiwgbnJvZmJ1dHRvbnMpOwogICAgIHJldHVybiBUUlVFOwogfQogCkBAIC03MTAsNyArNzEwLDcgQEAKICAgICBwaXJCdWZmZXIgPSBOVUxMOwogICAgIGNJblJlY29yZHMgPSAwOwogICAgICpscGNSZWFkID0gMDsKLSAgICBmcHJpbnRmKHN0ZGVyciwiUGVla0NvbnNvbGVJbnB1dDMyQTogU1RVQiByZXR1cm5pbmcgVFJVRVxuIik7CisgICAgRklYTUUoY29uc29sZSwiKC4uLik6IFNUVUIgcmV0dXJuaW5nIFRSVUVcbiIpOwogCXJldHVybiBUUlVFOwogfQogCkBAIC03MjUsNyArNzI1LDcgQEAKICAgICBwaXJCdWZmZXIgPSBOVUxMOwogICAgIGNJblJlY29yZHMgPSAwOwogICAgICpscGNSZWFkID0gMDsKLSAgICBmcHJpbnRmKHN0ZGVyciwiUGVla0NvbnNvbGVJbnB1dDMyVzogU1RVQiByZXR1cm5pbmcgVFJVRVxuIik7CisgICAgRklYTUUoY29uc29sZSwiKC4uLik6IFNUVUIgcmV0dXJuaW5nIFRSVUVcbiIpOwogICAgIHJldHVybiBUUlVFOwogfQogCkBAIC03MzYsNyArNzM2LDcgQEAKIHsKICAgY2luZm9bMF0gPSAxMDsgLyogMTAlIG9mIGNoYXJhY3RlciBib3ggaXMgY3Vyc29yLiAgKi8KICAgY2luZm9bMV0gPSBUUlVFOyAgLyogQ3Vyc29yIGlzIHZpc2libGUuICAqLwotICBmcHJpbnRmIChzdGRuaW1wLCAiR2V0Q29uc29sZUN1cnNvckluZm8zMiAtLSBTVFVCIVxuIik7CisgIEZJWE1FKGNvbnNvbGUsICIoJXgsJXApOiBTVFVCIVxuIiwgaGNvbiwgY2luZm8pOwogICByZXR1cm4gVFJVRTsKIH0KIApAQCAtNzQ1LDcgKzc0NSw3IEBACiAgKi8KIEJPT0wzMiBXSU5BUEkgU2V0Q29uc29sZUN1cnNvckluZm8zMihIQU5ETEUzMiBoY29uLCBMUERXT1JEIGNpbmZvKQogewotICBmcHJpbnRmIChzdGRuaW1wLCAiU2V0Q29uc29sZUN1cnNvckluZm8zMiAtLSBTVFVCIVxuIik7CisgIEZJWE1FKGNvbnNvbGUsICIoJSN4LCVwKTogU1RVQiFcbiIsIGhjb24sIGNpbmZvKTsKICAgcmV0dXJuIFRSVUU7CiB9CiAKQEAgLTc1NCw3ICs3NTQsNyBAQAogICovCiBCT09MMzIgV0lOQVBJIFNldENvbnNvbGVXaW5kb3dJbmZvMzIoSEFORExFMzIgaGNvbiwgQk9PTDMyIGZsYWcsIExQU01BTExfUkVDVCB3aW5kb3cpCiB7Ci0gIGZwcmludGYgKHN0ZG5pbXAsICJTZXRDb25zb2xlV2luZG93SW5mbzMyLS0gU1RVQiFcbiIpOworICBGSVhNRShjb25zb2xlLCAiKCV4LCVkLCVwKTogU1RVQiFcbiIsIGhjb24sIGZsYWcsIHdpbmRvdyk7CiAgIHJldHVybiBUUlVFOwogfQogCkBAIC03NjMsNyArNzYzLDcgQEAKICAqLwogQk9PTDMyIFdJTkFQSSBTZXRDb25zb2xlVGV4dEF0dHJpYnV0ZTMyKEhBTkRMRTMyIGhjb24sIERXT1JEIGF0dHJpYnV0ZXMpCiB7Ci0gIGZwcmludGYgKHN0ZG5pbXAsICJTZXRDb25zb2xlVGV4dEF0dHJpYnV0ZTMyLS0gU1RVQiFcbiIpOworICBGSVhNRShjb25zb2xlLCAiKCUjeCwlI2x4KTogU1RVQiFcbiIsIGhjb24sIGF0dHJpYnV0ZXMpOwogICByZXR1cm4gVFJVRTsKIH0KIApkaWZmIC0tZ2l0IGEvd2luMzIvZmlsZS5jIGIvd2luMzIvZmlsZS5jCmluZGV4IDg2YTk1M2UuLjAzZGZhM2UgMTAwNjQ0Ci0tLSBhL3dpbjMyL2ZpbGUuYworKysgYi93aW4zMi9maWxlLmMKQEAgLTc0LDcgKzc0LDcgQEAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICogICAgICAgICAgICAgIFJlYWRGaWxlRXggICAgICAgICAgICAgICAgKEtFUk5FTDMyLikKICAqLwotdHlwZWRlZiAvKiBmcm9tIHdpbmJhc2UuaCAqLwordHlwZWRlZgogVk9JRAogKFdJTkFQSSAqTFBPVkVSTEFQUEVEX0NPTVBMRVRJT05fUk9VVElORSkoCiAgICAgRFdPUkQgZHdFcnJvckNvZGUsCkBAIC04Nyw4ICs4Nyw4IEBACiAJCQkgTFBPVkVSTEFQUEVEX0NPTVBMRVRJT05fUk9VVElORSBscENvbXBsZXRpb25Sb3V0aW5lKQogewogCi0gICAgZnByaW50ZihzdGRuaW1wLCJSZWFkRmlsZUV4IGZpbGUgJWQgdG8gYnVmICVwIG51bSAlbGQgJXAgZnVuYyAlcCBzdHViXG4iLAotCSAgICBoRmlsZSwgbHBCdWZmZXIsIG51bXRvcmVhZCwgbHBPdmVybGFwcGVkLCBscENvbXBsZXRpb25Sb3V0aW5lKTsKKyAgICBGSVhNRShmaWxlLCAiZmlsZSAlZCB0byBidWYgJXAgbnVtICVsZCAlcCBmdW5jICVwIHN0dWJcbiIsCisJICBoRmlsZSwgbHBCdWZmZXIsIG51bXRvcmVhZCwgbHBPdmVybGFwcGVkLCBscENvbXBsZXRpb25Sb3V0aW5lKTsKICAgICBTZXRMYXN0RXJyb3IoRVJST1JfQ0FMTF9OT1RfSU1QTEVNRU5URUQpOwogICAgIHJldHVybiAwOwogfQpAQCAtMjI5LDggKzIyOSw4IEBACiAgICAgaWYgKGF0dHJpYnV0ZXMgJiBGSUxFX0FUVFJJQlVURV9OT1JNQUwpIHsKICAgICAgIGF0dHJpYnV0ZXMgJj0gfkZJTEVfQVRUUklCVVRFX05PUk1BTDsKICAgICAgIGlmIChhdHRyaWJ1dGVzKQotICAgICAgICBmcHJpbnRmKHN0ZG5pbXAsIlNldEZpbGVBdHRyaWJ1dGVzQSglcyk6JWx4IGlsbGVnYWwgY29tYmluYXRpb24gd2l0aCBGSUxFX0FUVFJJQlVURV9OT1JNQUwuXG4iLAotCQlscEZpbGVOYW1lLGF0dHJpYnV0ZXMpOworICAgICAgICBGSVhNRShmaWxlLCIoJXMpOiVseCBpbGxlZ2FsIGNvbWJpbmF0aW9uIHdpdGggRklMRV9BVFRSSUJVVEVfTk9STUFMLlxuIiwKKwkgICAgICBscEZpbGVOYW1lLGF0dHJpYnV0ZXMpOwogICAgIH0KICAgICBpZihzdGF0KGZ1bGxfbmFtZS5sb25nX25hbWUsJmJ1Zik9PS0xKQogICAgIHsKQEAgLTI0NCw3ICsyNDQsOCBAQAogICAgIH0KICAgICBhdHRyaWJ1dGVzICY9IH4oRklMRV9BVFRSSUJVVEVfQVJDSElWRXxGSUxFX0FUVFJJQlVURV9ISURERU58RklMRV9BVFRSSUJVVEVfU1lTVEVNKTsKICAgICBpZiAoYXR0cmlidXRlcykKLSAgICAgICAgZnByaW50ZihzdGRuaW1wLCJTZXRGaWxlQXR0cmlidXRlc0EoJXMpOiVseCBhdHRyaWJ1dGUocykgbm90IGltcGxlbWVudGVkLlxuIixscEZpbGVOYW1lLGF0dHJpYnV0ZXMpOworICAgICAgICBGSVhNRShmaWxlLCIoJXMpOiVseCBhdHRyaWJ1dGUocykgbm90IGltcGxlbWVudGVkLlxuIiwKKwkgICAgICBscEZpbGVOYW1lLGF0dHJpYnV0ZXMpOwogICAgIGlmICgtMT09Y2htb2QoZnVsbF9uYW1lLmxvbmdfbmFtZSxidWYuc3RfbW9kZSkpCiAgICAgewogICAgICAgICBTZXRMYXN0RXJyb3IoRXJybm9Ub0xhc3RFcnJvcihlcnJubykpOwpAQCAtMjcxLDcgKzI3Miw3IEBACiAgKi8KIFZPSUQgV0lOQVBJIFNldEZpbGVBcGlzVG9PRU0odm9pZCkKIHsKLSAgICAvKmZwcmludGYoc3RkbmltcCwiU2V0RmlsZUFwaXNUb09FTSgpLHN0dWIhXG4iKTsqLworICAvKkZJWE1FKGZpbGUsIigpOiBzdHViIVxuIik7Ki8KIH0KIAogCkBAIC0yODAsNyArMjgxLDcgQEAKICAqLwogVk9JRCBXSU5BUEkgU2V0RmlsZUFwaXNUb0FOU0kodm9pZCkKIHsKLSAgICAvKmZwcmludGYoc3RkbmltcCwiU2V0RmlsZUFwaXNUb0FOU0koKSxzdHViIVxuIik7Ki8KKyAgICAvKkZJWE1FKGZpbGUsIigpOiBzdHViIVxuIik7Ki8KIH0KIAogCkBAIC0yODksNyArMjkwLDcgQEAKICAqLwogQk9PTDMyIFdJTkFQSSBBcmVGaWxlQXBpc0FOU0kodm9pZCkKIHsKLSAgICBmcHJpbnRmKHN0ZG5pbXAsIkFyZUZpbGVBcGlzQU5TSSgpLHN0dWIhXG4iKTsKKyAgICBGSVhNRShmaWxlLCIoKTogc3R1YiFcbiIpOwogICAgIHJldHVybiBUUlVFOwogfQogCmRpZmYgLS1naXQgYS93aW4zMi9rZXJuZWwzMi5jIGIvd2luMzIva2VybmVsMzIuYwppbmRleCA3ZWVjYjIzLi5iZWFiZWU2IDEwMDY0NAotLS0gYS93aW4zMi9rZXJuZWwzMi5jCisrKyBiL3dpbjMyL2tlcm5lbDMyLmMKQEAgLTUwLDIwICs1MCwyNyBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKgkJCUZUX1Byb2xvZ1ByaW1lCQkJKEtFUk5FTDMyLjg5KQogICovCi12b2lkIFdJTkFQSSBGVF9Qcm9sb2dQcmltZShEV09SRCBzdGFydGluZCxMUEJZVEUgdGh1bmspIHsKK3ZvaWQgV0lOQVBJIEZUX1Byb2xvZ1ByaW1lKAorCURXT1JEIHN0YXJ0aW5kLAkJLyogW2luXSBzdGFydCBvZiB0aHVua3RhYmxlICovCisJTFBCWVRFIHRodW5rCQkvKiBbaW5dIHRodW5rIGNvZGVzdGFydCAqLworKSB7CiAJX3dyaXRlX2Z0cHJvbG9nKHRodW5rLCooRFdPUkQqKShzdGFydGluZCt0aHVuaykpOwogfQogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCV93cml0ZV9xdHRodW5rCQkJCQkoaW50ZXJuYWwpCiAgKiBHZW5lcmF0ZXMgYSBRVF9UaHVuayBzdHlsZSBjYWxsLgotICoJCisgKgogICogIDMzQzkgICAgICAgICAgICAgICAgICAgIHhvciBlY3gsIGVjeAogICogIDhBNERGQyAgICAgICAgICAgICAgICAgIG1vdiBjbCAsIFtlYnAtMDRdCiAgKiAgOEIxNDhEeHh4eHh4eHggICAgICAgICAgbW92IGVkeCwgWzQqZWN4ICsgKEVBWCtFRFgpXQogICogIEI4eXl5eXl5eXkgICAgICAgICAgICAgIG1vdiBlYXgsIFFUX1RodW5rCiAgKiAgRkZFMCAgICAgICAgICAgICAgICAgICAgam1wIGVheAogICovCi1zdGF0aWMgdm9pZCBfd3JpdGVfcXR0aHVuayhMUEJZVEUgc3RhcnQsRFdPUkQgdGh1bmtzdGFydCkgeworc3RhdGljIHZvaWQgX3dyaXRlX3F0dGh1bmsoCisJTFBCWVRFIHN0YXJ0LAkJLyogW2luXSBzdGFydCBvZiBRVF9UaHVuayBzdHViICovCisJRFdPUkQgdGh1bmtzdGFydAkvKiBbaW5dIHN0YXJ0IG9mIHRodW5rIChmb3IgaW5kZXggbG9va3VwKSAqLworKSB7CiAJTFBCWVRFCXg7CiAKIAl4CT0gc3RhcnQ7CkBAIC03NywxMCArODQsNiBAQAogCS8qIHNob3VsZCBmaWxsIHRoZSByZXN0IG9mIHRoZSAzMiBieXRlcyB3aXRoIDB4Q0MgKi8KIH0KIAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgkJVGh1bmtDb25uZWN0MzIJCShLRVJORUwzMikKLSAqIENvbm5lY3RzIGEgMzJiaXQgYW5kIGEgMTZiaXQgdGh1bmtidWZmZXIuCi0gKi8KIHN0cnVjdCB0aHVua3N0cnVjdAogewogCWNoYXIJbWFnaWNbNF07CkBAIC05NSwxMCArOTgsMTggQEAKIAlEV09SRAl4MjA7CiB9OwogCi1VSU5UMzIgV0lOQVBJIFRodW5rQ29ubmVjdDMyKCBzdHJ1Y3QgdGh1bmtzdHJ1Y3QgKnRocywgTFBTVFIgdGh1bmtmdW4xNiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExQU1RSIG1vZHVsZTE2LCBMUFNUUiBtb2R1bGUzMiwgSE1PRFVMRTMyIGhtb2QzMiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERXT1JEIGRsbGluaXRhcmcxICkKLXsKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoJCVRodW5rQ29ubmVjdDMyCQkoS0VSTkVMMzIpCisgKiBDb25uZWN0cyBhIDMyYml0IGFuZCBhIDE2Yml0IHRodW5rYnVmZmVyLgorICovCitVSU5UMzIgV0lOQVBJIFRodW5rQ29ubmVjdDMyKCAKKwlzdHJ1Y3QgdGh1bmtzdHJ1Y3QgKnRocywJLyogW2luL291dF0gdGh1bmtidWZmZXIgKi8KKwlMUENTVFIgdGh1bmtmdW4xNiwJCS8qIFtpbl0gd2luMTYgdGh1bmtmdW5jdGlvbiAqLworCUxQQ1NUUiBtb2R1bGUxNiwJCS8qIFtpbl0gbmFtZSBvZiB3aW4xNiBkbGwgKi8KKwlMUENTVFIgbW9kdWxlMzIsCQkvKiBbaW5dIG5hbWUgb2Ygd2luMzIgZGxsICovCisJSE1PRFVMRTMyIGhtb2QzMiwJCS8qIFtpbl0gaG1vZHVsZSBvZiB3aW4zMiBkbGwgKHVzZWQ/KSAqLworCURXT1JEIGRsbGluaXRhcmcxCQkvKiBbaW5dIGluaXRpYWxpc2F0aW9uIGFyZ3VtZW50ICovCispIHsKIAlISU5TVEFOQ0UxNglobW07CiAJU0VHUFRSCQl0aGtidWY7CiAJc3RydWN0CXRodW5rc3RydWN0CSp0aHMxNjsKQEAgLTE4Myw5ICsxOTQsMTQgQEAKIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqICAgICAgICAgICBXT1dDYWxsYmFjazE2IChLRVJORUwzMi42MikoV09XMzIuMikKKyAqIENhbGxzIGEgd2luMTYgZnVuY3Rpb24gd2l0aCBhIHNpbmdsZSBEV09SRCBhcmd1bWVudC4KKyAqIFJFVFVSTlMKKyAqCXRoZSByZXR1cm4gdmFsdWUKICAqLwotRFdPUkQgV0lOQVBJIFdPV0NhbGxiYWNrMTYoRkFSUFJPQzE2IGZwcm9jLERXT1JEIGFyZykKLXsKK0RXT1JEIFdJTkFQSSBXT1dDYWxsYmFjazE2KAorCUZBUlBST0MxNiBmcHJvYywJLyogW2luXSB3aW4xNiBmdW5jdGlvbiB0byBjYWxsICovCisJRFdPUkQgYXJnCQkvKiBbaW5dIHNpbmdsZSBEV09SRCBhcmd1bWVudCB0byBmdW5jdGlvbiAqLworKSB7CiAJRFdPUkQJcmV0OwogCVRSQUNFKHRodW5rLCIoJXAsMHglMDhseCkuLi5cbiIsZnByb2MsYXJnKTsKIAlyZXQgPSAgQ2FsbGJhY2tzLT5DYWxsV09XQ2FsbGJhY2tQcm9jKGZwcm9jLGFyZyk7CkBAIC0xOTUsMTAgKzIxMSwxNiBAQAogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICogICAgICAgICAgIFdPV0NhbGxiYWNrMTZFeCAoS0VSTkVMMzIuNTUpKFdPVzMyLjMpCisgKiBDYWxscyBhIGZ1bmN0aW9uIGluIDE2Yml0IGNvZGUuCisgKiBSRVRVUk5TCisgKglUUlVFIGZvciBzdWNjZXNzCiAgKi8KIEJPT0wzMiBXSU5BUEkgV09XQ2FsbGJhY2sxNkV4KAotCUZBUlBST0MxNiB2cGZuMTYsRFdPUkQgZHdGbGFncyxEV09SRCBjYkFyZ3MsTFBWT0lEIHBBcmdzLAotCUxQRFdPUkQgcGR3UmV0Q29kZQorCUZBUlBST0MxNiB2cGZuMTYsCS8qIFtpbl0gd2luMTYgZnVuY3Rpb24gdG8gY2FsbCAqLworCURXT1JEIGR3RmxhZ3MsCQkvKiBbaW5dIGZsYWdzICovCisJRFdPUkQgY2JBcmdzLAkJLyogW2luXSBuciBvZiBhcmd1bWVudHMgKi8KKwlMUFZPSUQgcEFyZ3MsCQkvKiBbaW5dIHBvaW50ZXIgdG8gYXJndW1lbnRzIChMUERXT1JEKSAqLworCUxQRFdPUkQgcGR3UmV0Q29kZQkvKiBbb3V0XSByZXR1cm4gdmFsdWUgb2Ygd2luMTYgZnVuY3Rpb24gKi8KICkgewogCXJldHVybiBDYWxsYmFja3MtPkNhbGxXT1dDYWxsYmFjazE2RXgodnBmbjE2LGR3RmxhZ3MsY2JBcmdzLHBBcmdzLHBkd1JldENvZGUpOwogfQpAQCAtMjI5LDEwICsyNTEsMTYgQEAKICAqIFRoZSBwb2ludGVyIHB0ciBpcyB3cml0dGVuIGludG8gdGhlIGZpcnN0IERXT1JEIG9mICd0aHVuaycuCiAgKiAocHJvYmFibHkgY29ycmVjdCBpbXBsZW1lbnRlZCkKICAqIFtvayBwcm9iYWJseV0KKyAqIFJFVFVSTlMKKyAqCXNlZ21lbnRlZCBwb2ludGVyIHRvIHRodW5rPwogICovCi1EV09SRCBXSU5BUEkgX0tFUk5FTDMyXzQzKExQRFdPUkQgdGh1bmssTFBDU1RSIHRoa2J1ZixEV09SRCBsZW4sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBMUENTVFIgZGxsMTYsTFBDU1RSIGRsbDMyKQoteworRFdPUkQgV0lOQVBJIF9LRVJORUwzMl80MygKKwlMUERXT1JEIHRodW5rLAkvKiBbaW5dIHdpbjMyIHRodW5rICovCisJTFBDU1RSIHRoa2J1ZiwJLyogW2luXSB0aGtidWZmZXIgbmFtZSBpbiB3aW4xNiBkbGwgKi8KKwlEV09SRCBsZW4sCS8qIFtpbl0gdGhrYnVmZmVyIGxlbmd0aCAqLworCUxQQ1NUUiBkbGwxNiwJLyogW2luXSBuYW1lIG9mIHdpbjE2IGRsbCAqLworCUxQQ1NUUiBkbGwzMgkvKiBbaW5dIG5hbWUgb2Ygd2luMzIgZGxsIChGSVhNRTogbm90IHVzZWQ/KSAqLworKSB7CiAJSElOU1RBTkNFMTYJaG1vZDsKIAlMUERXT1JECQlhZGRyOwogCVNFR1BUUgkJc2VnYWRkcjsKQEAgLTI3MCw3ICsyOTgsNyBAQAogICogdXNlcyAweDY2IGxyZXQsIGFuZCB0aGF0IHdlIGhhdmUgdG8gcGFzcyBDWCBpbiBESS4KICAqICh0aGVyZSBzZWVtcyB0byBiZSBzb21lIGtpbmQgb2YgQkwvQlggcmV0dXJuIG1hZ2ljIHRvby4uLikKICAqCi0gKiBbZG9lc24ndCBjcmFzaCBhbnltb3JlXQorICogW2NyYXNoZXNdCiAgKi8KIFZPSUQgV0lOQVBJIF9LRVJORUwzMl80NShDT05URVhUICpjb250ZXh0KQogewpAQCAtMzAzLDcgKzMzMSw3IEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqIAkJX0tFUk5FTDMyXzQwIAkoS0VSTkVMMzIuNDApCiAgKiBZRVQgQW5vdGhlciAzMi0+MTYgdGh1bmssIHRoZSBkaWZmZXJlbmNlIHRvIHRoZSBvdGhlcnMgaXMgc3RpbGwgbXlzdGVyaW91cwotICogdGFyZ2V0IGFkZHJlc3MgaXMgRURYCisgKiBUYXJnZXQgYWRkcmVzcyBpcyBpbiBFRFguCiAgKgogICogW2NyYXNoZXNdCiAgKi8KQEAgLTM3MCwxMSArMzk4LDE2IEBACiAgKgkwNDogU0VHUFRSCXB0cgkJPyB3aGVyZSBkb2VzIGl0IHBvaW50IHRvPwogICogVGhlIHNlZ3BvaW50ZXIgcHRyIGlzIHdyaXR0ZW4gaW50byB0aGUgZmlyc3QgRFdPUkQgb2YgJ3RodW5rJy4KICAqIFtvayBwcm9iYWJseV0KKyAqIFJFVFVSTlMKKyAqCXVuY2xlYXIsIHBvaW50ZXIgdG8gd2luMTYgdGhrYnVmZmVyPwogICovCi0KLUxQVk9JRCBXSU5BUEkgX0tFUk5FTDMyXzQxKExQQllURSB0aHVuayxMUENTVFIgdGhrYnVmLERXT1JEIGxlbixMUENTVFIgZGxsMTYsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBMUENTVFIgZGxsMzIpCi17CitMUFZPSUQgV0lOQVBJIF9LRVJORUwzMl80MSgKKwlMUEJZVEUgdGh1bmssCS8qIFtpbl0gd2luMzIgdGh1bmsgKi8KKwlMUENTVFIgdGhrYnVmLAkvKiBbaW5dIHRoa2J1ZmZlciBuYW1lIGluIHdpbjE2IGRsbCAqLworCURXT1JEIGxlbiwJLyogW2luXSBsZW5ndGggb2YgdGhrYnVmZmVyICovCisJTFBDU1RSIGRsbDE2LAkvKiBbaW5dIG5hbWUgb2Ygd2luMTYgZGxsICovCisJTFBDU1RSIGRsbDMyCS8qIFtpbl0gbmFtZSBvZiB3aW4zMiBkbGwgKi8KKykgewogCUhNT0RVTEUzMgloa3JubDMyID0gR2V0TW9kdWxlSGFuZGxlMzJBKCJLRVJORUwzMiIpOwogCUhNT0RVTEUxNglobW9kOwogCUxQRFdPUkQJCWFkZHIsYWRkcjI7CkBAIC0zODgsMTggKzQyMSwxOCBAQAogCQogCWhtb2QgPSBMb2FkTGlicmFyeTE2KGRsbDE2KTsKIAlpZiAoaG1vZDwzMikgewotCQlXQVJOKHRodW5rLCJmYWlsZWQgdG8gbG9hZCAxNmJpdCBETEwgJXMsIGVycm9yICVkXG4iLAorCQlFUlIodGh1bmssImZhaWxlZCB0byBsb2FkIDE2Yml0IERMTCAlcywgZXJyb3IgJWRcbiIsCiAJCQkgICAgIGRsbDE2LGhtb2QpOwogCQlyZXR1cm4gTlVMTDsKIAl9CiAJc2VnYWRkciA9IChEV09SRClXSU4zMl9HZXRQcm9jQWRkcmVzczE2KGhtb2QsKExQU1RSKXRoa2J1Zik7CiAJaWYgKCFzZWdhZGRyKSB7Ci0JCVdBUk4odGh1bmssIm5vICVzIGV4cG9ydGVkIGZyb20gJXMhXG4iLHRoa2J1ZixkbGwxNik7CisJCUVSUih0aHVuaywibm8gJXMgZXhwb3J0ZWQgZnJvbSAlcyFcbiIsdGhrYnVmLGRsbDE2KTsKIAkJcmV0dXJuIE5VTEw7CiAJfQogCWFkZHIgPSAoTFBEV09SRClQVFJfU0VHX1RPX0xJTihzZWdhZGRyKTsKIAlpZiAoYWRkclswXSAhPSBsZW4pIHsKLQkJV0FSTih0aHVuaywidGhrYnVmIGxlbmd0aCBtaXNtYXRjaD8gJWxkIHZzICVsZFxuIixsZW4sYWRkclswXSk7CisJCUVSUih0aHVuaywidGhrYnVmIGxlbmd0aCBtaXNtYXRjaD8gJWxkIHZzICVsZFxuIixsZW4sYWRkclswXSk7CiAJCXJldHVybiBOVUxMOwogCX0KIAlhZGRyMiA9IFBUUl9TRUdfVE9fTElOKGFkZHJbMV0pOwpAQCAtNDQwLDI2ICs0NzMsMzAgQEAKICAqCTA0OiBTRUdQVFIJYWRkcmVzcyBmb3IgdGh1bmtidWZmZXIgcG9pbnRlcgogICogW29rIHByb2JhYmx5XQogICovCi1WT0lEIFdJTkFQSSBfS0VSTkVMMzJfNDYoTFBCWVRFIHRodW5rLExQU1RSIHRoa2J1ZixEV09SRCBsZW4sTFBTVFIgZGxsMTYsCi0gICAgICAgICAgICAgICAgICAgICAgICAgTFBTVFIgZGxsMzIpCi17CitWT0lEIFdJTkFQSSBfS0VSTkVMMzJfNDYoCisJTFBCWVRFIHRodW5rLAkJLyogW2luXSBzdGFydCBvZiB0aHVua2J1ZmZlciAqLworCUxQQ1NUUiB0aGtidWYsCQkvKiBbaW5dIG5hbWUvb3JkaW5hbCBvZiB0aHVua2J1ZmZlciBpbiB3aW4xNiBkbGwgKi8KKwlEV09SRCBsZW4sCQkvKiBbaW5dIGxlbmd0aCBvZiB0aHVua2J1ZmZlciAqLworCUxQQ1NUUiBkbGwxNiwJCS8qIFtpbl0gbmFtZSBvZiB3aW4xNiBkbGwgY29udGFpbmluZyB0aGUgdGhrYnVmICovCisJTFBDU1RSIGRsbDMyCQkvKiBbaW5dIHdpbjMyIGRsbC4gRklYTUU6IHN0cmFuZ2UsIHVudXNlZCAqLworKSB7CiAJTFBEV09SRAkJYWRkcjsKIAlITU9EVUxFMTYJaG1vZDsKIAlTRUdQVFIJCXNlZ2FkZHI7CiAKIAlobW9kID0gTG9hZExpYnJhcnkxNihkbGwxNik7CiAJaWYgKGhtb2QgPCAzMikgewotCQlXQVJOKHRodW5rLCJjb3VsZG4ndCBsb2FkICVzLCBlcnJvciAlZFxuIixkbGwxNixobW9kKTsKKwkJRVJSKHRodW5rLCJjb3VsZG4ndCBsb2FkICVzLCBlcnJvciAlZFxuIixkbGwxNixobW9kKTsKIAkJcmV0dXJuOwogCX0KIAlzZWdhZGRyID0gKFNFR1BUUilXSU4zMl9HZXRQcm9jQWRkcmVzczE2KGhtb2QsdGhrYnVmKTsKIAlpZiAoIXNlZ2FkZHIpIHsKLQkJV0FSTih0aHVuaywiaGF2ZW4ndCBmb3VuZCAlcyBpbiAlcyFcbiIsdGhrYnVmLGRsbDE2KTsKKwkJRVJSKHRodW5rLCJoYXZlbid0IGZvdW5kICVzIGluICVzIVxuIix0aGtidWYsZGxsMTYpOwogCQlyZXR1cm47CiAJfQogCWFkZHIgPSAoTFBEV09SRClQVFJfU0VHX1RPX0xJTihzZWdhZGRyKTsKIAlpZiAoYWRkclswXSAhPSBsZW4pIHsKLQkgICAgICAgIFdBUk4odGh1bmssImxlbmd0aCBvZiB0aGtidWYgZGlmZmVycyBmcm9tIGV4cGVjdGVkIGxlbmd0aCEgIgorCSAgICAgICAgRVJSKHRodW5rLCJsZW5ndGggb2YgdGhrYnVmIGRpZmZlcnMgZnJvbSBleHBlY3RlZCBsZW5ndGghICIKIAkJCSAgICAgIiglbGQgdnMgJWxkKVxuIixhZGRyWzBdLGxlbik7CiAJCXJldHVybjsKIAl9CkBAIC00NzUsNiArNTEyLDggQEAKICAqIENoZWNrIGlmIHRodW5raW5nIGlzIGluaXRpYWxpemVkIChzcyBzZWxlY3RvciBzZXQgdXAgZXRjLikKICAqIFdlIGRvIHRoYXQgZGlmZmVyZW50bHksIHNvIGp1c3QgcmV0dXJuIFRSVUUuCiAgKiBbb2tdCisgKiBSRVRVUk5TCisgKglUUlVFIGZvciBzdWNjZXNzLgogICovCiBCT09MMzIgV0lOQVBJIF9LRVJORUwzMl84NygpCiB7CkBAIC00OTAsOCArNTI5LDEyIEBACiAgKiBBbmQgWUVTLCBJJ3ZlIHNlZW4gbnI9NDggKHNvbWV3aGVyZSBpbiB0aGUgV2luOTUgMzI8LT4xNiBPTEUgY291cGxpbmcpCiAgKiBbb2tdCiAgKi8KLURXT1JEIFdJTkFQSVYgX0tFUk5FTDMyXzg4KCBEV09SRCBuciwgRFdPUkQgZmxhZ3MsIEZBUlBST0MzMiBmdW4sIC4uLiApCi17CitEV09SRCBXSU5BUElWIF9LRVJORUwzMl84OCgKKwlEV09SRCBuciwJLyogW2luXSBudW1iZXIgb2YgYXJndW1lbnQgYnl0ZXMgKi8KKwlEV09SRCBmbGFncywJLyogW2luXSBGSVhNRTogZmxhZ3MgPyAqLworCUZBUlBST0MzMiBmdW4sCS8qIFtpbl0gZnVuY3Rpb24gdG8gY2FsbCAqLworCS4uLgkJLyogW2luL291dF0gYXJndW1lbnRzICovCispIHsKICAgICBEV09SRCBpLHJldDsKICAgICBEV09SRCAqYXJncyA9ICgoRFdPUkQgKikmZnVuKSArIDE7CiAKQEAgLTU3OCw5ICs2MjEsMTQgQEAKICAqIHJldHVybnMgdGhlIHN0YXJ0YWRkcmVzcyBvZiB0aGlzIHRodW5rLgogICoKICAqIE5vdGUsIHRoYXQgdGhleSBsb29rIHZlcnkgc2ltaWxhaXIgdG8gdGhlIG9uZXMgYWxsb2NhdGVzIGJ5IFRIVU5LX0FsbG9jLgorICogUkVUVVJOUworICoJc2VnbWVudGVkIHBvaW50ZXIgdG8gdGhlIHN0YXJ0IG9mIHRoZSB0aHVuawogICovCiBEV09SRCBXSU5BUEkKLUFsbG9jU0xDYWxsYmFjayhEV09SRCBmaW5hbGl6ZXIsRFdPUkQgY2FsbGJhY2spIHsKK0FsbG9jU0xDYWxsYmFjaygKKwlEV09SRCBmaW5hbGl6ZXIsCS8qIFtpbl0gZmluYWxpemVyIGZ1bmN0aW9uICovCisJRFdPUkQgY2FsbGJhY2sJCS8qIFtpbl0gY2FsbGJhY2sgZnVuY3Rpb24gKi8KKykgewogCUxQQllURQl4LHRodW5rID0gSGVhcEFsbG9jKCBHZXRQcm9jZXNzSGVhcCgpLCAwLCAzMiApOwogCVdPUkQJc2VsOwogCkBAIC01OTYsOCArNjQ0LDE0IEBACiAJcmV0dXJuIChzZWw8PDE2KXwwOwogfQogCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogCQlGcmVlU0xDYWxsYmFjawkJKEtFUk5FTDMyLjI3NCkKKyAqIEZyZWVzIHRoZSBzcGVjaWZpZWQgMTYtPjMyIGNhbGxiYWNrCisgKi8KIHZvaWQgV0lOQVBJCi1GcmVlU0xDYWxsYmFjayhEV09SRCB4KSB7CitGcmVlU0xDYWxsYmFjaygKKwlEV09SRCB4CS8qIFtpbl0gMTYgYml0IGNhbGxiYWNrIChzZWdtZW50ZWQgcG9pbnRlcj8pICovCispIHsKIAlmcHJpbnRmKHN0ZGVyciwiRnJlZVNMQ2FsbGJhY2soMHglMDhseClcbiIseCk7CiB9CiAKQEAgLTYwNSw2ICs2NTksOCBAQAogICogCQlLRVJORUxfMzU4CQkoS0VSTkVMKQogICogQWxsb2NhdGVzIGEgY29kZSBzZWdtZW50IHdoaWNoIHN0YXJ0cyBhdCB0aGUgYWRkcmVzcyBwYXNzZWQgaW4geC4gbGltaXQKICAqIDB4ZmZmZmYsIGFuZCByZXR1cm5zIHRoZSBwb2ludGVyIHRvIHRoZSBzdGFydC4KKyAqIFJFVFVSTlMKKyAqCWEgc2VnbWVudGVkIHBvaW50ZXIgCiAgKi8KIERXT1JEIFdJTkFQSQogX0tFUk5FTF8zNTgoRFdPUkQgeCkgewpAQCAtNjI0LDcgKzY4MCw5IEBACiAgKiBiZWVuIGFsbG9jYXRlZCBieSBfS0VSTkVMXzM1OCkuCiAgKi8KIFZPSUQgV0lOQVBJCi1fS0VSTkVMXzM1OShEV09SRCB4KSB7CitfS0VSTkVMXzM1OSgKKwlEV09SRCB4CS8qIFtpbl0gc2VnbWVudGVkIHBvaW50ZXI/ICovCispIHsKIAlmcHJpbnRmKHN0ZGVyciwiX0tFUk5FTF8zNTkoMHglMDhseCksc3R1YlxuIix4KTsKIAlpZiAoKEhJV09SRCh4KSAmIDcpIT03KQogCQlyZXR1cm47CkBAIC02MzMsOCArNjkxLDkgQEAKIH0KIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIAkJS0VSTkVMXzQ3MQkJKEtFUk5FTCkKLSAqIFNlZW1zIHRvIHJldHVybiB0aGUgdW5jcnlwdGVkIGN1cnJlbnQgcHJvY2VzcyBwb2ludGVyLiBbTm90IDEwMCUgc3VyZV0uCisgKiAJCUtFUk5FTF80NzEJCShLRVJORUwuNDcxKQorICogUkVUVVJOUworICogCVNlZW1zIHRvIHJldHVybiB0aGUgdW5jcnlwdGVkIGN1cnJlbnQgcHJvY2VzcyBwb2ludGVyLiBbTm90IDEwMCUgc3VyZV0uCiAgKi8KIExQVk9JRCBXSU5BUEkKIF9LRVJORUxfNDcxKCkgewpAQCAtNjQyLDggKzcwMSwxMCBAQAogfQogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogCQlLRVJORUxfNDcyCQkoS0VSTkVMKQorICogCQlLRVJORUxfNDcyCQkoS0VSTkVMLjQ3MikKICAqIHNvbWV0aGluZyBsaWtlIEdldEN1cnJlbnRoSW5zdGFuY2UuCisgKiBSRVRVUk5TCisgKgl0aGUgaEluc3RhbmNlCiAgKi8KIFZPSUQgV0lOQVBJCiBfS0VSTkVMXzQ3MihDT05URVhUICpjb250ZXh0KSB7CkBAIC02NjAsMTcgKzcyMSwyNyBAQAogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICogCQlLRVJORUxfNDMxCQkoS0VSTkVMLjQzMSkKLSAqIElzUGVGaWxlCisgKgkJSXNQZUZvcm1hdAkJKFczMlNZUy4yKQorICogQ2hlY2tzIHRoZSBwYXNzZWQgZmlsZW5hbWUgaWYgaXQgaXMgYSBQRSBmb3JtYXQgZXhlY3V0ZWFibGUKKyAqIFJFVFVSTlMKKyAqICBUUlVFLCBpZiBpdCBpcy4KKyAqICBGQUxTRSBpZiBub3QuCiAgKi8KLUJPT0wxNiBXSU5BUEkgS0VSTkVMXzQzMShMUFNUUiBmbixXT1JEIHgpIHsKK0JPT0wxNiBXSU5BUEkgSXNQZUZvcm1hdCgKKwlMUFNUUglmbiwJLyogW2luXSBmaWxlbmFtZSB0byBleGVjdXRlYWJsZSAqLworCUhGSUxFMTYgaGYxNgkvKiBbaW5dIG9wZW4gZmlsZSwgaWYgZmlsZW5hbWUgaXMgTlVMTCAqLworKSB7CiAJSU1BR0VfRE9TX0hFQURFUgltemg7Ci0JSEZJTEUzMgkJCWhmOworCUhGSUxFMzIJCQloZj1oZjE2OwogCU9GU1RSVUNUCQlvZnM7CiAJRFdPUkQJCQl4bWFnaWM7CiAKLQloZiA9IE9wZW5GaWxlMzIoZm4sJm9mcyxPRl9SRUFEKTsKLQlpZiAoaGY9PUhGSUxFX0VSUk9SMzIpCi0JCXJldHVybiBGQUxTRTsKKwlpZiAoZm4pIHsKKwkJaGYgPSBPcGVuRmlsZTMyKGZuLCZvZnMsT0ZfUkVBRCk7CisJCWlmIChoZj09SEZJTEVfRVJST1IzMikKKwkJCXJldHVybiBGQUxTRTsKKwl9CisJX2xsc2VlazMyKGhmLDAsU0VFS19TRVQpOwogCWlmIChzaXplb2YobXpoKSE9X2xyZWFkMzIoaGYsJm16aCxzaXplb2YobXpoKSkpIHsKIAkJX2xjbG9zZTMyKGhmKTsKIAkJcmV0dXJuIEZBTFNFOwpAQCAtNjg5LDcgKzc2MCw2MSBAQAogCXJldHVybiAoeG1hZ2ljID09IElNQUdFX05UX1NJR05BVFVSRSk7CiB9CiAKLUhBTkRMRTMyIFdJTkFQSSBXT1dIYW5kbGUzMihXT1JEIGhhbmRsZSxXT1dfSEFORExFX1RZUEUgdHlwZSkgeworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiAgICAgICAgICAgV09XSGFuZGxlMzIJCQkoS0VSTkVMMzIuNTcpKFdPVzMyLjE2KQorICogQ29udmVydHMgYSB3aW4xNiBoYW5kbGUgb2YgdHlwZSBpbnRvIHRoZSByZXNwZWN0aXZlIHdpbjMyIGhhbmRsZS4KKyAqIFdlIGN1cnJlbnRseSBqdXN0IHJldHVybiB0aGlzIGhhbmRsZSwgc2luY2UgbW9zdCBoYW5kbGVzIGFyZSB0aGUgc2FtZQorICogZm9yIHdpbjE2IGFuZCB3aW4zMi4KKyAqIFJFVFVSTlMKKyAqCVRoZSBuZXcgaGFuZGxlCisgKi8KK0hBTkRMRTMyIFdJTkFQSSBXT1dIYW5kbGUzMigKKwlXT1JEIGhhbmRsZSwJCS8qIFtpbl0gd2luMTYgaGFuZGxlICovCisJV09XX0hBTkRMRV9UWVBFIHR5cGUJLyogW2luXSBoYW5kbGUgdHlwZSAqLworKSB7CiAJZnByaW50ZihzdGRlcnIsIldPV0hhbmRsZTMyKDB4JTA0eCwlZClcbiIsaGFuZGxlLHR5cGUpOwogCXJldHVybiAoSEFORExFMzIpaGFuZGxlOwogfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqICAgICAgICAgICBGVU5DMDA0CQkJCShLRVJORUwuNjMxKQorICogQSAxNi0+MzIgdGh1bmsgc2V0dXAgZnVuY3Rpb24uCisgKiBHZXRzIGNhbGxlZCBmcm9tIGEgdGh1bmtidWZmZXIgKHZhbHVlIG9mIEVBWCkuIEl0IG92ZXJ3cml0ZXMgdGhlIHN0YXJ0CisgKiB3aXRoIGEgam1wIHRvIGEga2VybmVsMzIgZnVuY3Rpb24uIFRoZSBrZXJuZWwzMiBmdW5jdGlvbiBnZXRzIHBhc3NlZCBFRFguCisgKiAoYW5kIHBvc3NpYmx5IENYKS4KKyAqLwordm9pZCBXSU5BUEkgRlVOQzAwNCgKKwlDT05URVhUICpjb250ZXh0CS8qIFtpbi9vdXRdIHJlZ2lzdGVyIGNvbnRleHQgZnJvbSAxNjMyLXJlbGF5ICovCispIHsKKworCUZJWE1FKHJlZywiLFNUVUIgKGVkeCBpcyAweCUwOGx4LCBlYXggaXMgMHglMDhseCxlZHhbMHgxMF0gaXMgMHglMDhseCkhXG4iLAorCQlFRFhfcmVnKGNvbnRleHQpLAorCQlFQVhfcmVnKGNvbnRleHQpLAorCQkoKERXT1JEKilQVFJfU0VHX1RPX0xJTihFRFhfcmVnKGNvbnRleHQpKSlbMHgxMC80XQorCSk7CisKKyNpZiAwCit7CisJTFBCWVRFCXgsdGFyZ2V0ID0gKExQQllURSlQVFJfU0VHX1RPX0xJTihFQVhfcmVnKGNvbnRleHQpKTsKKwlXT1JECWRzLGNzOworCisJR0VUX0RTKGRzKTsKKwlHRVRfQ1MoY3MpOworLyogV29uJ3Qgd29yayBhbnl3YXkgc2luY2Ugd2UgZG9uJ3Qga25vdyB0aGUgZnVuY3Rpb24gY2FsbGVkIGluIEtFUk5FTDMyIC1NYXJjdXMqLworCXggPSB0YXJnZXQ7CisJKngrKz0gMHhiODsgKihXT1JEKil4PSBkczt4Kz0yOwkJLyogbW92IGF4LEtFUk5FTDMyX0RTICovCisJKngrKz0gMHg4ZTsgKngrKyA9IDB4YzA7IAkJLyogbW92IGVzLGF4ICovCisJKngrKz0gMHg2NjsgKngrKyA9IDB4YmE7ICooRFdPUkQqKXg9RURYX3JlZyhjb250ZXh0KTt4Kz00OworCQkJCQkJLyogbW92IGVkeCwgJEVEWCAqLworCSp4Kys9IDB4NjY7ICp4KysgPSAweGVhOwkvKiBqbXAgS0VSTkVMMzJfQ1M6a2VybmVsMzJmdW4gKi8KKwkJKihEV09SRCopeD0wO3grPTQ7LyogRklYTUU6IF93aGF0XyBmdW5jdGlvbiBkb2VzIGl0IGNhbGw/ICovCisJCSooV09SRCopeD1jczt4Kz0yOworCQkJCQkKKworCUlQX3JlZyhjb250ZXh0KSA9IExPV09SRChFQVhfcmVnKGNvbnRleHQpKTsKKwlDU19yZWcoY29udGV4dCkgPSBISVdPUkQoRUFYX3JlZyhjb250ZXh0KSk7Cit9CisjZW5kaWYKKwlyZXR1cm47Cit9CisKZGlmZiAtLWdpdCBhL3dpbjMyL25ld2Zucy5jIGIvd2luMzIvbmV3Zm5zLmMKaW5kZXggZmQzZTY0Ni4uYWRlZGIwNyAxMDA2NDQKLS0tIGEvd2luMzIvbmV3Zm5zLmMKKysrIGIvd2luMzIvbmV3Zm5zLmMKQEAgLTI2LDcgKzI2LDcgQEAKICAgICAgICAgICAgICAgICAgICAgICAvKkZBUlBST0MqLyBMUFZPSUQgcGZuVVQzMkNhbGxCYWNrLAogICAgICAgICAgICAgICAgICAgICAgIExQVk9JRCBscEJ1ZmYpCiB7Ci0gICAgZnByaW50ZihzdGRuaW1wLCAiVVRSZWdpc3RlciBTdHViIGNhbGxlZCFcbiIpOworICAgIGZwcmludGYoc3RkZXJyLCAiVVRSZWdpc3RlciglI3gsLi4uKTogc3R1YiFcbiIsaE1vZHVsZSk7CiAgICAgcmV0dXJuIFRSVUU7CiB9CiAKQEAgLTM1LDcgKzM1LDcgQEAKICAqLwogQk9PTDMyIFdJTkFQSSBVVFVuUmVnaXN0ZXIoSE1PRFVMRTMyIGhNb2R1bGUpCiB7Ci0gICAgZnByaW50ZihzdGRuaW1wLCAiVVRVblJlZ2lzdGVyIFN0dWIgY2FsbGVkIVxuIik7CisgICAgZnByaW50ZihzdGRlcnIsICJVVFVuUmVnaXN0ZXIoJSN4OiBzdHViIVxuIiwgaE1vZHVsZSk7CiAgICAgcmV0dXJuIFRSVUU7CiB9CiAKQEAgLTU0LDE0ICs1NCwxMyBAQAogfQogCiBIQU5ETEUzMiBXSU5BUEkgRmluZEZpcnN0Q2hhbmdlTm90aWZpY2F0aW9uMzJBKExQQ1NUUiBscFBhdGhOYW1lLEJPT0wzMiBiV2F0Y2hTdWJ0cmVlLERXT1JEIGR3Tm90aWZ5RmlsdGVyKSB7Ci0JZnByaW50ZihzdGRlcnIsIkZpbmRGaXJzdENoYW5nZU5vdGlmaWNhdGlvbiglcywlZCwlMDhseCksc3R1YlxuIiwKLQkJbHBQYXRoTmFtZSxiV2F0Y2hTdWJ0cmVlLGR3Tm90aWZ5RmlsdGVyCi0JKTsKKwlGSVhNRShmaWxlLCIoJXMsJWQsJTA4bHgpOiBzdHViXG4iLAorCSAgICAgIGxwUGF0aE5hbWUsYldhdGNoU3VidHJlZSxkd05vdGlmeUZpbHRlcik7CiAJcmV0dXJuIDB4Y2FmZWJhYmU7CiB9CiAKIEJPT0wzMiBXSU5BUEkgRmluZE5leHRDaGFuZ2VOb3RpZmljYXRpb24oSEFORExFMzIgZmNuaGFuZGxlKSB7Ci0JZnByaW50ZihzdGRlcnIsIkZpbmROZXh0Q2hhbmdlTm90aWZpY2F0aW9uKCUwOHgpLHN0dWIhXG4iLGZjbmhhbmRsZSk7CisJRklYTUUoZmlsZSwiKCUwOHgpOiBzdHViIVxuIixmY25oYW5kbGUpOwogCXJldHVybiBGQUxTRTsKIH0KIApAQCAtODUsNyArODQsNyBAQAogCQkJICAgICAgTFBPVkVSTEFQUEVEIGxwb1B2ZXJsYXBwZWQpCiB7CiAKLSAgICAgICAgZnByaW50ZihzdGRuaW1wLCAiRGV2aWNlSW9Db250cm9sIFN0dWIgY2FsbGVkIVxuIik7CisgICAgICAgIEZJWE1FKGNvbW0sICIoLi4uKTogc3R1YiFcbiIpOwogCS8qIEZJWE1FOiBTZXQgYXBwcm9wcmlhdGUgZXJyb3IgKi8KIAlyZXR1cm4gRkFMU0U7CiAKQEAgLTk1LDYgKzk0LDQwIEBACiAgKgkJRmx1c2hJbnN0cnVjdGlvbkNhY2hlIChLRVJORUwzMi4yNjEpCiAgKi8KIEJPT0wzMiBXSU5BUEkgRmx1c2hJbnN0cnVjdGlvbkNhY2hlKERXT1JEIHgsRFdPUkQgeSxEV09SRCB6KSB7Ci0JZnByaW50ZihzdGRlcnIsIkZsdXNoSW5zdHJ1Y3Rpb25DYWNoZSgweCUwOGx4LDB4JTA4bHgsMHglMDhseClcbiIseCx5LHopOworCUZJWE1FKGRlYnVnLCIoMHglMDhseCwweCUwOGx4LDB4JTA4bHgpOiBzdHViXG4iLHgseSx6KTsKIAlyZXR1cm4gVFJVRTsKIH0KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiAgICAgICAgICAgQ3JlYXRlTmFtZWRQaXBlQSAgIChLRVJORUwzMi4xNjgpCisgKi8KK0hBTkRMRTMyIFdJTkFQSSBDcmVhdGVOYW1lZFBpcGVBIChMUENTVFIgbHBOYW1lLCBEV09SRCBkd09wZW5Nb2RlLAorCQkJCSAgRFdPUkQgZHdQaXBlTW9kZSwgRFdPUkQgbk1heEluc3RhbmNlcywKKwkJCQkgIERXT1JEIG5PdXRCdWZmZXJTaXplLCBEV09SRCBuSW5CdWZmZXJTaXplLAorCQkJCSAgRFdPUkQgbkRhZmF1bHRUaW1lT3V0LAorCQkJCSAgTFBTRUNVUklUWV9BVFRSSUJVVEVTIGxwU2VjdXJpdHlBdHRyaWJ1dGVzKQoreworICBGSVhNRSAod2luMzIsICJDcmVhdGVOYW1lZFBpcGVBOiBzdHViXG4iKTsKKyAgLyogaWYgKG5NYXhJbnN0YW5jZXMgPiBQSVBFX1VOTElNSVRFRF9JTlNUQU5DRVMpIHsKKyAgICBTZXRMYXN0RXJyb3IgKEVSUk9SX0lOVkFMSURfUEFSQU1FVEVSKTsKKyAgICByZXR1cm4gSU5WQUxJRF9IQU5ETEVfVkFMVUU7CisgIH0gKi8KKworICBTZXRMYXN0RXJyb3IgKEVSUk9SX1VOS05PV04pOworICByZXR1cm4gSU5WQUxJRF9IQU5ETEVfVkFMVUUzMjsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiAgICAgICAgICAgQ3JlYXRlTmFtZWRQaXBlVyAgIChLRVJORUwzMi4xNjkpCisgKi8KK0hBTkRMRTMyIFdJTkFQSSBDcmVhdGVOYW1lZFBpcGVXIChMUENXU1RSIGxwTmFtZSwgRFdPUkQgZHdPcGVuTW9kZSwKKwkJCQkgIERXT1JEIGR3UGlwZU1vZGUsIERXT1JEIG5NYXhJbnN0YW5jZXMsCisJCQkJICBEV09SRCBuT3V0QnVmZmVyU2l6ZSwgRFdPUkQgbkluQnVmZmVyU2l6ZSwKKwkJCQkgIERXT1JEIG5EYWZhdWx0VGltZU91dCwKKwkJCQkgIExQU0VDVVJJVFlfQVRUUklCVVRFUyBscFNlY3VyaXR5QXR0cmlidXRlcykKK3sKKyAgRklYTUUgKHdpbjMyLCAiQ3JlYXRlTmFtZWRQaXBlVzogc3R1YlxuIik7CisKKyAgU2V0TGFzdEVycm9yIChFUlJPUl9VTktOT1dOKTsKKyAgcmV0dXJuIElOVkFMSURfSEFORExFX1ZBTFVFMzI7Cit9CmRpZmYgLS1naXQgYS93aW4zMi9zZWN1cml0eS5jIGIvd2luMzIvc2VjdXJpdHkuYwppbmRleCA5MWZjNmMwLi5hY2ZlYzg3IDEwMDY0NAotLS0gYS93aW4zMi9zZWN1cml0eS5jCisrKyBiL3dpbjMyL3NlY3VyaXR5LmMKQEAgLTEyNSw3ICsxMjUsNyBAQAogQk9PTDMyIFdJTkFQSSBJbml0aWFsaXplU2VjdXJpdHlEZXNjcmlwdG9yKCBTRUNVUklUWV9ERVNDUklQVE9SICpwRGVzY3IsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERXT1JEIHJldmlzaW9uICkKIHsKLSAgICBmcHJpbnRmKCBzdGRuaW1wLCAiSW5pdGlhbGl6ZVNlY3VyaXR5RGVzY3JpcHRvcjogZW1wdHkgc3R1YlxuIiApOworICAgIEZJWE1FKHNlY3VyaXR5LCAiKCVwLCUjbHgpOiBlbXB0eSBzdHViXG4iLCBwRGVzY3IsIHJldmlzaW9uKTsKICAgICByZXR1cm4gVFJVRTsKIH0KIApAQCAtMjA4LDggKzIwOCw4IEBACiAJCQkJICBMUENTVFIgZG9tYWluLCBMUERXT1JEIGRvbWFpblNpemUsCiAJCQkJICBQU0lEX05BTUVfVVNFIG5hbWVfdXNlKQogewotCWZwcmludGYoc3RkbmltcCwiTG9va3VwQWNjb3VudFNpZDMyQSglcywlcCwlcCwlcCwlcCwlcCwlcCksc3R1YlxuIiwKLQkJc3lzdGVtLHNpZCxhY2NvdW50LGFjY291bnRTaXplLGRvbWFpbixkb21haW5TaXplLG5hbWVfdXNlKTsKKwlGSVhNRShzZWN1cml0eSwiKCVzLCVwLCVwLCVwLCVwLCVwLCVwKTogc3R1YlxuIiwKKwkgICAgICBzeXN0ZW0sc2lkLGFjY291bnQsYWNjb3VudFNpemUsZG9tYWluLGRvbWFpblNpemUsbmFtZV91c2UpOwogCVNldExhc3RFcnJvcihFUlJPUl9DQUxMX05PVF9JTVBMRU1FTlRFRCk7CiAJcmV0dXJuIEZBTFNFOwogfQpAQCAtMjIyLDggKzIyMiw4IEBACiAJCQkJICBMUENXU1RSIGRvbWFpbiwgTFBEV09SRCBkb21haW5TaXplLAogCQkJCSAgUFNJRF9OQU1FX1VTRSBuYW1lX3VzZSkKIHsKLQlmcHJpbnRmKHN0ZG5pbXAsIkxvb2t1cEFjY291bnRTaWQzMlcoJXAsJXAsJXAsJXAsJXAsJXAsJXApLHN0dWJcbiIsCi0JCXN5c3RlbSxzaWQsYWNjb3VudCxhY2NvdW50U2l6ZSxkb21haW4sZG9tYWluU2l6ZSxuYW1lX3VzZSk7CisJRklYTUUoc2VjdXJpdHksIiglcCwlcCwlcCwlcCwlcCwlcCwlcCk6IHN0dWJcbiIsCisJICAgICAgc3lzdGVtLHNpZCxhY2NvdW50LGFjY291bnRTaXplLGRvbWFpbixkb21haW5TaXplLG5hbWVfdXNlKTsKIAlTZXRMYXN0RXJyb3IoRVJST1JfQ0FMTF9OT1RfSU1QTEVNRU5URUQpOwogCXJldHVybiBGQUxTRTsKIH0KZGlmZiAtLWdpdCBhL3dpbmRvd3MvY2FyZXQuYyBiL3dpbmRvd3MvY2FyZXQuYwppbmRleCBlMDZlMzA0Li4yZjMyZGI3IDEwMDY0NAotLS0gYS93aW5kb3dzL2NhcmV0LmMKKysrIGIvd2luZG93cy9jYXJldC5jCkBAIC0xMzEsNyArMTMxLDcgQEAKIH0KIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiAgICAgICAgICAgQ3JlYXRlQ2FyZXQzMiAgIChVU0VSMzIuNjUpCisgKiAgICAgICAgICAgQ3JlYXRlQ2FyZXQzMiAgIChVU0VSMzIuNjYpCiAgKi8KIEJPT0wzMiBXSU5BUEkgQ3JlYXRlQ2FyZXQzMiggSFdORDMyIGh3bmQsIEhCSVRNQVAzMiBiaXRtYXAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElOVDMyIHdpZHRoLCBJTlQzMiBoZWlnaHQgKQpAQCAtMTgyLDcgKzE4Miw3IEBACiAKIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiAgICAgICAgICAgRGVzdHJveUNhcmV0MzIgICAoVVNFUjMyLjEzMCkKKyAqICAgICAgICAgICBEZXN0cm95Q2FyZXQzMiAgIChVU0VSMzIuMTMxKQogICovCiBCT09MMzIgV0lOQVBJIERlc3Ryb3lDYXJldDMyKHZvaWQpCiB7CkBAIC0yMDksNyArMjA5LDcgQEAKIAogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqICAgICAgICAgICBTZXRDYXJldFBvczMyICAgKFVTRVIzMi40NjUpCisgKiAgICAgICAgICAgU2V0Q2FyZXRQb3MzMiAgIChVU0VSMzIuNDY2KQogICovCiBCT09MMzIgV0lOQVBJIFNldENhcmV0UG9zMzIoIElOVDMyIHgsIElOVDMyIHkpCiB7CkBAIC0yNDEsNyArMjQxLDcgQEAKIAogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqICAgICAgICAgICBIaWRlQ2FyZXQzMiAgIChVU0VSMzIuMzE2KQorICogICAgICAgICAgIEhpZGVDYXJldDMyICAgKFVTRVIzMi4zMTcpCiAgKi8KIEJPT0wzMiBXSU5BUEkgSGlkZUNhcmV0MzIoIEhXTkQzMiBod25kICkKIHsKQEAgLTI2OCw3ICsyNjgsNyBAQAogCiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogICAgICAgICAgIFNob3dDYXJldDMyICAgKFVTRVIzMi41MjgpCisgKiAgICAgICAgICAgU2hvd0NhcmV0MzIgICAoVVNFUjMyLjUyOSkKICAqLwogQk9PTDMyIFdJTkFQSSBTaG93Q2FyZXQzMiggSFdORDMyIGh3bmQgKQogewpAQCAtMzAwLDcgKzMwMCw3IEBACiB9CiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogICAgICAgICAgIFNldENhcmV0QmxpbmtUaW1lMzIgICAoVVNFUjMyLjQ2NCkKKyAqICAgICAgICAgICBTZXRDYXJldEJsaW5rVGltZTMyICAgKFVTRVIzMi40NjUpCiAgKi8KIEJPT0wzMiBXSU5BUEkgU2V0Q2FyZXRCbGlua1RpbWUzMiggVUlOVDMyIG1zZWNzICkKIHsKQEAgLTMyNSw3ICszMjUsNyBAQAogCiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogICAgICAgICAgIEdldENhcmV0QmxpbmtUaW1lMzIgICAoVVNFUjMyLjIwOCkKKyAqICAgICAgICAgICBHZXRDYXJldEJsaW5rVGltZTMyICAgKFVTRVIzMi4yMDkpCiAgKi8KIFVJTlQzMiBXSU5BUEkgR2V0Q2FyZXRCbGlua1RpbWUzMih2b2lkKQogewpAQCAtMzQ4LDcgKzM0OCw3IEBACiAKIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiAgICAgICAgICAgR2V0Q2FyZXRQb3MzMiAgIChVU0VSMzIuMjA5KQorICogICAgICAgICAgIEdldENhcmV0UG9zMzIgICAoVVNFUjMyLjIxMCkKICAqLwogQk9PTDMyIFdJTkFQSSBHZXRDYXJldFBvczMyKCBMUFBPSU5UMzIgcHQgKQogewpkaWZmIC0tZ2l0IGEvd2luZG93cy9jbGFzcy5jIGIvd2luZG93cy9jbGFzcy5jCmluZGV4IGRiZjkxNTQuLmZhNTUwNGUgMTAwNjQ0Ci0tLSBhL3dpbmRvd3MvY2xhc3MuYworKysgYi93aW5kb3dzL2NsYXNzLmMKQEAgLTMzNyw3ICszMzcsNyBAQAogCiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogICAgICAgICAgIFJlZ2lzdGVyQ2xhc3MzMkEgICAgICAoVVNFUjMyLjQyNikKKyAqICAgICAgICAgICBSZWdpc3RlckNsYXNzMzJBICAgICAgKFVTRVIzMi40MjcpCiAgKiBSRVRVUk5TCiAgKgk+MDogVW5pcXVlIGlkZW50aWZpZXIKICAqCTA6IEZhaWx1cmUKQEAgLTM3NSw3ICszNzUsNyBAQAogCiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogICAgICAgICAgIFJlZ2lzdGVyQ2xhc3MzMlcgICAgICAoVVNFUjMyLjQyOSkKKyAqICAgICAgICAgICBSZWdpc3RlckNsYXNzMzJXICAgICAgKFVTRVIzMi40MzApCiAgKi8KIEFUT00gV0lOQVBJIFJlZ2lzdGVyQ2xhc3MzMlcoIGNvbnN0IFdORENMQVNTMzJXKiB3YyApCiB7CkBAIC00NDEsNyArNDQxLDcgQEAKIAogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqICAgICAgICAgICBSZWdpc3RlckNsYXNzRXgzMkEgICAgICAoVVNFUjMyLjQyNykKKyAqICAgICAgICAgICBSZWdpc3RlckNsYXNzRXgzMkEgICAgICAoVVNFUjMyLjQyOCkKICAqLwogQVRPTSBXSU5BUEkgUmVnaXN0ZXJDbGFzc0V4MzJBKCBjb25zdCBXTkRDTEFTU0VYMzJBKiB3YyApCiB7CkBAIC00NzMsNyArNDczLDcgQEAKIAogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqICAgICAgICAgICBSZWdpc3RlckNsYXNzRXgzMlcgICAgICAoVVNFUjMyLjQyOCkKKyAqICAgICAgICAgICBSZWdpc3RlckNsYXNzRXgzMlcgICAgICAoVVNFUjMyLjQyOSkKICAqLwogQVRPTSBXSU5BUEkgUmVnaXN0ZXJDbGFzc0V4MzJXKCBjb25zdCBXTkRDTEFTU0VYMzJXKiB3YyApCiB7CkBAIC01MjEsNyArNTIxLDcgQEAKIAogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqICAgICAgICAgICBVbnJlZ2lzdGVyQ2xhc3MzMkEgICAgKFVTRVIzMi41NjIpCisgKiAgICAgICAgICAgVW5yZWdpc3RlckNsYXNzMzJBICAgIChVU0VSMzIuNTYzKQogICovCiBCT09MMzIgV0lOQVBJIFVucmVnaXN0ZXJDbGFzczMyQSggTFBDU1RSIGNsYXNzTmFtZSwgSElOU1RBTkNFMzIgaEluc3RhbmNlICkKIHsKQEAgLTUzNiw3ICs1MzYsNyBAQAogCiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogICAgICAgICAgIFVucmVnaXN0ZXJDbGFzczMyVyAgICAoVVNFUjMyLjU2MykKKyAqICAgICAgICAgICBVbnJlZ2lzdGVyQ2xhc3MzMlcgICAgKFVTRVIzMi41NjQpCiAgKi8KIEJPT0wzMiBXSU5BUEkgVW5yZWdpc3RlckNsYXNzMzJXKCBMUENXU1RSIGNsYXNzTmFtZSwgSElOU1RBTkNFMzIgaEluc3RhbmNlICkKIHsKQEAgLTU2MCw3ICs1NjAsNyBAQAogCiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogICAgICAgICAgIEdldENsYXNzV29yZDMyICAgIChVU0VSMzIuMjE4KQorICogICAgICAgICAgIEdldENsYXNzV29yZDMyICAgIChVU0VSMzIuMjE5KQogICovCiBXT1JEIFdJTkFQSSBHZXRDbGFzc1dvcmQzMiggSFdORDMyIGh3bmQsIElOVDMyIG9mZnNldCApCiB7CkBAIC02MTMsNyArNjEzLDcgQEAKIAogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqICAgICAgICAgICBHZXRDbGFzc0xvbmczMkEgICAgKFVTRVIzMi4yMTQpCisgKiAgICAgICAgICAgR2V0Q2xhc3NMb25nMzJBICAgIChVU0VSMzIuMjE1KQogICovCiBMT05HIFdJTkFQSSBHZXRDbGFzc0xvbmczMkEoIEhXTkQzMiBod25kLCBJTlQzMiBvZmZzZXQgKQogewpAQCAtNjQ3LDcgKzY0Nyw3IEBACiAKIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiAgICAgICAgICAgR2V0Q2xhc3NMb25nMzJXICAgIChVU0VSMzIuMjE1KQorICogICAgICAgICAgIEdldENsYXNzTG9uZzMyVyAgICAoVVNFUjMyLjIxNikKICAqLwogTE9ORyBXSU5BUEkgR2V0Q2xhc3NMb25nMzJXKCBIV05EMzIgaHduZCwgSU5UMzIgb2Zmc2V0ICkKIHsKQEAgLTY3Nyw3ICs2NzcsNyBAQAogCiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogICAgICAgICAgIFNldENsYXNzV29yZDMyICAgIChVU0VSMzIuNDY4KQorICogICAgICAgICAgIFNldENsYXNzV29yZDMyICAgIChVU0VSMzIuNDY5KQogICovCiBXT1JEIFdJTkFQSSBTZXRDbGFzc1dvcmQzMiggSFdORDMyIGh3bmQsIElOVDMyIG9mZnNldCwgV09SRCBuZXd2YWwgKQogewpAQCAtNzQ1LDcgKzc0NSw3IEBACiAKIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiAgICAgICAgICAgU2V0Q2xhc3NMb25nMzJBICAgIChVU0VSMzIuNDY2KQorICogICAgICAgICAgIFNldENsYXNzTG9uZzMyQSAgICAoVVNFUjMyLjQ2NykKICAqLwogTE9ORyBXSU5BUEkgU2V0Q2xhc3NMb25nMzJBKCBIV05EMzIgaHduZCwgSU5UMzIgb2Zmc2V0LCBMT05HIG5ld3ZhbCApCiB7CkBAIC03OTcsNyArNzk3LDcgQEAKIAogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqICAgICAgICAgICBTZXRDbGFzc0xvbmczMlcgICAgKFVTRVIzMi40NjcpCisgKiAgICAgICAgICAgU2V0Q2xhc3NMb25nMzJXICAgIChVU0VSMzIuNDY4KQogICovCiBMT05HIFdJTkFQSSBTZXRDbGFzc0xvbmczMlcoIEhXTkQzMiBod25kLCBJTlQzMiBvZmZzZXQsIExPTkcgbmV3dmFsICkKIHsKQEAgLTgzNCw3ICs4MzQsNyBAQAogCiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogICAgICAgICAgIEdldENsYXNzTmFtZTMyQSAgICAgIChVU0VSMzIuMjE2KQorICogICAgICAgICAgIEdldENsYXNzTmFtZTMyQSAgICAgIChVU0VSMzIuMjE3KQogICovCiBJTlQzMiBXSU5BUEkgR2V0Q2xhc3NOYW1lMzJBKCBIV05EMzIgaHduZCwgTFBTVFIgYnVmZmVyLCBJTlQzMiBjb3VudCApCiB7CkBAIC04NDUsNyArODQ1LDcgQEAKIAogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqICAgICAgICAgICBHZXRDbGFzc05hbWUzMlcgICAgICAoVVNFUjMyLjIxNykKKyAqICAgICAgICAgICBHZXRDbGFzc05hbWUzMlcgICAgICAoVVNFUjMyLjIxOCkKICAqLwogSU5UMzIgV0lOQVBJIEdldENsYXNzTmFtZTMyVyggSFdORDMyIGh3bmQsIExQV1NUUiBidWZmZXIsIElOVDMyIGNvdW50ICkKIHsKQEAgLTg4OCw3ICs4ODgsNyBAQAogCiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogICAgICAgICAgIEdldENsYXNzSW5mbzMyQSAgICAgIChVU0VSMzIuMjEwKQorICogICAgICAgICAgIEdldENsYXNzSW5mbzMyQSAgICAgIChVU0VSMzIuMjExKQogICovCiBCT09MMzIgV0lOQVBJIEdldENsYXNzSW5mbzMyQSggSElOU1RBTkNFMzIgaEluc3RhbmNlLCBMUENTVFIgbmFtZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXTkRDTEFTUzMyQSAqd2MgKQpAQCAtOTE3LDcgKzkxNyw3IEBACiAKIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiAgICAgICAgICAgR2V0Q2xhc3NJbmZvMzJXICAgICAgKFVTRVIzMi4yMTMpCisgKiAgICAgICAgICAgR2V0Q2xhc3NJbmZvMzJXICAgICAgKFVTRVIzMi4yMTQpCiAgKi8KIEJPT0wzMiBXSU5BUEkgR2V0Q2xhc3NJbmZvMzJXKCBISU5TVEFOQ0UzMiBoSW5zdGFuY2UsIExQQ1dTVFIgbmFtZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXTkRDTEFTUzMyVyAqd2MgKQpAQCAtOTc5LDcgKzk3OSw3IEBACiAKIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiAgICAgICAgICAgR2V0Q2xhc3NJbmZvRXgzMkEgICAgICAoVVNFUjMyLjIxMSkKKyAqICAgICAgICAgICBHZXRDbGFzc0luZm9FeDMyQSAgICAgIChVU0VSMzIuMjEyKQogICovCiBCT09MMzIgV0lOQVBJIEdldENsYXNzSW5mb0V4MzJBKCBISU5TVEFOQ0UzMiBoSW5zdGFuY2UsIExQQ1NUUiBuYW1lLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV05EQ0xBU1NFWDMyQSAqd2MgKQpAQCAtMTAwNyw3ICsxMDA3LDcgQEAKIAogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqICAgICAgICAgICBHZXRDbGFzc0luZm9FeDMyVyAgICAgIChVU0VSMzIuMjEyKQorICogICAgICAgICAgIEdldENsYXNzSW5mb0V4MzJXICAgICAgKFVTRVIzMi4yMTMpCiAgKi8KIEJPT0wzMiBXSU5BUEkgR2V0Q2xhc3NJbmZvRXgzMlcoIEhJTlNUQU5DRTMyIGhJbnN0YW5jZSwgTFBDV1NUUiBuYW1lLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV05EQ0xBU1NFWDMyVyAqd2MgKQpkaWZmIC0tZ2l0IGEvd2luZG93cy9jbGlwYm9hcmQuYyBiL3dpbmRvd3MvY2xpcGJvYXJkLmMKaW5kZXggNWM1MTVkMy4uZWQwNGM2ZCAxMDA2NDQKLS0tIGEvd2luZG93cy9jbGlwYm9hcmQuYworKysgYi93aW5kb3dzL2NsaXBib2FyZC5jCkBAIC0yNTgsNyArMjU4LDcgQEAKIAogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqICAgICAgICAgICAgT3BlbkNsaXBib2FyZDMyICAgKFVTRVIzMi40MDYpCisgKiAgICAgICAgICAgIE9wZW5DbGlwYm9hcmQzMiAgIChVU0VSMzIuNDA3KQogICoKICAqIE5vdGU6IE5ldHNjYXBlIHVzZXMgTlVMTCBoV25kIHRvIG9wZW4gdGhlIGNsaXBib2FyZC4KICAqLwpAQCAtMjkyLDcgKzI5Miw3IEBACiAKIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiAgICAgICAgICAgIENsb3NlQ2xpcGJvYXJkMzIgICAoVVNFUjMyLjUzKQorICogICAgICAgICAgICBDbG9zZUNsaXBib2FyZDMyICAgKFVTRVIzMi41NCkKICAqLwogQk9PTDMyIFdJTkFQSSBDbG9zZUNsaXBib2FyZDMyKHZvaWQpCiB7CkBAIC0zMjAsNyArMzIwLDcgQEAKIAogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqICAgICAgICAgICAgRW1wdHlDbGlwYm9hcmQzMiAgIChVU0VSMzIuMTY4KQorICogICAgICAgICAgICBFbXB0eUNsaXBib2FyZDMyICAgKFVTRVIzMi4xNjkpCiAgKi8KIEJPT0wzMiBXSU5BUEkgRW1wdHlDbGlwYm9hcmQzMih2b2lkKQogewpAQCAtMzcwLDcgKzM3MCw3IEBACiAKIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiAgICAgICAgICAgIEdldENsaXBib2FyZE93bmVyMzIgICAoVVNFUjMyLjIyNCkKKyAqICAgICAgICAgICAgR2V0Q2xpcGJvYXJkT3duZXIzMiAgIChVU0VSMzIuMjI1KQogICovCiBIV05EMzIgV0lOQVBJIEdldENsaXBib2FyZE93bmVyMzIodm9pZCkKIHsKQEAgLTQzOCw3ICs0MzgsNyBAQAogCiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogICAgICAgICAgICBTZXRDbGlwYm9hcmREYXRhMzIgICAoVVNFUjMyLjQ2OSkKKyAqICAgICAgICAgICAgU2V0Q2xpcGJvYXJkRGF0YTMyICAgKFVTRVIzMi40NzApCiAgKi8KIEhBTkRMRTMyIFdJTkFQSSBTZXRDbGlwYm9hcmREYXRhMzIoIFVJTlQzMiB3Rm9ybWF0LCBIQU5ETEUzMiBoRGF0YSApCiB7CkBAIC01NDMsNyArNTQzLDcgQEAKIAogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqICAgICAgICAgICAgIEdldENsaXBib2FyZERhdGEzMiAgIChVU0VSMzIuMjIxKQorICogICAgICAgICAgICAgR2V0Q2xpcGJvYXJkRGF0YTMyICAgKFVTRVIzMi4yMjIpCiAgKi8KIEhBTkRMRTMyIFdJTkFQSSBHZXRDbGlwYm9hcmREYXRhMzIoIFVJTlQzMiB3Rm9ybWF0ICkKIHsKQEAgLTU2MSw3ICs1NjEsNyBAQAogCiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogICAgICAgICAgIENvdW50Q2xpcGJvYXJkRm9ybWF0czMyICAgKFVTRVIzMi42MikKKyAqICAgICAgICAgICBDb3VudENsaXBib2FyZEZvcm1hdHMzMiAgIChVU0VSMzIuNjMpCiAgKi8KIElOVDMyIFdJTkFQSSBDb3VudENsaXBib2FyZEZvcm1hdHMzMih2b2lkKQogewpAQCAtNjAxLDcgKzYwMSw3IEBACiAKIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiAgICAgICAgICAgIEVudW1DbGlwYm9hcmRGb3JtYXRzMzIgICAoVVNFUjMyLjE3OCkKKyAqICAgICAgICAgICAgRW51bUNsaXBib2FyZEZvcm1hdHMzMiAgIChVU0VSMzIuMTc5KQogICovCiBVSU5UMzIgV0lOQVBJIEVudW1DbGlwYm9hcmRGb3JtYXRzMzIoIFVJTlQzMiB3Rm9ybWF0ICkKIHsKQEAgLTY4OCw3ICs2ODgsNyBAQAogCiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogICAgICAgICAgICBSZWdpc3RlckNsaXBib2FyZEZvcm1hdDMyQSAgIChVU0VSMzIuNDMwKQorICogICAgICAgICAgICBSZWdpc3RlckNsaXBib2FyZEZvcm1hdDMyQSAgIChVU0VSMzIuNDMxKQogICovCiBVSU5UMzIgV0lOQVBJIFJlZ2lzdGVyQ2xpcGJvYXJkRm9ybWF0MzJBKCBMUENTVFIgZm9ybWF0TmFtZSApCiB7CkBAIC02OTcsNyArNjk3LDcgQEAKIAogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqICAgICAgICAgICAgUmVnaXN0ZXJDbGlwYm9hcmRGb3JtYXQzMlcgICAoVVNFUjMyLjQzMSkKKyAqICAgICAgICAgICAgUmVnaXN0ZXJDbGlwYm9hcmRGb3JtYXQzMlcgICAoVVNFUjMyLjQzMikKICAqLwogVUlOVDMyIFdJTkFQSSBSZWdpc3RlckNsaXBib2FyZEZvcm1hdDMyVyggTFBDV1NUUiBmb3JtYXROYW1lICkKIHsKQEAgLTcxNyw3ICs3MTcsNyBAQAogCiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogICAgICAgICAgICBHZXRDbGlwYm9hcmRGb3JtYXROYW1lMzJBICAgKFVTRVIzMi4yMjIpCisgKiAgICAgICAgICAgIEdldENsaXBib2FyZEZvcm1hdE5hbWUzMkEgICAoVVNFUjMyLjIyMykKICAqLwogSU5UMzIgV0lOQVBJIEdldENsaXBib2FyZEZvcm1hdE5hbWUzMkEoIFVJTlQzMiB3Rm9ybWF0LCBMUFNUUiByZXRTdHIsIElOVDMyIG1heGxlbiApCiB7CkBAIC03MzYsNyArNzM2LDcgQEAKIAogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqICAgICAgICAgICAgR2V0Q2xpcGJvYXJkRm9ybWF0TmFtZTMyVyAgIChVU0VSMzIuMjIzKQorICogICAgICAgICAgICBHZXRDbGlwYm9hcmRGb3JtYXROYW1lMzJXICAgKFVTRVIzMi4yMjQpCiAgKi8KIElOVDMyIFdJTkFQSSBHZXRDbGlwYm9hcmRGb3JtYXROYW1lMzJXKCBVSU5UMzIgd0Zvcm1hdCwgTFBXU1RSIHJldFN0ciwgSU5UMzIgbWF4bGVuICkKIHsKQEAgLTc1OCw3ICs3NTgsNyBAQAogCiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogICAgICAgICAgICBTZXRDbGlwYm9hcmRWaWV3ZXIzMiAgIChVU0VSMzIuNDcwKQorICogICAgICAgICAgICBTZXRDbGlwYm9hcmRWaWV3ZXIzMiAgIChVU0VSMzIuNDcxKQogICovCiBIV05EMzIgV0lOQVBJIFNldENsaXBib2FyZFZpZXdlcjMyKCBIV05EMzIgaFduZCApCiB7CkBAIC03ODEsNyArNzgxLDcgQEAKIAogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqICAgICAgICAgICBHZXRDbGlwYm9hcmRWaWV3ZXIzMiAgIChVU0VSMzIuMjI1KQorICogICAgICAgICAgIEdldENsaXBib2FyZFZpZXdlcjMyICAgKFVTRVIzMi4yMjYpCiAgKi8KIEhXTkQzMiBXSU5BUEkgR2V0Q2xpcGJvYXJkVmlld2VyMzIodm9pZCkKIHsKQEAgLTc5OCw3ICs3OTgsNyBAQAogfQogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqICAgICAgICAgICBDaGFuZ2VDbGlwYm9hcmRDaGFpbjMyICAgKFVTRVIzMi4yMSkKKyAqICAgICAgICAgICBDaGFuZ2VDbGlwYm9hcmRDaGFpbjMyICAgKFVTRVIzMi4yMikKICAqLwogQk9PTDMyIFdJTkFQSSBDaGFuZ2VDbGlwYm9hcmRDaGFpbjMyKEhXTkQzMiBoV25kLCBIV05EMzIgaFduZE5leHQpCiB7CkBAIC04MzAsNyArODMwLDcgQEAKIAogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqICAgICAgICAgICBJc0NsaXBib2FyZEZvcm1hdEF2YWlsYWJsZTMyICAgKFVTRVIzMi4zMzkpCisgKiAgICAgICAgICAgSXNDbGlwYm9hcmRGb3JtYXRBdmFpbGFibGUzMiAgIChVU0VSMzIuMzQwKQogICovCiBCT09MMzIgV0lOQVBJIElzQ2xpcGJvYXJkRm9ybWF0QXZhaWxhYmxlMzIoIFVJTlQzMiB3Rm9ybWF0ICkKIHsKQEAgLTg1Myw3ICs4NTMsNyBAQAogCiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogICAgICAgICAgICAgR2V0T3BlbkNsaXBib2FyZFdpbmRvdzMyICAgKFVTRVIzMi4yNzYpCisgKiAgICAgICAgICAgICBHZXRPcGVuQ2xpcGJvYXJkV2luZG93MzIgICAoVVNFUjMyLjI3NykKICAqLwogSFdORDMyIFdJTkFQSSBHZXRPcGVuQ2xpcGJvYXJkV2luZG93MzIodm9pZCkKIHsKZGlmZiAtLWdpdCBhL3dpbmRvd3MvZGNlLmMgYi93aW5kb3dzL2RjZS5jCmluZGV4IDlhYjEwNWQuLmRhMWJlZTcgMTAwNjQ0Ci0tLSBhL3dpbmRvd3MvZGNlLmMKKysrIGIvd2luZG93cy9kY2UuYwpAQCAtNDMsMTIgKzQzLDEzIEBACiB7CiAgICAgRENFKiBkY2UgPSBmaXJzdERDRTsKICAgICAKLSAgICBwcmludGYoIkRDRTpcbiIpOworICAgIERVTVAoIkRDRTpcbiIpOwogICAgIHdoaWxlKCBkY2UgKQogICAgIHsKLQlwcmludGYoIlx0WzB4JTA4eF0gaFduZCAweCUwNHgsIGRjeCAlMDh4LCAlcyAlc1xuIiwKLQkodW5zaWduZWQpZGNlLCBkY2UtPmh3bmRDdXJyZW50LCAodW5zaWduZWQpZGNlLT5EQ1hmbGFncywgKGRjZS0+RENYZmxhZ3MgJiBEQ1hfQ0FDSEUpID8KLQkiQ2FjaGUiIDogIk93bmVkIiwgKGRjZS0+RENYZmxhZ3MgJiBEQ1hfRENFQlVTWSkgPyAiSW5Vc2UiIDogIiIgKTsKKwlEVU1QKCJcdFsweCUwOHhdIGhXbmQgMHglMDR4LCBkY3ggJTA4eCwgJXMgJXNcbiIsCisJICAgICAodW5zaWduZWQpZGNlLCBkY2UtPmh3bmRDdXJyZW50LCAodW5zaWduZWQpZGNlLT5EQ1hmbGFncywgCisJICAgICAoZGNlLT5EQ1hmbGFncyAmIERDWF9DQUNIRSkgPyAiQ2FjaGUiIDogIk93bmVkIiwgCisJICAgICAoZGNlLT5EQ1hmbGFncyAmIERDWF9EQ0VCVVNZKSA/ICJJblVzZSIgOiAiIiApOwogCWRjZSA9IGRjZS0+bmV4dDsKICAgICB9CiB9CkBAIC0xNDMsNyArMTQ0LDggQEAKIAkJfQogCQllbHNlIGlmKCBwRENFLT5EQ1hmbGFncyAmIERDWF9EQ0VCVVNZICkgLyogc2hhcmVkIGNhY2hlIERDRSAqLwogCQl7Ci0JCSAgICBmcHJpbnRmKHN0ZGVyciwiWyUwNHhdIEdldERDKCkgd2l0aG91dCBSZWxlYXNlREMoKSFcbiIsIHBXbmQtPmh3bmRTZWxmKTsKKwkJICAgIEVSUihjZCwiWyUwNHhdIEdldERDKCkgd2l0aG91dCBSZWxlYXNlREMoKSFcbiIsIAorCQkJcFduZC0+aHduZFNlbGYpOwogCQkgICAgRENFX1JlbGVhc2VEQyggcERDRSApOwogCQl9CiAKQEAgLTcwOSw4ICs3MTEsOCBAQAogCiAJCWlmKCBkY2UtPmhDbGlwUmduICE9IGhyZ25DbGlwICkKIAkJewotCQkgICAgZnByaW50ZihzdGRuaW1wLCJHZXREQ0V4OiBuZXcgaHJnbkNsaXAgWyUwNHhdIHNtYXNoZXMgdGhlIHByZXZpb3VzIFslMDR4XSFcbiIsCi0JCQkJICAgICBocmduQ2xpcCwgZGNlLT5oQ2xpcFJnbiApOworCQkgICAgRklYTUUoZGMsIm5ldyBocmduQ2xpcFslMDR4XSBzbWFzaGVzIHRoZSBwcmV2aW91c1slMDR4XVxuIiwKKwkJCSAgaHJnbkNsaXAsIGRjZS0+aENsaXBSZ24gKTsKIAkJICAgIERDRV9EZWxldGVDbGlwUmduKCBkY2UgKTsKIAkJfQogCQllbHNlIApAQCAtOTI4LDcgKzkzMCw3IEBACiAJICAgYnJlYWs7CiAKICAgICAgIGRlZmF1bHQ6Ci0JICAgZnByaW50ZihzdGRuaW1wLCJEQ0hvb2s6IHVua25vd24gY29kZVxuIik7CisJICAgRklYTUUoZGMsInVua25vd24gY29kZVxuIik7CiAgICAgfQogICByZXR1cm4gMDsKIH0KZGlmZiAtLWdpdCBhL3dpbmRvd3MvZGVmd25kLmMgYi93aW5kb3dzL2RlZnduZC5jCmluZGV4IDg3YTRkYWEuLjliNDFiZjEgMTAwNjQ0Ci0tLSBhL3dpbmRvd3MvZGVmd25kLmMKKysrIGIvd2luZG93cy9kZWZ3bmQuYwpAQCAtMzYsMTAgKzM2LDEwIEBACiB7CiAgICAgV1BBUkFNMTYgd3AgPSBTSVpFX1JFU1RPUkVEOwogCi0gICAgaWYgKCEoZmxhZ3MgJiBTV1BfTk9NT1ZFKSkKKyAgICBpZiAoIShmbGFncyAmIFNXUF9OT0NMSUVOVE1PVkUpKQogICAgICAgICBTZW5kTWVzc2FnZTE2KCB3bmRQdHItPmh3bmRTZWxmLCBXTV9NT1ZFLCAwLAogICAgICAgICAgICAgICAgICAgICBNQUtFTE9ORyh3bmRQdHItPnJlY3RDbGllbnQubGVmdCwgd25kUHRyLT5yZWN0Q2xpZW50LnRvcCkpOwotICAgIGlmICghKGZsYWdzICYgU1dQX05PU0laRSkpCisgICAgaWYgKCEoZmxhZ3MgJiBTV1BfTk9DTElFTlRTSVpFKSkKICAgICB7CiAgICAgICAgIGlmICh3bmRQdHItPmR3U3R5bGUgJiBXU19NQVhJTUlaRSkgd3AgPSBTSVpFX01BWElNSVpFRDsKICAgICAgICAgZWxzZSBpZiAod25kUHRyLT5kd1N0eWxlICYgV1NfTUlOSU1JWkUpIHdwID0gU0laRV9NSU5JTUlaRUQ7CmRpZmYgLS1naXQgYS93aW5kb3dzL2hvb2suYyBiL3dpbmRvd3MvaG9vay5jCmluZGV4IGZmZDVjZTUuLjc5ZjFhN2IgMTAwNjQ0Ci0tLSBhL3dpbmRvd3MvaG9vay5jCisrKyBiL3dpbmRvd3MvaG9vay5jCkBAIC0yMjEsNyArMjIxLDcgQEAKIAljYXNlIFdIX0hBUkRXQVJFOiAKIAljYXNlIFdIX0ZPUkVHUk9VTkRJRExFOiAKIAljYXNlIFdIX0NBTExXTkRQUk9DUkVUOgotCSAgICBmcHJpbnRmKHN0ZGVyciwgIlx0WyVpXSAxNnRvMzIgdHJhbnNsYXRpb24gdW5pbXBsZW1lbnRlZFxuIiwgaWQpOworCSAgICBGSVhNRShob29rLCAiXHRbJWldIDE2dG8zMiB0cmFuc2xhdGlvbiB1bmltcGxlbWVudGVkXG4iLCBpZCk7CiAgICAgfQogfQogCkBAIC0zMjUsNyArMzI1LDcgQEAKICAgICAgICAgY2FzZSBXSF9IQVJEV0FSRToKIAljYXNlIFdIX0ZPUkVHUk9VTkRJRExFOgogCWNhc2UgV0hfQ0FMTFdORFBST0NSRVQ6Ci0JICAgIGZwcmludGYoc3RkZXJyLCAiXHRbJWldIHNraXBwaW5nIHVubWFwXG4iLCBpZCk7CisJICAgIEZJWE1FKGhvb2ssICJcdFslaV0gc2tpcHBpbmcgdW5tYXBcbiIsIGlkKTsKICAgCSAgICBicmVhazsKICAgICB9CiB9CkBAIC00ODksNyArNDg5LDcgQEAKICAgICAgIGNhc2UgV0hfSEFSRFdBUkU6CiAgICAgICBjYXNlIFdIX0ZPUkVHUk9VTkRJRExFOgogICAgICAgY2FzZSBXSF9DQUxMV05EUFJPQ1JFVDoKLQlmcHJpbnRmKHN0ZGVyciwiXHRbJWldIDMydG8xNiB0cmFuc2xhdGlvbiB1bmltcGxlbWVudGVkXG4iLCBpZCk7CisJRklYTUUoaG9vaywiXHRbJWldIDMydG8xNiB0cmFuc2xhdGlvbiB1bmltcGxlbWVudGVkXG4iLCBpZCk7CiAgICAgfQogfQogCkBAIC02MzUsNyArNjM1LDcgQEAKICAgICAgIGNhc2UgV0hfSEFSRFdBUkU6CiAgICAgICBjYXNlIFdIX0ZPUkVHUk9VTkRJRExFOgogICAgICAgY2FzZSBXSF9DQUxMV05EUFJPQ1JFVDoKLQlmcHJpbnRmKHN0ZGVyciwgIlx0WyVpXSBza2lwcGluZyB1bm1hcFxuIiwgaWQpOworCUZJWE1FKGhvb2ssICJcdFslaV0gc2tpcHBpbmcgdW5tYXBcbiIsIGlkKTsKICAgICB9CiB9CiAKQEAgLTExNzUsNyArMTE3NSw3IEBACiAKICAgICBpZiAoaWQgPT0gV0hfREVCVUcpCiAgICAgewotCWZwcmludGYoIHN0ZG5pbXAsICJXSF9ERUJVRyBpcyBicm9rZW4gaW4gMTYtYml0IFdpbmRvd3MuXG4iKTsKKwlGSVhNRShob29rLCAiV0hfREVCVUcgaXMgYnJva2VuIGluIDE2LWJpdCBXaW5kb3dzLlxuIik7CiAJcmV0dXJuIDA7CiAgICAgfQogCkBAIC0xMzYzLDcgKzEzNjMsNyBAQAogICAgIGZyb210eXBlID0gb2xkaG9vay0+ZmxhZ3MgJiBIT09LX01BUFRZUEU7CiAKICAgICBpZiAoZnJvbXR5cGUgPT0gSE9PS19XSU4xNikKLSAgICAgIGZwcmludGYoc3RkZXJyLCAiQ2FsbE5leHRIb29rRXgzMjogY2FsbGVkIGZyb20gMTZiaXQgaG9vayFcbiIpOworICAgICAgRVJSKGhvb2ssICJjYWxsZWQgZnJvbSAxNmJpdCBob29rIVxuIik7CiAKICAgICByZXR1cm4gSE9PS19DYWxsSG9vayggbmV4dCwgZnJvbXR5cGUsIGNvZGUsIHdQYXJhbSwgbFBhcmFtICk7CiB9CmRpZmYgLS1naXQgYS93aW5kb3dzL2tleWJvYXJkLmMgYi93aW5kb3dzL2tleWJvYXJkLmMKaW5kZXggNTcxN2RiNS4uNmQ5MTM5OCAxMDA2NDQKLS0tIGEvd2luZG93cy9rZXlib2FyZC5jCisrKyBiL3dpbmRvd3Mva2V5Ym9hcmQuYwpAQCAtMjQsNyArMjQsOSBAQAogI2luY2x1ZGUgImtleWJvYXJkLmgiCiAjaW5jbHVkZSAibWVzc2FnZS5oIgogI2luY2x1ZGUgImRlYnVnLmgiCisjaW5jbHVkZSAiZGVidWd0b29scy5oIgogI2luY2x1ZGUgInN0cnVjdDMyLmgiCisjaW5jbHVkZSAid2luZXJyb3IuaCIKIAogQk9PTDMyIE1vdXNlQnV0dG9uc1N0YXRlc1szXTsKIEJPT0wzMiBBc3luY01vdXNlQnV0dG9uc1N0YXRlc1szXTsKQEAgLTYxMSwxNCArNjEzLDYgQEAKICAgICByZXR1cm4gR2V0QXN5bmNLZXlTdGF0ZTMyKG5LZXkpOwogfQogCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiAgICAgICAgICAgICAgICAgICAgQ3JlYXRlQWNjZWxlcmF0b3JUYWJsZSAgIChVU0VSLjY0KQotICovCi1IQUNDRUwzMiBXSU5BUEkgQ3JlYXRlQWNjZWxlcmF0b3JUYWJsZTMyQShMUEFDQ0VMMzIgbHBhY2NlbCwgSU5UMzIgY0VudHJpZXMpIHsKLSAgIGZwcmludGYoc3RkZXJyLCAiQ3JlYXRlQWNjZWxlcmF0b3JUYWJsZTMyQSBTdHViXG4iKTsKLSAgIHJldHVybiBOVUxMOwotfQotCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICoJCQlUcmFuc2xhdGVBY2NlbGVyYXRvciAJW1VTRVIuMTc4XVtVU0VSMzIuNTUxLi5dCiAgKgpAQCAtNzQ1LDIwICs3MzksMjYgQEAKICAgICBMUEFDQ0VMMzIJbHBBY2NlbFRibCA9IChMUEFDQ0VMMzIpTG9ja1Jlc291cmNlMzIoaEFjY2VsKTsKICAgICBpbnQgCWk7CiAgICAgCi0gICAgaWYgKGhBY2NlbCA9PSAwIHx8IG1zZyA9PSBOVUxMKSByZXR1cm4gMDsKLSAgICBpZiAobXNnLT5tZXNzYWdlICE9IFdNX0tFWURPV04gJiYKLSAgICAJbXNnLT5tZXNzYWdlICE9IFdNX0tFWVVQICYmCi0JbXNnLT5tZXNzYWdlICE9IFdNX1NZU0tFWURPV04gJiYKLQltc2ctPm1lc3NhZ2UgIT0gV01fU1lTS0VZVVAgJiYKLSAgICAJbXNnLT5tZXNzYWdlICE9IFdNX0NIQVIpIHJldHVybiAwOworICAgIGlmIChoQWNjZWwgPT0gMCB8fCBtc2cgPT0gTlVMTCB8fAorCShtc2ctPm1lc3NhZ2UgIT0gV01fS0VZRE9XTiAmJgorCSBtc2ctPm1lc3NhZ2UgIT0gV01fS0VZVVAgJiYKKwkgbXNnLT5tZXNzYWdlICE9IFdNX1NZU0tFWURPV04gJiYKKwkgbXNnLT5tZXNzYWdlICE9IFdNX1NZU0tFWVVQICYmCisJIG1zZy0+bWVzc2FnZSAhPSBXTV9DSEFSKSkgeworICAgICAgV0FSTihhY2NlbCwgImVycmFuZW91cyBpbnB1dCBwYXJhbWV0ZXJzXG4iKTsKKyAgICAgIFNldExhc3RFcnJvcihFUlJPUl9JTlZBTElEX1BBUkFNRVRFUik7CisgICAgICByZXR1cm4gMDsKKyAgICB9CiAKLSAgICBUUkFDRShhY2NlbCwgIlRyYW5zbGF0ZUFjY2VsZXJhdG9ycyBoQWNjZWw9JTA0eCwgaFduZD0lMDR4LFwKLW1zZy0+aHduZD0lMDR4LCBtc2ctPm1lc3NhZ2U9JTA0eFxuIiwgaEFjY2VsLGhXbmQsbXNnLT5od25kLG1zZy0+bWVzc2FnZSk7CisgICAgVFJBQ0UoYWNjZWwsICJUcmFuc2xhdGVBY2NlbGVyYXRvcnMgaEFjY2VsPSUwNHgsIGhXbmQ9JTA0eCwiCisJICAibXNnLT5od25kPSUwNHgsIG1zZy0+bWVzc2FnZT0lMDR4XG4iLAorCSAgaEFjY2VsLGhXbmQsbXNnLT5od25kLG1zZy0+bWVzc2FnZSk7CiAKICAgICBmb3IgKGkgPSAwOyBscEFjY2VsVGJsW2ldLmtleSA7IGkrKykKICAgICAJaWYgKEtCRF90cmFuc2xhdGVfYWNjZWxlcmF0b3IoaFduZCxtc2csbHBBY2NlbFRibFtpXS5mVmlydCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbHBBY2NlbFRibFtpXS5rZXksbHBBY2NlbFRibFtpXS5jbWQpKQogCQlyZXR1cm4gMTsKKyAgICBXQVJOKGFjY2VsLCAiY291bGRuJ3QgdHJhbnNsYXRlIGFjY2VsZXJhdG9yIGtleSIpOwogICAgIHJldHVybiAwOwogfQogCQpAQCAtNzY4LDEyICs3NjgsMTYgQEAKICAgICBpbnQgCWk7CiAgICAgTVNHMzIJbXNnMzI7CiAgICAgCi0gICAgaWYgKGhBY2NlbCA9PSAwIHx8IG1zZyA9PSBOVUxMKSByZXR1cm4gMDsKLSAgICBpZiAobXNnLT5tZXNzYWdlICE9IFdNX0tFWURPV04gJiYKLSAgICAJbXNnLT5tZXNzYWdlICE9IFdNX0tFWVVQICYmCi0JbXNnLT5tZXNzYWdlICE9IFdNX1NZU0tFWURPV04gJiYKLQltc2ctPm1lc3NhZ2UgIT0gV01fU1lTS0VZVVAgJiYKLSAgICAJbXNnLT5tZXNzYWdlICE9IFdNX0NIQVIpIHJldHVybiAwOworICAgIGlmIChoQWNjZWwgPT0gMCB8fCBtc2cgPT0gTlVMTCB8fAorCShtc2ctPm1lc3NhZ2UgIT0gV01fS0VZRE9XTiAmJgorCSBtc2ctPm1lc3NhZ2UgIT0gV01fS0VZVVAgJiYKKwkgbXNnLT5tZXNzYWdlICE9IFdNX1NZU0tFWURPV04gJiYKKwkgbXNnLT5tZXNzYWdlICE9IFdNX1NZU0tFWVVQICYmCisJIG1zZy0+bWVzc2FnZSAhPSBXTV9DSEFSKSkgeworICAgICAgV0FSTihhY2NlbCwgImVycmFuZW91cyBpbnB1dCBwYXJhbWV0ZXJzXG4iKTsKKyAgICAgIFNldExhc3RFcnJvcihFUlJPUl9JTlZBTElEX1BBUkFNRVRFUik7CisgICAgICByZXR1cm4gMDsKKyAgICB9CiAKICAgICBUUkFDRShhY2NlbCwgIlRyYW5zbGF0ZUFjY2VsZXJhdG9ycyBoQWNjZWw9JTA0eCwgaFduZD0lMDR4LFwKIG1zZy0+aHduZD0lMDR4LCBtc2ctPm1lc3NhZ2U9JTA0eFxuIiwgaEFjY2VsLGhXbmQsbXNnLT5od25kLG1zZy0+bWVzc2FnZSk7CkBAIC03ODQsNiArNzg4LDcgQEAKICAgICAJaWYgKEtCRF90cmFuc2xhdGVfYWNjZWxlcmF0b3IoaFduZCwmbXNnMzIsbHBBY2NlbFRibFtpXS5mVmlydCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbHBBY2NlbFRibFtpXS5rZXksbHBBY2NlbFRibFtpXS5jbWQpKQogCQlyZXR1cm4gMTsKKyAgICBXQVJOKGFjY2VsLCAiY291bGRuJ3QgdHJhbnNsYXRlIGFjY2VsZXJhdG9yIGtleSIpOwogICAgIHJldHVybiAwOwogfQogCmRpZmYgLS1naXQgYS93aW5kb3dzL21lc3NhZ2UuYyBiL3dpbmRvd3MvbWVzc2FnZS5jCmluZGV4IDI5NGUyNTQuLmU5NmZlNTIgMTAwNjQ0Ci0tLSBhL3dpbmRvd3MvbWVzc2FnZS5jCisrKyBiL3dpbmRvd3MvbWVzc2FnZS5jCkBAIC0xMDkwLDcgKzEwOTAsNyBAQAogCiAgICAgaWYgKCEod25kUHRyID0gV0lOX0ZpbmRXbmRQdHIoIGh3bmQgKSkpCiAgICAgewotICAgICAgICBmcHJpbnRmKCBzdGRlcnIsICJTZW5kTWVzc2FnZTE2OiBpbnZhbGlkIGh3bmQgJTA0eFxuIiwgaHduZCApOworICAgICAgICBXQVJOKG1zZywgImludmFsaWQgaHduZCAlMDR4XG4iLCBod25kICk7CiAgICAgICAgIHJldHVybiAwOwogICAgIH0KICAgICBpZiAoUVVFVUVfSXNFeGl0aW5nUXVldWUod25kUHRyLT5obWVtVGFza1EpKQpAQCAtMTEzNiw3ICsxMTM2LDcgQEAKIEJPT0wzMiBXSU5BUEkgUG9zdFRocmVhZE1lc3NhZ2UzMkEoRFdPUkQgaWRUaHJlYWQgLCBVSU5UMzIgbWVzc2FnZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV1BBUkFNMzIgd1BhcmFtLCBMUEFSQU0gbFBhcmFtICkKIHsKLSAgIGZwcmludGYoc3RkZXJyLCAiUG9zdFRocmVhZE1lc3NhZ2UzMkEgU3R1YlxuIik7CisgICBGSVhNRShzZW5kbXNnLCAiKC4uLik6IFN0dWJcbiIpOwogICAgcmV0dXJuIEZBTFNFOwogfQogCkBAIC0xMTcwLDcgKzExNzAsNyBAQAogCiAgICAgaWYgKCEod25kUHRyID0gV0lOX0ZpbmRXbmRQdHIoIGh3bmQgKSkpCiAgICAgewotICAgICAgICBmcHJpbnRmKCBzdGRlcnIsICJTZW5kTWVzc2FnZTMyQTogaW52YWxpZCBod25kICUwOHhcbiIsIGh3bmQgKTsKKyAgICAgICAgV0FSTihtc2csICJpbnZhbGlkIGh3bmQgJTA4eFxuIiwgaHduZCApOwogICAgICAgICByZXR1cm4gMDsKICAgICB9CiAKQEAgLTEyMjEsNyArMTIyMSw3IEBACiAKICAgICBpZiAoISh3bmRQdHIgPSBXSU5fRmluZFduZFB0ciggaHduZCApKSkKICAgICB7Ci0gICAgICAgIGZwcmludGYoIHN0ZGVyciwgIlNlbmRNZXNzYWdlMzJXOiBpbnZhbGlkIGh3bmQgJTA4eFxuIiwgaHduZCApOworICAgICAgICBXQVJOKG1zZywgImludmFsaWQgaHduZCAlMDh4XG4iLCBod25kICk7CiAgICAgICAgIHJldHVybiAwOwogICAgIH0KICAgICBpZiAoUVVFVUVfSXNFeGl0aW5nUXVldWUod25kUHRyLT5obWVtVGFza1EpKQpAQCAtMTI0OCw3ICsxMjQ4LDcgQEAKIAkJCQkgICAgIExQQVJBTSBsUGFyYW0sIFVJTlQxNiBmbGFncywKIAkJCQkgICAgIFVJTlQxNiB0aW1lb3V0LCBMUFdPUkQgcmVzdWx0cCkKIHsKLSAgZnByaW50ZiAoc3RkbmltcCwgIlNlbmRNZXNzYWdlVGltZW91dDE2IC0tIHNlbWlzdHViXG4iKTsKKyAgRklYTUUoc2VuZG1zZywgIiguLi4pOiBzZW1pc3R1YlxuIik7CiAgIHJldHVybiBTZW5kTWVzc2FnZTE2IChod25kLCBtc2csIHdQYXJhbSwgbFBhcmFtKTsKIH0KIApAQCAtMTI2MCw3ICsxMjYwLDcgQEAKIAkJCQkgICAgICBMUEFSQU0gbFBhcmFtLCBVSU5UMzIgZmxhZ3MsCiAJCQkJICAgICAgVUlOVDMyIHRpbWVvdXQsIExQRFdPUkQgcmVzdWx0cCkKIHsKLSAgZnByaW50ZiAoc3RkbmltcCwgIlNlbmRNZXNzYWdlVGltZW91dDMyQSAtLSBzZW1pc3R1YlxuIik7CisgIEZJWE1FKHNlbmRtc2csICIoLi4uKTogc2VtaXN0dWJcbiIpOwogICByZXR1cm4gU2VuZE1lc3NhZ2UzMkEgKGh3bmQsIG1zZywgd1BhcmFtLCBsUGFyYW0pOwogfQogCkBAIC0xMjcyLDcgKzEyNzIsNyBAQAogCQkJCSAgICAgIExQQVJBTSBsUGFyYW0sIFVJTlQzMiBmbGFncywKIAkJCQkgICAgICBVSU5UMzIgdGltZW91dCwgTFBEV09SRCByZXN1bHRwKQogewotICBmcHJpbnRmIChzdGRuaW1wLCAiU2VuZE1lc3NhZ2VUaW1lb3V0MzJXIC0tIHNlbWlzdHViXG4iKTsKKyAgRklYTUUoc2VuZG1zZywgIiguLi4pOiBzZW1pc3R1YlxuIik7CiAgIHJldHVybiBTZW5kTWVzc2FnZTMyVyAoaHduZCwgbXNnLCB3UGFyYW0sIGxQYXJhbSk7CiB9CiAKQEAgLTE1MzMsOCArMTUzMyw4IEBACiAgICAgaWYgKHBhaW50aW5nICYmICh3bmRQdHIgPSBXSU5fRmluZFduZFB0ciggbXNnLT5od25kICkpICYmCiAgICAgICAgICh3bmRQdHItPmZsYWdzICYgV0lOX05FRURTX0JFR0lOUEFJTlQpICYmIHduZFB0ci0+aHJnblVwZGF0ZSkKICAgICB7Ci0JZnByaW50ZihzdGRlcnIsICJCZWdpblBhaW50IG5vdCBjYWxsZWQgb24gV01fUEFJTlQgZm9yIGh3bmQgJTA0eCFcbiIsIAotCQltc2ctPmh3bmQpOworCUVSUihtc2csICJCZWdpblBhaW50IG5vdCBjYWxsZWQgb24gV01fUEFJTlQgZm9yIGh3bmQgJTA0eCFcbiIsIAorCSAgICBtc2ctPmh3bmQpOwogCXduZFB0ci0+ZmxhZ3MgJj0gfldJTl9ORUVEU19CRUdJTlBBSU5UOwogICAgICAgICAvKiBWYWxpZGF0ZSB0aGUgdXBkYXRlIHJlZ2lvbiB0byBhdm9pZCBpbmZpbml0ZSBXTV9QQUlOVCBsb29wICovCiAgICAgICAgIFZhbGlkYXRlUmVjdDMyKCBtc2ctPmh3bmQsIE5VTEwgKTsKQEAgLTE1ODAsOCArMTU4MCw4IEBACiAgICAgaWYgKHBhaW50aW5nICYmICh3bmRQdHIgPSBXSU5fRmluZFduZFB0ciggbXNnLT5od25kICkpICYmCiAgICAgICAgICh3bmRQdHItPmZsYWdzICYgV0lOX05FRURTX0JFR0lOUEFJTlQpICYmIHduZFB0ci0+aHJnblVwZGF0ZSkKICAgICB7Ci0JZnByaW50ZihzdGRlcnIsICJCZWdpblBhaW50IG5vdCBjYWxsZWQgb24gV01fUEFJTlQgZm9yIGh3bmQgJTA0eCFcbiIsIAotCQltc2ctPmh3bmQpOworCUVSUihtc2csICJCZWdpblBhaW50IG5vdCBjYWxsZWQgb24gV01fUEFJTlQgZm9yIGh3bmQgJTA0eCFcbiIsIAorCSAgICBtc2ctPmh3bmQpOwogCXduZFB0ci0+ZmxhZ3MgJj0gfldJTl9ORUVEU19CRUdJTlBBSU5UOwogICAgICAgICAvKiBWYWxpZGF0ZSB0aGUgdXBkYXRlIHJlZ2lvbiB0byBhdm9pZCBpbmZpbml0ZSBXTV9QQUlOVCBsb29wICovCiAgICAgICAgIFZhbGlkYXRlUmVjdDMyKCBtc2ctPmh3bmQsIE5VTEwgKTsKQEAgLTE2MjcsOCArMTYyNyw4IEBACiAgICAgaWYgKHBhaW50aW5nICYmICh3bmRQdHIgPSBXSU5fRmluZFduZFB0ciggbXNnLT5od25kICkpICYmCiAgICAgICAgICh3bmRQdHItPmZsYWdzICYgV0lOX05FRURTX0JFR0lOUEFJTlQpICYmIHduZFB0ci0+aHJnblVwZGF0ZSkKICAgICB7Ci0JZnByaW50ZihzdGRlcnIsICJCZWdpblBhaW50IG5vdCBjYWxsZWQgb24gV01fUEFJTlQgZm9yIGh3bmQgJTA0eCFcbiIsIAotCQltc2ctPmh3bmQpOworCUVSUihtc2csICJCZWdpblBhaW50IG5vdCBjYWxsZWQgb24gV01fUEFJTlQgZm9yIGh3bmQgJTA0eCFcbiIsIAorCSAgICBtc2ctPmh3bmQpOwogCXduZFB0ci0+ZmxhZ3MgJj0gfldJTl9ORUVEU19CRUdJTlBBSU5UOwogICAgICAgICAvKiBWYWxpZGF0ZSB0aGUgdXBkYXRlIHJlZ2lvbiB0byBhdm9pZCBpbmZpbml0ZSBXTV9QQUlOVCBsb29wICovCiAgICAgICAgIFZhbGlkYXRlUmVjdDMyKCBtc2ctPmh3bmQsIE5VTEwgKTsKQEAgLTE3MTcsOCArMTcxNyw4IEBACiAJRFdPUkQgZHdGbGFncyxMUERXT1JEIHJlY2lwaWVudHMsVUlOVDMyIHVNZXNzYWdlLFdQQVJBTTMyIHdQYXJhbSwKIAlMUEFSQU0gbFBhcmFtCiApIHsKLQlmcHJpbnRmKHN0ZG5pbXAsIkJyb2FkY2FzdFN5c3RlbU1lc3NhZ2UoJTA4bHgsJTA4bHgsJTA4eCwlMDh4LCUwOGx4KSxzdHViIVxuIiwKLQkJZHdGbGFncywqcmVjaXBpZW50cyx1TWVzc2FnZSx3UGFyYW0sbFBhcmFtCisJRklYTUUoc2VuZG1zZywiKCUwOGx4LCUwOGx4LCUwOHgsJTA4eCwlMDhseCk6IHN0dWIhXG4iLAorCSAgICAgIGR3RmxhZ3MsKnJlY2lwaWVudHMsdU1lc3NhZ2Usd1BhcmFtLGxQYXJhbQogCSk7CiAJcmV0dXJuIDA7CiB9CkBAIC0xNzI4LDggKzE3MjgsOCBAQAogICovCiBMT05HIFdJTkFQSSBTZW5kTm90aWZ5TWVzc2FnZTMyQShIV05EMzIgaHduZCxVSU5UMzIgbXNnLFdQQVJBTTMyIHdQYXJhbSxMUEFSQU0gbFBhcmFtKQogewotCWZwcmludGYoc3RkZXJyLCJTZW5kTm90aWZ5TWVzc2FnZTMyQSglMDR4LCUwOGx4LCUwOGx4LCUwOGx4KSxzdHViIVxuIiwKLQkJaHduZCwobG9uZyltc2csKGxvbmcpd1BhcmFtLGxQYXJhbQorCUZJWE1FKG1zZywiKCUwNHgsJTA4bHgsJTA4bHgsJTA4bHgpOiBzdHViIVxuIiwKKwkgICAgICBod25kLChsb25nKW1zZywobG9uZyl3UGFyYW0sbFBhcmFtCiAJKTsKIAlyZXR1cm4gMDsKIH0KZGlmZiAtLWdpdCBhL3dpbmRvd3MvbXNnYm94LmMgYi93aW5kb3dzL21zZ2JveC5jCmluZGV4IGY1ZjkwYmQuLjAxZjQ1ZTIgMTAwNjQ0Ci0tLSBhL3dpbmRvd3MvbXNnYm94LmMKKysrIGIvd2luZG93cy9tc2dib3guYwpAQCAtMTIsNiArMTIsOCBAQAogI2luY2x1ZGUgIndpbi5oIgogI2luY2x1ZGUgInJlc291cmNlLmgiCiAjaW5jbHVkZSAidGFzay5oIgorI2luY2x1ZGUgImRlYnVnLmgiCisjaW5jbHVkZSAiZGVidWdzdHIuaCIKIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKiAgICAgICAgICAgTVNHQk9YX0RsZ1Byb2MKQEAgLTE2OCw2ICsxNzAsOSBAQAogICAgICAgRW5kRGlhbG9nMzIoaHduZCwgd1BhcmFtKTsKICAgICAgIGJyZWFrOwogICAgIH0KKyAgIGRlZmF1bHQ6CisgICAgIC8qIE9rLiBJZ25vcmUgYWxsIHRoZSBvdGhlciBtZXNzYWdlcyAqLworICAgICBUUkFDRSAoZGlhbG9nLCAiTWVzc2FnZSBudW1iZXIgJWkgaXMgYmVpbmcgaWdub3JlZC5cbiIsIG1lc3NhZ2UpOwogICAgIGJyZWFrOwogICB9CiAgIHJldHVybiAwOwpAQCAtMTkxLDcgKzE5Niw4IEBACiAgICAgTVNHQk9YUEFSQU1TMzJBIG1ib3g7CiAKICAgICBpZiAoIXRleHQpIHRleHQ9IjxXSU5FLU5VTEw+IjsKLSAgICBpZiAoIXRpdGxlKSB0aXRsZT0iPFdJTkUtTlVMTD4iOworICAgIGlmICghdGl0bGUpCisgICAgICB0aXRsZT0iRXJyb3IiOwogICAgIG1ib3gubHBzekNhcHRpb24gPSB0aXRsZTsKICAgICBtYm94Lmxwc3pUZXh0ICA9IHRleHQ7CiAgICAgbWJveC5kd1N0eWxlICA9IHR5cGU7CmRpZmYgLS1naXQgYS93aW5kb3dzL3F1ZXVlLmMgYi93aW5kb3dzL3F1ZXVlLmMKaW5kZXggNDRiMGVjNS4uMDkzN2Y5MyAxMDA2NDQKLS0tIGEvd2luZG93cy9xdWV1ZS5jCisrKyBiL3dpbmRvd3MvcXVldWUuYwpAQCAtODExLDYgKzgxMSwxNSBAQAogICAgIHJldHVybiBHZXRJbnB1dFN0YXRlMzIoKTsKIH0KIAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiAgICAgICAgICAgV2FpdEZvcklucHV0SWRsZSAgIChVU0VSMzIuNTc3KQorICovCitEV09SRCBXSU5BUEkgV2FpdEZvcklucHV0SWRsZSAoSEFORExFMzIgaFByb2Nlc3MsIERXT1JEIGR3VGltZU91dCkKK3sKKyAgRklYTUUgKG1zZywgIldhaXRGb3JJbnB1dElkbGU6IHN0dWJcbiIpOworICByZXR1cm4gV0FJVF9USU1FT1VUOworfQorCiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICogICAgICAgICAgIEdldElucHV0U3RhdGUzMiAgIChVU0VSMzIuMjQzKQpkaWZmIC0tZ2l0IGEvd2luZG93cy9zY3JvbGwuYyBiL3dpbmRvd3Mvc2Nyb2xsLmMKaW5kZXggOTY4MjA4Mi4uNzAxZTY5YiAxMDA2NDQKLS0tIGEvd2luZG93cy9zY3JvbGwuYworKysgYi93aW5kb3dzL3Njcm9sbC5jCkBAIC0xNjQsMTAgKzE2NCwxMCBAQAogICAgIGlmICggIWRjIHx8ICFoZGMgKSByZXR1cm4gRkFMU0U7CiAKIC8qCi0gICAgcHJpbnRmKHN0ZGRlYiwiXHRbd25kT3JnWD0laSwgd25kRXh0WD0laSwgdnBvcnRPcmdYPSVpLCB2cG9ydEV4dFg9JWldXG4iLAotCQkgIGRjLT53bmRPcmdYLCBkYy0+d25kRXh0WCwgZGMtPnZwb3J0T3JnWCwgZGMtPnZwb3J0RXh0WCApOwotICAgIHByaW50ZihzdGRkZWIsIlx0W3duZE9yZ1k9JWksIHduZEV4dFk9JWksIHZwb3J0T3JnWT0laSwgdnBvcnRFeHRZPSVpXVxuIiwKLSAgICAgICAgICAgICAgICAgIGRjLT53bmRPcmdZLCBkYy0+d25kRXh0WSwgZGMtPnZwb3J0T3JnWSwgZGMtPnZwb3J0RXh0WSApOworICAgIFRSQUNFKHNjcm9sbCwiXHRbd25kT3JnWD0laSwgd25kRXh0WD0laSwgdnBvcnRPcmdYPSVpLCB2cG9ydEV4dFg9JWldXG4iLAorICAgICAgICAgIGRjLT53bmRPcmdYLCBkYy0+d25kRXh0WCwgZGMtPnZwb3J0T3JnWCwgZGMtPnZwb3J0RXh0WCApOworICAgIFRSQUNFKHNjcm9sbCwiXHRbd25kT3JnWT0laSwgd25kRXh0WT0laSwgdnBvcnRPcmdZPSVpLCB2cG9ydEV4dFk9JWldXG4iLAorCSAgZGMtPnduZE9yZ1ksIGRjLT53bmRFeHRZLCBkYy0+dnBvcnRPcmdZLCBkYy0+dnBvcnRFeHRZICk7CiAqLwogCiAgICAgLyogY29tcHV0ZSBkZXZpY2UgY2xpcHBpbmcgcmVnaW9uICovCmRpZmYgLS1naXQgYS93aW5kb3dzL3VzZXIuYyBiL3dpbmRvd3MvdXNlci5jCmluZGV4IDFjNDIxMzEuLmVjODAxZDYgMTAwNjQ0Ci0tLSBhL3dpbmRvd3MvdXNlci5jCisrKyBiL3dpbmRvd3MvdXNlci5jCkBAIC0yNTcsNyArMjU3LDcgQEAKICAqLwogQk9PTDE2IFdJTkFQSSBFeGl0V2luZG93c0V4ZWMxNiggTFBDU1RSIGxwc3pFeGUsIExQQ1NUUiBscHN6UGFyYW1zICkKIHsKLWZwcmludGYoc3RkbmltcCwgIkV4aXRXaW5kb3dzRXhlYygpIDogU2hvdWxkIHJ1biB0aGUgZm9sbG93aW5nIGluIERPUy1tb2RlIDpcblx0XCIlcyAlc1wiXG4iLAorICAgIGZwcmludGYoc3RkZXJyLCAiRXhpdFdpbmRvd3NFeGVjKCkgOiBTaG91bGQgcnVuIHRoZSBmb2xsb3dpbmcgaW4gRE9TLW1vZGUgOlxuXHRcIiVzICVzXCJcbiIsCiAJbHBzekV4ZSwgbHBzelBhcmFtcyk7CiAgICAgcmV0dXJuIEV4aXRXaW5kb3dzRXgoIEVXWF9MT0dPRkYsIDB4ZmZmZmZmZmYgKTsKIH0KZGlmZiAtLWdpdCBhL3dpbmRvd3Mvd2luLmMgYi93aW5kb3dzL3dpbi5jCmluZGV4IGUwNDEyZGIuLmIxNTE4MWQgMTAwNjQ0Ci0tLSBhL3dpbmRvd3Mvd2luLmMKKysrIGIvd2luZG93cy93aW4uYwpAQCAtMzEsNyArMzEsNiBAQAogI2luY2x1ZGUgIndpbnByb2MuaCIKICNpbmNsdWRlICJ0aHJlYWQuaCIKICNpbmNsdWRlICJkZWJ1Zy5oIgotI2luY2x1ZGUgImRlYnVnc3RyLmgiCiAKIC8qIERlc2t0b3Agd2luZG93ICovCiBzdGF0aWMgV05EICpwV25kRGVza3RvcCA9IE5VTEw7CkBAIC03MDUsMTUgKzcwNCwxOSBAQAogICAgICAgICAgICAgICAgICAgICAgICBMb2FkTWVudShjcy0+aEluc3RhbmNlLChTRUdQVFIpY2xhc3NQdHItPm1lbnVOYW1lQSk7CiAjZWxzZQogCSAgICBTRUdQVFIgbWVudU5hbWUgPSAoU0VHUFRSKUdldENsYXNzTG9uZzE2KCBod25kLCBHQ0xfTUVOVU5BTUUgKTsKLQkgICAgLyogaEluc3RhbmNlIGlzIHN0aWxsIDE2LWJpdCBpbiA5ODAyMTUgd2luZWxpYiAqLwotCSAgICBpZiAoSElXT1JEKGNzLT5oSW5zdGFuY2UpIHx8IF9fd2luZWxpYikKLQkgICAgCWNzLT5oTWVudSA9IExvYWRNZW51MzJBKGNzLT5oSW5zdGFuY2UsUFRSX1NFR19UT19MSU4obWVudU5hbWUpKTsKLQkgICAgZWxzZQotCSAgICAgIC8qIGRvZXNuJ3Qgd29yayBmb3Igd2luZWxpYiwgc2luY2UgcmVzb3VyY2VzIGFyZSB1bmljb2RlICovCi0JICAgIAljcy0+aE1lbnUgPSBMb2FkTWVudTE2KGNzLT5oSW5zdGFuY2UsbWVudU5hbWUpOworICAgICAgICAgICAgaWYgKG1lbnVOYW1lKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIC8qIGhJbnN0YW5jZSBpcyBzdGlsbCAxNi1iaXQgaW4gOTgwMjE1IHdpbmVsaWIgKi8KKyAgICAgICAgICAgICAgICBpZiAoSElXT1JEKGNzLT5oSW5zdGFuY2UpIHx8IF9fd2luZWxpYikKKyAgICAgICAgICAgICAgICAgICAgY3MtPmhNZW51ID0gTG9hZE1lbnUzMkEoY3MtPmhJbnN0YW5jZSxQVFJfU0VHX1RPX0xJTihtZW51TmFtZSkpOworICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgLyogZG9lc24ndCB3b3JrIGZvciB3aW5lbGliLCBzaW5jZSByZXNvdXJjZXMgYXJlIHVuaWNvZGUgKi8KKyAgICAgICAgICAgICAgICAgICAgY3MtPmhNZW51ID0gTG9hZE1lbnUxNihjcy0+aEluc3RhbmNlLG1lbnVOYW1lKTsKKworICAgICAgICAgICAgICAgIGlmIChjcy0+aE1lbnUpIFNldE1lbnUzMiggaHduZCwgY3MtPmhNZW51ICk7CisgICAgICAgICAgICB9CiAjZW5kaWYKICAgICAgICAgfQotICAgICAgICBpZiAoY3MtPmhNZW51KSBTZXRNZW51MzIoIGh3bmQsIGNzLT5oTWVudSApOwogICAgIH0KICAgICBlbHNlIHduZFB0ci0+d0lEbWVudSA9IChVSU5UMzIpY3MtPmhNZW51OwogCkBAIC0xNzQwLDcgKzE3NDMsNyBAQAogSFdORDMyIFdJTkFQSSBHZXRQYXJlbnQzMiggSFdORDMyIGh3bmQgKQogewogICAgIFdORCAqd25kUHRyID0gV0lOX0ZpbmRXbmRQdHIoaHduZCk7Ci0gICAgaWYgKCF3bmRQdHIpIHJldHVybiAwOworICAgIGlmICgoIXduZFB0cikgfHwgKCEod25kUHRyLT5kd1N0eWxlICYgKFdTX1BPUFVQfFdTX0NISUxEKSkpKSByZXR1cm4gMDsKICAgICB3bmRQdHIgPSAod25kUHRyLT5kd1N0eWxlICYgV1NfQ0hJTEQpID8gd25kUHRyLT5wYXJlbnQgOiB3bmRQdHItPm93bmVyOwogICAgIHJldHVybiB3bmRQdHIgPyB3bmRQdHItPmh3bmRTZWxmIDogMDsKIH0KZGlmZiAtLWdpdCBhL3dpbmRvd3Mvd2lucG9zLmMgYi93aW5kb3dzL3dpbnBvcy5jCmluZGV4IDc2MDM4MDcuLmFlYmRjYTggMTAwNjQ0Ci0tLSBhL3dpbmRvd3Mvd2lucG9zLmMKKysrIGIvd2luZG93cy93aW5wb3MuYwpAQCAtNDY1LDcgKzQ2NSw3IEBACiAgICAgewogICAgICAgICBpZiAoISh3bmRQdHIgPSBXSU5fRmluZFduZFB0ciggaHduZEZyb20gKSkpCiAgICAgICAgIHsKLSAgICAgICAgICAgIGZwcmludGYoc3RkZXJyLCJNYXBXaW5kb3dQb2ludHM6IGJhZCBod25kRnJvbSA9ICUwNHhcbiIsaHduZEZyb20pOworICAgICAgICAgICAgRVJSKHdpbiwiYmFkIGh3bmRGcm9tID0gJTA0eFxuIixod25kRnJvbSk7CiAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgIH0KICAgICAgICAgd2hpbGUgKHduZFB0ci0+cGFyZW50KQpAQCAtNDgxLDcgKzQ4MSw3IEBACiAgICAgewogICAgICAgICBpZiAoISh3bmRQdHIgPSBXSU5fRmluZFduZFB0ciggaHduZFRvICkpKQogICAgICAgICB7Ci0gICAgICAgICAgICBmcHJpbnRmKHN0ZGVyciwiTWFwV2luZG93UG9pbnRzOiBiYWQgaHduZFRvID0gJTA0eFxuIiwgaHduZFRvICk7CisgICAgICAgICAgICBFUlIod2luLCJiYWQgaHduZFRvID0gJTA0eFxuIiwgaHduZFRvICk7CiAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgIH0KICAgICAgICAgd2hpbGUgKHduZFB0ci0+cGFyZW50KQpAQCAtNjcyLDcgKzY3Miw3IEBACiAgKi8KIEhXTkQzMiBXSU5BUEkgU2V0U2hlbGxXaW5kb3czMihIV05EMzIgaHduZHNoZWxsKQogewotICAgIGZwcmludGYoIHN0ZG5pbXAsICJTZXRTaGVsbFdpbmRvdyglMDh4KTogZW1wdHkgc3R1YlxuIixod25kc2hlbGwgKTsKKyAgICBGSVhNRSh3aW4sICIoJTA4eCk6IGVtcHR5IHN0dWJcbiIsaHduZHNoZWxsICk7CiAgICAgcmV0dXJuIDA7CiB9CiAKQEAgLTY4Miw3ICs2ODIsNyBAQAogICovCiBIV05EMzIgV0lOQVBJIEdldFNoZWxsV2luZG93MzIodm9pZCkKIHsKLSAgICBmcHJpbnRmKCBzdGRuaW1wLCAiR2V0U2hlbGxXaW5kb3c6IGVtcHR5IHN0dWJcbiIgKTsKKyAgICBGSVhNRSh3aW4sICIodm9pZCk6IGVtcHR5IHN0dWJcbiIgKTsKICAgICByZXR1cm4gMDsKIH0KIApAQCAtMjU2NCw3ICsyNTY0LDcgQEAKICAqLwogdm9pZCBXSU5BUEkgVGlsZUNoaWxkV2luZG93cyggSFdORDE2IHBhcmVudCwgV09SRCBhY3Rpb24gKQogewotICAgIHByaW50ZigiU1RVQiBUaWxlQ2hpbGRXaW5kb3dzKCUwNHgsICVkKVxuIiwgcGFyZW50LCBhY3Rpb24pOworICAgIEZJWE1FKHdpbiwgIiglMDR4LCAlZCk6IHN0dWJcbiIsIHBhcmVudCwgYWN0aW9uKTsKIH0KIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCkBAIC0yNTcyLDUgKzI1NzIsNSBAQAogICovCiB2b2lkIFdJTkFQSSBDYXNjYWRlQ2hpbGRXaW5kb3dzKCBIV05EMTYgcGFyZW50LCBXT1JEIGFjdGlvbiApCiB7Ci0gICAgcHJpbnRmKCJTVFVCIENhc2NhZGVDaGlsZFdpbmRvd3MoJTA0eCwgJWQpXG4iLCBwYXJlbnQsIGFjdGlvbik7CisgICAgRklYTUUod2luLCAiKCUwNHgsICVkKTogc3R1YlxuIiwgcGFyZW50LCBhY3Rpb24pOwogfQo=