Cygwin cross compiler

Stephen Weeks MLton@sourcelight.com
Wed, 13 Mar 2002 15:09:44 -0800


--vIDI9dORkA
Content-Type: text/plain; charset=us-ascii
Content-Description: message body text
Content-Transfer-Encoding: 7bit


> I'm using a 2.2 kernel. I just installed the latest public MLton version
> from your homepage - that's the best I have to compile with for now I
> guess. Then I tried make inside runtime/ in the source for the
> experimental
> release with the new gc.c - and now I get:
> 
> gc.c: 1063, 1067, 1068, 1071: structure has no field named 'mem_unit'
> 
> Should I modify something in gc.c?

Whoops.  I forgot you would be *compiling* on a 2.2 kernel, not just
running on one.  There is no mem_unit for you.  Here is a slightly
modified gc.c.  All you need to do is change the single occurrence of
sbuf.mem_unit to 1 and you should be able to compile.

> gc.c: 1058: warning 'tmp' might be used uninitialized in this function

Weird.  I don't get that error.


--vIDI9dORkA
Content-Type: application/octet-stream
Content-Disposition: attachment;
	filename="gc.c"
Content-Transfer-Encoding: base64

LyogQ29weXJpZ2h0IChDKSAxOTk3LTE5OTkgTkVDIFJlc2VhcmNoIEluc3RpdHV0ZS4KICog
UGxlYXNlIHNlZSB0aGUgZmlsZSBMSUNFTlNFIGZvciBsaWNlbnNlIGluZm9ybWF0aW9uLgog
Ki8KCiNpbmNsdWRlICJnYy5oIgojaW5jbHVkZSA8ZXJybm8uaD4KI2luY2x1ZGUgPGZjbnRs
Lmg+CiNpbmNsdWRlIDxtYXRoLmg+CiNpbmNsdWRlIDxzdHJpbmcuaD4KI2luY2x1ZGUgPHN5
cy9tbWFuLmg+CiNpbmNsdWRlIDxzeXMvcmVzb3VyY2UuaD4KI2luY2x1ZGUgPHN5cy90aW1l
cy5oPgojaW5jbHVkZSA8dGltZS5oPgojaWYgKGRlZmluZWQgKF9fbGludXhfXykpCiNpbmNs
dWRlIDx2YWx1ZXMuaD4KI2VuZGlmCgojZGVmaW5lIE1FVEVSIEZBTFNFICAvKiBEaXNwbGF5
cyBkaXN0cmlidXRpb24gb2Ygb2JqZWN0IHNpemVzIGF0IHByb2dyYW0gZXhpdC4gKi8KCi8q
IFRoZSBtdXRhdG9yIHNob3VsZCBtYWludGFpbiB0aGUgaW52YXJpYW50cwogKgogKiAgZnVu
Y3Rpb24gZW50cnk6IHN0YWNrVG9wICsgbWF4RnJhbWVTaXplIDw9IGVuZE9mU3RhY2sKICog
IGFueXdoZXJlIGVsc2U6IHN0YWNrVG9wICsgMiAqIG1heEZyYW1lU2l6ZSA8PSBlbmRPZlN0
YWNrCiAqIAogKiBUaGUgbGF0dGVyIHdpbGwgZ2l2ZSBpdCBlbm91Z2ggc3BhY2UgdG8gbWFr
ZSBhIGZ1bmN0aW9uIGNhbGwgYW5kIGFsd2F5cwogKiBzYXRpc2Z5IHRoZSBmb3JtZXIuICBU
aGUgZm9ybWVyIHdpbGwgYWxsb3cgaXQgdG8gbWFrZSBhIGdjIGNhbGwgYXQgdGhlCiAqIGZ1
bmN0aW9uIGVudHJ5IGxpbWl0LgogKi8KCmVudW0gewoJQk9HVVNfRVhOX1NUQUNLID0gMHhG
RkZGRkZGRiwKCUJPR1VTX1BPSU5URVIgPSAweDEsCglERUJVRyA9IEZBTFNFLAoJREVCVUdf
REVUQUlMRUQgPSBGQUxTRSwKCURFQlVHX1NJR05BTFMgPSBGQUxTRSwKCUZPUldBUkRFRCA9
IDB4RkZGRkZGRkYsCglIRUFERVJfU0laRSA9IFdPUkRfU0laRSwKCVNUQUNLX0hFQURFUl9T
SVpFID0gV09SRF9TSVpFLAp9OwoKI2RlZmluZSBTVEFDS19IRUFERVIgU1RBQ0tfVEFHCiNk
ZWZpbmUgQk9HVVNfVEhSRUFEIChHQ190aHJlYWQpQk9HVVNfUE9JTlRFUgojZGVmaW5lIFNU
UklOR19IRUFERVIgR0NfYXJyYXlIZWFkZXIoMSwgMCkKI2RlZmluZSBXT1JEOF9WRUNUT1Jf
SEVBREVSIEdDX2FycmF5SGVhZGVyKDEsIDApCiNkZWZpbmUgVEhSRUFEX0hFQURFUiBHQ19v
YmplY3RIZWFkZXIoMiwgMSkKCnN0YXRpYyB2b2lkIGxlYXZlKEdDX3N0YXRlIHMpOwoKI2Rl
ZmluZSBTUExJVF9IRUFERVIoKQkJCQkJCQkJXAoJZG8gewkJCQkJCQkJCVwKCQl0YWcgPSBo
ZWFkZXIgJiBUQUdfTUFTSzsJCQkJCVwKCQludW1Ob25Qb2ludGVycyA9IChoZWFkZXIgJiBO
T05fUE9JTlRFUl9NQVNLKSA+PiBQT0lOVEVSX0JJVFM7CVwKCQludW1Qb2ludGVycyA9IGhl
YWRlciAmIFBPSU5URVJfTUFTSzsJCQkJXAoJfSB3aGlsZSAoMCkKCnN0YXRpYyBpbmxpbmUg
dWludCB0b0J5dGVzKHVpbnQgbikgewoJcmV0dXJuIG4gPDwgMjsKfQoKc3RhdGljIGlubGlu
ZSB1aW50IG1pbih1aW50IHgsIHVpbnQgeSkgewoJcmV0dXJuICgoeCA8IHkpID8geCA6IHkp
Owp9CgpzdGF0aWMgaW5saW5lIHVpbnQgbWF4KHVpbnQgeCwgdWludCB5KSB7CglyZXR1cm4g
KCh4ID4geSkgPyB4IDogeSk7Cn0KCi8qIEEgc3VwZXItc2FmZSBtbWFwLgogKiAgQWxsb2Nh
dGVzIGEgcmVnaW9uIG9mIG1lbW9yeSB3aXRoIGRlYWQgem9uZXMgYXQgdGhlIGhpZ2ggYW5k
IGxvdyBlbmRzLgogKiAgQW55IGF0dGVtcHQgdG8gdG91Y2ggdGhlIGRlYWQgem9uZSAocmVh
ZCBvciB3cml0ZSkgd2lsbCBjYXVzZSBhCiAqICAgc2VnbWVudGF0aW9uIGZhdWx0LgogKi8K
c3RhdGljIHZvaWQgKnNzbW1hcChzaXplX3QgbGVuZ3RoLCBzaXplX3QgZGVhZF9sb3csIHNp
emVfdCBkZWFkX2hpZ2gpIHsKICB2b2lkICpiYXNlLCpsb3csKnJlc3VsdCwqaGlnaDsKCiAg
YmFzZSA9IHNtbWFwKGxlbmd0aCArIGRlYWRfbG93ICsgZGVhZF9oaWdoKTsKCiAgbG93ID0g
YmFzZTsKICBpZiAobXByb3RlY3QobG93LCBkZWFkX2xvdywgUFJPVF9OT05FKSkKICAgIGRp
ZWUoIm1wcm90ZWN0IGZhaWxlZCIpOwoKICByZXN1bHQgPSBsb3cgKyBkZWFkX2xvdzsKICBo
aWdoID0gcmVzdWx0ICsgbGVuZ3RoOwoKICBpZiAobXByb3RlY3QoaGlnaCwgZGVhZF9oaWdo
LCBQUk9UX05PTkUpKQogICAgZGllZSgibXByb3RlY3QgZmFpbGVkIik7CgogIHJldHVybiBy
ZXN1bHQ7Cn0KCi8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0gKi8KLyogICAgICAgICAgICAgICAgICAgICByb3VuZFBhZ2UgICAgICAgICAg
ICAgICAgICAgICAqLwovKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tICovCgovKgogKiBSb3VuZCBzaXplIHVwIHRvIGEgbXVsdGlwbGUgb2Yg
dGhlIHNpemUgb2YgYSBwYWdlLgogKi8Kc3RhdGljIGlubGluZSBzaXplX3QKcm91bmRQYWdl
KEdDX3N0YXRlIHMsIHNpemVfdCBzaXplKQp7CglzaXplICs9IHMtPnBhZ2VTaXplIC0gMTsK
CXNpemUgLT0gc2l6ZSAlIHMtPnBhZ2VTaXplOwoJcmV0dXJuIChzaXplKTsKfQoKLyogLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwovKiAg
ICAgICAgICAgICAgICAgICAgICBkaXNwbGF5ICAgICAgICAgICAgICAgICAgICAgICovCi8q
IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8K
CnZvaWQgR0NfZGlzcGxheShHQ19zdGF0ZSBzLCBGSUxFICpzdHJlYW0pIHsKCWZwcmludGYo
c3RyZWFtLCAiR0Mgc3RhdGVcblx0YmFzZSA9ICV4ICBmcm9udGllciAtIGJhc2UgPSAldSAg
bGltaXQgLSBmcm9udGllciA9ICV1XG4iLAoJCQkodWludCkgcy0+YmFzZSwgCgkJCXMtPmZy
b250aWVyIC0gcy0+YmFzZSwKCQkJcy0+bGltaXQgLSBzLT5mcm9udGllcik7CglmcHJpbnRm
KHN0cmVhbSwgIlx0Y2FuSGFuZGxlID0gJWRcbiIsIHMtPmNhbkhhbmRsZSk7CglmcHJpbnRm
KHN0cmVhbSwgIlx0ZXhuU3RhY2sgPSAldSAgYnl0ZXNOZWVkZWQgPSAldSAgcmVzZXJ2ZWQg
PSAldSAgdXNlZCA9ICV1XG4iLAoJCQlzLT5jdXJyZW50VGhyZWFkLT5leG5TdGFjaywKCQkJ
cy0+Y3VycmVudFRocmVhZC0+Ynl0ZXNOZWVkZWQsCgkJCXMtPmN1cnJlbnRUaHJlYWQtPnN0
YWNrLT5yZXNlcnZlZCwKCQkJcy0+Y3VycmVudFRocmVhZC0+c3RhY2stPnVzZWQpOwoJZnBy
aW50ZihzdHJlYW0sICJcdHN0YWNrQm90dG9tID0gJXhcbnN0YWNrVG9wIC0gc3RhY2tCb3R0
b20gPSAldVxuc3RhY2tMaW1pdCAtIHN0YWNrVG9wID0gJXVcbiIsCgkJCSh1aW50KXMtPnN0
YWNrQm90dG9tLAoJCQlzLT5zdGFja1RvcCAtIHMtPnN0YWNrQm90dG9tLAoJCQkocy0+c3Rh
Y2tMaW1pdCAtIHMtPnN0YWNrVG9wKSk7Cn0KCi8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KLyogICAgICAgICAgICAgICAgICAgIGVu
c3VyZUZyZWUgICAgICAgICAgICAgICAgICAgICAqLwovKiAtLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCgpzdGF0aWMgaW5saW5lIHZvaWQK
ZW5zdXJlRnJlZShHQ19zdGF0ZSBzLCB1aW50IGJ5dGVzUmVxdWVzdGVkKQp7CglpZiAocy0+
ZnJvbnRpZXIgKyBieXRlc1JlcXVlc3RlZCA+IHMtPmxpbWl0KSB7CgkJR0NfZG9HQyhzLCBi
eXRlc1JlcXVlc3RlZCwgMCk7Cgl9Cn0KCi8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KLyogICAgICAgICAgICAgICAgICAgICAgb2Jq
ZWN0ICAgICAgICAgICAgICAgICAgICAgICAqLwovKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCgpzdGF0aWMgaW5saW5lIHBvaW50ZXIK
b2JqZWN0KEdDX3N0YXRlIHMsIHVpbnQgaGVhZGVyLCB1aW50IGJ5dGVzUmVxdWVzdGVkKQp7
Cglwb2ludGVyIHJlc3VsdDsKCglhc3NlcnQocy0+ZnJvbnRpZXIgKyBieXRlc1JlcXVlc3Rl
ZCA8PSBzLT5saW1pdCk7Cglhc3NlcnQoaXNXb3JkQWxpZ25lZChieXRlc1JlcXVlc3RlZCkp
OwoJKih1aW50KilzLT5mcm9udGllciA9IGhlYWRlcjsKCXJlc3VsdCA9IHMtPmZyb250aWVy
ICsgSEVBREVSX1NJWkU7CglzLT5mcm9udGllciArPSBieXRlc1JlcXVlc3RlZDsKCXJldHVy
biByZXN1bHQ7Cn0KCi8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0gKi8KLyogICAgICAgICAgICAgICAgICBnZXRGcmFtZUxheW91dCAgICAg
ICAgICAgICAgICAgICAqLwovKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tICovCgpzdGF0aWMgaW5saW5lIEdDX2ZyYW1lTGF5b3V0CSoKZ2V0
RnJhbWVMYXlvdXQoR0Nfc3RhdGUgcywgd29yZCByZXR1cm5BZGRyZXNzKQp7CglHQ19mcmFt
ZUxheW91dCAqbGF5b3V0OwoJdWludCBpbmRleDsKCglpZiAocy0+bmF0aXZlKQoJCWluZGV4
ID0gKigodWludCopKHJldHVybkFkZHJlc3MgLSA0KSk7CgllbHNlCgkJaW5kZXggPSAodWlu
dClyZXR1cm5BZGRyZXNzOwoJYXNzZXJ0KDAgPD0gaW5kZXggYW5kIGluZGV4IDw9IHMtPm1h
eEZyYW1lSW5kZXgpOwoJbGF5b3V0ID0gJihzLT5mcmFtZUxheW91dHNbaW5kZXhdKTsKCWFz
c2VydChsYXlvdXQtPm51bUJ5dGVzID4gMCk7CglyZXR1cm4gbGF5b3V0Owp9CgovKiAtLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCi8qICAg
ICAgICAgICAgICAgICAgICAgIFN0YWNrcyAgICAgICAgICAgICAgICAgICAgICAgKi8KLyog
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwoK
Lyogc3RhY2tTbG9wIHJldHVybnMgdGhlIGFtb3VudCBvZiAic2xvcCIgc3BhY2UgbmVlZGVk
IGJldHdlZW4gdGhlIHRvcCBvZiAKICogdGhlIHN0YWNrIGFuZCB0aGUgZW5kIG9mIHRoZSBz
dGFjayBzcGFjZS4KICogSWYgeW91IGNoYW5nZSB0aGlzLCBtYWtlIHN1cmUgYW5kIGNoYW5n
ZSBUaHJlYWRfc3dpdGNoVG8gaW4gY2NvZGVnZW4uaAogKiAgIGFuZCB0aHJlYWRfc3dpdGNo
VG8gaW4geDg2LWdlbmVyYXRlLXRyYW5zZmVycy5zbWwuCiAqLwpzdGF0aWMgaW5saW5lIHVp
bnQgc3RhY2tTbG9wKEdDX3N0YXRlIHMpIHsKCXJldHVybiAyICogcy0+bWF4RnJhbWVTaXpl
Owp9CgpzdGF0aWMgaW5saW5lIHVpbnQgaW5pdGlhbFN0YWNrU2l6ZShHQ19zdGF0ZSBzKSB7
CglyZXR1cm4gc3RhY2tTbG9wKHMpOwp9CgpzdGF0aWMgaW5saW5lIHVpbnQKc3RhY2tCeXRl
cyh1aW50IHNpemUpCnsKCXJldHVybiB3b3JkQWxpZ24oSEVBREVSX1NJWkUgKyBzaXplb2Yo
c3RydWN0IEdDX3N0YWNrKSArIHNpemUpOwp9CgovKiBJZiB5b3UgY2hhbmdlIHRoaXMsIG1h
a2Ugc3VyZSBhbmQgY2hhbmdlIFRocmVhZF9zd2l0Y2hUbyBpbiBjY29kZWdlbi5oCiAqICAg
YW5kIHRocmVhZF9zd2l0Y2hUbyBpbiB4ODYtZ2VuZXJhdGUtdHJhbnNmZXJzLnNtbC4KICov
CnN0YXRpYyBpbmxpbmUgcG9pbnRlcgpzdGFja0JvdHRvbShHQ19zdGFjayBzdGFjaykKewoJ
cmV0dXJuICgocG9pbnRlcilzdGFjaykgKyBzaXplb2Yoc3RydWN0IEdDX3N0YWNrKTsKfQoK
LyogUG9pbnRlciB0byB0aGUgdG9wbW9zdCB3b3JkIGluIHVzZSBvbiB0aGUgc3RhY2suICov
Ci8qIElmIHlvdSBjaGFuZ2UgdGhpcywgbWFrZSBzdXJlIGFuZCBjaGFuZ2UgVGhyZWFkX3N3
aXRjaFRvIGluIGNjb2RlZ2VuLmgKICogICBhbmQgdGhyZWFkX3N3aXRjaFRvIGluIHg4Ni1n
ZW5lcmF0ZS10cmFuc2ZlcnMuc21sLgogKi8Kc3RhdGljIGlubGluZSBwb2ludGVyCnN0YWNr
VG9wKEdDX3N0YWNrIHN0YWNrKQp7CglyZXR1cm4gc3RhY2tCb3R0b20oc3RhY2spICsgc3Rh
Y2stPnVzZWQ7Cn0KCi8qIFRoZSBtYXhpbXVtIHZhbHVlIHN0YWNrVG9wIG1heSB0YWtlIG9u
LiAqLwovKiBJZiB5b3UgY2hhbmdlIHRoaXMsIG1ha2Ugc3VyZSBhbmQgY2hhbmdlIFRocmVh
ZF9zd2l0Y2hUbyBpbiBjY29kZWdlbi5oCiAqICAgYW5kIHRocmVhZF9zd2l0Y2hUbyBpbiB4
ODYtZ2VuZXJhdGUtdHJhbnNmZXJzLnNtbC4KICovCnN0YXRpYyBpbmxpbmUgcG9pbnRlcgpz
dGFja0xpbWl0KEdDX3N0YXRlIHMsIEdDX3N0YWNrIHN0YWNrKQp7CglyZXR1cm4gc3RhY2tC
b3R0b20oc3RhY2spICsgc3RhY2stPnJlc2VydmVkIC0gc3RhY2tTbG9wKHMpOwp9CgovKiBO
dW1iZXIgb2YgYnl0ZXMgdXNlZCBieSB0aGUgc3RhY2suICovCi8qIElmIHlvdSBjaGFuZ2Ug
dGhpcywgbWFrZSBzdXJlIGFuZCBjaGFuZ2UgVGhyZWFkX3N3aXRjaFRvIGluIGNjb2RlZ2Vu
LmgKICogICBhbmQgdGhyZWFkX3N3aXRjaFRvIGluIHg4Ni1nZW5lcmF0ZS10cmFuc2ZlcnMu
c21sLgogKi8Kc3RhdGljIGlubGluZSB1aW50CmN1cnJlbnRTdGFja1VzZWQoR0Nfc3RhdGUg
cykKewoJcmV0dXJuIHMtPnN0YWNrVG9wIC0gcy0+c3RhY2tCb3R0b207Cn0KCnN0YXRpYyBp
bmxpbmUgYm9vbApzdGFja0lzRW1wdHkoR0Nfc3RhY2sgc3RhY2spCnsKCXJldHVybiAwID09
IHN0YWNrLT51c2VkOwp9CgpzdGF0aWMgaW5saW5lIHVpbnQKdG9wRnJhbWVTaXplKEdDX3N0
YXRlIHMsIEdDX3N0YWNrIHN0YWNrKQp7CglHQ19mcmFtZUxheW91dCAqbGF5b3V0OwoJCglh
c3NlcnQobm90KHN0YWNrSXNFbXB0eShzdGFjaykpKTsKCWxheW91dCA9IGdldEZyYW1lTGF5
b3V0KHMsICood29yZCopKHN0YWNrVG9wKHN0YWNrKSAtIFdPUkRfU0laRSkpOwoJcmV0dXJu
IGxheW91dC0+bnVtQnl0ZXM7Cn0KCi8qIHN0YWNrVG9wSXNPayBlbnN1cmVzIHRoYXQgd2hl
biB0aGlzIHN0YWNrIGJlY29tZXMgY3VycmVudCB0aGF0IAogKiB0aGUgc3RhY2tUb3AgaXMg
bGVzcyB0aGFuIHRoZSBzdGFja0xpbWl0LgogKi8Kc3RhdGljIGlubGluZSBib29sCnN0YWNr
VG9wSXNPayhHQ19zdGF0ZSBzLCBHQ19zdGFjayBzdGFjaykKewoJcmV0dXJuIHN0YWNrVG9w
KHN0YWNrKSAKCQkgICAgICAgCTw9IHN0YWNrTGltaXQocywgc3RhY2spIAoJCQkrIChzdGFj
a0lzRW1wdHkoc3RhY2spID8gMCA6IHRvcEZyYW1lU2l6ZShzLCBzdGFjaykpOwp9CgpzdGF0
aWMgaW5saW5lIEdDX3N0YWNrCm5ld1N0YWNrKEdDX3N0YXRlIHMsIHVpbnQgc2l6ZSkKewoJ
R0Nfc3RhY2sgc3RhY2s7CgoJc3RhY2sgPSAoR0Nfc3RhY2spb2JqZWN0KHMsIFNUQUNLX0hF
QURFUiwgc3RhY2tCeXRlcyhzaXplKSk7CglzdGFjay0+cmVzZXJ2ZWQgPSBzaXplOwoJc3Rh
Y2stPnVzZWQgPSAwOwoJcmV0dXJuIHN0YWNrOwp9CgppbmxpbmUgdm9pZApHQ19zZXRTdGFj
ayhHQ19zdGF0ZSBzKQp7CglHQ19zdGFjayBzdGFjazsKCglzdGFjayA9IHMtPmN1cnJlbnRU
aHJlYWQtPnN0YWNrOwoJcy0+c3RhY2tCb3R0b20gPSBzdGFja0JvdHRvbShzdGFjayk7Cglz
LT5zdGFja1RvcCA9IHN0YWNrVG9wKHN0YWNrKTsKCXMtPnN0YWNrTGltaXQgPSBzdGFja0xp
bWl0KHMsIHN0YWNrKTsKfQoKc3RhdGljIGlubGluZSB2b2lkCnN0YWNrQ29weShHQ19zdGFj
ayBmcm9tLCBHQ19zdGFjayB0bykKewoJYXNzZXJ0KGZyb20tPnVzZWQgPD0gdG8tPnJlc2Vy
dmVkKTsKCXRvLT51c2VkID0gZnJvbS0+dXNlZDsKCW1lbWNweShzdGFja0JvdHRvbSh0byks
IHN0YWNrQm90dG9tKGZyb20pLCBmcm9tLT51c2VkKTsKfQoKLyogLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwovKiAgICAgICAgICAgICAg
ICAgY29tcHV0ZVNlbWlTaXplICAgICAgICAgICAgICAgICAgICovCi8qIC0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KCnR5cGVkZWYgdW5z
aWduZWQgbG9uZyBsb25nIFc2NDsKdHlwZWRlZiB1bnNpZ25lZCBsb25nIFczMjsKCnN0YXRp
YyBpbmxpbmUgdWxvbmcgbWVnICh1aW50IG4pIHsKCXJldHVybiBuIC8gKDEwMjR1bCAqIDEw
MjR1bCk7Cn0KCi8qIGNvbXB1dGVTZW1pU2l6ZSByZXR1cm5zIHRoZSBhbW91bnQgb2Ygc3Bh
Y2UgbmVlZGVkIGZvciBhIHNlbWlzcGFjZSwKICogZ2l2ZW4gdGhhdCBsaXZlIGlzIHRoZSBu
dW1iZXIgb2YgYnl0ZXMgdGhhdCB3aWxsIGJlIGNvcGVkIGludG8gdGhlIHNwYWNlCiAqIGFu
ZCB1c2VkIGlzIHRoZSBhbW91bnQgdXNlZCBieSB0aGUgb3RoZXIgc2VtaXNwYWNlLgogKiBJ
dCB3aWxsIGF0dGVtcHQgdG8gbWFrZSB0aGUgc2l6ZSBsaXZlICogcy0+bGl2ZVJhdGlvLCBi
dXQgd2lsbCBub3QKICogdmlvbGF0ZSB0aGUgaW52YXJpYW50IHRoYXQgZnJvbVNpemUgKyB0
b1NpemUgPD0gbWF4SGVhcFNpemUuICBJdCB3aWxsIGFsc28KICogYmFjayBvZmYgaW4gdGhl
IGNhc2UgdGhhdCBtb3JlIHNwYWNlIGlzIG5lZWRlZCB0aGFuIGF2YWlsYWJsZSBSQU0uCiAq
CiAqIEl0IGlzIGNhcmVmdWwgbm90IHRvIG92ZXJmbG93IHdoZW4gZG9pbmcgdGhlIG11bHRp
cGx5LgogKi8Kc3RhdGljIHVpbnQKY29tcHV0ZVNlbWlTaXplKEdDX3N0YXRlIHMsIFc2NCBs
aXZlLCB1aW50IHVzZWQsIGludCB0cnkpCnsKCVc2NCBuZWVkZWRMb25nOwoJdWludCBuZWVk
ZWQ7CgoJYXNzZXJ0KG5vdCBzLT51c2VGaXhlZEhlYXApOwoJbmVlZGVkTG9uZyA9IGxpdmUg
KiBzLT5saXZlUmF0aW87CglpZiAobmVlZGVkTG9uZyA8PSAoVzY0KXMtPm1heFNlbWkpCgkJ
bmVlZGVkID0gcm91bmRQYWdlKHMsIChXMzIpbmVlZGVkTG9uZyk7CgllbHNlIHsKCQlXNjQg
bWF5YmU7CgkJdWludCBuOwoJCXN0YXRpYyBkb3VibGUga3NbMTNdID0gezEuOTksIDEuOTks
IDEuOCwgMS43LCAxLjYsIDEuNSwgCgkJCQkJMS40LCAxLjMsIDEuMiwgMS4xNSwgMS4xLCAx
LjA1LCAxLjAxfTsKCQlkb3VibGUgazsKCgkJYXNzZXJ0ICgwIDw9IHRyeSBhbmQgdHJ5IDwg
MTMpOwoJCWsgPSBrc1t0cnldOwoJCWsgPSAoKGstMSkvMikrMTsKCQltYXliZSA9IChXNjQp
KGtzW3RyeV0gKiAoZG91YmxlKWxpdmUpOwoJCW4gPSByb3VuZFBhZ2UocywgbWF5YmUgPiAo
VzY0KShzLT50b3RhbFJhbSArIHMtPnRvdGFsU3dhcCkKCQkJCT8gcy0+dG90YWxSYW0gKyBz
LT50b3RhbFN3YXAKCQkJCTogKFczMiltYXliZSk7CgkJaWYgKG4gPD0gcy0+bWF4U2VtaSkK
CQkJbiA9IHMtPm1heFNlbWk7CgkJZWxzZSBpZiAocy0+bWVzc2FnZXMgYW5kIHRyeSA+IDAp
CgkJCQlmcHJpbnRmKHN0ZGVyciwgIltSZXF1ZXN0ZWQgJWxsdU1iICg+ICVsdU1iKSBjYW5u
b3QgYmUgc2F0aXNmaWVkLCBhbGxvY2F0aW5nICVsdU1iIGluc3RlYWQuIExpdmUgPSAlbHVN
Yiwgaz0lLjJmXVxuIiwKCQkJCQluZWVkZWRMb25nIC8gKDEwMjQgKiAxMDI0KSwgCgkJCQkJ
bWVnKHMtPm1heFNlbWkpLAoJCQkJCW1lZyhuKSwgbWVnKGxpdmUpLCBrc1t0cnldKTsKCQlu
ZWVkZWQgPSBuOwoJfQoJaWYgKHMtPm1heEhlYXBTaXplID4gMCBhbmQgbmVlZGVkID4gcy0+
bWF4SGVhcFNpemUgLSB1c2VkKQoJCXJldHVybiByb3VuZFBhZ2Uocywgcy0+bWF4SGVhcFNp
emUgLSB1c2VkKTsKCWVsc2UKCQlyZXR1cm4gbmVlZGVkOwp9CgovKiAtLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCi8qICAgICAgICAgICAg
ICAgICAgICBhcnJheU51bUJ5dGVzICAgICAgICAgICAgICAgICAgKi8KLyogLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwoKLyogVGhlIG51
bWJlciBvZiBieXRlcyBpbiBhbiBhcnJheSwgbm90IGluY2x1ZGluZyB0aGUgaGVhZGVyLiAq
LwpzdGF0aWMgaW5saW5lIHVpbnQKYXJyYXlOdW1CeXRlcyhwb2ludGVyIHAsIAoJCSAgICAg
dWludCBudW1Qb2ludGVycywKCQkgICAgIHVpbnQgbnVtTm9uUG9pbnRlcnMpCnsKCXVpbnQg
bnVtRWxlbWVudHMsIGJ5dGVzUGVyRWxlbWVudCwgcmVzdWx0OwoJCgludW1FbGVtZW50cyA9
IEdDX2FycmF5TnVtRWxlbWVudHMocCk7CglieXRlc1BlckVsZW1lbnQgPSBudW1Ob25Qb2lu
dGVycyArIHRvQnl0ZXMobnVtUG9pbnRlcnMpOwoJcmVzdWx0ID0gd29yZEFsaWduKG51bUVs
ZW1lbnRzICogYnl0ZXNQZXJFbGVtZW50KTsKCQoJcmV0dXJuIHJlc3VsdDsKfQoKc3RhdGlj
IGlubGluZSB2b2lkCm1heWJlQ2FsbChHQ19wb2ludGVyRnVuIGYsIEdDX3N0YXRlIHMsIHBv
aW50ZXIgKnBwKQp7CglpZiAoR0NfaXNQb2ludGVyKCpwcCkpCgkJZihzLCBwcCk7Cn0KCi8q
IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8K
LyogICAgICAgICAgICAgICAgIEdDX2ZvcmVhY2hHbG9iYWwgICAgICAgICAgICAgICAgICAq
LwovKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
ICovCgovKiBBcHBseSBmIHRvIGVhY2ggZ2xvYmFsIHBvaW50ZXIgaW50byB0aGUgaGVhcC4g
Ki8KaW5saW5lIHZvaWQKR0NfZm9yZWFjaEdsb2JhbChHQ19zdGF0ZSBzLCBHQ19wb2ludGVy
RnVuIGYpCnsKCWludCBpOwoKIAlmb3IgKGkgPSAwOyBpIDwgcy0+bnVtR2xvYmFsczsgKytp
KQoJCW1heWJlQ2FsbChmLCBzLCAmcy0+Z2xvYmFsc1tpXSk7CgltYXliZUNhbGwoZiwgcywg
KHBvaW50ZXIqKSZzLT5jdXJyZW50VGhyZWFkKTsKCW1heWJlQ2FsbChmLCBzLCAocG9pbnRl
ciopJnMtPnNhdmVkVGhyZWFkKTsKCW1heWJlQ2FsbChmLCBzLCAocG9pbnRlciopJnMtPnNp
Z25hbEhhbmRsZXIpOwp9CgovKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tICovCi8qICAgICAgICAgICAgIEdDX2ZvcmVhY2hQb2ludGVySW5P
YmplY3QgICAgICAgICAgICAgKi8KLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLSAqLwovKgogKiBBcHBseSBmIHRvIGVhY2ggcG9pbnRlciBp
biB0aGUgb2JqZWN0IHAsIHdoZXJlIHAgcG9pbnRzIGF0IHRoZSBmaXJzdAogKiBkYXRhIHdv
cmQgaW4gdGhlIG9iamVjdC4KICogUmV0dXJucyBwb2ludGVyIHRvIHRoZSBlbmQgb2Ygb2Jq
ZWN0LCBpLmUuIGp1c3QgcGFzdCBvYmplY3QuCiAqLwppbmxpbmUgcG9pbnRlcgpHQ19mb3Jl
YWNoUG9pbnRlckluT2JqZWN0KEdDX3N0YXRlIHMsIEdDX3BvaW50ZXJGdW4gZiwgcG9pbnRl
ciBwKQp7Cgl3b3JkIGhlYWRlcjsKCXVpbnQgbnVtUG9pbnRlcnM7Cgl1aW50IG51bU5vblBv
aW50ZXJzOwoJdWludCB0YWc7CgoJaGVhZGVyID0gR0NfZ2V0SGVhZGVyKHApOwoJU1BMSVRf
SEVBREVSKCk7CglpZiAoREVCVUdfREVUQUlMRUQpCgkJZnByaW50ZihzdGRlcnIsICJmb3Jl
YWNoUG9pbnRlckluT2JqZWN0IHAgPSAweCV4ICBoZWFkZXIgPSAweCV4ICB0YWcgPSAweCV4
ICBudW1Ob25Qb2ludGVycyA9ICVkICBudW1Qb2ludGVycyA9ICVkXG4iLCAKCQkJKHVpbnQp
cCwgaGVhZGVyLCB0YWcsIG51bU5vblBvaW50ZXJzLCBudW1Qb2ludGVycyk7CglpZiAoTk9S
TUFMX1RBRyA9PSB0YWcpIHsgLyogSXQncyBhIG5vcm1hbCBvYmplY3QuICovCgkJcG9pbnRl
ciBtYXg7CgoJCXAgKz0gdG9CeXRlcyhudW1Ob25Qb2ludGVycyk7CgkJbWF4ID0gcCArIHRv
Qnl0ZXMobnVtUG9pbnRlcnMpOwoJCS8qIEFwcGx5IGYgdG8gYWxsIGludGVybmFsIHBvaW50
ZXJzLiAqLwoJCWZvciAoIDsgcCA8IG1heDsgcCArPSBQT0lOVEVSX1NJWkUpCgkJCW1heWJl
Q2FsbChmLCBzLCAocG9pbnRlciopcCk7Cgl9IGVsc2UgaWYgKFNUQUNLX1RBRyA9PSB0YWcp
IHsKCQlHQ19zdGFjayBzdGFjazsKCQlwb2ludGVyIHRvcCwgYm90dG9tOwoJCWludCBpOwoJ
CXdvcmQgcmV0dXJuQWRkcmVzczsKCQlHQ19mcmFtZUxheW91dCAqbGF5b3V0OwoJCUdDX29m
ZnNldHMgZnJhbWVPZmZzZXRzOwoKCQlzdGFjayA9IChHQ19zdGFjaylwOwoJCWJvdHRvbSA9
IHN0YWNrQm90dG9tKHN0YWNrKTsKCQl0b3AgPSBzdGFja1RvcChzdGFjayk7CgkJYXNzZXJ0
KHN0YWNrLT51c2VkIDw9IHN0YWNrLT5yZXNlcnZlZCk7CgkJd2hpbGUgKHRvcCA+IGJvdHRv
bSkgewoJCQkvKiBJbnZhcmlhbnQ6IHRvcCBwb2ludHMganVzdCBwYXN0IGEgInJldHVybiBh
ZGRyZXNzIi4gKi8KCQkJcmV0dXJuQWRkcmVzcyA9ICood29yZCopICh0b3AgLSBXT1JEX1NJ
WkUpOwoJCQlpZiAoREVCVUcpCgkJCQlmcHJpbnRmKHN0ZGVyciwgCgkJCQkJIiAgdG9wID0g
JWQgIHJldHVybiBhZGRyZXNzID0gJXUuXG4iLCAKCQkJCQl0b3AgLSBib3R0b20sIAoJCQkJ
CXJldHVybkFkZHJlc3MpOwoJCQlsYXlvdXQgPSBnZXRGcmFtZUxheW91dChzLCByZXR1cm5B
ZGRyZXNzKTsgCgkJCWZyYW1lT2Zmc2V0cyA9IGxheW91dC0+b2Zmc2V0czsKCQkJdG9wIC09
IGxheW91dC0+bnVtQnl0ZXM7CgkJCWZvciAoaSA9IDAgOyBpIDwgZnJhbWVPZmZzZXRzWzBd
IDsgKytpKSB7CgkJCQlpZiAoREVCVUcpCgkJCQkJZnByaW50ZihzdGRlcnIsIAoJCQkJCQki
ICAgIG9mZnNldCAldSAgYWRkcmVzcyAleFxuIiwgCgkJCQkJCWZyYW1lT2Zmc2V0c1tpICsg
MV0sCgkJCQkJCSh1aW50KSgqKHBvaW50ZXIqKSh0b3AgKyBmcmFtZU9mZnNldHNbaSArIDFd
KSkpOwoJCQkJbWF5YmVDYWxsKGYsIHMsIAoJCQkJCSAgKHBvaW50ZXIqKQoJCQkJCSAgKHRv
cCArIGZyYW1lT2Zmc2V0c1tpICsgMV0pKTsKCQkJfQoJCX0KCQlhc3NlcnQodG9wID09IGJv
dHRvbSk7CgkJcCArPSBzaXplb2Yoc3RydWN0IEdDX3N0YWNrKSArIHN0YWNrLT5yZXNlcnZl
ZDsKCX0gZWxzZSB7IC8qIEl0J3MgYW4gYXJyYXkuICovCgkJdWludCBudW1CeXRlczsKCgkJ
YXNzZXJ0KEFSUkFZX1RBRyA9PSB0YWcpOwoJCW51bUJ5dGVzID0gYXJyYXlOdW1CeXRlcyhw
LCBudW1Qb2ludGVycywgbnVtTm9uUG9pbnRlcnMpOwoJCWlmIChudW1CeXRlcyA9PSAwKQoJ
CQkvKiBBbiBlbXB0eSBhcnJheSAtLSBza2lwIHRoZSBQT0lOVEVSX1NJWkUgYnl0ZXMKCQkJ
ICogZm9yIHRoZSBmb3J3YXJkaW5nIHBvaW50ZXIuCgkJCSAqLwoJCQlwICs9IFBPSU5URVJf
U0laRTsKCQllbHNlIHsKCQkJcG9pbnRlciBtYXg7CgoJCQltYXggPSBwICsgbnVtQnl0ZXM7
CgkJCWlmIChudW1Qb2ludGVycyA9PSAwKSB7CgkJCQkvKiBUaGVyZSBhcmUgbm8gcG9pbnRl
cnMsIGp1c3QgdXBkYXRlIHAuICovCgkJCQlwID0gbWF4OwoJCQl9IGVsc2UgaWYgKG51bU5v
blBvaW50ZXJzID09IDApIHsKCQkJICAJLyogSXQncyBhbiBhcnJheSB3aXRoIG9ubHkgcG9p
bnRlcnMuICovCgkJCQlmb3IgKDsgcCA8IG1heDsgcCArPSBQT0lOVEVSX1NJWkUpCgkJCQkJ
bWF5YmVDYWxsKGYsIHMsIChwb2ludGVyKilwKTsKCQkJfSBlbHNlIHsKCQkJCXVpbnQgbnVt
Qnl0ZXNQb2ludGVyczsKCQkJCQoJCQkJbnVtQnl0ZXNQb2ludGVycyA9IHRvQnl0ZXMobnVt
UG9pbnRlcnMpOwoJCQkJLyogRm9yIGVhY2ggYXJyYXkgZWxlbWVudC4gKi8KCQkJCXdoaWxl
IChwIDwgbWF4KSB7CgkJCQkJcG9pbnRlciBtYXgyOwoKCQkJCQlwICs9IG51bU5vblBvaW50
ZXJzOwoJCQkJCW1heDIgPSBwICsgbnVtQnl0ZXNQb2ludGVyczsKCQkJCQkvKiBGb3IgZWFj
aCBpbnRlcm5hbCBwb2ludGVyLiAqLwoJCQkJCWZvciAoIDsgcCA8IG1heDI7IHAgKz0gUE9J
TlRFUl9TSVpFKSAKCQkJCQkJbWF5YmVDYWxsKGYsIHMsIChwb2ludGVyKilwKTsKCQkJCX0K
CQkJfQoJCQlhc3NlcnQocCA9PSBtYXgpOwoJCX0KCX0KCXJldHVybiBwOwp9CgovKiAtLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCi8qICAg
ICAgICAgICAgICAgICAgICAgIHRvRGF0YSAgICAgICAgICAgICAgICAgICAgICAgKi8KLyog
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwoK
LyogcCBzaG91bGQgcG9pbnQgYXQgdGhlIGJlZ2lubmluZyBvZiBhbiBvYmplY3QgKGkuZS4g
dGhlIGhlYWRlcikuCiAqIFJldHVybnMgYSBwb2ludGVyIHRvIHRoZSBzdGFydCBvZiB0aGUg
b2JqZWN0IGRhdGEuCiAqLwpzdGF0aWMgaW5saW5lIHBvaW50ZXIKdG9EYXRhKHBvaW50ZXIg
cCkKewoJd29yZCBoZWFkZXI7CQoKCWhlYWRlciA9ICood29yZCopcDsKCXJldHVybiAoKEFS
UkFZX1RBRyA9PSAoaGVhZGVyICYgVEFHX01BU0spKQoJCT8gcCArIDIgKiBXT1JEX1NJWkUK
CQk6IHAgKyBXT1JEX1NJWkUpOwp9CgovKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCi8qICAgICAgICAgICAgIEdDX2ZvcmVhY2hQb2lu
dGVySW5SYW5nZSAgICAgICAgICAgICAgKi8KLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwoKLyogQXBwbHkgZiB0byBlYWNoIHBvaW50
ZXIgYmV0d2VlbiBmcm9udCBhbmQgKmJhY2ssIHdoaWNoIHNob3VsZCBiZSBhIAogKiBjb250
aWd1b3VzIHNlcXVlbmNlIG9mIG9iamVjdHMsIHdoZXJlIGZyb250IHBvaW50cyBhdCB0aGUg
YmVnaW5uaW5nIG9mCiAqIHRoZSBmaXJzdCBvYmplY3QgYW5kICpiYWNrIHBvaW50cyBqdXN0
IHBhc3QgdGhlIGVuZCBvZiB0aGUgbGFzdCBvYmplY3QuCiAqIGYgbWF5IGluY3JlYXNlICpi
YWNrIChmb3IgZXhhbXBsZSwgdGhpcyBpcyBkb25lIGJ5IGZvcndhcmQpLgogKi8KCmlubGlu
ZSB2b2lkCkdDX2ZvcmVhY2hQb2ludGVySW5SYW5nZShHQ19zdGF0ZSBzLCBwb2ludGVyIGZy
b250LCBwb2ludGVyICpiYWNrLAoJCQkgR0NfcG9pbnRlckZ1biBmKQp7Cglwb2ludGVyIGI7
CgoJYiA9ICpiYWNrOwoJYXNzZXJ0KGZyb250IDw9IGIpOwogCXdoaWxlIChmcm9udCA8IGIp
IHsKCQl3aGlsZSAoZnJvbnQgPCBiKSB7CgkJCWFzc2VydChpc1dvcmRBbGlnbmVkKCh1aW50
KWZyb250KSk7CgkJCWZyb250ID0gR0NfZm9yZWFjaFBvaW50ZXJJbk9iamVjdChzLCBmLCB0
b0RhdGEoZnJvbnQpKTsKCQl9CgkJYiA9ICpiYWNrOwoJfQoJYXNzZXJ0KGZyb250ID09ICpi
YWNrKTsKfQoKLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLSAqLwovKiAgICAgICAgICAgICAgICAgICAgIGludmFyaWFudCAgICAgICAgICAg
ICAgICAgICAgICovCi8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0gKi8KCiNpZm5kZWYgTk9ERUJVRwoKc3RhdGljIGlubGluZSBib29sCmlz
SW5Gcm9tU3BhY2UoR0Nfc3RhdGUgcywgcG9pbnRlciBwKQp7CiAJcmV0dXJuIChzLT5iYXNl
IDw9IHAgYW5kIHAgPCBzLT5mcm9udGllcik7Cn0KCnN0YXRpYyBpbmxpbmUgdm9pZAphc3Nl
cnRJc0luRnJvbVNwYWNlKEdDX3N0YXRlIHMsIHBvaW50ZXIgKnApCnsKCWFzc2VydChpc0lu
RnJvbVNwYWNlKHMsICpwKSk7Cn0KCnN0YXRpYyBpbmxpbmUgYm9vbAppc0luVG9TcGFjZShH
Q19zdGF0ZSBzLCBwb2ludGVyIHApCnsKCXJldHVybiAobm90KEdDX2lzUG9pbnRlcihwKSkK
CQlvciAocy0+dG9CYXNlIDw9IHAgYW5kIHAgPCBzLT50b0Jhc2UgKyBzLT50b1NpemUpKTsK
fQoKc3RhdGljIGJvb2wKaW52YXJpYW50KEdDX3N0YXRlIHMpCnsKCS8qIHdvdWxkIGJlIG5p
Y2UgdG8gYWRkIGRpdmlzaWJsaXR5IGJ5IHBhZ2VzaXplIG9mIHZhcmlvdXMgdGhpbmdzICov
CgoJLyogRnJhbWUgbGF5b3V0cyAqLwoJewkKCQlpbnQgaTsKCgkJZm9yIChpID0gMDsgaSA8
IHMtPm1heEZyYW1lSW5kZXg7ICsraSkgewoJCQlHQ19mcmFtZUxheW91dCAqbGF5b3V0OwoK
IAkJCWxheW91dCA9ICYocy0+ZnJhbWVMYXlvdXRzW2ldKTsKCQkJaWYgKGxheW91dC0+bnVt
Qnl0ZXMgPiAwKSB7CgkJCQlHQ19vZmZzZXRzIG9mZnNldHM7CgkJCQlpbnQgajsKCgkJCQlh
c3NlcnQobGF5b3V0LT5udW1CeXRlcyA8PSBzLT5tYXhGcmFtZVNpemUpOwoJCQkJb2Zmc2V0
cyA9IGxheW91dC0+b2Zmc2V0czsKCQkJCWZvciAoaiA9IDA7IGogPCBvZmZzZXRzWzBdOyAr
K2opCgkJCQkJYXNzZXJ0KG9mZnNldHNbaiArIDFdIDwgbGF5b3V0LT5udW1CeXRlcyk7CgkJ
CX0KCQl9Cgl9CgkvKiBIZWFwICovCglhc3NlcnQoaXNXb3JkQWxpZ25lZCgodWludClzLT5m
cm9udGllcikpOwoJYXNzZXJ0KHMtPmJhc2UgPD0gcy0+ZnJvbnRpZXIpOwoJYXNzZXJ0KDAg
PT0gcy0+ZnJvbVNpemUgCgkJb3IgKHMtPmZyb250aWVyIDw9IHMtPmxpbWl0ICsgTElNSVRf
U0xPUAoJCQlhbmQgcy0+bGltaXQgPT0gcy0+YmFzZSArIHMtPmZyb21TaXplIC0gTElNSVRf
U0xPUCkpOwoJYXNzZXJ0KHMtPnRvQmFzZSA9PSBOVUxMIG9yIHMtPnRvU2l6ZSA9PSBzLT5m
cm9tU2l6ZSk7CgkvKiBDaGVjayB0aGF0IGFsbCBwb2ludGVycyBhcmUgaW50byBmcm9tIHNw
YWNlLiAqLwoJR0NfZm9yZWFjaEdsb2JhbChzLCBhc3NlcnRJc0luRnJvbVNwYWNlKTsKCUdD
X2ZvcmVhY2hQb2ludGVySW5SYW5nZShzLCBzLT5iYXNlLCAmcy0+ZnJvbnRpZXIsIGFzc2Vy
dElzSW5Gcm9tU3BhY2UpOwoJLyogQ3VycmVudCB0aHJlYWQuICovCgl7Ci8qCQl1aW50IG9m
ZnNldDsgKi8KCQlHQ19zdGFjayBzdGFjazsKCgkJc3RhY2sgPSBzLT5jdXJyZW50VGhyZWFk
LT5zdGFjazsKCQlhc3NlcnQoaXNXb3JkQWxpZ25lZChzdGFjay0+cmVzZXJ2ZWQpKTsKCQlh
c3NlcnQocy0+c3RhY2tCb3R0b20gPT0gc3RhY2tCb3R0b20oc3RhY2spKTsKCQlhc3NlcnQo
cy0+c3RhY2tUb3AgPT0gc3RhY2tUb3Aoc3RhY2spKTsKCSAJYXNzZXJ0KHMtPnN0YWNrTGlt
aXQgPT0gc3RhY2tMaW1pdChzLCBzdGFjaykpOwoJCWFzc2VydChzdGFjay0+dXNlZCA9PSBj
dXJyZW50U3RhY2tVc2VkKHMpKTsKCQlhc3NlcnQoc3RhY2stPnVzZWQgPCBzdGFjay0+cmVz
ZXJ2ZWQpOwoJIAlhc3NlcnQocy0+c3RhY2tCb3R0b20gPD0gcy0+c3RhY2tUb3ApOwovKiBD
YW4ndCB3YWxrIGRvd24gdGhlIGV4Y2VwdGlvbiBzdGFjayB0aGVzZSBkYXlzLCBiZWNhdXNl
IHRoZXJlIGlzIG5vIAogKiBndWFyYW50ZWUgdGhhdCB0aGUgaGFuZGxlciBsaW5rIGFuZCBz
bG90IGFyZSBuZXh0IHRvIGVhY2ggb3RoZXIuCiAqLwovKiAJCWZvciAob2Zmc2V0ID0gcy0+
Y3VycmVudFRocmVhZC0+ZXhuU3RhY2s7ICAqLwovKiAJCQlvZmZzZXQgIT0gQk9HVVNfRVhO
X1NUQUNLOyApIHsgKi8KLyogCQkJdW5sZXNzIChzLT5zdGFja0JvdHRvbSArIG9mZnNldCA8
PSBzLT5zdGFja1RvcCkgKi8KLyogCQkJCWZwcmludGYoc3RkZXJyLCAicy0+c3RhY2tCb3R0
b20gPSAlZCAgb2Zmc2V0ID0gJWQgcy0+c3RhY2tUb3AgPSAlZFxuIiwgKHVpbnQpKHMtPnN0
YWNrQm90dG9tKSwgb2Zmc2V0LCAodWludCkocy0+c3RhY2tUb3ApKTsgKi8KLyogCQkJYXNz
ZXJ0KHMtPnN0YWNrQm90dG9tICsgb2Zmc2V0IDw9IHMtPnN0YWNrVG9wKTsgKi8KLyogCQkJ
b2Zmc2V0ID0gKih1aW50Kikocy0+c3RhY2tCb3R0b20gKyBvZmZzZXQgKyBXT1JEX1NJWkUp
OyAqLwovKiAJCX0gKi8KCX0KCglyZXR1cm4gVFJVRTsKfQoKYm9vbApHQ19tdXRhdG9ySW52
YXJpYW50KEdDX3N0YXRlIHMpCnsKCWlmIChERUJVRykKCQlHQ19kaXNwbGF5KHMsIHN0ZGVy
cik7Cglhc3NlcnQoc3RhY2tUb3BJc09rKHMsIHMtPmN1cnJlbnRUaHJlYWQtPnN0YWNrKSk7
Cglhc3NlcnQoaW52YXJpYW50KHMpKTsKCXJldHVybiBUUlVFOwp9CiNlbmRpZiAvKiAjaWZu
ZGVmIE5PREVCVUcgKi8KCi8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0gKi8KLyogICAgICAgICAgICAgICAgICAgICAgVGhyZWFkcyAgICAg
ICAgICAgICAgICAgICAgICAqLwovKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tICovCgpzdGF0aWMgaW5saW5lIHVpbnQKdGhyZWFkQnl0ZXMo
KQp7CglyZXR1cm4gd29yZEFsaWduKEhFQURFUl9TSVpFICsgc2l6ZW9mKHN0cnVjdCBHQ190
aHJlYWQpKTsKfQoKc3RhdGljIGlubGluZSB1aW50CmluaXRpYWxUaHJlYWRCeXRlcyhHQ19z
dGF0ZSBzKQp7CglyZXR1cm4gdGhyZWFkQnl0ZXMoKSArIHN0YWNrQnl0ZXMoaW5pdGlhbFN0
YWNrU2l6ZShzKSk7Cn0KCnN0YXRpYyBpbmxpbmUgR0NfdGhyZWFkCm5ld1RocmVhZE9mU2l6
ZShHQ19zdGF0ZSBzLCB1aW50IHN0YWNrU2l6ZSkKewoJR0Nfc3RhY2sgc3RhY2s7CglHQ190
aHJlYWQgdDsKCgllbnN1cmVGcmVlKHMsIHN0YWNrQnl0ZXMoc3RhY2tTaXplKSArIHRocmVh
ZEJ5dGVzKCkpOwoJc3RhY2sgPSBuZXdTdGFjayhzLCBzdGFja1NpemUpOwoJdCA9IChHQ190
aHJlYWQpb2JqZWN0KHMsIFRIUkVBRF9IRUFERVIsIHRocmVhZEJ5dGVzKCkpOwoJdC0+ZXhu
U3RhY2sgPSBCT0dVU19FWE5fU1RBQ0s7Cgl0LT5zdGFjayA9IHN0YWNrOwoJcmV0dXJuIHQ7
Cn0KCnN0YXRpYyBpbmxpbmUgdm9pZApzd2l0Y2hUb1RocmVhZChHQ19zdGF0ZSBzLCBHQ190
aHJlYWQgdCkKewoJcy0+Y3VycmVudFRocmVhZCA9IHQ7CglHQ19zZXRTdGFjayhzKTsKfQoK
c3RhdGljIGlubGluZSB2b2lkCmNvcHlUaHJlYWQoR0Nfc3RhdGUgcywgR0NfdGhyZWFkIGZy
b20sIHVpbnQgc2l6ZSkKewoJR0NfdGhyZWFkIHRvOwoKCS8qIG5ld1RocmVhZE9mU2l6ZSBt
YXkgZG8gYSBHQywgd2hpY2ggaW52YWxpZGF0ZXMgZnJvbS4gIAoJICogSGVuY2Ugd2UgbmVl
ZCB0byBzdGFzaCBmcm9tIHdoZXJlIHRoZSBHQyBjYW4gZmluZCBpdC4KCSAqLwoJcy0+c2F2
ZWRUaHJlYWQgPSBmcm9tOwoJdG8gPSBuZXdUaHJlYWRPZlNpemUocywgc2l6ZSk7Cglmcm9t
ID0gcy0+c2F2ZWRUaHJlYWQ7CglzdGFja0NvcHkoZnJvbS0+c3RhY2ssIHRvLT5zdGFjayk7
Cgl0by0+ZXhuU3RhY2sgPSBmcm9tLT5leG5TdGFjazsKCXMtPnNhdmVkVGhyZWFkID0gdG87
Cn0KCi8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0gKi8KLyogICAgICAgICAgICAgICAgZnJvbVNwYWNlLCB0b1NwYWNlICAgICAgICAgICAg
ICAgICAqLwovKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tICovCgpzdGF0aWMgaW5saW5lIHZvaWQgc2V0TGltaXQoR0Nfc3RhdGUgcykgewoJ
cy0+bGltaXRQbHVzU2xvcCA9IHMtPmJhc2UgKyBzLT5mcm9tU2l6ZTsKCXMtPmxpbWl0ID0g
cy0+bGltaXRQbHVzU2xvcCAtIExJTUlUX1NMT1A7Cn0KCi8qIC0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KLyogICAgICAgICAgICAgICAg
ICAgICAgU2lnbmFscyAgICAgICAgICAgICAgICAgICAgICAqLwovKiAtLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCgpzdGF0aWMgaW5saW5l
IHZvaWQKYmxvY2tTaWduYWxzKEdDX3N0YXRlIHMpCnsKCXNpZ3Byb2NtYXNrKFNJR19CTE9D
SywgJnMtPnNpZ25hbHNIYW5kbGVkLCBOVUxMKTsKfQoKc3RhdGljIGlubGluZSB2b2lkCnVu
YmxvY2tTaWduYWxzKEdDX3N0YXRlIHMpCnsKCXNpZ3Byb2NtYXNrKFNJR19VTkJMT0NLLCAm
cy0+c2lnbmFsc0hhbmRsZWQsIE5VTEwpOwp9CgovKiBlbnRlciBhbmQgbGVhdmUgc2hvdWxk
IGJlIGNhbGxlZCBhdCB0aGUgc3RhcnQgYW5kIGVuZCBvZiBldmVyeSBHQyBmdW5jdGlvbgog
KiB0aGF0IGlzIGV4cG9ydGVkIHRvIHRoZSBvdXRzaWRlIHdvcmxkLiAgVGhleSBtYWtlIHN1
cmUgdGhhdCBzaWduYWxzIGFyZQogKiBibG9ja2VkIGZvciB0aGUgZHVyYXRpb24gb2YgdGhl
IGZ1bmN0aW9uIGFuZCBjaGVjayB0aGUgR0MgaW52YXJpYW50CiAqIFRoZXkgYXJlIGEgYml0
IHRyaWNreSBiZWNhdXNlIG9mIHRoZSBjYXNlIHdoZW4gdGhlIHJ1bnRpbWUgc3lzdGVtIGlz
IGludm9rZWQKICogZnJvbSB3aXRoaW4gYW4gTUwgc2lnbmFsIGhhbmRsZXIuCiAqLwppbmxp
bmUgdm9pZApHQ19lbnRlcihHQ19zdGF0ZSBzKQp7CgkvKiB1c2VkIG5lZWRzIHRvIGJlIHNl
dCBiZWNhdXNlIHRoZSBtdXRhdG9yIGhhcyBjaGFuZ2VkIHMtPnN0YWNrVG9wLiAqLwoJcy0+
Y3VycmVudFRocmVhZC0+c3RhY2stPnVzZWQgPSBjdXJyZW50U3RhY2tVc2VkKHMpOwoJaWYg
KERFQlVHKSAKCQlHQ19kaXNwbGF5KHMsIHN0ZGVycik7Cgl1bmxlc3MgKHMtPmluU2lnbmFs
SGFuZGxlcikgewoJCWJsb2NrU2lnbmFscyhzKTsKCQlpZiAocy0+bGltaXQgPT0gMCkKCQkJ
c2V0TGltaXQocyk7Cgl9Cglhc3NlcnQoaW52YXJpYW50KHMpKTsKfQoKc3RhdGljIGlubGlu
ZSB2b2lkCmxlYXZlKEdDX3N0YXRlIHMpCnsKCWFzc2VydChHQ19tdXRhdG9ySW52YXJpYW50
KHMpKTsKCWlmIChzLT5zaWduYWxJc1BlbmRpbmcgYW5kIDAgPT0gcy0+Y2FuSGFuZGxlKQoJ
CXMtPmxpbWl0ID0gMDsKCXVubGVzcyAocy0+aW5TaWduYWxIYW5kbGVyKQoJCXVuYmxvY2tT
aWduYWxzKHMpOwp9CgppbmxpbmUgdm9pZApHQ19jb3B5Q3VycmVudFRocmVhZChHQ19zdGF0
ZSBzKQp7CglHQ190aHJlYWQgdDsKCglHQ19lbnRlcihzKTsKCXQgPSBzLT5jdXJyZW50VGhy
ZWFkOwoJY29weVRocmVhZChzLCB0LCB0LT5zdGFjay0+dXNlZCk7Cglhc3NlcnQocy0+ZnJv
bnRpZXIgPD0gcy0+bGltaXQpOwoJbGVhdmUocyk7Cn0KCnN0YXRpYyBpbmxpbmUgdWludApz
dGFja05lZWRzUmVzZXJ2ZWQoR0Nfc3RhdGUgcywgR0Nfc3RhY2sgc3RhY2spCnsKCXJldHVy
biBzdGFjay0+dXNlZCArIHN0YWNrU2xvcChzKSAtIHRvcEZyYW1lU2l6ZShzLCBzdGFjayk7
Cn0KCmlubGluZSB2b2lkCkdDX2NvcHlUaHJlYWQoR0Nfc3RhdGUgcywgR0NfdGhyZWFkIHQp
CnsKCUdDX2VudGVyIChzKTsKCWFzc2VydCAodC0+c3RhY2stPnJlc2VydmVkID09IHQtPnN0
YWNrLT51c2VkKTsKCWNvcHlUaHJlYWQgKHMsIHQsIHN0YWNrTmVlZHNSZXNlcnZlZChzLCB0
LT5zdGFjaykpOwoJYXNzZXJ0KHMtPmZyb250aWVyIDw9IHMtPmxpbWl0KTsKCWxlYXZlKHMp
Owp9CgpleHRlcm4gc3RydWN0IEdDX3N0YXRlIGdjU3RhdGU7CgppbmxpbmUgdm9pZApHQ19m
cm9tU3BhY2UoR0Nfc3RhdGUgcykKewoJcy0+YmFzZSA9IHNtbWFwKHMtPmZyb21TaXplKTsK
CWlmIChzLT5mcm9tU2l6ZSA+IHMtPm1heEhlYXBTaXplU2VlbikKCQlzLT5tYXhIZWFwU2l6
ZVNlZW4gPSBzLT5mcm9tU2l6ZTsKCXNldExpbWl0KHMpOwp9CgovKiBUaGlzIHRvZ2dsZXMg
YmFjayBhbmQgZm9ydGggYmV0d2VlbiBoaWdoIGFuZCBsb3cgYWRkcmVzc2VzIHRvIGRlY3Jl
YXNlCiAqIHRoZSBjaGFuY2Ugb2YgdmlydHVhbCBtZW1vcnkgZnJhZ21lbnRhdGlvbiBjYXVz
aW5nIGFuIG1tYXAgdG8gZmFpbC4KICogVGhpcyBpcyBpbXBvcnRhbnQgZm9yIGxhcmdlICg+
MUcpIGhlYXBzLgogKi8Kc3RhdGljIHZvaWQgKnNtbWFwX2RpZW5vdChzaXplX3QgbGVuZ3Ro
LCBpbnQgZGlyZWN0aW9uKSB7CglpbnQgaTsKCXZvaWQgKnJlc3VsdCA9ICh2b2lkKiktMTsK
Cglmb3IgKGkgPSAwOyBpIDwgMzI7IGkrKykgewoJCXVuc2lnbmVkIGxvbmcgYWRkcmVzczsK
CgkJYWRkcmVzcyA9IGkqMHgwODAwMDAwMHVsOwoJCWlmIChkaXJlY3Rpb24pCgkJCWFkZHJl
c3MgPSAweGY4MDAwMDAwdWwgLSBhZGRyZXNzOwoJCXJlc3VsdCA9IG1tYXAoYWRkcmVzcyso
dm9pZCopMCwgbGVuZ3RoLCBQUk9UX1JFQUQgfCBQUk9UX1dSSVRFLAoJCQkJTUFQX1BSSVZB
VEUgfCBNQVBfQU5PTiwgLTEsIDApOwoJICBpZiAoKHZvaWQqKS0xICE9IHJlc3VsdCkKCQli
cmVhazsKCX0KCXJldHVybiByZXN1bHQ7Cn0KCnN0YXRpYyB2b2lkIAp0b1NwYWNlIChHQ19z
dGF0ZSBzKSB7CglzdGF0aWMgaW50IGRpcmVjdGlvbiA9IDE7CglzLT50b0Jhc2UgPSBzbW1h
cF9kaWVub3Qocy0+dG9TaXplLCBkaXJlY3Rpb24pOwoJaWYgKHMtPnRvQmFzZSAhPSAodm9p
ZCopLTEpIHsKCQlkaXJlY3Rpb24gPSAoZGlyZWN0aW9uPT0wKTsKCQlpZiAocy0+dG9TaXpl
ID4gcy0+bWF4SGVhcFNpemVTZWVuKQoJCQlzLT5tYXhIZWFwU2l6ZVNlZW4gPSBzLT50b1Np
emU7Cgl9Cn0KCnZvaWQgCkdDX3RvU3BhY2UoR0Nfc3RhdGUgcykKewoJdG9TcGFjZShzKTsK
IAlpZiAocy0+dG9CYXNlID09ICh2b2lkKiktMSkgCgkJZGllZSgiT3V0IG9mIHN3YXAgc3Bh
Y2UiKTsKfQoKLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLSAqLwovKiAgICAgICAgICAgICAgICAgICAgZ2V0cnVzYWdlICAgICAgICAgICAg
ICAgICAgICAgICovCi8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0gKi8KCmludApmaXhlZEdldHJ1c2FnZShpbnQgd2hvLCBzdHJ1Y3QgcnVz
YWdlICpydXApCnsKCXN0cnVjdCB0bXMJdGJ1ZmY7CglpbnQJCXJlczsKCWNsb2NrX3QJCXVz
ZXIsCgkJCXN5czsKCXN0YXRpYyBib29sCWZpcnN0ID0gVFJVRTsKCXN0YXRpYyBsb25nCWh6
OwoKCWlmIChmaXJzdCkgewoJCWZpcnN0ID0gRkFMU0U7CgkJaHogPSBzeXNjb25mKF9TQ19D
TEtfVENLKTsKCX0KCXJlcyA9IGdldHJ1c2FnZSh3aG8sIHJ1cCk7Cgl1bmxlc3MgKHJlcyA9
PSAwKQoJCXJldHVybiAocmVzKTsKCWlmICh0aW1lcygmdGJ1ZmYpID09IC0xKQoJCWRpZWUo
IkltcG9zc2libGU6IHRpbWVzKCkgZmFpbGVkIik7Cglzd2l0Y2ggKHdobykgewoJY2FzZSBS
VVNBR0VfU0VMRjoKCQl1c2VyID0gdGJ1ZmYudG1zX3V0aW1lOwoJCXN5cyA9IHRidWZmLnRt
c19zdGltZTsKCQlicmVhazsKCWNhc2UgUlVTQUdFX0NISUxEUkVOOgoJCXVzZXIgPSB0YnVm
Zi50bXNfY3V0aW1lOwoJCXN5cyA9IHRidWZmLnRtc19jc3RpbWU7CgkJYnJlYWs7CglkZWZh
dWx0OgoJCWRpZSgiZ2V0cnVzYWdlKCkgYWNjZXB0ZWQgdW5rbm93biB3aG86ICVkIiwgd2hv
KTsKCQlleGl0KDEpOyAgLyogbmVlZGVkIHRvIGtlZXAgZ2NjIGZyb20gd2hpbmluZy4gKi8K
CX0KCXJ1cC0+cnVfdXRpbWUudHZfc2VjID0gdXNlciAvIGh6OwoJcnVwLT5ydV91dGltZS50
dl91c2VjID0gKHVzZXIgJSBoeikgKiAoMTAwMDAwMCAvIGh6KTsKCXJ1cC0+cnVfc3RpbWUu
dHZfc2VjID0gc3lzIC8gaHo7CglydXAtPnJ1X3N0aW1lLnR2X3VzZWMgPSAoc3lzICUgaHop
ICogKDEwMDAwMDAgLyBoeik7CglyZXR1cm4gKDApOwp9CgpzdGF0aWMgaW5saW5lIHZvaWQK
cnVzYWdlWmVybyhzdHJ1Y3QgcnVzYWdlICpydSkKewoJbWVtc2V0KHJ1LCAwLCBzaXplb2Yo
KnJ1KSk7Cn0KCnN0YXRpYyB2b2lkCnJ1c2FnZVBsdXNNYXgoc3RydWN0IHJ1c2FnZSAqcnUx
LAoJICAgICAgc3RydWN0IHJ1c2FnZSAqcnUyLAoJICAgICAgc3RydWN0IHJ1c2FnZSAqcnUp
CnsKCWNvbnN0IGludAltaWxsaW9uID0gMTAwMDAwMDsKCXRpbWVfdAkJc2VjLAoJCQl1c2Vj
OwoKCXNlYyA9IHJ1MS0+cnVfdXRpbWUudHZfc2VjICsgcnUyLT5ydV91dGltZS50dl9zZWM7
Cgl1c2VjID0gcnUxLT5ydV91dGltZS50dl91c2VjICsgcnUyLT5ydV91dGltZS50dl91c2Vj
OwoJc2VjICs9ICh1c2VjIC8gbWlsbGlvbik7Cgl1c2VjICU9IG1pbGxpb247CglydS0+cnVf
dXRpbWUudHZfc2VjID0gc2VjOwoJcnUtPnJ1X3V0aW1lLnR2X3VzZWMgPSB1c2VjOwoKCXNl
YyA9IHJ1MS0+cnVfc3RpbWUudHZfc2VjICsgcnUyLT5ydV9zdGltZS50dl9zZWM7Cgl1c2Vj
ID0gcnUxLT5ydV9zdGltZS50dl91c2VjICsgcnUyLT5ydV9zdGltZS50dl91c2VjOwoJc2Vj
ICs9ICh1c2VjIC8gbWlsbGlvbik7Cgl1c2VjICU9IG1pbGxpb247CglydS0+cnVfc3RpbWUu
dHZfc2VjID0gc2VjOwoJcnUtPnJ1X3N0aW1lLnR2X3VzZWMgPSB1c2VjOwoKCXJ1LT5ydV9t
YXhyc3MgPSBtYXgocnUxLT5ydV9tYXhyc3MsIHJ1Mi0+cnVfbWF4cnNzKTsKCXJ1LT5ydV9p
eHJzcyA9IG1heChydTEtPnJ1X2l4cnNzLCBydTItPnJ1X2l4cnNzKTsKCXJ1LT5ydV9pZHJz
cyA9IG1heChydTEtPnJ1X2lkcnNzLCBydTItPnJ1X2lkcnNzKTsKCXJ1LT5ydV9pc3JzcyA9
IG1heChydTEtPnJ1X2lzcnNzLCBydTItPnJ1X2lzcnNzKTsKCXJ1LT5ydV9taW5mbHQgPSBy
dTEtPnJ1X21pbmZsdCArIHJ1Mi0+cnVfbWluZmx0OwoJcnUtPnJ1X21hamZsdCA9IHJ1MS0+
cnVfbWFqZmx0ICsgcnUyLT5ydV9tYWpmbHQ7CglydS0+cnVfbnN3YXAgPSBydTEtPnJ1X25z
d2FwICsgcnUyLT5ydV9uc3dhcDsKCXJ1LT5ydV9pbmJsb2NrID0gcnUxLT5ydV9pbmJsb2Nr
ICsgcnUyLT5ydV9pbmJsb2NrOwoJcnUtPnJ1X291YmxvY2sgPSBydTEtPnJ1X291YmxvY2sg
KyBydTItPnJ1X291YmxvY2s7CglydS0+cnVfbXNnc25kID0gcnUxLT5ydV9tc2dzbmQgKyBy
dTItPnJ1X21zZ3NuZDsKCXJ1LT5ydV9tc2dyY3YgPSBydTEtPnJ1X21zZ3JjdiArIHJ1Mi0+
cnVfbXNncmN2OwoJcnUtPnJ1X25zaWduYWxzID0gcnUxLT5ydV9uc2lnbmFscyArIHJ1Mi0+
cnVfbnNpZ25hbHM7CglydS0+cnVfbnZjc3cgPSBydTEtPnJ1X252Y3N3ICsgcnUyLT5ydV9u
dmNzdzsKCXJ1LT5ydV9uaXZjc3cgPSBydTEtPnJ1X25pdmNzdyArIHJ1Mi0+cnVfbml2Y3N3
Owp9CgpzdGF0aWMgdm9pZApydXNhZ2VNaW51c01heCAoc3RydWN0IHJ1c2FnZSAqcnUxLAoJ
CXN0cnVjdCBydXNhZ2UgKnJ1MiwKCQlzdHJ1Y3QgcnVzYWdlICpydSkKewoJY29uc3QgaW50
CW1pbGxpb24gPSAxMDAwMDAwOwoJdGltZV90CQlzZWMsCgkJCXVzZWM7CgoJc2VjID0gKHJ1
MS0+cnVfdXRpbWUudHZfc2VjIC0gcnUyLT5ydV91dGltZS50dl9zZWMpIC0gMTsKCXVzZWMg
PSBydTEtPnJ1X3V0aW1lLnR2X3VzZWMgKyBtaWxsaW9uIC0gcnUyLT5ydV91dGltZS50dl91
c2VjOwoJc2VjICs9ICh1c2VjIC8gbWlsbGlvbik7Cgl1c2VjICU9IG1pbGxpb247CglydS0+
cnVfdXRpbWUudHZfc2VjID0gc2VjOwoJcnUtPnJ1X3V0aW1lLnR2X3VzZWMgPSB1c2VjOwoK
CXNlYyA9IChydTEtPnJ1X3N0aW1lLnR2X3NlYyAtIHJ1Mi0+cnVfc3RpbWUudHZfc2VjKSAt
IDE7Cgl1c2VjID0gcnUxLT5ydV9zdGltZS50dl91c2VjICsgbWlsbGlvbiAtIHJ1Mi0+cnVf
c3RpbWUudHZfdXNlYzsKCXNlYyArPSAodXNlYyAvIG1pbGxpb24pOwoJdXNlYyAlPSBtaWxs
aW9uOwoJcnUtPnJ1X3N0aW1lLnR2X3NlYyA9IHNlYzsKCXJ1LT5ydV9zdGltZS50dl91c2Vj
ID0gdXNlYzsKCglydS0+cnVfbWF4cnNzID0gbWF4KHJ1MS0+cnVfbWF4cnNzLCBydTItPnJ1
X21heHJzcyk7CglydS0+cnVfaXhyc3MgPSBtYXgocnUxLT5ydV9peHJzcywgcnUyLT5ydV9p
eHJzcyk7CglydS0+cnVfaWRyc3MgPSBtYXgocnUxLT5ydV9pZHJzcywgcnUyLT5ydV9pZHJz
cyk7CglydS0+cnVfaXNyc3MgPSBtYXgocnUxLT5ydV9pc3JzcywgcnUyLT5ydV9pc3Jzcyk7
CglydS0+cnVfbWluZmx0ID0gcnUxLT5ydV9taW5mbHQgLSBydTItPnJ1X21pbmZsdDsKCXJ1
LT5ydV9tYWpmbHQgPSBydTEtPnJ1X21hamZsdCAtIHJ1Mi0+cnVfbWFqZmx0OwoJcnUtPnJ1
X25zd2FwID0gcnUxLT5ydV9uc3dhcCAtIHJ1Mi0+cnVfbnN3YXA7CglydS0+cnVfaW5ibG9j
ayA9IHJ1MS0+cnVfaW5ibG9jayAtIHJ1Mi0+cnVfaW5ibG9jazsKCXJ1LT5ydV9vdWJsb2Nr
ID0gcnUxLT5ydV9vdWJsb2NrIC0gcnUyLT5ydV9vdWJsb2NrOwoJcnUtPnJ1X21zZ3NuZCA9
IHJ1MS0+cnVfbXNnc25kIC0gcnUyLT5ydV9tc2dzbmQ7CglydS0+cnVfbXNncmN2ID0gcnUx
LT5ydV9tc2dyY3YgLSBydTItPnJ1X21zZ3JjdjsKCXJ1LT5ydV9uc2lnbmFscyA9IHJ1MS0+
cnVfbnNpZ25hbHMgLSBydTItPnJ1X25zaWduYWxzOwoJcnUtPnJ1X252Y3N3ID0gcnUxLT5y
dV9udmNzdyAtIHJ1Mi0+cnVfbnZjc3c7CglydS0+cnVfbml2Y3N3ID0gcnUxLT5ydV9uaXZj
c3cgLSBydTItPnJ1X25pdmNzdzsKfQoKc3RhdGljIHVpbnQKcnVzYWdlVGltZShzdHJ1Y3Qg
cnVzYWdlICpydSkKewoJdWludAlyZXN1bHQ7CgoJcmVzdWx0ID0gMDsKCXJlc3VsdCArPSAx
MDAwICogcnUtPnJ1X3V0aW1lLnR2X3NlYzsKCXJlc3VsdCArPSAxMDAwICogcnUtPnJ1X3N0
aW1lLnR2X3NlYzsKCXJlc3VsdCArPSBydS0+cnVfdXRpbWUudHZfdXNlYyAvIDEwMDA7Cgly
ZXN1bHQgKz0gcnUtPnJ1X3N0aW1lLnR2X3VzZWMgLyAxMDAwOwoJcmV0dXJuIHJlc3VsdDsK
fQoKLyogUmV0dXJuIHRpbWUgYXMgbnVtYmVyIG9mIG1pbGxpc2Vjb25kcy4gKi8Kc3RhdGlj
IGlubGluZSB1aW50CmN1cnJlbnRUaW1lKCkKewoJc3RydWN0IHJ1c2FnZQlydTsKCglmaXhl
ZEdldHJ1c2FnZShSVVNBR0VfU0VMRiwgJnJ1KTsKCXJldHVybiAocnVzYWdlVGltZSgmcnUp
KTsKfQoKLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLSAqLwovKiAgICAgICAgICAgICAgICAgICBpbml0U2lnbmFsU3RhY2sgICAgICAgICAg
ICAgICAgICovCi8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0gKi8KCnN0YXRpYyBpbmxpbmUgdm9pZAppbml0U2lnbmFsU3RhY2soR0Nfc3Rh
dGUgcykKewojaWYgKGRlZmluZWQgKF9fbGludXhfXykpCiAgICAgICAgc3RhdGljIHN0YWNr
X3QgYWx0c3RhY2s7CglzaXplX3Qgc3Nfc2l6ZSA9IHJvdW5kUGFnZShzLCBTSUdTVEtTWik7
CglzaXplX3QgcHNpemUgPSBzLT5wYWdlU2l6ZTsKCXZvaWQgKnNzX3NwID0gc3NtbWFwKDIg
KiBzc19zaXplLCBwc2l6ZSwgcHNpemUpOwoJYWx0c3RhY2suc3Nfc3AgPSBzc19zcCArIHNz
X3NpemU7CglhbHRzdGFjay5zc19zaXplID0gc3Nfc2l6ZTsKCWFsdHN0YWNrLnNzX2ZsYWdz
ID0gMDsKCXNpZ2FsdHN0YWNrKCZhbHRzdGFjaywgTlVMTCk7CiNlbmRpZgp9CgovKiAtLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCi8qICAg
ICAgICAgICAgICAgICAgSW5pdGlhbGl6YXRpb24gICAgICAgICAgICAgICAgICAgKi8KLyog
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwoK
Lyogc2V0IGZyb21TaXplLgogKiBzaXplIG11c3Qgbm90IGJlIGFuIGFwcHJveGltYXRpb24s
IGJlY2F1c2Ugc2V0SGVhcFBhcmFtcyB3aWxsIGRpZSBpZiBpdAogKiBjYW4ndCBzZXQgZnJv
bVNpemUgYmlnIGVub3VnaC4KICovCmlubGluZSB2b2lkCkdDX3NldEhlYXBQYXJhbXMoR0Nf
c3RhdGUgcywgdWludCBzaXplKQp7CglpZiAocy0+dXNlRml4ZWRIZWFwKSB7CgkJaWYgKDAg
PT0gcy0+ZnJvbVNpemUpCgkJCXMtPmZyb21TaXplID0gcm91bmRQYWdlKHMsIHMtPnJhbVNs
b3AgKiBzLT50b3RhbFJhbSk7CgkgICAgICAgIHMtPmZyb21TaXplID0gcm91bmRQYWdlKHMs
IHMtPmZyb21TaXplIC8gMik7Cgl9IGVsc2UgewoJCXMtPmZyb21TaXplID0gY29tcHV0ZVNl
bWlTaXplKHMsIHNpemUsIDAsIDApOwoJfQoJaWYgKHNpemUgKyBMSU1JVF9TTE9QID4gcy0+
ZnJvbVNpemUpCgkJZGllKCJPdXQgb2YgbWVtb3J5IChzZXRIZWFwUGFyYW1zKS4iKTsKfQoK
c3RhdGljIGludCBwcm9jZXNzb3JfaGFzX3NzZTI9MDsKCnN0YXRpYyB2b2lkIHJlYWRQcm9j
ZXNzb3IoKSB7CiNpZiAwCglpbnQgc3RhdHVzID0gc3lzdGVtKCIvYmluL2NhdCAvcHJvYy9j
cHVpbmZvIHwgL2Jpbi9lZ3JlcCAtcSAnXmZsYWdzLio6LiogbW14IC4qeG1tJyIpOwogIAoJ
aWYgKHN0YXR1cz09MCkKCQlwcm9jZXNzb3JfaGFzX3NzZTI9MTsKCWVsc2UKCQlwcm9jZXNz
b3JfaGFzX3NzZTI9MDsKI2VuZGlmCglwcm9jZXNzb3JfaGFzX3NzZTI9MDsKfQoKLyoKICog
U2V0IFJBTSBhbmQgU1dBUCBzaXplLiAgVmVyeSBMaW51eCBzcGVjaWZpYy4KICogTm90ZSB0
aGUgdG90YWwgYW1vdW50IG9mIFJBTSBpcyBtdWx0aXBsaWVkIGJ5IHJhbVNsb3Agc28gdGhh
dCB3ZSBkb24ndAogKiB1c2UgYWxsIG9mIG1lbW9yeSBvciBzdGFydCBzd2FwcGluZy4gIEl0
IHVzZWQgdG8gYmUgLjk1LCBidXQgTGludXgKICogMi4yIGlzIG1vcmUgYWdncmVzc2l2ZSBh
Ym91dCBzd2FwcGluZy4KICoKICogRW5zdXJlIHRoYXQgcy0+dG90YWxSYW0gKyBzLT50b3Rh
bFN3YXAgPCA0Ry4KICovCgojaWYgKGRlZmluZWQgKF9fbGludXhfXykpCiNpbmNsdWRlIDxz
eXMvc3lzaW5mby5oPgpzdGF0aWMgaW5saW5lIHZvaWQKc2V0TWVtSW5mbyhHQ19zdGF0ZSBz
KQp7CglzdHJ1Y3Qgc3lzaW5mbwlzYnVmOwoJVzMyIG1heE1lbTsKCVc2NCB0bXA7Cgl1aW50
IG1lbVVuaXQ7CgoJbWF4TWVtID0gMHgxMDAwMDAwMDBsbHUgLSBzLT5wYWdlU2l6ZTsKCXVu
bGVzcyAoMCA9PSBzeXNpbmZvKCZzYnVmKSkKCQlkaWVlKCJzeXNpbmZvIGZhaWxlZCIpOwoJ
bWVtVW5pdCA9IHNidWYubWVtX3VuaXQ7CgkvKiBPbiAyLjIga2VybmVscywgbWVtX3VuaXQg
aXMgbm90IGRlZmluZWQsIGJ1dCB3aWxsIGJlIHplcm8sIHNvIGdvCgkgKiBhaGVhZCBhbmQg
cHJldGVuZCBpdCBpcyBvbmUuCgkgKi8KCWlmICgwID09IG1lbVVuaXQpCgkJbWVtVW5pdCA9
IDE7Cgl0bXAgPSBtZW1Vbml0ICogKFc2NClzYnVmLnRvdGFscmFtOwoJcy0+dG90YWxSYW0g
PSAodG1wID4gKFc2NCltYXhNZW0pID8gbWF4TWVtIDogKFczMil0bXA7CgltYXhNZW0gPSBt
YXhNZW0gLSBzLT50b3RhbFJhbTsKCXRtcCA9IG1lbVVuaXQgKiAoVzY0KXNidWYudG90YWxz
d2FwOwoJcy0+dG90YWxTd2FwID0gKHRtcCA+IChXNjQpbWF4TWVtKSA/IG1heE1lbSA6IChX
MzIpdG1wOwp9CiNlbGlmIChkZWZpbmVkIChfX0NZR1dJTl9fKSkKI2luY2x1ZGUgPHdpbmRv
d3MuaD4Kc3RhdGljIGlubGluZSB2b2lkCnNldE1lbUluZm8oR0Nfc3RhdGUgcykKewoJTUVN
T1JZU1RBVFVTIG1zOyAKCglHbG9iYWxNZW1vcnlTdGF0dXMoJm1zKTsgCglzLT50b3RhbFJh
bSA9IG1zLmR3VG90YWxQaHlzOwoJcy0+dG90YWxTd2FwID0gbXMuZHdUb3RhbFBhZ2VGaWxl
OwoJcy0+bWF4U2VtaSA9IHJvdW5kUGFnZShzLCBzLT5yYW1TbG9wICogKGRvdWJsZSlzLT50
b3RhbFJhbSAvIDIpOwp9CiNlbmRpZgoKc3RhdGljIHZvaWQgbmV3V29ybGQoR0Nfc3RhdGUg
cykKewoJaW50IGk7CgoJYXNzZXJ0KGlzV29yZEFsaWduZWQoc2l6ZW9mKHN0cnVjdCBHQ190
aHJlYWQpKSk7Cglmb3IgKGkgPSAwOyBpIDwgcy0+bnVtR2xvYmFsczsgKytpKQoJCXMtPmds
b2JhbHNbaV0gPSAocG9pbnRlcilCT0dVU19QT0lOVEVSOwoJR0Nfc2V0SGVhcFBhcmFtcyhz
LCBzLT5ieXRlc0xpdmUgKyBpbml0aWFsVGhyZWFkQnl0ZXMocykpOwoJYXNzZXJ0KHMtPmJ5
dGVzTGl2ZSArIGluaXRpYWxUaHJlYWRCeXRlcyhzKSArIExJTUlUX1NMT1AgPD0gcy0+ZnJv
bVNpemUpOwoJR0NfZnJvbVNwYWNlKHMpOwoJcy0+ZnJvbnRpZXIgPSBzLT5iYXNlOwoJcy0+
dG9TaXplID0gcy0+ZnJvbVNpemU7CglHQ190b1NwYWNlKHMpOyAvKiBGSVhNRTogV2h5IGRv
ZXMgdG9TcGFjZSBuZWVkIHRvIGJlIGFsbG9jYXRlZD8gKi8KCXN3aXRjaFRvVGhyZWFkKHMs
IG5ld1RocmVhZE9mU2l6ZShzLCBpbml0aWFsU3RhY2tTaXplKHMpKSk7Cglhc3NlcnQoaW5p
dGlhbFRocmVhZEJ5dGVzKHMpID09IHMtPmZyb250aWVyIC0gcy0+YmFzZSk7Cglhc3NlcnQo
cy0+ZnJvbnRpZXIgKyBzLT5ieXRlc0xpdmUgPD0gcy0+bGltaXQpOwoJYXNzZXJ0KEdDX211
dGF0b3JJbnZhcmlhbnQocykpOwp9CgpzdGF0aWMgdm9pZCB1c2FnZShzdHJpbmcgcykgewoJ
ZGllKCJVc2FnZTogJXMgW0BNTHRvbiBbZml4ZWQtaGVhcCBuW3trfG19XV0gW2djLW1lc3Nh
Z2VzXSBbZ2Mtc3VtbWFyeV0gW2xvYWQtd29ybGQgZmlsZV0gW21heC1oZWFwIG5be2t8bX1d
XSBbcmFtLXNsb3AgeF0gLS1dIGFyZ3MiLCAKCQlzKTsKfQoKc3RhdGljIGZsb2F0IHN0cmlu
Z1RvRmxvYXQoc3RyaW5nIHMpIHsKCWZsb2F0IGY7CgoJc3NjYW5mKHMsICIlZiIsICZmKTsK
CXJldHVybiBmOwp9CgpzdGF0aWMgdWludCBzdHJpbmdUb0J5dGVzKHN0cmluZyBzKSB7Cglj
aGFyIGM7Cgl1aW50IHJlc3VsdDsKCWludCBpLCBtOwoJCglyZXN1bHQgPSAwOwoJaSA9IDA7
CgoJd2hpbGUgKChjID0gc1tpKytdKSAhPSAnXDAwMCcpIHsKCQlzd2l0Y2ggKGMpIHsKCQlj
YXNlICdtJzoKCQkJaWYgKHNbaV0gPT0gJ1wwMDAnKSAKCQkJCXJlc3VsdCA9IHJlc3VsdCAq
IDEwNDg1NzY7CgkJCWVsc2UgcmV0dXJuIDA7CgkJCWJyZWFrOwoJCWNhc2UgJ2snOgoJCQlp
ZiAoc1tpXSA9PSAnXDAwMCcpIAoJCQkJcmVzdWx0ID0gcmVzdWx0ICogMTAyNDsKCQkJZWxz
ZSByZXR1cm4gMDsKCQkJYnJlYWs7CgkJZGVmYXVsdDoKCQkJbSA9IChpbnQpKGMgLSAnMCcp
OwoJCQlpZiAoMCA8PSBtIGFuZCBtIDw9IDkpCgkJCQlyZXN1bHQgPSByZXN1bHQgKiAxMCAr
IG07CgkJCWVsc2UgcmV0dXJuIDA7CgkJfQoJfQoJCglyZXR1cm4gcmVzdWx0Owp9CgppbnQK
R0NfaW5pdChHQ19zdGF0ZSBzLCBpbnQgYXJnYywgY2hhciAqKmFyZ3YsCgkJCXZvaWQgKCps
b2FkR2xvYmFscykoRklMRSAqZmlsZSkpIHsKCWNoYXIgKndvcmxkRmlsZTsKCWludCBpOwoK
CXMtPnBhZ2VTaXplID0gZ2V0cGFnZXNpemUoKTsKCWluaXRTaWduYWxTdGFjayhzKTsKCXMt
PmJ5dGVzQWxsb2NhdGVkID0gMDsKCXMtPmJ5dGVzQ29waWVkID0gMDsKCXMtPmNhbkhhbmRs
ZSA9IDA7CglzLT5jdXJyZW50VGhyZWFkID0gQk9HVVNfVEhSRUFEOwoJcnVzYWdlWmVybygm
cy0+cnVfZ2MpOwoJcy0+aW5TaWduYWxIYW5kbGVyID0gRkFMU0U7CglzLT5pc09yaWdpbmFs
ID0gVFJVRTsKCXMtPm1heEJ5dGVzTGl2ZSA9IDA7CglzLT5tYXhIZWFwU2l6ZSA9IDA7Cglz
LT5tYXhIZWFwU2l6ZVNlZW4gPSAwOwoJcy0+bWF4TGl2ZSA9IDM7CglzLT5tYXhQYXVzZSA9
IDA7CglzLT5tYXhTdGFja1NpemVTZWVuID0gMDsKCXMtPm1lc3NhZ2VzID0gRkFMU0U7Cglz
LT5taW5MaXZlID0gMjA7CglzLT5udW1HQ3MgPSAwOwoJcy0+bnVtTENzID0gMDsKCXMtPnJh
bVNsb3AgPSAwLjg1OwoJcy0+c2F2ZWRUaHJlYWQgPSBCT0dVU19USFJFQUQ7CglzLT5zaWdu
YWxIYW5kbGVyID0gQk9HVVNfVEhSRUFEOwoJc2lnZW1wdHlzZXQoJnMtPnNpZ25hbHNIYW5k
bGVkKTsKCXMtPnNpZ25hbElzUGVuZGluZyA9IEZBTFNFOwoJc2lnZW1wdHlzZXQoJnMtPnNp
Z25hbHNQZW5kaW5nKTsKCXMtPnN0YXJ0VGltZSA9IGN1cnJlbnRUaW1lKCk7CglzLT5zdW1t
YXJ5ID0gRkFMU0U7CgkvKiBUaGUgbmV4dCBiaXQgaXMgZm9yIGhlYXAgcmVzaXppbmcuICov
CgkvKiBTZXQgbGl2ZVJhdGlvIChjbG9zZSkgdG8gdGhlIGdlb21ldHJpYyBtZWFuIG9mIG1p
bkxpdmUgYW5kIG1heExpdmUuICovCgl7IAoJCXVpbnQgaTsKCQlmb3IgKGkgPSBzLT5tYXhM
aXZlOyBpICogaSA8PSBzLT5taW5MaXZlICogcy0+bWF4TGl2ZTsgKytpKQoJCQkvKiBOb3Ro
aW5nICovIDsKCQlzLT5saXZlUmF0aW8gPSBpOwoJfQogCXJlYWRQcm9jZXNzb3IoKTsKCXdv
cmxkRmlsZSA9IE5VTEw7CglpID0gMTsKCWlmIChhcmdjID4gMSBhbmQgKDAgPT0gc3RyY21w
KGFyZ3ZbMV0sICJATUx0b24iKSkpIHsKCQlib29sIGRvbmU7CgoJCS8qIHByb2Nlc3MgQE1M
dG9uIGFyZ3MgKi8KCQlpID0gMjsKCQlkb25lID0gRkFMU0U7CgkJd2hpbGUgKCFkb25lKSB7
CgkJCWlmIChpID09IGFyZ2MpCgkJCQl1c2FnZShhcmd2WzBdKTsKCQkJZWxzZSB7CgkJCQlz
dHJpbmcgYXJnOwoKCQkJCWFyZyA9IGFyZ3ZbaV07CgkJCQlpZiAoMCA9PSBzdHJjbXAoYXJn
LCAiZml4ZWQtaGVhcCIpKSB7CgkJCQkJKytpOwoJCQkJCWlmIChpID09IGFyZ2MpCgkJCQkJ
CXVzYWdlKGFyZ3ZbMF0pOwoJCQkJCXMtPnVzZUZpeGVkSGVhcCA9IFRSVUU7CgkJCQkJcy0+
ZnJvbVNpemUgPQoJCQkJCQlzdHJpbmdUb0J5dGVzKGFyZ3ZbaSsrXSk7CgkJCQl9IGVsc2Ug
aWYgKDAgPT0gc3RyY21wKGFyZywgImdjLW1lc3NhZ2VzIikpIHsKCQkJCQkrK2k7CgkJCQkJ
cy0+bWVzc2FnZXMgPSBUUlVFOwoJCQkJfSBlbHNlIGlmICgwID09IHN0cmNtcChhcmcsICJn
Yy1zdW1tYXJ5IikpIHsKCQkJCQkrK2k7CgkJCQkJcy0+c3VtbWFyeSA9IFRSVUU7CgkJCQl9
IGVsc2UgaWYgKDAgPT0gc3RyY21wKGFyZywgImxvYWQtd29ybGQiKSkgewoJCQkJCSsraTsK
CQkJCQlzLT5pc09yaWdpbmFsID0gRkFMU0U7CgkJCQkJaWYgKGkgPT0gYXJnYykgCgkJCQkJ
CXVzYWdlKGFyZ3ZbMF0pOwoJCQkJCXdvcmxkRmlsZSA9IGFyZ3ZbaSsrXTsKCQkJCX0gZWxz
ZSBpZiAoMCA9PSBzdHJjbXAoYXJnLCAibWF4LWhlYXAiKSkgewoJCQkJCWZwcmludGYoc3Rk
ZXJyLCAibWF4LWhlYXAgaXMgY3VycmVudGx5IGRpc2FibGVkXG4iKTsKCQkJCQkrK2k7CgkJ
CQkJaWYgKGkgPT0gYXJnYykgCgkJCQkJCXVzYWdlKGFyZ3ZbMF0pOwoJCQkJCXMtPnVzZUZp
eGVkSGVhcCA9IEZBTFNFOwoJCQkJCXMtPm1heEhlYXBTaXplID0KCQkJCQkJc3RyaW5nVG9C
eXRlcyhhcmd2W2krK10pOwoJCQkJfSBlbHNlIGlmICgwID09IHN0cmNtcChhcmcsICJyYW0t
c2xvcCIpKSB7CgkJCQkJKytpOwoJCQkJCWlmIChpID09IGFyZ2MpCgkJCQkJCXVzYWdlKGFy
Z3ZbMF0pOwoJCQkJCXMtPnJhbVNsb3AgPQoJCQkJCQlzdHJpbmdUb0Zsb2F0KGFyZ3ZbaSsr
XSk7CgkJCQl9IGVsc2UgaWYgKDAgPT0gc3RyY21wKGFyZywgIi0tIikpIHsKCQkJCQkrK2k7
CgkJCQkJZG9uZSA9IFRSVUU7CgkJCQl9IGVsc2UgaWYgKGkgPiAxKQoJCQkJCXVzYWdlKGFy
Z3ZbMF0pOwoJCQkgICAgICAgIGVsc2UgZG9uZSA9IFRSVUU7CgkJCX0KCQl9Cgl9CglzZXRN
ZW1JbmZvKHMpOwoJcy0+bWF4U2VtaSA9IHJvdW5kUGFnZShzLCBzLT5yYW1TbG9wICogKGRv
dWJsZSlzLT50b3RhbFJhbSAvIDIpOwoJaWYgKERFQlVHKQoJCWZwcmludGYoc3RkZXJyLCAi
dG90YWxSYW0gPSAldSAgdG90YWxTd2FwID0gJXUgIG1heFNlbWkgPSAldVxuIiwKCQkJcy0+
dG90YWxSYW0sIHMtPnRvdGFsU3dhcCwgcy0+bWF4U2VtaSk7CglpZiAocy0+aXNPcmlnaW5h
bCkKCQluZXdXb3JsZChzKTsKCWVsc2UKCQlHQ19sb2FkV29ybGQocywgd29ybGRGaWxlLCBs
b2FkR2xvYmFscyk7CglyZXR1cm4gaTsKfQoKI2lmIE1FVEVSCmludCBzaXplc1syNTYwMF07
CiNlbmRpZgoKLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLSAqLwovKiAgICAgICAgICAgICAgICAgICAgICBmb3J3YXJkICAgICAgICAgICAg
ICAgICAgICAgICovCi8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0gKi8KLyoKICogRm9yd2FyZCB0aGUgb2JqZWN0IHBvaW50ZWQgdG8gYnkg
KnBwLgogKiBVcGRhdGUgKnBwIHRvIHBvaW50IHRvIHRoZSBuZXcgb2JqZWN0LiAKICovCnN0
YXRpYyBpbmxpbmUgdm9pZApmb3J3YXJkKEdDX3N0YXRlIHMsIHBvaW50ZXIgKnBwKQp7Cglw
b2ludGVyIHA7Cgl3b3JkIGhlYWRlcjsKCXdvcmQgdGFnOwoKCWlmIChERUJVR19ERVRBSUxF
RCkKCQlmcHJpbnRmKHN0ZGVyciwgImZvcndhcmQgIHBwID0gMHgleCAgKnBwID0gMHgleFxu
IiwgKHVpbnQpcHAsICh1aW50KSpwcCk7Cglhc3NlcnQoaXNJbkZyb21TcGFjZShzLCAqcHAp
KTsKCXAgPSAqcHA7CgloZWFkZXIgPSBHQ19nZXRIZWFkZXIocCk7CglpZiAoaGVhZGVyICE9
IEZPUldBUkRFRCkgeyAvKiBmb3J3YXJkIHRoZSBvYmplY3QgKi8KCQl1aW50IGhlYWRlckJ5
dGVzLCBvYmplY3RCeXRlcywgc2l6ZSwgc2tpcDsKCQl1aW50IG51bVBvaW50ZXJzLCBudW1O
b25Qb2ludGVyczsKCgkJLyogQ29tcHV0ZSB0aGUgc3BhY2UgdGFrZW4gYnkgdGhlIGhlYWRl
ciBhbmQgb2JqZWN0IGJvZHkuICovCgkJU1BMSVRfSEVBREVSKCk7CgkJaWYgKE5PUk1BTF9U
QUcgPT0gdGFnKSB7IC8qIEZpeGVkIHNpemUgb2JqZWN0LiAqLwoJCQloZWFkZXJCeXRlcyA9
IEdDX09CSkVDVF9IRUFERVJfU0laRTsKCQkJb2JqZWN0Qnl0ZXMgPSB0b0J5dGVzKG51bVBv
aW50ZXJzICsgbnVtTm9uUG9pbnRlcnMpOwoJCQlza2lwID0gMDsKCQl9IGVsc2UgaWYgKFNU
QUNLX1RBRyA9PSB0YWcpIHsgLyogU3RhY2suICovCgkJCUdDX3N0YWNrIHN0YWNrOwoKCQkJ
aGVhZGVyQnl0ZXMgPSBTVEFDS19IRUFERVJfU0laRTsKCQkJLyogUmVzaXplIHN0YWNrcyBu
b3QgYmVpbmcgdXNlZCBhcyBjb250aW51YXRpb25zLiAqLwoJCQlzdGFjayA9IChHQ19zdGFj
aylwOwoJCQlpZiAoc3RhY2stPnVzZWQgIT0gc3RhY2stPnJlc2VydmVkKSB7CgkJCQlpZiAo
NCAqIHN0YWNrLT51c2VkIDw9IHN0YWNrLT5yZXNlcnZlZCkKCQkJCQlzdGFjay0+cmVzZXJ2
ZWQgPSBzdGFjay0+cmVzZXJ2ZWQgLyAyOwoJCQkJZWxzZSBpZiAoNCAqIHN0YWNrLT51c2Vk
ID4gMyAqIHN0YWNrLT5yZXNlcnZlZCkKCQkJCQlzdGFjay0+cmVzZXJ2ZWQgPSBzdGFjay0+
cmVzZXJ2ZWQgKiAyOwoJCQkJc3RhY2stPnJlc2VydmVkID0gCgkJCQkJd29yZEFsaWduKG1h
eChzdGFjay0+cmVzZXJ2ZWQsIAoJCQkJCQkJc3RhY2tOZWVkc1Jlc2VydmVkKHMsIHN0YWNr
KSkpOwoJCQkJaWYgKHN0YWNrLT5yZXNlcnZlZCA+IHMtPm1heFN0YWNrU2l6ZVNlZW4pCgkJ
CQkJcy0+bWF4U3RhY2tTaXplU2VlbiA9IHN0YWNrLT5yZXNlcnZlZDsKCQkJCWFzc2VydChz
dGFja1RvcElzT2socywgc3RhY2spKTsKCQkJfQoJCQlvYmplY3RCeXRlcyA9IHNpemVvZiAo
c3RydWN0IEdDX3N0YWNrKSArIHN0YWNrLT51c2VkOwoJCQlza2lwID0gc3RhY2stPnJlc2Vy
dmVkIC0gc3RhY2stPnVzZWQ7CgkJfSBlbHNlIHsgLyogQXJyYXkuICovCgkJCWFzc2VydChB
UlJBWV9UQUcgPT0gdGFnKTsKCQkJaGVhZGVyQnl0ZXMgPSBHQ19BUlJBWV9IRUFERVJfU0la
RTsKCQkJb2JqZWN0Qnl0ZXMgPSBhcnJheU51bUJ5dGVzKHAsIG51bVBvaW50ZXJzLAoJCQkJ
CQkJCW51bU5vblBvaW50ZXJzKTsKCQkJc2tpcCA9IDA7CgkJCS8qIEVtcHR5IGFycmF5cyBo
YXZlIFBPSU5URVJfU0laRSBieXRlcyBmb3IgdGhlIAoJCQkgKiBmb3J3YXJkaW5nIHBvaW50
ZXIuCgkJCSAqLwoJCQlpZiAoMCA9PSBvYmplY3RCeXRlcykgb2JqZWN0Qnl0ZXMgPSBQT0lO
VEVSX1NJWkU7CgkJfSAKCQlzaXplID0gaGVhZGVyQnl0ZXMgKyBvYmplY3RCeXRlczsKCQkv
KiBUaGlzIGNoZWNrIGlzIG5lY2Vzc2FyeSwgYmVjYXVzZSB0b1NwYWNlIG1heSBiZSBzbWFs
bGVyCgkJICogdGhhbiBmcm9tU3BhY2UsIGFuZCBzbyB0aGUgY29weSBtYXkgZmFpbC4KCQkg
Ki8KICAJCWlmIChzLT5iYWNrICsgc2l6ZSArIHNraXAgPiBzLT50b0xpbWl0KQoJCQlkaWUo
Ik91dCBvZiBtZW1vcnkgKGZvcndhcmQpLlxuc2l6ZT0ldSBza2lwPSV1IHJlbWFpbmluZz0l
dSBzLT5mcm9tU2l6ZT0ldSBzLT50b1NpemU9JXUgaGVhZGVyQnl0ZXM9JWQgb2JqZWN0Qnl0
ZXM9JXUgaGVhZGVyPSV4XG5EaWFnbm9zdGljOiBwcm9iYWJseSBhIFJBTSBwcm9ibGVtLiIs
CgkJCQlzaXplLCBza2lwLCBzLT50b0xpbWl0IC0gcy0+YmFjaywgcy0+ZnJvbVNpemUsIHMt
PnRvU2l6ZSwgaGVhZGVyQnl0ZXMsIG9iamVjdEJ5dGVzLCBoZWFkZXIpOwogIAkJLyogQ29w
eSB0aGUgb2JqZWN0LiAqLwogCQlpZiAoRkFMU0UgYW5kIHByb2Nlc3Nvcl9oYXNfc3NlMiBh
bmQgc2l6ZSA+PSA4MTkyKSB7CgkJCWV4dGVybiB2b2lkIGJjb3B5X3NpbWQodm9pZCAqLCB2
b2lkIGNvbnN0ICosIGludCk7CgkJCWJjb3B5X3NpbWQocCAtIGhlYWRlckJ5dGVzLCBzLT5i
YWNrLCBzaXplKTsKIAkJfSBlbHNlIHsKCQkJdWludAkqdG8sCgkJCQkqZnJvbSwKCQkJCSps
aW1pdDsKCgkJCXRvID0gKHVpbnQgKilzLT5iYWNrOwoJCQlmcm9tID0gKHVpbnQgKikocCAt
IGhlYWRlckJ5dGVzKTsKCQkJYXNzZXJ0IChpc1dvcmRBbGlnbmVkKCh1aW50KXRvKSk7CgkJ
CWFzc2VydCAoaXNXb3JkQWxpZ25lZCgodWludClmcm9tKSk7CgkJCWFzc2VydCAoaXNXb3Jk
QWxpZ25lZChzaXplKSk7CgkJCWxpbWl0ID0gKHVpbnQgKikoKGNoYXIgKilmcm9tICsgc2l6
ZSk7CgkJCXVudGlsIChmcm9tID09IGxpbWl0KQoJCQkJKnRvKysgPSAqZnJvbSsrOwoJCX0K
I2lmIE1FVEVSCgkJaWYgKHNpemUgPCBzaXplb2Yoc2l6ZXMpL3NpemVvZihzaXplc1swXSkp
IHNpemVzW3NpemVdKys7CiNlbmRpZgogCQkvKiBTdG9yZSB0aGUgZm9yd2FyZGluZyBwb2lu
dGVyIGluIHRoZSBvbGQgb2JqZWN0LiAqLwoJCSood29yZCopKHAgLSBXT1JEX1NJWkUpID0g
Rk9SV0FSREVEOwoJCSoocG9pbnRlciopcCA9IHMtPmJhY2sgKyBoZWFkZXJCeXRlczsKCQkv
KiBVcGRhdGUgdGhlIGJhY2sgb2YgdGhlIHF1ZXVlLiAqLwoJCXMtPmJhY2sgKz0gc2l6ZSAr
IHNraXA7CgkJYXNzZXJ0KGlzV29yZEFsaWduZWQoKHVpbnQpcy0+YmFjaykpOwoJfQoJKnBw
ID0gKihwb2ludGVyKilwOwoJYXNzZXJ0KGlzSW5Ub1NwYWNlKHMsICpwcCkpOwp9CgpzdGF0
aWMgaW5saW5lIHZvaWQgZm9yd2FyZEVhY2hQb2ludGVySW5SYW5nZShHQ19zdGF0ZSBzLCBw
b2ludGVyIGZyb250LAoJCQkJCQlwb2ludGVyICpiYWNrKSB7Cglwb2ludGVyIGI7CgoJYiA9
ICpiYWNrOwoJYXNzZXJ0KGZyb250IDw9IGIpOwoJd2hpbGUgKGZyb250IDwgYikgewoJCXdo
aWxlIChmcm9udCA8IGIpIHsKCQkJYXNzZXJ0KGlzV29yZEFsaWduZWQoKHVpbnQpZnJvbnQp
KTsKCQkJZnJvbnQgPSBHQ19mb3JlYWNoUG9pbnRlckluT2JqZWN0KHMsIGZvcndhcmQsIHRv
RGF0YShmcm9udCkpOwoJCX0KCQliID0gKmJhY2s7Cgl9Cglhc3NlcnQoZnJvbnQgPT0gKmJh
Y2spOwp9CgovKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tICovCi8qICAgICAgICAgICAgICAgICAgICAgICBkb0dDICAgICAgICAgICAgICAg
ICAgICAgICAgKi8KLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLSAqLwoKdm9pZCBHQ19kb0dDKEdDX3N0YXRlIHMsIHVpbnQgYnl0ZXNSZXF1
ZXN0ZWQsIHVpbnQgc3RhY2tCeXRlc1JlcXVlc3RlZCkgewoJdWludCBnY1RpbWU7Cgl1aW50
IHNpemU7CglXNjQgbGl2ZTsKCXVpbnQgbmVlZGVkOwoJaW50IHRyeTsKCXBvaW50ZXIgZnJv
bnQ7CglzdHJ1Y3QgcnVzYWdlIHJ1X3N0YXJ0LCBydV9maW5pc2gsIHJ1X3RvdGFsOwoKCWFz
c2VydChpbnZhcmlhbnQocykpOwoJaWYgKERFQlVHIG9yIHMtPm1lc3NhZ2VzKQoJCWZwcmlu
dGYoc3RkZXJyLCAiU3RhcnRpbmcgZ2MuICBieXRlc1JlcXVlc3RlZCA9ICV1XG4iLAoJCQkJ
Ynl0ZXNSZXF1ZXN0ZWQpOwoJZml4ZWRHZXRydXNhZ2UoUlVTQUdFX1NFTEYsICZydV9zdGFy
dCk7CglsaXZlID0gKFc2NClzLT5ieXRlc0xpdmUgKyAoVzY0KWJ5dGVzUmVxdWVzdGVkIAoJ
CSsgKFc2NClzdGFja0J5dGVzUmVxdWVzdGVkOwoJdW5sZXNzIChzLT51c2VGaXhlZEhlYXAp
IHsgLyogR2V0IHRvU3BhY2UgcmVhZHkuICovCgkJdHJ5ID0gMDsKCXJldHJ5OgoJCW5lZWRl
ZCA9IGNvbXB1dGVTZW1pU2l6ZSAocywgbGl2ZSwgcy0+ZnJvbVNpemUsIHRyeSk7CgkJLyog
V2Ugd291bGQgbGlrZSB0b1NwYWNlIHRvIGJlIGFzIGJpZyBhcyBmcm9tU3BhY2UuIEFsdGhv
dWdoLAoJCSAqIGlmIHdlIGFyZSBiYWNraW5nIG9mZiAodHJ5ID4gMSkgdGhlbiB3ZSB3aWxs
IG5vdCBpbnNpc3Qgb24KICAgICAgICAgICAgICAgICAqIHRoaXMuCiAgICAgICAgICAgICAg
ICAgKi8KCQlpZiAobmVlZGVkIDwgcy0+ZnJvbVNpemUgYW5kIHRyeSA8PSAxKQoJCQluZWVk
ZWQgPSBzLT5mcm9tU2l6ZTsKCQkvKiBNYXNzYWdlIHRvU3BhY2Ugc28gdGhhdCBpdCBpcyBv
ZiBuZWVkZWQgc2l6ZS4gKi8KCQlpZiAocy0+dG9CYXNlICE9IE5VTEwpIHsKCQkJaWYgKHMt
PnRvU2l6ZSA8IG5lZWRlZCkgewoJCQkJaWYgKERFQlVHIG9yIHMtPm1lc3NhZ2VzKQoJCQkJ
CWZwcmludGYoc3RkZXJyLCAiVW5tYXBwaW5nIHRvU3BhY2VcbiIpOwoJCQkJc211bm1hcChz
LT50b0Jhc2UsIHMtPnRvU2l6ZSk7CgkJCQlzLT50b0Jhc2UgPSBOVUxMOwoJCQkgfSBlbHNl
IGlmIChzLT50b1NpemUgPiBuZWVkZWQpIHsKCQkJCXVpbnQgZGVsZXRlOwoKCQkJCWRlbGV0
ZSA9IHMtPnRvU2l6ZSAtIG5lZWRlZDsKCQkJCWlmIChERUJVRyBvciBzLT5tZXNzYWdlcykK
CQkJCQlmcHJpbnRmKHN0ZGVyciwgIlNocmlua2luZyB0b1NwYWNlIGJ5ICV1XG4iLAoJCQkJ
CQkgZGVsZXRlKTsKCQkJCXNtdW5tYXAocy0+dG9CYXNlICsgbmVlZGVkLCBkZWxldGUpOwoJ
CQkgfQoJCX0KCQlzLT50b1NpemUgPSBuZWVkZWQ7CgkJaWYgKCh2b2lkKilOVUxMID09IHMt
PnRvQmFzZSkgewoJCQl0b1NwYWNlKHMpOwoJCQlpZiAoKHZvaWQqKS0xID09IHMtPnRvQmFz
ZSkgewoJCQkJcy0+dG9CYXNlID0gKHZvaWQqKU5VTEw7CgkJCQl0cnkrKzsKCQkJCWlmICgx
MyA9PSB0cnkpIHsKCQkJCQlzdGF0aWMgY2hhciBidWZmZXJbMjU2XTsKCiNpZiAoZGVmaW5l
ZCAoX19saW51eF9fKSkKCQkJCQlzcHJpbnRmKGJ1ZmZlciwgCgkJCQkJCSIvYmluL2NhdCAv
cHJvYy8lZC9tYXBzXG4iLCAKCQkJCQkJZ2V0cGlkKCkpOwoJCQkJCSh2b2lkKXN5c3RlbShi
dWZmZXIpOwojZW5kaWYKCQkJCQlkaWUoIk91dCBvZiBzd2FwIHNwYWNlOiBjYW5ub3Qgb2J0
YWluICV1IGJ5dGVzLiIsIHMtPnRvU2l6ZSk7CgkJCQl9CgkJCQlnb3RvIHJldHJ5OwoJCQl9
CgkJfQoJfQoJLyogdG9TcGFjZSBpcyByZWFkeS4gICovCglhc3NlcnQocy0+dG9CYXNlICE9
ICh2b2lkKilOVUxMKTsKIAlpZiAoREVCVUcgb3Igcy0+bWVzc2FnZXMpIHsKCQlmcHJpbnRm
KHN0ZGVyciwgImZyb21TcGFjZSA9ICV4ICB0b1NwYWNlID0gJXhcbiIsCgkJCSh1aW50KXMt
PmJhc2UsICh1aW50KXMtPnRvQmFzZSk7CgkgCWZwcmludGYoc3RkZXJyLCAKCQkJImZyb21T
cGFjZSBzaXplID0gJXMiLCB1aW50VG9Db21tYVN0cmluZyhzLT5mcm9tU2l6ZSkpOwoJCWZw
cmludGYoc3RkZXJyLCAKCQkJIiAgdG9TcGFjZSAlc1xuIiwgdWludFRvQ29tbWFTdHJpbmco
cy0+dG9TaXplKSk7Cgl9CiAJcy0+bnVtR0NzKys7CiAJcy0+Ynl0ZXNBbGxvY2F0ZWQgKz0g
cy0+ZnJvbnRpZXIgLSBzLT5iYXNlIC0gcy0+Ynl0ZXNMaXZlOwoJcy0+YmFjayA9IHMtPnRv
QmFzZTsKCXMtPnRvTGltaXQgPSBzLT50b0Jhc2UgKyBzLT50b1NpemU7CgkvKiBUaGUgYWN0
dWFsIEdDLiAqLwoJZnJvbnQgPSBzLT5iYWNrOwoJR0NfZm9yZWFjaEdsb2JhbChzLCBmb3J3
YXJkKTsKCWZvcndhcmRFYWNoUG9pbnRlckluUmFuZ2UocywgZnJvbnQsICZzLT5iYWNrKTsK
CXNpemUgPSBzLT5mcm9tU2l6ZTsKCS8qIFN3YXAgZnJvbVNwYWNlIGFuZCB0b1NwYWNlLiAq
LwoJewoJCXBvaW50ZXIgdG1wOwoJCXRtcCA9IHMtPmJhc2U7CgkJcy0+YmFzZSA9IHMtPnRv
QmFzZTsKCQlzLT50b0Jhc2UgPSB0bXA7Cgl9Cgl7CgkJdWludCB0bXA7CgkJdG1wID0gcy0+
ZnJvbVNpemU7CgkJcy0+ZnJvbVNpemUgPSBzLT50b1NpemU7CgkJcy0+dG9TaXplID0gdG1w
OwoJfQoJR0Nfc2V0U3RhY2socyk7CglzLT5mcm9udGllciA9IHMtPmJhY2s7CglzLT5ieXRl
c0xpdmUgPSBzLT5mcm9udGllciAtIHMtPmJhc2U7CglpZiAocy0+Ynl0ZXNMaXZlID4gcy0+
bWF4Qnl0ZXNMaXZlKQoJCXMtPm1heEJ5dGVzTGl2ZSA9IHMtPmJ5dGVzTGl2ZTsKCS8qIFJl
c2l6ZSBoZWFwLCBpZiBuZWNlc3NhcnkuICovCgl1bmxlc3MgKHMtPnVzZUZpeGVkSGVhcCkg
ewoJCVc2NCBuZWVkZWQ7CgkJdWludCBrZWVwOwoKCQluZWVkZWQgPSAoVzY0KXMtPmJ5dGVz
TGl2ZSArIGJ5dGVzUmVxdWVzdGVkOwoJCS8qIERldGVybWluZSB0aGUgc2l6ZSBvZiBuZXcg
c3BhY2UgKG5vdyBmcm9tU3BhY2UpLiAqLwoJCWlmIChuZWVkZWQgKiBzLT5taW5MaXZlIDwg
KFc2NClzLT5mcm9tU2l6ZSkgewoJCQkvKiBUaGUgcmF0aW8gb2YgbGl2ZSBkYXRhIHRvIHNl
bWlzcGFjZSBzaXplIGlzIHRvbyBsb3csCgkJCSAqIHNvIHNocmluayBuZXcgc3BhY2UuCgkJ
CSAqLwoJCQlrZWVwID0gcm91bmRQYWdlKHMsIG5lZWRlZCAqIHMtPmxpdmVSYXRpbyk7CgkJ
fSBlbHNlIGlmIChzLT5mcm9tU2l6ZSA+IHMtPm1heFNlbWkpIHsKCQkJaWYgKDIgKiBuZWVk
ZWQgPD0gKFc2NClzLT5tYXhTZW1pKSB7CgkJCQkvKiBUaGUgbGl2ZSBkYXRhIGZpdHMgaW4g
YSBzZW1pc3BhY2UgdGhhdCBpcyBoYWxmCgkJCQkgKiBvZiB0aGUgUkFNIHNpemUsIHdpdGgg
YSBmYWN0b3Igb2YgdHdvIHRvIAoJCQkJICogc3BhcmUsIHNvIHNocmluayBkb3duIHRvIG1h
eFNlbWkuCiAJCQkJICovCgkJCQlrZWVwID0gcy0+bWF4U2VtaTsKCQkJfSBlbHNlIHsKCQkJ
CS8qIE5lZWRlZCBpcyBsYXJnZS4gIEFsbG9jYXRlIGEgZmFjdG9yIG9mIHR3bwoJCQkJICog
cHJvdmlkZWQgdGhhdCB0aGUgc2VtaXNwYWNlIHdpbGwgc3RpbGwgZml0CgkJCQkgKiBpbiBS
QU0uCiAJCQkJICovCgkJCQlkb3VibGUgbXVsdDsKCgkJCQltdWx0ID0gKDIgKiBuZWVkZWQg
PiBzLT5yYW1TbG9wICogcy0+dG90YWxSYW0pCgkJCQkJPyAxLjI1IDogMi4wOwoJCQkJa2Vl
cCA9IG1pbihzLT5mcm9tU2l6ZSwKCQkJCQlyb3VuZFBhZ2UocywgKHNpemVfdCluZWVkZWQg
KiBtdWx0KSk7CgkJCX0KCQl9IGVsc2UKCQkJLyogVGhlIGhlYXAgaXMgYWJvdXQgcmlnaHQg
LS0gbGVhdmUgbmV3IHNwYWNlIGFsb25lLiAqLwoJCQlrZWVwID0gcy0+ZnJvbVNpemU7CgkJ
YXNzZXJ0IChrZWVwIDw9IHMtPmZyb21TaXplKTsKCQlpZiAoa2VlcCA8IHMtPmZyb21TaXpl
KSB7CgkJCWlmIChERUJVRyBvciBzLT5tZXNzYWdlcykKCQkJCWZwcmludGYoc3RkZXJyLCAK
CQkJCQkiU2hyaW5raW5nIG5ldyBzcGFjZSBhdCAleCB0byAldSBieXRlcy5cbiIsCgkJCQkJ
KHVpbnQpcy0+YmFzZSAsIGtlZXApOwoJCQlhc3NlcnQoa2VlcCA8PSBzLT5mcm9tU2l6ZSk7
CgkJCXNtdW5tYXAocy0+YmFzZSArIGtlZXAsIHMtPmZyb21TaXplIC0ga2VlcCk7CgkJCXMt
PmZyb21TaXplID0ga2VlcDsKCQl9CgkJLyogRGV0ZXJtaW5lIHRoZSBzaXplIG9mIG9sZCBz
cGFjZSwgYW5kIHBvc3NpYmx5IHVubWFwIGl0LiAqLwoJCWlmIChzLT50b1NpemUgPCBzLT5m
cm9tU2l6ZSkKCQkJLyogdG9TcGFjZSBpcyBzbWFsbGVyIHRoYW4gZnJvbVNwYWNlLCBzbyB3
ZSB3b24ndCBiZQoJCQkgKiBhYmxlIHRvIHVzZSBpdCBmb3IgdGhlIG5leHQgR0MgYW55d2F5
cy4KCQkJICovCgkJCWtlZXAgPSAwOwoJCWVsc2UgaWYgKHMtPmZyb21TaXplID4gcy0+bWF4
U2VtaSkKCQkJLyogSG9sZGluZyBvbiB0byB0b1NwYWNlIG1heSBjYXVzZSBzd2FwcGluZy4g
Ki8KCQkJa2VlcCA9IDA7CgkJZWxzZSBpZiAocy0+ZnJvbVNpemUgPT0gcy0+bWF4U2VtaSkK
CQkJLyogV2UgZml0IGluIG1lbW9yeSwgc28ga2VlcCBzcGFjZXMgYXQgcy0+bWF4U2VtaS4g
Ki8KCQkJa2VlcCA9IHMtPmZyb21TaXplOwoJICAgICAgICAvKiBzLT5mcm9tU2l6ZSA8PSBz
LT50b1NpemUgYW5kIHMtPmZyb21TaXplIDwgcy0+bWF4U2VtaSAqLwoJCWVsc2UgaWYgKG5l
ZWRlZCAqIHMtPm1heExpdmUgPiAoVzY0KXMtPnRvU2l6ZSkKCQkJLyogdG9TcGFjZSBpcyB0
b28gc21hbGwgKi8KCQkJa2VlcCA9IDA7CgkJZWxzZQogCQkJLyogdG9TcGFjZSBpcyBhYm91
dCByaWdodCwgc28gbWFrZSBpdCB0aGUgc2FtZSBzaXplIGFzCgkJCSAqIGZyb21TcGFjZS4K
CQkJICovCgkJCWtlZXAgPSBzLT5mcm9tU2l6ZTsKCQlhc3NlcnQgKGtlZXAgPD0gcy0+dG9T
aXplKTsKCQlpZiAoa2VlcCA8IHMtPnRvU2l6ZSkgewoJCQlpZiAoREVCVUcgb3Igcy0+bWVz
c2FnZXMpCgkJCQlmcHJpbnRmKHN0ZGVyciwgCgkJCQkJIlNocmlua2luZyBvbGQgc3BhY2Ug
YXQgJXggdG8gJXUgYnl0ZXMuXG4iLAoJCQkJCSh1aW50KXMtPnRvQmFzZSAsIGtlZXApOwoJ
CQlhc3NlcnQoa2VlcCA8PSBzLT50b1NpemUpOwoJCQlzbXVubWFwKHMtPnRvQmFzZSArIGtl
ZXAsIHMtPnRvU2l6ZSAtIGtlZXApOwoJCQlzLT50b1NpemUgPSBrZWVwOwoJCQlpZiAoMCA9
PSBrZWVwKQoJCQkJcy0+dG9CYXNlID0gTlVMTDsKCQl9Cgl9CglzZXRMaW1pdChzKTsKCXMt
PmJ5dGVzQ29waWVkICs9IHMtPmJ5dGVzTGl2ZTsKCWZpeGVkR2V0cnVzYWdlKFJVU0FHRV9T
RUxGLCAmcnVfZmluaXNoKTsKCXJ1c2FnZU1pbnVzTWF4KCZydV9maW5pc2gsICZydV9zdGFy
dCwgJnJ1X3RvdGFsKTsKCXJ1c2FnZVBsdXNNYXgoJnMtPnJ1X2djLCAmcnVfdG90YWwsICZz
LT5ydV9nYyk7CglnY1RpbWUgPSBydXNhZ2VUaW1lKCZydV90b3RhbCk7CglzLT5tYXhQYXVz
ZSA9IG1heChzLT5tYXhQYXVzZSwgZ2NUaW1lKTsKCWlmIChERUJVRyBvciBzLT5tZXNzYWdl
cykgewoJCWZwcmludGYoc3RkZXJyLCAiRmluaXNoZWQgZ2MuXG4iKTsKCQlmcHJpbnRmKHN0
ZGVyciwgInRpbWUobXMpOiAlc1xuIiwgaW50VG9Db21tYVN0cmluZyhnY1RpbWUpKTsKCQlm
cHJpbnRmKHN0ZGVyciwgImxpdmUoYnl0ZXMpOiAlcyAoJS4xZiUlKVxuIiwgCgkJCWludFRv
Q29tbWFTdHJpbmcocy0+Ynl0ZXNMaXZlKSwKCQkJMTAwLjAgKiAoKGRvdWJsZSkgcy0+Ynl0
ZXNMaXZlKSAvIHNpemUpOwoJfQoJdW5sZXNzIChieXRlc1JlcXVlc3RlZCA8PSBzLT5saW1p
dCAtIHMtPmZyb250aWVyKSB7CgkJaWYgKHMtPnVzZUZpeGVkSGVhcCkgewoJCQlkaWUoIk91
dCBvZiBtZW1vcnkgKGRvR0MpLiIpOwoJCX0gCgkJaWYgKERFQlVHKQoJCQlmcHJpbnRmKHN0
ZGVyciwgIlJlY3Vyc2l2ZSBjYWxsIHRvIGRvR0MuXG4iKTsKCQlHQ19kb0dDKHMsIGJ5dGVz
UmVxdWVzdGVkLCAwKTsKCX0KCWFzc2VydChieXRlc1JlcXVlc3RlZCA8PSBzLT5saW1pdCAt
IHMtPmZyb250aWVyKTsKCWlmIChERUJVRykgCgkJR0NfZGlzcGxheShzLCBzdGRlcnIpOwoJ
YXNzZXJ0KGludmFyaWFudChzKSk7Cn0KCi8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KLyogICAgICAgICAgICAgICAgICAgICAgIEdD
X2djICAgICAgICAgICAgICAgICAgICAgICAqLwovKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCgp2b2lkIEdDX2djKEdDX3N0YXRlIHMs
IHVpbnQgYnl0ZXNSZXF1ZXN0ZWQsIGJvb2wgZm9yY2UsCgkJc3RyaW5nIGZpbGUsIGludCBs
aW5lKSB7CglzLT5jdXJyZW50VGhyZWFkLT5ieXRlc05lZWRlZCA9IGJ5dGVzUmVxdWVzdGVk
OwoJZG8gewoJdWludCBzdGFja0J5dGVzUmVxdWVzdGVkOwoJR0NfZW50ZXIocyk7CglpZiAo
REVCVUcpIHsKCQlmcHJpbnRmIChzdGRlcnIsICIlcyAlZDogIiwgZmlsZSwgbGluZSk7CgkJ
R0NfZGlzcGxheShzLCBzdGRlcnIpOwoJfQoJc3RhY2tCeXRlc1JlcXVlc3RlZCA9CgkJKHN0
YWNrVG9wSXNPayhzLCBzLT5jdXJyZW50VGhyZWFkLT5zdGFjaykpCgkJPyAwIAoJCTogc3Rh
Y2tCeXRlcygyICogcy0+Y3VycmVudFRocmVhZC0+c3RhY2stPnJlc2VydmVkKTsKCWlmIChE
RUJVRykKCQlmcHJpbnRmKHN0ZGVyciwgImJ5dGVzUmVxdWVzdGVkID0gJXUgIHN0YWNrQnl0
ZXNSZXF1ZXN0ZWQgPSAldVxuIiwKCQkJCWJ5dGVzUmVxdWVzdGVkLCBzdGFja0J5dGVzUmVx
dWVzdGVkKTsKCWlmIChmb3JjZSBvcgoJCShXNjQpKFczMilzLT5mcm9udGllciArIChXNjQp
Ynl0ZXNSZXF1ZXN0ZWQgCgkJCSsgKFc2NClzdGFja0J5dGVzUmVxdWVzdGVkID4gKFc2NCko
VzMyKXMtPmxpbWl0KSB7CgkJaWYgKHMtPm1lc3NhZ2VzKQoJCQlmcHJpbnRmKHN0ZGVyciwg
IiVzICVkOiBHQ19kb0dDXG4iLCBmaWxlLCBsaW5lKTsKCQkvKiBUaGlzIEdDIHdpbGwgZ3Jv
dyB0aGUgc3RhY2ssIGlmIG5lY2Vzc2FyeS4gKi8KCQlHQ19kb0dDIChzLCBieXRlc1JlcXVl
c3RlZCwgcy0+Y3VycmVudFRocmVhZC0+c3RhY2stPnJlc2VydmVkKTsKCQlhc3NlcnQgKGJ5
dGVzUmVxdWVzdGVkIDw9IHMtPmxpbWl0IC0gcy0+ZnJvbnRpZXIpOwoJfSBlbHNlIGlmIChu
b3QgKHN0YWNrVG9wSXNPayAocywgcy0+Y3VycmVudFRocmVhZC0+c3RhY2spKSkgewoJCXVp
bnQgc2l6ZTsKCQlHQ19zdGFjayBzdGFjazsKCgkJc2l6ZSA9IDIgKiBzLT5jdXJyZW50VGhy
ZWFkLT5zdGFjay0+cmVzZXJ2ZWQ7CgkJaWYgKERFQlVHKQoJCQlmcHJpbnRmIChzdGRlcnIs
ICJHcm93aW5nIHN0YWNrIHRvIHNpemUgJXUuXG4iLCBzaXplKTsKCQlpZiAoc2l6ZSA+IHMt
Pm1heFN0YWNrU2l6ZVNlZW4pCgkJCXMtPm1heFN0YWNrU2l6ZVNlZW4gPSBzaXplOwoJCS8q
IFRoZSBuZXdTdGFjayBjYW4ndCBjYXVzZSBhIEdDLCBiZWNhdXNlIHdlIGNoZWNrZWQgYWJv
dmUgdG8gCgkJICogbWFrZSBzdXJlIHRoZXJlIHdhcyBlbm91Z2ggc3BhY2UuIAoJCSAqLwoJ
CXN0YWNrID0gbmV3U3RhY2socywgc2l6ZSk7CgkJc3RhY2tDb3B5KHMtPmN1cnJlbnRUaHJl
YWQtPnN0YWNrLCBzdGFjayk7CgkJcy0+Y3VycmVudFRocmVhZC0+c3RhY2sgPSBzdGFjazsK
CQlHQ19zZXRTdGFjayhzKTsKCQlhc3NlcnQgKGJ5dGVzUmVxdWVzdGVkIDw9IHMtPmxpbWl0
IC0gcy0+ZnJvbnRpZXIpOwoJfSBlbHNlIHsKCQkvKiBTd2l0Y2ggdG8gdGhlIHNpZ25hbCBo
YW5kbGVyIHRocmVhZC4gKi8KCQlhc3NlcnQgKDAgPT0gcy0+Y2FuSGFuZGxlKTsKCQlpZiAo
REVCVUdfU0lHTkFMUykgewoJCQlmcHJpbnRmKHN0ZGVyciwgInN3aXRjaGluZyB0byBzaWdu
YWwgaGFuZGxlclxuIik7CgkJCUdDX2Rpc3BsYXkocywgc3RkZXJyKTsKCQl9CgkJYXNzZXJ0
KHMtPnNpZ25hbElzUGVuZGluZyk7CgkJcy0+c2lnbmFsSXNQZW5kaW5nID0gRkFMU0U7CgkJ
cy0+aW5TaWduYWxIYW5kbGVyID0gVFJVRTsKCQlzLT5zYXZlZFRocmVhZCA9IHMtPmN1cnJl
bnRUaHJlYWQ7CgkJLyogU2V0IHMtPmNhbkhhbmRsZSB0byAyLCB3aGljaCB3aWxsIGJlIGRl
Y3JlbWVudGVkIHRvIDEKCQkgKiB3aGVuIHN3aXRoY2hpbmcgdG8gdGhlIHNpZ25hbCBoYW5k
bGVyIHRocmVhZCwgd2hpY2ggd2lsbCB0aGVuCiAgICAgICAgICAgICAgICAgKiBydW4gYXRv
bWljYWxseSBhbmQgd2lsbCBmaW5pc2ggYnkgc3dpdGNoaW5nIHRvIHRoZSB0aHJlYWQKCQkg
KiB0byBjb250aW51ZSB3aXRoLCB3aGljaCB3aWxsIGRlY3JlbWVudCBzLT5jYW5IYW5kbGUg
dG8gMC4KICAgICAgICAgICAgICAgICAqLwoJCXMtPmNhbkhhbmRsZSA9IDI7CgkJc3dpdGNo
VG9UaHJlYWQocywgcy0+c2lnbmFsSGFuZGxlcik7Cgl9CglsZWF2ZShzKTsKCX0gd2hpbGUg
KChXNjQpKFczMilzLT5mcm9udGllciArIChXNjQpcy0+Y3VycmVudFRocmVhZC0+Ynl0ZXNO
ZWVkZWQgCgkJCT4gKFc2NCkoVzMyKXMtPmxpbWl0KTsKfQoKLyogLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwovKiAgICAgICAgICAgICAg
ICAgR0NfY3JlYXRlU3RyaW5ncyAgICAgICAgICAgICAgICAgICovCi8qIC0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KCnZvaWQgR0NfY3Jl
YXRlU3RyaW5ncyhHQ19zdGF0ZSBzLCBzdHJ1Y3QgR0Nfc3RyaW5nSW5pdCBpbml0c1tdKSB7
Cglwb2ludGVyIGZyb250aWVyOwoJaW50IGk7CgoJYXNzZXJ0KGludmFyaWFudChzKSk7Cglm
cm9udGllciA9IHMtPmZyb250aWVyOwoJZm9yKGkgPSAwOyBpbml0c1tpXS5zdHIgIT0gTlVM
TDsgKytpKSB7CgkJdWludCBudW1FbGVtZW50cywgbnVtQnl0ZXM7CgoJCW51bUVsZW1lbnRz
ID0gaW5pdHNbaV0uc2l6ZTsKCQludW1CeXRlcyA9IEdDX0FSUkFZX0hFQURFUl9TSVpFCgkJ
CSsgKCgwID09IG51bUVsZW1lbnRzKSAKCQkJCT8gUE9JTlRFUl9TSVpFIAoJCQkJOiB3b3Jk
QWxpZ24obnVtRWxlbWVudHMpKTsKCQlpZiAoZnJvbnRpZXIgKyBudW1CeXRlcyA+PSBzLT5s
aW1pdCkKCQkJZGllKCJVbmFibGUgdG8gYWxsb2NhdGUgc3RyaW5nIGNvbnN0YW50IFwiJXNc
Ii4iLCAKCQkJCWluaXRzW2ldLnN0cik7CgkJKih3b3JkKilmcm9udGllciA9IG51bUVsZW1l
bnRzOwoJCSood29yZCopKGZyb250aWVyICsgV09SRF9TSVpFKSA9IFNUUklOR19IRUFERVI7
CgkJcy0+Z2xvYmFsc1tpbml0c1tpXS5nbG9iYWxJbmRleF0gPSAKCQkJZnJvbnRpZXIgKyBH
Q19BUlJBWV9IRUFERVJfU0laRTsKCQl7CgkJCWludCBqOwoKCQkJZm9yIChqID0gMDsgaiA8
IG51bUVsZW1lbnRzOyArK2opCgkJCQkqKGZyb250aWVyICsgR0NfQVJSQVlfSEVBREVSX1NJ
WkUgKyBqKSAKCQkJCQk9IGluaXRzW2ldLnN0cltqXTsKCQl9CgkJZnJvbnRpZXIgKz0gbnVt
Qnl0ZXM7Cgl9CglzLT5mcm9udGllciA9IGZyb250aWVyOwoJYXNzZXJ0KEdDX211dGF0b3JJ
bnZhcmlhbnQocykpOwp9CgovKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tICovCi8qICAgICAgICAgICAgICAgICAgICAgIEdDX2RvbmUgICAg
ICAgICAgICAgICAgICAgICAgKi8KLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLSAqLwoKc3RhdGljIHZvaWQgZGlzcGxheVVpbnQgKHN0cmlu
ZyBuYW1lLCB1aW50IG4pIHsKCWZwcmludGYgKHN0ZGVyciwgIiVzOiAlc1xuIiwgbmFtZSwg
dWludFRvQ29tbWFTdHJpbmcobikpOwp9CgpzdGF0aWMgdm9pZCBkaXNwbGF5VWxsb25nIChz
dHJpbmcgbmFtZSwgdWxsb25nIG4pIHsKCWZwcmludGYgKHN0ZGVyciwgIiVzOiAlc1xuIiwg
bmFtZSwgdWxsb25nVG9Db21tYVN0cmluZyhuKSk7Cn0KCmlubGluZSB2b2lkCkdDX2RvbmUg
KEdDX3N0YXRlIHMpCnsKCUdDX2VudGVyKHMpOwoJc211bm1hcChzLT5iYXNlLCBzLT5mcm9t
U2l6ZSk7CglpZiAocy0+dG9CYXNlICE9IE5VTEwpIHNtdW5tYXAocy0+dG9CYXNlLCBzLT50
b1NpemUpOwoJaWYgKHMtPnN1bW1hcnkpIHsKCQlkb3VibGUgdGltZTsKCQl1aW50IGdjVGlt
ZSA9IHJ1c2FnZVRpbWUoJnMtPnJ1X2djKTsKCgkJZGlzcGxheVVpbnQoIm1heCBzZW1pc3Bh
Y2Ugc2l6ZShieXRlcykiLCBzLT5tYXhIZWFwU2l6ZVNlZW4pOwoJCWRpc3BsYXlVaW50KCJt
YXggc3RhY2sgc2l6ZShieXRlcykiLCBzLT5tYXhTdGFja1NpemVTZWVuKTsKCQl0aW1lID0g
KGRvdWJsZSkoY3VycmVudFRpbWUoKSAtIHMtPnN0YXJ0VGltZSk7CgkJZnByaW50ZihzdGRl
cnIsICJHQyB0aW1lKG1zKTogJXMgKCUuMWYlJSlcbiIsCgkJCWludFRvQ29tbWFTdHJpbmco
Z2NUaW1lKSwgCgkJCSgwLjAgPT0gdGltZSkgPyAwLjAgCgkJCTogMTAwLjAgKiAoKGRvdWJs
ZSkgZ2NUaW1lKSAvIHRpbWUpOwoJCWRpc3BsYXlVaW50KCJtYXhQYXVzZShtcykiLCBzLT5t
YXhQYXVzZSk7CgkJZGlzcGxheVVpbnQoIm51bWJlciBvZiBHQ3MiLCBzLT5udW1HQ3MpOwoJ
CWRpc3BsYXlVbGxvbmcoIm51bWJlciBvZiBMQ3MiLCBzLT5udW1MQ3MpOwoJCWRpc3BsYXlV
bGxvbmcoImJ5dGVzIGFsbG9jYXRlZCIsCgkgCQkJcy0+Ynl0ZXNBbGxvY2F0ZWQgCgkJCQkr
IChzLT5mcm9udGllciAtIHMtPmJhc2UgLSBzLT5ieXRlc0xpdmUpKTsKCQlkaXNwbGF5VWxs
b25nKCJieXRlcyBjb3BpZWQiLCBzLT5ieXRlc0NvcGllZCk7CgkJZGlzcGxheVVpbnQoIm1h
eCBieXRlcyBsaXZlIiwgcy0+bWF4Qnl0ZXNMaXZlKTsKI2lmIE1FVEVSCgkJewoJCQlpbnQg
aTsKCQkJZm9yKGkgPSAwOyBpIDwgY2FyZG9mKHNpemVzKTsgKytpKSB7CgkJCQlpZiAoMCAh
PSBzaXplc1tpXSkKCQkJCQlmcHJpbnRmKHN0ZGVyciwgIkNPVU5UWyVkXT0lZFxuIiwgaSwg
c2l6ZXNbaV0pOwoJCSAgCX0KCQl9CiNlbmRpZgoKCX0JCn0KCi8qIEdDX2hhbmRsZXIgc2V0
cyBzLT5saW1pdCA9IDAgc28gdGhhdCB0aGUgbmV4dCBsaW1pdCBjaGVjayB3aWxsIGZhaWwu
IAogKiBTaWduYWxzIG5lZWQgdG8gYmUgYmxvY2tlZCBkdXJpbmcgdGhlIGhhbmRsZXIgKGku
ZS4gaXQgc2hvdWxkIHJ1biBhdG9taWNhbGx5KQogKiBiZWNhdXNlIHNpZ2FkZHNldCBkb2Vz
IGJvdGggYSByZWFkIGFuZCBhIHdyaXRlIG9mIHMtPnNpZ25hbHNQZW5kaW5nLgogKiBUaGUg
c2lnbmFscyBhcmUgYmxvY2tlZCBieSBQb3NpeF9TaWduYWxfaGFuZGxlIChzZWUgUG9zaXgv
U2lnbmFsL1NpZ25hbC5jKS4KICovCmlubGluZSB2b2lkCkdDX2hhbmRsZXIoR0Nfc3RhdGUg
cywgaW50IHNpZ251bSkKewoJaWYgKERFQlVHX1NJR05BTFMpCgkJZnByaW50ZihzdGRlcnIs
ICJHQ19oYW5kbGVyICBzaWdudW0gPSAlZFxuIiwgc2lnbnVtKTsKCWlmICgwID09IHMtPmNh
bkhhbmRsZSkgewoJCWlmIChERUJVR19TSUdOQUxTKQoJCQlmcHJpbnRmKHN0ZGVyciwgInNl
dHRpbmcgbGltaXQgPSAwXG4iKTsKCQlzLT5saW1pdCA9IDA7Cgl9CglzaWdhZGRzZXQoJnMt
PnNpZ25hbHNQZW5kaW5nLCBzaWdudW0pOwoJcy0+c2lnbmFsSXNQZW5kaW5nID0gVFJVRTsK
CWlmIChERUJVR19TSUdOQUxTKQoJCWZwcmludGYoc3RkZXJyLCAiR0NfaGFuZGxlciBkb25l
XG4iKTsKfQoKdm9pZCBHQ19maW5pc2hIYW5kbGVyIChHQ19zdGF0ZSBzKSB7Cglhc3NlcnQo
cy0+Y2FuSGFuZGxlID09IDEpOwoJcy0+aW5TaWduYWxIYW5kbGVyID0gRkFMU0U7CQoJc2ln
ZW1wdHlzZXQoJnMtPnNpZ25hbHNQZW5kaW5nKTsKCXVuYmxvY2tTaWduYWxzKHMpOwp9Cgov
KiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICov
Ci8qICAgICAgICAgICAgICAgICAgIEdDX29iamVjdFNpemUgICAgICAgICAgICAgICAgICAg
Ki8KLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LSAqLwovKiBDb21wdXRlIHRoZSBzcGFjZSB0YWtlbiBieSB0aGUgaGVhZGVyIGFuZCBvYmpl
Y3QgYm9keS4gKi8KCmlubGluZSB1aW50CkdDX29iamVjdFNpemUocG9pbnRlciBwKQp7Cgl1
aW50IGhlYWRlckJ5dGVzLCBvYmplY3RCeXRlczsKICAgICAgIAl3b3JkIGhlYWRlcjsKCXVp
bnQgdGFnLCBudW1Qb2ludGVycywgbnVtTm9uUG9pbnRlcnM7CgoJaGVhZGVyID0gR0NfZ2V0
SGVhZGVyKHApOwoJU1BMSVRfSEVBREVSKCk7CglpZiAoTk9STUFMX1RBRyA9PSB0YWcpIHsg
LyogRml4ZWQgc2l6ZSBvYmplY3QuICovCgkJaGVhZGVyQnl0ZXMgPSBHQ19PQkpFQ1RfSEVB
REVSX1NJWkU7CgkJb2JqZWN0Qnl0ZXMgPSB0b0J5dGVzKG51bVBvaW50ZXJzICsgbnVtTm9u
UG9pbnRlcnMpOwoJfSBlbHNlIGlmIChTVEFDS19UQUcgPT0gdGFnKSB7IC8qIFN0YWNrLiAq
LwoJCWhlYWRlckJ5dGVzID0gU1RBQ0tfSEVBREVSX1NJWkU7CgkJb2JqZWN0Qnl0ZXMgPSBz
aXplb2Yoc3RydWN0IEdDX3N0YWNrKSArICgoR0Nfc3RhY2spcCktPnJlc2VydmVkOwoJfSBl
bHNlIHsgLyogQXJyYXkuICovCgkJYXNzZXJ0KEFSUkFZX1RBRyA9PSB0YWcpOwoJCWhlYWRl
ckJ5dGVzID0gR0NfQVJSQVlfSEVBREVSX1NJWkU7CgkJb2JqZWN0Qnl0ZXMgPSBhcnJheU51
bUJ5dGVzKHAsIG51bVBvaW50ZXJzLCBudW1Ob25Qb2ludGVycyk7CgkJLyogRW1wdHkgYXJy
YXlzIGhhdmUgUE9JTlRFUl9TSVpFIGJ5dGVzIGZvciB0aGUgCgkJICogZm9yd2FyZGluZyBw
b2ludGVyLgoJCSAqLwoJCWlmICgwID09IG9iamVjdEJ5dGVzKSBvYmplY3RCeXRlcyA9IFBP
SU5URVJfU0laRTsKCX0KCXJldHVybiBoZWFkZXJCeXRlcyArIG9iamVjdEJ5dGVzOwp9Cg==

--vIDI9dORkA--