LyoKICogKEMpIENvcHlyaWdodCAyMDAyCiAqIERhbmllbCBFbmdzdHL2bSwgT21pY3JvbiBDZXRpIEFCLCBkYW5pZWxAb21pY3Jvbi5zZQogKiAKICogU2VlIGZpbGUgQ1JFRElUUyBmb3IgbGlzdCBvZiBwZW9wbGUgd2hvIGNvbnRyaWJ1dGVkIHRvIHRoaXMKICogcHJvamVjdC4KICoKICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgogKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcwogKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZgogKiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KICoKICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCiAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCiAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KICoKICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwKICogTUEgMDIxMTEtMTMwNyBVU0EKICovCgoKLyoKICogUGFydGx5IGJhc2VkIG9uIG1zYmlvcy5jIGZyb20gcm9sbyAxLjY6CiAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogKiAoQykgQ29weXJpZ2h0IDIwMDAKICogU3lzZ28gUmVhbC1UaW1lIFNvbHV0aW9ucyBHbWJICiAqIEtsZWluLVdpbnRlcm5oZWltLCBHZXJtYW55CiAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogKi8KCiNpbmNsdWRlIDxjb21tb24uaD4KI2luY2x1ZGUgPGFzbS9yZWFsbW9kZS5oPgojaW5jbHVkZSA8YXNtL2lvLmg+CgojZGVmaW5lIE5VTVZFQ1RTCTI1NgoKI2RlZmluZSBCSU9TX0RBVEEgICAgICAgICgoY2hhciopMHg0MDApCiNkZWZpbmUgQklPU19EQVRBX1NJWkUgICAyNTYKI2RlZmluZSBCSU9TX0JBU0UgICAgICAgICgoY2hhciopMHhmMDAwMCkKI2RlZmluZSBCSU9TX0NTICAgICAgICAgIDB4ZjAwMAoKZXh0ZXJuIHUxNiByYW1faW5fNjRrYl9jaHVua3M7CmV4dGVybiB1MTYgYmlvc19lcXVpcG1lbnQ7CmV4dGVybiB2b2lkICpybV9pbnQwMDsKZXh0ZXJuIHZvaWQgKnJtX2ludDAxOwpleHRlcm4gdm9pZCAqcm1faW50MDI7CmV4dGVybiB2b2lkICpybV9pbnQwMzsKZXh0ZXJuIHZvaWQgKnJtX2ludDA0OwpleHRlcm4gdm9pZCAqcm1faW50MDU7CmV4dGVybiB2b2lkICpybV9pbnQwNjsKZXh0ZXJuIHZvaWQgKnJtX2ludDA3OwpleHRlcm4gdm9pZCAqcm1faW50MDg7CmV4dGVybiB2b2lkICpybV9pbnQwOTsKZXh0ZXJuIHZvaWQgKnJtX2ludDBhOwpleHRlcm4gdm9pZCAqcm1faW50MGI7CmV4dGVybiB2b2lkICpybV9pbnQwYzsKZXh0ZXJuIHZvaWQgKnJtX2ludDBkOwpleHRlcm4gdm9pZCAqcm1faW50MGU7CmV4dGVybiB2b2lkICpybV9pbnQwZjsKZXh0ZXJuIHZvaWQgKnJtX2ludDEwOwpleHRlcm4gdm9pZCAqcm1faW50MTE7CmV4dGVybiB2b2lkICpybV9pbnQxMjsKZXh0ZXJuIHZvaWQgKnJtX2ludDEzOwpleHRlcm4gdm9pZCAqcm1faW50MTQ7CmV4dGVybiB2b2lkICpybV9pbnQxNTsKZXh0ZXJuIHZvaWQgKnJtX2ludDE2OwpleHRlcm4gdm9pZCAqcm1faW50MTc7CmV4dGVybiB2b2lkICpybV9pbnQxODsKZXh0ZXJuIHZvaWQgKnJtX2ludDE5OwpleHRlcm4gdm9pZCAqcm1faW50MWE7CmV4dGVybiB2b2lkICpybV9pbnQxYjsKZXh0ZXJuIHZvaWQgKnJtX2ludDFjOwpleHRlcm4gdm9pZCAqcm1faW50MWQ7CmV4dGVybiB2b2lkICpybV9pbnQxZTsKZXh0ZXJuIHZvaWQgKnJtX2ludDFmOwpleHRlcm4gdm9pZCAqcm1fZGVmX2ludDsKCi8qCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogSW5zdGFsbCBhbiBpbnRlcnJ1cHQgdmVjdG9yCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICovCgpzdGF0aWMgdm9pZCBzZXR2ZWN0b3IoaW50IHZlY3RvciwgdTE2IHNlZ21lbnQsIHZvaWQgKmhhbmRsZXIpCnsKCXUxNiAqcHRyID0gKHUxNiopKHZlY3Rvcio0KTsKCXB0clswXSA9ICgodTMyKWhhbmRsZXIgLSAoc2VnbWVudCA8PCA0KSkmMHhmZmZmOwoJcHRyWzFdID0gc2VnbWVudDsKCQojaWYgMAkKCXByaW50Zigic2V0dmVjdG9yOiBpbnQlMDJ4IC0+ICUwNHg6JTA0eFxuIiwKCSAgICAgICB2ZWN0b3IsIHB0clsxXSwgcHRyWzBdKTsKI2VuZGlmCQp9CgppbnQgYmlvc19zZXR1cCh2b2lkKQp7CglERUNMQVJFX0dMT0JBTF9EQVRBX1BUUjsKCXN0YXRpYyBpbnQgZG9uZT0wOwkKCWludCB2ZWN0b3I7CgkKCWlmIChkb25lKSB7CgkJcmV0dXJuIDA7Cgl9Cglkb25lID0gMTsKCQoJaWYgKGkzODZib290X2Jpb3Nfc2l6ZSA+IDY1NTM2KSB7CgkJcHJpbnRmKCJCSU9TIHRvbyBsYXJnZSAoJWxkIGJ5dGVzLCBtYXggaXMgNjU1MzYpXG4iLCAKCQkgICAgICAgaTM4NmJvb3RfYmlvc19zaXplKTsKCQlyZXR1cm4gLTE7Cgl9CgkKCW1lbWNweShCSU9TX0JBU0UsICh2b2lkKilpMzg2Ym9vdF9iaW9zLCBpMzg2Ym9vdF9iaW9zX3NpemUpOwoKCS8qIGNsZWFyIGJkYSAqLwoJbWVtc2V0KEJJT1NfREFUQSwgMCwgQklPU19EQVRBX1NJWkUpOwoJCgkvKiBlbnRlciBzb21lIHZhbHVlcyB0byB0aGUgYmRhICovCgl3cml0ZXcoMHgzZjgsIEJJT1NfREFUQSk7ICAgLyogY29tMSBhZGRyICovCgl3cml0ZXcoMHgyZjgsIEJJT1NfREFUQSsyKTsgLyogY29tMiBhZGRyICovCgl3cml0ZXcoMHgzZTgsIEJJT1NfREFUQSs0KTsgLyogY29tMyBhZGRyICovCgl3cml0ZXcoMHgyZTgsIEJJT1NfREFUQSs2KTsgLyogY29tNCBhZGRyICovCgl3cml0ZXcoMHgyNzgsIEJJT1NfREFUQSs4KTsgLyogbHB0MSBhZGRyICovCgkvKgoJICogVGhlIGtlcm5lbCB3YW50cyB0byByZWFkIHRoZSBiYXNlIG1lbW9yeSBzaXplCgkgKiBmcm9tIDQwOjEzLiBQdXQgYSB6ZXJvIHRoZXJlIHRvIGF2b2lkIGFuIGVycm9yIG1lc3NhZ2UKCSAqLwoJd3JpdGV3KDAsIEJJT1NfREFUQSsweDEzKTsgIC8qIGJhc2UgbWVtb3J5IHNpemUgKi8KCgkKCS8qIHNldHVwIHJlYWxtb2RlIGludGVycnVwdCB2ZWN0b3JzICovCQoJZm9yICh2ZWN0b3IgPSAwOyB2ZWN0b3IgPCBOVU1WRUNUUzsgdmVjdG9yKyspIHsKCQlzZXR2ZWN0b3IodmVjdG9yLCBCSU9TX0NTLCAmcm1fZGVmX2ludCk7Cgl9CgkKCXNldHZlY3RvcigweDAwLCBCSU9TX0NTLCAmcm1faW50MDApOwoJc2V0dmVjdG9yKDB4MDEsIEJJT1NfQ1MsICZybV9pbnQwMSk7CglzZXR2ZWN0b3IoMHgwMiwgQklPU19DUywgJnJtX2ludDAyKTsKCXNldHZlY3RvcigweDAzLCBCSU9TX0NTLCAmcm1faW50MDMpOwoJc2V0dmVjdG9yKDB4MDQsIEJJT1NfQ1MsICZybV9pbnQwNCk7CglzZXR2ZWN0b3IoMHgwNSwgQklPU19DUywgJnJtX2ludDA1KTsKCXNldHZlY3RvcigweDA2LCBCSU9TX0NTLCAmcm1faW50MDYpOwoJc2V0dmVjdG9yKDB4MDcsIEJJT1NfQ1MsICZybV9pbnQwNyk7CglzZXR2ZWN0b3IoMHgwOCwgQklPU19DUywgJnJtX2ludDA4KTsKCXNldHZlY3RvcigweDA5LCBCSU9TX0NTLCAmcm1faW50MDkpOwoJc2V0dmVjdG9yKDB4MGEsIEJJT1NfQ1MsICZybV9pbnQwYSk7CglzZXR2ZWN0b3IoMHgwYiwgQklPU19DUywgJnJtX2ludDBiKTsKCXNldHZlY3RvcigweDBjLCBCSU9TX0NTLCAmcm1faW50MGMpOwoJc2V0dmVjdG9yKDB4MGQsIEJJT1NfQ1MsICZybV9pbnQwZCk7CglzZXR2ZWN0b3IoMHgwZSwgQklPU19DUywgJnJtX2ludDBlKTsKCXNldHZlY3RvcigweDBmLCBCSU9TX0NTLCAmcm1faW50MGYpOwoJc2V0dmVjdG9yKDB4MTAsIEJJT1NfQ1MsICZybV9pbnQxMCk7CglzZXR2ZWN0b3IoMHgxMSwgQklPU19DUywgJnJtX2ludDExKTsKCXNldHZlY3RvcigweDEyLCBCSU9TX0NTLCAmcm1faW50MTIpOwoJc2V0dmVjdG9yKDB4MTMsIEJJT1NfQ1MsICZybV9pbnQxMyk7CglzZXR2ZWN0b3IoMHgxNCwgQklPU19DUywgJnJtX2ludDE0KTsKCXNldHZlY3RvcigweDE1LCBCSU9TX0NTLCAmcm1faW50MTUpOwoJc2V0dmVjdG9yKDB4MTYsIEJJT1NfQ1MsICZybV9pbnQxNik7CglzZXR2ZWN0b3IoMHgxNywgQklPU19DUywgJnJtX2ludDE3KTsKCXNldHZlY3RvcigweDE4LCBCSU9TX0NTLCAmcm1faW50MTgpOwoJc2V0dmVjdG9yKDB4MTksIEJJT1NfQ1MsICZybV9pbnQxOSk7CglzZXR2ZWN0b3IoMHgxYSwgQklPU19DUywgJnJtX2ludDFhKTsKCXNldHZlY3RvcigweDFiLCBCSU9TX0NTLCAmcm1faW50MWIpOwoJc2V0dmVjdG9yKDB4MWMsIEJJT1NfQ1MsICZybV9pbnQxYyk7CglzZXR2ZWN0b3IoMHgxZCwgQklPU19DUywgJnJtX2ludDFkKTsKCXNldHZlY3RvcigweDFlLCBCSU9TX0NTLCAmcm1faW50MWUpOwoJc2V0dmVjdG9yKDB4MWYsIEJJT1NfQ1MsICZybV9pbnQxZik7CgoJLyogZmlsbCBpbiBkYXRhIGFyZWEgKi8KCXJhbV9pbl82NGtiX2NodW5rcyA9IGdkLT5yYW1fc2l6ZSA+PiAxNjsKCWJpb3NfZXF1aXBtZW50ID0gMDsgLyogRml4TWUgKi8KCQoJcmV0dXJuIDA7Cn0KCg==