LyoKICogQ29weXJpZ2h0IChDKSAyMDA3IEhhYWtvbiBTcG9yc2hlaW0gPGhha29uLnNwb3JzaGVpbUB0YW5kYmVyZy5jb20+CiAqICAgICAgICAgICAgICAgMjAwOCBPbGUgQW5kcukgVmFkbGEgUmF2buVzIDxvbGUuYW5kcmUucmF2bmFzQHRhbmRiZXJnLmNvbT4KICoKICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgogKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYwogKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKICogdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgogKgogKiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKICogTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCiAqCiAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCiAqIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlCiAqIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLAogKiBCb3N0b24sIE1BIDAyMTEwLTEzMDEsIFVTQS4KICovCgojaWZuZGVmIF9fS1NWSURFT0hFTFBFUlNfSF9fCiNkZWZpbmUgX19LU1ZJREVPSEVMUEVSU19IX18KCiNpbmNsdWRlIDxnc3QvZ3N0Lmg+CiNpbmNsdWRlIDx3aW5kb3dzLmg+CiNpbmNsdWRlIDxrcy5oPgojaW5jbHVkZSA8a3NtZWRpYS5oPgoKR19CRUdJTl9ERUNMUwoKREVGSU5FX0dVSUQoTUVESUFTVUJUWVBFX0k0MjAsIDB4MzAzMjM0NDksIDB4MDAwMCwgMHgwMDEwLCAweDgwLCAweDAwLCAweDAwLCAweEFBLCAweDAwLCAweDM4LCAweDlCLCAweDcxKTsKCnR5cGVkZWYgc3RydWN0IF9Lc1ZpZGVvTWVkaWFUeXBlIEtzVmlkZW9NZWRpYVR5cGU7CgovKioKICogQSBzdHJ1Y3R1cmUgdGhhdCBjb250YWluIG1ldGFkYXRhIGFib3V0IGNhcGFiaWxpdGllcwogKiBmb3IgYm90aCBLUyBhbmQgR1N0cmVhbWVyIGZvciB2aWRlbyBvbmx5LgogKi8Kc3RydWN0IF9Lc1ZpZGVvTWVkaWFUeXBlCnsKICBndWludCBwaW5faWQ7CgogIGNvbnN0IEtTREFUQVJBTkdFICogcmFuZ2U7CiAgY29uc3QgS1NfVklERU9fU1RSRUFNX0NPTkZJR19DQVBTIHZzY2M7CgogIGd1aW50OCAqIGZvcm1hdDsKICBndWludCBmb3JtYXRfc2l6ZTsKCiAgZ3VpbnQgc2FtcGxlX3NpemU7CgogIEdzdENhcHMgKiB0cmFuc2xhdGVkX2NhcHM7Cn07Cgp0eXBlZGVmIHN0cnVjdCBEVklORk8gewogIERXT1JEIGR3RFZBQXV4U3JjOwogIERXT1JEIGR3RFZBQXV4Q3RsOwogIERXT1JEIGR3RFZBQXV4U3JjMTsKICBEV09SRCBkd0RWQUF1eEN0bDE7CiAgRFdPUkQgZHdEVlZBdXhTcmM7CiAgRFdPUkQgZHdEVlZBdXhDdGw7CiAgRFdPUkQgZHdEVlJlc2VydmVkWzJdOwp9IERWSU5GTzsKCnR5cGVkZWYgc3RydWN0IEtTX0RBVEFSQU5HRV9EVlZJREVPIHsKICBLU0RBVEFSQU5HRSBEYXRhUmFuZ2U7CiAgRFZJTkZPIERWVmlkZW9JbmZvOwp9IEtTX0RBVEFSQU5HRV9EVlZJREVPLCpQS1NfREFUQVJBTkdFX0RWVklERU87CgoKR0xpc3QgKiBrc192aWRlb19kZXZpY2VfbGlzdF9zb3J0X2NhbWVyYXNfZmlyc3QgKEdMaXN0ICogZGV2aWNlcyk7CgpLc1ZpZGVvTWVkaWFUeXBlICoga3NfdmlkZW9fbWVkaWFfdHlwZV9kdXAgKEtzVmlkZW9NZWRpYVR5cGUgKiBtZWRpYV90eXBlKTsKdm9pZCBrc192aWRlb19tZWRpYV90eXBlX2ZyZWUgKEtzVmlkZW9NZWRpYVR5cGUgKiBtZWRpYV90eXBlKTsKR0xpc3QgKiBrc192aWRlb19wcm9iZV9maWx0ZXJfZm9yX2NhcHMgKEhBTkRMRSBmaWx0ZXJfaGFuZGxlKTsKS1NQSU5fQ09OTkVDVCAqIGtzX3ZpZGVvX2NyZWF0ZV9waW5fY29ubl9mcm9tX21lZGlhX3R5cGUgKEtzVmlkZW9NZWRpYVR5cGUgKiBtZWRpYV90eXBlKTsKZ2Jvb2xlYW4ga3NfdmlkZW9fZml4YXRlX21lZGlhX3R5cGUgKGNvbnN0IEtTREFUQVJBTkdFICogcmFuZ2UsIGd1aW50OCAqIGZvcm1hdCwgZ2ludCB3aWR0aCwgZ2ludCBoZWlnaHQsIGdpbnQgZnBzX24sIGdpbnQgZnBzX2QpOwoKR3N0Q2FwcyAqIGtzX3ZpZGVvX2dldF9hbGxfY2FwcyAodm9pZCk7CgpHX0VORF9ERUNMUwoKI2VuZGlmIC8qIF9fS1NWSURFT0hFTFBFUlNfSF9fICovCg==