LyoKICogQ29weXJpZ2h0IChDKSAyMDAyIEd59nJneSAnTm9nJyBKZW5leSAgCiAqCiAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYwogKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCiAqCiAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAogKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgogKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQogKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgogKgogKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCiAqIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcgIFVTQQogKi8KCiNpZm5kZWYgX0lOQ19DVVNUQ05UTAojZGVmaW5lIF9JTkNfQ1VTVENOVEwKCiNpZmRlZiBfX2NwbHVzcGx1cwpleHRlcm4gIkMiIHsKI2VuZGlmCgovKiBTaXplIGRlZnMgKi8KI2RlZmluZSBDQ0hDQ0NMQVNTIDMyCiNkZWZpbmUgQ0NIQ0NERVNDIDMyCiNkZWZpbmUgQ0NIQ0NURVhUIDI1NgoKLyogQ3VzdG9tIENvbnRyb2wgU3l0ZSBTdHJ1Y3R1cmUgKi8KdHlwZWRlZiBzdHJ1Y3QgdGFnQ0NTWUxFQSB7CiAgRFdPUkQgZmxTdHlsZTsKICBEV09SRCBmbEV4dFN0eWxlOwogIGNoYXIgc3pUZXh0W0NDSENDVEVYVF07CiAgTEFOR0lEIGxnaWQ7CiAgV09SRCB3UmVzZXJ2ZWQxOwp9IENDU1RZTEVBLCAqTFBDQ1NUWUxFQTsKCnR5cGVkZWYgc3RydWN0IHRhZ0NDU1lMRVcgewogIERXT1JEIGZsU3R5bGU7CiAgRFdPUkQgZmxFeHRTdHlsZTsKICBXQ0hBUiBzelRleHRbQ0NIQ0NURVhUXTsKICBMQU5HSUQgbGdpZDsKICBXT1JEIHdSZXNlcnZlZDE7Cn0gQ0NTVFlMRVcsICpMUENDU1RZTEVXOwoKI2RlZmluZSBDQ1NUWUxFICAgV0lORUxJQl9OQU1FX0FXKENDU1RZTEUpCiNkZWZpbmUgTFBDQ1NUWUxFIFdJTkVMSUJfTkFNRV9BVyhMUENDU1RZTEUpCgp0eXBlZGVmIEJPT0wgKENBTExCQUNLICpMUEZOQ0NTVFlMRUEpKEhXTkQsIExQQ0NTVFlMRUEpOwp0eXBlZGVmIEJPT0wgKENBTExCQUNLICpMUEZOQ0NTVFlMRVcpKEhXTkQsIExQQ0NTVFlMRVcpOwoKI2RlZmluZSBMUEZOQ0NTVFlMRSBXSU5FTElCX05BTUVfQVcoTFBGTkNDU1RZTEUpCgp0eXBlZGVmIGludCAoQ0FMTEJBQ0sgKkxQRk5DQ1NJWkVUT1RFWFRBKShEV09SRCwgRFdPUkQsIEhGT05ULCBMUFNUUik7CnR5cGVkZWYgaW50IChDQUxMQkFDSyAqTFBGTkNDU0laRVRPVEVYVFcpKERXT1JELCBEV09SRCwgSEZPTlQsIExQV1NUUik7CgojZGVmaW5lIExQRk5DQ1NJWkVUT1RFWFQgV0lORUxJQl9OQU1FX0FXKExQRk5DQ1NJWkVUT1RFWFQpCgovKiBDdXN0b20gQ29udHJvbCBzdHlsZSBmbGFncyBzdHJ1Y3R1cmUgKi8KdHlwZWRlZiBzdHJ1Y3QgdGFnQ0NTVFlMRUZMQUdBIHsKICBEV09SRCBmbFN0eWxlOwogIERXT1JEIGZsU3R5bGVNYXNrOwogIExQU1RSIHBzelN0eWxlOwp9IENDU1RZTEVGTEFHQSwgKkxQQ0NTVFlMRUZMQUdBOwoKdHlwZWRlZiBzdHJ1Y3QgdGFnQ0NTVFlMRUZMQUdXIHsKICBEV09SRCBmbFN0eWxlOwogIERXT1JEIGZsU3R5bGVNYXNrOwogIExQV1NUUiBwc3pTdHlsZTsKfSBDQ1NUWUxFRkxBR1csICpMUENDU1RZTEVGTEFHVzsKCiNkZWZpbmUgQ0NTVFlMRUZMQUcgV0lORUxJQl9OQU1FX0FXKENDU1RZTEVGTEFHKQoKLyogQ3VzdG9tIENvbnRyb2wgRmxhZ3MgKi8KI2RlZmluZSBDQ0ZfTk9URVhUIDB4MDAwMDAwMDEKCi8qIEN1c3RvbUNvbnRyb2wgaW5mbyBzdHJ1Y3R1cmUgKi8KdHlwZWRlZiBzdHJ1Y3QgdGFnQ0NJTkZPQSB7CiAgY2hhciBzekNsYXNzW0NDSENDQ0xBU1NdOwogIERXT1JEIGZsT3B0aW9uczsKICBjaGFyIHN6RGVzY1tDQ0hDQ0RFU0NdOwogIFVJTlQgY3hEZWZhdWx0OwogIFVJTlQgY3lEZWZhdWx0OwogIERXT1JEIGZsU3R5bGVEZWZhdWx0OwogIERXT1JEIGZsRXh0U3R5bGVEZWZhdWx0OwogIERXT1JEIGZsQ3RybFR5cGVNYXNrOwogIGNoYXIgc3pUZXh0RGVmYXVsdFtDQ0hDQ1RFWFRdOwogIGludCBjU3R5bGVGbGFnczsKICBMUENDU1RZTEVGTEFHQSBhU3R5bGVGbGFnczsKICBMUEZOQ0NTVFlMRUEgbHBmblN0eWxlOwogIExQRk5DQ1NJWkVUT1RFWFRBIGxwZm5TaXplVG9UZXh0OwogIERXT1JEIGR3UmVzZXJ2ZWQxOwogIERXT1JEIGR3UmVzZXJ2ZWQyOwp9IENDSU5GT0EsICpMUENDSU5GT0E7Cgp0eXBlZGVmIHN0cnVjdCB0YWdDQ0lORk9XIHsKICBXQ0hBUiBzekNsYXNzW0NDSENDQ0xBU1NdOwogIERXT1JEIGZsT3B0aW9uczsKICBXQ0hBUiBzekRlc2NbQ0NIQ0NERVNDXTsKICBVSU5UIGN4RGVmYXVsdDsKICBVSU5UIGN5RGVmYXVsdDsKICBEV09SRCBmbFN0eWxlRGVmYXVsdDsKICBEV09SRCBmbEV4dFN0eWxlRGVmYXVsdDsKICBEV09SRCBmbEN0cmxUeXBlTWFzazsKICBpbnQgY1N0eWxlRmxhZ3M7CiAgTFBDQ1NUWUxFRkxBR1cgYVN0eWxlRmxhZ3M7CiAgV0NIQVIgc3pUZXh0RGVmYXVsdFtDQ0hDQ1RFWFRdOwogIExQRk5DQ1NUWUxFVyBscGZuU3R5bGU7CiAgTFBGTkNDU0laRVRPVEVYVFcgbHBmblNpemVUb1RleHQ7CiAgRFdPUkQgZHdSZXNlcnZlZDE7CiAgRFdPUkQgZHdSZXNlcnZlZDI7Cn0gQ0NJTkZPVywgKkxQQ0NJTkZPVzsKCkRFQ0xfV0lORUxJQl9UWVBFX0FXKENDSU5GTykKREVDTF9XSU5FTElCX1RZUEVfQVcoTFBDQ0lORk8pCgp0eXBlZGVmIFVJTlQgKENBTExCQUNLICpMUEZOQ0NJTkZPQSkoTFBDQ0lORk9BKTsKdHlwZWRlZiBVSU5UIChDQUxMQkFDSyAqTFBGTkNDSU5GT1cpKExQQ0NJTkZPVyk7CgpERUNMX1dJTkVMSUJfVFlQRV9BVyhMUEZOQ0NJTkZPKQoKI2lmZGVmIF9fY3BsdXNwbHVzCn0KI2VuZGlmCgojZW5kaWYgLyogX0lOQ19DVVNUQ05UTCAqLwo=