LyoqCiAqIEBmaWxlIHBvY19tc2cuaAogKiBAYnJpZWYgtqjS5VBPQ7rzzKi3/s7x0+tNTUm9u7ultcTP+8+ivdO/2gogKgogKiBDb3B5cmlnaHQgKEMpIDIwMTkgU2FuZWNoaXBzIFRlY2hub2xvZ3kgQ28uLCBMdGQuCiAqIEBhdXRob3IKICoKICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMKICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCiAqCiAqLwogCiNpZm5kZWYgX19QT0NfTVNHX0gKI2RlZmluZSBfX1BPQ19NU0dfSAovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgoqICAgICAgICAgICAgICAgICAgICAgICAgICAgSW5jbHVkZSBoZWFkZXIgZmlsZXMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLyogSW5jbHVkZSAiYXBwL2luY2x1ZGUvbWVzc2FnZS5oIi4gKi8KI2luY2x1ZGUgIm1lc3NhZ2UuaCIKCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNYWNybyBkZWZpbml0aW9ucyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiNkZWZpbmUgUE9DX1NWUl9QUklOVCAwCiNkZWZpbmUgU1ZSUE9DICJbUFRUXSIKI2RlZmluZSBQT0NfUFJJTlQgIltQVFRdIgojaWYgUE9DX1NWUl9QUklOVAojZGVmaW5lIFBPQ19TVlJfTE9HKGZvcm1hdCwgLi4uKSBcCiAgICBkbyB7ICBcCiAgICAgICAgc2xvZyhQT0NfUFJJTlQsU0xPR19OT1JNQUwsZm9ybWF0LCMjX19WQV9BUkdTX18gKTtcCiAgICB9IHdoaWxlKDApCgojZGVmaW5lIFBPQ19TVlJfTE9HX0VSUihmb3JtYXQsIC4uLikgXAogICAgZG8geyAgXAogICAgICAgIHNsb2coUE9DX1BSSU5ULFNMT0dfRVJSLGZvcm1hdCwjI19fVkFfQVJHU19fICk7XAogICAgfSB3aGlsZSgwKQojZWxzZQojZGVmaW5lIFBPQ19TVlJfTE9HKGZvcm1hdCwgLi4uKSBcCglkbyB7IFwKCQlwcmludGYoZm9ybWF0LCMjX19WQV9BUkdTX18pOyBcCgl9IHdoaWxlKDApCgojZGVmaW5lIFBPQ19TVlJfTE9HX0VSUihmb3JtYXQsIC4uLikgXAoJZG8geyBcCgkJcHJpbnRmKGZvcm1hdCwjI19fVkFfQVJHU19fKTsgXAoJfSB3aGlsZSgwKQojZW5kaWYKCi8q1+6088P7s8azpLbIKi8KI2RlZmluZSBTVlJQT0NfTkFNRV9MRU5USF9NQVggMzIgCi8q1+6089fpyv3EvyovCiNkZWZpbmUgU1ZSUE9DX0dST1VQX05VTUJFUl9NQVggMzIgCi8q1+6087PJ1LHK/cS/Ki8KI2RlZmluZSBTVlJQT0NfTUVNQkVSU19OVU1CRVJfTUFYIDMyIAoKLyrOxLG+0MXPotfutPOzpLbIKi8KI2RlZmluZSBTVlJQT0NfVEVYVF9JTkZPX01BWCAyNTYgCgovKsnPy83P+8+itqjS5SovCiNkZWZpbmUgU1ZSUE9DX0JBU0UgTVNHX0NNRF9QT0NTVlJfQkFTRQoKI2RlZmluZSBTVlJQT0NfSU5JVF9DSEVDS19SRVEgIChTVlJQT0NfQkFTRSArIDEpCiNkZWZpbmUgU1ZSUE9DX0lOSVRfQ0hFQ0tfUlNQICAoU1ZSUE9DX0JBU0UgKyAyKQoKI2RlZmluZSBTVlJQT0NfVVNFUl9MT0dJTl9SRVEgIChTVlJQT0NfQkFTRSArIDMpCiNkZWZpbmUgU1ZSUE9DX1VTRVJfTE9HSU5fUlNQICAoU1ZSUE9DX0JBU0UgKyA0KQoKI2RlZmluZSBTVlJQT0NfVVNFUl9MT0dPVVRfUkVRICAoU1ZSUE9DX0JBU0UgKyA1KQojZGVmaW5lIFNWUlBPQ19VU0VSX0xPR09VVF9SU1AgIChTVlJQT0NfQkFTRSArIDYpCgojZGVmaW5lIFNWUlBPQ19HRVRfR1JPVVBMSVNUX1JFUSAgKFNWUlBPQ19CQVNFICsgNykKI2RlZmluZSBTVlJQT0NfR0VUX0dST1VQTElTVF9SU1AgIChTVlJQT0NfQkFTRSArIDgpCgojZGVmaW5lIFNWUlBPQ19HRVRfTUVNQkVSU19SRVEgIChTVlJQT0NfQkFTRSArIDkpCiNkZWZpbmUgU1ZSUE9DX0dFVF9NRU1CRVJTX1JTUCAgKFNWUlBPQ19CQVNFICsgMTApCgojZGVmaW5lIFNWUlBPQ19TRUFSQ0hfTUVNQkVSU19SRVEgIChTVlJQT0NfQkFTRSArIDExKQojZGVmaW5lIFNWUlBPQ19TRUFSQ0hfTUVNQkVSU19SU1AgIChTVlJQT0NfQkFTRSArIDEyKQoKI2RlZmluZSBTVlJQT0NfR0VUX0ZSSUVORFNfUkVRICAoU1ZSUE9DX0JBU0UgKyAxMykKI2RlZmluZSBTVlJQT0NfR0VUX0ZSSUVORFNfUlNQICAoU1ZSUE9DX0JBU0UgKyAxNCkKCiNkZWZpbmUgU1ZSUE9DX1NFQVJDSF9GUklFTkRTX1JFUSAgKFNWUlBPQ19CQVNFICsgMTUpCiNkZWZpbmUgU1ZSUE9DX1NFQVJDSF9GUklFTkRTX1JTUCAgKFNWUlBPQ19CQVNFICsgMTYpCgoKI2RlZmluZSBTVlJQT0NfR0VUX1VTRVJJTkZPX1JFUSAgKFNWUlBPQ19CQVNFICsgMTcpCiNkZWZpbmUgU1ZSUE9DX0dFVF9VU0VSSU5GT19SU1AgIChTVlJQT0NfQkFTRSArIDE4KQoKI2RlZmluZSBTVlJQT0NfR0VUX0xPQ0FUSU9OX0lORk9fUkVRICAoU1ZSUE9DX0JBU0UgKyAxOSkKI2RlZmluZSBTVlJQT0NfR0VUX0xPQ0FUSU9OX0lORk9fUlNQICAoU1ZSUE9DX0JBU0UgKyAyMCkKCiNkZWZpbmUgU1ZSUE9DX0dFVF9BQ0NPVU5UX0lORk9fUkVRICAoU1ZSUE9DX0JBU0UgKyAyMSkKI2RlZmluZSBTVlJQT0NfR0VUX0FDQ09VTlRfSU5GT19SU1AgIChTVlJQT0NfQkFTRSArIDIyKQoKI2RlZmluZSBTVlJQT0NfSEFSRFdBUkVfVVBHUkFERV9SRVEgIChTVlJQT0NfQkFTRSArIDIzKQojZGVmaW5lIFNWUlBPQ19IQVJEV0FSRV9VUEdSQURFX1JTUCAgKFNWUlBPQ19CQVNFICsgMjQpCgojZGVmaW5lIFNWUlBPQ19KT0lOX0dST1VQX1JFUSAgKFNWUlBPQ19CQVNFICsgMjUpCiNkZWZpbmUgU1ZSUE9DX0pPSU5fR1JPVVBfUlNQICAoU1ZSUE9DX0JBU0UgKyAyNikKCiNkZWZpbmUgU1ZSUE9DX0pPSU5fVEVNUE9SQVJZX0dST1VQX1JFUSAgKFNWUlBPQ19CQVNFICsgMjcpCiNkZWZpbmUgU1ZSUE9DX0pPSU5fVEVNUE9SQVJZX0dST1VQX1JTUCAgKFNWUlBPQ19CQVNFICsgMjgpCgojZGVmaW5lIFNWUlBPQ19HRVRfTUlDX1JFUSAgKFNWUlBPQ19CQVNFICsgMjkpCiNkZWZpbmUgU1ZSUE9DX0dFVF9NSUNfUlNQICAoU1ZSUE9DX0JBU0UgKyAzMCkKCiNkZWZpbmUgU1ZSUE9DX1JFTEVBU0VfTUlDX1JFUSAgKFNWUlBPQ19CQVNFICsgMzEpCiNkZWZpbmUgU1ZSUE9DX1JFTEVBU0VfTUlDX1JTUCAgKFNWUlBPQ19CQVNFICsgMzIpCgojZGVmaW5lIFNWUlBPQ19VU0VSX0FDVElWSVRZX1JFUSAgKFNWUlBPQ19CQVNFICsgMzMpCiNkZWZpbmUgU1ZSUE9DX1VTRVJfQUNUSVZJVFlfUlNQICAoU1ZSUE9DX0JBU0UgKyAzNCkKCiNkZWZpbmUgU1ZSUE9DX0dFVF9PTkxJTkVfTUVNQkVSU19SRVEgIChTVlJQT0NfQkFTRSArIDM1KQojZGVmaW5lIFNWUlBPQ19HRVRfT05MSU5FX01FTUJFUlNfUlNQICAoU1ZSUE9DX0JBU0UgKyAzNikKCiNkZWZpbmUgU1ZSUE9DX1BUVF9QVVNIX1JFUSAgKFNWUlBPQ19CQVNFICsgMzcpCiNkZWZpbmUgU1ZSUE9DX1BUVF9QVVNIX1JTUCAgKFNWUlBPQ19CQVNFICsgMzgpCgojZGVmaW5lIFNWUlBPQ19QVFRfUkVMRUFTRV9SRVEgIChTVlJQT0NfQkFTRSArIDM5KQojZGVmaW5lIFNWUlBPQ19QVFRfUkVMRUFTRV9SU1AgIChTVlJQT0NfQkFTRSArIDQwKQoKI2RlZmluZSBTVlJQT0NfUFRUX0lTX01FTUJFUl9MT1NUX1JFUSAgKFNWUlBPQ19CQVNFICsgNDEpCiNkZWZpbmUgU1ZSUE9DX1BUVF9JU19NRU1CRVJfTE9TVF9SU1AgIChTVlJQT0NfQkFTRSArIDQyKQoKI2RlZmluZSBTVlJQT0NfU0NBTl9NRU1CRVJfU1RBVEVfUkVRICAoU1ZSUE9DX0JBU0UgKyA0MykKI2RlZmluZSBTVlJQT0NfU0NBTl9NRU1CRVJfU1RBVEVfUlNQICAoU1ZSUE9DX0JBU0UgKyA0NCkKCiNkZWZpbmUgU1ZSUE9DX1VTRVJfTElGRV9JTklUX1JFUSAgKFNWUlBPQ19CQVNFICsgNDUpCiNkZWZpbmUgU1ZSUE9DX1VTRVJfTElGRV9JTklUX1JTUCAgKFNWUlBPQ19CQVNFICsgNDYpCgojZGVmaW5lIFNWUlBPQ19FTlRFUl9TRUxFQ1RfR1JPVVBfUkVRICAoU1ZSUE9DX0JBU0UgKyA0NykKI2RlZmluZSBTVlJQT0NfRU5URVJfU0VMRUNUX0dST1VQX1JTUCAgKFNWUlBPQ19CQVNFICsgNDgpCgojZGVmaW5lIFNWUlBPQ19FTlRFUl9TRUxFQ1RfTUVNQkVSX1JFUSAgKFNWUlBPQ19CQVNFICsgNDkpCiNkZWZpbmUgU1ZSUE9DX0VOVEVSX1NFTEVDVF9NRU1CRVJfUlNQICAoU1ZSUE9DX0JBU0UgKyA1MCkKCiNkZWZpbmUgU1ZSUE9DX0VOVEVSX1NFTEVDVF9QTEFZX0dST1VQX1JFUSAgKFNWUlBPQ19CQVNFICsgNTEpCiNkZWZpbmUgU1ZSUE9DX0VOVEVSX1NFTEVDVF9QTEFZX0dST1VQX1JTUCAgKFNWUlBPQ19CQVNFICsgNTIpCgojZGVmaW5lIFNWUlBPQ19TRUxFQ1RfTUVNQkVSX1VQX1JFUSAgKFNWUlBPQ19CQVNFICsgNTMpCiNkZWZpbmUgU1ZSUE9DX1NFTEVDVF9NRU1CRVJfVVBfUlNQICAoU1ZSUE9DX0JBU0UgKyA1NCkKCiNkZWZpbmUgU1ZSUE9DX1NFTEVDVF9NRU1CRVJfRE9XTl9SRVEgIChTVlJQT0NfQkFTRSArIDU1KQojZGVmaW5lIFNWUlBPQ19TRUxFQ1RfTUVNQkVSX0RPV05fUlNQICAoU1ZSUE9DX0JBU0UgKyA1NikKCiNkZWZpbmUgU1ZSUE9DX0VYSVRfU0VMRUNUX01FTUJFUl9SRVEgIChTVlJQT0NfQkFTRSArIDU3KQojZGVmaW5lIFNWUlBPQ19FWElUX1NFTEVDVF9NRU1CRVJfUlNQICAoU1ZSUE9DX0JBU0UgKyA1OCkKCiNkZWZpbmUgU1ZSUE9DX0VYSVRfU0VMRUNUX0dST1VQX1JFUSAgKFNWUlBPQ19CQVNFICsgNTkpCiNkZWZpbmUgU1ZSUE9DX0VYSVRfU0VMRUNUX0dST1VQX1JTUCAgKFNWUlBPQ19CQVNFICsgNjApCgojZGVmaW5lIFNWUlBPQ19FTlRFUl9TRUxFQ1RfR1JPVVBfVVBfUkVRICAoU1ZSUE9DX0JBU0UgKyA2MSkKI2RlZmluZSBTVlJQT0NfRU5URVJfU0VMRUNUX0dST1VQX1VQX1JTUCAgKFNWUlBPQ19CQVNFICsgNjIpCgojZGVmaW5lIFNWUlBPQ19FTlRFUl9TRUxFQ1RfR1JPVVBfRE9XTl9SRVEgIChTVlJQT0NfQkFTRSArIDYzKQojZGVmaW5lIFNWUlBPQ19FTlRFUl9TRUxFQ1RfR1JPVVBfRE9XTl9SU1AgIChTVlJQT0NfQkFTRSArIDY0KQoKI2RlZmluZSBTVlJQT0NfRU5URVJfVFRTX1BMQVlfVVNFUl9OQU1FX1JFUSAgKFNWUlBPQ19CQVNFICsgNjUpCiNkZWZpbmUgU1ZSUE9DX0VOVEVSX1RUU19QTEFZX1VTRVJfTkFNRVBfUlNQICAoU1ZSUE9DX0JBU0UgKyA2NikKCiNkZWZpbmUgU1ZSUE9DX1VTRVJfVEVNUF9DQUxMX1dJVEhfTk9fR0lEX1JFUSAgKFNWUlBPQ19CQVNFICsgNjcpCiNkZWZpbmUgU1ZSUE9DX1VTRVJfVEVNUF9DQUxMX1dJVEhfTk9fR0lEX1JTUCAgKFNWUlBPQ19CQVNFICsgNjgpCgoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogICAgICAgICAgICAgICAgICAgICAgICAgICAgIFR5cGUgZGVmaW5pdGlvbnMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLyrNqNPDz+zTpr3hufsqLwpzdHJ1Y3Qgc3ZyX3BvY19jb21tX3Jlc3VsdHsKCWludCByZXN1bHQ7LyowstnX97PJuaaju7fHMLLZ1/fKp7DcKi8KfTsKCi8q08O7p9DFz6IqLwpzdHJ1Y3Qgc3ZyX3BvY191c2VyX2luZm97CgljaGFyIHVzZXJOYW1lW1NWUlBPQ19OQU1FX0xFTlRIX01BWF07LyrTw7unw/sqLwoJdW5zaWduZWQgaW50IHVpZCA7LyrTw7unaWQqLwkKCXVuc2lnbmVkIGludCBjdXJyZW50R2lkOy8qtbHHsNfpaWQqLwoJY2hhciBncm91cE5hbWVbU1ZSUE9DX05BTUVfTEVOVEhfTUFYXTsvKrWxx7DX6cP7Ki8KCXVuc2lnbmVkIGNoYXIgaXNPbmxpbmU7LyrKx7fx1NrP3yovCn07CgovKsi61+nQxc+iKi8Kc3RydWN0IHN2cl9wb2NfZ3JvdXB7Cgl1bnNpZ25lZCBpbnQgZ2lkOy8q1+lpZCovCgljaGFyIG5hbWVbU1ZSUE9DX05BTUVfTEVOVEhfTUFYXTsvKtfpw/sqLwoJdW5zaWduZWQgaW50IG5fbWVtYmVyczsvKrPJ1LHK/cS/Ki8KCXVuc2lnbmVkIGNoYXIgaGFzX3R5cGU7LyrKx7fx09DA4NDNKi8KCXVuc2lnbmVkIGludCB0eXBlOyAvKjC0+sLr1tDQtMvAtcQsMbrzzKjJ6NbDtcQswdnKsbS0vai1xCovCn07CgovKgogKrLp0a/IutfptcTP7NOmCiAqLwpzdHJ1Y3Qgc3ZyX3BvY19ncm91cF9hY2t7CglpbnQgcmVzdWx0Oy8qMLLZ1/ezybmmo7u3xzCy2df3yqew3CovCgl1bnNpZ25lZCBpbnQgbl9ncm91cHM7Lyq3tbvYuMPVy7rFy/nU2rXEy/nT0Mi61+nQxc+iKi8KCXN0cnVjdCBzdnJfcG9jX2dyb3VwIGdyb3Vwc1tTVlJQT0NfR1JPVVBfTlVNQkVSX01BWF07CQp9OwoKc3RydWN0IHN2cl9wb2NfbWVtYmVyewoJCS8qCgkgICAqVXNlciBJRCy/ydLU1ve2r8nPsajG5Mv708O7p9DFz6IKCSAgICovCgkgIHVuc2lnbmVkIGludCB1aWQ7CgkgIC8qCgkgICAq1cu6xcP7s8YKCSAgICovCgkgIGNoYXIgbmFtZVtTVlJQT0NfTkFNRV9MRU5USF9NQVhdOwoJICAvKgoJICAgKsrHt/HU2s/fCgkgICAqLwoJICB1bnNpZ25lZCBjaGFyIGhhc19vbmxpbmU7Cn07CgovKtfps8nUsdDFz6IqLwpzdHJ1Y3Qgc3ZyX3BvY19ncm91cF9tZW1iZXJzewoJdW5zaWduZWQgaW50IGdpZDsvKtfpaWQqLwoJLyoKCSrL+dPQuMPIutfpxNrU2s/f08O7p0lE0MXPogoJKi8KCXVuc2lnbmVkIGludCBuX2luZ3JvdXBzOwoJdW5zaWduZWQgaW50IGluZ3JvdXBzW1NWUlBPQ19NRU1CRVJTX05VTUJFUl9NQVhdOwoJLyoKCSrL+dPQuMPIutfpxNrA68/f08O7p0lE0MXPogoJKi8KCXVuc2lnbmVkIGludCBuX291dGdyb3VwczsKCXVuc2lnbmVkIGludCBvdXRncm91cHNbU1ZSUE9DX01FTUJFUlNfTlVNQkVSX01BWF07CgkvKgoJKrjDyLrX6cTay/nT0NPDu6fQxc+iCgkqLwoJdW5zaWduZWQgaW50IG5fbWVtYmVyczsvKrPJ1LHK/cS/Ki8KCXN0cnVjdCBzdnJfcG9jX21lbWJlciBtZW1iZXJzW1NWUlBPQ19NRU1CRVJTX05VTUJFUl9NQVhdOwp9OwoKLyoKICqy6dGvyLrX6cTa08O7p9DFz6K1xMfrx/O1xM/s06YKICovCnN0cnVjdCBzdnJfcG9jX2dyb3VwX21lbWJlcnNfYWNrewoJaW50IHJlc3VsdDsvKjCy2df3s8m5pqO7t8cwstnX98qnsNwqLwoJdW5zaWduZWQgaW50IG5fbWVtYmVyczsvKrPJ1LHK/cS/Ki8KCXN0cnVjdCBzdnJfcG9jX2dyb3VwX21lbWJlcnMgbWVtYmVyczsKfTsKCnN0cnVjdCBzdnJfcG9jX3NlYXJjaF9tZW1iZXJfYWNrIHsKCWludCByZXN1bHQ7LyowstnX97PJuaaju7fHMLLZ1/fKp7DcKi8KCXN0cnVjdCBzdnJfcG9jX21lbWJlciBtZW1iZXI7Cn07CgpzdHJ1Y3Qgc3ZyX3BvY19nZXRfbG9jYXRpb25fYWNrIHsKCWludCByZXN1bHQ7LyowstnX97PJuaaju7fHMLLZ1/fKp7DcKi8KCWNoYXIgbG9jYXRpb25bU1ZSUE9DX1RFWFRfSU5GT19NQVhdOwp9OwoKc3RydWN0IHN2cl9wb2NfZ2V0X2FjY291bnRfaW5mb19hY2sgewoJaW50IHJlc3VsdDsvKjCy2df3s8m5pqO7t8cwstnX98qnsNwqLwoJY2hhciBpcFtTVlJQT0NfTkFNRV9MRU5USF9NQVhdOwoJY2hhciBkbnNbU1ZSUE9DX05BTUVfTEVOVEhfTUFYXTsKCWNoYXIgdXNlcm5hbWVbU1ZSUE9DX05BTUVfTEVOVEhfTUFYXTsKfTsKCiNlbmRpZiAvKl9fUE9DX01TR19IKi8K