Skip site navigation (1)Skip section navigation (2)
Date:      Fri, 22 Aug 2008 13:41:48 +0400
From:      "Andrey V. Elsukov" <bu7cher@yandex.ru>
To:        Luigi Rizzo <rizzo@iet.unipi.it>
Cc:        David Quattlebaum <David.Quattlebaum@sas.com>, Ivan Voras <ivoras@freebsd.org>, freebsd-arch@freebsd.org
Subject:   Re: Magic symlinks redux
Message-ID:  <48AE89DC.9080408@yandex.ru>
In-Reply-To: <20080822090448.GB57441@onelab2.iet.unipi.it>
References:  <g8kv7v$sp2$1@ger.gmane.org> <20080822090448.GB57441@onelab2.iet.unipi.it>

next in thread | previous in thread | raw e-mail | index | archive | help
This is a multi-part message in MIME format.
--------------010404020304060805040407
Content-Type: text/plain; charset=KOI8-R; format=flowed
Content-Transfer-Encoding: 7bit

Luigi Rizzo wrote:
> interestingly simple.
> 
> Question - is the process' ENV easily available in this part
> of the kernel, so one could in principle use environment variables
> as replacement strings ?
> 
> Some comments on the code in the above patch:
> 
> + readability it might be improved a bit:
>   e.g. I don't see why uma_{zalloc|zfree} are hidden behind macros,
>   nor why symlynk_magic() isn't simply called as
> 
> 	if (vfs_magiclinks)
> 		symlink_magic(td, cp, &linklen);
> 
>   as it cannot fail as implemented;
>   also, the whole MATCH/SUBSTITUTE macros are not particularly
>   readable -- i understand one needs macros to implement sizeof("somestring")
>   correctly, but apart from a wrapper I believe the core of these two
>   blocks should be implemented by functions (possibly inline) with
>   MATCH() returning the match length so one doesn't need to replicate
>   the string parameter in SUBSTITUTE();
> 
> + correctness --
>   1. termchar is not reset to '/' if a match is not found
>   2. what is the intended behaviour when the replacement string overflows
>      the buffer ?
> 
> + efficiency of symlink_magic() might be improved too:
>   e.g. the function could do a quick check for the presence of @ and return
>   without allocation/deallocation if not found;
>   getcredhostname() (and similar routines) could be called so that
>   they write directly to tmp, without the need for
>   allocating an in-stack buffer

This was so long ago.. As i remember this patch is a quick port of
NetBSD's implementation and uses the same code.

Also there was another implementation ported from DragonFlyBSD.
David Quattlebaum is working on varsyms implementation and he sent
fresh patch to me in this April. I attached patch.
And sorry, i am not working on this today..

-- 
WBR, Andrey V. Elsukov

--------------010404020304060805040407
Content-Type: application/octet-stream;
 name="varsym.patch"
Content-Transfer-Encoding: base64
Content-Disposition: attachment;
 filename="varsym.patch"

ZGlmZiAtVTMgLU4gc3JjL3N5cy9rZXJuL2tlcm5fdmFyc3ltLmMgc3JjL3N5cy9rZXJuL2tl
cm5fdmFyc3ltLmMKLS0tIHNyYy9zeXMva2Vybi9rZXJuX3ZhcnN5bS5jCVdlZCBEZWMgMzEg
MTk6MDA6MDAgMTk2OQorKysgc3JjL3N5cy9rZXJuL2tlcm5fdmFyc3ltLmMJVGh1IEZlYiAx
NiAwOTozMTowOCAyMDA2CkBAIC0wLDAgKzEsNTYyIEBACisvKgorICogQ29weXJpZ2h0IChj
KSAyMDAzLDIwMDQgVGhlIERyYWdvbkZseSBQcm9qZWN0LiAgQWxsIHJpZ2h0cyByZXNlcnZl
ZC4KKyAqIAorICogVGhpcyBjb2RlIGlzIGRlcml2ZWQgZnJvbSBzb2Z0d2FyZSBjb250cmli
dXRlZCB0byBUaGUgRHJhZ29uRmx5IFByb2plY3QKKyAqIGJ5IE1hdHRoZXcgRGlsbG9uIDxk
aWxsb25AYmFja3BsYW5lLmNvbT4KKyAqIAorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBp
biBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmlj
YXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRp
dGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3Vy
Y2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2Us
IHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIu
CisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2Ug
dGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0
aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluCisgKiAgICB0aGUgZG9jdW1l
bnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisgKiAg
ICBkaXN0cmlidXRpb24uCisgKiAzLiBOZWl0aGVyIHRoZSBuYW1lIG9mIFRoZSBEcmFnb25G
bHkgUHJvamVjdCBub3IgdGhlIG5hbWVzIG9mIGl0cworICogICAgY29udHJpYnV0b3JzIG1h
eSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkCisgKiAg
ICBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYywgcHJpb3Igd3JpdHRlbiBw
ZXJtaXNzaW9uLgorICogCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBD
T1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisgKiBgYEFTIElTJycgQU5EIEFO
WSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCisg
KiBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElU
WSBBTkQgRklUTkVTUworICogRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJ
TUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFCisgKiBDT1BZUklHSFQgSE9MREVSUyBPUiBD
T05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwKKyAqIElO
Q0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMg
KElOQ0xVRElORywKKyAqIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VC
U1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsKKyAqIExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQ
Uk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VECisgKiBB
TkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNU
UklDVCBMSUFCSUxJVFksCisgKiBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBP
VEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQKKyAqIE9GIFRIRSBVU0UgT0YgVEhJ
UyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgorICog
U1VDSCBEQU1BR0UuCisgKiAKKyAqICRGcmVlQlNEJAorICogJERyYWdvbkZseTogc3JjL3N5
cy9rZXJuL2tlcm5fdmFyc3ltLmMsdiAxLjYgMjAwNS8wMS8xNCAwMjoyNTowOCBqb2VyZyBF
eHAgJAorICovCisKKy8qCisgKiBUaGlzIG1vZHVsZSBpbXBsZW1lbnRzIHZhcmlhYmxlIHN0
b3JhZ2UgYW5kIG1hbmFnZW1lbnQgZm9yIHZhcmlhbnQKKyAqIHN5bWxpbmtzLiAgVGhlc2Ug
dmFyaWFibGVzIG1heSBhbHNvIGJlIHVzZWQgZm9yIGdlbmVyYWwgcHVycG9zZXMuCisgKi8K
KworI2luY2x1ZGUgPHN5cy9wYXJhbS5oPgorI2luY2x1ZGUgPHN5cy9zeXN0bS5oPgorI2lu
Y2x1ZGUgPHN5cy9rZXJuZWwuaD4KKyNpbmNsdWRlIDxzeXMvdWNyZWQuaD4KKyNpbmNsdWRl
IDxzeXMvcmVzb3VyY2V2YXIuaD4KKyNpbmNsdWRlIDxzeXMvcHJpdi5oPgorI2luY2x1ZGUg
PHN5cy9wcm9jLmg+CisjaW5jbHVkZSA8c3lzL2phaWwuaD4KKyNpbmNsdWRlIDxzeXMvcXVl
dWUuaD4KKyNpbmNsdWRlIDxzeXMvc3lzY3RsLmg+CisjaW5jbHVkZSA8c3lzL21hbGxvYy5o
PgorI2luY2x1ZGUgPHN5cy92YXJzeW0uaD4KKyNpbmNsdWRlIDxzeXMvc3lzcHJvdG8uaD4K
KworTUFMTE9DX0RFRklORShNX1ZBUlNZTSwgInZhcnN5bSIsICJ2YXJpYWJsZSBzZXRzIGZv
ciB2YXJpYW50IHN5bWxpbmtzIik7CisKK3N0cnVjdCB2YXJzeW1zZXQJdmFyc3ltc2V0X3N5
czsKKworc3RhdGljIGludAkJdmFyc3ltbWFrZShpbnQgbGV2ZWwsIGNvbnN0IGNoYXIgKm5h
bWUsIGNvbnN0IGNoYXIgKmRhdGEpOworc3RhdGljIHZvaWQJCXZhcnN5bWRyb3AodmFyc3lt
X3QgdmFyKTsKK3N0YXRpYyBzdHJ1Y3QgdmFyc3ltZW50ICoKKwkJCXZhcnN5bWxvb2t1cChz
dHJ1Y3QgdmFyc3ltc2V0ICp2c3MsIGNvbnN0IGNoYXIgKm5hbWUsIGludCBuYW1lbGVuKTsK
K3N0YXRpYyB2YXJzeW1fdAkJdmFyc3ltZmluZChpbnQgbWFzaywgY29uc3QgY2hhciAqbmFt
ZSwgaW50IG5hbWVsZW4pOworCitpbnQgdmFyc3ltX2NvbDFvbmx5ID0gMDsKK1NZU0NUTF9J
TlQoX3ZmcywgT0lEX0FVVE8sIHZhcnN5bV9jb2wxb25seSwgQ1RMRkxBR19SVywgJnZhcnN5
bV9jb2wxb25seSwgMCwKKyAgICAiVmFyc3ltIHZhcmlhYmxlcyBzdGFydCBpbiBjb2x1bW4g
MSBvbmx5Iik7CisKKy8qCisgKiBJbml0aWFsaXplIHRoZSB2YXJpYW50IHN5bWxpbmsgc3Vi
c3lzdGVtCisgKi8KK3N0YXRpYyB2b2lkCit2YXJzeW1fc3lzaW5pdCh2b2lkICpkdW1teSkK
K3sKKyAgICB2YXJzeW1zZXRfaW5pdCgmdmFyc3ltc2V0X3N5cywgTlVMTCk7Cit9CitTWVNJ
TklUKGFubm91bmNlLCBTSV9TVUJfSU5UUklOU0lDLCBTSV9PUkRFUl9GSVJTVCwgdmFyc3lt
X3N5c2luaXQsIE5VTEwpOworCisvKgorICogSW5pdGlhbGl6ZSB0aGUgdmFyc3ltc2V0IGZv
ciBwcm9jMAorICovCitzdGF0aWMgdm9pZAordmFyc3ltX3AwaW5pdCh2b2lkICpkdW1teSkK
K3sKKwl2YXJzeW1zZXRfaW5pdCgmcHJvYzAucF92YXJzeW1zZXQsIE5VTEwpOworfQorU1lT
SU5JVChwMGluaXQsIFNJX1NVQl9JTlRSSU5TSUMsIFNJX09SREVSX1NFQ09ORCwgdmFyc3lt
X3AwaW5pdCwgTlVMTCk7CisKKy8qCisgKiB2YXJzeW1yZXBsYWNlKCkgLSBjYWxsZWQgZnJv
bSBuYW1laQorICoKKyAqCURvIHZhcmlhbnQgc3ltbGluayB2YXJpYWJsZSBzdWJzdGl0dXRp
b24KKyAqLworaW50Cit2YXJzeW1yZXBsYWNlKGNoYXIgKmNwLCBpbnQgbGlua2xlbiwgaW50
IG1heGxlbikKK3sKKyAgICBpbnQgcmxlbjsKKyAgICBpbnQgeGxlbjsKKyAgICBpbnQgbmxl
bjsKKyAgICBpbnQgaTsKKyAgICB2YXJzeW1fdCB2YXI7CisKKyAgICBybGVuID0gbGlua2xl
bjsKKyAgICB3aGlsZSAobGlua2xlbiA+IDEpIHsKKwlpZiAoY3BbMF0gPT0gJyQnICYmIGNw
WzFdID09ICd7JykgeworCQlmb3IgKGkgPSAyOyBpIDwgbGlua2xlbjsgKytpKSB7CisJCQlp
ZiAoY3BbaV0gPT0gJ30nKQorCQkgICAgCWJyZWFrOworCQl9CisJCS8qCisJCSAqIEluIGph
aWwgd2Ugc2hvdWxkIHJlc2V0IFZBUlNZTV9VU0VSX01BU0ssIHdlIGNoZWNrIGl0CisJCSAq
IGludG8gdmFyc3ltZmluZC4KKwkJICovCisJICAgIGlmIChpIDwgbGlua2xlbiAmJiAoCisJ
CQl2YXIgPSB2YXJzeW1maW5kKFZBUlNZTV9BTExfTUFTSywgY3AgKyAyLCBpIC0gMikpICE9
IE5VTEwpIAorCQl7CisJCQl4bGVuID0gaSArIDE7CQkJLyogYnl0ZXMgdG8gc3RyaWtlICov
CisJCQlubGVuID0gc3RybGVuKHZhci0+dnNfZGF0YSk7CS8qIGJ5dGVzIHRvIGFkZCAqLwor
CQkJaWYgKGxpbmtsZW4gKyBubGVuIC0geGxlbiA+PSBtYXhsZW4pIAorCQkJeworCQkgICAg
CXZhcnN5bWRyb3AodmFyKTsKKwkJICAgIAlyZXR1cm4oLTEpOworCQkJfQorCQkJS0FTU0VS
VChsaW5rbGVuID49IHhsZW4sICgiJXM6IGxpbmtsZW4gPCB4bGVuIixfX2Z1bmNfXykpOwor
CQkJaWYgKGxpbmtsZW4gIT0geGxlbikKKwkJCQliY29weShjcCArIHhsZW4sIGNwICsgbmxl
biwgbGlua2xlbiAtIHhsZW4pOworCQkJYmNvcHkodmFyLT52c19kYXRhLCBjcCwgbmxlbik7
CisJCQlsaW5rbGVuICs9IG5sZW4gLSB4bGVuOwkvKiBuZXcgcmVsYXRpdmUgbGVuZ3RoICov
CisJCQlybGVuICs9IG5sZW4gLSB4bGVuOwkvKiByZXR1cm5lZCB0b3RhbCBsZW5ndGggKi8K
KwkJCWNwICs9IG5sZW47CQkvKiBhZGp1c3QgcGFzdCByZXBsYWNlbWVudCAqLworCQkJbGlu
a2xlbiAtPSBubGVuOwkvKiBhZGp1c3QgcGFzdCByZXBsYWNlbWVudCAqLworCQkJbWF4bGVu
IC09IG5sZW47CQkvKiBhZGp1c3QgcGFzdCByZXBsYWNlbWVudCAqLworCSAgICB9IGVsc2Ug
eworCQkJLyoKKwkJCSAqIEl0J3Mgb2sgaWYgaSBwb2ludHMgdG8gdGhlICd9JywgaXQgd2ls
bCBzaW1wbHkgYmUKKwkJCSAqIHNraXBwZWQuICBpIGNvdWxkIGFsc28gaGF2ZSBoaXQgbGlu
a2xlbi4KKwkJCSAqLworCQkJY3AgKz0gaTsKKwkJCWxpbmtsZW4gLT0gaTsKKwkJCW1heGxl
biAtPSBpOworCSAgICB9CisJfSBlbHNlIHsKKwkgICAgLyoKKwkgICAgICogQnJlYWsgaWYg
d2UgZGlkbid0IGhpdCBhICQgaW4gY29sLiAxIGlmIHZhcnN5bV9jb2wxb25seSAhPSAwCisJ
ICAgICAqLworCSAgICBpZiAodmFyc3ltX2NvbDFvbmx5ICE9IDApCisJCWJyZWFrOworCSAg
ICArK2NwOworCSAgICAtLWxpbmtsZW47CisJICAgIC0tbWF4bGVuOworCX0KKyAgICB9Cisg
ICAgcmV0dXJuKHJsZW4pOworfQorCisvKgorICogdmFyc3ltX3NldCgpIHN5c3RlbSBjYWxs
CisgKgorICogKGludCBsZXZlbCwgY29uc3QgY2hhciAqbmFtZSwgY29uc3QgY2hhciAqZGF0
YSkKKyAqLworaW50Cit2YXJzeW1fc2V0KHN0cnVjdCB0aHJlYWQgKnRkLCBzdHJ1Y3QgdmFy
c3ltX3NldF9hcmdzICp1YXApCit7CisgICAgY2hhciBuYW1lW01BWFZBUlNZTV9OQU1FXTsK
KyAgICBjaGFyICpidWY7CisgICAgaW50IGVycm9yOworCisgICAgaWYgKChlcnJvciA9IGNv
cHlpbnN0cih1YXAtPm5hbWUsIG5hbWUsIHNpemVvZihuYW1lKSwgTlVMTCkpICE9IDApCisJ
CWdvdG8gZG9uZTI7CisgICAgCisJYnVmID0gbWFsbG9jKE1BWFZBUlNZTV9EQVRBLCBNX1RF
TVAsIE1fV0FJVE9LKTsKKyAgICBpZiAodWFwLT5kYXRhICYmIAorCShlcnJvciA9IGNvcHlp
bnN0cih1YXAtPmRhdGEsIGJ1ZiwgTUFYVkFSU1lNX0RBVEEsIE5VTEwpKSAhPSAwKQorICAg
IHsKKwkJZ290byBkb25lMTsKKyAgICB9CisgICAgCisJc3dpdGNoKHVhcC0+bGV2ZWwpIHsK
KwljYXNlIFZBUlNZTV9TWVM6CisJCWlmICh0ZC0+dGRfcHJvYyAhPSBOVUxMKSAKKwkJewor
CQkJLyogCisJCSAJICogT25seSByb290IGNhbiBjaGFuZ2UgU1lTVEVNJ3MgdmFyc3ltcy4g
CisJCQkgKiBQcmlzb24ncyByb290IGNhbiBjaGFuZ2Ugb25seSBTWVNURU0ncyB2YXJzeW1z
CisJCQkgKiBmb3Igb3duIHByaXNvbi4KKwkJCSAqLworCQkJZXJyb3IgPSBwcml2X2NoZWNr
X2NyZWQodGQtPnRkX3Byb2MtPnBfdWNyZWQsIFBSSVZfQ1JFRF9TRVRVSUQsIDApOworCQkJ
aWYgKGVycm9yICE9IDApCisJCQkJYnJlYWs7IC8qIGVycm9yID0gRVBFUk0gKi8KKwkJCWlm
IChqYWlsZWQodGQtPnRkX3Byb2MtPnBfdWNyZWQpKQorCQkJCXVhcC0+bGV2ZWwgPSBWQVJT
WU1fUFJJU09OOworCQl9IAorCQkvKiBmYWxsIHRocm91Z2ggKi8KKwljYXNlIFZBUlNZTV9V
U0VSOgorCQkvKiBYWFggaW1wbGVtZW50IHBlci1qYWlsIHVzZXIgKi8KKwkJaWYgKHRkLT50
ZF9wcm9jICE9IE5VTEwgJiYgCisJCQl1YXAtPmxldmVsID09IFZBUlNZTV9VU0VSICYmCisJ
CQlqYWlsZWQodGQtPnRkX3Byb2MtPnBfdWNyZWQpKSAKKwkJeworCQkJLyogCisJCQkgKiBE
ZW55IGNoYW5nZSB1c2VycyB2YXJzeW1zIGZvciBqYWlsZWQgcHJvY2VzZXMuIAorCQkJICog
KHdlIGRvbid0IGhhdmUgYSBwZXItamFpbGVkdXNlciB1aWRpbmZvKQorCQkJICovCisJCQll
cnJvciA9IEVQRVJNOworCQkJYnJlYWs7CisJCX0KKwkJLyogZmFsbCB0aHJvdWdoICovCisJ
Y2FzZSBWQVJTWU1fUFBST0M6CisJY2FzZSBWQVJTWU1fUFJPQzoKKwkJZXJyb3IgPSB2YXJz
eW1tYWtlKHVhcC0+bGV2ZWwsIG5hbWUsIE5VTEwpOworCQlpZiAodWFwLT5kYXRhKSAKKwkJ
CWVycm9yID0gdmFyc3ltbWFrZSh1YXAtPmxldmVsLCBuYW1lLCBidWYpOworCQlicmVhazsK
KwlkZWZhdWx0OgorCQllcnJvciA9IEVJTlZBTDsKKyAgICB9Citkb25lMToKKwlmcmVlKGJ1
ZiwgTV9URU1QKTsKK2RvbmUyOgorICAgIHJldHVybihlcnJvcik7Cit9CisKKy8qCisgKiB2
YXJzeW1fZ2V0KCkgc3lzdGVtIGNhbGwKKyAqCisgKiAoaW50IG1hc2ssIGNvbnN0IGNoYXIg
KndpbGQsIGNoYXIgKmJ1ZiwgaW50ICpzaXplKQorICovCitpbnQKK3ZhcnN5bV9nZXQoc3Ry
dWN0IHRocmVhZCAqdGQsIHN0cnVjdCB2YXJzeW1fZ2V0X2FyZ3MgKnVhcCkKK3sKKyAgICBj
aGFyIHdpbGRbTUFYVkFSU1lNX05BTUVdOworICAgIHZhcnN5bV90IHN5bTsKKyAgICBpbnQg
ZXJyb3I7CisgICAgaW50IGRsZW4sIGJ1ZnNpemU7CisKKyAgICBpZiAoKGVycm9yID0gY29w
eWluc3RyKHVhcC0+d2lsZCwgd2lsZCwgc2l6ZW9mKHdpbGQpLCBOVUxMKSkgIT0gMCkKKwkJ
Z290byBkb25lOworICAgIGlmICgoZXJyb3IgPSBjb3B5aW4odWFwLT5zaXplLCAmYnVmc2l6
ZSwgc2l6ZW9mKGJ1ZnNpemUpKSkgIT0gMCkKKwkJZ290byBkb25lOworCWlmICh1YXAtPm1h
c2sgJiAoflZBUlNZTV9BTExfTUFTSykpIHsKKwkJZXJyb3IgPSBFSU5WQUw7CisJCWdvdG8g
ZG9uZTsKKwl9CisgICAgc3ltID0gdmFyc3ltZmluZCh1YXAtPm1hc2ssIHdpbGQsIHN0cmxl
bih3aWxkKSk7CisgICAgaWYgKHN5bSA9PSBOVUxMKSB7CisJCWVycm9yID0gRU5PRU5UOwor
CQlnb3RvIGRvbmU7CisgICAgfQorICAgIGRsZW4gPSBzdHJsZW4oc3ltLT52c19kYXRhKTsK
KyAgICBpZiAoZGxlbiA8IGJ1ZnNpemUpIHsKKwkJZXJyb3IgPSBjb3B5b3V0KHN5bS0+dnNf
ZGF0YSwgdWFwLT5idWYsIGRsZW4gKyAxKTsKKyAgICB9IGVsc2UgCisJCWVycm9yID0gRU9W
RVJGTE9XOyAvKiBidWZmZXIgdG9vIHNtYWxsICovCisJaWYgKGVycm9yID09IDApIHsKKwkg
ICAgZGxlbisrOworCQllcnJvciA9IGNvcHlvdXQoJmRsZW4sIHVhcC0+c2l6ZSwgc2l6ZW9m
KGRsZW4pKTsKKwl9CisgICAgdmFyc3ltZHJvcChzeW0pOworZG9uZToKKyAgICByZXR1cm4o
ZXJyb3IpOworfQorCisvKgorICogdmFyc3ltX2xpc3QoKSBzeXN0ZW0gY2FsbAorICoKKyAq
IChpbnQgbGV2ZWwsIGNoYXIgKmJ1ZiwgaW50ICpzaXplLCBpbnQgKm1hcmtlcikKKyAqLwor
aW50Cit2YXJzeW1fbGlzdChzdHJ1Y3QgdGhyZWFkICp0ZCwgc3RydWN0IHZhcnN5bV9saXN0
X2FyZ3MgKnVhcCkKK3sKKwlzdHJ1Y3QgdmFyc3ltc2V0ICp2c3M7CisJc3RydWN0IHZhcnN5
bWVudCAqdmU7CisJc3RydWN0IHByb2MgKnA7CisJaW50IGk7CisJaW50IGVycm9yOworCWlu
dCBieXRlczsKKwlpbnQgZWFybHl0ZXJtOworCWludCBtYXJrZXI7CisJaW50IG1heHNpemU7
CisKKwkvKgorCSAqIEdldCB0aGUgbWFya2VyIGFuZCBtYXhzaXplIGZyb20gdXNlcnNwYWNl
LgorCSAqLworCWlmICgoZXJyb3IgPSBjb3B5aW4odWFwLT5tYXJrZXIsICZtYXJrZXIsIHNp
emVvZihtYXJrZXIpKSkgIT0gMCkKKwkJZ290byBkb25lOworCWlmICgoZXJyb3IgPSBjb3B5
aW4odWFwLT5zaXplLCAmbWF4c2l6ZSwgc2l6ZW9mKG1heHNpemUpKSkgIT0gMCkKKwkJZ290
byBkb25lOworCQorCS8qCisJICogRmlndXJlIG91dCB0aGUgdmFyc3ltIHNldC4KKwkgKi8K
KwlwID0gdGQtPnRkX3Byb2M7CisJdnNzID0gTlVMTDsKKworCXN3aXRjaCAodWFwLT5sZXZl
bCkgeworCWNhc2UgVkFSU1lNX1BQUk9DOgorCQlpZiAocCAmJiBwLT5wX3BwdHIpCisJCQl2
c3MgPSAmcC0+cF9wcHRyLT5wX3ZhcnN5bXNldDsKKwkJYnJlYWs7CisJY2FzZSBWQVJTWU1f
UFJPQzoKKwkJaWYgKHApCisJCQl2c3MgPSAmcC0+cF92YXJzeW1zZXQ7CisJCWJyZWFrOwor
CWNhc2UgVkFSU1lNX1VTRVI6CisJCWlmIChwKSB7CisJCQkvKgorCQkJICogWFhYOiBKYWls
ZWQgdXNlcnMgY3VycmVudGx5IG5vdCBzdXBwb3J0ZWQuCisJCQkgKi8KKwkJCWlmIChqYWls
ZWQocC0+cF91Y3JlZCkpIHsKKwkJCQllcnJvciA9IEVQRVJNOworCQkJCWdvdG8gZG9uZTsK
KwkJCX0KKwkJCXZzcyA9ICZwLT5wX3VjcmVkLT5jcl91aWRpbmZvLT51aV92YXJzeW1zZXQ7
CisJCX0KKwkJYnJlYWs7CisJY2FzZSBWQVJTWU1fU1lTOgorCQlpZiAocCAhPSBOVUxMICYm
IGphaWxlZChwLT5wX3VjcmVkKSkKKwkJCXZzcyA9ICZwLT5wX3VjcmVkLT5jcl9wcmlzb24t
PnByX3ZhcnN5bXNldDsKKwkJZWxzZQorCQkJdnNzID0gJnZhcnN5bXNldF9zeXM7CisJfQor
CWlmICh2c3MgPT0gTlVMTCkgeworCQllcnJvciA9IEVJTlZBTDsKKwkJZ290byBkb25lOwor
CX0KKworCS8qCisJICogTG9vcCB0aHJvdWdoIHRoZSB2YXJpYWJsZXMgYW5kIGR1bXAgdGhl
bSB0byB1YXAtPmJ1ZgorCSAqLworCWkgPSAwOworCWJ5dGVzID0gMDsKKwllYXJseXRlcm0g
PSAwOworCisJVEFJTFFfRk9SRUFDSCh2ZSwgJnZzcy0+dnhfcXVldWUsIHZlX2VudHJ5KSB7
CisJCXZhcnN5bV90IHN5bSA9IHZlLT52ZV9zeW07CisJCWludCBuYW1lbGVuID0gc3RybGVu
KHN5bS0+dnNfbmFtZSk7CisJCWludCBkYXRhbGVuID0gc3RybGVuKHN5bS0+dnNfZGF0YSk7
CisJCWludCB0b3RsZW4gPSBuYW1lbGVuICsgZGF0YWxlbiArIDI7CisKKwkJLyoKKwkJICog
U2tpcCB0byBvdXIgaW5kZXggcG9pbnQKKwkJICovCisJCWlmIChpIDwgbWFya2VyKSB7CisJ
CQkrK2k7CisJCQljb250aW51ZTsKKwkJfQorCisJCS8qCisJCSAqIFN0b3AgaWYgdGhlcmUg
aXMgaW5zdWZmaWNpZW50IHNwYWNlIGluIHRoZSB1c2VyIGJ1ZmZlci4KKwkJICogSWYgd2Ug
aGF2ZW4ndCBzdG9yZWQgYW55dGhpbmcgeWV0IHJldHVybiBFT1ZFUkZMT1cuIAorCQkgKiBO
b3RlIHRoYXQgdGhlIG1hcmtlciBpbmRleCAoaSkgZG9lcyBub3QgY2hhbmdlLgorCQkgKi8K
KwkJaWYgKGJ5dGVzICsgdG90bGVuID4gbWF4c2l6ZSkgeworCQkJaWYgKGJ5dGVzID09IDAp
CisJCQkJZXJyb3IgPSBFT1ZFUkZMT1c7CisJCQllYXJseXRlcm0gPSAxOworCQkJYnJlYWs7
CisJCX0KKworCQllcnJvciA9IGNvcHlvdXQoc3ltLT52c19uYW1lLCB1YXAtPmJ1ZiArIGJ5
dGVzLCBuYW1lbGVuICsgMSk7CisJCWlmIChlcnJvciA9PSAwKSB7CisJCQlieXRlcyArPSBu
YW1lbGVuICsgMTsKKwkJCWVycm9yID0gY29weW91dChzeW0tPnZzX2RhdGEsIHVhcC0+YnVm
ICsgYnl0ZXMsIGRhdGFsZW4gKyAxKTsKKwkJCWlmIChlcnJvciA9PSAwKQorCQkJCWJ5dGVz
ICs9IGRhdGFsZW4gKyAxOworCQkJZWxzZQorCQkJCWJ5dGVzIC09IG5hbWVsZW4gKyAxOwkv
KiByZXZlcnQgaWYgZXJyb3IgKi8KKwkJfQorCQlpZiAoZXJyb3IpIHsKKwkJCWVhcmx5dGVy
bSA9IDE7CisJCQlicmVhazsKKwkJfQorCQkrK2k7CisJfQorCisJLyoKKwkgKiBTYXZlIHRo
ZSBtYXJrZXIgYmFjay4gIElmIG5vIGVycm9yIG9jY3VyZWQgYW5kIGVhcmx5dGVybSBpcyBj
bGVhcgorCSAqIHRoZSBtYXJrZXIgaXMgc2V0IHRvIC0xIGluZGljYXRpbmcgdGhhdCB0aGUg
dmFyaWFibGUgbGlzdCBoYXMgYmVlbgorCSAqIGV4aGF1c3RlZC4gIElmIG5vIGVycm9yIG9j
Y3VyZWQgdGhlIG51bWJlciBvZiBieXRlcyBsb2FkZWQgaW50bworCSAqIHRoZSBidWZmZXIg
d2lsbCBiZSByZXR1cm5lZCwgb3RoZXJ3aXNlIHRoZSBzeXNjYWxsIGNvZGUgcmV0dXJucyAt
MS4KKwkgKi8KKwlpZiAoZXJyb3IgPT0gMCAmJiBlYXJseXRlcm0gPT0gMCkKKwkJbWFya2Vy
ID0gLTE7CisJZWxzZQorCQltYXJrZXIgPSBpOworCWlmIChlcnJvciA9PSAwKQorCQllcnJv
ciA9IGNvcHlvdXQoJm1hcmtlciwgdWFwLT5tYXJrZXIsIHNpemVvZihtYXJrZXIpKTsKKwlp
ZiAoZXJyb3IgPT0gMCkKKwkJZXJyb3IgPSBjb3B5b3V0KCZieXRlcywgdWFwLT5zaXplLCBz
aXplb2YoYnl0ZXMpKTsKK2RvbmU6CisJcmV0dXJuKGVycm9yKTsKK30KKworLyoKKyAqIExv
b2t1cCBhIHZhcmlhbnQgc3ltbGluay4gIFhYWCB1c2UgYSBoYXNoIHRhYmxlLgorICovCitz
dGF0aWMKK3N0cnVjdCB2YXJzeW1lbnQgKgordmFyc3ltbG9va3VwKHN0cnVjdCB2YXJzeW1z
ZXQgKnZzcywgY29uc3QgY2hhciAqbmFtZSwgaW50IG5hbWVsZW4pCit7CisgICAgc3RydWN0
IHZhcnN5bWVudCAqdmU7CisKKyAgICBUQUlMUV9GT1JFQUNIKHZlLCAmdnNzLT52eF9xdWV1
ZSwgdmVfZW50cnkpIHsKKwkJdmFyc3ltX3QgdmFyID0gdmUtPnZlX3N5bTsKKwkJaWYgKHZh
ci0+dnNfbmFtZWxlbiA9PSBuYW1lbGVuICYmIAorCSAgICAJYmNtcChuYW1lLCB2YXItPnZz
X25hbWUsIG5hbWVsZW4pID09IDApIAorCQl7CisJICAgIAlyZXR1cm4odmUpOworCQl9Cisg
ICAgfQorICAgIHJldHVybihOVUxMKTsKK30KKworc3RhdGljIHZhcnN5bV90Cit2YXJzeW1m
aW5kKGludCBtYXNrLCBjb25zdCBjaGFyICpuYW1lLCBpbnQgbmFtZWxlbikKK3sKKyAgICBz
dHJ1Y3QgcHJvYyAqcCA9IGN1cnByb2M7CisgICAgc3RydWN0IHZhcnN5bWVudCAqdmUgPSBO
VUxMOworICAgIHZhcnN5bV90IHN5bTsKKworCS8qCisJICogcGVyLXByb2Nlc3MgdmFyaWFi
bGVzIG92ZXJyaWRlIHBlci11c2VyIHZhcmlhYmxlcywKKyAgICAgICAgICogcGVyLXByb2Nl
c3MgdmFyaWFibGVzIG92ZXJyaWRlIHBhcmVudCBwcm9jZXNzIHZhcmlhYmxlcywKKwkgKiBw
ZXItdXNlciB2YXJpYWJsZXMgb3ZlcnJpZGUgc3lzdGVtLXdpZGUgdmFyaWFibGVzLgorCSAq
IFhYWDogcGVyLXVzZXIgdmFyaWFibGVzIGN1cnJlbnRseSBub3QgYWxsb3dlZCBpbiBqYWls
LgorCSAqLworICAgIGlmICgobWFzayAmIChWQVJTWU1fUFJPQ19NQVNLfFZBUlNZTV9QUFJP
Q19NQVNLfFZBUlNZTV9VU0VSX01BU0spKSAmJiBwICE9IE5VTEwpIHsKKwkJaWYgKG1hc2sg
JiBWQVJTWU1fUFJPQ19NQVNLKQorCQkJdmUgPSB2YXJzeW1sb29rdXAoJnAtPnBfdmFyc3lt
c2V0LCBuYW1lLCBuYW1lbGVuKTsKKwkJaWYgKHZlID09IE5VTEwgJiYgbWFzayAmIFZBUlNZ
TV9QUFJPQ19NQVNLKQorCQkJdmUgPSB2YXJzeW1sb29rdXAoJnAtPnBfcHB0ci0+cF92YXJz
eW1zZXQsIG5hbWUsIG5hbWVsZW4pOworCQlpZiAodmUgPT0gTlVMTCAmJiAobWFzayAmIFZB
UlNZTV9VU0VSX01BU0spICYmICghamFpbGVkKHAtPnBfdWNyZWQpKSkKKwkgICAJCXZlID0g
dmFyc3ltbG9va3VwKCZwLT5wX3VjcmVkLT5jcl91aWRpbmZvLT51aV92YXJzeW1zZXQsIAor
CQkJCQkJCW5hbWUsIG5hbWVsZW4pOworICAgIH0KKyAgICBpZiAodmUgPT0gTlVMTCAmJiAo
bWFzayAmIFZBUlNZTV9TWVNfTUFTSykpIHsKKwkJaWYgKHAgIT0gTlVMTCAmJiBqYWlsZWQo
cC0+cF91Y3JlZCkpIAorCSAgICAJdmUgPSB2YXJzeW1sb29rdXAoJnAtPnBfdWNyZWQtPmNy
X3ByaXNvbi0+cHJfdmFyc3ltc2V0LCAKKwkJCQkJCQluYW1lLCBuYW1lbGVuKTsKKwkJZWxz
ZQorCSAgICAJdmUgPSB2YXJzeW1sb29rdXAoJnZhcnN5bXNldF9zeXMsIG5hbWUsIG5hbWVs
ZW4pOworICAgIH0KKyAgICBpZiAodmUpIHsKKwkJc3ltID0gdmUtPnZlX3N5bTsKKwkJKytz
eW0tPnZzX3JlZnM7CisJCXJldHVybihzeW0pOworICAgIH0gCisJcmV0dXJuKE5VTEwpOwor
fQorCitzdGF0aWMgaW50Cit2YXJzeW1tYWtlKGludCBsZXZlbCwgY29uc3QgY2hhciAqbmFt
ZSwgY29uc3QgY2hhciAqZGF0YSkKK3sKKyAgICB2YXJzeW1fdCBzeW07CisgICAgc3RydWN0
IHZhcnN5bXNldCAqdnNzID0gTlVMTDsKKyAgICBzdHJ1Y3QgdmFyc3ltZW50ICp2ZTsKKyAg
ICBzdHJ1Y3QgcHJvYyAqcCA9IGN1cnByb2M7CisgICAgaW50IG5hbWVsZW4gPSBzdHJsZW4o
bmFtZSk7CisgICAgaW50IGRhdGFsZW47CisgICAgaW50IGVycm9yOworCisJc3dpdGNoKGxl
dmVsKSB7CisJY2FzZSBWQVJTWU1fUFBST0M6CisJCWlmIChwICYmIHAtPnBfcHB0cikKKwkJ
dnNzID0gJnAtPnBfcHB0ci0+cF92YXJzeW1zZXQ7CisJCWJyZWFrOworCWNhc2UgVkFSU1lN
X1BST0M6CisJCWlmIChwKQorCSAJdnNzID0gJnAtPnBfdmFyc3ltc2V0OworCQlicmVhazsK
KwljYXNlIFZBUlNZTV9VU0VSOgorCQlpZiAocCkKKwkgICAgCXZzcyA9ICZwLT5wX3VjcmVk
LT5jcl91aWRpbmZvLT51aV92YXJzeW1zZXQ7CisJCWJyZWFrOworCWNhc2UgVkFSU1lNX1NZ
UzoKKwkJdnNzID0gJnZhcnN5bXNldF9zeXM7CisJCWJyZWFrOworCWNhc2UgVkFSU1lNX1BS
SVNPTjoKKwkJaWYgKHApCisJICAgIAl2c3MgPSAmcC0+cF91Y3JlZC0+Y3JfcHJpc29uLT5w
cl92YXJzeW1zZXQ7CisJCWJyZWFrOworICAgIH0KKyAgICBpZiAodnNzID09IE5VTEwpIHsK
KwkJZXJyb3IgPSBFSU5WQUw7CisgICAgfSBlbHNlIGlmIChkYXRhICYmIHZzcy0+dnhfc2V0
c2l6ZSA+PSBNQVhWQVJTWU1fU0VUKSB7CisJCWVycm9yID0gRTJCSUc7CisgICAgfSBlbHNl
IGlmIChkYXRhKSB7CisJCWRhdGFsZW4gPSBzdHJsZW4oZGF0YSk7CisJCXZlID0gbWFsbG9j
KHNpemVvZihzdHJ1Y3QgdmFyc3ltZW50KSwgTV9WQVJTWU0sIE1fV0FJVE9LfE1fWkVSTyk7
CisJCXN5bSA9IG1hbGxvYyhzaXplb2Yoc3RydWN0IHZhcnN5bSkgKyBuYW1lbGVuICsgZGF0
YWxlbiArIDIsCisJCQkJCSAgIAlNX1ZBUlNZTSwgTV9XQUlUT0spOworCQl2ZS0+dmVfc3lt
ID0gc3ltOworCQlzeW0tPnZzX3JlZnMgPSAxOworCQlzeW0tPnZzX25hbWVsZW4gPSBuYW1l
bGVuOworCQlzeW0tPnZzX25hbWUgPSAoY2hhciAqKShzeW0gKyAxKTsKKwkJc3ltLT52c19k
YXRhID0gc3ltLT52c19uYW1lICsgbmFtZWxlbiArIDE7CisJCXN0cmNweShzeW0tPnZzX25h
bWUsIG5hbWUpOworCQlzdHJjcHkoc3ltLT52c19kYXRhLCBkYXRhKTsKKwkJCisJCVRBSUxR
X0lOU0VSVF9UQUlMKCZ2c3MtPnZ4X3F1ZXVlLCB2ZSwgdmVfZW50cnkpOworCQl2c3MtPnZ4
X3NldHNpemUgKz0gc2l6ZW9mKHN0cnVjdCB2YXJzeW1lbnQpICsgCisJCQkJc2l6ZW9mKHN0
cnVjdCB2YXJzeW0pICsgbmFtZWxlbiArIGRhdGFsZW4gKyA4OyAvKiBYWFggKi8KKworCQll
cnJvciA9IDA7CisgICAgfSBlbHNlIHsKKwkJaWYgKCh2ZSA9IHZhcnN5bWxvb2t1cCh2c3Ms
IG5hbWUsIG5hbWVsZW4pKSAhPSBOVUxMKSB7CisJICAgIAlUQUlMUV9SRU1PVkUoJnZzcy0+
dnhfcXVldWUsIHZlLCB2ZV9lbnRyeSk7CisJCSAgICB2c3MtPnZ4X3NldHNpemUgLT0gc2l6
ZW9mKHN0cnVjdCB2YXJzeW1lbnQpICsgCisJCQkJCQkJICAgc2l6ZW9mKHN0cnVjdCB2YXJz
eW0pICsgbmFtZWxlbiArIAorCQkJCQkJCSAgIHN0cmxlbih2ZS0+dmVfc3ltLT52c19kYXRh
KSArIDg7IC8qIFhYWCAqLworCQkgICAgdmFyc3ltZHJvcCh2ZS0+dmVfc3ltKTsKKwkJICAg
IGZyZWUodmUsIE1fVkFSU1lNKTsKKwkgICAgCWVycm9yID0gMDsKKwkJfSBlbHNlIHsKKwkg
ICAgCWVycm9yID0gRU5PRU5UOworCQl9CisgICAgfQorICAgIHJldHVybihlcnJvcik7Cit9
CisKK3N0YXRpYyB2b2lkCit2YXJzeW1kcm9wKHZhcnN5bV90IHN5bSkKK3sKKyAgICBLQVNT
RVJUKHN5bS0+dnNfcmVmcyA+IDAsICgiJXM6IHN5bS0+dnNfcmVmcyA8PSAwIiwgX19mdW5j
X18pKTsKKyAgICBpZiAoLS1zeW0tPnZzX3JlZnMgPT0gMCkgeworCQlmcmVlKHN5bSwgTV9W
QVJTWU0pOworICAgIH0KK30KKwordm9pZAordmFyc3ltc2V0X2luaXQoc3RydWN0IHZhcnN5
bXNldCAqdnNzLCBzdHJ1Y3QgdmFyc3ltc2V0ICpjb3B5KQoreworICAgIHN0cnVjdCB2YXJz
eW1lbnQgKnZlLCAqbnZlOworCisgICAgVEFJTFFfSU5JVCgmdnNzLT52eF9xdWV1ZSk7CisJ
CisgICAgaWYgKGNvcHkpIHsKKwkJVEFJTFFfRk9SRUFDSCh2ZSwgJmNvcHktPnZ4X3F1ZXVl
LCB2ZV9lbnRyeSkgeworCQkJbnZlID0gbWFsbG9jKHNpemVvZihzdHJ1Y3QgdmFyc3ltZW50
KSwgTV9WQVJTWU0sIE1fV0FJVE9LfE1fWkVSTyk7CisJCQludmUtPnZlX3N5bSA9IHZlLT52
ZV9zeW07CisJCQkrK252ZS0+dmVfc3ltLT52c19yZWZzOworCQkJVEFJTFFfSU5TRVJUX1RB
SUwoJnZzcy0+dnhfcXVldWUsIG52ZSwgdmVfZW50cnkpOworCQl9CisJCXZzcy0+dnhfc2V0
c2l6ZSA9IGNvcHktPnZ4X3NldHNpemU7CisgICAgfQorfQorCit2b2lkCit2YXJzeW1zZXRf
Y2xlYW4oc3RydWN0IHZhcnN5bXNldCAqdnNzKQoreworICAgIHN0cnVjdCB2YXJzeW1lbnQg
KnZlOworCisgICAgd2hpbGUgKCh2ZSA9IFRBSUxRX0ZJUlNUKCZ2c3MtPnZ4X3F1ZXVlKSkg
IT0gTlVMTCkgeworCQlUQUlMUV9SRU1PVkUoJnZzcy0+dnhfcXVldWUsIHZlLCB2ZV9lbnRy
eSk7CisJCXZhcnN5bWRyb3AodmUtPnZlX3N5bSk7CisJCWZyZWUodmUsIE1fVkFSU1lNKTsK
KyAgICB9CisgICAgdnNzLT52eF9zZXRzaXplID0gMDsKK30KKwpJbmRleDogc3JjL2Jpbi9s
bi9sbi4xCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT0KUkNTIGZpbGU6IC9uY3ZzL3NyYy9iaW4vbG4vbG4uMSx2
CnJldHJpZXZpbmcgcmV2aXNpb24gMS4zMApkaWZmIC11IC1iIC1yMS4zMCBsbi4xCi0tLSBz
cmMvYmluL2xuL2xuLjEJMTYgSmFuIDIwMDUgMTY6NDE6NTcgLTAwMDAJMS4zMAorKysgc3Jj
L2Jpbi9sbi9sbi4xCTIyIEphbiAyMDA2IDIyOjU5OjM5IC0wMDAwCkBAIC0xODYsNiArMTg2
LDQ3IEBACiB3aGljaCBwZXJmb3JtcyBhCiAuWHIgbGluayAyCiBvcGVyYXRpb24gdXNpbmcg
dGhlIHR3byBwYXNzZWQgYXJndW1lbnRzLgorLlNoIFZBUklBTlQgU1lNTElOS1MKKy5EeAor
c3VwcG9ydHMgYSBzcGVjaWFsIGtpbmQgb2YgZHluYW1pYworc3ltYm9saWMgbGluayBjYWxs
ZWQgYQorLkVtIHZhcmlhbnQgc3ltbGluayAuCitUaGUKKy5BciBzb3VyY2VfZmlsZQorb2Yg
YSB2YXJpYW50IHN5bWxpbmsgbWF5IGNvbnRhaW4gb25lIG9yIG1vcmUKK3ZhcmlhYmxlIG5h
bWVzLiAgRWFjaCBvZiB0aGVzZSB2YXJpYWJsZQorbmFtZXMgaXMgZW5jbG9zZWQgaW4gYnJh
Y2VzIGFuZCBwcmVjZWRlZCBieSBhCitkb2xsYXIgc2lnbiBpbiB0aGUgc3R5bGUgb2YgdmFy
aWFibGUgcmVmZXJlbmNlcyBpbgorLlhyIHNoIDEKK2FuZAorLlhyIGNzaCAxIC4KKy5QcAor
V2hlbmV2ZXIgYSB2YXJpYW50IHN5bWxpbmsgaXMgZm9sbG93ZWQsIGVhY2gKK3ZhcmlhYmxl
IGZvdW5kIGluCisuQXIgc291cmNlX2ZpbGUKK2lzIHJlcGxhY2VkIGJ5IGl0cyBhc3NvY2lh
dGVkIHZhbHVlLgorSW4gdGhpcyBtYW5uZXIsIGEgdmFyaWFudCBzeW1saW5rIG1heSByZXNv
bHZlIHRvIGRpZmZlcmVudAorcGF0aHMgYmFzZWQgb24gY29udGV4dC4gIFRoZSBmYWNpbGl0
eQorc3VwcG9ydHMgcGVyLXByb2Nlc3MsIHBlci11c2VyLCBhbmQgc3lzdGVtLXdpZGUgdmFy
c3ltcy4KKy5QcAorVmFyc3ltIHZhcmlhYmxlcyBjYW4gYmUgc2V0IHdpdGggdGhlCisuWHIg
dmFyc3ltIDEKK3V0aWxpdHkuICBSZWd1bGFyCisuWHIgZW52aXJvbiA3CitlbnZpcm9ubWVu
dCB2YXJpYWJsZXMgYXJlCitub3QgdXNlZCB0byByZXNvbHZlIHZhcmlhbnQgc3ltbGlua3Mu
CisuU3MgRVhBTVBMRQorLkJkIC1saXRlcmFsIC1vZmZzZXQgaW5kZW50CitzeXNjdGwgLXcg
dmZzLnZhcnN5bV9lbmFibGU9MQorCitsbiAtcyAnYSR7ZnViYXJ9YicgdGVzdAorCitlY2hv
ICdIZWxsbycgPiBheHhiCitlY2hvICdHb29kYnllJyA+IGF5eWIKKwordmFyc3ltIGZ1YmFy
PXh4OyBjYXQgdGVzdAordmFyc3ltIGZ1YmFyPXl5OyBjYXQgdGVzdAorLkVkCiAuU2ggQ09N
UEFUSUJJTElUWQogVGhlCiAuRmwgaCAsCkBAIC0yMDksNyArMjUwLDggQEAKIC5YciByZWFk
bGluayAyICwKIC5YciBzdGF0IDIgLAogLlhyIHN5bWxpbmsgMiAsCi0uWHIgc3ltbGluayA3
CisuWHIgc3ltbGluayA3ICwKKy5YciB2YXJzeW0gMQogLlNoIFNUQU5EQVJEUwogVGhlCiAu
Tm0KQEAgLTIyNCw0ICsyNjYsNCBAQAogQW4KIC5ObQogY29tbWFuZCBhcHBlYXJlZCBpbgot
LkF0IHYxIC4KKy5BdCB2MSAuIFZhcmlhbnQgU3ltbGlua3MgYXBwZWFyZWQgaW4gRHJhZ29u
Rmx5IEJTRCAuCkluZGV4OiBzcmMvaW5jbHVkZS91bmlzdGQuaAo9PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ClJD
UyBmaWxlOiAvbmN2cy9zcmMvaW5jbHVkZS91bmlzdGQuaCx2CnJldHJpZXZpbmcgcmV2aXNp
b24gMS43OApkaWZmIC11IC1iIC1yMS43OCB1bmlzdGQuaAotLS0gc3JjL2luY2x1ZGUvdW5p
c3RkLmgJMTMgTWF5IDIwMDUgMTY6Mjc6MzAgLTAwMDAJMS43OAorKysgc3JjL2luY2x1ZGUv
dW5pc3RkLmgJMjIgSmFuIDIwMDYgMjI6NTk6MzkgLTAwMDAKQEAgLTU1MCw2ICs1NTAsMTAg
QEAKIGludAkgdW53aGl0ZW91dChjb25zdCBjaGFyICopOwogdm9pZAkqdmFsbG9jKHNpemVf
dCk7CQkJLyogb2Jzb2xldGVkIGJ5IG1hbGxvYygpICovCiAKK2ludAkgdmFyc3ltX3NldChp
bnQsIGNvbnN0IGNoYXIqLCBjb25zdCBjaGFyKik7CitpbnQJIHZhcnN5bV9nZXQoaW50LCBj
b25zdCBjaGFyKiwgY2hhciosIGludCopOworaW50CSB2YXJzeW1fbGlzdChpbnQsIGNoYXIq
LCBpbnQqLCBpbnQqKTsKKwogI2lmbmRlZiBfT1BUUkVTRVRfREVDTEFSRUQKICNkZWZpbmUJ
X09QVFJFU0VUX0RFQ0xBUkVECiBleHRlcm4gaW50IG9wdHJlc2V0OwkJCS8qIGdldG9wdCgz
KSBleHRlcm5hbCB2YXJpYWJsZSAqLwpJbmRleDogc3JjL3N5cy9jb25mL2ZpbGVzCj09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT0KUkNTIGZpbGU6IC9uY3ZzL3NyYy9zeXMvY29uZi9maWxlcyx2CnJldHJpZXZp
bmcgcmV2aXNpb24gMS4xMDMxLjIuMTYKZGlmZiAtdSAtYiAtcjEuMTAzMS4yLjE2IGZpbGVz
Ci0tLSBzcmMvc3lzL2NvbmYvZmlsZXMJMTMgSmFuIDIwMDYgMTQ6NTU6MTYgLTAwMDAJMS4x
MDMxLjIuMTYKKysrIHNyYy9zeXMvY29uZi9maWxlcwkyMiBKYW4gMjAwNiAyMjo1OTozOSAt
MDAwMApAQCAtMTI0Myw2ICsxMjQzLDcgQEAKIGtlcm4va2Vybl90aW1lb3V0LmMJCXN0YW5k
YXJkCiBrZXJuL2tlcm5fdW10eC5jCQlzdGFuZGFyZAoga2Vybi9rZXJuX3V1aWQuYwkJc3Rh
bmRhcmQKK2tlcm4va2Vybl92YXJzeW0uYwkJc3RhbmRhcmQKIGtlcm4va2Vybl94eHguYwkJ
CXN0YW5kYXJkCiBrZXJuL2xpbmtfZWxmLmMJCQlzdGFuZGFyZAoga2Vybi9saW5rZXJfaWYu
bQkJc3RhbmRhcmQKSW5kZXg6IHNyYy9zeXMvY29tcGF0L2ZyZWVic2QzMi9zeXNjYWxscy5t
YXN0ZXIKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PQpSQ1MgZmlsZTogL25jdnMvc3JjL3N5cy9jb21wYXQvZnJl
ZWJzZDMyL3N5c2NhbGxzLm1hc3Rlcix2CnJldHJpZXZpbmcgcmV2aXNpb24gMS41MC4yLjMK
ZGlmZiAtdSAtYiAtcjEuNTAuMi4zIHN5c2NhbGxzLm1hc3RlcgotLS0gc3JjL3N5cy9jb21w
YXQvZnJlZWJzZDMyL3N5c2NhbGxzLm1hc3Rlci5vcmlnCVNhdCBPY3QgMjggMTk6NDk6MDUg
MjAwNgorKysgc3JjL3N5cy9jb21wYXQvZnJlZWJzZDMyL3N5c2NhbGxzLm1hc3RlcglNb24g
QXVnIDI3IDIxOjA0OjE5IDIwMDcKQEAgLTc5NiwzICs3OTYsMTEgQEAKIDQ4MAlBVUVfRlRS
VU5DQVRFCVNURAl7IGludCBmcmVlYnNkMzJfZnRydW5jYXRlKGludCBmZCwgXAogCQkJCSAg
ICB1X2ludDMyX3QgbGVuZ3RobG8sIHVfaW50MzJfdCBsZW5ndGhoaSk7IH0KIDQ4MQlBVUVf
S0lMTAlOT1BST1RPCXsgaW50IHRocl9raWxsMihwaWRfdCBwaWQsIGxvbmcgaWQsIGludCBz
aWcpOyB9Cis0ODIJQVVFX05VTEwJTk9QUk9UTwl7IGludCB2YXJzeW1fc2V0KGludCBsZXZl
bCwgXAorCQkJCSAgICBjb25zdCBjaGFyICpuYW1lLCBcCisJCQkJICAgIGNvbnN0IGNoYXIg
KmRhdGEpOyB9Cis0ODMJQVVFX05VTEwJTk9QUk9UTwl7IGludCB2YXJzeW1fZ2V0KGludCBt
YXNrLCBcCisJCQkJICAgIGNvbnN0IGNoYXIgKndpbGQsIFwKKwkJCQkgICAgY2hhciAqYnVm
LCBpbnQgKnNpemUpOyB9Cis0ODQJQVVFX05VTEwJTk9QUk9UTwl7IGludCB2YXJzeW1fbGlz
dChpbnQgbGV2ZWwsIFwKKwkJCQkgICAgY2hhciAqYnVmLCBpbnQgKnNpemUsIGludCAqbWFy
a2VyKTsgfQpJbmRleDogc3JjL3N5cy9rZXJuL3N5c2NhbGxzLm1hc3Rlcgo9PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09ClJDUyBmaWxlOiAvbmN2cy9zcmMvc3lzL2tlcm4vc3lzY2FsbHMubWFzdGVyLHYKcmV0
cmlldmluZyByZXZpc2lvbiAxLjE5OC4yLjEKZGlmZiAtdSAtYiAtcjEuMTk4LjIuMSBzeXNj
YWxscy5tYXN0ZXIKLS0tIHNyYy9zeXMva2Vybi9zeXNjYWxscy5tYXN0ZXIJMjEgTm92IDIw
MDUgMDE6MTI6MzcgLTAwMDAJMS4xOTguMi4xCisrKyBzcmMvc3lzL2tlcm4vc3lzY2FsbHMu
bWFzdGVyCTIyIEphbiAyMDA2IDIyOjU5OjQwIC0wMDAwCkBAIC04NDcsNSArODQ3LDEzIEBA
CiA0NzkJQVVFX1RSVU5DQVRFCVNURAl7IGludCB0cnVuY2F0ZShjaGFyICpwYXRoLCBvZmZf
dCBsZW5ndGgpOyB9CiA0ODAJQVVFX0ZUUlVOQ0FURQlTVEQJeyBpbnQgZnRydW5jYXRlKGlu
dCBmZCwgb2ZmX3QgbGVuZ3RoKTsgfQogNDgxCUFVRV9LSUxMCVNURAl7IGludCB0aHJfa2ls
bDIocGlkX3QgcGlkLCBsb25nIGlkLCBpbnQgc2lnKTsgfQorNDgyICAgICBBVUVfTlVMTCAg
ICAgICAgU1RECXsgaW50IHZhcnN5bV9zZXQoaW50IGxldmVsLCBcCisJCQkJICAgICBjb25z
dCBjaGFyICpuYW1lLCBcCisJCQkJICAgICBjb25zdCBjaGFyICpkYXRhKTsgfQorNDgzICAg
ICBBVUVfTlVMTCAgICAgICAgU1RECXsgaW50IHZhcnN5bV9nZXQoaW50IG1hc2ssIFwKKwkJ
CQkgICAgIGNvbnN0IGNoYXIgKndpbGQsIFwKKwkJCQkgICAgIGNoYXIgKmJ1ZiwgaW50ICpz
aXplKTsgfQorNDg0ICAgICBBVUVfTlVMTCAgICAgICAgU1RECXsgaW50IHZhcnN5bV9saXN0
KGludCBsZXZlbCwgXAorCQkJCSAgICAgY2hhciAqYnVmLCBpbnQgKnNpemUsIGludCAqbWFy
a2VyKTsgfQogOyBQbGVhc2UgY29weSBhbnkgYWRkaXRpb25zIGFuZCBjaGFuZ2VzIHRvIHRo
ZSBmb2xsb3dpbmcgY29tcGF0YWJpbGl0eSB0YWJsZXM6CiA7IHN5cy9jb21wYXQvZnJlZWJz
ZDMyL3N5c2NhbGxzLm1hc3RlcgpJbmRleDogc3JjL3N5cy9rZXJuL2tlcm5fZXhlYy5jCj09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT0KUkNTIGZpbGU6IC9uY3ZzL3NyYy9zeXMva2Vybi9rZXJuX2V4ZWMuYyx2
CnJldHJpZXZpbmcgcmV2aXNpb24gMS4yNzUuMi4zCmRpZmYgLXUgLWIgLXIxLjI3NS4yLjMg
a2Vybl9leGVjLmMKLS0tIHNyYy9zeXMva2Vybi9rZXJuX2V4ZWMuYwkyNiBEZWMgMjAwNSAx
Mzo0NzoxOSAtMDAwMAkxLjI3NS4yLjMKKysrIHNyYy9zeXMva2Vybi9rZXJuX2V4ZWMuYwky
MiBKYW4gMjAwNiAyMjo1OTo0MCAtMDAwMApAQCAtNjE3LDYgKzYxNywxMSBAQAogCQljaGFu
Z2Vfc3ZnaWQobmV3Y3JlZCwgbmV3Y3JlZC0+Y3JfZ2lkKTsKIAkJcC0+cF91Y3JlZCA9IG5l
d2NyZWQ7CiAJCW5ld2NyZWQgPSBOVUxMOworCisJCS8qCisJCSAqIENsZWFyIGxvY2FsIHZh
cnN5bSB2YXJpYWJsZXMKKwkJICovCisJCXZhcnN5bXNldF9jbGVhbigmcC0+cF92YXJzeW1z
ZXQpOwogCX0gZWxzZSB7CiAJCWlmIChvbGRjcmVkLT5jcl91aWQgPT0gb2xkY3JlZC0+Y3Jf
cnVpZCAmJgogCQkgICAgb2xkY3JlZC0+Y3JfZ2lkID09IG9sZGNyZWQtPmNyX3JnaWQpCklu
ZGV4OiBzcmMvc3lzL2tlcm4va2Vybl9mb3JrLmMKPT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQpSQ1MgZmlsZTog
L25jdnMvc3JjL3N5cy9rZXJuL2tlcm5fZm9yay5jLHYKcmV0cmlldmluZyByZXZpc2lvbiAx
LjI1MgpkaWZmIC11IC1iIC1yMS4yNTIga2Vybl9mb3JrLmMKLS0tIHNyYy9zeXMva2Vybi9r
ZXJuX2ZvcmsuYwkxIEp1bCAyMDA1IDE2OjI4OjMwIC0wMDAwCTEuMjUyCisrKyBzcmMvc3lz
L2tlcm4va2Vybl9mb3JrLmMJMjIgSmFuIDIwMDYgMjI6NTk6NDEgLTAwMDAKQEAgLTU5Niw3
ICs1OTYsNyBAQAogCUxJU1RfSU5TRVJUX0FGVEVSKHAxLCBwMiwgcF9wZ2xpc3QpOwogCVBH
UlBfVU5MT0NLKHAxLT5wX3BncnApOwogCUxJU1RfSU5JVCgmcDItPnBfY2hpbGRyZW4pOwot
CisJdmFyc3ltc2V0X2luaXQoJnAyLT5wX3ZhcnN5bXNldCwgJnAxLT5wX3ZhcnN5bXNldCk7
CiAJY2FsbG91dF9pbml0KCZwMi0+cF9pdGNhbGxvdXQsIENBTExPVVRfTVBTQUZFKTsKIAog
I2lmZGVmIEtUUkFDRQpJbmRleDogc3JjL3N5cy9rZXJuL2tlcm5famFpbC5jCj09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT0KUkNTIGZpbGU6IC9uY3ZzL3NyYy9zeXMva2Vybi9rZXJuX2phaWwuYyx2CnJldHJp
ZXZpbmcgcmV2aXNpb24gMS41MC4yLjEKZGlmZiAtdSAtYiAtcjEuNTAuMi4xIGtlcm5famFp
bC5jCi0tLSBzcmMvc3lzL2tlcm4va2Vybl9qYWlsLmMJMTMgTm92IDIwMDUgMDM6MTI6MzIg
LTAwMDAJMS41MC4yLjEKKysrIHNyYy9zeXMva2Vybi9rZXJuX2phaWwuYwkyMiBKYW4gMjAw
NiAyMjo1OTo0MSAtMDAwMApAQCAtMTYzLDYgKzE2Myw3IEBACiAJCXByLT5wcl9zbG90cyA9
IG1hbGxvYyhzaXplb2YoKnByLT5wcl9zbG90cykgKiBwcmlzb25fc2VydmljZV9zbG90cywK
IAkJICAgIE1fUFJJU09OLCBNX1pFUk8gfCBNX1dBSVRPSyk7CiAJfQorCXZhcnN5bXNldF9p
bml0KCZwci0+cHJfdmFyc3ltc2V0LCBOVUxMKTsKIAogCS8qIERldGVybWluZSBuZXh0IHBy
X2lkIGFuZCBhZGQgcHJpc29uIHRvIGFsbHByaXNvbiBsaXN0LiAqLwogCXN4X3hsb2NrKCZh
bGxwcmlzb25fbG9jayk7CkBAIC0xNzYsNyArMTc3LDcgQEAKIAkJCWlmICh0cnlwcmlkID09
IEpBSUxfTUFYKSB7CiAJCQkJc3hfeHVubG9jaygmYWxscHJpc29uX2xvY2spOwogCQkJCWVy
cm9yID0gRUFHQUlOOwotCQkJCWdvdG8gZV9kcm9wdm5yZWY7CisJCQkJZ290byBlX2NsZWFu
dmFyc3ltOwogCQkJfQogCQkJZ290byBuZXh0OwogCQl9CkBAIC0yMDcsNiArMjA4LDggQEAK
IAkJcHNydi0+cHNfZGVzdHJveShwc3J2LCBwcik7CiAJfQogCXN4X3N1bmxvY2soJmFsbHBy
aXNvbl9sb2NrKTsKK2VfY2xlYW52YXJzeW06CisJdmFyc3ltc2V0X2NsZWFuKCZwci0+cHJf
dmFyc3ltc2V0KTsKIGVfZHJvcHZucmVmOgogCXZmc2xvY2tlZCA9IFZGU19MT0NLX0dJQU5U
KHByLT5wcl9yb290LT52X21vdW50KTsKIAl2cmVsZShwci0+cHJfcm9vdCk7CkBAIC0zNDMs
NiArMzQ2LDcgQEAKIAl2cmVsZShwci0+cHJfcm9vdCk7CiAJVkZTX1VOTE9DS19HSUFOVCh2
ZnNsb2NrZWQpOwogCisJdmFyc3ltc2V0X2NsZWFuKCZwci0+cHJfdmFyc3ltc2V0KTsKIAlt
dHhfZGVzdHJveSgmcHItPnByX210eCk7CiAJaWYgKHByLT5wcl9saW51eCAhPSBOVUxMKQog
CQlGUkVFKHByLT5wcl9saW51eCwgTV9QUklTT04pOwpJbmRleDogc3JjL3N5cy9rZXJuL2tl
cm5fcmVzb3VyY2UuYwo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09ClJDUyBmaWxlOiAvbmN2cy9zcmMvc3lzL2tl
cm4va2Vybl9yZXNvdXJjZS5jLHYKcmV0cmlldmluZyByZXZpc2lvbiAxLjE0OC4yLjEKZGlm
ZiAtdSAtYiAtcjEuMTQ4LjIuMSBrZXJuX3Jlc291cmNlLmMKLS0tIHNyYy9zeXMva2Vybi9r
ZXJuX3Jlc291cmNlLmMJMjggRGVjIDIwMDUgMTc6MzU6NTUgLTAwMDAJMS4xNDguMi4xCisr
KyBzcmMvc3lzL2tlcm4va2Vybl9yZXNvdXJjZS5jCTIyIEphbiAyMDA2IDIyOjU5OjQxIC0w
MDAwCkBAIC0xMDU1LDYgKzEwNTUsNyBAQAogCQl9IGVsc2UgewogCQkJdWlwLT51aV9tdHhw
ID0gbXR4X3Bvb2xfYWxsb2MobXR4cG9vbF9zbGVlcCk7CiAJCQl1aXAtPnVpX3VpZCA9IHVp
ZDsKKwkJCXZhcnN5bXNldF9pbml0KCZ1aXAtPnVpX3ZhcnN5bXNldCwgTlVMTCk7CiAJCQlM
SVNUX0lOU0VSVF9IRUFEKFVJSEFTSCh1aWQpLCB1aXAsIHVpX2hhc2gpOwogCQl9CiAJfQpA
QCAtMTEyNSw2ICsxMTI2LDcgQEAKIAkJaWYgKHVpcC0+dWlfcHJvY2NudCAhPSAwKQogCQkJ
cHJpbnRmKCJmcmVlaW5nIHVpZGluZm86IHVpZCA9ICVkLCBwcm9jY250ID0gJWxkXG4iLAog
CQkJICAgIHVpcC0+dWlfdWlkLCB1aXAtPnVpX3Byb2NjbnQpOworCQl2YXJzeW1zZXRfY2xl
YW4oJnVpcC0+dWlfdmFyc3ltc2V0KTsKIAkJVUlESU5GT19VTkxPQ0sodWlwKTsKIAkJRlJF
RSh1aXAsIE1fVUlESU5GTyk7CiAJCXJldHVybjsKSW5kZXg6IHNyYy9zeXMva2Vybi92ZnNf
bG9va3VwLmMKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PQpSQ1MgZmlsZTogL25jdnMvc3JjL3N5cy9rZXJuL3Zm
c19sb29rdXAuYyx2CnJldHJpZXZpbmcgcmV2aXNpb24gMS44MC4yLjMKZGlmZiAtdSAtYiAt
cjEuODAuMi4zIHZmc19sb29rdXAuYwotLS0gc3JjL3N5cy9rZXJuL3Zmc19sb29rdXAuYwky
OSBTZXAgMjAwNSAxODo1MzoxMCAtMDAwMAkxLjgwLjIuMworKysgc3JjL3N5cy9rZXJuL3Zm
c19sb29rdXAuYwkyMiBKYW4gMjAwNiAyMjo1OTo0MSAtMDAwMApAQCAtNjMsNiArNjMsMTAg
QEAKICNkZWZpbmUJTkFNRUlfRElBR05PU1RJQyAxCiAjdW5kZWYgTkFNRUlfRElBR05PU1RJ
QwogCitpbnQgdmFyc3ltX2VuYWJsZSA9IDA7CitTWVNDVExfSU5UKF92ZnMsIE9JRF9BVVRP
LCB2YXJzeW1fZW5hYmxlLCBDVExGTEFHX1JXLCAmdmFyc3ltX2VuYWJsZSwgMCwKKyAgICAi
RW5hYmxlIFZhcmlhbnQgU3ltbGlua3MiKTsKKwogLyoKICAqIEFsbG9jYXRpb24gem9uZSBm
b3IgbmFtZWkKICAqLwpAQCAtMjYyLDYgKzI2Niw4IEBACiAJCQlicmVhazsKIAkJfQogCQls
aW5rbGVuID0gTUFYUEFUSExFTiAtIGF1aW8udWlvX3Jlc2lkOworCQlpZiAodmFyc3ltX2Vu
YWJsZSkKKwkJCWxpbmtsZW4gPSB2YXJzeW1yZXBsYWNlKGNwLCBsaW5rbGVuLCBNQVhQQVRI
TEVOKTsKIAkJaWYgKGxpbmtsZW4gPT0gMCkgewogCQkJaWYgKG5kcC0+bmlfcGF0aGxlbiA+
IDEpCiAJCQkJdW1hX3pmcmVlKG5hbWVpX3pvbmUsIGNwKTsKSW5kZXg6IHNyYy9zeXMvc3lz
L2phaWwuaAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09ClJDUyBmaWxlOiAvbmN2cy9zcmMvc3lzL3N5cy9qYWls
LmgsdgpyZXRyaWV2aW5nIHJldmlzaW9uIDEuMjYKZGlmZiAtdSAtYiAtcjEuMjYgamFpbC5o
Ci0tLSBzcmMvc3lzL3N5cy9qYWlsLmgJOSBKdW4gMjAwNSAxODo0OToxOSAtMDAwMAkxLjI2
CisrKyBzcmMvc3lzL3N5cy9qYWlsLmgJMjIgSmFuIDIwMDYgMjI6NTk6NDIgLTAwMDAKQEAg
LTYxLDYgKzYxLDcgQEAKICAqICAgKGQpIHNldCBvbmx5IGR1cmluZyBkZXN0cnVjdGlvbiBv
ZiBqYWlsLCBubyBtdXRleCBuZWVkZWQKICAqLwogI2lmIGRlZmluZWQoX0tFUk5FTCkgfHwg
ZGVmaW5lZChfV0FOVF9QUklTT04pCisjaW5jbHVkZSA8c3lzL3ZhcnN5bS5oPgogc3RydWN0
IHByaXNvbiB7CiAJTElTVF9FTlRSWShwcmlzb24pIHByX2xpc3Q7CQkJLyogKGEpIGFsbCBw
cmlzb25zICovCiAJaW50CQkgcHJfaWQ7CQkJCS8qIChjKSBwcmlzb24gaWQgKi8KQEAgLTcy
LDYgKzczLDcgQEAKIAl2b2lkCQkqcHJfbGludXg7CQkJLyogKHApIGxpbnV4IGFiaSAqLwog
CWludAkJIHByX3NlY3VyZWxldmVsOwkJLyogKHApIHNlY3VyZWxldmVsICovCiAJc3RydWN0
IHRhc2sJIHByX3Rhc2s7CQkJLyogKGQpIGRlc3Ryb3kgdGFzayAqLworCXN0cnVjdCB2YXJz
eW1zZXQgcHJfdmFyc3ltc2V0OwkJCS8qIChwKSBwcmlzb24gdmFyc3ltcyAqLwogCXN0cnVj
dCBtdHgJIHByX210eDsKIH07CiAjZW5kaWYgLyogX0tFUk5FTCB8fCBfV0FOVF9QUklTT04g
Ki8KSW5kZXg6IHNyYy9zeXMvc3lzL25hbWVpLmgKPT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQpSQ1MgZmlsZTog
L25jdnMvc3JjL3N5cy9zeXMvbmFtZWkuaCx2CnJldHJpZXZpbmcgcmV2aXNpb24gMS40Nwpk
aWZmIC11IC1iIC1yMS40NyBuYW1laS5oCi0tLSBzcmMvc3lzL3N5cy9uYW1laS5oCTI3IEFw
ciAyMDA1IDA5OjAwOjQ3IC0wMDAwCTEuNDcKKysrIHNyYy9zeXMvc3lzL25hbWVpLmgJMjIg
SmFuIDIwMDYgMjI6NTk6NDIgLTAwMDAKQEAgLTE3NCw2ICsxNzQsOCBAQAogCiB2b2lkIE5E
RlJFRShzdHJ1Y3QgbmFtZWlkYXRhICosIGNvbnN0IHVfaW50KTsKIAorZXh0ZXJuIGludCB2
YXJzeW1fZW5hYmxlOworCiBpbnQJbmFtZWkoc3RydWN0IG5hbWVpZGF0YSAqbmRwKTsKIGlu
dAlsb29rdXAoc3RydWN0IG5hbWVpZGF0YSAqbmRwKTsKIGludAlyZWxvb2t1cChzdHJ1Y3Qg
dm5vZGUgKmR2cCwgc3RydWN0IHZub2RlICoqdnBwLApJbmRleDogc3JjL3N5cy9zeXMvcHJv
Yy5oCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT0KUkNTIGZpbGU6IC9uY3ZzL3NyYy9zeXMvc3lzL3Byb2MuaCx2
CnJldHJpZXZpbmcgcmV2aXNpb24gMS40MzIuMi4yCmRpZmYgLXUgLWIgLXIxLjQzMi4yLjIg
cHJvYy5oCi0tLSBzcmMvc3lzL3N5cy9wcm9jLmgJNCBPY3QgMjAwNSAwNDo0MToyNiAtMDAw
MAkxLjQzMi4yLjIKKysrIHNyYy9zeXMvc3lzL3Byb2MuaAkyMiBKYW4gMjAwNiAyMjo1OTo0
MiAtMDAwMApAQCAtNjAsNiArNjAsNyBAQAogI2VuZGlmCiAjaW5jbHVkZSA8c3lzL3Vjb250
ZXh0Lmg+CiAjaW5jbHVkZSA8c3lzL3VjcmVkLmg+CisjaW5jbHVkZSA8c3lzL3ZhcnN5bS5o
PgogI2luY2x1ZGUgPG1hY2hpbmUvcHJvYy5oPgkJLyogTWFjaGluZS1kZXBlbmRlbnQgcHJv
YyBzdWJzdHJ1Y3QuICovCiAKIC8qCkBAIC01MTIsNiArNTEzLDcgQEAKIAlMSVNUX0VOVFJZ
KHByb2MpIHBfc2libGluZzsJLyogKGUpIExpc3Qgb2Ygc2libGluZyBwcm9jZXNzZXMuICov
CiAJTElTVF9IRUFEKCwgcHJvYykgcF9jaGlsZHJlbjsJLyogKGUpIFBvaW50ZXIgdG8gbGlz
dCBvZiBjaGlsZHJlbi4gKi8KIAlzdHJ1Y3QgbXR4CXBfbXR4OwkJLyogKG4pIExvY2sgZm9y
IHRoaXMgc3RydWN0LiAqLworCXN0cnVjdCB2YXJzeW1zZXQgcF92YXJzeW1zZXQ7CS8qIChj
KSBwcm9jZXNzIHZhcnN5bXNldCAqLwogCXN0cnVjdCBrc2lnaW5mbyAqcF9rc2k7CS8qIExv
Y2tlZCBieSBwYXJlbnQgcHJvYyBsb2NrICovCiAJc2lncXVldWVfdAlwX3NpZ3F1ZXVlOwkv
KiAoYykgU2lncyBub3QgZGVsaXZlcmVkIHRvIGEgdGQuICovCiAjZGVmaW5lIHBfc2lnbGlz
dAlwX3NpZ3F1ZXVlLnNxX3NpZ25hbHMKSW5kZXg6IHNyYy9zeXMvc3lzL3Jlc291cmNldmFy
LmgKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PQpSQ1MgZmlsZTogL25jdnMvc3JjL3N5cy9zeXMvcmVzb3VyY2V2
YXIuaCx2CnJldHJpZXZpbmcgcmV2aXNpb24gMS40NwpkaWZmIC11IC1iIC1yMS40NyByZXNv
dXJjZXZhci5oCi0tLSBzcmMvc3lzL3N5cy9yZXNvdXJjZXZhci5oCTcgSmFuIDIwMDUgMDI6
Mjk6MjMgLTAwMDAJMS40NworKysgc3JjL3N5cy9zeXMvcmVzb3VyY2V2YXIuaAkyMiBKYW4g
MjAwNiAyMjo1OTo0MiAtMDAwMApAQCAtMzgsNiArMzgsNyBAQAogI2lmZGVmIF9LRVJORUwK
ICNpbmNsdWRlIDxzeXMvX2xvY2suaD4KICNpbmNsdWRlIDxzeXMvX211dGV4Lmg+CisjaW5j
bHVkZSA8c3lzL3ZhcnN5bS5oPgogI2VuZGlmCiAKIC8qCkBAIC05OSw2ICsxMDAsNyBAQAog
CWxvbmcJdWlfcHJvY2NudDsJCS8qIChiKSBudW1iZXIgb2YgcHJvY2Vzc2VzICovCiAJdWlk
X3QJdWlfdWlkOwkJCS8qIChhKSB1aWQgKi8KIAl1X2ludAl1aV9yZWY7CQkJLyogKGIpIHJl
ZmVyZW5jZSBjb3VudCAqLworCXN0cnVjdCB2YXJzeW1zZXQgdWlfdmFyc3ltc2V0OwkvKiAo
YikgcGVyLXVzZXIgdmFyc3ltcyAqLwogCXN0cnVjdCBtdHggKnVpX210eHA7CQkvKiBwcm90
ZWN0IGFsbCBjb3VudHMvbGltaXRzICovCiB9OwoKSW5kZXg6IHNyYy9iaW4vTWFrZWZpbGUK
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PQpSQ1MgZmlsZTogL25jdnMvc3JjL2Jpbi9NYWtlZmlsZSx2CnJldHJp
ZXZpbmcgcmV2aXNpb24gMS4yNQpkaWZmIC11IC1iIC1yMS4yNSBNYWtlZmlsZQotLS0gc3Jj
L2Jpbi9NYWtlZmlsZSAgICAyIE1hciAyMDA1IDExOjUzOjIxIC0wMDAwICAgICAgIDEuMjUK
KysrIHNyYy9iaW4vTWFrZWZpbGUgICAgMjYgSmFuIDIwMDYgMjA6NDM6NTAgLTAwMDAKQEAg
LTM1LDcgKzM1LDggQEAKCXNsZWVwIFwKCXN0dHkgXAoJc3luYyBcCi0JdGVzdAorCXRlc3Qg
XAorCXZhcnN5bQoKIC5pZiAhZGVmaW5lZChOT19SQ01EUykKIF9yY3A9CXJjcAoKZGlmZiAt
VTMgLU4gc3JjL3N5cy9zeXMvdmFyc3ltLmggc3JjL3N5cy9zeXMvdmFyc3ltLmgKLS0tIHNy
Yy9zeXMvc3lzL3ZhcnN5bS5oCVdlZCBEZWMgMzEgMTk6MDA6MDAgMTk2OQorKysgc3JjL3N5
cy9zeXMvdmFyc3ltLmgJVGh1IEZlYiAxNiAwOTozMToxNCAyMDA2CkBAIC0wLDAgKzEsNTYg
QEAKKy8qCisgKiBTWVMvVkFSU1lNLkgKKyAqCisgKglJbXBsZW1lbnRzIHN0cnVjdHVyZXMg
dXNlZCBmb3IgdmFyaWFudCBzeW1saW5rIHN1cHBvcnQuCisgKiAKKyAqICRGcmVlQlNEJAor
ICogJERyYWdvbkZseTogc3JjL3N5cy9zeXMvdmFyc3ltLmgsdiAxLjMgMjAwNS8wMS8xNCAw
MjoyNTowOCBqb2VyZyBFeHAgJAorICovCisKKyNpZm5kZWYgX1NZU19WQVJTWU1fSF8KKyNk
ZWZpbmUgX1NZU19WQVJTWU1fSF8KKyNpbmNsdWRlIDxzeXMvcXVldWUuaD4JCS8qIFRBSUxR
XyogbWFjcm9zICovCisKK3N0cnVjdCB2YXJzeW0geworICAgIGludAkJdnNfcmVmczsJLyog
YSBsb3Qgb2Ygc2hhcmluZyBvY2N1cnMgKi8KKyAgICBpbnQJCXZzX25hbWVsZW47CisgICAg
Y2hhcgkqdnNfbmFtZTsJLyogdmFyaWFibGUgbmFtZSAqLworICAgIGNoYXIJKnZzX2RhdGE7
CS8qIHZhcmlhYmxlIGNvbnRlbnRzICovCit9OwordHlwZWRlZiBzdHJ1Y3QgdmFyc3ltCSp2
YXJzeW1fdDsKKworc3RydWN0IHZhcnN5bWVudCB7CisgICAgVEFJTFFfRU5UUlkodmFyc3lt
ZW50KSB2ZV9lbnRyeTsKKyAgICB2YXJzeW1fdAl2ZV9zeW07Cit9OworCitzdHJ1Y3QgdmFy
c3ltc2V0IHsKKyAgICBUQUlMUV9IRUFEKCwgdmFyc3ltZW50KSB2eF9xdWV1ZTsKKyAgICBp
bnQJCXZ4X3NldHNpemU7Cit9OworCisjZGVmaW5lIFZBUlNZTV9QUk9DCTEKKyNkZWZpbmUg
VkFSU1lNX1VTRVIJMgorI2RlZmluZSBWQVJTWU1fU1lTCTMKKyNkZWZpbmUgVkFSU1lNX1BS
SVNPTgk0CS8qIHVzZWQgaW50ZXJuYWxseSAqLworI2RlZmluZSBWQVJTWU1fUFBST0MJNQkv
KiBzZXQvZ2V0IHZhcnMgaW4gcGFyZW50IHByb2Nlc3MgKi8KKworI2RlZmluZSBWQVJTWU1f
UFJPQ19NQVNLCSgxIDw8IFZBUlNZTV9QUk9DKQorI2RlZmluZSBWQVJTWU1fVVNFUl9NQVNL
CSgxIDw8IFZBUlNZTV9VU0VSKQorI2RlZmluZSBWQVJTWU1fU1lTX01BU0sJCSgxIDw8IFZB
UlNZTV9TWVMpCisjZGVmaW5lIFZBUlNZTV9QUFJPQ19NQVNLCSgxIDw8IFZBUlNZTV9QUFJP
QykKKyNkZWZpbmUgVkFSU1lNX0FMTF9NQVNLCQkoVkFSU1lNX1BST0NfTUFTS3xWQVJTWU1f
VVNFUl9NQVNLfFZBUlNZTV9TWVNfTUFTS3xWQVJTWU1fUFBST0NfTUFTSykKKworI2RlZmlu
ZSBNQVhWQVJTWU1fTkFNRQk2NAorI2RlZmluZSBNQVhWQVJTWU1fREFUQQkyNTYKKyNkZWZp
bmUgTUFYVkFSU1lNX1NFVAk4MTkyCisKKyNpZmRlZiBfS0VSTkVMCisKK3ZvaWQJdmFyc3lt
c2V0X2luaXQoc3RydWN0IHZhcnN5bXNldCAqdmFyc3ltc2V0LCBzdHJ1Y3QgdmFyc3ltc2V0
ICpjb3B5KTsKK3ZvaWQJdmFyc3ltc2V0X2NsZWFuKHN0cnVjdCB2YXJzeW1zZXQgKnZhcnN5
bXNldCk7CitpbnQJdmFyc3ltcmVwbGFjZShjaGFyICpjcCwgaW50IGxpbmtsZW4sIGludCBt
YXhsZW4pOworCisjZW5kaWYJLyogX0tFUk5FTCAqLworCisjZW5kaWYKZGlmZiAtVTMgLU4g
c3JjL2Jpbi92YXJzeW0vTWFrZWZpbGUgc3JjL2Jpbi92YXJzeW0vTWFrZWZpbGUKLS0tIHNy
Yy9iaW4vdmFyc3ltL01ha2VmaWxlCVdlZCBEZWMgMzEgMTk6MDA6MDAgMTk2OQorKysgc3Jj
L2Jpbi92YXJzeW0vTWFrZWZpbGUJRnJpIEZlYiAgMyAxMzowNTo0NCAyMDA2CkBAIC0wLDAg
KzEsNiBAQAorIyAkRnJlZUJTRCQKKyMgJERyYWdvbkZseTogc3JjL2Jpbi92YXJzeW0vTWFr
ZWZpbGUsdiAxLjQgMjAwNS8wMi8wNiAwNjoxNjo0MCBva3Vtb3RvIEV4cCAkCisKK1BST0c9
CXZhcnN5bQorCisuaW5jbHVkZSA8YnNkLnByb2cubWs+CmRpZmYgLVUzIC1OIHNyYy9iaW4v
dmFyc3ltL3ZhcnN5bS4xIHNyYy9iaW4vdmFyc3ltL3ZhcnN5bS4xCi0tLSBzcmMvYmluL3Zh
cnN5bS92YXJzeW0uMQlXZWQgRGVjIDMxIDE5OjAwOjAwIDE5NjkKKysrIHNyYy9iaW4vdmFy
c3ltL3ZhcnN5bS4xCUZyaSBGZWIgIDMgMTM6MTM6MTAgMjAwNgpAQCAtMCwwICsxLDEzMCBA
QAorLlwiIENvcHlyaWdodCAoYykgMjAwMyBNYXR0aGV3IERpbGxvbiA8ZGlsbG9uQGJhY2tw
bGFuZS5jb20+CisuXCIgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy5cIgorLlwiIE1vZGlmaWVk
IGJ5IEFuZHJleSBWLiBFbHN1a292IDxidTdjaGVyQHlhbmRleC5ydT4KKy5cIgorLlwiIFJl
ZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGgg
b3Igd2l0aG91dAorLlwiIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0
aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworLlwiIGFyZSBtZXQ6CisuXCIgMS4gUmVk
aXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5
cmlnaHQKKy5cIiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUg
Zm9sbG93aW5nIGRpc2NsYWltZXIuCisuXCIgMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFy
eSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKy5cIiAgICBub3Rp
Y2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWlt
ZXIgaW4gdGhlCisuXCIgICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxz
IHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKy5cIgorLlwiIFRISVMgU09GVFdB
UkUgSVMgUFJPVklERUQgQlkgVEhFIEFVVEhPUiBBTkQgQ09OVFJJQlVUT1JTIGBgQVMgSVMn
JyBBTkQKKy5cIiBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElO
RywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKy5cIiBJTVBMSUVEIFdBUlJBTlRJRVMgT0Yg
TUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRQor
LlwiIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUiBPUiBD
T05UUklCVVRPUlMgQkUgTElBQkxFCisuXCIgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJ
TkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwKKy5cIiBE
QU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0Yg
U1VCU1RJVFVURSBHT09EUworLlwiIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwg
T1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKQorLlwiIEhPV0VWRVIgQ0FV
U0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFD
VCwgU1RSSUNUCisuXCIgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5D
RSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWQorLlwiIE9VVCBPRiBUSEUgVVNF
IE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkg
T0YKKy5cIiBTVUNIIERBTUFHRS4KKy5cIgorLlwiICRGcmVlQlNEJAorLlwiICREcmFnb25G
bHk6IHNyYy9iaW4vdmFyc3ltL3ZhcnN5bS4xLHYgMS40IDIwMDUvMDgvMDEgMDE6NDk6MTYg
c3dpbGRuZXIgRXhwICQKKy5cIgorLkRkIE5vdiA1LCAyMDAzCisuRHQgVkFSU1lNIDEKKy5P
cworLlNoIE5BTUUKKy5ObSB2YXJzeW0KKy5OZCBnZXQgYW5kIHNldCB1c2VyIGFuZCBzeXN0
ZW0td2lkZSB2YXJpYWJsZXMgZm9yIHZhcmlhbnQgc3ltbGlua3MKKy5TaCBTWU5PUFNJUwor
Lk5tCisuT3AgRmwgQWFkUHBxc3YKKy5PcCBGbCBqIEFyIHByaXNvbl9pZAorLk9wIEZsIHUg
QXIgdXNlcl9uYW1lIHwgdXNlcl9pZAorLkFyIHZhcls9ZGF0YV0KKy5TaCBERVNDUklQVElP
TgorVGhlCisuTm0KK3Byb2dyYW0gbWFuYWdlcyB1c2VyIGFuZCBzeXN0ZW0td2lkZSB2YXJp
YWJsZXMuICBUaGVzZSB2YXJpYWJsZXMgYXJlIHR5cGljYWxseQordXNlZCBieSB0aGUgc3lz
dGVtIHRvIHJlc29sdmUgdmFyaWFudCBzeW1saW5rcyBidXQgbWF5IGFsc28gYmUgdXNlZCBn
ZW5lcmFsbHkuCisuUHAKK0ZvciBlYWNoIG9wZXJhbmQgc2V0LCBtb2RpZnksIHJldHJpZXZl
LCBvciBkZWxldGUgdGhlIHNwZWNpZmllZCB2YXJpYWJsZS4KK0J5IGRlZmF1bHQgdmFyaWFi
bGVzIHNwZWNpZmllZCB3aXRob3V0IGRhdGEgYXJlIHJldHJpZXZlZCBhbmQgdmFyaWFibGVz
CitzcGVjaWZpZWQgd2l0aCBkYXRhIGFyZSBzZXQuICBWYXJpYWJsZXMgbWF5IGJlIHNldCB0
byBlbXB0eS4KKy5CbCAtdGFnIC13aWR0aCBBcgorLkl0IEZsIGEKK0xpc3QgYWxsIHZhcmlh
YmxlcyBhdCB0aGUgc3BlY2lmaWVkIGxldmVsLiAgTm90ZSB0aGF0IHBlci11c2VyIHZhcmlh
Ymxlcworb3ZlcnJpZGUgc3lzdGVtLXdpZGUgdmFyaWFibGVzLiAgQnkgZGVmYXVsdCwgcGVy
LXVzZXIgdmFyaWFibGVzIGFyZSBsaXN0ZWQuIAorSW4gdGhlIGphaWwgb25seSBzeXN0ZW0t
d2lkZSB2YXJpYWJsZXMgYXJlIGxpc3RlZC4KKy5JdCBGbCBBCitMaXN0IGFsbCB2YXJpYWJs
ZXMgYXQgYWxsIGxldmVscyBpbiB0aGUgb3JkZXIgdGhleSB3b3VsZCBiZSBmb3VuZC4gVGhl
CisuRmwgdgorb3B0aW9uIHdpbGwgc2hvdyB0aGUgbGV2ZWwgZnJvbSB3aGljaCBlYWNoIHZh
cmlhYmxlIGNhbWUgdXNpbmcgdGhlCitQLCBwLCBzIG9yIHUgcHJlZml4IGNoYXJhY3RlcnMu
CisuSXQgRmwgZAorRGVsZXRlIG1vZGUuICBUaGUgc3BlY2lmaWVkIHZhcmlhYmxlcyBhcmUg
ZGVsZXRlZC4gIEFueSBzcGVjaWZpZWQgZGF0YSBpcworaWdub3JlZC4KKy5JdCBGbCBqIEFy
IHByaXNvbl9pZAorVGhpcyBvcHRpb24gY2F1c2VzIHZhcmlhYmxlcyB0byBiZSBzZXQgc3lz
dGV0bS13aWRlIGFuZCByZXN0cmljdHMgcmV0cmlldmFscwordG8gc3lzdGVtLXNwZWNpZmlj
IHZhcmlhYmxlcyBmb3IgamFpbGVkIGVudmlyb25tZW50IHdpdGggaWQgCisuQ20gcHJpc29u
X2lkIE5zIC4KK05vdGUgdGhhdCAKKy5GbCBqCitvcHRpb24gaXMgbXV0dWFsbHkgZXhjbHVz
aXZlIHdpdGgKKy5GbCB1CitvcHRpb24uCisuSXQgRmwgcAorVGhpcyBvcHRpb24gY2F1c2Vz
IHZhcmlhYmxlcyB0byBiZSBzZXQgb24gYSBwZXItcHJvY2VzcyBiYXNpcyBhbmQgcmVzdHJp
Y3RzCityZXRyaWV2YWxzIHRvIHByb2Nlc3Mtc3BlY2lmaWMgdmFyaWFibGVzLiAgTm90ZSB0
aGF0IHNpbmNlCisuTm0KK2lzIHJ1biBhcyBpdHMgb3duIHByb2Nlc3MsIHVzaW5nIHRoaXMg
b3B0aW9uIHRvIHNldCBhIHZhcmlhYmxlIHdpbGwgbm90CithZmZlY3QgeW91ciBzaGVsbCdz
IG5hbWVzcGFjZS4KKy5JdCBGbCBQCitUaGlzIG9wdGlvbiBjYXVzZXMgdmFyaWFibGVzIHRv
IGJlIHNldCBpbiB0aGUgcGFyZW50IHByb2Nlc3MgKGkuZS4gc2hlbGwpCisuSXQgRmwgcQor
UXVpZXQgbW9kZS4gIFdoZW4gcmV0cmlldmluZyBhIHZhcmlhYmxlIG9ubHkgaXRzIGRhdGEg
aXMgcHJpbnRlZC4KKy5JdCBGbCBzCitUaGlzIG9wdGlvbiBjYXVzZXMgdmFyaWFibGVzIHRv
IGJlIHNldCBzeXN0ZW0td2lkZSBhbmQgcmVzdHJpY3RzIHJldHJpZXZhbHMKK3RvIHN5c3Rl
bS1zcGVjaWZpYyB2YXJpYWJsZXMuIEVhY2ggamFpbCBoYXZlIG93biBgYGxvY2FsJycgc3lz
dGVtLXdpZGUgCit2YXJpYWJsZXMuCisuSXQgRmwgdSBBciB1c2VyX25hbWUgfCB1c2VyX2lk
CitUaGlzIG9wdGlvbiBjYXVzZXMgdmFyaWFibGVzIHRvIGJlIHNldCBvbiBhIHBlci11c2Vy
LWlkIGJhc2lzIGFuZCByZXN0cmljdHMKK3JldHJpZXZhbHMgdG8gdXNlci1zcGVjaWZpYyB2
YXJpYWJsZXMgZm9yIHVzZXIgc3BlY2lmaWVkIGFzCisuQ20gdXNlcl9uYW1lIE5zIAorIG9y
CisuQ20gdXNlcl9pZCBOcyAuICBVbnByaXZpbGVnZWQgdXNlciBjYW4gc2V0IG9yIHJlYWQg
b25seSBvd24gdmFyaWFibGVzLCBhbmQKK2Nhbid0IHVzZSB0aGlzIG9wdGlvbi4gCisuRWwK
Ky5TaCBSRVRVUk4gVkFMVUVTCitUaGUKKy5ObQordXRpbGl0eSBleGl0cyB3aXRoIG9uZSBv
ZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKy5CbCAtdGFnIC13aWR0aCBEcworLkl0IDAKK05v
IGVycm9ycyBvY2N1cmVkLgorLkl0IDEKK0EgcmVxdWVzdGVkIHZhcmlhYmxlIGNvdWxkIG5v
dCBiZSBmb3VuZAorLkl0IDIKK0EgcmVxdWVzdGVkIHZhcmlhYmxlIGNvdWxkIG5vdCBiZSBz
ZXQKKy5FbAorLlNoIEVYQU1QTEVTCisuUHAKK0NyZWF0ZSBhIHBhcmVudCB2YXJpYWJsZSBm
dWJhci4gVGhpcyB2YXJpYWJsZSB3aWxsIHRoZW4gYmUgaW5oZXJpdGVkIGJ5IAorYW55IGZ1
dHVyZSBleGVjdXRpb25zIGluIHRoaXMgc2hlbGwuCisuUHAKKy5EMSBMaSAidmFyc3ltIC1Q
IGZ1YmFyPXh4IgorLlBwCitDcmVhdGUgYSB1c2VyIHZhcmlhYmxlIGZ1YmFyLgorLlBwCisu
RDEgTGkgInZhcnN5bSBmdWJhcj14eCIKKy5QcAorTGlzdCBhbGwgdXNlciB2YXJpYWJsZXMg
ZGVmaW5lZAorLlBwCisuRDEgTGkgInZhcnN5bSAtYSIKKy5QcAorTGlzdCBhbGwgdmFyaWFi
bGVzIGRlZmluZWQgYW55d2hlcmUKKy5QcAorLkQxIExpICJ2YXJzeW0gLUEiCisuUHAKK0xp
c3QgdW5pcXVlIHZhcmlhYmxlcyBkZWZpbmVkCisuUHAKKy5EMSBMaSAidmFyc3ltIC1BfHNv
cnQgLXUgLXQ9IC1rMSwxIgorLlNoIFNFRSBBTFNPCisuWHIgbG4gMSAsCmRpZmYgLVUzIC1O
IHNyYy9iaW4vdmFyc3ltL3ZhcnN5bS5jIHNyYy9iaW4vdmFyc3ltL3ZhcnN5bS5jCi0tLSBz
cmMvYmluL3ZhcnN5bS92YXJzeW0uYwlXZWQgRGVjIDMxIDE5OjAwOjAwIDE5NjkKKysrIHNy
Yy9iaW4vdmFyc3ltL3ZhcnN5bS5jCUZyaSBGZWIgIDMgMTM6MDU6NDQgMjAwNgpAQCAtMCww
ICsxLDI2MSBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAwMyBNYXR0aGV3IERpbGxvbiA8
ZGlsbG9uQGJhY2twbGFuZS5jb20+CisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAq
IE1vZGlmaWVkIGJ5IEFuZHJleSBWLiBFbHN1a292IDxidTdjaGVyQHlhbmRleC5ydT4KKyAq
CisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1z
LCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92
aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEu
IFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUg
Y29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0
aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmlu
YXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90
aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFp
bWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxz
IHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJF
IElTIFBST1ZJREVEIEJZIFRIRSBBVVRIT1IgQU5EIENPTlRSSUJVVE9SUyBgYEFTIElTJycg
QU5ECisgKiBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywg
QlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJD
SEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFCisgKiBB
UkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgT1IgQ09OVFJJ
QlVUT1JTIEJFIExJQUJMRQorICogRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVO
VEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwKKyAqIERBTUFHRVMg
KElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElU
VVRFIEdPT0RTCisgKiBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJ
VFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikKKyAqIEhPV0VWRVIgQ0FVU0VEIEFORCBP
TiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNU
CisgKiBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVS
V0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZCisgKiBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNP
RlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GCisgKiBTVUNI
IERBTUFHRS4KKyAqCisgKiAkRnJlZUJTRCQKKyAqICREcmFnb25GbHk6IHNyYy9iaW4vdmFy
c3ltL3ZhcnN5bS5jLHYgMS40IDIwMDMvMTIvMTEgMjA6MzM6NDkgZGlsbG9uIEV4cCAkCisg
Ki8KKworI2luY2x1ZGUgPHN5cy9wYXJhbS5oPgorI2luY2x1ZGUgPHN5cy9qYWlsLmg+Cisj
aW5jbHVkZSA8c3lzL3R5cGVzLmg+CisjaW5jbHVkZSA8c3lzL3N5c2N0bC5oPgorI2luY2x1
ZGUgPHN5cy92YXJzeW0uaD4KKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0ZGxp
Yi5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgPGVyci5oPgorI2luY2x1ZGUg
PHVuaXN0ZC5oPgorI2luY2x1ZGUgPHB3ZC5oPgorCitzdGF0aWMgdm9pZAl1c2FnZSh2b2lk
KTsKK3N0YXRpYyB2b2lkCWR1bXB2YXJzKGNoYXIgKmJ1ZiwgaW50IGJ5dGVzLCBjb25zdCBj
aGFyICpwcmVmaXgpOworc3RhdGljIGludAlsaXN0dmFycyhpbnQgbGV2ZWwsIGNvbnN0IGNo
YXIgKnByZWZpeCk7CitzdGF0aWMgaW50CWphaWxlZCh2b2lkKTsKKworaW50IGlzX3Jvb3Qg
PSAwOworaW50IGlzX2phaWwgPSAwOworCitpbnQKK21haW4oaW50IGFjLCBjaGFyICoqYXYp
Cit7CisJaW50IGksIGVycm9yOworCXNpemVfdCBzaXplOworCWNvbnN0IGNoYXIqIG9wczsK
KwlpbnQgbWFzayA9ICBWQVJTWU1fQUxMX01BU0s7CisJaW50IGxldmVsID0gVkFSU1lNX1VT
RVI7CisJaW50IGRlbGV0ZU9wdCA9IDA7CisJaW50IHZlcmJvc2VPcHQgPSAwOworCWludCBh
bGxPcHQgPSAwOworCWludCBqaWQgPSAwOworCisJaXNfcm9vdCA9IChnZXR1aWQoKSA9PSAw
KTsKKwlpc19qYWlsID0gamFpbGVkKCk7CisKKwlpZiAoaXNfamFpbCkgeworCQkvKiAKKwkJ
ICogcGVyLXVzZXIgdmFyc3ltcyBub3QgYWxsb3dlZCBpbiBqYWlsCisJCSAqIFNvIHdlIHJl
bW92ZSBmcm9tIG1hc2sgVkFSU1lNX1VTRVJfTUFTSworCQkgKiBhbmQgc2V0IFZBUlNZTV9T
WVMgbGV2ZWwgYXMgZGVmYXVsdC4KKwkJICovCisJCW1hc2sgJj0gflZBUlNZTV9VU0VSX01B
U0s7CisJCWxldmVsID0gVkFSU1lNX1NZUzsKKwl9CisJaWYgKGlzX2phaWwgfHwgIWlzX3Jv
b3QpCisJCW9wcyA9ICJBYWRoUHBxc3YiOworCWVsc2UKKwkJb3BzID0gIkFhZGhqOlBwcXN1
OnYiOworCXdoaWxlICgoaSA9IGdldG9wdChhYywgYXYsIG9wcykpICE9IC0xKSB7CisJCXN3
aXRjaCAoaSkgeworCQljYXNlICdhJzoKKwkJCWFsbE9wdCA9IDE7CisJCQlicmVhazsKKwkJ
Y2FzZSAnQSc6CisJCQlhbGxPcHQgPSAyOworCQkJYnJlYWs7CisJCWNhc2UgJ2QnOgorCQkJ
ZGVsZXRlT3B0ID0gMTsKKwkJCWJyZWFrOworCQljYXNlICdxJzoKKwkJCXZlcmJvc2VPcHQg
PSAwOworCQkJYnJlYWs7CisJCWNhc2UgJ2onOgorCQkJamlkID0gKGludClzdHJ0b2wob3B0
YXJnLCBOVUxMLCAxMCk7CisJCQllcnJvciA9IGphaWxfYXR0YWNoKGppZCk7CisJCQlpZiAo
ZXJyb3IpCisJCQkJZXJyKDIsICJqYWlsX2F0dGFjaCgpOiAlZCIsIGppZCk7CisJCWNhc2Ug
J1AnOgorCQkJbGV2ZWwgPSBWQVJTWU1fUFBST0M7CisJCQltYXNrID0gVkFSU1lNX1BQUk9D
X01BU0s7CisJCQlicmVhazsKKwkJY2FzZSAncCc6CisJCQlsZXZlbCA9IFZBUlNZTV9QUk9D
OworCQkJbWFzayA9IFZBUlNZTV9QUk9DX01BU0s7CisJCQlicmVhazsKKwkJY2FzZSAncyc6
CisJCQltYXNrID0gVkFSU1lNX1NZU19NQVNLOworCQkJbGV2ZWwgPSBWQVJTWU1fU1lTOwor
CQkJYnJlYWs7CisJCWNhc2UgJ3UnOiB7CisJCQkJdWlkX3QJdWlkOworCQkJCXN0cnVjdAlw
YXNzd2QJKnB3OworCQkJCWlmIChqaWQpIHsKKwkJCQkJdXNhZ2UoKTsKKwkJCQkJcmV0dXJu
KDEpOworCQkJCX0KKwkJCQlwdyA9IGdldHB3bmFtKG9wdGFyZyk7CisJCQkJaWYgKHB3ID09
IE5VTEwpCisJCQkJCXVpZCA9ICh1aWRfdClzdHJ0b2wob3B0YXJnLCBOVUxMLCAxMCk7CisJ
CQkJZWxzZQorCQkJCQl1aWQgPSBwdy0+cHdfdWlkOworCQkJCWVycm9yID0gc2V0dWlkKHVp
ZCk7CisJCQkJaWYgKGVycm9yKQorCQkJCQllcnIoMSwgInNldHVpZCgpIik7CisJCQkJbWFz
ayA9IFZBUlNZTV9VU0VSX01BU0s7CisJCQkJbGV2ZWwgPSBWQVJTWU1fVVNFUjsKKwkJCX0K
KwkJCWJyZWFrOworCQljYXNlICd2JzoKKwkJCXZlcmJvc2VPcHQgPSAxOworCQkJYnJlYWs7
CisJCWNhc2UgJ2gnOgorCQlkZWZhdWx0OgorCQkJdXNhZ2UoKTsKKwkJCXJldHVybigxKTsK
KwkJfQorCX0KKwlhYyAtPSBvcHRpbmQ7CisJYXYgKz0gb3B0aW5kOworCisJaWYgKGFsbE9w
dCkgeworCQlpZiAoYWxsT3B0ID4gMSkgeworCQkJLyogcHJvY2VzcyB2YXJpYWJsZXMgaW4g
b3JkZXIgdGhleSBhcmUgc2VhcmNoZWQgKi8KKwkJCWVycm9yID0gbGlzdHZhcnMoVkFSU1lN
X1BST0MsIHZlcmJvc2VPcHQ/InAiOiIiKTsKKwkJCWVycm9yID0gbGlzdHZhcnMoVkFSU1lN
X1BQUk9DLCB2ZXJib3NlT3B0PyJQIjoiIik7CisJCQllcnJvciA9IGxpc3R2YXJzKFZBUlNZ
TV9VU0VSLCB2ZXJib3NlT3B0PyJ1IjoiIik7CisJCQllcnJvciA9IGxpc3R2YXJzKFZBUlNZ
TV9TWVMsIHZlcmJvc2VPcHQ/InMiOiIiKTsKKwkJfQorCQllbHNlIHsKKwkJCWVycm9yID0g
bGlzdHZhcnMobGV2ZWwsICIiKTsKKwkJfQorCQlpZiAoZXJyb3IgPCAwKQorCQkJd2Fybigi
dmFyc3ltX2xpc3QoKSIpOworCX0gZWxzZSBpZiAoYWMgPT0gMCkgeworCQl1c2FnZSgpOwor
CQlyZXR1cm4oMSk7CisJfQorCisJd2hpbGUgKGFjID4gMCkgeworCQljaGFyICpuYW1lID0g
YXZbMF07CisJCWNoYXIgKmRhdGEgPSBzdHJjaHIobmFtZSwgJz0nKTsKKwkJY2hhciBidWZb
TUFYVkFSU1lNX0RBVEFdOworCisJCWlmIChkYXRhKQorCQkJKmRhdGErKyA9IDA7CisKKwkJ
aWYgKGRlbGV0ZU9wdCkgeworCQkJZXJyb3IgPSB2YXJzeW1fc2V0KGxldmVsLCBuYW1lLCBO
VUxMKTsKKwkJfQorCQllbHNlIGlmIChkYXRhKSB7CisJCQllcnJvciA9IHZhcnN5bV9zZXQo
bGV2ZWwsIG5hbWUsIGRhdGEpOworCQl9CisJCWVsc2UgeworCQkJc2l6ZSA9IHNpemVvZihi
dWYpOworCQkJZXJyb3IgPSB2YXJzeW1fZ2V0KG1hc2ssIG5hbWUsIGJ1ZiwgKGludCAqKSZz
aXplKTsKKwkJCWlmIChlcnJvciA9PSAwICYmIHNpemUgPD0gKGludClzaXplb2YoYnVmKSkg
eworCQkJCWlmICh2ZXJib3NlT3B0KQorCQkJCQlwcmludGYoIiVzPSIsIG5hbWUpOworCQkJ
CXByaW50ZigiJXNcbiIsIGJ1Zik7CisJCQl9CisJCX0KKwkJaWYgKGVycm9yICE9IDAgJiYg
dmVyYm9zZU9wdCkKKwkJCXdhcm4oIiVzIiwgbmFtZSk7CisJCWF2Kys7IGFjLS07CisJfQor
CisJcmV0dXJuKDApOworfQorCitzdGF0aWMgdm9pZAorZHVtcHZhcnMoY2hhciAqYnVmLCBp
bnQgYnl0ZXMsIGNvbnN0IGNoYXIgKnByZWZpeCkKK3sKKyAgICBpbnQgYjsKKyAgICBpbnQg
aTsKKyAgICBjaGFyICp2bmFtZSA9IE5VTEw7CisgICAgY2hhciAqdmRhdGEgPSBOVUxMOwor
CisgICAgZm9yIChiID0gaSA9IDA7IGkgPCBieXRlczsgKytpKSB7CisJaWYgKGJ1ZltpXSA9
PSAwKSB7CisJICAgIGlmICh2bmFtZSA9PSBOVUxMKSB7CisJCQl2bmFtZSA9IGJ1ZiArIGI7
CisJICAgIH0gZWxzZSB7CisJCQl2ZGF0YSA9IGJ1ZiArIGI7CisJCQlpZiAocHJlZml4ICYm
ICpwcmVmaXgpCisJCQkJcHJpbnRmKCIlczolcz0lc1xuIiwgcHJlZml4LCB2bmFtZSwgdmRh
dGEpOworCQkJZWxzZQorCQkJCXByaW50ZigiJXM9JXNcbiIsIHZuYW1lLCB2ZGF0YSk7CisJ
CQl2bmFtZSA9IHZkYXRhID0gTlVMTDsKKwkgICAgfQorCSAgICBiID0gaSArIDE7CisJfQor
ICAgIH0KK30KKworc3RhdGljIGludAorbGlzdHZhcnMoaW50IGxldmVsLCBjb25zdCBjaGFy
ICpwcmVmaXgpCit7CisgICAgaW50IG1hcmtlciA9IDA7CisgICAgY2hhciBidWZbMTAyNF07
CisgICAgaW50IHNpemUgPSBzaXplb2YoYnVmKTsKKyAgICBpbnQgZXJyb3I9MDsKKworICAg
IGZvciAoOzspIHsKKwlzaXplID0gc2l6ZW9mKGJ1Zik7CQorCWVycm9yID0gdmFyc3ltX2xp
c3QobGV2ZWwsIGJ1ZiwgKGludCAqKSZzaXplLAorCQkmbWFya2VyKTsKKwlpZiAoZXJyb3Ig
PCAwKQkJLyogZXJyb3Igb2NjdXJlZCAqLworCQlicmVhazsKKwlkdW1wdmFycyhidWYsIHNp
emUsIHByZWZpeCk7CisJaWYgKG1hcmtlciA8IDApCQkvKiBubyBtb3JlIHZhcnMgKi8KKwkJ
YnJlYWs7CisgICAgfQorICAgIHJldHVybihlcnJvcik7Cit9CisKK3N0YXRpYyB2b2lkCit1
c2FnZSh2b2lkKQoreworCWNvbnN0IGNoYXIgKnN0cjsKKwlpZiAoaXNfamFpbCB8fCAhaXNf
cm9vdCkKKwkJc3RyID0gIlVzYWdlOiB2YXJzeW06IFstYUFwUHFkc10gdmFyWz1kYXRhXVxu
IjsKKwllbHNlCisJCXN0ciA9ICJVc2FnZTogdmFyc3ltOiBbLWFBcFBxZHNdIFstdSB1c2Vy
X2lkIHwgdXNlcl9uYW1lXVxuIiAKKwkJCSAgIiAgICAgICBbLWogcHJpc29uX2lkXSB2YXJb
PWRhdGFdXG4iCisJCQkgICJOb3RlOiAtaiBhbmQgLXUgb3B0aW9ucyBpcyBtdXR1YWxseSBl
eGNsdXNpdmVcbiI7CQorCWZwcmludGYoc3RkZXJyLCBzdHIpOworfQorCitzdGF0aWMgaW50
CQoramFpbGVkKHZvaWQpCit7CisJaW50CWosIGVycm9yOworCXNpemVfdCBzaXplID0gc2l6
ZW9mKGopOworCWVycm9yID0gc3lzY3RsYnluYW1lKCJzZWN1cml0eS5qYWlsLmphaWxlZCIs
IAorCQkJCQkmaiwgJnNpemUsIE5VTEwsIDApOworCWlmIChlcnJvcikKKwkJZXJyKDIsICJz
eXNjdGxieW5hbWUoKSIpOworCXJldHVybihqKTsKK30KZGlmZiAtVTMgc3JjL2V0Yy9kZWZh
dWx0cy9yYy5jb25mIHNyYy9ldGMvZGVmYXVsdHMvcmMuY29uZgotLS0gc3JjL2V0Yy9kZWZh
dWx0cy9yYy5jb25mCVN1biBPY3QgMTUgMTQ6MjI6MTcgMjAwNgorKysgc3JjL2V0Yy9kZWZh
dWx0cy9yYy5jb25mCVRodSBBdWcgMzAgMTg6NTk6MDMgMjAwNwpAQCAtNTU5LDYgKzU1OSw4
IEBACiBuZXdzeXNsb2dfZW5hYmxlPSJZRVMiCSMgUnVuIG5ld3N5c2xvZyBhdCBzdGFydHVw
LgogbmV3c3lzbG9nX2ZsYWdzPSItQ04iCSMgTmV3c3lzbG9nIGZsYWdzIHRvIGNyZWF0ZSBt
YXJrZWQgZmlsZXMKIAordmFyc3ltX2VuYWJsZT0iTk8iICAgICAgIyB2YXJpYW50IHN5bWxp
bmtzIGlzIGRpc2FibGVkIGJ5IGRlZmF1bHQKKwogIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMj
IyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKICMjIyBKYWlsIENvbmZp
Z3VyYXRpb24gIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCiAjIyMj
IyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMj
IyMjIwpkaWZmIC1VMyAtTiBzcmMvZXRjL3JjLmQvdmFyc3ltIHNyYy9ldGMvcmMuZC92YXJz
eW0KLS0tIHNyYy9ldGMvcmMuZC92YXJzeW0JV2VkIERlYyAzMSAxOTowMDowMCAxOTY5Cisr
KyBzcmMvZXRjL3JjLmQvdmFyc3ltCVRodSBBdWcgMzAgMTg6NTk6MDMgMjAwNwpAQCAtMCww
ICsxLDMzIEBACisjIS9iaW4vc2gKKyMKKworIyBQUk9WSURFOiB2YXJzeW0KKworLiAvZXRj
L3JjLnN1YnIKKworbmFtZT0idmFyc3ltIgorcmN2YXI9YHNldF9yY3ZhcmAKK29pZD0idmZz
LnZhcnN5bV9lbmFibGUiCisKK3N0YXJ0X2NtZD0iL3NiaW4vc3lzY3RsICRvaWQ9MSIKK3N0
b3BfY21kPSIvc2Jpbi9zeXNjdGwgJG9pZD0wIgorCisjCisjIGhhbmRsZSBzdGF0dXMgaGVy
ZSBzaW5jZSByYy5zdWJyIGRvZXNuJ3QgYWxsb3cgaXQKKyMKK2Nhc2UgJDEgaW4KK3N0YXR1
cykKKyAgIGNhc2UgYC9zYmluL3N5c2N0bCAtbiAkb2lkYCBpbgorICAgMSkKKyAgICAgIGVj
aG8gJG5hbWUgaXMgZW5hYmxlZC4KKyAgICAgIHJldHVybiAwCisgICAgICA7OworICAgMCkK
KyAgICAgIGVjaG8gJG5hbWUgaXMgZGlzYWJsZWQuCisgICBlc2FjCisgICByZXR1cm4gMQor
ICAgOzsKK2VzYWMKKworbG9hZF9yY19jb25maWcgJG5hbWUKK3J1bl9yY19jb21tYW5kICIk
MSIKZGlmZiAtVTMgLU4gc3JjL2V0Yy9yYy5kL01ha2VmaWxlIHNyYy9ldGMvcmMuZC9NYWtl
ZmlsZQotLS0gc3JjL2V0Yy9yYy5kL01ha2VmaWxlCTIwMDgtMDQtMjQgMTc6MjY6MzMuMDAw
MDAwMDAwICswMDAwCisrKyBzcmMvZXRjL3JjLmQvTWFrZWZpbGUJMjAwOC0wNC0yNCAxNzoy
Njo0MS4wMDAwMDAwMDAgKzAwMDAKQEAgLTM2LDcgKzM2LDcgQEAKIAlzeXNjb25zIHN5c2N0
bCBzeXNsb2dkIFwKIAl0aW1lZCB0bXAgXAogCXVnaWRmdyBcCi0JdmFyIHZpcmVjb3ZlciBc
CisJdmFyIHZhcnN5bSB2aXJlY292ZXIgXAogCXdhdGNoZG9nZCB3cGFfc3VwcGxpY2FudCBc
CiAJeXBiaW5kIHlwcGFzc3dkZCB5cHNlcnYgXAogCXlwc2V0IHlwdXBkYXRlZCB5cHhmcmQg
XApkaWZmIC1VMyAtTiBzcmMvbGliL2xpYmMvc3lzL1N5bWJvbC5tYXAub3JpZyBzcmMvbGli
L2xpYmMvc3lzL1N5bWJvbC5tYXAKLS0tIHNyYy9saWIvbGliYy9zeXMvU3ltYm9sLm1hcC5v
cmlnCTIwMDgtMDQtMjQgMTg6NDk6MTQuMDAwMDAwMDAwICswMDAwCisrKyBzcmMvbGliL2xp
YmMvc3lzL1N5bWJvbC5tYXAJMjAwOC0wNC0yNCAxODo1MTo0Ni4wMDAwMDAwMDAgKzAwMDAK
QEAgLTMyMiw2ICszMjIsOSBAQAogCXV0cmFjZTsKIAl1dWlkZ2VuOwogCXZhZHZpc2U7CisJ
dmFyc3ltX3NldDsKKwl2YXJzeW1fZ2V0OworCXZhcnN5bV9saXN0OwogCXdhaXQ0OwogCXdy
aXRlOwogCXdyaXRldjsKQEAgLTk1Niw2ICs5NTksMTIgQEAKIAlfX3N5c191dWlkZ2VuOwog
CV92YWR2aXNlOwogCV9fc3lzX3ZhZHZpc2U7CisJX3ZhcnN5bV9zZXQ7CisJX19zeXNfdmFy
c3ltX3NldDsKKwlfdmFyc3ltX2dldDsKKwlfX3N5c192YXJzeW1fZ2V0OworCV92YXJzeW1f
bGlzdDsKKwlfX3N5c192YXJzeW1fbGlzdDsKIAlfd2FpdDQ7CiAJX19zeXNfd2FpdDQ7CiAJ
X3dyaXRlOwo=
--------------010404020304060805040407
Content-Type: application/octet-stream;
 name="Makefile"
Content-Transfer-Encoding: base64
Content-Disposition: attachment;
 filename="Makefile"

IyAkSWQ6IE1ha2VmaWxlLHYgMS4xIDIwMDgvMDMvMDEgMDI6MDk6MzUgc2FzZHJxIEV4cCAk
CiMKIyAKCiMgYSBsaXN0IG9mIHBhdGNoIGZpbGVzIGZvciAvdXNyIHNvdXJjZSB0cmVlClBB
VENIRVMgICE9IGVjaG8gKi5wYXRjaAoKIyB3ZXJlIHdlIG5lZWQgdG8gYmUgdG8gcnVuIHRo
aXMKSU5TVERJUiA9IC91c3IKQ1VSRElSICE9IHB3ZAoKbGlzdDoKCUBlY2hvICJtYWtlIHBh
dGNoIiAtIHRvIHBhdGNoIHNvdXJjZSBhbmQgdXBkYXRlIHN5c2N0bC5jb25mCgpwYXRjaDog
IHBhdGNoZXMgc3lzZW50CgojIHVzZSB0aGUgLXAgb3B0aW9uIG9mIHBhdGNoIHRvIGNhdXNl
IGFueSBuZXcgZGlyZWN0b3JpZXMgdG8gYmUgY3JlYXRlZApwYXRjaGVzOgoJQGNkICR7SU5T
VERJUn07IGxpc3Q9IiR7UEFUQ0hFU30iOyBmb3IgcGF0Y2ggaW4gJCRsaXN0OyBkbyBcCgkg
ICBmaWxlPSR7Q1VSRElSfS8kJHBhdGNoOyAgICAgICAgXAoJICAgaWYgdGVzdCAtZiAkJGZp
bGU7IHRoZW4gICAgICAgIFwKCSAgICAgIC91c3IvYmluL3BhdGNoIC1wIDwgJCRmaWxlOyBc
CgkgICBlbHNlIDo7IGZpOyAgICAgICAgICAgICAgICAgICAgXAoJZG9uZQoKc3lzZW50OgoJ
Y2QgL3Vzci9zcmMvc3lzL2tlcm4gJiYgbWFrZSBzeXNlbnQKCWNkIC91c3Ivc3JjL3N5cy9j
b21wYXQvZnJlZWJzZDMyICYmIG1ha2Ugc3lzZW50Cgo=
--------------010404020304060805040407--



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?48AE89DC.9080408>