LyoKICogQWxwaGEgcmVnaXN0ZXIgY29udGV4dCBzdXBwb3J0CiAqCiAqIENvcHlyaWdodCAoQykgMjAwNCBWaW5jZW50IELpcm9uCiAqCiAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYwogKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCiAqCiAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAogKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgogKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQogKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgogKgogKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCiAqIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcgIFVTQQogKi8KCiNpbmNsdWRlICJjb25maWcuaCIKCiNpZmRlZiBfX0FMUEhBX18KCiNpbmNsdWRlIDxhc3NlcnQuaD4KI2luY2x1ZGUgPGVycm5vLmg+CiNpZmRlZiBIQVZFX1NZU19SRUdfSAojIGluY2x1ZGUgPHN5cy9yZWcuaD4KI2VuZGlmCiNpbmNsdWRlIDxzdGRhcmcuaD4KI2luY2x1ZGUgPHVuaXN0ZC5oPgojaWZkZWYgSEFWRV9TWVNfUFRSQUNFX0gKIyBpbmNsdWRlIDxzeXMvcHRyYWNlLmg+CiNlbmRpZgoKI2luY2x1ZGUgImZpbGUuaCIKI2luY2x1ZGUgInRocmVhZC5oIgojaW5jbHVkZSAicmVxdWVzdC5oIgoKI2lmZGVmIEhBVkVfU1lTX1VTRVJfSAojIGluY2x1ZGUgPHN5cy91c2VyLmg+CiNlbmRpZgoKLyogdXNlciBkZWZpbml0aW9ucyBmcm9tIGFzbS91c2VyLmggKi8Kc3RydWN0IGtlcm5lbF91c2VyX3N0cnVjdAp7CiAgICB1bnNpZ25lZCBsb25nIHJlZ3NbRUZfU0laRS84KzMyXTsKICAgIHNpemVfdCB1X3RzaXplOwogICAgc2l6ZV90IHVfZHNpemU7CiAgICBzaXplX3QgdV9zc2l6ZTsKICAgIHVuc2lnbmVkIGxvbmcgc3RhcnRfY29kZTsKICAgIHVuc2lnbmVkIGxvbmcgc3RhcnRfZGF0YTsKICAgIHVuc2lnbmVkIGxvbmcgc3RhcnRfc3RhY2s7CiAgICBsb25nIGludCBzaWduYWw7CiAgICBzdHJ1Y3QgcmVncyAqIHVfYXIwOwogICAgdW5zaWduZWQgbG9uZyBtYWdpYzsKICAgIGNoYXIgdV9jb21tWzMyXTsKfTsKCi8qIGdldCB0aHJlYWQgY29udGV4dCAqLwpzdGF0aWMgdm9pZCBnZXRfdGhyZWFkX2NvbnRleHQoIHN0cnVjdCB0aHJlYWQgKnRocmVhZCwgdW5zaWduZWQgaW50IGZsYWdzLCBDT05URVhUICpjb250ZXh0ICkKewogICAgaW50IHBpZCA9IGdldF9wdHJhY2VfcGlkKHRocmVhZCk7CiAgICBpZiAoZmxhZ3MgJiBDT05URVhUX0ZVTEwpCiAgICB7CiAgICAgICAgc3RydWN0IGtlcm5lbF91c2VyX3N0cnVjdCByZWdzOwogICAgICAgIGlmIChwdHJhY2UoIFBUUkFDRV9HRVRSRUdTLCBwaWQsIDAsICZyZWdzICkgPT0gLTEpIGdvdG8gZXJyb3I7CiAgICAgICAgaWYgKGZsYWdzICYgQ09OVEVYVF9JTlRFR0VSKQogICAgICAgIHsKICAgICAgICAgICAgY29udGV4dC0+SW50VjAgPSByZWdzLnJlZ3NbRUZfVjBdOwogICAgICAgICAgICBjb250ZXh0LT5JbnRUMCA9IHJlZ3MucmVnc1tFRl9UMF07CiAgICAgICAgICAgIGNvbnRleHQtPkludFQxID0gcmVncy5yZWdzW0VGX1QxXTsKICAgICAgICAgICAgY29udGV4dC0+SW50VDIgPSByZWdzLnJlZ3NbRUZfVDJdOwogICAgICAgICAgICBjb250ZXh0LT5JbnRUMyA9IHJlZ3MucmVnc1tFRl9UM107CiAgICAgICAgICAgIGNvbnRleHQtPkludFQ0ID0gcmVncy5yZWdzW0VGX1Q0XTsKICAgICAgICAgICAgY29udGV4dC0+SW50VDUgPSByZWdzLnJlZ3NbRUZfVDVdOwogICAgICAgICAgICBjb250ZXh0LT5JbnRUNiA9IHJlZ3MucmVnc1tFRl9UNl07CiAgICAgICAgICAgIGNvbnRleHQtPkludFQ3ID0gcmVncy5yZWdzW0VGX1Q3XTsKICAgICAgICAgICAgY29udGV4dC0+SW50UzAgPSByZWdzLnJlZ3NbRUZfUzBdOwogICAgICAgICAgICBjb250ZXh0LT5JbnRTMSA9IHJlZ3MucmVnc1tFRl9TMV07CiAgICAgICAgICAgIGNvbnRleHQtPkludFMyID0gcmVncy5yZWdzW0VGX1MyXTsKICAgICAgICAgICAgY29udGV4dC0+SW50UzMgPSByZWdzLnJlZ3NbRUZfUzNdOwogICAgICAgICAgICBjb250ZXh0LT5JbnRTNCA9IHJlZ3MucmVnc1tFRl9TNF07CiAgICAgICAgICAgIGNvbnRleHQtPkludFM1ID0gcmVncy5yZWdzW0VGX1M1XTsKICAgICAgICAgICAgY29udGV4dC0+SW50RnAgPSByZWdzLnJlZ3NbRUZfUzZdOwogICAgICAgICAgICBjb250ZXh0LT5JbnRBMCA9IHJlZ3MucmVnc1tFRl9BMF07CiAgICAgICAgICAgIGNvbnRleHQtPkludEExID0gcmVncy5yZWdzW0VGX0ExXTsKICAgICAgICAgICAgY29udGV4dC0+SW50QTIgPSByZWdzLnJlZ3NbRUZfQTJdOwogICAgICAgICAgICBjb250ZXh0LT5JbnRBMyA9IHJlZ3MucmVnc1tFRl9BM107CiAgICAgICAgICAgIGNvbnRleHQtPkludEE0ID0gcmVncy5yZWdzW0VGX0E0XTsKICAgICAgICAgICAgY29udGV4dC0+SW50QTUgPSByZWdzLnJlZ3NbRUZfQTVdOwogICAgICAgICAgICBjb250ZXh0LT5JbnRUOCA9IHJlZ3MucmVnc1tFRl9UOF07CiAgICAgICAgICAgIGNvbnRleHQtPkludFQ5ID0gcmVncy5yZWdzW0VGX1Q5XTsKICAgICAgICAgICAgY29udGV4dC0+SW50VDEwID0gcmVncy5yZWdzW0VGX1QxMF07CiAgICAgICAgICAgIGNvbnRleHQtPkludFQxMSA9IHJlZ3MucmVnc1tFRl9UMTFdOwogICAgICAgICAgICBjb250ZXh0LT5JbnRUMTIgPSByZWdzLnJlZ3NbRUZfVDEyXTsKICAgICAgICAgICAgY29udGV4dC0+SW50QXQgPSByZWdzLnJlZ3NbRUZfQVRdOwogICAgICAgICAgICBjb250ZXh0LT5JbnRaZXJvID0gMDsKICAgICAgICB9CiAgICAgICAgaWYgKGZsYWdzICYgQ09OVEVYVF9DT05UUk9MKQogICAgICAgIHsKICAgICAgICAgICAgY29udGV4dC0+SW50UmEgPSByZWdzLnJlZ3NbRUZfUkFdOwogICAgICAgICAgICBjb250ZXh0LT5JbnRHcCA9IHJlZ3MucmVnc1tFRl9HUF07CiAgICAgICAgICAgIGNvbnRleHQtPkludFNwID0gcmVncy5yZWdzW0VGX1NQXTsKICAgICAgICAgICAgY29udGV4dC0+RmlyID0gcmVncy5yZWdzW0VGX1BDXTsKICAgICAgICAgICAgY29udGV4dC0+UHNyID0gcmVncy5yZWdzW0VGX1BTXTsKICAgICAgICB9CiAgICAgICAgaWYgKGZsYWdzICYgQ09OVEVYVF9GTE9BVElOR19QT0lOVCkKICAgICAgICB7CiAgICAgICAgICAgIGNvbnRleHQtPkZsdEYwID0gcmVncy5yZWdzW0VGX1NJWkUvOCswXTsKICAgICAgICAgICAgY29udGV4dC0+Rmx0RjEgPSByZWdzLnJlZ3NbRUZfU0laRS84KzFdOwogICAgICAgICAgICBjb250ZXh0LT5GbHRGMiA9IHJlZ3MucmVnc1tFRl9TSVpFLzgrMl07CiAgICAgICAgICAgIGNvbnRleHQtPkZsdEYzID0gcmVncy5yZWdzW0VGX1NJWkUvOCszXTsKICAgICAgICAgICAgY29udGV4dC0+Rmx0RjQgPSByZWdzLnJlZ3NbRUZfU0laRS84KzRdOwogICAgICAgICAgICBjb250ZXh0LT5GbHRGNSA9IHJlZ3MucmVnc1tFRl9TSVpFLzgrNV07CiAgICAgICAgICAgIGNvbnRleHQtPkZsdEY2ID0gcmVncy5yZWdzW0VGX1NJWkUvOCs2XTsKICAgICAgICAgICAgY29udGV4dC0+Rmx0RjcgPSByZWdzLnJlZ3NbRUZfU0laRS84KzddOwogICAgICAgICAgICBjb250ZXh0LT5GbHRGOCA9IHJlZ3MucmVnc1tFRl9TSVpFLzgrOF07CiAgICAgICAgICAgIGNvbnRleHQtPkZsdEY5ID0gcmVncy5yZWdzW0VGX1NJWkUvOCs5XTsKICAgICAgICAgICAgY29udGV4dC0+Rmx0RjEwID0gcmVncy5yZWdzW0VGX1NJWkUvOCsxMF07CiAgICAgICAgICAgIGNvbnRleHQtPkZsdEYxMSA9IHJlZ3MucmVnc1tFRl9TSVpFLzgrMTFdOwogICAgICAgICAgICBjb250ZXh0LT5GbHRGMTIgPSByZWdzLnJlZ3NbRUZfU0laRS84KzEyXTsKICAgICAgICAgICAgY29udGV4dC0+Rmx0RjEzID0gcmVncy5yZWdzW0VGX1NJWkUvOCsxM107CiAgICAgICAgICAgIGNvbnRleHQtPkZsdEYxNCA9IHJlZ3MucmVnc1tFRl9TSVpFLzgrMTRdOwogICAgICAgICAgICBjb250ZXh0LT5GbHRGMTUgPSByZWdzLnJlZ3NbRUZfU0laRS84KzE1XTsKICAgICAgICAgICAgY29udGV4dC0+Rmx0RjE2ID0gcmVncy5yZWdzW0VGX1NJWkUvOCsxNl07CiAgICAgICAgICAgIGNvbnRleHQtPkZsdEYxNyA9IHJlZ3MucmVnc1tFRl9TSVpFLzgrMTddOwogICAgICAgICAgICBjb250ZXh0LT5GbHRGMTggPSByZWdzLnJlZ3NbRUZfU0laRS84KzE4XTsKICAgICAgICAgICAgY29udGV4dC0+Rmx0RjE5ID0gcmVncy5yZWdzW0VGX1NJWkUvOCsxOV07CiAgICAgICAgICAgIGNvbnRleHQtPkZsdEYyMCA9IHJlZ3MucmVnc1tFRl9TSVpFLzgrMjBdOwogICAgICAgICAgICBjb250ZXh0LT5GbHRGMjEgPSByZWdzLnJlZ3NbRUZfU0laRS84KzIxXTsKICAgICAgICAgICAgY29udGV4dC0+Rmx0RjIyID0gcmVncy5yZWdzW0VGX1NJWkUvOCsyMl07CiAgICAgICAgICAgIGNvbnRleHQtPkZsdEYyMyA9IHJlZ3MucmVnc1tFRl9TSVpFLzgrMjNdOwogICAgICAgICAgICBjb250ZXh0LT5GbHRGMjQgPSByZWdzLnJlZ3NbRUZfU0laRS84KzI0XTsKICAgICAgICAgICAgY29udGV4dC0+Rmx0RjI1ID0gcmVncy5yZWdzW0VGX1NJWkUvOCsyNV07CiAgICAgICAgICAgIGNvbnRleHQtPkZsdEYyNiA9IHJlZ3MucmVnc1tFRl9TSVpFLzgrMjZdOwogICAgICAgICAgICBjb250ZXh0LT5GbHRGMjcgPSByZWdzLnJlZ3NbRUZfU0laRS84KzI3XTsKICAgICAgICAgICAgY29udGV4dC0+Rmx0RjI4ID0gcmVncy5yZWdzW0VGX1NJWkUvOCsyOF07CiAgICAgICAgICAgIGNvbnRleHQtPkZsdEYyOSA9IHJlZ3MucmVnc1tFRl9TSVpFLzgrMjldOwogICAgICAgICAgICBjb250ZXh0LT5GbHRGMzAgPSByZWdzLnJlZ3NbRUZfU0laRS84KzMwXTsKICAgICAgICAgICAgY29udGV4dC0+Rmx0RjMxID0gMDsKICAgICAgICAgICAgY29udGV4dC0+RnBjciA9IHJlZ3MucmVnc1tFRl9TSVpFLzgrMzFdOwogICAgICAgICAgICBjb250ZXh0LT5Tb2Z0RnBjciA9IDA7IC8qIEZJWE1FICovCiAgICAgICAgfQogICAgICAgIGlmIChwdHJhY2UoIFBUUkFDRV9TRVRSRUdTLCBwaWQsIDAsICZyZWdzICkgPT0gLTEpIGdvdG8gZXJyb3I7CiAgICB9CiAgICByZXR1cm47CiBlcnJvcjoKICAgIGZpbGVfc2V0X2Vycm9yKCk7Cn0KCi8qIHNldCBhIHRocmVhZCBjb250ZXh0ICovCnN0YXRpYyB2b2lkIHNldF90aHJlYWRfY29udGV4dCggc3RydWN0IHRocmVhZCAqdGhyZWFkLCB1bnNpZ25lZCBpbnQgZmxhZ3MsIGNvbnN0IENPTlRFWFQgKmNvbnRleHQgKQp7CiAgICBpbnQgcGlkID0gZ2V0X3B0cmFjZV9waWQodGhyZWFkKTsKICAgIGlmIChmbGFncyAmIENPTlRFWFRfRlVMTCkKICAgIHsKICAgICAgICBzdHJ1Y3Qga2VybmVsX3VzZXJfc3RydWN0IHJlZ3M7CiAgICAgICAgaWYgKHB0cmFjZSggUFRSQUNFX0dFVFJFR1MsIHBpZCwgMCwgJnJlZ3MgKSA9PSAtMSkgZ290byBlcnJvcjsKICAgICAgICBpZiAoZmxhZ3MgJiBDT05URVhUX0lOVEVHRVIpCiAgICAgICAgewogICAgICAgICAgICByZWdzLnJlZ3NbRUZfVjBdID0gY29udGV4dC0+SW50VjA7CiAgICAgICAgICAgIHJlZ3MucmVnc1tFRl9UMF0gPSBjb250ZXh0LT5JbnRUMDsKICAgICAgICAgICAgcmVncy5yZWdzW0VGX1QxXSA9IGNvbnRleHQtPkludFQxOwogICAgICAgICAgICByZWdzLnJlZ3NbRUZfVDJdID0gY29udGV4dC0+SW50VDI7CiAgICAgICAgICAgIHJlZ3MucmVnc1tFRl9UM10gPSBjb250ZXh0LT5JbnRUMzsKICAgICAgICAgICAgcmVncy5yZWdzW0VGX1Q0XSA9IGNvbnRleHQtPkludFQ0OwogICAgICAgICAgICByZWdzLnJlZ3NbRUZfVDVdID0gY29udGV4dC0+SW50VDU7CiAgICAgICAgICAgIHJlZ3MucmVnc1tFRl9UNl0gPSBjb250ZXh0LT5JbnRUNjsKICAgICAgICAgICAgcmVncy5yZWdzW0VGX1Q3XSA9IGNvbnRleHQtPkludFQ3OwogICAgICAgICAgICByZWdzLnJlZ3NbRUZfUzBdID0gY29udGV4dC0+SW50UzA7CiAgICAgICAgICAgIHJlZ3MucmVnc1tFRl9TMV0gPSBjb250ZXh0LT5JbnRTMTsKICAgICAgICAgICAgcmVncy5yZWdzW0VGX1MyXSA9IGNvbnRleHQtPkludFMyOwogICAgICAgICAgICByZWdzLnJlZ3NbRUZfUzNdID0gY29udGV4dC0+SW50UzM7CiAgICAgICAgICAgIHJlZ3MucmVnc1tFRl9TNF0gPSBjb250ZXh0LT5JbnRTNDsKICAgICAgICAgICAgcmVncy5yZWdzW0VGX1M1XSA9IGNvbnRleHQtPkludFM1OwogICAgICAgICAgICByZWdzLnJlZ3NbRUZfUzZdID0gY29udGV4dC0+SW50RnA7CiAgICAgICAgICAgIHJlZ3MucmVnc1tFRl9BMF0gPSBjb250ZXh0LT5JbnRBMDsKICAgICAgICAgICAgcmVncy5yZWdzW0VGX0ExXSA9IGNvbnRleHQtPkludEExOwogICAgICAgICAgICByZWdzLnJlZ3NbRUZfQTJdID0gY29udGV4dC0+SW50QTI7CiAgICAgICAgICAgIHJlZ3MucmVnc1tFRl9BM10gPSBjb250ZXh0LT5JbnRBMzsKICAgICAgICAgICAgcmVncy5yZWdzW0VGX0E0XSA9IGNvbnRleHQtPkludEE0OwogICAgICAgICAgICByZWdzLnJlZ3NbRUZfQTVdID0gY29udGV4dC0+SW50QTU7CiAgICAgICAgICAgIHJlZ3MucmVnc1tFRl9UOF0gPSBjb250ZXh0LT5JbnRUODsKICAgICAgICAgICAgcmVncy5yZWdzW0VGX1Q5XSA9IGNvbnRleHQtPkludFQ5OwogICAgICAgICAgICByZWdzLnJlZ3NbRUZfVDEwXSA9IGNvbnRleHQtPkludFQxMDsKICAgICAgICAgICAgcmVncy5yZWdzW0VGX1QxMV0gPSBjb250ZXh0LT5JbnRUMTE7CiAgICAgICAgICAgIHJlZ3MucmVnc1tFRl9UMTJdID0gY29udGV4dC0+SW50VDEyOwogICAgICAgICAgICByZWdzLnJlZ3NbRUZfQVRdID0gY29udGV4dC0+SW50QXQ7CiAgICAgICAgfQogICAgICAgIGlmIChmbGFncyAmIENPTlRFWFRfQ09OVFJPTCkKICAgICAgICB7CiAgICAgICAgICAgIHJlZ3MucmVnc1tFRl9SQV0gPSBjb250ZXh0LT5JbnRSYTsKICAgICAgICAgICAgcmVncy5yZWdzW0VGX0dQXSA9IGNvbnRleHQtPkludEdwOwogICAgICAgICAgICByZWdzLnJlZ3NbRUZfU1BdID0gY29udGV4dC0+SW50U3A7CiAgICAgICAgICAgIHJlZ3MucmVnc1tFRl9QQ10gPSBjb250ZXh0LT5GaXI7CiAgICAgICAgICAgIHJlZ3MucmVnc1tFRl9QU10gPSBjb250ZXh0LT5Qc3I7CiAgICAgICAgfQogICAgICAgIGlmIChmbGFncyAmIENPTlRFWFRfRkxPQVRJTkdfUE9JTlQpCiAgICAgICAgewogICAgICAgICAgICByZWdzLnJlZ3NbRUZfU0laRS84KzBdID0gY29udGV4dC0+Rmx0RjA7CiAgICAgICAgICAgIHJlZ3MucmVnc1tFRl9TSVpFLzgrMV0gPSBjb250ZXh0LT5GbHRGMTsKICAgICAgICAgICAgcmVncy5yZWdzW0VGX1NJWkUvOCsyXSA9IGNvbnRleHQtPkZsdEYyOwogICAgICAgICAgICByZWdzLnJlZ3NbRUZfU0laRS84KzNdID0gY29udGV4dC0+Rmx0RjM7CiAgICAgICAgICAgIHJlZ3MucmVnc1tFRl9TSVpFLzgrNF0gPSBjb250ZXh0LT5GbHRGNDsKICAgICAgICAgICAgcmVncy5yZWdzW0VGX1NJWkUvOCs1XSA9IGNvbnRleHQtPkZsdEY1OwogICAgICAgICAgICByZWdzLnJlZ3NbRUZfU0laRS84KzZdID0gY29udGV4dC0+Rmx0RjY7CiAgICAgICAgICAgIHJlZ3MucmVnc1tFRl9TSVpFLzgrN10gPSBjb250ZXh0LT5GbHRGNzsKICAgICAgICAgICAgcmVncy5yZWdzW0VGX1NJWkUvOCs4XSA9IGNvbnRleHQtPkZsdEY4OwogICAgICAgICAgICByZWdzLnJlZ3NbRUZfU0laRS84KzldID0gY29udGV4dC0+Rmx0Rjk7CiAgICAgICAgICAgIHJlZ3MucmVnc1tFRl9TSVpFLzgrMTBdID0gY29udGV4dC0+Rmx0RjEwOwogICAgICAgICAgICByZWdzLnJlZ3NbRUZfU0laRS84KzExXSA9IGNvbnRleHQtPkZsdEYxMTsKICAgICAgICAgICAgcmVncy5yZWdzW0VGX1NJWkUvOCsxMl0gPSBjb250ZXh0LT5GbHRGMTI7CiAgICAgICAgICAgIHJlZ3MucmVnc1tFRl9TSVpFLzgrMTNdID0gY29udGV4dC0+Rmx0RjEzOwogICAgICAgICAgICByZWdzLnJlZ3NbRUZfU0laRS84KzE0XSA9IGNvbnRleHQtPkZsdEYxNDsKICAgICAgICAgICAgcmVncy5yZWdzW0VGX1NJWkUvOCsxNV0gPSBjb250ZXh0LT5GbHRGMTU7CiAgICAgICAgICAgIHJlZ3MucmVnc1tFRl9TSVpFLzgrMTZdID0gY29udGV4dC0+Rmx0RjE2OwogICAgICAgICAgICByZWdzLnJlZ3NbRUZfU0laRS84KzE3XSA9IGNvbnRleHQtPkZsdEYxNzsKICAgICAgICAgICAgcmVncy5yZWdzW0VGX1NJWkUvOCsxOF0gPSBjb250ZXh0LT5GbHRGMTg7CiAgICAgICAgICAgIHJlZ3MucmVnc1tFRl9TSVpFLzgrMTldID0gY29udGV4dC0+Rmx0RjE5OwogICAgICAgICAgICByZWdzLnJlZ3NbRUZfU0laRS84KzIwXSA9IGNvbnRleHQtPkZsdEYyMDsKICAgICAgICAgICAgcmVncy5yZWdzW0VGX1NJWkUvOCsyMV0gPSBjb250ZXh0LT5GbHRGMjE7CiAgICAgICAgICAgIHJlZ3MucmVnc1tFRl9TSVpFLzgrMjJdID0gY29udGV4dC0+Rmx0RjIyOwogICAgICAgICAgICByZWdzLnJlZ3NbRUZfU0laRS84KzIzXSA9IGNvbnRleHQtPkZsdEYyMzsKICAgICAgICAgICAgcmVncy5yZWdzW0VGX1NJWkUvOCsyNF0gPSBjb250ZXh0LT5GbHRGMjQ7CiAgICAgICAgICAgIHJlZ3MucmVnc1tFRl9TSVpFLzgrMjVdID0gY29udGV4dC0+Rmx0RjI1OwogICAgICAgICAgICByZWdzLnJlZ3NbRUZfU0laRS84KzI2XSA9IGNvbnRleHQtPkZsdEYyNjsKICAgICAgICAgICAgcmVncy5yZWdzW0VGX1NJWkUvOCsyN10gPSBjb250ZXh0LT5GbHRGMjc7CiAgICAgICAgICAgIHJlZ3MucmVnc1tFRl9TSVpFLzgrMjhdID0gY29udGV4dC0+Rmx0RjI4OwogICAgICAgICAgICByZWdzLnJlZ3NbRUZfU0laRS84KzI5XSA9IGNvbnRleHQtPkZsdEYyOTsKICAgICAgICAgICAgcmVncy5yZWdzW0VGX1NJWkUvOCszMF0gPSBjb250ZXh0LT5GbHRGMzA7CiAgICAgICAgICAgIHJlZ3MucmVnc1tFRl9TSVpFLzgrMzFdID0gY29udGV4dC0+RnBjcjsKICAgICAgICB9CiAgICB9CiAgICByZXR1cm47CiBlcnJvcjoKICAgIGZpbGVfc2V0X2Vycm9yKCk7Cn0KCi8qIGNvcHkgYSBjb250ZXh0IHN0cnVjdHVyZSBhY2NvcmRpbmcgdG8gdGhlIGZsYWdzICovCnN0YXRpYyB2b2lkIGNvcHlfY29udGV4dCggQ09OVEVYVCAqdG8sIGNvbnN0IENPTlRFWFQgKmZyb20sIGludCBmbGFncyApCnsKICAgIGlmIChmbGFncyAmIENPTlRFWFRfQ09OVFJPTCkKICAgIHsKICAgICAgICB0by0+SW50UmEgPSBmcm9tLT5JbnRSYTsKICAgICAgICB0by0+SW50R3AgPSBmcm9tLT5JbnRHcDsKICAgICAgICB0by0+SW50U3AgPSBmcm9tLT5JbnRTcDsKICAgICAgICB0by0+RmlyID0gZnJvbS0+RmlyOwogICAgICAgIHRvLT5Qc3IgPSBmcm9tLT5Qc3I7CiAgICB9CiAgICBpZiAoZmxhZ3MgJiBDT05URVhUX0lOVEVHRVIpCiAgICB7CiAgICAgICAgdG8tPkludFYwID0gZnJvbS0+SW50VjA7CiAgICAgICAgdG8tPkludFQwID0gZnJvbS0+SW50VDA7CiAgICAgICAgdG8tPkludFQxID0gZnJvbS0+SW50VDE7CiAgICAgICAgdG8tPkludFQyID0gZnJvbS0+SW50VDI7CiAgICAgICAgdG8tPkludFQzID0gZnJvbS0+SW50VDM7CiAgICAgICAgdG8tPkludFQ0ID0gZnJvbS0+SW50VDQ7CiAgICAgICAgdG8tPkludFQ1ID0gZnJvbS0+SW50VDU7CiAgICAgICAgdG8tPkludFQ2ID0gZnJvbS0+SW50VDY7CiAgICAgICAgdG8tPkludFQ3ID0gZnJvbS0+SW50VDc7CiAgICAgICAgdG8tPkludFMwID0gZnJvbS0+SW50UzA7CiAgICAgICAgdG8tPkludFMxID0gZnJvbS0+SW50UzE7CiAgICAgICAgdG8tPkludFMyID0gZnJvbS0+SW50UzI7CiAgICAgICAgdG8tPkludFMzID0gZnJvbS0+SW50UzM7CiAgICAgICAgdG8tPkludFM0ID0gZnJvbS0+SW50UzQ7CiAgICAgICAgdG8tPkludFM1ID0gZnJvbS0+SW50UzU7CiAgICAgICAgdG8tPkludEZwID0gZnJvbS0+SW50RnA7CiAgICAgICAgdG8tPkludEEwID0gZnJvbS0+SW50QTA7CiAgICAgICAgdG8tPkludEExID0gZnJvbS0+SW50QTE7CiAgICAgICAgdG8tPkludEEyID0gZnJvbS0+SW50QTI7CiAgICAgICAgdG8tPkludEEzID0gZnJvbS0+SW50QTM7CiAgICAgICAgdG8tPkludEE0ID0gZnJvbS0+SW50QTQ7CiAgICAgICAgdG8tPkludEE1ID0gZnJvbS0+SW50QTU7CiAgICAgICAgdG8tPkludFQ4ID0gZnJvbS0+SW50VDg7CiAgICAgICAgdG8tPkludFQ5ID0gZnJvbS0+SW50VDk7CiAgICAgICAgdG8tPkludFQxMCA9IGZyb20tPkludFQxMDsKICAgICAgICB0by0+SW50VDExID0gZnJvbS0+SW50VDExOwogICAgICAgIHRvLT5JbnRUMTIgPSBmcm9tLT5JbnRUMTI7CiAgICAgICAgdG8tPkludEF0ID0gZnJvbS0+SW50QXQ7CiAgICAgICAgdG8tPkludFplcm8gPSBmcm9tLT5JbnRaZXJvOwogICAgfQogICAgaWYgKGZsYWdzICYgQ09OVEVYVF9GTE9BVElOR19QT0lOVCkKICAgIHsKICAgICAgICB0by0+Rmx0RjAgPSBmcm9tLT5GbHRGMDsKICAgICAgICB0by0+Rmx0RjEgPSBmcm9tLT5GbHRGMTsKICAgICAgICB0by0+Rmx0RjIgPSBmcm9tLT5GbHRGMjsKICAgICAgICB0by0+Rmx0RjMgPSBmcm9tLT5GbHRGMzsKICAgICAgICB0by0+Rmx0RjQgPSBmcm9tLT5GbHRGNDsKICAgICAgICB0by0+Rmx0RjUgPSBmcm9tLT5GbHRGNTsKICAgICAgICB0by0+Rmx0RjYgPSBmcm9tLT5GbHRGNjsKICAgICAgICB0by0+Rmx0RjcgPSBmcm9tLT5GbHRGNzsKICAgICAgICB0by0+Rmx0RjggPSBmcm9tLT5GbHRGODsKICAgICAgICB0by0+Rmx0RjkgPSBmcm9tLT5GbHRGOTsKICAgICAgICB0by0+Rmx0RjEwID0gZnJvbS0+Rmx0RjEwOwogICAgICAgIHRvLT5GbHRGMTEgPSBmcm9tLT5GbHRGMTE7CiAgICAgICAgdG8tPkZsdEYxMiA9IGZyb20tPkZsdEYxMjsKICAgICAgICB0by0+Rmx0RjEzID0gZnJvbS0+Rmx0RjEzOwogICAgICAgIHRvLT5GbHRGMTQgPSBmcm9tLT5GbHRGMTQ7CiAgICAgICAgdG8tPkZsdEYxNSA9IGZyb20tPkZsdEYxNTsKICAgICAgICB0by0+Rmx0RjE2ID0gZnJvbS0+Rmx0RjE2OwogICAgICAgIHRvLT5GbHRGMTcgPSBmcm9tLT5GbHRGMTc7CiAgICAgICAgdG8tPkZsdEYxOCA9IGZyb20tPkZsdEYxODsKICAgICAgICB0by0+Rmx0RjE5ID0gZnJvbS0+Rmx0RjE5OwogICAgICAgIHRvLT5GbHRGMjAgPSBmcm9tLT5GbHRGMjA7CiAgICAgICAgdG8tPkZsdEYyMSA9IGZyb20tPkZsdEYyMTsKICAgICAgICB0by0+Rmx0RjIyID0gZnJvbS0+Rmx0RjIyOwogICAgICAgIHRvLT5GbHRGMjMgPSBmcm9tLT5GbHRGMjM7CiAgICAgICAgdG8tPkZsdEYyNCA9IGZyb20tPkZsdEYyNDsKICAgICAgICB0by0+Rmx0RjI1ID0gZnJvbS0+Rmx0RjI1OwogICAgICAgIHRvLT5GbHRGMjYgPSBmcm9tLT5GbHRGMjY7CiAgICAgICAgdG8tPkZsdEYyNyA9IGZyb20tPkZsdEYyNzsKICAgICAgICB0by0+Rmx0RjI4ID0gZnJvbS0+Rmx0RjI4OwogICAgICAgIHRvLT5GbHRGMjkgPSBmcm9tLT5GbHRGMjk7CiAgICAgICAgdG8tPkZsdEYzMCA9IGZyb20tPkZsdEYzMDsKICAgICAgICB0by0+Rmx0RjMxID0gZnJvbS0+Rmx0RjMxOwogICAgICAgIHRvLT5GcGNyID0gZnJvbS0+RnBjcjsKICAgICAgICB0by0+U29mdEZwY3IgPSBmcm9tLT5Tb2Z0RnBjcjsKICAgIH0KfQoKLyogcmV0cmlldmUgdGhlIGN1cnJlbnQgaW5zdHJ1Y3Rpb24gcG9pbnRlciBvZiBhIHRocmVhZCAqLwp2b2lkICpnZXRfdGhyZWFkX2lwKCBzdHJ1Y3QgdGhyZWFkICp0aHJlYWQgKQp7CiAgICBDT05URVhUIGNvbnRleHQ7CiAgICBjb250ZXh0LkZpciA9IDA7CiAgICBpZiAoc3VzcGVuZF9mb3JfcHRyYWNlKCB0aHJlYWQgKSkKICAgIHsKICAgICAgICBnZXRfdGhyZWFkX2NvbnRleHQoIHRocmVhZCwgQ09OVEVYVF9DT05UUk9MLCAmY29udGV4dCApOwogICAgICAgIHJlc3VtZV9hZnRlcl9wdHJhY2UoIHRocmVhZCApOwogICAgfQogICAgcmV0dXJuICh2b2lkICopY29udGV4dC5GaXI7Cn0KCi8qIGRldGVybWluZSBpZiB3ZSBzaG91bGQgY29udGludWUgdGhlIHRocmVhZCBpbiBzaW5nbGUtc3RlcCBtb2RlICovCmludCBnZXRfdGhyZWFkX3NpbmdsZV9zdGVwKCBzdHJ1Y3QgdGhyZWFkICp0aHJlYWQgKQp7CiAgICByZXR1cm4gMDsgIC8qIEZJWE1FICovCn0KCi8qIHNlbmQgYSBzaWduYWwgdG8gYSBzcGVjaWZpYyB0aHJlYWQgKi8KaW50IHRraWxsKCBpbnQgcGlkLCBpbnQgc2lnICkKewogICAgLyogRklYTUU6IHNob3VsZCBkbyBzb21ldGhpbmcgaGVyZSAqLwogICAgZXJybm8gPSBFTk9TWVM7CiAgICByZXR1cm4gLTE7Cn0KCi8qIHJldHJpZXZlIHRoZSBjdXJyZW50IGNvbnRleHQgb2YgYSB0aHJlYWQgKi8KREVDTF9IQU5ETEVSKGdldF90aHJlYWRfY29udGV4dCkKewogICAgc3RydWN0IHRocmVhZCAqdGhyZWFkOwogICAgdm9pZCAqZGF0YTsKICAgIGludCBmbGFncyA9IHJlcS0+ZmxhZ3MgJiB+Q09OVEVYVF9BTFBIQTsgIC8qIGdldCByaWQgb2YgQ1BVIGlkICovCgogICAgaWYgKGdldF9yZXBseV9tYXhfc2l6ZSgpIDwgc2l6ZW9mKENPTlRFWFQpKQogICAgewogICAgICAgIHNldF9lcnJvciggU1RBVFVTX0lOVkFMSURfUEFSQU1FVEVSICk7CiAgICAgICAgcmV0dXJuOwogICAgfQogICAgaWYgKCEodGhyZWFkID0gZ2V0X3RocmVhZF9mcm9tX2hhbmRsZSggcmVxLT5oYW5kbGUsIFRIUkVBRF9HRVRfQ09OVEVYVCApKSkgcmV0dXJuOwoKICAgIGlmICgoZGF0YSA9IHNldF9yZXBseV9kYXRhX3NpemUoIHNpemVvZihDT05URVhUKSApKSkKICAgIHsKICAgICAgICBpZiAodGhyZWFkLT5jb250ZXh0KSAgLyogdGhyZWFkIGlzIGluc2lkZSBhbiBleGNlcHRpb24gZXZlbnQgKi8KICAgICAgICB7CiAgICAgICAgICAgIGNvcHlfY29udGV4dCggZGF0YSwgdGhyZWFkLT5jb250ZXh0LCBmbGFncyApOwogICAgICAgICAgICBmbGFncyA9IDA7CiAgICAgICAgfQogICAgICAgIGlmIChmbGFncyAmJiBzdXNwZW5kX2Zvcl9wdHJhY2UoIHRocmVhZCApKQogICAgICAgIHsKICAgICAgICAgICAgZ2V0X3RocmVhZF9jb250ZXh0KCB0aHJlYWQsIGZsYWdzLCBkYXRhICk7CiAgICAgICAgICAgIHJlc3VtZV9hZnRlcl9wdHJhY2UoIHRocmVhZCApOwogICAgICAgIH0KICAgIH0KICAgIHJlbGVhc2Vfb2JqZWN0KCB0aHJlYWQgKTsKfQoKLyogc2V0IHRoZSBjdXJyZW50IGNvbnRleHQgb2YgYSB0aHJlYWQgKi8KREVDTF9IQU5ETEVSKHNldF90aHJlYWRfY29udGV4dCkKewogICAgc3RydWN0IHRocmVhZCAqdGhyZWFkOwogICAgaW50IGZsYWdzID0gcmVxLT5mbGFncyAmIH5DT05URVhUX0FMUEhBOyAgLyogZ2V0IHJpZCBvZiBDUFUgaWQgKi8KCiAgICBpZiAoZ2V0X3JlcV9kYXRhX3NpemUoKSA8IHNpemVvZihDT05URVhUKSkKICAgIHsKICAgICAgICBzZXRfZXJyb3IoIFNUQVRVU19JTlZBTElEX1BBUkFNRVRFUiApOwogICAgICAgIHJldHVybjsKICAgIH0KICAgIGlmICgodGhyZWFkID0gZ2V0X3RocmVhZF9mcm9tX2hhbmRsZSggcmVxLT5oYW5kbGUsIFRIUkVBRF9TRVRfQ09OVEVYVCApKSkKICAgIHsKICAgICAgICBpZiAodGhyZWFkLT5jb250ZXh0KSAgLyogdGhyZWFkIGlzIGluc2lkZSBhbiBleGNlcHRpb24gZXZlbnQgKi8KICAgICAgICB7CiAgICAgICAgICAgIGNvcHlfY29udGV4dCggdGhyZWFkLT5jb250ZXh0LCBnZXRfcmVxX2RhdGEoKSwgZmxhZ3MgKTsKICAgICAgICAgICAgZmxhZ3MgPSAwOwogICAgICAgIH0KICAgICAgICBpZiAoZmxhZ3MgJiYgc3VzcGVuZF9mb3JfcHRyYWNlKCB0aHJlYWQgKSkKICAgICAgICB7CiAgICAgICAgICAgIHNldF90aHJlYWRfY29udGV4dCggdGhyZWFkLCBmbGFncywgZ2V0X3JlcV9kYXRhKCkgKTsKICAgICAgICAgICAgcmVzdW1lX2FmdGVyX3B0cmFjZSggdGhyZWFkICk7CiAgICAgICAgfQogICAgICAgIHJlbGVhc2Vfb2JqZWN0KCB0aHJlYWQgKTsKICAgIH0KfQoKI2VuZGlmICAvKiBfX0FMUEhBX18gKi8K