From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from us-smtp-delivery-124.mimecast.com (us-smtp-delivery-124.mimecast.com [170.10.133.124]) by sourceware.org (Postfix) with ESMTPS id 43CDF3857734 for ; Wed, 24 May 2023 21:19:59 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.4.2 sourceware.org 43CDF3857734 Authentication-Results: sourceware.org; dmarc=pass (p=none dis=none) header.from=redhat.com Authentication-Results: sourceware.org; spf=pass smtp.mailfrom=redhat.com DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1684963198; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version:content-type:content-type; bh=a1J2z+RL4l/lgRkEHT8+qwWtPK52fFvUUTASkTyBgdc=; b=SKcLGUcyEKc6J2Uc7P7Ltr8HUsK3WHyVipRa1fa6binOU59BL0eRvefySx+RqWX5rv2DZh BZZLGQtvF4XbJQICNyeOGmFRNOtTAGtK1GuvpLOQXqxaKviuUwLtAFEuo+SGvhWiqRlrQ+ BjN1xvvIINv2IrV13JyA8OEedFqZhnY= Received: from mail-qv1-f72.google.com (mail-qv1-f72.google.com [209.85.219.72]) by relay.mimecast.com with ESMTP with STARTTLS (version=TLSv1.3, cipher=TLS_AES_256_GCM_SHA384) id us-mta-330-gMktcfPGOD-FF_6yVVtCWA-1; Wed, 24 May 2023 17:19:55 -0400 X-MC-Unique: gMktcfPGOD-FF_6yVVtCWA-1 Received: by mail-qv1-f72.google.com with SMTP id 6a1803df08f44-62382e86f83so2639556d6.0 for ; Wed, 24 May 2023 14:19:55 -0700 (PDT) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20221208; t=1684963194; x=1687555194; h=content-language:cc:to:subject:from:user-agent:mime-version:date :message-id:x-gm-message-state:from:to:cc:subject:date:message-id :reply-to; bh=E0P9tX2Cz7GFR0qXOcS8a2BjfJo2/t1JrPXhHSsAb4U=; b=Nen/D37miiu4NdHA5obAgVQv3bzrUqZh4wMRO0lMfKFl7GtyWkBNo1aqPAGH/x2pT8 VSqtwcBuNIKQDHzCeqLKGmgCKV4soPgwvCIj8JKUVEo7sdirgj/lZ0xshjRpf5/dXFTq ZkaavabQRoUbsjtQ4wxEyKblJj4rO6V01eel0eAaaJY+tP5Ed9CGzGVKJfZ8N+zhByZn lAkhqRijGsZABe5jVnyGWhYf0Vu8WPtB4bnpFWSkOEHS519mEJ4ig6K/RWFae8xDi83t oQuiIECQnd1BY0q1pjnuwPw2IkH56JSBjgELdXqOWvxFJiWTKb+kospKkOjp2y8+8STm F1uQ== X-Gm-Message-State: AC+VfDzVVMC+tVnE7iD6msjS0pu48H20XQcLUCJ7NhWSFYcfH8mXfoqQ UA0zMypdhzEksZyM6AsbKPS7zeLy8pxusPl1lS5UJ+8P4FF0bJm/2UbiNqSj5uIwBj205SJ+Uu/ 8zTsQ3KM7rElVosW1fL5eEtYWS2JJGRVucCG9qMFB31PO075EJ+B2Bfv6zmxHx67dZnUjA77qzX dfiA== X-Received: by 2002:a05:622a:28c:b0:3f4:f58d:d00d with SMTP id z12-20020a05622a028c00b003f4f58dd00dmr30511297qtw.40.1684963194392; Wed, 24 May 2023 14:19:54 -0700 (PDT) X-Google-Smtp-Source: ACHHUZ6V+2mST+DX+G0K5HEhG8XNLiI6v4gsY+tpX+KzLfZDefa4DKY3NmkdG1njxZDqqlydopgWlw== X-Received: by 2002:a05:622a:28c:b0:3f4:f58d:d00d with SMTP id z12-20020a05622a028c00b003f4f58dd00dmr30511274qtw.40.1684963194001; Wed, 24 May 2023 14:19:54 -0700 (PDT) Received: from ?IPV6:2607:fea8:51df:4200::933? ([2607:fea8:51df:4200::933]) by smtp.gmail.com with ESMTPSA id lf19-20020a0562142cd300b0061b608dc4c1sm3871196qvb.94.2023.05.24.14.19.53 (version=TLS1_3 cipher=TLS_AES_128_GCM_SHA256 bits=128/128); Wed, 24 May 2023 14:19:53 -0700 (PDT) Message-ID: <6a24c0bf-aa0d-5e13-6852-705605db15ec@redhat.com> Date: Wed, 24 May 2023 17:19:52 -0400 MIME-Version: 1.0 User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:102.0) Gecko/20100101 Thunderbird/102.11.0 From: Andrew MacLeod Subject: [COMMITTED 4/4] - Gimple range PHI analyzer and testcases To: gcc-patches Cc: "hernandez, aldy" X-Mimecast-Spam-Score: 0 X-Mimecast-Originator: redhat.com Content-Type: multipart/mixed; boundary="------------skmTRVVgu00EXl2LbqGHWkAo" Content-Language: en-US X-Spam-Status: No, score=-10.4 required=5.0 tests=BAYES_00,BODY_8BITS,DKIMWL_WL_HIGH,DKIM_SIGNED,DKIM_VALID,DKIM_VALID_AU,DKIM_VALID_EF,GIT_PATCH_0,KAM_ASCII_DIVIDERS,KAM_SHORT,RCVD_IN_DNSWL_NONE,RCVD_IN_MSPIKE_H2,SPF_HELO_NONE,SPF_NONE,TXREP,T_SCC_BODY_TEXT_LINE autolearn=ham autolearn_force=no version=3.4.6 X-Spam-Checker-Version: SpamAssassin 3.4.6 (2021-04-09) on server2.sourceware.org List-Id: This is a multi-part message in MIME format. --------------skmTRVVgu00EXl2LbqGHWkAo Content-Type: text/plain; charset=UTF-8; format=flowed Content-Transfer-Encoding: 8bit This patch provide the framework for a gimple-range phi analyzer. Currently, the  primary purpose is to give better initial values for members of a "phi group" a PHI group is defined as a a group of PHI nodes whose arguments are all either members of the same PHI group, or one of 2 other values:  - An initializer, (typically a constant), but not necessarily,  - A modifier, which is always of the form:   member_ssa = member_ssa OP op2 When the analyzer finds a group which matches this pattern, it tries to evaluate the modifier using the initial value and project a range for the entire group. This initial version is fairly simplistic.  It looks for 2 things: 1) if there is a relation between LHS and the other ssa_name in the modifier, then we can project a range. ie,         a_3 = a_2 + 1 if there is a relation generated by the stmt which say a_3 > a_2, and the initial value is 0, we can project a range of [0, +INF] as the moifier will cause the value to always increase, and not wrap. Likewise, for a_3 = a_2 - 1,  we can project a range of [-INF, 0] based on the "<" relationship between a_3 and a_2. 2) If there is no relationship, then we use the initial range and "simulate" the modifier statement a set number of times looking to see if the value converges. Currently I have arbitrarily hard coded 10 attempts, but intend to change this down the road with a --param, as well as to perhaps influence it with any known values from SCEV regarding known iterations of the loop and possibly change it based on optimization levels. I also suspect something like one more than the number of bits in the type might help with any bitmasking tricks. Theres a lot of additinal things we can do to enhance this, but this framework provides a start.  These 2 initial evaluations fix 107822, and part of 107986.  There is about a 1.5% slowdown to VRP to invoke and utilize the analyzer in all 3 passes of VRP.  overall compile time is 0.06% slower. Bootstraps on x86_64-pc-linux-gnu  with no regressions.  Pushed. Andrew --------------skmTRVVgu00EXl2LbqGHWkAo Content-Type: text/x-patch; charset=UTF-8; name="0004-Gimple-range-PHI-analyzer-and-testcases.patch" Content-Disposition: attachment; filename="0004-Gimple-range-PHI-analyzer-and-testcases.patch" Content-Transfer-Encoding: base64 RnJvbSA2NGU4NDRjMTE4MjE5OGU0OWQzM2Y5ZmExMzhiOWE3ODIzNzEyMjVkIE1vbiBTZXAgMTcg MDA6MDA6MDAgMjAwMQpGcm9tOiBBbmRyZXcgTWFjTGVvZCA8YW1hY2xlb2RAcmVkaGF0LmNvbT4K RGF0ZTogV2VkLCAyNCBNYXkgMjAyMyAwOTo1MjoyNiAtMDQwMApTdWJqZWN0OiBbUEFUQ0ggNC80 XSBHaW1wbGUgcmFuZ2UgUEhJIGFuYWx5emVyIGFuZCB0ZXN0Y2FzZXMKClByb3ZpZGUgYSBQSEkg YW5hbHl6ZXIgZnJhbWV3b3JrIHRvIHByb3ZpdmUgYmV0dGVyIGluaXRpYWwgdmFsdWVzIGZvcgpQ SEkgbm9kZXMgd2hpY2ggZm9ybWsgZ3JvdXBzIHdpdGggaW5pdGlhbCB2YWx1ZXMgYW5kIHNpbmds ZSBzdGF0ZW1lbnRzCndoaWNoIG1vZGlmeSB0aGUgUEhJIHZhbHVlcyBpbiBzb21lIHByZWRpY2F0 YWJsZSB3YXkuCgoJUFIgdHJlZS1vcHRpbWl6YXRpb24vMTA3ODIyCglQUiB0cmVlLW9wdGltaXph dGlvbi8xMDc5ODYKCWdjYy8KCSogTWFrZWZpbGUuaW4gKE9CSlMpOiBBZGQgZ2ltcGxlLXJhbmdl LXBoaS5vLgoJKiBnaW1wbGUtcmFuZ2UtY2FjaGUuaCAocmFuZ2VyX2NhY2hlOjptX2VzdGltYXRl KTogTmV3CglwaGlfYW5hbHl6ZXIgcG9pbnRlciBtZW1iZXIuCgkqIGdpbXBsZS1yYW5nZS1mb2xk LmNjIChmb2xkX3VzaW5nX3JhbmdlOjpyYW5nZV9vZl9waGkpOiBVc2UKCXBoaV9hbmFseXplciBp ZiBubyBsb29wIGluZm8gaXMgYXZhaWxhYmxlLgoJKiBnaW1wbGUtcmFuZ2UtcGhpLmNjOiBOZXcg ZmlsZS4KCSogZ2ltcGxlLXJhbmdlLXBoaS5oOiBOZXcgZmlsZS4KCSogdHJlZS12cnAuY2MgKGV4 ZWN1dGVfcmFuZ2VyX3ZycCk6IFV0aWxpbHplIGEgcGhpX2FuYWx5emVyLgoKCWdjYy90ZXN0c3Vp dGUvCgkqIGdjYy5kZy9wcjEwNzgyMi5jOiBOZXcuCgkqIGdjYy5kZy9wcjEwNzk4Ni0xLmM6IE5l dy4KLS0tCiBnY2MvTWFrZWZpbGUuaW4gICAgICAgICAgICAgICAgICAgfCAgIDEgKwogZ2NjL2dp bXBsZS1yYW5nZS1jYWNoZS5oICAgICAgICAgIHwgICAyICsKIGdjYy9naW1wbGUtcmFuZ2UtZm9s ZC5jYyAgICAgICAgICB8ICAyNyArKwogZ2NjL2dpbXBsZS1yYW5nZS1waGkuY2MgICAgICAgICAg IHwgNTE4ICsrKysrKysrKysrKysrKysrKysrKysrKysrKysrKwogZ2NjL2dpbXBsZS1yYW5nZS1w aGkuaCAgICAgICAgICAgIHwgMTA5ICsrKysrKysKIGdjYy90ZXN0c3VpdGUvZ2NjLmRnL3ByMTA3 ODIyLmMgICB8ICAyMCArKwogZ2NjL3Rlc3RzdWl0ZS9nY2MuZGcvcHIxMDc5ODYtMS5jIHwgIDE2 ICsKIGdjYy90cmVlLXZycC5jYyAgICAgICAgICAgICAgICAgICB8ICAgNyArLQogOCBmaWxlcyBj aGFuZ2VkLCA2OTkgaW5zZXJ0aW9ucygrKSwgMSBkZWxldGlvbigtKQogY3JlYXRlIG1vZGUgMTAw NjQ0IGdjYy9naW1wbGUtcmFuZ2UtcGhpLmNjCiBjcmVhdGUgbW9kZSAxMDA2NDQgZ2NjL2dpbXBs ZS1yYW5nZS1waGkuaAogY3JlYXRlIG1vZGUgMTAwNjQ0IGdjYy90ZXN0c3VpdGUvZ2NjLmRnL3By MTA3ODIyLmMKIGNyZWF0ZSBtb2RlIDEwMDY0NCBnY2MvdGVzdHN1aXRlL2djYy5kZy9wcjEwNzk4 Ni0xLmMKCmRpZmYgLS1naXQgYS9nY2MvTWFrZWZpbGUuaW4gYi9nY2MvTWFrZWZpbGUuaW4KaW5k ZXggYmI2M2I1YzUwMWQuLjFkMzllNmRkM2Y4IDEwMDY0NAotLS0gYS9nY2MvTWFrZWZpbGUuaW4K KysrIGIvZ2NjL01ha2VmaWxlLmluCkBAIC0xNDU0LDYgKzE0NTQsNyBAQCBPQkpTID0gXAogCWdp bXBsZS1yYW5nZS1nb3JpLm8gXAogCWdpbXBsZS1yYW5nZS1pbmZlci5vIFwKIAlnaW1wbGUtcmFu Z2Utb3AubyBcCisJZ2ltcGxlLXJhbmdlLXBoaS5vIFwKIAlnaW1wbGUtcmFuZ2UtdHJhY2UubyBc CiAJZ2ltcGxlLXNzYS1iYWNrcHJvcC5vIFwKIAlnaW1wbGUtc3NhLWlzb2xhdGUtcGF0aHMubyBc CmRpZmYgLS1naXQgYS9nY2MvZ2ltcGxlLXJhbmdlLWNhY2hlLmggYi9nY2MvZ2ltcGxlLXJhbmdl LWNhY2hlLmgKaW5kZXggYWZjZjhkN2RlN2IuLjkzZDE2Mjk0ZDJlIDEwMDY0NAotLS0gYS9nY2Mv Z2ltcGxlLXJhbmdlLWNhY2hlLmgKKysrIGIvZ2NjL2dpbXBsZS1yYW5nZS1jYWNoZS5oCkBAIC0y Myw2ICsyMyw3IEBAIGFsb25nIHdpdGggR0NDOyBzZWUgdGhlIGZpbGUgQ09QWUlORzMuICBJZiBu b3Qgc2VlCiAKICNpbmNsdWRlICJnaW1wbGUtcmFuZ2UtZ29yaS5oIiAKICNpbmNsdWRlICJnaW1w bGUtcmFuZ2UtaW5mZXIuaCIKKyNpbmNsdWRlICJnaW1wbGUtcmFuZ2UtcGhpLmgiCiAKIC8vIFRo aXMgY2xhc3MgbWFuYWdlcyBhIHZlY3RvciBvZiBwb2ludGVycyB0byBzc2FfYmxvY2sgcmFuZ2Vz LiAgSXQKIC8vIHByb3ZpZGVzIHRoZSBiYXNpcyBmb3IgdGhlICJyYW5nZSBvbiBlbnRyeSIgY2Fj aGUgZm9yIGFsbApAQCAtMTM2LDYgKzEzNyw3IEBAIHByaXZhdGU6CiAgIHZvaWQgZXhpdF9yYW5n ZSAodnJhbmdlICZyLCB0cmVlIGV4cHIsIGJhc2ljX2Jsb2NrIGJiLCBlbnVtIHJmZF9tb2RlKTsK ICAgYm9vbCBlZGdlX3JhbmdlICh2cmFuZ2UgJnIsIGVkZ2UgZSwgdHJlZSBuYW1lLCBlbnVtIHJm ZF9tb2RlKTsKIAorICBwaGlfYW5hbHl6ZXIgKm1fZXN0aW1hdGU7CiAgIHZlYzxiYXNpY19ibG9j az4gbV93b3JrYmFjazsKICAgY2xhc3MgdXBkYXRlX2xpc3QgKm1fdXBkYXRlOwogfTsKZGlmZiAt LWdpdCBhL2djYy9naW1wbGUtcmFuZ2UtZm9sZC5jYyBiL2djYy9naW1wbGUtcmFuZ2UtZm9sZC5j YwppbmRleCA0ZGYwNjVjOGE2ZS4uMTczZDlmMzg2YzUgMTAwNjQ0Ci0tLSBhL2djYy9naW1wbGUt cmFuZ2UtZm9sZC5jYworKysgYi9nY2MvZ2ltcGxlLXJhbmdlLWZvbGQuY2MKQEAgLTkzNCw2ICs5 MzQsNyBAQCBmb2xkX3VzaW5nX3JhbmdlOjpyYW5nZV9vZl9waGkgKHZyYW5nZSAmciwgZ3BoaSAq cGhpLCBmdXJfc291cmNlICZzcmMpCiAJICB9CiAgICAgICB9CiAKKyAgYm9vbCBsb29wX2luZm9f cCA9IGZhbHNlOwogICAvLyBJZiBTQ0VWIGlzIGF2YWlsYWJsZSwgcXVlcnkgaWYgdGhpcyBQSEkg aGFzIGFueSBrbm93biB2YWx1ZXMuCiAgIGlmIChzY2V2X2luaXRpYWxpemVkX3AgKCkKICAgICAg ICYmICFQT0lOVEVSX1RZUEVfUCAoVFJFRV9UWVBFIChwaGlfZGVmKSkpCkBAIC05NTYsNiArOTU3 LDMyIEBAIGZvbGRfdXNpbmdfcmFuZ2U6OnJhbmdlX29mX3BoaSAodnJhbmdlICZyLCBncGhpICpw aGksIGZ1cl9zb3VyY2UgJnNyYykKIAkJICBmcHJpbnRmIChkdW1wX2ZpbGUsICJcbiIpOwogCQl9 CiAJICAgICAgci5pbnRlcnNlY3QgKGxvb3BfcmFuZ2UpOworCSAgICAgIGxvb3BfaW5mb19wID0g dHJ1ZTsKKwkgICAgfQorCX0KKyAgICB9CisKKyAgaWYgKCFsb29wX2luZm9fcCAmJiBwaGlfYW5h bHlzaXNfYXZhaWxhYmxlX3AgKCkKKyAgICAgICYmIGlyYW5nZTo6c3VwcG9ydHNfcCAoVFJFRV9U WVBFIChwaGlfZGVmKSkpCisgICAgeworICAgICAgcGhpX2dyb3VwICpnID0gKHBoaV9hbmFseXNp cygpKVtwaGlfZGVmXTsKKyAgICAgIGlmIChnICYmICEoZy0+cmFuZ2UgKCkudmFyeWluZ19wICgp KSkKKwl7CisJICBpZiAoZHVtcF9maWxlICYmIChkdW1wX2ZsYWdzICYgVERGX0RFVEFJTFMpKQor CSAgICB7CisJICAgICAgZnByaW50ZiAoZHVtcF9maWxlLCAiICAgUEhJIGdyb3VwIHJhbmdlIGZv dW5kIGZvciAiKTsKKwkgICAgICBwcmludF9nZW5lcmljX2V4cHIgKGR1bXBfZmlsZSwgcGhpX2Rl ZiwgVERGX1NMSU0pOworCSAgICAgIGZwcmludGYgKGR1bXBfZmlsZSwgIjogIik7CisJICAgICAg Zy0+cmFuZ2UgKCkuZHVtcCAoZHVtcF9maWxlKTsKKwkgICAgICBmcHJpbnRmIChkdW1wX2ZpbGUs ICIgYW5kIGFkanVzdGVkIG9yaWdpbmFsIHJhbmdlIGZyb20gOiIpOworCSAgICAgIHIuZHVtcCAo ZHVtcF9maWxlKTsKKwkgICAgfQorCSAgci5pbnRlcnNlY3QgKGctPnJhbmdlICgpKTsKKwkgIGlm IChkdW1wX2ZpbGUgJiYgKGR1bXBfZmxhZ3MgJiBUREZfREVUQUlMUykpCisJICAgIHsKKwkgICAg ICBmcHJpbnRmIChkdW1wX2ZpbGUsICIgdG8gOiIpOworCSAgICAgIHIuZHVtcCAoZHVtcF9maWxl KTsKKwkgICAgICBmcHJpbnRmIChkdW1wX2ZpbGUsICJcbiIpOwogCSAgICB9CiAJfQogICAgIH0K ZGlmZiAtLWdpdCBhL2djYy9naW1wbGUtcmFuZ2UtcGhpLmNjIGIvZ2NjL2dpbXBsZS1yYW5nZS1w aGkuY2MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMDAwMDAuLmZmYjQ2OTFkMDZi Ci0tLSAvZGV2L251bGwKKysrIGIvZ2NjL2dpbXBsZS1yYW5nZS1waGkuY2MKQEAgLTAsMCArMSw1 MTggQEAKKy8qIEdpbXBsZSByYW5nZSBwaGkgYW5hbHlzaXMuCisgICBDb3B5cmlnaHQgKEMpIDIw MjMgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisgICBDb250cmlidXRlZCBieSBBbmRy ZXcgTWFjTGVvZCA8YW1hY2xlb2RAcmVkaGF0LmNvbT4uCisKK1RoaXMgZmlsZSBpcyBwYXJ0IG9m IEdDQy4KKworR0NDIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFu ZC9vciBtb2RpZnkKK2l0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGlj IExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Cit0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBl aXRoZXIgdmVyc2lvbiAzLCBvciAoYXQgeW91ciBvcHRpb24pCithbnkgbGF0ZXIgdmVyc2lvbi4K KworR0NDIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWws CitidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJy YW50eSBvZgorTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQ T1NFLiAgU2VlIHRoZQorR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWls cy4KKworWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwg UHVibGljIExpY2Vuc2UKK2Fsb25nIHdpdGggR0NDOyBzZWUgdGhlIGZpbGUgQ09QWUlORzMuICBJ ZiBub3Qgc2VlCis8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uICAqLworCisjaW5jbHVk ZSAiY29uZmlnLmgiCisjaW5jbHVkZSAic3lzdGVtLmgiCisjaW5jbHVkZSAiY29yZXR5cGVzLmgi CisjaW5jbHVkZSAiYmFja2VuZC5oIgorI2luY2x1ZGUgImluc24tY29kZXMuaCIKKyNpbmNsdWRl ICJ0cmVlLmgiCisjaW5jbHVkZSAiZ2ltcGxlLmgiCisjaW5jbHVkZSAic3NhLmgiCisjaW5jbHVk ZSAiZ2ltcGxlLXByZXR0eS1wcmludC5oIgorI2luY2x1ZGUgImdpbXBsZS1yYW5nZS5oIgorI2lu Y2x1ZGUgImdpbXBsZS1yYW5nZS1jYWNoZS5oIgorI2luY2x1ZGUgInZhbHVlLXJhbmdlLXN0b3Jh Z2UuaCIKKyNpbmNsdWRlICJ0cmVlLWNmZy5oIgorI2luY2x1ZGUgInRhcmdldC5oIgorI2luY2x1 ZGUgImF0dHJpYnMuaCIKKyNpbmNsdWRlICJnaW1wbGUtaXRlcmF0b3IuaCIKKyNpbmNsdWRlICJn aW1wbGUtd2Fsay5oIgorI2luY2x1ZGUgImNmZ2FuYWwuaCIKKworLy8gVGhlcmUgY2FuIGJlIG9u bHkgb25lIHJ1bm5pbmcgYXQgYSB0aW1lLgorc3RhdGljIHBoaV9hbmFseXplciAqcGhpX2FuYWx5 c2lzX29iamVjdCA9IE5VTEw7CisKKy8vIEluaXRpYWxpemUgYSBQSEkgYW5hbHl6ZXIgd2l0aCBy YW5nZSBxdWVyeSBRLgorCit2b2lkCitwaGlfYW5hbHlzaXNfaW5pdGlhbGl6ZSAocmFuZ2VfcXVl cnkgJnEpCit7CisgIGdjY19jaGVja2luZ19hc3NlcnQgKCFwaGlfYW5hbHlzaXNfb2JqZWN0KTsK KyAgcGhpX2FuYWx5c2lzX29iamVjdCA9IG5ldyBwaGlfYW5hbHl6ZXIgKHEpOworfQorCisvLyBU ZXJtaW5hdGUgdGhlIGN1cnJlbnQgUEhJIGFuYWx5emVyLiAgaWYgRiBpcyBub24tbnVsbCwgZHVt cCB0aGUgdGFibGVzCisKK3ZvaWQKK3BoaV9hbmFseXNpc19maW5hbGl6ZSAoKQoreworICBnY2Nf Y2hlY2tpbmdfYXNzZXJ0IChwaGlfYW5hbHlzaXNfb2JqZWN0KTsKKyAgZGVsZXRlIHBoaV9hbmFs eXNpc19vYmplY3Q7CisgIHBoaV9hbmFseXNpc19vYmplY3QgPSBOVUxMOworfQorCisvLyBSZXR1 cm4gVFJVRSBpcyB0aGVyZSBpcyBhIFBISSBhbmFseXplciBvcGVyYXRpbmcuCitib29sCitwaGlf YW5hbHlzaXNfYXZhaWxhYmxlX3AgKCkKK3sKKyAgcmV0dXJuIHBoaV9hbmFseXNpc19vYmplY3Qg IT0gTlVMTDsKK30KKworLy8gUmV0dXJuIHRoZSBwaGkgYW5hbHl6ZXIgb2JqZWN0LgorCitwaGlf YW5hbHl6ZXIgJnBoaV9hbmFseXNpcyAoKQoreworICBnY2NfY2hlY2tpbmdfYXNzZXJ0IChwaGlf YW5hbHlzaXNfb2JqZWN0KTsKKyAgcmV0dXJuICpwaGlfYW5hbHlzaXNfb2JqZWN0OworfQorCisv LyBJbml0aWFsaXplIGEgcGhpX2dyb3VwIGZyb20gYW5vdGhlciBncm91cCBHLgorCitwaGlfZ3Jv dXA6OnBoaV9ncm91cCAoY29uc3QgcGhpX2dyb3VwICZnKQoreworICBtX2dyb3VwID0gZy5tX2dy b3VwOworICBtX2luaXRpYWxfdmFsdWUgPSBnLm1faW5pdGlhbF92YWx1ZTsKKyAgbV9pbml0aWFs X2VkZ2UgPSBnLm1faW5pdGlhbF9lZGdlOworICBtX21vZGlmaWVyID0gZy5tX21vZGlmaWVyOwor ICBtX21vZGlmaWVyX29wID0gZy5tX21vZGlmaWVyX29wOworICBtX3ZyID0gZy5tX3ZyOworfQor CisvLyBDcmVhdGUgYSBuZXcgcGhpX2dyb3VwIHdpdGggbWVtYmVycyBCTSwgaW5pdGlhbHZhbHVl IElOSVRfVkFMLCBtb2RpZmllcgorLy8gc3RhdGVtZW50IE1PRCwgYW5kIHJlc29sdmUgdmFsdWVz IHVzaW5nIHF1ZXJ5IFEuCisvLyBDYWxjdWxhdGUgdGhlIHJhbmdlIGZvciB0aGUgZ3JvcHVwIGlm IHBvc3NpYmxlLCBvdGhlcndpc2Ugc2V0IGl0IHRvCisvLyBWQVJZSU5HLgorCitwaGlfZ3JvdXA6 OnBoaV9ncm91cCAoYml0bWFwIGJtLCB0cmVlIGluaXRfdmFsLCBlZGdlIGUsIGdpbXBsZSAqbW9k LAorCQkgICAgICByYW5nZV9xdWVyeSAqcSkKK3sKKyAgLy8gd2UgZG9udCBleHBlY3QgYSBtb2Rp ZmVyIGFuZCBubyBpbml0YWwgdmFsdWUsIHNvIHRyYXAgdG8gaGF2ZSBhIGxvb2suCisgIC8vIHBl cmhhcHMgdGhleSBhcmUgZGVhZCBjeWNsZXMgYW5kIHdlIGNhbiBqdXN0IHVzZWQgVU5ERUZJTkVE LgorICBnY2NfY2hlY2tpbmdfYXNzZXJ0IChpbml0X3ZhbCk7CisKKyAgbV9tb2RpZmllcl9vcCA9 IGlzX21vZGlmaWVyX3AgKG1vZCwgYm0pOworICBtX2dyb3VwID0gYm07CisgIG1faW5pdGlhbF92 YWx1ZSA9IGluaXRfdmFsOworICBtX2luaXRpYWxfZWRnZSA9IGU7CisgIG1fbW9kaWZpZXIgPSBt b2Q7CisgIGlmIChxLT5yYW5nZV9vbl9lZGdlIChtX3ZyLCBtX2luaXRpYWxfZWRnZSwgbV9pbml0 aWFsX3ZhbHVlKSkKKyAgICB7CisgICAgICAvLyBObyBtb2RpZmllciBtZWFucyB0aGUgaW5pdGlh bCByYW5nZSBpcyB0aGUgZnVsbCByYW5nZS4KKyAgICAgIC8vIE90aGVyd2lzZSB0cnkgdG8gY2Fs Y3VsYXRlIGEgcmFuZ2UuCisgICAgICBpZiAoIW1fbW9kaWZpZXJfb3AgfHwgY2FsY3VsYXRlX3Vz aW5nX21vZGlmaWVyIChxKSkKKwlyZXR1cm47CisgICAgfQorICAvLyBDb3VsZG4ndCBjYWxjdWxh dGUgYSByYW5nZSwgc2V0IHRvIHZhcnlpbmcuCisgIG1fdnIuc2V0X3ZhcnlpbmcgKFRSRUVfVFlQ RSAoaW5pdF92YWwpKTsKK30KKworLy8gUmV0dXJuIDAgaWYgUyBpcyBub3QgYSBtb2RpZmllciBz dGF0bWVudCBmb3IgZ3JvdXAgbWVtYmVycyBCTS4KKy8vIElmIGl0IGNvdWxkIGJlIGEgbW9kaWZp ZXIsIHJldHVybiB3aGljaCBvcGVyYW5kIHBvc2l0aW9uICgxIG9yIDIpCisvLyB0aGUgcGhpIG1l bWJlciBvY2N1cnMgaW4uCit1bnNpZ25lZAorcGhpX2dyb3VwOjppc19tb2RpZmllcl9wIChnaW1w bGUgKnMsIGNvbnN0IGJpdG1hcCBibSkKK3sKKyAgaWYgKCFzKQorICAgIHJldHVybiAwOworICBn aW1wbGVfcmFuZ2Vfb3BfaGFuZGxlciBoYW5kbGVyIChzKTsKKyAgaWYgKGhhbmRsZXIpCisgICAg eworICAgICAgdHJlZSBvcDEgPSBnaW1wbGVfcmFuZ2Vfc3NhX3AgKGhhbmRsZXIub3BlcmFuZDEg KCkpOworICAgICAgdHJlZSBvcDIgPSBnaW1wbGVfcmFuZ2Vfc3NhX3AgKGhhbmRsZXIub3BlcmFu ZDIgKCkpOworICAgICAgLy8gQWxzbyBkaXNhbGxvdyBtb2RpZmllcnMgdGhhdCBoYXZlIDIgc3Nh LW5hbWVzLgorICAgICAgaWYgKG9wMSAmJiAhb3AyICYmIGJpdG1hcF9iaXRfcCAoYm0sIFNTQV9O QU1FX1ZFUlNJT04gKG9wMSkpKQorCXJldHVybiAxOworICAgICAgZWxzZSBpZiAob3AyICYmICFv cDEgJiYgYml0bWFwX2JpdF9wIChibSwgU1NBX05BTUVfVkVSU0lPTiAob3AyKSkpCisJcmV0dXJu IDI7CisgICAgfQorICByZXR1cm4gMDsKK30KKworLy8gQ2FsdWxjYXRlIHRoZSByYW5nZSBvZiB0 aGUgcGhpIGdyb3VwIHVzaW5nIHJhbmdlX3F1ZXJ5IFEuCisKK2Jvb2wKK3BoaV9ncm91cDo6Y2Fs Y3VsYXRlX3VzaW5nX21vZGlmaWVyIChyYW5nZV9xdWVyeSAqcSkKK3sKKyAgLy8gTG9vayBhdCB0 aGUgbW9kaWZpZXIgZm9yIGFueSByZWxhdGlvbgorICByZWxhdGlvbl90cmlvIHRyaW8gPSBmb2xk X3JlbGF0aW9ucyAobV9tb2RpZmllciwgcSk7CisgIHJlbGF0aW9uX2tpbmQgayA9IFZSRUxfVkFS WUlORzsKKyAgaWYgKG1fbW9kaWZpZXJfb3AgPT0gMSkKKyAgICBrID0gdHJpby5saHNfb3AxICgp OworICBlbHNlIGlmIChtX21vZGlmaWVyX29wID09IDIpCisgICAgayA9IHRyaW8ubGhzX29wMiAo KTsKKyAgZWxzZQorICAgIHJldHVybiBmYWxzZTsKKworICAvLyBJZiB3ZSBjYW4gcmVzb2x2ZSB0 aGUgcmFuZ2UgdXNpbmcgcmVsYXRpb25zLCB1c2UgdGhhdCByYW5nZS4KKyAgaWYgKHJlZmluZV91 c2luZ19yZWxhdGlvbiAoaywgcSkpCisgICAgcmV0dXJuIHRydWU7CisKKyAvLyBJZiB0aGUgaW5p dGlhbCB2YWx1ZSBpcyB1bmRlZmluZWQsIGRvIG5vdCBjYWxjdWxhdGUgYSByYW5nZS4KKyAgaWYg KG1fdnIudW5kZWZpbmVkX3AgKCkpCisgICAgcmV0dXJuIGZhbHNlOworCisgIC8vIEV4YW1pbmUg bW9kaWZpZXIgYW5kIHJ1biBYIGl0ZXJhdGlvbnMgdG8gc2VlIGlmIGl0IGNvbnZlcmdlbmNlcy4K KyAgLy8gVGhlIGNvbnN0cnVjdG9yIGluaXRpbGFpemVkIG1fdnIgdG8gdGhlIGluaXRpYWwgdmFs dWUgYWxyZWFkeS4KKyAgaW50X3JhbmdlX21heCBudjsKKyAgZm9yICh1bnNpZ25lZCB4ID0gMDsg eDwgMTA7IHgrKykKKyAgICB7CisgICAgICBpZiAoIWZvbGRfcmFuZ2UgKG52LCBtX21vZGlmaWVy LCBtX3ZyLCBxKSkKKwlyZXR1cm4gZmFsc2U7CisgICAgICAvLyBJZiB0aGV5IGFyZSBlcXVhbCwg dGhlbiB3ZSBoYXZlIGNvbnZlcmdlbmNlLgorICAgICAgaWYgKG52ID09IG1fdnIpCisJcmV0dXJu IHRydWU7CisgICAgICAvLyBVcGRhdGUgcmFuZ2UgYW5kIHRyeSBhZ2Fpbi4KKyAgICAgIG1fdnIu dW5pb25fIChudik7CisgICAgfQorICAvLyBOZXZlciBjb252ZXJnZWQsIHNvIGJhaWwgZm9yIG5v dy4gd2UgY291bGQgZXhhbWluZSB0aGUgcGF0dGVybgorICAvLyBmcm9tIG1faW5pdGlhbCB0byBt X3ZyIGFzIGFuIGV4dGVuc2lvbiAgRXNwZWNpYWxseSBpZiB3ZSBoYWQgYSB3YXkKKyAgLy8gdG8g cHJvamVjdCB0aGUgYWN0dWFsIG51bWJlciBvZiBpdGVyYXRpb25zIChTQ0VWPykKKyAgLy8KKyAg Ly8gIFdlIGNhbiBhbHNvIHRyeSB0byBpZGVudGlmeSAicGFyYWxsZWwiIHBoaXMgdG8gZ2V0IGxv b3AgY291bnRzIGFuZAorICAvLyAgZGV0ZXJtaW5lIHRoZSBudW1iZXIgb2YgaXRlcmF0aW9ucyBv ZiB0aGVzZSBwYXJhbGxlbCBQSElzLgorICAvLworICByZXR1cm4gZmFsc2U7Cit9CisKKworLy8g SUYgdGhlIG1vZGlmaWVyIHN0YXRlbWVudCBoYXMgYSByZWxhdGlvbiBLIGJldHdlZW4gdGhlIG1v ZGlmaWVyIGFuZCB0aGUKKy8vIFBISSBtZW1iZXIgaW4gaXQsIHdlIGNhbiBwcm9qZWN0IGEgcmFu Z2UgYmFzZWQgb24gdGhhdC4KKy8vIFVzZSByYW5nZV9xdWVyeSBRIHRvIHJlc29sdmUgdmFsdWVz LgorLy8gaWUsICBhXzIgPSBQSEkgPDAsIGFfMz4gICBhbmQgYV8zID0gYV8yICsgMQorLy8gaWYg dGhlIHJlbGF0aW9uIGFfMyA+IGFfMiBpcyBwcmVzZW50LCB0aGUga25vdyB0aGUgcmFuZ2UgaXMg WzAsICtJTkZdCisKK2Jvb2wKK3BoaV9ncm91cDo6cmVmaW5lX3VzaW5nX3JlbGF0aW9uIChyZWxh dGlvbl9raW5kIGssIHJhbmdlX3F1ZXJ5ICpxKQoreworICBpZiAoayA9PSBWUkVMX1ZBUllJTkcp CisgICAgcmV0dXJuIGZhbHNlOworICB0cmVlIHR5cGUgPSBUUkVFX1RZUEUgKG1faW5pdGlhbF92 YWx1ZSk7CisgIC8vIElmIHRoZSB0eXBlIHdyYXBzLCB0aGVuIHJlbGF0aW9ucyBkb250IHRlbGwg dXMgbXVjaC4KKyAgaWYgKFRZUEVfT1ZFUkZMT1dfV1JBUFMgKHR5cGUpKQorICAgIHJldHVybiBm YWxzZTsKKworICBzd2l0Y2ggKGspCisgICAgeworICAgIGNhc2UgVlJFTF9MVDoKKyAgICBjYXNl IFZSRUxfTEU6CisgICAgICB7CisJLy8gVmFsdWUgYWx3YXlzIGRlY3JlYXNlcy4KKwlpbnRfcmFu Z2U8Mj4gbGI7CisJaW50X3JhbmdlPDI+IHViOworCWlmICghcS0+cmFuZ2Vfb25fZWRnZSAodWIs IG1faW5pdGlhbF9lZGdlLCBtX2luaXRpYWxfdmFsdWUpKQorCSAgYnJlYWs7CisJaWYgKHViLnVu ZGVmaW5lZF9wICgpKQorCSAgcmV0dXJuIGZhbHNlOworCWxiLnNldF92YXJ5aW5nICh0eXBlKTsK KwltX3ZyLnNldCAodHlwZSwgbGIubG93ZXJfYm91bmQgKCksIHViLnVwcGVyX2JvdW5kICgpKTsK KwlyZXR1cm4gdHJ1ZTsKKyAgICAgIH0KKworICAgIGNhc2UgVlJFTF9HVDoKKyAgICBjYXNlIFZS RUxfR0U6CisgICAgICB7CisJLy8gVmFsdWUgYWx3YXlzIGluY3JlYXNlcy4KKwlpbnRfcmFuZ2U8 Mj4gbGI7CisJaW50X3JhbmdlPDI+IHViOworCWlmICghcS0+cmFuZ2Vfb25fZWRnZSAobGIsIG1f aW5pdGlhbF9lZGdlLCBtX2luaXRpYWxfdmFsdWUpKQorCSAgYnJlYWs7CisJaWYgKGxiLnVuZGVm aW5lZF9wICgpKQorCSAgcmV0dXJuIGZhbHNlOworCXViLnNldF92YXJ5aW5nICh0eXBlKTsKKwlt X3ZyLnNldCAodHlwZSwgbGIubG93ZXJfYm91bmQgKCksIHViLnVwcGVyX2JvdW5kICgpKTsKKwly ZXR1cm4gdHJ1ZTsKKyAgICAgIH0KKworICAgICAgLy8gSWYgaXRzIGFsd2F5cyBlcXVhbCwgdGhl biBpdHMgc2ltcGx5IHRoZSBpbml0aWFsIHZhbHVlLgorICAgICAgLy8gd2hpY2ggaXMgd2hhdCBt X3ZyIGhhcyBhbHJlYWR5IGJlZW4gc2V0IHRvLgorICAgIGNhc2UgVlJFTF9FUToKKyAgICAgIHJl dHVybiB0cnVlOworCisgICAgZGVmYXVsdDoKKyAgICAgIGJyZWFrOworICAgIH0KKworICByZXR1 cm4gZmFsc2U7Cit9CisKKy8vIER1bXAgdGhlIGluZm9ybWF0aW9uIGZvciBhIHBoaSBncm91cCB0 byBmaWxlIEYuCisKK3ZvaWQKK3BoaV9ncm91cDo6ZHVtcCAoRklMRSAqZikKK3sKKyAgdW5zaWdu ZWQgaTsKKyAgYml0bWFwX2l0ZXJhdG9yIGJpOworICBmcHJpbnRmIChmLCAiUEhJIEdST1VQIDwi KTsKKworICBFWEVDVVRFX0lGX1NFVF9JTl9CSVRNQVAgKG1fZ3JvdXAsIDAsIGksIGJpKQorICAg IHsKKyAgICAgIHByaW50X2dlbmVyaWNfZXhwciAoZiwgc3NhX25hbWUgKGkpLCBUREZfU0xJTSk7 CisgICAgICBmcHV0YyAoJyAnLGYpOworICAgIH0KKworICBmcHJpbnRmIChmLCAiPlxuIC0gSW5p dGlhbCB2YWx1ZSA6ICIpOworICBpZiAobV9pbml0aWFsX3ZhbHVlKQorICAgIHsKKyAgICAgIGlm IChUUkVFX0NPREUgKG1faW5pdGlhbF92YWx1ZSkgPT0gU1NBX05BTUUpCisJcHJpbnRfZ2ltcGxl X3N0bXQgKGYsIFNTQV9OQU1FX0RFRl9TVE1UIChtX2luaXRpYWxfdmFsdWUpLCAwLCBUREZfU0xJ TSk7CisgICAgICBlbHNlCisJcHJpbnRfZ2VuZXJpY19leHByIChmLCBtX2luaXRpYWxfdmFsdWUs IFRERl9TTElNKTsKKyAgICAgIGZwcmludGYgKGYsICIgb24gZWRnZSAlZC0+JWQiLCBtX2luaXRp YWxfZWRnZS0+c3JjLT5pbmRleCwKKwkgICAgICAgbV9pbml0aWFsX2VkZ2UtPmRlc3QtPmluZGV4 KTsKKyAgICB9CisgIGVsc2UKKyAgICBmcHJpbnRmIChmLCAiTk9ORSIpOworICBmcHJpbnRmIChm LCAiXG4gLSBNb2RpZmllciA6ICIpOworICBpZiAobV9tb2RpZmllcikKKyAgICBwcmludF9naW1w bGVfc3RtdCAoZiwgbV9tb2RpZmllciwgMCwgVERGX1NMSU0pOworICBlbHNlCisgICAgZnByaW50 ZiAoZiwgIk5PTkVcbiIpOworICBmcHJpbnRmIChmLCAiIC0gUmFuZ2UgOiAiKTsKKyAgbV92ci5k dW1wIChmKTsKKyAgZnB1dGMgKCdcbicsIGYpOworfQorCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisK Ky8vIENvbnN0cnVjdCBhIHBoaSBhbmFseXplciB3aGljaCB1c2VzIHJhbmdlX3F1ZXJ5IEcgdG8g cGljayB1cCB2YWx1ZXMuCisKK3BoaV9hbmFseXplcjo6cGhpX2FuYWx5emVyIChyYW5nZV9xdWVy eSAmZykgOiBtX2dsb2JhbCAoZykKK3sKKyAgbV93b3JrLmNyZWF0ZSAoMCk7CisgIG1fd29yay5z YWZlX2dyb3cgKDIwKTsKKworICBtX3RhYi5jcmVhdGUgKDApOworLy8gICBtX3RhYi5zYWZlX2dy b3dfY2xlYXJlZCAobnVtX3NzYV9uYW1lcyArIDEwMCk7CisgIGJpdG1hcF9vYnN0YWNrX2luaXRp YWxpemUgKCZtX2JpdG1hcHMpOworICBtX3NpbXBsZSA9IEJJVE1BUF9BTExPQyAoJm1fYml0bWFw cyk7CisgIG1fY3VycmVudCA9IEJJVE1BUF9BTExPQyAoJm1fYml0bWFwcyk7Cit9CisKKy8vIERl c3RydWN0IGEgUEhJIGFuYWx5emVyLgorCitwaGlfYW5hbHl6ZXI6On5waGlfYW5hbHl6ZXIgKCkK K3sKKyAgYml0bWFwX29ic3RhY2tfcmVsZWFzZSAoJm1fYml0bWFwcyk7CisgIG1fdGFiLnJlbGVh c2UgKCk7CisgIG1fd29yay5yZWxlYXNlICgpOworfQorCisvLyAgUmV0dXJuIHRoZSBncm91cCwg aWYgYW55LCB0aGF0IE5BTUUgaXMgcGFydCBvZi4gIERvIG5vIGFuYWx5c2lzLgorCitwaGlfZ3Jv dXAgKgorcGhpX2FuYWx5emVyOjpncm91cCAodHJlZSBuYW1lKSBjb25zdAoreworICBnY2NfY2hl Y2tpbmdfYXNzZXJ0IChUUkVFX0NPREUgKG5hbWUpID09IFNTQV9OQU1FKTsKKyAgaWYgKCFpc19h PGdwaGkgKj4gKFNTQV9OQU1FX0RFRl9TVE1UIChuYW1lKSkpCisgICAgcmV0dXJuIE5VTEw7Cisg IHVuc2lnbmVkIHYgPSBTU0FfTkFNRV9WRVJTSU9OIChuYW1lKTsKKyAgaWYgKHYgPj0gbV90YWIu bGVuZ3RoICgpKQorICAgIHJldHVybiBOVUxMOworICByZXR1cm4gbV90YWJbdl07Cit9CisKKy8v IFJldHVybiB0aGUgZ3JvdXAgTkFNRSBpcyBhc3NvY2lhdGVkIHdpdGgsIGlmIGFueS4gIElmIG5h bWUgaGFzIG5vdCBiZWVuCisvLyBwcm9jdmVzc2VkIHlldCwgZG8gdGhlIGFuYWx5c2lzIHRvIGRl dGVybWluZSBpZiBpdCBpcyBwYXJ0IG9mIGEgZ3JvdXAKKy8vIGFuZCByZXR1cm4gdGhhdC4KKwor cGhpX2dyb3VwICoKK3BoaV9hbmFseXplcjo6b3BlcmF0b3JbXSAodHJlZSBuYW1lKQoreworICBn Y2NfY2hlY2tpbmdfYXNzZXJ0IChUUkVFX0NPREUgKG5hbWUpID09IFNTQV9OQU1FKTsKKworICAv LyAgSW5pdGlhbCBzdXBwb3J0IGZvciBpcmFuZ2Ugb25seS4KKyAgaWYgKCFpcmFuZ2U6OnN1cHBv cnRzX3AgKFRSRUVfVFlQRSAobmFtZSkpKQorICAgIHJldHVybiBOVUxMOworICBpZiAoIWlzX2E8 Z3BoaSAqPiAoU1NBX05BTUVfREVGX1NUTVQgKG5hbWUpKSkKKyAgICByZXR1cm4gTlVMTDsKKwor ICB1bnNpZ25lZCB2ID0gU1NBX05BTUVfVkVSU0lPTiAobmFtZSk7CisgIC8vIEFscmVhZHkgYmVl biBwcm9jZXNzZWQgYW5kIG5vdCBwYXJ0IG9mIGEgZ3JvdXAuCisgIGlmIChiaXRtYXBfYml0X3Ag KG1fc2ltcGxlLCB2KSkKKyAgICByZXR1cm4gTlVMTDsKKworICBpZiAodiA+PSBtX3RhYi5sZW5n dGggKCkgfHwgIW1fdGFiW3ZdKQorICAgIHsKKyAgICAgIHByb2Nlc3NfcGhpIChhc19hPGdwaGkg Kj4gKFNTQV9OQU1FX0RFRl9TVE1UIChuYW1lKSkpOworICAgICAgaWYgKGJpdG1hcF9iaXRfcCAo bV9zaW1wbGUsIHYpKQorCXJldHVybiAgTlVMTDsKKyAgICAgIC8vIElmIG1fc2ltcGxlIGJpdCBp c24ndCBzZXQsIHRoZW4gcHJvY2Vzc19waGkgYWxsb2NhdGVkIHRoZSB0YWJsZQorICAgICAgLy8g YW5kIHNob3VsZCBoYXZlIGEgZ3JvdXAuCisgICAgICBnY2NfY2hlY2tpbmdfYXNzZXJ0ICh2IDwg bV90YWIubGVuZ3RoICgpKTsKKyAgICB9CisgIHJldHVybiBtX3RhYlt2XTsKK30KKworLy8gUHJv Y2VzcyBwaGkgbm9kZSBQSEkgdG8gc2VlIGlmIGl0IGl0IHBhcnQgb2YgYSBncm91cC4KKwordm9p ZAorcGhpX2FuYWx5emVyOjpwcm9jZXNzX3BoaSAoZ3BoaSAqcGhpKQoreworICBnY2NfY2hlY2tp bmdfYXNzZXJ0ICghZ3JvdXAgKGdpbXBsZV9waGlfcmVzdWx0IChwaGkpKSk7CisgIGJvb2wgY3lj bGVfcCA9IHRydWU7CisKKyAgLy8gU3RhcnQgd2l0aCB0aGUgTEhTIG9mIHRoZSBQSEkgaW4gdGhl IHdvcmtsaXN0LgorICB1bnNpZ25lZCB4OworICBtX3dvcmsudHJ1bmNhdGUgKDApOworICBtX3dv cmsuc2FmZV9wdXNoIChnaW1wbGVfcGhpX3Jlc3VsdCAocGhpKSk7CisgIGJpdG1hcF9jbGVhciAo bV9jdXJyZW50KTsKKworICAvLyBXZSBjYW4gb25seSBoYXZlIDIgZXh0ZXJuYWxzOiBhbiBpbml0 aWFsIHZhbHVlIGFuZCBhIG1vZGlmaWVyLgorICAvLyBBbnkgbW9yZSB0aGFuIHRoYXQgYW5kIHRo aXMgZmFpbHMgdG8gYmUgYSBncm91cC4KKyAgdW5zaWduZWQgbV9udW1fZXh0ZXJuID0gMDsKKyAg dHJlZSBtX2V4dGVybmFsWzJdOworICBlZGdlIG1fZXh0X2VkZ2VbMl07CisKKyAgd2hpbGUgKG1f d29yay5sZW5ndGggKCkgPiAwKQorICAgIHsKKyAgICAgIHRyZWUgcGhpX2RlZiA9IG1fd29yay5w b3AgKCk7CisgICAgICBncGhpICpwaGlfc3RtdCA9IGFzX2E8Z3BoaSAqPiAoU1NBX05BTUVfREVG X1NUTVQgKHBoaV9kZWYpKTsKKyAgICAgIC8vIGlmIHRoZSBwaGkgaXMgYWxyZWFkeSBpbiBhIGN5 Y2xlLCBpdHMgYSBjb21wbGV4IHNpdHVhdGlvbiwgc28gcmV2ZXJ0CisgICAgICAvLyB0byBzaW1w bGUuCisgICAgICBpZiAoZ3JvdXAgKHBoaV9kZWYpKQorCXsKKwkgIGN5Y2xlX3AgPSBmYWxzZTsK KwkgIGNvbnRpbnVlOworCX0KKyAgICAgIGJpdG1hcF9zZXRfYml0IChtX2N1cnJlbnQsIFNTQV9O QU1FX1ZFUlNJT04gKHBoaV9kZWYpKTsKKyAgICAgIC8vIFByb2Nlc3MgdGhlIGFyZ3MuCisgICAg ICBmb3IgKHggPSAwOyB4IDwgZ2ltcGxlX3BoaV9udW1fYXJncyAocGhpX3N0bXQpOyB4KyspCisJ eworCSAgdHJlZSBhcmcgPSBnaW1wbGVfcGhpX2FyZ19kZWYgKHBoaV9zdG10LCB4KTsKKwkgIGlm IChhcmcgPT0gcGhpX2RlZikKKwkgICAgY29udGludWU7CisJICBlbnVtIHRyZWVfY29kZSBjb2Rl ID0gVFJFRV9DT0RFIChhcmcpOworCSAgaWYgKGNvZGUgPT0gU1NBX05BTUUpCisJICAgIHsKKwkg ICAgICB1bnNpZ25lZCB2ID0gU1NBX05BTUVfVkVSU0lPTiAoYXJnKTsKKwkgICAgICAvLyBBbHJl YWR5IGEgbWVtYmVyIG9mIHRoaXMgcG90ZW50aWFsIGdyb3VwLgorCSAgICAgIGlmIChiaXRtYXBf Yml0X3AgKG1fY3VycmVudCwgdikpCisJCWNvbnRpbnVlOworCSAgICAgIC8vIFBhcnQgb2YgYSBk aWZmZXJlbnQgZ3JvdXAgZW5kcyBjeWNsZSBwb3NzaWJpbGl0eS4KKwkgICAgICBpZiAoZ3JvdXAg KGFyZykgfHwgYml0bWFwX2JpdF9wIChtX3NpbXBsZSwgdikpCisJCXsKKwkJICBjeWNsZV9wID0g ZmFsc2U7CisJCSAgYnJlYWs7CisJCX0KKwkgICAgICAvLyBDaGVjayBpZiBpdHMgYSBQSEkgdG8g ZXhhbWluZS4KKwkgICAgICAvLyAqRklYKiBXaWxsIG1pc3MgaW5pdGlhbCB2YWx1ZXMgdGhhdCBv cmlnaW5hdGUgZnJvbSBhIFBISS4KKwkgICAgICBnaW1wbGUgKmFyZ19zdG10ID0gU1NBX05BTUVf REVGX1NUTVQgKGFyZyk7CisJICAgICAgaWYgKGFyZ19zdG10ICYmIGlzX2E8Z3BoaSAqPiAoYXJn X3N0bXQpKQorCQl7CisJCSAgbV93b3JrLnNhZmVfcHVzaCAoYXJnKTsKKwkJICBjb250aW51ZTsK KwkJfQorCSAgICB9CisJICAvLyBPdGhlciBub24tc3NhIG5hbWVzIHRoYXQgYXJlbnQgY29uc3Rh bnRzIGFyZSBub3QgdW5kZXJzdG9vZAorCSAgLy8gYW5kIHRlcm1pbmF0ZSBhbmFseXNpcy4KKwkg IGVsc2UgaWYgKGNvZGUgIT0gSU5URUdFUl9DU1QgJiYgY29kZSAhPSBSRUFMX0NTVCkKKwkgICAg eworCSAgICAgIGN5Y2xlX3AgPSBmYWxzZTsKKwkgICAgICBjb250aW51ZTsKKwkgICAgfQorCSAg Ly8gTW9yZSB0aGFuIDIgb3V0c2lkZSBuYW1lcy9DT05TVCBpcyB0b28gY29tcGxpY2F0ZWQuCisJ ICBpZiAobV9udW1fZXh0ZXJuID49IDIpCisJICAgIHsKKwkgICAgICBjeWNsZV9wID0gZmFsc2U7 CisJICAgICAgYnJlYWs7CisJICAgIH0KKworCSAgbV9leHRlcm5hbFttX251bV9leHRlcm5dID0g YXJnOworCSAgbV9leHRfZWRnZVttX251bV9leHRlcm4rK10gPSBnaW1wbGVfcGhpX2FyZ19lZGdl IChwaGlfc3RtdCwgeCk7CisJfQorICAgIH0KKworICAvLyBJZiB0aGVyZSBhcmUgbm8gbmFtZXMg aW4gdGhlIGdyb3VwLCB3ZSdyZSBkb25lLgorICBpZiAoYml0bWFwX2VtcHR5X3AgKG1fY3VycmVu dCkpCisgICAgcmV0dXJuOworCisgIHBoaV9ncm91cCAqZyA9IE5VTEw7CisgIGlmIChjeWNsZV9w KQorICAgIHsKKyAgICAgIGJvb2wgdmFsaWQgPSB0cnVlOworICAgICAgZ2ltcGxlICptb2QgPSBO VUxMOworICAgICAgc2lnbmVkIGluaXRfaWR4ID0gLTE7CisgICAgICAvLyBBdCB0aGlzIHBvaW50 IGFsbCB0aGUgUEhJcyBoYXZlIGJlZW4gYWRkZWQgdG8gdGhlIGJpdG1hcC4KKyAgICAgIC8vIHRo ZSBleHRlcm5hbCBsaXN0IG5lZWRzIHRvIGJlIGNoZWNrZWQgZm9yIGluaXRpYWwgdmFsdWVzIGFu ZCBtb2RpZmllcnMuCisgICAgICBmb3IgKHggPSAwOyB4IDwgbV9udW1fZXh0ZXJuOyB4KyspCisJ eworCSAgdHJlZSBuYW1lID0gbV9leHRlcm5hbFt4XTsKKwkgIGlmIChUUkVFX0NPREUgKG5hbWUp ID09IFNTQV9OQU1FCisJICAgICAgJiYgcGhpX2dyb3VwOjppc19tb2RpZmllcl9wIChTU0FfTkFN RV9ERUZfU1RNVCAobmFtZSksIG1fY3VycmVudCkpCisJICAgIHsKKwkgICAgICAvLyBDYW4ndCBo YXZlIG11bHRpcGxlIG1vZGlmaWVycy4KKwkgICAgICBpZiAobW9kKQorCQl2YWxpZCA9IGZhbHNl OworCSAgICAgIG1vZCA9IFNTQV9OQU1FX0RFRl9TVE1UIChuYW1lKTsKKwkgICAgICBjb250aW51 ZTsKKwkgICAgfQorCSAgLy8gQ2FuJ3QgaGF2ZSAyIGluaXRpYWxpemVycyBlaXRoZXIuCisJICBp ZiAoaW5pdF9pZHggIT0gLTEpCisJICAgIHZhbGlkID0gZmFsc2U7CisJICBpbml0X2lkeCA9IHg7 CisJfQorICAgICAgaWYgKHZhbGlkKQorCXsKKwkgIC8vIFRyeSB0byBjcmVhdGUgYSBncm91cCBi YXNlZCBvbiBtX2N1cnJlbnQuIElmIGEgcmVzdWx0IGNvbWVzIGJhY2sKKwkgIC8vIHdpdGggYSBy YW5nZSB0aGF0IGlzbid0IHZhcnlpbmcsIGNyZWF0ZSB0aGUgZ3JvdXAuCisJICBwaGlfZ3JvdXAg Y3ljIChtX2N1cnJlbnQsIG1fZXh0ZXJuYWxbaW5pdF9pZHhdLAorCQkJIG1fZXh0X2VkZ2VbaW5p dF9pZHhdLCBtb2QsICZtX2dsb2JhbCk7CisJICBpZiAoIWN5Yy5yYW5nZSAoKS52YXJ5aW5nX3Ag KCkpCisJICAgIGcgPSBuZXcgcGhpX2dyb3VwIChjeWMpOworCX0KKyAgICB9CisgIC8vIElmIHRo aXMgZHBvZXNuO3QgZm9ybSBhIGdyb3VwLCBhbGwgbWVtYmVycyBhcmUgaW5zdGVhZCBzaW1wbGUg cGhpcy4KKyAgaWYgKCFnKQorICAgIHsKKyAgICAgIGJpdG1hcF9pb3JfaW50byAobV9zaW1wbGUs IG1fY3VycmVudCk7CisgICAgICByZXR1cm47CisgICAgfQorCisgIGlmIChudW1fc3NhX25hbWVz ID49IG1fdGFiLmxlbmd0aCAoKSkKKyAgICBtX3RhYi5zYWZlX2dyb3dfY2xlYXJlZCAobnVtX3Nz YV9uYW1lcyArIDEwMCk7CisKKyAgLy8gTm93IHNldCBhbGwgZW50cmllcyBpbiB0aGUgZ3JvdXAg dG8gdGhpcyByZWNvcmQuCisgIHVuc2lnbmVkIGk7CisgIGJpdG1hcF9pdGVyYXRvciBiaTsKKyAg RVhFQ1VURV9JRl9TRVRfSU5fQklUTUFQIChtX2N1cnJlbnQsIDAsIGksIGJpKQorICAgIHsKKyAg ICAgIC8vIENhbid0IGJlIGluIG1vcmUgdGhhbiBvbmUgZ3JvdXAuCisgICAgICBnY2NfY2hlY2tp bmdfYXNzZXJ0IChtX3RhYltpXSA9PSBOVUxMKTsKKyAgICAgIG1fdGFiW2ldID0gZzsKKyAgICB9 CisgIC8vIEFsbG9jYXRlIGEgbmV3IGJpdG1hcCBmb3IgdGhlIG5leHQgdGltZSBhcyB0aGUgb3Jp Z2luYWwgb25lIGlzIG5vdyBwYXJ0CisgIC8vIG9mIHRoZSBuZXcgcGhpIGdyb3VwLgorICBtX2N1 cnJlbnQgPSBCSVRNQVBfQUxMT0MgKCZtX2JpdG1hcHMpOworfQorCit2b2lkCitwaGlfYW5hbHl6 ZXI6OmR1bXAgKEZJTEUgKmYpCit7CisgIGJvb2wgaGVhZGVyID0gZmFsc2U7CisgIGJpdG1hcF9j bGVhciAobV9jdXJyZW50KTsKKyAgZm9yICh1bnNpZ25lZCB4ID0gMDsgeCA8IG1fdGFiLmxlbmd0 aCAoKTsgeCsrKQorICAgIHsKKyAgICAgIGlmIChiaXRtYXBfYml0X3AgKG1fc2ltcGxlLCB4KSkK Kwljb250aW51ZTsKKyAgICAgIGlmIChiaXRtYXBfYml0X3AgKG1fY3VycmVudCwgeCkpCisJY29u dGludWU7CisgICAgICBpZiAobV90YWJbeF0gPT0gTlVMTCkKKwljb250aW51ZTsKKyAgICAgIHBo aV9ncm91cCAqZyA9IG1fdGFiW3hdOworICAgICAgYml0bWFwX2lvcl9pbnRvIChtX2N1cnJlbnQs IGctPmdyb3VwICgpKTsKKyAgICAgIGlmICghaGVhZGVyKQorCXsKKwkgIGhlYWRlciA9IHRydWU7 CisJICBmcHJpbnRmIChkdW1wX2ZpbGUsICJcblBISSBHUk9VUFM6XG4iKTsKKwl9CisgICAgICBn LT5kdW1wIChmKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9nY2MvZ2ltcGxlLXJhbmdlLXBoaS5o IGIvZ2NjL2dpbXBsZS1yYW5nZS1waGkuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAw MDAwMDAwMC4uYjUxMjBlOTdiZjMKLS0tIC9kZXYvbnVsbAorKysgYi9nY2MvZ2ltcGxlLXJhbmdl LXBoaS5oCkBAIC0wLDAgKzEsMTA5IEBACisvKiBIZWFkZXIgZmlsZSBmb3IgZ2ltcGxlIHJhbmdl IHBoaSBhbmFseXNpcy4KKyAgIENvcHlyaWdodCAoQykgMjAyMyBGcmVlIFNvZnR3YXJlIEZvdW5k YXRpb24sIEluYy4KKyAgIENvbnRyaWJ1dGVkIGJ5IEFuZHJldyBNYWNMZW9kIDxhbWFjbGVvZEBy ZWRoYXQuY29tPi4KKworVGhpcyBmaWxlIGlzIHBhcnQgb2YgR0NDLgorCitHQ0MgaXMgZnJlZSBz b2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdCB1bmRlcgor dGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQg YnkgdGhlIEZyZWUKK1NvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMsIG9yIChh dCB5b3VyIG9wdGlvbikgYW55IGxhdGVyCit2ZXJzaW9uLgorCitHQ0MgaXMgZGlzdHJpYnV0ZWQg aW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQgQU5ZCitXQVJS QU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElU WSBvcgorRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5l cmFsIFB1YmxpYyBMaWNlbnNlCisgZm9yIG1vcmUgZGV0YWlscy4KKworWW91IHNob3VsZCBoYXZl IHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKK2Fsb25n IHdpdGggR0NDOyBzZWUgdGhlIGZpbGUgQ09QWUlORzMuICBJZiBub3Qgc2VlCis8aHR0cDovL3d3 dy5nbnUub3JnL2xpY2Vuc2VzLz4uICAqLworCisjaWZuZGVmIEdDQ19TU0FfUkFOR0VfUEhJX0gK KyNkZWZpbmUgR0NDX1NTQV9SQU5HRV9QSElfSAorCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKy8v IEEgUEhJX0dST1VQIGNvbnNpc3RzIG9mIGEgc2V0IG9mIFNTQV9OQU1FUyB3aGljaCBhcmUgYWxs IFBISV9ERUZTLCBhbmQKKy8vIHRoZWlyIGFyZ3VlbW50cyBjb250YWluIG5vdGhpbmcgYnV0IG90 aGVyIFBISSBkZWZpbnRpb25zLCB3aXRoIGF0IG1vc3QKKy8vIDIgZXhjZXB0aW9uczoKKy8vICAx IC0gQW4gaW5pdGlhbCB2YWx1ZS4gIFRoaXMgaXMgZWl0aGVyIGEgY29uc3RhbnQsIG9yIGFub3Ro ZXIgbm9uLXBoaSBuYW1lCisvLyAgICAgIHdpdGggYSBzaW5nbGUgaW5jb21pbmcgZWRnZSB0byB0 aGUgY3ljbGUgZ3JvdXAKKy8vICAyIC0gQSBtb2RpZmllciBzdGF0ZW1lbnQgd2hpY2ggYWRqdXN0 cyB0aGUgdmFsdWUuICBpZSwgbmFtZTIgPSBwaGlfbmFtZSArIDEKKy8vICBUaGUgaW5pdGlhbCBy YW5nZSBpcyB1c2VkIHRvIGNyZWF0ZSBvbmUgYm91bmQgYW5kIHRoZSBtb2RpZmllciBpcyBleGFt aW5lZAorLy8gIHRvIGRldGVybWluZSB0aGUgb3RoZXIgYm91bmQuCisvLyAgQWxsIG1lbWJlcnMg b2YgdGhlIFBISSBjeWNsZSB3aWxsIGJlIGdpdmVuIHRoZSBzYW1lIHJhbmdlLgorLy8KKy8vIEZv ciBleGFtcGxlLCBnaXZlbiB0aGUgZm9sbHdvaW5nIHNlcXVlbmNlczoKKy8vIHFhXzIwID0gcWFf MTAgKyAxOworLy8gcWFfOSA9IFBISSA8cWFfMTAoMyksIHFhXzIwKDQpPgorLy8gcWFfMTAgPSBQ SEkgPDAoMiksIHFhXzkoNSk+CisvLworLy8gV2UgY2FuIGRldGVybWluZSB0aGUgZm9sbG93aW5n IGdyb3VwOgorLy8KKy8vIFBISSBjeWNsZSBtZW1iZXJzIHFhXzksIHFhXzEwCisvLyBJbml0aWFs IHZhbHVlIDogMAorLy8gbW9kaWZpZXIgc3RtdDogcWFfMjAgPSBxYV8xMCArIDE7CisvLyAKKy8v IEJhc2VkIG9uIGp1c3QgdGhpcyBhbmFseXNpcywgV2UgY2FuIHByb2plY3QgdGhhdCBxYV85IGFu ZCBxYV8xMCB3aWxsIGhhdmUKKy8vIGEgcmFuZ2Ugb2YgWzAsICtJTkZdLgorCitjbGFzcyBwaGlf Z3JvdXAKK3sKK3B1YmxpYzoKKyAgcGhpX2dyb3VwIChiaXRtYXAgYm0sIHRyZWUgaW5pdF92YWws IGVkZ2UgZSwgZ2ltcGxlICptb2QsIHJhbmdlX3F1ZXJ5ICpxKTsKKyAgcGhpX2dyb3VwIChjb25z dCBwaGlfZ3JvdXAgJmcpOworICBjb25zdF9iaXRtYXAgZ3JvdXAgKCkgY29uc3QgeyByZXR1cm4g bV9ncm91cDsgfQorICBjb25zdCB2cmFuZ2UgJnJhbmdlICgpIGNvbnN0IHsgcmV0dXJuIG1fdnI7 IH0KKyAgdHJlZSBpbml0aWFsX3ZhbHVlICgpIGNvbnN0IHsgcmV0dXJuIG1faW5pdGlhbF92YWx1 ZTsgfQorICBnaW1wbGUgKm1vZGlmaWVyX3N0bXQgKCkgY29uc3QgeyByZXR1cm4gbV9tb2RpZmll cjsgfQorICB2b2lkIGR1bXAgKEZJTEUgKik7Citwcm90ZWN0ZWQ6CisgIGJvb2wgY2FsY3VsYXRl X3VzaW5nX21vZGlmaWVyIChyYW5nZV9xdWVyeSAqcSk7CisgIGJvb2wgcmVmaW5lX3VzaW5nX3Jl bGF0aW9uIChyZWxhdGlvbl9raW5kIGssIHJhbmdlX3F1ZXJ5ICpxKTsKKyAgc3RhdGljIHVuc2ln bmVkIGlzX21vZGlmaWVyX3AgKGdpbXBsZSAqcywgY29uc3QgYml0bWFwIGJtKTsKKyAgYml0bWFw IG1fZ3JvdXA7CisgIHRyZWUgbV9pbml0aWFsX3ZhbHVlOyAgIC8vIE5hbWUgb3IgY29uc3RhbnQu CisgIGVkZ2UgbV9pbml0aWFsX2VkZ2U7ICAgIC8vIEVkZ2Ugb2YgaW5pdGlhbCB2YWx1ZS4KKyAg Z2ltcGxlICptX21vZGlmaWVyOyAgICAgLy8gU2luZ2xlIHN0bXQgd2hpY2ggbW9kaWZpZXMgcGhp IGdyb3VwLgorICB1bnNpZ25lZCBtX21vZGlmaWVyX29wOyAvLyBPcGVyYW5kIG9mIGdyb3VwIG1l bWJlciBpbiBtb2RpZmllciBzdG10LgorICBpbnRfcmFuZ2U8Mz4gbV92cjsKKyAgZnJpZW5kIGNs YXNzIHBoaV9hbmFseXplcjsKK307CisKKy8vIFRoZSBwaGkgYW5seXplciB3aWxsIHJldHVybiB0 aGUgZ3JvdXAgdGhhdCBuYW1lIGJlbG9uZ3MgdG8uCisvLyBJZiBpbmZvcmFtdGlvbiBpcyBub3Qg a25vd24gYWJvdXQgYSBuYW1lIHlldCwgYW5hbHlzaXMgaXMgY29uZHVjdGVkIGJ5CisvLyBsb29r aW5nIGF0IHRoZSBhcmd1bWVudHMgdG8gUEhJUyBhbmQgZm9sbG93aW5nIHRoZW0gdG8gdGhlaXIg ZGVmcyB0bworLy8gZGV0ZXJtaW5lIHdoZXRoZXIgdGhlIGNvbmRpdGlvbnMgYXJlIG1ldCB0byBm b3JtIGEgbmV3IGdyb3VwLgorCitjbGFzcyBwaGlfYW5hbHl6ZXIKK3sKK3B1YmxpYzoKKyAgcGhp X2FuYWx5emVyIChyYW5nZV9xdWVyeSAmKTsKKyAgfnBoaV9hbmFseXplciAoKTsKKyAgcGhpX2dy b3VwICpvcGVyYXRvcltdICh0cmVlIG5hbWUpOworICB2b2lkIGR1bXAgKEZJTEUgKmYpOworcHJv dGVjdGVkOgorICBwaGlfZ3JvdXAgKmdyb3VwICh0cmVlIG5hbWUpIGNvbnN0OworICB2b2lkIHBy b2Nlc3NfcGhpIChncGhpICpwaGkpOworICByYW5nZV9xdWVyeSAmbV9nbG9iYWw7CisgIHZlYzx0 cmVlPiBtX3dvcms7CisKKyAgYml0bWFwIG1fc2ltcGxlOyAgICAgICAvLyBQcm9jZXNzZWQsIG5v dCBwYXJ0IG9mIGEgZ3JvdXAuCisgIGJpdG1hcCBtX2N1cnJlbnQ7CSAvLyBQb3RlbnRpYWwgZ3Jv dXAgY3VycmVudGx5IGJlaW5nIGFuYWx5emVkLgorICB2ZWM8cGhpX2dyb3VwICo+IG1fdGFiOwor ICBiaXRtYXBfb2JzdGFjayBtX2JpdG1hcHM7Cit9OworCisvLyBUaGVzZSBhcmUgdGhlIEFQSXMg dG8gc3RhcnQgYW5kIHN0b3AgYSBwaGkgYW5hbHl6ZXJpbiBhIFNDRVYgbGlrZSBtYW5uZXIuCisv LyBUaGVyZSBjYW4gb25seSBiZSBvbmUgb3BlcmF0aW5nIGF0IGFueSBnaXZlbiB0aW1lLgorLy8g V2hlbiBpbml0aWFsaXplZCwgYSByYW5nZS1xdWVyeSBpZiBwcm92aWRlZCB0byBkbyBsb29rdXBz IG9mIHZhbHVlcyBmb3IKKy8vIFBISXMgYW5kIHRvIGV2YWx1YXRlIG1vZGlmaWVyIGFuZCBpbml0 aWFsIHZhbHVlIHN0YXRlbWVudHMuCisvLyBUbyBhdm9pZCBwcm9ibGVtcywgdGhpcyBzaG91bGQg YmUgc29tZSBmb3JtIG9mIGNvbnN0YW50IHF1ZXJ5LCBsaWtlCisvLyBnbG9iYWxfcmFuZ2VfcXVl cnkgb3IgYmV0dGVyIHlldCBhIGNvbnN0X3F1ZXJ5IGZyb20gYSBmdW5jdGlvbmluZyByYW5nZXIu CisKK2Jvb2wgcGhpX2FuYWx5c2lzX2F2YWlsYWJsZV9wICgpOworcGhpX2FuYWx5emVyICZwaGlf YW5hbHlzaXMgKCk7Cit2b2lkIHBoaV9hbmFseXNpc19pbml0aWFsaXplIChyYW5nZV9xdWVyeSAm KTsKK3ZvaWQgcGhpX2FuYWx5c2lzX2ZpbmFsaXplICgpOworCisjZW5kaWYgLy8gR0NDX1NTQV9S QU5HRV9QSElfSApkaWZmIC0tZ2l0IGEvZ2NjL3Rlc3RzdWl0ZS9nY2MuZGcvcHIxMDc4MjIuYyBi L2djYy90ZXN0c3VpdGUvZ2NjLmRnL3ByMTA3ODIyLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5k ZXggMDAwMDAwMDAwMDAuLmM2OGVjYmU4ZjY2Ci0tLSAvZGV2L251bGwKKysrIGIvZ2NjL3Rlc3Rz dWl0ZS9nY2MuZGcvcHIxMDc4MjIuYwpAQCAtMCwwICsxLDIwIEBACisvKiB7IGRnLWRvIGNvbXBp bGUgfSAqLworLyogeyBkZy1vcHRpb25zICItTzIgLWZkdW1wLXRyZWUtZXZycCIgfSAqLworCitp bnQgYjsKK3ZvaWQgZm9vKCk7Cit2b2lkKGEpKCk7CitpbnQgbWFpbigpIHsKKyAgaW50IGM7Cisg IGludCAqZCA9ICZjOworICAqZCA9IGEgJiYgODsKKyAgYiA9IDA7CisgIGZvciAoOyBiIDwgOTsg KytiKQorICAgICpkIF49IDM7CisgIGlmICgqZCkKKyAgICA7CisgIGVsc2UKKyAgICBmb28oKTsK K30KKworLyogeyBkZy1maW5hbCB7IHNjYW4tdHJlZS1kdW1wLW5vdCAiZm9vIiAiZXZycCIgfSB9 ICovCmRpZmYgLS1naXQgYS9nY2MvdGVzdHN1aXRlL2djYy5kZy9wcjEwNzk4Ni0xLmMgYi9nY2Mv dGVzdHN1aXRlL2djYy5kZy9wcjEwNzk4Ni0xLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXgg MDAwMDAwMDAwMDAuLjExMjVhYjBlYTE4Ci0tLSAvZGV2L251bGwKKysrIGIvZ2NjL3Rlc3RzdWl0 ZS9nY2MuZGcvcHIxMDc5ODYtMS5jCkBAIC0wLDAgKzEsMTYgQEAKKy8qIHsgZGctZG8gY29tcGls ZSB9ICovCisvKiB7IGRnLW9wdGlvbnMgIi1PMiAtZmR1bXAtdHJlZS1ldnJwIiB9ICovCisKK3Zv aWQgYmFyICgpOwordm9pZCBmb28gKGludCAqYSkKK3sKKyAgaW50IHFhID0gMDsKKyAgZm9yIChp bnQgaSA9IDA7IGkgPCAzOyBpKyspCisgICAgaWYgKGFbaV0pCisgICAgICBhW3FhKytdID0gMDsK Ky8qIFNob3cgdGhhdCB3ZSBrbm93IHFhIGlzIG5vdCBuZWdhdGl2ZS4gKi8KKyAgaWYgKHFhIDwg MCkKKyAgICBiYXIgKCk7Cit9CisKKy8qIHsgZGctZmluYWwgeyBzY2FuLXRyZWUtZHVtcC1ub3Qg ImJhciIgImV2cnAiIH0gfSAqLwpkaWZmIC0tZ2l0IGEvZ2NjL3RyZWUtdnJwLmNjIGIvZ2NjL3Ry ZWUtdnJwLmNjCmluZGV4IDdmMDNmNTRjZGQ3Li5jNTJlOTk3MWZhYSAxMDA2NDQKLS0tIGEvZ2Nj L3RyZWUtdnJwLmNjCisrKyBiL2djYy90cmVlLXZycC5jYwpAQCAtOTk0LDExICs5OTQsMTUgQEAg ZXhlY3V0ZV9yYW5nZXJfdnJwIChzdHJ1Y3QgZnVuY3Rpb24gKmZ1biwgYm9vbCB3YXJuX2FycmF5 X2JvdW5kc19wLAogICBzZXRfYWxsX2VkZ2VzX2FzX2V4ZWN1dGFibGUgKGZ1bik7CiAgIGdpbXBs ZV9yYW5nZXIgKnJhbmdlciA9IGVuYWJsZV9yYW5nZXIgKGZ1biwgZmFsc2UpOwogICBydnJwX2Zv bGRlciBmb2xkZXIgKHJhbmdlcik7CisgIHBoaV9hbmFseXNpc19pbml0aWFsaXplIChyYW5nZXIt PmNvbnN0X3F1ZXJ5ICgpKTsKICAgZm9sZGVyLnN1YnN0aXR1dGVfYW5kX2ZvbGQgKCk7CiAgIC8v IFJlbW92ZSB0YWdnZWQgYnVpbHRpbi11bnJlYWNoYWJsZSBhbmQgbWF5YmUgdXBkYXRlIGdsb2Jh bHMuCiAgIGZvbGRlci5tX3VucmVhY2hhYmxlLnJlbW92ZV9hbmRfdXBkYXRlX2dsb2JhbHMgKGZp bmFsX3ApOwogICBpZiAoZHVtcF9maWxlICYmIChkdW1wX2ZsYWdzICYgVERGX0RFVEFJTFMpKQot ICAgIHJhbmdlci0+ZHVtcCAoZHVtcF9maWxlKTsKKyAgICB7CisgICAgICBwaGlfYW5hbHlzaXMg KCkuZHVtcCAoZHVtcF9maWxlKTsKKyAgICAgIHJhbmdlci0+ZHVtcCAoZHVtcF9maWxlKTsKKyAg ICB9CiAKICAgaWYgKCh3YXJuX2FycmF5X2JvdW5kcyB8fCB3YXJuX3N0cmljdF9mbGV4X2FycmF5 cykgJiYgd2Fybl9hcnJheV9ib3VuZHNfcCkKICAgICB7CkBAIC0xMDIwLDYgKzEwMjQsNyBAQCBl eGVjdXRlX3Jhbmdlcl92cnAgKHN0cnVjdCBmdW5jdGlvbiAqZnVuLCBib29sIHdhcm5fYXJyYXlf Ym91bmRzX3AsCiAgICAgICBhcnJheV9jaGVja2VyLmNoZWNrICgpOwogICAgIH0KIAorICBwaGlf YW5hbHlzaXNfZmluYWxpemUgKCk7CiAgIGRpc2FibGVfcmFuZ2VyIChmdW4pOwogICBzY2V2X2Zp bmFsaXplICgpOwogICBsb29wX29wdGltaXplcl9maW5hbGl6ZSAoKTsKLS0gCjIuNDAuMQoK --------------skmTRVVgu00EXl2LbqGHWkAo--