From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 16061 invoked by alias); 12 Apr 2002 17:56:04 -0000 Mailing-List: contact gcc-prs-help@gcc.gnu.org; run by ezmlm Precedence: bulk List-Archive: List-Post: List-Help: Sender: gcc-prs-owner@gcc.gnu.org Received: (qmail 16033 invoked by uid 71); 12 Apr 2002 17:56:03 -0000 Resent-Date: 12 Apr 2002 17:56:03 -0000 Resent-Message-ID: <20020412175603.16031.qmail@sources.redhat.com> Resent-From: gcc-gnats@gcc.gnu.org (GNATS Filer) Resent-To: nobody@gcc.gnu.org Resent-Cc: gcc-prs@gcc.gnu.org, gcc-bugs@gcc.gnu.org Resent-Reply-To: gcc-gnats@gcc.gnu.org, pierre@epinetworx.com Received:(qmail 10070 invoked by uid 61); 12 Apr 2002 17:47:39 -0000 Message-Id:<20020412174739.10069.qmail@sources.redhat.com> Date: Fri, 12 Apr 2002 10:56:00 -0000 From: pierre@epinetworx.com Reply-To: pierre@epinetworx.com To: gcc-gnats@gcc.gnu.org X-Send-Pr-Version:gnatsweb-2.9.3 (1.1.1.1.2.31) Subject: c/6278: Internal compiler error X-SW-Source: 2002-04/txt/msg00665.txt.bz2 List-Id: >Number: 6278 >Category: c >Synopsis: Internal compiler error >Confidential: no >Severity: serious >Priority: medium >Responsible: unassigned >State: open >Class: sw-bug >Submitter-Id: net >Arrival-Date: Fri Apr 12 10:56:02 PDT 2002 >Closed-Date: >Last-Modified: >Originator: pierre@epinetworx.com >Release: gcc 3.0.4 >Organization: >Environment: Linux Slackware 8.0 glibc 2.2.5 >Description: I try to compile kdemultimedia-3.0 and i got this : [...] Making all in TIMIDITY gmake[3]: Entering directory `/tmp/kdemultimedia-3.0/kmidi/TIMIDITY' source='resample.c' object='resample.o' libtool=no \ depfile='.deps/resample.Po' tmpdepfile='.deps/resample.TPo' \ depmode=gcc3 /bin/sh ../../admin/depcomp \ gcc -DHAVE_CONFIG_H -I. -I. -I../.. -I/usr/X11R6/include `/usr/local/kde/bin/artsc-config --cflags` -DQT_THREAD_SUPPORT -D_REENTRANT -DDEFAULT_PATH=\"//usr/local/kde/share/apps/kmidi/config\" -DAU_OSS -DIA_XAW -DQT_THREAD_SUPPORT -D_REENTRANT -fasm -O2 -O3 -march=i686 -c `test -f resample.c || echo './'`resample.c resample.c: In function `pre_resample': resample.c:1298: Internal compiler error in print_rtl_and_abort, at flow.c:6458 Please submit a full bug report, with preprocessed source if appropriate. See for instructions. gmake[3]: *** [resample.o] Error 1 gmake[3]: Leaving directory `/tmp/kdemultimedia-3.0/kmidi/TIMIDITY' gmake[2]: *** [all-recursive] Error 1 gmake[2]: Leaving directory `/tmp/kdemultimedia-3.0/kmidi' gmake[1]: *** [all-recursive] Error 1 gmake[1]: Leaving directory `/tmp/kdemultimedia-3.0' gmake: *** [all] Error 2 I attach you the file resample.c >How-To-Repeat: Compile kdemultimedia with gcc-3.0.4 >Fix: >Release-Note: >Audit-Trail: >Unformatted: ----gnatsweb-attachment---- Content-Type: application/octet-stream; name="resample.c" Content-Transfer-Encoding: base64 Content-Disposition: attachment; filename="resample.c" LyoKCSRJZDogcmVzYW1wbGUuY3BwLHYgMS4zIDIwMDEvMDQvMTIgMDk6MDk6MjMgZ2FyYmFuem8g RXhwICQKCiAgICBUaU1pZGl0eSsrIC0tIE1JREkgdG8gV0FWRSBjb252ZXJ0ZXIgYW5kIHBsYXll cgogICAgQ29weXJpZ2h0IChDKSAxOTk5IE1hc2FuYW8gSXp1bW8gPG1vQGdvaWNlLmNvLmpwPgog ICAgQ29weXJpZ2h0IChDKSAxOTk1IFR1dWtrYSBUb2l2b25lbiA8dHRAY2dzLmZpPgoKICAgIFRo aXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQv b3IgbW9kaWZ5CiAgICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1Ymxp YyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQogICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlv bjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKICAgIChhdCB5b3VyIG9wdGlv bikgYW55IGxhdGVyIHZlcnNpb24uCgogICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGlu IHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCiAgICBidXQgV0lUSE9VVCBBTlkgV0FS UkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgogICAgTUVSQ0hBTlRB QklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQogICAg R05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KCiAgICBZb3Ugc2hv dWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5z ZQogICAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUg U29mdHdhcmUKICAgIEZvdW5kYXRpb24sIEluYy4sIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBN QSAwMjEzOSwgVVNBLgoKKi8KCiNpbmNsdWRlIDxtYXRoLmg+CiNpbmNsdWRlIDxzdGRpby5oPgoj aW5jbHVkZSA8c3RkbGliLmg+CgojaW5jbHVkZSAiY29uZmlnLmgiCiNpbmNsdWRlICJjb21tb24u aCIKI2luY2x1ZGUgImluc3RydW0uaCIKI2luY2x1ZGUgInBsYXltaWRpLmgiCiNpbmNsdWRlICJv dXRwdXQuaCIKI2luY2x1ZGUgImNvbnRyb2xzLmgiCiNpbmNsdWRlICJ0YWJsZXMuaCIKI2luY2x1 ZGUgInJlc2FtcGxlLmgiCgoKI2RlZmluZSBMSU5FQVJfSU5URVJQT0xBVElPTgojZGVmaW5lIENT UExJTkVfSU5URVJQT0xBVElPTgojZGVmaW5lIEVOVkVMT1BFX1BJVENIX01PRFVMQVRJT04KCgoj aWZkZWYgTE9PS1VQX0hBQ0sKI2RlZmluZSBNQVhfREFUQVZBTCAxMjcKI2RlZmluZSBNSU5fREFU QVZBTCAtMTI4CiNlbHNlCiNkZWZpbmUgTUFYX0RBVEFWQUwgMzI3NjcKI2RlZmluZSBNSU5fREFU QVZBTCAtMzI3NjgKI2VuZGlmCgojZGVmaW5lIE9WRVJTSE9PVF9TVEVQIDUwCgoKc2FtcGxlX3Qg cmVzYW1wbGVfYnVmZmVyW0FVRElPX0JVRkZFUl9TSVpFKzEwMF07CnVpbnQzMiByZXNhbXBsZV9i dWZmZXJfb2Zmc2V0ID0gMDsKCnN0YXRpYyBzYW1wbGVfdCAqdmliX3Jlc2FtcGxlX3ZvaWNlKGlu dCwgdWludDMyICosIGludCk7CnN0YXRpYyBzYW1wbGVfdCAqbm9ybWFsX3Jlc2FtcGxlX3ZvaWNl KGludCwgdWludDMyICosIGludCk7CgovKiBSZXR1cm5zIDEgaWYgZW52ZWxvcGUgcnVucyBvdXQg Ki8KaW50IHJlY29tcHV0ZV9tb2R1bGF0aW9uKGludCB2KQp7CiAgaW50IHN0YWdlOwoKICBzdGFn ZSA9IHZvaWNlW3ZdLm1vZHVsYXRpb25fc3RhZ2U7CgogIGlmIChzdGFnZT41KQogICAgewogICAg ICAvKiBFbnZlbG9wZSByYW4gb3V0LiAqLwogICAgICB2b2ljZVt2XS5tb2R1bGF0aW9uX2luY3Jl bWVudCA9IDA7CiAgICAgIHJldHVybiAxOwogICAgfQoKICBpZiAoKHZvaWNlW3ZdLnNhbXBsZS0+ bW9kZXMgJiBNT0RFU19FTlZFTE9QRSkgJiYgKHZvaWNlW3ZdLnNhbXBsZS0+bW9kZXMgJiBNT0RF U19TVVNUQUlOKSkKICAgIHsKICAgICAgaWYgKHZvaWNlW3ZdLnN0YXR1cyAmIChWT0lDRV9PTiB8 IFZPSUNFX1NVU1RBSU5FRCkpCgl7CgkgIGlmIChzdGFnZT4yKQoJICAgIHsKCSAgICAgIC8qIEZy ZWV6ZSBtb2R1bGF0aW9uIHVudGlsIG5vdGUgdHVybnMgb2ZmLiBUcnVtcGV0cyB3YW50IHRoaXMu ICovCgkgICAgICB2b2ljZVt2XS5tb2R1bGF0aW9uX2luY3JlbWVudD0wOwoJICAgICAgcmV0dXJu IDA7CgkgICAgfQoJfQogICAgfQogIHZvaWNlW3ZdLm1vZHVsYXRpb25fc3RhZ2U9c3RhZ2UrMTsK CiNpZmRlZiB0cGx1cwogIGlmICh2b2ljZVt2XS5tb2R1bGF0aW9uX3ZvbHVtZT09KGludCl2b2lj ZVt2XS5zYW1wbGUtPm1vZHVsYXRpb25fb2Zmc2V0W3N0YWdlXSB8fAogICAgICAoc3RhZ2UgPiAy ICYmIHZvaWNlW3ZdLm1vZHVsYXRpb25fdm9sdW1lIDwgKGludCl2b2ljZVt2XS5zYW1wbGUtPm1v ZHVsYXRpb25fb2Zmc2V0W3N0YWdlXSkpCiNlbHNlCiAgaWYgKHZvaWNlW3ZdLm1vZHVsYXRpb25f dm9sdW1lPT12b2ljZVt2XS5zYW1wbGUtPm1vZHVsYXRpb25fb2Zmc2V0W3N0YWdlXSkKI2VuZGlm CiAgICByZXR1cm4gcmVjb21wdXRlX21vZHVsYXRpb24odik7CiAgdm9pY2Vbdl0ubW9kdWxhdGlv bl90YXJnZXQ9dm9pY2Vbdl0uc2FtcGxlLT5tb2R1bGF0aW9uX29mZnNldFtzdGFnZV07CiAgdm9p Y2Vbdl0ubW9kdWxhdGlvbl9pbmNyZW1lbnQgPSB2b2ljZVt2XS5zYW1wbGUtPm1vZHVsYXRpb25f cmF0ZVtzdGFnZV07CiAgaWYgKChpbnQpdm9pY2Vbdl0ubW9kdWxhdGlvbl90YXJnZXQ8dm9pY2Vb dl0ubW9kdWxhdGlvbl92b2x1bWUpCiAgICB2b2ljZVt2XS5tb2R1bGF0aW9uX2luY3JlbWVudCA9 IC12b2ljZVt2XS5tb2R1bGF0aW9uX2luY3JlbWVudDsKICByZXR1cm4gMDsKfQoKaW50IHVwZGF0 ZV9tb2R1bGF0aW9uKGludCB2KQp7CgogIGlmKHZvaWNlW3ZdLm1vZHVsYXRpb25fZGVsYXkgPiAw KQogIHsKICAgICAgLyogdm9pY2Vbdl0ubW9kdWxhdGlvbl9kZWxheSAtPSBjb250cm9sX3JhdGlv OyBJIHRoaW5rIHVuaXRzIGFyZSBhbHJlYWR5CgkgaW4gdGVybXMgb2YgY29udHJvbF9yYXRpbyAq LwogICAgICB2b2ljZVt2XS5tb2R1bGF0aW9uX2RlbGF5IC09IDE7CiAgICAgIGlmKHZvaWNlW3Zd Lm1vZHVsYXRpb25fZGVsYXkgPiAwKQoJICByZXR1cm4gMDsKICB9CgoKICB2b2ljZVt2XS5tb2R1 bGF0aW9uX3ZvbHVtZSArPSB2b2ljZVt2XS5tb2R1bGF0aW9uX2luY3JlbWVudDsKICBpZiAodm9p Y2Vbdl0ubW9kdWxhdGlvbl92b2x1bWUgPCAwKSB2b2ljZVt2XS5tb2R1bGF0aW9uX3ZvbHVtZSA9 IDA7CiAgLyogV2h5IGlzIHRoZXJlIG5vIF5eIG9wZXJhdG9yPz8gKi8KICBpZiAoKCh2b2ljZVt2 XS5tb2R1bGF0aW9uX2luY3JlbWVudCA8IDApICYmCiAgICAgICAodm9pY2Vbdl0ubW9kdWxhdGlv bl92b2x1bWUgPD0gKGludCl2b2ljZVt2XS5tb2R1bGF0aW9uX3RhcmdldCkpIHx8CiAgICAgICgo dm9pY2Vbdl0ubW9kdWxhdGlvbl9pbmNyZW1lbnQgPiAwKSAmJgoJICAgKHZvaWNlW3ZdLm1vZHVs YXRpb25fdm9sdW1lID49IChpbnQpdm9pY2Vbdl0ubW9kdWxhdGlvbl90YXJnZXQpKSkKICAgIHsK ICAgICAgdm9pY2Vbdl0ubW9kdWxhdGlvbl92b2x1bWUgPSB2b2ljZVt2XS5tb2R1bGF0aW9uX3Rh cmdldDsKICAgICAgaWYgKHJlY29tcHV0ZV9tb2R1bGF0aW9uKHYpKQoJcmV0dXJuIDE7CiAgICB9 CiAgcmV0dXJuIDA7Cn0KCi8qIFJldHVybnMgMSBpZiB0aGUgbm90ZSBkaWVkICovCmludCB1cGRh dGVfbW9kdWxhdGlvbl9zaWduYWwoaW50IHYpCnsKICBpZiAodm9pY2Vbdl0ubW9kdWxhdGlvbl9p bmNyZW1lbnQgJiYgdXBkYXRlX21vZHVsYXRpb24odikpCiAgICByZXR1cm4gMTsKICByZXR1cm4g MDsKfQoKCgovKiBtb2R1bGF0aW9uX3ZvbHVtZSBoYXMgYmVlbiBzZXQgYnkgYWJvdmUgcm91dGlu ZSAqLwppbnQzMiBjYWxjX21vZF9mcmVxKGludCB2LCBpbnQzMiBpbmNyKQp7CiAgRkxPQVRfVCBt b2RfYW1vdW50OwogIGludDMyIGZyZXE7CiAgLyogYWxyZWFkeSBkb25lIGluIHVwZGF0ZV92aWJy YXRvID8gKi8KICBpZiAodm9pY2Vbdl0udmlicmF0b19jb250cm9sX3JhdGlvKSByZXR1cm4gaW5j cjsKICBpZiAoKG1vZF9hbW91bnQ9dm9pY2Vbdl0uc2FtcGxlLT5tb2RFbnZUb1BpdGNoKTwwLjAy KSByZXR1cm4gaW5jcjsKICBpZiAoaW5jciA8IDApIHJldHVybiBpbmNyOwogIGZyZXEgPSB2b2lj ZVt2XS5mcmVxdWVuY3k7CiAgZnJlcSA9IChpbnQzMikoIChkb3VibGUpZnJlcSooMS4wICsgKG1v ZF9hbW91bnQgLSAxLjApICogKHZvaWNlW3ZdLm1vZHVsYXRpb25fdm9sdW1lPj4yMikgLyAyNTUu MCkgKTsKCiAgcmV0dXJuIChpbnQzMikgRlJTQ0FMRSgoKGRvdWJsZSkodm9pY2Vbdl0uc2FtcGxl LT5zYW1wbGVfcmF0ZSkgKgoJCSAgKGRvdWJsZSkoZnJlcSkpIC8KCQkgKChkb3VibGUpKHZvaWNl W3ZdLnNhbXBsZS0+cm9vdF9mcmVxKSAqCgkJICAoZG91YmxlKShwbGF5X21vZGUtPnJhdGUpKSwK CQkgRlJBQ1RJT05fQklUUyk7Cn0KCi8qKioqKioqKioqKioqKiogcmVzYW1wbGluZyB3aXRoIGZp eGVkIGluY3JlbWVudCAqKioqKioqKioqKioqKioqKi8KCnN0YXRpYyBzYW1wbGVfdCAqcnNfcGxh aW4oaW50IHYsIHVpbnQzMiAqY291bnRwdHIpCnsKICAvKiBQbGF5IHNhbXBsZSB1bnRpbCBlbmQs IHRoZW4gZnJlZSB0aGUgdm9pY2UuICovCiAgVm9pY2UKICAgICp2cD0mdm9pY2Vbdl07CiAgaW50 MzIgICBvZnNkLCB2MCwgdjEsIHYyLCB2MywgdGVtcCwgb3ZlcnNob290OwogIGludCBvZmZzZXQ7 CiAgdWludDMyIGNjX2NvdW50PXZwLT5tb2R1bGF0aW9uX2NvdW50ZXI7CiAgc2FtcGxlX3QKICAg ICpkZXN0PXJlc2FtcGxlX2J1ZmZlcityZXNhbXBsZV9idWZmZXJfb2Zmc2V0LAogICAgKnNyYz12 cC0+c2FtcGxlLT5kYXRhOwogIGludDMyCiAgICBpbmNyPXZwLT5zYW1wbGVfaW5jcmVtZW50Owog IHVpbnQzMgogICAgb2ZzPXZwLT5zYW1wbGVfb2Zmc2V0OwojaWYgZGVmaW5lZChMQUdSQU5HRV9J TlRFUlBPTEFUSU9OKSB8fCBkZWZpbmVkKENTUExJTkVfSU5URVJQT0xBVElPTikKICB1aW50MzIK ICAgIGxzPTAsCiAgICBsZT12cC0+c2FtcGxlLT5kYXRhX2xlbmd0aDsKI2VuZGlmIC8qIExBR1JB TkdFX0lOVEVSUE9MQVRJT04gKi8KICB1aW50MzIKICAgIHNlPXZwLT5zYW1wbGUtPmRhdGFfbGVu Z3RoOwogIHVpbnQzMgogICAgY291bnQ9KmNvdW50cHRyOwoKICBpZiAoIWluY3IpIHJldHVybiBy ZXNhbXBsZV9idWZmZXIrcmVzYW1wbGVfYnVmZmVyX29mZnNldDsgLyogLS1nbCAqLwoKICBvdmVy c2hvb3QgPSBzcmNbKHNlPj5GUkFDVElPTl9CSVRTKS0xXSAvIE9WRVJTSE9PVF9TVEVQOwogIGlm IChvdmVyc2hvb3QgPCAwKSBvdmVyc2hvb3QgPSAtb3ZlcnNob290OwoKICAgIHdoaWxlIChjb3Vu dC0tKQogICAgewoKCW9mZnNldCA9IG9mcyA+PiBGUkFDVElPTl9CSVRTOwoKCWlmIChvZnMgPj0g c2UpIHsKCQlpbnQzMiBkZWx0YSA9IChpbnQzMikoKG9mcyAtIHNlKT4+RlJBQ1RJT05fQklUUykg OwogICAgICAgIAl2MSA9IChpbnQzMilzcmNbKGludCkoc2U+PkZSQUNUSU9OX0JJVFMpLTFdOwoJ CXYxIC09ICAoZGVsdGErMSkgKiB2MSAvIG92ZXJzaG9vdDsKICAgICAgICB9ZWxzZSAgdjEgPSAo aW50MzIpc3JjW29mZnNldF07CglpZiAob2ZzICsgKDFMPDxGUkFDVElPTl9CSVRTKSA+PSBzZSkg ewoJCXYyID0gdjE7CiAgICAgICAgfWVsc2UgIHYyID0gKGludDMyKXNyY1tvZmZzZXQrMV07Cglp Zihkb250X2NzcGxpbmUgfHwKCSAgICgob2ZzLSgxTDw8RlJBQ1RJT05fQklUUykpPGxzKXx8KChv ZnMrKDJMPDxGUkFDVElPTl9CSVRTKSk+bGUpKXsKICAgICAgICAgICAgICAgICpkZXN0KysgPSAo c2FtcGxlX3QpKHYxICsgKChpbnQzMikoKHYyLXYxKSAqIChpbnQzMikob2ZzICYgRlJBQ1RJT05f TUFTSykpID4+IEZSQUNUSU9OX0JJVFMpKTsKCX1lbHNlewoJCW9mc2Q9b2ZzOwogICAgICAgICAg ICAgICAgdjAgPSAoaW50MzIpc3JjW29mZnNldC0xXTsKICAgICAgICAgICAgICAgIHYzID0gKGlu dDMyKXNyY1tvZmZzZXQrMl07CiAgICAgICAgICAgICAgICBvZnMgJj0gRlJBQ1RJT05fTUFTSzsK ICAgICAgICAgICAgICAgIHRlbXA9djI7CgkJdjIgPSAoNip2MiArCgkJICAgICAgKCgoKCAoICg1 KnYzIC0gMTEqdjIgKyA3KnYxIC0gdjApKgoJCSAgICAgICAoaW50MzIpb2ZzKSA+PkZSQUNUSU9O X0JJVFMpKihpbnQzMilvZnMpPj4oRlJBQ1RJT05fQklUUysyKSktMSkpKihpbnQzMilvZnM7CiAg ICAgICAgICAgICAgICBvZnMgPSAoMUwgPDwgRlJBQ1RJT05fQklUUykgLSBvZnM7CgkJdjEgPSAo Nip2MSArCgkJICAgICAgKCgoKCgoNSp2MCAtIDExKnYxICsgNyp0ZW1wIC0gdjMpKgoJCSAgICAg ICAoaW50MzIpb2ZzKT4+RlJBQ1RJT05fQklUUykqKGludDMyKW9mcyk+PihGUkFDVElPTl9CSVRT KzIpKS0xKSkqKGludDMyKW9mczsKCQl2MSA9ICh2MSArIHYyKS8oNkw8PEZSQUNUSU9OX0JJVFMp OwoJCSpkZXN0KysgPSAoc2FtcGxlX3QpKCh2MSA+IE1BWF9EQVRBVkFMKT8gTUFYX0RBVEFWQUw6 ICgodjEgPCBNSU5fREFUQVZBTCk/IE1JTl9EQVRBVkFMOiB2MSkpOwoJCW9mcz1vZnNkOwoJfQoJ CWlmICghY2NfY291bnQtLSkgewoJCSAgICBjY19jb3VudCA9IGNvbnRyb2xfcmF0aW8gLSAxOwoJ CSAgICBpZiAoIXVwZGF0ZV9tb2R1bGF0aW9uX3NpZ25hbCh2KSkKCQkgICAgICAgIGluY3IgPSBj YWxjX21vZF9mcmVxKHYsIGluY3IpOwoJCX0KICAgICAgb2ZzICs9IGluY3I7CiAgICAgIGlmIChv ZnMgPj0gc2UgKyAob3ZlcnNob290IDw8IEZSQUNUSU9OX0JJVFMpKQoJewoJICBpZiAoISh2cC0+ c3RhdHVzJlZPSUNFX0ZSRUUpKQoJICAgIHsKCSAgICAgIHZwLT5zdGF0dXM9Vk9JQ0VfRlJFRTsK IAkgICAgICBjdGwtPm5vdGUodik7CgkgICAgfQoJICAqY291bnRwdHItPWNvdW50KzE7CgkgIGJy ZWFrOwoJfQogICAgfQoKICB2cC0+c2FtcGxlX29mZnNldD1vZnM7IC8qIFVwZGF0ZSBvZmZzZXQg Ki8KICB2cC0+bW9kdWxhdGlvbl9jb3VudGVyPWNjX2NvdW50OwogIHJldHVybiByZXNhbXBsZV9i dWZmZXIrcmVzYW1wbGVfYnVmZmVyX29mZnNldDsKfQoKc3RhdGljIHNhbXBsZV90ICpyc19sb29w KGludCB2LCBWb2ljZSAqdnAsIHVpbnQzMiAqY291bnRwdHIpCnsKICAvKiBQbGF5IHNhbXBsZSB1 bnRpbCBlbmQtb2YtbG9vcCwgc2tpcCBiYWNrIGFuZCBjb250aW51ZS4gKi8KICBpbnQzMiAgIG9m c2QsIHYwLCB2MSwgdjIsIHYzLCB0ZW1wLCBvdmVyc2hvb3Q7CiAgaW50IG9mZnNldDsKICB1aW50 MzIgY2NfY291bnQ9dnAtPm1vZHVsYXRpb25fY291bnRlcjsKICBpbnQzMgogICAgaW5jcj12cC0+ c2FtcGxlX2luY3JlbWVudDsKICB1aW50MzIKICAgIG9mcz12cC0+c2FtcGxlX29mZnNldDsKICB1 aW50MzIKICAgIGxlPXZwLT5sb29wX2VuZCwKI2lmIGRlZmluZWQoTEFHUkFOR0VfSU5URVJQT0xB VElPTikgfHwgZGVmaW5lZChDU1BMSU5FX0lOVEVSUE9MQVRJT04pCiAgICBscz12cC0+bG9vcF9z dGFydCwKI2VuZGlmIC8qIExBR1JBTkdFX0lOVEVSUE9MQVRJT04gKi8KICAgIGxsPWxlIC0gdnAt Pmxvb3Bfc3RhcnQ7CiAgc2FtcGxlX3QKICAgICpkZXN0PXJlc2FtcGxlX2J1ZmZlcityZXNhbXBs ZV9idWZmZXJfb2Zmc2V0LAogICAgKnNyYz12cC0+c2FtcGxlLT5kYXRhOwogIHVpbnQzMgogICAg c2U9dnAtPnNhbXBsZS0+ZGF0YV9sZW5ndGgsCiAgICBjb3VudCA9ICpjb3VudHB0cjsKICBpbnQK ICAgIGZsYWdfZXhpdF9sb29wOwoKCiAgZmxhZ19leGl0X2xvb3AgPQoJKHZwLT5zdGF0dXMgJiAo Vk9JQ0VfRlJFRSB8IFZPSUNFX0RJRSkpIHx8CgkoKHZwLT5zdGF0dXMgJiBWT0lDRV9PRkYpICYm ICh2cC0+c2FtcGxlLT5tb2RlcyAmIE1PREVTX0ZBU1RfUkVMRUFTRSkgKSB8fAoJKCh2cC0+c3Rh dHVzICYgVk9JQ0VfT0ZGKSAmJiBkb250X2tlZXBfbG9vcGluZyApIDsKCiAgb3ZlcnNob290ID0g c3JjWyhzZT4+RlJBQ1RJT05fQklUUyktMV0gLyBPVkVSU0hPT1RfU1RFUDsKICBpZiAob3ZlcnNo b290IDwgMCkgb3ZlcnNob290ID0gLW92ZXJzaG9vdDsKCiAgd2hpbGUgKGNvdW50LS0pCiAgICB7 CgoJb2Zmc2V0ID0gb2ZzID4+IEZSQUNUSU9OX0JJVFM7CgoJaWYgKG9mcyA+PSBzZSkgewoJCWlu dDMyIGRlbHRhID0gKGludDMyKSgob2ZzIC0gc2UpPj5GUkFDVElPTl9CSVRTKSA7CiAgICAgICAg CXYxID0gKGludDMyKXNyY1soaW50KShzZT4+RlJBQ1RJT05fQklUUyktMV07CgkJdjEgLT0gIChk ZWx0YSsxKSAqIHYxIC8gb3ZlcnNob290OwogICAgICAgIH1lbHNlICB2MSA9IChpbnQzMilzcmNb b2Zmc2V0XTsKCWlmIChvZnMgKyAoMUw8PEZSQUNUSU9OX0JJVFMpID49IHNlKSB7CgkJdjIgPSB2 MTsKICAgICAgICB9ZWxzZSAgdjIgPSAoaW50MzIpc3JjW29mZnNldCsxXTsKCWlmKGRvbnRfY3Nw bGluZSB8fAoJICAgKChvZnMtKDFMPDxGUkFDVElPTl9CSVRTKSk8bHMpfHwoKG9mcysoMkw8PEZS QUNUSU9OX0JJVFMpKT5sZSkpewogICAgICAgICAgICAgICAgKmRlc3QrKyA9IChzYW1wbGVfdCko djEgKyAoKGludDMyKSgodjItdjEpICogKGludDMyKShvZnMgJiBGUkFDVElPTl9NQVNLKSkgPj4g RlJBQ1RJT05fQklUUykpOwoJfWVsc2V7CgkJb2ZzZD1vZnM7CiAgICAgICAgICAgICAgICB2MCA9 IChpbnQzMilzcmNbb2Zmc2V0LTFdOwogICAgICAgICAgICAgICAgdjMgPSAoaW50MzIpc3JjW29m ZnNldCsyXTsKICAgICAgICAgICAgICAgIG9mcyAmPSBGUkFDVElPTl9NQVNLOwogICAgICAgICAg ICAgICAgdGVtcD12MjsKCQl2MiA9ICg2KnYyICsKCQkgICAgICAoKCgoICggKDUqdjMgLSAxMSp2 MiArIDcqdjEgLSB2MCkqCgkJICAgICAgIChpbnQzMilvZnMpID4+RlJBQ1RJT05fQklUUykqKGlu dDMyKW9mcyk+PihGUkFDVElPTl9CSVRTKzIpKS0xKSkqKGludDMyKW9mczsKICAgICAgICAgICAg ICAgIG9mcyA9ICgxTCA8PCBGUkFDVElPTl9CSVRTKSAtIG9mczsKCQl2MSA9ICg2KnYxICsKCQkg ICAgICAoKCgoKCg1KnYwIC0gMTEqdjEgKyA3KnRlbXAgLSB2MykqCgkJICAgICAgIChpbnQzMilv ZnMpPj5GUkFDVElPTl9CSVRTKSooaW50MzIpb2ZzKT4+KEZSQUNUSU9OX0JJVFMrMikpLTEpKSoo aW50MzIpb2ZzOwoJCXYxID0gKHYxICsgdjIpLyg2TDw8RlJBQ1RJT05fQklUUyk7CgkJKmRlc3Qr KyA9IChzYW1wbGVfdCkoKHYxID4gTUFYX0RBVEFWQUwpPyBNQVhfREFUQVZBTDogKCh2MSA8IE1J Tl9EQVRBVkFMKT8gTUlOX0RBVEFWQUw6IHYxKSk7CgkJb2ZzPW9mc2Q7Cgl9CgkJaWYgKCFjY19j b3VudC0tKSB7CgkJICAgIGNjX2NvdW50ID0gY29udHJvbF9yYXRpbyAtIDE7CgkJICAgIGlmICgh dXBkYXRlX21vZHVsYXRpb25fc2lnbmFsKHYpKQoJCSAgICAgICAgaW5jciA9IGNhbGNfbW9kX2Zy ZXEodiwgaW5jcik7CgkJfQogICAgICBvZnMgKz0gaW5jcjsKICAgICAgaWYgKG9mcz49bGUpCgl7 CgkgIGlmIChmbGFnX2V4aXRfbG9vcCkKCSAgICB7CgkgICAgCXZwLT5lY2hvX2RlbGF5IC09IGxs ID4+IEZSQUNUSU9OX0JJVFM7CgkgIAlpZiAodnAtPmVjaG9fZGVsYXkgPj0gMCkgb2ZzIC09IGxs OwoJICAgIH0KCSAgZWxzZSBvZnMgLT0gbGw7IC8qIEhvcGVmdWxseSB0aGUgbG9vcCBpcyBsb25n ZXIgdGhhbiBhbiBpbmNyZW1lbnQuICovCgl9CiAgICAgIGlmIChvZnMgPj0gc2UgKyAob3ZlcnNo b290IDw8IEZSQUNUSU9OX0JJVFMpKQoJewoJICBpZiAoISh2cC0+c3RhdHVzJlZPSUNFX0ZSRUUp KQoJICAgIHsKCSAgICAgIHZwLT5zdGF0dXM9Vk9JQ0VfRlJFRTsKIAkgICAgICBjdGwtPm5vdGUo dik7CgkgICAgfQoJICAqY291bnRwdHItPWNvdW50KzE7CgkgIGJyZWFrOwoJfQogICAgfQoKICB2 cC0+c2FtcGxlX29mZnNldD1vZnM7IC8qIFVwZGF0ZSBvZmZzZXQgKi8KICB2cC0+bW9kdWxhdGlv bl9jb3VudGVyPWNjX2NvdW50OwogIHJldHVybiByZXNhbXBsZV9idWZmZXIrcmVzYW1wbGVfYnVm ZmVyX29mZnNldDsKfQoKc3RhdGljIHNhbXBsZV90ICpyc19iaWRpcihpbnQgdiwgVm9pY2UgKnZw LCB1aW50MzIgY291bnQpCnsKICBpbnQzMiAgIG9mc2QsIHYwLCB2MSwgdjIsIHYzLCB0ZW1wLCBv dmVyc2hvb3Q7CiAgaW50IG9mZnNldDsKICBpbnQzMgogICAgaW5jcj12cC0+c2FtcGxlX2luY3Jl bWVudDsKICB1aW50MzIKICAgIGxlPXZwLT5sb29wX2VuZCwKICAgIGxzPXZwLT5sb29wX3N0YXJ0 OwogIHVpbnQzMgogICAgb2ZzPXZwLT5zYW1wbGVfb2Zmc2V0LAogICAgc2U9dnAtPnNhbXBsZS0+ ZGF0YV9sZW5ndGg7CiAgc2FtcGxlX3QKICAgICpkZXN0PXJlc2FtcGxlX2J1ZmZlcityZXNhbXBs ZV9idWZmZXJfb2Zmc2V0LAogICAgKnNyYz12cC0+c2FtcGxlLT5kYXRhOwoKCiNpZmRlZiBVU0Vf QklESVJfT1ZFUlNIT09UCiAgaW50MzIKICAgIGxlMiA9IGxlPDwxLAogICAgbHMyID0gbHM8PDE7 CiNlbmRpZgogIHVpbnQzMgogICAgaSwgajsKICAvKiBQbGF5IG5vcm1hbGx5IHVudGlsIGluc2lk ZSB0aGUgbG9vcCByZWdpb24gKi8KCiAgb3ZlcnNob290ID0gc3JjWyhzZT4+RlJBQ1RJT05fQklU UyktMV0gLyBPVkVSU0hPT1RfU1RFUDsKICBpZiAob3ZlcnNob290IDwgMCkgb3ZlcnNob290ID0g LW92ZXJzaG9vdDsKCiAgaWYgKG9mcyA8PSBscykKICAgIHsKICAgICAgLyogTk9URTogQXNzdW1l cyB0aGF0IGluY3IgPiAwLCB3aGljaCBpcyBOT1QgYWx3YXlzIHRoZSBjYXNlCgkgd2hlbiBkb2lu ZyBiaWRpcmVjdGlvbmFsIGxvb3BpbmcuICBJIGhhdmUgeWV0IHRvIHNlZSBhIGNhc2UKCSB3aGVy ZSBib3RoIG9mcyA8PSBscyBBTkQgaW5jciA8IDAsIGhvd2V2ZXIuICovCiAgICAgIGlmIChpbmNy IDwgMCkgaSA9IGxzIC0gb2ZzOwoJZWxzZQogICAgICBpID0gKGxzIC0gb2ZzKSAvIGluY3IgKyAx OwogICAgICBpZiAoaSA+IGNvdW50KQoJewoJICBpID0gY291bnQ7CgkgIGNvdW50ID0gMDsKCX0K ICAgICAgZWxzZSBjb3VudCAtPSBpOwogICAgICBmb3IoaiA9IDA7IGogPCBpOyBqKyspCgl7CgoJ b2Zmc2V0ID0gb2ZzID4+IEZSQUNUSU9OX0JJVFM7CgoJaWYgKG9mcyA+PSBzZSkgewoJCWludDMy IGRlbHRhID0gKGludDMyKSgob2ZzIC0gc2UpPj5GUkFDVElPTl9CSVRTKSA7CiAgICAgICAgCXYx ID0gKGludDMyKXNyY1soaW50KShzZT4+RlJBQ1RJT05fQklUUyktMV07CgkJdjEgLT0gIChkZWx0 YSsxKSAqIHYxIC8gb3ZlcnNob290OwogICAgICAgIH1lbHNlICB2MSA9IChpbnQzMilzcmNbb2Zm c2V0XTsKCWlmIChvZnMgKyAoMUw8PEZSQUNUSU9OX0JJVFMpID49IHNlKSB7CgkJdjIgPSB2MTsK ICAgICAgICB9ZWxzZSAgdjIgPSAoaW50MzIpc3JjW29mZnNldCsxXTsKCWlmKGRvbnRfY3NwbGlu ZSB8fAoJICAgKChvZnMtKDFMPDxGUkFDVElPTl9CSVRTKSk8bHMpfHwoKG9mcysoMkw8PEZSQUNU SU9OX0JJVFMpKT5sZSkpewogICAgICAgICAgICAgICAgKmRlc3QrKyA9IChzYW1wbGVfdCkodjEg KyAoKGludDMyKSgodjItdjEpICogKGludDMyKShvZnMgJiBGUkFDVElPTl9NQVNLKSkgPj4gRlJB Q1RJT05fQklUUykpOwoJfWVsc2V7CgkJb2ZzZD1vZnM7CiAgICAgICAgICAgICAgICB2MCA9IChp bnQzMilzcmNbb2Zmc2V0LTFdOwogICAgICAgICAgICAgICAgdjMgPSAoaW50MzIpc3JjW29mZnNl dCsyXTsKICAgICAgICAgICAgICAgIG9mcyAmPSBGUkFDVElPTl9NQVNLOwogICAgICAgICAgICAg ICAgdGVtcD12MjsKCQl2MiA9ICg2KnYyICsKCQkgICAgICAoKCgoICggKDUqdjMgLSAxMSp2MiAr IDcqdjEgLSB2MCkqCgkJICAgICAgIChpbnQzMilvZnMpID4+RlJBQ1RJT05fQklUUykqKGludDMy KW9mcyk+PihGUkFDVElPTl9CSVRTKzIpKS0xKSkqKGludDMyKW9mczsKICAgICAgICAgICAgICAg IG9mcyA9ICgxTCA8PCBGUkFDVElPTl9CSVRTKSAtIG9mczsKCQl2MSA9ICg2KnYxICsKCQkgICAg ICAoKCgoKCg1KnYwIC0gMTEqdjEgKyA3KnRlbXAgLSB2MykqCgkJICAgICAgIChpbnQzMilvZnMp Pj5GUkFDVElPTl9CSVRTKSooaW50MzIpb2ZzKT4+KEZSQUNUSU9OX0JJVFMrMikpLTEpKSooaW50 MzIpb2ZzOwoJCXYxID0gKHYxICsgdjIpLyg2TDw8RlJBQ1RJT05fQklUUyk7CgkJKmRlc3QrKyA9 IChzYW1wbGVfdCkoKHYxID4gTUFYX0RBVEFWQUwpPyBNQVhfREFUQVZBTDogKCh2MSA8IE1JTl9E QVRBVkFMKT8gTUlOX0RBVEFWQUw6IHYxKSk7CgkJb2ZzPW9mc2Q7Cgl9CgkgIG9mcyArPSBpbmNy OwoJfQogICAgfQoKICAvKiBUaGVuIGRvIHRoZSBiaWRpcmVjdGlvbmFsIGxvb3BpbmcgKi8KCiAg d2hpbGUoY291bnQpCiAgICB7CiAgICAgIC8qIFByZWNhbGMgaG93IG1hbnkgdGltZXMgd2Ugc2hv dWxkIGdvIHRocm91Z2ggdGhlIGxvb3AgKi8KI2lmIDEKICAgICAgaSA9ICgoaW5jciA+IDAgPyBs ZSA6IGxzKSAtIG9mcykgLyBpbmNyICsgMTsKI2Vsc2UKLyogZml4IGZyb20gTS4gSXp1bW8gKi8K ICAgICAgaSA9ICgoaW5jciA+IDAgPyBsZSA6IGxzKSAtIG9mcyArIGluY3IgLSAxKSAvIGluY3I7 CiNlbmRpZgogICAgICBpZiAoaSA+IGNvdW50KQoJewoJICBpID0gY291bnQ7CgkgIGNvdW50ID0g MDsKCX0KICAgICAgZWxzZSBjb3VudCAtPSBpOwogICAgICBmb3IoaiA9IDA7IGogPCBpICYmIG9m cyA8IHNlOyBqKyspCgl7CgoJb2Zmc2V0ID0gb2ZzID4+IEZSQUNUSU9OX0JJVFM7CgoJaWYgKG9m cyA+PSBzZSkgewoJCWludDMyIGRlbHRhID0gKGludDMyKSgob2ZzIC0gc2UpPj5GUkFDVElPTl9C SVRTKSA7CiAgICAgICAgCXYxID0gKGludDMyKXNyY1soaW50KShzZT4+RlJBQ1RJT05fQklUUykt MV07CgkJdjEgLT0gIChkZWx0YSsxKSAqIHYxIC8gb3ZlcnNob290OwogICAgICAgIH1lbHNlICB2 MSA9IChpbnQzMilzcmNbb2Zmc2V0XTsKCWlmIChvZnMgKyAoMUw8PEZSQUNUSU9OX0JJVFMpID49 IHNlKSB7CgkJdjIgPSB2MTsKICAgICAgICB9ZWxzZSAgdjIgPSAoaW50MzIpc3JjW29mZnNldCsx XTsKCWlmKGRvbnRfY3NwbGluZSB8fAoJICAgKChvZnMtKDFMPDxGUkFDVElPTl9CSVRTKSk8bHMp fHwoKG9mcysoMkw8PEZSQUNUSU9OX0JJVFMpKT5sZSkpewogICAgICAgICAgICAgICAgKmRlc3Qr KyA9IChzYW1wbGVfdCkodjEgKyAoKGludDMyKSgodjItdjEpICogKGludDMyKShvZnMgJiBGUkFD VElPTl9NQVNLKSkgPj4gRlJBQ1RJT05fQklUUykpOwoJfWVsc2V7CgkJb2ZzZD1vZnM7CiAgICAg ICAgICAgICAgICB2MCA9IChpbnQzMilzcmNbb2Zmc2V0LTFdOwogICAgICAgICAgICAgICAgdjMg PSAoaW50MzIpc3JjW29mZnNldCsyXTsKICAgICAgICAgICAgICAgIG9mcyAmPSBGUkFDVElPTl9N QVNLOwogICAgICAgICAgICAgICAgdGVtcD12MjsKCQl2MiA9ICg2KnYyICsKCQkgICAgICAoKCgo ICggKDUqdjMgLSAxMSp2MiArIDcqdjEgLSB2MCkqCgkJICAgICAgIChpbnQzMilvZnMpID4+RlJB Q1RJT05fQklUUykqKGludDMyKW9mcyk+PihGUkFDVElPTl9CSVRTKzIpKS0xKSkqKGludDMyKW9m czsKICAgICAgICAgICAgICAgIG9mcyA9ICgxTCA8PCBGUkFDVElPTl9CSVRTKSAtIG9mczsKCQl2 MSA9ICg2KnYxICsKCQkgICAgICAoKCgoKCg1KnYwIC0gMTEqdjEgKyA3KnRlbXAgLSB2MykqCgkJ ICAgICAgIChpbnQzMilvZnMpPj5GUkFDVElPTl9CSVRTKSooaW50MzIpb2ZzKT4+KEZSQUNUSU9O X0JJVFMrMikpLTEpKSooaW50MzIpb2ZzOwoJCXYxID0gKHYxICsgdjIpLyg2TDw8RlJBQ1RJT05f QklUUyk7CgkJKmRlc3QrKyA9IChzYW1wbGVfdCkoKHYxID4gTUFYX0RBVEFWQUwpPyBNQVhfREFU QVZBTDogKCh2MSA8IE1JTl9EQVRBVkFMKT8gTUlOX0RBVEFWQUw6IHYxKSk7CgkJb2ZzPW9mc2Q7 Cgl9CgkgIG9mcyArPSBpbmNyOwoJfQojaWZkZWYgVVNFX0JJRElSX09WRVJTSE9PVAogICAgICBp ZiAob2ZzPj1sZSkKCXsKCSAgLyogZm9sZCB0aGUgb3ZlcnNob290IGJhY2sgaW4gKi8KCSAgb2Zz ID0gbGUyIC0gb2ZzOwoJICBpbmNyICo9IC0xOwoJfQogICAgICBlbHNlIGlmIChvZnMgPD0gbHMp Cgl7CgkgIG9mcyA9IGxzMiAtIG9mczsKCSAgaW5jciAqPSAtMTsKCX0KI2Vsc2UKCSAgaW5jciAq PSAtMTsKI2VuZGlmCiAgICB9CgogIHZwLT5zYW1wbGVfaW5jcmVtZW50PWluY3I7CiAgdnAtPnNh bXBsZV9vZmZzZXQ9b2ZzOyAvKiBVcGRhdGUgb2Zmc2V0ICovCiAgcmV0dXJuIHJlc2FtcGxlX2J1 ZmZlcityZXNhbXBsZV9idWZmZXJfb2Zmc2V0Owp9CgovKioqKioqKioqKioqKioqKioqKioqKiog dmlicmF0byB2ZXJzaW9ucyAqKioqKioqKioqKioqKioqKioqKioqKioqKiovCgovKiBXZSBvbmx5 IG5lZWQgdG8gY29tcHV0ZSBvbmUgaGFsZiBvZiB0aGUgdmlicmF0byBzaW5lIGN5Y2xlICovCnN0 YXRpYyB1aW50MzIgdmliX3BoYXNlX3RvX2luY19wdHIodWludDMyIHBoYXNlKQp7CiAgaWYgKHBo YXNlIDwgVklCUkFUT19TQU1QTEVfSU5DUkVNRU5UUy8yKQogICAgcmV0dXJuIFZJQlJBVE9fU0FN UExFX0lOQ1JFTUVOVFMvMi0xLXBoYXNlOwogIGVsc2UgaWYgKHBoYXNlID49IDMqVklCUkFUT19T QU1QTEVfSU5DUkVNRU5UUy8yKQogICAgcmV0dXJuIDUqVklCUkFUT19TQU1QTEVfSU5DUkVNRU5U Uy8yLTEtcGhhc2U7CiAgZWxzZQogICAgcmV0dXJuIHBoYXNlLVZJQlJBVE9fU0FNUExFX0lOQ1JF TUVOVFMvMjsKfQoKc3RhdGljIGludDMyIHVwZGF0ZV92aWJyYXRvKFZvaWNlICp2cCwgaW50IHNp Z24pCnsKICB1aW50MzIgZGVwdGgsIGZyZXE9dnAtPmZyZXF1ZW5jeTsKI2lmZGVmIEVOVkVMT1BF X1BJVENIX01PRFVMQVRJT04KICBGTE9BVF9UIG1vZF9hbW91bnQ9dnAtPnNhbXBsZS0+bW9kRW52 VG9QaXRjaDsKI2VuZGlmCiAgdWludDMyIHBoYXNlOwogIGludCBwYjsKICBkb3VibGUgYTsKCiAg aWYodnAtPnZpYnJhdG9fZGVsYXkgPiAwKQogIHsKICAgICAgdnAtPnZpYnJhdG9fZGVsYXkgLT0g dnAtPnZpYnJhdG9fY29udHJvbF9yYXRpbzsKICAgICAgaWYodnAtPnZpYnJhdG9fZGVsYXkgPiAw KQoJICByZXR1cm4gdnAtPnNhbXBsZV9pbmNyZW1lbnQ7CiAgfQoKICBpZiAodnAtPnZpYnJhdG9f cGhhc2UrKyA+PSAyKlZJQlJBVE9fU0FNUExFX0lOQ1JFTUVOVFMtMSkKICAgIHZwLT52aWJyYXRv X3BoYXNlPTA7CiAgcGhhc2U9dmliX3BoYXNlX3RvX2luY19wdHIodnAtPnZpYnJhdG9fcGhhc2Up OwoKICBpZiAodnAtPnZpYnJhdG9fc2FtcGxlX2luY3JlbWVudFtwaGFzZV0pCiAgICB7CiAgICAg IGlmIChzaWduKQoJcmV0dXJuIC12cC0+dmlicmF0b19zYW1wbGVfaW5jcmVtZW50W3BoYXNlXTsK ICAgICAgZWxzZQoJcmV0dXJuIHZwLT52aWJyYXRvX3NhbXBsZV9pbmNyZW1lbnRbcGhhc2VdOwog ICAgfQoKICAvKiBOZWVkIHRvIGNvbXB1dGUgdGhpcyBzYW1wbGUgaW5jcmVtZW50LiAqLwoKICBk ZXB0aCA9IHZwLT52aWJyYXRvX2RlcHRoOwogIGlmKGRlcHRoIDwgdnAtPm1vZHVsYXRpb25fd2hl ZWwpCiAgICAgIGRlcHRoID0gdnAtPm1vZHVsYXRpb25fd2hlZWw7CiAgZGVwdGggPDw9IDc7Cgog IGlmICh2cC0+dmlicmF0b19zd2VlcCAmJiAhdnAtPm1vZHVsYXRpb25fd2hlZWwpCiAgICB7CiAg ICAgIC8qIE5lZWQgdG8gdXBkYXRlIHN3ZWVwICovCiAgICAgIHZwLT52aWJyYXRvX3N3ZWVwX3Bv c2l0aW9uICs9IHZwLT52aWJyYXRvX3N3ZWVwOwogICAgICBpZiAodnAtPnZpYnJhdG9fc3dlZXBf cG9zaXRpb24gPj0gKDE8PFNXRUVQX1NISUZUKSkKCXZwLT52aWJyYXRvX3N3ZWVwPTA7CiAgICAg IGVsc2UKCXsKCSAgLyogQWRqdXN0IGRlcHRoICovCgkgIGRlcHRoICo9IHZwLT52aWJyYXRvX3N3 ZWVwX3Bvc2l0aW9uOwoJICBkZXB0aCA+Pj0gU1dFRVBfU0hJRlQ7Cgl9CiAgICB9CgojaWZkZWYg RU5WRUxPUEVfUElUQ0hfTU9EVUxBVElPTgojaWZuZGVmIEZJTFRFUl9JTlRFUlBPTEFUSU9OCiAg aWYgKHVwZGF0ZV9tb2R1bGF0aW9uX3NpZ25hbCgwKSkgbW9kX2Ftb3VudCA9IDA7CiAgZWxzZQoj ZW5kaWYKICBpZiAobW9kX2Ftb3VudD4wLjAyKQogICBmcmVxID0gKGludDMyKSggKGRvdWJsZSlm cmVxKigxLjAgKyAobW9kX2Ftb3VudCAtIDEuMCkgKiAodnAtPm1vZHVsYXRpb25fdm9sdW1lPj4y MikgLyAyNTUuMCkgKTsKI2VuZGlmCgogIHBiPShpbnQpKChzaW5lKHZwLT52aWJyYXRvX3BoYXNl ICoKCQkJKFNJTkVfQ1lDTEVfTEVOR1RILygyKlZJQlJBVE9fU0FNUExFX0lOQ1JFTUVOVFMpKSkK CSAgICAqIChkb3VibGUpKGRlcHRoKSAqIFZJQlJBVE9fQU1QTElUVURFX1RVTklORykpOwoKICBh ID0gRlJTQ0FMRSgoKGRvdWJsZSkodnAtPnNhbXBsZS0+c2FtcGxlX3JhdGUpICoKCQkgIChkb3Vi bGUpKGZyZXEpKSAvCgkJICgoZG91YmxlKSh2cC0+c2FtcGxlLT5yb290X2ZyZXEpICoKCQkgIChk b3VibGUpKHBsYXlfbW9kZS0+cmF0ZSkpLAoJCSBGUkFDVElPTl9CSVRTKTsKICBpZihwYjwwKQog IHsKICAgICAgcGIgPSAtcGI7CiAgICAgIGEgLz0gYmVuZF9maW5lWyhwYj4+NSkgJiAweEZGXSAq IGJlbmRfY29hcnNlW3BiPj4xM107CiAgfQogIGVsc2UKICAgICAgYSAqPSBiZW5kX2ZpbmVbKHBi Pj41KSAmIDB4RkZdICogYmVuZF9jb2Fyc2VbcGI+PjEzXTsKICBhICs9IDAuNTsKCiAgLyogSWYg dGhlIHN3ZWVwJ3Mgb3Zlciwgd2UgY2FuIHN0b3JlIHRoZSBuZXdseSBjb21wdXRlZCBzYW1wbGVf aW5jcmVtZW50ICovCiAgaWYgKCF2cC0+dmlicmF0b19zd2VlcCB8fCB2cC0+bW9kdWxhdGlvbl93 aGVlbCkKICAgIHZwLT52aWJyYXRvX3NhbXBsZV9pbmNyZW1lbnRbcGhhc2VdPShpbnQzMikgYTsK CiAgaWYgKHNpZ24pCiAgICBhID0gLWE7IC8qIG5lZWQgdG8gcHJlc2VydmUgdGhlIGxvb3AgZGly ZWN0aW9uICovCgogIHJldHVybiAoaW50MzIpIGE7Cn0KCnN0YXRpYyBzYW1wbGVfdCAqcnNfdmli X3BsYWluKGludCB2LCB1aW50MzIgKmNvdW50cHRyKQp7CgogIC8qIFBsYXkgc2FtcGxlIHVudGls IGVuZCwgdGhlbiBmcmVlIHRoZSB2b2ljZS4gKi8KCiAgVm9pY2UgKnZwPSZ2b2ljZVt2XTsKICBp bnQzMiAgIG9mc2QsIHYwLCB2MSwgdjIsIHYzLCB0ZW1wLCBvdmVyc2hvb3Q7CiAgaW50IG9mZnNl dDsKICBzYW1wbGVfdAogICAgKmRlc3Q9cmVzYW1wbGVfYnVmZmVyK3Jlc2FtcGxlX2J1ZmZlcl9v ZmZzZXQsCiAgICAqc3JjPXZwLT5zYW1wbGUtPmRhdGE7CiAgaW50MzIKICAgIGluY3I9dnAtPnNh bXBsZV9pbmNyZW1lbnQ7Ci8qV0hZIGludDMyPz8qLwojaWYgZGVmaW5lZChMQUdSQU5HRV9JTlRF UlBPTEFUSU9OKSB8fCBkZWZpbmVkKENTUExJTkVfSU5URVJQT0xBVElPTikKICB1aW50MzIKICAg IGxzPTAsCiAgICBsZT12cC0+c2FtcGxlLT5kYXRhX2xlbmd0aDsKI2VuZGlmIC8qIExBR1JBTkdF X0lOVEVSUE9MQVRJT04gKi8KICB1aW50MzIKICAgIG9mcz12cC0+c2FtcGxlX29mZnNldCwKICAg IHNlPXZwLT5zYW1wbGUtPmRhdGFfbGVuZ3RoLAogICAgY291bnQ9KmNvdW50cHRyOwogIHVpbnQz MgogICAgY2M9dnAtPnZpYnJhdG9fY29udHJvbF9jb3VudGVyOwoKICAvKiBUaGlzIGhhcyBuZXZl ciBiZWVuIHRlc3RlZCAqLwoKICBpZiAoaW5jcjwwKSBpbmNyID0gLWluY3I7IC8qIEluIGNhc2Ug d2UncmUgY29taW5nIG91dCBvZiBhIGJpZGlyIGxvb3AgKi8KCiAgb3ZlcnNob290ID0gc3JjWyhz ZT4+RlJBQ1RJT05fQklUUyktMV0gLyBPVkVSU0hPT1RfU1RFUDsKICBpZiAob3ZlcnNob290IDwg MCkgb3ZlcnNob290ID0gLW92ZXJzaG9vdDsKICB3aGlsZSAoY291bnQtLSkKICAgIHsKICAgICAg aWYgKCFjYy0tKQoJewoJICBjYz12cC0+dmlicmF0b19jb250cm9sX3JhdGlvOwoJICBpbmNyPXVw ZGF0ZV92aWJyYXRvKHZwLCAwKTsKCX0KCglvZmZzZXQgPSBvZnMgPj4gRlJBQ1RJT05fQklUUzsK CglpZiAob2ZzID49IHNlKSB7CgkJaW50MzIgZGVsdGEgPSAoaW50MzIpKChvZnMgLSBzZSk+PkZS QUNUSU9OX0JJVFMpIDsKICAgICAgICAJdjEgPSAoaW50MzIpc3JjWyhpbnQpKHNlPj5GUkFDVElP Tl9CSVRTKS0xXTsKCQl2MSAtPSAgKGRlbHRhKzEpICogdjEgLyBvdmVyc2hvb3Q7CiAgICAgICAg fWVsc2UgIHYxID0gKGludDMyKXNyY1tvZmZzZXRdOwoJaWYgKG9mcyArICgxTDw8RlJBQ1RJT05f QklUUykgPj0gc2UpIHsKCQl2MiA9IHYxOwogICAgICAgIH1lbHNlICB2MiA9IChpbnQzMilzcmNb b2Zmc2V0KzFdOwoJaWYoZG9udF9jc3BsaW5lIHx8CgkgICAoKG9mcy0oMUw8PEZSQUNUSU9OX0JJ VFMpKTxscyl8fCgob2ZzKygyTDw8RlJBQ1RJT05fQklUUykpPmxlKSl7CiAgICAgICAgICAgICAg ICAqZGVzdCsrID0gKHNhbXBsZV90KSh2MSArICgoaW50MzIpKCh2Mi12MSkgKiAoaW50MzIpKG9m cyAmIEZSQUNUSU9OX01BU0spKSA+PiBGUkFDVElPTl9CSVRTKSk7Cgl9ZWxzZXsKCQlvZnNkPW9m czsKICAgICAgICAgICAgICAgIHYwID0gKGludDMyKXNyY1tvZmZzZXQtMV07CiAgICAgICAgICAg ICAgICB2MyA9IChpbnQzMilzcmNbb2Zmc2V0KzJdOwogICAgICAgICAgICAgICAgb2ZzICY9IEZS QUNUSU9OX01BU0s7CiAgICAgICAgICAgICAgICB0ZW1wPXYyOwoJCXYyID0gKDYqdjIgKwoJCSAg ICAgICgoKCggKCAoNSp2MyAtIDExKnYyICsgNyp2MSAtIHYwKSoKCQkgICAgICAgKGludDMyKW9m cykgPj5GUkFDVElPTl9CSVRTKSooaW50MzIpb2ZzKT4+KEZSQUNUSU9OX0JJVFMrMikpLTEpKSoo aW50MzIpb2ZzOwogICAgICAgICAgICAgICAgb2ZzID0gKDFMIDw8IEZSQUNUSU9OX0JJVFMpIC0g b2ZzOwoJCXYxID0gKDYqdjEgKwoJCSAgICAgICgoKCgoKDUqdjAgLSAxMSp2MSArIDcqdGVtcCAt IHYzKSoKCQkgICAgICAgKGludDMyKW9mcyk+PkZSQUNUSU9OX0JJVFMpKihpbnQzMilvZnMpPj4o RlJBQ1RJT05fQklUUysyKSktMSkpKihpbnQzMilvZnM7CgkJdjEgPSAodjEgKyB2MikvKDZMPDxG UkFDVElPTl9CSVRTKTsKCQkqZGVzdCsrID0gKHNhbXBsZV90KSgodjEgPiBNQVhfREFUQVZBTCk/ IE1BWF9EQVRBVkFMOiAoKHYxIDwgTUlOX0RBVEFWQUwpPyBNSU5fREFUQVZBTDogdjEpKTsKCQlv ZnM9b2ZzZDsKCX0KICAgICAgb2ZzICs9IGluY3I7CiAgICAgIGlmIChvZnMgPj0gc2UgKyAob3Zl cnNob290IDw8IEZSQUNUSU9OX0JJVFMpKQoJewoJICBpZiAoISh2cC0+c3RhdHVzJlZPSUNFX0ZS RUUpKQoJICAgIHsKCSAgICAgIHZwLT5zdGF0dXM9Vk9JQ0VfRlJFRTsKIAkgICAgICBjdGwtPm5v dGUodik7CgkgICAgfQoJICAqY291bnRwdHItPWNvdW50KzE7CgkgIGJyZWFrOwoJfQogICAgfQoK ICB2cC0+dmlicmF0b19jb250cm9sX2NvdW50ZXI9Y2M7CiAgdnAtPnNhbXBsZV9pbmNyZW1lbnQ9 aW5jcjsKICB2cC0+c2FtcGxlX29mZnNldD1vZnM7IC8qIFVwZGF0ZSBvZmZzZXQgKi8KICByZXR1 cm4gcmVzYW1wbGVfYnVmZmVyK3Jlc2FtcGxlX2J1ZmZlcl9vZmZzZXQ7Cn0KCnN0YXRpYyBzYW1w bGVfdCAqcnNfdmliX2xvb3AoaW50IHYsIFZvaWNlICp2cCwgdWludDMyICpjb3VudHB0cikKewog IC8qIFBsYXkgc2FtcGxlIHVudGlsIGVuZC1vZi1sb29wLCBza2lwIGJhY2sgYW5kIGNvbnRpbnVl LiAqLwogIGludDMyICAgb2ZzZCwgdjAsIHYxLCB2MiwgdjMsIHRlbXAsIG92ZXJzaG9vdDsKICBp bnQgb2Zmc2V0OwogIGludDMyCiAgICBpbmNyPXZwLT5zYW1wbGVfaW5jcmVtZW50OwovKldIWSBp bnQzMj8/Ki8KICB1aW50MzIKI2lmIGRlZmluZWQoTEFHUkFOR0VfSU5URVJQT0xBVElPTikgfHwg ZGVmaW5lZChDU1BMSU5FX0lOVEVSUE9MQVRJT04pCiAgICBscz12cC0+bG9vcF9zdGFydCwKI2Vu ZGlmIC8qIExBR1JBTkdFX0lOVEVSUE9MQVRJT04gKi8KICAgIGxlPXZwLT5sb29wX2VuZCwKICAg IGxsPWxlIC0gdnAtPmxvb3Bfc3RhcnQ7CiAgc2FtcGxlX3QKICAgICpkZXN0PXJlc2FtcGxlX2J1 ZmZlcityZXNhbXBsZV9idWZmZXJfb2Zmc2V0LAogICAgKnNyYz12cC0+c2FtcGxlLT5kYXRhOwog IHVpbnQzMgogICAgb2ZzPXZwLT5zYW1wbGVfb2Zmc2V0LAogICAgc2U9dnAtPnNhbXBsZS0+ZGF0 YV9sZW5ndGgsCiAgICBjb3VudCA9ICpjb3VudHB0cjsKICB1aW50MzIKICAgIGNjPXZwLT52aWJy YXRvX2NvbnRyb2xfY291bnRlcjsKICBpbnQKICAgIGZsYWdfZXhpdF9sb29wOwoKCiAgZmxhZ19l eGl0X2xvb3AgPQoJKHZwLT5zdGF0dXMgJiAoVk9JQ0VfRlJFRSB8IFZPSUNFX0RJRSkpIHx8Cgko KHZwLT5zdGF0dXMgJiBWT0lDRV9PRkYpICYmICh2cC0+c2FtcGxlLT5tb2RlcyAmIE1PREVTX0ZB U1RfUkVMRUFTRSkgKSB8fAoJKCh2cC0+c3RhdHVzICYgVk9JQ0VfT0ZGKSAmJiBkb250X2tlZXBf bG9vcGluZyApIDsKCiAgb3ZlcnNob290ID0gc3JjWyhzZT4+RlJBQ1RJT05fQklUUyktMV0gLyBP VkVSU0hPT1RfU1RFUDsKICBpZiAob3ZlcnNob290IDwgMCkgb3ZlcnNob290ID0gLW92ZXJzaG9v dDsKICB3aGlsZSAoY291bnQtLSkKICAgIHsKICAgICAgaWYgKCFjYy0tKQoJewoJICBjYz12cC0+ dmlicmF0b19jb250cm9sX3JhdGlvOwoJICBpbmNyPXVwZGF0ZV92aWJyYXRvKHZwLCAwKTsKCX0K CglvZmZzZXQgPSBvZnMgPj4gRlJBQ1RJT05fQklUUzsKCglpZiAob2ZzID49IHNlKSB7CgkJaW50 MzIgZGVsdGEgPSAoaW50MzIpKChvZnMgLSBzZSk+PkZSQUNUSU9OX0JJVFMpIDsKICAgICAgICAJ djEgPSAoaW50MzIpc3JjWyhpbnQpKHNlPj5GUkFDVElPTl9CSVRTKS0xXTsKCQl2MSAtPSAgKGRl bHRhKzEpICogdjEgLyBvdmVyc2hvb3Q7CiAgICAgICAgfWVsc2UgIHYxID0gKGludDMyKXNyY1tv ZmZzZXRdOwoJaWYgKG9mcyArICgxTDw8RlJBQ1RJT05fQklUUykgPj0gc2UpIHsKCQl2MiA9IHYx OwogICAgICAgIH1lbHNlICB2MiA9IChpbnQzMilzcmNbb2Zmc2V0KzFdOwoJaWYoZG9udF9jc3Bs aW5lIHx8CgkgICAoKG9mcy0oMUw8PEZSQUNUSU9OX0JJVFMpKTxscyl8fCgob2ZzKygyTDw8RlJB Q1RJT05fQklUUykpPmxlKSl7CiAgICAgICAgICAgICAgICAqZGVzdCsrID0gKHNhbXBsZV90KSh2 MSArICgoaW50MzIpKCh2Mi12MSkgKiAoaW50MzIpKG9mcyAmIEZSQUNUSU9OX01BU0spKSA+PiBG UkFDVElPTl9CSVRTKSk7Cgl9ZWxzZXsKCQlvZnNkPW9mczsKICAgICAgICAgICAgICAgIHYwID0g KGludDMyKXNyY1tvZmZzZXQtMV07CiAgICAgICAgICAgICAgICB2MyA9IChpbnQzMilzcmNbb2Zm c2V0KzJdOwogICAgICAgICAgICAgICAgb2ZzICY9IEZSQUNUSU9OX01BU0s7CiAgICAgICAgICAg ICAgICB0ZW1wPXYyOwoJCXYyID0gKDYqdjIgKwoJCSAgICAgICgoKCggKCAoNSp2MyAtIDExKnYy ICsgNyp2MSAtIHYwKSoKCQkgICAgICAgKGludDMyKW9mcykgPj5GUkFDVElPTl9CSVRTKSooaW50 MzIpb2ZzKT4+KEZSQUNUSU9OX0JJVFMrMikpLTEpKSooaW50MzIpb2ZzOwogICAgICAgICAgICAg ICAgb2ZzID0gKDFMIDw8IEZSQUNUSU9OX0JJVFMpIC0gb2ZzOwoJCXYxID0gKDYqdjEgKwoJCSAg ICAgICgoKCgoKDUqdjAgLSAxMSp2MSArIDcqdGVtcCAtIHYzKSoKCQkgICAgICAgKGludDMyKW9m cyk+PkZSQUNUSU9OX0JJVFMpKihpbnQzMilvZnMpPj4oRlJBQ1RJT05fQklUUysyKSktMSkpKihp bnQzMilvZnM7CgkJdjEgPSAodjEgKyB2MikvKDZMPDxGUkFDVElPTl9CSVRTKTsKCQkqZGVzdCsr ID0gKHNhbXBsZV90KSgodjEgPiBNQVhfREFUQVZBTCk/IE1BWF9EQVRBVkFMOiAoKHYxIDwgTUlO X0RBVEFWQUwpPyBNSU5fREFUQVZBTDogdjEpKTsKCQlvZnM9b2ZzZDsKCX0KICAgICAgb2ZzICs9 IGluY3I7CiAgICAgIGlmIChvZnM+PWxlKQoJewoJICBpZiAoZmxhZ19leGl0X2xvb3ApCgkgICAg ewoJICAgIAl2cC0+ZWNob19kZWxheSAtPSBsbCA+PiBGUkFDVElPTl9CSVRTOwoJICAJaWYgKHZw LT5lY2hvX2RlbGF5ID49IDApIG9mcyAtPSBsbDsKCSAgICB9CgkgIGVsc2Ugb2ZzIC09IGxsOyAv KiBIb3BlZnVsbHkgdGhlIGxvb3AgaXMgbG9uZ2VyIHRoYW4gYW4gaW5jcmVtZW50LiAqLwoJfQog ICAgICBpZiAob2ZzID49IHNlICsgKG92ZXJzaG9vdCA8PCBGUkFDVElPTl9CSVRTKSkKCXsKCSAg aWYgKCEodnAtPnN0YXR1cyZWT0lDRV9GUkVFKSkKCSAgICB7CgkgICAgICB2cC0+c3RhdHVzPVZP SUNFX0ZSRUU7CiAJICAgICAgY3RsLT5ub3RlKHYpOwoJICAgIH0KCSAgKmNvdW50cHRyLT1jb3Vu dCsxOwoJICBicmVhazsKCX0KICAgIH0KCiAgdnAtPnZpYnJhdG9fY29udHJvbF9jb3VudGVyPWNj OwogIHZwLT5zYW1wbGVfaW5jcmVtZW50PWluY3I7CiAgdnAtPnNhbXBsZV9vZmZzZXQ9b2ZzOyAv KiBVcGRhdGUgb2Zmc2V0ICovCiAgcmV0dXJuIHJlc2FtcGxlX2J1ZmZlcityZXNhbXBsZV9idWZm ZXJfb2Zmc2V0Owp9CgpzdGF0aWMgc2FtcGxlX3QgKnJzX3ZpYl9iaWRpcihpbnQgdiwgVm9pY2Ug KnZwLCB1aW50MzIgY291bnQpCnsKICBpbnQzMiAgIG9mc2QsIHYwLCB2MSwgdjIsIHYzLCB0ZW1w LCBvdmVyc2hvb3Q7CiAgaW50IG9mZnNldDsKICBpbnQzMgogICAgaW5jcj12cC0+c2FtcGxlX2lu Y3JlbWVudDsKLypXSFkgaW50MzI/PyovCiAgdWludDMyCiAgICBsZT12cC0+bG9vcF9lbmQsCiAg ICBscz12cC0+bG9vcF9zdGFydDsKICB1aW50MzIKICAgIG9mcz12cC0+c2FtcGxlX29mZnNldCwK ICAgIHNlPXZwLT5zYW1wbGUtPmRhdGFfbGVuZ3RoOwogIHNhbXBsZV90CiAgICAqZGVzdD1yZXNh bXBsZV9idWZmZXIrcmVzYW1wbGVfYnVmZmVyX29mZnNldCwKICAgICpzcmM9dnAtPnNhbXBsZS0+ ZGF0YTsKICB1aW50MzIKICAgIGNjPXZwLT52aWJyYXRvX2NvbnRyb2xfY291bnRlcjsKCgojaWZk ZWYgVVNFX0JJRElSX09WRVJTSE9PVAogIHVpbnQzMgogICAgbGUyPWxlPDwxLAogICAgbHMyPWxz PDwxOwojZW5kaWYKICB1aW50MzIKICAgIGksIGo7CiAgaW50CiAgICB2aWJmbGFnID0gMDsKCgog IG92ZXJzaG9vdCA9IHNyY1soc2U+PkZSQUNUSU9OX0JJVFMpLTFdIC8gT1ZFUlNIT09UX1NURVA7 CiAgaWYgKG92ZXJzaG9vdCA8IDApIG92ZXJzaG9vdCA9IC1vdmVyc2hvb3Q7CiAgLyogUGxheSBu b3JtYWxseSB1bnRpbCBpbnNpZGUgdGhlIGxvb3AgcmVnaW9uICovCiAgd2hpbGUgKGNvdW50ICYm IChvZnMgPD0gbHMpKQogICAgewogICAgICBpID0gKGxzIC0gb2ZzKSAvIGluY3IgKyAxOwogICAg ICBpZiAoaSA+IGNvdW50KSBpID0gY291bnQ7CiAgICAgIGlmIChpID4gY2MpCgl7CgkgIGkgPSBj YzsKCSAgdmliZmxhZyA9IDE7Cgl9CiAgICAgIGVsc2UgY2MgLT0gaTsKICAgICAgY291bnQgLT0g aTsKICAgICAgZm9yKGogPSAwOyBqIDwgaTsgaisrKQoJewoKCW9mZnNldCA9IG9mcyA+PiBGUkFD VElPTl9CSVRTOwoKCWlmIChvZnMgPj0gc2UpIHsKCQlpbnQzMiBkZWx0YSA9IChpbnQzMikoKG9m cyAtIHNlKT4+RlJBQ1RJT05fQklUUykgOwogICAgICAgIAl2MSA9IChpbnQzMilzcmNbKGludCko c2U+PkZSQUNUSU9OX0JJVFMpLTFdOwoJCXYxIC09ICAoZGVsdGErMSkgKiB2MSAvIG92ZXJzaG9v dDsKICAgICAgICB9ZWxzZSAgdjEgPSAoaW50MzIpc3JjW29mZnNldF07CglpZiAob2ZzICsgKDFM PDxGUkFDVElPTl9CSVRTKSA+PSBzZSkgewoJCXYyID0gdjE7CiAgICAgICAgfWVsc2UgIHYyID0g KGludDMyKXNyY1tvZmZzZXQrMV07CglpZihkb250X2NzcGxpbmUgfHwKCSAgICgob2ZzLSgxTDw8 RlJBQ1RJT05fQklUUykpPGxzKXx8KChvZnMrKDJMPDxGUkFDVElPTl9CSVRTKSk+bGUpKXsKICAg ICAgICAgICAgICAgICpkZXN0KysgPSAoc2FtcGxlX3QpKHYxICsgKChpbnQzMikoKHYyLXYxKSAq IChpbnQzMikob2ZzICYgRlJBQ1RJT05fTUFTSykpID4+IEZSQUNUSU9OX0JJVFMpKTsKCX1lbHNl ewoJCW9mc2Q9b2ZzOwogICAgICAgICAgICAgICAgdjAgPSAoaW50MzIpc3JjW29mZnNldC0xXTsK ICAgICAgICAgICAgICAgIHYzID0gKGludDMyKXNyY1tvZmZzZXQrMl07CiAgICAgICAgICAgICAg ICBvZnMgJj0gRlJBQ1RJT05fTUFTSzsKICAgICAgICAgICAgICAgIHRlbXA9djI7CgkJdjIgPSAo Nip2MiArCgkJICAgICAgKCgoKCAoICg1KnYzIC0gMTEqdjIgKyA3KnYxIC0gdjApKgoJCSAgICAg ICAoaW50MzIpb2ZzKSA+PkZSQUNUSU9OX0JJVFMpKihpbnQzMilvZnMpPj4oRlJBQ1RJT05fQklU UysyKSktMSkpKihpbnQzMilvZnM7CiAgICAgICAgICAgICAgICBvZnMgPSAoMUwgPDwgRlJBQ1RJ T05fQklUUykgLSBvZnM7CgkJdjEgPSAoNip2MSArCgkJICAgICAgKCgoKCgoNSp2MCAtIDExKnYx ICsgNyp0ZW1wIC0gdjMpKgoJCSAgICAgICAoaW50MzIpb2ZzKT4+RlJBQ1RJT05fQklUUykqKGlu dDMyKW9mcyk+PihGUkFDVElPTl9CSVRTKzIpKS0xKSkqKGludDMyKW9mczsKCQl2MSA9ICh2MSAr IHYyKS8oNkw8PEZSQUNUSU9OX0JJVFMpOwoJCSpkZXN0KysgPSAoc2FtcGxlX3QpKCh2MSA+IE1B WF9EQVRBVkFMKT8gTUFYX0RBVEFWQUw6ICgodjEgPCBNSU5fREFUQVZBTCk/IE1JTl9EQVRBVkFM OiB2MSkpOwoJCW9mcz1vZnNkOwoJfQoJICBvZnMgKz0gaW5jcjsKCX0KICAgICAgaWYgKHZpYmZs YWcpCgl7CgkgIGNjID0gdnAtPnZpYnJhdG9fY29udHJvbF9yYXRpbzsKCSAgaW5jciA9IHVwZGF0 ZV92aWJyYXRvKHZwLCAwKTsKCSAgdmliZmxhZyA9IDA7Cgl9CiAgICB9CgogIC8qIFRoZW4gZG8g dGhlIGJpZGlyZWN0aW9uYWwgbG9vcGluZyAqLwoKICB3aGlsZSAoY291bnQpCiAgICB7CiAgICAg IC8qIFByZWNhbGMgaG93IG1hbnkgdGltZXMgd2Ugc2hvdWxkIGdvIHRocm91Z2ggdGhlIGxvb3Ag Ki8KI2lmIDEKICAgICAgaSA9ICgoaW5jciA+IDAgPyBsZSA6IGxzKSAtIG9mcykgLyBpbmNyICsg MTsKI2Vsc2UKLyogZml4IGZyb20gTS4gSXp1bW8gKi8KICAgICAgaSA9ICgoaW5jciA+IDAgPyBs ZSA6IGxzKSAtIG9mcyArIGluY3IgLSAxKSAvIGluY3I7CiNlbmRpZgogICAgICBpZihpID4gY291 bnQpIGkgPSBjb3VudDsKICAgICAgaWYoaSA+IGNjKQoJewoJICBpID0gY2M7CgkgIHZpYmZsYWcg PSAxOwoJfQogICAgICBlbHNlIGNjIC09IGk7CiAgICAgIGNvdW50IC09IGk7CiAgICAgIHdoaWxl IChpLS0gJiYgb2ZzIDwgc2UpCgl7CgoJb2Zmc2V0ID0gb2ZzID4+IEZSQUNUSU9OX0JJVFM7CgoJ aWYgKG9mcyA+PSBzZSkgewoJCWludDMyIGRlbHRhID0gKGludDMyKSgob2ZzIC0gc2UpPj5GUkFD VElPTl9CSVRTKSA7CiAgICAgICAgCXYxID0gKGludDMyKXNyY1soaW50KShzZT4+RlJBQ1RJT05f QklUUyktMV07CgkJdjEgLT0gIChkZWx0YSsxKSAqIHYxIC8gb3ZlcnNob290OwogICAgICAgIH1l bHNlICB2MSA9IChpbnQzMilzcmNbb2Zmc2V0XTsKCWlmIChvZnMgKyAoMUw8PEZSQUNUSU9OX0JJ VFMpID49IHNlKSB7CgkJdjIgPSB2MTsKICAgICAgICB9ZWxzZSAgdjIgPSAoaW50MzIpc3JjW29m ZnNldCsxXTsKCWlmKGRvbnRfY3NwbGluZSB8fAoJICAgKChvZnMtKDFMPDxGUkFDVElPTl9CSVRT KSk8bHMpfHwoKG9mcysoMkw8PEZSQUNUSU9OX0JJVFMpKT5sZSkpewogICAgICAgICAgICAgICAg KmRlc3QrKyA9IChzYW1wbGVfdCkodjEgKyAoKGludDMyKSgodjItdjEpICogKGludDMyKShvZnMg JiBGUkFDVElPTl9NQVNLKSkgPj4gRlJBQ1RJT05fQklUUykpOwoJfWVsc2V7CgkJb2ZzZD1vZnM7 CiAgICAgICAgICAgICAgICB2MCA9IChpbnQzMilzcmNbb2Zmc2V0LTFdOwogICAgICAgICAgICAg ICAgdjMgPSAoaW50MzIpc3JjW29mZnNldCsyXTsKICAgICAgICAgICAgICAgIG9mcyAmPSBGUkFD VElPTl9NQVNLOwogICAgICAgICAgICAgICAgdGVtcD12MjsKCQl2MiA9ICg2KnYyICsKCQkgICAg ICAoKCgoICggKDUqdjMgLSAxMSp2MiArIDcqdjEgLSB2MCkqCgkJICAgICAgIChpbnQzMilvZnMp ID4+RlJBQ1RJT05fQklUUykqKGludDMyKW9mcyk+PihGUkFDVElPTl9CSVRTKzIpKS0xKSkqKGlu dDMyKW9mczsKICAgICAgICAgICAgICAgIG9mcyA9ICgxTCA8PCBGUkFDVElPTl9CSVRTKSAtIG9m czsKCQl2MSA9ICg2KnYxICsKCQkgICAgICAoKCgoKCg1KnYwIC0gMTEqdjEgKyA3KnRlbXAgLSB2 MykqCgkJICAgICAgIChpbnQzMilvZnMpPj5GUkFDVElPTl9CSVRTKSooaW50MzIpb2ZzKT4+KEZS QUNUSU9OX0JJVFMrMikpLTEpKSooaW50MzIpb2ZzOwoJCXYxID0gKHYxICsgdjIpLyg2TDw8RlJB Q1RJT05fQklUUyk7CgkJKmRlc3QrKyA9IChzYW1wbGVfdCkoKHYxID4gTUFYX0RBVEFWQUwpPyBN QVhfREFUQVZBTDogKCh2MSA8IE1JTl9EQVRBVkFMKT8gTUlOX0RBVEFWQUw6IHYxKSk7CgkJb2Zz PW9mc2Q7Cgl9CgkgIG9mcyArPSBpbmNyOwoJfQogICAgICBpZiAodmliZmxhZykKCXsKCSAgY2Mg PSB2cC0+dmlicmF0b19jb250cm9sX3JhdGlvOwoJICBpbmNyID0gdXBkYXRlX3ZpYnJhdG8odnAs IChpbmNyIDwgMCkpOwoJICB2aWJmbGFnID0gMDsKCX0KICAgICAgaWYgKG9mcyA+PSBsZSkKCXsK I2lmZGVmIFVTRV9CSURJUl9PVkVSU0hPT1QKCSAgLyogZm9sZCB0aGUgb3ZlcnNob290IGJhY2sg aW4gKi8KCSAgb2ZzID0gbGUyIC0gb2ZzOwojZW5kaWYKCSAgaW5jciAqPSAtMTsKCX0KICAgICAg ZWxzZSBpZiAob2ZzIDw9IGxzKQoJewojaWZkZWYgVVNFX0JJRElSX09WRVJTSE9PVAoJICBvZnMg PSBsczIgLSBvZnM7CiNlbmRpZgoJICBpbmNyICo9IC0xOwoJfQogICAgfQoKCiAgdnAtPnZpYnJh dG9fY29udHJvbF9jb3VudGVyPWNjOwogIHZwLT5zYW1wbGVfaW5jcmVtZW50PWluY3I7CiAgdnAt PnNhbXBsZV9vZmZzZXQ9b2ZzOyAvKiBVcGRhdGUgb2Zmc2V0ICovCiAgcmV0dXJuIHJlc2FtcGxl X2J1ZmZlcityZXNhbXBsZV9idWZmZXJfb2Zmc2V0Owp9CgpzdGF0aWMgaW50IHJzX3VwZGF0ZV9w b3J0YShpbnQgdikKewogICAgVm9pY2UgKnZwPSZ2b2ljZVt2XTsKICAgIGludDMyIGQ7CgogICAg ZCA9IHZwLT5wb3J0YV9kcGI7CiAgICBpZih2cC0+cG9ydGFfcGIgPCAwKQogICAgewoJaWYoZCA+ IC12cC0+cG9ydGFfcGIpCgkgICAgZCA9IC12cC0+cG9ydGFfcGI7CiAgICB9CiAgICBlbHNlCiAg ICB7CglpZihkID4gdnAtPnBvcnRhX3BiKQoJICAgIGQgPSAtdnAtPnBvcnRhX3BiOwoJZWxzZQoJ ICAgIGQgPSAtZDsKICAgIH0KCiAgICB2cC0+cG9ydGFfcGIgKz0gZDsKICAgIGlmKHZwLT5wb3J0 YV9wYiA9PSAwKQogICAgewoJdnAtPnBvcnRhX2NvbnRyb2xfcmF0aW8gPSAwOwoJdnAtPnBvcnRh X3BiID0gMDsKICAgIH0KICAgIHJlY29tcHV0ZV9mcmVxKHYpOwogICAgcmV0dXJuIHZwLT5wb3J0 YV9jb250cm9sX3JhdGlvOwp9CgpzdGF0aWMgc2FtcGxlX3QgKnBvcnRhX3Jlc2FtcGxlX3ZvaWNl KGludCB2LCB1aW50MzIgKmNvdW50cHRyLCBpbnQgbW9kZSkKewogICAgVm9pY2UgKnZwPSZ2b2lj ZVt2XTsKICAgIHVpbnQzMiBuID0gKmNvdW50cHRyOwogICAgdWludDMyIGk7CiAgICBzYW1wbGVf dCAqKCogcmVzYW1wbGVyKShpbnQsIHVpbnQzMiAqLCBpbnQpOwogICAgaW50IGNjID0gdnAtPnBv cnRhX2NvbnRyb2xfY291bnRlcjsKICAgIGludCBsb29wOwoKICAgIGlmKHZwLT52aWJyYXRvX2Nv bnRyb2xfcmF0aW8pCglyZXNhbXBsZXIgPSB2aWJfcmVzYW1wbGVfdm9pY2U7CiAgICBlbHNlCgly ZXNhbXBsZXIgPSBub3JtYWxfcmVzYW1wbGVfdm9pY2U7CiAgICBpZihtb2RlICE9IDEpCglsb29w ID0gMTsKICAgIGVsc2UKCWxvb3AgPSAwOwoKICAgIC8qIHZwLT5jYWNoZSA9IE5VTEw7ICovCiAg ICByZXNhbXBsZV9idWZmZXJfb2Zmc2V0ID0gMDsKICAgIHdoaWxlKHJlc2FtcGxlX2J1ZmZlcl9v ZmZzZXQgPCBuKQogICAgewoJaWYoY2MgPT0gMCkKCXsKCSAgICBpZigoY2MgPSByc191cGRhdGVf cG9ydGEodikpID09IDApCgkgICAgewoJCWkgPSBuIC0gcmVzYW1wbGVfYnVmZmVyX29mZnNldDsK CQlyZXNhbXBsZXIodiwgJmksIG1vZGUpOwoJCXJlc2FtcGxlX2J1ZmZlcl9vZmZzZXQgKz0gaTsK CQlicmVhazsKCSAgICB9Cgl9CgoJaSA9IG4gLSByZXNhbXBsZV9idWZmZXJfb2Zmc2V0OwoJaWYo aSA+ICh1aW50MzIpY2MpCgkgICAgaSA9ICh1aW50MzIpY2M7CglyZXNhbXBsZXIodiwgJmksIG1v ZGUpOwoJcmVzYW1wbGVfYnVmZmVyX29mZnNldCArPSBpOwoKCS8qIGlmKCFsb29wICYmIHZwLT5z dGF0dXMgPT0gVk9JQ0VfRlJFRSkgKi8KCWlmKHZwLT5zdGF0dXMgPT0gVk9JQ0VfRlJFRSkKCSAg ICBicmVhazsKCWNjIC09IChpbnQpaTsKICAgIH0KICAgICpjb3VudHB0ciA9IHJlc2FtcGxlX2J1 ZmZlcl9vZmZzZXQ7CiAgICByZXNhbXBsZV9idWZmZXJfb2Zmc2V0ID0gMDsKICAgIHZwLT5wb3J0 YV9jb250cm9sX2NvdW50ZXIgPSBjYzsKICAgIHJldHVybiByZXNhbXBsZV9idWZmZXI7Cn0KCnN0 YXRpYyBzYW1wbGVfdCAqdmliX3Jlc2FtcGxlX3ZvaWNlKGludCB2LCB1aW50MzIgKmNvdW50cHRy LCBpbnQgbW9kZSkKewogICAgVm9pY2UgKnZwID0gJnZvaWNlW3ZdOwoKICAgIC8qIHZwLT5jYWNo ZSA9IE5VTEw7ICovCiAgICBpZihtb2RlID09IDApCglyZXR1cm4gcnNfdmliX2xvb3AodiwgdnAs IGNvdW50cHRyKTsKICAgIGlmKG1vZGUgPT0gMSkKCXJldHVybiByc192aWJfcGxhaW4odiwgY291 bnRwdHIpOwogICAgcmV0dXJuIHJzX3ZpYl9iaWRpcih2LCB2cCwgKmNvdW50cHRyKTsKfQoKc3Rh dGljIHNhbXBsZV90ICpub3JtYWxfcmVzYW1wbGVfdm9pY2UoaW50IHYsIHVpbnQzMiAqY291bnRw dHIsIGludCBtb2RlKQp7CiAgICBWb2ljZSAqdnAgPSAmdm9pY2Vbdl07CiAgICBpZihtb2RlID09 IDApCglyZXR1cm4gcnNfbG9vcCh2LCB2cCwgY291bnRwdHIpOwogICAgaWYobW9kZSA9PSAxKQoJ cmV0dXJuIHJzX3BsYWluKHYsIGNvdW50cHRyKTsKICAgIHJldHVybiByc19iaWRpcih2LCB2cCwg KmNvdW50cHRyKTsKfQoKc2FtcGxlX3QgKnJlc2FtcGxlX3ZvaWNlKGludCB2LCB1aW50MzIgKmNv dW50cHRyKQp7CiAgICBWb2ljZSAqdnA9JnZvaWNlW3ZdOwogICAgaW50IG1vZGU7CgogICAgaWYo ISh2cC0+c2FtcGxlLT5zYW1wbGVfcmF0ZSkpCiAgICB7Cgl1aW50MzIgb2ZzOwoKCS8qIFByZS1y ZXNhbXBsZWQgZGF0YSAtLSBqdXN0IHVwZGF0ZSB0aGUgb2Zmc2V0IGFuZCBjaGVjayBpZgoJICAg d2UncmUgb3V0IG9mIGRhdGEuICovCglvZnM9dnAtPnNhbXBsZV9vZmZzZXQgPj4gRlJBQ1RJT05f QklUUzsgLyogS2luZCBvZiBzaWxseSB0byB1c2UKCQkJCQkJICAgRlJBQ1RJT05fQklUUyBoZXJl Li4uICovCglpZigqY291bnRwdHIgPj0gKHZwLT5zYW1wbGUtPmRhdGFfbGVuZ3RoPj5GUkFDVElP Tl9CSVRTKSAtIG9mcykKCXsKCSAgICAvKiBOb3RlIGZpbmlzaGVkLiBGcmVlIHRoZSB2b2ljZS4g Ki8KCSAgaWYgKCEodnAtPnN0YXR1cyZWT0lDRV9GUkVFKSkKCSAgICB7CgkgICAgICB2cC0+c3Rh dHVzPVZPSUNFX0ZSRUU7CiAJICAgICAgY3RsLT5ub3RlKHYpOwoJICAgIH0KCgkgICAgLyogTGV0 IHRoZSBjYWxsZXIga25vdyBob3cgbXVjaCBkYXRhIHdlIGhhZCBsZWZ0ICovCgkgICAgKmNvdW50 cHRyID0gKHZwLT5zYW1wbGUtPmRhdGFfbGVuZ3RoPj5GUkFDVElPTl9CSVRTKSAtIG9mczsKCX0K CWVsc2UKCSAgICB2cC0+c2FtcGxlX29mZnNldCArPSAqY291bnRwdHIgPDwgRlJBQ1RJT05fQklU UzsKCXJldHVybiB2cC0+c2FtcGxlLT5kYXRhK29mczsKICAgIH0KCiAgICBpZiAoY3VycmVudF9p bnRlcnBvbGF0aW9uID09IDIpCgkgcmV0dXJuIHJlc2FtcGxlX3ZvaWNlX2xhZ3JhbmdlKHYsIGNv dW50cHRyKTsKICAgIGVsc2UgaWYgKGN1cnJlbnRfaW50ZXJwb2xhdGlvbiA9PSAzKQoJIHJldHVy biByZXNhbXBsZV92b2ljZV9maWx0ZXIodiwgY291bnRwdHIpOwoKICAgIG1vZGUgPSB2cC0+c2Ft cGxlLT5tb2RlczsKICAgIGlmKChtb2RlICYgTU9ERVNfTE9PUElORykgJiYKICAgICAgICgobW9k ZSAmIE1PREVTX0VOVkVMT1BFKSB8fAoJKHZwLT5zdGF0dXMgJiAoVk9JQ0VfT04gfCBWT0lDRV9T VVNUQUlORUQpKSkpCiAgICB7CglpZihtb2RlICYgTU9ERVNfUElOR1BPTkcpCgl7CgkgICAgLyog dnAtPmNhY2hlID0gTlVMTDsgKi8KCSAgICBtb2RlID0gMjsKCX0KCWVsc2UKCSAgICBtb2RlID0g MDsKICAgIH0KICAgIGVsc2UKCW1vZGUgPSAxOwoKICAgIGlmKHZwLT5wb3J0YV9jb250cm9sX3Jh dGlvKQoJcmV0dXJuIHBvcnRhX3Jlc2FtcGxlX3ZvaWNlKHYsIGNvdW50cHRyLCBtb2RlKTsKCiAg ICBpZih2cC0+dmlicmF0b19jb250cm9sX3JhdGlvKQoJcmV0dXJuIHZpYl9yZXNhbXBsZV92b2lj ZSh2LCBjb3VudHB0ciwgbW9kZSk7CgogICAgcmV0dXJuIG5vcm1hbF9yZXNhbXBsZV92b2ljZSh2 LCBjb3VudHB0ciwgbW9kZSk7Cn0KCgp2b2lkIGRvX2xvd3Bhc3MoU2FtcGxlICpzYW1wbGUsIHVp bnQzMiBzcmF0ZSwgc2FtcGxlX3QgKmJ1ZiwgdWludDMyIGNvdW50LCB1aW50MzIgZnJlcSwgRkxP QVRfVCByZXNvbmFuY2UpCnsKICAgIGRvdWJsZSBhMD0wLCBhMT0wLCBhMj0wLCBiMD0wLCBiMT0w OwogICAgZG91YmxlIHgwPTAsIHgxPTAsIHkwPTAsIHkxPTA7CiAgICBzYW1wbGVfdCBzYW1wOwog ICAgZG91YmxlIG91dHNhbXAsIGluc2FtcCwgbW9kX2Ftb3VudD0wOwogICAgdWludDMyIGZpbmRl eCwgY2M7CiAgICB1aW50MzIgY3VycmVudF9mcmVxOwoKICAgIGlmIChmcmVxIDwgMjApIHJldHVy bjsKCiAgICBpZiAoZnJlcSA+IHNyYXRlICogMikgewogICAgCWN0bC0+Y21zZyhDTVNHX0VSUk9S LCBWRVJCX05PUk1BTCwKICAgIAkJICAiTG93cGFzczogY2VudGVyIG11c3QgYmUgPCBkYXRhIHJh dGUqMiIpOwogICAgCXJldHVybjsKICAgIH0KCiAgICBjdXJyZW50X2ZyZXEgPSBmcmVxOwoKICAg IGlmIChzYW1wbGUtPm1vZEVudlRvRmlsdGVyRmMpCgltb2RfYW1vdW50ID0gc2FtcGxlLT5tb2RF bnZUb0ZpbHRlckZjOwoKICAgIGlmIChtb2RfYW1vdW50IDwgMC4wMiAmJiBmcmVxID49IDEzNTAw KSByZXR1cm47CgogICAgdm9pY2VbMF0uc2FtcGxlID0gc2FtcGxlOwoKICAgICAgLyogUmFtcCB1 cCBmcm9tIDAgKi8KICAgIHZvaWNlWzBdLm1vZHVsYXRpb25fc3RhZ2U9QVRUQUNLOwogICAgdm9p Y2VbMF0ubW9kdWxhdGlvbl92b2x1bWU9MDsKICAgIHZvaWNlWzBdLm1vZHVsYXRpb25fZGVsYXk9 c2FtcGxlLT5tb2R1bGF0aW9uX3JhdGVbREVMQVldOwogICAgY2MgPSB2b2ljZVswXS5tb2R1bGF0 aW9uX2NvdW50ZXI9MDsKICAgIHJlY29tcHV0ZV9tb2R1bGF0aW9uKDApOwoKLyogc3RhcnQgbW9k dWxhdGlvbiBsb29wIGhlcmUgKi8KICAgIHdoaWxlIChjb3VudC0tKSB7CgoJaWYgKCFjYykgewoJ ICAgIGlmIChtb2RfYW1vdW50PjAuMDIpIHsKCQlpZiAodXBkYXRlX21vZHVsYXRpb25fc2lnbmFs KDApKSBtb2RfYW1vdW50ID0gMDsKCQllbHNlCgkJY3VycmVudF9mcmVxID0gKHVpbnQzMikoIChk b3VibGUpZnJlcSooMS4wICsgKG1vZF9hbW91bnQgLSAxLjApICoKCQkJICh2b2ljZVswXS5tb2R1 bGF0aW9uX3ZvbHVtZT4+MjIpIC8gMjU1LjApICk7CgkgICAgfQoJICAgIGNjID0gY29udHJvbF9y YXRpbzsKCSAgICBmaW5kZXggPSAxICsgKGN1cnJlbnRfZnJlcSs1MCkgLyAxMDA7CgkgICAgaWYg KGZpbmRleCA+IDEwMCkgZmluZGV4ID0gMTAwOwoJICAgIGEwID0gYnV0dGVyd29ydGhbZmluZGV4 XVswXTsKCSAgICBhMSA9IGJ1dHRlcndvcnRoW2ZpbmRleF1bMV07CgkgICAgYTIgPSBidXR0ZXJ3 b3J0aFtmaW5kZXhdWzJdOwoJICAgIGIwID0gYnV0dGVyd29ydGhbZmluZGV4XVszXTsKCSAgICBi MSA9IGJ1dHRlcndvcnRoW2ZpbmRleF1bNF07Cgl9CgoJaWYgKG1vZF9hbW91bnQ+MC4wMikgY2Mt LTsKCiAgICAJc2FtcCA9ICpidWY7CgogICAgCWluc2FtcCA9IChkb3VibGUpc2FtcDsKICAgIAlv dXRzYW1wID0gYTAgKiBpbnNhbXAgKyBhMSAqIHgwICsgYTIgKiB4MSAtIGIwICogeTAgLSBiMSAq IHkxOwogICAgCXgxID0geDA7CiAgICAJeDAgPSBpbnNhbXA7CiAgICAJeTEgPSB5MDsKICAgIAl5 MCA9IG91dHNhbXA7CiAgICAJaWYgKG91dHNhbXAgPiBNQVhfREFUQVZBTCkgewogICAgCQlvdXRz YW1wID0gTUFYX0RBVEFWQUw7CiAgICAJfQogICAgCWVsc2UgaWYgKG91dHNhbXAgPCBNSU5fREFU QVZBTCkgewogICAgCQlvdXRzYW1wID0gTUlOX0RBVEFWQUw7CiAgICAJfQogICAgCSpidWYrKyA9 IChzYW1wbGVfdClvdXRzYW1wOwogICAgfQp9CgoKdm9pZCBwcmVfcmVzYW1wbGUoU2FtcGxlICog c3ApCnsKICBkb3VibGUgYSwgeGRpZmY7CiAgdWludDMyIGksIGluY3IsIG9mcywgbmV3bGVuLCBj b3VudCwgb3ZlcnNob290OwogIGludDE2ICpuZXdkYXRhLCAqZGVzdCwgKnNyYyA9IChpbnQxNiAq KXNwLT5kYXRhLCAqdnB0ciwgKmVuZHB0cjsKICBpbnQzMiB2MSwgdjIsIHYzLCB2NDsKICBzdGF0 aWMgY29uc3QgY2hhciBub3RlX25hbWVbMTJdWzNdID0KICB7CiAgICAiQyIsICJDIyIsICJEIiwg IkQjIiwgIkUiLCAiRiIsICJGIyIsICJHIiwgIkcjIiwgIkEiLCAiQSMiLCAiQiIKICB9OwoKICBj dGwtPmNtc2coQ01TR19JTkZPLCBWRVJCX0RFQlVHLCAiICogcHJlLXJlc2FtcGxpbmcgZm9yIG5v dGUgJWQgKCVzJWQpIiwKCSAgICBzcC0+bm90ZV90b191c2UsCgkgICAgbm90ZV9uYW1lW3NwLT5u b3RlX3RvX3VzZSAlIDEyXSwgKHNwLT5ub3RlX3RvX3VzZSAmIDB4N0YpIC8gMTIpOwoKICBpZiAo c3AtPnNhbXBsZV9yYXRlID09IHBsYXlfbW9kZS0+cmF0ZSAmJiBzcC0+cm9vdF9mcmVxID09IGZy ZXFfdGFibGVbKGludCkoc3AtPm5vdGVfdG9fdXNlKV0pIHsKCWEgPSAxOwogIH0KICBlbHNlIGEg PSAoKGRvdWJsZSkgKHNwLT5zYW1wbGVfcmF0ZSkgKiBmcmVxX3RhYmxlWyhpbnQpIChzcC0+bm90 ZV90b191c2UpXSkgLwogICAgKChkb3VibGUpIChzcC0+cm9vdF9mcmVxKSAqIHBsYXlfbW9kZS0+ cmF0ZSk7CgogIC8qIGlmIChhPDEuMCkgcmV0dXJuOyAqLwogIGlmKHNwLT5kYXRhX2xlbmd0aCAv IGEgPj0gMHg3ZmZmZmZmZkwpCiAgewogICAgICAvKiBUb28gbGFyZ2UgdG8gY29tcHV0ZSAqLwog ICAgICBjdGwtPmNtc2coQ01TR19JTkZPLCBWRVJCX0RFQlVHLCAiICoqKiBDYW4ndCBwcmUtcmVz YW1wbGluZyBmb3Igbm90ZSAlZCIsCgkJc3AtPm5vdGVfdG9fdXNlKTsKICAgICAgcmV0dXJuOwog IH0KCiAgZW5kcHRyID0gc3JjICsgKHNwLT5kYXRhX2xlbmd0aCA+PiBGUkFDVElPTl9CSVRTKSAt IDE7CiAgaWYgKCplbmRwdHIgPCAwKSBvdmVyc2hvb3QgPSAodWludDMyKSgtKCplbmRwdHIgLyBP VkVSU0hPT1RfU1RFUCkpOwogIGVsc2Ugb3ZlcnNob290ID0gKHVpbnQzMikoKmVuZHB0ciAvIE9W RVJTSE9PVF9TVEVQKTsKICBpZiAob3ZlcnNob290IDwgMikgb3ZlcnNob290ID0gMDsKCiAgbmV3 bGVuID0gKGludDMyKShzcC0+ZGF0YV9sZW5ndGggLyBhKTsKICBjb3VudCA9IChuZXdsZW4gPj4g RlJBQ1RJT05fQklUUykgLSAxOwogIG9mcyA9IGluY3IgPSAoc3AtPmRhdGFfbGVuZ3RoIC0gKDEg PDwgRlJBQ1RJT05fQklUUykpIC8gY291bnQ7CgogIGlmKChkb3VibGUpbmV3bGVuICsgaW5jciA+ PSAweDdmZmZmZmZmTCkKICB7CiAgICAgIC8qIFRvbyBsYXJnZSB0byBjb21wdXRlICovCiAgICAg IGN0bC0+Y21zZyhDTVNHX0lORk8sIFZFUkJfREVCVUcsICIgKioqIENhbid0IHByZS1yZXNhbXBs aW5nIGZvciBub3RlICVkIiwKCQlzcC0+bm90ZV90b191c2UpOwogICAgICByZXR1cm47CiAgfQoK ICBkZXN0ID0gbmV3ZGF0YSA9IChpbnQxNiAqKXNhZmVfbWFsbG9jKChuZXdsZW4gPj4gKEZSQUNU SU9OX0JJVFMgLSAxKSkgKyAyICsgMipvdmVyc2hvb3QpOwoKICBpZiAoLS1jb3VudCkKICAgICpk ZXN0KysgPSBzcmNbMF07CgogIC8qIFNpbmNlIHdlJ3JlIHByZS1wcm9jZXNzaW5nIGFuZCB0aGlz IGRvZXNuJ3QgaGF2ZSB0byBiZSBkb25lIGluCiAgICAgcmVhbC10aW1lLCB3ZSBnbyBhaGVhZCBh bmQgZG8gdGhlIGZ1bGwgc2xpZGluZyBjdWJpYyBpbnRlcnBvbGF0aW9uLiAqLwogIGNvdW50LS07 CiAgZm9yKGkgPSAwOyBpIDwgY291bnQgKyBvdmVyc2hvb3Q7IGkrKykKICAgIHsKICAgICAgdnB0 ciA9IHNyYyArIChvZnMgPj4gRlJBQ1RJT05fQklUUyk7CiAgICAgIGlmIChpIDwgY291bnQgLSAy IHx8ICFvdmVyc2hvb3QpCgl7CiAgICAgICAgICB2MSA9ICoodnB0ciAtIDEpOwogICAgICAgICAg djIgPSAqdnB0cjsKICAgICAgICAgIHYzID0gKih2cHRyICsgMSk7CiAgICAgICAgICB2NCA9ICoo dnB0ciArIDIpOwoJfQogICAgICBlbHNlCgl7CgkgIGlmIChpIDwgY291bnQgKyAxKSB2MSA9ICoo dnB0ciAtIDEpOwoJICBlbHNlIHYxID0gKmVuZHB0ciAtIChjb3VudC1pKzIpICogKmVuZHB0ciAv IG92ZXJzaG9vdDsKCSAgaWYgKGkgPCBjb3VudCkgdjIgPSAqdnB0cjsKCSAgZWxzZSB2MiA9ICpl bmRwdHIgLSAoY291bnQtaSsxKSAqICplbmRwdHIgLyBvdmVyc2hvb3Q7CgkgIGlmIChpIDwgY291 bnQgLSAxKSB2MyA9ICoodnB0ciArIDEpOwoJICBlbHNlIHYzID0gKmVuZHB0ciAtIChjb3VudC1p KSAqICplbmRwdHIgLyBvdmVyc2hvb3Q7CgkgIHY0ID0gKmVuZHB0ciAtIChjb3VudC1pLTEpICog KmVuZHB0ciAvIG92ZXJzaG9vdDsKCX0KICAgICAgeGRpZmYgPSBGUlNDQUxFTkVHKChpbnQzMiko b2ZzICYgRlJBQ1RJT05fTUFTSyksIEZSQUNUSU9OX0JJVFMpOwogICAgICAqZGVzdCsrID0gdjIg KyAoeGRpZmYgLyA2LjApICogKC0yICogdjEgLSAzICogdjIgKyA2ICogdjMgLSB2NCArCiAgICAg IHhkaWZmICogKDMgKiAodjEgLSAyICogdjIgKyB2MykgKyB4ZGlmZiAqICgtdjEgKyAzICogKHYy IC0gdjMpICsgdjQpKSk7CiAgICAgIG9mcyArPSBpbmNyOwogICAgfQoKIGlmICghb3ZlcnNob290 KQogIHsKICBpZiAoKGludDMyKShvZnMgJiBGUkFDVElPTl9NQVNLKSkKICAgIHsKICAgICAgdjEg PSBzcmNbb2ZzID4+IEZSQUNUSU9OX0JJVFNdOwogICAgICB2MiA9IHNyY1sob2ZzID4+IEZSQUNU SU9OX0JJVFMpICsgMV07CiAgICAgICpkZXN0KysgPSAoaW50MTYpKHYxICsgKChpbnQzMikoKHYy IC0gdjEpICogKG9mcyAmIEZSQUNUSU9OX01BU0spKSA+PiBGUkFDVElPTl9CSVRTKSk7CiAgICB9 CiAgZWxzZQogICAgKmRlc3QrKyA9IHNyY1tvZnMgPj4gRlJBQ1RJT05fQklUU107CiAgKmRlc3Qr KyA9ICooZGVzdCAtIDEpIC8gMjsKICAqZGVzdCsrID0gKihkZXN0IC0gMSkgLyAyOwogIH0KCiAg c3AtPmRhdGFfbGVuZ3RoID0gbmV3bGVuICsgKG92ZXJzaG9vdCA8PCBGUkFDVElPTl9CSVRTKTsK ICBzcC0+bG9vcF9zdGFydCA9IChpbnQzMikoc3AtPmxvb3Bfc3RhcnQgLyBhKTsKICBzcC0+bG9v cF9lbmQgPSAoaW50MzIpKHNwLT5sb29wX2VuZCAvIGEpOwogIGZyZWUoc3AtPmRhdGEpOwogIHNw LT5kYXRhID0gKHNhbXBsZV90ICopIG5ld2RhdGE7CiAgc3AtPnNhbXBsZV9yYXRlID0gMDsKfQo=