Re: Avoid full GIN index scan when possible

Alexander Korotkov <[email protected]> Wed, 15 Jan 2020 01:47:30 +0300
Newsgroups gmane.comp.db.postgresql.devel.general
Message-ID <CAPpHfdt8vCETJy9xMAvv1QQbOnNUfMfY8-pg+XGqJ-VWq4TNmg@mail.gmail.com>
--0000000000002f7239059c21615d
Content-Type: text/plain; charset="UTF-8"

Hi!

On Tue, Jan 14, 2020 at 9:43 PM Tom Lane <[email protected]> wrote:
> Alexander Korotkov <[email protected]> writes:
> > Updated patch is attached.  It contains more comments as well as commit message.
>
> I reviewed this a little bit.  I agree this seems way more straightforward
> than the patches we've been considering so far.  I wasn't too happy with
> the state of the comments, so I rewrote them a bit in the attached v13.

Thank you!

> One thing I'm still not happy about is the comment in
> collectMatchesForHeapRow.  v12 failed to touch that at all, so I tried to
> fill it in, but I'm not sure if my explanation is good.

I've tried to rephrase this comment making it better from my point of
view.  It's hard for me to be sure about this, since I'm not native
English speaker.  I'd like you to take a look on it.

> Also, if we know
> that excludeOnly keys are going to be ignored, can we save any work in
> the main loop of that function?

It doesn't look so for me.  We still need to collect matches for
consistent function call afterwards.  We may skip calling consistent
function for excludeOnly keys by forcing a recheck.  But that's not
going to be a plain win.

I thought about different optimization.  We now check for at least one
matching entry.  Can we check for at least one *required* entry?  It
seems we can save some consistent function calls.

> The test cases needed some work too.  Notably, some of the places where
> you tried to use EXPLAIN ANALYZE are unportable because they expose "Heap
> Blocks" counts that are not stable.  (I checked the patch on a 32-bit
> machine and indeed some of these failed.)  While it'd be possible to work
> around that by filtering the EXPLAIN output, that would not be any simpler
> or faster than our traditional style of just doing a plain EXPLAIN and a
> separate execution.

Thanks!

> It troubles me a bit as well that the test cases don't really expose
> any difference between patched and unpatched code --- I checked, and
> they "passed" without applying any of the code changes.  Maybe there's
> not much to be done about that, since after all this is an optimization
> that's not supposed to change any query results.

Yep, it seems like we can't do much in this field unless we're going
to expose too much internals at user level.

I also had concerns about how excludeOnly keys work with lossy pages.
I didn't find exact error.  But I've added code, which skips
excludeOnly keys checks for lossy pages.  They aren't going to exclude
any lossy page anyway.  So, we can save some resources by skipping
this.

------
Alexander Korotkov
Postgres Professional: http://www.postgrespro.com
The Russian Postgres Company

--0000000000002f7239059c21615d
Content-Type: application/octet-stream; 
	name="0001-Avoid-GIN-full-scan-for-empty-ALL-keys-v14.patch"
Content-Disposition: attachment; 
	filename="0001-Avoid-GIN-full-scan-for-empty-ALL-keys-v14.patch"
Content-Transfer-Encoding: base64
Content-ID: <f_k5egv54s1>
X-Attachment-Id: f_k5egv54s1

Y29tbWl0IGFlMDI1YmRiZDVhNDU5MmIxZjhiNjc2M2EzMTRkNTBmMTk2Y2E4ZWUKQXV0aG9yOiBB
bGV4YW5kZXIgS29yb3Rrb3YgPGFrb3JvdGtvdkBwb3N0Z3Jlc3FsLm9yZz4KRGF0ZTogICBXZWQg
SmFuIDE1IDAwOjE4OjMxIDIwMjAgKzAzMDAKCiAgICBBdm9pZCBmdWxsIHNjYW4gb2YgR0lOIGlu
ZGV4ZXMgd2hlbiBwb3NzaWJsZQogICAgCiAgICBUaGUgc3RyYXRlZ3kgb2YgR0lOIGluZGV4IHNj
YW4gaXMgZHJpdmVuIGJ5IG9wY2xhc3Mtc3BlY2lmaWMgZXh0cmFjdF9xdWVyeQogICAgbWV0aG9k
LiAgVGhpcyBtZXRob2QgdGhhdCBuZWVkZWQgc2VhcmNoIG1vZGUgaXMgR0lOX1NFQVJDSF9NT0RF
X0FMTC4gIFRoaXMKICAgIG1vZGUgbWVhbnMgdGhhdCBtYXRjaGluZyB0dXBsZSBtYXkgY29udGFp
biBub25lIG9mIGV4dHJhY3RlZCBlbnRyaWVzLiAgU2ltcGxlCiAgICBleGFtcGxlIGlzICchdGVy
bScgdHNxdWVyeSwgd2hpY2ggZG9lc24ndCBuZWVkIGFueSB0ZXJtIHRvIGV4aXN0IGluIG1hdGNo
aW5nCiAgICB0c3ZlY3Rvci4KICAgIAogICAgSW4gb3JkZXIgdG8gaGFuZGxlIHN1Y2ggc2NhbiBr
ZXkgR0lOIGNhbGN1bGF0ZXMgdmlydHVhbCBlbnRyeSwgd2hpY2ggY29udGFpbnMKICAgIGFsbCBU
SURzIG9mIGFsbCBlbnRyaWVzIG9mIGF0dHJpYnV0ZS4gIEluIGZhY3QgdGhpcyBpcyBmdWxsIHNj
YW4gb2YgaW5kZXgKICAgIGF0dHJpYnV0ZS4gIEFuZCB0eXBpY2FsbHkgdGhpcyBpcyB2ZXJ5IHNs
b3csIGJ1dCBhbGxvd3MgdG8gaGFuZGxlIHNvbWUgcXVlcmllcwogICAgY29ycmVjdGx5IGluIEdJ
Ti4gIEhvd2V2ZXIsIGN1cnJlbnQgYWxnb3JpdGhtIGNhbGN1bGF0ZSBzdWNoIHZpcnR1YWwgZW50
cnkgZm9yCiAgICBlYWNoIEdJTl9TRUFSQ0hfTU9ERV9BTEwgc2NhbiBrZXkgZXZlbiBpZiB0aGV5
IGFyZSBtdWx0aXBsZSBmb3IgdGhlIHNhbWUKICAgIGF0dHJpYnV0ZS4gIFRoaXMgaXMgY2xlYXJs
eSBub3Qgb3B0aW1hbC4KICAgIAogICAgVGhpcyBjb21taXQgaW1wcm92ZXMgdGhlIHNpdHVhdGlv
biBieSBpbnRvZHVjdGlvbiBvZiAiZXhjbHVkZSBvbmx5IiBzY2FuIGtleXMuCiAgICBTdWNoIHNj
YW4ga2V5cyBhcmUgbm90IGNhcGFibGUgdG8gcmV0dXJuIHNldCBvZiBtYXRjaGluZyBUSURzLiAg
SW5zdGVhZCwgdGhleQogICAgYXJlIGNhcGFibGUgb25seSB0byBmaWx0ZXIgVElEcyBwcm9kdWNl
ZCBieSBub3JtYWwgc2NhbiBrZXlzLiAgVGhlcmVmb3JlLAogICAgZWFjaCBhdHRyaWJ1dGUgc2hv
dWxkIGNvbnRhaW4gYXQgbGVhc3Qgb25lIG5vcm1hbCBzY2FuIGtleSwgd2hpbGUgcmVzdCBvZiB0
aGVtCiAgICBtYXkgYmUgImV4Y2x1ZGUgb25seSIgaWYgc2VhcmNoIG1vZGUgaXMgR0lOX1NFQVJD
SF9NT0RFX0FMTC4KICAgIAogICAgVGhlIHNhbWUgb3B0aW1pemF0aW9uIG1pZ2h0IGJlIGFwcGxp
ZWQgdG8gdGhlIHdob2xlIHNjYW4sIG5vdCBwZXItYXR0cmlidXRlLgogICAgQnV0IHRoYXQgbGVh
ZHMgdG8gTlVMTCB2YWx1ZXMgZWxpbWluYXRpb24gcHJvYmxlbS4gIFRoZXJlIGlzIHRyYWRlb2Zm
IGJldHdlZW4KICAgIG11bHRpcGxlIHBvc3NpYmxlIHdheXMgdG8gZG8gdGhpcy4gIFdlIHByb2Jh
Ymx5IHdhbnQgdG8gZG8gdGhpcyBsYXRlciB1c2luZwogICAgc29tZSBjb3N0LWJhc2VkIGRlY2lz
aW9uIGFsZ29yaXRobS4KICAgIAogICAgRGlzY3Vzc2lvbjogaHR0cHM6Ly9wb3N0Z3IuZXMvbS9D
QU9CYVVfWUdQNS1CRXQ1Q2MwJTNEek12ZTkydm9jUHpEJTJCWGlaZ2laczFralkwY2olM0RYQmcl
NDBtYWlsLmdtYWlsLmNvbQogICAgQXV0aG9yOiBOaWtpdGEgR2x1a2hvdiwgQWxleGFuZGVyIEtv
cm90a292LCBUb20gTGFuZSwgSnVsaWVuIFJvdWhhdWQKICAgIFJldmlld2VkLWJ5OiBKdWxpZW4g
Um91aGF1ZCwgVG9tYXMgVm9uZHJhLCBUb20gTGFuZQoKZGlmZiAtLWdpdCBhL2NvbnRyaWIvcGdf
dHJnbS9leHBlY3RlZC9wZ190cmdtLm91dCBiL2NvbnRyaWIvcGdfdHJnbS9leHBlY3RlZC9wZ190
cmdtLm91dAppbmRleCBiM2U3MDlmNDk2Mi4uOTE1OTZmODY0NTggMTAwNjQ0Ci0tLSBhL2NvbnRy
aWIvcGdfdHJnbS9leHBlY3RlZC9wZ190cmdtLm91dAorKysgYi9jb250cmliL3BnX3RyZ20vZXhw
ZWN0ZWQvcGdfdHJnbS5vdXQKQEAgLTM0OTgsNiArMzQ5OCwxMDcgQEAgc2VsZWN0IGNvdW50KCop
IGZyb20gdGVzdF90cmdtIHdoZXJlIHQgfiAnW3F3ZXJ0eV17Mn0tP1txd2VydHldezJ9JzsKICAg
MTAwMAogKDEgcm93KQogCistLSBjaGVjayBoYW5kbGluZyBvZiBpbmRleHF1YWxzIHRoYXQgZ2Vu
ZXJhdGUgbm8gc2VhcmNoYWJsZSBjb25kaXRpb25zCitleHBsYWluIChjb3N0cyBvZmYpCitzZWxl
Y3QgY291bnQoKikgZnJvbSB0ZXN0X3RyZ20gd2hlcmUgdCBsaWtlICclOTklJyBhbmQgdCBsaWtl
ICclcXdlcnR5JSc7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBRVUVSWSBQTEFO
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0K
KyBBZ2dyZWdhdGUKKyAgIC0+ICBCaXRtYXAgSGVhcCBTY2FuIG9uIHRlc3RfdHJnbQorICAgICAg
ICAgUmVjaGVjayBDb25kOiAoKHQgfn4gJyU5OSUnOjp0ZXh0KSBBTkQgKHQgfn4gJyVxd2VydHkl
Jzo6dGV4dCkpCisgICAgICAgICAtPiAgQml0bWFwIEluZGV4IFNjYW4gb24gdHJnbV9pZHgKKyAg
ICAgICAgICAgICAgIEluZGV4IENvbmQ6ICgodCB+fiAnJTk5JSc6OnRleHQpIEFORCAodCB+fiAn
JXF3ZXJ0eSUnOjp0ZXh0KSkKKyg1IHJvd3MpCisKK3NlbGVjdCBjb3VudCgqKSBmcm9tIHRlc3Rf
dHJnbSB3aGVyZSB0IGxpa2UgJyU5OSUnIGFuZCB0IGxpa2UgJyVxd2VydHklJzsKKyBjb3VudCAK
Ky0tLS0tLS0KKyAgICAxOQorKDEgcm93KQorCitleHBsYWluIChjb3N0cyBvZmYpCitzZWxlY3Qg
Y291bnQoKikgZnJvbSB0ZXN0X3RyZ20gd2hlcmUgdCBsaWtlICclOTklJyBhbmQgdCBsaWtlICcl
cXclJzsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBRVUVSWSBQTEFOICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyBBZ2dyZWdhdGUKKyAg
IC0+ICBCaXRtYXAgSGVhcCBTY2FuIG9uIHRlc3RfdHJnbQorICAgICAgICAgUmVjaGVjayBDb25k
OiAoKHQgfn4gJyU5OSUnOjp0ZXh0KSBBTkQgKHQgfn4gJyVxdyUnOjp0ZXh0KSkKKyAgICAgICAg
IC0+ICBCaXRtYXAgSW5kZXggU2NhbiBvbiB0cmdtX2lkeAorICAgICAgICAgICAgICAgSW5kZXgg
Q29uZDogKCh0IH5+ICclOTklJzo6dGV4dCkgQU5EICh0IH5+ICclcXclJzo6dGV4dCkpCisoNSBy
b3dzKQorCitzZWxlY3QgY291bnQoKikgZnJvbSB0ZXN0X3RyZ20gd2hlcmUgdCBsaWtlICclOTkl
JyBhbmQgdCBsaWtlICclcXclJzsKKyBjb3VudCAKKy0tLS0tLS0KKyAgICAxOQorKDEgcm93KQor
CistLSBlbnN1cmUgdGhhdCBwZW5kaW5nLWxpc3QgaXRlbXMgYXJlIGhhbmRsZWQgY29ycmVjdGx5
LCB0b28KK2NyZWF0ZSB0ZW1wIHRhYmxlIHRfdGVzdF90cmdtKHQgdGV4dCBDT0xMQVRFICJDIik7
CitjcmVhdGUgaW5kZXggdF90cmdtX2lkeCBvbiB0X3Rlc3RfdHJnbSB1c2luZyBnaW4gKHQgZ2lu
X3RyZ21fb3BzKTsKK2luc2VydCBpbnRvIHRfdGVzdF90cmdtIHZhbHVlcyAoJ3F3ZXJ0eTk5Jyks
ICgncXdlcnR5MDEnKTsKK2V4cGxhaW4gKGNvc3RzIG9mZikKK3NlbGVjdCBjb3VudCgqKSBmcm9t
IHRfdGVzdF90cmdtIHdoZXJlIHQgbGlrZSAnJTk5JScgYW5kIHQgbGlrZSAnJXF3ZXJ0eSUnOwor
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUVVFUlkgUExBTiAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgQWdncmVnYXRlCisg
ICAtPiAgQml0bWFwIEhlYXAgU2NhbiBvbiB0X3Rlc3RfdHJnbQorICAgICAgICAgUmVjaGVjayBD
b25kOiAoKHQgfn4gJyU5OSUnOjp0ZXh0KSBBTkQgKHQgfn4gJyVxd2VydHklJzo6dGV4dCkpCisg
ICAgICAgICAtPiAgQml0bWFwIEluZGV4IFNjYW4gb24gdF90cmdtX2lkeAorICAgICAgICAgICAg
ICAgSW5kZXggQ29uZDogKCh0IH5+ICclOTklJzo6dGV4dCkgQU5EICh0IH5+ICclcXdlcnR5JSc6
OnRleHQpKQorKDUgcm93cykKKworc2VsZWN0IGNvdW50KCopIGZyb20gdF90ZXN0X3RyZ20gd2hl
cmUgdCBsaWtlICclOTklJyBhbmQgdCBsaWtlICclcXdlcnR5JSc7CisgY291bnQgCistLS0tLS0t
CisgICAgIDEKKygxIHJvdykKKworZXhwbGFpbiAoY29zdHMgb2ZmKQorc2VsZWN0IGNvdW50KCop
IGZyb20gdF90ZXN0X3RyZ20gd2hlcmUgdCBsaWtlICclOTklJyBhbmQgdCBsaWtlICclcXclJzsK
KyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBRVUVSWSBQTEFOICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyBBZ2dyZWdhdGUKKyAgIC0+ICBC
aXRtYXAgSGVhcCBTY2FuIG9uIHRfdGVzdF90cmdtCisgICAgICAgICBSZWNoZWNrIENvbmQ6ICgo
dCB+fiAnJTk5JSc6OnRleHQpIEFORCAodCB+fiAnJXF3JSc6OnRleHQpKQorICAgICAgICAgLT4g
IEJpdG1hcCBJbmRleCBTY2FuIG9uIHRfdHJnbV9pZHgKKyAgICAgICAgICAgICAgIEluZGV4IENv
bmQ6ICgodCB+fiAnJTk5JSc6OnRleHQpIEFORCAodCB+fiAnJXF3JSc6OnRleHQpKQorKDUgcm93
cykKKworc2VsZWN0IGNvdW50KCopIGZyb20gdF90ZXN0X3RyZ20gd2hlcmUgdCBsaWtlICclOTkl
JyBhbmQgdCBsaWtlICclcXclJzsKKyBjb3VudCAKKy0tLS0tLS0KKyAgICAgMQorKDEgcm93KQor
CistLSBydW4gdGhlIHNhbWUgcXVlcmllcyB3aXRoIHNlcXVlbnRpYWwgc2NhbiB0byBjaGVjayB0
aGUgcmVzdWx0cworc2V0IGVuYWJsZV9iaXRtYXBzY2FuPW9mZjsKK3NldCBlbmFibGVfc2Vxc2Nh
bj1vbjsKK3NlbGVjdCBjb3VudCgqKSBmcm9tIHRlc3RfdHJnbSB3aGVyZSB0IGxpa2UgJyU5OSUn
IGFuZCB0IGxpa2UgJyVxd2VydHklJzsKKyBjb3VudCAKKy0tLS0tLS0KKyAgICAxOQorKDEgcm93
KQorCitzZWxlY3QgY291bnQoKikgZnJvbSB0ZXN0X3RyZ20gd2hlcmUgdCBsaWtlICclOTklJyBh
bmQgdCBsaWtlICclcXclJzsKKyBjb3VudCAKKy0tLS0tLS0KKyAgICAxOQorKDEgcm93KQorCitz
ZWxlY3QgY291bnQoKikgZnJvbSB0X3Rlc3RfdHJnbSB3aGVyZSB0IGxpa2UgJyU5OSUnIGFuZCB0
IGxpa2UgJyVxd2VydHklJzsKKyBjb3VudCAKKy0tLS0tLS0KKyAgICAgMQorKDEgcm93KQorCitz
ZWxlY3QgY291bnQoKikgZnJvbSB0X3Rlc3RfdHJnbSB3aGVyZSB0IGxpa2UgJyU5OSUnIGFuZCB0
IGxpa2UgJyVxdyUnOworIGNvdW50IAorLS0tLS0tLQorICAgICAxCisoMSByb3cpCisKK3Jlc2V0
IGVuYWJsZV9iaXRtYXBzY2FuOwogY3JlYXRlIHRhYmxlIHRlc3QyKHQgdGV4dCBDT0xMQVRFICJD
Iik7CiBpbnNlcnQgaW50byB0ZXN0MiB2YWx1ZXMgKCdhYmNkZWYnKTsKIGluc2VydCBpbnRvIHRl
c3QyIHZhbHVlcyAoJ3F1YXJrJyk7CmRpZmYgLS1naXQgYS9jb250cmliL3BnX3RyZ20vc3FsL3Bn
X3RyZ20uc3FsIGIvY29udHJpYi9wZ190cmdtL3NxbC9wZ190cmdtLnNxbAppbmRleCAwODQ1OWU2
NGMzMC4uMjAxOWQxZjZiZTggMTAwNjQ0Ci0tLSBhL2NvbnRyaWIvcGdfdHJnbS9zcWwvcGdfdHJn
bS5zcWwKKysrIGIvY29udHJpYi9wZ190cmdtL3NxbC9wZ190cmdtLnNxbApAQCAtNTUsNiArNTUs
MzMgQEAgc2VsZWN0IHQsc2ltaWxhcml0eSh0LCdnd2VydHl1MDk4OCcpIGFzIHNtbCBmcm9tIHRl
c3RfdHJnbSB3aGVyZSB0ICUgJ2d3ZXJ0eXUwOTgKIHNlbGVjdCB0LHNpbWlsYXJpdHkodCwnZ3dl
cnR5dTE5ODgnKSBhcyBzbWwgZnJvbSB0ZXN0X3RyZ20gd2hlcmUgdCAlICdnd2VydHl1MTk4OCcg
b3JkZXIgYnkgc21sIGRlc2MsIHQ7CiBzZWxlY3QgY291bnQoKikgZnJvbSB0ZXN0X3RyZ20gd2hl
cmUgdCB+ICdbcXdlcnR5XXsyfS0/W3F3ZXJ0eV17Mn0nOwogCistLSBjaGVjayBoYW5kbGluZyBv
ZiBpbmRleHF1YWxzIHRoYXQgZ2VuZXJhdGUgbm8gc2VhcmNoYWJsZSBjb25kaXRpb25zCitleHBs
YWluIChjb3N0cyBvZmYpCitzZWxlY3QgY291bnQoKikgZnJvbSB0ZXN0X3RyZ20gd2hlcmUgdCBs
aWtlICclOTklJyBhbmQgdCBsaWtlICclcXdlcnR5JSc7CitzZWxlY3QgY291bnQoKikgZnJvbSB0
ZXN0X3RyZ20gd2hlcmUgdCBsaWtlICclOTklJyBhbmQgdCBsaWtlICclcXdlcnR5JSc7CitleHBs
YWluIChjb3N0cyBvZmYpCitzZWxlY3QgY291bnQoKikgZnJvbSB0ZXN0X3RyZ20gd2hlcmUgdCBs
aWtlICclOTklJyBhbmQgdCBsaWtlICclcXclJzsKK3NlbGVjdCBjb3VudCgqKSBmcm9tIHRlc3Rf
dHJnbSB3aGVyZSB0IGxpa2UgJyU5OSUnIGFuZCB0IGxpa2UgJyVxdyUnOworLS0gZW5zdXJlIHRo
YXQgcGVuZGluZy1saXN0IGl0ZW1zIGFyZSBoYW5kbGVkIGNvcnJlY3RseSwgdG9vCitjcmVhdGUg
dGVtcCB0YWJsZSB0X3Rlc3RfdHJnbSh0IHRleHQgQ09MTEFURSAiQyIpOworY3JlYXRlIGluZGV4
IHRfdHJnbV9pZHggb24gdF90ZXN0X3RyZ20gdXNpbmcgZ2luICh0IGdpbl90cmdtX29wcyk7Citp
bnNlcnQgaW50byB0X3Rlc3RfdHJnbSB2YWx1ZXMgKCdxd2VydHk5OScpLCAoJ3F3ZXJ0eTAxJyk7
CitleHBsYWluIChjb3N0cyBvZmYpCitzZWxlY3QgY291bnQoKikgZnJvbSB0X3Rlc3RfdHJnbSB3
aGVyZSB0IGxpa2UgJyU5OSUnIGFuZCB0IGxpa2UgJyVxd2VydHklJzsKK3NlbGVjdCBjb3VudCgq
KSBmcm9tIHRfdGVzdF90cmdtIHdoZXJlIHQgbGlrZSAnJTk5JScgYW5kIHQgbGlrZSAnJXF3ZXJ0
eSUnOworZXhwbGFpbiAoY29zdHMgb2ZmKQorc2VsZWN0IGNvdW50KCopIGZyb20gdF90ZXN0X3Ry
Z20gd2hlcmUgdCBsaWtlICclOTklJyBhbmQgdCBsaWtlICclcXclJzsKK3NlbGVjdCBjb3VudCgq
KSBmcm9tIHRfdGVzdF90cmdtIHdoZXJlIHQgbGlrZSAnJTk5JScgYW5kIHQgbGlrZSAnJXF3JSc7
CisKKy0tIHJ1biB0aGUgc2FtZSBxdWVyaWVzIHdpdGggc2VxdWVudGlhbCBzY2FuIHRvIGNoZWNr
IHRoZSByZXN1bHRzCitzZXQgZW5hYmxlX2JpdG1hcHNjYW49b2ZmOworc2V0IGVuYWJsZV9zZXFz
Y2FuPW9uOworc2VsZWN0IGNvdW50KCopIGZyb20gdGVzdF90cmdtIHdoZXJlIHQgbGlrZSAnJTk5
JScgYW5kIHQgbGlrZSAnJXF3ZXJ0eSUnOworc2VsZWN0IGNvdW50KCopIGZyb20gdGVzdF90cmdt
IHdoZXJlIHQgbGlrZSAnJTk5JScgYW5kIHQgbGlrZSAnJXF3JSc7CitzZWxlY3QgY291bnQoKikg
ZnJvbSB0X3Rlc3RfdHJnbSB3aGVyZSB0IGxpa2UgJyU5OSUnIGFuZCB0IGxpa2UgJyVxd2VydHkl
JzsKK3NlbGVjdCBjb3VudCgqKSBmcm9tIHRfdGVzdF90cmdtIHdoZXJlIHQgbGlrZSAnJTk5JScg
YW5kIHQgbGlrZSAnJXF3JSc7CityZXNldCBlbmFibGVfYml0bWFwc2NhbjsKKwogY3JlYXRlIHRh
YmxlIHRlc3QyKHQgdGV4dCBDT0xMQVRFICJDIik7CiBpbnNlcnQgaW50byB0ZXN0MiB2YWx1ZXMg
KCdhYmNkZWYnKTsKIGluc2VydCBpbnRvIHRlc3QyIHZhbHVlcyAoJ3F1YXJrJyk7CmRpZmYgLS1n
aXQgYS9zcmMvYmFja2VuZC9hY2Nlc3MvZ2luL2dpbmdldC5jIGIvc3JjL2JhY2tlbmQvYWNjZXNz
L2dpbi9naW5nZXQuYwppbmRleCA3YWU0ZWYwNWMyZi4uZjM2ZTY3NGIyOTAgMTAwNjQ0Ci0tLSBh
L3NyYy9iYWNrZW5kL2FjY2Vzcy9naW4vZ2luZ2V0LmMKKysrIGIvc3JjL2JhY2tlbmQvYWNjZXNz
L2dpbi9naW5nZXQuYwpAQCAtNTI4LDggKzUyOCwyMCBAQCBzdGFydFNjYW5LZXkoR2luU3RhdGUg
KmdpbnN0YXRlLCBHaW5TY2FuT3BhcXVlIHNvLCBHaW5TY2FuS2V5IGtleSkKIAkgKiBvcmRlciwg
dW50aWwgdGhlIGNvbnNpc3RlbnQgZnVuY3Rpb24gc2F5cyB0aGF0IG5vbmUgb2YgdGhlIHJlbWFp
bmluZwogCSAqIGVudHJpZXMgY2FuIGZvcm0gYSBtYXRjaCwgd2l0aG91dCBhbnkgaXRlbXMgZnJv
bSB0aGUgcmVxdWlyZWQgc2V0LiBUaGUKIAkgKiByZXN0IGdvIHRvIHRoZSBhZGRpdGlvbmFsIHNl
dC4KKwkgKgorCSAqIEV4Y2x1ZGUtb25seSBzY2FuIGtleXMgYXJlIGtub3duIHRvIGhhdmUgbm8g
cmVxdWlyZWQgZW50cmllcy4KIAkgKi8KLQlpZiAoa2V5LT5uZW50cmllcyA+IDEpCisJaWYgKGtl
eS0+ZXhjbHVkZU9ubHkpCisJeworCQlNZW1vcnlDb250ZXh0U3dpdGNoVG8oc28tPmtleUN0eCk7
CisKKwkJa2V5LT5ucmVxdWlyZWQgPSAwOworCQlrZXktPm5hZGRpdGlvbmFsID0ga2V5LT5uZW50
cmllczsKKwkJa2V5LT5hZGRpdGlvbmFsRW50cmllcyA9IHBhbGxvYyhrZXktPm5hZGRpdGlvbmFs
ICogc2l6ZW9mKEdpblNjYW5FbnRyeSkpOworCQlmb3IgKGkgPSAwOyBpIDwga2V5LT5uYWRkaXRp
b25hbDsgaSsrKQorCQkJa2V5LT5hZGRpdGlvbmFsRW50cmllc1tpXSA9IGtleS0+c2NhbkVudHJ5
W2ldOworCX0KKwllbHNlIGlmIChrZXktPm5lbnRyaWVzID4gMSkKIAl7CiAJCU1lbW9yeUNvbnRl
eHRTd2l0Y2hUbyhzby0+dGVtcEN0eCk7CiAKQEAgLTEwMDgsMzcgKzEwMjAsNTIgQEAga2V5R2V0
SXRlbShHaW5TdGF0ZSAqZ2luc3RhdGUsIE1lbW9yeUNvbnRleHQgdGVtcEN0eCwgR2luU2Nhbktl
eSBrZXksCiAJCQltaW5JdGVtID0gZW50cnktPmN1ckl0ZW07CiAJfQogCi0JaWYgKGFsbEZpbmlz
aGVkKQorCWlmIChhbGxGaW5pc2hlZCAmJiAha2V5LT5leGNsdWRlT25seSkKIAl7CiAJCS8qIGFs
bCBlbnRyaWVzIGFyZSBmaW5pc2hlZCAqLwogCQlrZXktPmlzRmluaXNoZWQgPSB0cnVlOwogCQly
ZXR1cm47CiAJfQogCi0JLyoKLQkgKiBPaywgd2Ugbm93IGtub3cgdGhhdCB0aGVyZSBhcmUgbm8g
bWF0Y2hlcyA8IG1pbkl0ZW0uCi0JICoKLQkgKiBJZiBtaW5JdGVtIGlzIGxvc3N5LCBpdCBtZWFu
cyB0aGF0IHRoZXJlIHdlcmUgbm8gZXhhY3QgaXRlbXMgb24gdGhlCi0JICogcGFnZSBhbW9uZyBy
ZXF1aXJlZEVudHJpZXMsIGJlY2F1c2UgbG9zc3kgcG9pbnRlcnMgc29ydCBhZnRlciBleGFjdAot
CSAqIGl0ZW1zLiBIb3dldmVyLCB0aGVyZSBtaWdodCBiZSBleGFjdCBpdGVtcyBmb3IgdGhlIHNh
bWUgcGFnZSBhbW9uZwotCSAqIGFkZGl0aW9uYWxFbnRyaWVzLCBzbyB3ZSBtdXN0bid0IGFkdmFu
Y2UgcGFzdCB0aGVtLgotCSAqLwotCWlmIChJdGVtUG9pbnRlcklzTG9zc3lQYWdlKCZtaW5JdGVt
KSkKKwlpZiAoIWtleS0+ZXhjbHVkZU9ubHkpCiAJewotCQlpZiAoR2luSXRlbVBvaW50ZXJHZXRC
bG9ja051bWJlcigmYWR2YW5jZVBhc3QpIDwKLQkJCUdpbkl0ZW1Qb2ludGVyR2V0QmxvY2tOdW1i
ZXIoJm1pbkl0ZW0pKQorCQkvKgorCQkgKiBGb3IgYSBub3JtYWwgc2NhbiBrZXksIHdlIG5vdyBr
bm93IHRoZXJlIGFyZSBubyBtYXRjaGVzIDwgbWluSXRlbS4KKwkJICoKKwkJICogSWYgbWluSXRl
bSBpcyBsb3NzeSwgaXQgbWVhbnMgdGhhdCB0aGVyZSB3ZXJlIG5vIGV4YWN0IGl0ZW1zIG9uIHRo
ZQorCQkgKiBwYWdlIGFtb25nIHJlcXVpcmVkRW50cmllcywgYmVjYXVzZSBsb3NzeSBwb2ludGVy
cyBzb3J0IGFmdGVyIGV4YWN0CisJCSAqIGl0ZW1zLiBIb3dldmVyLCB0aGVyZSBtaWdodCBiZSBl
eGFjdCBpdGVtcyBmb3IgdGhlIHNhbWUgcGFnZSBhbW9uZworCQkgKiBhZGRpdGlvbmFsRW50cmll
cywgc28gd2UgbXVzdG4ndCBhZHZhbmNlIHBhc3QgdGhlbS4KKwkJICovCisJCWlmIChJdGVtUG9p
bnRlcklzTG9zc3lQYWdlKCZtaW5JdGVtKSkKIAkJeworCQkJaWYgKEdpbkl0ZW1Qb2ludGVyR2V0
QmxvY2tOdW1iZXIoJmFkdmFuY2VQYXN0KSA8CisJCQkJR2luSXRlbVBvaW50ZXJHZXRCbG9ja051
bWJlcigmbWluSXRlbSkpCisJCQl7CisJCQkJSXRlbVBvaW50ZXJTZXQoJmFkdmFuY2VQYXN0LAor
CQkJCQkJCSAgIEdpbkl0ZW1Qb2ludGVyR2V0QmxvY2tOdW1iZXIoJm1pbkl0ZW0pLAorCQkJCQkJ
CSAgIEludmFsaWRPZmZzZXROdW1iZXIpOworCQkJfQorCQl9CisJCWVsc2UKKwkJeworCQkJQXNz
ZXJ0KEdpbkl0ZW1Qb2ludGVyR2V0T2Zmc2V0TnVtYmVyKCZtaW5JdGVtKSA+IDApOwogCQkJSXRl
bVBvaW50ZXJTZXQoJmFkdmFuY2VQYXN0LAogCQkJCQkJICAgR2luSXRlbVBvaW50ZXJHZXRCbG9j
a051bWJlcigmbWluSXRlbSksCi0JCQkJCQkgICBJbnZhbGlkT2Zmc2V0TnVtYmVyKTsKKwkJCQkJ
CSAgIE9mZnNldE51bWJlclByZXYoR2luSXRlbVBvaW50ZXJHZXRPZmZzZXROdW1iZXIoJm1pbkl0
ZW0pKSk7CiAJCX0KIAl9CiAJZWxzZQogCXsKLQkJQXNzZXJ0KEdpbkl0ZW1Qb2ludGVyR2V0T2Zm
c2V0TnVtYmVyKCZtaW5JdGVtKSA+IDApOwotCQlJdGVtUG9pbnRlclNldCgmYWR2YW5jZVBhc3Qs
Ci0JCQkJCSAgIEdpbkl0ZW1Qb2ludGVyR2V0QmxvY2tOdW1iZXIoJm1pbkl0ZW0pLAotCQkJCQkg
ICBPZmZzZXROdW1iZXJQcmV2KEdpbkl0ZW1Qb2ludGVyR2V0T2Zmc2V0TnVtYmVyKCZtaW5JdGVt
KSkpOworCQkvKgorCQkgKiBleGNsdWRlT25seSBzY2FuIGtleXMgZG9uJ3QgaGF2ZSBhbnkgZW50
cmllcyB0aGF0IGFyZSBuZWNlc3NhcmlseQorCQkgKiBwcmVzZW50IGluIG1hdGNoaW5nIGl0ZW1z
LiAgU28sIHdlIGNvbnNpZGVyIHRoZSBpdGVtIGp1c3QgYWZ0ZXIKKwkJICogYWR2YW5jZVBhc3Qu
CisJCSAqLworCQlBc3NlcnQoa2V5LT5ucmVxdWlyZWQgPT0gMCk7CisJCUl0ZW1Qb2ludGVyU2V0
KCZtaW5JdGVtLAorCQkJCQkgICBHaW5JdGVtUG9pbnRlckdldEJsb2NrTnVtYmVyKCZhZHZhbmNl
UGFzdCksCisJCQkJCSAgIE9mZnNldE51bWJlck5leHQoR2luSXRlbVBvaW50ZXJHZXRPZmZzZXRO
dW1iZXIoJmFkdmFuY2VQYXN0KSkpOwogCX0KIAogCS8qCkBAIC0xMjY2LDYgKzEyOTMsMjAgQEAg
c2NhbkdldEl0ZW0oSW5kZXhTY2FuRGVzYyBzY2FuLCBJdGVtUG9pbnRlckRhdGEgYWR2YW5jZVBh
c3QsCiAJCXsKIAkJCUdpblNjYW5LZXkJa2V5ID0gc28tPmtleXMgKyBpOwogCisJCQkvKgorCQkJ
ICogSWYgd2UncmUgY29uc2lkZXJpbmcgYSBsb3NzeSBwYWdlLCBza2lwIGV4Y2x1ZGVPbmx5IGtl
eXMsICBUaGV5CisJCQkgKiBjYW4ndCBleGNsdWRlIHRoZSB3aG9sZSBwYWdlIGFueXdheS4KKwkJ
CSAqLworCQkJaWYgKEl0ZW1Qb2ludGVySXNMb3NzeVBhZ2UoaXRlbSkgJiYga2V5LT5leGNsdWRl
T25seSkKKwkJCXsKKwkJCQkvKgorCQkJCSAqIGdpbk5ld1NjYW5LZXkoKSBzaG91bGQgbmV2ZXIg
bWFyayB0aGUgZmlyc3Qga2V5IGFzCisJCQkJICogZXhjbHVkZU9ubHkuCisJCQkJICovCisJCQkJ
QXNzZXJ0KGkgPiAwKTsKKwkJCQljb250aW51ZTsKKwkJCX0KKwogCQkJLyogRmV0Y2ggdGhlIG5l
eHQgaXRlbSBmb3IgdGhpcyBrZXkgdGhhdCBpcyA+IGFkdmFuY2VQYXN0LiAqLwogCQkJa2V5R2V0
SXRlbSgmc28tPmdpbnN0YXRlLCBzby0+dGVtcEN0eCwga2V5LCBhZHZhbmNlUGFzdCwKIAkJCQkJ
ICAgc2Nhbi0+eHNfc25hcHNob3QpOwpAQCAtMTczNiwxMSArMTc3NywxNCBAQCBjb2xsZWN0TWF0
Y2hlc0ZvckhlYXBSb3coSW5kZXhTY2FuRGVzYyBzY2FuLCBwZW5kaW5nUG9zaXRpb24gKnBvcykK
IAl9CiAKIAkvKgotCSAqIE5vdyByZXR1cm4gInRydWUiIGlmIGFsbCBzY2FuIGtleXMgaGF2ZSBh
dCBsZWFzdCBvbmUgbWF0Y2hpbmcgZGF0dW0KKwkgKiBBbGwgc2NhbiBrZXlzIGV4Y2VwdCBleGNs
dWRlT25seSByZXF1aXJlIGF0IGxlYXN0IG9uZSBlbnRyeSB0byBtYXRjaC4KKwkgKiBleGNsdWRl
T25seSBrZXlzIGFyZSBleHBlY3Rpb24sIGJlY2F1c2UgdGhlaXIgaW1wbGllZAorCSAqIEdJTl9D
QVRfRU1QVFlfUVVFUlkgc2NhbkVudHJ5IGFsd2F5cyBtYXRjaC4gIE5vdyByZXR1cm4gInRydWUi
IGlmIGFsbAorCSAqIG5vbi1leGx1Y2RlT25seSBzY2FuIGtleXMgaGF2ZSBhdCBsZWFzdCBvbmUg
bWF0Y2hpbmcgZGF0dW0uCiAJICovCiAJZm9yIChpID0gMDsgaSA8IHNvLT5ua2V5czsgaSsrKQog
CXsKLQkJaWYgKHBvcy0+aGFzTWF0Y2hLZXlbaV0gPT0gZmFsc2UpCisJCWlmIChwb3MtPmhhc01h
dGNoS2V5W2ldID09IGZhbHNlICYmICFzby0+a2V5c1tpXS5leGNsdWRlT25seSkKIAkJCXJldHVy
biBmYWxzZTsKIAl9CiAKZGlmZiAtLWdpdCBhL3NyYy9iYWNrZW5kL2FjY2Vzcy9naW4vZ2luc2Nh
bi5jIGIvc3JjL2JhY2tlbmQvYWNjZXNzL2dpbi9naW5zY2FuLmMKaW5kZXggYzE1ZDA2Y2ViYTQu
LjBhNjg1YmRiZmM2IDEwMDY0NAotLS0gYS9zcmMvYmFja2VuZC9hY2Nlc3MvZ2luL2dpbnNjYW4u
YworKysgYi9zcmMvYmFja2VuZC9hY2Nlc3MvZ2luL2dpbnNjYW4uYwpAQCAtMTI1LDYgKzEyNSwy
NyBAQCBnaW5GaWxsU2NhbkVudHJ5KEdpblNjYW5PcGFxdWUgc28sIE9mZnNldE51bWJlciBhdHRu
dW0sCiAJcmV0dXJuIHNjYW5FbnRyeTsKIH0KIAorLyoKKyAqIEFwcGVuZCBoaWRkZW4gc2NhbiBl
bnRyeSBvZiBnaXZlbiBjYXRlZ29yeSB0byB0aGUgc2NhbiBrZXkuCisgKgorICogTkI6IHRoaXMg
aGFkIGJldHRlciBiZSBjYWxsZWQgYXQgbW9zdCBvbmNlIHBlciBzY2FuIGtleSwgc2luY2UKKyAq
IGdpbkZpbGxTY2FuS2V5IGxlYXZlcyByb29tIGZvciBvbmx5IG9uZSBoaWRkZW4gZW50cnkuICBD
dXJyZW50bHksCisgKiBpdCBzZWVtcyBzdWZmaWNpZW50bHkgY2xlYXIgdGhhdCB0aGlzIGlzIHRy
dWUgdGhhdCB3ZSBkb24ndCBib3RoZXIKKyAqIHdpdGggYW55IGNyb3NzLWNoZWNrIGxvZ2ljLgor
ICovCitzdGF0aWMgdm9pZAorZ2luU2NhbktleUFkZEhpZGRlbkVudHJ5KEdpblNjYW5PcGFxdWUg
c28sIEdpblNjYW5LZXkga2V5LAorCQkJCQkJIEdpbk51bGxDYXRlZ29yeSBxdWVyeUNhdGVnb3J5
KQoreworCWludAkJCWkgPSBrZXktPm5lbnRyaWVzKys7CisKKwkvKiBzdHJhdGVneSBpcyBvZiBu
byBpbnRlcmVzdCBiZWNhdXNlIHRoaXMgaXMgbm90IGEgcGFydGlhbC1tYXRjaCBpdGVtICovCisJ
a2V5LT5zY2FuRW50cnlbaV0gPSBnaW5GaWxsU2NhbkVudHJ5KHNvLCBrZXktPmF0dG51bSwKKwkJ
CQkJCQkJCQkgSW52YWxpZFN0cmF0ZWd5LCBrZXktPnNlYXJjaE1vZGUsCisJCQkJCQkJCQkJIChE
YXR1bSkgMCwgcXVlcnlDYXRlZ29yeSwKKwkJCQkJCQkJCQkgZmFsc2UsIE5VTEwpOworfQorCiAv
KgogICogSW5pdGlhbGl6ZSB0aGUgbmV4dCBHaW5TY2FuS2V5IHVzaW5nIHRoZSBvdXRwdXQgZnJv
bSB0aGUgZXh0cmFjdFF1ZXJ5Rm4KICAqLwpAQCAtMTM3LDE3ICsxNTgsMTYgQEAgZ2luRmlsbFNj
YW5LZXkoR2luU2Nhbk9wYXF1ZSBzbywgT2Zmc2V0TnVtYmVyIGF0dG51bSwKIHsKIAlHaW5TY2Fu
S2V5CWtleSA9ICYoc28tPmtleXNbc28tPm5rZXlzKytdKTsKIAlHaW5TdGF0ZSAgICpnaW5zdGF0
ZSA9ICZzby0+Z2luc3RhdGU7Ci0JdWludDMyCQluVXNlclF1ZXJ5VmFsdWVzID0gblF1ZXJ5VmFs
dWVzOwogCXVpbnQzMgkJaTsKIAotCS8qIE5vbi1kZWZhdWx0IHNlYXJjaCBtb2RlcyBhZGQgb25l
ICJoaWRkZW4iIGVudHJ5IHRvIGVhY2gga2V5ICovCi0JaWYgKHNlYXJjaE1vZGUgIT0gR0lOX1NF
QVJDSF9NT0RFX0RFRkFVTFQpCi0JCW5RdWVyeVZhbHVlcysrOwogCWtleS0+bmVudHJpZXMgPSBu
UXVlcnlWYWx1ZXM7Ci0Ja2V5LT5udXNlcmVudHJpZXMgPSBuVXNlclF1ZXJ5VmFsdWVzOworCWtl
eS0+bnVzZXJlbnRyaWVzID0gblF1ZXJ5VmFsdWVzOwogCi0Ja2V5LT5zY2FuRW50cnkgPSAoR2lu
U2NhbkVudHJ5ICopIHBhbGxvYyhzaXplb2YoR2luU2NhbkVudHJ5KSAqIG5RdWVyeVZhbHVlcyk7
Ci0Ja2V5LT5lbnRyeVJlcyA9IChHaW5UZXJuYXJ5VmFsdWUgKikgcGFsbG9jMChzaXplb2YoR2lu
VGVybmFyeVZhbHVlKSAqIG5RdWVyeVZhbHVlcyk7CisJLyogQWxsb2NhdGUgb25lIGV4dHJhIGFy
cmF5IHNsb3QgZm9yIHBvc3NpYmxlICJoaWRkZW4iIGVudHJ5ICovCisJa2V5LT5zY2FuRW50cnkg
PSAoR2luU2NhbkVudHJ5ICopIHBhbGxvYyhzaXplb2YoR2luU2NhbkVudHJ5KSAqCisJCQkJCQkJ
CQkJCSAoblF1ZXJ5VmFsdWVzICsgMSkpOworCWtleS0+ZW50cnlSZXMgPSAoR2luVGVybmFyeVZh
bHVlICopIHBhbGxvYzAoc2l6ZW9mKEdpblRlcm5hcnlWYWx1ZSkgKgorCQkJCQkJCQkJCQkJKG5R
dWVyeVZhbHVlcyArIDEpKTsKIAogCWtleS0+cXVlcnkgPSBxdWVyeTsKIAlrZXktPnF1ZXJ5VmFs
dWVzID0gcXVlcnlWYWx1ZXM7CkBAIC0xNTcsNiArMTc3LDEyIEBAIGdpbkZpbGxTY2FuS2V5KEdp
blNjYW5PcGFxdWUgc28sIE9mZnNldE51bWJlciBhdHRudW0sCiAJa2V5LT5zZWFyY2hNb2RlID0g
c2VhcmNoTW9kZTsKIAlrZXktPmF0dG51bSA9IGF0dG51bTsKIAorCS8qCisJICogSW5pdGlhbGx5
LCBzY2FuIGtleXMgb2YgR0lOX1NFQVJDSF9NT0RFX0FMTCBtb2RlIGFyZSBtYXJrZWQKKwkgKiBl
eGNsdWRlT25seS4gIFRoaXMgbWlnaHQgZ2V0IGNoYW5nZWQgbGF0ZXIuCisJICovCisJa2V5LT5l
eGNsdWRlT25seSA9IChzZWFyY2hNb2RlID09IEdJTl9TRUFSQ0hfTU9ERV9BTEwpOworCiAJSXRl
bVBvaW50ZXJTZXRNaW4oJmtleS0+Y3VySXRlbSk7CiAJa2V5LT5jdXJJdGVtTWF0Y2hlcyA9IGZh
bHNlOwogCWtleS0+cmVjaGVja0N1ckl0ZW0gPSBmYWxzZTsKQEAgLTE2OCw2ICsxOTQsNyBAQCBn
aW5GaWxsU2NhbktleShHaW5TY2FuT3BhcXVlIHNvLCBPZmZzZXROdW1iZXIgYXR0bnVtLAogCiAJ
Z2luSW5pdENvbnNpc3RlbnRGdW5jdGlvbihnaW5zdGF0ZSwga2V5KTsKIAorCS8qIFNldCB1cCBu
b3JtYWwgc2NhbiBlbnRyaWVzIHVzaW5nIGV4dHJhY3RRdWVyeUZuJ3Mgb3V0cHV0cyAqLwogCWZv
ciAoaSA9IDA7IGkgPCBuUXVlcnlWYWx1ZXM7IGkrKykKIAl7CiAJCURhdHVtCQlxdWVyeUtleTsK
QEAgLTE3NSw1NCArMjAyLDI4IEBAIGdpbkZpbGxTY2FuS2V5KEdpblNjYW5PcGFxdWUgc28sIE9m
ZnNldE51bWJlciBhdHRudW0sCiAJCWJvb2wJCWlzUGFydGlhbE1hdGNoOwogCQlQb2ludGVyCQl0
aGlzX2V4dHJhOwogCi0JCWlmIChpIDwgblVzZXJRdWVyeVZhbHVlcykKLQkJewotCQkJLyogc2V0
IHVwIG5vcm1hbCBlbnRyeSB1c2luZyBleHRyYWN0UXVlcnlGbidzIG91dHB1dHMgKi8KLQkJCXF1
ZXJ5S2V5ID0gcXVlcnlWYWx1ZXNbaV07Ci0JCQlxdWVyeUNhdGVnb3J5ID0gcXVlcnlDYXRlZ29y
aWVzW2ldOwotCQkJaXNQYXJ0aWFsTWF0Y2ggPQotCQkJCShnaW5zdGF0ZS0+Y2FuUGFydGlhbE1h
dGNoW2F0dG51bSAtIDFdICYmIHBhcnRpYWxfbWF0Y2hlcykKLQkJCQk/IHBhcnRpYWxfbWF0Y2hl
c1tpXSA6IGZhbHNlOwotCQkJdGhpc19leHRyYSA9IChleHRyYV9kYXRhKSA/IGV4dHJhX2RhdGFb
aV0gOiBOVUxMOwotCQl9Ci0JCWVsc2UKLQkJewotCQkJLyogc2V0IHVwIGhpZGRlbiBlbnRyeSAq
LwotCQkJcXVlcnlLZXkgPSAoRGF0dW0pIDA7Ci0JCQlzd2l0Y2ggKHNlYXJjaE1vZGUpCi0JCQl7
Ci0JCQkJY2FzZSBHSU5fU0VBUkNIX01PREVfSU5DTFVERV9FTVBUWToKLQkJCQkJcXVlcnlDYXRl
Z29yeSA9IEdJTl9DQVRfRU1QVFlfSVRFTTsKLQkJCQkJYnJlYWs7Ci0JCQkJY2FzZSBHSU5fU0VB
UkNIX01PREVfQUxMOgotCQkJCQlxdWVyeUNhdGVnb3J5ID0gR0lOX0NBVF9FTVBUWV9RVUVSWTsK
LQkJCQkJYnJlYWs7Ci0JCQkJY2FzZSBHSU5fU0VBUkNIX01PREVfRVZFUllUSElORzoKLQkJCQkJ
cXVlcnlDYXRlZ29yeSA9IEdJTl9DQVRfRU1QVFlfUVVFUlk7Ci0JCQkJCWJyZWFrOwotCQkJCWRl
ZmF1bHQ6Ci0JCQkJCWVsb2coRVJST1IsICJ1bmV4cGVjdGVkIHNlYXJjaE1vZGU6ICVkIiwgc2Vh
cmNoTW9kZSk7Ci0JCQkJCXF1ZXJ5Q2F0ZWdvcnkgPSAwOwkvKiBrZWVwIGNvbXBpbGVyIHF1aWV0
ICovCi0JCQkJCWJyZWFrOwotCQkJfQotCQkJaXNQYXJ0aWFsTWF0Y2ggPSBmYWxzZTsKLQkJCXRo
aXNfZXh0cmEgPSBOVUxMOwotCi0JCQkvKgotCQkJICogV2Ugc2V0IHRoZSBzdHJhdGVneSB0byBh
IGZpeGVkIHZhbHVlIHNvIHRoYXQgZ2luRmlsbFNjYW5FbnRyeQotCQkJICogY2FuIGNvbWJpbmUg
dGhlc2UgZW50cmllcyBmb3IgZGlmZmVyZW50IHNjYW4ga2V5cy4gIFRoaXMgaXMKLQkJCSAqIHNh
ZmUgYmVjYXVzZSB0aGUgc3RyYXRlZ3kgdmFsdWUgaW4gdGhlIGVudHJ5IHN0cnVjdCBpcyBvbmx5
Ci0JCQkgKiB1c2VkIGZvciBwYXJ0aWFsLW1hdGNoIGNhc2VzLiAgSXQncyBPSyB0byBvdmVyd3Jp
dGUgb3VyIGxvY2FsCi0JCQkgKiB2YXJpYWJsZSBoZXJlIGJlY2F1c2UgdGhpcyBpcyB0aGUgbGFz
dCBsb29wIGl0ZXJhdGlvbi4KLQkJCSAqLwotCQkJc3RyYXRlZ3kgPSBJbnZhbGlkU3RyYXRlZ3k7
Ci0JCX0KKwkJcXVlcnlLZXkgPSBxdWVyeVZhbHVlc1tpXTsKKwkJcXVlcnlDYXRlZ29yeSA9IHF1
ZXJ5Q2F0ZWdvcmllc1tpXTsKKwkJaXNQYXJ0aWFsTWF0Y2ggPQorCQkJKGdpbnN0YXRlLT5jYW5Q
YXJ0aWFsTWF0Y2hbYXR0bnVtIC0gMV0gJiYgcGFydGlhbF9tYXRjaGVzKQorCQkJPyBwYXJ0aWFs
X21hdGNoZXNbaV0gOiBmYWxzZTsKKwkJdGhpc19leHRyYSA9IChleHRyYV9kYXRhKSA/IGV4dHJh
X2RhdGFbaV0gOiBOVUxMOwogCiAJCWtleS0+c2NhbkVudHJ5W2ldID0gZ2luRmlsbFNjYW5FbnRy
eShzbywgYXR0bnVtLAogCQkJCQkJCQkJCQkgc3RyYXRlZ3ksIHNlYXJjaE1vZGUsCiAJCQkJCQkJ
CQkJCSBxdWVyeUtleSwgcXVlcnlDYXRlZ29yeSwKIAkJCQkJCQkJCQkJIGlzUGFydGlhbE1hdGNo
LCB0aGlzX2V4dHJhKTsKIAl9CisKKwkvKgorCSAqIEZvciBHSU5fU0VBUkNIX01PREVfSU5DTFVE
RV9FTVBUWSBhbmQgR0lOX1NFQVJDSF9NT0RFX0VWRVJZVEhJTkcgc2VhcmNoCisJICogbW9kZXMs
IHdlIGFkZCB0aGUgImhpZGRlbiIgZW50cnkgaW1tZWRpYXRlbHkuICBHSU5fU0VBUkNIX01PREVf
QUxMIGlzCisJICogaGFuZGxlZCBsYXRlciwgc2luY2Ugd2UgbWlnaHQgYmUgYWJsZSB0byBvbWl0
IHRoZSBoaWRkZW4gZW50cnkgZm9yIGl0LgorCSAqLworCWlmIChzZWFyY2hNb2RlID09IEdJTl9T
RUFSQ0hfTU9ERV9JTkNMVURFX0VNUFRZKQorCQlnaW5TY2FuS2V5QWRkSGlkZGVuRW50cnkoc28s
IGtleSwgR0lOX0NBVF9FTVBUWV9JVEVNKTsKKwllbHNlIGlmIChzZWFyY2hNb2RlID09IEdJTl9T
RUFSQ0hfTU9ERV9FVkVSWVRISU5HKQorCQlnaW5TY2FuS2V5QWRkSGlkZGVuRW50cnkoc28sIGtl
eSwgR0lOX0NBVF9FTVBUWV9RVUVSWSk7CiB9CiAKIC8qCkBAIC0yNjUsNiArMjY2LDcgQEAgZ2lu
TmV3U2NhbktleShJbmRleFNjYW5EZXNjIHNjYW4pCiAJR2luU2Nhbk9wYXF1ZSBzbyA9IChHaW5T
Y2FuT3BhcXVlKSBzY2FuLT5vcGFxdWU7CiAJaW50CQkJaTsKIAlib29sCQloYXNOdWxsUXVlcnkg
PSBmYWxzZTsKKwlib29sCQlhdHRySGFzTm9ybWFsU2NhbltJTkRFWF9NQVhfS0VZU10gPSB7ZmFs
c2V9OwogCU1lbW9yeUNvbnRleHQgb2xkQ3R4OwogCiAJLyoKQEAgLTM3MSw2ICszNzMsMzMgQEAg
Z2luTmV3U2NhbktleShJbmRleFNjYW5EZXNjIHNjYW4pCiAJCQkJCSAgIHNrZXktPnNrX2FyZ3Vt
ZW50LCBuUXVlcnlWYWx1ZXMsCiAJCQkJCSAgIHF1ZXJ5VmFsdWVzLCBjYXRlZ29yaWVzLAogCQkJ
CQkgICBwYXJ0aWFsX21hdGNoZXMsIGV4dHJhX2RhdGEpOworCisJCS8qIFJlbWVtYmVyIGlmIHdl
IGhhZCBhbnkgbm9uLWV4Y2x1ZGVPbmx5IGtleXMgKi8KKwkJaWYgKHNlYXJjaE1vZGUgIT0gR0lO
X1NFQVJDSF9NT0RFX0FMTCkKKwkJCWF0dHJIYXNOb3JtYWxTY2FuW3NrZXktPnNrX2F0dG5vIC0g
MV0gPSB0cnVlOworCX0KKworCS8qCisJICogUHJvY2Vzc2luZyBHSU5fU0VBUkNIX01PREVfQUxM
IHNjYW4ga2V5cyByZXF1aXJlcyB1cyB0byBtYWtlIGEgc2Vjb25kCisJICogcGFzcyBvdmVyIHRo
ZSBzY2FuIGtleXMuICBBYm92ZSB3ZSBtYXJrZWQgZWFjaCBzdWNoIHNjYW4ga2V5IGFzCisJICog
ZXhjbHVkZU9ubHkuICBJZiB0aGUgaW52b2x2ZWQgY29sdW1uIGhhcyBhbnkgbm9ybWFsIChub3Qg
ZXhjbHVkZU9ubHkpCisJICogc2NhbiBrZXkgYXMgd2VsbCwgdGhlbiB3ZSBjYW4gbGVhdmUgaXQg
bGlrZSB0aGF0LiAgT3RoZXJ3aXNlLCBvbmUKKwkgKiBleGNsdWRlT25seSBzY2FuIGtleSBtdXN0
IHJlY2VpdmUgYSBHSU5fQ0FUX0VNUFRZX1FVRVJZIGhpZGRlbiBlbnRyeQorCSAqIGFuZCBiZSBz
ZXQgdG8gbm9ybWFsIChleGNsdWRlT25seSA9IGZhbHNlKS4KKwkgKi8KKwlmb3IgKGkgPSAwOyBp
IDwgc28tPm5rZXlzOyBpKyspCisJeworCQlHaW5TY2FuS2V5CWtleSA9ICZzby0+a2V5c1tpXTsK
KworCQlpZiAoa2V5LT5zZWFyY2hNb2RlICE9IEdJTl9TRUFSQ0hfTU9ERV9BTEwpCisJCQljb250
aW51ZTsKKworCQlpZiAoIWF0dHJIYXNOb3JtYWxTY2FuW2tleS0+YXR0bnVtIC0gMV0pCisJCXsK
KwkJCWtleS0+ZXhjbHVkZU9ubHkgPSBmYWxzZTsKKwkJCWdpblNjYW5LZXlBZGRIaWRkZW5FbnRy
eShzbywga2V5LCBHSU5fQ0FUX0VNUFRZX1FVRVJZKTsKKwkJCWF0dHJIYXNOb3JtYWxTY2FuW2tl
eS0+YXR0bnVtIC0gMV0gPSB0cnVlOworCQl9CiAJfQogCiAJLyoKZGlmZiAtLWdpdCBhL3NyYy9i
YWNrZW5kL3V0aWxzL2FkdC9zZWxmdW5jcy5jIGIvc3JjL2JhY2tlbmQvdXRpbHMvYWR0L3NlbGZ1
bmNzLmMKaW5kZXggMThkNzdhYzBiNzcuLjdjNmYwNTc0YjM3IDEwMDY0NAotLS0gYS9zcmMvYmFj
a2VuZC91dGlscy9hZHQvc2VsZnVuY3MuYworKysgYi9zcmMvYmFja2VuZC91dGlscy9hZHQvc2Vs
ZnVuY3MuYwpAQCAtNjM1Niw3ICs2MzU2LDggQEAgc3BnY29zdGVzdGltYXRlKFBsYW5uZXJJbmZv
ICpyb290LCBJbmRleFBhdGggKnBhdGgsIGRvdWJsZSBsb29wX2NvdW50LAogCiB0eXBlZGVmIHN0
cnVjdAogewotCWJvb2wJCWhhdmVGdWxsU2NhbjsKKwlib29sCQlhdHRIYXNGdWxsU2NhbltJTkRF
WF9NQVhfS0VZU107CisJYm9vbAkJYXR0SGFzTm9ybWFsU2NhbltJTkRFWF9NQVhfS0VZU107CiAJ
ZG91YmxlCQlwYXJ0aWFsRW50cmllczsKIAlkb3VibGUJCWV4YWN0RW50cmllczsKIAlkb3VibGUJ
CXNlYXJjaEVudHJpZXM7CkBAIC02NDUyLDE2ICs2NDUzLDIxIEBAIGdpbmNvc3RfcGF0dGVybihJ
bmRleE9wdEluZm8gKmluZGV4LCBpbnQgaW5kZXhjb2wsCiAJCWNvdW50cy0+c2VhcmNoRW50cmll
cysrOwogCX0KIAotCWlmIChzZWFyY2hNb2RlID09IEdJTl9TRUFSQ0hfTU9ERV9JTkNMVURFX0VN
UFRZKQorCWlmIChzZWFyY2hNb2RlID09IEdJTl9TRUFSQ0hfTU9ERV9ERUZBVUxUKQorCXsKKwkJ
Y291bnRzLT5hdHRIYXNOb3JtYWxTY2FuW2luZGV4Y29sXSA9IHRydWU7CisJfQorCWVsc2UgaWYg
KHNlYXJjaE1vZGUgPT0gR0lOX1NFQVJDSF9NT0RFX0lOQ0xVREVfRU1QVFkpCiAJewogCQkvKiBU
cmVhdCAiaW5jbHVkZSBlbXB0eSIgbGlrZSBhbiBleGFjdC1tYXRjaCBpdGVtICovCisJCWNvdW50
cy0+YXR0SGFzTm9ybWFsU2NhbltpbmRleGNvbF0gPSB0cnVlOwogCQljb3VudHMtPmV4YWN0RW50
cmllcysrOwogCQljb3VudHMtPnNlYXJjaEVudHJpZXMrKzsKIAl9Ci0JZWxzZSBpZiAoc2VhcmNo
TW9kZSAhPSBHSU5fU0VBUkNIX01PREVfREVGQVVMVCkKKwllbHNlCiAJewogCQkvKiBJdCdzIEdJ
Tl9TRUFSQ0hfTU9ERV9BTEwgKi8KLQkJY291bnRzLT5oYXZlRnVsbFNjYW4gPSB0cnVlOworCQlj
b3VudHMtPmF0dEhhc0Z1bGxTY2FuW2luZGV4Y29sXSA9IHRydWU7CiAJfQogCiAJcmV0dXJuIHRy
dWU7CkBAIC02NTk3LDcgKzY2MDMsOCBAQCBnaW5jb3N0X3NjYWxhcmFycmF5b3BleHByKFBsYW5u
ZXJJbmZvICpyb290LAogCQkJLyogV2UgaWdub3JlIGFycmF5IGVsZW1lbnRzIHRoYXQgYXJlIHVu
c2F0aXNmaWFibGUgcGF0dGVybnMgKi8KIAkJCW51bVBvc3NpYmxlKys7CiAKLQkJCWlmIChlbGVt
Y291bnRzLmhhdmVGdWxsU2NhbikKKwkJCWlmIChlbGVtY291bnRzLmF0dEhhc0Z1bGxTY2FuW2lu
ZGV4Y29sXSAmJgorCQkJCSFlbGVtY291bnRzLmF0dEhhc05vcm1hbFNjYW5baW5kZXhjb2xdKQog
CQkJewogCQkJCS8qCiAJCQkJICogRnVsbCBpbmRleCBzY2FuIHdpbGwgYmUgcmVxdWlyZWQuICBX
ZSB0cmVhdCB0aGlzIGFzIGlmCkBAIC02NjU0LDYgKzY2NjEsNyBAQCBnaW5jb3N0ZXN0aW1hdGUo
UGxhbm5lckluZm8gKnJvb3QsIEluZGV4UGF0aCAqcGF0aCwgZG91YmxlIGxvb3BfY291bnQsCiAJ
CQkJbnVtRW50cmllczsKIAlHaW5RdWFsQ291bnRzIGNvdW50czsKIAlib29sCQltYXRjaFBvc3Np
YmxlOworCWJvb2wJCWZ1bGxJbmRleFNjYW47CiAJZG91YmxlCQlwYXJ0aWFsU2NhbGU7CiAJZG91
YmxlCQllbnRyeVBhZ2VzRmV0Y2hlZCwKIAkJCQlkYXRhUGFnZXNGZXRjaGVkLApAQCAtNjY2NSw2
ICs2NjczLDcgQEAgZ2luY29zdGVzdGltYXRlKFBsYW5uZXJJbmZvICpyb290LCBJbmRleFBhdGgg
KnBhdGgsIGRvdWJsZSBsb29wX2NvdW50LAogCVJlbGF0aW9uCWluZGV4UmVsOwogCUdpblN0YXRz
RGF0YSBnaW5TdGF0czsKIAlMaXN0Q2VsbCAgICpsYzsKKwlpbnQJCQlpOwogCiAJLyoKIAkgKiBP
YnRhaW4gc3RhdGlzdGljYWwgaW5mb3JtYXRpb24gZnJvbSB0aGUgbWV0YSBwYWdlLCBpZiBwb3Nz
aWJsZS4gIEVsc2UKQEAgLTY4MjEsNyArNjgzMCwyMyBAQCBnaW5jb3N0ZXN0aW1hdGUoUGxhbm5l
ckluZm8gKnJvb3QsIEluZGV4UGF0aCAqcGF0aCwgZG91YmxlIGxvb3BfY291bnQsCiAJCXJldHVy
bjsKIAl9CiAKLQlpZiAoY291bnRzLmhhdmVGdWxsU2NhbiB8fCBpbmRleFF1YWxzID09IE5JTCkK
KwkvKgorCSAqIElmIGF0dHJpYnV0ZSBoYXMgYSBmdWxsIHNjYW4gYW5kIGF0IHRoZSBzYW1lIHRp
bWUgZG9lc24ndCBoYXZlIG5vcm1hbAorCSAqIHNjYW4sIHRoZW4gd2UnbGwgaGF2ZSB0byBzY2Fu
IGFsbCBub24tbnVsbCBlbnRyaWVzIG9mIHRoYXQgYXR0cmlidXRlLgorCSAqIEN1cnJlbnRseSwg
d2UgZG9uJ3QgaGF2ZSBwZXItYXR0cmlidXRlIHN0YXRpc3RpY3MgZm9yIEdJTi4gIFRodXMsIHdl
CisJICogbXVzdCBhc3N1bWUgdGhlIHdob2xlIEdJTiBpbmRleCBoYXMgdG8gYmUgc2Nhbm5lZCBp
biB0aGlzIGNhc2UuCisJICovCisJZnVsbEluZGV4U2NhbiA9IGZhbHNlOworCWZvciAoaSA9IDA7
IGkgPCBpbmRleC0+bmtleWNvbHVtbnM7IGkrKykKKwl7CisJCWlmIChjb3VudHMuYXR0SGFzRnVs
bFNjYW5baV0gJiYgIWNvdW50cy5hdHRIYXNOb3JtYWxTY2FuW2ldKQorCQl7CisJCQlmdWxsSW5k
ZXhTY2FuID0gdHJ1ZTsKKwkJCWJyZWFrOworCQl9CisJfQorCisJaWYgKGZ1bGxJbmRleFNjYW4g
fHwgaW5kZXhRdWFscyA9PSBOSUwpCiAJewogCQkvKgogCQkgKiBGdWxsIGluZGV4IHNjYW4gd2ls
bCBiZSByZXF1aXJlZC4gIFdlIHRyZWF0IHRoaXMgYXMgaWYgZXZlcnkga2V5IGluCmRpZmYgLS1n
aXQgYS9zcmMvaW5jbHVkZS9hY2Nlc3MvZ2luX3ByaXZhdGUuaCBiL3NyYy9pbmNsdWRlL2FjY2Vz
cy9naW5fcHJpdmF0ZS5oCmluZGV4IGExMzZmN2Y5MTg2Li43MWVlYWMyMDVjOSAxMDA2NDQKLS0t
IGEvc3JjL2luY2x1ZGUvYWNjZXNzL2dpbl9wcml2YXRlLmgKKysrIGIvc3JjL2luY2x1ZGUvYWNj
ZXNzL2dpbl9wcml2YXRlLmgKQEAgLTMwMyw2ICszMDMsMjAgQEAgdHlwZWRlZiBzdHJ1Y3QgR2lu
U2NhbktleURhdGEKIAlpbnQzMgkJc2VhcmNoTW9kZTsKIAlPZmZzZXROdW1iZXIgYXR0bnVtOwog
CisJLyoKKwkgKiBBbiBleGNsdWRlT25seSBzY2FuIGtleSBpcyBub3QgYWJsZSB0byBlbnVtZXJh
dGUgYWxsIG1hdGNoaW5nIHR1cGxlcy4KKwkgKiBUaGF0IGlzLCB0byBiZSBzZW1hbnRpY2FsbHkg
Y29ycmVjdCBvbiBpdHMgb3duLCBpdCB3b3VsZCBuZWVkIHRvIGhhdmUgYQorCSAqIEdJTl9DQVRf
RU1QVFlfUVVFUlkgc2NhbkVudHJ5LCBidXQgaXQgZG9lc24ndC4gIFN1Y2ggYSBrZXkgY2FuIHN0
aWxsIGJlCisJICogdXNlZCB0byBmaWx0ZXIgdHVwbGVzIHJldHVybmVkIGJ5IG90aGVyIHNjYW4g
a2V5cywgc28gd2Ugd2lsbCBnZXQgdGhlCisJICogcmlnaHQgYW5zd2VycyBhcyBsb25nIGFzIHRo
ZXJlJ3MgYXQgbGVhc3Qgb25lIG5vbi1leGNsdWRlT25seSBzY2FuIGtleQorCSAqIGZvciBlYWNo
IGluZGV4IGF0dHJpYnV0ZSBjb25zaWRlcmVkIGJ5IHRoZSBzZWFyY2guICBGb3IgZWZmaWNpZW5j
eQorCSAqIHJlYXNvbnMgd2UgZG9uJ3Qgd2FudCB0byBoYXZlIHVubmVjZXNzYXJ5IEdJTl9DQVRf
RU1QVFlfUVVFUlkgZW50cmllcywKKwkgKiBzbyB3ZSB3aWxsIGNvbnZlcnQgYW4gZXhjbHVkZU9u
bHkgc2NhbiBrZXkgdG8gbm9uLWV4Y2x1ZGVPbmx5IChieQorCSAqIGFkZGluZyBhIEdJTl9DQVRf
RU1QVFlfUVVFUlkgc2NhbkVudHJ5KSBvbmx5IGlmIHRoZXJlIGFyZSBubyBvdGhlcgorCSAqIG5v
bi1leGNsdWRlT25seSBzY2FuIGtleXMuCisJICovCisJYm9vbAkJZXhjbHVkZU9ubHk7CisKIAkv
KgogCSAqIE1hdGNoIHN0YXR1cyBkYXRhLiAgY3VySXRlbSBpcyB0aGUgVElEIG1vc3QgcmVjZW50
bHkgdGVzdGVkIChjb3VsZCBiZSBhCiAJICogbG9zc3ktcGFnZSBwb2ludGVyKS4gIGN1ckl0ZW1N
YXRjaGVzIGlzIHRydWUgaWYgaXQgcGFzc2VzIHRoZQpkaWZmIC0tZ2l0IGEvc3JjL3Rlc3QvcmVn
cmVzcy9leHBlY3RlZC9naW4ub3V0IGIvc3JjL3Rlc3QvcmVncmVzcy9leHBlY3RlZC9naW4ub3V0
CmluZGV4IGEzOTExYTZjNmM5Li5lM2M0ODA1YzIzNCAxMDA2NDQKLS0tIGEvc3JjL3Rlc3QvcmVn
cmVzcy9leHBlY3RlZC9naW4ub3V0CisrKyBiL3NyYy90ZXN0L3JlZ3Jlc3MvZXhwZWN0ZWQvZ2lu
Lm91dApAQCAtMSw3ICsxLDcgQEAKIC0tCiAtLSBUZXN0IEdJTiBpbmRleGVzLgogLS0KLS0tIFRo
ZXJlIGFyZSBvdGhlciB0ZXN0cyB0byB0ZXN0IGRpZmZlcmVudCBHSU4gb3BjbGFzc2VkLiBUaGlz
IGlzIGZvciB0ZXN0aW5nCistLSBUaGVyZSBhcmUgb3RoZXIgdGVzdHMgdG8gdGVzdCBkaWZmZXJl
bnQgR0lOIG9wY2xhc3Nlcy4gVGhpcyBpcyBmb3IgdGVzdGluZwogLS0gR0lOIGl0c2VsZi4KIC0t
IENyZWF0ZSBhbmQgcG9wdWxhdGUgYSB0ZXN0IHRhYmxlIHdpdGggYSBHSU4gaW5kZXguCiBjcmVh
dGUgdGFibGUgZ2luX3Rlc3RfdGJsKGkgaW50NFtdKSB3aXRoIChhdXRvdmFjdXVtX2VuYWJsZWQg
PSBvZmYpOwpAQCAtMzUsMyArMzUsMTMyIEBAIGluc2VydCBpbnRvIGdpbl90ZXN0X3RibCBzZWxl
Y3QgYXJyYXlbMSwgMiwgZ10gZnJvbSBnZW5lcmF0ZV9zZXJpZXMoMSwgMTAwMCkgZzsKIGluc2Vy
dCBpbnRvIGdpbl90ZXN0X3RibCBzZWxlY3QgYXJyYXlbMSwgMywgZ10gZnJvbSBnZW5lcmF0ZV9z
ZXJpZXMoMSwgMTAwMCkgZzsKIGRlbGV0ZSBmcm9tIGdpbl90ZXN0X3RibCB3aGVyZSBpIEA+IGFy
cmF5WzJdOwogdmFjdXVtIGdpbl90ZXN0X3RibDsKKy0tIFRlc3Qgb3B0aW1pemF0aW9uIG9mIGVt
cHR5IHF1ZXJpZXMKK2NyZWF0ZSB0ZW1wIHRhYmxlIHRfZ2luX3Rlc3RfdGJsKGkgaW50NFtdLCBq
IGludDRbXSk7CitjcmVhdGUgaW5kZXggb24gdF9naW5fdGVzdF90YmwgdXNpbmcgZ2luIChpLCBq
KTsKK2luc2VydCBpbnRvIHRfZ2luX3Rlc3RfdGJsCit2YWx1ZXMKKyAgKG51bGwsICAgIG51bGwp
LAorICAoJ3t9JywgICAgbnVsbCksCisgICgnezF9JywgICBudWxsKSwKKyAgKCd7MSwyfScsIG51
bGwpLAorICAobnVsbCwgICAgJ3t9JyksCisgIChudWxsLCAgICAnezEwfScpLAorICAoJ3sxLDJ9
JywgJ3sxMH0nKSwKKyAgKCd7Mn0nLCAgICd7MTB9JyksCisgICgnezEsM30nLCAne30nKSwKKyAg
KCd7MSwxfScsICd7MTB9Jyk7CitzZXQgZW5hYmxlX3NlcXNjYW4gPSBvZmY7CitleHBsYWluIChj
b3N0cyBvZmYpCitzZWxlY3QgKiBmcm9tIHRfZ2luX3Rlc3RfdGJsIHdoZXJlIGFycmF5WzBdIDxA
IGk7CisgICAgICAgICAgICAgICAgICAgIFFVRVJZIFBMQU4gICAgICAgICAgICAgICAgICAgICAK
Ky0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIEJp
dG1hcCBIZWFwIFNjYW4gb24gdF9naW5fdGVzdF90YmwKKyAgIFJlY2hlY2sgQ29uZDogKCd7MH0n
OjppbnRlZ2VyW10gPEAgaSkKKyAgIC0+ICBCaXRtYXAgSW5kZXggU2NhbiBvbiB0X2dpbl90ZXN0
X3RibF9pX2pfaWR4CisgICAgICAgICBJbmRleCBDb25kOiAoaSBAPiAnezB9Jzo6aW50ZWdlcltd
KQorKDQgcm93cykKKworc2VsZWN0ICogZnJvbSB0X2dpbl90ZXN0X3RibCB3aGVyZSBhcnJheVsw
XSA8QCBpOworIGkgfCBqIAorLS0tKy0tLQorKDAgcm93cykKKworc2VsZWN0ICogZnJvbSB0X2dp
bl90ZXN0X3RibCB3aGVyZSBhcnJheVswXSA8QCBpIGFuZCAne30nOjppbnQ0W10gPEAgajsKKyBp
IHwgaiAKKy0tLSstLS0KKygwIHJvd3MpCisKK2V4cGxhaW4gKGNvc3RzIG9mZikKK3NlbGVjdCAq
IGZyb20gdF9naW5fdGVzdF90Ymwgd2hlcmUgaSBAPiAne30nOworICAgICAgICAgICAgICAgICAg
ICBRVUVSWSBQTEFOICAgICAgICAgICAgICAgICAgICAgCistLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyBCaXRtYXAgSGVhcCBTY2FuIG9uIHRfZ2lu
X3Rlc3RfdGJsCisgICBSZWNoZWNrIENvbmQ6IChpIEA+ICd7fSc6OmludGVnZXJbXSkKKyAgIC0+
ICBCaXRtYXAgSW5kZXggU2NhbiBvbiB0X2dpbl90ZXN0X3RibF9pX2pfaWR4CisgICAgICAgICBJ
bmRleCBDb25kOiAoaSBAPiAne30nOjppbnRlZ2VyW10pCisoNCByb3dzKQorCitzZWxlY3QgKiBm
cm9tIHRfZ2luX3Rlc3RfdGJsIHdoZXJlIGkgQD4gJ3t9JzsKKyAgIGkgICB8ICBqICAgCistLS0t
LS0tKy0tLS0tLQorIHt9ICAgIHwgCisgezF9ICAgfCAKKyB7MSwyfSB8IAorIHsxLDJ9IHwgezEw
fQorIHsyfSAgIHwgezEwfQorIHsxLDN9IHwge30KKyB7MSwxfSB8IHsxMH0KKyg3IHJvd3MpCisK
K2NyZWF0ZSBmdW5jdGlvbiBleHBsYWluX3F1ZXJ5X2pzb24ocXVlcnlfc3FsIHRleHQpCityZXR1
cm5zIHRhYmxlIChleHBsYWluX2xpbmUganNvbikKK2xhbmd1YWdlIHBscGdzcWwgYXMKKyQkCiti
ZWdpbgorICBzZXQgZW5hYmxlX3NlcXNjYW4gPSBvZmY7CisgIHNldCBlbmFibGVfYml0bWFwc2Nh
biA9IG9uOworICByZXR1cm4gcXVlcnkgZXhlY3V0ZSAnRVhQTEFJTiAoQU5BTFlaRSwgRk9STUFU
IGpzb24pICcgfHwgcXVlcnlfc3FsOworZW5kOworJCQ7CitjcmVhdGUgZnVuY3Rpb24gZXhlY3V0
ZV90ZXh0X3F1ZXJ5X2luZGV4KHF1ZXJ5X3NxbCB0ZXh0KQorcmV0dXJucyBzZXRvZiB0ZXh0Cits
YW5ndWFnZSBwbHBnc3FsCithcworJCQKK2JlZ2luCisgIHNldCBlbmFibGVfc2Vxc2NhbiA9IG9m
ZjsKKyAgc2V0IGVuYWJsZV9iaXRtYXBzY2FuID0gb247CisgIHJldHVybiBxdWVyeSBleGVjdXRl
IHF1ZXJ5X3NxbDsKK2VuZDsKKyQkOworY3JlYXRlIGZ1bmN0aW9uIGV4ZWN1dGVfdGV4dF9xdWVy
eV9oZWFwKHF1ZXJ5X3NxbCB0ZXh0KQorcmV0dXJucyBzZXRvZiB0ZXh0CitsYW5ndWFnZSBwbHBn
c3FsCithcworJCQKK2JlZ2luCisgIHNldCBlbmFibGVfc2Vxc2NhbiA9IG9uOworICBzZXQgZW5h
YmxlX2JpdG1hcHNjYW4gPSBvZmY7CisgIHJldHVybiBxdWVyeSBleGVjdXRlIHF1ZXJ5X3NxbDsK
K2VuZDsKKyQkOworLS0gY2hlY2sgbnVtYmVyIG9mIHJvd3MgcmV0dXJuZWQgYnkgaW5kZXggYW5k
IHJlbW92ZWQgYnkgcmVjaGVjaworc2VsZWN0CisgIHF1ZXJ5LAorICBqcy0+MC0+J1BsYW4nLT4n
UGxhbnMnLT4wLT4nQWN0dWFsIFJvd3MnIGFzICJyZXR1cm4gYnkgaW5kZXgiLAorICBqcy0+MC0+
J1BsYW4nLT4nUm93cyBSZW1vdmVkIGJ5IEluZGV4IFJlY2hlY2snIGFzICJyZW1vdmVkIGJ5IHJl
Y2hlY2siLAorICAocmVzX2luZGV4ID0gcmVzX2hlYXApIGFzICJtYXRjaCIKK2Zyb20KKyAgKHZh
bHVlcworICAgICgkJCBpIEA+ICd7fScgJCQpLAorICAgICgkJCBqIEA+ICd7fScgJCQpLAorICAg
ICgkJCBpIEA+ICd7fScgYW5kIGogQD4gJ3t9JyAkJCksCisgICAgKCQkIGkgQD4gJ3sxfScgJCQp
LAorICAgICgkJCBpIEA+ICd7MX0nIGFuZCBqIEA+ICd7fScgJCQpLAorICAgICgkJCBpIEA+ICd7
MX0nIGFuZCBpIEA+ICd7fScgYW5kIGogQD4gJ3t9JyAkJCksCisgICAgKCQkIGogQD4gJ3sxMH0n
ICQkKSwKKyAgICAoJCQgaiBAPiAnezEwfScgYW5kIGkgQD4gJ3t9JyAkJCksCisgICAgKCQkIGog
QD4gJ3sxMH0nIGFuZCBqIEA+ICd7fScgYW5kIGkgQD4gJ3t9JyAkJCksCisgICAgKCQkIGkgQD4g
J3sxfScgYW5kIGogQD4gJ3sxMH0nICQkKQorICApIHEocXVlcnkpLAorICBsYXRlcmFsIGV4cGxh
aW5fcXVlcnlfanNvbigkJHNlbGVjdCAqIGZyb20gdF9naW5fdGVzdF90Ymwgd2hlcmUgJCQgfHwg
cXVlcnkpIGpzLAorICBsYXRlcmFsIGV4ZWN1dGVfdGV4dF9xdWVyeV9pbmRleCgkJHNlbGVjdCBz
dHJpbmdfYWdnKChpLCBqKTo6dGV4dCwgJyAnKSBmcm9tIHRfZ2luX3Rlc3RfdGJsIHdoZXJlICQk
IHx8IHF1ZXJ5KSByZXNfaW5kZXgsCisgIGxhdGVyYWwgZXhlY3V0ZV90ZXh0X3F1ZXJ5X2hlYXAo
JCRzZWxlY3Qgc3RyaW5nX2FnZygoaSwgaik6OnRleHQsICcgJykgZnJvbSB0X2dpbl90ZXN0X3Ri
bCB3aGVyZSAkJCB8fCBxdWVyeSkgcmVzX2hlYXA7CisgICAgICAgICAgICAgICAgICAgcXVlcnkg
ICAgICAgICAgICAgICAgICAgfCByZXR1cm4gYnkgaW5kZXggfCByZW1vdmVkIGJ5IHJlY2hlY2sg
fCBtYXRjaCAKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0t
LS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLQorICBpIEA+ICd7fScg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgNyAgICAgICAgICAgICAgIHwgMCAgICAg
ICAgICAgICAgICAgIHwgdAorICBqIEA+ICd7fScgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgIHwgNiAgICAgICAgICAgICAgIHwgMCAgICAgICAgICAgICAgICAgIHwgdAorICBpIEA+ICd7
fScgYW5kIGogQD4gJ3t9JyAgICAgICAgICAgICAgICAgIHwgNCAgICAgICAgICAgICAgIHwgMCAg
ICAgICAgICAgICAgICAgIHwgdAorICBpIEA+ICd7MX0nICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgIHwgNSAgICAgICAgICAgICAgIHwgMCAgICAgICAgICAgICAgICAgIHwgdAorICBpIEA+
ICd7MX0nIGFuZCBqIEA+ICd7fScgICAgICAgICAgICAgICAgIHwgMyAgICAgICAgICAgICAgIHwg
MCAgICAgICAgICAgICAgICAgIHwgdAorICBpIEA+ICd7MX0nIGFuZCBpIEA+ICd7fScgYW5kIGog
QD4gJ3t9JyAgIHwgMyAgICAgICAgICAgICAgIHwgMCAgICAgICAgICAgICAgICAgIHwgdAorICBq
IEA+ICd7MTB9JyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgNCAgICAgICAgICAgICAg
IHwgMCAgICAgICAgICAgICAgICAgIHwgdAorICBqIEA+ICd7MTB9JyBhbmQgaSBAPiAne30nICAg
ICAgICAgICAgICAgIHwgMyAgICAgICAgICAgICAgIHwgMCAgICAgICAgICAgICAgICAgIHwgdAor
ICBqIEA+ICd7MTB9JyBhbmQgaiBAPiAne30nIGFuZCBpIEA+ICd7fScgIHwgMyAgICAgICAgICAg
ICAgIHwgMCAgICAgICAgICAgICAgICAgIHwgdAorICBpIEA+ICd7MX0nIGFuZCBqIEA+ICd7MTB9
JyAgICAgICAgICAgICAgIHwgMiAgICAgICAgICAgICAgIHwgMCAgICAgICAgICAgICAgICAgIHwg
dAorKDEwIHJvd3MpCisKK3Jlc2V0IGVuYWJsZV9zZXFzY2FuOworcmVzZXQgZW5hYmxlX2JpdG1h
cHNjYW47Citkcm9wIHRhYmxlIHRfZ2luX3Rlc3RfdGJsOwpkaWZmIC0tZ2l0IGEvc3JjL3Rlc3Qv
cmVncmVzcy9leHBlY3RlZC90c2VhcmNoLm91dCBiL3NyYy90ZXN0L3JlZ3Jlc3MvZXhwZWN0ZWQv
dHNlYXJjaC5vdXQKaW5kZXggN2FmMjg5OTI3Y2MuLmZlMWNkOWRlYjBlIDEwMDY0NAotLS0gYS9z
cmMvdGVzdC9yZWdyZXNzL2V4cGVjdGVkL3RzZWFyY2gub3V0CisrKyBiL3NyYy90ZXN0L3JlZ3Jl
c3MvZXhwZWN0ZWQvdHNlYXJjaC5vdXQKQEAgLTMzNyw2ICszMzcsNDEgQEAgU0VMRUNUIGNvdW50
KCopIEZST00gdGVzdF90c3ZlY3RvciBXSEVSRSBhIEBAICchbm9fc3VjaF9sZXhlbWUnOwogICAg
NTA4CiAoMSByb3cpCiAKKy0tIFRlc3Qgb3B0aW1pemF0aW9uIG9mIG5vbi1lbXB0eSBHSU5fU0VB
UkNIX01PREVfQUxMIHF1ZXJpZXMKK0VYUExBSU4gKENPU1RTIE9GRikKK1NFTEVDVCBjb3VudCgq
KSBGUk9NIHRlc3RfdHN2ZWN0b3IgV0hFUkUgYSBAQCAnIXFoJzsKKyAgICAgICAgICAgICAgICAg
ICAgIFFVRVJZIFBMQU4gICAgICAgICAgICAgICAgICAgICAgCistLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIEFnZ3JlZ2F0ZQorICAgLT4gIEJp
dG1hcCBIZWFwIFNjYW4gb24gdGVzdF90c3ZlY3RvcgorICAgICAgICAgUmVjaGVjayBDb25kOiAo
YSBAQCAnIScncWgnJyc6OnRzcXVlcnkpCisgICAgICAgICAtPiAgQml0bWFwIEluZGV4IFNjYW4g
b24gd293aWR4CisgICAgICAgICAgICAgICBJbmRleCBDb25kOiAoYSBAQCAnIScncWgnJyc6OnRz
cXVlcnkpCisoNSByb3dzKQorCitTRUxFQ1QgY291bnQoKikgRlJPTSB0ZXN0X3RzdmVjdG9yIFdI
RVJFIGEgQEAgJyFxaCc7CisgY291bnQgCistLS0tLS0tCisgICA0MTAKKygxIHJvdykKKworRVhQ
TEFJTiAoQ09TVFMgT0ZGKQorU0VMRUNUIGNvdW50KCopIEZST00gdGVzdF90c3ZlY3RvciBXSEVS
RSBhIEBAICd3cicgQU5EIGEgQEAgJyFxaCc7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgUVVFUlkgUExBTiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAK
Ky0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIEFnZ3JlZ2F0ZQorICAgLT4gIEJpdG1hcCBI
ZWFwIFNjYW4gb24gdGVzdF90c3ZlY3RvcgorICAgICAgICAgUmVjaGVjayBDb25kOiAoKGEgQEAg
Jycnd3InJyc6OnRzcXVlcnkpIEFORCAoYSBAQCAnIScncWgnJyc6OnRzcXVlcnkpKQorICAgICAg
ICAgLT4gIEJpdG1hcCBJbmRleCBTY2FuIG9uIHdvd2lkeAorICAgICAgICAgICAgICAgSW5kZXgg
Q29uZDogKChhIEBAICcnJ3dyJycnOjp0c3F1ZXJ5KSBBTkQgKGEgQEAgJyEnJ3FoJycnOjp0c3F1
ZXJ5KSkKKyg1IHJvd3MpCisKK1NFTEVDVCBjb3VudCgqKSBGUk9NIHRlc3RfdHN2ZWN0b3IgV0hF
UkUgYSBAQCAnd3InIEFORCBhIEBAICchcWgnOworIGNvdW50IAorLS0tLS0tLQorICAgIDYwCiso
MSByb3cpCisKIFJFU0VUIGVuYWJsZV9zZXFzY2FuOwogSU5TRVJUIElOVE8gdGVzdF90c3ZlY3Rv
ciBWQUxVRVMgKCc/Pz8nLCAnREZHOjFBLDJCLDZDLDEwIEZHSCcpOwogU0VMRUNUICogRlJPTSB0
c19zdGF0KCdTRUxFQ1QgYSBGUk9NIHRlc3RfdHN2ZWN0b3InKSBPUkRFUiBCWSBuZG9jIERFU0Ms
IG5lbnRyeSBERVNDLCB3b3JkIExJTUlUIDEwOwpkaWZmIC0tZ2l0IGEvc3JjL3Rlc3QvcmVncmVz
cy9zcWwvZ2luLnNxbCBiL3NyYy90ZXN0L3JlZ3Jlc3Mvc3FsL2dpbi5zcWwKaW5kZXggYzU2NmU5
YjU4YzguLjgzNjcxN2M5OTZkIDEwMDY0NAotLS0gYS9zcmMvdGVzdC9yZWdyZXNzL3NxbC9naW4u
c3FsCisrKyBiL3NyYy90ZXN0L3JlZ3Jlc3Mvc3FsL2dpbi5zcWwKQEAgLTEsNyArMSw3IEBACiAt
LQogLS0gVGVzdCBHSU4gaW5kZXhlcy4KIC0tCi0tLSBUaGVyZSBhcmUgb3RoZXIgdGVzdHMgdG8g
dGVzdCBkaWZmZXJlbnQgR0lOIG9wY2xhc3NlZC4gVGhpcyBpcyBmb3IgdGVzdGluZworLS0gVGhl
cmUgYXJlIG90aGVyIHRlc3RzIHRvIHRlc3QgZGlmZmVyZW50IEdJTiBvcGNsYXNzZXMuIFRoaXMg
aXMgZm9yIHRlc3RpbmcKIC0tIEdJTiBpdHNlbGYuCiAKIC0tIENyZWF0ZSBhbmQgcG9wdWxhdGUg
YSB0ZXN0IHRhYmxlIHdpdGggYSBHSU4gaW5kZXguCkBAIC0zNCwzICszNCw5MiBAQCBpbnNlcnQg
aW50byBnaW5fdGVzdF90Ymwgc2VsZWN0IGFycmF5WzEsIDMsIGddIGZyb20gZ2VuZXJhdGVfc2Vy
aWVzKDEsIDEwMDApIGc7CiAKIGRlbGV0ZSBmcm9tIGdpbl90ZXN0X3RibCB3aGVyZSBpIEA+IGFy
cmF5WzJdOwogdmFjdXVtIGdpbl90ZXN0X3RibDsKKworLS0gVGVzdCBvcHRpbWl6YXRpb24gb2Yg
ZW1wdHkgcXVlcmllcworY3JlYXRlIHRlbXAgdGFibGUgdF9naW5fdGVzdF90YmwoaSBpbnQ0W10s
IGogaW50NFtdKTsKK2NyZWF0ZSBpbmRleCBvbiB0X2dpbl90ZXN0X3RibCB1c2luZyBnaW4gKGks
IGopOworaW5zZXJ0IGludG8gdF9naW5fdGVzdF90YmwKK3ZhbHVlcworICAobnVsbCwgICAgbnVs
bCksCisgICgne30nLCAgICBudWxsKSwKKyAgKCd7MX0nLCAgIG51bGwpLAorICAoJ3sxLDJ9Jywg
bnVsbCksCisgIChudWxsLCAgICAne30nKSwKKyAgKG51bGwsICAgICd7MTB9JyksCisgICgnezEs
Mn0nLCAnezEwfScpLAorICAoJ3syfScsICAgJ3sxMH0nKSwKKyAgKCd7MSwzfScsICd7fScpLAor
ICAoJ3sxLDF9JywgJ3sxMH0nKTsKKworc2V0IGVuYWJsZV9zZXFzY2FuID0gb2ZmOworZXhwbGFp
biAoY29zdHMgb2ZmKQorc2VsZWN0ICogZnJvbSB0X2dpbl90ZXN0X3RibCB3aGVyZSBhcnJheVsw
XSA8QCBpOworc2VsZWN0ICogZnJvbSB0X2dpbl90ZXN0X3RibCB3aGVyZSBhcnJheVswXSA8QCBp
Oworc2VsZWN0ICogZnJvbSB0X2dpbl90ZXN0X3RibCB3aGVyZSBhcnJheVswXSA8QCBpIGFuZCAn
e30nOjppbnQ0W10gPEAgajsKKworZXhwbGFpbiAoY29zdHMgb2ZmKQorc2VsZWN0ICogZnJvbSB0
X2dpbl90ZXN0X3RibCB3aGVyZSBpIEA+ICd7fSc7CitzZWxlY3QgKiBmcm9tIHRfZ2luX3Rlc3Rf
dGJsIHdoZXJlIGkgQD4gJ3t9JzsKKworY3JlYXRlIGZ1bmN0aW9uIGV4cGxhaW5fcXVlcnlfanNv
bihxdWVyeV9zcWwgdGV4dCkKK3JldHVybnMgdGFibGUgKGV4cGxhaW5fbGluZSBqc29uKQorbGFu
Z3VhZ2UgcGxwZ3NxbCBhcworJCQKK2JlZ2luCisgIHNldCBlbmFibGVfc2Vxc2NhbiA9IG9mZjsK
KyAgc2V0IGVuYWJsZV9iaXRtYXBzY2FuID0gb247CisgIHJldHVybiBxdWVyeSBleGVjdXRlICdF
WFBMQUlOIChBTkFMWVpFLCBGT1JNQVQganNvbikgJyB8fCBxdWVyeV9zcWw7CitlbmQ7CiskJDsK
KworY3JlYXRlIGZ1bmN0aW9uIGV4ZWN1dGVfdGV4dF9xdWVyeV9pbmRleChxdWVyeV9zcWwgdGV4
dCkKK3JldHVybnMgc2V0b2YgdGV4dAorbGFuZ3VhZ2UgcGxwZ3NxbAorYXMKKyQkCitiZWdpbgor
ICBzZXQgZW5hYmxlX3NlcXNjYW4gPSBvZmY7CisgIHNldCBlbmFibGVfYml0bWFwc2NhbiA9IG9u
OworICByZXR1cm4gcXVlcnkgZXhlY3V0ZSBxdWVyeV9zcWw7CitlbmQ7CiskJDsKKworY3JlYXRl
IGZ1bmN0aW9uIGV4ZWN1dGVfdGV4dF9xdWVyeV9oZWFwKHF1ZXJ5X3NxbCB0ZXh0KQorcmV0dXJu
cyBzZXRvZiB0ZXh0CitsYW5ndWFnZSBwbHBnc3FsCithcworJCQKK2JlZ2luCisgIHNldCBlbmFi
bGVfc2Vxc2NhbiA9IG9uOworICBzZXQgZW5hYmxlX2JpdG1hcHNjYW4gPSBvZmY7CisgIHJldHVy
biBxdWVyeSBleGVjdXRlIHF1ZXJ5X3NxbDsKK2VuZDsKKyQkOworCistLSBjaGVjayBudW1iZXIg
b2Ygcm93cyByZXR1cm5lZCBieSBpbmRleCBhbmQgcmVtb3ZlZCBieSByZWNoZWNrCitzZWxlY3QK
KyAgcXVlcnksCisgIGpzLT4wLT4nUGxhbictPidQbGFucyctPjAtPidBY3R1YWwgUm93cycgYXMg
InJldHVybiBieSBpbmRleCIsCisgIGpzLT4wLT4nUGxhbictPidSb3dzIFJlbW92ZWQgYnkgSW5k
ZXggUmVjaGVjaycgYXMgInJlbW92ZWQgYnkgcmVjaGVjayIsCisgIChyZXNfaW5kZXggPSByZXNf
aGVhcCkgYXMgIm1hdGNoIgorZnJvbQorICAodmFsdWVzCisgICAgKCQkIGkgQD4gJ3t9JyAkJCks
CisgICAgKCQkIGogQD4gJ3t9JyAkJCksCisgICAgKCQkIGkgQD4gJ3t9JyBhbmQgaiBAPiAne30n
ICQkKSwKKyAgICAoJCQgaSBAPiAnezF9JyAkJCksCisgICAgKCQkIGkgQD4gJ3sxfScgYW5kIGog
QD4gJ3t9JyAkJCksCisgICAgKCQkIGkgQD4gJ3sxfScgYW5kIGkgQD4gJ3t9JyBhbmQgaiBAPiAn
e30nICQkKSwKKyAgICAoJCQgaiBAPiAnezEwfScgJCQpLAorICAgICgkJCBqIEA+ICd7MTB9JyBh
bmQgaSBAPiAne30nICQkKSwKKyAgICAoJCQgaiBAPiAnezEwfScgYW5kIGogQD4gJ3t9JyBhbmQg
aSBAPiAne30nICQkKSwKKyAgICAoJCQgaSBAPiAnezF9JyBhbmQgaiBAPiAnezEwfScgJCQpCisg
ICkgcShxdWVyeSksCisgIGxhdGVyYWwgZXhwbGFpbl9xdWVyeV9qc29uKCQkc2VsZWN0ICogZnJv
bSB0X2dpbl90ZXN0X3RibCB3aGVyZSAkJCB8fCBxdWVyeSkganMsCisgIGxhdGVyYWwgZXhlY3V0
ZV90ZXh0X3F1ZXJ5X2luZGV4KCQkc2VsZWN0IHN0cmluZ19hZ2coKGksIGopOjp0ZXh0LCAnICcp
IGZyb20gdF9naW5fdGVzdF90Ymwgd2hlcmUgJCQgfHwgcXVlcnkpIHJlc19pbmRleCwKKyAgbGF0
ZXJhbCBleGVjdXRlX3RleHRfcXVlcnlfaGVhcCgkJHNlbGVjdCBzdHJpbmdfYWdnKChpLCBqKTo6
dGV4dCwgJyAnKSBmcm9tIHRfZ2luX3Rlc3RfdGJsIHdoZXJlICQkIHx8IHF1ZXJ5KSByZXNfaGVh
cDsKKworcmVzZXQgZW5hYmxlX3NlcXNjYW47CityZXNldCBlbmFibGVfYml0bWFwc2NhbjsKKwor
ZHJvcCB0YWJsZSB0X2dpbl90ZXN0X3RibDsKZGlmZiAtLWdpdCBhL3NyYy90ZXN0L3JlZ3Jlc3Mv
c3FsL3RzZWFyY2guc3FsIGIvc3JjL3Rlc3QvcmVncmVzcy9zcWwvdHNlYXJjaC5zcWwKaW5kZXgg
ZWNlODBiOTgzYzUuLjE0ZGE3ZWRkODQxIDEwMDY0NAotLS0gYS9zcmMvdGVzdC9yZWdyZXNzL3Nx
bC90c2VhcmNoLnNxbAorKysgYi9zcmMvdGVzdC9yZWdyZXNzL3NxbC90c2VhcmNoLnNxbApAQCAt
MTExLDYgKzExMSwxNSBAQCBTRUxFQ1QgY291bnQoKikgRlJPTSB0ZXN0X3RzdmVjdG9yIFdIRVJF
IGEgQEAgYW55ICgne3dyLHFofScpOwogU0VMRUNUIGNvdW50KCopIEZST00gdGVzdF90c3ZlY3Rv
ciBXSEVSRSBhIEBAICdub19zdWNoX2xleGVtZSc7CiBTRUxFQ1QgY291bnQoKikgRlJPTSB0ZXN0
X3RzdmVjdG9yIFdIRVJFIGEgQEAgJyFub19zdWNoX2xleGVtZSc7CiAKKy0tIFRlc3Qgb3B0aW1p
emF0aW9uIG9mIG5vbi1lbXB0eSBHSU5fU0VBUkNIX01PREVfQUxMIHF1ZXJpZXMKK0VYUExBSU4g
KENPU1RTIE9GRikKK1NFTEVDVCBjb3VudCgqKSBGUk9NIHRlc3RfdHN2ZWN0b3IgV0hFUkUgYSBA
QCAnIXFoJzsKK1NFTEVDVCBjb3VudCgqKSBGUk9NIHRlc3RfdHN2ZWN0b3IgV0hFUkUgYSBAQCAn
IXFoJzsKKworRVhQTEFJTiAoQ09TVFMgT0ZGKQorU0VMRUNUIGNvdW50KCopIEZST00gdGVzdF90
c3ZlY3RvciBXSEVSRSBhIEBAICd3cicgQU5EIGEgQEAgJyFxaCc7CitTRUxFQ1QgY291bnQoKikg
RlJPTSB0ZXN0X3RzdmVjdG9yIFdIRVJFIGEgQEAgJ3dyJyBBTkQgYSBAQCAnIXFoJzsKKwogUkVT
RVQgZW5hYmxlX3NlcXNjYW47CiAKIElOU0VSVCBJTlRPIHRlc3RfdHN2ZWN0b3IgVkFMVUVTICgn
Pz8/JywgJ0RGRzoxQSwyQiw2QywxMCBGR0gnKTsK
--0000000000002f7239059c21615d--