LyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KICogICAgICAgICBBVE1FTCBNaWNyb2NvbnRyb2xsZXIgU29mdHdhcmUgU3VwcG9ydCANCiAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCiAqIENvcHlyaWdodCAoYykgMjAwOCwgQXRtZWwgQ29ycG9yYXRpb24NCiAqDQogKiBBbGwgcmlnaHRzIHJlc2VydmVkLg0KICoNCiAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dA0KICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZSBtZXQ6DQogKg0KICogLSBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UsDQogKiB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGRpc2NsYWltZXIgYmVsb3cuDQogKg0KICogQXRtZWwncyBuYW1lIG1heSBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tDQogKiB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLg0KICoNCiAqIERJU0NMQUlNRVI6IFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgQVRNRUwgIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1INCiAqIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YNCiAqIE1FUkNIQU5UQUJJTElUWSwgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTi1JTkZSSU5HRU1FTlQgQVJFDQogKiBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBBVE1FTCBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULA0KICogSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVA0KICogTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsDQogKiBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GDQogKiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORw0KICogTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLA0KICogRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4NCiAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCiAqLw0KDQovKioNCiAqIFxmaWxlDQogKg0KICogXHNlY3Rpb24gUHVycG9zZQ0KICoNCiAqICAgRGVmaW5pdGlvbnMgYW5kIG1ldGhvZHMgZm9yIFVTQiBDRENNU0QgZGV2aWNlIGltcGxlbWVudC4NCiAqIA0KICogXHNlY3Rpb24gVXNhZ2UNCiAqIA0KICogLSMgSW5pdGlhbGl6ZSBVU0IgZnVuY3Rpb24gc3BlY2lmaWVkIGRyaXZlciAoIGZvciBNU0QgY3VycmVudGx5ICkNCiAqICAtIE1TRERGdW5jdGlvbkRyaXZlcl9Jbml0aWFsaXplDQogKg0KICogLSMgSW5pdGlhbGl6ZSBVU0IgQ0RDTVNEIGRyaXZlciBhbmQgVVNCIGRyaXZlcg0KICogIC0gQ0RDTVNERERyaXZlcl9Jbml0aWFsaXplDQogKg0KICogLSMgSGFuZGxlIGFuZCBkaXNwYWNoIFVTQiByZXF1ZXN0cw0KICogIC0gQ0RDTVNERERyaXZlcl9SZXF1ZXN0SGFuZGxlcg0KICoNCiAqIC0jIFRyeSBzdGFydGluZyBhIHJlbW90ZSB3YWtlLXVwIHNlcXVlbmNlDQogKiAgLSBDRENNU0RERHJpdmVyX1JlbW90ZVdha2VVcA0KICovDQoNCiNpZm5kZWYgQ0RDTVNERERSSVZFUl9IDQojZGVmaW5lIENEQ01TREREUklWRVJfSA0KLyoqIFxhZGR0b2dyb3VwIHVzYmRfY29tcG9zaXRlX2NkY21zZA0KICpAew0KICovDQoNCi8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQogKiAgICAgICAgIEhlYWRlcnMNCiAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8NCg0KI2luY2x1ZGUgPFVTQlJlcXVlc3RzLmg+DQojaW5jbHVkZSA8Q0RDRGVzY3JpcHRvcnMuaD4NCiNpbmNsdWRlIDxNU0Rlc2NyaXB0b3JzLmg+DQojaW5jbHVkZSA8TVNETHVuLmg+DQojaW5jbHVkZSAiVVNCRC5oIg0KI2luY2x1ZGUgPFVTQkREcml2ZXIuaD4NCg0KLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCiAqICAgICAgICAgQ29uc3RzDQogKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovDQoNCi8qKiBcYWRkdG9ncm91cCB1c2JkX2NkY19tc2RfZGVzYyBVU0IgQ0RDKFNlcmlhbCkgKyBNUyBEZXNjcmlwdG9ycyBkZWZpbmUNCiAqICAgICAgQHsNCiAqLw0KLyoqIE51bWJlciBvZiBpbnRlcmZhY2VzIG9mIHRoZSBkZXZpY2UgKi8NCiNkZWZpbmUgQ0RDTVNERHJpdmVyRGVzY3JpcHRvcnNfTlVNSU5URVJGQUNFICAgICAgIDMNCi8qKiBOdW1iZXIgb2YgdGhlIENEQyBpbnRlcmZhY2UuICovDQojZGVmaW5lIENEQ01TRERyaXZlckRlc2NyaXB0b3JzX0NEQ19JTlRFUkZBQ0UgICAgICAwDQovKiogTnVtYmVyIG9mIHRoZSBISUQgaW50ZXJmYWNlLiAqLw0KI2RlZmluZSBDRENNU0REcml2ZXJEZXNjcmlwdG9yc19NU0RfSU5URVJGQUNFICAgICAgMg0KLyoqICAgICBAfSovDQoNCg0KLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCiAqICAgICAgICAgVHlwZXMNCiAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8NCiNwcmFnbWEgcGFjaygxKQ0KI2lmIGRlZmluZWQgICAoIF9fQ0NfQVJNICAgKSAvKiBLZWlsIKbMVmlzaW9uIDQgKi8NCiNlbGlmIGRlZmluZWQgKCBfX0lDQ0FSTV9fICkgLyogSUFSIEV3YXJtICovDQojZGVmaW5lIF9fYXR0cmlidXRlX18oLi4uKQ0KI2RlZmluZSBfX3BhY2tlZF9fICBwYWNrZWQNCiNlbGlmIGRlZmluZWQgKCAgX19HTlVDX18gICkgLyogR0NDIENTMyAqLw0KI2RlZmluZSBfX3BhY2tlZF9fICBhbGlnbmVkKDEpDQojZW5kaWYNCi8qKg0KICogXHR5cGVkZWYgQ0RDTVNERHJpdmVyQ29uZmlndXJhdGlvbkRlc2NyaXB0b3JzDQogKiBcYnJpZWYgQ29uZmlndXJhdGlvbiBkZXNjcmlwdG9yIGxpc3QgZm9yIGEgZGV2aWNlIGltcGxlbWVudGluZw0KICogICAgICAgIGEgQ0RDTVNEIGRyaXZlci4NCiAqLw0KdHlwZWRlZiBzdHJ1Y3QgX0NEQ01TRERyaXZlckNvbmZpZ3VyYXRpb25EZXNjcmlwdG9ycyB7DQoNCiAgICAvKiogIFN0YW5kYXJkIGNvbmZpZ3VyYXRpb24gZGVzY3JpcHRvci4gKi8NCiAgICBVU0JDb25maWd1cmF0aW9uRGVzY3JpcHRvciBjb25maWd1cmF0aW9uOw0KDQogICAgLyogIC0tLSBDREMgMCAqLw0KICAgIC8qKiAgSUFEIDAgKi8NCiAgICBVU0JJbnRlcmZhY2VBc3NvY2lhdGlvbkRlc2NyaXB0b3IgY2RjSUFEMDsNCiAgICAvKiogIENvbW11bmljYXRpb24gaW50ZXJmYWNlIGRlc2NyaXB0b3IgKi8NCiAgICBVU0JJbnRlcmZhY2VEZXNjcmlwdG9yIGNkY0NvbW11bmljYXRpb24wOw0KICAgIC8qKiAgQ0RDIGhlYWRlciBmdW5jdGlvbmFsIGRlc2NyaXB0b3IuICovDQogICAgQ0RDSGVhZGVyRGVzY3JpcHRvciBjZGNIZWFkZXIwOw0KICAgIC8qKiAgQ0RDIGNhbGwgbWFuYWdlbWVudCBmdW5jdGlvbmFsIGRlc2NyaXB0b3IuICovDQogICAgQ0RDQ2FsbE1hbmFnZW1lbnREZXNjcmlwdG9yIGNkY0NhbGxNYW5hZ2VtZW50MDsNCiAgICAvKiogIENEQyBhYnN0cmFjdCBjb250cm9sIG1hbmFnZW1lbnQgZnVuY3Rpb25hbCBkZXNjcmlwdG9yLiAqLw0KICAgIENEQ0Fic3RyYWN0Q29udHJvbE1hbmFnZW1lbnREZXNjcmlwdG9yIGNkY0Fic3RyYWN0Q29udHJvbE1hbmFnZW1lbnQwOw0KICAgIC8qKiAgQ0RDIHVuaW9uIGZ1bmN0aW9uYWwgZGVzY3JpcHRvciAod2l0aCBvbmUgc2xhdmUgaW50ZXJmYWNlKS4gKi8NCiAgICBDRENVbmlvbkRlc2NyaXB0b3IgY2RjVW5pb24wOw0KICAgIC8qKiAgTm90aWZpY2F0aW9uIGVuZHBvaW50IGRlc2NyaXB0b3IuICovDQogICAgVVNCRW5kcG9pbnREZXNjcmlwdG9yIGNkY05vdGlmaWNhdGlvbjA7DQogICAgLyoqICBEYXRhIGludGVyZmFjZSBkZXNjcmlwdG9yLiAqLw0KICAgIFVTQkludGVyZmFjZURlc2NyaXB0b3IgY2RjRGF0YTA7DQogICAgLyoqICBEYXRhIE9VVCBlbmRwb2ludCBkZXNjcmlwdG9yLiAqLw0KICAgIFVTQkVuZHBvaW50RGVzY3JpcHRvciBjZGNEYXRhT3V0MDsNCiAgICAvKiogIERhdGEgSU4gZW5kcG9pbnQgZGVzY3JpcHRvci4gKi8NCiAgICBVU0JFbmRwb2ludERlc2NyaXB0b3IgY2RjRGF0YUluMDsNCg0KICAgIC8qICAtLS0gTVNEICovDQogICAgLyoqICBNYXNzIHN0b3JhZ2UgaW50ZXJmYWNlIGRlc2NyaXB0b3IuICovDQogICAgVVNCSW50ZXJmYWNlRGVzY3JpcHRvciBtc2RJbnRlcmZhY2U7DQogICAgLyoqICBCdWxrLW91dCBlbmRwb2ludCBkZXNjcmlwdG9yLiAqLw0KICAgIFVTQkVuZHBvaW50RGVzY3JpcHRvciBtc2RCdWxrT3V0Ow0KICAgIC8qKiAgQnVsay1pbiBlbmRwb2ludCBkZXNjcmlwdG9yLiAqLw0KICAgIFVTQkVuZHBvaW50RGVzY3JpcHRvciBtc2RCdWxrSW47DQoNCn0gX19hdHRyaWJ1dGVfXyAoKF9fcGFja2VkX18pKSBDRENNU0REcml2ZXJDb25maWd1cmF0aW9uRGVzY3JpcHRvcnM7DQoNCiNwcmFnbWEgcGFjaygpDQoNCi8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQogKiAgICAgICAgIEV4cG9ydGVkIGZ1bmN0aW9ucw0KICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLw0KDQovKiAtQ0RDTVNEICovDQpleHRlcm4gdm9pZCBDRENNU0REcml2ZXJfSW5pdGlhbGl6ZSgNCiAgICBjb25zdCBVU0JERHJpdmVyRGVzY3JpcHRvcnMgKnBEZXNjcmlwdG9ycywNCiAgICBNU0RMdW4gKnBMdW5zLCB1bnNpZ25lZCBjaGFyIG51bUx1bnMpOw0KDQpleHRlcm4gdm9pZCBDRENNU0REcml2ZXJfQ29uZmlndXJhdGlvbkNoYW5nZWRIYW5kbGVyKHVuc2lnbmVkIGNoYXIgY2ZnbnVtKTsNCg0KZXh0ZXJuIHZvaWQgQ0RDTVNERHJpdmVyX1JlcXVlc3RIYW5kbGVyKGNvbnN0IFVTQkdlbmVyaWNSZXF1ZXN0ICpyZXF1ZXN0KTsNCg0KLyoqQH0qLw0KI2VuZGlmIC8qICNpZm5kZWYgQ0RDTVNERERSSVZFUl9IICovDQoNCg==