Received: from malur.postgresql.org ([217.196.149.56]) by arkaria.postgresql.org with esmtps (TLS1.3) tls TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384 (Exim 4.96) (envelope-from ) id 1vWObi-000OBC-1s for pgsql-hackers@arkaria.postgresql.org; Fri, 19 Dec 2025 00:44:35 +0000 Received: from localhost ([127.0.0.1] helo=malur.postgresql.org) by malur.postgresql.org with esmtp (Exim 4.96) (envelope-from ) id 1vWObh-004wUL-1X for pgsql-hackers@arkaria.postgresql.org; Fri, 19 Dec 2025 00:44:34 +0000 Received: from magus.postgresql.org ([2a02:c0:301:0:ffff::29]) by malur.postgresql.org with esmtps (TLS1.3) tls TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384 (Exim 4.96) (envelope-from ) id 1vWObh-004wUC-0M for pgsql-hackers@lists.postgresql.org; Fri, 19 Dec 2025 00:44:33 +0000 Received: from mail-ej1-x634.google.com ([2a00:1450:4864:20::634]) by magus.postgresql.org with esmtps (TLS1.3) tls TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256 (Exim 4.96) (envelope-from ) id 1vWObf-001VZ1-0k for pgsql-hackers@postgresql.org; Fri, 19 Dec 2025 00:44:33 +0000 Received: by mail-ej1-x634.google.com with SMTP id a640c23a62f3a-b7cee045187so202795366b.0 for ; Thu, 18 Dec 2025 16:44:31 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1766105070; x=1766709870; darn=postgresql.org; h=to:subject:message-id:date:from:mime-version:from:to:cc:subject :date:message-id:reply-to; bh=s4hVuKfZ/fTdp42KqmhGtmM+Q9tnIxInF2SS7VWtrJA=; b=ZOw0Pbbz7i632B8yfjk53lZ7TiW5hwOVh4gka/M46E14uWmfhlbVxi8EW/fJui9R2o 8yyBm2Tsz30abqJZZmkfrvWoLrb/Z9el/wXuarcIBVqi+iTHeAt/8z/m3Hv8nfPgXYtc 1UZ9wRZgA2hGiGOPE/tMg26kE1euY3JpTir172mCPWHLBiI3nxAIKoipvN9R2mFBaeEE cWKVVe8BBV7557l//zjqB7t7dDGD9253f0CEeoNJbAcbqrOIQdVpb5M3gfsKg3askkbR jcvjX2vk8WeR5xPD6llP5ax4A1AgRq32d7E8NUVatZsg/wXAdGET33zRmayZv2Z81wJi YJWQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1766105070; x=1766709870; h=to:subject:message-id:date:from:mime-version:x-gm-gg :x-gm-message-state:from:to:cc:subject:date:message-id:reply-to; bh=s4hVuKfZ/fTdp42KqmhGtmM+Q9tnIxInF2SS7VWtrJA=; b=LFJZ4v8IZ2fgKCPg9Y03CwrsDDmtMO5AWNpfyH48TLB2lPIYRQZsuK7RqGHPgeO31a iBp4zR5C6NGtUBYxuFklz3fO7GAOuxcTYeU63655Mr9tkCHZzjcPNp91ST0xS2chwQnO vqB+2fSpvv/56nc9uzwIVnXslidB4wyImo4pGe9z6tOKYMemmfEzP6PvuA0ZT/TJaBre 9EuO/cd5LLU6ygZtEdmmUih/ypGjPUakqVapeememqZPy/zekQqUQrTuUEftyD/VjWrQ iW+u74XULV4oN++4LLQ9zbEsB4L1kFaf2LA/xmFt8hfWWkjLJojn9/Ut1k69r73Hsaf1 J+Fw== X-Gm-Message-State: AOJu0YwTQopxFHexA/5BmaM88Hd0UibBevRNXXqSGS87/nQZ2fWH7cZL g4tDA+Cbp2g5ys2LIyWvLBDKqt20Yu1NURoJ0iLAJcBZwQtG8e7ZHg1sjyuU/6MiSo4NeLcnpz8 yK7XyO4VVVmB/wnGbiAsTBq6R11p8EstNcEyJ X-Gm-Gg: AY/fxX5AZheZ3DDL1/31Bg7gBMjLFNiMq1CvsQHjXnELFCYqaC9u4uWJBEu2j/3Uyk2 KoUH4HdzhfU6Dw79r3klNRe8ya9l3al7gtw3uOcNYEfvwV/qaUhWQH6BH+ZnnhRPjwlofppea94 2LPayUuo3WQ2J2BM6RvAb1d7KbdyjzGYvTpy5oOC4ACikBoL3wKwREDf65eFf1dC8Usc2YcSC/5 GJMhDkiyyeZORJyl0M0TmFFSO279yKiN8BSvxqwFWIVPC3UWnWK/ttdpZz0Omaaoc4= X-Google-Smtp-Source: AGHT+IEFaGDM+Mr7Un8UsHzE+qeWvTx4tCZ4fXq9aPQzIBW62z+rslfIwnnhAaPxP6eqTpy4EWO1Rcv4JJZbbkysffk= X-Received: by 2002:a17:907:9449:b0:b07:e258:4629 with SMTP id a640c23a62f3a-b802058eda2mr535135066b.16.1766105069481; Thu, 18 Dec 2025 16:44:29 -0800 (PST) MIME-Version: 1.0 From: Sami Imseih Date: Thu, 18 Dec 2025 18:44:17 -0600 X-Gm-Features: AQt7F2pW5ziFxX91HVk0e3jSMGubdNx5gMX0UEGbcbR6BX74RVU4_s57kD_Soig Message-ID: Subject: Refactor query normalization into core query jumbling To: pgsql-hackers Content-Type: multipart/mixed; boundary="0000000000004db1940646436137" List-Id: List-Help: List-Subscribe: List-Post: List-Owner: List-Archive: Archived-At: Precedence: bulk --0000000000004db1940646436137 Content-Type: text/plain; charset="UTF-8" Hi, A while back, there was a discussion about moving the query normalization code out of pg_stat_statements and into core query jumbling [0]. This conversation also led to hardening the hooks (currently only post_parse_analyze) that receive JumbleState [1]. For the first point, `generate_normalized_query` takes the query string and the jumbleState with constant locations from core query jumbling. There is nothing uniquely special about pg_stat_statements in this code, and it can be used by other extensions. Extensions could even pass their own query string and JumbleState if they choose. Patch 0001 moves this function and its helpers to queryjumblefuncs.c. A Github search also shows that there are quite a few extensions that may be copying this code [2] [3], which means they will lose out on potential improvements and fixes. As part of this patch, the moved code itself did not change, but I did improve a comment: ``` * If query_loc > 0, then "query" has been advanced by that much compared to * the original string start, so we need to translate the provided locations * to compensate. (This lets us avoid re-scanning statements before the one * of interest, so it's worth doing.) ``` This comment appeared at the top of generate_normalized_query and fill_in_constant_lengths. I simplified it and moved a shortened version inside the functions. Also, I did not think `fill_in_constant_lengths` should be a global function, as I cannot think of a good reason it would be used on its own, though someone may have a different opinion there. For the second point, since JumbleState can be shared by multiple extensions, hooks should receive it as a const pointer. This signals read-only intent and prevents extensions from accidentally modifying it through the hook. This change is in 0002. This does mean that extensions will need to update their hooks, but I do not see that as an issue for a major version. Thoughts? [0] https://postgr.es/m/aQA9v9nLu5qsX8IE%40paquier.xyz [1] https://postgr.es/m/202510281023.4u5aszccvsct%40alvherre.pgsql [2] https://github.com/search?q=fill_in_constant_lengths&type=code [3] https://github.com/search?q=generate_normalized_query&type=code -- Sami Imseih Amazon Web Services (AWS) --0000000000004db1940646436137 Content-Type: application/octet-stream; name="v1-0002-Make-JumbleState-a-const-pointer-for-plug-ins.patch" Content-Disposition: attachment; filename="v1-0002-Make-JumbleState-a-const-pointer-for-plug-ins.patch" Content-Transfer-Encoding: base64 Content-ID: X-Attachment-Id: f_mjc4bnf91 RnJvbSAzODQ5NGJlN2Q4ZGQzMzA4OWIyN2FmMmU4Yjk0NThhNjJmMWM5ZGY0IE1vbiBTZXAgMTcg MDA6MDA6MDAgMjAwMQpGcm9tOiBVYnVudHUgPHVidW50dUBpcC0xNzItMzEtNDYtMjMwLmVjMi5p bnRlcm5hbD4KRGF0ZTogVGh1LCAxOCBEZWMgMjAyNSAxOToxNDoxMCArMDAwMApTdWJqZWN0OiBb UEFUQ0ggdjEgMi8yXSBNYWtlIEp1bWJsZVN0YXRlIGEgY29uc3QgcG9pbnRlciBmb3IgcGx1Zy1p bnMKCnBvc3RfcGFyc2VfYW5hbHl6ZV9ob29rIGN1cnJlbnRseSBleHBvc2VzIEp1bWJsZVN0YXRl IHdpdGhvdXQKcHJvdGVjdGluZyBpdCBhZ2FpbnN0IG1vZGlmaWNhdGlvbnMgYnkgZXh0ZW5zaW9u cy4gU2luY2UgSnVtYmxlU3RhdGUKY2FuIGJlIHNoYXJlZCBieSBtdWx0aXBsZSBob29rcywgaXQg c2hvdWxkIGJlIHBhc3NlZCBhcyBhIGNvbnN0IHBvaW50ZXIuClRoaXMgc2lnbmFscyByZWFkLW9u bHkgaW50ZW50IGFuZCBlbnN1cmVzIGV4dGVuc2lvbnMgY2Fubm90IGFjY2lkZW50YWxseQptb2Rp ZnkgaXQgdGhyb3VnaCB0aGUgaG9vay4KClRoaXMgY2hhbmdlIHVwZGF0ZXMgcGdfc3RhdF9zdGF0 ZW1lbnRzIGZ1bmN0aW9ucyBhbmQgdGhlIHJlbGV2YW50IGhlYWRlcnMKdG8gdGFrZSBgY29uc3Qg SnVtYmxlU3RhdGUgKmAgd2hlcmUgYXBwcm9wcmlhdGUuCgpEaXNjdXNzaW9uOiBodHRwczovL3Bv c3Rnci5lcy9tLzIwMjUxMDI4MTAyMy40dTVhc3pjY3ZzY3QlNDBhbHZoZXJyZS5wZ3NxbAotLS0K IGNvbnRyaWIvcGdfc3RhdF9zdGF0ZW1lbnRzL3BnX3N0YXRfc3RhdGVtZW50cy5jIHwgOCArKysr LS0tLQogc3JjL2luY2x1ZGUvbm9kZXMvcXVlcnlqdW1ibGUuaCAgICAgICAgICAgICAgICAgfCA3 ICsrKysrKy0KIHNyYy9pbmNsdWRlL3BhcnNlci9hbmFseXplLmggICAgICAgICAgICAgICAgICAg IHwgMiArLQogMyBmaWxlcyBjaGFuZ2VkLCAxMSBpbnNlcnRpb25zKCspLCA2IGRlbGV0aW9ucygt KQoKZGlmZiAtLWdpdCBhL2NvbnRyaWIvcGdfc3RhdF9zdGF0ZW1lbnRzL3BnX3N0YXRfc3RhdGVt ZW50cy5jIGIvY29udHJpYi9wZ19zdGF0X3N0YXRlbWVudHMvcGdfc3RhdF9zdGF0ZW1lbnRzLmMK aW5kZXggM2ViMjlkZmJkNDcuLjUwODYyNzgzM2UyIDEwMDY0NAotLS0gYS9jb250cmliL3BnX3N0 YXRfc3RhdGVtZW50cy9wZ19zdGF0X3N0YXRlbWVudHMuYworKysgYi9jb250cmliL3BnX3N0YXRf c3RhdGVtZW50cy9wZ19zdGF0X3N0YXRlbWVudHMuYwpAQCAtMzMyLDcgKzMzMiw3IEBAIHN0YXRp YyB2b2lkIHBnc3Nfc2htZW1fcmVxdWVzdCh2b2lkKTsKIHN0YXRpYyB2b2lkIHBnc3Nfc2htZW1f c3RhcnR1cCh2b2lkKTsKIHN0YXRpYyB2b2lkIHBnc3Nfc2htZW1fc2h1dGRvd24oaW50IGNvZGUs IERhdHVtIGFyZyk7CiBzdGF0aWMgdm9pZCBwZ3NzX3Bvc3RfcGFyc2VfYW5hbHl6ZShQYXJzZVN0 YXRlICpwc3RhdGUsIFF1ZXJ5ICpxdWVyeSwKLQkJCQkJCQkJCUp1bWJsZVN0YXRlICpqc3RhdGUp OworCQkJCQkJCQkJY29uc3QgSnVtYmxlU3RhdGUgKmpzdGF0ZSk7CiBzdGF0aWMgUGxhbm5lZFN0 bXQgKnBnc3NfcGxhbm5lcihRdWVyeSAqcGFyc2UsCiAJCQkJCQkJCSBjb25zdCBjaGFyICpxdWVy eV9zdHJpbmcsCiAJCQkJCQkJCSBpbnQgY3Vyc29yT3B0aW9ucywKQEAgLTM1Niw3ICszNTYsNyBA QCBzdGF0aWMgdm9pZCBwZ3NzX3N0b3JlKGNvbnN0IGNoYXIgKnF1ZXJ5LCBpbnQ2NCBxdWVyeUlk LAogCQkJCQkgICBjb25zdCBCdWZmZXJVc2FnZSAqYnVmdXNhZ2UsCiAJCQkJCSAgIGNvbnN0IFdh bFVzYWdlICp3YWx1c2FnZSwKIAkJCQkJICAgY29uc3Qgc3RydWN0IEppdEluc3RydW1lbnRhdGlv biAqaml0dXNhZ2UsCi0JCQkJCSAgIEp1bWJsZVN0YXRlICpqc3RhdGUsCisJCQkJCSAgIGNvbnN0 IEp1bWJsZVN0YXRlICpqc3RhdGUsCiAJCQkJCSAgIGludCBwYXJhbGxlbF93b3JrZXJzX3RvX2xh dW5jaCwKIAkJCQkJICAgaW50IHBhcmFsbGVsX3dvcmtlcnNfbGF1bmNoZWQsCiAJCQkJCSAgIFBs YW5uZWRTdG10T3JpZ2luIHBsYW5PcmlnaW4pOwpAQCAtODMyLDcgKzgzMiw3IEBAIGVycm9yOgog ICogUG9zdC1wYXJzZS1hbmFseXNpcyBob29rOiBtYXJrIHF1ZXJ5IHdpdGggYSBxdWVyeUlkCiAg Ki8KIHN0YXRpYyB2b2lkCi1wZ3NzX3Bvc3RfcGFyc2VfYW5hbHl6ZShQYXJzZVN0YXRlICpwc3Rh dGUsIFF1ZXJ5ICpxdWVyeSwgSnVtYmxlU3RhdGUgKmpzdGF0ZSkKK3Bnc3NfcG9zdF9wYXJzZV9h bmFseXplKFBhcnNlU3RhdGUgKnBzdGF0ZSwgUXVlcnkgKnF1ZXJ5LCBjb25zdCBKdW1ibGVTdGF0 ZSAqanN0YXRlKQogewogCWlmIChwcmV2X3Bvc3RfcGFyc2VfYW5hbHl6ZV9ob29rKQogCQlwcmV2 X3Bvc3RfcGFyc2VfYW5hbHl6ZV9ob29rKHBzdGF0ZSwgcXVlcnksIGpzdGF0ZSk7CkBAIC0xMjg5 LDcgKzEyODksNyBAQCBwZ3NzX3N0b3JlKGNvbnN0IGNoYXIgKnF1ZXJ5LCBpbnQ2NCBxdWVyeUlk LAogCQkgICBjb25zdCBCdWZmZXJVc2FnZSAqYnVmdXNhZ2UsCiAJCSAgIGNvbnN0IFdhbFVzYWdl ICp3YWx1c2FnZSwKIAkJICAgY29uc3Qgc3RydWN0IEppdEluc3RydW1lbnRhdGlvbiAqaml0dXNh Z2UsCi0JCSAgIEp1bWJsZVN0YXRlICpqc3RhdGUsCisJCSAgIGNvbnN0IEp1bWJsZVN0YXRlICpq c3RhdGUsCiAJCSAgIGludCBwYXJhbGxlbF93b3JrZXJzX3RvX2xhdW5jaCwKIAkJICAgaW50IHBh cmFsbGVsX3dvcmtlcnNfbGF1bmNoZWQsCiAJCSAgIFBsYW5uZWRTdG10T3JpZ2luIHBsYW5Pcmln aW4pCmRpZmYgLS1naXQgYS9zcmMvaW5jbHVkZS9ub2Rlcy9xdWVyeWp1bWJsZS5oIGIvc3JjL2lu Y2x1ZGUvbm9kZXMvcXVlcnlqdW1ibGUuaAppbmRleCA4MjA3MjI3ZTc5ZS4uNTExNjg5NmVjNjQg MTAwNjQ0Ci0tLSBhL3NyYy9pbmNsdWRlL25vZGVzL3F1ZXJ5anVtYmxlLmgKKysrIGIvc3JjL2lu Y2x1ZGUvbm9kZXMvcXVlcnlqdW1ibGUuaApAQCAtMzQsNiArMzQsMTEgQEAgdHlwZWRlZiBzdHJ1 Y3QgTG9jYXRpb25MZW4KIC8qCiAgKiBXb3JraW5nIHN0YXRlIGZvciBjb21wdXRpbmcgYSBxdWVy eSBqdW1ibGUgYW5kIHByb2R1Y2luZyBhIG5vcm1hbGl6ZWQKICAqIHF1ZXJ5IHN0cmluZworICoK KyAqIFdoZW4gcGFzc2VkIHRvIGhvb2tzIChlLmcuLCBwb3N0X3BhcnNlX2FuYWx5emVfaG9vayks IHRoaXMgc3RhdGUgaXMKKyAqIGludGVuZGVkIHRvIGJlIHJlYWQtb25seS4gRXh0ZW5zaW9ucyBz aG91bGQgbm90IG1vZGlmeSB0aGUgY29udGVudHM7CisgKiBob29rcyBtdXN0IHJlY2VpdmUgaXQg YXMgYSAnY29uc3QgSnVtYmxlU3RhdGUgKicgdG8gZW5mb3JjZSB0aGlzCisgKiBpbnRlbnQuCiAg Ki8KIHR5cGVkZWYgc3RydWN0IEp1bWJsZVN0YXRlCiB7CkBAIC05MSw3ICs5Niw3IEBAIGV4dGVy biBQR0RMTElNUE9SVCBpbnQgY29tcHV0ZV9xdWVyeV9pZDsKIAogCiBleHRlcm4gY29uc3QgY2hh ciAqQ2xlYW5RdWVyeXRleHQoY29uc3QgY2hhciAqcXVlcnksIGludCAqbG9jYXRpb24sIGludCAq bGVuKTsKLWV4dGVybiBjaGFyICpnZW5lcmF0ZV9ub3JtYWxpemVkX3F1ZXJ5KEp1bWJsZVN0YXRl ICpqc3RhdGUsIGNvbnN0IGNoYXIgKnF1ZXJ5LAorZXh0ZXJuIGNoYXIgKmdlbmVyYXRlX25vcm1h bGl6ZWRfcXVlcnkoY29uc3QgSnVtYmxlU3RhdGUgKmpzdGF0ZSwgY29uc3QgY2hhciAqcXVlcnks CiAJCQkJCQkJCQkgICBpbnQgcXVlcnlfbG9jLCBpbnQgKnF1ZXJ5X2xlbl9wKTsKIGV4dGVybiBK dW1ibGVTdGF0ZSAqSnVtYmxlUXVlcnkoUXVlcnkgKnF1ZXJ5KTsKIGV4dGVybiB2b2lkIEVuYWJs ZVF1ZXJ5SWQodm9pZCk7CmRpZmYgLS1naXQgYS9zcmMvaW5jbHVkZS9wYXJzZXIvYW5hbHl6ZS5o IGIvc3JjL2luY2x1ZGUvcGFyc2VyL2FuYWx5emUuaAppbmRleCBmMjllZDAzYjQ3Ni4uZjgwZGE3 MjkzM2MgMTAwNjQ0Ci0tLSBhL3NyYy9pbmNsdWRlL3BhcnNlci9hbmFseXplLmgKKysrIGIvc3Jj L2luY2x1ZGUvcGFyc2VyL2FuYWx5emUuaApAQCAtMjEsNyArMjEsNyBAQAogLyogSG9vayBmb3Ig cGx1Z2lucyB0byBnZXQgY29udHJvbCBhdCBlbmQgb2YgcGFyc2UgYW5hbHlzaXMgKi8KIHR5cGVk ZWYgdm9pZCAoKnBvc3RfcGFyc2VfYW5hbHl6ZV9ob29rX3R5cGUpIChQYXJzZVN0YXRlICpwc3Rh dGUsCiAJCQkJCQkJCQkJCSAgUXVlcnkgKnF1ZXJ5LAotCQkJCQkJCQkJCQkgIEp1bWJsZVN0YXRl ICpqc3RhdGUpOworCQkJCQkJCQkJCQkgIGNvbnN0IEp1bWJsZVN0YXRlICpqc3RhdGUpOwogZXh0 ZXJuIFBHRExMSU1QT1JUIHBvc3RfcGFyc2VfYW5hbHl6ZV9ob29rX3R5cGUgcG9zdF9wYXJzZV9h bmFseXplX2hvb2s7CiAKIAotLSAKMi40My4wCgo= --0000000000004db1940646436137 Content-Type: application/octet-stream; name="v1-0001-pg_stat_statements-Move-jumbling-related-function.patch" Content-Disposition: attachment; filename="v1-0001-pg_stat_statements-Move-jumbling-related-function.patch" Content-Transfer-Encoding: base64 Content-ID: X-Attachment-Id: f_mjc4bnew0 RnJvbSA0ZWI5ZmVmOWEwZTgzZDZhNjZkOTI1MzM4N2MzMTFjMDdiYWM5OTVkIE1vbiBTZXAgMTcg MDA6MDA6MDAgMjAwMQpGcm9tOiBVYnVudHUgPHVidW50dUBpcC0xNzItMzEtNDYtMjMwLmVjMi5p bnRlcm5hbD4KRGF0ZTogVGh1LCAxOCBEZWMgMjAyNSAxODo1OTozMSArMDAwMApTdWJqZWN0OiBb UEFUQ0ggdjEgMS8yXSBwZ19zdGF0X3N0YXRlbWVudHM6IE1vdmUganVtYmxpbmcgcmVsYXRlZCBm dW5jdGlvbnMKCkEgbm9ybWFsaXplZCBxdWVyeSBzdHJpbmcgZ2VuZXJhdGVkIGJ5IGdlbmVyYXRl X25vcm1hbGl6ZWRfcXVlcnkgY2FuIGJlCnVzZWQgYnkgb3RoZXIgZXh0ZW5zaW9ucywgYXMgYWxs IHdpbGwgdXNlIHRoZSBzYW1lIHF1ZXJ5IHN0cmluZyBhbmQKY29uc3RhbnQgbG9jYXRpb25zIGdl bmVyYXRlZCBieSBjb3JlIHF1ZXJ5IGp1bWJsaW5nLiBUaGVyZSBpcyBub3RoaW5nCnNwZWNpZmlj IHRvIHBnX3N0YXRfc3RhdGVtZW50cyBhYm91dCB0aGlzIGZ1bmN0aW9uLCBzbyBpdCBzaG91bGQg YmUgbW92ZWQKdG8gY29yZSBhcyBhIGdsb2JhbCBmdW5jdGlvbi4gVGhpcyBhbHNvIG1vdmVzIHRo ZSByZWxhdGVkIGhlbHBlciBmdW5jdGlvbnMKZmlsbF9pbl9jb25zdGFudF9sZW5ndGggYW5kIGNv bXBfbG9jYXRpb24uCgpEaXNjdXNzaW9uOiBodHRwczovL3Bvc3Rnci5lcy9tL2FRQTl2OW5MdTVx c1g4SUUlNDBwYXF1aWVyLnh5egotLS0KIC4uLi9wZ19zdGF0X3N0YXRlbWVudHMvcGdfc3RhdF9z dGF0ZW1lbnRzLmMgICB8IDI3MCArLS0tLS0tLS0tLS0tLS0tLS0KIHNyYy9iYWNrZW5kL25vZGVz L3F1ZXJ5anVtYmxlZnVuY3MuYyAgICAgICAgICB8IDI1MiArKysrKysrKysrKysrKysrCiBzcmMv aW5jbHVkZS9ub2Rlcy9xdWVyeWp1bWJsZS5oICAgICAgICAgICAgICAgfCAgIDIgKwogMyBmaWxl cyBjaGFuZ2VkLCAyNjEgaW5zZXJ0aW9ucygrKSwgMjYzIGRlbGV0aW9ucygtKQoKZGlmZiAtLWdp dCBhL2NvbnRyaWIvcGdfc3RhdF9zdGF0ZW1lbnRzL3BnX3N0YXRfc3RhdGVtZW50cy5jIGIvY29u dHJpYi9wZ19zdGF0X3N0YXRlbWVudHMvcGdfc3RhdF9zdGF0ZW1lbnRzLmMKaW5kZXggMzkyMDhm ODBiNWIuLjNlYjI5ZGZiZDQ3IDEwMDY0NAotLS0gYS9jb250cmliL3BnX3N0YXRfc3RhdGVtZW50 cy9wZ19zdGF0X3N0YXRlbWVudHMuYworKysgYi9jb250cmliL3BnX3N0YXRfc3RhdGVtZW50cy9w Z19zdGF0X3N0YXRlbWVudHMuYwpAQCAtNTAsNyArNTAsNiBAQAogI2luY2x1ZGUgImFjY2Vzcy9o dHVwX2RldGFpbHMuaCIKICNpbmNsdWRlICJhY2Nlc3MvcGFyYWxsZWwuaCIKICNpbmNsdWRlICJj YXRhbG9nL3BnX2F1dGhpZC5oIgotI2luY2x1ZGUgImNvbW1vbi9pbnQuaCIKICNpbmNsdWRlICJl eGVjdXRvci9pbnN0cnVtZW50LmgiCiAjaW5jbHVkZSAiZnVuY2FwaS5oIgogI2luY2x1ZGUgImpp dC9qaXQuaCIKQEAgLTU5LDcgKzU4LDYgQEAKICNpbmNsdWRlICJub2Rlcy9xdWVyeWp1bWJsZS5o IgogI2luY2x1ZGUgIm9wdGltaXplci9wbGFubmVyLmgiCiAjaW5jbHVkZSAicGFyc2VyL2FuYWx5 emUuaCIKLSNpbmNsdWRlICJwYXJzZXIvc2Nhbm5lci5oIgogI2luY2x1ZGUgInBnc3RhdC5oIgog I2luY2x1ZGUgInN0b3JhZ2UvZmQuaCIKICNpbmNsdWRlICJzdG9yYWdlL2lwYy5oIgpAQCAtMzc3 LDExICszNzUsNiBAQCBzdGF0aWMgY2hhciAqcXRleHRfZmV0Y2goU2l6ZSBxdWVyeV9vZmZzZXQs IGludCBxdWVyeV9sZW4sCiBzdGF0aWMgYm9vbCBuZWVkX2djX3F0ZXh0cyh2b2lkKTsKIHN0YXRp YyB2b2lkIGdjX3F0ZXh0cyh2b2lkKTsKIHN0YXRpYyBUaW1lc3RhbXBUeiBlbnRyeV9yZXNldChP aWQgdXNlcmlkLCBPaWQgZGJpZCwgaW50NjQgcXVlcnlpZCwgYm9vbCBtaW5tYXhfb25seSk7Ci1z dGF0aWMgY2hhciAqZ2VuZXJhdGVfbm9ybWFsaXplZF9xdWVyeShKdW1ibGVTdGF0ZSAqanN0YXRl LCBjb25zdCBjaGFyICpxdWVyeSwKLQkJCQkJCQkJCSAgIGludCBxdWVyeV9sb2MsIGludCAqcXVl cnlfbGVuX3ApOwotc3RhdGljIHZvaWQgZmlsbF9pbl9jb25zdGFudF9sZW5ndGhzKEp1bWJsZVN0 YXRlICpqc3RhdGUsIGNvbnN0IGNoYXIgKnF1ZXJ5LAotCQkJCQkJCQkJIGludCBxdWVyeV9sb2Mp Owotc3RhdGljIGludAljb21wX2xvY2F0aW9uKGNvbnN0IHZvaWQgKmEsIGNvbnN0IHZvaWQgKmIp OwogCiAKIC8qCkBAIC0xMzU5LDYgKzEzNTIsMTMgQEAgcGdzc19zdG9yZShjb25zdCBjaGFyICpx dWVyeSwgaW50NjQgcXVlcnlJZCwKIAkJaWYgKGpzdGF0ZSkKIAkJewogCQkJTFdMb2NrUmVsZWFz ZShwZ3NzLT5sb2NrKTsKKworCQkJLyoKKwkJCSAqIGdlbmVyYXRlIHRoZSBub3JtYWxpemVkIHF1 ZXJ5LiBOb3RlIHRoYXQgdGhlIG5vcm1hbGl6ZWQKKwkJCSAqIHJlcHJlc2VudGF0aW9uIG1heSB3 ZWxsIHZhcnkgZGVwZW5kaW5nIG9uIGp1c3Qgd2hpY2gKKwkJCSAqICJlcXVpdmFsZW50IiBxdWVy eSBpcyB1c2VkIHRvIGNyZWF0ZSB0aGUgaGFzaHRhYmxlIGVudHJ5LiBXZQorCQkJICogYXNzdW1l IHRoaXMgaXMgT0suCisJCQkgKi8KIAkJCW5vcm1fcXVlcnkgPSBnZW5lcmF0ZV9ub3JtYWxpemVk X3F1ZXJ5KGpzdGF0ZSwgcXVlcnksCiAJCQkJCQkJCQkJCQkgICBxdWVyeV9sb2NhdGlvbiwKIAkJ CQkJCQkJCQkJCSAgICZxdWVyeV9sZW4pOwpAQCAtMjgyMywyNTkgKzI4MjMsMyBAQCByZWxlYXNl X2xvY2s6CiAKIAlyZXR1cm4gc3RhdHNfcmVzZXQ7CiB9Ci0KLS8qCi0gKiBHZW5lcmF0ZSBhIG5v cm1hbGl6ZWQgdmVyc2lvbiBvZiB0aGUgcXVlcnkgc3RyaW5nIHRoYXQgd2lsbCBiZSB1c2VkIHRv Ci0gKiByZXByZXNlbnQgYWxsIHNpbWlsYXIgcXVlcmllcy4KLSAqCi0gKiBOb3RlIHRoYXQgdGhl IG5vcm1hbGl6ZWQgcmVwcmVzZW50YXRpb24gbWF5IHdlbGwgdmFyeSBkZXBlbmRpbmcgb24KLSAq IGp1c3Qgd2hpY2ggImVxdWl2YWxlbnQiIHF1ZXJ5IGlzIHVzZWQgdG8gY3JlYXRlIHRoZSBoYXNo dGFibGUgZW50cnkuCi0gKiBXZSBhc3N1bWUgdGhpcyBpcyBPSy4KLSAqCi0gKiBJZiBxdWVyeV9s b2MgPiAwLCB0aGVuICJxdWVyeSIgaGFzIGJlZW4gYWR2YW5jZWQgYnkgdGhhdCBtdWNoIGNvbXBh cmVkIHRvCi0gKiB0aGUgb3JpZ2luYWwgc3RyaW5nIHN0YXJ0LCBzbyB3ZSBuZWVkIHRvIHRyYW5z bGF0ZSB0aGUgcHJvdmlkZWQgbG9jYXRpb25zCi0gKiB0byBjb21wZW5zYXRlLiAgKFRoaXMgbGV0 cyB1cyBhdm9pZCByZS1zY2FubmluZyBzdGF0ZW1lbnRzIGJlZm9yZSB0aGUgb25lCi0gKiBvZiBp bnRlcmVzdCwgc28gaXQncyB3b3J0aCBkb2luZy4pCi0gKgotICogKnF1ZXJ5X2xlbl9wIGNvbnRh aW5zIHRoZSBpbnB1dCBzdHJpbmcgbGVuZ3RoLCBhbmQgaXMgdXBkYXRlZCB3aXRoCi0gKiB0aGUg cmVzdWx0IHN0cmluZyBsZW5ndGggb24gZXhpdC4gIFRoZSByZXN1bHRpbmcgc3RyaW5nIG1pZ2h0 IGJlIGxvbmdlcgotICogb3Igc2hvcnRlciBkZXBlbmRpbmcgb24gd2hhdCBoYXBwZW5zIHdpdGgg cmVwbGFjZW1lbnQgb2YgY29uc3RhbnRzLgotICoKLSAqIFJldHVybnMgYSBwYWxsb2MnZCBzdHJp bmcuCi0gKi8KLXN0YXRpYyBjaGFyICoKLWdlbmVyYXRlX25vcm1hbGl6ZWRfcXVlcnkoSnVtYmxl U3RhdGUgKmpzdGF0ZSwgY29uc3QgY2hhciAqcXVlcnksCi0JCQkJCQkgIGludCBxdWVyeV9sb2Ms IGludCAqcXVlcnlfbGVuX3ApCi17Ci0JY2hhcgkgICAqbm9ybV9xdWVyeTsKLQlpbnQJCQlxdWVy eV9sZW4gPSAqcXVlcnlfbGVuX3A7Ci0JaW50CQkJbm9ybV9xdWVyeV9idWZsZW4sCS8qIFNwYWNl IGFsbG93ZWQgZm9yIG5vcm1fcXVlcnkgKi8KLQkJCQlsZW5fdG9fd3J0LAkJLyogTGVuZ3RoIChp biBieXRlcykgdG8gd3JpdGUgKi8KLQkJCQlxdWVyX2xvYyA9IDAsCS8qIFNvdXJjZSBxdWVyeSBi eXRlIGxvY2F0aW9uICovCi0JCQkJbl9xdWVyX2xvYyA9IDAsIC8qIE5vcm1hbGl6ZWQgcXVlcnkg Ynl0ZSBsb2NhdGlvbiAqLwotCQkJCWxhc3Rfb2ZmID0gMCwJLyogT2Zmc2V0IGZyb20gc3RhcnQg Zm9yIHByZXZpb3VzIHRvayAqLwotCQkJCWxhc3RfdG9rX2xlbiA9IDA7CS8qIExlbmd0aCAoaW4g Ynl0ZXMpIG9mIHRoYXQgdG9rICovCi0JaW50CQkJbnVtX2NvbnN0YW50c19yZXBsYWNlZCA9IDA7 Ci0KLQkvKgotCSAqIEdldCBjb25zdGFudHMnIGxlbmd0aHMgKGNvcmUgc3lzdGVtIG9ubHkgZ2l2 ZXMgdXMgbG9jYXRpb25zKS4gIE5vdGUKLQkgKiB0aGlzIGFsc28gZW5zdXJlcyB0aGUgaXRlbXMg YXJlIHNvcnRlZCBieSBsb2NhdGlvbi4KLQkgKi8KLQlmaWxsX2luX2NvbnN0YW50X2xlbmd0aHMo anN0YXRlLCBxdWVyeSwgcXVlcnlfbG9jKTsKLQotCS8qCi0JICogQWxsb3cgZm9yICRuIHN5bWJv bHMgdG8gYmUgbG9uZ2VyIHRoYW4gdGhlIGNvbnN0YW50cyB0aGV5IHJlcGxhY2UuCi0JICogQ29u c3RhbnRzIG11c3QgdGFrZSBhdCBsZWFzdCBvbmUgYnl0ZSBpbiB0ZXh0IGZvcm0sIHdoaWxlIGEg JG4gc3ltYm9sCi0JICogY2VydGFpbmx5IGlzbid0IG1vcmUgdGhhbiAxMSBieXRlcywgZXZlbiBp ZiBuIHJlYWNoZXMgSU5UX01BWC4gIFdlCi0JICogY291bGQgcmVmaW5lIHRoYXQgbGltaXQgYmFz ZWQgb24gdGhlIG1heCB2YWx1ZSBvZiBuIGZvciB0aGUgY3VycmVudAotCSAqIHF1ZXJ5LCBidXQg aXQgaGFyZGx5IHNlZW1zIHdvcnRoIGFueSBleHRyYSBlZmZvcnQgdG8gZG8gc28uCi0JICovCi0J bm9ybV9xdWVyeV9idWZsZW4gPSBxdWVyeV9sZW4gKyBqc3RhdGUtPmNsb2NhdGlvbnNfY291bnQg KiAxMDsKLQotCS8qIEFsbG9jYXRlIHJlc3VsdCBidWZmZXIgKi8KLQlub3JtX3F1ZXJ5ID0gcGFs bG9jKG5vcm1fcXVlcnlfYnVmbGVuICsgMSk7Ci0KLQlmb3IgKGludCBpID0gMDsgaSA8IGpzdGF0 ZS0+Y2xvY2F0aW9uc19jb3VudDsgaSsrKQotCXsKLQkJaW50CQkJb2ZmLAkJLyogT2Zmc2V0IGZy b20gc3RhcnQgZm9yIGN1ciB0b2sgKi8KLQkJCQkJdG9rX2xlbjsJLyogTGVuZ3RoIChpbiBieXRl cykgb2YgdGhhdCB0b2sgKi8KLQotCQkvKgotCQkgKiBJZiB3ZSBoYXZlIGFuIGV4dGVybmFsIHBh cmFtIGF0IHRoaXMgbG9jYXRpb24sIGJ1dCBubyBsaXN0cyBhcmUKLQkJICogYmVpbmcgc3F1YXNo ZWQgYWNyb3NzIHRoZSBxdWVyeSwgdGhlbiB3ZSBza2lwIGhlcmU7IHRoaXMgd2lsbCBtYWtlCi0J CSAqIHVzIHByaW50IHRoZSBjaGFyYWN0ZXJzIGZvdW5kIGluIHRoZSBvcmlnaW5hbCBxdWVyeSB0 aGF0IHJlcHJlc2VudAotCQkgKiB0aGUgcGFyYW1ldGVyIGluIHRoZSBuZXh0IGl0ZXJhdGlvbiAo b3IgYWZ0ZXIgdGhlIGxvb3AgaXMgZG9uZSksCi0JCSAqIHdoaWNoIGlzIGEgYml0IG9kZCBidXQg c2VlbXMgdG8gd29yayBva2F5IGluIG1vc3QgY2FzZXMuCi0JCSAqLwotCQlpZiAoanN0YXRlLT5j bG9jYXRpb25zW2ldLmV4dGVybl9wYXJhbSAmJiAhanN0YXRlLT5oYXNfc3F1YXNoZWRfbGlzdHMp Ci0JCQljb250aW51ZTsKLQotCQlvZmYgPSBqc3RhdGUtPmNsb2NhdGlvbnNbaV0ubG9jYXRpb247 Ci0KLQkJLyogQWRqdXN0IHJlY29yZGVkIGxvY2F0aW9uIGlmIHdlJ3JlIGRlYWxpbmcgd2l0aCBw YXJ0aWFsIHN0cmluZyAqLwotCQlvZmYgLT0gcXVlcnlfbG9jOwotCi0JCXRva19sZW4gPSBqc3Rh dGUtPmNsb2NhdGlvbnNbaV0ubGVuZ3RoOwotCi0JCWlmICh0b2tfbGVuIDwgMCkKLQkJCWNvbnRp bnVlOwkJCS8qIGlnbm9yZSBhbnkgZHVwbGljYXRlcyAqLwotCi0JCS8qIENvcHkgbmV4dCBjaHVu ayAod2hhdCBwcmVjZWRlcyB0aGUgbmV4dCBjb25zdGFudCkgKi8KLQkJbGVuX3RvX3dydCA9IG9m ZiAtIGxhc3Rfb2ZmOwotCQlsZW5fdG9fd3J0IC09IGxhc3RfdG9rX2xlbjsKLQkJQXNzZXJ0KGxl bl90b193cnQgPj0gMCk7Ci0JCW1lbWNweShub3JtX3F1ZXJ5ICsgbl9xdWVyX2xvYywgcXVlcnkg KyBxdWVyX2xvYywgbGVuX3RvX3dydCk7Ci0JCW5fcXVlcl9sb2MgKz0gbGVuX3RvX3dydDsKLQot CQkvKgotCQkgKiBBbmQgaW5zZXJ0IGEgcGFyYW0gc3ltYm9sIGluIHBsYWNlIG9mIHRoZSBjb25z dGFudCB0b2tlbjsgYW5kLCBpZgotCQkgKiB3ZSBoYXZlIGEgc3F1YXNoYWJsZSBsaXN0LCBpbnNl cnQgYSBwbGFjZWhvbGRlciBjb21tZW50IHN0YXJ0aW5nCi0JCSAqIGZyb20gdGhlIGxpc3QncyBz ZWNvbmQgdmFsdWUuCi0JCSAqLwotCQluX3F1ZXJfbG9jICs9IHNwcmludGYobm9ybV9xdWVyeSAr IG5fcXVlcl9sb2MsICIkJWQlcyIsCi0JCQkJCQkJICBudW1fY29uc3RhbnRzX3JlcGxhY2VkICsg MSArIGpzdGF0ZS0+aGlnaGVzdF9leHRlcm5fcGFyYW1faWQsCi0JCQkJCQkJICBqc3RhdGUtPmNs b2NhdGlvbnNbaV0uc3F1YXNoZWQgPyAiIC8qLCAuLi4gKi8iIDogIiIpOwotCQludW1fY29uc3Rh bnRzX3JlcGxhY2VkKys7Ci0KLQkJLyogbW92ZSBmb3J3YXJkICovCi0JCXF1ZXJfbG9jID0gb2Zm ICsgdG9rX2xlbjsKLQkJbGFzdF9vZmYgPSBvZmY7Ci0JCWxhc3RfdG9rX2xlbiA9IHRva19sZW47 Ci0JfQotCi0JLyoKLQkgKiBXZSd2ZSBjb3BpZWQgdXAgdW50aWwgdGhlIGxhc3QgaWdub3JhYmxl IGNvbnN0YW50LiAgQ29weSBvdmVyIHRoZQotCSAqIHJlbWFpbmluZyBieXRlcyBvZiB0aGUgb3Jp Z2luYWwgcXVlcnkgc3RyaW5nLgotCSAqLwotCWxlbl90b193cnQgPSBxdWVyeV9sZW4gLSBxdWVy X2xvYzsKLQotCUFzc2VydChsZW5fdG9fd3J0ID49IDApOwotCW1lbWNweShub3JtX3F1ZXJ5ICsg bl9xdWVyX2xvYywgcXVlcnkgKyBxdWVyX2xvYywgbGVuX3RvX3dydCk7Ci0Jbl9xdWVyX2xvYyAr PSBsZW5fdG9fd3J0OwotCi0JQXNzZXJ0KG5fcXVlcl9sb2MgPD0gbm9ybV9xdWVyeV9idWZsZW4p OwotCW5vcm1fcXVlcnlbbl9xdWVyX2xvY10gPSAnXDAnOwotCi0JKnF1ZXJ5X2xlbl9wID0gbl9x dWVyX2xvYzsKLQlyZXR1cm4gbm9ybV9xdWVyeTsKLX0KLQotLyoKLSAqIEdpdmVuIGEgdmFsaWQg U1FMIHN0cmluZyBhbmQgYW4gYXJyYXkgb2YgY29uc3RhbnQtbG9jYXRpb24gcmVjb3JkcywKLSAq IGZpbGwgaW4gdGhlIHRleHR1YWwgbGVuZ3RocyBvZiB0aG9zZSBjb25zdGFudHMuCi0gKgotICog VGhlIGNvbnN0YW50cyBtYXkgdXNlIGFueSBhbGxvd2VkIGNvbnN0YW50IHN5bnRheCwgc3VjaCBh cyBmbG9hdCBsaXRlcmFscywKLSAqIGJpdC1zdHJpbmdzLCBzaW5nbGUtcXVvdGVkIHN0cmluZ3Mg YW5kIGRvbGxhci1xdW90ZWQgc3RyaW5ncy4gIFRoaXMgaXMKLSAqIGFjY29tcGxpc2hlZCBieSB1 c2luZyB0aGUgcHVibGljIEFQSSBmb3IgdGhlIGNvcmUgc2Nhbm5lci4KLSAqCi0gKiBJdCBpcyB0 aGUgY2FsbGVyJ3Mgam9iIHRvIGVuc3VyZSB0aGF0IHRoZSBzdHJpbmcgaXMgYSB2YWxpZCBTUUwg c3RhdGVtZW50Ci0gKiB3aXRoIGNvbnN0YW50cyBhdCB0aGUgaW5kaWNhdGVkIGxvY2F0aW9ucy4g IFNpbmNlIGluIHByYWN0aWNlIHRoZSBzdHJpbmcKLSAqIGhhcyBhbHJlYWR5IGJlZW4gcGFyc2Vk LCBhbmQgdGhlIGxvY2F0aW9ucyB0aGF0IHRoZSBjYWxsZXIgcHJvdmlkZXMgd2lsbAotICogaGF2 ZSBvcmlnaW5hdGVkIGZyb20gd2l0aGluIHRoZSBhdXRob3JpdGF0aXZlIHBhcnNlciwgdGhpcyBz aG91bGQgbm90IGJlCi0gKiBhIHByb2JsZW0uCi0gKgotICogTXVsdGlwbGUgY29uc3RhbnRzIGNh biBoYXZlIHRoZSBzYW1lIGxvY2F0aW9uLiAgV2UgcmVzZXQgbGVuZ3RocyBvZiB0aG9zZQotICog cGFzdCB0aGUgZmlyc3QgdG8gLTEgc28gdGhhdCB0aGV5IGNhbiBsYXRlciBiZSBpZ25vcmVkLgot ICoKLSAqIElmIHF1ZXJ5X2xvYyA+IDAsIHRoZW4gInF1ZXJ5IiBoYXMgYmVlbiBhZHZhbmNlZCBi eSB0aGF0IG11Y2ggY29tcGFyZWQgdG8KLSAqIHRoZSBvcmlnaW5hbCBzdHJpbmcgc3RhcnQsIHNv IHdlIG5lZWQgdG8gdHJhbnNsYXRlIHRoZSBwcm92aWRlZCBsb2NhdGlvbnMKLSAqIHRvIGNvbXBl bnNhdGUuICAoVGhpcyBsZXRzIHVzIGF2b2lkIHJlLXNjYW5uaW5nIHN0YXRlbWVudHMgYmVmb3Jl IHRoZSBvbmUKLSAqIG9mIGludGVyZXN0LCBzbyBpdCdzIHdvcnRoIGRvaW5nLikKLSAqCi0gKiBO LkIuIFRoZXJlIGlzIGFuIGFzc3VtcHRpb24gdGhhdCBhICctJyBjaGFyYWN0ZXIgYXQgYSBDb25z dCBsb2NhdGlvbiBiZWdpbnMKLSAqIGEgbmVnYXRpdmUgbnVtZXJpYyBjb25zdGFudC4gIFRoaXMg cHJlY2x1ZGVzIHRoZXJlIGV2ZXIgYmVpbmcgYW5vdGhlcgotICogcmVhc29uIGZvciBhIGNvbnN0 YW50IHRvIHN0YXJ0IHdpdGggYSAnLScuCi0gKi8KLXN0YXRpYyB2b2lkCi1maWxsX2luX2NvbnN0 YW50X2xlbmd0aHMoSnVtYmxlU3RhdGUgKmpzdGF0ZSwgY29uc3QgY2hhciAqcXVlcnksCi0JCQkJ CQkgaW50IHF1ZXJ5X2xvYykKLXsKLQlMb2NhdGlvbkxlbiAqbG9jczsKLQljb3JlX3l5c2Nhbl90 IHl5c2Nhbm5lcjsKLQljb3JlX3l5X2V4dHJhX3R5cGUgeXlleHRyYTsKLQljb3JlX1lZU1RZUEUg eXlsdmFsOwotCVlZTFRZUEUJCXl5bGxvYzsKLQotCS8qCi0JICogU29ydCB0aGUgcmVjb3JkcyBi eSBsb2NhdGlvbiBzbyB0aGF0IHdlIGNhbiBwcm9jZXNzIHRoZW0gaW4gb3JkZXIgd2hpbGUKLQkg KiBzY2FubmluZyB0aGUgcXVlcnkgdGV4dC4KLQkgKi8KLQlpZiAoanN0YXRlLT5jbG9jYXRpb25z X2NvdW50ID4gMSkKLQkJcXNvcnQoanN0YXRlLT5jbG9jYXRpb25zLCBqc3RhdGUtPmNsb2NhdGlv bnNfY291bnQsCi0JCQkgIHNpemVvZihMb2NhdGlvbkxlbiksIGNvbXBfbG9jYXRpb24pOwotCWxv Y3MgPSBqc3RhdGUtPmNsb2NhdGlvbnM7Ci0KLQkvKiBpbml0aWFsaXplIHRoZSBmbGV4IHNjYW5u ZXIgLS0tIHNob3VsZCBtYXRjaCByYXdfcGFyc2VyKCkgKi8KLQl5eXNjYW5uZXIgPSBzY2FubmVy X2luaXQocXVlcnksCi0JCQkJCQkJICZ5eWV4dHJhLAotCQkJCQkJCSAmU2NhbktleXdvcmRzLAot CQkJCQkJCSBTY2FuS2V5d29yZFRva2Vucyk7Ci0KLQkvKiB3ZSBkb24ndCB3YW50IHRvIHJlLWVt aXQgYW55IGVzY2FwZSBzdHJpbmcgd2FybmluZ3MgKi8KLQl5eWV4dHJhLmVzY2FwZV9zdHJpbmdf d2FybmluZyA9IGZhbHNlOwotCi0JLyogU2VhcmNoIGZvciBlYWNoIGNvbnN0YW50LCBpbiBzZXF1 ZW5jZSAqLwotCWZvciAoaW50IGkgPSAwOyBpIDwganN0YXRlLT5jbG9jYXRpb25zX2NvdW50OyBp KyspCi0JewotCQlpbnQJCQlsb2M7Ci0JCWludAkJCXRvazsKLQotCQkvKiBJZ25vcmUgY29uc3Rh bnRzIGFmdGVyIHRoZSBmaXJzdCBvbmUgaW4gdGhlIHNhbWUgbG9jYXRpb24gKi8KLQkJaWYgKGkg PiAwICYmIGxvY3NbaV0ubG9jYXRpb24gPT0gbG9jc1tpIC0gMV0ubG9jYXRpb24pCi0JCXsKLQkJ CWxvY3NbaV0ubGVuZ3RoID0gLTE7Ci0JCQljb250aW51ZTsKLQkJfQotCi0JCWlmIChsb2NzW2ld LnNxdWFzaGVkKQotCQkJY29udGludWU7CQkJLyogc3F1YXNoYWJsZSBsaXN0LCBpZ25vcmUgKi8K LQotCQkvKiBBZGp1c3QgcmVjb3JkZWQgbG9jYXRpb24gaWYgd2UncmUgZGVhbGluZyB3aXRoIHBh cnRpYWwgc3RyaW5nICovCi0JCWxvYyA9IGxvY3NbaV0ubG9jYXRpb24gLSBxdWVyeV9sb2M7Ci0J CUFzc2VydChsb2MgPj0gMCk7Ci0KLQkJLyoKLQkJICogV2UgaGF2ZSBhIHZhbGlkIGxvY2F0aW9u IGZvciBhIGNvbnN0YW50IHRoYXQncyBub3QgYSBkdXBlLiBMZXgKLQkJICogdG9rZW5zIHVudGls IHdlIGZpbmQgdGhlIGRlc2lyZWQgY29uc3RhbnQuCi0JCSAqLwotCQlmb3IgKDs7KQotCQl7Ci0J CQl0b2sgPSBjb3JlX3l5bGV4KCZ5eWx2YWwsICZ5eWxsb2MsIHl5c2Nhbm5lcik7Ci0KLQkJCS8q IFdlIHNob3VsZCBub3QgaGl0IGVuZC1vZi1zdHJpbmcsIGJ1dCBpZiB3ZSBkbywgYmVoYXZlIHNh bmVseSAqLwotCQkJaWYgKHRvayA9PSAwKQotCQkJCWJyZWFrOwkJCS8qIG91dCBvZiBpbm5lciBm b3ItbG9vcCAqLwotCi0JCQkvKgotCQkJICogV2Ugc2hvdWxkIGZpbmQgdGhlIHRva2VuIHBvc2l0 aW9uIGV4YWN0bHksIGJ1dCBpZiB3ZSBzb21laG93Ci0JCQkgKiBydW4gcGFzdCBpdCwgd29yayB3 aXRoIHRoYXQuCi0JCQkgKi8KLQkJCWlmICh5eWxsb2MgPj0gbG9jKQotCQkJewotCQkJCWlmIChx dWVyeVtsb2NdID09ICctJykKLQkJCQl7Ci0JCQkJCS8qCi0JCQkJCSAqIEl0J3MgYSBuZWdhdGl2 ZSB2YWx1ZSAtIHRoaXMgaXMgdGhlIG9uZSBhbmQgb25seSBjYXNlCi0JCQkJCSAqIHdoZXJlIHdl IHJlcGxhY2UgbW9yZSB0aGFuIGEgc2luZ2xlIHRva2VuLgotCQkJCQkgKgotCQkJCQkgKiBEbyBu b3QgY29tcGVuc2F0ZSBmb3IgdGhlIGNvcmUgc3lzdGVtJ3Mgc3BlY2lhbC1jYXNlCi0JCQkJCSAq IGFkanVzdG1lbnQgb2YgbG9jYXRpb24gdG8gdGhhdCBvZiB0aGUgbGVhZGluZyAnLScKLQkJCQkJ ICogb3BlcmF0b3IgaW4gdGhlIGV2ZW50IG9mIGEgbmVnYXRpdmUgY29uc3RhbnQuICBJdCBpcwot CQkJCQkgKiBhbHNvIHVzZWZ1bCBmb3Igb3VyIHB1cnBvc2VzIHRvIHN0YXJ0IGZyb20gdGhlIG1p bnVzCi0JCQkJCSAqIHN5bWJvbC4gIEluIHRoaXMgd2F5LCBxdWVyaWVzIGxpa2UgInNlbGVjdCAq IGZyb20gZm9vCi0JCQkJCSAqIHdoZXJlIGJhciA9IDEiIGFuZCAic2VsZWN0ICogZnJvbSBmb28g d2hlcmUgYmFyID0gLTIiCi0JCQkJCSAqIHdpbGwgaGF2ZSBpZGVudGljYWwgbm9ybWFsaXplZCBx dWVyeSBzdHJpbmdzLgotCQkJCQkgKi8KLQkJCQkJdG9rID0gY29yZV95eWxleCgmeXlsdmFsLCAm eXlsbG9jLCB5eXNjYW5uZXIpOwotCQkJCQlpZiAodG9rID09IDApCi0JCQkJCQlicmVhazsJLyog b3V0IG9mIGlubmVyIGZvci1sb29wICovCi0JCQkJfQotCi0JCQkJLyoKLQkJCQkgKiBXZSBub3cg cmVseSBvbiB0aGUgYXNzdW1wdGlvbiB0aGF0IGZsZXggaGFzIHBsYWNlZCBhIHplcm8KLQkJCQkg KiBieXRlIGFmdGVyIHRoZSB0ZXh0IG9mIHRoZSBjdXJyZW50IHRva2VuIGluIHNjYW5idWYuCi0J CQkJICovCi0JCQkJbG9jc1tpXS5sZW5ndGggPSBzdHJsZW4oeXlleHRyYS5zY2FuYnVmICsgbG9j KTsKLQkJCQlicmVhazsJCQkvKiBvdXQgb2YgaW5uZXIgZm9yLWxvb3AgKi8KLQkJCX0KLQkJfQot Ci0JCS8qIElmIHdlIGhpdCBlbmQtb2Ytc3RyaW5nLCBnaXZlIHVwLCBsZWF2aW5nIHJlbWFpbmlu ZyBsZW5ndGhzIC0xICovCi0JCWlmICh0b2sgPT0gMCkKLQkJCWJyZWFrOwotCX0KLQotCXNjYW5u ZXJfZmluaXNoKHl5c2Nhbm5lcik7Ci19Ci0KLS8qCi0gKiBjb21wX2xvY2F0aW9uOiBjb21wYXJh dG9yIGZvciBxc29ydGluZyBMb2NhdGlvbkxlbiBzdHJ1Y3RzIGJ5IGxvY2F0aW9uCi0gKi8KLXN0 YXRpYyBpbnQKLWNvbXBfbG9jYXRpb24oY29uc3Qgdm9pZCAqYSwgY29uc3Qgdm9pZCAqYikKLXsK LQlpbnQJCQlsID0gKChjb25zdCBMb2NhdGlvbkxlbiAqKSBhKS0+bG9jYXRpb247Ci0JaW50CQkJ ciA9ICgoY29uc3QgTG9jYXRpb25MZW4gKikgYiktPmxvY2F0aW9uOwotCi0JcmV0dXJuIHBnX2Nt cF9zMzIobCwgcik7Ci19CmRpZmYgLS1naXQgYS9zcmMvYmFja2VuZC9ub2Rlcy9xdWVyeWp1bWJs ZWZ1bmNzLmMgYi9zcmMvYmFja2VuZC9ub2Rlcy9xdWVyeWp1bWJsZWZ1bmNzLmMKaW5kZXggZmZj MjMwYWY0MjcuLjA3NTExNDk2Nzc5IDEwMDY0NAotLS0gYS9zcmMvYmFja2VuZC9ub2Rlcy9xdWVy eWp1bWJsZWZ1bmNzLmMKKysrIGIvc3JjL2JhY2tlbmQvbm9kZXMvcXVlcnlqdW1ibGVmdW5jcy5j CkBAIC00MCwxMCArNDAsMTIgQEAKICNpbmNsdWRlICJhY2Nlc3MvdHJhbnNhbS5oIgogI2luY2x1 ZGUgImNhdGFsb2cvcGdfcHJvYy5oIgogI2luY2x1ZGUgImNvbW1vbi9oYXNoZm4uaCIKKyNpbmNs dWRlICJjb21tb24vaW50LmgiCiAjaW5jbHVkZSAibWlzY2FkbWluLmgiCiAjaW5jbHVkZSAibm9k ZXMvbm9kZUZ1bmNzLmgiCiAjaW5jbHVkZSAibm9kZXMvcXVlcnlqdW1ibGUuaCIKICNpbmNsdWRl ICJ1dGlscy9sc3lzY2FjaGUuaCIKKyNpbmNsdWRlICJwYXJzZXIvc2Nhbm5lci5oIgogI2luY2x1 ZGUgInBhcnNlci9zY2Fuc3VwLmgiCiAKICNkZWZpbmUgSlVNQkxFX1NJWkUJCQkJMTAyNAkvKiBx dWVyeSBzZXJpYWxpemF0aW9uIGJ1ZmZlciBzaXplICovCkBAIC02MzMsNiArNjM1LDE4IEBAIF9q dW1ibGVMaXN0KEp1bWJsZVN0YXRlICpqc3RhdGUsIE5vZGUgKm5vZGUpCiAJfQogfQogCisvKgor ICogY29tcF9sb2NhdGlvbjogY29tcGFyYXRvciBmb3IgcXNvcnRpbmcgTG9jYXRpb25MZW4gc3Ry dWN0cyBieSBsb2NhdGlvbgorICovCitzdGF0aWMgaW50Citjb21wX2xvY2F0aW9uKGNvbnN0IHZv aWQgKmEsIGNvbnN0IHZvaWQgKmIpCit7CisJaW50CQkJbCA9ICgoY29uc3QgTG9jYXRpb25MZW4g KikgYSktPmxvY2F0aW9uOworCWludAkJCXIgPSAoKGNvbnN0IExvY2F0aW9uTGVuICopIGIpLT5s b2NhdGlvbjsKKworCXJldHVybiBwZ19jbXBfczMyKGwsIHIpOworfQorCiAvKgogICogV2UgdHJ5 IHRvIGp1bWJsZSBsaXN0cyBvZiBleHByZXNzaW9ucyBhcyBvbmUgaW5kaXZpZHVhbCBpdGVtIHJl Z2FyZGxlc3MKICAqIG9mIGhvdyBtYW55IGVsZW1lbnRzIGFyZSBpbiB0aGUgbGlzdC4gVGhpcyBp cyBrbm93IGFzIHNxdWFzaGluZywgd2hpY2gKQEAgLTc3MywzICs3ODcsMjQxIEBAIF9qdW1ibGVS YW5nZVRibEVudHJ5X2VyZWYoSnVtYmxlU3RhdGUgKmpzdGF0ZSwKIAkgKi8KIAlKVU1CTEVfU1RS SU5HKGFsaWFzbmFtZSk7CiB9CisKKy8qCisgKiBHaXZlbiBhIHZhbGlkIFNRTCBzdHJpbmcgYW5k IGFuIGFycmF5IG9mIGNvbnN0YW50LWxvY2F0aW9uIHJlY29yZHMsCisgKiBmaWxsIGluIHRoZSB0 ZXh0dWFsIGxlbmd0aHMgb2YgdGhvc2UgY29uc3RhbnRzLgorICoKKyAqIFRoZSBjb25zdGFudHMg bWF5IHVzZSBhbnkgYWxsb3dlZCBjb25zdGFudCBzeW50YXgsIHN1Y2ggYXMgZmxvYXQgbGl0ZXJh bHMsCisgKiBiaXQtc3RyaW5ncywgc2luZ2xlLXF1b3RlZCBzdHJpbmdzIGFuZCBkb2xsYXItcXVv dGVkIHN0cmluZ3MuICBUaGlzIGlzCisgKiBhY2NvbXBsaXNoZWQgYnkgdXNpbmcgdGhlIHB1Ymxp YyBBUEkgZm9yIHRoZSBjb3JlIHNjYW5uZXIuCisgKgorICogSXQgaXMgdGhlIGNhbGxlcidzIGpv YiB0byBlbnN1cmUgdGhhdCB0aGUgc3RyaW5nIGlzIGEgdmFsaWQgU1FMIHN0YXRlbWVudAorICog d2l0aCBjb25zdGFudHMgYXQgdGhlIGluZGljYXRlZCBsb2NhdGlvbnMuICBTaW5jZSBpbiBwcmFj dGljZSB0aGUgc3RyaW5nCisgKiBoYXMgYWxyZWFkeSBiZWVuIHBhcnNlZCwgYW5kIHRoZSBsb2Nh dGlvbnMgdGhhdCB0aGUgY2FsbGVyIHByb3ZpZGVzIHdpbGwKKyAqIGhhdmUgb3JpZ2luYXRlZCBm cm9tIHdpdGhpbiB0aGUgYXV0aG9yaXRhdGl2ZSBwYXJzZXIsIHRoaXMgc2hvdWxkIG5vdCBiZQor ICogYSBwcm9ibGVtLgorICoKKyAqIE11bHRpcGxlIGNvbnN0YW50cyBjYW4gaGF2ZSB0aGUgc2Ft ZSBsb2NhdGlvbi4gIFdlIHJlc2V0IGxlbmd0aHMgb2YgdGhvc2UKKyAqIHBhc3QgdGhlIGZpcnN0 IHRvIC0xIHNvIHRoYXQgdGhleSBjYW4gbGF0ZXIgYmUgaWdub3JlZC4KKyAqCisgKiBOLkIuIFRo ZXJlIGlzIGFuIGFzc3VtcHRpb24gdGhhdCBhICctJyBjaGFyYWN0ZXIgYXQgYSBDb25zdCBsb2Nh dGlvbiBiZWdpbnMKKyAqIGEgbmVnYXRpdmUgbnVtZXJpYyBjb25zdGFudC4gIFRoaXMgcHJlY2x1 ZGVzIHRoZXJlIGV2ZXIgYmVpbmcgYW5vdGhlcgorICogcmVhc29uIGZvciBhIGNvbnN0YW50IHRv IHN0YXJ0IHdpdGggYSAnLScuCisgKi8KK3N0YXRpYyB2b2lkCitmaWxsX2luX2NvbnN0YW50X2xl bmd0aHMoY29uc3QgSnVtYmxlU3RhdGUgKmpzdGF0ZSwgY29uc3QgY2hhciAqcXVlcnksCisJCQkJ CQkgaW50IHF1ZXJ5X2xvYykKK3sKKwlMb2NhdGlvbkxlbiAqbG9jczsKKwljb3JlX3l5c2Nhbl90 IHl5c2Nhbm5lcjsKKwljb3JlX3l5X2V4dHJhX3R5cGUgeXlleHRyYTsKKwljb3JlX1lZU1RZUEUg eXlsdmFsOworCVlZTFRZUEUJCXl5bGxvYzsKKworCS8qCisJICogU29ydCB0aGUgcmVjb3JkcyBi eSBsb2NhdGlvbiBzbyB0aGF0IHdlIGNhbiBwcm9jZXNzIHRoZW0gaW4gb3JkZXIgd2hpbGUKKwkg KiBzY2FubmluZyB0aGUgcXVlcnkgdGV4dC4KKwkgKi8KKwlpZiAoanN0YXRlLT5jbG9jYXRpb25z X2NvdW50ID4gMSkKKwkJcXNvcnQoanN0YXRlLT5jbG9jYXRpb25zLCBqc3RhdGUtPmNsb2NhdGlv bnNfY291bnQsCisJCQkgIHNpemVvZihMb2NhdGlvbkxlbiksIGNvbXBfbG9jYXRpb24pOworCWxv Y3MgPSBqc3RhdGUtPmNsb2NhdGlvbnM7CisKKwkvKiBpbml0aWFsaXplIHRoZSBmbGV4IHNjYW5u ZXIgLS0tIHNob3VsZCBtYXRjaCByYXdfcGFyc2VyKCkgKi8KKwl5eXNjYW5uZXIgPSBzY2FubmVy X2luaXQocXVlcnksCisJCQkJCQkJICZ5eWV4dHJhLAorCQkJCQkJCSAmU2NhbktleXdvcmRzLAor CQkJCQkJCSBTY2FuS2V5d29yZFRva2Vucyk7CisKKwkvKiB3ZSBkb24ndCB3YW50IHRvIHJlLWVt aXQgYW55IGVzY2FwZSBzdHJpbmcgd2FybmluZ3MgKi8KKwl5eWV4dHJhLmVzY2FwZV9zdHJpbmdf d2FybmluZyA9IGZhbHNlOworCisJLyogU2VhcmNoIGZvciBlYWNoIGNvbnN0YW50LCBpbiBzZXF1 ZW5jZSAqLworCWZvciAoaW50IGkgPSAwOyBpIDwganN0YXRlLT5jbG9jYXRpb25zX2NvdW50OyBp KyspCisJeworCQlpbnQJCQlsb2M7CisJCWludAkJCXRvazsKKworCQkvKiBJZ25vcmUgY29uc3Rh bnRzIGFmdGVyIHRoZSBmaXJzdCBvbmUgaW4gdGhlIHNhbWUgbG9jYXRpb24gKi8KKwkJaWYgKGkg PiAwICYmIGxvY3NbaV0ubG9jYXRpb24gPT0gbG9jc1tpIC0gMV0ubG9jYXRpb24pCisJCXsKKwkJ CWxvY3NbaV0ubGVuZ3RoID0gLTE7CisJCQljb250aW51ZTsKKwkJfQorCisJCWlmIChsb2NzW2ld LnNxdWFzaGVkKQorCQkJY29udGludWU7CQkJLyogc3F1YXNoYWJsZSBsaXN0LCBpZ25vcmUgKi8K KworCQkvKgorCQkgKiBBZGp1c3QgdGhlIGNvbnN0YW50J3MgbG9jYXRpb24gdXNpbmcgdGhlIHBy b3ZpZGVkIHN0YXJ0aW5nIGxvY2F0aW9uCisJCSAqIG9mIHRoZSBjdXJyZW50IHN0YXRlbWVudC4g VGhpcyBhbGxvd3MgdXMgdG8gYXZvaWQgc2Nhbm5pbmcgYQorCQkgKiBtdWx0aS1zdGF0ZW1lbnQg c3RyaW5nIGZyb20gdGhlIGJlZ2lubmluZy4KKwkJICovCisJCWxvYyA9IGxvY3NbaV0ubG9jYXRp b24gLSBxdWVyeV9sb2M7CisJCUFzc2VydChsb2MgPj0gMCk7CisKKwkJLyoKKwkJICogV2UgaGF2 ZSBhIHZhbGlkIGxvY2F0aW9uIGZvciBhIGNvbnN0YW50IHRoYXQncyBub3QgYSBkdXBlLiBMZXgK KwkJICogdG9rZW5zIHVudGlsIHdlIGZpbmQgdGhlIGRlc2lyZWQgY29uc3RhbnQuCisJCSAqLwor CQlmb3IgKDs7KQorCQl7CisJCQl0b2sgPSBjb3JlX3l5bGV4KCZ5eWx2YWwsICZ5eWxsb2MsIHl5 c2Nhbm5lcik7CisKKwkJCS8qIFdlIHNob3VsZCBub3QgaGl0IGVuZC1vZi1zdHJpbmcsIGJ1dCBp ZiB3ZSBkbywgYmVoYXZlIHNhbmVseSAqLworCQkJaWYgKHRvayA9PSAwKQorCQkJCWJyZWFrOwkJ CS8qIG91dCBvZiBpbm5lciBmb3ItbG9vcCAqLworCisJCQkvKgorCQkJICogV2Ugc2hvdWxkIGZp bmQgdGhlIHRva2VuIHBvc2l0aW9uIGV4YWN0bHksIGJ1dCBpZiB3ZSBzb21laG93CisJCQkgKiBy dW4gcGFzdCBpdCwgd29yayB3aXRoIHRoYXQuCisJCQkgKi8KKwkJCWlmICh5eWxsb2MgPj0gbG9j KQorCQkJeworCQkJCWlmIChxdWVyeVtsb2NdID09ICctJykKKwkJCQl7CisJCQkJCS8qCisJCQkJ CSAqIEl0J3MgYSBuZWdhdGl2ZSB2YWx1ZSAtIHRoaXMgaXMgdGhlIG9uZSBhbmQgb25seSBjYXNl CisJCQkJCSAqIHdoZXJlIHdlIHJlcGxhY2UgbW9yZSB0aGFuIGEgc2luZ2xlIHRva2VuLgorCQkJ CQkgKgorCQkJCQkgKiBEbyBub3QgY29tcGVuc2F0ZSBmb3IgdGhlIGNvcmUgc3lzdGVtJ3Mgc3Bl Y2lhbC1jYXNlCisJCQkJCSAqIGFkanVzdG1lbnQgb2YgbG9jYXRpb24gdG8gdGhhdCBvZiB0aGUg bGVhZGluZyAnLScKKwkJCQkJICogb3BlcmF0b3IgaW4gdGhlIGV2ZW50IG9mIGEgbmVnYXRpdmUg Y29uc3RhbnQuICBJdCBpcworCQkJCQkgKiBhbHNvIHVzZWZ1bCBmb3Igb3VyIHB1cnBvc2VzIHRv IHN0YXJ0IGZyb20gdGhlIG1pbnVzCisJCQkJCSAqIHN5bWJvbC4gIEluIHRoaXMgd2F5LCBxdWVy aWVzIGxpa2UgInNlbGVjdCAqIGZyb20gZm9vCisJCQkJCSAqIHdoZXJlIGJhciA9IDEiIGFuZCAi c2VsZWN0ICogZnJvbSBmb28gd2hlcmUgYmFyID0gLTIiCisJCQkJCSAqIHdpbGwgaGF2ZSBpZGVu dGljYWwgbm9ybWFsaXplZCBxdWVyeSBzdHJpbmdzLgorCQkJCQkgKi8KKwkJCQkJdG9rID0gY29y ZV95eWxleCgmeXlsdmFsLCAmeXlsbG9jLCB5eXNjYW5uZXIpOworCQkJCQlpZiAodG9rID09IDAp CisJCQkJCQlicmVhazsJLyogb3V0IG9mIGlubmVyIGZvci1sb29wICovCisJCQkJfQorCisJCQkJ LyoKKwkJCQkgKiBXZSBub3cgcmVseSBvbiB0aGUgYXNzdW1wdGlvbiB0aGF0IGZsZXggaGFzIHBs YWNlZCBhIHplcm8KKwkJCQkgKiBieXRlIGFmdGVyIHRoZSB0ZXh0IG9mIHRoZSBjdXJyZW50IHRv a2VuIGluIHNjYW5idWYuCisJCQkJICovCisJCQkJbG9jc1tpXS5sZW5ndGggPSBzdHJsZW4oeXll eHRyYS5zY2FuYnVmICsgbG9jKTsKKwkJCQlicmVhazsJCQkvKiBvdXQgb2YgaW5uZXIgZm9yLWxv b3AgKi8KKwkJCX0KKwkJfQorCisJCS8qIElmIHdlIGhpdCBlbmQtb2Ytc3RyaW5nLCBnaXZlIHVw LCBsZWF2aW5nIHJlbWFpbmluZyBsZW5ndGhzIC0xICovCisJCWlmICh0b2sgPT0gMCkKKwkJCWJy ZWFrOworCX0KKworCXNjYW5uZXJfZmluaXNoKHl5c2Nhbm5lcik7Cit9CisKKy8qCisgKiBHZW5l cmF0ZSBhIG5vcm1hbGl6ZWQgdmVyc2lvbiBvZiB0aGUgcXVlcnkgc3RyaW5nIHRoYXQgd2lsbCBi ZSB1c2VkIHRvCisgKiByZXByZXNlbnQgYWxsIHNpbWlsYXIgcXVlcmllcy4KKyAqCisgKiBOb3Rl IHRoYXQgdGhlIG5vcm1hbGl6ZWQgcmVwcmVzZW50YXRpb24gbWF5IHdlbGwgdmFyeSBkZXBlbmRp bmcgb24KKyAqIGp1c3Qgd2hpY2ggImVxdWl2YWxlbnQiIHF1ZXJ5IGlzIHVzZWQgdG8gY3JlYXRl IHRoZSBoYXNodGFibGUgZW50cnkuCisgKiBXZSBhc3N1bWUgdGhpcyBpcyBPSy4KKyAqCisgKiAq cXVlcnlfbGVuX3AgY29udGFpbnMgdGhlIGlucHV0IHN0cmluZyBsZW5ndGgsIGFuZCBpcyB1cGRh dGVkIHdpdGgKKyAqIHRoZSByZXN1bHQgc3RyaW5nIGxlbmd0aCBvbiBleGl0LiAgVGhlIHJlc3Vs dGluZyBzdHJpbmcgbWlnaHQgYmUgbG9uZ2VyCisgKiBvciBzaG9ydGVyIGRlcGVuZGluZyBvbiB3 aGF0IGhhcHBlbnMgd2l0aCByZXBsYWNlbWVudCBvZiBjb25zdGFudHMuCisgKgorICogUmV0dXJu cyBhIHBhbGxvYydkIHN0cmluZyB0aGF0IHRoZSBjYWxsZXIgbXVzdCBwZnJlZS4KKyAqLworY2hh ciAqCitnZW5lcmF0ZV9ub3JtYWxpemVkX3F1ZXJ5KGNvbnN0IEp1bWJsZVN0YXRlICpqc3RhdGUs IGNvbnN0IGNoYXIgKnF1ZXJ5LAorCQkJCQkJICBpbnQgcXVlcnlfbG9jLCBpbnQgKnF1ZXJ5X2xl bl9wKQoreworCWNoYXIJICAgKm5vcm1fcXVlcnk7CisJaW50CQkJcXVlcnlfbGVuID0gKnF1ZXJ5 X2xlbl9wOworCWludAkJCW5vcm1fcXVlcnlfYnVmbGVuLAkvKiBTcGFjZSBhbGxvd2VkIGZvciBu b3JtX3F1ZXJ5ICovCisJCQkJbGVuX3RvX3dydCwJCS8qIExlbmd0aCAoaW4gYnl0ZXMpIHRvIHdy aXRlICovCisJCQkJcXVlcl9sb2MgPSAwLAkvKiBTb3VyY2UgcXVlcnkgYnl0ZSBsb2NhdGlvbiAq LworCQkJCW5fcXVlcl9sb2MgPSAwLCAvKiBOb3JtYWxpemVkIHF1ZXJ5IGJ5dGUgbG9jYXRpb24g Ki8KKwkJCQlsYXN0X29mZiA9IDAsCS8qIE9mZnNldCBmcm9tIHN0YXJ0IGZvciBwcmV2aW91cyB0 b2sgKi8KKwkJCQlsYXN0X3Rva19sZW4gPSAwOwkvKiBMZW5ndGggKGluIGJ5dGVzKSBvZiB0aGF0 IHRvayAqLworCWludAkJCW51bV9jb25zdGFudHNfcmVwbGFjZWQgPSAwOworCisJLyoKKwkgKiBH ZXQgY29uc3RhbnRzJyBsZW5ndGhzIChjb3JlIHN5c3RlbSBvbmx5IGdpdmVzIHVzIGxvY2F0aW9u cykuICBOb3RlCisJICogdGhpcyBhbHNvIGVuc3VyZXMgdGhlIGl0ZW1zIGFyZSBzb3J0ZWQgYnkg bG9jYXRpb24uCisJICovCisJZmlsbF9pbl9jb25zdGFudF9sZW5ndGhzKGpzdGF0ZSwgcXVlcnks IHF1ZXJ5X2xvYyk7CisKKwkvKgorCSAqIEFsbG93IGZvciAkbiBzeW1ib2xzIHRvIGJlIGxvbmdl ciB0aGFuIHRoZSBjb25zdGFudHMgdGhleSByZXBsYWNlLgorCSAqIENvbnN0YW50cyBtdXN0IHRh a2UgYXQgbGVhc3Qgb25lIGJ5dGUgaW4gdGV4dCBmb3JtLCB3aGlsZSBhICRuIHN5bWJvbAorCSAq IGNlcnRhaW5seSBpc24ndCBtb3JlIHRoYW4gMTEgYnl0ZXMsIGV2ZW4gaWYgbiByZWFjaGVzIElO VF9NQVguICBXZQorCSAqIGNvdWxkIHJlZmluZSB0aGF0IGxpbWl0IGJhc2VkIG9uIHRoZSBtYXgg dmFsdWUgb2YgbiBmb3IgdGhlIGN1cnJlbnQKKwkgKiBxdWVyeSwgYnV0IGl0IGhhcmRseSBzZWVt cyB3b3J0aCBhbnkgZXh0cmEgZWZmb3J0IHRvIGRvIHNvLgorCSAqLworCW5vcm1fcXVlcnlfYnVm bGVuID0gcXVlcnlfbGVuICsganN0YXRlLT5jbG9jYXRpb25zX2NvdW50ICogMTA7CisKKwkvKiBB bGxvY2F0ZSByZXN1bHQgYnVmZmVyICovCisJbm9ybV9xdWVyeSA9IHBhbGxvYyhub3JtX3F1ZXJ5 X2J1ZmxlbiArIDEpOworCisJZm9yIChpbnQgaSA9IDA7IGkgPCBqc3RhdGUtPmNsb2NhdGlvbnNf Y291bnQ7IGkrKykKKwl7CisJCWludAkJCW9mZiwJCS8qIE9mZnNldCBmcm9tIHN0YXJ0IGZvciBj dXIgdG9rICovCisJCQkJCXRva19sZW47CS8qIExlbmd0aCAoaW4gYnl0ZXMpIG9mIHRoYXQgdG9r ICovCisKKwkJLyoKKwkJICogSWYgd2UgaGF2ZSBhbiBleHRlcm5hbCBwYXJhbSBhdCB0aGlzIGxv Y2F0aW9uLCBidXQgbm8gbGlzdHMgYXJlCisJCSAqIGJlaW5nIHNxdWFzaGVkIGFjcm9zcyB0aGUg cXVlcnksIHRoZW4gd2Ugc2tpcCBoZXJlOyB0aGlzIHdpbGwgbWFrZQorCQkgKiB1cyBwcmludCB0 aGUgY2hhcmFjdGVycyBmb3VuZCBpbiB0aGUgb3JpZ2luYWwgcXVlcnkgdGhhdCByZXByZXNlbnQK KwkJICogdGhlIHBhcmFtZXRlciBpbiB0aGUgbmV4dCBpdGVyYXRpb24gKG9yIGFmdGVyIHRoZSBs b29wIGlzIGRvbmUpLAorCQkgKiB3aGljaCBpcyBhIGJpdCBvZGQgYnV0IHNlZW1zIHRvIHdvcmsg b2theSBpbiBtb3N0IGNhc2VzLgorCQkgKi8KKwkJaWYgKGpzdGF0ZS0+Y2xvY2F0aW9uc1tpXS5l eHRlcm5fcGFyYW0gJiYgIWpzdGF0ZS0+aGFzX3NxdWFzaGVkX2xpc3RzKQorCQkJY29udGludWU7 CisKKwkJb2ZmID0ganN0YXRlLT5jbG9jYXRpb25zW2ldLmxvY2F0aW9uOworCisJCS8qIEFkanVz dCB0aGUgY29uc3RhbnQncyBsb2NhdGlvbiAoc2VlIGZpbGxfaW5fY29uc3RhbnRfbGVuZ3Rocykg Ki8KKwkJb2ZmIC09IHF1ZXJ5X2xvYzsKKworCQl0b2tfbGVuID0ganN0YXRlLT5jbG9jYXRpb25z W2ldLmxlbmd0aDsKKworCQlpZiAodG9rX2xlbiA8IDApCisJCQljb250aW51ZTsJCQkvKiBpZ25v cmUgYW55IGR1cGxpY2F0ZXMgKi8KKworCQkvKiBDb3B5IG5leHQgY2h1bmsgKHdoYXQgcHJlY2Vk ZXMgdGhlIG5leHQgY29uc3RhbnQpICovCisJCWxlbl90b193cnQgPSBvZmYgLSBsYXN0X29mZjsK KwkJbGVuX3RvX3dydCAtPSBsYXN0X3Rva19sZW47CisJCUFzc2VydChsZW5fdG9fd3J0ID49IDAp OworCQltZW1jcHkobm9ybV9xdWVyeSArIG5fcXVlcl9sb2MsIHF1ZXJ5ICsgcXVlcl9sb2MsIGxl bl90b193cnQpOworCQluX3F1ZXJfbG9jICs9IGxlbl90b193cnQ7CisKKwkJLyoKKwkJICogQW5k IGluc2VydCBhIHBhcmFtIHN5bWJvbCBpbiBwbGFjZSBvZiB0aGUgY29uc3RhbnQgdG9rZW47IGFu ZCwgaWYKKwkJICogd2UgaGF2ZSBhIHNxdWFzaGFibGUgbGlzdCwgaW5zZXJ0IGEgcGxhY2Vob2xk ZXIgY29tbWVudCBzdGFydGluZworCQkgKiBmcm9tIHRoZSBsaXN0J3Mgc2Vjb25kIHZhbHVlLgor CQkgKi8KKwkJbl9xdWVyX2xvYyArPSBzcHJpbnRmKG5vcm1fcXVlcnkgKyBuX3F1ZXJfbG9jLCAi JCVkJXMiLAorCQkJCQkJCSAgbnVtX2NvbnN0YW50c19yZXBsYWNlZCArIDEgKyBqc3RhdGUtPmhp Z2hlc3RfZXh0ZXJuX3BhcmFtX2lkLAorCQkJCQkJCSAganN0YXRlLT5jbG9jYXRpb25zW2ldLnNx dWFzaGVkID8gIiAvKiwgLi4uICovIiA6ICIiKTsKKwkJbnVtX2NvbnN0YW50c19yZXBsYWNlZCsr OworCisJCS8qIG1vdmUgZm9yd2FyZCAqLworCQlxdWVyX2xvYyA9IG9mZiArIHRva19sZW47CisJ CWxhc3Rfb2ZmID0gb2ZmOworCQlsYXN0X3Rva19sZW4gPSB0b2tfbGVuOworCX0KKworCS8qCisJ ICogV2UndmUgY29waWVkIHVwIHVudGlsIHRoZSBsYXN0IGlnbm9yYWJsZSBjb25zdGFudC4gIENv cHkgb3ZlciB0aGUKKwkgKiByZW1haW5pbmcgYnl0ZXMgb2YgdGhlIG9yaWdpbmFsIHF1ZXJ5IHN0 cmluZy4KKwkgKi8KKwlsZW5fdG9fd3J0ID0gcXVlcnlfbGVuIC0gcXVlcl9sb2M7CisKKwlBc3Nl cnQobGVuX3RvX3dydCA+PSAwKTsKKwltZW1jcHkobm9ybV9xdWVyeSArIG5fcXVlcl9sb2MsIHF1 ZXJ5ICsgcXVlcl9sb2MsIGxlbl90b193cnQpOworCW5fcXVlcl9sb2MgKz0gbGVuX3RvX3dydDsK KworCUFzc2VydChuX3F1ZXJfbG9jIDw9IG5vcm1fcXVlcnlfYnVmbGVuKTsKKwlub3JtX3F1ZXJ5 W25fcXVlcl9sb2NdID0gJ1wwJzsKKworCSpxdWVyeV9sZW5fcCA9IG5fcXVlcl9sb2M7CisJcmV0 dXJuIG5vcm1fcXVlcnk7Cit9CmRpZmYgLS1naXQgYS9zcmMvaW5jbHVkZS9ub2Rlcy9xdWVyeWp1 bWJsZS5oIGIvc3JjL2luY2x1ZGUvbm9kZXMvcXVlcnlqdW1ibGUuaAppbmRleCBkY2IzNmRjYjQ0 Zi4uODIwNzIyN2U3OWUgMTAwNjQ0Ci0tLSBhL3NyYy9pbmNsdWRlL25vZGVzL3F1ZXJ5anVtYmxl LmgKKysrIGIvc3JjL2luY2x1ZGUvbm9kZXMvcXVlcnlqdW1ibGUuaApAQCAtOTEsNiArOTEsOCBA QCBleHRlcm4gUEdETExJTVBPUlQgaW50IGNvbXB1dGVfcXVlcnlfaWQ7CiAKIAogZXh0ZXJuIGNv bnN0IGNoYXIgKkNsZWFuUXVlcnl0ZXh0KGNvbnN0IGNoYXIgKnF1ZXJ5LCBpbnQgKmxvY2F0aW9u LCBpbnQgKmxlbik7CitleHRlcm4gY2hhciAqZ2VuZXJhdGVfbm9ybWFsaXplZF9xdWVyeShKdW1i bGVTdGF0ZSAqanN0YXRlLCBjb25zdCBjaGFyICpxdWVyeSwKKwkJCQkJCQkJCSAgIGludCBxdWVy eV9sb2MsIGludCAqcXVlcnlfbGVuX3ApOwogZXh0ZXJuIEp1bWJsZVN0YXRlICpKdW1ibGVRdWVy eShRdWVyeSAqcXVlcnkpOwogZXh0ZXJuIHZvaWQgRW5hYmxlUXVlcnlJZCh2b2lkKTsKIAotLSAK Mi40My4wCgo= --0000000000004db1940646436137--