LyoKICogQ29weXJpZ2h0IChjKSAxOTk1IC0gMjAwMSBLdW5nbGlnYSBUZWtuaXNrYSBI9mdza29sYW4KICogKFJveWFsIEluc3RpdHV0ZSBvZiBUZWNobm9sb2d5LCBTdG9ja2hvbG0sIFN3ZWRlbikuCiAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAqIAogKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCiAqIGFyZSBtZXQ6CiAqIAogKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAogKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCiAqIAogKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAogKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCiAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCiAqIAogKiAzLiBOZWl0aGVyIHRoZSBuYW1lIG9mIHRoZSBJbnN0aXR1dGUgbm9yIHRoZSBuYW1lcyBvZiBpdHMgY29udHJpYnV0b3JzCiAqICAgIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZQogKiAgICB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KICogCiAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIElOU1RJVFVURSBBTkQgQ09OVFJJQlVUT1JTIGBgQVMgSVMnJyBBTkQKICogQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCiAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFCiAqIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIElOU1RJVFVURSBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFCiAqIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMCiAqIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTCiAqIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKQogKiBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVAogKiBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZCiAqIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YKICogU1VDSCBEQU1BR0UuCiAqLwoKI2lmZGVmIEhBVkVfQ09ORklHX0gKI2luY2x1ZGUgImNvbmZpZy5oIgoKX19SQ1NJRCgiJEhlaW1kYWw6IG1kNS5jLHYgMS4xNSAyMDAxLzAxLzI5IDA0OjMzOjQ0IGFzc2FyIEV4cCAkIgogICAgICAgICIkTmV0QlNEOiBtZDUuYyx2IDEuMS4xLjQgMjAwMi8wOS8xMiAxMjo0MTo0MiBqb2RhIEV4cCAkIik7CiNlbmRpZgoKI2luY2x1ZGUgIm1kNS5oIgojaW5jbHVkZSAiaGFzaC5oIgoKI2RlZmluZSBBIG0tPmNvdW50ZXJbMF0KI2RlZmluZSBCIG0tPmNvdW50ZXJbMV0KI2RlZmluZSBDIG0tPmNvdW50ZXJbMl0KI2RlZmluZSBEIG0tPmNvdW50ZXJbM10KI2RlZmluZSBYIGRhdGEKCnZvaWQKTUQ1X0luaXQgKHN0cnVjdCBtZDUgKm0pCnsKICBtLT5zelswXSA9IDA7CiAgbS0+c3pbMV0gPSAwOwogIEQgPSAweDEwMzI1NDc2OwogIEMgPSAweDk4YmFkY2ZlOwogIEIgPSAweGVmY2RhYjg5OwogIEEgPSAweDY3NDUyMzAxOwp9CgojZGVmaW5lIEYoeCx5LHopIENSQVlGSVgoKHggJiB5KSB8ICh+eCAmIHopKQojZGVmaW5lIEcoeCx5LHopIENSQVlGSVgoKHggJiB6KSB8ICh5ICYgfnopKQojZGVmaW5lIEgoeCx5LHopICh4IF4geSBeIHopCiNkZWZpbmUgSSh4LHkseikgQ1JBWUZJWCh5IF4gKHggfCB+eikpCgojZGVmaW5lIERPSVQoYSxiLGMsZCxrLHMsaSxPUCkgXAphID0gYiArIGNzaGlmdChhICsgT1AoYixjLGQpICsgWFtrXSArIChpKSwgcykKCiNkZWZpbmUgRE8xKGEsYixjLGQsayxzLGkpIERPSVQoYSxiLGMsZCxrLHMsaSxGKQojZGVmaW5lIERPMihhLGIsYyxkLGsscyxpKSBET0lUKGEsYixjLGQsayxzLGksRykKI2RlZmluZSBETzMoYSxiLGMsZCxrLHMsaSkgRE9JVChhLGIsYyxkLGsscyxpLEgpCiNkZWZpbmUgRE80KGEsYixjLGQsayxzLGkpIERPSVQoYSxiLGMsZCxrLHMsaSxJKQoKc3RhdGljIGlubGluZSB2b2lkCmNhbGMgKHN0cnVjdCBtZDUgKm0sIHVfaW50MzJfdCAqZGF0YSkKewogIHVfaW50MzJfdCBBQSwgQkIsIENDLCBERDsKCiAgQUEgPSBBOwogIEJCID0gQjsKICBDQyA9IEM7CiAgREQgPSBEOwoKICAvKiBSb3VuZCAxICovCgogIERPMShBLEIsQyxELDAsNywweGQ3NmFhNDc4KTsKICBETzEoRCxBLEIsQywxLDEyLDB4ZThjN2I3NTYpOwogIERPMShDLEQsQSxCLDIsMTcsMHgyNDIwNzBkYik7CiAgRE8xKEIsQyxELEEsMywyMiwweGMxYmRjZWVlKTsKCiAgRE8xKEEsQixDLEQsNCw3LDB4ZjU3YzBmYWYpOwogIERPMShELEEsQixDLDUsMTIsMHg0Nzg3YzYyYSk7CiAgRE8xKEMsRCxBLEIsNiwxNywweGE4MzA0NjEzKTsKICBETzEoQixDLEQsQSw3LDIyLDB4ZmQ0Njk1MDEpOwoKICBETzEoQSxCLEMsRCw4LDcsMHg2OTgwOThkOCk7CiAgRE8xKEQsQSxCLEMsOSwxMiwweDhiNDRmN2FmKTsKICBETzEoQyxELEEsQiwxMCwxNywweGZmZmY1YmIxKTsKICBETzEoQixDLEQsQSwxMSwyMiwweDg5NWNkN2JlKTsKCiAgRE8xKEEsQixDLEQsMTIsNywweDZiOTAxMTIyKTsKICBETzEoRCxBLEIsQywxMywxMiwweGZkOTg3MTkzKTsKICBETzEoQyxELEEsQiwxNCwxNywweGE2Nzk0MzhlKTsKICBETzEoQixDLEQsQSwxNSwyMiwweDQ5YjQwODIxKTsKCiAgLyogUm91bmQgMiAqLwoKICBETzIoQSxCLEMsRCwxLDUsMHhmNjFlMjU2Mik7CiAgRE8yKEQsQSxCLEMsNiw5LDB4YzA0MGIzNDApOwogIERPMihDLEQsQSxCLDExLDE0LDB4MjY1ZTVhNTEpOwogIERPMihCLEMsRCxBLDAsMjAsMHhlOWI2YzdhYSk7CgogIERPMihBLEIsQyxELDUsNSwweGQ2MmYxMDVkKTsKICBETzIoRCxBLEIsQywxMCw5LDB4MjQ0MTQ1Myk7CiAgRE8yKEMsRCxBLEIsMTUsMTQsMHhkOGExZTY4MSk7CiAgRE8yKEIsQyxELEEsNCwyMCwweGU3ZDNmYmM4KTsKCiAgRE8yKEEsQixDLEQsOSw1LDB4MjFlMWNkZTYpOwogIERPMihELEEsQixDLDE0LDksMHhjMzM3MDdkNik7CiAgRE8yKEMsRCxBLEIsMywxNCwweGY0ZDUwZDg3KTsKICBETzIoQixDLEQsQSw4LDIwLDB4NDU1YTE0ZWQpOwoKICBETzIoQSxCLEMsRCwxMyw1LDB4YTllM2U5MDUpOwogIERPMihELEEsQixDLDIsOSwweGZjZWZhM2Y4KTsKICBETzIoQyxELEEsQiw3LDE0LDB4Njc2ZjAyZDkpOwogIERPMihCLEMsRCxBLDEyLDIwLDB4OGQyYTRjOGEpOwoKICAvKiBSb3VuZCAzICovCgogIERPMyhBLEIsQyxELDUsNCwweGZmZmEzOTQyKTsKICBETzMoRCxBLEIsQyw4LDExLDB4ODc3MWY2ODEpOwogIERPMyhDLEQsQSxCLDExLDE2LDB4NmQ5ZDYxMjIpOwogIERPMyhCLEMsRCxBLDE0LDIzLDB4ZmRlNTM4MGMpOwoKICBETzMoQSxCLEMsRCwxLDQsMHhhNGJlZWE0NCk7CiAgRE8zKEQsQSxCLEMsNCwxMSwweDRiZGVjZmE5KTsKICBETzMoQyxELEEsQiw3LDE2LDB4ZjZiYjRiNjApOwogIERPMyhCLEMsRCxBLDEwLDIzLDB4YmViZmJjNzApOwoKICBETzMoQSxCLEMsRCwxMyw0LDB4Mjg5YjdlYzYpOwogIERPMyhELEEsQixDLDAsMTEsMHhlYWExMjdmYSk7CiAgRE8zKEMsRCxBLEIsMywxNiwweGQ0ZWYzMDg1KTsKICBETzMoQixDLEQsQSw2LDIzLDB4NDg4MWQwNSk7CgogIERPMyhBLEIsQyxELDksNCwweGQ5ZDRkMDM5KTsKICBETzMoRCxBLEIsQywxMiwxMSwweGU2ZGI5OWU1KTsKICBETzMoQyxELEEsQiwxNSwxNiwweDFmYTI3Y2Y4KTsKICBETzMoQixDLEQsQSwyLDIzLDB4YzRhYzU2NjUpOwoKICAvKiBSb3VuZCA0ICovCgogIERPNChBLEIsQyxELDAsNiwweGY0MjkyMjQ0KTsKICBETzQoRCxBLEIsQyw3LDEwLDB4NDMyYWZmOTcpOwogIERPNChDLEQsQSxCLDE0LDE1LDB4YWI5NDIzYTcpOwogIERPNChCLEMsRCxBLDUsMjEsMHhmYzkzYTAzOSk7CgogIERPNChBLEIsQyxELDEyLDYsMHg2NTViNTljMyk7CiAgRE80KEQsQSxCLEMsMywxMCwweDhmMGNjYzkyKTsKICBETzQoQyxELEEsQiwxMCwxNSwweGZmZWZmNDdkKTsKICBETzQoQixDLEQsQSwxLDIxLDB4ODU4NDVkZDEpOwoKICBETzQoQSxCLEMsRCw4LDYsMHg2ZmE4N2U0Zik7CiAgRE80KEQsQSxCLEMsMTUsMTAsMHhmZTJjZTZlMCk7CiAgRE80KEMsRCxBLEIsNiwxNSwweGEzMDE0MzE0KTsKICBETzQoQixDLEQsQSwxMywyMSwweDRlMDgxMWExKTsKCiAgRE80KEEsQixDLEQsNCw2LDB4Zjc1MzdlODIpOwogIERPNChELEEsQixDLDExLDEwLDB4YmQzYWYyMzUpOwogIERPNChDLEQsQSxCLDIsMTUsMHgyYWQ3ZDJiYik7CiAgRE80KEIsQyxELEEsOSwyMSwweGViODZkMzkxKTsKCiAgQSArPSBBQTsKICBCICs9IEJCOwogIEMgKz0gQ0M7CiAgRCArPSBERDsKfQoKLyoKICogRnJvbSBgUGVyZm9ybWFuY2UgYW5hbHlzaXMgb2YgTUQ1JyBieSBKb3NlcGggRC4gVG91Y2ggPHRvdWNoQGlzaS5lZHU+CiAqLwoKI2lmIGRlZmluZWQoV09SRFNfQklHRU5ESUFOKQpzdGF0aWMgaW5saW5lIHVfaW50MzJfdApzd2FwX3VfaW50MzJfdCAodV9pbnQzMl90IHQpCnsKICB1X2ludDMyX3QgdGVtcDEsIHRlbXAyOwoKICB0ZW1wMSAgID0gY3NoaWZ0KHQsIDE2KTsKICB0ZW1wMiAgID0gdGVtcDEgPj4gODsKICB0ZW1wMSAgJj0gMHgwMGZmMDBmZjsKICB0ZW1wMiAgJj0gMHgwMGZmMDBmZjsKICB0ZW1wMSA8PD0gODsKICByZXR1cm4gdGVtcDEgfCB0ZW1wMjsKfQojZW5kaWYKCnN0cnVjdCB4MzJ7CiAgdW5zaWduZWQgaW50IGE6MzI7CiAgdW5zaWduZWQgaW50IGI6MzI7Cn07Cgp2b2lkCk1ENV9VcGRhdGUgKHN0cnVjdCBtZDUgKm0sIGNvbnN0IHZvaWQgKnYsIHNpemVfdCBsZW4pCnsKICBjb25zdCB1bnNpZ25lZCBjaGFyICpwID0gdjsKICBzaXplX3Qgb2xkX3N6ID0gbS0+c3pbMF07CiAgc2l6ZV90IG9mZnNldDsKCiAgbS0+c3pbMF0gKz0gbGVuICogODsKICBpZiAobS0+c3pbMF0gPCBvbGRfc3opCiAgICAgICsrbS0+c3pbMV07CiAgb2Zmc2V0ID0gKG9sZF9zeiAvIDgpICAlIDY0OwogIHdoaWxlKGxlbiA+IDApewogICAgc2l6ZV90IGwgPSBtaW4obGVuLCA2NCAtIG9mZnNldCk7CiAgICBtZW1jcHkobS0+c2F2ZSArIG9mZnNldCwgcCwgbCk7CiAgICBvZmZzZXQgKz0gbDsKICAgIHAgKz0gbDsKICAgIGxlbiAtPSBsOwogICAgaWYob2Zmc2V0ID09IDY0KXsKI2lmIGRlZmluZWQoV09SRFNfQklHRU5ESUFOKQogICAgICBpbnQgaTsKICAgICAgdV9pbnQzMl90IGN1cnJlbnRbMTZdOwogICAgICBzdHJ1Y3QgeDMyICp1ID0gKHN0cnVjdCB4MzIqKW0tPnNhdmU7CiAgICAgIGZvcihpID0gMDsgaSA8IDg7IGkrKyl7CgljdXJyZW50WzIqaSswXSA9IHN3YXBfdV9pbnQzMl90KHVbaV0uYSk7CgljdXJyZW50WzIqaSsxXSA9IHN3YXBfdV9pbnQzMl90KHVbaV0uYik7CiAgICAgIH0KICAgICAgY2FsYyhtLCBjdXJyZW50KTsKI2Vsc2UKICAgICAgY2FsYyhtLCAodV9pbnQzMl90KiltLT5zYXZlKTsKI2VuZGlmCiAgICAgIG9mZnNldCA9IDA7CiAgICB9CiAgfQp9Cgp2b2lkCk1ENV9GaW5hbCAodm9pZCAqcmVzLCBzdHJ1Y3QgbWQ1ICptKQp7CiAgc3RhdGljIHVuc2lnbmVkIGNoYXIgemVyb3NbNzJdOwogIHVuc2lnbmVkIG9mZnNldCA9IChtLT5zelswXSAvIDgpICUgNjQ7CiAgdW5zaWduZWQgaW50IGRzdGFydCA9ICgxMjAgLSBvZmZzZXQgLSAxKSAlIDY0ICsgMTsKCiAgKnplcm9zID0gMHg4MDsKICBtZW1zZXQgKHplcm9zICsgMSwgMCwgc2l6ZW9mKHplcm9zKSAtIDEpOwogIHplcm9zW2RzdGFydCswXSA9IChtLT5zelswXSA+PiAwKSAmIDB4ZmY7CiAgemVyb3NbZHN0YXJ0KzFdID0gKG0tPnN6WzBdID4+IDgpICYgMHhmZjsKICB6ZXJvc1tkc3RhcnQrMl0gPSAobS0+c3pbMF0gPj4gMTYpICYgMHhmZjsKICB6ZXJvc1tkc3RhcnQrM10gPSAobS0+c3pbMF0gPj4gMjQpICYgMHhmZjsKICB6ZXJvc1tkc3RhcnQrNF0gPSAobS0+c3pbMV0gPj4gMCkgJiAweGZmOwogIHplcm9zW2RzdGFydCs1XSA9IChtLT5zelsxXSA+PiA4KSAmIDB4ZmY7CiAgemVyb3NbZHN0YXJ0KzZdID0gKG0tPnN6WzFdID4+IDE2KSAmIDB4ZmY7CiAgemVyb3NbZHN0YXJ0KzddID0gKG0tPnN6WzFdID4+IDI0KSAmIDB4ZmY7CiAgTUQ1X1VwZGF0ZSAobSwgemVyb3MsIGRzdGFydCArIDgpOwogIHsKICAgICAgaW50IGk7CiAgICAgIHVuc2lnbmVkIGNoYXIgKnIgPSAodW5zaWduZWQgY2hhciAqKXJlczsKCiAgICAgIGZvciAoaSA9IDA7IGkgPCA0OyArK2kpIHsKCSAgcls0KmldICAgPSBtLT5jb3VudGVyW2ldICYgMHhGRjsKCSAgcls0KmkrMV0gPSAobS0+Y291bnRlcltpXSA+PiA4KSAmIDB4RkY7CgkgIHJbNCppKzJdID0gKG0tPmNvdW50ZXJbaV0gPj4gMTYpICYgMHhGRjsKCSAgcls0KmkrM10gPSAobS0+Y291bnRlcltpXSA+PiAyNCkgJiAweEZGOwogICAgICB9CiAgfQojaWYgMAogIHsKICAgIGludCBpOwogICAgdV9pbnQzMl90ICpyID0gKHVfaW50MzJfdCAqKXJlczsKCiAgICBmb3IgKGkgPSAwOyBpIDwgNDsgKytpKQogICAgICByW2ldID0gc3dhcF91X2ludDMyX3QgKG0tPmNvdW50ZXJbaV0pOwogIH0KI2VuZGlmCn0K