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.94.2) (envelope-from ) id 1tmaY5-007sNA-MZ for pgsql-hackers@arkaria.postgresql.org; Mon, 24 Feb 2025 15:39:14 +0000 Received: from localhost ([127.0.0.1] helo=malur.postgresql.org) by malur.postgresql.org with esmtp (Exim 4.94.2) (envelope-from ) id 1tmaY4-004890-Ej for pgsql-hackers@arkaria.postgresql.org; Mon, 24 Feb 2025 15:39:12 +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.94.2) (envelope-from ) id 1tmaY4-00488q-13 for pgsql-hackers@lists.postgresql.org; Mon, 24 Feb 2025 15:39:12 +0000 Received: from mail-il1-x129.google.com ([2607:f8b0:4864:20::129]) by magus.postgresql.org with esmtps (TLS1.3) tls TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256 (Exim 4.96) (envelope-from ) id 1tmaY1-000Yah-0m for pgsql-hackers@postgresql.org; Mon, 24 Feb 2025 15:39:11 +0000 Received: by mail-il1-x129.google.com with SMTP id e9e14a558f8ab-3d2af701446so37656985ab.2 for ; Mon, 24 Feb 2025 07:39:09 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1740411547; x=1741016347; darn=postgresql.org; h=cc:to:subject:message-id:date:from:in-reply-to:references :mime-version:from:to:cc:subject:date:message-id:reply-to; bh=XMaAZfiChK3X2aN8Ky2yoeJLTw7tWJKF9quiLvohi00=; b=a2WWUQwfMTz74OfhjOeBfZRfWy2b8qcqGCtUu419BESjqLl2nHp4FpApa2w57X5aaV hQVIOhmR0XTz37ivxh0S7wbLq2eWl8IVw3unWKM1Ah3X8UwB32+HfFR3H4+Ft4839E8k 5PdgFJovQjeF51fMvgk4xbDSAYzmwps/4exkK/Uv2RUGMRDTYIH5sZAGaM7ta9fIzBMJ ofh49f/4VM/FNkr6v7O4UniP+5nWbCT6Q1or23HVnBfttoKjdTEW+bh/2utIoMtfMZNJ UytHiDq/woUGPXXbI5iT+1FyBofdBfkFpxHPogDGAfftC3O1jMOlLz82bFc6+s2pcGHB 9xrQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1740411547; x=1741016347; h=cc:to:subject:message-id:date:from:in-reply-to:references :mime-version:x-gm-message-state:from:to:cc:subject:date:message-id :reply-to; bh=XMaAZfiChK3X2aN8Ky2yoeJLTw7tWJKF9quiLvohi00=; b=VHYiMBp/hVGyGmYtyynajd1bpzk++FETdSxn/FtotxjoWhd/mgyu5k8z/GBrK0CWVp f9QzlBbuiJB6hyTBVtpcSM/TnORvguiCQaP+IzHNs6sXLZ//agAql453YGSZyao+FXop T6UtkOPJLfEebqI/qQF6KyD0l803jrzAeW7SPy1cN9j5vQrtZGp81NAZA1YZTYFcJ94c te1kbdbxvvsP3qNWFN6ljRuZrOBD2i/YcCGX2spD27K1YwVB+qr3VvJATlDPZuRi7QdX Ftnl4dfSnH5Mus2B+dZ6rwoAY/UYfB0gjd+YEWWWEHkopulgRpgHX5FyVERsE1ZKE3qp QgAw== X-Forwarded-Encrypted: i=1; AJvYcCUGh8oLual66+LibnsOnN+Gbn/eyh8+XLOtq2pIfVeOuLacdyJLFiulqzEJbV2FpHwj2vl26AEBCpj9Uojh@postgresql.org X-Gm-Message-State: AOJu0YwLuXqVMpGUy8Fc6aBLn5Ur7wEwhPJuJkMH1FtvMZ/yLthTxK9G cs+rSne104JTUi7VkV425JDC6i69bg2bFLR4fvSWcW3W3uj702BXEWs1+A7dRXTACC447BG8uIc sT3jPb7m/aD6BrCze9rxHmejo/Rc= X-Gm-Gg: ASbGncvKQWBHP3ZnxpMbqVFP225seDPcEKTcZC6Ic8vcYuWZi7wiBDJ/q639iIB6xBR 1ZKNM80tyQXrUixXm8/Aw8msYklMoRMj6bSXMqG7OHAmqrXbDUBqboKK5aSjGN2bEQ5p/5ldrjS pC+Z3tyE8= X-Google-Smtp-Source: AGHT+IHtd0BR6o59vS8OSaYmMJAx/N1rcMr8RknmizARhUUXXjvXaELpLk+/DfrGlYRSjyArrm+Md732CGTlchf58Nc= X-Received: by 2002:a05:6e02:20cd:b0:3d2:a637:d622 with SMTP id e9e14a558f8ab-3d2cae8aa8amr130741665ab.12.1740411547481; Mon, 24 Feb 2025 07:39:07 -0800 (PST) MIME-Version: 1.0 References: In-Reply-To: From: Andrew Jackson Date: Mon, 24 Feb 2025 09:38:31 -0600 X-Gm-Features: AWEUYZkpQdwMEgixlR72_Femuht1j2O0aQ2C_HqD6tdRzG93p0E2G7CPZcxn_KU Message-ID: Subject: Re: Add Option To Check All Addresses For Matching target_session_attr To: Andrey Borodin Cc: Vladimir Sitnikov , Dave Page , pgsql-hackers Content-Type: multipart/mixed; boundary="0000000000000d42a8062ee524f3" List-Id: List-Help: List-Subscribe: List-Post: List-Owner: List-Archive: Archived-At: Precedence: bulk --0000000000000d42a8062ee524f3 Content-Type: multipart/alternative; boundary="0000000000000d429b062ee524f1" --0000000000000d429b062ee524f1 Content-Type: text/plain; charset="UTF-8" Content-Transfer-Encoding: quoted-printable Hi, Thank you for the review! Review Response - Made a first pass at a real commit message - Fixed the condition on the if statement to use strcmp - Added a test suite in the files `src/interfaces/libpq/t/ 006_target_session_attr_dns.pl` and `src/interfaces/libpq/t/ 007_load_balance_dns_check_all_addrs.pl` which checks the target_session_attrs as when used with and without load balancing. Regarding the name of the variable itself I am definitely open to opinions on this. I didn't put too much thought initially and just chose `check_all_addrs`. I feel like given that it modifies the behaviour of `target_session_attrs` ideally it should reference that in the name but that would make that variable name very long: something akin to `target_session_attrs_check_all_addrs`. Context I tested some drivers as well and found that pgx, psycopg, and rust-postgres all traverse every IP address when looking for a matching target_session_attrs. Asyncpg and psycopg2 on the other hand follow libpq and terminate additional attempts after the first failure. Given this it seems like there is a decent amount of fragmentation in the ecosystem as to how exactly to implement this feature. I believe some drivers choose to traverse all addresses because they have users target the same use case outlined above. Thanks again, Andrew Jackson On Sun, Feb 16, 2025 at 6:03=E2=80=AFAM Andrey Borodin wrote: > Hi Andrew! > > cc Jelte, I suspect he might be interested. > > > On 20 Nov 2024, at 20:51, Andrew Jackson > wrote: > > > > Would appreciate any feedback on the applicability/relevancy of the goa= l > here or the implementation. > > Thank you for raising the issue. Following our discussion in Discord I'm > putting my thoughts to list. > > > Context > > A DNS record might return several IPs. Consider we have a connection > string with "host=3DA,B", A is resolved to 1.1.1.1,2.2.2.2, B to > 3.3.3.3,4.4.4.4. > If we connect with "target_session_attrs=3Dread-write" IPs 1.1.1.1 and > 3.3.3.3 will be probed, but 2.2.2.2 and 4.4.4.4 won't (if 1.1.1.1 and > 3.3.3.3 responded). > > If we enable libpq load balancing some random 2 IPs will be probed. > > IMO it's a bug, at least when load balancing is enabled. Let's consider i= f > we can change default behavior here. I suspect we can't do it for > "load_balance_hosts=3Ddisable". And even for load balancing this might be= too > unexpected change for someone. > > Further I only consider proposal not as a bug fix, but as a feature. > > In Discord we have surveyed some other drivers. > pgx treats all IPs as different servers [1]. npgsql goes through all IPs > one-by-one always [2]. PGJDBC are somewhat in a decision process [3] (cc > Dave and Vladimir, if they would like to provide some input). > > > Review > > The patch needs a rebase. It's trivial, so please fine attached. The patc= h > needs real commit message, it's not trivial :) > > We definitely need to adjust tests [0]. We need to change > 004_load_balance_dns.pl so that it tests target_session_attrs too. > > Some documentation would be nice. > > I do not like how this check is performed > + if (conn->check_all_addrs > && conn->check_all_addrs[0] =3D=3D '1') > Let's make it like load balancing is done [4]. > > Finally, let's think about naming alternatives for "check_all_addrs". > > I think that's enough for a first round of the review. If it's not a bug, > but a feature - it's a very narrow window to get to 18. But we might be > lucky... > > Thank you! > > > Best regards, Andrey Borodin. > > [0] > https://github.com/postgres/postgres/commit/7f5b19817eaf38e70ad1153db4e64= 4ee9456853e#diff-b05b74d2a97d7f74d4311ba1702d732f0df1b101c6ac99c146b5121517= 4cf3ffR94 > [1] https://github.com/jackc/pgx/blob/master/pgconn/pgconn.go#L177 > [2] > https://github.com/npgsql/npgsql/blob/7f1a59fa8dc1ccc34a70154f49a768e1abf= 826ba/src/Npgsql/Internal/NpgsqlConnector.cs#L986 > [3] https://github.com/pgjdbc/pgjdbc/pull/3012#discussion_r1408069450 > [4] > https://github.com/postgres/postgres/commit/7f5b19817eaf38e70ad1153db4e64= 4ee9456853e#diff-8d819454e061b9d4cdae9c8922ded05753a629d70f2ac1de1d4f6d5a4a= eb7f68R1660 > --0000000000000d429b062ee524f1 Content-Type: text/html; charset="UTF-8" Content-Transfer-Encoding: quoted-printable
Hi,

Thank you for the review!

Review Response

- Made a first pass at a real commit message
<= div>- Fixed the condition on the if statement to use strcmp
- Add= ed a test suite in the files `src/interfaces/libpq/t/006_target_session_attr_dns.pl` and `src/in= terfaces/libpq/t/007_load_balance_dns_check_all_addrs.pl` which checks the target_sessi= on_attrs as when used with and without load balancing.

=
Regarding the name of the variable itself I am=C2=A0definitely open to= opinions on this. I didn't put too much thought initially and just cho= se `check_all_addrs`. I feel like given that it modifies the behaviour of `= target_session_attrs` ideally it should reference that in the name but that= would make that variable name very long: something akin to `target_session= _attrs_check_all_addrs`.=C2=A0

Context
<= br>
I tested some drivers as well and found that pgx, psycopg, an= d rust-postgres all traverse every IP address when looking for a matching t= arget_session_attrs. Asyncpg and psycopg2 on the other hand follow libpq an= d terminate additional attempts after the first failure. Given this it seem= s like there is a decent amount of fragmentation in the ecosystem as to how= exactly to implement this feature. I believe some drivers choose to traver= se all addresses because they have users target the same use case outlined = above.=C2=A0

Thanks again,
Andrew Jackso= n

On Sun, Feb 16, 2025 at 6:03=E2=80=AFAM Andre= y Borodin <x4mmm@yandex-team.ru<= /a>> wrote:
H= i Andrew!

cc Jelte, I suspect he might be interested.

> On 20 Nov 2024, at 20:51, Andrew Jackson <
andrewjackson947@gmail.com> w= rote:
>
> Would appreciate any feedback on the applicability/relevancy of the go= al here or the implementation.

Thank you for raising the issue. Following our discussion in Discord I'= m putting my thoughts to list.


Context

A DNS record might return several IPs. Consider we have a connection string= with "host=3DA,B", A is resolved to 1.1.1.1,2.2.2.2, B to 3.3.3.= 3,4.4.4.4.
If we connect with "target_session_attrs=3Dread-write" IPs 1.1.1.= 1 and 3.3.3.3 will be probed, but 2.2.2.2 and 4.4.4.4 won't (if 1.1.1.1= and 3.3.3.3 responded).

If we enable libpq load balancing some random 2 IPs will be probed.

IMO it's a bug, at least when load balancing is enabled. Let's cons= ider if we can change default behavior here. I suspect we can't do it f= or "load_balance_hosts=3Ddisable". And even for load balancing th= is might be too unexpected change for someone.

Further I only consider proposal not as a bug fix, but as a feature.

In Discord we have surveyed some other drivers.
pgx treats all IPs as different servers [1]. npgsql goes through all IPs on= e-by-one always [2]. PGJDBC are somewhat in a decision process [3] (cc Dave= and Vladimir, if they would like to provide some input).


Review

The patch needs a rebase. It's trivial, so please fine attached. The pa= tch needs real commit message, it's not trivial :)

We definitely need to adjust tests [0]. We need to change 004_load_bal= ance_dns.pl so that it tests target_session_attrs too.

Some documentation would be nice.

I do not like how this check is performed
+=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2= =A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 = =C2=A0 =C2=A0 =C2=A0if (conn->check_all_addrs && conn->check_= all_addrs[0] =3D=3D '1')
Let's make it like load balancing is done [4].

Finally, let's think about naming alternatives for "check_all_addr= s".

I think that's enough for a first round of the review. If it's not = a bug, but a feature - it's a very narrow window to get to 18. But we m= ight be lucky...

Thank you!


Best regards, Andrey Borodin.

[0] https://github= .com/postgres/postgres/commit/7f5b19817eaf38e70ad1153db4e644ee9456853e#diff= -b05b74d2a97d7f74d4311ba1702d732f0df1b101c6ac99c146b51215174cf3ffR94 [1] https://github.com/jackc/pgx/blob/= master/pgconn/pgconn.go#L177
[2] https://github.com/npgsql/npgsql/blob/7f1a59fa8dc= 1ccc34a70154f49a768e1abf826ba/src/Npgsql/Internal/NpgsqlConnector.cs#L986
[3]
https://github.com/pgjdbc/pgjdb= c/pull/3012#discussion_r1408069450
[4] https://gith= ub.com/postgres/postgres/commit/7f5b19817eaf38e70ad1153db4e644ee9456853e#di= ff-8d819454e061b9d4cdae9c8922ded05753a629d70f2ac1de1d4f6d5a4aeb7f68R1660
--0000000000000d429b062ee524f1-- --0000000000000d42a8062ee524f3 Content-Type: text/x-patch; charset="US-ASCII"; name="v3-0001-Add-option-to-check-all-addrs-for-target_session.patch" Content-Disposition: attachment; filename="v3-0001-Add-option-to-check-all-addrs-for-target_session.patch" Content-Transfer-Encoding: base64 Content-ID: X-Attachment-Id: f_m7j81kmh0 RnJvbSAzNTg2MDVjZmY1OTRiYTA4YjE0ZWRiY2Y0OTdjYWI1OTgzNGY4MTEwIE1vbiBTZXAgMTcg MDA6MDA6MDAgMjAwMQpGcm9tOiBBbmRyZXkgQm9yb2RpbiA8YW1ib3JvZGluQGFjbS5vcmc+CkRh dGU6IEZyaSwgMTQgRmViIDIwMjUgMjM6MTM6NTUgKzA1MDAKU3ViamVjdDogW1BBVENIIHYzXSBB ZGQgb3B0aW9uIHRvIGNoZWNrIGFsbCBhZGRycyBmb3IgdGFyZ2V0X3Nlc3Npb24uCgpUaGUgY3Vy cmVudCBiZWhhdmlvdXIgb2YgbGlicHEgd2l0aCByZWdhcmQgdG8gc2VhcmNoaW5nCmZvciBhIG1h dGNoaW5nIHRhcmdldF9zZXNzaW9uX2F0dHJzIGluIGEgbGlzdCBvZiBhZGRycyBpcwp0aGF0IGFm dGVyIHN1Y2Nlc3NmdWxseSBjb25uZWN0aW5nIHRvIGEgc2VydmVyIGlmIHRoZSBzZXJ2ZXJzCnNl c3Npb25fYXR0ciBkb2VzIG5vdCBtYXRjaCB0aGUgcmVxdWVzdCB0YXJnZXRfc2Vzc2lvbl9hdHRy cwpubyBmdXRoZXIgYWRkcmVzcyBpcyBjb25zaWRlcmVkLiBUaGlzIGJlaGF2aW91ciBpcyBleHRy ZW1lbHkKaW5jb252ZW5pZW50IGluIGVudmlyb25tZW50cyB3aGVyZSB0aGUgdXNlciBpcyBhdHRl bXB0aW5nIHRvCmltcGxlbWVudCBhIGhpZ2ggYXZhaWxhYmlsaXR5IHNldHVwIHdpdGhvdXQgaGF2 aW5nIHRvIG1vZGlmeQpETlMgcmVjb3JkcyBvciBhIHByb3h5IHNlcnZlciBjb25maWcuCgpUaGlz IFBSIGFkZHMgYSBjbGllbnQgc2lkZSBvcHRpb24gY2FsbGVkIGNoZWNrX2FsbF9hZGRycy4KV2hl biBzZXQgdG8gMSB0aGlzIG9wdGlvbiB3aWxsIHRlbGwgbGlicHEgdG8gY29udGludWUgY2hlY2tp bmcKYW55IHJlbWFpbmluZyBhZGRyZXNzZXMgZXZlbiBpZiB0aGVyZSB3YXMgYSB0YXJnZXRfc2Vz c2lvbl9hdHRycwptaXNtYXRjaCBvbiBvbmUgb2YgdGhlbS4KCkF1dGhvcjogQW5kcmV3IEphY2tz b24KUmV2aWV3ZWQtYnk6IEFuZHJleSBCb3JvZGluCkRpc2N1c3Npb246IGh0dHBzOi8vd3d3LnBv c3RncmVzcWwub3JnL21lc3NhZ2UtaWQvZmxhdC9DQUtLNUJrRVNTYzY5c3AyVGlUV0h2dk9IQ1Vl eTByRFdYU3JSOXBpbnlScXlmYW1VWWclNDBtYWlsLmdtYWlsLmNvbQotLS0KIGRvYy9zcmMvc2dt bC9saWJwcS5zZ21sICAgICAgICAgICAgICAgICAgICAgICB8ICAzMyArKysrKwogc3JjL2ludGVy ZmFjZXMvbGlicHEvZmUtY29ubmVjdC5jICAgICAgICAgICAgIHwgIDI1ICsrLS0KIHNyYy9pbnRl cmZhY2VzL2xpYnBxL2xpYnBxLWludC5oICAgICAgICAgICAgICB8ICAgMSArCiAuLi4vbGlicHEv dC8wMDZfdGFyZ2V0X3Nlc3Npb25fYXR0cl9kbnMucGwgICAgfCAxMjkgKysrKysrKysrKysrKysr KysrCiAuLi4vdC8wMDdfbG9hZF9iYWxhbmNlX2Ruc19jaGVja19hbGxfYWRkcnMucGwgfCAxMjgg KysrKysrKysrKysrKysrKysKIDUgZmlsZXMgY2hhbmdlZCwgMzA2IGluc2VydGlvbnMoKyksIDEw IGRlbGV0aW9ucygtKQogY3JlYXRlIG1vZGUgMTAwNjQ0IHNyYy9pbnRlcmZhY2VzL2xpYnBxL3Qv MDA2X3RhcmdldF9zZXNzaW9uX2F0dHJfZG5zLnBsCiBjcmVhdGUgbW9kZSAxMDA2NDQgc3JjL2lu dGVyZmFjZXMvbGlicHEvdC8wMDdfbG9hZF9iYWxhbmNlX2Ruc19jaGVja19hbGxfYWRkcnMucGwK CmRpZmYgLS1naXQgYS9kb2Mvc3JjL3NnbWwvbGlicHEuc2dtbCBiL2RvYy9zcmMvc2dtbC9saWJw cS5zZ21sCmluZGV4IGM0OWU5NzViMDgyLi4zZWI5OTNiZGEwYSAxMDA2NDQKLS0tIGEvZG9jL3Ny Yy9zZ21sL2xpYnBxLnNnbWwKKysrIGIvZG9jL3NyYy9zZ21sL2xpYnBxLnNnbWwKQEAgLTIzNzMs NiArMjM3MywzOSBAQCBwb3N0Z3Jlc3FsOi8vJTJGdmFyJTJGbGliJTJGcG9zdGdyZXNxbC9kYm5h bWUKICAgICAgICA8L3BhcmE+CiAgICAgICA8L2xpc3RpdGVtPgogICAgICA8L3Zhcmxpc3RlbnRy eT4KKyAgICAgPHZhcmxpc3RlbnRyeSBpZD0ibGlicHEtY29ubmVjdC1jaGVjay1hbGwtYWRkcnMi IHhyZWZsYWJlbD0iY2hlY2tfYWxsX2FkZHJzIj4KKyAgICAgIDx0ZXJtPjxsaXRlcmFsPmNoZWNr X2FsbF9hZGRyczwvbGl0ZXJhbD48L3Rlcm0+CisgICAgICA8bGlzdGl0ZW0+CisgICAgICAgPHBh cmE+CisgICAgICAgIENvbnRyb2xzIHdoZXRoZXIgb3Igbm90IGFsbCBhZGRyZXNzZXMgd2l0aGlu IGEgaG9zdG5hbWUgYXJlIGNoZWNrZWQgd2hlbiB0cnlpbmcgdG8gbWFrZSBhIGNvbm5lY3Rpb24K KyAgICAgICAgd2hlbiBhdHRlbXB0aW5nIHRvIGZpbmQgYSBjb25uZWN0aW9uIHdpdGggYSBtYXRj aGluZyA8eHJlZiBsaW5rZW5kPSJsaWJwcS1jb25uZWN0LXRhcmdldC1zZXNzaW9uLWF0dHIiLz4u CisKKyAgICAgICAgVGhlcmUgYXJlIHR3byBtb2RlczoKKyAgICAgICAgPHZhcmlhYmxlbGlzdD4K KyAgICAgICAgIDx2YXJsaXN0ZW50cnk+CisgICAgICAgICAgPHRlcm0+PGxpdGVyYWw+MDwvbGl0 ZXJhbD4gKGRlZmF1bHQpPC90ZXJtPgorICAgICAgICAgIDxsaXN0aXRlbT4KKyAgICAgICAgICAg PHBhcmE+CisgICAgICAgICAgICBJZiBhIHN1Y2Nlc3NmdWwgY29ubmVjdGlvbiBpcyBtYWRlIGFu ZCB0aGF0IGNvbm5lY3Rpb24gaXMgZm91bmQgdG8gaGF2ZSBhCisgICAgICAgICAgICBtaXNtYXRj aGluZyA8eHJlZiBsaW5rZW5kPSJsaWJwcS1jb25uZWN0LXRhcmdldC1zZXNzaW9uLWF0dHIiLz4g ZG8gbm90IGNoZWNrCisgICAgICAgICAgICBhbnkgYWRkaXRpb25hbCBhZGRyZXNzZXMgYW5kIG1v dmUgb250byB0aGUgbmV4dCBob3N0IGlmIG9uZSB3YXMgcHJvdmlkZWQuCisgICAgICAgICAgIDwv cGFyYT4KKyAgICAgICAgICA8L2xpc3RpdGVtPgorICAgICAgICAgPC92YXJsaXN0ZW50cnk+Cisg ICAgICAgICA8dmFybGlzdGVudHJ5PgorICAgICAgICAgIDx0ZXJtPjxsaXRlcmFsPjE8L2xpdGVy YWw+PC90ZXJtPgorICAgICAgICAgIDxsaXN0aXRlbT4KKyAgICAgICAgICAgPHBhcmE+CisgICAg ICAgICAgICBJZiBhIHN1Y2Nlc3NmdWwgY29ubmVjdGlvbiBpcyBtYWRlIGFuZCB0aGF0IGNvbm5l Y3Rpb24gaXMgZm91bmQgdG8gaGF2ZSBhCisgICAgICAgICAgICBtaXNtYXRjaGluZyA8eHJlZiBs aW5rZW5kPSJsaWJwcS1jb25uZWN0LXRhcmdldC1zZXNzaW9uLWF0dHIiLz4gcHJvY2VlZAorICAg ICAgICAgICAgdG8gY2hlY2sgYW55IGFkZGl0aW9uYWwgYWRkcmVzc2VzLgorICAgICAgICAgICA8 L3BhcmE+CisgICAgICAgICAgPC9saXN0aXRlbT4KKyAgICAgICAgIDwvdmFybGlzdGVudHJ5Pgor ICAgICAgICA8L3ZhcmlhYmxlbGlzdD4KKyAgICAgICA8L3BhcmE+CisgICAgICA8L2xpc3RpdGVt PgorICAgICA8L3Zhcmxpc3RlbnRyeT4KICAgICA8L3ZhcmlhYmxlbGlzdD4KICAgIDwvcGFyYT4K ICAgPC9zZWN0Mj4KZGlmZiAtLWdpdCBhL3NyYy9pbnRlcmZhY2VzL2xpYnBxL2ZlLWNvbm5lY3Qu YyBiL3NyYy9pbnRlcmZhY2VzL2xpYnBxL2ZlLWNvbm5lY3QuYwppbmRleCA4NWQxY2EyODY0Zi4u NDIwNTVhMDc4ZTMgMTAwNjQ0Ci0tLSBhL3NyYy9pbnRlcmZhY2VzL2xpYnBxL2ZlLWNvbm5lY3Qu YworKysgYi9zcmMvaW50ZXJmYWNlcy9saWJwcS9mZS1jb25uZWN0LmMKQEAgLTM3Miw2ICszNzIs MTAgQEAgc3RhdGljIGNvbnN0IGludGVybmFsUFFjb25uaW5mb09wdGlvbiBQUWNvbm5pbmZvT3B0 aW9uc1tdID0gewogCiAJeyJzY3JhbV9zZXJ2ZXJfa2V5IiwgTlVMTCwgTlVMTCwgTlVMTCwgIlND UkFNLVNlcnZlci1LZXkiLCAiRCIsIFNDUkFNX01BWF9LRVlfTEVOICogMiwKIAlvZmZzZXRvZihz dHJ1Y3QgcGdfY29ubiwgc2NyYW1fc2VydmVyX2tleSl9LAorCXsiY2hlY2tfYWxsX2FkZHJzIiwg IlBHQ0hFQ0tBTExBRERSUyIsCisJCURlZmF1bHRMb2FkQmFsYW5jZUhvc3RzLCBOVUxMLAorCQki Q2hlY2stQWxsLUFkZHJzIiwgIiIsIDEsCisJb2Zmc2V0b2Yoc3RydWN0IHBnX2Nvbm4sIGNoZWNr X2FsbF9hZGRycyl9LAogCiAJLyogVGVybWluYXRpbmcgZW50cnkgLS0tIE1VU1QgQkUgTEFTVCAq LwogCXtOVUxMLCBOVUxMLCBOVUxMLCBOVUxMLApAQCAtNDMyNiwxMSArNDMzMCwxMSBAQCBrZWVw X2dvaW5nOgkJCQkJCS8qIFdlIHdpbGwgY29tZSBiYWNrIHRvIGhlcmUgdW50aWwgdGhlcmUgaXMK IAkJCQkJCWNvbm4tPnN0YXR1cyA9IENPTk5FQ1RJT05fT0s7CiAJCQkJCQlzZW5kVGVybWluYXRl Q29ubihjb25uKTsKIAotCQkJCQkJLyoKLQkJCQkJCSAqIFRyeSBuZXh0IGhvc3QgaWYgYW55LCBi dXQgd2UgZG9uJ3Qgd2FudCB0byBjb25zaWRlcgotCQkJCQkJICogYWRkaXRpb25hbCBhZGRyZXNz ZXMgZm9yIHRoaXMgaG9zdC4KLQkJCQkJCSAqLwotCQkJCQkJY29ubi0+dHJ5X25leHRfaG9zdCA9 IHRydWU7CisJCQkJCQlpZiAoc3RyY21wKGNvbm4tPmNoZWNrX2FsbF9hZGRycywgIjEiKSA9PSAw KQorCQkJCQkJCWNvbm4tPnRyeV9uZXh0X2FkZHIgPSB0cnVlOworCQkJCQkJZWxzZQorCQkJCQkJ CWNvbm4tPnRyeV9uZXh0X2hvc3QgPSB0cnVlOworCiAJCQkJCQlnb3RvIGtlZXBfZ29pbmc7CiAJ CQkJCX0KIAkJCQl9CkBAIC00MzgxLDExICs0Mzg1LDExIEBAIGtlZXBfZ29pbmc6CQkJCQkJLyog V2Ugd2lsbCBjb21lIGJhY2sgdG8gaGVyZSB1bnRpbCB0aGVyZSBpcwogCQkJCQkJY29ubi0+c3Rh dHVzID0gQ09OTkVDVElPTl9PSzsKIAkJCQkJCXNlbmRUZXJtaW5hdGVDb25uKGNvbm4pOwogCi0J CQkJCQkvKgotCQkJCQkJICogVHJ5IG5leHQgaG9zdCBpZiBhbnksIGJ1dCB3ZSBkb24ndCB3YW50 IHRvIGNvbnNpZGVyCi0JCQkJCQkgKiBhZGRpdGlvbmFsIGFkZHJlc3NlcyBmb3IgdGhpcyBob3N0 LgotCQkJCQkJICovCi0JCQkJCQljb25uLT50cnlfbmV4dF9ob3N0ID0gdHJ1ZTsKKwkJCQkJCWlm IChzdHJjbXAoY29ubi0+Y2hlY2tfYWxsX2FkZHJzLCAiMSIpID09IDApCisJCQkJCQkJY29ubi0+ dHJ5X25leHRfYWRkciA9IHRydWU7CisJCQkJCQllbHNlCisJCQkJCQkJY29ubi0+dHJ5X25leHRf aG9zdCA9IHRydWU7CisKIAkJCQkJCWdvdG8ga2VlcF9nb2luZzsKIAkJCQkJfQogCQkJCX0KQEAg LTUwMDIsNiArNTAwNiw3IEBAIGZyZWVQR2Nvbm4oUEdjb25uICpjb25uKQogCWZyZWUoY29ubi0+ bG9hZF9iYWxhbmNlX2hvc3RzKTsKIAlmcmVlKGNvbm4tPnNjcmFtX2NsaWVudF9rZXkpOwogCWZy ZWUoY29ubi0+c2NyYW1fc2VydmVyX2tleSk7CisJZnJlZShjb25uLT5jaGVja19hbGxfYWRkcnMp OwogCXRlcm1QUUV4cEJ1ZmZlcigmY29ubi0+ZXJyb3JNZXNzYWdlKTsKIAl0ZXJtUFFFeHBCdWZm ZXIoJmNvbm4tPndvcmtCdWZmZXIpOwogCmRpZmYgLS1naXQgYS9zcmMvaW50ZXJmYWNlcy9saWJw cS9saWJwcS1pbnQuaCBiL3NyYy9pbnRlcmZhY2VzL2xpYnBxL2xpYnBxLWludC5oCmluZGV4IDI1 NDZmOWY4YTUwLi5hOTZkOGNlNDgyNSAxMDA2NDQKLS0tIGEvc3JjL2ludGVyZmFjZXMvbGlicHEv bGlicHEtaW50LmgKKysrIGIvc3JjL2ludGVyZmFjZXMvbGlicHEvbGlicHEtaW50LmgKQEAgLTQz Miw2ICs0MzIsNyBAQCBzdHJ1Y3QgcGdfY29ubgogCWNoYXIJICAgKmxvYWRfYmFsYW5jZV9ob3N0 czsgLyogbG9hZCBiYWxhbmNlIG92ZXIgaG9zdHMgKi8KIAljaGFyCSAgICpzY3JhbV9jbGllbnRf a2V5OwkvKiBiYXNlNjQtZW5jb2RlZCBTQ1JBTSBjbGllbnQga2V5ICovCiAJY2hhcgkgICAqc2Ny YW1fc2VydmVyX2tleTsJLyogYmFzZTY0LWVuY29kZWQgU0NSQU0gc2VydmVyIGtleSAqLworCWNo YXIgICAgICAgKmNoZWNrX2FsbF9hZGRyczsgIC8qIHdoZXRoZXIgdG8gY2hlY2sgYWxsIGlwcyB3 aXRoaW4gYSBob3N0IG9yIHRlcm1pbmF0ZSBvbiBmYWlsdXJlICovCiAKIAlib29sCQljYW5jZWxS ZXF1ZXN0OwkvKiB0cnVlIGlmIHRoaXMgY29ubmVjdGlvbiBpcyB1c2VkIHRvIHNlbmQgYQogCQkJ CQkJCQkgKiBjYW5jZWwgcmVxdWVzdCwgaW5zdGVhZCBvZiBiZWluZyBhIG5vcm1hbApkaWZmIC0t Z2l0IGEvc3JjL2ludGVyZmFjZXMvbGlicHEvdC8wMDZfdGFyZ2V0X3Nlc3Npb25fYXR0cl9kbnMu cGwgYi9zcmMvaW50ZXJmYWNlcy9saWJwcS90LzAwNl90YXJnZXRfc2Vzc2lvbl9hdHRyX2Rucy5w bApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwMDAwMC4uOTE0ZjZjNDcyZjQKLS0t IC9kZXYvbnVsbAorKysgYi9zcmMvaW50ZXJmYWNlcy9saWJwcS90LzAwNl90YXJnZXRfc2Vzc2lv bl9hdHRyX2Rucy5wbApAQCAtMCwwICsxLDEyOSBAQAorCisjIENvcHlyaWdodCAoYykgMjAyMy0y MDI1LCBQb3N0Z3JlU1FMIEdsb2JhbCBEZXZlbG9wbWVudCBHcm91cAordXNlIHN0cmljdDsKK3Vz ZSB3YXJuaW5ncyBGQVRBTCA9PiAnYWxsJzsKK3VzZSBDb25maWc7Cit1c2UgUG9zdGdyZVNRTDo6 VGVzdDo6VXRpbHM7Cit1c2UgUG9zdGdyZVNRTDo6VGVzdDo6Q2x1c3RlcjsKK3VzZSBUZXN0OjpN b3JlOworCitpZiAoISRFTlZ7UEdfVEVTVF9FWFRSQX0gfHwgJEVOVntQR19URVNUX0VYVFJBfSAh fiAvXGJsb2FkX2JhbGFuY2VcYi8pCit7CisJcGxhbiBza2lwX2FsbCA9PgorCSAgJ1BvdGVudGlh bGx5IHVuc2FmZSB0ZXN0IGxvYWRfYmFsYW5jZSBub3QgZW5hYmxlZCBpbiBQR19URVNUX0VYVFJB JzsKK30KKworIyBDbHVzdGVyIHNldHVwIHdoaWNoIGlzIHNoYXJlZCBmb3IgdGVzdGluZyBib3Ro IGxvYWQgYmFsYW5jaW5nIG1ldGhvZHMKK215ICRjYW5fYmluZF90b18xMjdfMF8wXzIgPQorICAk Q29uZmlne29zbmFtZX0gZXEgJ2xpbnV4JyB8fCAkUG9zdGdyZVNRTDo6VGVzdDo6VXRpbHM6Ondp bmRvd3Nfb3M7CisKKyMgQ2hlY2tzIGZvciB0aGUgcmVxdWlyZW1lbnRzIGZvciB0ZXN0aW5nIGxv YWQgYmFsYW5jaW5nIG1ldGhvZCAyCitpZiAoISRjYW5fYmluZF90b18xMjdfMF8wXzIpCit7CisJ cGxhbiBza2lwX2FsbCA9PiAnbG9hZF9iYWxhbmNlIHRlc3Qgb25seSBzdXBwb3J0ZWQgb24gTGlu dXggYW5kIFdpbmRvd3MnOworfQorCitteSAkaG9zdHNfcGF0aDsKK2lmICgkd2luZG93c19vcykK K3sKKwkkaG9zdHNfcGF0aCA9ICdjOlxXaW5kb3dzXFN5c3RlbTMyXERyaXZlcnNcZXRjXGhvc3Rz JzsKK30KK2Vsc2UKK3sKKwkkaG9zdHNfcGF0aCA9ICcvZXRjL2hvc3RzJzsKK30KKworbXkgJGhv c3RzX2NvbnRlbnQgPSBQb3N0Z3JlU1FMOjpUZXN0OjpVdGlsczo6c2x1cnBfZmlsZSgkaG9zdHNf cGF0aCk7CisKK215ICRob3N0c19jb3VudCA9ICgpID0KKyAgJGhvc3RzX2NvbnRlbnQgPX4gLzEy N1wuMFwuMFwuWzEtM10gcGctbG9hZGJhbGFuY2V0ZXN0L2c7CitpZiAoJGhvc3RzX2NvdW50ICE9 IDMpCit7CisJIyBIb3N0IGZpbGUgaXMgbm90IHByZXBhcmVkIGZvciB0aGlzIHRlc3QKKwlwbGFu IHNraXBfYWxsID0+ICJob3N0cyBmaWxlIHdhcyBub3QgcHJlcGFyZWQgZm9yIEROUyBsb2FkIGJh bGFuY2UgdGVzdCI7Cit9CisKKyRQb3N0Z3JlU1FMOjpUZXN0OjpDbHVzdGVyOjp1c2VfdGNwID0g MTsKKyRQb3N0Z3JlU1FMOjpUZXN0OjpDbHVzdGVyOjp0ZXN0X3BnaG9zdCA9ICcxMjcuMC4wLjEn OworbXkgJHBvcnQgPSBQb3N0Z3JlU1FMOjpUZXN0OjpDbHVzdGVyOjpnZXRfZnJlZV9wb3J0KCk7 CisKK215ICRub2RlX3ByaW1hcnkxID0gUG9zdGdyZVNRTDo6VGVzdDo6Q2x1c3Rlci0+bmV3KCdw cmltYXJ5MScsIHBvcnQgPT4gJHBvcnQpOworJG5vZGVfcHJpbWFyeTEtPmluaXQoaGFzX2FyY2hp dmluZyA9PiAxLCBhbGxvd3Nfc3RyZWFtaW5nID0+IDEpOworCisjIFN0YXJ0IGl0Ciskbm9kZV9w cmltYXJ5MS0+c3RhcnQ7CisKKyMgVGFrZSBiYWNrdXAgZnJvbSB3aGljaCBhbGwgb3BlcmF0aW9u cyB3aWxsIGJlIHJ1bgorJG5vZGVfcHJpbWFyeTEtPmJhY2t1cCgnbXlfYmFja3VwJyk7CisKK215 ICRub2RlX3N0YW5kYnkgPSBQb3N0Z3JlU1FMOjpUZXN0OjpDbHVzdGVyLT5uZXcoJ3N0YW5kYnkn LCBwb3J0ID0+ICRwb3J0LCBvd25faG9zdCA9PiAxKTsKKyRub2RlX3N0YW5kYnktPmluaXRfZnJv bV9iYWNrdXAoJG5vZGVfcHJpbWFyeTEsICdteV9iYWNrdXAnLAorCWhhc19yZXN0b3JpbmcgPT4g MSk7Ciskbm9kZV9zdGFuZGJ5LT5zdGFydCgpOworCitteSAkbm9kZV9wcmltYXJ5MiA9IFBvc3Rn cmVTUUw6OlRlc3Q6OkNsdXN0ZXItPm5ldygnbm9kZTEnLCBwb3J0ID0+ICRwb3J0LCBvd25faG9z dCA9PiAxKTsKKyRub2RlX3ByaW1hcnkyIC0+aW5pdCgpOworJG5vZGVfcHJpbWFyeTIgLT5zdGFy dCgpOworCisjIHRhcmdldF9zZXNzaW9uX2F0dHJzPXByaW1hcnkgc2hvdWxkIGFsd2F5cyBjaG9v c2UgdGhlIGZpcnN0IG9uZS4KKyRub2RlX3ByaW1hcnkxLT5jb25uZWN0X29rKAorCSJob3N0PXBn LWxvYWRiYWxhbmNldGVzdCBwb3J0PSRwb3J0IHRhcmdldF9zZXNzaW9uX2F0dHJzPXByaW1hcnkg Y2hlY2tfYWxsX2FkZHJzPTEiLAorCSJ0YXJnZXRfc2Vzc2lvbl9hdHRycz1wcmltYXJ5IGNvbm5l Y3RzIHRvIHRoZSBmaXJzdCBub2RlIiwKKwlzcWwgPT4gIlNFTEVDVCAnY29ubmVjdDEnIiwKKwls b2dfbGlrZSA9PiBbcXIvc3RhdGVtZW50OiBTRUxFQ1QgJ2Nvbm5lY3QxJy9dKTsKKyRub2RlX3By aW1hcnkxLT5jb25uZWN0X29rKAorCSJob3N0PXBnLWxvYWRiYWxhbmNldGVzdCBwb3J0PSRwb3J0 IHRhcmdldF9zZXNzaW9uX2F0dHJzPXJlYWQtd3JpdGUgY2hlY2tfYWxsX2FkZHJzPTEiLAorCSJ0 YXJnZXRfc2Vzc2lvbl9hdHRycz1yZWFkLXdyaXRlIGNvbm5lY3RzIHRvIHRoZSBmaXJzdCBub2Rl IiwKKwlzcWwgPT4gIlNFTEVDVCAnY29ubmVjdDEnIiwKKwlsb2dfbGlrZSA9PiBbcXIvc3RhdGVt ZW50OiBTRUxFQ1QgJ2Nvbm5lY3QxJy9dKTsKKyRub2RlX3ByaW1hcnkxLT5jb25uZWN0X29rKAor CSJob3N0PXBnLWxvYWRiYWxhbmNldGVzdCBwb3J0PSRwb3J0IHRhcmdldF9zZXNzaW9uX2F0dHJz PWFueSBjaGVja19hbGxfYWRkcnM9MSIsCisJInRhcmdldF9zZXNzaW9uX2F0dHJzPWFueSBjb25u ZWN0cyB0byB0aGUgZmlyc3Qgbm9kZSIsCisJc3FsID0+ICJTRUxFQ1QgJ2Nvbm5lY3QxJyIsCisJ bG9nX2xpa2UgPT4gW3FyL3N0YXRlbWVudDogU0VMRUNUICdjb25uZWN0MScvXSk7Ciskbm9kZV9z dGFuZGJ5LT5jb25uZWN0X29rKAorCSJob3N0PXBnLWxvYWRiYWxhbmNldGVzdCBwb3J0PSRwb3J0 IHRhcmdldF9zZXNzaW9uX2F0dHJzPXN0YW5kYnkgY2hlY2tfYWxsX2FkZHJzPTEiLAorCSJ0YXJn ZXRfc2Vzc2lvbl9hdHRycz1zdGFuZGJ5IGNvbm5lY3RzIHRvIHRoZSB0aGlyZCBub2RlIiwKKwlz cWwgPT4gIlNFTEVDVCAnY29ubmVjdDEnIiwKKwlsb2dfbGlrZSA9PiBbcXIvc3RhdGVtZW50OiBT RUxFQ1QgJ2Nvbm5lY3QxJy9dKTsKKyRub2RlX3N0YW5kYnktPmNvbm5lY3Rfb2soCisJImhvc3Q9 cGctbG9hZGJhbGFuY2V0ZXN0IHBvcnQ9JHBvcnQgdGFyZ2V0X3Nlc3Npb25fYXR0cnM9cmVhZC1v bmx5IGNoZWNrX2FsbF9hZGRycz0xIiwKKwkidGFyZ2V0X3Nlc3Npb25fYXR0cnM9cmVhZC1vbmx5 IGNvbm5lY3RzIHRvIHRoZSB0aGlyZCBub2RlIiwKKwlzcWwgPT4gIlNFTEVDVCAnY29ubmVjdDEn IiwKKwlsb2dfbGlrZSA9PiBbcXIvc3RhdGVtZW50OiBTRUxFQ1QgJ2Nvbm5lY3QxJy9dKTsKKwor Ciskbm9kZV9wcmltYXJ5MS0+c3RvcCgpOworCisjIHRhcmdldF9zZXNzaW9uX2F0dHJzPXByaW1h cnkgc2hvdWxkIGFsd2F5cyBjaG9vc2UgdGhlIGZpcnN0IG9uZS4KKyRub2RlX3ByaW1hcnkyLT5j b25uZWN0X29rKAorCSJob3N0PXBnLWxvYWRiYWxhbmNldGVzdCBwb3J0PSRwb3J0IHRhcmdldF9z ZXNzaW9uX2F0dHJzPXByaW1hcnkgY2hlY2tfYWxsX2FkZHJzPTEiLAorCSJ0YXJnZXRfc2Vzc2lv bl9hdHRycz1wcmltYXJ5IGNvbm5lY3RzIHRvIHRoZSBmaXJzdCBub2RlIiwKKwlzcWwgPT4gIlNF TEVDVCAnY29ubmVjdDEnIiwKKwlsb2dfbGlrZSA9PiBbcXIvc3RhdGVtZW50OiBTRUxFQ1QgJ2Nv bm5lY3QxJy9dKTsKKyRub2RlX3ByaW1hcnkyLT5jb25uZWN0X29rKAorCSJob3N0PXBnLWxvYWRi YWxhbmNldGVzdCBwb3J0PSRwb3J0IHRhcmdldF9zZXNzaW9uX2F0dHJzPXJlYWQtd3JpdGUgY2hl Y2tfYWxsX2FkZHJzPTEiLAorCSJ0YXJnZXRfc2Vzc2lvbl9hdHRycz1yZWFkLXdyaXRlIGNvbm5l Y3RzIHRvIHRoZSBmaXJzdCBub2RlIiwKKwlzcWwgPT4gIlNFTEVDVCAnY29ubmVjdDEnIiwKKwls b2dfbGlrZSA9PiBbcXIvc3RhdGVtZW50OiBTRUxFQ1QgJ2Nvbm5lY3QxJy9dKTsKKyRub2RlX3N0 YW5kYnktPmNvbm5lY3Rfb2soCisJImhvc3Q9cGctbG9hZGJhbGFuY2V0ZXN0IHBvcnQ9JHBvcnQg dGFyZ2V0X3Nlc3Npb25fYXR0cnM9YW55IGNoZWNrX2FsbF9hZGRycz0xIiwKKwkidGFyZ2V0X3Nl c3Npb25fYXR0cnM9YW55IGNvbm5lY3RzIHRvIHRoZSBmaXJzdCBub2RlIiwKKwlzcWwgPT4gIlNF TEVDVCAnY29ubmVjdDEnIiwKKwlsb2dfbGlrZSA9PiBbcXIvc3RhdGVtZW50OiBTRUxFQ1QgJ2Nv bm5lY3QxJy9dKTsKKyRub2RlX3N0YW5kYnktPmNvbm5lY3Rfb2soCisJImhvc3Q9cGctbG9hZGJh bGFuY2V0ZXN0IHBvcnQ9JHBvcnQgdGFyZ2V0X3Nlc3Npb25fYXR0cnM9c3RhbmRieSBjaGVja19h bGxfYWRkcnM9MSIsCisJInRhcmdldF9zZXNzaW9uX2F0dHJzPXN0YW5kYnkgY29ubmVjdHMgdG8g dGhlIHRoaXJkIG5vZGUiLAorCXNxbCA9PiAiU0VMRUNUICdjb25uZWN0MSciLAorCWxvZ19saWtl ID0+IFtxci9zdGF0ZW1lbnQ6IFNFTEVDVCAnY29ubmVjdDEnL10pOworJG5vZGVfc3RhbmRieS0+ Y29ubmVjdF9vaygKKwkiaG9zdD1wZy1sb2FkYmFsYW5jZXRlc3QgcG9ydD0kcG9ydCB0YXJnZXRf c2Vzc2lvbl9hdHRycz1yZWFkLW9ubHkgY2hlY2tfYWxsX2FkZHJzPTEiLAorCSJ0YXJnZXRfc2Vz c2lvbl9hdHRycz1yZWFkLW9ubHkgY29ubmVjdHMgdG8gdGhlIHRoaXJkIG5vZGUiLAorCXNxbCA9 PiAiU0VMRUNUICdjb25uZWN0MSciLAorCWxvZ19saWtlID0+IFtxci9zdGF0ZW1lbnQ6IFNFTEVD VCAnY29ubmVjdDEnL10pOworCiskbm9kZV9wcmltYXJ5Mi0+c3RvcCgpOworJG5vZGVfc3RhbmRi eS0+c3RvcCgpOworCisKK2RvbmVfdGVzdGluZygpOwpkaWZmIC0tZ2l0IGEvc3JjL2ludGVyZmFj ZXMvbGlicHEvdC8wMDdfbG9hZF9iYWxhbmNlX2Ruc19jaGVja19hbGxfYWRkcnMucGwgYi9zcmMv aW50ZXJmYWNlcy9saWJwcS90LzAwN19sb2FkX2JhbGFuY2VfZG5zX2NoZWNrX2FsbF9hZGRycy5w bApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwMDAwMC4uZDM0MDU1OThlNjcKLS0t IC9kZXYvbnVsbAorKysgYi9zcmMvaW50ZXJmYWNlcy9saWJwcS90LzAwN19sb2FkX2JhbGFuY2Vf ZG5zX2NoZWNrX2FsbF9hZGRycy5wbApAQCAtMCwwICsxLDEyOCBAQAorIyBDb3B5cmlnaHQgKGMp IDIwMjMtMjAyNSwgUG9zdGdyZVNRTCBHbG9iYWwgRGV2ZWxvcG1lbnQgR3JvdXAKK3VzZSBzdHJp Y3Q7Cit1c2Ugd2FybmluZ3MgRkFUQUwgPT4gJ2FsbCc7Cit1c2UgQ29uZmlnOwordXNlIFBvc3Rn cmVTUUw6OlRlc3Q6OlV0aWxzOwordXNlIFBvc3RncmVTUUw6OlRlc3Q6OkNsdXN0ZXI7Cit1c2Ug VGVzdDo6TW9yZTsKKworaWYgKCEkRU5We1BHX1RFU1RfRVhUUkF9IHx8ICRFTlZ7UEdfVEVTVF9F WFRSQX0gIX4gL1xibG9hZF9iYWxhbmNlXGIvKQoreworCXBsYW4gc2tpcF9hbGwgPT4KKwkgICdQ b3RlbnRpYWxseSB1bnNhZmUgdGVzdCBsb2FkX2JhbGFuY2Ugbm90IGVuYWJsZWQgaW4gUEdfVEVT VF9FWFRSQSc7Cit9CisKK215ICRjYW5fYmluZF90b18xMjdfMF8wXzIgPQorICAkQ29uZmlne29z bmFtZX0gZXEgJ2xpbnV4JyB8fCAkUG9zdGdyZVNRTDo6VGVzdDo6VXRpbHM6OndpbmRvd3Nfb3M7 CisKKyMgQ2hlY2tzIGZvciB0aGUgcmVxdWlyZW1lbnRzIGZvciB0ZXN0aW5nIGxvYWQgYmFsYW5j aW5nIG1ldGhvZCAyCitpZiAoISRjYW5fYmluZF90b18xMjdfMF8wXzIpCit7CisJcGxhbiBza2lw X2FsbCA9PiAnbG9hZF9iYWxhbmNlIHRlc3Qgb25seSBzdXBwb3J0ZWQgb24gTGludXggYW5kIFdp bmRvd3MnOworfQorCitteSAkaG9zdHNfcGF0aDsKK2lmICgkd2luZG93c19vcykKK3sKKwkkaG9z dHNfcGF0aCA9ICdjOlxXaW5kb3dzXFN5c3RlbTMyXERyaXZlcnNcZXRjXGhvc3RzJzsKK30KK2Vs c2UKK3sKKwkkaG9zdHNfcGF0aCA9ICcvZXRjL2hvc3RzJzsKK30KKworbXkgJGhvc3RzX2NvbnRl bnQgPSBQb3N0Z3JlU1FMOjpUZXN0OjpVdGlsczo6c2x1cnBfZmlsZSgkaG9zdHNfcGF0aCk7CisK K215ICRob3N0c19jb3VudCA9ICgpID0KKyAgJGhvc3RzX2NvbnRlbnQgPX4gLzEyN1wuMFwuMFwu WzEtM10gcGctbG9hZGJhbGFuY2V0ZXN0L2c7CitpZiAoJGhvc3RzX2NvdW50ICE9IDMpCit7CisJ IyBIb3N0IGZpbGUgaXMgbm90IHByZXBhcmVkIGZvciB0aGlzIHRlc3QKKwlwbGFuIHNraXBfYWxs ID0+ICJob3N0cyBmaWxlIHdhcyBub3QgcHJlcGFyZWQgZm9yIEROUyBsb2FkIGJhbGFuY2UgdGVz dCI7Cit9CisKKyRQb3N0Z3JlU1FMOjpUZXN0OjpDbHVzdGVyOjp1c2VfdGNwID0gMTsKKyRQb3N0 Z3JlU1FMOjpUZXN0OjpDbHVzdGVyOjp0ZXN0X3BnaG9zdCA9ICcxMjcuMC4wLjEnOworCitteSAk cG9ydCA9IFBvc3RncmVTUUw6OlRlc3Q6OkNsdXN0ZXI6OmdldF9mcmVlX3BvcnQoKTsKK2xvY2Fs ICRUZXN0OjpCdWlsZGVyOjpMZXZlbCA9ICRUZXN0OjpCdWlsZGVyOjpMZXZlbCArIDE7CitteSAk bm9kZV9wcmltYXJ5MSA9IFBvc3RncmVTUUw6OlRlc3Q6OkNsdXN0ZXItPm5ldygicHJpbWFyeTEi LCBwb3J0ID0+ICRwb3J0KTsKKyRub2RlX3ByaW1hcnkxLT5pbml0KGhhc19hcmNoaXZpbmcgPT4g MSwgYWxsb3dzX3N0cmVhbWluZyA9PiAxKTsKKworIyBTdGFydCBpdAorJG5vZGVfcHJpbWFyeTEt PnN0YXJ0KCk7CisKKyMgVGFrZSBiYWNrdXAgZnJvbSB3aGljaCBhbGwgb3BlcmF0aW9ucyB3aWxs IGJlIHJ1bgorJG5vZGVfcHJpbWFyeTEtPmJhY2t1cCgibXlfYmFja3VwIik7CisKK215ICRub2Rl X3N0YW5kYnkgPSBQb3N0Z3JlU1FMOjpUZXN0OjpDbHVzdGVyLT5uZXcoInN0YW5kYnkiLCBwb3J0 ID0+ICRwb3J0LCBvd25faG9zdCA9PiAxKTsKKyRub2RlX3N0YW5kYnktPmluaXRfZnJvbV9iYWNr dXAoJG5vZGVfcHJpbWFyeTEsICJteV9iYWNrdXAiLAorCWhhc19yZXN0b3JpbmcgPT4gMSk7Cisk bm9kZV9zdGFuZGJ5LT5zdGFydCgpOworCitteSAkbm9kZV9wcmltYXJ5MiA9IFBvc3RncmVTUUw6 OlRlc3Q6OkNsdXN0ZXItPm5ldygibm9kZTEiLCBwb3J0ID0+ICRwb3J0LCBvd25faG9zdCA9PiAx KTsKKyRub2RlX3ByaW1hcnkyLT5pbml0KCk7Ciskbm9kZV9wcmltYXJ5Mi0+c3RhcnQoKTsKK3N1 YiB0ZXN0X3RhcmdldF9zZXNzaW9uX2F0dHIgeworCW15ICR0YXJnZXRfc2Vzc2lvbl9hdHRycyA9 IHNoaWZ0OworCW15ICR0ZXN0X251bSA9IHNoaWZ0OworCW15ICRwcmltYXJ5MV9leHBlY3RfdHJh ZmZpYyA9IHNoaWZ0OworCW15ICRzdGFuZGJ5X2V4cGVlY3RfdHJhZmZpYyA9IHNoaWZ0OworCW15 ICRwcmltYXJ5Ml9leHBlY3RfdHJhZmZpYyA9IHNoaWZ0OworCSMgU3RhdGlzdGljYWxseSB0aGUg Zm9sbG93aW5nIGxvb3Agd2l0aCBsb2FkX2JhbGFuY2VfaG9zdHM9cmFuZG9tIHdpbGwgYWxtb3N0 CisJIyBjZXJ0YWlubHkgY29ubmVjdCBhdCBsZWFzdCBvbmNlIHRvIGVhY2ggb2YgdGhlIG5vZGVz LiBUaGUgY2hhbmNlIG9mIHRoYXQgbm90CisJIyBoYXBwZW5pbmcgaXMgc28gc21hbGwgdGhhdCBp dCdzIG5lZ2xpZ2libGU6ICgyLzMpXjUwID0gMS41NjgzMjg1NWUtOQorCWZvcmVhY2ggbXkgJGkg KDEgLi4gNTApCisJeworCQkkbm9kZV9wcmltYXJ5MS0+Y29ubmVjdF9vaygKKwkJCSJob3N0PXBn LWxvYWRiYWxhbmNldGVzdCBwb3J0PSRwb3J0IGxvYWRfYmFsYW5jZV9ob3N0cz1yYW5kb20gdGFy Z2V0X3Nlc3Npb25fYXR0cnM9JHt0YXJnZXRfc2Vzc2lvbl9hdHRyc30gY2hlY2tfYWxsX2FkZHJz PTEiLAorCQkJInJlcGVhdGVkIGNvbm5lY3Rpb25zIHdpdGggcmFuZG9tIGxvYWQgYmFsYW5jaW5n IiwKKwkJCXNxbCA9PiAiU0VMRUNUICdjb25uZWN0JHt0ZXN0X251bX0nIik7CisJfQorCW15ICRu b2RlX3ByaW1hcnkxX29jY3VycmVuY2VzID0gKCkgPQorCSAgJG5vZGVfcHJpbWFyeTEtPmxvZ19j b250ZW50KCkgPX4gL3N0YXRlbWVudDogU0VMRUNUICdjb25uZWN0JHt0ZXN0X251bX0nL2c7CisJ bXkgJG5vZGVfc3RhbmRieV9vY2N1cnJlbmNlcyA9ICgpID0KKwkgICRub2RlX3N0YW5kYnktPmxv Z19jb250ZW50KCkgPX4gL3N0YXRlbWVudDogU0VMRUNUICdjb25uZWN0JHt0ZXN0X251bX0nL2c7 CisJbXkgJG5vZGVfcHJpbWFyeTJfb2NjdXJyZW5jZXMgPSAoKSA9CisJICAkbm9kZV9wcmltYXJ5 Mi0+bG9nX2NvbnRlbnQoKSA9fiAvc3RhdGVtZW50OiBTRUxFQ1QgJ2Nvbm5lY3Qke3Rlc3RfbnVt fScvZzsKKworCW15ICR0b3RhbF9vY2N1cnJlbmNlcyA9CisJICAkbm9kZV9wcmltYXJ5MV9vY2N1 cnJlbmNlcyArICRub2RlX3N0YW5kYnlfb2NjdXJyZW5jZXMgKyAkbm9kZV9wcmltYXJ5Ml9vY2N1 cnJlbmNlczsKKworCWlmICgkcHJpbWFyeTFfZXhwZWN0X3RyYWZmaWMgPT0gMSkgeworCQlvaygk bm9kZV9wcmltYXJ5MV9vY2N1cnJlbmNlcyA+IDAsICJyZWNlaXZlZCBhdCBsZWFzdCBvbmUgY29u bmVjdGlvbiBvbiBub2RlMSIpOworCX1lbHNleworCQlvaygkbm9kZV9wcmltYXJ5MV9vY2N1cnJl bmNlcyA9PSAwLCAicmVjZWl2ZWQgYXQgbGVhc3Qgb25lIGNvbm5lY3Rpb24gb24gbm9kZTEiKTsK Kwl9CisJaWYgKCRzdGFuZGJ5X2V4cGVlY3RfdHJhZmZpYyA9PSAxKSB7CisJCW9rKCRub2RlX3N0 YW5kYnlfb2NjdXJyZW5jZXMgPiAwLCAicmVjZWl2ZWQgYXQgbGVhc3Qgb25lIGNvbm5lY3Rpb24g b24gbm9kZTEiKTsKKwl9ZWxzZXsKKwkJb2soJG5vZGVfc3RhbmRieV9vY2N1cnJlbmNlcyA9PSAw LCAicmVjZWl2ZWQgYXQgbGVhc3Qgb25lIGNvbm5lY3Rpb24gb24gbm9kZTEiKTsKKwl9CisKKwlp ZiAoJHByaW1hcnkyX2V4cGVjdF90cmFmZmljID09IDEpIHsKKwkJb2soJG5vZGVfcHJpbWFyeTJf b2NjdXJyZW5jZXMgPiAwLCAicmVjZWl2ZWQgYXQgbGVhc3Qgb25lIGNvbm5lY3Rpb24gb24gbm9k ZTEiKTsKKwl9ZWxzZXsKKwkJb2soJG5vZGVfcHJpbWFyeTJfb2NjdXJyZW5jZXMgPT0gMCwgInJl Y2VpdmVkIGF0IGxlYXN0IG9uZSBjb25uZWN0aW9uIG9uIG5vZGUxIik7CisJfQorCisJb2soJHRv dGFsX29jY3VycmVuY2VzID09IDUwLCAicmVjZWl2ZWQgNTAgY29ubmVjdGlvbnMgYWNyb3NzIGFs bCBub2RlcyIpOworfQorCit0ZXN0X3RhcmdldF9zZXNzaW9uX2F0dHIoJ2FueScsCisJMSwgMSwg MSwgMSk7Cit0ZXN0X3RhcmdldF9zZXNzaW9uX2F0dHIoJ3JlYWQtb25seScsCisJMiwgMCwgMSwg MCk7Cit0ZXN0X3RhcmdldF9zZXNzaW9uX2F0dHIoJ3JlYWQtd3JpdGUnLAorCTMsIDEsIDAsIDEp OwordGVzdF90YXJnZXRfc2Vzc2lvbl9hdHRyKCdwcmltYXJ5JywKKwk0LCAxLCAwLCAxKTsKK3Rl c3RfdGFyZ2V0X3Nlc3Npb25fYXR0cignc3RhbmRieScsCisJNSwgMCwgMSwgMCk7CisKKworJG5v ZGVfcHJpbWFyeTEtPnN0b3AoKTsKKyRub2RlX3ByaW1hcnkyLT5zdG9wKCk7Ciskbm9kZV9zdGFu ZGJ5LT5zdG9wKCk7CisKK2RvbmVfdGVzdGluZygpOwotLSAKMi40Ny4yCgo= --0000000000000d42a8062ee524f3--