LyogIApDb3B5cmlnaHQgKGMpIDIwMDksIFFVQUxDT01NIFVTQSwgSU5DLgoKQWxsIHJpZ2h0cyByZXNlcnZlZC4KClJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dCBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlIG1ldDoKCrcgICAgICAgICBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuIAoKtyAgICAgICAgIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4gCgq3ICAgICAgICAgTmVpdGhlciB0aGUgbmFtZSBvZiB0aGUgUVVBTENPTU0gVVNBLCBJTkMuICBub3IgdGhlIG5hbWVzIG9mIGl0cyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLiAKClRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMgIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIEhPTERFUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCgogKi8KCi8qCiAqIFBsZWFzZSBkbyBub3QgZWRpdCB0aGlzIGZpbGUuCiAqIEl0IHdhcyBnZW5lcmF0ZWQgdXNpbmcgcnBjZ2VuLgogKi8KCiNpZm5kZWYgX0xPQ19BUElfQ0JfSF9SUENHRU4KI2RlZmluZSBfTE9DX0FQSV9DQl9IX1JQQ0dFTgoKI2luY2x1ZGUgPHJwYy9ycGMuaD4KCiNpbmNsdWRlIDxwdGhyZWFkLmg+CgojaWZkZWYgX19jcGx1c3BsdXMKZXh0ZXJuICJDIiB7CiNlbmRpZgoKCnN0cnVjdCBycGNfbG9jX2V2ZW50X2NiX2ZfdHlwZV9hcmdzIHsKCXJwY191aW50MzIgY2JfaWQ7CglycGNfbG9jX2NsaWVudF9oYW5kbGVfdHlwZSBsb2NfaGFuZGxlOwoJcnBjX2xvY19ldmVudF9tYXNrX3R5cGUgbG9jX2V2ZW50OwoJcnBjX2xvY19ldmVudF9wYXlsb2FkX3VfdHlwZSAqbG9jX2V2ZW50X3BheWxvYWQ7Cn07CnR5cGVkZWYgc3RydWN0IHJwY19sb2NfZXZlbnRfY2JfZl90eXBlX2FyZ3MgcnBjX2xvY19ldmVudF9jYl9mX3R5cGVfYXJnczsKCnN0cnVjdCBycGNfbG9jX2V2ZW50X2NiX2ZfdHlwZV9yZXRzIHsKCXJwY19pbnQzMiBsb2NfZXZlbnRfY2JfZl90eXBlX3Jlc3VsdDsKfTsKdHlwZWRlZiBzdHJ1Y3QgcnBjX2xvY19ldmVudF9jYl9mX3R5cGVfcmV0cyBycGNfbG9jX2V2ZW50X2NiX2ZfdHlwZV9yZXRzOwojZGVmaW5lIExPQ19BUElDQlZFUlMgMHgwMDAxMDAwMQoKI2RlZmluZSBMT0NfQVBJQ0JQUk9HIDB4MzEwMDAwOGMKI2RlZmluZSBMT0NfQVBJQ0JWRVJTXzAwMDEgMHgwMDAxMDAwMQoKI2lmIGRlZmluZWQoX19TVERDX18pIHx8IGRlZmluZWQoX19jcGx1c3BsdXMpCiNkZWZpbmUgcnBjX2xvY19ldmVudF9jYl9mX3R5cGUgMQpleHRlcm4gIGVudW0gY2xudF9zdGF0IHJwY19sb2NfZXZlbnRfY2JfZl90eXBlXzB4MDAwMTAwMDEocnBjX2xvY19ldmVudF9jYl9mX3R5cGVfYXJncyAqLCBycGNfbG9jX2V2ZW50X2NiX2ZfdHlwZV9yZXRzICosIENMSUVOVCAqKTsKZXh0ZXJuICBib29sX3QgcnBjX2xvY19ldmVudF9jYl9mX3R5cGVfMHgwMDAxMDAwMV9zdmMocnBjX2xvY19ldmVudF9jYl9mX3R5cGVfYXJncyAqLCBycGNfbG9jX2V2ZW50X2NiX2ZfdHlwZV9yZXRzICosIHN0cnVjdCBzdmNfcmVxICopOwpleHRlcm4gaW50IGxvY19hcGljYnByb2dfMHgwMDAxMDAwMV9mcmVlcmVzdWx0IChTVkNYUFJUICosIHhkcnByb2NfdCwgY2FkZHJfdCk7CgojZWxzZSAvKiBLJlIgQyAqLwojZGVmaW5lIHJwY19sb2NfZXZlbnRfY2JfZl90eXBlIDEKZXh0ZXJuICBlbnVtIGNsbnRfc3RhdCBycGNfbG9jX2V2ZW50X2NiX2ZfdHlwZV8weDAwMDEwMDAxKCk7CmV4dGVybiAgYm9vbF90IHJwY19sb2NfZXZlbnRfY2JfZl90eXBlXzB4MDAwMTAwMDFfc3ZjKCk7CmV4dGVybiBpbnQgbG9jX2FwaWNicHJvZ18weDAwMDEwMDAxX2ZyZWVyZXN1bHQgKCk7CiNlbmRpZiAvKiBLJlIgQyAqLwoKLyogdGhlIHhkciBmdW5jdGlvbnMgKi8KCiNpZiBkZWZpbmVkKF9fU1REQ19fKSB8fCBkZWZpbmVkKF9fY3BsdXNwbHVzKQpleHRlcm4gIGJvb2xfdCB4ZHJfcnBjX2xvY19ldmVudF9jYl9mX3R5cGVfYXJncyAoWERSICosIHJwY19sb2NfZXZlbnRfY2JfZl90eXBlX2FyZ3MqKTsKZXh0ZXJuICBib29sX3QgeGRyX3JwY19sb2NfZXZlbnRfY2JfZl90eXBlX3JldHMgKFhEUiAqLCBycGNfbG9jX2V2ZW50X2NiX2ZfdHlwZV9yZXRzKik7CgojZWxzZSAvKiBLJlIgQyAqLwpleHRlcm4gYm9vbF90IHhkcl9ycGNfbG9jX2V2ZW50X2NiX2ZfdHlwZV9hcmdzICgpOwpleHRlcm4gYm9vbF90IHhkcl9ycGNfbG9jX2V2ZW50X2NiX2ZfdHlwZV9yZXRzICgpOwoKI2VuZGlmIC8qIEsmUiBDICovCgojaWZkZWYgX19jcGx1c3BsdXMKfQojZW5kaWYKCiNlbmRpZiAvKiAhX0xPQ19BUElfQ0JfSF9SUENHRU4gKi8K