LyoKICogQ29weXJpZ2h0IChDKSAyMDA3IEhhYWtvbiBTcG9yc2hlaW0gPGhha29uLnNwb3JzaGVpbUB0YW5kYmVyZy5jb20+CiAqICAgICAgICAgICAgICAgMjAwOCBPbGUgQW5kcukgVmFkbGEgUmF2buVzIDxvbGUuYW5kcmUucmF2bmFzQHRhbmRiZXJnLmNvbT4KICoKICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgogKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYwogKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKICogdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgogKgogKiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKICogTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCiAqCiAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCiAqIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlCiAqIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLAogKiBCb3N0b24sIE1BIDAyMTEwLTEzMDEsIFVTQS4KICovCgojaWZuZGVmIF9fS1NWSURFT0hFTFBFUlNfSF9fCiNkZWZpbmUgX19LU1ZJREVPSEVMUEVSU19IX18KCiNpbmNsdWRlIDxnc3QvZ3N0Lmg+CiNpbmNsdWRlIDx3aW5kb3dzLmg+CiNpbmNsdWRlIDxrcy5oPgojaW5jbHVkZSA8a3NtZWRpYS5oPgoKR19CRUdJTl9ERUNMUwoKREVGSU5FX0dVSUQoTUVESUFTVUJUWVBFX0k0MjAsIDB4MzAzMjM0NDksIDB4MDAwMCwgMHgwMDEwLCAweDgwLCAweDAwLCAweDAwLCAweEFBLCAweDAwLCAweDM4LCAweDlCLCAweDcxKTsKCnR5cGVkZWYgc3RydWN0IF9Lc1ZpZGVvTWVkaWFUeXBlIEtzVmlkZW9NZWRpYVR5cGU7CgovKioKICogQSBzdHJ1Y3R1cmUgdGhhdCBjb250YWluIG1ldGFkYXRhIGFib3V0IGNhcGFiaWxpdGllcwogKiBmb3IgYm90aCBLUyBhbmQgR1N0cmVhbWVyIGZvciB2aWRlbyBvbmx5LgogKi8Kc3RydWN0IF9Lc1ZpZGVvTWVkaWFUeXBlCnsKICBndWludCBwaW5faWQ7CgogIGNvbnN0IEtTREFUQVJBTkdFICogcmFuZ2U7CiAgY29uc3QgS1NfVklERU9fU1RSRUFNX0NPTkZJR19DQVBTIHZzY2M7CgogIGd1aW50OCAqIGZvcm1hdDsKICBndWludCBmb3JtYXRfc2l6ZTsKCiAgZ3VpbnQgc2FtcGxlX3NpemU7CgogIEdzdENhcHMgKiB0cmFuc2xhdGVkX2NhcHM7CiAgZ2Jvb2xlYW4gaXNfcmdiOwp9OwoKdHlwZWRlZiBzdHJ1Y3QgRFZJTkZPIHsKICBEV09SRCBkd0RWQUF1eFNyYzsKICBEV09SRCBkd0RWQUF1eEN0bDsKICBEV09SRCBkd0RWQUF1eFNyYzE7CiAgRFdPUkQgZHdEVkFBdXhDdGwxOwogIERXT1JEIGR3RFZWQXV4U3JjOwogIERXT1JEIGR3RFZWQXV4Q3RsOwogIERXT1JEIGR3RFZSZXNlcnZlZFsyXTsKfSBEVklORk87Cgp0eXBlZGVmIHN0cnVjdCBLU19EQVRBUkFOR0VfRFZWSURFTyB7CiAgS1NEQVRBUkFOR0UgRGF0YVJhbmdlOwogIERWSU5GTyBEVlZpZGVvSW5mbzsKfSBLU19EQVRBUkFOR0VfRFZWSURFTywqUEtTX0RBVEFSQU5HRV9EVlZJREVPOwoKCkdMaXN0ICoga3NfdmlkZW9fZGV2aWNlX2xpc3Rfc29ydF9jYW1lcmFzX2ZpcnN0IChHTGlzdCAqIGRldmljZXMpOwoKS3NWaWRlb01lZGlhVHlwZSAqIGtzX3ZpZGVvX21lZGlhX3R5cGVfZHVwIChLc1ZpZGVvTWVkaWFUeXBlICogbWVkaWFfdHlwZSk7CnZvaWQga3NfdmlkZW9fbWVkaWFfdHlwZV9mcmVlIChLc1ZpZGVvTWVkaWFUeXBlICogbWVkaWFfdHlwZSk7CkdMaXN0ICoga3NfdmlkZW9fcHJvYmVfZmlsdGVyX2Zvcl9jYXBzIChIQU5ETEUgZmlsdGVyX2hhbmRsZSk7CktTUElOX0NPTk5FQ1QgKiBrc192aWRlb19jcmVhdGVfcGluX2Nvbm5fZnJvbV9tZWRpYV90eXBlIChLc1ZpZGVvTWVkaWFUeXBlICogbWVkaWFfdHlwZSk7Cmdib29sZWFuIGtzX3ZpZGVvX2ZpeGF0ZV9tZWRpYV90eXBlIChjb25zdCBLU0RBVEFSQU5HRSAqIHJhbmdlLCBndWludDggKiBmb3JtYXQsIGdpbnQgd2lkdGgsIGdpbnQgaGVpZ2h0LCBnaW50IGZwc19uLCBnaW50IGZwc19kKTsKCkdzdENhcHMgKiBrc192aWRlb19nZXRfYWxsX2NhcHMgKHZvaWQpOwoKR19FTkRfREVDTFMKCiNlbmRpZiAvKiBfX0tTVklERU9IRUxQRVJTX0hfXyAqLwo=