LyoKICogQ29weXJpZ2h0IChDKSAyMDEwIE5YUCBTZW1pY29uZHVjdG9ycwogKgogKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgogKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKICoKICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKICoKICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQogKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAogKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAogKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KICovCgovKiEKKiBcZmlsZSAgcGhGcmlOZmNfVG9wYXpNYXAuYwoqIFxicmllZiBORkMgTmRlZiBNYXBwaW5nIEZvciBSZW1vdGUgRGV2aWNlcy4KKgoqIFByb2plY3Q6IE5GQy1GUkkKKgoqICREYXRlOiBNb24gRGVjIDEzIDE0OjE0OjE0IDIwMTAgJAoqICRBdXRob3I6IGluZzAyMjYwICQKKiAkUmV2aXNpb246IDEuMjMgJAoqICRBbGlhc2VzOiAgJAoqCiovCgoKCiNpbmNsdWRlIDxwaEZyaU5mY19OZGVmTWFwLmg+CiNpbmNsdWRlIDxwaEZyaU5mY19Ub3Bhek1hcC5oPgojaW5jbHVkZSA8cGhGcmlOZmNfTWFwVG9vbHMuaD4KI2luY2x1ZGUgPHBoRnJpTmZjX092ckhhbC5oPgoKI2lmbmRlZiBQSF9GUklORkNfTUFQX1RPUEFaX0RJU0FCTEVECi8qISBcaW5ncm91cCBncnBfZmlsZV9hdHRyaWJ1dGVzCiogIFxuYW1lIE5ERUYgTWFwcGluZwoqCiogRmlsZTogXHJlZiBwaEZyaU5mY05kZWZNYXAuYwoqCiovCi8qQHsqLwojZGVmaW5lIFBIRlJJTkZDVE9QQVpNQVBfRklMRVJFVklTSU9OICIkUmV2aXNpb246IDEuMjMgJCIKI2RlZmluZSBQSEZSSU5GQ1RPUEFaTUFQX0ZJTEVBTElBU0VTICAiJEFsaWFzZXM6ICAkIgovKkB9Ki8KLyoqKioqKioqKioqKioqKioqKiBTdGFydCBvZiBtYWNyb3MgKioqKioqKioqKioqKioqKioqKiovCi8qIEJlbG93IE1BQ1JPIGlzIHVzZWQgZm9yIHRoZSBXUklURSBlcnJvciBzY2VuYXJpbywgCiAgICBpbiBjYXNlIFBONTQ0IHJldHVybnMgZXJyb3IgZm9yIGFueSBXUklURSwgdGhlbiAKICAgIHJlYWQgdGhlIHdyaXR0ZW4gYmxvY2sgYW5kIGJ5dGUgbnVtYmVyLCB0byBjaGVjayB0aGUgZGF0YSAKICAgIHdyaXR0ZW4gdG8gdGhlIGNhcmQgaXMgY29ycmVjdCBvciBub3QgCiovCi8qICNkZWZpbmUgVE9QQVpfUkZfRVJST1JfV09SS0FST1VORCAqLwoKI2lmZGVmIEZSSU5GQ19SRUFET05MWV9OREVGCgogICAgI2RlZmluZSBDQ19CTE9DS19OVU1CRVIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgweDAxVSkKICAgICNkZWZpbmUgTE9DS19CTE9DS19OVU1CRVIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoMHgwRVUpCgogICAgI2RlZmluZSBMT0NLMF9CWVRFX05VTUJFUiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgweDAwVSkKICAgICNkZWZpbmUgTE9DSzBfQllURV9WQUxVRSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoMHhGRlUpCgogICAgI2RlZmluZSBMT0NLMV9CWVRFX05VTUJFUiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgweDAxVSkKICAgICNkZWZpbmUgTE9DSzFfQllURV9WQUxVRSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoMHg3RlUpCgogICAgI2RlZmluZSBDQ19SV0FfQllURV9OVU1CRVIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgweDAzVSkKICAgICNkZWZpbmUgQ0NfUkVBRF9PTkxZX1ZBTFVFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoMHgwRlUpCgojZW5kaWYgLyogI2lmZGVmIEZSSU5GQ19SRUFET05MWV9OREVGICovCgojaWZkZWYgVE9QQVpfUkZfRVJST1JfV09SS0FST1VORAoKICAgIC8qIEJlbG93IE1BQ1JPcyBhcmUgYWRkZWQgZm9yIHRoZSBlcnJvciByZXR1cm5lZCBmcm9tIEhBTCwgaWYgdGhlIAogICAgICAgIGJlbG93IGVycm9yIGhhcyBvY2N1cmVkIGR1cmluZyB0aGUgV1JJVEUsIHRoZW4gcmVhZCB0aGUgZXJyb3IgCiAgICAgICAgcmV0dXJuZWQgYmxvY2tzIHRvIGNvbmZpcm0gKi8KICAgICNkZWZpbmUgRlJJTkZDX1JGX1RJTUVPVVRfODkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoMHg4OVUpCiAgICAjZGVmaW5lIEZSSU5GQ19SRl9USU1FT1VUXzkwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKDB4OTBVKQoKICAgIC8qIFN0YXRlIHNwZWNpZmljIHRvIHJlYWQgYWZ0ZXIgdGhlIFJGIEVSUk9SIGZvciB0aGUgV1JJVEUgKi8KICAgICNkZWZpbmUgUEhfRlJJTkZDX1RPUEFaX1NUQVRFX1JGX0VSUk9SX1JFQUQgICAgICAgICAgICAgICAgICAgICAoMHgwRlUpCgojZW5kaWYgLyogI2lmZGVmIFRPUEFaX1JGX0VSUk9SX1dPUktBUk9VTkQgKi8KCi8qKioqKioqKioqKioqKioqKiogRW5kIG9mIG1hY3JvcyAqKioqKioqKioqKioqKioqKioqKi8KCi8qIQoqIFxuYW1lIFRvcGF6IE1hcHBpbmcgLSBIZWxwZXIgRnVuY3Rpb25zCioKKi8KLypAeyovCgovKiEKKiBcYnJpZWYgXGNvcHlkb2MgcGFnZV9vdnIgSGVscGVyIGZ1bmN0aW9uIGZvciBUb3Bhei4gVGhpcyBmdW5jdGlvbiBzaGFsbCByZWFkIDggYnl0ZXMgCiogIGZyb20gdGhlIGNhcmQuCiovCnN0YXRpYyBORkNTVEFUVVMgcGhGcmlOZmNfVHB6X0hfUmRCeXRlcyhwaEZyaU5mY19OZGVmTWFwX3QgKk5kZWZNYXAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MTZfdCAgICAgICAgICAgICBCbG9ja05vLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDE2X3QgICAgICAgICAgICAgQnl0ZU5vKTsKIAovKiEKKiBcYnJpZWYgXGNvcHlkb2MgcGFnZV9vdnIgSGVscGVyIGZ1bmN0aW9uIGZvciBUb3Bhei4gVGhpcyBmdW5jdGlvbiBzaGFsbCBwcm9jZXNzIAoqIHJlYWQgaWQgY29tbWFuZAoqLwpzdGF0aWMgTkZDU1RBVFVTIHBoRnJpTmZjX1Rwel9IX1Byb1JlYWRJRChwaEZyaU5mY19OZGVmTWFwX3QgKk5kZWZNYXApOwoKLyohCiogXGJyaWVmIFxjb3B5ZG9jIHBhZ2Vfb3ZyIEhlbHBlciBmdW5jdGlvbiBmb3IgVG9wYXouIFRoaXMgZnVuY3Rpb24gc2hhbGwgcHJvY2VzcyAKKiByZWFkIGFsbCBjb21tYW5kCiovCnN0YXRpYyBORkNTVEFUVVMgcGhGcmlOZmNfVHB6X0hfUHJvUmVhZEFsbChwaEZyaU5mY19OZGVmTWFwX3QgKk5kZWZNYXApOwoKLyohCiogXGJyaWVmIFxjb3B5ZG9jIHBhZ2Vfb3ZyIEhlbHBlciBmdW5jdGlvbiBmb3IgVG9wYXouIFRoaXMgZnVuY3Rpb24gZGVwZW5kcyBvbgoqIGZ1bmN0aW9uIGNhbGxlZCBieSB0aGUgdXNlcgoqLwpzdGF0aWMgTkZDU1RBVFVTIHBoRnJpTmZjX1Rwel9IX0NhbGxOeHRPcChwaEZyaU5mY19OZGVmTWFwX3QgKk5kZWZNYXApOwoKLyohCiogXGJyaWVmIFxjb3B5ZG9jIHBhZ2Vfb3ZyIEhlbHBlciBmdW5jdGlvbiBmb3IgVG9wYXouIFRoaXMgZnVuY3Rpb24gY2hlY2tzIHRoZSBDQyAKKiBieXRlcwoqLwpzdGF0aWMgTkZDU1RBVFVTIHBoRnJpTmZjX1Rwel9IX0Noa0NDQnl0ZXMocGhGcmlOZmNfTmRlZk1hcF90ICpOZGVmTWFwKTsKCi8qIQoqIFxicmllZiBcY29weWRvYyBwYWdlX292ciBIZWxwZXIgZnVuY3Rpb24gZm9yIFRvcGF6LiBUaGlzIGZ1bmN0aW9uIGZpbmRzIAoqIE5ERUYgVExWCiovCnN0YXRpYyBORkNTVEFUVVMgcGhGcmlOZmNfVHB6X0hfZmluZE5ERUZUTFYocGhGcmlOZmNfTmRlZk1hcF90ICpOZGVmTWFwKTsKCi8qIQoqIFxicmllZiBcY29weWRvYyBwYWdlX292ciBIZWxwZXIgZnVuY3Rpb24gZm9yIFRvcGF6LiBUaGlzIGZ1bmN0aW9uIHdyaXRlcyBhIAoqIGJ5dGUgaW50byB0aGUgY2FyZAoqLwpzdGF0aWMgTkZDU1RBVFVTIHBoRnJpTmZjX1Rwel9IX1dyQUJ5dGUocGhGcmlOZmNfTmRlZk1hcF90ICpOZGVmTWFwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDE2X3QgICAgICAgICAgICAgQmxvY2tObywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQxNl90ICAgICAgICAgICAgIEJ5dGVObywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QgICAgICAgICAgICAgIEJ5dGVWYWwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICk7CgovKiEKKiBcYnJpZWYgXGNvcHlkb2MgcGFnZV9vdnIgSGVscGVyIGZ1bmN0aW9uIGZvciBUb3Bhei4gVGhpcyBmdW5jdGlvbiBzaGFsbCBwcm9jZXNzIHRoZSAKKiBOTU4gd3JpdGUgCiovCnN0YXRpYyBORkNTVEFUVVMgcGhGcmlOZmNfVHB6X0hfUHJvV3JOTU4ocGhGcmlOZmNfTmRlZk1hcF90ICpOZGVmTWFwKTsKCi8qIQoqIFxicmllZiBcY29weWRvYyBwYWdlX292ciBIZWxwZXIgZnVuY3Rpb24gZm9yIFRvcGF6LiBUaGlzIGZ1bmN0aW9uIHdyaXRlcyB0aGUgbGVuZ3RoIGZpZWxkIG9mCiogdGhlIE5ERUYgVExWCiovCnN0YXRpYyBORkNTVEFUVVMgcGhGcmlOZmNfVHB6X0hfUHJvV3JUTFYocGhGcmlOZmNfTmRlZk1hcF90ICpOZGVmTWFwKTsKCi8qIQoqIFxicmllZiBcY29weWRvYyBwYWdlX292ciBIZWxwZXIgZnVuY3Rpb24gZm9yIFRvcGF6LiBUaGlzIGZ1bmN0aW9uIHVwZGF0ZXMgbGVuZ3RoIGZpZWxkIAoqIG9mIHRoZSBOREVGIFRMViBhZnRlciBjb21wbGV0ZSB3cml0ZS4KKi8Kc3RhdGljIE5GQ1NUQVRVUyBwaEZyaU5mY19UcHpfSF9XckxCeXRlKHBoRnJpTmZjX05kZWZNYXBfdCAgKk5kZWZNYXApOwoKLyohCiogXGJyaWVmIFxjb3B5ZG9jIHBhZ2Vfb3ZyIEhlbHBlciBmdW5jdGlvbiBmb3IgVG9wYXouIFRoaXMgZnVuY3Rpb24gY29waWVzIHRoZSBjYXJkIGRhdGEKKiAgdG8gdGhlIHVzZXIgYnVmZmVyCiovCnN0YXRpYyBORkNTVEFUVVMgcGhGcmlOZmNfVHB6X0hfQ3BEYXRhVG9Vc3JCdWYoIHBoRnJpTmZjX05kZWZNYXBfdCAgKk5kZWZNYXApOwoKLyohCiogXGJyaWVmIFxjb3B5ZG9jIHBhZ2Vfb3ZyIEhlbHBlciBmdW5jdGlvbiBmb3IgVG9wYXouIFRoaXMgZnVuY3Rpb24gc2hhbGwgcHJvY2VzcyB0aGUgCiogd3JpdHRlbiBkYXRhCiovCnN0YXRpYyBORkNTVEFUVVMgcGhGcmlOZmNfVHB6X0hfUHJvV3JVc3JEYXRhKCBwaEZyaU5mY19OZGVmTWFwX3QgICpOZGVmTWFwKTsKCi8qIQoqIFxicmllZiBcY29weWRvYyBwYWdlX292ciBIZWxwZXIgZnVuY3Rpb24gZm9yIFRvcGF6LiBUaGlzIGZ1bmN0aW9uIGNoZWNrcyB0aGUgYmxvY2sgCiogbnVtYmVyIGlzIGNvcnJlY3Qgb3Igbm90CiovCnN0YXRpYyB2b2lkIHBoRnJpTmZjX1Rwel9IX0Jsa0NoayhwaEZyaU5mY19OZGVmTWFwX3QgICpOZGVmTWFwKTsKCi8qIQoqIFxicmllZiBcY29weWRvYyBwYWdlX292ciBIZWxwZXIgZnVuY3Rpb24gZm9yIFRvcGF6LiBUaGlzIGZ1bmN0aW9uIHdyaXRlcyB0aGUgMHRoIAoqIGJ5dGUgb2YgYmxvY2sgMSBoYXMgWmVybwoqLwpzdGF0aWMgTkZDU1RBVFVTIHBoRnJpTmZjX1Rwel9IX1dyQnl0ZTBWYWxFMShwaEZyaU5mY19OZGVmTWFwX3QgICAqTmRlZk1hcCk7CgovKiEKKiBcYnJpZWYgXGNvcHlkb2MgcGFnZV9vdnIgSGVscGVyIGZ1bmN0aW9uIGZvciBUb3Bhei4gVGhpcyBmdW5jdGlvbiBjYWxscyB0aGUgCiogY29tcGxldGlvbiByb3V0aW5lCiovCnN0YXRpYyB2b2lkIHBoRnJpTmZjX1Rwel9IX0NvbXBsZXRlKHBoRnJpTmZjX05kZWZNYXBfdCAgKk5kZWZNYXAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5GQ1NUQVRVUyAgICAgICAgICAgU3RhdHVzKTsKCi8qIQoqIFxicmllZiBcY29weWRvYyBwYWdlX292ciBIZWxwZXIgZnVuY3Rpb24gZm9yIFRvcGF6IGNoZWNrIG5kZWYuIFRoaXMgZnVuY3Rpb24gY2hlY2tzIAoqIHRoZSBDQyBieXRlIGluIGNoZWNrIG5kZWYgZnVuY3Rpb24KKi8Kc3RhdGljIE5GQ1NUQVRVUyBwaEZyaU5mY19UcHpfSF9DaGtDQ2luQ2hrTmRlZihwaEZyaU5mY19OZGVmTWFwX3QgICpOZGVmTWFwKTsKCi8qIQoqIFxicmllZiBcY29weWRvYyBwYWdlX292ciBIZWxwZXIgZnVuY3Rpb24gZm9yIFRvcGF6IGNoZWNrIG5kZWYuIFRoaXMgZnVuY3Rpb24gY2hlY2tzIAoqIHRoZSBsb2NrIGJpdHMgYW5kIHNldCBhIGNhcmQgc3RhdGUKKi8Kc3RhdGljIHZvaWQgcGhGcmlOZmNfVHB6X0hfQ2hrTG9ja0JpdHMocGhGcmlOZmNfTmRlZk1hcF90ICAqTmRlZk1hcCk7CgovKiEKKiBcYnJpZWYgXGNvcHlkb2MgcGFnZV9vdnIgSGVscGVyIGZ1bmN0aW9uIGZvciBUb3Bhei4gVGhpcyBmdW5jdGlvbiB3cml0ZXMgQ0MgYnl0ZXMgb3IgCiogdHlwZSBvZiB0aGUgVExWCiovCnN0YXRpYyBORkNTVEFUVVMgcGhGcmlOZmNfVHB6X0hfV3JDQ29yVExWKHBoRnJpTmZjX05kZWZNYXBfdCAgKk5kZWZNYXApOwoKI2lmZGVmIFRPUEFaX1JGX0VSUk9SX1dPUktBUk9VTkQKCi8qIQoqIFxicmllZiBcY29weWRvYyBwYWdlX292ciBIZWxwZXIgZnVuY3Rpb24gZm9yIFRvcGF6LiBUaGlzIGZ1bmN0aW9uIGNoZWNrcyB0aGUgd3JpdHRlbiAgCiogdmFsdWUgYWZ0ZXIgdGhlIAoqLwpzdGF0aWMgCk5GQ1NUQVRVUyAKcGhGcmlOZmNfVHB6X0hfQ2hlY2tXcml0dGVuRGF0YSAoCiAgICBwaEZyaU5mY19OZGVmTWFwX3QgICAgICAgICAgKnBzTmRlZk1hcCwKICAgIHVpbnQ4X3QgICAgICAgICAgICAgICAgICAgICBzdGF0ZV9yZl9lcnJvcik7CgojZW5kaWYgLyogI2lmZGVmIFRPUEFaX1JGX0VSUk9SX1dPUktBUk9VTkQgKi8KCi8qIQoqIFxicmllZiBcY29weWRvYyBwYWdlX292ciBIZWxwZXIgZnVuY3Rpb24gZm9yIFRvcGF6LiBUaGlzIGZ1bmN0aW9uIGNoZWNrcyB0aGUgd3JpdHRlbiAKKiBDQyBieXRlcyBhcmUgY29ycmVjdAoqLwpzdGF0aWMgTkZDU1RBVFVTIHBoRnJpTmZjX1Rwel9IX1Byb0NDVExWKHBoRnJpTmZjX05kZWZNYXBfdCAgKk5kZWZNYXApOwovKkB9Ki8Kdm9pZCBwaEZyaU5mY19Ub3Bhek1hcF9IX1Jlc2V0KHBoRnJpTmZjX05kZWZNYXBfdCAgICAgICAgKk5kZWZNYXApCnsKICAgIC8qIEluaXRpYWxpc2luZyB0aGUgVG9wYXogc3RydWN0dXJlIHZhcmlhYmxlICovCiAgICBOZGVmTWFwLT5Ub3BhekNvbnRhaW5lci5DUkluZGV4ID0gUEhfRlJJTkZDX05ERUZNQVBfQ1JfSU5WQUxJRF9PUEU7CiAgICBOZGVmTWFwLT5Ub3BhekNvbnRhaW5lci5DdXJyZW50QmxvY2sgPSBQSF9GUklORkNfVE9QQVpfVkFMMTsKICAgIE5kZWZNYXAtPlRvcGF6Q29udGFpbmVyLkJ5dGVOdW1iZXIgPSBQSF9GUklORkNfVE9QQVpfVkFMMDsKICAgIE5kZWZNYXAtPlRvcGF6Q29udGFpbmVyLkludGVybmFsU3RhdGUgPSBQSF9GUklORkNfVE9QQVpfVkFMMDsKICAgICh2b2lkKW1lbXNldChOZGVmTWFwLT5Ub3BhekNvbnRhaW5lci5SZWFkQnVmZmVyLCBQSF9GUklORkNfVE9QQVpfVkFMMCwgCiAgICAgICAgICAgICAgICBzaXplb2YoTmRlZk1hcC0+VG9wYXpDb250YWluZXIuUmVhZEJ1ZmZlcikpOwogICAgTmRlZk1hcC0+VG9wYXpDb250YWluZXIuUmVhZFdyaXRlQ29tcGxldGVGbGFnID0gUEhfRlJJTkZDX1RPUEFaX0ZMQUcwOwogICAgTmRlZk1hcC0+VG9wYXpDb250YWluZXIuUmVtYWluaW5nU2l6ZSA9IFBIX0ZSSU5GQ19UT1BBWl9WQUwwOwogICAgKHZvaWQpbWVtc2V0KE5kZWZNYXAtPlRvcGF6Q29udGFpbmVyLlVJRCwgUEhfRlJJTkZDX1RPUEFaX1ZBTDAsIAogICAgICAgICAgICAgICAgc2l6ZW9mKE5kZWZNYXAtPlRvcGF6Q29udGFpbmVyLlVJRCkpOwogICAgTmRlZk1hcC0+VG9wYXpDb250YWluZXIuQ3VyX1JXX0luZGV4PTA7CiAgICBOZGVmTWFwLT5Ub3BhekNvbnRhaW5lci5CeXRlUldGcm1DYXJkID0wOwp9CgovKiEKKiBcYnJpZWYgQ2hlY2sgd2hldGhlciBhIHBhcnRpY3VsYXIgUmVtb3RlIERldmljZSBpcyBOREVGIGNvbXBsaWFudC4KKgoqIFRoZSBmdW5jdGlvbiBjaGVja3Mgd2hldGhlciB0aGUgcGVlciBkZXZpY2UgaXMgTkRFRiBjb21wbGlhbnQuCioKKiBccGFyYW1baW5dIE5kZWZNYXAgUG9pbnRlciB0byBhIHZhbGlkIGluc3RhbmNlIG9mIHRoZSBccmVmIHBoRnJpTmZjX05kZWZNYXBfdCAKKiAgICAgICAgICAgICAgICAgICAgc3RydWN0dXJlIGRlc2NyaWJpbmcgdGhlIGNvbXBvbmVudCBjb250ZXh0LgoqCiogXHJldHZhbCAgTkZDU1RBVFVTX1BFTkRJTkcgICBUaGUgYWN0aW9uIGhhcyBiZWVuIHN1Y2Nlc3NmdWxseSB0cmlnZ2VyZWQuCiogXHJldHZhbCAgT3RoZXJzICAgICAgICAgICAgICBBbiBlcnJvciBoYXMgb2NjdXJyZWQuCioKKi8KCk5GQ1NUQVRVUyBwaEZyaU5mY19Ub3Bhek1hcF9DaGtOZGVmKCBwaEZyaU5mY19OZGVmTWFwX3QgICAgICpOZGVmTWFwKQp7CiAgICBORkNTVEFUVVMgICBSZXN1bHQgPSBQSE5GQ1NUVkFMKENJRF9GUklfTkZDX05ERUZfTUFQLCAKICAgICAgICBORkNTVEFUVVNfSU5WQUxJRF9QQVJBTUVURVIpOwogICAgaWYgKCBOZGVmTWFwICE9IE5VTEwpCiAgICB7CiAgICAgICAgLyogVXBkYXRlIHRoZSBwcmV2aW91cyBvcGVyYXRpb24gKi8KICAgICAgICBOZGVmTWFwLT5QcmV2T3BlcmF0aW9uID0gUEhfRlJJTkZDX05ERUZNQVBfQ0hFQ0tfT1BFOwogICAgICAgIC8qIFVwZGF0ZSB0aGUgQ1IgaW5kZXggdG8ga25vdyBmcm9tIHdoaWNoIG9wZXJhdGlvbiBjb21wbGV0aW9uIAogICAgICAgIHJvdXRpbmUgaGFzIHRvIGJlIGNhbGxlZCAqLwogICAgICAgIE5kZWZNYXAtPlRvcGF6Q29udGFpbmVyLkNSSW5kZXggPSBQSF9GUklORkNfTkRFRk1BUF9DUl9DSEtfTkRFRjsKICAgICAgICBOZGVmTWFwLT5Ub3BhekNvbnRhaW5lci5DdXJyZW50QmxvY2sgPSBQSF9GUklORkNfVE9QQVpfVkFMMTsKICAgICAgICBOZGVmTWFwLT5Ub3BhekNvbnRhaW5lci5CeXRlTnVtYmVyID0gUEhfRlJJTkZDX1RPUEFaX1ZBTDA7CgogICAgICAgIC8qIFNldCBjYXJkIHN0YXRlICovCiAgICAgICAgTmRlZk1hcC0+Q2FyZFR5cGUgPSBQSF9GUklORkNfTkRFRk1BUF9UT1BBWl9DQVJEOwoKICAgICAgICAvKiBDaGFuZ2UgdGhlIHN0YXRlIHRvIENoZWNrIE5kZWYgQ29tcGxpYW50ICovCiAgICAgICAgTmRlZk1hcC0+U3RhdGUgPSBQSF9GUklORkNfVE9QQVpfU1RBVEVfUkVBRElEOwogICAgICAgIE5kZWZNYXAtPlByZXZPcGVyYXRpb24gPSBQSF9GUklORkNfTkRFRk1BUF9DSEVDS19PUEU7CgojaWZkZWYgVE9QQVpfUkFXX1NVUFBPUlQKICAgICAgICBOZGVmTWFwLT5DbWQuSmV3ZWxDbWQgPSBwaEhhbF9lSmV3ZWxfUmF3OyAgCiAgICAgICAgTmRlZk1hcC0+U2VuZFJlY3ZCdWZbUEhfRlJJTkZDX1RPUEFaX1ZBTDBdID0gUEhfRlJJTkZDX1RPUEFaX0NNRF9SRUFESUQ7ICAgICAgICAKI2Vsc2UgICAgICAgIAojaWZkZWYgUEhfSEFMNF9FTkFCTEUKICAgICAgICBOZGVmTWFwLT5DbWQuSmV3ZWxDbWQgPSBwaEhhbF9lSmV3ZWxfUklEOyAgIAojZWxzZQogICAgICAgIE5kZWZNYXAtPkNtZC5KZXdlbENtZCA9IHBoSGFsX2VKZXdlbENtZExpc3RKZXdlbFJpZDsKI2VuZGlmCiNlbmRpZiAvKiAjaWZkZWYgVE9QQVpfUkFXX1NVUFBPUlQgKi8KICAgICAgICAKICAgICAgICBSZXN1bHQgPSBwaEZyaU5mY19UcHpfSF9SZEJ5dGVzKE5kZWZNYXAsIE5kZWZNYXAtPlRvcGF6Q29udGFpbmVyLkN1cnJlbnRCbG9jaywKICAgICAgICAgICAgTmRlZk1hcC0+VG9wYXpDb250YWluZXIuQnl0ZU51bWJlcik7CiAgICB9CiAgICByZXR1cm4gUmVzdWx0OyAgICAKfQoKI2lmZGVmIEZSSU5GQ19SRUFET05MWV9OREVGCgpORkNTVEFUVVMgCnBoRnJpTmZjX1RvcGF6TWFwX0NvbnZlcnRUb1JlYWRPbmx5ICgKICAgIHBoRnJpTmZjX05kZWZNYXBfdCAgICAgICAgICAqTmRlZk1hcCkKewogICAgTkZDU1RBVFVTICAgICAgICAgICAgICAgcmVzdWx0ID0gTkZDU1RBVFVTX1NVQ0NFU1M7CgogICAgcmVzdWx0ID0gcGhGcmlOZmNfVHB6X0hfV3JBQnl0ZSAoTmRlZk1hcCwgQ0NfQkxPQ0tfTlVNQkVSLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0NfUldBX0JZVEVfTlVNQkVSLCBDQ19SRUFEX09OTFlfVkFMVUUpOwoKICAgIGlmIChORkNTVEFUVVNfUEVORElORyA9PSBQSE5GQ1NUQVRVUyhyZXN1bHQpKQogICAgewogICAgICAgIE5kZWZNYXAtPlN0YXRlID0gUEhfRlJJTkZDX1RPUEFaX1NUQVRFX1dSX0NDX0JZVEU7CiAgICB9CiAgICByZXR1cm4gcmVzdWx0Owp9CgojZW5kaWYgLyogI2lmZGVmIEZSSU5GQ19SRUFET05MWV9OREVGICovCgovKiEKKiBcYnJpZWYgSW5pdGlhdGVzIFJlYWRpbmcgb2YgTkRFRiBpbmZvcm1hdGlvbiBmcm9tIHRoZSBSZW1vdGUgRGV2aWNlLgoqCiogVGhlIGZ1bmN0aW9uIGluaXRpYXRlcyB0aGUgcmVhZGluZyBvZiBOREVGIGluZm9ybWF0aW9uIGZyb20gYSBSZW1vdGUgRGV2aWNlLgoqIEl0IHBlcmZvcm1zIGEgcmVzZXQgb2YgdGhlIHN0YXRlIGFuZCBzdGFydHMgdGhlIGFjdGlvbiAoc3RhdGUgbWFjaGluZSkuCiogQSBwZXJpb2RpYyBjYWxsIG9mIHRoZSBccmVmIHBoRnJpTmZjTmRlZk1hcF9Qcm9jZXNzIGhhcyB0byBiZSBkb25lIG9uY2UgdGhlIGFjdGlvbgoqIGhhcyBiZWVuIHRyaWdnZXJlZC4KKi8KTkZDU1RBVFVTIHBoRnJpTmZjX1RvcGF6TWFwX1JkTmRlZiggcGhGcmlOZmNfTmRlZk1hcF90ICAgICAgICAgICAgICAgICAgKk5kZWZNYXAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90ICAgICAgICAgICAgICAgICAgICAgICAgICpQYWNrZXREYXRhLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgICAgICAgICAgICAgICAgICAgICAgICAqUGFja2V0RGF0YUxlbmd0aCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QgICAgICAgICAgICAgICAgICAgICAgICAgT2Zmc2V0KQp7CiAgICBORkNTVEFUVVMgICAgICAgICAgICAgICBSZXN1bHQgPSAgICBORkNTVEFUVVNfU1VDQ0VTUzsKCiAgICAvKiBDb3B5IHVzZXIgYnVmZmVyIHRvIHRoZSBjb250ZXh0ICovCiAgICBOZGVmTWFwLT5BcGR1QnVmZmVyID0gUGFja2V0RGF0YTsKICAgIC8qIENvcHkgdXNlciBsZW5ndGggdG8gdGhlIGNvbnRleHQgKi8KICAgIE5kZWZNYXAtPkFwZHVCdWZmZXJTaXplID0gKlBhY2tldERhdGFMZW5ndGg7CiAgICAvKiBVcGRhdGUgdGhlIHVzZXIgbWVtb3J5IHNpemUgdG8gYSBjb250ZXh0IHZhcmlhYmxlICovCiAgICBOZGVmTWFwLT5OdW1PZkJ5dGVzUmVhZCA9IFBhY2tldERhdGFMZW5ndGg7CiAgICAvKiBOdW1iZXIgb2YgYnl0ZXMgcmVhZCBmcm9tIHRoZSBjYXJkIGlzIHplcm8uIAogICAgVGhpcyB2YXJpYWJsZSByZXR1cm5zIHRoZSBudW1iZXIgb2YgYnl0ZXMgcmVhZCAKICAgIGZyb20gdGhlIGNhcmQuICovCiAgICAqTmRlZk1hcC0+TnVtT2ZCeXRlc1JlYWQgPSBQSF9GUklORkNfVE9QQVpfVkFMMDsKICAgIC8qIEluZGV4IHRvIGtub3cgdGhlIGxlbmd0aCByZWFkICovCiAgICBOZGVmTWFwLT5BcGR1QnVmZkluZGV4ID0gUEhfRlJJTkZDX1RPUEFaX1ZBTDA7ICAgIAogICAgLyogU3RvcmUgdGhlIG9mZnNldCBpbiB0aGUgY29udGV4dCAqLwogICAgTmRlZk1hcC0+T2Zmc2V0ID0gT2Zmc2V0OwogICAgLyogVXBkYXRlIHRoZSBDUiBpbmRleCB0byBrbm93IGZyb20gd2hpY2ggb3BlcmF0aW9uIGNvbXBsZXRpb24gCiAgICByb3V0aW5lIGhhcyB0byBiZSBjYWxsZWQgKi8KICAgIE5kZWZNYXAtPlRvcGF6Q29udGFpbmVyLkNSSW5kZXggPSBQSF9GUklORkNfTkRFRk1BUF9DUl9SRF9OREVGOwoKICAgIGlmKCAoT2Zmc2V0ID09IFBIX0ZSSU5GQ19OREVGTUFQX1NFRUtfQkVHSU4pIHx8ICggTmRlZk1hcC0+UHJldk9wZXJhdGlvbiA9PSAKICAgICAgICBQSF9GUklORkNfTkRFRk1BUF9XUklURV9PUEUpKQogICAgewogICAgICAgIC8qIElmIHByZXZpb3VzIG9wZXJhdGlvbiBpcyBub3QgcmVhZCB0aGVuIHRoZSByZWFkIHNoYWxsIAogICAgICAgIHN0YXJ0IGZyb20gQkVHSU4gKi8KICAgICAgICBOZGVmTWFwLT5PZmZzZXQgPSBQSF9GUklORkNfTkRFRk1BUF9TRUVLX0JFR0lOOwogICAgICAgIC8qIEluaXRpYWxpc2UgY3VycmVudCBibG9jayBhbmQgYnl0ZSBudW1iZXIgKi8KICAgICAgICBOZGVmTWFwLT5Ub3BhekNvbnRhaW5lci5DdXJyZW50QmxvY2sgPSBQSF9GUklORkNfVE9QQVpfVkFMMTsKICAgICAgICBOZGVmTWFwLT5Ub3BhekNvbnRhaW5lci5CeXRlTnVtYmVyID0gUEhfRlJJTkZDX1RPUEFaX1ZBTDA7CiAgICAgICAgLyogU3RhdGUgaGFzIHRvIGJlIGNoYW5nZWQgKi8KICAgICAgICBOZGVmTWFwLT5TdGF0ZSA9IFBIX0ZSSU5GQ19UT1BBWl9TVEFURV9SRUFEQUxMOwogICAgICAgIE5kZWZNYXAtPlRvcGF6Q29udGFpbmVyLlJlYWRXcml0ZUNvbXBsZXRlRmxhZyA9IAogICAgICAgICAgICBQSF9GUklORkNfVE9QQVpfRkxBRzA7CiAgICAgICAgLyogVG9wYXogY29tbWFuZCA9IFJFQURBTEwgKi8KI2lmZGVmIFRPUEFaX1JBV19TVVBQT1JUCiAgICAgICAgTmRlZk1hcC0+Q21kLkpld2VsQ21kID0gcGhIYWxfZUpld2VsX1JhdzsKICAgICAgICBOZGVmTWFwLT5TZW5kUmVjdkJ1ZltQSF9GUklORkNfVE9QQVpfVkFMMF0gPSBQSF9GUklORkNfVE9QQVpfQ01EX1JFQURBTEw7CiNlbHNlICAgICAKCiNpZmRlZiBQSF9IQUw0X0VOQUJMRQogICAgICAgIE5kZWZNYXAtPkNtZC5KZXdlbENtZCA9IHBoSGFsX2VKZXdlbF9SZWFkQWxsOwojZWxzZQogICAgICAgIE5kZWZNYXAtPkNtZC5KZXdlbENtZCA9IHBoSGFsX2VKZXdlbENtZExpc3RKZXdlbFJlYWRBbGw7ICAgICAgICAKI2VuZGlmCgojZW5kaWYgLyogI2lmZGVmIFRPUEFaX1JBV19TVVBQT1JUICovCiAgICB9CiAgICAKICAgIE5kZWZNYXAtPlByZXZPcGVyYXRpb24gPSBQSF9GUklORkNfTkRFRk1BUF9SRUFEX09QRTsKICAgIC8qIE9mZnNldCA9IEN1cnJlbnQsIGJ1dCB0aGUgcmVhZCBoYXMgcmVhY2hlZCB0aGUgRW5kIG9mIENhcmQgKi8KICAgIGlmKCAoT2Zmc2V0ID09IFBIX0ZSSU5GQ19OREVGTUFQX1NFRUtfQ1VSKSAmJgogICAgICAgIChOZGVmTWFwLT5Ub3BhekNvbnRhaW5lci5SZWFkV3JpdGVDb21wbGV0ZUZsYWcgPT0gCiAgICAgICAgUEhfRlJJTkZDX1RPUEFaX0ZMQUcxKSkKICAgIHsKICAgICAgICBSZXN1bHQgPSBQSE5GQ1NUVkFMKENJRF9GUklfTkZDX05ERUZfTUFQLCAKICAgICAgICAgICAgTkZDU1RBVFVTX0VPRl9OREVGX0NPTlRBSU5FUl9SRUFDSEVEKTsgCiAgICB9CiAgICBlbHNlCiAgICB7CiAgICAgICAgLyogaWYgdGhlIG9mZnNldCBpcyBiZWdpbiB0aGVuIGNhbGwgUkVBREFMTCBlbHNlIGNvcHkgdGhlIGRhdGEgCiAgICAgICAgZnJvbSB0aGUgdXNlciBidWZmZXIgKi8KICAgICAgICBSZXN1bHQgPSAoKE9mZnNldCA9PSBQSF9GUklORkNfTkRFRk1BUF9TRUVLX0JFR0lOKT8KICAgICAgICAgICAgcGhGcmlOZmNfVHB6X0hfUmRCeXRlcyhOZGVmTWFwLAogICAgICAgICAgICBOZGVmTWFwLT5Ub3BhekNvbnRhaW5lci5DdXJyZW50QmxvY2ssCiAgICAgICAgICAgIE5kZWZNYXAtPlRvcGF6Q29udGFpbmVyLkJ5dGVOdW1iZXIpOgogICAgICAgIHBoRnJpTmZjX1Rwel9IX0NwRGF0YVRvVXNyQnVmKE5kZWZNYXApKTsKICAgIH0KCiAgICByZXR1cm4gUmVzdWx0Owp9CgovKiEKKiBcYnJpZWYgSW5pdGlhdGVzIFdyaXRpbmcgb2YgTkRFRiBpbmZvcm1hdGlvbiB0byB0aGUgUmVtb3RlIERldmljZS4KKgoqIFRoZSBmdW5jdGlvbiBpbml0aWF0ZXMgdGhlIHdyaXRpbmcgb2YgTkRFRiBpbmZvcm1hdGlvbiB0byBhIFJlbW90ZSBEZXZpY2UuCiogSXQgcGVyZm9ybXMgYSByZXNldCBvZiB0aGUgc3RhdGUgYW5kIHN0YXJ0cyB0aGUgYWN0aW9uIChzdGF0ZSBtYWNoaW5lKS4KKiBBIHBlcmlvZGljIGNhbGwgb2YgdGhlIFxyZWYgcGhGcmlOZmNOZGVmTWFwX1Byb2Nlc3MgaGFzIHRvIGJlIGRvbmUgb25jZSB0aGUgYWN0aW9uCiogaGFzIGJlZW4gdHJpZ2dlcmVkLgoqLwpORkNTVEFUVVMgcGhGcmlOZmNfVG9wYXpNYXBfV3JOZGVmKCBwaEZyaU5mY19OZGVmTWFwX3QgICAgICpOZGVmTWFwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QgICAgICAgICAgICAgICAgICpQYWNrZXREYXRhLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90ICAgICAgICAgICAgICAgICpQYWNrZXREYXRhTGVuZ3RoLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QgICAgICAgICAgICAgICAgIE9mZnNldCkKewogICAgTkZDU1RBVFVTICAgICAgICAgICAgICAgICAgIFJlc3VsdCA9ICAgIE5GQ1NUQVRVU19TVUNDRVNTOwogICAgdWludDhfdCBUZW1wQnl0ZVZhbCA9IDA7CiAgICAvKiBDb3B5IHVzZXIgYnVmZmVyIHRvIHRoZSBjb250ZXh0ICovCiAgICBOZGVmTWFwLT5BcGR1QnVmZmVyID0gUGFja2V0RGF0YTsKICAgIC8qIENvcHkgdXNlciBsZW5ndGggdG8gdGhlIGNvbnRleHQgKi8KICAgIE5kZWZNYXAtPkFwZHVCdWZmZXJTaXplID0gKlBhY2tldERhdGFMZW5ndGg7CiAgICAvKiBJbmRleCB0byBrbm93IHRoZSBsZW5ndGggd3JpdHRlbiAqLwogICAgTmRlZk1hcC0+QXBkdUJ1ZmZJbmRleCA9IFBIX0ZSSU5GQ19UT1BBWl9WQUwwOwogICAgLyogVXBkYXRlIHRoZSB1c2VyIG1lbW9yeSBzaXplIHRvIGEgY29udGV4dCB2YXJpYWJsZSAqLwogICAgTmRlZk1hcC0+V3JOZGVmUGFja2V0TGVuZ3RoID0gUGFja2V0RGF0YUxlbmd0aDsKICAgIC8qIE51bWJlciBvZiBieXRlcyB3cml0dGVuIHRvIHRoZSBjYXJkIGlzIHplcm8uIAogICAgVGhpcyB2YXJpYWJsZSByZXR1cm5zIHRoZSBudW1iZXIgb2YgYnl0ZXMgd3JpdHRlbiAKICAgIHRvIHRoZSBjYXJkLiAqLwogICAgKk5kZWZNYXAtPldyTmRlZlBhY2tldExlbmd0aCA9IFBIX0ZSSU5GQ19UT1BBWl9WQUwwOwogICAgLyogVXBkYXRlIHRoZSBDUiBpbmRleCB0byBrbm93IGZyb20gd2hpY2ggb3BlcmF0aW9uIGNvbXBsZXRpb24gCiAgICByb3V0aW5lIGhhcyB0byBiZSBjYWxsZWQgKi8KICAgIE5kZWZNYXAtPlRvcGF6Q29udGFpbmVyLkNSSW5kZXggPSBQSF9GUklORkNfTkRFRk1BUF9DUl9XUl9OREVGOwogICAgLyogU3RvcmUgdGhlIG9mZnNldCBpbiB0aGUgY29udGV4dCAqLwogICAgTmRlZk1hcC0+T2Zmc2V0ID0gT2Zmc2V0OwoKCiAgICBpZiggKE9mZnNldCA9PSBQSF9GUklORkNfTkRFRk1BUF9TRUVLX0JFR0lOKSB8fCAKICAgICAgICAoTmRlZk1hcC0+UHJldk9wZXJhdGlvbiA9PSBQSF9GUklORkNfTkRFRk1BUF9SRUFEX09QRSkpCiAgICB7CiAgICAgICAgTmRlZk1hcC0+T2Zmc2V0ID0gUEhfRlJJTkZDX05ERUZNQVBfU0VFS19CRUdJTjsKICAgICAgICAvKiBJbml0aWFsaXNlIGN1cnJlbnQgYmxvY2sgYW5kIGJ5dGUgbnVtYmVyICovCiAgICAgICAgTmRlZk1hcC0+VG9wYXpDb250YWluZXIuQ3VycmVudEJsb2NrID0gUEhfRlJJTkZDX1RPUEFaX1ZBTDE7CiAgICAgICAgTmRlZk1hcC0+VG9wYXpDb250YWluZXIuQnl0ZU51bWJlciA9IFBIX0ZSSU5GQ19UT1BBWl9WQUwwOwogICAgICAgIC8qIFN0YXRlIGhhcyB0byBiZSBjaGFuZ2VkICovCiAgICAgICAgTmRlZk1hcC0+U3RhdGUgPSBQSF9GUklORkNfVE9QQVpfU1RBVEVfUkVBREFMTDsKICAgICAgICAvKiBUb3BheiBjb21tYW5kID0gUkVBREFMTCAqLwoKI2lmZGVmIFRPUEFaX1JBV19TVVBQT1JUCiAgICAgICAgTmRlZk1hcC0+Q21kLkpld2VsQ21kID0gcGhIYWxfZUpld2VsX1JhdzsKICAgICAgICBOZGVmTWFwLT5TZW5kUmVjdkJ1ZltQSF9GUklORkNfVE9QQVpfVkFMMF0gPSBQSF9GUklORkNfVE9QQVpfQ01EX1JFQURBTEw7CiNlbHNlCiNpZmRlZiBQSF9IQUw0X0VOQUJMRQogICAgICAgIE5kZWZNYXAtPkNtZC5KZXdlbENtZCA9IHBoSGFsX2VKZXdlbF9SZWFkQWxsOwojZWxzZQogICAgICAgIE5kZWZNYXAtPkNtZC5KZXdlbENtZCA9IHBoSGFsX2VKZXdlbENtZExpc3RKZXdlbFJlYWRBbGw7CiNlbmRpZgojZW5kaWYgIC8qICNpZmRlZiBUT1BBWl9SQVdfU1VQUE9SVCAqLyAgICAgIAogICAgICAgIE5kZWZNYXAtPlRvcGF6Q29udGFpbmVyLlJlYWRXcml0ZUNvbXBsZXRlRmxhZyA9IAogICAgICAgICAgICBQSF9GUklORkNfVE9QQVpfRkxBRzA7CiAgICAgICAgTmRlZk1hcC0+VG9wYXpDb250YWluZXIuUmVtYWluaW5nU2l6ZSA9IE5kZWZNYXAtPkNhcmRNZW1TaXplOyAgICAgICAgCiAgICAgICAgVGVtcEJ5dGVWYWwgPSBOZGVmTWFwLT5TZW5kUmVjdkJ1ZltQSF9GUklORkNfVE9QQVpfVkFMMV07CiAgICB9CiAgICBlbHNlCiAgICB7CiAgICAgICAgLyogU3RhdGUgaGFzIHRvIGJlIGNoYW5nZWQgKi8KICAgICAgICBOZGVmTWFwLT5TdGF0ZSA9IFBIX0ZSSU5GQ19UT1BBWl9TVEFURV9XUklURTsKICAgICAgICAvKiBjb3B5IHRoZSB1c2VyIGRhdGEgdG8gd3JpdGUgaW50byB0aGUgY2FyZCAqLwogICAgICAgIFRlbXBCeXRlVmFsID0gTmRlZk1hcC0+QXBkdUJ1ZmZlcltOZGVmTWFwLT5BcGR1QnVmZkluZGV4XTsKICAgIH0gCgogICAgLyogVXBkYXRlIHRoZSBwcmV2aW91cyBvcGVyYXRpb24gdG8gd3JpdGUgb3BlcmF0aW9uICovCiAgICBOZGVmTWFwLT5QcmV2T3BlcmF0aW9uID0gUEhfRlJJTkZDX05ERUZNQVBfV1JJVEVfT1BFOwogICAgaWYoKE9mZnNldCA9PSBQSF9GUklORkNfTkRFRk1BUF9TRUVLX0NVUikgJiYKICAgICAgICAoTmRlZk1hcC0+VG9wYXpDb250YWluZXIuUmVhZFdyaXRlQ29tcGxldGVGbGFnID09IAogICAgICAgIFBIX0ZSSU5GQ19UT1BBWl9GTEFHMSkpCiAgICB7CiAgICAgICAgLyogT2Zmc2V0ID0gQ3VycmVudCwgYnV0IHRoZSByZWFkIGhhcyByZWFjaGVkIHRoZSBFbmQgb2YgQ2FyZCAqLwogICAgICAgIFJlc3VsdCA9IFBITkZDU1RWQUwoQ0lEX0ZSSV9ORkNfTkRFRl9NQVAsIAogICAgICAgICAgICBORkNTVEFUVVNfRU9GX05ERUZfQ09OVEFJTkVSX1JFQUNIRUQpOyAKICAgIH0KICAgIGVsc2UKICAgIHsKICAgICAgICAvKiBDaGVjayB0aGUgYmxvY2sgKi8KICAgICAgICBwaEZyaU5mY19UcHpfSF9CbGtDaGsoTmRlZk1hcCk7CiAgICAgICAgLyogaWYgb2Zmc2V0IGlzIGJlZ2luIHRoZW4gY2FsbCBSRUFEQUxMIGVsc2Ugc3RhcnQgd3JpdGluZyAqLwogICAgICAgIFJlc3VsdCA9ICgoTmRlZk1hcC0+T2Zmc2V0ID09IFBIX0ZSSU5GQ19OREVGTUFQX1NFRUtfQkVHSU4pPwogICAgICAgICAgICBwaEZyaU5mY19UcHpfSF9SZEJ5dGVzKE5kZWZNYXAsIE5kZWZNYXAtPlRvcGF6Q29udGFpbmVyLkN1cnJlbnRCbG9jaywKICAgICAgICAgICAgTmRlZk1hcC0+VG9wYXpDb250YWluZXIuQnl0ZU51bWJlcik6CiAgICAgICAgICAgIHBoRnJpTmZjX1Rwel9IX1dyQUJ5dGUoTmRlZk1hcCwgTmRlZk1hcC0+VG9wYXpDb250YWluZXIuQ3VycmVudEJsb2NrLAogICAgICAgICAgICBOZGVmTWFwLT5Ub3BhekNvbnRhaW5lci5CeXRlTnVtYmVyLFRlbXBCeXRlVmFsKSk7CiAgICB9CgogICAgcmV0dXJuIFJlc3VsdDsKfQoKCi8qIQoqIFxicmllZiBDb21wbGV0aW9uIFJvdXRpbmUsIFByb2Nlc3NpbmcgZnVuY3Rpb24sIG5lZWRlZCB0byBhdm9pZCBsb25nIGJsb2NraW5nLgoqIFxub3RlIFRoZSBsb3dlciAoT3ZlcmxhcHBlZCBIQUwpIGxheWVyIG11c3QgcmVnaXN0ZXIgYSBwb2ludGVyIHRvIHRoaXMgZnVuY3Rpb24gYXMgYSBDb21wbGV0aW9uCiogICAgICAgUm91dGluZSBpbiBvcmRlciB0byBiZSBhYmxlIHRvIG5vdGlmeSB0aGUgY29tcG9uZW50IHRoYXQgYW4gSS9PIGhhcyBmaW5pc2hlZCBhbmQgZGF0YSBhcmUKKiAgICAgICByZWFkeSB0byBiZSBwcm9jZXNzZWQuCioKKi8KCnZvaWQgcGhGcmlOZmNfVG9wYXpNYXBfUHJvY2Vzcyggdm9pZCAgICAgICAqQ29udGV4dCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5GQ1NUQVRVUyAgIFN0YXR1cykKewoKICAgIHBoRnJpTmZjX05kZWZNYXBfdCAgICAgICAgICAgICAgKnBzTmRlZk1hcCA9IE5VTEw7CgojaWZkZWYgVE9QQVpfUkZfRVJST1JfV09SS0FST1VORAoKICAgIHN0YXRpYyB1aW50OF90ICAgICAgICAgICAgICAgICAgcmZfZXJyb3Jfc3RhdGUgPSAwOwoKI2VuZGlmIC8qICNpZmRlZiBUT1BBWl9SRl9FUlJPUl9XT1JLQVJPVU5EICovCiNpZmRlZiBGUklORkNfUkVBRE9OTFlfTkRFRgogICAgc3RhdGljIHVpbnQ4X3QgICAgICAgICAgICAgICAgICB3cml0dGVuX2xvY2tfYnl0ZSA9IDA7CiNlbmRpZiAvKiAjaWZkZWYgRlJJTkZDX1JFQURPTkxZX05ERUYgKi8KCiAgICBwc05kZWZNYXAgPSAocGhGcmlOZmNfTmRlZk1hcF90ICopQ29udGV4dDsKCiAgICBpZiAoKFN0YXR1cyAmIFBITkZDU1RCTE9XRVIpID09IChORkNTVEFUVVNfU1VDQ0VTUyAmIFBITkZDU1RCTE9XRVIpKQogICAgewogICAgICAgIHN3aXRjaCAocHNOZGVmTWFwLT5TdGF0ZSkKICAgICAgICB7CiNpZmRlZiBGUklORkNfUkVBRE9OTFlfTkRFRgogICAgICAgICAgICBjYXNlIFBIX0ZSSU5GQ19UT1BBWl9TVEFURV9XUl9DQ19CWVRFOgogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBpZigoQ0NfUkVBRF9PTkxZX1ZBTFVFID09ICpwc05kZWZNYXAtPlNlbmRSZWN2QnVmKSAgCiAgICAgICAgICAgICAgICAgICAgJiYgKFBIX0ZSSU5GQ19UT1BBWl9WQUwxID09ICpwc05kZWZNYXAtPlNlbmRSZWN2TGVuZ3RoKSkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICB3cml0dGVuX2xvY2tfYnl0ZSA9IDA7CiNpZmRlZiBUT1BBWl9SQVdfU1VQUE9SVAogICAgICAgICAgICAgICAgICAgICpwc05kZWZNYXAtPlNlbmRSZWN2QnVmID0gUEhfRlJJTkZDX1RPUEFaX0NNRF9SRUFEOwojZWxzZQojaWZkZWYgUEhfSEFMNF9FTkFCTEUKICAgICAgICAgICAgICAgICAgICBwc05kZWZNYXAtPkNtZC5KZXdlbENtZCA9IHBoSGFsX2VKZXdlbF9SZWFkMTsKI2Vsc2UKICAgICAgICAgICAgICAgICAgICBwc05kZWZNYXAtPkNtZC5KZXdlbENtZCA9IHBoSGFsX2VKZXdlbENtZExpc3RKZXdlbFJlYWQxOwojZW5kaWYgLyogI2lmZGVmIFBIX0hBTDRfRU5BQkxFICovCiNlbmRpZiAvKiAjaWZkZWYgVE9QQVpfUkFXX1NVUFBPUlQgKi8KICAgICAgICAgICAgICAgICAgICBTdGF0dXMgPSBwaEZyaU5mY19UcHpfSF9SZEJ5dGVzIChwc05kZWZNYXAsIExPQ0tfQkxPQ0tfTlVNQkVSLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExPQ0swX0JZVEVfTlVNQkVSKTsKCiAgICAgICAgICAgICAgICAgICAgaWYgKE5GQ1NUQVRVU19QRU5ESU5HID09IFBITkZDU1RBVFVTKFN0YXR1cykpCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICBwc05kZWZNYXAtPlN0YXRlID0gUEhfRlJJTkZDX1RPUEFaX1NUQVRFX1JEX0xPQ0swX0JZVEU7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIFN0YXR1cyA9IFBITkZDU1RWQUwoQ0lEX0ZSSV9ORkNfTkRFRl9NQVAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBORkNTVEFUVVNfSU5WQUxJRF9SRUNFSVZFX0xFTkdUSCk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgY2FzZSBQSF9GUklORkNfVE9QQVpfU1RBVEVfUkRfTE9DSzBfQllURToKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgaWYgKFBIX0ZSSU5GQ19UT1BBWl9WQUwxID09ICpwc05kZWZNYXAtPlNlbmRSZWN2TGVuZ3RoKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIFN0YXR1cyA9IHBoRnJpTmZjX1Rwel9IX1dyQUJ5dGUgKHBzTmRlZk1hcCwgTE9DS19CTE9DS19OVU1CRVIsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMT0NLMF9CWVRFX05VTUJFUiwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExPQ0swX0JZVEVfVkFMVUUpOwoKICAgICAgICAgICAgICAgICAgICBpZiAoTkZDU1RBVFVTX1BFTkRJTkcgPT0gUEhORkNTVEFUVVMoU3RhdHVzKSkKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIHBzTmRlZk1hcC0+U3RhdGUgPSBQSF9GUklORkNfVE9QQVpfU1RBVEVfV1JfTE9DSzBfQllURTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgY2FzZSBQSF9GUklORkNfVE9QQVpfU1RBVEVfV1JfTE9DSzBfQllURToKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgaWYoKExPQ0swX0JZVEVfVkFMVUUgPT0gKnBzTmRlZk1hcC0+U2VuZFJlY3ZCdWYpICAKICAgICAgICAgICAgICAgICAgICAmJiAoUEhfRlJJTkZDX1RPUEFaX1ZBTDEgPT0gKnBzTmRlZk1hcC0+U2VuZFJlY3ZMZW5ndGgpKQogICAgICAgICAgICAgICAgewojaWZkZWYgVE9QQVpfUkFXX1NVUFBPUlQKICAgICAgICAgICAgICAgICAgICAqcHNOZGVmTWFwLT5TZW5kUmVjdkJ1ZiA9IFBIX0ZSSU5GQ19UT1BBWl9DTURfUkVBRDsKI2Vsc2UKI2lmZGVmIFBIX0hBTDRfRU5BQkxFCiAgICAgICAgICAgICAgICAgICAgcHNOZGVmTWFwLT5DbWQuSmV3ZWxDbWQgPSBwaEhhbF9lSmV3ZWxfUmVhZDE7CiNlbHNlCiAgICAgICAgICAgICAgICAgICAgcHNOZGVmTWFwLT5DbWQuSmV3ZWxDbWQgPSBwaEhhbF9lSmV3ZWxDbWRMaXN0SmV3ZWxSZWFkMTsKI2VuZGlmIC8qICNpZmRlZiBQSF9IQUw0X0VOQUJMRSAqLwojZW5kaWYgLyogI2lmZGVmIFRPUEFaX1JBV19TVVBQT1JUICovCiAgICAgICAgICAgICAgICAgICAgU3RhdHVzID0gcGhGcmlOZmNfVHB6X0hfUmRCeXRlcyAocHNOZGVmTWFwLCBMT0NLX0JMT0NLX05VTUJFUiwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMT0NLMV9CWVRFX05VTUJFUik7CgogICAgICAgICAgICAgICAgICAgIGlmIChORkNTVEFUVVNfUEVORElORyA9PSBQSE5GQ1NUQVRVUyhTdGF0dXMpKQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgcHNOZGVmTWFwLT5TdGF0ZSA9IFBIX0ZSSU5GQ19UT1BBWl9TVEFURV9SRF9MT0NLMV9CWVRFOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBTdGF0dXMgPSBQSE5GQ1NUVkFMKENJRF9GUklfTkZDX05ERUZfTUFQLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTkZDU1RBVFVTX0lOVkFMSURfUkVDRUlWRV9MRU5HVEgpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CgogICAgICAgICAgICBjYXNlIFBIX0ZSSU5GQ19UT1BBWl9TVEFURV9SRF9MT0NLMV9CWVRFOgogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBpZiAoUEhfRlJJTkZDX1RPUEFaX1ZBTDEgPT0gKnBzTmRlZk1hcC0+U2VuZFJlY3ZMZW5ndGgpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgd3JpdHRlbl9sb2NrX2J5dGUgPSAodWludDhfdCkoKnBzTmRlZk1hcC0+U2VuZFJlY3ZCdWYgfCBMT0NLMV9CWVRFX1ZBTFVFKTsKICAgICAgICAgICAgICAgICAgICBTdGF0dXMgPSBwaEZyaU5mY19UcHpfSF9XckFCeXRlIChwc05kZWZNYXAsIExPQ0tfQkxPQ0tfTlVNQkVSLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTE9DSzFfQllURV9OVU1CRVIsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3cml0dGVuX2xvY2tfYnl0ZSk7CgogICAgICAgICAgICAgICAgICAgIGlmIChORkNTVEFUVVNfUEVORElORyA9PSBQSE5GQ1NUQVRVUyhTdGF0dXMpKQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgcHNOZGVmTWFwLT5TdGF0ZSA9IFBIX0ZSSU5GQ19UT1BBWl9TVEFURV9XUl9MT0NLMV9CWVRFOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICB9CgogICAgICAgICAgICBjYXNlIFBIX0ZSSU5GQ19UT1BBWl9TVEFURV9XUl9MT0NLMV9CWVRFOgogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBpZigod3JpdHRlbl9sb2NrX2J5dGUgPT0gKnBzTmRlZk1hcC0+U2VuZFJlY3ZCdWYpICAKICAgICAgICAgICAgICAgICAgICAmJiAoUEhfRlJJTkZDX1RPUEFaX1ZBTDEgPT0gKnBzTmRlZk1hcC0+U2VuZFJlY3ZMZW5ndGgpKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIHdyaXR0ZW5fbG9ja19ieXRlID0gMDsKICAgICAgICAgICAgICAgICAgICAvKiBEbyBub3RoaW5nICovCiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlbHNlCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgd3JpdHRlbl9sb2NrX2J5dGUgPSAwOwogICAgICAgICAgICAgICAgICAgIFN0YXR1cyA9IFBITkZDU1RWQUwoQ0lEX0ZSSV9ORkNfTkRFRl9NQVAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBORkNTVEFUVVNfSU5WQUxJRF9SRUNFSVZFX0xFTkdUSCk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KI2VuZGlmIC8qICNpZmRlZiBGUklORkNfUkVBRE9OTFlfTkRFRiAqLwogICAgICAgICAgICBjYXNlIFBIX0ZSSU5GQ19UT1BBWl9TVEFURV9XUklURToKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgU3RhdHVzID0gcGhGcmlOZmNfVHB6X0hfUHJvV3JVc3JEYXRhIChwc05kZWZNYXApOwogICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGNhc2UgUEhfRlJJTkZDX1RPUEFaX1NUQVRFX1JFQURJRDoKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgU3RhdHVzID0gcGhGcmlOZmNfVHB6X0hfUHJvUmVhZElEIChwc05kZWZNYXApOwogICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGNhc2UgUEhfRlJJTkZDX1RPUEFaX1NUQVRFX1JFQURBTEw6CiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIFN0YXR1cyA9IHBoRnJpTmZjX1Rwel9IX1Byb1JlYWRBbGwgKHBzTmRlZk1hcCk7CiAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgY2FzZSBQSF9GUklORkNfVE9QQVpfU1RBVEVfV1JJVEVfTk1OOgogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBTdGF0dXMgPSBwaEZyaU5mY19UcHpfSF9Qcm9Xck5NTiAocHNOZGVmTWFwKTsKICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICB9CgogICAgICAgICAgICBjYXNlIFBIX0ZSSU5GQ19UT1BBWl9TVEFURV9XUklURV9MX1RMVjoKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgU3RhdHVzID0gcGhGcmlOZmNfVHB6X0hfUHJvV3JUTFYgKHBzTmRlZk1hcCk7CiAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgY2FzZSBQSF9GUklORkNfVE9QQVpfU1RBVEVfV1JfQ0NfT1JfVExWOgogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBTdGF0dXMgPSBwaEZyaU5mY19UcHpfSF9Qcm9DQ1RMViAocHNOZGVmTWFwKTsKICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICB9CgojaWZkZWYgVE9QQVpfUkZfRVJST1JfV09SS0FST1VORAoKICAgICAgICAgICAgY2FzZSBQSF9GUklORkNfVE9QQVpfU1RBVEVfUkZfRVJST1JfUkVBRDoKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgU3RhdHVzID0gcGhGcmlOZmNfVHB6X0hfQ2hlY2tXcml0dGVuRGF0YSAocHNOZGVmTWFwLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZl9lcnJvcl9zdGF0ZSk7CiAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgfQoKI2VuZGlmIC8qICNpZmRlZiBUT1BBWl9SRl9FUlJPUl9XT1JLQVJPVU5EICovCgogICAgICAgICAgICBkZWZhdWx0OgogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBTdGF0dXMgPSBQSE5GQ1NUVkFMIChDSURfRlJJX05GQ19OREVGX01BUCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTkZDU1RBVFVTX0lOVkFMSURfREVWSUNFX1JFUVVFU1QpOwogICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9CiAgICBlbHNlCiAgICB7CiNpZmRlZiBUT1BBWl9SRl9FUlJPUl9XT1JLQVJPVU5ECgogICAgICAgIGlmICgoRlJJTkZDX1JGX1RJTUVPVVRfODkgPT0gUEhORkNTVEFUVVMgKFN0YXR1cykpIHx8IAogICAgICAgICAgICAoRlJJTkZDX1JGX1RJTUVPVVRfOTAgPT0gUEhORkNTVEFUVVMgKFN0YXR1cykpIHx8IAogICAgICAgICAgICAoTkZDU1RBVFVTX1JGX1RJTUVPVVQgPT0gUEhORkNTVEFUVVMgKFN0YXR1cykpKQogICAgICAgIHsKICAgICAgICAgICAgdWludDhfdCAgICAgICAgICAgICBieXRlX251bWJlciA9IDA7CiAgICAgICAgICAgIHVpbnQ4X3QgICAgICAgICAgICAgYmxvY2tfbnVtYmVyID0gMDsKCiAgICAgICAgICAgIHJmX2Vycm9yX3N0YXRlID0gcHNOZGVmTWFwLT5TdGF0ZTsKCiNpZmRlZiBUT1BBWl9SQVdfU1VQUE9SVAoKICAgICAgICAgICAgKnBzTmRlZk1hcC0+U2VuZFJlY3ZCdWYgPSBQSF9GUklORkNfVE9QQVpfQ01EX1JFQUQ7CgojZWxzZQoKI2lmZGVmIFBIX0hBTDRfRU5BQkxFCgogICAgICAgICAgICBwc05kZWZNYXAtPkNtZC5KZXdlbENtZCA9IHBoSGFsX2VKZXdlbF9SZWFkMTsKCiNlbHNlCgogICAgICAgICAgICBwc05kZWZNYXAtPkNtZC5KZXdlbENtZCA9IHBoSGFsX2VKZXdlbENtZExpc3RKZXdlbFJlYWQxOwoKI2VuZGlmIC8qICNpZmRlZiBQSF9IQUw0X0VOQUJMRSAqLwoKI2VuZGlmIC8qICNpZmRlZiBUT1BBWl9SQVdfU1VQUE9SVCAqLwoKICAgICAgICAgICAgLyogVXBkYXRlIHRoZSBzdGF0ZSB2YXJpYWJsZSB0byB0aGUgbmV3IHdvcmsgYXJvdW5kIHN0YXRlKi8KICAgICAgICAgICAgcHNOZGVmTWFwLT5TdGF0ZSA9IFBIX0ZSSU5GQ19UT1BBWl9TVEFURV9SRl9FUlJPUl9SRUFEOwoKICAgICAgICAgICAgLyogU3dpdGNoIGlzIHVzZWQgdG8ga25vdywgaWYgdGhlIGVycm9yIG9jY3VyZWQgZHVyaW5nIFdSSVRFIG9yIFJFQUQgKi8KICAgICAgICAgICAgc3dpdGNoIChyZl9lcnJvcl9zdGF0ZSkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgY2FzZSBQSF9GUklORkNfVE9QQVpfU1RBVEVfV1JJVEVfTk1OOgogICAgICAgICAgICAgICAgeyAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgLyogQmxvY2sgYW5kIGJ5dGUgbnVtYmVyIGlzIHVwZGF0ZWQgZm9yIE5NTiAqLwogICAgICAgICAgICAgICAgICAgIGJ5dGVfbnVtYmVyID0gUEhfRlJJTkZDX1RPUEFaX1ZBTDA7CiAgICAgICAgICAgICAgICAgICAgYmxvY2tfbnVtYmVyID0gUEhfRlJJTkZDX1RPUEFaX1ZBTDE7CiAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgY2FzZSBQSF9GUklORkNfVE9QQVpfU1RBVEVfV1JJVEVfTF9UTFY6CiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgLyogR2V0IHRoZSBMIGZpZWxkIG9mIHRoZSBUTFYgYmxvY2sgKi8KICAgICAgICAgICAgICAgICAgICBibG9ja19udW1iZXIgPSAodWludDhfdCkoKChwc05kZWZNYXAtPlRMVlN0cnVjdC5OZGVmVExWQnl0ZSArIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUEhfRlJJTkZDX1RPUEFaX1ZBTDEpID4gCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQSF9GUklORkNfVE9QQVpfVkFMNyk/CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAocHNOZGVmTWFwLT5UTFZTdHJ1Y3QuTmRlZlRMVkJsb2NrICsgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQSF9GUklORkNfVE9QQVpfVkFMMSk6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwc05kZWZNYXAtPlRMVlN0cnVjdC5OZGVmVExWQmxvY2spOwogICAgICAgICAgICAgICAgICAgIC8qIEdldCB0aGUgTCBieXRlICovCiAgICAgICAgICAgICAgICAgICAgYnl0ZV9udW1iZXIgPSAodWludDhfdCkoKHBzTmRlZk1hcC0+VExWU3RydWN0Lk5kZWZUTFZCeXRlICsgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQSF9GUklORkNfVE9QQVpfVkFMMSkgJSAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBIX0ZSSU5GQ19UT1BBWl9WQUw4KTsKICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICBjYXNlIFBIX0ZSSU5GQ19UT1BBWl9TVEFURV9XUl9DQ19PUl9UTFY6CiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChwc05kZWZNYXAtPlRvcGF6Q29udGFpbmVyLkludGVybmFsU3RhdGUpCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICBjYXNlIFBIX0ZSSU5GQ19UT1BBWl9XUl9DQ19CWVRFMDoKICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogQmxvY2sgYW5kIGJ5dGUgbnVtYmVyIGlzIHVwZGF0ZWQgZm9yIHRoZSBDQyBieXRlIDAgKi8KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJsb2NrX251bWJlciA9ICh1aW50OF90KVBIX0ZSSU5GQ19UT1BBWl9WQUwxOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgYnl0ZV9udW1iZXIgPSAodWludDhfdClQSF9GUklORkNfVE9QQVpfVkFMMDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgICAgICBjYXNlIFBIX0ZSSU5GQ19UT1BBWl9XUl9DQ19CWVRFMToKICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogQmxvY2sgYW5kIGJ5dGUgbnVtYmVyIGlzIHVwZGF0ZWQgZm9yIHRoZSBDQyBieXRlIDEgKi8KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJsb2NrX251bWJlciA9ICh1aW50OF90KVBIX0ZSSU5GQ19UT1BBWl9WQUwxOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgYnl0ZV9udW1iZXIgPSAodWludDhfdClQSF9GUklORkNfVE9QQVpfVkFMMTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgICAgICBjYXNlIFBIX0ZSSU5GQ19UT1BBWl9XUl9DQ19CWVRFMjoKICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogQmxvY2sgYW5kIGJ5dGUgbnVtYmVyIGlzIHVwZGF0ZWQgZm9yIHRoZSBDQyBieXRlIDIgKi8KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJsb2NrX251bWJlciA9ICh1aW50OF90KVBIX0ZSSU5GQ19UT1BBWl9WQUwxOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgYnl0ZV9udW1iZXIgPSAodWludDhfdClQSF9GUklORkNfVE9QQVpfVkFMMjsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgICAgICBjYXNlIFBIX0ZSSU5GQ19UT1BBWl9XUl9DQ19CWVRFMzoKICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogQmxvY2sgYW5kIGJ5dGUgbnVtYmVyIGlzIHVwZGF0ZWQgZm9yIHRoZSBDQyBieXRlIDMgKi8KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJsb2NrX251bWJlciA9ICh1aW50OF90KVBIX0ZSSU5GQ19UT1BBWl9WQUwxOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgYnl0ZV9udW1iZXIgPSAodWludDhfdClQSF9GUklORkNfVE9QQVpfVkFMMzsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgICAgICBjYXNlIFBIX0ZSSU5GQ19UT1BBWl9XUl9UX09GX1RMVjoKICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogQmxvY2sgYW5kIGJ5dGUgbnVtYmVyIGlzIHVwZGF0ZWQgZm9yIHRoZSBUeXBlIGZpZWxkIG9mIHRoZSBUTFYgKi8KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJsb2NrX251bWJlciA9IHBzTmRlZk1hcC0+VExWU3RydWN0Lk5kZWZUTFZCbG9jazsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ5dGVfbnVtYmVyID0gKHVpbnQ4X3QpcHNOZGVmTWFwLT5UTFZTdHJ1Y3QuTmRlZlRMVkJ5dGU7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogRG8gbm90aGluZyAqLwogICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9IC8qIHN3aXRjaCAocHNOZGVmTWFwLT5Ub3BhekNvbnRhaW5lci5JbnRlcm5hbFN0YXRlKSAqLwogICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIGNhc2UgUEhfRlJJTkZDX1RPUEFaX1NUQVRFX1dSSVRFOiAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAvKiBCbG9jayBhbmQgYnl0ZSBudW1iZXIgaXMgdXBkYXRlZCBmb3IgdGhlIHdyaXR0ZW4gZXJyb3IgZGF0YSAqLyAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgYmxvY2tfbnVtYmVyID0gcHNOZGVmTWFwLT5Ub3BhekNvbnRhaW5lci5DdXJyZW50QmxvY2s7CiAgICAgICAgICAgICAgICAgICAgYnl0ZV9udW1iZXIgPSBwc05kZWZNYXAtPlRvcGF6Q29udGFpbmVyLkJ5dGVOdW1iZXI7ICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgZGVmYXVsdDoKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAvKiBFcnJvciBvY2N1cmVkIGlzIG5vdCBkdXJpbmcgV1JJVEUsIHNvIHVwZGF0ZSAKICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGUgdmFyaWFibGUgdG8gdGhlIHByZXZpb3VzIHN0YXRlICovCiAgICAgICAgICAgICAgICAgICAgcHNOZGVmTWFwLT5TdGF0ZSA9IHJmX2Vycm9yX3N0YXRlOwogICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9IC8qIHN3aXRjaCAocmZfZXJyb3Jfc3RhdGUpICovCgogICAgICAgICAgICAvKiBUaGUgYmVsb3cgY2hlY2sgaXMgYWRkZWQsIHRvIGtub3cgaWYgdGhlIGVycm9yIGlzIGZvciAKICAgICAgICAgICAgdGhlIFdSSVRFIG9yIFJFQUQgc2NlbmFyaW8sIAogICAgICAgICAgICBJZiB0aGUgZXJyb3IgaXMgZm9yIFJFQUQsIHRoZW4gc3RhdGUgdmFyaWFibGUgaXMgbm90IHVwZGF0ZWQKICAgICAgICAgICAgSWYgdGhlIGVycm9yIGlzIGZvciBXUklURSwgdGhlbiBzdGF0ZSB2YXJpYWJsZSBpcyB1cGRhdGVkIHdpdGggCiAgICAgICAgICAgIFBIX0ZSSU5GQ19UT1BBWl9TVEFURV9SRl9FUlJPUl9SRUFEIHZhbHVlICovCiAgICAgICAgICAgIGlmIChQSF9GUklORkNfVE9QQVpfU1RBVEVfUkZfRVJST1JfUkVBRCA9PSBwc05kZWZNYXAtPlN0YXRlKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAvKiBSZWFkIHRoZSBkYXRhIHdpdGggdGhlIHVwZGF0ZWQgYmxvY2sgYW5kIGJ5dGUgbnVtYmVyICovCiAgICAgICAgICAgICAgICBTdGF0dXMgPSBwaEZyaU5mY19UcHpfSF9SZEJ5dGVzIChwc05kZWZNYXAsIGJsb2NrX251bWJlciwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ5dGVfbnVtYmVyKTsKICAgICAgICAgICAgfQogICAgICAgIH0KCiNlbmRpZiAvKiAjaWZkZWYgVE9QQVpfUkZfRVJST1JfV09SS0FST1VORCAqLwogICAgfQoKICAgIC8qIENhbGwgQ29tcGxldGlvbiBSb3V0aW5lLCBpZiBTdGF0dXMgIT0gUEVORElORyAqLwogICAgaWYgKE5GQ1NUQVRVU19QRU5ESU5HICE9IFN0YXR1cykKICAgIHsKICAgICAgICBwaEZyaU5mY19UcHpfSF9Db21wbGV0ZShwc05kZWZNYXAsIFN0YXR1cyk7CiAgICB9Cn0KCgojaWZkZWYgVE9QQVpfUkZfRVJST1JfV09SS0FST1VORAoKc3RhdGljIApORkNTVEFUVVMgCnBoRnJpTmZjX1Rwel9IX0NoZWNrV3JpdHRlbkRhdGEgKAogICAgcGhGcmlOZmNfTmRlZk1hcF90ICAgICAgICAgICpwc05kZWZNYXAsCiAgICB1aW50OF90ICAgICAgICAgICAgICAgICAgICAgc3RhdGVfcmZfZXJyb3IpCnsKICAgIE5GQ1NUQVRVUyAgIHJlc3VsdCA9IE5GQ1NUQVRVU19TVUNDRVNTOwoKICAgIHN3aXRjaCAoc3RhdGVfcmZfZXJyb3IpCiAgICB7CiAgICAgICAgY2FzZSBQSF9GUklORkNfVE9QQVpfU1RBVEVfV1JJVEU6CiAgICAgICAgewogICAgICAgICAgICByZXN1bHQgPSBwaEZyaU5mY19UcHpfSF9Qcm9XclVzckRhdGEgKHBzTmRlZk1hcCk7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgIH0KCiAgICAgICAgY2FzZSBQSF9GUklORkNfVE9QQVpfU1RBVEVfV1JJVEVfTk1OOgogICAgICAgIHsKICAgICAgICAgICAgcmVzdWx0ID0gcGhGcmlOZmNfVHB6X0hfUHJvV3JOTU4gKHBzTmRlZk1hcCk7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgIH0KCiAgICAgICAgY2FzZSBQSF9GUklORkNfVE9QQVpfU1RBVEVfV1JJVEVfTF9UTFY6CiAgICAgICAgewogICAgICAgICAgICByZXN1bHQgPSBwaEZyaU5mY19UcHpfSF9Qcm9XclRMViAocHNOZGVmTWFwKTsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgfQoKICAgICAgICBjYXNlIFBIX0ZSSU5GQ19UT1BBWl9TVEFURV9XUl9DQ19PUl9UTFY6CiAgICAgICAgewogICAgICAgICAgICByZXN1bHQgPSBwaEZyaU5mY19UcHpfSF9Qcm9DQ1RMViAocHNOZGVmTWFwKTsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgfQoKICAgICAgICBkZWZhdWx0OgogICAgICAgIHsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgfQogICAgfQoKICAgIHJldHVybiByZXN1bHQ7Cn0KCgojZW5kaWYgLyogI2lmZGVmIFRPUEFaX1JGX0VSUk9SX1dPUktBUk9VTkQgKi8KCnN0YXRpYyBORkNTVEFUVVMgcGhGcmlOZmNfVHB6X0hfUmRCeXRlcyhwaEZyaU5mY19OZGVmTWFwX3QgKk5kZWZNYXAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MTZfdCAgICAgICAgICAgICBCbG9ja05vLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDE2X3QgICAgICAgICAgICBCeXRlTm8pCnsKICAgIE5GQ1NUQVRVUyAgIFJlc3VsdCA9IE5GQ1NUQVRVU19TVUNDRVNTOwojaWZkZWYgVE9QQVpfUkFXX1NVUFBPUlQKICAgIHVpbnQ4X3QgaW5kZXggPSAwOwojZW5kaWYgLyogI2lmZGVmIFRPUEFaX1JBV19TVVBQT1JUICovCgogICAgLyogc2V0IHRoZSBkYXRhIGZvciBhZGRpdGlvbmFsIGRhdGEgZXhjaGFuZ2UqLwogICAgTmRlZk1hcC0+cHNEZXBBZGRpdGlvbmFsSW5mby5EZXBGbGFncy5NZXRhQ2hhaW5pbmcgPSBQSF9GUklORkNfVE9QQVpfVkFMMDsKICAgIE5kZWZNYXAtPnBzRGVwQWRkaXRpb25hbEluZm8uRGVwRmxhZ3MuTkFEUHJlc2VudCA9IFBIX0ZSSU5GQ19UT1BBWl9WQUwwOwogICAgTmRlZk1hcC0+cHNEZXBBZGRpdGlvbmFsSW5mby5OQUQgPSBQSF9GUklORkNfVE9QQVpfVkFMMDsKCiAgICBOZGVmTWFwLT5NYXBDb21wbGV0aW9uSW5mby5Db21wbGV0aW9uUm91dGluZSA9IHBoRnJpTmZjX1RvcGF6TWFwX1Byb2Nlc3M7CiAgICBOZGVmTWFwLT5NYXBDb21wbGV0aW9uSW5mby5Db250ZXh0ID0gTmRlZk1hcDsKCiAgICAqTmRlZk1hcC0+U2VuZFJlY3ZMZW5ndGggPSBOZGVmTWFwLT5UZW1wUmVjZWl2ZUxlbmd0aDsKCiAgICAvKiBEZXBlbmRpbmcgb24gdGhlIGpld2VsIGNvbW1hbmQsIHRoZSBzZW5kIGxlbmd0aCBpcyBkZWNpZGVkICovCiNpZmRlZiBUT1BBWl9SQVdfU1VQUE9SVAogICAgc3dpdGNoKE5kZWZNYXAtPlNlbmRSZWN2QnVmW1BIX0ZSSU5GQ19UT1BBWl9WQUwwXSkKI2Vsc2UKICAgIHN3aXRjaChOZGVmTWFwLT5DbWQuSmV3ZWxDbWQpCiNlbmRpZiAvKiAjaWZkZWYgVE9QQVpfUkFXX1NVUFBPUlQgKi8KICAgIHsKCiNpZmRlZiBUT1BBWl9SQVdfU1VQUE9SVAogICAgY2FzZSBQSF9GUklORkNfVE9QQVpfQ01EX1JFQURJRDoKI2Vsc2UKI2lmZGVmIFBIX0hBTDRfRU5BQkxFCiAgICBjYXNlIHBoSGFsX2VKZXdlbF9SSUQ6CiNlbHNlCiAgICBjYXNlIHBoSGFsX2VKZXdlbENtZExpc3RKZXdlbFJpZDoKI2VuZGlmCiNlbmRpZiAvKiAjaWZkZWYgVE9QQVpfUkFXX1NVUFBPUlQgKi8KCiNpZmRlZiBUT1BBWl9SQVdfU1VQUE9SVAogICAgICAgIE5kZWZNYXAtPkNtZC5KZXdlbENtZCA9IHBoSGFsX2VKZXdlbF9SYXc7CiAgICAgICAgLypDb3B5IGNvbW1hbmQgdG8gIFNlbmQgQnVmZmVyKi8KICAgICAgICBOZGVmTWFwLT5TZW5kUmVjdkJ1ZltQSF9GUklORkNfVE9QQVpfVkFMMF0gID0gUEhfRlJJTkZDX1RPUEFaX0NNRF9SRUFESUQ7CiAgICAgICAgaW5kZXggKys7ICAgICAgICAKCiAgICAgICAgLypDb3B5IFVJRCBvZiB0aGUgdGFnIHRvICBTZW5kIEJ1ZmZlciovCiAgICAgICAgKHZvaWQpbWVtc2V0KCYoTmRlZk1hcC0+U2VuZFJlY3ZCdWZbUEhfRlJJTkZDX1RPUEFaX1ZBTDFdKSwKICAgICAgICAweDAwLCgweDA2KSk7CiAgICAgICAgaW5kZXggPSBpbmRleCArIDB4MDY7CgogICAgICAgIC8qIFVwZGF0ZSB0aGUgbGVuZ3RoIG9mIHRoZSBjb21tYW5kIGJ1ZmZlciovCiAgICAgICAgTmRlZk1hcC0+U2VuZExlbmd0aCA9IGluZGV4OwojZWxzZQogICAgICAgIC8qIEZvciBSRUFEIElEIGFuZCBSRUFEIEFMTCwgc2VuZCBsZW5ndGggaXMgMCAqLwogICAgICAgIE5kZWZNYXAtPlNlbmRMZW5ndGggPSBQSF9GUklORkNfVE9QQVpfVkFMMDsKI2VuZGlmIC8qICNpZmRlZiBUT1BBWl9SQVdfU1VQUE9SVCAqLwogICAgICAgIGJyZWFrOwoKI2lmZGVmIFRPUEFaX1JBV19TVVBQT1JUCiAgICBjYXNlIFBIX0ZSSU5GQ19UT1BBWl9DTURfUkVBREFMTDoKI2Vsc2UKI2lmZGVmIFBIX0hBTDRfRU5BQkxFCiAgICBjYXNlIHBoSGFsX2VKZXdlbF9SZWFkQWxsOiAgCiNlbHNlCiAgICBjYXNlIHBoSGFsX2VKZXdlbENtZExpc3RKZXdlbFJlYWRBbGw6CiNlbmRpZgojZW5kaWYgLyogI2lmZGVmIFRPUEFaX1JBV19TVVBQT1JUICovCgojaWZkZWYgVE9QQVpfUkFXX1NVUFBPUlQKICAgICAgICBOZGVmTWFwLT5DbWQuSmV3ZWxDbWQgPSBwaEhhbF9lSmV3ZWxfUmF3OwogICAgICAgIC8qQ29weSBjb21tYW5kIHRvICBTZW5kIEJ1ZmZlciovCiAgICAgICAgTmRlZk1hcC0+U2VuZFJlY3ZCdWZbUEhfRlJJTkZDX1RPUEFaX1ZBTDBdICA9IFBIX0ZSSU5GQ19UT1BBWl9DTURfUkVBREFMTDsKICAgICAgICBpbmRleCArKzsKCiAgICAgICAgLypDb3B5IDB4MDAgdG8gU2VuZCBCdWZmZXIqLwogICAgICAgIE5kZWZNYXAtPlNlbmRSZWN2QnVmW1BIX0ZSSU5GQ19UT1BBWl9WQUwxXSA9IDB4MDA7CiAgICAgICAgaW5kZXggKys7CiAgICAgICAgTmRlZk1hcC0+U2VuZFJlY3ZCdWZbUEhfRlJJTkZDX1RPUEFaX1ZBTDJdID0gMHgwMDsKICAgICAgICBpbmRleCArKzsKCiAgICAgICAgLypDb3B5IFVJRCBvZiB0aGUgdGFnIHRvICBTZW5kIEJ1ZmZlciovCiAgICAgICAgKHZvaWQpbWVtY3B5KCYoTmRlZk1hcC0+U2VuZFJlY3ZCdWZbUEhfRlJJTkZDX1RPUEFaX1ZBTDNdKSwKICAgICAgICAmKE5kZWZNYXAtPnBzUmVtb3RlRGV2SW5mby0+UmVtb3RlRGV2SW5mby5KZXdlbF9JbmZvLlVpZCksCiAgICAgICAgVE9QQVpfVUlEX0xFTkdUSF9GT1JfUkVBRF9XUklURSk7CgogICAgICAgIGluZGV4ID0gKHVpbnQ4X3QpKGluZGV4ICsgVE9QQVpfVUlEX0xFTkdUSF9GT1JfUkVBRF9XUklURSk7CgogICAgICAgIC8qIFVwZGF0ZSB0aGUgbGVuZ3RoIG9mIHRoZSBjb21tYW5kIGJ1ZmZlciovCiAgICAgICAgTmRlZk1hcC0+U2VuZExlbmd0aCA9IGluZGV4OwojZWxzZQogICAgICAgLyogRm9yIFJFQUQgSUQgYW5kIFJFQUQgQUxMLCBzZW5kIGxlbmd0aCBpcyAwICovCiAgICAgICAgTmRlZk1hcC0+U2VuZExlbmd0aCA9IFBIX0ZSSU5GQ19UT1BBWl9WQUwwOwojZW5kaWYgLyogI2lmZGVmIFRPUEFaX1JBV19TVVBQT1JUICovCiAgICAgICAgYnJlYWs7CgojaWZkZWYgVE9QQVpfUkFXX1NVUFBPUlQKICAgIGNhc2UgUEhfRlJJTkZDX1RPUEFaX0NNRF9SRUFEOgojZWxzZQojaWZkZWYgUEhfSEFMNF9FTkFCTEUKICAgIGNhc2UgcGhIYWxfZUpld2VsX1JlYWQxOgojZWxzZQogICAgY2FzZSBwaEhhbF9lSmV3ZWxDbWRMaXN0SmV3ZWxSZWFkMToKI2VuZGlmIAoKI2VuZGlmIC8qICNpZmRlZiBUT1BBWl9SQVdfU1VQUE9SVCAqLwoKI2lmZGVmIFRPUEFaX1JBV19TVVBQT1JUCiAgICAgICAgTmRlZk1hcC0+Q21kLkpld2VsQ21kID0gcGhIYWxfZUpld2VsX1JhdzsKICAgICAgICAvKkNvcHkgY29tbWFuZCB0byAgU2VuZCBCdWZmZXIqLwogICAgICAgIE5kZWZNYXAtPlNlbmRSZWN2QnVmW1BIX0ZSSU5GQ19UT1BBWl9WQUwwXSAgPSBQSF9GUklORkNfVE9QQVpfQ01EX1JFQUQ7CiAgICAgICAgaW5kZXggKys7CgogICAgICAgIC8qQ29weSBBZGRyZXNzIHRvICBTZW5kIEJ1ZmZlciovCiAgICAgICAgLyogQ2FsY3VsYXRlIHNlbmQgbGVuZ3RoIAogICAgICAgIDcgfCA2ICAgNSAgIDQgICAzIHwgMiAgIDEgICAwIHwgCiAgICAgICAgfCAgICBibG9jayBubyAgIHwgIGJ5dGUgbm8gIHwgCiAgICAgICAgKi8KICAgICAgICBOZGVmTWFwLT5TZW5kUmVjdkJ1ZltQSF9GUklORkNfVE9QQVpfVkFMMV0gPSAKICAgICAgICAgICAgICAgICh1aW50OF90KSgoQmxvY2tObyA8PCBQSF9GUklORkNfVE9QQVpfU0hJRlQzKSArIAogICAgICAgICAgICAgICAgQnl0ZU5vKTsKICAgICAgICBpbmRleCArKzsKICAgICAgICAvKkNvcHkgMHgwMCB0byAgU2VuZCBCdWZmZXIqLwogICAgICAgIE5kZWZNYXAtPlNlbmRSZWN2QnVmW1BIX0ZSSU5GQ19UT1BBWl9WQUwyXSA9IDB4MDA7CiAgICAgICAgaW5kZXggKys7CgogICAgICAgIC8qQ29weSBVSUQgb2YgdGhlIHRhZyB0byAgU2VuZCBCdWZmZXIqLwogICAgICAgICh2b2lkKW1lbWNweSgmKE5kZWZNYXAtPlNlbmRSZWN2QnVmW1BIX0ZSSU5GQ19UT1BBWl9WQUwzXSksCiAgICAgICAgJihOZGVmTWFwLT5wc1JlbW90ZURldkluZm8tPlJlbW90ZURldkluZm8uSmV3ZWxfSW5mby5VaWQpLAogICAgICAgIFRPUEFaX1VJRF9MRU5HVEhfRk9SX1JFQURfV1JJVEUpOwogICAgICAgIGluZGV4ID0gKHVpbnQ4X3QpKGluZGV4ICsgVE9QQVpfVUlEX0xFTkdUSF9GT1JfUkVBRF9XUklURSk7CgogICAgICAgIC8qIFVwZGF0ZSB0aGUgbGVuZ3RoIG9mIHRoZSBjb21tYW5kIGJ1ZmZlciovCiAgICAgICAgTmRlZk1hcC0+U2VuZExlbmd0aCA9IGluZGV4OwojZWxzZQogICAgICAgIC8qIENhbGN1bGF0ZSBzZW5kIGxlbmd0aCAKICAgICAgICA3IHwgNiAgIDUgICA0ICAgMyB8IDIgICAxICAgMCB8IAogICAgICAgIHwgICAgYmxvY2sgbm8gICB8ICBieXRlIG5vICB8IAogICAgICAgICovCiAgICAgICAgTmRlZk1hcC0+U2VuZFJlY3ZCdWZbUEhfRlJJTkZDX1RPUEFaX1ZBTDBdID0gCiAgICAgICAgICAgICAgICAodWludDhfdCkoKEJsb2NrTm8gPDwgUEhfRlJJTkZDX1RPUEFaX1NISUZUMykgKyAKICAgICAgICAgICAgICAgIEJ5dGVObyk7CiAgICAgICAgTmRlZk1hcC0+U2VuZExlbmd0aCA9IFBIX0ZSSU5GQ19UT1BBWl9WQUwxOwojZW5kaWYgLyogI2lmZGVmIFRPUEFaX1JBV19TVVBQT1JUICovCiAgICAgICAgCiAgICAgICAgYnJlYWs7CiNpZmRlZiBUT1BBWl9SQVdfU1VQUE9SVAojZWxzZQojaWZkZWYgUEhfSEFMNF9FTkFCTEUKICAgIGNhc2UgcGhIYWxfZUpld2VsX1JlYWQ6CiAgICAgICAgTmRlZk1hcC0+U2VuZFJlY3ZCdWZbUEhfRlJJTkZDX1RPUEFaX1ZBTDBdID0gMHgwMDsKICAgICAgICBOZGVmTWFwLT5TZW5kUmVjdkJ1ZltQSF9GUklORkNfVE9QQVpfVkFMMV0gPSAweDAwOwogICAgICAgIE5kZWZNYXAtPlNlbmRSZWN2QnVmW1BIX0ZSSU5GQ19UT1BBWl9WQUwyXSA9IDEwNDsKICAgICAgICBOZGVmTWFwLT5TZW5kTGVuZ3RoID0gMzsKICAgIGJyZWFrOwojZW5kaWYKI2VuZGlmIC8qICNpZmRlZiBUT1BBWl9SQVdfU1VQUE9SVCAqLwoKICAgIGRlZmF1bHQ6CiAgICAgICAgUmVzdWx0ID0gUEhORkNTVFZBTChDSURfRlJJX05GQ19OREVGX01BUCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5GQ1NUQVRVU19JTlZBTElEX0RFVklDRV9SRVFVRVNUKTsKICAgIH0KCiAgICBpZihSZXN1bHQgPT0gTkZDU1RBVFVTX1NVQ0NFU1MpCiAgICB7CiAgICAgICAgLyogQ2FsbCB0aGUgT3ZlcmxhcHBlZCBIQUwgVHJhbnNjZWl2ZSBmdW5jdGlvbiAqLyAKICAgICAgICBSZXN1bHQgPSBwaEZyaU5mY19PdnJIYWxfVHJhbnNjZWl2ZSggICAgTmRlZk1hcC0+TG93ZXJEZXZpY2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZOZGVmTWFwLT5NYXBDb21wbGV0aW9uSW5mbywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTmRlZk1hcC0+cHNSZW1vdGVEZXZJbmZvLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOZGVmTWFwLT5DbWQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZOZGVmTWFwLT5wc0RlcEFkZGl0aW9uYWxJbmZvLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOZGVmTWFwLT5TZW5kUmVjdkJ1ZiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTmRlZk1hcC0+U2VuZExlbmd0aCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTmRlZk1hcC0+U2VuZFJlY3ZCdWYsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5kZWZNYXAtPlNlbmRSZWN2TGVuZ3RoKTsKICAgIH0KICAgIHJldHVybiBSZXN1bHQ7Cn0KCnN0YXRpYyBORkNTVEFUVVMgcGhGcmlOZmNfVHB6X0hfV3JBQnl0ZShwaEZyaU5mY19OZGVmTWFwX3QgKk5kZWZNYXAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MTZfdCAgICAgICAgICAgICBCbG9ja05vLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDE2X3QgICAgICAgICAgICAgQnl0ZU5vLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCAgICAgICAgICAgICAgQnl0ZVZhbAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKQp7CiAgICBORkNTVEFUVVMgICBSZXN1bHQgPSBORkNTVEFUVVNfU1VDQ0VTUzsKICAgIHVpbnQ4X3QgICAgIGluZGV4ID0gMDsKCiAgICAKICAgIFBITkZDX1VOVVNFRF9WQVJJQUJMRShCeXRlVmFsKTsKICAgIC8qIHNldCB0aGUgZGF0YSBmb3IgYWRkaXRpb25hbCBkYXRhIGV4Y2hhbmdlKi8KICAgIE5kZWZNYXAtPnBzRGVwQWRkaXRpb25hbEluZm8uRGVwRmxhZ3MuTWV0YUNoYWluaW5nID0gUEhfRlJJTkZDX1RPUEFaX1ZBTDA7CiAgICBOZGVmTWFwLT5wc0RlcEFkZGl0aW9uYWxJbmZvLkRlcEZsYWdzLk5BRFByZXNlbnQgPSBQSF9GUklORkNfVE9QQVpfVkFMMDsKICAgIE5kZWZNYXAtPnBzRGVwQWRkaXRpb25hbEluZm8uTkFEID0gUEhfRlJJTkZDX1RPUEFaX1ZBTDA7CgogICAgTmRlZk1hcC0+TWFwQ29tcGxldGlvbkluZm8uQ29tcGxldGlvblJvdXRpbmUgPSBwaEZyaU5mY19Ub3Bhek1hcF9Qcm9jZXNzOwogICAgTmRlZk1hcC0+TWFwQ29tcGxldGlvbkluZm8uQ29udGV4dCA9IE5kZWZNYXA7CgogICAgKk5kZWZNYXAtPlNlbmRSZWN2TGVuZ3RoID0gTmRlZk1hcC0+VGVtcFJlY2VpdmVMZW5ndGg7CiAgICAvKiBDb21tYW5kIHVzZWQgdG8gd3JpdGUgMSBieXRlICovCiNpZmRlZiBUT1BBWl9SQVdfU1VQUE9SVAogICAgTmRlZk1hcC0+Q21kLkpld2VsQ21kID0gcGhIYWxfZUpld2VsX1JhdzsKI2Vsc2UKI2lmZGVmIFBIX0hBTDRfRU5BQkxFCiAgICBOZGVmTWFwLT5DbWQuSmV3ZWxDbWQgPSBwaEhhbF9lSmV3ZWxfV3JpdGUxRTsKI2Vsc2UKICAgIE5kZWZNYXAtPkNtZC5KZXdlbENtZCA9IHBoSGFsX2VKZXdlbENtZExpc3RKZXdlbFdyaXRlRXJhc2UxOwojZW5kaWYKI2VuZGlmIC8qICNpZmRlZiBUT1BBWl9SQVdfU1VQUE9SVCAqLyAgIAoKI2lmZGVmIFRPUEFaX1JBV19TVVBQT1JUCiAgICAvKkNvcHkgY29tbWFuZCB0byBTZW5kIEJ1ZmZlciovCiAgICBOZGVmTWFwLT5TZW5kUmVjdkJ1ZltQSF9GUklORkNfVE9QQVpfVkFMMF0gID0gUEhfRlJJTkZDX1RPUEFaX0NNRF9XUklURV8xRTsKICAgIGluZGV4ICsrOwoKICAgIC8qQ29weSBBZGRyZXNzIHRvICBTZW5kIEJ1ZmZlciovCiAgICAvKiBDYWxjdWxhdGUgc2VuZCBsZW5ndGggCiAgICA3IHwgNiAgIDUgICA0ICAgMyB8IDIgICAxICAgMCB8IAogICAgfCAgICBibG9jayBubyAgIHwgIGJ5dGUgbm8gIHwgCiAgICAqLwogICAgTmRlZk1hcC0+U2VuZFJlY3ZCdWZbUEhfRlJJTkZDX1RPUEFaX1ZBTDFdID0gCiAgICAgICAgICAgICh1aW50OF90KSgoQmxvY2tObyA8PCBQSF9GUklORkNfVE9QQVpfU0hJRlQzKSArIAogICAgICAgICAgICBCeXRlTm8pOwogICAgaW5kZXggKys7CiAgICAvKkNvcHkgRGF0YSBieXRlIHRvIFNlbmQgQnVmZmVyKi8KICAgIE5kZWZNYXAtPlNlbmRSZWN2QnVmW2luZGV4XSA9IEJ5dGVWYWw7CiAgICBpbmRleCArKzsKCiAgICAvKkNvcHkgVUlEIG9mIHRoZSB0YWcgdG8gIFNlbmQgQnVmZmVyKi8KICAgICh2b2lkKW1lbWNweSgmKE5kZWZNYXAtPlNlbmRSZWN2QnVmW1BIX0ZSSU5GQ19UT1BBWl9WQUwzXSksCiAgICAgICYoTmRlZk1hcC0+cHNSZW1vdGVEZXZJbmZvLT5SZW1vdGVEZXZJbmZvLkpld2VsX0luZm8uVWlkKSwKICAgICAgVE9QQVpfVUlEX0xFTkdUSF9GT1JfUkVBRF9XUklURSk7CiAgICBpbmRleCA9ICh1aW50OF90KShpbmRleCArIFRPUEFaX1VJRF9MRU5HVEhfRk9SX1JFQURfV1JJVEUpOwoKICAgIC8qIFVwZGF0ZSB0aGUgbGVuZ3RoIG9mIHRoZSBjb21tYW5kIGJ1ZmZlciovCiAgICBOZGVmTWFwLT5TZW5kTGVuZ3RoID0gaW5kZXg7ICAgCgojZWxzZQogICAgLyogRGVwZW5kaW5nIG9uIHRoZSBqZXdlbCBjb21tYW5kLCB0aGUgc2VuZCBsZW5ndGggaXMgZGVjaWRlZCAqLwogICAgLyogQ2FsY3VsYXRlIHNlbmQgbGVuZ3RoIAogICAgNyB8IDYgICA1ICAgNCAgIDMgfCAyICAgMSAgIDAgfCAKICAgIHwgICAgYmxvY2sgbm8gICB8ICBieXRlIG5vICB8IAogICAgKi8KICAgIE5kZWZNYXAtPlNlbmRSZWN2QnVmW2luZGV4XSA9IAogICAgICAgICAgICAgICAgICAgICAgICAodWludDhfdCkoKEJsb2NrTm8gPDwgUEhfRlJJTkZDX1RPUEFaX1NISUZUMykgKyAKICAgICAgICAgICAgICAgICAgICAgICAgQnl0ZU5vKTsKICAgIGluZGV4ICsrOwogICAgTmRlZk1hcC0+U2VuZFJlY3ZCdWZbaW5kZXhdID0gQnl0ZVZhbDsKICAgIGluZGV4ICsrOwogICAgTmRlZk1hcC0+U2VuZExlbmd0aCA9IFBIX0ZSSU5GQ19UT1BBWl9WQUwyOwoKI2VuZGlmIC8qICNpZmRlZiBUT1BBWl9SQVdfU1VQUE9SVCAqLwoKICAgIC8qIENhbGwgdGhlIE92ZXJsYXBwZWQgSEFMIFRyYW5zY2VpdmUgZnVuY3Rpb24gKi8gCiAgICBSZXN1bHQgPSBwaEZyaU5mY19PdnJIYWxfVHJhbnNjZWl2ZSggICAgTmRlZk1hcC0+TG93ZXJEZXZpY2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJk5kZWZNYXAtPk1hcENvbXBsZXRpb25JbmZvLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5kZWZNYXAtPnBzUmVtb3RlRGV2SW5mbywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOZGVmTWFwLT5DbWQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJk5kZWZNYXAtPnBzRGVwQWRkaXRpb25hbEluZm8sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTmRlZk1hcC0+U2VuZFJlY3ZCdWYsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTmRlZk1hcC0+U2VuZExlbmd0aCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOZGVmTWFwLT5TZW5kUmVjdkJ1ZiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOZGVmTWFwLT5TZW5kUmVjdkxlbmd0aCk7CgogICAgcmV0dXJuIFJlc3VsdDsKfQoKc3RhdGljIE5GQ1NUQVRVUyBwaEZyaU5mY19UcHpfSF9Qcm9SZWFkSUQocGhGcmlOZmNfTmRlZk1hcF90ICpOZGVmTWFwKQp7CiAgICBORkNTVEFUVVMgICBSZXN1bHQgPSBQSE5GQ1NUVkFMKENJRF9GUklfTkZDX05ERUZfTUFQLAogICAgICAgIE5GQ1NUQVRVU19JTlZBTElEX1JFQ0VJVkVfTEVOR1RIKTsKICAgIAogICAgaWYoKChOZGVmTWFwLT5TZW5kUmVjdkJ1ZltQSF9GUklORkNfVE9QQVpfVkFMMF0gJiAKICAgICAgICBQSF9GUklORkNfVE9QQVpfSEVBRFJPTTBfQ0hLKSA9PSBQSF9GUklORkNfVE9QQVpfSEVBRFJPTTBfVkFMKSAmJiAKICAgICAgICAoKk5kZWZNYXAtPlNlbmRSZWN2TGVuZ3RoID09IFBIX0ZSSU5GQ19UT1BBWl9WQUw2KSkKICAgIHsKICAgICAgICAvKiBDb3B5IFVJRCB0byB0aGUgY29udGV4dCwgVXNlZCB3aGVuIHRoZSBSRUFEIEFMTCBjb21tYW5kIGlzIHVzZWQgKi8KICAgICAgICAodm9pZCltZW1jcHkoTmRlZk1hcC0+VG9wYXpDb250YWluZXIuVUlELCAKICAgICAgICAgICAgJk5kZWZNYXAtPlNlbmRSZWN2QnVmW1BIX0ZSSU5GQ19UT1BBWl9WQUwyXSwKICAgICAgICAgICAgUEhfRlJJTkZDX1RPUEFaX1ZBTDQpOwoKICAgICAgICAvKiBTdGF0ZSBoYXMgdG8gYmUgY2hhbmdlZCAqLwogICAgICAgIE5kZWZNYXAtPlN0YXRlID0gUEhfRlJJTkZDX1RPUEFaX1NUQVRFX1JFQURBTEw7CiAgICAgICAgLyogVG9wYXogY29tbWFuZCA9IFJFQURBTEwgKi8KI2lmZGVmIFRPUEFaX1JBV19TVVBQT1JUCiAgICAgICAgTmRlZk1hcC0+Q21kLkpld2VsQ21kID0gcGhIYWxfZUpld2VsX1JhdzsKICAgICAgICBOZGVmTWFwLT5TZW5kUmVjdkJ1ZltQSF9GUklORkNfVE9QQVpfVkFMMF0gPSBQSF9GUklORkNfVE9QQVpfQ01EX1JFQURBTEw7CiNlbHNlIAojaWZkZWYgUEhfSEFMNF9FTkFCTEUKICAgICAgICBOZGVmTWFwLT5DbWQuSmV3ZWxDbWQgPSBwaEhhbF9lSmV3ZWxfUmVhZEFsbDsKI2Vsc2UKICAgICAgICBOZGVmTWFwLT5DbWQuSmV3ZWxDbWQgPSBwaEhhbF9lSmV3ZWxDbWRMaXN0SmV3ZWxSZWFkQWxsOwojZW5kaWYKI2VuZGlmIC8qICNpZmRlZiBUT1BBWl9SQVdfU1VQUE9SVCAqLyAKICAgIAogICAgICAgIC8qIFJlYWQgYWxsIGJ5dGVzIGZyb20gdGhlIGNhcmQgKi8KICAgICAgICBSZXN1bHQgPSBwaEZyaU5mY19UcHpfSF9SZEJ5dGVzKE5kZWZNYXAsIE5kZWZNYXAtPlRvcGF6Q29udGFpbmVyLkN1cnJlbnRCbG9jaywKICAgICAgICAgICAgTmRlZk1hcC0+VG9wYXpDb250YWluZXIuQnl0ZU51bWJlcik7CiAgICB9CgogICAgcmV0dXJuIFJlc3VsdDsKfQoKc3RhdGljIE5GQ1NUQVRVUyBwaEZyaU5mY19UcHpfSF9Qcm9SZWFkQWxsKHBoRnJpTmZjX05kZWZNYXBfdCAqTmRlZk1hcCkKewogICAgTkZDU1RBVFVTICAgUmVzdWx0ID0gUEhORkNTVFZBTChDSURfRlJJX05GQ19OREVGX01BUCwKICAgICAgICBORkNTVEFUVVNfSU5WQUxJRF9SRUNFSVZFX0xFTkdUSCk7CiAgICBpbnQzMl90ICAgICBtZW1jb21wYXJlID0gUEhfRlJJTkZDX1RPUEFaX1ZBTDA7CiAgICAKICAgIC8qIENvbXBhcmUgdGhlIFVJRCBvZiBSRUFEIEFMTCBjb21tYW5kIHdpdGggdGhlIHN0b3JlZCBVSUQgKi8KI2lmZGVmIFBIX0hBTDRfRU5BQkxFCiAgICBpZiAoKE5kZWZNYXAtPlRvcGF6Q29udGFpbmVyLlVJRFswXSA9PSBOZGVmTWFwLT5TZW5kUmVjdkJ1ZltQSF9GUklORkNfVE9QQVpfVkFMMl0pICYmCiAgICAgICAgKE5kZWZNYXAtPlRvcGF6Q29udGFpbmVyLlVJRFsxXSA9PSBOZGVmTWFwLT5TZW5kUmVjdkJ1ZltQSF9GUklORkNfVE9QQVpfVkFMMiArIDFdKSAmJgogICAgICAgIChOZGVmTWFwLT5Ub3BhekNvbnRhaW5lci5VSURbMl0gPT0gTmRlZk1hcC0+U2VuZFJlY3ZCdWZbUEhfRlJJTkZDX1RPUEFaX1ZBTDIgKyAyXSkgJiYKICAgICAgICAoTmRlZk1hcC0+VG9wYXpDb250YWluZXIuVUlEWzNdID09IE5kZWZNYXAtPlNlbmRSZWN2QnVmW1BIX0ZSSU5GQ19UT1BBWl9WQUwyICsgM10pKQogICAgewogICAgICAgIG1lbWNvbXBhcmUgPSBQSF9GUklORkNfVE9QQVpfVkFMMDsKICAgIH0KICAgIGVsc2UKICAgIHsKICAgICAgICBtZW1jb21wYXJlID0gUEhfRlJJTkZDX1RPUEFaX1ZBTDE7CiAgICB9CiNlbHNlCiAgICBtZW1jb21wYXJlID0gbWVtY21wKE5kZWZNYXAtPlRvcGF6Q29udGFpbmVyLlVJRCwgCiAgICAgICAgJk5kZWZNYXAtPlNlbmRSZWN2QnVmW1BIX0ZSSU5GQ19UT1BBWl9WQUwyXSwKICAgICAgICBQSF9GUklORkNfVE9QQVpfVkFMNCk7ICAKI2VuZGlmIC8qICNpZmRlZiBQSF9IQUw0X0VOQUJMRSAqLwoKICAgIGlmKCgoTmRlZk1hcC0+U2VuZFJlY3ZCdWZbUEhfRlJJTkZDX1RPUEFaX1ZBTDBdICYgCiAgICAgICAgUEhfRlJJTkZDX1RPUEFaX0hFQURST00wX0NISykgPT0gUEhfRlJJTkZDX1RPUEFaX0hFQURST00wX1ZBTCkgJiYgCiAgICAgICAgKCpOZGVmTWFwLT5TZW5kUmVjdkxlbmd0aCA9PSBQSF9GUklORkNfVE9QQVpfUkVBREFMTF9SRVNQKSAmJiAKICAgICAgICAobWVtY29tcGFyZSA9PSBQSF9GUklORkNfVE9QQVpfVkFMMCkpCiAgICB7CiAgICAgICAgLyogQ29weSA5NiBieXRlcyBmcm9tIHRoZSByZWFkL3dyaXRlIG1lbW9yeSBzcGFjZSAqLwogICAgICAgICh2b2lkKW1lbWNweShOZGVmTWFwLT5Ub3BhekNvbnRhaW5lci5SZWFkQnVmZmVyLCAKICAgICAgICAgICAgJk5kZWZNYXAtPlNlbmRSZWN2QnVmW1BIX0ZSSU5GQ19UT1BBWl9WQUwxMF0sCiAgICAgICAgICAgIFBIX0ZSSU5GQ19UT1BBWl9UT1RBTF9SV0JZVEVTKTsKCiAgICAgICAgLyogQ2hlY2sgdGhlIGxvY2sgYml0cyBhbmQgc2V0IHRoZSBjYXJkIHN0YXRlICovCiAgICAgICAgcGhGcmlOZmNfVHB6X0hfQ2hrTG9ja0JpdHMoTmRlZk1hcCk7CgogICAgICAgIFJlc3VsdCA9IHBoRnJpTmZjX1Rwel9IX0NhbGxOeHRPcChOZGVmTWFwKTsKICAgIH0KICAgIHJldHVybiBSZXN1bHQ7Cn0KCnN0YXRpYyBORkNTVEFUVVMgcGhGcmlOZmNfVHB6X0hfQ2FsbE54dE9wKHBoRnJpTmZjX05kZWZNYXBfdCAqTmRlZk1hcCkKewogICAgTkZDU1RBVFVTICAgUmVzdWx0ID0gUEhORkNTVFZBTChDSURfRlJJX05GQ19OREVGX01BUCwKICAgICAgICBORkNTVEFUVVNfSU5WQUxJRF9SRUNFSVZFX0xFTkdUSCk7CiAgICAvKiBEZXBlbmRpbmcgb24gdGhlIG9wZXJhdGlvbiAoY2hlY2ssIHJlYWQgb3Igd3JpdGUgbmRlZiksIHByb2Nlc3MgdGhlICAKICAgIHJlYWQgZGF0YSAqLwogICAgc3dpdGNoKE5kZWZNYXAtPlByZXZPcGVyYXRpb24pCiAgICB7CiAgICBjYXNlIFBIX0ZSSU5GQ19OREVGTUFQX0NIRUNLX09QRToKICAgICAgICAvKiBDaGVjayB0aGUgY2FwYWJpbHR5IGNvbnRhaW5lciB2YWx1ZXMsIGFjY29yZGluZyAKICAgICAgICB0byB0aGUgc3BlYyAqLwogICAgICAgIFJlc3VsdCA9IHBoRnJpTmZjX1Rwel9IX0Noa0NDaW5DaGtOZGVmKE5kZWZNYXApOwoKICAgICAgICBpZiAoTmRlZk1hcC0+Q2FyZFN0YXRlICE9IFBIX05ERUZNQVBfQ0FSRF9TVEFURV9JTlZBTElEKQogICAgICAgIHsKICAgICAgICAgICAgLyogQ2hlY2sgdGhlIHNwZWMgdmVyc2lvbiAqLwogICAgICAgICAgICBSZXN1bHQgPSBwaEZyaU5mY19UcHpfSF9DaGtTcGNWZXIoIE5kZWZNYXAsCiAgICAgICAgICAgICAgICBOZGVmTWFwLT5Ub3BhekNvbnRhaW5lci5SZWFkQnVmZmVyW1BIX0ZSSU5GQ19UT1BBWl9WQUwxXSk7CiAgICAgICAgICAgIC8qICBDaGVjayB0aGUgQ0MgaGVhZGVyIHNpemU6IE9ubHkgdmFsaWQgb25lcyBhcmUKICAgICAgICAgICAgMHgwQyBmb3IgOTYgYnl0ZXMuICovCiAgICAgICAgICAgIGlmICgoUmVzdWx0ID09IE5GQ1NUQVRVU19TVUNDRVNTKSAmJiAKICAgICAgICAgICAgICAgICggTmRlZk1hcC0+VG9wYXpDb250YWluZXIuUmVhZEJ1ZmZlcltQSF9GUklORkNfVE9QQVpfVkFMMl0gPD0gIAogICAgICAgICAgICAgICAgUEhfRlJJTkZDX1RPUEFaX0NDX0JZVEUyX01BWCkpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIFJlc3VsdCA9IHBoRnJpTmZjX1Rwel9IX2ZpbmROREVGVExWKE5kZWZNYXApOwogICAgICAgICAgICAgICAgLyogQXMgdGhlcmUgaXMgcG9zc2liaWxpdHkgb2YgZWl0aGVyIGhhdmluZyBvciBub3QgaGF2aW5nIFRMViBpbiAKICAgICAgICAgICAgICAgIFRvcGF6LCBubyBuZWVkIHRvIHNlbmQgdGhlIEFjdHVhbCBzdGF0dXMgdG8gdGhlIGNvbnRleHQqLwogICAgICAgICAgICAgICAgUmVzdWx0ID0gTkZDU1RBVFVTX1NVQ0NFU1M7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgZWxzZQogICAgICAgIHsKICAgICAgICAgICAgUmVzdWx0ID0gTkZDU1RBVFVTX1NVQ0NFU1M7CiAgICAgICAgICAgIE5kZWZNYXAtPkNhcmRTdGF0ZSA9IFBIX05ERUZNQVBfQ0FSRF9TVEFURV9JTklUSUFMSVpFRDsKICAgICAgICAgICAgTmRlZk1hcC0+Q2FyZE1lbVNpemUgPSAKICAgICAgICAgICAgTmRlZk1hcC0+VG9wYXpDb250YWluZXIuUmVtYWluaW5nU2l6ZSA9ICh1aW50MTZfdCkKICAgICAgICAgICAgICAgICAgICAgICAgLyogCiAgICAgICAgICAgICAgICAgICAgICAgIDQgaXMgZGVjcmVtZW50ZWQgZnJvbSB0aGUgbWF4IHNpemUgYmVjYXVzZSBvZiB0aGUgNCBDQyBieXRlcwogICAgICAgICAgICAgICAgICAgICAgICAyIGlzIGRlY3JlbWVudGVkIGJlY2F1c2Ugb2YgdGhlIE5ERUYgVExWIFQgYW5kIEwgYnl0ZSAKICAgICAgICAgICAgICAgICAgICAgICAgdG8gZ2V0IHRoZSBhY3R1YWwgZGF0YSBzaXplCiAgICAgICAgICAgICAgICAgICAgICAgICovCiAgICAgICAgICAgICAgICAgICAgICAgIChQSF9GUklORkNfVE9QQVpfTUFYX0NBUkRfU1ogLSBQSF9GUklORkNfVE9QQVpfVkFMNCAtIAogICAgICAgICAgICAgICAgICAgICAgICBQSF9GUklORkNfVE9QQVpfVkFMMik7CiAgICAgICAgfQogICAgICAgIGJyZWFrOwoKICAgIGNhc2UgUEhfRlJJTkZDX05ERUZNQVBfUkVBRF9PUEU6CiAgICAgICAgLyogQ2hlY2sgdGhlIGNhcGFiaWx0eSBjb250YWluZXIgdmFsdWVzLCBhY2NvcmRpbmcgCiAgICAgICAgdG8gdGhlIHNwZWMgKi8KICAgICAgICBSZXN1bHQgPSBwaEZyaU5mY19UcHpfSF9DaGtDQ0J5dGVzKE5kZWZNYXApOwoKICAgICAgICAvKiBJZiBzdWNjZXNzLCBmaW5kIHRoZSBuZGVmIFRMViAqLwogICAgICAgIFJlc3VsdCA9ICgoUmVzdWx0ICE9IE5GQ1NUQVRVU19TVUNDRVNTKT8KICAgICAgICAgICAgICAgIChQSE5GQ1NUVkFMKENJRF9GUklfTkZDX05ERUZfTUFQLAogICAgICAgICAgICAgICAgTkZDU1RBVFVTX0lOVkFMSURfRk9STUFUKSk6CiAgICAgICAgICAgICAgICBwaEZyaU5mY19UcHpfSF9maW5kTkRFRlRMVihOZGVmTWFwKSk7CgogICAgICAgIGlmKFJlc3VsdCA9PSBORkNTVEFUVVNfU1VDQ0VTUykKICAgICAgICB7CiAgICAgICAgICAgIE5kZWZNYXAtPlRvcGF6Q29udGFpbmVyLkJ5dGVOdW1iZXIgKz0gUEhfRlJJTkZDX1RPUEFaX1ZBTDI7CiAgICAgICAgICAgIC8qIElmIHN1Y2Nlc3MsIGNvcHkgdGhlIHJlYWQgYnl0ZXMgdG8gdGhlIHVzZXIgYnVmZmVyICovCiAgICAgICAgICAgIFJlc3VsdCA9IHBoRnJpTmZjX1Rwel9IX0NwRGF0YVRvVXNyQnVmKE5kZWZNYXApOwogICAgICAgIH0KICAgICAgICBicmVhazsKCiAgICBjYXNlIFBIX0ZSSU5GQ19OREVGTUFQX1dSSVRFX09QRToKICAgIGRlZmF1bHQ6CiAgICAgICAgaWYoKE5kZWZNYXAtPkNhcmRTdGF0ZSA9PSBQSF9OREVGTUFQX0NBUkRfU1RBVEVfUkVBRF9XUklURSkgfHwgCiAgICAgICAgICAgIChOZGVmTWFwLT5DYXJkU3RhdGUgPT0gUEhfTkRFRk1BUF9DQVJEX1NUQVRFX0lOSVRJQUxJWkVEKSkKICAgICAgICB7CiAgICAgICAgICAgIC8qIENoZWNrIHRoZSBjYXBhYmlsdHkgY29udGFpbmVyIHZhbHVlcywgYWNjb3JkaW5nIAogICAgICAgICAgICB0byB0aGUgc3BlYyAqLwogICAgICAgICAgICBSZXN1bHQgPSBwaEZyaU5mY19UcHpfSF9DaGtDQ0J5dGVzKE5kZWZNYXApOwogICAgICAgICAgICBpZihSZXN1bHQgPT0gTkZDU1RBVFVTX1NVQ0NFU1MpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIC8qIEZpbmQgdGhlIE5ERUYgVExWICovCiAgICAgICAgICAgICAgICBSZXN1bHQgPSBwaEZyaU5mY19UcHpfSF9maW5kTkRFRlRMVihOZGVmTWFwKTsKICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgLyogV3JpdGUgdGhlIFRMViAqLwogICAgICAgICAgICAgICAgTmRlZk1hcC0+VG9wYXpDb250YWluZXIuSW50ZXJuYWxTdGF0ZSA9IFBIX0ZSSU5GQ19UT1BBWl9XUl9UX09GX1RMVjsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIE5kZWZNYXAtPlRMVlN0cnVjdC5OZGVmVExWQnl0ZSA9IFBIX0ZSSU5GQ19UT1BBWl9WQUw0OwogICAgICAgICAgICAgICAgTmRlZk1hcC0+VExWU3RydWN0Lk5kZWZUTFZCbG9jayA9IFBIX0ZSSU5GQ19UT1BBWl9WQUwxOwogICAgICAgICAgICAgICAgTmRlZk1hcC0+VG9wYXpDb250YWluZXIuQnl0ZU51bWJlciA9IFBIX0ZSSU5GQ19UT1BBWl9WQUw0OwogICAgICAgICAgICAgICAgLyogV3JpdGUgdGhlIFRMViAqLwogICAgICAgICAgICAgICAgTmRlZk1hcC0+VG9wYXpDb250YWluZXIuSW50ZXJuYWxTdGF0ZSA9IFBIX0ZSSU5GQ19UT1BBWl9XUl9DQ19CWVRFMDsKICAgICAgICAgICAgfQogICAgICAgICAgICAvKiBXcml0ZSBDQyBieXRlcyAqLyAKICAgICAgICAgICAgUmVzdWx0ID0gcGhGcmlOZmNfVHB6X0hfV3JDQ29yVExWKE5kZWZNYXApOwogICAgICAgIH0KICAgICAgICBicmVhazsKICAgIH0KICAgIHJldHVybiBSZXN1bHQ7Cn0KCnN0YXRpYyBORkNTVEFUVVMgcGhGcmlOZmNfVHB6X0hfQ2hrQ0NCeXRlcyhwaEZyaU5mY19OZGVmTWFwX3QgKk5kZWZNYXApCnsKICAgIE5GQ1NUQVRVUyAgIFJlc3VsdCA9IFBITkZDU1RWQUwoQ0lEX0ZSSV9ORkNfTkRFRl9NQVAsCiAgICAgICAgTkZDU1RBVFVTX05PX05ERUZfU1VQUE9SVCk7CgogICAgaWYoTmRlZk1hcC0+VG9wYXpDb250YWluZXIuUmVhZEJ1ZmZlcltQSF9GUklORkNfVE9QQVpfVkFMMF0gPT0gCiAgICAgICAgUEhfRlJJTkZDX1RPUEFaX0NDX0JZVEUwKQogICAgewogICAgICAgIC8qIENoZWNrIHRoZSBzcGVjIHZlcnNpb24gKi8KICAgICAgICBSZXN1bHQgPSBwaEZyaU5mY19UcHpfSF9DaGtTcGNWZXIoIE5kZWZNYXAsCiAgICAgICAgICAgIE5kZWZNYXAtPlRvcGF6Q29udGFpbmVyLlJlYWRCdWZmZXJbUEhfRlJJTkZDX1RPUEFaX1ZBTDFdKTsKICAgICAgICAvKiAgQ2hlY2sgdGhlIENDIGhlYWRlciBzaXplOiBPbmx5IHZhbGlkIG9uZXMgYXJlCiAgICAgICAgMHgwQyBmb3IgOTYgYnl0ZXMuICovCiAgICAgICAgUmVzdWx0ID0gKCgoIE5kZWZNYXAtPlRvcGF6Q29udGFpbmVyLlJlYWRCdWZmZXJbUEhfRlJJTkZDX1RPUEFaX1ZBTDJdID4gIAogICAgICAgICAgICAgICAgICAgIFBIX0ZSSU5GQ19UT1BBWl9DQ19CWVRFMl9NQVgpIHx8IChSZXN1bHQgIT0gCiAgICAgICAgICAgICAgICAgICAgTkZDU1RBVFVTX1NVQ0NFU1MpKT8KICAgICAgICAgICAgICAgICAgICAoUEhORkNTVFZBTChDSURfRlJJX05GQ19OREVGX01BUCwgCiAgICAgICAgICAgICAgICAgICAgTkZDU1RBVFVTX0VPRl9OREVGX0NPTlRBSU5FUl9SRUFDSEVEKSk6CiAgICAgICAgICAgICAgICAgICAgUmVzdWx0KTsKCiAgICAgICAgLyogR2V0IHRoZSByZWFkL3dyaXRlIGNhcmQgbWVtb3J5IHNpemUgKi8KICAgICAgICBOZGVmTWFwLT5Ub3BhekNvbnRhaW5lci5SZW1haW5pbmdTaXplID0gCiAgICAgICAgICAgICAgICBOZGVmTWFwLT5DYXJkTWVtU2l6ZSA9ICgoUmVzdWx0ID09IE5GQ1NUQVRVU19TVUNDRVNTKT8KICAgICAgICAgICAgICAgIChQSF9GUklORkNfVE9QQVpfTUFYX0NBUkRfU1ogLSBQSF9GUklORkNfVE9QQVpfVkFMNCk6CiAgICAgICAgICAgICAgICBOZGVmTWFwLT5DYXJkTWVtU2l6ZSk7CgogICAgICAgIC8qIGlmIHRoZSBjYWxsIGlzIGZyb20gd3JpdGUgbmRlZiB0aGVuIGNoZWNrIGZvciByZWFkIHdyaXRlIGFjY2VzcyAqLwogICAgICAgIGlmKCgoTmRlZk1hcC0+UHJldk9wZXJhdGlvbiA9PSBQSF9GUklORkNfTkRFRk1BUF9XUklURV9PUEUpICYmIAogICAgICAgICAgICAoTmRlZk1hcC0+VG9wYXpDb250YWluZXIuUmVhZEJ1ZmZlcltQSF9GUklORkNfVE9QQVpfVkFMM10gIT0gCiAgICAgICAgICAgIFBIX0ZSSU5GQ19UT1BBWl9DQ19CWVRFM19SVykgJiYgKFJlc3VsdCA9PSBORkNTVEFUVVNfU1VDQ0VTUykpKQogICAgICAgIHsKICAgICAgICAgICAgUmVzdWx0ID0gKFBITkZDU1RWQUwoQ0lEX0ZSSV9ORkNfTkRFRl9NQVAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTkZDU1RBVFVTX0lOVkFMSURfRk9STUFUKSk7CiAgICAgICAgfQoKICAgICAgICAvKiBpZiB0aGUgY2FsbCBpcyBmcm9tIHJlYWQgbmRlZiB0aGVuIGNoZWNrIGZvciByZWFkIG9ubHkgb3IgcmVhZCB3cml0ZSBhY2Nlc3MgKi8KICAgICAgICBpZigoKE5kZWZNYXAtPlByZXZPcGVyYXRpb24gPT0gUEhfRlJJTkZDX05ERUZNQVBfUkVBRF9PUEUpICYmIAogICAgICAgICAgICAoKE5kZWZNYXAtPlRvcGF6Q29udGFpbmVyLlJlYWRCdWZmZXJbUEhfRlJJTkZDX1RPUEFaX1ZBTDNdICE9IAogICAgICAgICAgICBQSF9GUklORkNfVE9QQVpfQ0NfQllURTNfUlcpICYmIAogICAgICAgICAgICAoTmRlZk1hcC0+VG9wYXpDb250YWluZXIuUmVhZEJ1ZmZlcltQSF9GUklORkNfVE9QQVpfVkFMM10gIT0gCiAgICAgICAgICAgIFBIX0ZSSU5GQ19UT1BBWl9DQ19CWVRFM19STykpJiYgKFJlc3VsdCA9PSBORkNTVEFUVVNfU1VDQ0VTUykpKQogICAgICAgIHsKICAgICAgICAgICAgUmVzdWx0ID0gKFBITkZDU1RWQUwoQ0lEX0ZSSV9ORkNfTkRFRl9NQVAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTkZDU1RBVFVTX0lOVkFMSURfRk9STUFUKSk7CiAgICAgICAgfQogICAgfQogICAgcmV0dXJuIFJlc3VsdDsKfQoKZXh0ZXJuIE5GQ1NUQVRVUyBwaEZyaU5mY19UcHpfSF9DaGtTcGNWZXIoIHBoRnJpTmZjX05kZWZNYXBfdCAgKk5kZWZNYXAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QgICAgICAgICAgICAgVmVyc2lvbk5vKQp7CiAgICBORkNTVEFUVVMgUmVzdWx0ID0gTkZDU1RBVFVTX1NVQ0NFU1M7CiAgICB1aW50OF90IFRhZ1Zlck5vID0gVmVyc2lvbk5vOwoKICAgIC8qIFRvIHJlbW92ZSAid2FybmluZyAoVlMgQzQxMDApIDogdW5yZWZlcmVuY2VkIGZvcm1hbCBwYXJhbWV0ZXIiICovCiAgICBQSE5GQ19VTlVTRURfVkFSSUFCTEUoTmRlZk1hcCk7CgogICAgaWYgKCBUYWdWZXJObyA9PSAwICkKICAgIHsKICAgICAgICAvKlJldHVybiBTdGF0dXMgRXJyb3IgkyBJbnZhbGlkIEZvcm1hdJQqLwogICAgICAgIFJlc3VsdCA9IFBITkZDU1RWQUwoQ0lEX0ZSSV9ORkNfTkRFRl9NQVAsTkZDU1RBVFVTX0lOVkFMSURfRk9STUFUKTsKICAgIH0KICAgIGVsc2UKICAgIHsKICAgICAgICAvKiBjYWxjdWxhdGUgdGhlIG1ham9yIGFuZCBtaW5vciB2ZXJzaW9uIG51bWJlciBvZiBUM1Zlck5vICovCiAgICAgICAgaWYoICgoIFBIX05GQ0ZSSV9OREVGTUFQX05GQ0RFVl9NQUpPUl9WRVJfTlVNID09IAogICAgICAgICAgICBQSF9ORkNGUklfTkRFRk1BUF9HRVRfTUFKT1JfVEFHX1ZFUk5PKFRhZ1Zlck5vICkgKSYmCiAgICAgICAgICAgICggUEhfTkZDRlJJX05ERUZNQVBfTkZDREVWX01JTk9SX1ZFUl9OVU0gPj0gCiAgICAgICAgICAgIFBIX05GQ0ZSSV9OREVGTUFQX0dFVF9NSU5PUl9UQUdfVkVSTk8oVGFnVmVyTm8pKSkgfHwKICAgICAgICAgICAgKCggUEhfTkZDRlJJX05ERUZNQVBfTkZDREVWX01BSk9SX1ZFUl9OVU0gPT0gCiAgICAgICAgICAgIFBIX05GQ0ZSSV9OREVGTUFQX0dFVF9NQUpPUl9UQUdfVkVSTk8oVGFnVmVyTm8gKSApJiYKICAgICAgICAgICAgKCBQSF9ORkNGUklfTkRFRk1BUF9ORkNERVZfTUlOT1JfVkVSX05VTSA8IAogICAgICAgICAgICBQSF9ORkNGUklfTkRFRk1BUF9HRVRfTUlOT1JfVEFHX1ZFUk5PKFRhZ1Zlck5vKSApKSkKICAgICAgICB7CiAgICAgICAgICAgIFJlc3VsdCA9IFBITkZDU1RWQUwoQ0lEX05GQ19OT05FLE5GQ1NUQVRVU19TVUNDRVNTKTsKICAgICAgICB9CiAgICAgICAgZWxzZSAKICAgICAgICB7CiAgICAgICAgICAgIGlmICgoIFBIX05GQ0ZSSV9OREVGTUFQX05GQ0RFVl9NQUpPUl9WRVJfTlVNIDwKICAgICAgICAgICAgICAgIFBIX05GQ0ZSSV9OREVGTUFQX0dFVF9NQUpPUl9UQUdfVkVSTk8oVGFnVmVyTm8pICkgfHwKICAgICAgICAgICAgICAgICggUEhfTkZDRlJJX05ERUZNQVBfTkZDREVWX01BSk9SX1ZFUl9OVU0gPiAKICAgICAgICAgICAgICAgIFBIX05GQ0ZSSV9OREVGTUFQX0dFVF9NQUpPUl9UQUdfVkVSTk8oVGFnVmVyTm8pKSkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgUmVzdWx0ID0gUEhORkNTVFZBTChDSURfRlJJX05GQ19OREVGX01BUCxORkNTVEFUVVNfSU5WQUxJRF9GT1JNQVQpOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfQogICAgcmV0dXJuIFJlc3VsdDsKfQoKc3RhdGljIE5GQ1NUQVRVUyBwaEZyaU5mY19UcHpfSF9maW5kTkRFRlRMVihwaEZyaU5mY19OZGVmTWFwX3QgKk5kZWZNYXApCnsKICAgIE5GQ1NUQVRVUyAgIFJlc3VsdCA9IFBITkZDU1RWQUwoQ0lEX0ZSSV9ORkNfTkRFRl9NQVAsCiAgICAgICAgTkZDU1RBVFVTX05PX05ERUZfU1VQUE9SVCk7CiAgICB1aW50OF90ICAgICBpbmRleCA9IFBIX0ZSSU5GQ19UT1BBWl9WQUw0OwoKICAgIC8qIElmIHJlbWFpbmluZyBzaXplIGlzIGxlc3MgdGhhbiAzIHRoZW4sIHRoZXJlIGNhbnQgYmUgYW55IAogICAgVExWIHByZXNlbnQgaW4gdGhlIGNhcmQgKi8KICAgIHdoaWxlKChpbmRleCA8IFBIX0ZSSU5GQ19UT1BBWl9UT1RBTF9SV0JZVEVTKSAmJiAKICAgICAgICAoTmRlZk1hcC0+VG9wYXpDb250YWluZXIuUmVtYWluaW5nU2l6ZSA+PSBQSF9GUklORkNfVE9QQVpfVkFMMykpCiAgICB7CiAgICAgICAgc3dpdGNoKE5kZWZNYXAtPlRvcGF6Q29udGFpbmVyLlJlYWRCdWZmZXJbaW5kZXhdKQogICAgICAgIHsKICAgICAgICBjYXNlIFBIX0ZSSU5GQ19UT1BBWl9OREVGX1Q6CiAgICAgICAgICAgIC8qIFRvIGdldCB0aGUgbGVuZ3RoIGZpZWxkIG9mIHRoZSBUTFYgKi8KICAgICAgICAgICAgaW5kZXgrKzsKICAgICAgICAgICAgLyogVHlwZSBhbmQgbGVuZ3RoIGFyZSBub3QgZGF0YSBieXRlcywgc28gdG8ga25vdyB0aGUgZXhhY3QKICAgICAgICAgICAgcmVtYWluaW5nIHNpemUgaW4gdGhlIGNhcmQsIHRoZSBiZWxvdyBvcGVyYXRpb24gaXMgZG9uZSAqLwogICAgICAgICAgICBOZGVmTWFwLT5Ub3BhekNvbnRhaW5lci5SZW1haW5pbmdTaXplIC09IFBIX0ZSSU5GQ19UT1BBWl9WQUwyOwogICAgICAgICAgICAvKiBTZXQgdGhlIGNhcmQgc3RhdGUgZGVwZW5kaW5nIG9uIHRoZSBMIHZhbHVlICovCiAgICAgICAgICAgIFJlc3VsdCA9IHBoRnJpTmZjX01hcFRvb2xfU2V0Q2FyZFN0YXRlKE5kZWZNYXAsIAogICAgICAgICAgICAgICAgKHVpbnQzMl90KU5kZWZNYXAtPlRvcGF6Q29udGFpbmVyLlJlYWRCdWZmZXJbaW5kZXhdKTsKICAgICAgICAgICAgLyogQ2hlY2sgdGhlIFRMViBpcyBjb3JyZWN0ICovCiAgICAgICAgICAgIGlmKChOZGVmTWFwLT5Ub3BhekNvbnRhaW5lci5SZWFkQnVmZmVyW2luZGV4XSA+IAogICAgICAgICAgICAgICAgTmRlZk1hcC0+VG9wYXpDb250YWluZXIuUmVtYWluaW5nU2l6ZSkgfHwgCiAgICAgICAgICAgICAgICAoKE5kZWZNYXAtPlRvcGF6Q29udGFpbmVyLlJlYWRCdWZmZXJbaW5kZXhdID09IAogICAgICAgICAgICAgICAgUEhfRlJJTkZDX1RPUEFaX1ZBTDApICYmIChOZGVmTWFwLT5QcmV2T3BlcmF0aW9uID09IAogICAgICAgICAgICAgICAgUEhfRlJJTkZDX05ERUZNQVBfUkVBRF9PUEUpKSB8fCAoUmVzdWx0ICE9IE5GQ1NUQVRVU19TVUNDRVNTKSkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgLyogTCBmaWVsZCB2YWx1ZSBjYW50IGJlIGdyZWF0ZXIgdGhhbiB0aGUgcmVtYWluaW5nIHNpemUsIHNvIGVycm9yICovCiAgICAgICAgICAgICAgICBSZXN1bHQgPSBQSE5GQ1NUVkFMKENJRF9GUklfTkZDX05ERUZfTUFQLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBORkNTVEFUVVNfTk9fTkRFRl9TVVBQT1JUKTsKICAgICAgICAgICAgICAgIC8qIFRvIGJyZWFrIG91dCBvZiB0aGUgbG9vcCAqLwogICAgICAgICAgICAgICAgaW5kZXggPSBQSF9GUklORkNfVE9QQVpfVE9UQUxfUldCWVRFUzsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIC8qIFNvIHJlbWFpbmluZyBzaXplIGFsc28gY2hhbmdlcywgYWNjb3JkaW5nIHRvIHRoZSBwb3NpdGlvbiBvZiBOREVGIFRMViAgKi8KICAgICAgICAgICAgICAgIE5kZWZNYXAtPlRMVlN0cnVjdC5CeXRlc1JlbWFpbkxpblRMViA9IAogICAgICAgICAgICAgICAgICAgIE5kZWZNYXAtPlRvcGF6Q29udGFpbmVyLlJlYWRCdWZmZXJbaW5kZXhdOwoKICAgICAgICAgICAgICAgIC8qIEdldCB0aGUgYnl0ZSBudW1iZXIgKi8KICAgICAgICAgICAgICAgIE5kZWZNYXAtPlRMVlN0cnVjdC5OZGVmVExWQnl0ZSA9ICh1aW50MTZfdCkoKGluZGV4IC0gUEhfRlJJTkZDX1RPUEFaX1ZBTDEpICUgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQSF9GUklORkNfVE9QQVpfVkFMOCk7CiAgICAgICAgICAgICAgICAvKiBHZXQgdGhlIGJsb2NrIG51bWJlciAqLwogICAgICAgICAgICAgICAgTmRlZk1hcC0+VExWU3RydWN0Lk5kZWZUTFZCbG9jayA9ICh1aW50OF90KSgoKGluZGV4IC0gUEhfRlJJTkZDX1RPUEFaX1ZBTDEpIC8gCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQSF9GUklORkNfVE9QQVpfVkFMOCkgKyAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBIX0ZSSU5GQ19UT1BBWl9WQUwxKTsKICAgICAgICAgICAgICAgIC8qIFRMViBmb3VuZCBmbGFnIGlzIHNldCAqLwogICAgICAgICAgICAgICAgTmRlZk1hcC0+VExWU3RydWN0Lk5kZWZUTFZGb3VuZEZsYWcgPSBQSF9GUklORkNfVE9QQVpfRkxBRzE7CiAgICAgICAgICAgICAgICAvKiBUbyBrbm93IHRoZSBwb3NpdGlvbiBvZiBWIGZpZWxkIGluIHRoZSBUTFYgKi8KICAgICAgICAgICAgICAgIE5kZWZNYXAtPlRvcGF6Q29udGFpbmVyLkJ5dGVOdW1iZXIgPSAodWludDhfdCkoKChOZGVmTWFwLT5UTFZTdHJ1Y3QuTmRlZlRMVkJsb2NrIC0gMSkgKiA4KSArCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOZGVmTWFwLT5UTFZTdHJ1Y3QuTmRlZlRMVkJ5dGUpOwogICAgICAgICAgICAgICAgLyogVG8gYnJlYWsgb3V0IG9mIHRoZSBsb29wICovCiAgICAgICAgICAgICAgICBpbmRleCA9IFBIX0ZSSU5GQ19UT1BBWl9UT1RBTF9SV0JZVEVTOwogICAgICAgICAgICAgICAgUmVzdWx0ID0gTkZDU1RBVFVTX1NVQ0NFU1M7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgYnJlYWs7CgogICAgICAgIGNhc2UgUEhfRlJJTkZDX1RPUEFaX05VTExfVDoKICAgICAgICAgICAgLyogTnVsbCBUTFYsIFNraXAgdGhlIFRMViAqLwogICAgICAgICAgICBOZGVmTWFwLT5Ub3BhekNvbnRhaW5lci5SZW1haW5pbmdTaXplLS07CiAgICAgICAgICAgIGluZGV4Kys7CiAgICAgICAgICAgIGJyZWFrOwoKICAgICAgICBjYXNlIFBIX0ZSSU5GQ19UT1BBWl9URVJNX1Q6CiAgICAgICAgICAgIC8qIE5vIG1vcmUgVExWIHByZXNlbnQgaW4gdGhlIGNhcmQsIHNvIGVycm9yICovCiAgICAgICAgICAgIGluZGV4ID0gUEhfRlJJTkZDX1RPUEFaX1RPVEFMX1JXQllURVM7CiAgICAgICAgICAgIFJlc3VsdCA9IFBITkZDU1RWQUwoQ0lEX0ZSSV9ORkNfTkRFRl9NQVAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTkZDU1RBVFVTX05PX05ERUZfU1VQUE9SVCk7CiAgICAgICAgICAgIGJyZWFrOwoKICAgICAgICBkZWZhdWx0OgogICAgICAgICAgICAvKiBHbyB0aWxsIHRoZSBsZW5ndGggZmllbGQgb2YgdGhlIFRMViAqLwogICAgICAgICAgICBpbmRleCsrOwogICAgICAgICAgICAvKiBUeXBlIGFuZCBsZW5ndGggaXMgbm90IHRoZSBkYXRhLCBzbyB0byBrbm93IHRoZSBleGFjdAogICAgICAgICAgICByZW1haW5pbmcgc2l6ZSBpbiB0aGUgY2FyZCwgdGhlIGJlbG93IG9wZXJhdGlvbiBpcyBkb25lICovCiAgICAgICAgICAgIE5kZWZNYXAtPlRvcGF6Q29udGFpbmVyLlJlbWFpbmluZ1NpemUgLT0gUEhfRlJJTkZDX1RPUEFaX1ZBTDI7CiAgICAgICAgICAgIGlmKE5kZWZNYXAtPlRvcGF6Q29udGFpbmVyLlJlYWRCdWZmZXJbaW5kZXhdID4gCiAgICAgICAgICAgICAgICBOZGVmTWFwLT5Ub3BhekNvbnRhaW5lci5SZW1haW5pbmdTaXplKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAvKiBMIGZpZWxkIHZhbHVlIGNhbnQgYmUgZ3JlYXRlciB0aGFuIHRoZSByZW1haW5pbmcgc2l6ZSwgc28gZXJyb3IgKi8KICAgICAgICAgICAgICAgIGluZGV4ID0gUEhfRlJJTkZDX1RPUEFaX1RPVEFMX1JXQllURVM7CiAgICAgICAgICAgICAgICBSZXN1bHQgPSBQSE5GQ1NUVkFMKENJRF9GUklfTkZDX05ERUZfTUFQLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBORkNTVEFUVVNfTk9fTkRFRl9TVVBQT1JUKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIC8qIFJlbWFpbmluZyBzaXplIG9mIHRoZSBmcmVlIHNwYWNlIGF2YWlsYWJsZSBpbiB0aGUgY2FyZCBjaGFuZ2VzLCAKICAgICAgICAgICAgICAgIGFjY29yZGluZyB0byB0aGUgcG9zaXRpb24gb2YgTkRFRiBUTFYgKi8KICAgICAgICAgICAgICAgIE5kZWZNYXAtPlRvcGF6Q29udGFpbmVyLlJlbWFpbmluZ1NpemUgPSAKICAgICAgICAgICAgICAgICAgICBOZGVmTWFwLT5Ub3BhekNvbnRhaW5lci5SZW1haW5pbmdTaXplIC0KICAgICAgICAgICAgICAgICAgICBOZGVmTWFwLT5Ub3BhekNvbnRhaW5lci5SZWFkQnVmZmVyW2luZGV4XTsKCiAgICAgICAgICAgICAgICAvKiBHZXQgdGhlIHBvc2l0aW9uIG9mIHRoZSBuZXh0IFRMViAqLwogICAgICAgICAgICAgICAgaW5kZXggPSAodWludDhfdCkoaW5kZXggKyAKICAgICAgICAgICAgICAgICAgICAoTmRlZk1hcC0+VG9wYXpDb250YWluZXIuUmVhZEJ1ZmZlcltpbmRleF0gKyAKICAgICAgICAgICAgICAgICAgICAgUEhfRlJJTkZDX1RPUEFaX1ZBTDEpKTsgICAgICAgICAgICAgICAgCiAgICAgICAgICAgIH0KICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgfQogICAgfQoKICAgIC8qIElmIG5vIE5kZWYgVExWIGZvdW5kIGFuZCBvcGVyYXRpb24gZG9uZSBpcyByZWFkICovCiAgICBpZigoTmRlZk1hcC0+VExWU3RydWN0Lk5kZWZUTFZGb3VuZEZsYWcgPT0gUEhfRlJJTkZDX1RPUEFaX0ZMQUcwKSAmJiAKICAgICAgICAoTmRlZk1hcC0+UHJldk9wZXJhdGlvbiA9PSBQSF9GUklORkNfTkRFRk1BUF9SRUFEX09QRSkpCiAgICB7CiAgICAgICAgUmVzdWx0ID0gUEhORkNTVFZBTChDSURfRlJJX05GQ19OREVGX01BUCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5GQ1NUQVRVU19FT0ZfTkRFRl9DT05UQUlORVJfUkVBQ0hFRCk7CiAgICB9CiAgICBpZigoTmRlZk1hcC0+VExWU3RydWN0Lk5kZWZUTFZGb3VuZEZsYWcgPT0gUEhfRlJJTkZDX1RPUEFaX0ZMQUcwKSAmJiAKICAgICAgICAoKE5kZWZNYXAtPlByZXZPcGVyYXRpb24gPT0gUEhfRlJJTkZDX05ERUZNQVBfV1JJVEVfT1BFKSB8fAogICAgICAgIChOZGVmTWFwLT5QcmV2T3BlcmF0aW9uID09IFBIX0ZSSU5GQ19OREVGTUFQX0NIRUNLX09QRSkpKQogICAgewogICAgICAgIE5kZWZNYXAtPlRMVlN0cnVjdC5OZGVmVExWQnl0ZSA9IFBIX0ZSSU5GQ19UT1BBWl9WQUw0OyAKICAgICAgICBOZGVmTWFwLT5UTFZTdHJ1Y3QuTmRlZlRMVkJsb2NrID0gUEhfRlJJTkZDX1RPUEFaX1ZBTDE7CiAgICAgICAgTmRlZk1hcC0+VG9wYXpDb250YWluZXIuQnl0ZU51bWJlciA9IFBIX0ZSSU5GQ19UT1BBWl9WQUw0OwogICAgICAgIE5kZWZNYXAtPlRvcGF6Q29udGFpbmVyLlJlbWFpbmluZ1NpemUgPSBQSF9GUklORkNfVE9QQVpfVE9UQUxfUldCWVRFUzE7CiAgICB9CiAgICByZXR1cm4gUmVzdWx0Owp9CgpzdGF0aWMgTkZDU1RBVFVTIHBoRnJpTmZjX1Rwel9IX0NwRGF0YVRvVXNyQnVmKHBoRnJpTmZjX05kZWZNYXBfdCAgKk5kZWZNYXApCnsKICAgIE5GQ1NUQVRVUyAgIFJlc3VsdCA9IE5GQ1NUQVRVU19TVUNDRVNTOwogICAgCiAgICAvKiBDaGVjayB0aGUgdGhlIFRMViBzaXplIGFuZCB0aGUgdXNlciBzaXplICovCiAgICBpZihOZGVmTWFwLT5BcGR1QnVmZmVyU2l6ZSA+PQogICAgICAgIE5kZWZNYXAtPlRMVlN0cnVjdC5CeXRlc1JlbWFpbkxpblRMVikKICAgIHsKICAgICAgICAvKiBDb3B5IHRoZSByZWFkIGJ5dGVzIHRvIHVzZXIgYnVmZmVyIHRpbGwgdGhlIHZhbHVlIChWKSAKICAgICAgICBvZiBUTFYgZW5kcyAqLwogICAgICAgICh2b2lkKW1lbWNweShOZGVmTWFwLT5BcGR1QnVmZmVyLAogICAgICAgICAgICAmKE5kZWZNYXAtPlRvcGF6Q29udGFpbmVyLlJlYWRCdWZmZXJbIAogICAgICAgICAgICAgICAgTmRlZk1hcC0+VG9wYXpDb250YWluZXIuQnl0ZU51bWJlcl0pLAogICAgICAgICAgICAgICAgICAgIE5kZWZNYXAtPlRMVlN0cnVjdC5CeXRlc1JlbWFpbkxpblRMVik7CgogICAgICAgICAgICAgICAgLyogVXBkYXRlIHRoZSBudW1iZXIgb2YgcmVhZCBieXRlcyB0byB0aGUgdXNlciAqLwogICAgICAgICAgICAgICAgKihOZGVmTWFwLT5OdW1PZkJ5dGVzUmVhZCkgPSAKICAgICAgICAgICAgICAgICAgICBOZGVmTWFwLT5UTFZTdHJ1Y3QuQnl0ZXNSZW1haW5MaW5UTFY7CiAgICAgICAgICAgICAgICAvKiBUaGVyZSBpcyBubyBieXRlIHRvIHJlYWQgKi8KICAgICAgICAgICAgICAgIE5kZWZNYXAtPlRvcGF6Q29udGFpbmVyLkJ5dGVOdW1iZXIgPSAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBIX0ZSSU5GQ19UT1BBWl9WQUwwOwogICAgICAgICAgICAgICAgLyogTm8gZnVydGhlciByZWFkIGlzIHBvc3NpYmxlICovCiAgICAgICAgICAgICAgICBOZGVmTWFwLT5Ub3BhekNvbnRhaW5lci5SZWFkV3JpdGVDb21wbGV0ZUZsYWcgPSAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBIX0ZSSU5GQ19UT1BBWl9GTEFHMTsKICAgICAgICAgICAgICAgIC8qIFJlbWFpbmluZyBzaXplIGluIHRoZSBjYXJkIGNhbiBiZSBncmVhdGVyIHRoYW4gbGVuZ3RoIGZpZWxkIGluIAogICAgICAgICAgICAgICAgdGhlIFRMViAqLwogICAgICAgICAgICAgICAgTmRlZk1hcC0+VG9wYXpDb250YWluZXIuUmVtYWluaW5nU2l6ZSA9IAogICAgICAgICAgICAgICAgICAgIE5kZWZNYXAtPlRvcGF6Q29udGFpbmVyLlJlbWFpbmluZ1NpemUgLQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTmRlZk1hcC0+VExWU3RydWN0LkJ5dGVzUmVtYWluTGluVExWOwogICAgICAgICAgICAgICAgLyogVExWIGhhcyBiZWVuIGNvbXBsZXRlbHkgcmVhZCwgbm8gbW9yZSBieXRlcyB0byByZWFkICovCiAgICAgICAgICAgICAgICBOZGVmTWFwLT5UTFZTdHJ1Y3QuQnl0ZXNSZW1haW5MaW5UTFYgPSAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBIX0ZSSU5GQ19UT1BBWl9WQUwwOwogICAgfQogICAgZWxzZQogICAgewogICAgICAgIC8qIENvcHkgcmVhZCBieXRlcyB0aWxsIHRoZSB1c2VyIGJ1ZmZlciBzaXplICovCiAgICAgICAgKHZvaWQpbWVtY3B5KE5kZWZNYXAtPkFwZHVCdWZmZXIsCiAgICAgICAgICAgICAgICAgICAgJihOZGVmTWFwLT5Ub3BhekNvbnRhaW5lci5SZWFkQnVmZmVyWyAKICAgICAgICAgICAgICAgICAgICBOZGVmTWFwLT5Ub3BhekNvbnRhaW5lci5CeXRlTnVtYmVyXSksCiAgICAgICAgICAgICAgICAgICAgTmRlZk1hcC0+QXBkdUJ1ZmZlclNpemUpOwoKICAgICAgICAvKiBVcGRhdGUgdGhlIG51bWJlciBvZiByZWFkIGJ5dGVzIHRvIHRoZSB1c2VyICovCiAgICAgICAgKihOZGVmTWFwLT5OdW1PZkJ5dGVzUmVhZCkgPSAKICAgICAgICAgICAgTmRlZk1hcC0+QXBkdUJ1ZmZlclNpemU7CiAgICAgICAgLyogR2V0IHRoZSBuZXh0IGJ5dGUgbnVtYmVyIHRvIHJlYWQgKi8KICAgICAgICBOZGVmTWFwLT5Ub3BhekNvbnRhaW5lci5CeXRlTnVtYmVyID0gCiAgICAgICAgICAgICh1aW50OF90KShOZGVmTWFwLT5Ub3BhekNvbnRhaW5lci5CeXRlTnVtYmVyICsKICAgICAgICAgICAgICAgICAgICAgIE5kZWZNYXAtPkFwZHVCdWZmZXJTaXplKTsKICAgICAgICAvKiBGcmVlIHNwYWNlIGxlZnQgaW4gdGhlIGNhcmQgKi8KICAgICAgICBOZGVmTWFwLT5Ub3BhekNvbnRhaW5lci5SZW1haW5pbmdTaXplIAogICAgICAgICAgICA9IE5kZWZNYXAtPlRvcGF6Q29udGFpbmVyLlJlbWFpbmluZ1NpemUgCiAgICAgICAgICAgICAgICAgIC0gKHVpbnQxNl90KU5kZWZNYXAtPkFwZHVCdWZmZXJTaXplOwogICAgICAgIC8qIEJ5dGVzIGxlZnQgaW4gdGhlIFRMViAqLwogICAgICAgIE5kZWZNYXAtPlRMVlN0cnVjdC5CeXRlc1JlbWFpbkxpblRMViA9IAogICAgICAgICAgICBOZGVmTWFwLT5UTFZTdHJ1Y3QuQnl0ZXNSZW1haW5MaW5UTFYgLQogICAgICAgICAgICAgICAgICAgKHVpbnQxNl90KU5kZWZNYXAtPkFwZHVCdWZmZXJTaXplOwogICAgfQogICAgcmV0dXJuIFJlc3VsdDsKfQoKc3RhdGljIE5GQ1NUQVRVUyBwaEZyaU5mY19UcHpfSF9Qcm9Xck5NTihwaEZyaU5mY19OZGVmTWFwX3QgKk5kZWZNYXApCnsKICAgIE5GQ1NUQVRVUyAgIFJlc3VsdCA9IFBITkZDU1RWQUwoQ0lEX0ZSSV9ORkNfTkRFRl9NQVAsCiAgICAgICAgTkZDU1RBVFVTX0lOVkFMSURfUkVDRUlWRV9MRU5HVEgpOwogICAgdWludDhfdCAgICAgQmxvY2tObyA9IFBIX0ZSSU5GQ19UT1BBWl9WQUwwLAogICAgICAgIEJ5dGVObyA9IFBIX0ZSSU5GQ19UT1BBWl9WQUwwOwoKICAgIGlmKChOZGVmTWFwLT5Ub3BhekNvbnRhaW5lci5JbnRlcm5hbFN0YXRlID09IAogICAgICAgIFBIX0ZSSU5GQ19UT1BBWl9XUl9OTU5fMCkgJiYgCiAgICAgICAgKE5kZWZNYXAtPlNlbmRSZWN2QnVmW1BIX0ZSSU5GQ19UT1BBWl9WQUwwXSA9PSAKICAgICAgICBQSF9GUklORkNfVE9QQVpfVkFMMCkgJiYgCiAgICAgICAgKCpOZGVmTWFwLT5TZW5kUmVjdkxlbmd0aCA9PSBQSF9GUklORkNfVE9QQVpfVkFMMSkpCiAgICB7CiAgICAgICAgTmRlZk1hcC0+U3RhdGUgPSBQSF9GUklORkNfVE9QQVpfU1RBVEVfV1JJVEVfTF9UTFY7CiAgICAgICAgLyogR2V0IHRoZSBMIGZpZWxkIG9mIHRoZSBUTFYgYmxvY2sgKi8KICAgICAgICBCbG9ja05vID0gKHVpbnQ4X3QpKCgoTmRlZk1hcC0+VExWU3RydWN0Lk5kZWZUTFZCeXRlICsgUEhfRlJJTkZDX1RPUEFaX1ZBTDEpID4gCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBQSF9GUklORkNfVE9QQVpfVkFMNyk/CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAoTmRlZk1hcC0+VExWU3RydWN0Lk5kZWZUTFZCbG9jayArIFBIX0ZSSU5GQ19UT1BBWl9WQUwxKToKICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5kZWZNYXAtPlRMVlN0cnVjdC5OZGVmVExWQmxvY2spOwogICAgICAgIC8qIEdldCB0aGUgTCBieXRlICovCiAgICAgICAgQnl0ZU5vID0gKHVpbnQ4X3QpKChOZGVmTWFwLT5UTFZTdHJ1Y3QuTmRlZlRMVkJ5dGUgKyBQSF9GUklORkNfVE9QQVpfVkFMMSkgJSAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQSF9GUklORkNfVE9QQVpfVkFMOCk7CgogICAgICAgIAogICAgICAgIC8qIEhlcmUgdGhlIE5NTiBpcyB3cml0dGVuIDAsIHNvIGludGVybmFsIHN0YXRlIGlzIHVzZWQgKi8KICAgICAgICBOZGVmTWFwLT5Ub3BhekNvbnRhaW5lci5JbnRlcm5hbFN0YXRlID0gUEhfRlJJTkZDX1RPUEFaX1dSX0xfVExWXzA7CiAgICAgICAgLyogV3JpdGUgdGhlIGxlbmd0aCB2YWx1ZSA9IDB4MDAgLCBXcml0ZSBMIGZpZWxkIG9mIFRMViAgPSAwICBpbnNpZGUgdGhpcyovCiAgICAgICAgUmVzdWx0ID0gcGhGcmlOZmNfVHB6X0hfV3JBQnl0ZSggTmRlZk1hcCwgQmxvY2tObywgQnl0ZU5vLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUEhfRlJJTkZDX1RPUEFaX1ZBTDApOwogICAgfQogICAgZWxzZSAKICAgIHsKICAgICAgICBpZigoTmRlZk1hcC0+VG9wYXpDb250YWluZXIuSW50ZXJuYWxTdGF0ZSA9PSAKICAgICAgICAgICAgUEhfRlJJTkZDX1RPUEFaX1dSX05NTl9FMSkgJiYgCiAgICAgICAgICAgIChOZGVmTWFwLT5TZW5kUmVjdkJ1ZltQSF9GUklORkNfVE9QQVpfVkFMMF0gPT0gCiAgICAgICAgICAgIFBIX0ZSSU5GQ19UT1BBWl9DQ19CWVRFMCkgJiYgCiAgICAgICAgICAgICgqTmRlZk1hcC0+U2VuZFJlY3ZMZW5ndGggPT0gUEhfRlJJTkZDX1RPUEFaX1ZBTDEpKQogICAgICAgIHsKICAgICAgICAgICAgLyogQ2FyZCBzdGF0ZSBpcyBpbml0aWFsaXNlZCBvciBpbnZhbGlkICovIAogICAgICAgICAgICBOZGVmTWFwLT5DYXJkU3RhdGUgPSAodWludDhfdCkoKE5kZWZNYXAtPkNhcmRTdGF0ZSA9PSAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUEhfTkRFRk1BUF9DQVJEX1NUQVRFX0lOSVRJQUxJWkVEKT8KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUEhfTkRFRk1BUF9DQVJEX1NUQVRFX1JFQURfV1JJVEU6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5kZWZNYXAtPkNhcmRTdGF0ZSk7CiAgICAgICAgICAgIC8qIHVwZGF0ZSB0aGUgbGVuZ3RoIHRvIHRoZSB1c2VyICovCiAgICAgICAgICAgICpOZGVmTWFwLT5Xck5kZWZQYWNrZXRMZW5ndGggPSBOZGVmTWFwLT5BcGR1QnVmZkluZGV4OwogICAgICAgICAgICBSZXN1bHQgPSBORkNTVEFUVVNfU1VDQ0VTUzsKICAgICAgICB9CiAgICB9CiAgICByZXR1cm4gUmVzdWx0Owp9CgpzdGF0aWMgTkZDU1RBVFVTIHBoRnJpTmZjX1Rwel9IX1Byb1dyVExWKHBoRnJpTmZjX05kZWZNYXBfdCAqTmRlZk1hcCkKewogICAgTkZDU1RBVFVTICAgUmVzdWx0ID0gUEhORkNTVFZBTChDSURfRlJJX05GQ19OREVGX01BUCwKICAgICAgICBORkNTVEFUVVNfSU5WQUxJRF9SRUNFSVZFX0xFTkdUSCk7CiAgICBpZigoTmRlZk1hcC0+VG9wYXpDb250YWluZXIuSW50ZXJuYWxTdGF0ZSA9PSAKICAgICAgICBQSF9GUklORkNfVE9QQVpfV1JfTF9UTFZfMCkgJiYgCiAgICAgICAgKE5kZWZNYXAtPlNlbmRSZWN2QnVmW1BIX0ZSSU5GQ19UT1BBWl9WQUwwXSA9PSAKICAgICAgICBQSF9GUklORkNfVE9QQVpfVkFMMCkgJiYgCiAgICAgICAgKCpOZGVmTWFwLT5TZW5kUmVjdkxlbmd0aCA9PSBQSF9GUklORkNfVE9QQVpfVkFMMSkpCiAgICB7CiAgICAgICAgLyogc3RhdGUgaXMgd3JpdGluZyB1c2VyIGRhdGEgdG8gdGhlIGNhcmQgKi8KICAgICAgICBOZGVmTWFwLT5TdGF0ZSA9IFBIX0ZSSU5GQ19UT1BBWl9TVEFURV9XUklURTsgICAgICAKICAgICAgIAogICAgICAgIE5kZWZNYXAtPlRvcGF6Q29udGFpbmVyLkJ5dGVOdW1iZXIrKzsKICAgICAgICAvKiBDaGVjayB0aGUgYnl0ZSBudW1iZXIgKi8KICAgICAgICBwaEZyaU5mY19UcHpfSF9CbGtDaGsoTmRlZk1hcCk7CgogICAgICAgIC8qIFdyaXRlIGRhdGEgdG8gdGhlIHNwZWNpZmllZCBsb2NhdGlvbiAqLwogICAgICAgIC8qIFdyaXRlIHRoZSBkYXRhIHRvIHRoZSBjYXJkIGZyb20gdGhlIHVzZXIgYnVmZmVyICovCiAgICAgICAgUmVzdWx0ID0gcGhGcmlOZmNfVHB6X0hfV3JBQnl0ZSggTmRlZk1hcCwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOZGVmTWFwLT5Ub3BhekNvbnRhaW5lci5DdXJyZW50QmxvY2ssCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOZGVmTWFwLT5Ub3BhekNvbnRhaW5lci5CeXRlTnVtYmVyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTmRlZk1hcC0+QXBkdUJ1ZmZlcltOZGVmTWFwLT5BcGR1QnVmZkluZGV4XQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKTsKICAgIH0KICAgIGVsc2UgCiAgICB7CiAgICAgICAgaWYoKE5kZWZNYXAtPlRvcGF6Q29udGFpbmVyLkludGVybmFsU3RhdGUgPT0gCiAgICAgICAgICAgIFBIX0ZSSU5GQ19UT1BBWl9XUl9MX1RMVikgJiYgCiAgICAgICAgICAgICgoKE5kZWZNYXAtPk9mZnNldCA9PSBQSF9GUklORkNfTkRFRk1BUF9TRUVLX0JFR0lOKSAmJiAKICAgICAgICAgICAgKE5kZWZNYXAtPlNlbmRSZWN2QnVmW1BIX0ZSSU5GQ19UT1BBWl9WQUwwXSA9PSAKICAgICAgICAgICAgTmRlZk1hcC0+QXBkdUJ1ZmZJbmRleCkpIHx8IAogICAgICAgICAgICAoKE5kZWZNYXAtPk9mZnNldCA9PSBQSF9GUklORkNfTkRFRk1BUF9TRUVLX0NVUikgJiYgCiAgICAgICAgICAgIChOZGVmTWFwLT5TZW5kUmVjdkJ1ZltQSF9GUklORkNfVE9QQVpfVkFMMF0gPT0gCiAgICAgICAgICAgIChOZGVmTWFwLT5BcGR1QnVmZkluZGV4ICsgTmRlZk1hcC0+VExWU3RydWN0LkJ5dGVzUmVtYWluTGluVExWKSkpKSAmJiAKICAgICAgICAgICAgKCpOZGVmTWFwLT5TZW5kUmVjdkxlbmd0aCA9PSBQSF9GUklORkNfVE9QQVpfVkFMMSkpCiAgICAgICAgewogICAgICAgICAgICAvKiBVcGRhdGUgdGhlIEwgdmFsdWUgaW4gdGhlIGNvbnRleHQgKi8KICAgICAgICAgICAgTmRlZk1hcC0+VExWU3RydWN0LkJ5dGVzUmVtYWluTGluVExWID0gCiAgICAgICAgICAgICAgICAoKE5kZWZNYXAtPk9mZnNldCA9PSBQSF9GUklORkNfTkRFRk1BUF9TRUVLX0JFR0lOKT8KICAgICAgICAgICAgICAgIE5kZWZNYXAtPkFwZHVCdWZmSW5kZXg6CiAgICAgICAgICAgIChOZGVmTWFwLT5UTFZTdHJ1Y3QuQnl0ZXNSZW1haW5MaW5UTFYgKyBOZGVmTWFwLT5BcGR1QnVmZkluZGV4KSk7CgogICAgICAgICAgICAvKiBXcml0ZSAweEUxIGluIGJsb2NrIG51bWJlciA9IDEgYW5kIGJ5dGUgbnVtYmVyID0gMCAqLwogICAgICAgICAgICBSZXN1bHQgPSBwaEZyaU5mY19UcHpfSF9XckJ5dGUwVmFsRTEoTmRlZk1hcCk7CiAgICAgICAgfQogICAgfQogICAgcmV0dXJuIFJlc3VsdDsKfQoKc3RhdGljIE5GQ1NUQVRVUyBwaEZyaU5mY19UcHpfSF9Qcm9XclVzckRhdGEocGhGcmlOZmNfTmRlZk1hcF90ICpOZGVmTWFwKQp7CiAgICBORkNTVEFUVVMgICBSZXN1bHQgPSBQSE5GQ1NUVkFMKENJRF9GUklfTkZDX05ERUZfTUFQLAogICAgICAgIE5GQ1NUQVRVU19JTlZBTElEX1JFQ0VJVkVfTEVOR1RIKTsKICAgIC8qIHNlbmQgYnVmZmVyIHNob3VsZCBiZSBlcXVhbCB0byByZWNlaXZlIGJ1ZmZlciAqLwogICAgaWYoKE5kZWZNYXAtPlNlbmRSZWN2QnVmW1BIX0ZSSU5GQ19UT1BBWl9WQUwwXSA9PSAKICAgICAgICBOZGVmTWFwLT5BcGR1QnVmZmVyW05kZWZNYXAtPkFwZHVCdWZmSW5kZXhdKSAmJiAKICAgICAgICAoKk5kZWZNYXAtPlNlbmRSZWN2TGVuZ3RoID09IFBIX0ZSSU5GQ19UT1BBWl9WQUwxKSkKICAgIHsKICAgICAgICAvKiBJbmNyZW1lbnQgdGhlIGluZGV4ICovCiAgICAgICAgTmRlZk1hcC0+QXBkdUJ1ZmZJbmRleCArPSBQSF9GUklORkNfVE9QQVpfVkFMMTsKCiAgICAgICAgLyogUmVtYWluaW5nIHNwYWNlIGxlZnQgaW4gdGhlIGNhcmQgaXMgbGVzcyBieSBvbmUgKi8KICAgICAgICBOZGVmTWFwLT5Ub3BhekNvbnRhaW5lci5SZW1haW5pbmdTaXplIC09IFBIX0ZSSU5GQ19UT1BBWl9WQUwxOwoKICAgICAgICAvKiBJbmNyZW1lbnQgdGhlIGJ5dGUgbnVtYmVyICovCiAgICAgICAgTmRlZk1hcC0+VG9wYXpDb250YWluZXIuQnl0ZU51bWJlcisrOwoKICAgICAgICAvKiBDaGVjayB0aGUgYmxvY2sgbnVtYmVyICovCiAgICAgICAgcGhGcmlOZmNfVHB6X0hfQmxrQ2hrKE5kZWZNYXApOwoKICAgICAgICAvKiBjaGVjayBmb3IgdGhlIHVzZXIgc3BhY2Ugb3IgdGhlIGNhcmQgc2l6ZSAqLwogICAgICAgIGlmKChOZGVmTWFwLT5BcGR1QnVmZmVyU2l6ZSA9PSBOZGVmTWFwLT5BcGR1QnVmZkluZGV4KSB8fCAKICAgICAgICAgICAgKE5kZWZNYXAtPlRvcGF6Q29udGFpbmVyLlJlbWFpbmluZ1NpemUgPT0gUEhfRlJJTkZDX1RPUEFaX1ZBTDApKQogICAgICAgIHsKICAgICAgICAgICAgLyogU2V0IHdyaXRlIGNvbXBsZXRlLCBpZiB0aGUgZW5kIG9mIGNhcmQgaXMgcmVhY2hlZCAqLwogICAgICAgICAgICBOZGVmTWFwLT5Ub3BhekNvbnRhaW5lci5SZWFkV3JpdGVDb21wbGV0ZUZsYWcgPSAodWludDhfdCkKICAgICAgICAgICAgICAgICgoTmRlZk1hcC0+VG9wYXpDb250YWluZXIuUmVtYWluaW5nU2l6ZSA9PSBQSF9GUklORkNfVE9QQVpfVkFMMCk/CiAgICAgICAgICAgICAgICBQSF9GUklORkNfVE9QQVpfRkxBRzE6UEhfRlJJTkZDX1RPUEFaX0ZMQUcwKTsKCiAgICAgICAgICAgIFJlc3VsdCA9IHBoRnJpTmZjX1Rwel9IX1dyTEJ5dGUoTmRlZk1hcCk7CiAgICAgICAgfQogICAgICAgIGVsc2UKICAgICAgICB7CiAgICAgICAgICAgIC8qIFN0YXRlIGlzIGNvbnRpbnVlZCB0byBiZSBpbiB3cml0ZSAqLwogICAgICAgICAgICBOZGVmTWFwLT5TdGF0ZSA9IFBIX0ZSSU5GQ19UT1BBWl9TVEFURV9XUklURTsgICAgICAgICAgIAogICAgICAgICAgICAKICAgICAgICAgICAgLyogV3JpdGUgdGhlIGJ5dGUgdG8gdGhlIHNwZWNpZmllZCBsb2NhdGlvbiAsIGFuZCBCeXRlIHRvIHdyaXRlICovCiAgICAgICAgICAgIFJlc3VsdCA9IHBoRnJpTmZjX1Rwel9IX1dyQUJ5dGUoTmRlZk1hcCwgTmRlZk1hcC0+VG9wYXpDb250YWluZXIuQ3VycmVudEJsb2NrLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5kZWZNYXAtPlRvcGF6Q29udGFpbmVyLkJ5dGVOdW1iZXIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTmRlZk1hcC0+QXBkdUJ1ZmZlcltOZGVmTWFwLT5BcGR1QnVmZkluZGV4XQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICk7CiAgICAgICAgfQogICAgfQogICAgcmV0dXJuIFJlc3VsdDsKfQoKc3RhdGljIE5GQ1NUQVRVUyBwaEZyaU5mY19UcHpfSF9XckxCeXRlKHBoRnJpTmZjX05kZWZNYXBfdCAgKk5kZWZNYXApCnsKICAgIE5GQ1NUQVRVUyAgIFJlc3VsdCA9IE5GQ1NUQVRVU19TVUNDRVNTOwogICAgdWludDhfdCAgICAgQmxvY2tObyA9IFBIX0ZSSU5GQ19UT1BBWl9WQUwwLAogICAgICAgIEJ5dGVObyA9IFBIX0ZSSU5GQ19UT1BBWl9WQUwwOwogICAgdWludDhfdCBUZW1wQnl0ZVZhbCA9IDA7CiAgICBCbG9ja05vID0gKHVpbnQ4X3QpKCgoTmRlZk1hcC0+VExWU3RydWN0Lk5kZWZUTFZCeXRlICsgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBQSF9GUklORkNfVE9QQVpfVkFMMSkgPiAKICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBIX0ZSSU5GQ19UT1BBWl9WQUw3KT8KICAgICAgICAgICAgICAgICAgICAgICAgICAgIChOZGVmTWFwLT5UTFZTdHJ1Y3QuTmRlZlRMVkJsb2NrICsgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBQSF9GUklORkNfVE9QQVpfVkFMMSk6CiAgICBOZGVmTWFwLT5UTFZTdHJ1Y3QuTmRlZlRMVkJsb2NrKTsKCiAgICBCeXRlTm8gPSAodWludDhfdCkoKE5kZWZNYXAtPlRMVlN0cnVjdC5OZGVmVExWQnl0ZSArIAogICAgICAgICAgICAgICAgICAgICAgICBQSF9GUklORkNfVE9QQVpfVkFMMSkgJSBQSF9GUklORkNfVE9QQVpfVkFMOCk7CiAgICAvKiBVcGRhdGUgTCBmaWVsZCAqLwogICAgTmRlZk1hcC0+U3RhdGUgPSBQSF9GUklORkNfVE9QQVpfU1RBVEVfV1JJVEVfTF9UTFY7CiAgICAvKiBJbnRlcm5hbCBzdGF0ZSBmb3Igd3JpdGUgKi8KICAgIE5kZWZNYXAtPlRvcGF6Q29udGFpbmVyLkludGVybmFsU3RhdGUgPSBQSF9GUklORkNfVE9QQVpfV1JfTF9UTFY7CiAgICAvKiBVcGRhdGUgdGhlIGxlbmd0aCBmaWVsZCBkZXBlbmRpbmcgb24gdGhlIG9mZnNldCAqLwogICAgVGVtcEJ5dGVWYWwgPSAodWludDhfdCkKICAgICAgICAgICAgICAgICAgICAoKE5kZWZNYXAtPk9mZnNldCA9PSBQSF9GUklORkNfTkRFRk1BUF9TRUVLX0JFR0lOKT8KICAgICAgICAgICAgICAgICAgICBOZGVmTWFwLT5BcGR1QnVmZkluZGV4OgogICAgICAgICAgICAgICAgICAgIChOZGVmTWFwLT5BcGR1QnVmZkluZGV4ICsgCiAgICAgICAgICAgICAgICAgICAgTmRlZk1hcC0+VExWU3RydWN0LkJ5dGVzUmVtYWluTGluVExWKSk7CiAgICAvKiBXcml0ZSB0aGUgTCBmaWVsZCAqLwogICAgUmVzdWx0ID0gcGhGcmlOZmNfVHB6X0hfV3JBQnl0ZShOZGVmTWFwLCBCbG9ja05vLCBCeXRlTm8sVGVtcEJ5dGVWYWwpOwogICAgcmV0dXJuIFJlc3VsdDsKfQoKc3RhdGljIE5GQ1NUQVRVUyBwaEZyaU5mY19UcHpfSF9XckJ5dGUwVmFsRTEocGhGcmlOZmNfTmRlZk1hcF90ICAgKk5kZWZNYXApCnsKICAgIE5GQ1NUQVRVUyAgIFJlc3VsdCA9IE5GQ1NUQVRVU19TVUNDRVNTOwoKICAgIC8qIFVwZGF0ZSBMIGZpZWxkICovCiAgICBOZGVmTWFwLT5TdGF0ZSA9IFBIX0ZSSU5GQ19UT1BBWl9TVEFURV9XUklURV9OTU47CiAgICAvKiBJbnRlcm5hbCBzdGF0ZSBmb3Igd3JpdGluZyAweEUxICovCiAgICBOZGVmTWFwLT5Ub3BhekNvbnRhaW5lci5JbnRlcm5hbFN0YXRlID0gUEhfRlJJTkZDX1RPUEFaX1dSX05NTl9FMTsKICAgIC8qIFVwZGF0ZSB0aGUgbGVuZ3RoIGZpZWxkIGRlcGVuZGluZyBvbiB0aGUgb2Zmc2V0ICovICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgIC8qIFdyaXRlIHRoZSBMIGZpZWxkICovCiAgICBSZXN1bHQgPSBwaEZyaU5mY19UcHpfSF9XckFCeXRlKE5kZWZNYXAsIFBIX0ZSSU5GQ19UT1BBWl9WQUwxLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUEhfRlJJTkZDX1RPUEFaX1ZBTDAsUEhfRlJJTkZDX1RPUEFaX0NDX0JZVEUwKTsKICAgIHJldHVybiBSZXN1bHQ7Cn0KCnN0YXRpYyB2b2lkIHBoRnJpTmZjX1Rwel9IX0NvbXBsZXRlKHBoRnJpTmZjX05kZWZNYXBfdCAgKk5kZWZNYXAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5GQ1NUQVRVUyAgICAgICAgICAgU3RhdHVzKQp7CiAgICAvKiBzZXQgdGhlIHN0YXRlIGJhY2sgdG8gdGhlIFJlc2V0X0luaXQgc3RhdGUqLwogICAgTmRlZk1hcC0+U3RhdGUgPSAgUEhfRlJJTkZDX05ERUZNQVBfU1RBVEVfUkVTRVRfSU5JVDsKCiAgICAvKiBzZXQgdGhlIGNvbXBsZXRpb24gcm91dGluZSovCiAgICBOZGVmTWFwLT5Db21wbGV0aW9uUm91dGluZVtOZGVmTWFwLT5Ub3BhekNvbnRhaW5lci5DUkluZGV4XS4KICAgICAgICBDb21wbGV0aW9uUm91dGluZShOZGVmTWFwLT5Db21wbGV0aW9uUm91dGluZS0+Q29udGV4dCwgU3RhdHVzKTsKfQoKc3RhdGljIHZvaWQgcGhGcmlOZmNfVHB6X0hfQmxrQ2hrKHBoRnJpTmZjX05kZWZNYXBfdCAgKk5kZWZNYXApCnsKICAgIE5kZWZNYXAtPlRvcGF6Q29udGFpbmVyLkN1cnJlbnRCbG9jayA9IAogICAgICAgICAgICAgICAgICAgICh1aW50OF90KSgoTmRlZk1hcC0+VG9wYXpDb250YWluZXIuQnl0ZU51bWJlciA+IAogICAgICAgICAgICAgICAgICAgIFBIX0ZSSU5GQ19UT1BBWl9WQUw3KT8KICAgICAgICAgICAgICAgICAgICAoTmRlZk1hcC0+VG9wYXpDb250YWluZXIuQ3VycmVudEJsb2NrICsgCiAgICAgICAgICAgICAgICAgICAgUEhfRlJJTkZDX1RPUEFaX1ZBTDEpOgogICAgICAgICAgICAgICAgICAgIE5kZWZNYXAtPlRvcGF6Q29udGFpbmVyLkN1cnJlbnRCbG9jayk7CgogICAgTmRlZk1hcC0+VG9wYXpDb250YWluZXIuQnl0ZU51bWJlciA9ICh1aW50OF90KShOZGVmTWFwLT5Ub3BhekNvbnRhaW5lci5CeXRlTnVtYmVyICUgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQSF9GUklORkNfVE9QQVpfVkFMOCk7Cn0KCnN0YXRpYyBORkNTVEFUVVMgcGhGcmlOZmNfVHB6X0hfQ2hrQ0NpbkNoa05kZWYocGhGcmlOZmNfTmRlZk1hcF90ICAqTmRlZk1hcCkKewogICAgTkZDU1RBVFVTICAgUmVzdWx0ID0gUEhORkNTVFZBTChDSURfRlJJX05GQ19OREVGX01BUCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTkZDU1RBVFVTX05PX05ERUZfU1VQUE9SVCk7CgogICAgaWYoTmRlZk1hcC0+VG9wYXpDb250YWluZXIuUmVhZEJ1ZmZlcltQSF9GUklORkNfVE9QQVpfVkFMMF0gPT0gCiAgICAgICAgUEhfRlJJTkZDX1RPUEFaX0NDX0JZVEUwKQogICAgewogICAgICAgIC8qIENoZWNrIHRoZSBtb3N0IHNpZ25pZmljYW50IG5pYmJsZSBvZiBieXRlIDMgKFJXQSkgPSAwICovCiAgICAgICAgUmVzdWx0ID0gKCgoTmRlZk1hcC0+VG9wYXpDb250YWluZXIuUmVhZEJ1ZmZlcltQSF9GUklORkNfVE9QQVpfVkFMM10gJiAKICAgICAgICAgICAgICAgICAgICBQSF9GUklORkNfVE9QQVpfQllURTNfTVNCKT09IFBIX0ZSSU5GQ19UT1BBWl9WQUwwKT8KICAgICAgICAgICAgICAgICAgICBORkNTVEFUVVNfU1VDQ0VTUzoKICAgICAgICAgICAgICAgICAgICBSZXN1bHQpOwoKICAgICAgICAvKiBDYXJkIHNpemUgaXMgaW5pdGlhbGlzZWQgKi8gCiAgICAgICAgTmRlZk1hcC0+Q2FyZE1lbVNpemUgPSBOZGVmTWFwLT5Ub3BhekNvbnRhaW5lci5SZW1haW5pbmdTaXplID0gCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKFJlc3VsdCA9PSBORkNTVEFUVVNfU1VDQ0VTUyk/CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAoUEhfRlJJTkZDX1RPUEFaX01BWF9DQVJEX1NaIC0gUEhfRlJJTkZDX1RPUEFaX1ZBTDQpOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgTmRlZk1hcC0+Q2FyZE1lbVNpemUpOwogICAgfQoKICAgIGlmIChOZGVmTWFwLT5DYXJkU3RhdGUgIT0gUEhfTkRFRk1BUF9DQVJEX1NUQVRFX1JFQURfT05MWSkKICAgIHsKICAgICAgICBOZGVmTWFwLT5DYXJkU3RhdGUgPSAodWludDhfdCkoKFJlc3VsdCA9PSBORkNTVEFUVVNfU1VDQ0VTUyk/CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBQSF9OREVGTUFQX0NBUkRfU1RBVEVfSU5JVElBTElaRUQ6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBQSF9OREVGTUFQX0NBUkRfU1RBVEVfSU5WQUxJRCk7CiAgICB9CgogICAgcmV0dXJuIFJlc3VsdDsKfQoKc3RhdGljIHZvaWQgcGhGcmlOZmNfVHB6X0hfQ2hrTG9ja0JpdHMocGhGcmlOZmNfTmRlZk1hcF90ICAqTmRlZk1hcCkKewogICAgLyogU2V0IHRoZSBjYXJkIHN0YXRlICovCiAgICBOZGVmTWFwLT5DYXJkU3RhdGUgPSAgKHVpbnQ4X3QpCiAgICAgICAgKCgoTmRlZk1hcC0+U2VuZFJlY3ZCdWZbUEhfRlJJTkZDX1RPUEFaX0xPQ0tCSVRfQllURU5PXzBdID09IAogICAgICAgIFBIX0ZSSU5GQ19UT1BBWl9MT0NLQklUX0JZVEUxMTQpICYmIAogICAgICAgICgoTmRlZk1hcC0+U2VuZFJlY3ZCdWZbUEhfRlJJTkZDX1RPUEFaX0xPQ0tCSVRfQllURU5PXzFdID09IAogICAgICAgIFBIX0ZSSU5GQ19UT1BBWl9MT0NLQklUX0JZVEUxMTVfMSkgfHwKICAgICAgICAoTmRlZk1hcC0+U2VuZFJlY3ZCdWZbUEhfRlJJTkZDX1RPUEFaX0xPQ0tCSVRfQllURU5PXzFdID09IAogICAgICAgIFBIX0ZSSU5GQ19UT1BBWl9MT0NLQklUX0JZVEUxMTVfMikpKT8KICAgICAgICBQSF9OREVGTUFQX0NBUkRfU1RBVEVfUkVBRF9XUklURToKICAgICAgICBQSF9OREVGTUFQX0NBUkRfU1RBVEVfUkVBRF9PTkxZKTsKCiAgICAvKiBTZXQgdGhlIGNhcmQgc3RhdGUgZnJvbSBDQyBieXRlcyAqLwogICAgaWYgKE5kZWZNYXAtPkNhcmRTdGF0ZSA9PSBQSF9OREVGTUFQX0NBUkRfU1RBVEVfUkVBRF9XUklURSkKICAgIHsKICAgICAgICBpZiAoTmRlZk1hcC0+U2VuZFJlY3ZCdWZbUEhfRlJJTkZDX1RPUEFaX0NDX0JZVEVOT18zXSA9PSBQSF9GUklORkNfVE9QQVpfQ0NfUkVBRFdSSVRFKQogICAgICAgIHsKICAgICAgICAgICAgTmRlZk1hcC0+Q2FyZFN0YXRlID0gUEhfTkRFRk1BUF9DQVJEX1NUQVRFX1JFQURfV1JJVEU7CiAgICAgICAgfQogICAgICAgIGVsc2UgaWYgKE5kZWZNYXAtPlNlbmRSZWN2QnVmW1BIX0ZSSU5GQ19UT1BBWl9DQ19CWVRFTk9fM10gPT0gUEhfRlJJTkZDX1RPUEFaX0NDX1JFQURPTkxZKQogICAgICAgIHsKICAgICAgICAgICAgTmRlZk1hcC0+Q2FyZFN0YXRlID0gUEhfTkRFRk1BUF9DQVJEX1NUQVRFX1JFQURfT05MWTsKICAgICAgICB9CiAgICAgICAgZWxzZSAKICAgICAgICB7CiAgICAgICAgICAgIE5kZWZNYXAtPkNhcmRTdGF0ZSA9IFBIX05ERUZNQVBfQ0FSRF9TVEFURV9JTlZBTElEOwogICAgICAgIH0KICAgIH0KfQoKc3RhdGljIE5GQ1NUQVRVUyBwaEZyaU5mY19UcHpfSF9XckNDb3JUTFYocGhGcmlOZmNfTmRlZk1hcF90ICAqTmRlZk1hcCkKewogICAgTkZDU1RBVFVTICAgUmVzdWx0ID0gTkZDU1RBVFVTX1NVQ0NFU1M7CiAgICB1aW50OF90ICAgICBCeXRlTm8gPSBQSF9GUklORkNfVE9QQVpfVkFMMCwKICAgICAgICBCbG9ja05vID0gUEhfRlJJTkZDX1RPUEFaX1ZBTDA7CiAgICB1aW50OF90IFRlbXBCeXRlVmFsID0gMDsKICAgIHN3aXRjaChOZGVmTWFwLT5Ub3BhekNvbnRhaW5lci5JbnRlcm5hbFN0YXRlKQogICAgewogICAgY2FzZSBQSF9GUklORkNfVE9QQVpfV1JfQ0NfQllURTA6CiAgICAgICAgLyogVG8gd3JpdGUgdGhlIENDIGJ5dGVzICovCiAgICAgICAgVGVtcEJ5dGVWYWwgPSBQSF9GUklORkNfVE9QQVpfQ0NfQllURTA7CiAgICAgICAgQnl0ZU5vID0gKHVpbnQ4X3QpUEhfRlJJTkZDX1RPUEFaX1ZBTDA7CiAgICAgICAgQmxvY2tObyA9IFBIX0ZSSU5GQ19UT1BBWl9WQUwxOwogICAgICAgIGJyZWFrOwoKICAgIGNhc2UgUEhfRlJJTkZDX1RPUEFaX1dSX0NDX0JZVEUxOgogICAgICAgIC8qIFRvIHdyaXRlIHRoZSBDQyBieXRlcyAqLwogICAgICAgIFRlbXBCeXRlVmFsID0gUEhfRlJJTkZDX1RPUEFaX0NDX0JZVEUxOwogICAgICAgIEJ5dGVObyA9ICh1aW50OF90KVBIX0ZSSU5GQ19UT1BBWl9WQUwxOwogICAgICAgIEJsb2NrTm8gPSBQSF9GUklORkNfVE9QQVpfVkFMMTsKICAgICAgICBicmVhazsKCiAgICBjYXNlIFBIX0ZSSU5GQ19UT1BBWl9XUl9DQ19CWVRFMjoKICAgICAgICAvKiBUbyB3cml0ZSB0aGUgQ0MgYnl0ZXMgKi8KICAgICAgICBUZW1wQnl0ZVZhbCA9IFBIX0ZSSU5GQ19UT1BBWl9DQ19CWVRFMl9NQVg7CiAgICAgICAgQnl0ZU5vID0gKHVpbnQ4X3QpUEhfRlJJTkZDX1RPUEFaX1ZBTDI7CiAgICAgICAgQmxvY2tObyA9IFBIX0ZSSU5GQ19UT1BBWl9WQUwxOwogICAgICAgIGJyZWFrOwoKICAgIGNhc2UgUEhfRlJJTkZDX1RPUEFaX1dSX0NDX0JZVEUzOgogICAgICAgIC8qIFRvIHdyaXRlIHRoZSBDQyBieXRlcyAqLwogICAgICAgIFRlbXBCeXRlVmFsID0gUEhfRlJJTkZDX1RPUEFaX0NDX0JZVEUzX1JXOwogICAgICAgIEJ5dGVObyA9ICh1aW50OF90KVBIX0ZSSU5GQ19UT1BBWl9WQUwzOwogICAgICAgIEJsb2NrTm8gPSBQSF9GUklORkNfVE9QQVpfVkFMMTsKICAgICAgICBicmVhazsKCiAgICBjYXNlIFBIX0ZSSU5GQ19UT1BBWl9XUl9UX09GX1RMVjoKICAgIGRlZmF1bHQ6CiAgICAgICAgLyogVG8gd3JpdGUgdGhlIE5ERUYgVExWIChpZiBub3QgcHJlc2VudCkgKi8KICAgICAgICBUZW1wQnl0ZVZhbCA9IFBIX0ZSSU5GQ19UT1BBWl9OREVGX1Q7CiAgICAgICAgQnl0ZU5vID0gKHVpbnQ4X3QpTmRlZk1hcC0+VExWU3RydWN0Lk5kZWZUTFZCeXRlOwogICAgICAgIEJsb2NrTm8gPSBOZGVmTWFwLT5UTFZTdHJ1Y3QuTmRlZlRMVkJsb2NrOwogICAgICAgIGJyZWFrOwogICAgfQogICAgTmRlZk1hcC0+U3RhdGUgPSBQSF9GUklORkNfVE9QQVpfU1RBVEVfV1JfQ0NfT1JfVExWOwogICAgUmVzdWx0ID0gcGhGcmlOZmNfVHB6X0hfV3JBQnl0ZSggTmRlZk1hcCwgQmxvY2tObywgQnl0ZU5vLFRlbXBCeXRlVmFsKTsKICAgIHJldHVybiBSZXN1bHQ7Cn0KCnN0YXRpYyBORkNTVEFUVVMgcGhGcmlOZmNfVHB6X0hfUHJvQ0NUTFYocGhGcmlOZmNfTmRlZk1hcF90ICAqTmRlZk1hcCkKewogICAgTkZDU1RBVFVTICAgUmVzdWx0ID0gUEhORkNTVFZBTChDSURfRlJJX05GQ19OREVGX01BUCwKICAgICAgICBORkNTVEFUVVNfSU5WQUxJRF9SRUNFSVZFX0xFTkdUSCk7CiAgICBzd2l0Y2goTmRlZk1hcC0+VG9wYXpDb250YWluZXIuSW50ZXJuYWxTdGF0ZSkKICAgIHsKICAgIGNhc2UgUEhfRlJJTkZDX1RPUEFaX1dSX0NDX0JZVEUwOgogICAgICAgIC8qIFByb2Nlc3MgdGhlIENDIGJ5dGUgKi8KICAgICAgICAvKiBDaGVjayB0aGUgcmVzcG9uc2UgKi8KICAgICAgICBpZigoTmRlZk1hcC0+U2VuZFJlY3ZCdWZbUEhfRlJJTkZDX1RPUEFaX1ZBTDBdID09IAogICAgICAgICAgICBQSF9GUklORkNfVE9QQVpfQ0NfQllURTApICYmIAogICAgICAgICAgICAoKk5kZWZNYXAtPlNlbmRSZWN2TGVuZ3RoID09IFBIX0ZSSU5GQ19UT1BBWl9WQUwxKSkKICAgICAgICB7CiAgICAgICAgICAgIE5kZWZNYXAtPlRvcGF6Q29udGFpbmVyLkludGVybmFsU3RhdGUgPSBQSF9GUklORkNfVE9QQVpfV1JfQ0NfQllURTE7CiAgICAgICAgICAgIFJlc3VsdCA9IHBoRnJpTmZjX1Rwel9IX1dyQ0NvclRMVihOZGVmTWFwKTsKICAgICAgICB9CiAgICAgICAgYnJlYWs7CgogICAgY2FzZSBQSF9GUklORkNfVE9QQVpfV1JfQ0NfQllURTE6CiAgICAgICAgLyogUHJvY2VzcyB0aGUgQ0MgYnl0ZSAqLwogICAgICAgIC8qIENoZWNrIHRoZSByZXNwb25zZSAqLwogICAgICAgIGlmKChOZGVmTWFwLT5TZW5kUmVjdkJ1ZltQSF9GUklORkNfVE9QQVpfVkFMMF0gPT0gCiAgICAgICAgICAgIFBIX0ZSSU5GQ19UT1BBWl9DQ19CWVRFMSkgJiYgCiAgICAgICAgICAgICgqTmRlZk1hcC0+U2VuZFJlY3ZMZW5ndGggPT0gUEhfRlJJTkZDX1RPUEFaX1ZBTDEpKQogICAgICAgIHsKICAgICAgICAgICAgTmRlZk1hcC0+VG9wYXpDb250YWluZXIuSW50ZXJuYWxTdGF0ZSA9IFBIX0ZSSU5GQ19UT1BBWl9XUl9DQ19CWVRFMjsKICAgICAgICAgICAgUmVzdWx0ID0gcGhGcmlOZmNfVHB6X0hfV3JDQ29yVExWKE5kZWZNYXApOwogICAgICAgIH0KICAgICAgICBicmVhazsKCiAgICBjYXNlIFBIX0ZSSU5GQ19UT1BBWl9XUl9DQ19CWVRFMjoKICAgICAgICAvKiBQcm9jZXNzIHRoZSBDQyBieXRlICovCiAgICAgICAgLyogQ2hlY2sgdGhlIHJlc3BvbnNlICovCiAgICAgICAgaWYoKE5kZWZNYXAtPlNlbmRSZWN2QnVmW1BIX0ZSSU5GQ19UT1BBWl9WQUwwXSA9PSAKICAgICAgICAgICAgUEhfRlJJTkZDX1RPUEFaX0NDX0JZVEUyX01BWCkgJiYgCiAgICAgICAgICAgICgqTmRlZk1hcC0+U2VuZFJlY3ZMZW5ndGggPT0gUEhfRlJJTkZDX1RPUEFaX1ZBTDEpKQogICAgICAgIHsKICAgICAgICAgICAgTmRlZk1hcC0+VG9wYXpDb250YWluZXIuSW50ZXJuYWxTdGF0ZSA9IFBIX0ZSSU5GQ19UT1BBWl9XUl9DQ19CWVRFMzsKICAgICAgICAgICAgUmVzdWx0ID0gcGhGcmlOZmNfVHB6X0hfV3JDQ29yVExWKE5kZWZNYXApOwogICAgICAgIH0KICAgICAgICBicmVhazsKCiAgICBjYXNlIFBIX0ZSSU5GQ19UT1BBWl9XUl9DQ19CWVRFMzoKICAgICAgICAvKiBQcm9jZXNzIHRoZSBDQyBieXRlICovCiAgICAgICAgLyogQ2hlY2sgdGhlIHJlc3BvbnNlICovCiAgICAgICAgaWYoKE5kZWZNYXAtPlNlbmRSZWN2QnVmW1BIX0ZSSU5GQ19UT1BBWl9WQUwwXSA9PSAKICAgICAgICAgICAgUEhfRlJJTkZDX1RPUEFaX0NDX0JZVEUzX1JXKSAmJiAKICAgICAgICAgICAgKCpOZGVmTWFwLT5TZW5kUmVjdkxlbmd0aCA9PSBQSF9GUklORkNfVE9QQVpfVkFMMSkpCiAgICAgICAgewogICAgICAgICAgICBOZGVmTWFwLT5Ub3BhekNvbnRhaW5lci5JbnRlcm5hbFN0YXRlID0gUEhfRlJJTkZDX1RPUEFaX1dSX1RfT0ZfVExWOwogICAgICAgICAgICBSZXN1bHQgPSBwaEZyaU5mY19UcHpfSF9XckNDb3JUTFYoTmRlZk1hcCk7CiAgICAgICAgfQogICAgICAgIGJyZWFrOwoKICAgIGNhc2UgUEhfRlJJTkZDX1RPUEFaX1dSX1RfT0ZfVExWOgogICAgZGVmYXVsdDoKICAgICAgICAvKiBDaGVjayB0aGUgcmVzcG9uc2UgKi8KICAgICAgICBpZigoTmRlZk1hcC0+U2VuZFJlY3ZCdWZbUEhfRlJJTkZDX1RPUEFaX1ZBTDBdID09IAogICAgICAgICAgICBQSF9GUklORkNfVE9QQVpfTkRFRl9UKSAmJiAKICAgICAgICAgICAgKCpOZGVmTWFwLT5TZW5kUmVjdkxlbmd0aCA9PSBQSF9GUklORkNfVE9QQVpfVkFMMSkpCiAgICAgICAgewogICAgICAgICAgICAvKiBJbmNyZW1lbnQgdGhlIEJ5dGUgTnVtYmVyICovCiAgICAgICAgICAgIE5kZWZNYXAtPlRvcGF6Q29udGFpbmVyLkJ5dGVOdW1iZXIrKzsKICAgICAgICAgICAgLyogQ2hlY2sgdGhlIGJsb2NrIGFuZCBieXRlIG51bWJlciAqLwogICAgICAgICAgICBwaEZyaU5mY19UcHpfSF9CbGtDaGsoTmRlZk1hcCk7CiAgICAgICAgICAgIC8qIFByb2Nlc3MgdGhlIFQgb2YgTkRFRiBUTFYgKi8KICAgICAgICAgICAgTmRlZk1hcC0+U3RhdGUgPSBQSF9GUklORkNfVE9QQVpfU1RBVEVfV1JJVEVfTk1OOyAgICAgICAgICAgIAogICAgICAgICAgICAKICAgICAgICAgICAgLyogSGVyZSB0aGUgTk1OIGlzIHdyaXR0ZW4gMCwgc28gaW50ZXJuYWwgc3RhdGUgaXMgdXNlZCAqLwogICAgICAgICAgICBOZGVmTWFwLT5Ub3BhekNvbnRhaW5lci5JbnRlcm5hbFN0YXRlID0gUEhfRlJJTkZDX1RPUEFaX1dSX05NTl8wOwoKICAgICAgICAgICAgLypJbnNpZGUgdGhpcyBjYWxsIFdyaXRlIE5NTiAoYmxvY2sgbnVtYmVyIDEgYW5kIGJ5dGUgbnVtYmVyIDApID0gMCAqLwogICAgICAgICAgICBSZXN1bHQgPSBwaEZyaU5mY19UcHpfSF9XckFCeXRlKCBOZGVmTWFwLCBQSF9GUklORkNfVE9QQVpfVkFMMSwKICAgICAgICAgICAgICAgIFBIX0ZSSU5GQ19UT1BBWl9WQUwwLFBIX0ZSSU5GQ19UT1BBWl9WQUwwKTsKICAgICAgICB9CiAgICAgICAgYnJlYWs7CiAgICB9CiAgICByZXR1cm4gUmVzdWx0Owp9CgojaWZkZWYgVU5JVF9URVNUCiNpbmNsdWRlIDxwaFVuaXRUZXN0TmZjX1RvcGF6X3N0YXRpYy5jPgojZW5kaWYKCiNlbmRpZiAgLyogUEhfRlJJTkZDX01BUF9UT1BBWl9ESVNBQkxFRCAqLwo=