LyoKICogVkdBIGVtdWxhdGlvbgogKiAKICogQ29weXJpZ2h0IDE5OTggT3ZlIEvFdmVuCiAqCiAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYwogKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCiAqCiAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAogKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgogKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQogKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgogKgogKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCiAqIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcgIFVTQQogKi8KCiNpZm5kZWYgX19XSU5FX1ZHQV9ICiNkZWZpbmUgX19XSU5FX1ZHQV9ICgojaW5jbHVkZSAid2luYmFzZS5oIgojaW5jbHVkZSAid2luZ2RpLmgiCgovKiBncmFwaGljcyBtb2RlICovCmludCBWR0FfU2V0TW9kZSh1bnNpZ25lZCBYcmVzLHVuc2lnbmVkIFlyZXMsdW5zaWduZWQgRGVwdGgpOwppbnQgVkdBX0dldE1vZGUodW5zaWduZWQqSGVpZ2h0LHVuc2lnbmVkKldpZHRoLHVuc2lnbmVkKkRlcHRoKTsKdm9pZCBWR0FfRXhpdCh2b2lkKTsKdm9pZCBWR0FfU2V0UGFsZXR0ZShQQUxFVFRFRU5UUlkqcGFsLGludCBzdGFydCxpbnQgbGVuKTsKdm9pZCBWR0FfU2V0Q29sb3IxNihpbnQgcmVnLGludCBjb2xvcik7CnZvaWQgVkdBX1NldFF1YWRQYWxldHRlKFJHQlFVQUQqY29sb3IsaW50IHN0YXJ0LGludCBsZW4pOwpMUFNUUiBWR0FfTG9jayh1bnNpZ25lZCpQaXRjaCx1bnNpZ25lZCpIZWlnaHQsdW5zaWduZWQqV2lkdGgsdW5zaWduZWQqRGVwdGgpOwp2b2lkIFZHQV9VbmxvY2sodm9pZCk7CgovKiB0ZXh0IG1vZGUgKi8KaW50IFZHQV9TZXRBbHBoYU1vZGUodW5zaWduZWQgWHJlcyx1bnNpZ25lZCBZcmVzKTsKdm9pZCBWR0FfR2V0QWxwaGFNb2RlKHVuc2lnbmVkKlhyZXMsdW5zaWduZWQqWXJlcyk7CnZvaWQgVkdBX1NldEN1cnNvclBvcyh1bnNpZ25lZCBYLHVuc2lnbmVkIFkpOwp2b2lkIFZHQV9HZXRDdXJzb3JQb3ModW5zaWduZWQqWCx1bnNpZ25lZCpZKTsKdm9pZCBWR0FfV3JpdGVDaGFycyh1bnNpZ25lZCBYLHVuc2lnbmVkIFksdW5zaWduZWQgY2gsaW50IGF0dHIsaW50IGNvdW50KTsKdm9pZCBWR0FfUHV0Q2hhcihCWVRFIGFzY2lpKTsKdm9pZCBWR0FfU2V0VGV4dEF0dHJpYnV0ZShCWVRFIGF0dHIpOwp2b2lkIFZHQV9DbGVhclRleHQodW5zaWduZWQgcm93MSwgdW5zaWduZWQgY29sMSwgCiAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIHJvdzIsIHVuc2lnbmVkIGNvbDIsCiAgICAgICAgICAgICAgICAgIEJZVEUgYXR0cik7CnZvaWQgVkdBX1Njcm9sbFVwVGV4dCh1bnNpZ25lZCByb3cxLCB1bnNpZ25lZCBjb2wxLCAKICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgcm93MiwgdW5zaWduZWQgY29sMiwKICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgbGluZXMsIEJZVEUgYXR0cik7CnZvaWQgVkdBX1Njcm9sbERvd25UZXh0KHVuc2lnbmVkIHJvdzEsIHVuc2lnbmVkIGNvbDEsIAogICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIHJvdzIsIHVuc2lnbmVkIGNvbDIsCiAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgbGluZXMsIEJZVEUgYXR0cik7CnZvaWQgVkdBX0dldENoYXJhY3RlckF0Q3Vyc29yKEJZVEUgKmFzY2lpLCBCWVRFICphdHRyKTsKCi8qIGNvbnRyb2wgKi8Kdm9pZCBWR0FfaW9wb3J0X291dChXT1JEIHBvcnQsIEJZVEUgdmFsKTsKQllURSBWR0FfaW9wb3J0X2luKFdPUkQgcG9ydCk7CnZvaWQgVkdBX0NsZWFuKHZvaWQpOwoKI2VuZGlmIC8qIF9fV0lORV9WR0FfSCAqLwo=