LyogbGludXgvb21hcF9jc21pLmgKKiogCioqIENvcHlyaWdodCAyMDA1LTIwMDYsIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKiogQXV0aG9yOiBBcnZlIEhq+G5uZXblZwoqKgoqKiBUaGlzIGZpbGUgaXMgZHVhbCBsaWNlbnNlZC4gIEl0IG1heSBiZSByZWRpc3RyaWJ1dGVkIGFuZC9vciBtb2RpZmllZAoqKiB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEFwYWNoZSAyLjAgTGljZW5zZSBPUiB2ZXJzaW9uIDIgb2YgdGhlIEdOVQoqKiBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLgoqLwoKI2lmbmRlZiBfT01BUF9DU01JX0hfCiNkZWZpbmUgX09NQVBfQ1NNSV9IXwoKI2luY2x1ZGUgPGFzbS9pb2N0bC5oPgoKI2lmZGVmIF9fS0VSTkVMX18KCnR5cGVkZWYgc3RydWN0IHsKCXVpbnQzMl90IGNtZDsKCXVpbnQzMl90IGFyZzE7Cgl1aW50MzJfdCBhcmcyOwoJdWludDMyX3QgYXJnMzsKfSBvbWFwX2NzbWlfZ2NfY29tbWFuZF90OwoKdHlwZWRlZiBzdHJ1Y3QgewoJdm9pZCAoKmFjaykoaW50IG1haWxib3gpOwoJaW50ICgqZGF0YSkoaW50IG1haWxib3gpOwoJdm9pZCAoKnJlc2V0KShpbnQgbWFpbGJveCk7Cgl2b2lkICgqc3RhcnQpKGludCBtYWlsYm94KTsKCXZvaWQgKCpzdG9wKShpbnQgbWFpbGJveCk7Cn0gb21hcF9jc21pX21haWxib3hfaGFuZGxlcnNfdDsKCmV4dGVybiB1aW50OF90ICpvbWFwX2NzbWlfZ3NtX2RhdGFfdmFkZHI7CgojZGVmaW5lIFNFTkRfRkxBR19OT19BQ0tfQUZURVJfU0VORCAxCiNkZWZpbmUgU0VORF9GTEFHX1JFUUVTVF9BQ0tfSUZfQlVTWSAyCgp0eXBlZGVmIHN0cnVjdCB7Cgl1aW50MzJfdCBtYWdpYzsgICAgICAgICAgICAgICAgLy8gMC0zICAgICAweDQ5NGQ1MzQ3Cgl1aW50MzJfdCBoZWFkZXJfc2l6ZTsgICAgICAgICAgLy8gNC03ICAgICA2NAoJdWludDhfdCAgbWFpbGJveF9zaXplOyAgICAgICAgIC8vIDggICAgICAgOCBvciAxNgoJdWludDhfdCAgbnVtX2NoYW5uZWxzOyAgICAgICAgIC8vIDkgICAgICAgMi0xNQoJdWludDhfdCAgZ2NfY2hhbm5lbDsgICAgICAgICAgIC8vIDEwCgl1aW50OF90ICBkZWJ1Z19jaGFubmVsOyAgICAgICAgLy8gMTEKCXVpbnQxNl90IHN0cmVhbV9jaGFubmVsX21hc2s7ICAvLyAxMi0xMwoJdWludDE2X3QgcGFkOyAgICAgICAgICAgICAgICAgIC8vIDE0LTE1CgljaGFyICAgICB2ZW5kb3JfY29kZVsxNl07ICAgICAgLy8gMTYtMzEKCWNoYXIgICAgIHByb2R1Y3RfY29kZVsxNl07ICAgICAvLyAzMi00NwoJdWludDMyX3QgdmVyc2lvbjsgICAgICAgICAgICAgIC8vIDQ4LTUxCgl1aW50MzJfdCBmZnNfbG9jYXRpb247ICAgICAgICAgLy8gNTItNTUKCXVpbnQzMl90IGZmc19zaXplOyAgICAgICAgICAgICAvLyA1Ni01OSAgIDAgb3Igc2l6ZQoJY2hhciAgICAgdmVuZG9yX2RhdGFbMjBdOyAgICAgICAvLyA2MC03OQp9IG9tYXBfY3NtaV9nc21faW1hZ2VfaW5mb190OwovLyBpbiBwbGF0Zm9ybV9kZXZpY2UtPnBsYXRmb3JtX2RhdGEgd2hlcmUgcGxhdGZvcm1fZGV2aWNlLT5uYW1lID09ICJvbWFwLWNzbWkiCgojZGVmaW5lIE9NQVBfR1NNX0lNQUdFX0hFQURFUl9NQUdJQyAweDQ5NGQ1MzQ3IC8qIEdTTUkgKi8KCnN0cnVjdCBzeXNkZXZfY2xhc3MgKm9tYXBfY3NtaV9nZXRfc3lzY2xhc3Modm9pZCk7CnVuc2lnbmVkIHNob3J0IG9tYXBfY3NtaV9nZXRfdmVuZG9yX2Jvb3RfZmxhZ3Modm9pZCk7CmludCBvbWFwX2NzbWlfZ2NfY29tbWFuZChjb25zdCBvbWFwX2NzbWlfZ2NfY29tbWFuZF90ICpjb21tYW5kLCBpbnQgdGltZW91dCwgb21hcF9jc21pX2djX2NvbW1hbmRfdCAqcmVwbHkpOwppbnQgb21hcF9jc21pX3NlbmRfbWFpbGJveChpbnQgbWFpbGJveCwgdm9pZCAqZGF0YSwgc2l6ZV90IHNpemUsIHVuc2lnbmVkIGludCBmbGFncyk7CnZvaWQgb21hcF9jc21pX3JlYWRfbWFpbGJveChpbnQgbWFpbGJveCwgdm9pZCAqZGF0YSwgc2l6ZV90IHNpemUpOwppbnQgb21hcF9jc21pX2luc3RhbGxfbWFpbGJveF9oYW5kbGVycyhpbnQgbWFpbGJveCwgb21hcF9jc21pX21haWxib3hfaGFuZGxlcnNfdCBoYW5kbGVycyk7CmludCBvbWFwX2NzbWlfdW5pbnN0YWxsX21haWxib3hfaGFuZGxlcnMoaW50IG1haWxib3gsIG9tYXBfY3NtaV9tYWlsYm94X2hhbmRsZXJzX3QgaGFuZGxlcnMpOwoKLy9tYWlsYm94IGNoYW5uZWwgMSBjb21tYW5kcwoKI2RlZmluZSBHQ19EU1BfUExMX1JFUSAgICAgICAgICAgICAgICAgIDB4MDAwMQojZGVmaW5lIEdDX0FSTV9QTExfUkVRICAgICAgICAgICAgICAgICAgMHgwMDAyCiNkZWZpbmUgR0NfUkVBRF9NRU1fUkVRICAgICAgICAgICAgICAgICAweDAwMDMKI2RlZmluZSBHQ19TRVRfTUVNX1JFUSAgICAgICAgICAgICAgICAgIDB4MDAwNAojZGVmaW5lIEdDX1NFUklBTF9DT05GSUdfUkVRICAgICAgICAgICAgMHgwMDA1CiNkZWZpbmUgR0NfUkVTRVRfUkVRICAgICAgICAgICAgICAgICAgICAweDAwMDYKI2RlZmluZSBHQ19TV19WRVJTSU9OX1JFUSAgICAgICAgICAgICAgIDB4MDAwNwojZGVmaW5lIEdDX0hXX1ZFUlNJT05fUkVRICAgICAgICAgICAgICAgMHgwMDA4CiNkZWZpbmUgR0NfU0xFRVBfUkVRICAgICAgICAgICAgICAgICAgICAweDAwMDkKI2RlZmluZSBHQ19JUlFfUkVRICAgICAgICAgICAgICAgICAgICAgIDB4MDAwQQojZGVmaW5lIEdDX0JBVFRFUllfU1RBVFVTX1JFUSAgICAgICAgICAgMHgwMDExCiNkZWZpbmUgR0NfQVVESU9fVk9JQ0VfUkVRICAgICAgICAgICAgICAweDAwMTIKI2RlZmluZSBHQ19BVURJT19WT0lDRUJBTkRDVExfUkVRICAgICAgIDB4MDAxMwojZGVmaW5lIEdDX0FVRElPX09VVFBVVENUTF9SRVEgICAgICAgICAgMHgwMDE0CiNkZWZpbmUgR0NfQVVESU9fU0lERVRPTkVfUkVRICAgICAgICAgICAweDAwMTUKI2RlZmluZSBHQ19BVURJT19FQ0hPQ0FOQ19SRVEgICAgICAgICAgIDB4MDAxNgojZGVmaW5lIEdDX0FVRElPX1NURVJFT19DT0RFQ19SRVEgICAgICAgMHgwMDE3CiNkZWZpbmUgR0NfQVVESU9fUEdBX1JFUSAgICAgICAgICAgICAgICAweDAwMTgKI2RlZmluZSBHQ19BVURJT19QUk9GSUxFX0xPQURfUkVRICAgICAgIDB4MDAxOQojZGVmaW5lIEdDX0ZGU19JTklUX1JFU1RPUkVfUkVRICAgICAgICAgMHgwMDIwCiNkZWZpbmUgR0NfRkZTX1JFU1RPUkVfUkVRICAgICAgICAgICAgICAweDAwMjEKI2RlZmluZSBHQ19GRlNfQkFDS1VQX1JFUSAgICAgICAgICAgICAgIDB4MDAyMgojZGVmaW5lIEdDX0RBUl9HRVRfSU5GT19SRVEgICAgICAgICAgICAgMHgwMDIzCiNkZWZpbmUgR0NfQU1SX1JFQ09SRF9TVEFSVF9SRVEgICAgICAgICAweDAwMzAKI2RlZmluZSBHQ19BTVJfUkVDT1JEX1NUT1BfUkVRICAgICAgICAgIDB4MDAzMQojZGVmaW5lIEdDX0FNUl9QTEFZX1NUQVJUX1JFUSAgICAgICAgICAgMHgwMDMyCiNkZWZpbmUgR0NfQU1SX1BMQVlfU1RPUF9SRVEgICAgICAgICAgICAweDAwMzMKI2RlZmluZSBHQ19BTVJfR0VUX1NUQVRVU19SRVEgICAgICAgICAgIDB4MDAzNAojZGVmaW5lIEdDX0FNUl9QVVJHRV9QTEFZX0JVRkZFUl9SRVEgICAgMHgwMDM1CiNkZWZpbmUgR0NfQUJCX1JFR0lTVEVSX1JFUSAgICAgICAgICAgICAweDAwNDAKI2RlZmluZSBHQ19BVURJT19FTkhFQ0hPQ0FOQ19SRVEgICAgICAgIDB4MDA0MQoKI2RlZmluZSBHQ19SRUFEX01FTV9SRVMgICAgICAgICAgICAgICAgIDB4MTAwMAojZGVmaW5lIEdDX1NXX1ZFUlNJT05fUkVTICAgICAgICAgICAgICAgMHgxMDAxCiNkZWZpbmUgR0NfSFdfVkVSU0lPTl9SRVMgICAgICAgICAgICAgICAweDEwMDIKI2RlZmluZSBHQ19CQVRURVJZX1NUQVRVU19SRVMgICAgICAgICAgIDB4MTAwNQojZGVmaW5lIEdDX0FVRElPX1ZPSUNFQkFORENUTF9SRVMgICAgICAgMHgxMDA2CiNkZWZpbmUgR0NfQVVESU9fT1VUUFVUQ1RMX1JFUyAgICAgICAgICAweDEwMDcKI2RlZmluZSBHQ19BVURJT19TVEVSRU9fQ09ERUNfUkVTICAgICAgIDB4MTAwOAojZGVmaW5lIEdDX0FVRElPX1BST0ZJTEVfTE9BRF9SRVMgICAgICAgMHgxMDE5CiNkZWZpbmUgR0NfRkZTX0lOSVRfUkVTVE9SRV9SRVMgICAgICAgICAweDEwMjAKI2RlZmluZSBHQ19GRlNfQkFDS1VQX1JFUyAgICAgICAgICAgICAgIDB4MTAyMgojZGVmaW5lIEdDX0RBUl9HRVRfSU5GT19SRVMgICAgICAgICAgICAgMHgxMDIzCiNkZWZpbmUgR0NfQU1SX1JFQ09SRF9TVEFSVF9SRVMgICAgICAgICAweDEwMzAKI2RlZmluZSBHQ19BTVJfUkVDT1JEX1NUT1BfUkVTICAgICAgICAgIDB4MTAzMQojZGVmaW5lIEdDX0FNUl9QTEFZX1NUQVJUX1JFUyAgICAgICAgICAgMHgxMDMyCiNkZWZpbmUgR0NfQU1SX1BMQVlfU1RPUF9SRVMgICAgICAgICAgICAweDEwMzMKI2RlZmluZSBHQ19BTVJfR0VUX1NUQVRVU19SRVMgICAgICAgICAgIDB4MTAzNAojZGVmaW5lIEdDX0FCQl9SRUdJU1RFUl9SRVMgICAgICAgICAgICAgMHgxMDQwCgojZW5kaWYKCi8qIHR0eSBpb2N0bHMgKi8KCiNkZWZpbmUgT01BUF9DU01JX1RUWV9FTkFCTEVfQUNLIF9JTygnYycsIDApCiNkZWZpbmUgT01BUF9DU01JX1RUWV9ESVNBQkxFX0FDSyBfSU8oJ2MnLCAxKQojZGVmaW5lIE9NQVBfQ1NNSV9UVFlfUkVBRF9VTkFDS0VEIF9JT1IoJ2MnLCAyLCBpbnQpCiNkZWZpbmUgT01BUF9DU01JX1RUWV9BQ0sgX0lPVygnYycsIDMsIGludCkKI2RlZmluZSBPTUFQX0NTTUlfVFRZX1dBS0VVUF9BTkRfQUNLIF9JT1coJ2MnLCA0LCBpbnQpCgojZW5kaWYK