Received: (at submit) by debbugs.gnu.org; 16 Jan 2014 23:51:39 +0000 From debbugs-submit-bounces <at> debbugs.gnu.org Thu Jan 16 18:51:39 2014 Received: from localhost ([127.0.0.1]:54198 helo=debbugs.gnu.org) by debbugs.gnu.org with esmtp (Exim 4.80) (envelope-from <debbugs-submit-bounces <at> debbugs.gnu.org>) id 1W3wim-0003RG-64 for submit <at> debbugs.gnu.org; Thu, 16 Jan 2014 18:51:38 -0500 Received: from eggs.gnu.org ([208.118.235.92]:47842) by debbugs.gnu.org with esmtp (Exim 4.80) (envelope-from <krzysztofrybak6@HIDDEN>) id 1W3wZx-00030T-Ei for submit <at> debbugs.gnu.org; Thu, 16 Jan 2014 18:42:33 -0500 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from <krzysztofrybak6@HIDDEN>) id 1W3wZq-0005Co-6W for submit <at> debbugs.gnu.org; Thu, 16 Jan 2014 18:42:29 -0500 X-Spam-Checker-Version: SpamAssassin 3.3.2 (2011-06-06) on eggs.gnu.org X-Spam-Level: * X-Spam-Status: No, score=1.1 required=5.0 tests=BAYES_50, FREEMAIL_ENVFROM_END_DIGIT,FREEMAIL_FROM,T_DKIM_INVALID autolearn=disabled version=3.3.2 Received: from lists.gnu.org ([2001:4830:134:3::11]:38418) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from <krzysztofrybak6@HIDDEN>) id 1W3wZq-0005Ck-2W for submit <at> debbugs.gnu.org; Thu, 16 Jan 2014 18:42:22 -0500 Received: from eggs.gnu.org ([2001:4830:134:3::10]:49550) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from <krzysztofrybak6@HIDDEN>) id 1W3wZj-0003w0-PC for bug-gzip@HIDDEN; Thu, 16 Jan 2014 18:42:21 -0500 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from <krzysztofrybak6@HIDDEN>) id 1W3wZd-0005BV-La for bug-gzip@HIDDEN; Thu, 16 Jan 2014 18:42:15 -0500 Received: from mx3.wp.pl ([212.77.101.7]:60584) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from <krzysztofrybak6@HIDDEN>) id 1W3wZc-0005B6-RL for bug-gzip@HIDDEN; Thu, 16 Jan 2014 18:42:09 -0500 Received: (wp-smtpd smtp.wp.pl 22258 invoked from network); 16 Jan 2014 22:55:26 +0100 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=wp.pl; s=1024a; t=1389909326; bh=MKNIhoFDQL10QkUBa8P81rTVKejLIfcM4ht8i7kZ+uI=; h=From:To:Subject; b=Hy4M0yOHaoDZLTBVjT0vg6OA4EyBuonOjNP8qRHJKWwzxp/sFpTICXnbEm7aHOpEc Cr2UQwx2Y4DXOxIkDUN3y2GKmYm49uVhRvBMHUZ7NGcA2rQbIOoEkOVUrU5Kzpg+A/ G1MB3eQPmHk/Bl44ivkgAy5+hrO0OE3apYCU2w2k= Received: from out.poczta.wp.pl ([212.77.101.240]) (envelope-sender <krzysztofrybak6@HIDDEN>) by smtp.wp.pl (WP-SMTPD) with SMTP for <bug-gzip@HIDDEN>; 16 Jan 2014 22:55:26 +0100 Date: Thu, 16 Jan 2014 22:55:25 +0100 From: "Krzysztof Rybak" <krzysztofrybak6@HIDDEN> To: bug-gzip@HIDDEN Subject: PD: gzip - tree overflow protection algorithm doubt/suggestion Message-ID: <52d8554de71410.11082928@HIDDEN> MIME-Version: 1.0 Content-Type: multipart/mixed; boundary="part52d8554de70428.92881097" X-Mailer: Interfejs WWW nowej poczty Wirtualnej Polski X-User-Agent: Mozilla/5.0 (X11; Ubuntu; Linux i686; rv:26.0) Gecko/20100101 Firefox/26.0 Organization: Poznaj Poczte WP http://poczta.wp.pl/info-start.html X-WP-IP: 79.190.160.34 X-WP-AV: skaner antywirusowy poczty Wirtualnej Polski S. A. X-WP-SPAM: NO 0000000 [ASMk] X-detected-operating-system: by eggs.gnu.org: GNU/Linux 3.x X-detected-operating-system: by eggs.gnu.org: Error: Malformed IPv6 address (bad octet value). X-Received-From: 2001:4830:134:3::11 X-Spam-Score: -3.8 (---) X-Debbugs-Envelope-To: submit X-Mailman-Approved-At: Thu, 16 Jan 2014 18:51:34 -0500 X-BeenThere: debbugs-submit <at> debbugs.gnu.org X-Mailman-Version: 2.1.15 Precedence: list List-Id: <debbugs-submit.debbugs.gnu.org> List-Unsubscribe: <http://debbugs.gnu.org/cgi-bin/mailman/options/debbugs-submit>, <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=unsubscribe> List-Archive: <http://debbugs.gnu.org/cgi-bin/mailman/private/debbugs-submit/> List-Post: <mailto:debbugs-submit <at> debbugs.gnu.org> List-Help: <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=help> List-Subscribe: <http://debbugs.gnu.org/cgi-bin/mailman/listinfo/debbugs-submit>, <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=subscribe> Errors-To: debbugs-submit-bounces <at> debbugs.gnu.org Sender: "Debbugs-submit" <debbugs-submit-bounces <at> debbugs.gnu.org> X-Spam-Score: -3.8 (---) This is a multi-part message in MIME format. --part52d8554de70428.92881097 Content-Type: text/plain; charset=iso-8859-2 Content-Transfer-Encoding: 8bit Content-Disposition: inline Hi, I sent a message to the author of gzip but without response. Maybe You can help me with my doubts. best regards, Krzysztof Dnia Czwartek, 2 Stycznia 2014 22:41 Krzysztof Rybak <krzysztofrybak6@HIDDEN> napisał(a) > Hello Jean-loup, > I'm preparing my own algorithm based on Huffman compression method and deflate format. > > I have doubts if method implemented in gzip program is 100% correct. > I mean tree overflow protection: > just to remind: in deflate (RFC1951) and therefore in gzip there is creating tree for lit/len, dist (maximum length of codes is 15 bits) and code table (maximum length is 7 bits). In case of too long code word, there is tree modification implemented in gen_bitlen(desc) function (trees.c): > > do { > bits = max_length-1; > while (bl_count[bits] == 0) bits--; > bl_count[bits]--; /* move one leaf down the tree */ > bl_count[bits+1] += 2; /* move one overflow item as its brother */ > bl_count[max_length]--; > overflow -= 2; > } while (overflow > 0); > > I'm not sure if this method is correct for original code length greater than 8 ( for maximum 7 ) and than 16 ( for maximum 15): even not every time. I couldn't obtain such symbol distribution to generate so long codes on real files indeed as such situation is extremely rare but generated it by modifying software: > > just before mentioned above overflow protection I changed bl_count histogram to one as for Fibonacci numbers (which is the worst for Huffman overflow - the longest codes, please refer to attached image): in my case I modified tree when maximum length is 7 bits (max_length = 7 is for code book compression): > bl_count[0] = 1; > bl_count[1] = 1; > bl_count[2] = 1; > bl_count[3] = 1; > bl_count[4] = 1; > bl_count[5] = 1; > bl_count[6] = 1; > bl_count[7] = 1; > bl_count[8] = 1; > bl_count[9] = 1; > bl_count[10] = 2; > overflow = 4; > > in fact in gzip there is setting length = 7 when it's longer than 7: > if (bits > max_length){ > bits = max_length; > overflow++; > } > > ,so my histogram looks like: > bl_count[0] = 1; > bl_count[1] = 1; > bl_count[2] = 1; > bl_count[3] = 1; > bl_count[4] = 1; > bl_count[5] = 1; > bl_count[6] = 1; > bl_count[7] = 5; > bl_count[8] = 0; > bl_count[9] = 0; > overflow = 4; > and after overflow protection method from gzip: > bl_count[0] = 1 > bl_count[1] = 1 > bl_count[2] = 1 > bl_count[3] = 1 > bl_count[4] = 1 > bl_count[5] = 0 > bl_count[6] = 2 > bl_count[7] = 5 > , which is incorrect Huffman tree: too many elements. > > trees.c with my modification and printf() function is attached. I compress obj2 from Calgary corpus. > I know my description may look unclear, but I hope You will help me/clarify my doubts. > > best regards, > Krzysztof Rybak --part52d8554de70428.92881097 Content-Type: image/png; name="=?iso-8859-2?B?Rmlib25hY2NpLnBuZw==?=" Content-Transfer-Encoding: base64 Content-Disposition: attachment; filename="=?iso-8859-2?B?Rmlib25hY2NpLnBuZw==?=" iVBORw0KGgoAAAANSUhEUgAABQAAAAMgCAYAAAB8mM/7AAAABmJLR0QA/wD/AP+gvaeTAAAACXBI WXMAAA7EAAAOxAGVKw4bAAAAB3RJTUUH3gECFAYUJCZOkwAAIABJREFUeNrs3T1y4trahmH1Vw53 zJAIGcCOiE7EcIh2RNQDIGRIxCfXF5yDj0xjI4F+1np0XVWustsC26s6uut9pV9t27YNAAAAABDp /xwBAAAAAOQSAAEAAAAgmAAIAAAAAMEEQAAAAAAIJgACAAAAQDABEAAAAACCCYAAAAAAEEwABAAA AIBgAiAAAAAABBMAAQAAACCYAAgAAAAAwQRAAAAAAAgmAAIAAABAMAEQAAAAAIIJgAAAAAAQTAAE AAAAgGACIAAAAAAEEwABAAAAIJgACAAAAADBBEAAAAAACCYAAgAAAEAwARAAAAAAggmAAAAAABBM AAQAAACAYAIgAAAAAAQTAAEAAAAgmAAIAAAAAMEEQAAAAAAIJgACAAAAQDABEAAAAACCCYAAAAAA EEwABAAAAIBgAiAAAAAABBMAAQAAACCYAAgAAAAAwQRAAAAAAAgmAAIAAABAMAEQAAAAAIIJgAAA AAAQTAAEAAAAgGACIAAAAAAEEwABAAAAIJgACAAAAADBBEAAAAAACCYAAgAAAEAwARAAAAAAggmA AAAAABBMAAQAAACAYAIgAAAAAAQTAAEAAAAgmAAIAAAAAMEEQAAAAAAIJgACAAAAQDABEAAAAACC CYAAAAAAEEwABAAAAIBgAiAAAAAABBMAAQAAACCYAAgAAAAAwQRAAAAAAAgmAAIAAABAMAEQAAAA AIIJgAAAAAAQTAAEAAAAgGACIAAAAAAEEwABAAAAIJgACAAAAADBBEAAAAAACCYAAgAAAEAwARAA AAAAggmAAAAAABBMAAQAAACAYAIgAAAAAAQTAAEAAAAgmAAIAAAAAMEEQAAAAAAIJgACAAAAQDAB EAAAAACCCYAAAAAAEEwABAAAAIBgAiAAAAAABBMAAQAAACCYAAgAAAAAwQRAAAAAAAgmAAIAAABA MAEQAAAAAIIJgAAAAAAQTAAEAAAAgGACIAAAAAAEEwABAAAAIJgACAAAAADBBEAAAAAACCYAAgAA AEAwARAAAAAAggmAAAAAABBMAAQAAACAYAIgAAAAAAQTAAEAAAAgmAAIAAAAAMEEQAAAAAAIJgAC AAAAQDABEAAAAACCCYAAAAAAEEwABAAAAIBgAiAAAAAABBMAAQAAACCYAAgAAAAAwQRAAAAAAAgm AAIAAABAMAEQAAAAAIIJgAAAAAAQTAAEAAAAgGACIAAAAAAEEwABAAAAIJgACAAAAADBBEAAAAAA CCYAAgAAAEAwARAAAAAAggmAAAAAABBMAAQAAACAYAIgAAAAAAQTAAEAAAAgmAAIAAAAAMEEQAAA AAAIJgACAAAAQDABEAAAAACCCYAAAAAAEEwABAAAAIBgAiAAAAAABBMAAQAAACCYAAgAAAAAwQRA AAAAAAgmAAIAAABAMAEQAAAAAIIJgAAAAAAQTAAEAAAAgGACIAAAAAAEEwABAAAAIJgACAAAAADB BEAAAAAACCYAAgAAAEAwARAAAAAAggmAAAAAABBMAAQAAACAYAIgAAAAAAQTAAEAAAAgmAAIAAAA AMEEQAAAAAAIJgACAAAAQDABEAAAAACCCYAAAAAAEEwABAAAAIBgAiAAAAAABBMAAQAAACCYAAgA AAAAwQRAAAAAAAgmAAIAAABAMAEQAAAAAIIJgAAAAAAQTAAEAAAAgGACIAAAAAAEEwABAAAAIJgA CAAAAADBBEAAAAAACCYAAgAAAEAwARAAAAAAggmAAAAAABBMAAQAAACAYAIgAAAAAAQTAAEAAAAg mAAIAAAAAMEEQAAAAAAIJgACAAAAQDABEAAAAACCCYAAAAAAEEwABAAAAIBgAiAAAAAABBMAAQAA ACCYAAgAAAAAwQRAAAAAAAgmAAIAAABAMAEQAAAAAIIJgAAAAAAQTAAEAAAAgGACIAAAAAAEEwAB AAAAIJgACAAAAADBBEAAAAAACCYAAgAAAEAwARAAAAAAggmAAAAAABBMAAQAAACAYAIgAAAAAAQT AAEAAAAgmAAIAAAAAMEEQAAAAAAIJgACAAAAQDABEAAAAACCCYAAAAAAEEwABAAAAIBgAiAAAAAA BBMAAQAAACCYAAgAAAAAwQRAAAAAAAgmAAIAAABAMAEQAAAAAIIJgAAAAAAQTAAEAAAAgGACIAAA AAAEEwABAAAAIJgACAAAAADBBEAAAAAACCYAAgAAAECwD0cAAPW7Xq8OAZjEZrNxCABQOROAAAAA ABBMAAQAAACAYAIgAAAAAAQTAAEAAAAgmAAIAAAAAMEEQAAAAAAIJgACAAAAQDABEAAAAACCCYAA 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 wQRAAAAAAAgmAAIAAABAMAEQAAAAAIIJgAAAAAAQTAAEAAAAgGACIAAAAAAEEwABAAAAIJgACAAA AADBBEAAAAAACCYAAgAAAEAwARAAAAAAggmnQKalAAAELklEQVSAAAAAABBMAAQAAACAYAIgAAAA AAQTAAEAAAAgmAAIAAAAAMEEQAAAAAAIJgACAAAAQDABEAAAAACCCYAAAAAAEEwABAAAAIBgAiAA AAAABBMAAQAAACCYAAgAAAAAwQRAAAAAAAgmAAIAAABAMAEQAAAAAIIJgAAAAAAQTAAEAAAAgGAC IAAAAAAEEwABAAAAIJgACAAAAADBBEAAAAAACCYAAgAAAEAwARAAAAAAggmAAAAAABBMAAQAAACA YAIgAAAAAAQTAAEAAAAgmAAIAAAAAMEEQAAAAAAIJgACAAAAQDABEAAAAACCCYAAAAAAEEwABAAA AIBgAiAAAAAABBMAAQAAACCYAAgAAAAAwQRAAAAAAAgmAAIAAABAMAEQAAAAAIIJgAAAAAAQTAAE AAAAgGACIAAAAAAEEwABAAAAIJgACAAAAADBBEAAAAAACCYAAgAAAEAwARAAAAAAggmAAAAAABBM AAQAAACAYAIgAAAAAAQTAAEAAAAgmAAIAAAAAMEEQAAAAAAIJgACAAAAQDABEAAAAACCCYAAAAAA EEwABAAAAIBgAiAAAAAABBMAAQAAACCYAAgAAAAAwQRAAAAAAAgmAAIAAABAMAEQAAAAAIIJgAAA AAAQTAAEAAAAgGACIAAAAAAEEwABAAAAIJgACAAAAADBBEAAAAAACCYAAgAAAEAwARAAAAAAggmA AAAAABBMAAQAAACAYAIgAAAAAAQTAAEAAAAgmAAIAAAAAMEEQAAAAAAIJgACAAAAQDABEAAAAACC CYAAAAAAEEwABAAAAIBgAiAAAAAABBMAAQAAACCYAAgAAAAAwQRAAAAAAAgmAAIAAABAMAEQAAAA AIIJgAAAAAAQTAAEAAAAgGACIAAAAAAEEwABAAAAIJgACAAAAADBBEAAAAAACCYAAgAAAEAwARAA gP9vxw5kAAAAAAb5W9/jK4wAABgTgAAAAAAwJgABAAAAYEwAAgAAAMCYAAQAAACAMQEIAAAAAGMC EAAAAADGBCAAAAAAjAlAAAAAABgTgAAAAAAwJgABAAAAYEwAAgAAAMCYAAQAAACAMQEIAAAAAGMC EAAAAADGBCAAAAAAjAlAAAAAABgTgAAAAAAwJgABAAAAYEwAAgAAAMCYAAQAAACAMQEIAAAAAGMC EAAAAADGBCAAAAAAjAlAAAAAABgTgAAAAAAwJgABAAAAYEwAAgAAAMCYAAQAAACAMQEIAAAAAGMC EAAAAADGBCAAAAAAjAlAAAAAABgTgAAAAAAwJgABAAAAYEwAAgAAAMCYAAQAAACAMQEIAAAAAGMC EAAAAADGBCAAAAAAjAlAAAAAABgTgAAAAAAwJgABAAAAYEwAAgAAAMCYAAQAAACAMQEIAAAAAGMC EAAAAADGBCAAAAAAjAlAAAAAABgLpvtOWv0JxzcAAAAASUVORK5CYII= --part52d8554de70428.92881097 Content-Type: text/x-csrc; name="=?iso-8859-2?B?dHJlZXMuYw==?=" Content-Transfer-Encoding: base64 Content-Disposition: attachment; filename="=?iso-8859-2?B?dHJlZXMuYw==?=" LyogdHJlZXMuYyAtLSBvdXRwdXQgZGVmbGF0ZWQgZGF0YSB1c2luZyBIdWZmbWFuIGNvZGluZwog KiBDb3B5cmlnaHQgKEMpIDE5OTItMTk5MyBKZWFuLWxvdXAgR2FpbGx5CiAqIFRoaXMgaXMgZnJl ZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdCB1bmRl ciB0aGUKICogdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLCBzZWUgdGhl IGZpbGUgQ09QWUlORy4KICovCgovKgogKiAgUFVSUE9TRQogKgogKiAgICAgIEVuY29kZSB2YXJp b3VzIHNldHMgb2Ygc291cmNlIHZhbHVlcyB1c2luZyB2YXJpYWJsZS1sZW5ndGgKICogICAgICBi aW5hcnkgY29kZSB0cmVlcy4KICoKICogIERJU0NVU1NJT04KICoKICogICAgICBUaGUgUEtaSVAg ImRlZmxhdGlvbiIgcHJvY2VzcyB1c2VzIHNldmVyYWwgSHVmZm1hbiB0cmVlcy4gVGhlIG1vcmUK ICogICAgICBjb21tb24gc291cmNlIHZhbHVlcyBhcmUgcmVwcmVzZW50ZWQgYnkgc2hvcnRlciBi aXQgc2VxdWVuY2VzLgogKgogKiAgICAgIEVhY2ggY29kZSB0cmVlIGlzIHN0b3JlZCBpbiB0aGUg WklQIGZpbGUgaW4gYSBjb21wcmVzc2VkIGZvcm0KICogICAgICB3aGljaCBpcyBpdHNlbGYgYSBI dWZmbWFuIGVuY29kaW5nIG9mIHRoZSBsZW5ndGhzIG9mCiAqICAgICAgYWxsIHRoZSBjb2RlIHN0 cmluZ3MgKGluIGFzY2VuZGluZyBvcmRlciBieSBzb3VyY2UgdmFsdWVzKS4KICogICAgICBUaGUg YWN0dWFsIGNvZGUgc3RyaW5ncyBhcmUgcmVjb25zdHJ1Y3RlZCBmcm9tIHRoZSBsZW5ndGhzIGlu CiAqICAgICAgdGhlIFVOWklQIHByb2Nlc3MsIGFzIGRlc2NyaWJlZCBpbiB0aGUgImFwcGxpY2F0 aW9uIG5vdGUiCiAqICAgICAgKEFQUE5PVEUuVFhUKSBkaXN0cmlidXRlZCBhcyBwYXJ0IG9mIFBL V0FSRSdzIFBLWklQIHByb2dyYW0uCiAqCiAqICBSRUZFUkVOQ0VTCiAqCiAqICAgICAgTHluY2gs IFRob21hcyBKLgogKiAgICAgICAgICBEYXRhIENvbXByZXNzaW9uOiAgVGVjaG5pcXVlcyBhbmQg QXBwbGljYXRpb25zLCBwcC4gNTMtNTUuCiAqICAgICAgICAgIExpZmV0aW1lIExlYXJuaW5nIFB1 YmxpY2F0aW9ucywgMTk4NS4gIElTQk4gMC01MzQtMDM0MTgtNy4KICoKICogICAgICBTdG9yZXIs IEphbWVzIEEuCiAqICAgICAgICAgIERhdGEgQ29tcHJlc3Npb246ICBNZXRob2RzIGFuZCBUaGVv cnksIHBwLiA0OS01MC4KICogICAgICAgICAgQ29tcHV0ZXIgU2NpZW5jZSBQcmVzcywgMTk4OC4g IElTQk4gMC03MTY3LTgxNTYtNS4KICoKICogICAgICBTZWRnZXdpY2ssIFIuCiAqICAgICAgICAg IEFsZ29yaXRobXMsIHAyOTAuCiAqICAgICAgICAgIEFkZGlzb24tV2VzbGV5LCAxOTgzLiBJU0JO IDAtMjAxLTA2NjcyLTYuCiAqCiAqICBJTlRFUkZBQ0UKICoKICogICAgICB2b2lkIGN0X2luaXQg KHVzaCAqYXR0ciwgaW50ICptZXRob2RwKQogKiAgICAgICAgICBBbGxvY2F0ZSB0aGUgbWF0Y2gg YnVmZmVyLCBpbml0aWFsaXplIHRoZSB2YXJpb3VzIHRhYmxlcyBhbmQgc2F2ZQogKiAgICAgICAg ICB0aGUgbG9jYXRpb24gb2YgdGhlIGludGVybmFsIGZpbGUgYXR0cmlidXRlIChhc2NpaS9iaW5h cnkpIGFuZAogKiAgICAgICAgICBtZXRob2QgKERFRkxBVEUvU1RPUkUpCiAqCiAqICAgICAgdm9p ZCBjdF90YWxseSAoaW50IGRpc3QsIGludCBsYyk7CiAqICAgICAgICAgIFNhdmUgdGhlIG1hdGNo IGluZm8gYW5kIHRhbGx5IHRoZSBmcmVxdWVuY3kgY291bnRzLgogKgogKiAgICAgIGxvbmcgZmx1 c2hfYmxvY2sgKGNoYXIgKmJ1ZiwgdWxnIHN0b3JlZF9sZW4sIGludCBlb2YpCiAqICAgICAgICAg IERldGVybWluZSB0aGUgYmVzdCBlbmNvZGluZyBmb3IgdGhlIGN1cnJlbnQgYmxvY2s6IGR5bmFt aWMgdHJlZXMsCiAqICAgICAgICAgIHN0YXRpYyB0cmVlcyBvciBzdG9yZSwgYW5kIG91dHB1dCB0 aGUgZW5jb2RlZCBibG9jayB0byB0aGUgemlwCiAqICAgICAgICAgIGZpbGUuIFJldHVybnMgdGhl IHRvdGFsIGNvbXByZXNzZWQgbGVuZ3RoIGZvciB0aGUgZmlsZSBzbyBmYXIuCiAqCiAqLwoKI2lu Y2x1ZGUgPGN0eXBlLmg+CgojaW5jbHVkZSAidGFpbG9yLmgiCiNpbmNsdWRlICJnemlwLmgiCgoj aWZkZWYgUkNTSUQKc3RhdGljIGNoYXIgcmNzaWRbXSA9ICIkSWQ6IHRyZWVzLmMsdiAwLjEyIDE5 OTMvMDYvMTAgMTM6Mjc6NTQgamxvdXAgRXhwICQiOwojZW5kaWYKCi8qID09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PQogKiBDb25zdGFudHMKICovCgojZGVmaW5lIE1BWF9CSVRTIDE1Ci8qIEFsbCBjb2RlcyBt dXN0IG5vdCBleGNlZWQgTUFYX0JJVFMgYml0cyAqLwoKI2RlZmluZSBNQVhfQkxfQklUUyA3Ci8q IEJpdCBsZW5ndGggY29kZXMgbXVzdCBub3QgZXhjZWVkIE1BWF9CTF9CSVRTIGJpdHMgKi8KCiNk ZWZpbmUgTEVOR1RIX0NPREVTIDI5Ci8qIG51bWJlciBvZiBsZW5ndGggY29kZXMsIG5vdCBjb3Vu dGluZyB0aGUgc3BlY2lhbCBFTkRfQkxPQ0sgY29kZSAqLwoKI2RlZmluZSBMSVRFUkFMUyAgMjU2 Ci8qIG51bWJlciBvZiBsaXRlcmFsIGJ5dGVzIDAuLjI1NSAqLwoKI2RlZmluZSBFTkRfQkxPQ0sg MjU2Ci8qIGVuZCBvZiBibG9jayBsaXRlcmFsIGNvZGUgKi8KCiNkZWZpbmUgTF9DT0RFUyAoTElU RVJBTFMrMStMRU5HVEhfQ09ERVMpCi8qIG51bWJlciBvZiBMaXRlcmFsIG9yIExlbmd0aCBjb2Rl cywgaW5jbHVkaW5nIHRoZSBFTkRfQkxPQ0sgY29kZSAqLwoKI2RlZmluZSBEX0NPREVTICAgMzAK LyogbnVtYmVyIG9mIGRpc3RhbmNlIGNvZGVzICovCgojZGVmaW5lIEJMX0NPREVTICAxOQovKiBu dW1iZXIgb2YgY29kZXMgdXNlZCB0byB0cmFuc2ZlciB0aGUgYml0IGxlbmd0aHMgKi8KCgpsb2Nh bCBpbnQgbmVhciBleHRyYV9sYml0c1tMRU5HVEhfQ09ERVNdIC8qIGV4dHJhIGJpdHMgZm9yIGVh Y2ggbGVuZ3RoIGNvZGUgKi8KICAgPSB7MCwwLDAsMCwwLDAsMCwwLDEsMSwxLDEsMiwyLDIsMiwz LDMsMywzLDQsNCw0LDQsNSw1LDUsNSwwfTsKCmxvY2FsIGludCBuZWFyIGV4dHJhX2RiaXRzW0Rf Q09ERVNdIC8qIGV4dHJhIGJpdHMgZm9yIGVhY2ggZGlzdGFuY2UgY29kZSAqLwogICA9IHswLDAs MCwwLDEsMSwyLDIsMywzLDQsNCw1LDUsNiw2LDcsNyw4LDgsOSw5LDEwLDEwLDExLDExLDEyLDEy LDEzLDEzfTsKCmxvY2FsIGludCBuZWFyIGV4dHJhX2JsYml0c1tCTF9DT0RFU10vKiBleHRyYSBi aXRzIGZvciBlYWNoIGJpdCBsZW5ndGggY29kZSAqLwogICA9IHswLDAsMCwwLDAsMCwwLDAsMCww LDAsMCwwLDAsMCwwLDIsMyw3fTsKCiNkZWZpbmUgU1RPUkVEX0JMT0NLIDAKI2RlZmluZSBTVEFU SUNfVFJFRVMgMQojZGVmaW5lIERZTl9UUkVFUyAgICAyCi8qIFRoZSB0aHJlZSBraW5kcyBvZiBi bG9jayB0eXBlICovCgojaWZuZGVmIExJVF9CVUZTSVpFCiMgIGlmZGVmIFNNQUxMX01FTQojICAg IGRlZmluZSBMSVRfQlVGU0laRSAgMHgyMDAwCiMgIGVsc2UKIyAgaWZkZWYgTUVESVVNX01FTQoj ICAgIGRlZmluZSBMSVRfQlVGU0laRSAgMHg0MDAwCiMgIGVsc2UKIyAgICBkZWZpbmUgTElUX0JV RlNJWkUgIDB4ODAwMAojICBlbmRpZgojICBlbmRpZgojZW5kaWYKI2lmbmRlZiBESVNUX0JVRlNJ WkUKIyAgZGVmaW5lIERJU1RfQlVGU0laRSAgTElUX0JVRlNJWkUKI2VuZGlmCi8qIFNpemVzIG9m IG1hdGNoIGJ1ZmZlcnMgZm9yIGxpdGVyYWxzL2xlbmd0aHMgYW5kIGRpc3RhbmNlcy4gIFRoZXJl IGFyZQogKiA0IHJlYXNvbnMgZm9yIGxpbWl0aW5nIExJVF9CVUZTSVpFIHRvIDY0SzoKICogICAt IGZyZXF1ZW5jaWVzIGNhbiBiZSBrZXB0IGluIDE2IGJpdCBjb3VudGVycwogKiAgIC0gaWYgY29t cHJlc3Npb24gaXMgbm90IHN1Y2Nlc3NmdWwgZm9yIHRoZSBmaXJzdCBibG9jaywgYWxsIGlucHV0 IGRhdGEgaXMKICogICAgIHN0aWxsIGluIHRoZSB3aW5kb3cgc28gd2UgY2FuIHN0aWxsIGVtaXQg YSBzdG9yZWQgYmxvY2sgZXZlbiB3aGVuIGlucHV0CiAqICAgICBjb21lcyBmcm9tIHN0YW5kYXJk IGlucHV0LiAgKFRoaXMgY2FuIGFsc28gYmUgZG9uZSBmb3IgYWxsIGJsb2NrcyBpZgogKiAgICAg TElUX0JVRlNJWkUgaXMgbm90IGdyZWF0ZXIgdGhhbiAzMksuKQogKiAgIC0gaWYgY29tcHJlc3Np b24gaXMgbm90IHN1Y2Nlc3NmdWwgZm9yIGEgZmlsZSBzbWFsbGVyIHRoYW4gNjRLLCB3ZSBjYW4K ICogICAgIGV2ZW4gZW1pdCBhIHN0b3JlZCBmaWxlIGluc3RlYWQgb2YgYSBzdG9yZWQgYmxvY2sg KHNhdmluZyA1IGJ5dGVzKS4KICogICAtIGNyZWF0aW5nIG5ldyBIdWZmbWFuIHRyZWVzIGxlc3Mg ZnJlcXVlbnRseSBtYXkgbm90IHByb3ZpZGUgZmFzdAogKiAgICAgYWRhcHRhdGlvbiB0byBjaGFu Z2VzIGluIHRoZSBpbnB1dCBkYXRhIHN0YXRpc3RpY3MuIChUYWtlIGZvcgogKiAgICAgZXhhbXBs ZSBhIGJpbmFyeSBmaWxlIHdpdGggcG9vcmx5IGNvbXByZXNzaWJsZSBjb2RlIGZvbGxvd2VkIGJ5 CiAqICAgICBhIGhpZ2hseSBjb21wcmVzc2libGUgc3RyaW5nIHRhYmxlLikgU21hbGxlciBidWZm ZXIgc2l6ZXMgZ2l2ZQogKiAgICAgZmFzdCBhZGFwdGF0aW9uIGJ1dCBoYXZlIG9mIGNvdXJzZSB0 aGUgb3ZlcmhlYWQgb2YgdHJhbnNtaXR0aW5nIHRyZWVzCiAqICAgICBtb3JlIGZyZXF1ZW50bHku CiAqICAgLSBJIGNhbid0IGNvdW50IGFib3ZlIDQKICogVGhlIGN1cnJlbnQgY29kZSBpcyBnZW5l cmFsIGFuZCBhbGxvd3MgRElTVF9CVUZTSVpFIDwgTElUX0JVRlNJWkUgKHRvIHNhdmUKICogbWVt b3J5IGF0IHRoZSBleHBlbnNlIG9mIGNvbXByZXNzaW9uKS4gU29tZSBvcHRpbWl6YXRpb25zIHdv dWxkIGJlIHBvc3NpYmxlCiAqIGlmIHdlIHJlbHkgb24gRElTVF9CVUZTSVpFID09IExJVF9CVUZT SVpFLgogKi8KI2lmIExJVF9CVUZTSVpFID4gSU5CVUZTSVoKICAgIGVycm9yIGNhbm5vdCBvdmVy bGF5IGxfYnVmIGFuZCBpbmJ1ZgojZW5kaWYKCiNkZWZpbmUgUkVQXzNfNiAgICAgIDE2Ci8qIHJl cGVhdCBwcmV2aW91cyBiaXQgbGVuZ3RoIDMtNiB0aW1lcyAoMiBiaXRzIG9mIHJlcGVhdCBjb3Vu dCkgKi8KCiNkZWZpbmUgUkVQWl8zXzEwICAgIDE3Ci8qIHJlcGVhdCBhIHplcm8gbGVuZ3RoIDMt MTAgdGltZXMgICgzIGJpdHMgb2YgcmVwZWF0IGNvdW50KSAqLwoKI2RlZmluZSBSRVBaXzExXzEz OCAgMTgKLyogcmVwZWF0IGEgemVybyBsZW5ndGggMTEtMTM4IHRpbWVzICAoNyBiaXRzIG9mIHJl cGVhdCBjb3VudCkgKi8KCi8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogKiBMb2NhbCBkYXRhCiAqLwoK LyogRGF0YSBzdHJ1Y3R1cmUgZGVzY3JpYmluZyBhIHNpbmdsZSB2YWx1ZSBhbmQgaXRzIGNvZGUg c3RyaW5nLiAqLwp0eXBlZGVmIHN0cnVjdCBjdF9kYXRhIHsKICAgIHVuaW9uIHsKICAgICAgICB1 c2ggIGZyZXE7ICAgICAgIC8qIGZyZXF1ZW5jeSBjb3VudCAqLwogICAgICAgIHVzaCAgY29kZTsg ICAgICAgLyogYml0IHN0cmluZyAqLwogICAgfSBmYzsKICAgIHVuaW9uIHsKICAgICAgICB1c2gg IGRhZDsgICAgICAgIC8qIGZhdGhlciBub2RlIGluIEh1ZmZtYW4gdHJlZSAqLwogICAgICAgIHVz aCAgbGVuOyAgICAgICAgLyogbGVuZ3RoIG9mIGJpdCBzdHJpbmcgKi8KICAgIH0gZGw7Cn0gY3Rf ZGF0YTsKCiNkZWZpbmUgRnJlcSBmYy5mcmVxCiNkZWZpbmUgQ29kZSBmYy5jb2RlCiNkZWZpbmUg RGFkICBkbC5kYWQKI2RlZmluZSBMZW4gIGRsLmxlbgoKI2RlZmluZSBIRUFQX1NJWkUgKDIqTF9D T0RFUysxKQovKiBtYXhpbXVtIGhlYXAgc2l6ZSAqLwoKbG9jYWwgY3RfZGF0YSBuZWFyIGR5bl9s dHJlZVtIRUFQX1NJWkVdOyAgIC8qIGxpdGVyYWwgYW5kIGxlbmd0aCB0cmVlICovCmxvY2FsIGN0 X2RhdGEgbmVhciBkeW5fZHRyZWVbMipEX0NPREVTKzFdOyAvKiBkaXN0YW5jZSB0cmVlICovCgps b2NhbCBjdF9kYXRhIG5lYXIgc3RhdGljX2x0cmVlW0xfQ09ERVMrMl07Ci8qIFRoZSBzdGF0aWMg bGl0ZXJhbCB0cmVlLiBTaW5jZSB0aGUgYml0IGxlbmd0aHMgYXJlIGltcG9zZWQsIHRoZXJlIGlz IG5vCiAqIG5lZWQgZm9yIHRoZSBMX0NPREVTIGV4dHJhIGNvZGVzIHVzZWQgZHVyaW5nIGhlYXAg Y29uc3RydWN0aW9uLiBIb3dldmVyCiAqIFRoZSBjb2RlcyAyODYgYW5kIDI4NyBhcmUgbmVlZGVk IHRvIGJ1aWxkIGEgY2Fub25pY2FsIHRyZWUgKHNlZSBjdF9pbml0CiAqIGJlbG93KS4KICovCgps b2NhbCBjdF9kYXRhIG5lYXIgc3RhdGljX2R0cmVlW0RfQ09ERVNdOwovKiBUaGUgc3RhdGljIGRp c3RhbmNlIHRyZWUuIChBY3R1YWxseSBhIHRyaXZpYWwgdHJlZSBzaW5jZSBhbGwgY29kZXMgdXNl CiAqIDUgYml0cy4pCiAqLwoKbG9jYWwgY3RfZGF0YSBuZWFyIGJsX3RyZWVbMipCTF9DT0RFUysx XTsKLyogSHVmZm1hbiB0cmVlIGZvciB0aGUgYml0IGxlbmd0aHMgKi8KCnR5cGVkZWYgc3RydWN0 IHRyZWVfZGVzYyB7CiAgICBjdF9kYXRhIG5lYXIgKmR5bl90cmVlOyAgICAgIC8qIHRoZSBkeW5h bWljIHRyZWUgKi8KICAgIGN0X2RhdGEgbmVhciAqc3RhdGljX3RyZWU7ICAgLyogY29ycmVzcG9u ZGluZyBzdGF0aWMgdHJlZSBvciBOVUxMICovCiAgICBpbnQgICAgIG5lYXIgKmV4dHJhX2JpdHM7 ICAgIC8qIGV4dHJhIGJpdHMgZm9yIGVhY2ggY29kZSBvciBOVUxMICovCiAgICBpbnQgICAgIGV4 dHJhX2Jhc2U7ICAgICAgICAgIC8qIGJhc2UgaW5kZXggZm9yIGV4dHJhX2JpdHMgKi8KICAgIGlu dCAgICAgZWxlbXM7ICAgICAgICAgICAgICAgLyogbWF4IG51bWJlciBvZiBlbGVtZW50cyBpbiB0 aGUgdHJlZSAqLwogICAgaW50ICAgICBtYXhfbGVuZ3RoOyAgICAgICAgICAvKiBtYXggYml0IGxl bmd0aCBmb3IgdGhlIGNvZGVzICovCiAgICBpbnQgICAgIG1heF9jb2RlOyAgICAgICAgICAgIC8q IGxhcmdlc3QgY29kZSB3aXRoIG5vbiB6ZXJvIGZyZXF1ZW5jeSAqLwp9IHRyZWVfZGVzYzsKCmxv Y2FsIHRyZWVfZGVzYyBuZWFyIGxfZGVzYyA9CntkeW5fbHRyZWUsIHN0YXRpY19sdHJlZSwgZXh0 cmFfbGJpdHMsIExJVEVSQUxTKzEsIExfQ09ERVMsIE1BWF9CSVRTLCAwfTsKCmxvY2FsIHRyZWVf ZGVzYyBuZWFyIGRfZGVzYyA9CntkeW5fZHRyZWUsIHN0YXRpY19kdHJlZSwgZXh0cmFfZGJpdHMs IDAsICAgICAgICAgIERfQ09ERVMsIE1BWF9CSVRTLCAwfTsKCmxvY2FsIHRyZWVfZGVzYyBuZWFy IGJsX2Rlc2MgPQp7YmxfdHJlZSwgKGN0X2RhdGEgbmVhciAqKTAsIGV4dHJhX2JsYml0cywgMCwg ICAgICBCTF9DT0RFUywgTUFYX0JMX0JJVFMsIDB9OwoKCmxvY2FsIHVzaCBuZWFyIGJsX2NvdW50 W01BWF9CSVRTKzFdOwovKiBudW1iZXIgb2YgY29kZXMgYXQgZWFjaCBiaXQgbGVuZ3RoIGZvciBh biBvcHRpbWFsIHRyZWUgKi8KCmxvY2FsIHVjaCBuZWFyIGJsX29yZGVyW0JMX0NPREVTXQogICA9 IHsxNiwxNywxOCwwLDgsNyw5LDYsMTAsNSwxMSw0LDEyLDMsMTMsMiwxNCwxLDE1fTsKLyogVGhl IGxlbmd0aHMgb2YgdGhlIGJpdCBsZW5ndGggY29kZXMgYXJlIHNlbnQgaW4gb3JkZXIgb2YgZGVj cmVhc2luZwogKiBwcm9iYWJpbGl0eSwgdG8gYXZvaWQgdHJhbnNtaXR0aW5nIHRoZSBsZW5ndGhz IGZvciB1bnVzZWQgYml0IGxlbmd0aCBjb2Rlcy4KICovCgpsb2NhbCBpbnQgbmVhciBoZWFwWzIq TF9DT0RFUysxXTsgLyogaGVhcCB1c2VkIHRvIGJ1aWxkIHRoZSBIdWZmbWFuIHRyZWVzICovCmxv Y2FsIGludCBoZWFwX2xlbjsgICAgICAgICAgICAgICAvKiBudW1iZXIgb2YgZWxlbWVudHMgaW4g dGhlIGhlYXAgKi8KbG9jYWwgaW50IGhlYXBfbWF4OyAgICAgICAgICAgICAgIC8qIGVsZW1lbnQg b2YgbGFyZ2VzdCBmcmVxdWVuY3kgKi8KLyogVGhlIHNvbnMgb2YgaGVhcFtuXSBhcmUgaGVhcFsy Km5dIGFuZCBoZWFwWzIqbisxXS4gaGVhcFswXSBpcyBub3QgdXNlZC4KICogVGhlIHNhbWUgaGVh cCBhcnJheSBpcyB1c2VkIHRvIGJ1aWxkIGFsbCB0cmVlcy4KICovCgpsb2NhbCB1Y2ggbmVhciBk ZXB0aFsyKkxfQ09ERVMrMV07Ci8qIERlcHRoIG9mIGVhY2ggc3VidHJlZSB1c2VkIGFzIHRpZSBi cmVha2VyIGZvciB0cmVlcyBvZiBlcXVhbCBmcmVxdWVuY3kgKi8KCmxvY2FsIHVjaCBsZW5ndGhf Y29kZVtNQVhfTUFUQ0gtTUlOX01BVENIKzFdOwovKiBsZW5ndGggY29kZSBmb3IgZWFjaCBub3Jt YWxpemVkIG1hdGNoIGxlbmd0aCAoMCA9PSBNSU5fTUFUQ0gpICovCgpsb2NhbCB1Y2ggZGlzdF9j b2RlWzUxMl07Ci8qIGRpc3RhbmNlIGNvZGVzLiBUaGUgZmlyc3QgMjU2IHZhbHVlcyBjb3JyZXNw b25kIHRvIHRoZSBkaXN0YW5jZXMKICogMyAuLiAyNTgsIHRoZSBsYXN0IDI1NiB2YWx1ZXMgY29y cmVzcG9uZCB0byB0aGUgdG9wIDggYml0cyBvZgogKiB0aGUgMTUgYml0IGRpc3RhbmNlcy4KICov Cgpsb2NhbCBpbnQgbmVhciBiYXNlX2xlbmd0aFtMRU5HVEhfQ09ERVNdOwovKiBGaXJzdCBub3Jt YWxpemVkIGxlbmd0aCBmb3IgZWFjaCBjb2RlICgwID0gTUlOX01BVENIKSAqLwoKbG9jYWwgaW50 IG5lYXIgYmFzZV9kaXN0W0RfQ09ERVNdOwovKiBGaXJzdCBub3JtYWxpemVkIGRpc3RhbmNlIGZv ciBlYWNoIGNvZGUgKDAgPSBkaXN0YW5jZSBvZiAxKSAqLwoKI2RlZmluZSBsX2J1ZiBpbmJ1Zgov KiBERUNMQVJFKHVjaCwgbF9idWYsIExJVF9CVUZTSVpFKTsgIGJ1ZmZlciBmb3IgbGl0ZXJhbHMg b3IgbGVuZ3RocyAqLwoKLyogREVDTEFSRSh1c2gsIGRfYnVmLCBESVNUX0JVRlNJWkUpOyBidWZm ZXIgZm9yIGRpc3RhbmNlcyAqLwoKbG9jYWwgdWNoIG5lYXIgZmxhZ19idWZbKExJVF9CVUZTSVpF LzgpXTsKLyogZmxhZ19idWYgaXMgYSBiaXQgYXJyYXkgZGlzdGluZ3Vpc2hpbmcgbGl0ZXJhbHMg ZnJvbSBsZW5ndGhzIGluCiAqIGxfYnVmLCB0aHVzIGluZGljYXRpbmcgdGhlIHByZXNlbmNlIG9y IGFic2VuY2Ugb2YgYSBkaXN0YW5jZS4KICovCgpsb2NhbCB1bnNpZ25lZCBsYXN0X2xpdDsgICAg LyogcnVubmluZyBpbmRleCBpbiBsX2J1ZiAqLwpsb2NhbCB1bnNpZ25lZCBsYXN0X2Rpc3Q7ICAg LyogcnVubmluZyBpbmRleCBpbiBkX2J1ZiAqLwpsb2NhbCB1bnNpZ25lZCBsYXN0X2ZsYWdzOyAg LyogcnVubmluZyBpbmRleCBpbiBmbGFnX2J1ZiAqLwpsb2NhbCB1Y2ggZmxhZ3M7ICAgICAgICAg ICAgLyogY3VycmVudCBmbGFncyBub3QgeWV0IHNhdmVkIGluIGZsYWdfYnVmICovCmxvY2FsIHVj aCBmbGFnX2JpdDsgICAgICAgICAvKiBjdXJyZW50IGJpdCB1c2VkIGluIGZsYWdzICovCi8qIGJp dHMgYXJlIGZpbGxlZCBpbiBmbGFncyBzdGFydGluZyBhdCBiaXQgMCAobGVhc3Qgc2lnbmlmaWNh bnQpLgogKiBOb3RlOiB0aGVzZSBmbGFncyBhcmUgb3ZlcmtpbGwgaW4gdGhlIGN1cnJlbnQgY29k ZSBzaW5jZSB3ZSBkb24ndAogKiB0YWtlIGFkdmFudGFnZSBvZiBESVNUX0JVRlNJWkUgPT0gTElU X0JVRlNJWkUuCiAqLwoKbG9jYWwgdWxnIG9wdF9sZW47ICAgICAgICAvKiBiaXQgbGVuZ3RoIG9m IGN1cnJlbnQgYmxvY2sgd2l0aCBvcHRpbWFsIHRyZWVzICovCmxvY2FsIHVsZyBzdGF0aWNfbGVu OyAgICAgLyogYml0IGxlbmd0aCBvZiBjdXJyZW50IGJsb2NrIHdpdGggc3RhdGljIHRyZWVzICov Cgpsb2NhbCB1bGcgY29tcHJlc3NlZF9sZW47IC8qIHRvdGFsIGJpdCBsZW5ndGggb2YgY29tcHJl c3NlZCBmaWxlICovCgpsb2NhbCB1bGcgaW5wdXRfbGVuOyAgICAgIC8qIHRvdGFsIGJ5dGUgbGVu Z3RoIG9mIGlucHV0IGZpbGUgKi8KLyogaW5wdXRfbGVuIGlzIGZvciBkZWJ1Z2dpbmcgb25seSBz aW5jZSB3ZSBjYW4gZ2V0IGl0IGJ5IG90aGVyIG1lYW5zLiAqLwoKdXNoICpmaWxlX3R5cGU7ICAg ICAgICAvKiBwb2ludGVyIHRvIFVOS05PV04sIEJJTkFSWSBvciBBU0NJSSAqLwppbnQgKmZpbGVf bWV0aG9kOyAgICAgIC8qIHBvaW50ZXIgdG8gREVGTEFURSBvciBTVE9SRSAqLwoKI2lmZGVmIERF QlVHCmV4dGVybiB1bGcgYml0c19zZW50OyAgLyogYml0IGxlbmd0aCBvZiB0aGUgY29tcHJlc3Nl ZCBkYXRhICovCmV4dGVybiBsb25nIGlzaXplOyAgICAgLyogYnl0ZSBsZW5ndGggb2YgaW5wdXQg ZmlsZSAqLwojZW5kaWYKCmV4dGVybiBsb25nIGJsb2NrX3N0YXJ0OyAgICAgICAvKiB3aW5kb3cg b2Zmc2V0IG9mIGN1cnJlbnQgYmxvY2sgKi8KZXh0ZXJuIHVuc2lnbmVkIG5lYXIgc3Ryc3RhcnQ7 IC8qIHdpbmRvdyBvZmZzZXQgb2YgY3VycmVudCBzdHJpbmcgKi8KCi8qID09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PQogKiBMb2NhbCAoc3RhdGljKSByb3V0aW5lcyBpbiB0aGlzIGZpbGUuCiAqLwoKbG9jYWwg dm9pZCBpbml0X2Jsb2NrICAgICBPRigodm9pZCkpOwpsb2NhbCB2b2lkIHBxZG93bmhlYXAgICAg IE9GKChjdF9kYXRhIG5lYXIgKnRyZWUsIGludCBrKSk7CmxvY2FsIHZvaWQgZ2VuX2JpdGxlbiAg ICAgT0YoKHRyZWVfZGVzYyBuZWFyICpkZXNjKSk7CmxvY2FsIHZvaWQgZ2VuX2NvZGVzICAgICAg T0YoKGN0X2RhdGEgbmVhciAqdHJlZSwgaW50IG1heF9jb2RlKSk7CmxvY2FsIHZvaWQgYnVpbGRf dHJlZSAgICAgT0YoKHRyZWVfZGVzYyBuZWFyICpkZXNjKSk7CmxvY2FsIHZvaWQgc2Nhbl90cmVl ICAgICAgT0YoKGN0X2RhdGEgbmVhciAqdHJlZSwgaW50IG1heF9jb2RlKSk7CmxvY2FsIHZvaWQg c2VuZF90cmVlICAgICAgT0YoKGN0X2RhdGEgbmVhciAqdHJlZSwgaW50IG1heF9jb2RlKSk7Cmxv Y2FsIGludCAgYnVpbGRfYmxfdHJlZSAgT0YoKHZvaWQpKTsKbG9jYWwgdm9pZCBzZW5kX2FsbF90 cmVlcyBPRigoaW50IGxjb2RlcywgaW50IGRjb2RlcywgaW50IGJsY29kZXMpKTsKbG9jYWwgdm9p ZCBjb21wcmVzc19ibG9jayBPRigoY3RfZGF0YSBuZWFyICpsdHJlZSwgY3RfZGF0YSBuZWFyICpk dHJlZSkpOwpsb2NhbCB2b2lkIHNldF9maWxlX3R5cGUgIE9GKCh2b2lkKSk7CgoKI2lmbmRlZiBE RUJVRwojICBkZWZpbmUgc2VuZF9jb2RlKGMsIHRyZWUpIHNlbmRfYml0cyh0cmVlW2NdLkNvZGUs IHRyZWVbY10uTGVuKQogICAvKiBTZW5kIGEgY29kZSBvZiB0aGUgZ2l2ZW4gdHJlZS4gYyBhbmQg dHJlZSBtdXN0IG5vdCBoYXZlIHNpZGUgZWZmZWN0cyAqLwoKI2Vsc2UgLyogREVCVUcgKi8KIyAg ZGVmaW5lIHNlbmRfY29kZShjLCB0cmVlKSBcCiAgICAgeyBpZiAodmVyYm9zZT4xKSBmcHJpbnRm KHN0ZGVyciwiXG5jZCAlM2QgIiwoYykpOyBcCiAgICAgICBzZW5kX2JpdHModHJlZVtjXS5Db2Rl LCB0cmVlW2NdLkxlbik7IH0KI2VuZGlmCgojZGVmaW5lIGRfY29kZShkaXN0KSBcCiAgICgoZGlz dCkgPCAyNTYgPyBkaXN0X2NvZGVbZGlzdF0gOiBkaXN0X2NvZGVbMjU2KygoZGlzdCk+PjcpXSkK LyogTWFwcGluZyBmcm9tIGEgZGlzdGFuY2UgdG8gYSBkaXN0YW5jZSBjb2RlLiBkaXN0IGlzIHRo ZSBkaXN0YW5jZSAtIDEgYW5kCiAqIG11c3Qgbm90IGhhdmUgc2lkZSBlZmZlY3RzLiBkaXN0X2Nv ZGVbMjU2XSBhbmQgZGlzdF9jb2RlWzI1N10gYXJlIG5ldmVyCiAqIHVzZWQuCiAqLwoKI2RlZmlu ZSBNQVgoYSxiKSAoYSA+PSBiID8gYSA6IGIpCi8qIHRoZSBhcmd1bWVudHMgbXVzdCBub3QgaGF2 ZSBzaWRlIGVmZmVjdHMgKi8KCi8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogKiBBbGxvY2F0ZSB0aGUg bWF0Y2ggYnVmZmVyLCBpbml0aWFsaXplIHRoZSB2YXJpb3VzIHRhYmxlcyBhbmQgc2F2ZSB0aGUK ICogbG9jYXRpb24gb2YgdGhlIGludGVybmFsIGZpbGUgYXR0cmlidXRlIChhc2NpaS9iaW5hcnkp IGFuZCBtZXRob2QKICogKERFRkxBVEUvU1RPUkUpLgogKi8Kdm9pZCBjdF9pbml0KGF0dHIsIG1l dGhvZHApCiAgICB1c2ggICphdHRyOyAgIC8qIHBvaW50ZXIgdG8gaW50ZXJuYWwgZmlsZSBhdHRy aWJ1dGUgKi8KICAgIGludCAgKm1ldGhvZHA7IC8qIHBvaW50ZXIgdG8gY29tcHJlc3Npb24gbWV0 aG9kICovCnsKICAgIGludCBuOyAgICAgICAgLyogaXRlcmF0ZXMgb3ZlciB0cmVlIGVsZW1lbnRz ICovCiAgICBpbnQgYml0czsgICAgIC8qIGJpdCBjb3VudGVyICovCiAgICBpbnQgbGVuZ3RoOyAg IC8qIGxlbmd0aCB2YWx1ZSAqLwogICAgaW50IGNvZGU7ICAgICAvKiBjb2RlIHZhbHVlICovCiAg ICBpbnQgZGlzdDsgICAgIC8qIGRpc3RhbmNlIGluZGV4ICovCgogICAgZmlsZV90eXBlID0gYXR0 cjsKICAgIGZpbGVfbWV0aG9kID0gbWV0aG9kcDsKICAgIGNvbXByZXNzZWRfbGVuID0gaW5wdXRf bGVuID0gMEw7CiAgICAgICAgCiAgICBpZiAoc3RhdGljX2R0cmVlWzBdLkxlbiAhPSAwKSByZXR1 cm47IC8qIGN0X2luaXQgYWxyZWFkeSBjYWxsZWQgKi8KCiAgICAvKiBJbml0aWFsaXplIHRoZSBt YXBwaW5nIGxlbmd0aCAoMC4uMjU1KSAtPiBsZW5ndGggY29kZSAoMC4uMjgpICovCiAgICBsZW5n dGggPSAwOwogICAgZm9yIChjb2RlID0gMDsgY29kZSA8IExFTkdUSF9DT0RFUy0xOyBjb2RlKysp IHsKICAgICAgICBiYXNlX2xlbmd0aFtjb2RlXSA9IGxlbmd0aDsKICAgICAgICBmb3IgKG4gPSAw OyBuIDwgKDE8PGV4dHJhX2xiaXRzW2NvZGVdKTsgbisrKSB7CiAgICAgICAgICAgIGxlbmd0aF9j b2RlW2xlbmd0aCsrXSA9ICh1Y2gpY29kZTsKICAgICAgICB9CiAgICB9CiAgICBBc3NlcnQgKGxl bmd0aCA9PSAyNTYsICJjdF9pbml0OiBsZW5ndGggIT0gMjU2Iik7CiAgICAvKiBOb3RlIHRoYXQg dGhlIGxlbmd0aCAyNTUgKG1hdGNoIGxlbmd0aCAyNTgpIGNhbiBiZSByZXByZXNlbnRlZAogICAg ICogaW4gdHdvIGRpZmZlcmVudCB3YXlzOiBjb2RlIDI4NCArIDUgYml0cyBvciBjb2RlIDI4NSwg c28gd2UKICAgICAqIG92ZXJ3cml0ZSBsZW5ndGhfY29kZVsyNTVdIHRvIHVzZSB0aGUgYmVzdCBl bmNvZGluZzoKICAgICAqLwogICAgbGVuZ3RoX2NvZGVbbGVuZ3RoLTFdID0gKHVjaCljb2RlOwoK ICAgIC8qIEluaXRpYWxpemUgdGhlIG1hcHBpbmcgZGlzdCAoMC4uMzJLKSAtPiBkaXN0IGNvZGUg KDAuLjI5KSAqLwogICAgZGlzdCA9IDA7CiAgICBmb3IgKGNvZGUgPSAwIDsgY29kZSA8IDE2OyBj b2RlKyspIHsKICAgICAgICBiYXNlX2Rpc3RbY29kZV0gPSBkaXN0OwogICAgICAgIGZvciAobiA9 IDA7IG4gPCAoMTw8ZXh0cmFfZGJpdHNbY29kZV0pOyBuKyspIHsKICAgICAgICAgICAgZGlzdF9j b2RlW2Rpc3QrK10gPSAodWNoKWNvZGU7CiAgICAgICAgfQogICAgfQogICAgQXNzZXJ0IChkaXN0 ID09IDI1NiwgImN0X2luaXQ6IGRpc3QgIT0gMjU2Iik7CiAgICBkaXN0ID4+PSA3OyAvKiBmcm9t IG5vdyBvbiwgYWxsIGRpc3RhbmNlcyBhcmUgZGl2aWRlZCBieSAxMjggKi8KICAgIGZvciAoIDsg Y29kZSA8IERfQ09ERVM7IGNvZGUrKykgewogICAgICAgIGJhc2VfZGlzdFtjb2RlXSA9IGRpc3Qg PDwgNzsKICAgICAgICBmb3IgKG4gPSAwOyBuIDwgKDE8PChleHRyYV9kYml0c1tjb2RlXS03KSk7 IG4rKykgewogICAgICAgICAgICBkaXN0X2NvZGVbMjU2ICsgZGlzdCsrXSA9ICh1Y2gpY29kZTsK ICAgICAgICB9CiAgICB9CiAgICBBc3NlcnQgKGRpc3QgPT0gMjU2LCAiY3RfaW5pdDogMjU2K2Rp c3QgIT0gNTEyIik7CgogICAgLyogQ29uc3RydWN0IHRoZSBjb2RlcyBvZiB0aGUgc3RhdGljIGxp dGVyYWwgdHJlZSAqLwogICAgZm9yIChiaXRzID0gMDsgYml0cyA8PSBNQVhfQklUUzsgYml0cysr KSBibF9jb3VudFtiaXRzXSA9IDA7CiAgICBuID0gMDsKICAgIHdoaWxlIChuIDw9IDE0Mykgc3Rh dGljX2x0cmVlW24rK10uTGVuID0gOCwgYmxfY291bnRbOF0rKzsKICAgIHdoaWxlIChuIDw9IDI1 NSkgc3RhdGljX2x0cmVlW24rK10uTGVuID0gOSwgYmxfY291bnRbOV0rKzsKICAgIHdoaWxlIChu IDw9IDI3OSkgc3RhdGljX2x0cmVlW24rK10uTGVuID0gNywgYmxfY291bnRbN10rKzsKICAgIHdo aWxlIChuIDw9IDI4Nykgc3RhdGljX2x0cmVlW24rK10uTGVuID0gOCwgYmxfY291bnRbOF0rKzsK ICAgIC8qIENvZGVzIDI4NiBhbmQgMjg3IGRvIG5vdCBleGlzdCwgYnV0IHdlIG11c3QgaW5jbHVk ZSB0aGVtIGluIHRoZQogICAgICogdHJlZSBjb25zdHJ1Y3Rpb24gdG8gZ2V0IGEgY2Fub25pY2Fs IEh1ZmZtYW4gdHJlZSAobG9uZ2VzdCBjb2RlCiAgICAgKiBhbGwgb25lcykKICAgICAqLwogICAg Z2VuX2NvZGVzKChjdF9kYXRhIG5lYXIgKilzdGF0aWNfbHRyZWUsIExfQ09ERVMrMSk7CgogICAg LyogVGhlIHN0YXRpYyBkaXN0YW5jZSB0cmVlIGlzIHRyaXZpYWw6ICovCiAgICBmb3IgKG4gPSAw OyBuIDwgRF9DT0RFUzsgbisrKSB7CiAgICAgICAgc3RhdGljX2R0cmVlW25dLkxlbiA9IDU7CiAg ICAgICAgc3RhdGljX2R0cmVlW25dLkNvZGUgPSBiaV9yZXZlcnNlKG4sIDUpOwogICAgfQoKICAg IC8qIEluaXRpYWxpemUgdGhlIGZpcnN0IGJsb2NrIG9mIHRoZSBmaXJzdCBmaWxlOiAqLwogICAg aW5pdF9ibG9jaygpOwp9CgovKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KICogSW5pdGlhbGl6ZSBhIG5l dyBibG9jay4KICovCmxvY2FsIHZvaWQgaW5pdF9ibG9jaygpCnsKICAgIGludCBuOyAvKiBpdGVy YXRlcyBvdmVyIHRyZWUgZWxlbWVudHMgKi8KCiAgICAvKiBJbml0aWFsaXplIHRoZSB0cmVlcy4g Ki8KICAgIGZvciAobiA9IDA7IG4gPCBMX0NPREVTOyAgbisrKSBkeW5fbHRyZWVbbl0uRnJlcSA9 IDA7CiAgICBmb3IgKG4gPSAwOyBuIDwgRF9DT0RFUzsgIG4rKykgZHluX2R0cmVlW25dLkZyZXEg PSAwOwogICAgZm9yIChuID0gMDsgbiA8IEJMX0NPREVTOyBuKyspIGJsX3RyZWVbbl0uRnJlcSA9 IDA7CgogICAgZHluX2x0cmVlW0VORF9CTE9DS10uRnJlcSA9IDE7CiAgICBvcHRfbGVuID0gc3Rh dGljX2xlbiA9IDBMOwogICAgbGFzdF9saXQgPSBsYXN0X2Rpc3QgPSBsYXN0X2ZsYWdzID0gMDsK ICAgIGZsYWdzID0gMDsgZmxhZ19iaXQgPSAxOwp9CgojZGVmaW5lIFNNQUxMRVNUIDEKLyogSW5k ZXggd2l0aGluIHRoZSBoZWFwIGFycmF5IG9mIGxlYXN0IGZyZXF1ZW50IG5vZGUgaW4gdGhlIEh1 ZmZtYW4gdHJlZSAqLwoKCi8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogKiBSZW1vdmUgdGhlIHNtYWxs ZXN0IGVsZW1lbnQgZnJvbSB0aGUgaGVhcCBhbmQgcmVjcmVhdGUgdGhlIGhlYXAgd2l0aAogKiBv bmUgbGVzcyBlbGVtZW50LiBVcGRhdGVzIGhlYXAgYW5kIGhlYXBfbGVuLgogKi8KI2RlZmluZSBw cXJlbW92ZSh0cmVlLCB0b3ApIFwKe1wKICAgIHRvcCA9IGhlYXBbU01BTExFU1RdOyBcCiAgICBo ZWFwW1NNQUxMRVNUXSA9IGhlYXBbaGVhcF9sZW4tLV07IFwKICAgIHBxZG93bmhlYXAodHJlZSwg U01BTExFU1QpOyBcCn0KCi8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogKiBDb21wYXJlcyB0byBzdWJ0 cmVlcywgdXNpbmcgdGhlIHRyZWUgZGVwdGggYXMgdGllIGJyZWFrZXIgd2hlbgogKiB0aGUgc3Vi dHJlZXMgaGF2ZSBlcXVhbCBmcmVxdWVuY3kuIFRoaXMgbWluaW1pemVzIHRoZSB3b3JzdCBjYXNl IGxlbmd0aC4KICovCiNkZWZpbmUgc21hbGxlcih0cmVlLCBuLCBtKSBcCiAgICh0cmVlW25dLkZy ZXEgPCB0cmVlW21dLkZyZXEgfHwgXAogICAodHJlZVtuXS5GcmVxID09IHRyZWVbbV0uRnJlcSAm JiBkZXB0aFtuXSA8PSBkZXB0aFttXSkpCgovKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KICogUmVzdG9y ZSB0aGUgaGVhcCBwcm9wZXJ0eSBieSBtb3ZpbmcgZG93biB0aGUgdHJlZSBzdGFydGluZyBhdCBu b2RlIGssCiAqIGV4Y2hhbmdpbmcgYSBub2RlIHdpdGggdGhlIHNtYWxsZXN0IG9mIGl0cyB0d28g c29ucyBpZiBuZWNlc3NhcnksIHN0b3BwaW5nCiAqIHdoZW4gdGhlIGhlYXAgcHJvcGVydHkgaXMg cmUtZXN0YWJsaXNoZWQgKGVhY2ggZmF0aGVyIHNtYWxsZXIgdGhhbiBpdHMKICogdHdvIHNvbnMp LgogKi8KbG9jYWwgdm9pZCBwcWRvd25oZWFwKHRyZWUsIGspCiAgICBjdF9kYXRhIG5lYXIgKnRy ZWU7ICAvKiB0aGUgdHJlZSB0byByZXN0b3JlICovCiAgICBpbnQgazsgICAgICAgICAgICAgICAv KiBub2RlIHRvIG1vdmUgZG93biAqLwp7CiAgICBpbnQgdiA9IGhlYXBba107CiAgICBpbnQgaiA9 IGsgPDwgMTsgIC8qIGxlZnQgc29uIG9mIGsgKi8KICAgIHdoaWxlIChqIDw9IGhlYXBfbGVuKSB7 CiAgICAgICAgLyogU2V0IGogdG8gdGhlIHNtYWxsZXN0IG9mIHRoZSB0d28gc29uczogKi8KICAg ICAgICBpZiAoaiA8IGhlYXBfbGVuICYmIHNtYWxsZXIodHJlZSwgaGVhcFtqKzFdLCBoZWFwW2pd KSkgaisrOwoKICAgICAgICAvKiBFeGl0IGlmIHYgaXMgc21hbGxlciB0aGFuIGJvdGggc29ucyAq LwogICAgICAgIGlmIChzbWFsbGVyKHRyZWUsIHYsIGhlYXBbal0pKSBicmVhazsKCiAgICAgICAg LyogRXhjaGFuZ2UgdiB3aXRoIHRoZSBzbWFsbGVzdCBzb24gKi8KICAgICAgICBoZWFwW2tdID0g aGVhcFtqXTsgIGsgPSBqOwoKICAgICAgICAvKiBBbmQgY29udGludWUgZG93biB0aGUgdHJlZSwg c2V0dGluZyBqIHRvIHRoZSBsZWZ0IHNvbiBvZiBrICovCiAgICAgICAgaiA8PD0gMTsKICAgIH0K ICAgIGhlYXBba10gPSB2Owp9CgovKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KICogQ29tcHV0ZSB0aGUg b3B0aW1hbCBiaXQgbGVuZ3RocyBmb3IgYSB0cmVlIGFuZCB1cGRhdGUgdGhlIHRvdGFsIGJpdCBs ZW5ndGgKICogZm9yIHRoZSBjdXJyZW50IGJsb2NrLgogKiBJTiBhc3NlcnRpb246IHRoZSBmaWVs ZHMgZnJlcSBhbmQgZGFkIGFyZSBzZXQsIGhlYXBbaGVhcF9tYXhdIGFuZAogKiAgICBhYm92ZSBh cmUgdGhlIHRyZWUgbm9kZXMgc29ydGVkIGJ5IGluY3JlYXNpbmcgZnJlcXVlbmN5LgogKiBPVVQg YXNzZXJ0aW9uczogdGhlIGZpZWxkIGxlbiBpcyBzZXQgdG8gdGhlIG9wdGltYWwgYml0IGxlbmd0 aCwgdGhlCiAqICAgICBhcnJheSBibF9jb3VudCBjb250YWlucyB0aGUgZnJlcXVlbmNpZXMgZm9y IGVhY2ggYml0IGxlbmd0aC4KICogICAgIFRoZSBsZW5ndGggb3B0X2xlbiBpcyB1cGRhdGVkOyBz dGF0aWNfbGVuIGlzIGFsc28gdXBkYXRlZCBpZiBzdHJlZSBpcwogKiAgICAgbm90IG51bGwuCiAq Lwpsb2NhbCB2b2lkIGdlbl9iaXRsZW4oZGVzYykKICAgIHRyZWVfZGVzYyBuZWFyICpkZXNjOyAv KiB0aGUgdHJlZSBkZXNjcmlwdG9yICovCnsKICAgIGN0X2RhdGEgbmVhciAqdHJlZSAgPSBkZXNj LT5keW5fdHJlZTsKICAgIGludCBuZWFyICpleHRyYSAgICAgPSBkZXNjLT5leHRyYV9iaXRzOwog ICAgaW50IGJhc2UgICAgICAgICAgICA9IGRlc2MtPmV4dHJhX2Jhc2U7CiAgICBpbnQgbWF4X2Nv ZGUgICAgICAgID0gZGVzYy0+bWF4X2NvZGU7CiAgICBpbnQgbWF4X2xlbmd0aCAgICAgID0gZGVz Yy0+bWF4X2xlbmd0aDsKICAgIGN0X2RhdGEgbmVhciAqc3RyZWUgPSBkZXNjLT5zdGF0aWNfdHJl ZTsKICAgIGludCBoOyAgICAgICAgICAgICAgLyogaGVhcCBpbmRleCAqLwogICAgaW50IG4sIG07 ICAgICAgICAgICAvKiBpdGVyYXRlIG92ZXIgdGhlIHRyZWUgZWxlbWVudHMgKi8KICAgIGludCBi aXRzOyAgICAgICAgICAgLyogYml0IGxlbmd0aCAqLwogICAgaW50IHhiaXRzOyAgICAgICAgICAv KiBleHRyYSBiaXRzICovCiAgICB1c2ggZjsgICAgICAgICAgICAgIC8qIGZyZXF1ZW5jeSAqLwog ICAgaW50IG92ZXJmbG93ID0gMDsgICAvKiBudW1iZXIgb2YgZWxlbWVudHMgd2l0aCBiaXQgbGVu Z3RoIHRvbyBsYXJnZSAqLwoKICAgIGZvciAoYml0cyA9IDA7IGJpdHMgPD0gTUFYX0JJVFM7IGJp dHMrKykgYmxfY291bnRbYml0c10gPSAwOwoKICAgIHByaW50ZigiXG5nZW5fYml0bGVuIik7CiAg ICAvKiBJbiBhIGZpcnN0IHBhc3MsIGNvbXB1dGUgdGhlIG9wdGltYWwgYml0IGxlbmd0aHMgKHdo aWNoIG1heQogICAgICogb3ZlcmZsb3cgaW4gdGhlIGNhc2Ugb2YgdGhlIGJpdCBsZW5ndGggdHJl ZSkuCiAgICAgKi8KICAgIHRyZWVbaGVhcFtoZWFwX21heF1dLkxlbiA9IDA7IC8qIHJvb3Qgb2Yg dGhlIGhlYXAgKi8KCiAgICBmb3IgKGggPSBoZWFwX21heCsxOyBoIDwgSEVBUF9TSVpFOyBoKysp IHsKICAgICAgICBuID0gaGVhcFtoXTsKICAgICAgICBiaXRzID0gdHJlZVt0cmVlW25dLkRhZF0u TGVuICsgMTsKCiAgICAgICAgaWYgKGJpdHMgPiBtYXhfbGVuZ3RoKXsKICAgICAgICAJYml0cyA9 IG1heF9sZW5ndGg7CiAgICAgICAgCW92ZXJmbG93Kys7CiAgICAgICAgfQogICAgICAgIHRyZWVb bl0uTGVuID0gKHVzaCliaXRzOwogICAgICAgIC8qIFdlIG92ZXJ3cml0ZSB0cmVlW25dLkRhZCB3 aGljaCBpcyBubyBsb25nZXIgbmVlZGVkICovCgogICAgICAgIGlmIChuID4gbWF4X2NvZGUpIGNv bnRpbnVlOyAvKiBub3QgYSBsZWFmIG5vZGUgKi8KCiAgICAgICAgYmxfY291bnRbYml0c10rKzsK CiAgICAgICAgeGJpdHMgPSAwOwogICAgICAgIGlmIChuID49IGJhc2UpIHhiaXRzID0gZXh0cmFb bi1iYXNlXTsKICAgICAgICBmID0gdHJlZVtuXS5GcmVxOwogICAgICAgIG9wdF9sZW4gKz0gKHVs ZylmICogKGJpdHMgKyB4Yml0cyk7CiAgICAgICAgaWYgKHN0cmVlKSBzdGF0aWNfbGVuICs9ICh1 bGcpZiAqIChzdHJlZVtuXS5MZW4gKyB4Yml0cyk7CiAgICB9CiAgICBpZiAob3ZlcmZsb3cgPT0g MCl7CiAgICAJcmV0dXJuOwogICAgfQoKICAgIFRyYWNlKChzdGRlcnIsIlxuYml0IGxlbmd0aCBv dmVyZmxvd1xuIikpOwogICAgLyogVGhpcyBoYXBwZW5zIGZvciBleGFtcGxlIG9uIG9iajIgYW5k IHBpYyBvZiB0aGUgQ2FsZ2FyeSBjb3JwdXMgKi8KCiAgICAvKiBGaW5kIHRoZSBmaXJzdCBiaXQg bGVuZ3RoIHdoaWNoIGNvdWxkIGluY3JlYXNlOiAqLwogICAgcHJpbnRmKCJcblxuXG5nZW5fYml0 bGVuIC0gb3ZlcmZsb3ciKTsKCiAgICBvdmVyZmxvdyA9IDM7CiAgICBwcmludGYoIlxub3ZlcmZs b3cgPSAlZCIsIG92ZXJmbG93KTsKCiAgICBibF9jb3VudFswXSA9IDE7CiAgICBibF9jb3VudFsx XSA9IDE7CiAgICBibF9jb3VudFsyXSA9IDE7CiAgICBibF9jb3VudFszXSA9IDE7CiAgICBibF9j b3VudFs0XSA9IDE7CiAgICBibF9jb3VudFs1XSA9IDE7CiAgICBibF9jb3VudFs2XSA9IDE7CiAg ICBibF9jb3VudFs3XSA9IDU7CgoKICAgIHByaW50ZigiXG5iZWZvcmUiKTsKICAgIGZvciAoaD0w OyBoPD1tYXhfbGVuZ3RoOyBoKyspewogICAgCXByaW50ZigiXG5ibF9jb3VudFslZF0gPSAlZCIs IGgsIGJsX2NvdW50W2hdKTsKICAgIH0KCiAgICBkbyB7CiAgICAgICAgYml0cyA9IG1heF9sZW5n dGgtMTsKICAgICAgICB3aGlsZSAoYmxfY291bnRbYml0c10gPT0gMCkgYml0cy0tOwogICAgICAg IGJsX2NvdW50W2JpdHNdLS07ICAgICAgLyogbW92ZSBvbmUgbGVhZiBkb3duIHRoZSB0cmVlICov CiAgICAgICAgYmxfY291bnRbYml0cysxXSArPSAyOyAvKiBtb3ZlIG9uZSBvdmVyZmxvdyBpdGVt IGFzIGl0cyBicm90aGVyICovCiAgICAgICAgYmxfY291bnRbbWF4X2xlbmd0aF0tLTsKICAgICAg ICAvKiBUaGUgYnJvdGhlciBvZiB0aGUgb3ZlcmZsb3cgaXRlbSBhbHNvIG1vdmVzIG9uZSBzdGVw IHVwLAogICAgICAgICAqIGJ1dCB0aGlzIGRvZXMgbm90IGFmZmVjdCBibF9jb3VudFttYXhfbGVu Z3RoXQogICAgICAgICAqLwogICAgICAgIG92ZXJmbG93IC09IDI7CiAgICB9IHdoaWxlIChvdmVy ZmxvdyA+IDApOwoKICAgIHByaW50ZigiXG5hZnRlciIpOwogICAgZm9yIChoPTA7IGg8PW1heF9s ZW5ndGg7IGgrKyl7CiAgICAJcHJpbnRmKCJcbmJsX2NvdW50WyVkXSA9ICVkIiwgaCwgYmxfY291 bnRbaF0pOwogICAgfQoKICAgIC8qIE5vdyByZWNvbXB1dGUgYWxsIGJpdCBsZW5ndGhzLCBzY2Fu bmluZyBpbiBpbmNyZWFzaW5nIGZyZXF1ZW5jeS4KICAgICAqIGggaXMgc3RpbGwgZXF1YWwgdG8g SEVBUF9TSVpFLiAoSXQgaXMgc2ltcGxlciB0byByZWNvbnN0cnVjdCBhbGwKICAgICAqIGxlbmd0 aHMgaW5zdGVhZCBvZiBmaXhpbmcgb25seSB0aGUgd3Jvbmcgb25lcy4gVGhpcyBpZGVhIGlzIHRh a2VuCiAgICAgKiBmcm9tICdhcicgd3JpdHRlbiBieSBIYXJ1aGlrbyBPa3VtdXJhLikKICAgICAq LwogICAgZm9yIChiaXRzID0gbWF4X2xlbmd0aDsgYml0cyAhPSAwOyBiaXRzLS0pIHsKICAgICAg ICBuID0gYmxfY291bnRbYml0c107CiAgICAgICAgd2hpbGUgKG4gIT0gMCkgewogICAgICAgICAg ICBtID0gaGVhcFstLWhdOwogICAgICAgICAgICBpZiAobSA+IG1heF9jb2RlKSBjb250aW51ZTsK ICAgICAgICAgICAgaWYgKHRyZWVbbV0uTGVuICE9ICh1bnNpZ25lZCkgYml0cykgewogICAgICAg ICAgICAgICAgVHJhY2UoKHN0ZGVyciwiY29kZSAlZCBiaXRzICVkLT4lZFxuIiwgbSwgdHJlZVtt XS5MZW4sIGJpdHMpKTsKICAgICAgICAgICAgICAgIG9wdF9sZW4gKz0gKChsb25nKWJpdHMtKGxv bmcpdHJlZVttXS5MZW4pKihsb25nKXRyZWVbbV0uRnJlcTsKICAgICAgICAgICAgICAgIHRyZWVb bV0uTGVuID0gKHVzaCliaXRzOwogICAgICAgICAgICB9CiAgICAgICAgICAgIG4tLTsKICAgICAg ICB9CiAgICB9Cn0KCi8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogKiBHZW5lcmF0ZSB0aGUgY29kZXMg Zm9yIGEgZ2l2ZW4gdHJlZSBhbmQgYml0IGNvdW50cyAod2hpY2ggbmVlZCBub3QgYmUKICogb3B0 aW1hbCkuCiAqIElOIGFzc2VydGlvbjogdGhlIGFycmF5IGJsX2NvdW50IGNvbnRhaW5zIHRoZSBi aXQgbGVuZ3RoIHN0YXRpc3RpY3MgZm9yCiAqIHRoZSBnaXZlbiB0cmVlIGFuZCB0aGUgZmllbGQg bGVuIGlzIHNldCBmb3IgYWxsIHRyZWUgZWxlbWVudHMuCiAqIE9VVCBhc3NlcnRpb246IHRoZSBm aWVsZCBjb2RlIGlzIHNldCBmb3IgYWxsIHRyZWUgZWxlbWVudHMgb2Ygbm9uCiAqICAgICB6ZXJv IGNvZGUgbGVuZ3RoLgogKi8KbG9jYWwgdm9pZCBnZW5fY29kZXMgKHRyZWUsIG1heF9jb2RlKQog ICAgY3RfZGF0YSBuZWFyICp0cmVlOyAgICAgICAgLyogdGhlIHRyZWUgdG8gZGVjb3JhdGUgKi8K ICAgIGludCBtYXhfY29kZTsgICAgICAgICAgICAgIC8qIGxhcmdlc3QgY29kZSB3aXRoIG5vbiB6 ZXJvIGZyZXF1ZW5jeSAqLwp7CiAgICB1c2ggbmV4dF9jb2RlW01BWF9CSVRTKzFdOyAvKiBuZXh0 IGNvZGUgdmFsdWUgZm9yIGVhY2ggYml0IGxlbmd0aCAqLwogICAgdXNoIGNvZGUgPSAwOyAgICAg ICAgICAgICAgLyogcnVubmluZyBjb2RlIHZhbHVlICovCiAgICBpbnQgYml0czsgICAgICAgICAg ICAgICAgICAvKiBiaXQgaW5kZXggKi8KICAgIGludCBuOyAgICAgICAgICAgICAgICAgICAgIC8q IGNvZGUgaW5kZXggKi8KCiAgICBwcmludGYoIlxuZ2VuX2NvZGVzIik7CgogICAgLyogVGhlIGRp c3RyaWJ1dGlvbiBjb3VudHMgYXJlIGZpcnN0IHVzZWQgdG8gZ2VuZXJhdGUgdGhlIGNvZGUgdmFs dWVzCiAgICAgKiB3aXRob3V0IGJpdCByZXZlcnNhbC4KICAgICAqLwogICAgZm9yIChiaXRzID0g MTsgYml0cyA8PSBNQVhfQklUUzsgYml0cysrKSB7CiAgICAgICAgbmV4dF9jb2RlW2JpdHNdID0g Y29kZSA9IChjb2RlICsgYmxfY291bnRbYml0cy0xXSkgPDwgMTsKICAgIH0KICAgIC8qIENoZWNr IHRoYXQgdGhlIGJpdCBjb3VudHMgaW4gYmxfY291bnQgYXJlIGNvbnNpc3RlbnQuIFRoZSBsYXN0 IGNvZGUKICAgICAqIG11c3QgYmUgYWxsIG9uZXMuCiAgICAgKi8KICAgIEFzc2VydCAoY29kZSAr IGJsX2NvdW50W01BWF9CSVRTXS0xID09ICgxPDxNQVhfQklUUyktMSwKICAgICAgICAgICAgImlu Y29uc2lzdGVudCBiaXQgY291bnRzIik7CiAgICBUcmFjZXYoKHN0ZGVyciwiXG5nZW5fY29kZXM6 IG1heF9jb2RlICVkICIsIG1heF9jb2RlKSk7CgogICAgZm9yIChuID0gMDsgIG4gPD0gbWF4X2Nv ZGU7IG4rKykgewogICAgICAgIGludCBsZW4gPSB0cmVlW25dLkxlbjsKICAgICAgICBpZiAobGVu ID09IDApIGNvbnRpbnVlOwogICAgICAgIC8qIE5vdyByZXZlcnNlIHRoZSBiaXRzICovCiAgICAg ICAgdHJlZVtuXS5Db2RlID0gYmlfcmV2ZXJzZShuZXh0X2NvZGVbbGVuXSsrLCBsZW4pOwoKICAg ICAgICBUcmFjZWModHJlZSAhPSBzdGF0aWNfbHRyZWUsIChzdGRlcnIsIlxubiAlM2QgJWMgbCAl MmQgYyAlNHggKCV4KSAiLAogICAgICAgICAgICAgbiwgKGlzZ3JhcGgobikgPyBuIDogJyAnKSwg bGVuLCB0cmVlW25dLkNvZGUsIG5leHRfY29kZVtsZW5dLTEpKTsKICAgIH0KfQoKLyogPT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09CiAqIENvbnN0cnVjdCBvbmUgSHVmZm1hbiB0cmVlIGFuZCBhc3NpZ25zIHRo ZSBjb2RlIGJpdCBzdHJpbmdzIGFuZCBsZW5ndGhzLgogKiBVcGRhdGUgdGhlIHRvdGFsIGJpdCBs ZW5ndGggZm9yIHRoZSBjdXJyZW50IGJsb2NrLgogKiBJTiBhc3NlcnRpb246IHRoZSBmaWVsZCBm cmVxIGlzIHNldCBmb3IgYWxsIHRyZWUgZWxlbWVudHMuCiAqIE9VVCBhc3NlcnRpb25zOiB0aGUg ZmllbGRzIGxlbiBhbmQgY29kZSBhcmUgc2V0IHRvIHRoZSBvcHRpbWFsIGJpdCBsZW5ndGgKICog ICAgIGFuZCBjb3JyZXNwb25kaW5nIGNvZGUuIFRoZSBsZW5ndGggb3B0X2xlbiBpcyB1cGRhdGVk OyBzdGF0aWNfbGVuIGlzCiAqICAgICBhbHNvIHVwZGF0ZWQgaWYgc3RyZWUgaXMgbm90IG51bGwu IFRoZSBmaWVsZCBtYXhfY29kZSBpcyBzZXQuCiAqLwpsb2NhbCB2b2lkIGJ1aWxkX3RyZWUoZGVz YykKICAgIHRyZWVfZGVzYyBuZWFyICpkZXNjOyAvKiB0aGUgdHJlZSBkZXNjcmlwdG9yICovCnsK ICAgIGN0X2RhdGEgbmVhciAqdHJlZSAgID0gZGVzYy0+ZHluX3RyZWU7CiAgICBjdF9kYXRhIG5l YXIgKnN0cmVlICA9IGRlc2MtPnN0YXRpY190cmVlOwogICAgaW50IGVsZW1zICAgICAgICAgICAg PSBkZXNjLT5lbGVtczsKICAgIGludCBuLCBtOyAgICAgICAgICAvKiBpdGVyYXRlIG92ZXIgaGVh cCBlbGVtZW50cyAqLwogICAgaW50IG1heF9jb2RlID0gLTE7IC8qIGxhcmdlc3QgY29kZSB3aXRo IG5vbiB6ZXJvIGZyZXF1ZW5jeSAqLwogICAgaW50IG5vZGUgPSBlbGVtczsgIC8qIG5leHQgaW50 ZXJuYWwgbm9kZSBvZiB0aGUgdHJlZSAqLwoKICAgIHByaW50ZigiXG5idWlsZF90cmVlIik7CiAg ICAvKiBDb25zdHJ1Y3QgdGhlIGluaXRpYWwgaGVhcCwgd2l0aCBsZWFzdCBmcmVxdWVudCBlbGVt ZW50IGluCiAgICAgKiBoZWFwW1NNQUxMRVNUXS4gVGhlIHNvbnMgb2YgaGVhcFtuXSBhcmUgaGVh cFsyKm5dIGFuZCBoZWFwWzIqbisxXS4KICAgICAqIGhlYXBbMF0gaXMgbm90IHVzZWQuCiAgICAg Ki8KICAgIGhlYXBfbGVuID0gMCwgaGVhcF9tYXggPSBIRUFQX1NJWkU7CgogICAgZm9yIChuID0g MDsgbiA8IGVsZW1zOyBuKyspIHsKICAgICAgICBpZiAodHJlZVtuXS5GcmVxICE9IDApIHsKICAg ICAgICAgICAgaGVhcFsrK2hlYXBfbGVuXSA9IG1heF9jb2RlID0gbjsKICAgICAgICAgICAgZGVw dGhbbl0gPSAwOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIHRyZWVbbl0uTGVuID0gMDsK ICAgICAgICB9CiAgICB9CgogICAgLyogVGhlIHBremlwIGZvcm1hdCByZXF1aXJlcyB0aGF0IGF0 IGxlYXN0IG9uZSBkaXN0YW5jZSBjb2RlIGV4aXN0cywKICAgICAqIGFuZCB0aGF0IGF0IGxlYXN0 IG9uZSBiaXQgc2hvdWxkIGJlIHNlbnQgZXZlbiBpZiB0aGVyZSBpcyBvbmx5IG9uZQogICAgICog cG9zc2libGUgY29kZS4gU28gdG8gYXZvaWQgc3BlY2lhbCBjaGVja3MgbGF0ZXIgb24gd2UgZm9y Y2UgYXQgbGVhc3QKICAgICAqIHR3byBjb2RlcyBvZiBub24gemVybyBmcmVxdWVuY3kuCiAgICAg Ki8KICAgIHdoaWxlIChoZWFwX2xlbiA8IDIpIHsKICAgICAgICBpbnQgbmV3ID0gaGVhcFsrK2hl YXBfbGVuXSA9IChtYXhfY29kZSA8IDIgPyArK21heF9jb2RlIDogMCk7CiAgICAgICAgdHJlZVtu ZXddLkZyZXEgPSAxOwogICAgICAgIGRlcHRoW25ld10gPSAwOwogICAgICAgIG9wdF9sZW4tLTsg aWYgKHN0cmVlKSBzdGF0aWNfbGVuIC09IHN0cmVlW25ld10uTGVuOwogICAgICAgIC8qIG5ldyBp cyAwIG9yIDEgc28gaXQgZG9lcyBub3QgaGF2ZSBleHRyYSBiaXRzICovCiAgICB9CiAgICBkZXNj LT5tYXhfY29kZSA9IG1heF9jb2RlOwoKICAgIC8qIFRoZSBlbGVtZW50cyBoZWFwW2hlYXBfbGVu LzIrMSAuLiBoZWFwX2xlbl0gYXJlIGxlYXZlcyBvZiB0aGUgdHJlZSwKICAgICAqIGVzdGFibGlz aCBzdWItaGVhcHMgb2YgaW5jcmVhc2luZyBsZW5ndGhzOgogICAgICovCiAgICBmb3IgKG4gPSBo ZWFwX2xlbi8yOyBuID49IDE7IG4tLSkgcHFkb3duaGVhcCh0cmVlLCBuKTsKCiAgICAvKiBDb25z dHJ1Y3QgdGhlIEh1ZmZtYW4gdHJlZSBieSByZXBlYXRlZGx5IGNvbWJpbmluZyB0aGUgbGVhc3Qg dHdvCiAgICAgKiBmcmVxdWVudCBub2Rlcy4KICAgICAqLwogICAgZG8gewogICAgCS8vIHR3b3J6 ZW5pZSBkcnpld2EKICAgICAgICBwcXJlbW92ZSh0cmVlLCBuKTsgICAvKiBuID0gbm9kZSBvZiBs ZWFzdCBmcmVxdWVuY3kgKi8KICAgICAgICBtID0gaGVhcFtTTUFMTEVTVF07ICAvKiBtID0gbm9k ZSBvZiBuZXh0IGxlYXN0IGZyZXF1ZW5jeSAqLwoKICAgICAgICBoZWFwWy0taGVhcF9tYXhdID0g bjsgLyoga2VlcCB0aGUgbm9kZXMgc29ydGVkIGJ5IGZyZXF1ZW5jeSAqLwogICAgICAgIGhlYXBb LS1oZWFwX21heF0gPSBtOwoKICAgICAgICAvKiBDcmVhdGUgYSBuZXcgbm9kZSBmYXRoZXIgb2Yg biBhbmQgbSAqLwogICAgICAgIHRyZWVbbm9kZV0uRnJlcSA9IHRyZWVbbl0uRnJlcSArIHRyZWVb bV0uRnJlcTsKICAgICAgICBkZXB0aFtub2RlXSA9ICh1Y2gpIChNQVgoZGVwdGhbbl0sIGRlcHRo W21dKSArIDEpOwogICAgICAgIHRyZWVbbl0uRGFkID0gdHJlZVttXS5EYWQgPSAodXNoKW5vZGU7 CiNpZmRlZiBEVU1QX0JMX1RSRUUKICAgICAgICBpZiAodHJlZSA9PSBibF90cmVlKSB7CiAgICAg ICAgICAgIGZwcmludGYoc3RkZXJyLCJcbm5vZGUgJWQoJWQpLCBzb25zICVkKCVkKSAlZCglZCki LAogICAgICAgICAgICAgICAgICAgIG5vZGUsIHRyZWVbbm9kZV0uRnJlcSwgbiwgdHJlZVtuXS5G cmVxLCBtLCB0cmVlW21dLkZyZXEpOwogICAgICAgIH0KI2VuZGlmCiAgICAgICAgLyogYW5kIGlu c2VydCB0aGUgbmV3IG5vZGUgaW4gdGhlIGhlYXAgKi8KICAgICAgICBoZWFwW1NNQUxMRVNUXSA9 IG5vZGUrKzsKICAgICAgICBwcWRvd25oZWFwKHRyZWUsIFNNQUxMRVNUKTsKCiAgICB9IHdoaWxl IChoZWFwX2xlbiA+PSAyKTsKCiAgICBoZWFwWy0taGVhcF9tYXhdID0gaGVhcFtTTUFMTEVTVF07 CgogICAgLyogQXQgdGhpcyBwb2ludCwgdGhlIGZpZWxkcyBmcmVxIGFuZCBkYWQgYXJlIHNldC4g V2UgY2FuIG5vdwogICAgICogZ2VuZXJhdGUgdGhlIGJpdCBsZW5ndGhzLgogICAgICovCiAgICBn ZW5fYml0bGVuKCh0cmVlX2Rlc2MgbmVhciAqKWRlc2MpOwoKICAgIC8qIFRoZSBmaWVsZCBsZW4g aXMgbm93IHNldCwgd2UgY2FuIGdlbmVyYXRlIHRoZSBiaXQgY29kZXMgKi8KICAgIGdlbl9jb2Rl cyAoKGN0X2RhdGEgbmVhciAqKXRyZWUsIG1heF9jb2RlKTsKfQoKLyogPT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09CiAqIFNjYW4gYSBsaXRlcmFsIG9yIGRpc3RhbmNlIHRyZWUgdG8gZGV0ZXJtaW5lIHRoZSBm cmVxdWVuY2llcyBvZiB0aGUgY29kZXMKICogaW4gdGhlIGJpdCBsZW5ndGggdHJlZS4gVXBkYXRl cyBvcHRfbGVuIHRvIHRha2UgaW50byBhY2NvdW50IHRoZSByZXBlYXQKICogY291bnRzLiAoVGhl IGNvbnRyaWJ1dGlvbiBvZiB0aGUgYml0IGxlbmd0aCBjb2RlcyB3aWxsIGJlIGFkZGVkIGxhdGVy CiAqIGR1cmluZyB0aGUgY29uc3RydWN0aW9uIG9mIGJsX3RyZWUuKQogKi8KbG9jYWwgdm9pZCBz Y2FuX3RyZWUgKHRyZWUsIG1heF9jb2RlKQogICAgY3RfZGF0YSBuZWFyICp0cmVlOyAvKiB0aGUg dHJlZSB0byBiZSBzY2FubmVkICovCiAgICBpbnQgbWF4X2NvZGU7ICAgICAgIC8qIGFuZCBpdHMg bGFyZ2VzdCBjb2RlIG9mIG5vbiB6ZXJvIGZyZXF1ZW5jeSAqLwp7CiAgICBpbnQgbjsgICAgICAg ICAgICAgICAgICAgICAvKiBpdGVyYXRlcyBvdmVyIGFsbCB0cmVlIGVsZW1lbnRzICovCiAgICBp bnQgcHJldmxlbiA9IC0xOyAgICAgICAgICAvKiBsYXN0IGVtaXR0ZWQgbGVuZ3RoICovCiAgICBp bnQgY3VybGVuOyAgICAgICAgICAgICAgICAvKiBsZW5ndGggb2YgY3VycmVudCBjb2RlICovCiAg ICBpbnQgbmV4dGxlbiA9IHRyZWVbMF0uTGVuOyAvKiBsZW5ndGggb2YgbmV4dCBjb2RlICovCiAg ICBpbnQgY291bnQgPSAwOyAgICAgICAgICAgICAvKiByZXBlYXQgY291bnQgb2YgdGhlIGN1cnJl bnQgY29kZSAqLwogICAgaW50IG1heF9jb3VudCA9IDc7ICAgICAgICAgLyogbWF4IHJlcGVhdCBj b3VudCAqLwogICAgaW50IG1pbl9jb3VudCA9IDQ7ICAgICAgICAgLyogbWluIHJlcGVhdCBjb3Vu dCAqLwoKICAgIGlmIChuZXh0bGVuID09IDApIG1heF9jb3VudCA9IDEzOCwgbWluX2NvdW50ID0g MzsKICAgIHRyZWVbbWF4X2NvZGUrMV0uTGVuID0gKHVzaCkweGZmZmY7IC8qIGd1YXJkICovCgog ICAgZm9yIChuID0gMDsgbiA8PSBtYXhfY29kZTsgbisrKSB7CiAgICAgICAgY3VybGVuID0gbmV4 dGxlbjsgbmV4dGxlbiA9IHRyZWVbbisxXS5MZW47CiAgICAgICAgaWYgKCsrY291bnQgPCBtYXhf Y291bnQgJiYgY3VybGVuID09IG5leHRsZW4pIHsKICAgICAgICAgICAgY29udGludWU7CiAgICAg ICAgfSBlbHNlIGlmIChjb3VudCA8IG1pbl9jb3VudCkgewogICAgICAgICAgICBibF90cmVlW2N1 cmxlbl0uRnJlcSArPSBjb3VudDsKICAgICAgICB9IGVsc2UgaWYgKGN1cmxlbiAhPSAwKSB7CiAg ICAgICAgICAgIGlmIChjdXJsZW4gIT0gcHJldmxlbikgYmxfdHJlZVtjdXJsZW5dLkZyZXErKzsK ICAgICAgICAgICAgYmxfdHJlZVtSRVBfM182XS5GcmVxKys7CiAgICAgICAgfSBlbHNlIGlmIChj b3VudCA8PSAxMCkgewogICAgICAgICAgICBibF90cmVlW1JFUFpfM18xMF0uRnJlcSsrOwogICAg ICAgIH0gZWxzZSB7CiAgICAgICAgICAgIGJsX3RyZWVbUkVQWl8xMV8xMzhdLkZyZXErKzsKICAg ICAgICB9CiAgICAgICAgY291bnQgPSAwOyBwcmV2bGVuID0gY3VybGVuOwogICAgICAgIGlmIChu ZXh0bGVuID09IDApIHsKICAgICAgICAgICAgbWF4X2NvdW50ID0gMTM4LCBtaW5fY291bnQgPSAz OwogICAgICAgIH0gZWxzZSBpZiAoY3VybGVuID09IG5leHRsZW4pIHsKICAgICAgICAgICAgbWF4 X2NvdW50ID0gNiwgbWluX2NvdW50ID0gMzsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgICBt YXhfY291bnQgPSA3LCBtaW5fY291bnQgPSA0OwogICAgICAgIH0KICAgIH0KfQoKLyogPT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09CiAqIFNlbmQgYSBsaXRlcmFsIG9yIGRpc3RhbmNlIHRyZWUgaW4gY29tcHJl c3NlZCBmb3JtLCB1c2luZyB0aGUgY29kZXMgaW4KICogYmxfdHJlZS4KICovCmxvY2FsIHZvaWQg c2VuZF90cmVlICh0cmVlLCBtYXhfY29kZSkKICAgIGN0X2RhdGEgbmVhciAqdHJlZTsgLyogdGhl IHRyZWUgdG8gYmUgc2Nhbm5lZCAqLwogICAgaW50IG1heF9jb2RlOyAgICAgICAvKiBhbmQgaXRz IGxhcmdlc3QgY29kZSBvZiBub24gemVybyBmcmVxdWVuY3kgKi8KewogICAgaW50IG47ICAgICAg ICAgICAgICAgICAgICAgLyogaXRlcmF0ZXMgb3ZlciBhbGwgdHJlZSBlbGVtZW50cyAqLwogICAg aW50IHByZXZsZW4gPSAtMTsgICAgICAgICAgLyogbGFzdCBlbWl0dGVkIGxlbmd0aCAqLwogICAg aW50IGN1cmxlbjsgICAgICAgICAgICAgICAgLyogbGVuZ3RoIG9mIGN1cnJlbnQgY29kZSAqLwog ICAgaW50IG5leHRsZW4gPSB0cmVlWzBdLkxlbjsgLyogbGVuZ3RoIG9mIG5leHQgY29kZSAqLwog ICAgaW50IGNvdW50ID0gMDsgICAgICAgICAgICAgLyogcmVwZWF0IGNvdW50IG9mIHRoZSBjdXJy ZW50IGNvZGUgKi8KICAgIGludCBtYXhfY291bnQgPSA3OyAgICAgICAgIC8qIG1heCByZXBlYXQg Y291bnQgKi8KICAgIGludCBtaW5fY291bnQgPSA0OyAgICAgICAgIC8qIG1pbiByZXBlYXQgY291 bnQgKi8KCiAgICAvKiB0cmVlW21heF9jb2RlKzFdLkxlbiA9IC0xOyAqLyAgLyogZ3VhcmQgYWxy ZWFkeSBzZXQgKi8KICAgIGlmIChuZXh0bGVuID09IDApIG1heF9jb3VudCA9IDEzOCwgbWluX2Nv dW50ID0gMzsKCiAgICBmb3IgKG4gPSAwOyBuIDw9IG1heF9jb2RlOyBuKyspIHsKICAgICAgICBj dXJsZW4gPSBuZXh0bGVuOyBuZXh0bGVuID0gdHJlZVtuKzFdLkxlbjsKICAgICAgICBpZiAoKytj b3VudCA8IG1heF9jb3VudCAmJiBjdXJsZW4gPT0gbmV4dGxlbikgewogICAgICAgICAgICBjb250 aW51ZTsKICAgICAgICB9IGVsc2UgaWYgKGNvdW50IDwgbWluX2NvdW50KSB7CiAgICAgICAgICAg IGRvIHsgc2VuZF9jb2RlKGN1cmxlbiwgYmxfdHJlZSk7IH0gd2hpbGUgKC0tY291bnQgIT0gMCk7 CgogICAgICAgIH0gZWxzZSBpZiAoY3VybGVuICE9IDApIHsKICAgICAgICAgICAgaWYgKGN1cmxl biAhPSBwcmV2bGVuKSB7CiAgICAgICAgICAgICAgICBzZW5kX2NvZGUoY3VybGVuLCBibF90cmVl KTsgY291bnQtLTsKICAgICAgICAgICAgfQogICAgICAgICAgICBBc3NlcnQoY291bnQgPj0gMyAm JiBjb3VudCA8PSA2LCAiIDNfNj8iKTsKICAgICAgICAgICAgc2VuZF9jb2RlKFJFUF8zXzYsIGJs X3RyZWUpOyBzZW5kX2JpdHMoY291bnQtMywgMik7CgogICAgICAgIH0gZWxzZSBpZiAoY291bnQg PD0gMTApIHsKICAgICAgICAgICAgc2VuZF9jb2RlKFJFUFpfM18xMCwgYmxfdHJlZSk7IHNlbmRf Yml0cyhjb3VudC0zLCAzKTsKCiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgc2VuZF9jb2Rl KFJFUFpfMTFfMTM4LCBibF90cmVlKTsgc2VuZF9iaXRzKGNvdW50LTExLCA3KTsKICAgICAgICB9 CiAgICAgICAgY291bnQgPSAwOyBwcmV2bGVuID0gY3VybGVuOwogICAgICAgIGlmIChuZXh0bGVu ID09IDApIHsKICAgICAgICAgICAgbWF4X2NvdW50ID0gMTM4LCBtaW5fY291bnQgPSAzOwogICAg ICAgIH0gZWxzZSBpZiAoY3VybGVuID09IG5leHRsZW4pIHsKICAgICAgICAgICAgbWF4X2NvdW50 ID0gNiwgbWluX2NvdW50ID0gMzsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgICBtYXhfY291 bnQgPSA3LCBtaW5fY291bnQgPSA0OwogICAgICAgIH0KICAgIH0KfQoKLyogPT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09CiAqIENvbnN0cnVjdCB0aGUgSHVmZm1hbiB0cmVlIGZvciB0aGUgYml0IGxlbmd0aHMg YW5kIHJldHVybiB0aGUgaW5kZXggaW4KICogYmxfb3JkZXIgb2YgdGhlIGxhc3QgYml0IGxlbmd0 aCBjb2RlIHRvIHNlbmQuCiAqLwpsb2NhbCBpbnQgYnVpbGRfYmxfdHJlZSgpCnsKICAgIGludCBt YXhfYmxpbmRleDsgIC8qIGluZGV4IG9mIGxhc3QgYml0IGxlbmd0aCBjb2RlIG9mIG5vbiB6ZXJv IGZyZXEgKi8KCiAgICBwcmludGYoIlxuYnVpbGRfYmxfdHJlZSIpOwogICAgLyogRGV0ZXJtaW5l IHRoZSBiaXQgbGVuZ3RoIGZyZXF1ZW5jaWVzIGZvciBsaXRlcmFsIGFuZCBkaXN0YW5jZSB0cmVl cyAqLwogICAgc2Nhbl90cmVlKChjdF9kYXRhIG5lYXIgKilkeW5fbHRyZWUsIGxfZGVzYy5tYXhf Y29kZSk7CiAgICBzY2FuX3RyZWUoKGN0X2RhdGEgbmVhciAqKWR5bl9kdHJlZSwgZF9kZXNjLm1h eF9jb2RlKTsKCiAgICAvKiBCdWlsZCB0aGUgYml0IGxlbmd0aCB0cmVlOiAqLwogICAgcHJpbnRm KCJcbmJ1aWxkX3RyZWUgZnJvbSBidWlsZF9ibF90cmVlIik7CiAgICBidWlsZF90cmVlKCh0cmVl X2Rlc2MgbmVhciAqKSgmYmxfZGVzYykpOwogICAgLyogb3B0X2xlbiBub3cgaW5jbHVkZXMgdGhl IGxlbmd0aCBvZiB0aGUgdHJlZSByZXByZXNlbnRhdGlvbnMsIGV4Y2VwdAogICAgICogdGhlIGxl bmd0aHMgb2YgdGhlIGJpdCBsZW5ndGhzIGNvZGVzIGFuZCB0aGUgNSs1KzQgYml0cyBmb3IgdGhl IGNvdW50cy4KICAgICAqLwoKICAgIC8qIERldGVybWluZSB0aGUgbnVtYmVyIG9mIGJpdCBsZW5n dGggY29kZXMgdG8gc2VuZC4gVGhlIHBremlwIGZvcm1hdAogICAgICogcmVxdWlyZXMgdGhhdCBh dCBsZWFzdCA0IGJpdCBsZW5ndGggY29kZXMgYmUgc2VudC4gKGFwcG5vdGUudHh0IHNheXMKICAg ICAqIDMgYnV0IHRoZSBhY3R1YWwgdmFsdWUgdXNlZCBpcyA0LikKICAgICAqLwogICAgZm9yICht YXhfYmxpbmRleCA9IEJMX0NPREVTLTE7IG1heF9ibGluZGV4ID49IDM7IG1heF9ibGluZGV4LS0p IHsKICAgICAgICBpZiAoYmxfdHJlZVtibF9vcmRlclttYXhfYmxpbmRleF1dLkxlbiAhPSAwKSBi cmVhazsKICAgIH0KICAgIC8qIFVwZGF0ZSBvcHRfbGVuIHRvIGluY2x1ZGUgdGhlIGJpdCBsZW5n dGggdHJlZSBhbmQgY291bnRzICovCiAgICBvcHRfbGVuICs9IDMqKG1heF9ibGluZGV4KzEpICsg NSs1KzQ7CiAgICBUcmFjZXYoKHN0ZGVyciwgIlxuZHluIHRyZWVzOiBkeW4gJWxkLCBzdGF0ICVs ZCIsIG9wdF9sZW4sIHN0YXRpY19sZW4pKTsKCiAgICByZXR1cm4gbWF4X2JsaW5kZXg7Cn0KCi8q ID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PQogKiBTZW5kIHRoZSBoZWFkZXIgZm9yIGEgYmxvY2sgdXNpbmcg ZHluYW1pYyBIdWZmbWFuIHRyZWVzOiB0aGUgY291bnRzLCB0aGUKICogbGVuZ3RocyBvZiB0aGUg Yml0IGxlbmd0aCBjb2RlcywgdGhlIGxpdGVyYWwgdHJlZSBhbmQgdGhlIGRpc3RhbmNlIHRyZWUu CiAqIElOIGFzc2VydGlvbjogbGNvZGVzID49IDI1NywgZGNvZGVzID49IDEsIGJsY29kZXMgPj0g NC4KICovCmxvY2FsIHZvaWQgc2VuZF9hbGxfdHJlZXMobGNvZGVzLCBkY29kZXMsIGJsY29kZXMp CiAgICBpbnQgbGNvZGVzLCBkY29kZXMsIGJsY29kZXM7IC8qIG51bWJlciBvZiBjb2RlcyBmb3Ig ZWFjaCB0cmVlICovCnsKICAgIGludCByYW5rOyAgICAgICAgICAgICAgICAgICAgLyogaW5kZXgg aW4gYmxfb3JkZXIgKi8KCiAgICBBc3NlcnQgKGxjb2RlcyA+PSAyNTcgJiYgZGNvZGVzID49IDEg JiYgYmxjb2RlcyA+PSA0LCAibm90IGVub3VnaCBjb2RlcyIpOwogICAgQXNzZXJ0IChsY29kZXMg PD0gTF9DT0RFUyAmJiBkY29kZXMgPD0gRF9DT0RFUyAmJiBibGNvZGVzIDw9IEJMX0NPREVTLAog ICAgICAgICAgICAidG9vIG1hbnkgY29kZXMiKTsKICAgIFRyYWNldigoc3RkZXJyLCAiXG5ibCBj b3VudHM6ICIpKTsKICAgIHNlbmRfYml0cyhsY29kZXMtMjU3LCA1KTsgLyogbm90ICsyNTUgYXMg c3RhdGVkIGluIGFwcG5vdGUudHh0ICovCiAgICBzZW5kX2JpdHMoZGNvZGVzLTEsICAgNSk7CiAg ICBzZW5kX2JpdHMoYmxjb2Rlcy00LCAgNCk7IC8qIG5vdCAtMyBhcyBzdGF0ZWQgaW4gYXBwbm90 ZS50eHQgKi8KICAgIGZvciAocmFuayA9IDA7IHJhbmsgPCBibGNvZGVzOyByYW5rKyspIHsKICAg ICAgICBUcmFjZXYoKHN0ZGVyciwgIlxuYmwgY29kZSAlMmQgIiwgYmxfb3JkZXJbcmFua10pKTsK ICAgICAgICBzZW5kX2JpdHMoYmxfdHJlZVtibF9vcmRlcltyYW5rXV0uTGVuLCAzKTsKICAgIH0K ICAgIFRyYWNldigoc3RkZXJyLCAiXG5ibCB0cmVlOiBzZW50ICVsZCIsIGJpdHNfc2VudCkpOwoK ICAgIHNlbmRfdHJlZSgoY3RfZGF0YSBuZWFyICopZHluX2x0cmVlLCBsY29kZXMtMSk7IC8qIHNl bmQgdGhlIGxpdGVyYWwgdHJlZSAqLwogICAgVHJhY2V2KChzdGRlcnIsICJcbmxpdCB0cmVlOiBz ZW50ICVsZCIsIGJpdHNfc2VudCkpOwoKICAgIHNlbmRfdHJlZSgoY3RfZGF0YSBuZWFyICopZHlu X2R0cmVlLCBkY29kZXMtMSk7IC8qIHNlbmQgdGhlIGRpc3RhbmNlIHRyZWUgKi8KICAgIFRyYWNl digoc3RkZXJyLCAiXG5kaXN0IHRyZWU6IHNlbnQgJWxkIiwgYml0c19zZW50KSk7Cn0KCi8qID09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PQogKiBEZXRlcm1pbmUgdGhlIGJlc3QgZW5jb2RpbmcgZm9yIHRoZSBj dXJyZW50IGJsb2NrOiBkeW5hbWljIHRyZWVzLCBzdGF0aWMKICogdHJlZXMgb3Igc3RvcmUsIGFu ZCBvdXRwdXQgdGhlIGVuY29kZWQgYmxvY2sgdG8gdGhlIHppcCBmaWxlLiBUaGlzIGZ1bmN0aW9u CiAqIHJldHVybnMgdGhlIHRvdGFsIGNvbXByZXNzZWQgbGVuZ3RoIGZvciB0aGUgZmlsZSBzbyBm YXIuCiAqLwp1bGcgZmx1c2hfYmxvY2soYnVmLCBzdG9yZWRfbGVuLCBlb2YpCiAgICBjaGFyICpi dWY7ICAgICAgICAvKiBpbnB1dCBibG9jaywgb3IgTlVMTCBpZiB0b28gb2xkICovCiAgICB1bGcg c3RvcmVkX2xlbjsgICAvKiBsZW5ndGggb2YgaW5wdXQgYmxvY2sgKi8KICAgIGludCBlb2Y7ICAg ICAgICAgIC8qIHRydWUgaWYgdGhpcyBpcyB0aGUgbGFzdCBibG9jayBmb3IgYSBmaWxlICovCnsK ICAgIHVsZyBvcHRfbGVuYiwgc3RhdGljX2xlbmI7IC8qIG9wdF9sZW4gYW5kIHN0YXRpY19sZW4g aW4gYnl0ZXMgKi8KICAgIGludCBtYXhfYmxpbmRleDsgIC8qIGluZGV4IG9mIGxhc3QgYml0IGxl bmd0aCBjb2RlIG9mIG5vbiB6ZXJvIGZyZXEgKi8KCiAgICBmbGFnX2J1ZltsYXN0X2ZsYWdzXSA9 IGZsYWdzOyAvKiBTYXZlIHRoZSBmbGFncyBmb3IgdGhlIGxhc3QgOCBpdGVtcyAqLwoKICAgIHBy aW50ZigiXG5mbHVzaCBibG9jayIpOwogICAgLy9wcmludGYoIlxuc3RvcmVkX2xlbiA9ICVsdSIs IHN0b3JlZF9sZW4pOwoKICAgICAvKiBDaGVjayBpZiB0aGUgZmlsZSBpcyBhc2NpaSBvciBiaW5h cnkgKi8KICAgIGlmICgqZmlsZV90eXBlID09ICh1c2gpVU5LTk9XTikgc2V0X2ZpbGVfdHlwZSgp OwoKICAgIC8qIENvbnN0cnVjdCB0aGUgbGl0ZXJhbCBhbmQgZGlzdGFuY2UgdHJlZXMgKi8KICAg IHByaW50ZigiXG5idWlsZF90cmVlIGNhbGwgZnJvbSBmbHVzaF9ibG9jayAxIik7CiAgICBidWls ZF90cmVlKCh0cmVlX2Rlc2MgbmVhciAqKSgmbF9kZXNjKSk7CiAgICBUcmFjZXYoKHN0ZGVyciwg IlxubGl0IGRhdGE6IGR5biAlbGQsIHN0YXQgJWxkIiwgb3B0X2xlbiwgc3RhdGljX2xlbikpOwoK ICAgIHByaW50ZigiXG5idWlsZF90cmVlIGNhbGwgZnJvbSBmbHVzaF9ibG9jayAyIik7CiAgICBi dWlsZF90cmVlKCh0cmVlX2Rlc2MgbmVhciAqKSgmZF9kZXNjKSk7CiAgICBUcmFjZXYoKHN0ZGVy ciwgIlxuZGlzdCBkYXRhOiBkeW4gJWxkLCBzdGF0ICVsZCIsIG9wdF9sZW4sIHN0YXRpY19sZW4p KTsKICAgIC8vcHJpbnRmKCJcbmZsdXNoX2Jsb2NrOiBvcHRfbGVuID0gJWx1ICwgc3RhdGljX2xl biA9ICVsdSIsIG9wdF9sZW4sIHN0YXRpY19sZW4pOwogICAgLyogQXQgdGhpcyBwb2ludCwgb3B0 X2xlbiBhbmQgc3RhdGljX2xlbiBhcmUgdGhlIHRvdGFsIGJpdCBsZW5ndGhzIG9mCiAgICAgKiB0 aGUgY29tcHJlc3NlZCBibG9jayBkYXRhLCBleGNsdWRpbmcgdGhlIHRyZWUgcmVwcmVzZW50YXRp b25zLgogICAgICovCgogICAgLyogQnVpbGQgdGhlIGJpdCBsZW5ndGggdHJlZSBmb3IgdGhlIGFi b3ZlIHR3byB0cmVlcywgYW5kIGdldCB0aGUgaW5kZXgKICAgICAqIGluIGJsX29yZGVyIG9mIHRo ZSBsYXN0IGJpdCBsZW5ndGggY29kZSB0byBzZW5kLgogICAgICovCiAgICBwcmludGYoIlxuYnVp bGRfYmxfdHJlZSBjYWxsIGZyb20gZmx1c2hfYmxvY2siKTsKICAgIG1heF9ibGluZGV4ID0gYnVp bGRfYmxfdHJlZSgpOwoKICAgIC8qIERldGVybWluZSB0aGUgYmVzdCBlbmNvZGluZy4gQ29tcHV0 ZSBmaXJzdCB0aGUgYmxvY2sgbGVuZ3RoIGluIGJ5dGVzICovCiAgICBvcHRfbGVuYiA9IChvcHRf bGVuKzMrNyk+PjM7CiAgICBzdGF0aWNfbGVuYiA9IChzdGF0aWNfbGVuKzMrNyk+PjM7CiAgICBp bnB1dF9sZW4gKz0gc3RvcmVkX2xlbjsgLyogZm9yIGRlYnVnZ2luZyBvbmx5ICovCgogICAgVHJh Y2UoKHN0ZGVyciwgIlxub3B0ICVsdSglbHUpIHN0YXQgJWx1KCVsdSkgc3RvcmVkICVsdSBsaXQg JXUgZGlzdCAldSAiLAogICAgICAgICAgICBvcHRfbGVuYiwgb3B0X2xlbiwgc3RhdGljX2xlbmIs IHN0YXRpY19sZW4sIHN0b3JlZF9sZW4sCiAgICAgICAgICAgIGxhc3RfbGl0LCBsYXN0X2Rpc3Qp KTsKCiAgICBpZiAoc3RhdGljX2xlbmIgPD0gb3B0X2xlbmIpIG9wdF9sZW5iID0gc3RhdGljX2xl bmI7CgogICAgLyogSWYgY29tcHJlc3Npb24gZmFpbGVkIGFuZCB0aGlzIGlzIHRoZSBmaXJzdCBh bmQgbGFzdCBibG9jaywKICAgICAqIGFuZCBpZiB0aGUgemlwIGZpbGUgY2FuIGJlIHNlZWtlZCAo dG8gcmV3cml0ZSB0aGUgbG9jYWwgaGVhZGVyKSwKICAgICAqIHRoZSB3aG9sZSBmaWxlIGlzIHRy YW5zZm9ybWVkIGludG8gYSBzdG9yZWQgZmlsZToKICAgICAqLwojaWZkZWYgRk9SQ0VfTUVUSE9E CiAgICBpZiAobGV2ZWwgPT0gMSAmJiBlb2YgJiYgY29tcHJlc3NlZF9sZW4gPT0gMEwpIHsgLyog Zm9yY2Ugc3RvcmVkIGZpbGUgKi8KI2Vsc2UKICAgIGlmIChzdG9yZWRfbGVuIDw9IG9wdF9sZW5i ICYmIGVvZiAmJiBjb21wcmVzc2VkX2xlbiA9PSAwTCAmJiBzZWVrYWJsZSgpKSB7CiNlbmRpZgog ICAgICAgIC8qIFNpbmNlIExJVF9CVUZTSVpFIDw9IDIqV1NJWkUsIHRoZSBpbnB1dCBkYXRhIG11 c3QgYmUgdGhlcmU6ICovCiAgICAgICAgaWYgKGJ1ZiA9PSAoY2hhciopMCkgZXJyb3IgKCJibG9j ayB2YW5pc2hlZCIpOwoKICAgICAgICBjb3B5X2Jsb2NrKGJ1ZiwgKHVuc2lnbmVkKXN0b3JlZF9s ZW4sIDApOyAvKiB3aXRob3V0IGhlYWRlciAqLwogICAgICAgIGNvbXByZXNzZWRfbGVuID0gc3Rv cmVkX2xlbiA8PCAzOwogICAgICAgICpmaWxlX21ldGhvZCA9IFNUT1JFRDsKCiNpZmRlZiBGT1JD RV9NRVRIT0QKICAgIH0gZWxzZSBpZiAobGV2ZWwgPT0gMiAmJiBidWYgIT0gKGNoYXIqKTApIHsg LyogZm9yY2Ugc3RvcmVkIGJsb2NrICovCiNlbHNlCiAgICB9IGVsc2UgaWYgKHN0b3JlZF9sZW4r NCA8PSBvcHRfbGVuYiAmJiBidWYgIT0gKGNoYXIqKTApIHsKICAgICAgICAgICAgICAgICAgICAg ICAvKiA0OiB0d28gd29yZHMgZm9yIHRoZSBsZW5ndGhzICovCiNlbmRpZgogICAgICAgIC8qIFRo ZSB0ZXN0IGJ1ZiAhPSBOVUxMIGlzIG9ubHkgbmVjZXNzYXJ5IGlmIExJVF9CVUZTSVpFID4gV1NJ WkUuCiAgICAgICAgICogT3RoZXJ3aXNlIHdlIGNhbid0IGhhdmUgcHJvY2Vzc2VkIG1vcmUgdGhh biBXU0laRSBpbnB1dCBieXRlcyBzaW5jZQogICAgICAgICAqIHRoZSBsYXN0IGJsb2NrIGZsdXNo LCBiZWNhdXNlIGNvbXByZXNzaW9uIHdvdWxkIGhhdmUgYmVlbgogICAgICAgICAqIHN1Y2Nlc3Nm dWwuIElmIExJVF9CVUZTSVpFIDw9IFdTSVpFLCBpdCBpcyBuZXZlciB0b28gbGF0ZSB0bwogICAg ICAgICAqIHRyYW5zZm9ybSBhIGJsb2NrIGludG8gYSBzdG9yZWQgYmxvY2suCiAgICAgICAgICov CiAgICAgICAgc2VuZF9iaXRzKChTVE9SRURfQkxPQ0s8PDEpK2VvZiwgMyk7ICAvKiBzZW5kIGJs b2NrIHR5cGUgKi8KICAgICAgICBjb21wcmVzc2VkX2xlbiA9IChjb21wcmVzc2VkX2xlbiArIDMg KyA3KSAmIH43TDsKICAgICAgICBjb21wcmVzc2VkX2xlbiArPSAoc3RvcmVkX2xlbiArIDQpIDw8 IDM7CgogICAgICAgIGNvcHlfYmxvY2soYnVmLCAodW5zaWduZWQpc3RvcmVkX2xlbiwgMSk7IC8q IHdpdGggaGVhZGVyICovCgojaWZkZWYgRk9SQ0VfTUVUSE9ECiAgICB9IGVsc2UgaWYgKGxldmVs ID09IDMpIHsgLyogZm9yY2Ugc3RhdGljIHRyZWVzICovCiNlbHNlCiAgICB9IGVsc2UgaWYgKHN0 YXRpY19sZW5iID09IG9wdF9sZW5iKSB7CiNlbmRpZgogICAgICAgIHNlbmRfYml0cygoU1RBVElD X1RSRUVTPDwxKStlb2YsIDMpOwogICAgICAgIGNvbXByZXNzX2Jsb2NrKChjdF9kYXRhIG5lYXIg KilzdGF0aWNfbHRyZWUsIChjdF9kYXRhIG5lYXIgKilzdGF0aWNfZHRyZWUpOwogICAgICAgIGNv bXByZXNzZWRfbGVuICs9IDMgKyBzdGF0aWNfbGVuOwogICAgfSBlbHNlIHsKICAgICAgICBzZW5k X2JpdHMoKERZTl9UUkVFUzw8MSkrZW9mLCAzKTsKICAgICAgICBzZW5kX2FsbF90cmVlcyhsX2Rl c2MubWF4X2NvZGUrMSwgZF9kZXNjLm1heF9jb2RlKzEsIG1heF9ibGluZGV4KzEpOwogICAgICAg IGNvbXByZXNzX2Jsb2NrKChjdF9kYXRhIG5lYXIgKilkeW5fbHRyZWUsIChjdF9kYXRhIG5lYXIg KilkeW5fZHRyZWUpOwogICAgICAgIGNvbXByZXNzZWRfbGVuICs9IDMgKyBvcHRfbGVuOwogICAg fQogICAgQXNzZXJ0IChjb21wcmVzc2VkX2xlbiA9PSBiaXRzX3NlbnQsICJiYWQgY29tcHJlc3Nl ZCBzaXplIik7CiAgICBpbml0X2Jsb2NrKCk7CgogICAgaWYgKGVvZikgewogICAgICAgIEFzc2Vy dCAoaW5wdXRfbGVuID09IGlzaXplLCAiYmFkIGlucHV0IHNpemUiKTsKICAgICAgICBiaV93aW5k dXAoKTsKICAgICAgICBjb21wcmVzc2VkX2xlbiArPSA3OyAgLyogYWxpZ24gb24gYnl0ZSBib3Vu ZGFyeSAqLwogICAgfQogICAgVHJhY2V2KChzdGRlcnIsIlxuY29tcHJsZW4gJWx1KCVsdSkgIiwg Y29tcHJlc3NlZF9sZW4+PjMsCiAgICAgICAgICAgY29tcHJlc3NlZF9sZW4tNyplb2YpKTsKCiAg ICAvL3ByaW50ZigiXG5mbHVzaF9ibG9jazogY29tcHJlc3NlZF9sZW4gPSAlbHUiLCBjb21wcmVz c2VkX2xlbik7CgogICAgcmV0dXJuIGNvbXByZXNzZWRfbGVuID4+IDM7Cn0KCi8qID09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PQogKiBTYXZlIHRoZSBtYXRjaCBpbmZvIGFuZCB0YWxseSB0aGUgZnJlcXVlbmN5 IGNvdW50cy4gUmV0dXJuIHRydWUgaWYKICogdGhlIGN1cnJlbnQgYmxvY2sgbXVzdCBiZSBmbHVz aGVkLgogKi8KaW50IGN0X3RhbGx5IChkaXN0LCBsYykKICAgIGludCBkaXN0OyAgLyogZGlzdGFu Y2Ugb2YgbWF0Y2hlZCBzdHJpbmcgKi8KICAgIGludCBsYzsgICAgLyogbWF0Y2ggbGVuZ3RoLU1J Tl9NQVRDSCBvciB1bm1hdGNoZWQgY2hhciAoaWYgZGlzdD09MCkgKi8KewogICAgbF9idWZbbGFz dF9saXQrK10gPSAodWNoKWxjOwogICAgLy9wcmludGYoImN0X3RhbGx5XG4iKTsKICAgIGlmIChk aXN0ID09IDApIHsKICAgICAgICAvKiBsYyBpcyB0aGUgdW5tYXRjaGVkIGNoYXIgKi8KICAgICAg ICBkeW5fbHRyZWVbbGNdLkZyZXErKzsKICAgIH0gZWxzZSB7CiAgICAgICAgLyogSGVyZSwgbGMg aXMgdGhlIG1hdGNoIGxlbmd0aCAtIE1JTl9NQVRDSCAqLwogICAgICAgIGRpc3QtLTsgICAgICAg ICAgICAgLyogZGlzdCA9IG1hdGNoIGRpc3RhbmNlIC0gMSAqLwogICAgICAgIEFzc2VydCgodXNo KWRpc3QgPCAodXNoKU1BWF9ESVNUICYmCiAgICAgICAgICAgICAgICh1c2gpbGMgPD0gKHVzaCko TUFYX01BVENILU1JTl9NQVRDSCkgJiYKICAgICAgICAgICAgICAgKHVzaClkX2NvZGUoZGlzdCkg PCAodXNoKURfQ09ERVMsICAiY3RfdGFsbHk6IGJhZCBtYXRjaCIpOwoKICAgICAgICBkeW5fbHRy ZWVbbGVuZ3RoX2NvZGVbbGNdK0xJVEVSQUxTKzFdLkZyZXErKzsKICAgICAgICBkeW5fZHRyZWVb ZF9jb2RlKGRpc3QpXS5GcmVxKys7CgogICAgICAgIGRfYnVmW2xhc3RfZGlzdCsrXSA9ICh1c2gp ZGlzdDsKICAgICAgICBmbGFncyB8PSBmbGFnX2JpdDsKICAgIH0KICAgIGZsYWdfYml0IDw8PSAx OwoKICAgIC8qIE91dHB1dCB0aGUgZmxhZ3MgaWYgdGhleSBmaWxsIGEgYnl0ZTogKi8KICAgIGlm ICgobGFzdF9saXQgJiA3KSA9PSAwKSB7CiAgICAgICAgZmxhZ19idWZbbGFzdF9mbGFncysrXSA9 IGZsYWdzOwogICAgICAgIGZsYWdzID0gMCwgZmxhZ19iaXQgPSAxOwogICAgfQogICAgLyogVHJ5 IHRvIGd1ZXNzIGlmIGl0IGlzIHByb2ZpdGFibGUgdG8gc3RvcCB0aGUgY3VycmVudCBibG9jayBo ZXJlICovCiAgICBpZiAobGV2ZWwgPiAyICYmIChsYXN0X2xpdCAmIDB4ZmZmKSA9PSAwKSB7CiAg ICAJcHJpbnRmKCJcbmN0X3RhbGx5IHByw7NiYSB3eXJ6dWNlbmlhIGZsdXNoID0xIik7CiAgICAg ICAgLyogQ29tcHV0ZSBhbiB1cHBlciBib3VuZCBmb3IgdGhlIGNvbXByZXNzZWQgbGVuZ3RoICov CiAgICAgICAgdWxnIG91dF9sZW5ndGggPSAodWxnKWxhc3RfbGl0KjhMOwogICAgICAgIHVsZyBp bl9sZW5ndGggPSAodWxnKXN0cnN0YXJ0LWJsb2NrX3N0YXJ0OwogICAgICAgIGludCBkY29kZTsK ICAgICAgICBmb3IgKGRjb2RlID0gMDsgZGNvZGUgPCBEX0NPREVTOyBkY29kZSsrKSB7CiAgICAg ICAgICAgIG91dF9sZW5ndGggKz0gKHVsZylkeW5fZHRyZWVbZGNvZGVdLkZyZXEqKDVMK2V4dHJh X2RiaXRzW2Rjb2RlXSk7CiAgICAgICAgfQogICAgICAgIG91dF9sZW5ndGggPj49IDM7CiAgICAg ICAgVHJhY2UoKHN0ZGVyciwiXG5sYXN0X2xpdCAldSwgbGFzdF9kaXN0ICV1LCBpbiAlbGQsIG91 dCB+JWxkKCVsZCUlKSAiLAogICAgICAgICAgICAgICBsYXN0X2xpdCwgbGFzdF9kaXN0LCBpbl9s ZW5ndGgsIG91dF9sZW5ndGgsCiAgICAgICAgICAgICAgIDEwMEwgLSBvdXRfbGVuZ3RoKjEwMEwv aW5fbGVuZ3RoKSk7CiAgICAgICAgaWYgKGxhc3RfZGlzdCA8IGxhc3RfbGl0LzIgJiYgb3V0X2xl bmd0aCA8IGluX2xlbmd0aC8yKSB7CiAgICAgICAgCXByaW50ZigiICB1ZGFuYS4iKTsKICAgICAg ICAJcmV0dXJuIDE7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAJcHJpbnRmKCIgICBuaWV1ZGFu YS4iKTsKICAgICAgICB9CiAgICB9CgogICAgaWYgKGxhc3RfbGl0ID09IExJVF9CVUZTSVpFLTEg fHwgbGFzdF9kaXN0ID09IERJU1RfQlVGU0laRSl7CiAgICAJcHJpbnRmKCJcbmN0X3RhbGx5OiBr b25pZWMgZnVua2NqaSBzcHJhd2R6ZW5pZSBidWZvcsOzdyBkbGEgcmV0dXJuIDEuIik7CiAgICB9 CiAgICByZXR1cm4gKGxhc3RfbGl0ID09IExJVF9CVUZTSVpFLTEgfHwgbGFzdF9kaXN0ID09IERJ U1RfQlVGU0laRSk7CiAgICAvKiBXZSBhdm9pZCBlcXVhbGl0eSB3aXRoIExJVF9CVUZTSVpFIGJl Y2F1c2Ugb2Ygd3JhcGFyb3VuZCBhdCA2NEsKICAgICAqIG9uIDE2IGJpdCBtYWNoaW5lcyBhbmQg YmVjYXVzZSBzdG9yZWQgYmxvY2tzIGFyZSByZXN0cmljdGVkIHRvCiAgICAgKiA2NEstMSBieXRl cy4KICAgICAqLwp9CgovKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KICogU2VuZCB0aGUgYmxvY2sgZGF0 YSBjb21wcmVzc2VkIHVzaW5nIHRoZSBnaXZlbiBIdWZmbWFuIHRyZWVzCiAqLwpsb2NhbCB2b2lk IGNvbXByZXNzX2Jsb2NrKGx0cmVlLCBkdHJlZSkKICAgIGN0X2RhdGEgbmVhciAqbHRyZWU7IC8q IGxpdGVyYWwgdHJlZSAqLwogICAgY3RfZGF0YSBuZWFyICpkdHJlZTsgLyogZGlzdGFuY2UgdHJl ZSAqLwp7CiAgICB1bnNpZ25lZCBkaXN0OyAgICAgIC8qIGRpc3RhbmNlIG9mIG1hdGNoZWQgc3Ry aW5nICovCiAgICBpbnQgbGM7ICAgICAgICAgICAgIC8qIG1hdGNoIGxlbmd0aCBvciB1bm1hdGNo ZWQgY2hhciAoaWYgZGlzdCA9PSAwKSAqLwogICAgdW5zaWduZWQgbHggPSAwOyAgICAvKiBydW5u aW5nIGluZGV4IGluIGxfYnVmICovCiAgICB1bnNpZ25lZCBkeCA9IDA7ICAgIC8qIHJ1bm5pbmcg aW5kZXggaW4gZF9idWYgKi8KICAgIHVuc2lnbmVkIGZ4ID0gMDsgICAgLyogcnVubmluZyBpbmRl eCBpbiBmbGFnX2J1ZiAqLwogICAgdWNoIGZsYWcgPSAwOyAgICAgICAvKiBjdXJyZW50IGZsYWdz ICovCiAgICB1bnNpZ25lZCBjb2RlOyAgICAgIC8qIHRoZSBjb2RlIHRvIHNlbmQgKi8KICAgIGlu dCBleHRyYTsgICAgICAgICAgLyogbnVtYmVyIG9mIGV4dHJhIGJpdHMgdG8gc2VuZCAqLwoKICAg IGlmIChsYXN0X2xpdCAhPSAwKSBkbyB7CiAgICAgICAgaWYgKChseCAmIDcpID09IDApIGZsYWcg PSBmbGFnX2J1ZltmeCsrXTsKICAgICAgICBsYyA9IGxfYnVmW2x4KytdOwogICAgICAgIGlmICgo ZmxhZyAmIDEpID09IDApIHsKICAgICAgICAgICAgc2VuZF9jb2RlKGxjLCBsdHJlZSk7IC8qIHNl bmQgYSBsaXRlcmFsIGJ5dGUgKi8KICAgICAgICAgICAgVHJhY2Vjdihpc2dyYXBoKGxjKSwgKHN0 ZGVyciwiICclYycgIiwgbGMpKTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAvKiBIZXJl LCBsYyBpcyB0aGUgbWF0Y2ggbGVuZ3RoIC0gTUlOX01BVENIICovCiAgICAgICAgICAgIGNvZGUg PSBsZW5ndGhfY29kZVtsY107CiAgICAgICAgICAgIHNlbmRfY29kZShjb2RlK0xJVEVSQUxTKzEs IGx0cmVlKTsgLyogc2VuZCB0aGUgbGVuZ3RoIGNvZGUgKi8KICAgICAgICAgICAgZXh0cmEgPSBl eHRyYV9sYml0c1tjb2RlXTsKICAgICAgICAgICAgaWYgKGV4dHJhICE9IDApIHsKICAgICAgICAg ICAgICAgIGxjIC09IGJhc2VfbGVuZ3RoW2NvZGVdOwogICAgICAgICAgICAgICAgc2VuZF9iaXRz KGxjLCBleHRyYSk7ICAgICAgICAvKiBzZW5kIHRoZSBleHRyYSBsZW5ndGggYml0cyAqLwogICAg ICAgICAgICB9CiAgICAgICAgICAgIGRpc3QgPSBkX2J1ZltkeCsrXTsKICAgICAgICAgICAgLyog SGVyZSwgZGlzdCBpcyB0aGUgbWF0Y2ggZGlzdGFuY2UgLSAxICovCiAgICAgICAgICAgIGNvZGUg PSBkX2NvZGUoZGlzdCk7CiAgICAgICAgICAgIEFzc2VydCAoY29kZSA8IERfQ09ERVMsICJiYWQg ZF9jb2RlIik7CgogICAgICAgICAgICBzZW5kX2NvZGUoY29kZSwgZHRyZWUpOyAgICAgICAvKiBz ZW5kIHRoZSBkaXN0YW5jZSBjb2RlICovCiAgICAgICAgICAgIGV4dHJhID0gZXh0cmFfZGJpdHNb Y29kZV07CiAgICAgICAgICAgIGlmIChleHRyYSAhPSAwKSB7CiAgICAgICAgICAgICAgICBkaXN0 IC09IGJhc2VfZGlzdFtjb2RlXTsKICAgICAgICAgICAgICAgIHNlbmRfYml0cyhkaXN0LCBleHRy YSk7ICAgLyogc2VuZCB0aGUgZXh0cmEgZGlzdGFuY2UgYml0cyAqLwogICAgICAgICAgICB9CiAg ICAgICAgfSAvKiBsaXRlcmFsIG9yIG1hdGNoIHBhaXIgPyAqLwogICAgICAgIGZsYWcgPj49IDE7 CiAgICB9IHdoaWxlIChseCA8IGxhc3RfbGl0KTsKCiAgICBzZW5kX2NvZGUoRU5EX0JMT0NLLCBs dHJlZSk7Cn0KCi8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogKiBTZXQgdGhlIGZpbGUgdHlwZSB0byBB U0NJSSBvciBCSU5BUlksIHVzaW5nIGEgY3J1ZGUgYXBwcm94aW1hdGlvbjoKICogYmluYXJ5IGlm IG1vcmUgdGhhbiAyMCUgb2YgdGhlIGJ5dGVzIGFyZSA8PSA2IG9yID49IDEyOCwgYXNjaWkgb3Ro ZXJ3aXNlLgogKiBJTiBhc3NlcnRpb246IHRoZSBmaWVsZHMgZnJlcSBvZiBkeW5fbHRyZWUgYXJl IHNldCBhbmQgdGhlIHRvdGFsIG9mIGFsbAogKiBmcmVxdWVuY2llcyBkb2VzIG5vdCBleGNlZWQg NjRLICh0byBmaXQgaW4gYW4gaW50IG9uIDE2IGJpdCBtYWNoaW5lcykuCiAqLwpsb2NhbCB2b2lk IHNldF9maWxlX3R5cGUoKQp7CiAgICBpbnQgbiA9IDA7CiAgICB1bnNpZ25lZCBhc2NpaV9mcmVx ID0gMDsKICAgIHVuc2lnbmVkIGJpbl9mcmVxID0gMDsKICAgIHdoaWxlIChuIDwgNykgICAgICAg IGJpbl9mcmVxICs9IGR5bl9sdHJlZVtuKytdLkZyZXE7CiAgICB3aGlsZSAobiA8IDEyOCkgICAg YXNjaWlfZnJlcSArPSBkeW5fbHRyZWVbbisrXS5GcmVxOwogICAgd2hpbGUgKG4gPCBMSVRFUkFM UykgYmluX2ZyZXEgKz0gZHluX2x0cmVlW24rK10uRnJlcTsKICAgICpmaWxlX3R5cGUgPSBiaW5f ZnJlcSA+IChhc2NpaV9mcmVxID4+IDIpID8gQklOQVJZIDogQVNDSUk7CiAgICBpZiAoKmZpbGVf dHlwZSA9PSBCSU5BUlkgJiYgdHJhbnNsYXRlX2VvbCkgewogICAgICAgIHdhcm4oIi1sIHVzZWQg b24gYmluYXJ5IGZpbGUiLCAiIik7CiAgICB9Cn0K --part52d8554de70428.92881097--
"Krzysztof Rybak" <krzysztofrybak6@HIDDEN>
:bug-gzip@HIDDEN
.
Full text available.bug-gzip@HIDDEN
:bug#16472
; Package gzip
.
Full text available.
GNU bug tracking system
Copyright (C) 1999 Darren O. Benham,
1997 nCipher Corporation Ltd,
1994-97 Ian Jackson.