Ly89PT0tLS0tLS0tLS0tLSBTaWdzZWd2LmNjIC0gU2lnc2VndiBkZWZhdWx0IGhhbmRsaW5nIC0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KLy8KLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTWljcm8gVmlydHVhbCBNYWNoaW5lCi8vCi8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZSAKLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgovLwovLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLwoKCiNpbmNsdWRlICJtdm0vR0MvR0MuaCIKI2luY2x1ZGUgIm12bS9TaWdzZWd2LmgiCiNpbmNsdWRlICJtdm0vVk1MZXQuaCIKCiNpbmNsdWRlIDxzaWduYWwuaD4KI2luY2x1ZGUgPHN0ZGlvLmg+Cgp1c2luZyBuYW1lc3BhY2UgbXZtOwoKdm9pZCAoKmNsaWVudF9zaWdzZWd2X2hhbmRsZXIpKGludCwgdm9pZCAqKSA9IDA7CgojaWYgZGVmaW5lZChfX01BQ0hfXykgJiYgZGVmaW5lZChfX2kzODZfXykKI2luY2x1ZGUgInVjb250ZXh0LmgiCiNlbmRpZgoKdm9pZCBzaWdzZWd2X2hhbmRsZXIoaW50IG4sIHNpZ2luZm9fdCAqX2luZm8sIHZvaWQgKmNvbnRleHQpIHsKCXZvaWQgKmFkZHIgPSBfaW5mby0+c2lfYWRkcjsKI2lmIGRlZmluZWQoX19pMzg2X18pCglzdHJ1Y3QgZnJhbWUgewoJCXN0cnVjdCBmcmFtZSAqY2FsbGVyOwoJCXZvaWQgICAgICAgICAqaXA7Cgl9OwoKCXN0cnVjdCBmcmFtZSAqZnA7CS8qIG15IGZyYW1lICovCiAgYXNtICgibW92ICUlZWJwLCAlMCIgOiAiPSZyIihmcCkpOyAvKiBnZXQgaXQgKi8KCXN0cnVjdCBmcmFtZSAqY2FsbGVyID0gZnAtPmNhbGxlcjsgLyogbXkgY2FsbGVyICovCiAgLyogcHJlc2VydmUgbXkgY2FsbGVyIGlmIEkgcmV0dXJuIGZyb20gdGhlIGhhbmRsZXIgKi8KCXZvaWQgKmNhbGxlcl9pcCA9IGNhbGxlci0+aXA7IAoKIyBpZiBkZWZpbmVkKF9fTUFDSF9fKQogIC8vLmdyZWdzW1JFR19FSVBdOyAvKiBqdXN0IGxpa2UgaXQncyBvbiB0aGUgc3RhY2suLiAqLwoJY2FsbGVyLT5pcCA9ICh2b2lkICopKCh1Y29udGV4dF90Kiljb250ZXh0KS0+dWNfbWNvbnRleHQtPl9fc3MuX19laXA7CiMgZWxzZQogIC8qIGNvbW1lIHNpIGMn6XRhaXQgbHVpIHF1aSDpdGFpdCBzdXIgbGEgcGlsZS4uLiAqLwoJY2FsbGVyLT5pcCA9ICh2b2lkICopKCh1Y29udGV4dF90Kiljb250ZXh0KS0+dWNfbWNvbnRleHQuZ3JlZ3NbUkVHX0VJUF07IAojIGVuZGlmCiNlbmRpZgoJCgkvKiBGcmVlIHRoZSBHQyBpZiBpdCBzaXNnZWd2J2QuIE5vIG90aGVyIGNvbGxlY3Rpb24gaXMgcG9zc2libGUgKi8KCWdjOjpkaWVfaWZfc2lnc2Vndl9vY2N1cmVkX2R1cmluZ19jb2xsZWN0aW9uKGFkZHIpOwoJCgkvLwlzeXNfZXhpdCgwKTsKCWlmKGNsaWVudF9zaWdzZWd2X2hhbmRsZXIpCgkJY2xpZW50X3NpZ3NlZ3ZfaGFuZGxlcihuLCBhZGRyKTsKCWVsc2UKCQlzaWduYWwoU0lHU0VHViwgU0lHX0RGTCk7CgkKI2lmIGRlZmluZWQoX19pMzg2X18pCgljYWxsZXItPmlwID0gY2FsbGVyX2lwOyAvKiByZXN0b3JlIHRoZSBjYWxsZXIgaXAgKi8KI2VuZGlmCn0KCnZvaWQgVk1MZXQ6OnJlZ2lzdGVyX3NpZ3NlZ3ZfaGFuZGxlcih2b2lkICgqZmN0KShpbnQsIHZvaWQgKikpIHsKCXN0cnVjdCBzaWdhY3Rpb24gc2E7CgoJc2lnYWN0aW9uKFNJR1NFR1YsIDAsICZzYSk7CglzYS5zYV9zaWdhY3Rpb24gPSBzaWdzZWd2X2hhbmRsZXI7CglzYS5zYV9mbGFncyB8PSAoU0FfUkVTVEFSVCB8IFNBX1NJR0lORk8gfCBTQV9OT0RFRkVSKTsKCXNpZ2FjdGlvbihTSUdTRUdWLCAmc2EsIDApOwoJY2xpZW50X3NpZ3NlZ3ZfaGFuZGxlciA9IGZjdDsKfQoK