Having memory leak issues with perl-c

[email protected] (Mark Murawski) Wed, 27 Jul 2022 11:09:50 -0400
Newsgroups perl.qa
Message-ID <[email protected]>
--------------JEcHAiaFmwEZbMcRyq0VQYwj
Content-Type: text/plain; charset=UTF-8; format=flowed
Content-Transfer-Encoding: 8bit

Hi All!

I'm working on a new feature for plperl in postgresql to populate some 
metadata in main::_FN for running plperl functions from postgres sql.

I've snipped out some extra code that's unrelated to focus on the issue 
at hand.   If the section labeled 'Leaking Section' is entirely 
commented out (and of course the related SvREFCNT_dec_current is 
commented as well), then there's no memory issue at all.  If I do use 
this section of code, something is not freed and I'm not sure what that 
is, since I'm very new to perl-c



/*
  * Decrement the refcount of the given SV within the active Perl 
interpreter
  *
  * This is handy because it reloads the active-interpreter pointer, saving
  * some notation in callers that switch the active interpreter.
  */
static inline void
SvREFCNT_dec_current(SV *sv)
{
     dTHX;

     SvREFCNT_dec(sv);
}

static SV  *
plperl_call_perl_func(plperl_proc_desc *desc, FunctionCallInfo fcinfo)
{
     dTHX;
     dSP;

     HV                 *hv;                  // hash
     SV                 *FNsv;                // scalar reference to the 
hash
     SV                 *svFN;                // local reference to the 
hash?

     ENTER;
     SAVETMPS;

     /* Give functions some metadata about what's going on in $_FN 
(Similar to $_TD for triggers) */

     // Leaking Section {
     FNsv = get_sv("main::_FN", GV_ADD);
     save_item(FNsv);                        /* local $_FN */

     hv = newHV(); // create new hash
     hv_ksplit(hv, 12);                      /* pre-grow the hash */
     hv_store_string(hv, "name", cstr2sv(desc->proname));

     svFN = newRV_noinc((SV *) hv); // reference to the new hash
     sv_setsv(FNsv, svFN);
     // Leaking Section }

     // dostuff

     SvREFCNT_dec_current(hv);

     PUTBACK;
     FREETMPS;
     LEAVE;

     ...snip...
}


If anyone would like to see the full context, I've attached the entire 
file.  My additions are between the 'New..........' sections

My question is... the perl-c api docs do not make it clear for which 
allocations or accesses that you need to decrement the ref count.

Does 'hv' need a decrement?
Does 'FNsv' need a decrement?
Does 'svFN' need a decrement?

Given that: If the code for storing main::_FN is commented out 
completely -- there is no memory leak... I'm pretty sure this is the 
source of the leak.  And being that I don't understand when you're 
supposed to decrement... it's probably in this code that the issue lays.

Thanks!

--------------JEcHAiaFmwEZbMcRyq0VQYwj
Content-Type: text/x-csrc; charset=UTF-8; name="plperl.c"
Content-Disposition: attachment; filename="plperl.c"
Content-Transfer-Encoding: base64

LyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioq
KioqKioqKioqKioqKioqKioKICogcGxwZXJsLmMgLSBwZXJsIGFzIGEgcHJvY2VkdXJhbCBs
YW5ndWFnZSBmb3IgUG9zdGdyZVNRTAogKgogKgkgIHNyYy9wbC9wbHBlcmwvcGxwZXJsLmMK
ICoKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioq
KioqKioqKioqKioqKioqKioqKiovCgojaW5jbHVkZSAicG9zdGdyZXMuaCIKCi8qIHN5c3Rl
bSBzdHVmZiAqLwojaW5jbHVkZSA8Y3R5cGUuaD4KI2luY2x1ZGUgPGZjbnRsLmg+CiNpbmNs
dWRlIDxsaW1pdHMuaD4KI2luY2x1ZGUgPHVuaXN0ZC5oPgoKLyogcG9zdGdyZVNRTCBzdHVm
ZiAqLwojaW5jbHVkZSAiYWNjZXNzL2h0dXBfZGV0YWlscy5oIgojaW5jbHVkZSAiYWNjZXNz
L3hhY3QuaCIKI2luY2x1ZGUgImNhdGFsb2cvcGdfbGFuZ3VhZ2UuaCIKI2luY2x1ZGUgImNh
dGFsb2cvcGdfcHJvYy5oIgojaW5jbHVkZSAiY2F0YWxvZy9wZ190eXBlLmgiCiNpbmNsdWRl
ICJjb21tYW5kcy9ldmVudF90cmlnZ2VyLmgiCiNpbmNsdWRlICJjb21tYW5kcy90cmlnZ2Vy
LmgiCiNpbmNsdWRlICJleGVjdXRvci9zcGkuaCIKI2luY2x1ZGUgImZ1bmNhcGkuaCIKI2lu
Y2x1ZGUgIm1iL3BnX3djaGFyLmgiCiNpbmNsdWRlICJtaXNjYWRtaW4uaCIKI2luY2x1ZGUg
Im5vZGVzL21ha2VmdW5jcy5oIgojaW5jbHVkZSAicGFyc2VyL3BhcnNlX3R5cGUuaCIKI2lu
Y2x1ZGUgInN0b3JhZ2UvaXBjLmgiCiNpbmNsdWRlICJ0Y29wL3Rjb3Bwcm90LmgiCiNpbmNs
dWRlICJ1dGlscy9idWlsdGlucy5oIgojaW5jbHVkZSAidXRpbHMvZm1ncm9pZHMuaCIKI2lu
Y2x1ZGUgInV0aWxzL2d1Yy5oIgojaW5jbHVkZSAidXRpbHMvaHNlYXJjaC5oIgojaW5jbHVk
ZSAidXRpbHMvbHN5c2NhY2hlLmgiCiNpbmNsdWRlICJ1dGlscy9tZW11dGlscy5oIgojaW5j
bHVkZSAidXRpbHMvcmVsLmgiCiNpbmNsdWRlICJ1dGlscy9zeXNjYWNoZS5oIgojaW5jbHVk
ZSAidXRpbHMvdHlwY2FjaGUuaCIKCi8qIGRlZmluZSBvdXIgdGV4dCBkb21haW4gZm9yIHRy
YW5zbGF0aW9ucyAqLwojdW5kZWYgVEVYVERPTUFJTgojZGVmaW5lIFRFWFRET01BSU4gUEdf
VEVYVERPTUFJTigicGxwZXJsIikKCi8qIHBlcmwgc3R1ZmYgKi8KI2luY2x1ZGUgInBscGVy
bC5oIgojaW5jbHVkZSAicGxwZXJsX2hlbHBlcnMuaCIKCi8qIHN0cmluZyBsaXRlcmFsIG1h
Y3JvcyBkZWZpbmluZyBjaHVua3Mgb2YgcGVybCBjb2RlICovCiNpbmNsdWRlICJwZXJsY2h1
bmtzLmgiCi8qIGRlZmluZXMgUExQRVJMX1NFVF9PUE1BU0sgKi8KI2luY2x1ZGUgInBscGVy
bF9vcG1hc2suaCIKCkVYVEVSTl9DIHZvaWQgYm9vdF9EeW5hTG9hZGVyKHBUSFhfIENWICpj
dik7CkVYVEVSTl9DIHZvaWQgYm9vdF9Qb3N0Z3JlU1FMX19JblNlcnZlcl9fVXRpbChwVEhY
XyBDViAqY3YpOwpFWFRFUk5fQyB2b2lkIGJvb3RfUG9zdGdyZVNRTF9fSW5TZXJ2ZXJfX1NQ
SShwVEhYXyBDViAqY3YpOwoKUEdfTU9EVUxFX01BR0lDOwoKLyoqKioqKioqKioqKioqKioq
KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioK
ICogSW5mb3JtYXRpb24gYXNzb2NpYXRlZCB3aXRoIGEgUGVybCBpbnRlcnByZXRlci4gIFdl
IGhhdmUgb25lIGludGVycHJldGVyCiAqIHRoYXQgaXMgdXNlZCBmb3IgYWxsIHBscGVybHUg
KHVudHJ1c3RlZCkgZnVuY3Rpb25zLiAgRm9yIHBscGVybCAodHJ1c3RlZCkKICogZnVuY3Rp
b25zLCB0aGVyZSBpcyBhIHNlcGFyYXRlIGludGVycHJldGVyIGZvciBlYWNoIGVmZmVjdGl2
ZSBTUUwgdXNlcmlkLgogKiAoVGhpcyBpcyBuZWVkZWQgdG8gZW5zdXJlIHRoYXQgYW4gdW5w
cml2aWxlZ2VkIHVzZXIgY2FuJ3QgaW5qZWN0IFBlcmwgY29kZQogKiB0aGF0J2xsIGJlIGV4
ZWN1dGVkIHdpdGggdGhlIHByaXZpbGVnZXMgb2Ygc29tZSBvdGhlciBTUUwgdXNlci4pCiAq
CiAqIFRoZSBwbHBlcmxfaW50ZXJwX2Rlc2Mgc3RydWN0cyBhcmUga2VwdCBpbiBhIFBvc3Rn
cmVzIGhhc2ggdGFibGUgaW5kZXhlZAogKiBieSB1c2VyaWQgT0lELCB3aXRoIE9JRCAwIHVz
ZWQgZm9yIHRoZSBzaW5nbGUgdW50cnVzdGVkIGludGVycHJldGVyLgogKiBPbmNlIGNyZWF0
ZWQsIGFuIGludGVycHJldGVyIGlzIGtlcHQgZm9yIHRoZSBsaWZlIG9mIHRoZSBwcm9jZXNz
LgogKgogKiBXZSBzdGFydCBvdXQgYnkgY3JlYXRpbmcgYSAiaGVsZCIgaW50ZXJwcmV0ZXIs
IHdoaWNoIHdlIGluaXRpYWxpemUKICogb25seSBhcyBmYXIgYXMgd2UgY2FuIGRvIHdpdGhv
dXQgZGVjaWRpbmcgaWYgaXQgd2lsbCBiZSB0cnVzdGVkIG9yCiAqIHVudHJ1c3RlZC4gIExh
dGVyLCB3aGVuIHdlIGZpcnN0IG5lZWQgdG8gcnVuIGEgcGxwZXJsIG9yIHBscGVybHUKICog
ZnVuY3Rpb24sIHdlIGNvbXBsZXRlIHRoZSBpbml0aWFsaXphdGlvbiBhcHByb3ByaWF0ZWx5
IGFuZCBtb3ZlIHRoZQogKiBQZXJsSW50ZXJwcmV0ZXIgcG9pbnRlciBpbnRvIHRoZSBwbHBl
cmxfaW50ZXJwX2hhc2ggaGFzaHRhYmxlLiAgSWYgYWZ0ZXIKICogdGhhdCB3ZSBuZWVkIG1v
cmUgaW50ZXJwcmV0ZXJzLCB3ZSBjcmVhdGUgdGhlbSBhcyBuZWVkZWQgaWYgd2UgY2FuLCBv
cgogKiBmYWlsIGlmIHRoZSBQZXJsIGJ1aWxkIGRvZXNuJ3Qgc3VwcG9ydCBtdWx0aXBsZSBp
bnRlcnByZXRlcnMuCiAqCiAqIFRoZSByZWFzb24gZm9yIGFsbCB0aGUgZGFuY2luZyBhYm91
dCB3aXRoIGEgaGVsZCBpbnRlcnByZXRlciBpcyB0byBtYWtlCiAqIGl0IHBvc3NpYmxlIGZv
ciBwZW9wbGUgdG8gcHJlbG9hZCBhIGxvdCBvZiBQZXJsIGNvZGUgYXQgcG9zdG1hc3RlciBz
dGFydHVwCiAqICh1c2luZyBwbHBlcmwub25faW5pdCkgYW5kIHRoZW4gdXNlIHRoYXQgY29k
ZSBpbiBiYWNrZW5kcy4gIE9mIGNvdXJzZSB0aGlzCiAqIHdpbGwgb25seSB3b3JrIGZvciB0
aGUgZmlyc3QgaW50ZXJwcmV0ZXIgY3JlYXRlZCBpbiBhbnkgYmFja2VuZCwgYnV0IGl0J3MK
ICogc3RpbGwgdXNlZnVsIHdpdGggdGhhdCByZXN0cmljdGlvbi4KICoqKioqKioqKioqKioq
KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioq
KiovCnR5cGVkZWYgc3RydWN0IHBscGVybF9pbnRlcnBfZGVzYwp7CglPaWQJCQl1c2VyX2lk
OwkJLyogSGFzaCBrZXkgKG11c3QgYmUgZmlyc3QhKSAqLwoJUGVybEludGVycHJldGVyICpp
bnRlcnA7CS8qIFRoZSBpbnRlcnByZXRlciAqLwoJSFRBQgkgICAqcXVlcnlfaGFzaDsJCS8q
IHBscGVybF9xdWVyeV9lbnRyeSBzdHJ1Y3RzICovCn0gcGxwZXJsX2ludGVycF9kZXNjOwoK
Ci8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioq
KioqKioqKioqKioqKioqKioqCiAqIFRoZSBpbmZvcm1hdGlvbiB3ZSBjYWNoZSBhYm91dCBs
b2FkZWQgcHJvY2VkdXJlcwogKgogKiBUaGUgZm5fcmVmY291bnQgZmllbGQgY291bnRzIHRo
ZSBzdHJ1Y3QncyByZWZlcmVuY2UgZnJvbSB0aGUgaGFzaCB0YWJsZQogKiBzaG93biBiZWxv
dywgcGx1cyBvbmUgcmVmZXJlbmNlIGZvciBlYWNoIGZ1bmN0aW9uIGNhbGwgbGV2ZWwgdGhh
dCBpcyB1c2luZwogKiB0aGUgc3RydWN0LiAgV2UgY2FuIHJlbGVhc2UgdGhlIHN0cnVjdCwg
YW5kIHRoZSBhc3NvY2lhdGVkIFBlcmwgc3ViLCB3aGVuCiAqIHRoZSBmbl9yZWZjb3VudCBn
b2VzIHRvIHplcm8uICBSZWxlYXNpbmcgdGhlIHN0cnVjdCBpdHNlbGYgaXMgZG9uZSBieQog
KiBkZWxldGluZyB0aGUgZm5fY3h0LCB3aGljaCBhbHNvIGdldHMgcmlkIG9mIGFsbCBzdWJz
aWRpYXJ5IGRhdGEuCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioq
KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwp0eXBlZGVmIHN0cnVjdCBwbHBlcmxf
cHJvY19kZXNjCnsKCWNoYXIJICAgKnByb25hbWU7CQkvKiB1c2VyIG5hbWUgb2YgcHJvY2Vk
dXJlICovCglNZW1vcnlDb250ZXh0IGZuX2N4dDsJCS8qIG1lbW9yeSBjb250ZXh0IGZvciB0
aGlzIHByb2NlZHVyZSAqLwoJdW5zaWduZWQgbG9uZyBmbl9yZWZjb3VudDsJLyogbnVtYmVy
IG9mIGFjdGl2ZSByZWZlcmVuY2VzICovCglUcmFuc2FjdGlvbklkIGZuX3htaW47CQkvKiB4
bWluL1RJRCBvZiBwcm9jZWR1cmUncyBwZ19wcm9jIHR1cGxlICovCglJdGVtUG9pbnRlckRh
dGEgZm5fdGlkOwoJU1YJCSAgICpyZWZlcmVuY2U7CQkvKiBDT0RFIHJlZmVyZW5jZSBmb3Ig
UGVybCBzdWIgKi8KCXBscGVybF9pbnRlcnBfZGVzYyAqaW50ZXJwOyAvKiBpbnRlcnByZXRl
ciBpdCdzIGNyZWF0ZWQgaW4gKi8KCWJvb2wJCWZuX3JlYWRvbmx5OwkvKiBpcyBmdW5jdGlv
biByZWFkb25seSAobm90IHZvbGF0aWxlKT8gKi8KCU9pZAkJCWxhbmdfb2lkOwoJTGlzdAkg
ICAqdHJmdHlwZXM7Cglib29sCQlsYW5wbHRydXN0ZWQ7CS8qIGlzIGl0IHBscGVybCwgcmF0
aGVyIHRoYW4gcGxwZXJsdT8gKi8KCWJvb2wJCWZuX3JldGlzdHVwbGU7CS8qIHRydWUsIGlm
IGZ1bmN0aW9uIHJldHVybnMgdHVwbGUgKi8KCWJvb2wJCWZuX3JldGlzc2V0OwkvKiB0cnVl
LCBpZiBmdW5jdGlvbiByZXR1cm5zIHNldCAqLwoJYm9vbAkJZm5fcmV0aXNhcnJheTsJLyog
dHJ1ZSBpZiBmdW5jdGlvbiByZXR1cm5zIGFycmF5ICovCgkvKiBDb252ZXJzaW9uIGluZm8g
Zm9yIGZ1bmN0aW9uJ3MgcmVzdWx0IHR5cGU6ICovCglPaWQJCQlyZXN1bHRfb2lkOwkJLyog
T2lkIG9mIHJlc3VsdCB0eXBlICovCglGbWdySW5mbwlyZXN1bHRfaW5fZnVuYzsgLyogSS9P
IGZ1bmN0aW9uIGFuZCBhcmcgZm9yIHJlc3VsdCB0eXBlICovCglPaWQJCQlyZXN1bHRfdHlw
aW9wYXJhbTsKCS8qIFBlci1hcmd1bWVudCBpbmZvIGZvciBmdW5jdGlvbidzIGFyZ3VtZW50
IHR5cGVzOiAqLwoJaW50CQkJbmFyZ3M7CglGbWdySW5mbyAgICphcmdfb3V0X2Z1bmM7CS8q
IG91dHB1dCBmbnMgZm9yIGFyZyB0eXBlcyAqLwoJYm9vbAkgICAqYXJnX2lzX3Jvd3R5cGU7
IC8qIGlzIGVhY2ggYXJnIGNvbXBvc2l0ZT8gKi8KCU9pZAkJICAgKmFyZ19hcnJheXR5cGU7
CS8qIEludmFsaWRPaWQgaWYgbm90IGFuIGFycmF5ICovCn0gcGxwZXJsX3Byb2NfZGVzYzsK
CiNkZWZpbmUgaW5jcmVtZW50X3Byb2Rlc2NfcmVmY291bnQocHJvZGVzYykgIFwKCSgocHJv
ZGVzYyktPmZuX3JlZmNvdW50KyspCiNkZWZpbmUgZGVjcmVtZW50X3Byb2Rlc2NfcmVmY291
bnQocHJvZGVzYykgIFwKCWRvIHsgXAoJCUFzc2VydCgocHJvZGVzYyktPmZuX3JlZmNvdW50
ID4gMCk7IFwKCQlpZiAoLS0oKHByb2Rlc2MpLT5mbl9yZWZjb3VudCkgPT0gMCkgXAoJCQlm
cmVlX3BscGVybF9mdW5jdGlvbihwcm9kZXNjKTsgXAoJfSB3aGlsZSgwKQoKLyoqKioqKioq
KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioq
KioqKioqKioKICogRm9yIHNwZWVkeSBsb29rdXAsIHdlIG1haW50YWluIGEgaGFzaCB0YWJs
ZSBtYXBwaW5nIGZyb20KICogZnVuY3Rpb24gT0lEICsgdHJpZ2dlciBmbGFnICsgdXNlciBP
SUQgdG8gcGxwZXJsX3Byb2NfZGVzYyBwb2ludGVycy4KICogVGhlIHJlYXNvbiB0aGUgcGxw
ZXJsX3Byb2NfZGVzYyBzdHJ1Y3QgaXNuJ3QgZGlyZWN0bHkgcGFydCBvZiB0aGUgaGFzaAog
KiBlbnRyeSBpcyB0byBzaW1wbGlmeSByZWNvdmVyeSBmcm9tIGVycm9ycyBkdXJpbmcgY29t
cGlsZV9wbHBlcmxfZnVuY3Rpb24uCiAqCiAqIE5vdGU6IGlmIHRoZSBzYW1lIGZ1bmN0aW9u
IGlzIGNhbGxlZCBieSBtdWx0aXBsZSB1c2VySURzIHdpdGhpbiBhIHNlc3Npb24sCiAqIHRo
ZXJlIHdpbGwgYmUgYSBzZXBhcmF0ZSBwbHBlcmxfcHJvY19kZXNjIGVudHJ5IGZvciBlYWNo
IHVzZXJJRCBpbiB0aGUgY2FzZQogKiBvZiBwbHBlcmwgZnVuY3Rpb25zLCBidXQgb25seSBv
bmUgZW50cnkgZm9yIHBscGVybHUgZnVuY3Rpb25zLCBiZWNhdXNlIHdlCiAqIHNldCB1c2Vy
X2lkID0gMCBmb3IgdGhhdCBjYXNlLiAgSWYgdGhlIHVzZXIgcmVkZWNsYXJlcyB0aGUgc2Ft
ZSBmdW5jdGlvbgogKiBmcm9tIHBscGVybCB0byBwbHBlcmx1IG9yIHZpY2UgdmVyc2EsIHRo
ZXJlIG1pZ2h0IGJlIG11bHRpcGxlCiAqIHBscGVybF9wcm9jX3B0ciBlbnRyaWVzIGluIHRo
ZSBoYXNodGFibGUsIGJ1dCBvbmx5IG9uZSBpcyB2YWxpZC4KICoqKioqKioqKioqKioqKioq
KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiov
CnR5cGVkZWYgc3RydWN0IHBscGVybF9wcm9jX2tleQp7CglPaWQJCQlwcm9jX2lkOwkJLyog
RnVuY3Rpb24gT0lEICovCgoJLyoKCSAqIGlzX3RyaWdnZXIgaXMgcmVhbGx5IGEgYm9vbCwg
YnV0IGRlY2xhcmUgYXMgT2lkIHRvIGVuc3VyZSB0aGlzIHN0cnVjdAoJICogY29udGFpbnMg
bm8gcGFkZGluZwoJICovCglPaWQJCQlpc190cmlnZ2VyOwkJLyogaXMgaXQgYSB0cmlnZ2Vy
IGZ1bmN0aW9uPyAqLwoJT2lkCQkJdXNlcl9pZDsJCS8qIFVzZXIgY2FsbGluZyB0aGUgZnVu
Y3Rpb24sIG9yIDAgKi8KfSBwbHBlcmxfcHJvY19rZXk7Cgp0eXBlZGVmIHN0cnVjdCBwbHBl
cmxfcHJvY19wdHIKewoJcGxwZXJsX3Byb2Nfa2V5IHByb2Nfa2V5OwkvKiBIYXNoIGtleSAo
bXVzdCBiZSBmaXJzdCEpICovCglwbHBlcmxfcHJvY19kZXNjICpwcm9jX3B0cjsKfSBwbHBl
cmxfcHJvY19wdHI7CgovKgogKiBUaGUgaW5mb3JtYXRpb24gd2UgY2FjaGUgZm9yIHRoZSBk
dXJhdGlvbiBvZiBhIHNpbmdsZSBjYWxsIHRvIGEKICogZnVuY3Rpb24uCiAqLwp0eXBlZGVm
IHN0cnVjdCBwbHBlcmxfY2FsbF9kYXRhCnsKCXBscGVybF9wcm9jX2Rlc2MgKnByb2Rlc2M7
CglGdW5jdGlvbkNhbGxJbmZvIGZjaW5mbzsKCS8qIHJlbWFpbmluZyBmaWVsZHMgYXJlIHVz
ZWQgb25seSBpbiBhIGZ1bmN0aW9uIHJldHVybmluZyBzZXQ6ICovCglUdXBsZXN0b3Jlc3Rh
dGUgKnR1cGxlX3N0b3JlOwoJVHVwbGVEZXNjCXJldF90ZGVzYzsKCU9pZAkJCWNkb21haW5f
b2lkOwkvKiAwIHVubGVzcyByZXR1cm5pbmcgZG9tYWluLW92ZXItY29tcG9zaXRlICovCgl2
b2lkCSAgICpjZG9tYWluX2luZm87CglNZW1vcnlDb250ZXh0IHRtcF9jeHQ7Cn0gcGxwZXJs
X2NhbGxfZGF0YTsKCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioq
KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqIFRoZSBpbmZvcm1hdGlvbiB3ZSBj
YWNoZSBhYm91dCBwcmVwYXJlZCBhbmQgc2F2ZWQgcGxhbnMKICoqKioqKioqKioqKioqKioq
KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiov
CnR5cGVkZWYgc3RydWN0IHBscGVybF9xdWVyeV9kZXNjCnsKCWNoYXIJCXFuYW1lWzI0XTsK
CU1lbW9yeUNvbnRleHQgcGxhbl9jeHQ7CQkvKiBjb250ZXh0IGhvbGRpbmcgdGhpcyBzdHJ1
Y3QgKi8KCVNQSVBsYW5QdHIJcGxhbjsKCWludAkJCW5hcmdzOwoJT2lkCQkgICAqYXJndHlw
ZXM7CglGbWdySW5mbyAgICphcmdpbmZ1bmNzOwoJT2lkCQkgICAqYXJndHlwaW9wYXJhbXM7
Cn0gcGxwZXJsX3F1ZXJ5X2Rlc2M7CgovKiBoYXNoIHRhYmxlIGVudHJ5IGZvciBxdWVyeSBk
ZXNjCSovCgp0eXBlZGVmIHN0cnVjdCBwbHBlcmxfcXVlcnlfZW50cnkKewoJY2hhcgkJcXVl
cnlfbmFtZVtOQU1FREFUQUxFTl07CglwbHBlcmxfcXVlcnlfZGVzYyAqcXVlcnlfZGF0YTsK
fSBwbHBlcmxfcXVlcnlfZW50cnk7CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioq
KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiBJbmZvcm1hdGlv
biBmb3IgUG9zdGdyZVNRTCAtIFBlcmwgYXJyYXkgY29udmVyc2lvbi4KICoqKioqKioqKioq
KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioq
KioqKiovCnR5cGVkZWYgc3RydWN0IHBscGVybF9hcnJheV9pbmZvCnsKCWludAkJCW5kaW1z
OwoJYm9vbAkJZWxlbV9pc19yb3d0eXBlOwkvKiAndCcgaWYgZWxlbWVudCB0eXBlIGlzIGEg
cm93dHlwZSAqLwoJRGF0dW0JICAgKmVsZW1lbnRzOwoJYm9vbAkgICAqbnVsbHM7CglpbnQJ
CSAgICpuZWxlbXM7CglGbWdySW5mbwlwcm9jOwoJRm1nckluZm8JdHJhbnNmb3JtX3Byb2M7
Cn0gcGxwZXJsX2FycmF5X2luZm87CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioq
KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiBHbG9iYWwgZGF0
YQogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioq
KioqKioqKioqKioqKioqKioqKi8KCnN0YXRpYyBIVEFCICpwbHBlcmxfaW50ZXJwX2hhc2gg
PSBOVUxMOwpzdGF0aWMgSFRBQiAqcGxwZXJsX3Byb2NfaGFzaCA9IE5VTEw7CnN0YXRpYyBw
bHBlcmxfaW50ZXJwX2Rlc2MgKnBscGVybF9hY3RpdmVfaW50ZXJwID0gTlVMTDsKCi8qIElm
IHdlIGhhdmUgYW4gdW5hc3NpZ25lZCAiaGVsZCIgaW50ZXJwcmV0ZXIsIGl0J3Mgc3RvcmVk
IGhlcmUgKi8Kc3RhdGljIFBlcmxJbnRlcnByZXRlciAqcGxwZXJsX2hlbGRfaW50ZXJwID0g
TlVMTDsKCi8qIEdVQyB2YXJpYWJsZXMgKi8Kc3RhdGljIGJvb2wgcGxwZXJsX3VzZV9zdHJp
Y3QgPSBmYWxzZTsKc3RhdGljIGNoYXIgKnBscGVybF9vbl9pbml0ID0gTlVMTDsKc3RhdGlj
IGNoYXIgKnBscGVybF9vbl9wbHBlcmxfaW5pdCA9IE5VTEw7CnN0YXRpYyBjaGFyICpwbHBl
cmxfb25fcGxwZXJsdV9pbml0ID0gTlVMTDsKCnN0YXRpYyBib29sIHBscGVybF9lbmRpbmcg
PSBmYWxzZTsKc3RhdGljIE9QICAqKCpwcF9yZXF1aXJlX29yaWcpIChwVEhYKSA9IE5VTEw7
CnN0YXRpYyBjaGFyIHBscGVybF9vcG1hc2tbTUFYT107CgovKiB0aGlzIGlzIHNhdmVkIGFu
ZCByZXN0b3JlZCBieSBwbHBlcmxfY2FsbF9oYW5kbGVyICovCnN0YXRpYyBwbHBlcmxfY2Fs
bF9kYXRhICpjdXJyZW50X2NhbGxfZGF0YSA9IE5VTEw7CgovKioqKioqKioqKioqKioqKioq
KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgog
KiBGb3J3YXJkIGRlY2xhcmF0aW9ucwogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioq
KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8Kdm9pZAkJX1BHX2lu
aXQodm9pZCk7CgpzdGF0aWMgUGVybEludGVycHJldGVyICpwbHBlcmxfaW5pdF9pbnRlcnAo
dm9pZCk7CnN0YXRpYyB2b2lkIHBscGVybF9kZXN0cm95X2ludGVycChQZXJsSW50ZXJwcmV0
ZXIgKiopOwpzdGF0aWMgdm9pZCBwbHBlcmxfZmluaShpbnQgY29kZSwgRGF0dW0gYXJnKTsK
c3RhdGljIHZvaWQgc2V0X2ludGVycF9yZXF1aXJlKGJvb2wgdHJ1c3RlZCk7CgpzdGF0aWMg
RGF0dW0gcGxwZXJsX2Z1bmNfaGFuZGxlcihQR19GVU5DVElPTl9BUkdTKTsKc3RhdGljIERh
dHVtIHBscGVybF90cmlnZ2VyX2hhbmRsZXIoUEdfRlVOQ1RJT05fQVJHUyk7CnN0YXRpYyB2
b2lkIHBscGVybF9ldmVudF90cmlnZ2VyX2hhbmRsZXIoUEdfRlVOQ1RJT05fQVJHUyk7Cgpz
dGF0aWMgdm9pZCBmcmVlX3BscGVybF9mdW5jdGlvbihwbHBlcmxfcHJvY19kZXNjICpwcm9k
ZXNjKTsKCnN0YXRpYyBwbHBlcmxfcHJvY19kZXNjICpjb21waWxlX3BscGVybF9mdW5jdGlv
bihPaWQgZm5fb2lkLAoJCQkJCQkJCQkJCQkgYm9vbCBpc190cmlnZ2VyLAoJCQkJCQkJCQkJ
CQkgYm9vbCBpc19ldmVudF90cmlnZ2VyKTsKCnN0YXRpYyBTViAgKnBscGVybF9oYXNoX2Zy
b21fdHVwbGUoSGVhcFR1cGxlIHR1cGxlLCBUdXBsZURlc2MgdHVwZGVzYywgYm9vbCBpbmNs
dWRlX2dlbmVyYXRlZCk7CnN0YXRpYyBTViAgKnBscGVybF9oYXNoX2Zyb21fZGF0dW0oRGF0
dW0gYXR0cik7CnN0YXRpYyB2b2lkIGNoZWNrX3NwaV91c2FnZV9hbGxvd2VkKHZvaWQpOwpz
dGF0aWMgU1YgICpwbHBlcmxfcmVmX2Zyb21fcGdfYXJyYXkoRGF0dW0gYXJnLCBPaWQgdHlw
aWQpOwpzdGF0aWMgU1YgICpzcGxpdF9hcnJheShwbHBlcmxfYXJyYXlfaW5mbyAqaW5mbywg
aW50IGZpcnN0LCBpbnQgbGFzdCwgaW50IG5lc3QpOwpzdGF0aWMgU1YgICptYWtlX2FycmF5
X3JlZihwbHBlcmxfYXJyYXlfaW5mbyAqaW5mbywgaW50IGZpcnN0LCBpbnQgbGFzdCk7CnN0
YXRpYyBTViAgKmdldF9wZXJsX2FycmF5X3JlZihTViAqc3YpOwpzdGF0aWMgRGF0dW0gcGxw
ZXJsX3N2X3RvX2RhdHVtKFNWICpzdiwgT2lkIHR5cGlkLCBpbnQzMiB0eXBtb2QsCgkJCQkJ
CQkJRnVuY3Rpb25DYWxsSW5mbyBmY2luZm8sCgkJCQkJCQkJRm1nckluZm8gKmZpbmZvLCBP
aWQgdHlwaW9wYXJhbSwKCQkJCQkJCQlib29sICppc251bGwpOwpzdGF0aWMgdm9pZCBfc3Zf
dG9fZGF0dW1fZmluZm8oT2lkIHR5cGlkLCBGbWdySW5mbyAqZmluZm8sIE9pZCAqdHlwaW9w
YXJhbSk7CnN0YXRpYyBEYXR1bSBwbHBlcmxfYXJyYXlfdG9fZGF0dW0oU1YgKnNyYywgT2lk
IHR5cGlkLCBpbnQzMiB0eXBtb2QpOwpzdGF0aWMgdm9pZCBhcnJheV90b19kYXR1bV9pbnRl
cm5hbChBViAqYXYsIEFycmF5QnVpbGRTdGF0ZSAqYXN0YXRlLAoJCQkJCQkJCQlpbnQgKm5k
aW1zLCBpbnQgKmRpbXMsIGludCBjdXJfZGVwdGgsCgkJCQkJCQkJCU9pZCBhcnJheXR5cGlk
LCBPaWQgZWxlbXR5cGlkLCBpbnQzMiB0eXBtb2QsCgkJCQkJCQkJCUZtZ3JJbmZvICpmaW5m
bywgT2lkIHR5cGlvcGFyYW0pOwpzdGF0aWMgRGF0dW0gcGxwZXJsX2hhc2hfdG9fZGF0dW0o
U1YgKnNyYywgVHVwbGVEZXNjIHRkKTsKCnN0YXRpYyB2b2lkIHBscGVybF9pbml0X3NoYXJl
ZF9saWJzKHBUSFgpOwpzdGF0aWMgdm9pZCBwbHBlcmxfdHJ1c3RlZF9pbml0KHZvaWQpOwpz
dGF0aWMgdm9pZCBwbHBlcmxfdW50cnVzdGVkX2luaXQodm9pZCk7CnN0YXRpYyBIViAgKnBs
cGVybF9zcGlfZXhlY3V0ZV9mZXRjaF9yZXN1bHQoU1BJVHVwbGVUYWJsZSAqLCB1aW50NjQs
IGludCk7CnN0YXRpYyB2b2lkIHBscGVybF9yZXR1cm5fbmV4dF9pbnRlcm5hbChTViAqc3Yp
OwpzdGF0aWMgY2hhciAqaGVrMmNzdHIoSEUgKmhlKTsKc3RhdGljIFNWICoqaHZfc3RvcmVf
c3RyaW5nKEhWICpodiwgY29uc3QgY2hhciAqa2V5LCBTViAqdmFsKTsKc3RhdGljIFNWICoq
aHZfZmV0Y2hfc3RyaW5nKEhWICpodiwgY29uc3QgY2hhciAqa2V5KTsKc3RhdGljIHZvaWQg
cGxwZXJsX2NyZWF0ZV9zdWIocGxwZXJsX3Byb2NfZGVzYyAqZGVzYywgY29uc3QgY2hhciAq
cywgT2lkIGZuX29pZCk7CnN0YXRpYyBTViAgKnBscGVybF9jYWxsX3BlcmxfZnVuYyhwbHBl
cmxfcHJvY19kZXNjICpkZXNjLAoJCQkJCQkJCSAgRnVuY3Rpb25DYWxsSW5mbyBmY2luZm8p
OwpzdGF0aWMgdm9pZCBwbHBlcmxfY29tcGlsZV9jYWxsYmFjayh2b2lkICphcmcpOwpzdGF0
aWMgdm9pZCBwbHBlcmxfZXhlY19jYWxsYmFjayh2b2lkICphcmcpOwpzdGF0aWMgdm9pZCBw
bHBlcmxfaW5saW5lX2NhbGxiYWNrKHZvaWQgKmFyZyk7CnN0YXRpYyBjaGFyICpzdHJpcF90
cmFpbGluZ193cyhjb25zdCBjaGFyICptc2cpOwpzdGF0aWMgT1AgICpwcF9yZXF1aXJlX3Nh
ZmUocFRIWCk7CnN0YXRpYyB2b2lkIGFjdGl2YXRlX2ludGVycHJldGVyKHBscGVybF9pbnRl
cnBfZGVzYyAqaW50ZXJwX2Rlc2MpOwoKI2lmIGRlZmluZWQoV0lOMzIpICYmIFBFUkxfVkVS
U0lPTl9MVCg1LCAyOCwgMCkKc3RhdGljIGNoYXIgKnNldGxvY2FsZV9wZXJsKGludCBjYXRl
Z29yeSwgY2hhciAqbG9jYWxlKTsKI2Vsc2UKI2RlZmluZSBzZXRsb2NhbGVfcGVybChhLGIp
ICBQZXJsX3NldGxvY2FsZShhLGIpCiNlbmRpZgkJCQkJCQkvKiBkZWZpbmVkKFdJTjMyKSAm
JiBQRVJMX1ZFUlNJT05fTFQoNSwgMjgsIDApICovCgovKgogKiBEZWNyZW1lbnQgdGhlIHJl
ZmNvdW50IG9mIHRoZSBnaXZlbiBTViB3aXRoaW4gdGhlIGFjdGl2ZSBQZXJsIGludGVycHJl
dGVyCiAqCiAqIFRoaXMgaXMgaGFuZHkgYmVjYXVzZSBpdCByZWxvYWRzIHRoZSBhY3RpdmUt
aW50ZXJwcmV0ZXIgcG9pbnRlciwgc2F2aW5nCiAqIHNvbWUgbm90YXRpb24gaW4gY2FsbGVy
cyB0aGF0IHN3aXRjaCB0aGUgYWN0aXZlIGludGVycHJldGVyLgogKi8Kc3RhdGljIGlubGlu
ZSB2b2lkClN2UkVGQ05UX2RlY19jdXJyZW50KFNWICpzdikKewoJZFRIWDsKCglTdlJFRkNO
VF9kZWMoc3YpOwp9CgovKgogKiBjb252ZXJ0IGEgSEUgKGhhc2ggZW50cnkpIGtleSB0byBh
IGNzdHIgaW4gdGhlIGN1cnJlbnQgZGF0YWJhc2UgZW5jb2RpbmcKICovCnN0YXRpYyBjaGFy
ICoKaGVrMmNzdHIoSEUgKmhlKQp7CglkVEhYOwoJY2hhcgkgICAqcmV0OwoJU1YJCSAgICpz
djsKCgkvKgoJICogSGVTVktFWV9mb3JjZSB3aWxsIHJldHVybiBhIHRlbXBvcmFyeSBtb3J0
YWwgU1YqLCBzbyB3ZSBuZWVkIHRvIG1ha2UKCSAqIHN1cmUgdG8gZnJlZSBpdCB3aXRoIEVO
VEVSL1NBVkUvRlJFRS9MRUFWRQoJICovCglFTlRFUjsKCVNBVkVUTVBTOwoKCS8qLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLQoJICogVW5mb3J0dW5hdGVseSwgIHdoaWxlIEhlVVRGOCBp
cyB0cnVlIGZvciBtb3N0IHRoaW5ncyA+IDI1NiwgZm9yIHZhbHVlcwoJICogMTI4Li4yNTUg
aXQncyBub3QsIGJ1dCBwZXJsIHdpbGwgdHJlYXQgdGhlbSBhcyB1bmljb2RlIGNvZGUgcG9p
bnRzIGlmCgkgKiB0aGUgdXRmOCBmbGFnIGlzIG5vdCBzZXQgKCBzZWUgVGhlICJVbmljb2Rl
IEJ1ZyIgaW4gcGVybGRvYyBwZXJsdW5pY29kZQoJICogZm9yIG1vcmUpCgkgKgoJICogU28g
aWYgd2UgZGlkIHRoZSBleHBlY3RlZDoKCSAqCSAgaWYgKEhlVVRGOChoZSkpCgkgKgkJICB1
dGZfdTJlKGtleS4uLik7CgkgKgkgIGVsc2UgLy8gbXVzdCBiZSBhc2NpaQoJICoJCSAgcmV0
dXJuIEhlUFYoaGUpOwoJICogd2Ugd29uJ3QgbWF0Y2ggY29sdW1ucyB3aXRoIGNvZGVwb2lu
dHMgZnJvbSAxMjguLjI1NQoJICoKCSAqIEZvciBhIG1vcmUgY29uY3JldGUgZXhhbXBsZSBn
aXZlbiBhIGNvbHVtbiB3aXRoIHRoZSBuYW1lIG9mIHRoZSB1bmljb2RlCgkgKiBjb2RlcG9p
bnQgVSswMGFlIChyZWdpc3RlcmVkIHNpZ24pIGFuZCBhIFVURjggZGF0YWJhc2UgYW5kIHRo
ZSBwZXJsCgkgKiByZXR1cm5fbmV4dCB7ICJcTntVKzAwYWV9PT4ndGV4dCB9IHdvdWxkIGFs
d2F5cyBmYWlsIGFzIGhlVVRGOCByZXR1cm5zCgkgKiAwIGFuZCBIZVBWKCkgd291bGQgZ2l2
ZSB1cyBhIGNoYXIgKiB3aXRoIDEgYnl0ZSBjb250YWlucyB0aGUgZGVjaW1hbAoJICogdmFs
dWUgMTc0CgkgKgoJICogUGVybCBoYXMgdGhlIGJyYWlucyB0byBrbm93IHdoZW4gaXQgc2hv
dWxkIHV0ZjggZW5jb2RlIDE3NCBwcm9wZXJseSwgc28KCSAqIGhlcmUgd2UgZm9yY2UgaXQg
aW50byBhbiBTViBzbyB0aGF0IHBlcmwgd2lsbCBmaWd1cmUgaXQgb3V0IGFuZCBkbyB0aGUK
CSAqIHJpZ2h0IHRoaW5nCgkgKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KCSAqLwoKCXN2
ID0gSGVTVktFWV9mb3JjZShoZSk7CglpZiAoSGVVVEY4KGhlKSkKCQlTdlVURjhfb24oc3Yp
OwoJcmV0ID0gc3YyY3N0cihzdik7CgoJLyogZnJlZSBzdiAqLwoJRlJFRVRNUFM7CglMRUFW
RTsKCglyZXR1cm4gcmV0Owp9CgoKLyoKICogX1BHX2luaXQoKQkJCS0gbGlicmFyeSBsb2Fk
LXRpbWUgaW5pdGlhbGl6YXRpb24KICoKICogRE8gTk9UIG1ha2UgdGhpcyBzdGF0aWMgbm9y
IGNoYW5nZSBpdHMgbmFtZSEKICovCnZvaWQKX1BHX2luaXQodm9pZCkKewoJLyoKCSAqIEJl
IHN1cmUgd2UgZG8gaW5pdGlhbGl6YXRpb24gb25seSBvbmNlLgoJICoKCSAqIElmIGluaXRp
YWxpemF0aW9uIGZhaWxzIGR1ZSB0bywgZS5nLiwgcGxwZXJsX2luaXRfaW50ZXJwKCkgdGhy
b3dpbmcgYW4KCSAqIGV4Y2VwdGlvbiwgdGhlbiB3ZSdsbCByZXR1cm4gaGVyZSBvbiB0aGUg
bmV4dCB1c2FnZSBhbmQgdGhlIHVzZXIgd2lsbAoJICogZ2V0IGEgcmF0aGVyIGNyeXB0aWM6
IEVSUk9SOiAgYXR0ZW1wdCB0byByZWRlZmluZSBwYXJhbWV0ZXIKCSAqICJwbHBlcmwudXNl
X3N0cmljdCIKCSAqLwoJc3RhdGljIGJvb2wgaW5pdGVkID0gZmFsc2U7CglIQVNIQ1RMCQlo
YXNoX2N0bDsKCglpZiAoaW5pdGVkKQoJCXJldHVybjsKCgkvKgoJICogU3VwcG9ydCBsb2Nh
bGl6ZWQgbWVzc2FnZXMuCgkgKi8KCXBnX2JpbmR0ZXh0ZG9tYWluKFRFWFRET01BSU4pOwoK
CS8qCgkgKiBJbml0aWFsaXplIHBscGVybCdzIEdVQ3MuCgkgKi8KCURlZmluZUN1c3RvbUJv
b2xWYXJpYWJsZSgicGxwZXJsLnVzZV9zdHJpY3QiLAoJCQkJCQkJIGdldHRleHRfbm9vcCgi
SWYgdHJ1ZSwgdHJ1c3RlZCBhbmQgdW50cnVzdGVkIFBlcmwgY29kZSB3aWxsIGJlIGNvbXBp
bGVkIGluIHN0cmljdCBtb2RlLiIpLAoJCQkJCQkJIE5VTEwsCgkJCQkJCQkgJnBscGVybF91
c2Vfc3RyaWN0LAoJCQkJCQkJIGZhbHNlLAoJCQkJCQkJIFBHQ19VU0VSU0VULCAwLAoJCQkJ
CQkJIE5VTEwsIE5VTEwsIE5VTEwpOwoKCS8qCgkgKiBwbHBlcmwub25faW5pdCBpcyBtYXJr
ZWQgUEdDX1NJR0hVUCB0byBzdXBwb3J0IHRoZSBpZGVhIHRoYXQgaXQgbWlnaHQKCSAqIGJl
IGV4ZWN1dGVkIGluIHRoZSBwb3N0bWFzdGVyIChpZiBwbHBlcmwgaXMgbG9hZGVkIGludG8g
dGhlIHBvc3RtYXN0ZXIKCSAqIHZpYSBzaGFyZWRfcHJlbG9hZF9saWJyYXJpZXMpLiAgVGhp
cyBpc24ndCByZWFsbHkgcmlnaHQgZWl0aGVyIHdheSwKCSAqIHRob3VnaC4KCSAqLwoJRGVm
aW5lQ3VzdG9tU3RyaW5nVmFyaWFibGUoInBscGVybC5vbl9pbml0IiwKCQkJCQkJCSAgIGdl
dHRleHRfbm9vcCgiUGVybCBpbml0aWFsaXphdGlvbiBjb2RlIHRvIGV4ZWN1dGUgd2hlbiBh
IFBlcmwgaW50ZXJwcmV0ZXIgaXMgaW5pdGlhbGl6ZWQuIiksCgkJCQkJCQkgICBOVUxMLAoJ
CQkJCQkJICAgJnBscGVybF9vbl9pbml0LAoJCQkJCQkJICAgTlVMTCwKCQkJCQkJCSAgIFBH
Q19TSUdIVVAsIDAsCgkJCQkJCQkgICBOVUxMLCBOVUxMLCBOVUxMKTsKCgkvKgoJICogcGxw
ZXJsLm9uX3BscGVybF9pbml0IGlzIG1hcmtlZCBQR0NfU1VTRVQgdG8gYXZvaWQgaXNzdWVz
IHdoZXJlYnkgYQoJICogdXNlciB3aG8gbWlnaHQgbm90IGV2ZW4gaGF2ZSBVU0FHRSBwcml2
aWxlZ2Ugb24gdGhlIHBscGVybCBsYW5ndWFnZQoJICogY291bGQgbm9uZXRoZWxlc3MgdXNl
IFNFVCBwbHBlcmwub25fcGxwZXJsX2luaXQ9Jy4uLicgdG8gaW5mbHVlbmNlIHRoZQoJICog
YmVoYXZpb3VyIG9mIGFueSBleGlzdGluZyBwbHBlcmwgZnVuY3Rpb24gdGhhdCB0aGV5IGNh
biBleGVjdXRlICh3aGljaAoJICogbWlnaHQgYmUgU0VDVVJJVFkgREVGSU5FUiwgbGVhZGlu
ZyB0byBhIHByaXZpbGVnZSBlc2NhbGF0aW9uKS4gIFNlZQoJICogaHR0cDovL2FyY2hpdmVz
LnBvc3RncmVzcWwub3JnL3Bnc3FsLWhhY2tlcnMvMjAxMC0wMi9tc2cwMDI4MS5waHAgYW5k
CgkgKiB0aGUgb3ZlcmFsbCB0aHJlYWQuCgkgKgoJICogTm90ZSB0aGF0IGJlY2F1c2UgcGxw
ZXJsLnVzZV9zdHJpY3QgaXMgVVNFUlNFVCwgYSBuZWZhcmlvdXMgdXNlciBjb3VsZAoJICog
c2V0IGl0IHRvIGJlIGFwcGxpZWQgYWdhaW5zdCBvdGhlciBwZW9wbGUncyBmdW5jdGlvbnMu
ICBUaGlzIGlzIGp1ZGdlZAoJICogT0sgc2luY2UgdGhlIHdvcnN0IHJlc3VsdCB3b3VsZCBi
ZSBhbiBlcnJvci4gIFlvdXIgY29kZSBvdWdodGEgcGFzcwoJICogdXNlX3N0cmljdCBhbnl3
YXkgOy0pCgkgKi8KCURlZmluZUN1c3RvbVN0cmluZ1ZhcmlhYmxlKCJwbHBlcmwub25fcGxw
ZXJsX2luaXQiLAoJCQkJCQkJICAgZ2V0dGV4dF9ub29wKCJQZXJsIGluaXRpYWxpemF0aW9u
IGNvZGUgdG8gZXhlY3V0ZSBvbmNlIHdoZW4gcGxwZXJsIGlzIGZpcnN0IHVzZWQuIiksCgkJ
CQkJCQkgICBOVUxMLAoJCQkJCQkJICAgJnBscGVybF9vbl9wbHBlcmxfaW5pdCwKCQkJCQkJ
CSAgIE5VTEwsCgkJCQkJCQkgICBQR0NfU1VTRVQsIDAsCgkJCQkJCQkgICBOVUxMLCBOVUxM
LCBOVUxMKTsKCglEZWZpbmVDdXN0b21TdHJpbmdWYXJpYWJsZSgicGxwZXJsLm9uX3BscGVy
bHVfaW5pdCIsCgkJCQkJCQkgICBnZXR0ZXh0X25vb3AoIlBlcmwgaW5pdGlhbGl6YXRpb24g
Y29kZSB0byBleGVjdXRlIG9uY2Ugd2hlbiBwbHBlcmx1IGlzIGZpcnN0IHVzZWQuIiksCgkJ
CQkJCQkgICBOVUxMLAoJCQkJCQkJICAgJnBscGVybF9vbl9wbHBlcmx1X2luaXQsCgkJCQkJ
CQkgICBOVUxMLAoJCQkJCQkJICAgUEdDX1NVU0VULCAwLAoJCQkJCQkJICAgTlVMTCwgTlVM
TCwgTlVMTCk7CgoJRW1pdFdhcm5pbmdzT25QbGFjZWhvbGRlcnMoInBscGVybCIpOwoKCS8q
CgkgKiBDcmVhdGUgaGFzaCB0YWJsZXMuCgkgKi8KCW1lbXNldCgmaGFzaF9jdGwsIDAsIHNp
emVvZihoYXNoX2N0bCkpOwoJaGFzaF9jdGwua2V5c2l6ZSA9IHNpemVvZihPaWQpOwoJaGFz
aF9jdGwuZW50cnlzaXplID0gc2l6ZW9mKHBscGVybF9pbnRlcnBfZGVzYyk7CglwbHBlcmxf
aW50ZXJwX2hhc2ggPSBoYXNoX2NyZWF0ZSgiUEwvUGVybCBpbnRlcnByZXRlcnMiLAoJCQkJ
CQkJCQkgOCwKCQkJCQkJCQkJICZoYXNoX2N0bCwKCQkJCQkJCQkJIEhBU0hfRUxFTSB8IEhB
U0hfQkxPQlMpOwoKCW1lbXNldCgmaGFzaF9jdGwsIDAsIHNpemVvZihoYXNoX2N0bCkpOwoJ
aGFzaF9jdGwua2V5c2l6ZSA9IHNpemVvZihwbHBlcmxfcHJvY19rZXkpOwoJaGFzaF9jdGwu
ZW50cnlzaXplID0gc2l6ZW9mKHBscGVybF9wcm9jX3B0cik7CglwbHBlcmxfcHJvY19oYXNo
ID0gaGFzaF9jcmVhdGUoIlBML1BlcmwgcHJvY2VkdXJlcyIsCgkJCQkJCQkJICAgMzIsCgkJ
CQkJCQkJICAgJmhhc2hfY3RsLAoJCQkJCQkJCSAgIEhBU0hfRUxFTSB8IEhBU0hfQkxPQlMp
OwoKCS8qCgkgKiBTYXZlIHRoZSBkZWZhdWx0IG9wbWFzay4KCSAqLwoJUExQRVJMX1NFVF9P
UE1BU0socGxwZXJsX29wbWFzayk7CgoJLyoKCSAqIENyZWF0ZSB0aGUgZmlyc3QgUGVybCBp
bnRlcnByZXRlciwgYnV0IG9ubHkgcGFydGlhbGx5IGluaXRpYWxpemUgaXQuCgkgKi8KCXBs
cGVybF9oZWxkX2ludGVycCA9IHBscGVybF9pbml0X2ludGVycCgpOwoKCWluaXRlZCA9IHRy
dWU7Cn0KCgpzdGF0aWMgdm9pZApzZXRfaW50ZXJwX3JlcXVpcmUoYm9vbCB0cnVzdGVkKQp7
CglpZiAodHJ1c3RlZCkKCXsKCQlQTF9wcGFkZHJbT1BfUkVRVUlSRV0gPSBwcF9yZXF1aXJl
X3NhZmU7CgkJUExfcHBhZGRyW09QX0RPRklMRV0gPSBwcF9yZXF1aXJlX3NhZmU7Cgl9Cgll
bHNlCgl7CgkJUExfcHBhZGRyW09QX1JFUVVJUkVdID0gcHBfcmVxdWlyZV9vcmlnOwoJCVBM
X3BwYWRkcltPUF9ET0ZJTEVdID0gcHBfcmVxdWlyZV9vcmlnOwoJfQp9CgovKgogKiBDbGVh
bnVwIHBlcmwgaW50ZXJwcmV0ZXJzLCBpbmNsdWRpbmcgcnVubmluZyBFTkQgYmxvY2tzLgog
KiBEb2VzIG5vdCBmdWxseSB1bmRvIHRoZSBhY3Rpb25zIG9mIF9QR19pbml0KCkgbm9yIG1h
a2UgaXQgY2FsbGFibGUgYWdhaW4uCiAqLwpzdGF0aWMgdm9pZApwbHBlcmxfZmluaShpbnQg
Y29kZSwgRGF0dW0gYXJnKQp7CglIQVNIX1NFUV9TVEFUVVMgaGFzaF9zZXE7CglwbHBlcmxf
aW50ZXJwX2Rlc2MgKmludGVycF9kZXNjOwoKCWVsb2coREVCVUczLCAicGxwZXJsX2Zpbmki
KTsKCgkvKgoJICogSW5kaWNhdGUgdGhhdCBwZXJsIGlzIHRlcm1pbmF0aW5nLiBEaXNhYmxl
cyB1c2Ugb2Ygc3BpXyogZnVuY3Rpb25zIHdoZW4KCSAqIHJ1bm5pbmcgRU5EL0RFU1RST1kg
Y29kZS4gU2VlIGNoZWNrX3NwaV91c2FnZV9hbGxvd2VkKCkuIENvdWxkIGJlCgkgKiBlbmFi
bGVkIGluIGZ1dHVyZSwgd2l0aCBjYXJlLCB1c2luZyBhIHRyYW5zYWN0aW9uCgkgKiBodHRw
Oi8vYXJjaGl2ZXMucG9zdGdyZXNxbC5vcmcvcGdzcWwtaGFja2Vycy8yMDEwLTAxL21zZzAy
NzQzLnBocAoJICovCglwbHBlcmxfZW5kaW5nID0gdHJ1ZTsKCgkvKiBPbmx5IHBlcmZvcm0g
cGVybCBjbGVhbnVwIGlmIHdlJ3JlIGV4aXRpbmcgY2xlYW5seSAqLwoJaWYgKGNvZGUpCgl7
CgkJZWxvZyhERUJVRzMsICJwbHBlcmxfZmluaTogc2tpcHBlZCIpOwoJCXJldHVybjsKCX0K
CgkvKiBaYXAgdGhlICJoZWxkIiBpbnRlcnByZXRlciwgaWYgd2Ugc3RpbGwgaGF2ZSBpdCAq
LwoJcGxwZXJsX2Rlc3Ryb3lfaW50ZXJwKCZwbHBlcmxfaGVsZF9pbnRlcnApOwoKCS8qIFph
cCBhbnkgZnVsbHktaW5pdGlhbGl6ZWQgaW50ZXJwcmV0ZXJzICovCgloYXNoX3NlcV9pbml0
KCZoYXNoX3NlcSwgcGxwZXJsX2ludGVycF9oYXNoKTsKCXdoaWxlICgoaW50ZXJwX2Rlc2Mg
PSBoYXNoX3NlcV9zZWFyY2goJmhhc2hfc2VxKSkgIT0gTlVMTCkKCXsKCQlpZiAoaW50ZXJw
X2Rlc2MtPmludGVycCkKCQl7CgkJCWFjdGl2YXRlX2ludGVycHJldGVyKGludGVycF9kZXNj
KTsKCQkJcGxwZXJsX2Rlc3Ryb3lfaW50ZXJwKCZpbnRlcnBfZGVzYy0+aW50ZXJwKTsKCQl9
Cgl9CgoJZWxvZyhERUJVRzMsICJwbHBlcmxfZmluaTogZG9uZSIpOwp9CgoKLyoKICogU2Vs
ZWN0IGFuZCBhY3RpdmF0ZSBhbiBhcHByb3ByaWF0ZSBQZXJsIGludGVycHJldGVyLgogKi8K
c3RhdGljIHZvaWQKc2VsZWN0X3BlcmxfY29udGV4dChib29sIHRydXN0ZWQpCnsKCU9pZAkJ
CXVzZXJfaWQ7CglwbHBlcmxfaW50ZXJwX2Rlc2MgKmludGVycF9kZXNjOwoJYm9vbAkJZm91
bmQ7CglQZXJsSW50ZXJwcmV0ZXIgKmludGVycCA9IE5VTEw7CgoJLyogRmluZCBvciBjcmVh
dGUgdGhlIGludGVycHJldGVyIGhhc2h0YWJsZSBlbnRyeSBmb3IgdGhpcyB1c2VyaWQgKi8K
CWlmICh0cnVzdGVkKQoJCXVzZXJfaWQgPSBHZXRVc2VySWQoKTsKCWVsc2UKCQl1c2VyX2lk
ID0gSW52YWxpZE9pZDsKCglpbnRlcnBfZGVzYyA9IGhhc2hfc2VhcmNoKHBscGVybF9pbnRl
cnBfaGFzaCwgJnVzZXJfaWQsCgkJCQkJCQkgIEhBU0hfRU5URVIsCgkJCQkJCQkgICZmb3Vu
ZCk7CglpZiAoIWZvdW5kKQoJewoJCS8qIEluaXRpYWxpemUgbmV3bHktY3JlYXRlZCBoYXNo
dGFibGUgZW50cnkgKi8KCQlpbnRlcnBfZGVzYy0+aW50ZXJwID0gTlVMTDsKCQlpbnRlcnBf
ZGVzYy0+cXVlcnlfaGFzaCA9IE5VTEw7Cgl9CgoJLyogTWFrZSBzdXJlIHdlIGhhdmUgYSBx
dWVyeV9oYXNoIGZvciB0aGlzIGludGVycHJldGVyICovCglpZiAoaW50ZXJwX2Rlc2MtPnF1
ZXJ5X2hhc2ggPT0gTlVMTCkKCXsKCQlIQVNIQ1RMCQloYXNoX2N0bDsKCgkJbWVtc2V0KCZo
YXNoX2N0bCwgMCwgc2l6ZW9mKGhhc2hfY3RsKSk7CgkJaGFzaF9jdGwua2V5c2l6ZSA9IE5B
TUVEQVRBTEVOOwoJCWhhc2hfY3RsLmVudHJ5c2l6ZSA9IHNpemVvZihwbHBlcmxfcXVlcnlf
ZW50cnkpOwoJCWludGVycF9kZXNjLT5xdWVyeV9oYXNoID0gaGFzaF9jcmVhdGUoIlBML1Bl
cmwgcXVlcmllcyIsCgkJCQkJCQkJCQkJICAzMiwKCQkJCQkJCQkJCQkgICZoYXNoX2N0bCwK
CQkJCQkJCQkJCQkgIEhBU0hfRUxFTSk7Cgl9CgoJLyoKCSAqIFF1aWNrIGV4aXQgaWYgYWxy
ZWFkeSBoYXZlIGFuIGludGVycHJldGVyCgkgKi8KCWlmIChpbnRlcnBfZGVzYy0+aW50ZXJw
KQoJewoJCWFjdGl2YXRlX2ludGVycHJldGVyKGludGVycF9kZXNjKTsKCQlyZXR1cm47Cgl9
CgoJLyoKCSAqIGFkb3B0IGhlbGQgaW50ZXJwIGlmIGZyZWUsIGVsc2UgY3JlYXRlIG5ldyBv
bmUgaWYgcG9zc2libGUKCSAqLwoJaWYgKHBscGVybF9oZWxkX2ludGVycCAhPSBOVUxMKQoJ
ewoJCS8qIGZpcnN0IGFjdHVhbCB1c2Ugb2YgYSBwZXJsIGludGVycHJldGVyICovCgkJaW50
ZXJwID0gcGxwZXJsX2hlbGRfaW50ZXJwOwoKCQkvKgoJCSAqIFJlc2V0IHRoZSBwbHBlcmxf
aGVsZF9pbnRlcnAgcG9pbnRlciBmaXJzdDsgaWYgd2UgZmFpbCBkdXJpbmcgaW5pdAoJCSAq
IHdlIGRvbid0IHdhbnQgdG8gdHJ5IGFnYWluIHdpdGggdGhlIHBhcnRpYWxseS1pbml0aWFs
aXplZCBpbnRlcnAuCgkJICovCgkJcGxwZXJsX2hlbGRfaW50ZXJwID0gTlVMTDsKCgkJaWYg
KHRydXN0ZWQpCgkJCXBscGVybF90cnVzdGVkX2luaXQoKTsKCQllbHNlCgkJCXBscGVybF91
bnRydXN0ZWRfaW5pdCgpOwoKCQkvKiBzdWNjZXNzZnVsbHkgaW5pdGlhbGl6ZWQsIHNvIGFy
cmFuZ2UgZm9yIGNsZWFudXAgKi8KCQlvbl9wcm9jX2V4aXQocGxwZXJsX2ZpbmksIDApOwoJ
fQoJZWxzZQoJewojaWZkZWYgTVVMVElQTElDSVRZCgoJCS8qCgkJICogcGxwZXJsX2luaXRf
aW50ZXJwIHdpbGwgY2hhbmdlIFBlcmwncyBpZGVhIG9mIHRoZSBhY3RpdmUKCQkgKiBpbnRl
cnByZXRlci4gIFJlc2V0IHBscGVybF9hY3RpdmVfaW50ZXJwIHRlbXBvcmFyaWx5LCBzbyB0
aGF0IGlmIHdlCgkJICogaGl0IGFuIGVycm9yIHBhcnR3YXkgdGhyb3VnaCBoZXJlLCB3ZSds
bCBtYWtlIHN1cmUgdG8gc3dpdGNoIGJhY2sKCQkgKiB0byBhIG5vbi1icm9rZW4gaW50ZXJw
cmV0ZXIgYmVmb3JlIHJ1bm5pbmcgYW55IG90aGVyIFBlcmwKCQkgKiBmdW5jdGlvbnMuCgkJ
ICovCgkJcGxwZXJsX2FjdGl2ZV9pbnRlcnAgPSBOVUxMOwoKCQkvKiBOb3cgYnVpbGQgdGhl
IG5ldyBpbnRlcnByZXRlciAqLwoJCWludGVycCA9IHBscGVybF9pbml0X2ludGVycCgpOwoK
CQlpZiAodHJ1c3RlZCkKCQkJcGxwZXJsX3RydXN0ZWRfaW5pdCgpOwoJCWVsc2UKCQkJcGxw
ZXJsX3VudHJ1c3RlZF9pbml0KCk7CiNlbHNlCgkJZXJlcG9ydChFUlJPUiwKCQkJCShlcnJj
b2RlKEVSUkNPREVfRkVBVFVSRV9OT1RfU1VQUE9SVEVEKSwKCQkJCSBlcnJtc2coImNhbm5v
dCBhbGxvY2F0ZSBtdWx0aXBsZSBQZXJsIGludGVycHJldGVycyBvbiB0aGlzIHBsYXRmb3Jt
IikpKTsKI2VuZGlmCgl9CgoJc2V0X2ludGVycF9yZXF1aXJlKHRydXN0ZWQpOwoKCS8qCgkg
KiBTaW5jZSB0aGUgdGltaW5nIG9mIGZpcnN0IHVzZSBvZiBQTC9QZXJsIGNhbid0IGJlIHBy
ZWRpY3RlZCwgYW55CgkgKiBkYXRhYmFzZSBpbnRlcmFjdGlvbiBkdXJpbmcgaW5pdGlhbGl6
YXRpb24gaXMgcHJvYmxlbWF0aWMuIEluY2x1ZGluZywKCSAqIGJ1dCBub3QgbGltaXRlZCB0
bywgc2VjdXJpdHkgZGVmaW5lciBpc3N1ZXMuIFNvIHdlIG9ubHkgZW5hYmxlIGFjY2VzcwoJ
ICogdG8gdGhlIGRhdGFiYXNlIEFGVEVSIG9uXypfaW5pdCBjb2RlIGhhcyBydW4uIFNlZQoJ
ICogaHR0cDovL2FyY2hpdmVzLnBvc3RncmVzcWwub3JnL3Bnc3FsLWhhY2tlcnMvMjAxMC0w
MS9tc2cwMjY2OS5waHAKCSAqLwoJewoJCWRUSFg7CgoJCW5ld1hTKCJQb3N0Z3JlU1FMOjpJ
blNlcnZlcjo6U1BJOjpib290c3RyYXAiLAoJCQkgIGJvb3RfUG9zdGdyZVNRTF9fSW5TZXJ2
ZXJfX1NQSSwgX19GSUxFX18pOwoKCQlldmFsX3B2KCJQb3N0Z3JlU1FMOjpJblNlcnZlcjo6
U1BJOjpib290c3RyYXAoKSIsIEZBTFNFKTsKCQlpZiAoU3ZUUlVFKEVSUlNWKSkKCQkJZXJl
cG9ydChFUlJPUiwKCQkJCQkoZXJyY29kZShFUlJDT0RFX0VYVEVSTkFMX1JPVVRJTkVfRVhD
RVBUSU9OKSwKCQkJCQkgZXJybXNnKCIlcyIsIHN0cmlwX3RyYWlsaW5nX3dzKHN2MmNzdHIo
RVJSU1YpKSksCgkJCQkJIGVycmNvbnRleHQoIndoaWxlIGV4ZWN1dGluZyBQb3N0Z3JlU1FM
OjpJblNlcnZlcjo6U1BJOjpib290c3RyYXAiKSkpOwoJfQoKCS8qIEZ1bGx5IGluaXRpYWxp
emVkLCBzbyBtYXJrIHRoZSBoYXNodGFibGUgZW50cnkgdmFsaWQgKi8KCWludGVycF9kZXNj
LT5pbnRlcnAgPSBpbnRlcnA7CgoJLyogQW5kIG1hcmsgdGhpcyBhcyB0aGUgYWN0aXZlIGlu
dGVycHJldGVyICovCglwbHBlcmxfYWN0aXZlX2ludGVycCA9IGludGVycF9kZXNjOwp9Cgov
KgogKiBNYWtlIHRoZSBzcGVjaWZpZWQgaW50ZXJwcmV0ZXIgdGhlIGFjdGl2ZSBvbmUKICoK
ICogQSBjYWxsIHdpdGggTlVMTCBkb2VzIG5vdGhpbmcuICBUaGlzIGlzIHNvIHRoYXQgInJl
c3RvcmluZyIgdG8gYSBwcmV2aW91c2x5CiAqIG51bGwgc3RhdGUgb2YgcGxwZXJsX2FjdGl2
ZV9pbnRlcnAgZG9lc24ndCByZXN1bHQgaW4gdXNlbGVzcyB0aHJhc2hpbmcuCiAqLwpzdGF0
aWMgdm9pZAphY3RpdmF0ZV9pbnRlcnByZXRlcihwbHBlcmxfaW50ZXJwX2Rlc2MgKmludGVy
cF9kZXNjKQp7CglpZiAoaW50ZXJwX2Rlc2MgJiYgcGxwZXJsX2FjdGl2ZV9pbnRlcnAgIT0g
aW50ZXJwX2Rlc2MpCgl7CgkJQXNzZXJ0KGludGVycF9kZXNjLT5pbnRlcnApOwoJCVBFUkxf
U0VUX0NPTlRFWFQoaW50ZXJwX2Rlc2MtPmludGVycCk7CgkJLyogdHJ1c3RlZCBpZmYgdXNl
cl9pZCBpc24ndCBJbnZhbGlkT2lkICovCgkJc2V0X2ludGVycF9yZXF1aXJlKE9pZElzVmFs
aWQoaW50ZXJwX2Rlc2MtPnVzZXJfaWQpKTsKCQlwbHBlcmxfYWN0aXZlX2ludGVycCA9IGlu
dGVycF9kZXNjOwoJfQp9CgovKgogKiBDcmVhdGUgYSBuZXcgUGVybCBpbnRlcnByZXRlci4K
ICoKICogV2UgaW5pdGlhbGl6ZSB0aGUgaW50ZXJwcmV0ZXIgYXMgZmFyIGFzIHdlIGNhbiB3
aXRob3V0IGtub3dpbmcgd2hldGhlcgogKiBpdCB3aWxsIGJlY29tZSBhIHRydXN0ZWQgb3Ig
dW50cnVzdGVkIGludGVycHJldGVyOyBpbiBwYXJ0aWN1bGFyLCB0aGUKICogcGxwZXJsLm9u
X2luaXQgY29kZSB3aWxsIGdldCBleGVjdXRlZC4gIExhdGVyLCBlaXRoZXIgcGxwZXJsX3Ry
dXN0ZWRfaW5pdAogKiBvciBwbHBlcmxfdW50cnVzdGVkX2luaXQgbXVzdCBiZSBjYWxsZWQg
dG8gY29tcGxldGUgdGhlIGluaXRpYWxpemF0aW9uLgogKi8Kc3RhdGljIFBlcmxJbnRlcnBy
ZXRlciAqCnBscGVybF9pbml0X2ludGVycCh2b2lkKQp7CglQZXJsSW50ZXJwcmV0ZXIgKnBs
cGVybDsKCglzdGF0aWMgY2hhciAqZW1iZWRkaW5nWzMgKyAyXSA9IHsKCQkiIiwgIi1lIiwg
UExDX1BFUkxCT09UCgl9OwoJaW50CQkJbmFyZ3MgPSAzOwoKI2lmZGVmIFdJTjMyCgoJLyoK
CSAqIFRoZSBwZXJsIGxpYnJhcnkgb24gc3RhcnR1cCBkb2VzIGhvcnJpYmxlIHRoaW5ncyBs
aWtlIGNhbGwKCSAqIHNldGxvY2FsZShMQ19BTEwsIiIpLiBXZSBoYXZlIHByb3RlY3RlZCBh
Z2FpbnN0IHRoYXQgb24gbW9zdCBwbGF0Zm9ybXMKCSAqIGJ5IHNldHRpbmcgdGhlIGVudmly
b25tZW50IGFwcHJvcHJpYXRlbHkuIEhvd2V2ZXIsIG9uIFdpbmRvd3MsCgkgKiBzZXRsb2Nh
bGUoKSBkb2VzIG5vdCBjb25zdWx0IHRoZSBlbnZpcm9ubWVudCwgc28gd2UgbmVlZCB0byBz
YXZlIHRoZQoJICogZXhpc3RpbmcgbG9jYWxlIHNldHRpbmdzIGJlZm9yZSBwZXJsIGhhcyBh
IGNoYW5jZSB0byBtYW5nbGUgdGhlbSBhbmQKCSAqIHJlc3RvcmUgdGhlbSBhZnRlciBpdHMg
ZGlydHkgZGVlZHMgYXJlIGRvbmUuCgkgKgoJICogTVNETiByZWY6CgkgKiBodHRwOi8vbXNk
bi5taWNyb3NvZnQuY29tL2xpYnJhcnkvZW4tdXMvdmNsaWIvaHRtbC9fY3J0X2xvY2FsZS5h
c3AKCSAqCgkgKiBJdCBhcHBlYXJzIHRoYXQgd2Ugb25seSBuZWVkIHRvIGRvIHRoaXMgb24g
aW50ZXJwcmV0ZXIgc3RhcnR1cCwgYW5kCgkgKiBzdWJzZXF1ZW50IGNhbGxzIHRvIHRoZSBp
bnRlcnByZXRlciBkb24ndCBtZXNzIHdpdGggdGhlIGxvY2FsZQoJICogc2V0dGluZ3MuCgkg
KgoJICogV2UgcmVzdG9yZSB0aGVtIHVzaW5nIHNldGxvY2FsZV9wZXJsKCksIGRlZmluZWQg
YmVsb3csIHNvIHRoYXQgUGVybAoJICogZG9lc24ndCBoYXZlIGEgZGlmZmVyZW50IGlkZWEg
b2YgdGhlIGxvY2FsZSBmcm9tIFBvc3RncmVzLgoJICoKCSAqLwoKCWNoYXIJICAgKmxvYzsK
CWNoYXIJICAgKnNhdmVfY29sbGF0ZSwKCQkJICAgKnNhdmVfY3R5cGUsCgkJCSAgICpzYXZl
X21vbmV0YXJ5LAoJCQkgICAqc2F2ZV9udW1lcmljLAoJCQkgICAqc2F2ZV90aW1lOwoKCWxv
YyA9IHNldGxvY2FsZShMQ19DT0xMQVRFLCBOVUxMKTsKCXNhdmVfY29sbGF0ZSA9IGxvYyA/
IHBzdHJkdXAobG9jKSA6IE5VTEw7Cglsb2MgPSBzZXRsb2NhbGUoTENfQ1RZUEUsIE5VTEwp
OwoJc2F2ZV9jdHlwZSA9IGxvYyA/IHBzdHJkdXAobG9jKSA6IE5VTEw7Cglsb2MgPSBzZXRs
b2NhbGUoTENfTU9ORVRBUlksIE5VTEwpOwoJc2F2ZV9tb25ldGFyeSA9IGxvYyA/IHBzdHJk
dXAobG9jKSA6IE5VTEw7Cglsb2MgPSBzZXRsb2NhbGUoTENfTlVNRVJJQywgTlVMTCk7Cglz
YXZlX251bWVyaWMgPSBsb2MgPyBwc3RyZHVwKGxvYykgOiBOVUxMOwoJbG9jID0gc2V0bG9j
YWxlKExDX1RJTUUsIE5VTEwpOwoJc2F2ZV90aW1lID0gbG9jID8gcHN0cmR1cChsb2MpIDog
TlVMTDsKCiNkZWZpbmUgUExQRVJMX1JFU1RPUkVfTE9DQUxFKG5hbWUsIHNhdmVkKSBcCglT
VE1UX1NUQVJUIHsgXAoJCWlmIChzYXZlZCAhPSBOVUxMKSB7IHNldGxvY2FsZV9wZXJsKG5h
bWUsIHNhdmVkKTsgcGZyZWUoc2F2ZWQpOyB9IFwKCX0gU1RNVF9FTkQKI2VuZGlmCQkJCQkJ
CS8qIFdJTjMyICovCgoJaWYgKHBscGVybF9vbl9pbml0ICYmICpwbHBlcmxfb25faW5pdCkK
CXsKCQllbWJlZGRpbmdbbmFyZ3MrK10gPSAiLWUiOwoJCWVtYmVkZGluZ1tuYXJncysrXSA9
IHBscGVybF9vbl9pbml0OwoJfQoKCS8qCgkgKiBUaGUgcGVybCBBUEkgZG9jcyBzdGF0ZSB0
aGF0IFBFUkxfU1lTX0lOSVQzIHNob3VsZCBiZSBjYWxsZWQgYmVmb3JlCgkgKiBhbGxvY2F0
aW5nIGludGVycHJldGVycy4gVW5mb3J0dW5hdGVseSwgb24gc29tZSBwbGF0Zm9ybXMgdGhp
cyBmYWlscyBpbgoJICogdGhlIFBlcmxfZG9fdGFpbnQoKSByb3V0aW5lLCB3aGljaCBpcyBj
YWxsZWQgd2hlbiB0aGUgcGxhdGZvcm0gaXMgdXNpbmcKCSAqIHRoZSBzeXN0ZW0ncyBtYWxs
b2MoKSBpbnN0ZWFkIG9mIHBlcmwncyBvd24uIE90aGVyIHBsYXRmb3Jtcywgbm90YWJseQoJ
ICogV2luZG93cywgZmFpbCBpZiBQRVJMX1NZU19JTklUMyBpcyBub3QgY2FsbGVkLiBTbyB3
ZSBjYWxsIGl0IGlmIGl0J3MKCSAqIGF2YWlsYWJsZSwgdW5sZXNzIHBlcmwgaXMgdXNpbmcg
dGhlIHN5c3RlbSBtYWxsb2MoKSwgd2hpY2ggaXMgdHJ1ZSB3aGVuCgkgKiBNWU1BTExPQyBp
cyBzZXQuCgkgKi8KI2lmIGRlZmluZWQoUEVSTF9TWVNfSU5JVDMpICYmICFkZWZpbmVkKE1Z
TUFMTE9DKQoJewoJCXN0YXRpYyBpbnQJcGVybF9zeXNfaW5pdF9kb25lOwoKCQkvKiBvbmx5
IGNhbGwgdGhpcyB0aGUgZmlyc3QgdGltZSB0aHJvdWdoLCBhcyBwZXIgcGVybGVtYmVkIG1h
biBwYWdlICovCgkJaWYgKCFwZXJsX3N5c19pbml0X2RvbmUpCgkJewoJCQljaGFyCSAgICpk
dW1teV9lbnZbMV0gPSB7TlVMTH07CgoJCQlQRVJMX1NZU19JTklUMygmbmFyZ3MsIChjaGFy
ICoqKikgJmVtYmVkZGluZywgKGNoYXIgKioqKSAmZHVtbXlfZW52KTsKCgkJCS8qCgkJCSAq
IEZvciB1bmNsZWFyIHJlYXNvbnMsIFBFUkxfU1lTX0lOSVQzIHNldHMgdGhlIFNJR0ZQRSBo
YW5kbGVyIHRvCgkJCSAqIFNJR19JR04uICBBc2lkZSBmcm9tIGJlaW5nIGV4dHJlbWVseSB1
bmZyaWVuZGx5IGJlaGF2aW9yIGZvciBhCgkJCSAqIGxpYnJhcnksIHRoaXMgaXMgZHVtYiBv
biB0aGUgZ3JvdW5kcyB0aGF0IHRoZSByZXN1bHRzIG9mIGEKCQkJICogU0lHRlBFIGluIHRo
aXMgc3RhdGUgYXJlIHVuZGVmaW5lZCBhY2NvcmRpbmcgdG8gUE9TSVgsIGFuZCBpbgoJCQkg
KiBmYWN0IHlvdSBnZXQgYSBmb3JjZWQgcHJvY2VzcyBraWxsIGF0IGxlYXN0IG9uIExpbnV4
LiAgSGVuY2UsCgkJCSAqIHJlc3RvcmUgdGhlIFNJR0ZQRSBoYW5kbGVyIHRvIHRoZSBiYWNr
ZW5kJ3Mgc3RhbmRhcmQgc2V0dGluZy4KCQkJICogKFNlZSBQZXJsIGJ1ZyAxMTQ1NzQgZm9y
IG1vcmUgaW5mb3JtYXRpb24uKQoJCQkgKi8KCQkJcHFzaWduYWwoU0lHRlBFLCBGbG9hdEV4
Y2VwdGlvbkhhbmRsZXIpOwoKCQkJcGVybF9zeXNfaW5pdF9kb25lID0gMTsKCQkJLyogcXVp
ZXQgd2FybmluZyBpZiBQRVJMX1NZU19JTklUMyBkb2Vzbid0IHVzZSB0aGUgdGhpcmQgYXJn
dW1lbnQgKi8KCQkJZHVtbXlfZW52WzBdID0gTlVMTDsKCQl9Cgl9CiNlbmRpZgoKCXBscGVy
bCA9IHBlcmxfYWxsb2MoKTsKCWlmICghcGxwZXJsKQoJCWVsb2coRVJST1IsICJjb3VsZCBu
b3QgYWxsb2NhdGUgUGVybCBpbnRlcnByZXRlciIpOwoKCVBFUkxfU0VUX0NPTlRFWFQocGxw
ZXJsKTsKCXBlcmxfY29uc3RydWN0KHBscGVybCk7CgoJLyoKCSAqIFJ1biBFTkQgYmxvY2tz
IGluIHBlcmxfZGVzdHJ1Y3QgaW5zdGVhZCBvZiBwZXJsX3J1bi4gIE5vdGUgdGhhdCBkVEhY
CgkgKiBsb2FkcyB1cCBhIHBvaW50ZXIgdG8gdGhlIGN1cnJlbnQgaW50ZXJwcmV0ZXIsIHNv
IHdlIGhhdmUgdG8gcG9zdHBvbmUKCSAqIGl0IHRvIGhlcmUgcmF0aGVyIHRoYW4gcHV0IGl0
IGF0IHRoZSBmdW5jdGlvbiBoZWFkLgoJICovCgl7CgkJZFRIWDsKCgkJUExfZXhpdF9mbGFn
cyB8PSBQRVJMX0VYSVRfREVTVFJVQ1RfRU5EOwoKCQkvKgoJCSAqIFJlY29yZCB0aGUgb3Jp
Z2luYWwgZnVuY3Rpb24gZm9yIHRoZSAncmVxdWlyZScgYW5kICdkb2ZpbGUnCgkJICogb3Bj
b2Rlcy4gIChUaGV5IHNoYXJlIHRoZSBzYW1lIGltcGxlbWVudGF0aW9uLikgIEVuc3VyZSBp
dCdzIHVzZWQKCQkgKiBmb3IgbmV3IGludGVycHJldGVycy4KCQkgKi8KCQlpZiAoIXBwX3Jl
cXVpcmVfb3JpZykKCQkJcHBfcmVxdWlyZV9vcmlnID0gUExfcHBhZGRyW09QX1JFUVVJUkVd
OwoJCWVsc2UKCQl7CgkJCVBMX3BwYWRkcltPUF9SRVFVSVJFXSA9IHBwX3JlcXVpcmVfb3Jp
ZzsKCQkJUExfcHBhZGRyW09QX0RPRklMRV0gPSBwcF9yZXF1aXJlX29yaWc7CgkJfQoKI2lm
ZGVmIFBMUEVSTF9FTkFCTEVfT1BNQVNLX0VBUkxZCgoJCS8qCgkJICogRm9yIHJlZ3Jlc3Np
b24gdGVzdGluZyB0byBwcm92ZSB0aGF0IHRoZSBQTENfUEVSTEJPT1QgYW5kCgkJICogUExD
X1RSVVNURUQgY29kZSBkb2Vzbid0IGV2ZW4gY29tcGlsZSBhbnkgdW5zYWZlIG9wcy4gIElu
IGZ1dHVyZQoJCSAqIHRoZXJlIG1heSBiZSBhIHZhbGlkIG5lZWQgZm9yIHRoZW0gdG8gZG8g
c28sIGluIHdoaWNoIGNhc2UgdGhpcwoJCSAqIGNvdWxkIGJlIHNvZnRlbmVkIChwZXJoYXBz
IG1vdmVkIHRvIHBscGVybF90cnVzdGVkX2luaXQoKSkgb3IKCQkgKiByZW1vdmVkLgoJCSAq
LwoJCVBMX29wX21hc2sgPSBwbHBlcmxfb3BtYXNrOwojZW5kaWYKCgkJaWYgKHBlcmxfcGFy
c2UocGxwZXJsLCBwbHBlcmxfaW5pdF9zaGFyZWRfbGlicywKCQkJCQkgICBuYXJncywgZW1i
ZWRkaW5nLCBOVUxMKSAhPSAwKQoJCQllcmVwb3J0KEVSUk9SLAoJCQkJCShlcnJjb2RlKEVS
UkNPREVfRVhURVJOQUxfUk9VVElORV9FWENFUFRJT04pLAoJCQkJCSBlcnJtc2coIiVzIiwg
c3RyaXBfdHJhaWxpbmdfd3Moc3YyY3N0cihFUlJTVikpKSwKCQkJCQkgZXJyY29udGV4dCgi
d2hpbGUgcGFyc2luZyBQZXJsIGluaXRpYWxpemF0aW9uIikpKTsKCgkJaWYgKHBlcmxfcnVu
KHBscGVybCkgIT0gMCkKCQkJZXJlcG9ydChFUlJPUiwKCQkJCQkoZXJyY29kZShFUlJDT0RF
X0VYVEVSTkFMX1JPVVRJTkVfRVhDRVBUSU9OKSwKCQkJCQkgZXJybXNnKCIlcyIsIHN0cmlw
X3RyYWlsaW5nX3dzKHN2MmNzdHIoRVJSU1YpKSksCgkJCQkJIGVycmNvbnRleHQoIndoaWxl
IHJ1bm5pbmcgUGVybCBpbml0aWFsaXphdGlvbiIpKSk7CgojaWZkZWYgUExQRVJMX1JFU1RP
UkVfTE9DQUxFCgkJUExQRVJMX1JFU1RPUkVfTE9DQUxFKExDX0NPTExBVEUsIHNhdmVfY29s
bGF0ZSk7CgkJUExQRVJMX1JFU1RPUkVfTE9DQUxFKExDX0NUWVBFLCBzYXZlX2N0eXBlKTsK
CQlQTFBFUkxfUkVTVE9SRV9MT0NBTEUoTENfTU9ORVRBUlksIHNhdmVfbW9uZXRhcnkpOwoJ
CVBMUEVSTF9SRVNUT1JFX0xPQ0FMRShMQ19OVU1FUklDLCBzYXZlX251bWVyaWMpOwoJCVBM
UEVSTF9SRVNUT1JFX0xPQ0FMRShMQ19USU1FLCBzYXZlX3RpbWUpOwojZW5kaWYKCX0KCgly
ZXR1cm4gcGxwZXJsOwp9CgoKLyoKICogT3VyIHNhZmUgaW1wbGVtZW50YXRpb24gb2YgdGhl
IHJlcXVpcmUgb3Bjb2RlLgogKiBUaGlzIGlzIHNhZmUgYmVjYXVzZSBpdCdzIGNvbXBsZXRl
bHkgdW5hYmxlIHRvIGxvYWQgYW55IGNvZGUuCiAqIElmIHRoZSByZXF1ZXN0ZWQgZmlsZS9t
b2R1bGUgaGFzIGFscmVhZHkgYmVlbiBsb2FkZWQgaXQnbGwgcmV0dXJuIHRydWUuCiAqIElm
IG5vdCwgaXQnbGwgZGllLgogKiBTbyBub3cgInVzZSBGb287IiB3aWxsIHdvcmsgaWZmIEZv
byBoYXMgYWxyZWFkeSBiZWVuIGxvYWRlZC4KICovCnN0YXRpYyBPUCAgKgpwcF9yZXF1aXJl
X3NhZmUocFRIWCkKewoJZFZBUjsKCWRTUDsKCVNWCQkgICAqc3YsCgkJCSAgKipzdnA7Cglj
aGFyCSAgICpuYW1lOwoJU1RSTEVOCQlsZW47CgoJc3YgPSBQT1BzOwoJbmFtZSA9IFN2UFYo
c3YsIGxlbik7CglpZiAoIShuYW1lICYmIGxlbiA+IDAgJiYgKm5hbWUpKQoJCVJFVFBVU0hO
TzsKCglzdnAgPSBodl9mZXRjaChHdkhWbihQTF9pbmNndiksIG5hbWUsIGxlbiwgMCk7Cglp
ZiAoc3ZwICYmICpzdnAgIT0gJlBMX3N2X3VuZGVmKQoJCVJFVFBVU0hZRVM7CgoJRElFKGFU
SFhfICJVbmFibGUgdG8gbG9hZCAlcyBpbnRvIHBscGVybCIsIG5hbWUpOwoKCS8qCgkgKiBJ
biBtb3N0IFBlcmwgdmVyc2lvbnMsIERJRSgpIGV4cGFuZHMgdG8gYSByZXR1cm4gc3RhdGVt
ZW50LCBzbyB0aGUgbmV4dAoJICogbGluZSBpcyBub3QgbmVjZXNzYXJ5LiAgQnV0IGluIHZl
cnNpb25zIGJldHdlZW4gYnV0IG5vdCBpbmNsdWRpbmcKCSAqIDUuMTEuMSBhbmQgNS4xMy4z
IGl0IGRvZXMgbm90LCBzbyB0aGUgbmV4dCBsaW5lIGlzIG5lY2Vzc2FyeSB0byBhdm9pZCBh
CgkgKiAiY29udHJvbCByZWFjaGVzIGVuZCBvZiBub24tdm9pZCBmdW5jdGlvbiIgd2Fybmlu
ZyBmcm9tIGdjYy4gIE90aGVyCgkgKiBjb21waWxlcnMgc3VjaCBhcyBTb2xhcmlzIFN0dWRp
byB3aWxsLCBob3dldmVyLCBpc3N1ZSBhICJzdGF0ZW1lbnQgbm90CgkgKiByZWFjaGVkIiB3
YXJuaW5nIGluc3RlYWQuCgkgKi8KCXJldHVybiBOVUxMOwp9CgoKLyoKICogRGVzdHJveSBv
bmUgUGVybCBpbnRlcnByZXRlciAuLi4gYWN0dWFsbHkgd2UganVzdCBydW4gRU5EIGJsb2Nr
cy4KICoKICogQ2FsbGVyIG11c3QgaGF2ZSBlbnN1cmVkIHRoaXMgaW50ZXJwcmV0ZXIgaXMg
dGhlIGFjdGl2ZSBvbmUuCiAqLwpzdGF0aWMgdm9pZApwbHBlcmxfZGVzdHJveV9pbnRlcnAo
UGVybEludGVycHJldGVyICoqaW50ZXJwKQp7CglpZiAoaW50ZXJwICYmICppbnRlcnApCgl7
CgkJLyoKCQkgKiBPbmx5IGEgdmVyeSBtaW5pbWFsIGRlc3RydWN0aW9uIGlzIHBlcmZvcm1l
ZDogLSBqdXN0IGNhbGwgRU5ECgkJICogYmxvY2tzLgoJCSAqCgkJICogV2UgY291bGQgY2Fs
bCBwZXJsX2Rlc3RydWN0KCkgYnV0IHdlJ2QgbmVlZCB0byBhdWRpdCBpdHMgYWN0aW9ucwoJ
CSAqIHZlcnkgY2FyZWZ1bGx5IGFuZCB3b3JrLWFyb3VuZCBhbnkgdGhhdCBpbXBhY3QgdXMu
IChDYWxsaW5nCgkJICogc3ZfY2xlYW5fb2JqcygpIGlzbid0IGFuIG9wdGlvbiBiZWNhdXNl
IGl0J3Mgbm90IHBhcnQgb2YgcGVybCdzCgkJICogcHVibGljIEFQSSBzbyBpc24ndCBwb3J0
YWJseSBhdmFpbGFibGUuKSBNZWFud2hpbGUgRU5EIGJsb2NrcyBjYW4KCQkgKiBiZSB1c2Vk
IHRvIHBlcmZvcm0gbWFudWFsIGNsZWFudXAuCgkJICovCgkJZFRIWDsKCgkJLyogUnVuIEVO
RCBibG9ja3MgLSBiYXNlZCBvbiBwZXJsJ3MgcGVybF9kZXN0cnVjdCgpICovCgkJaWYgKFBM
X2V4aXRfZmxhZ3MgJiBQRVJMX0VYSVRfREVTVFJVQ1RfRU5EKQoJCXsKCQkJZEpNUEVOVjsK
CQkJaW50CQkJeCA9IDA7CgoJCQlKTVBFTlZfUFVTSCh4KTsKCQkJUEVSTF9VTlVTRURfVkFS
KHgpOwoJCQlpZiAoUExfZW5kYXYgJiYgIVBMX21pbnVzX2MpCgkJCQljYWxsX2xpc3QoUExf
c2NvcGVzdGFja19peCwgUExfZW5kYXYpOwoJCQlKTVBFTlZfUE9QOwoJCX0KCQlMRUFWRTsK
CQlGUkVFVE1QUzsKCgkJKmludGVycCA9IE5VTEw7Cgl9Cn0KCi8qCiAqIEluaXRpYWxpemUg
dGhlIGN1cnJlbnQgUGVybCBpbnRlcnByZXRlciBhcyBhIHRydXN0ZWQgaW50ZXJwCiAqLwpz
dGF0aWMgdm9pZApwbHBlcmxfdHJ1c3RlZF9pbml0KHZvaWQpCnsKCWRUSFg7CglIVgkJICAg
KnN0YXNoOwoJU1YJCSAgICpzdjsKCWNoYXIJICAgKmtleTsKCUkzMgkJCWtsZW47CgoJLyog
dXNlIG9yaWdpbmFsIHJlcXVpcmUgd2hpbGUgd2Ugc2V0IHVwICovCglQTF9wcGFkZHJbT1Bf
UkVRVUlSRV0gPSBwcF9yZXF1aXJlX29yaWc7CglQTF9wcGFkZHJbT1BfRE9GSUxFXSA9IHBw
X3JlcXVpcmVfb3JpZzsKCglldmFsX3B2KFBMQ19UUlVTVEVELCBGQUxTRSk7CglpZiAoU3ZU
UlVFKEVSUlNWKSkKCQllcmVwb3J0KEVSUk9SLAoJCQkJKGVycmNvZGUoRVJSQ09ERV9FWFRF
Uk5BTF9ST1VUSU5FX0VYQ0VQVElPTiksCgkJCQkgZXJybXNnKCIlcyIsIHN0cmlwX3RyYWls
aW5nX3dzKHN2MmNzdHIoRVJSU1YpKSksCgkJCQkgZXJyY29udGV4dCgid2hpbGUgZXhlY3V0
aW5nIFBMQ19UUlVTVEVEIikpKTsKCgkvKgoJICogRm9yY2UgbG9hZGluZyBvZiB1dGY4IG1v
ZHVsZSBub3cgdG8gcHJldmVudCBlcnJvcnMgdGhhdCBjYW4gYXJpc2UgZnJvbQoJICogdGhl
IHJlZ2V4IGNvZGUgbGF0ZXIgdHJ5aW5nIHRvIGxvYWQgdXRmOCBtb2R1bGVzLiBTZWUKCSAq
IGh0dHA6Ly9ydC5wZXJsLm9yZy9ydDMvVGlja2V0L0Rpc3BsYXkuaHRtbD9pZD00NzU3NgoJ
ICovCglldmFsX3B2KCJteSAkYT1jaHIoMHgxMDApOyByZXR1cm4gJGEgPX4gL1xceGE5L2ki
LCBGQUxTRSk7CglpZiAoU3ZUUlVFKEVSUlNWKSkKCQllcmVwb3J0KEVSUk9SLAoJCQkJKGVy
cmNvZGUoRVJSQ09ERV9FWFRFUk5BTF9ST1VUSU5FX0VYQ0VQVElPTiksCgkJCQkgZXJybXNn
KCIlcyIsIHN0cmlwX3RyYWlsaW5nX3dzKHN2MmNzdHIoRVJSU1YpKSksCgkJCQkgZXJyY29u
dGV4dCgid2hpbGUgZXhlY3V0aW5nIHV0ZjhmaXgiKSkpOwoKCS8qCgkgKiBMb2NrIGRvd24g
dGhlIGludGVycHJldGVyCgkgKi8KCgkvKiBzd2l0Y2ggdG8gdGhlIHNhZmUgcmVxdWlyZS9k
b2ZpbGUgb3Bjb2RlIGZvciBmdXR1cmUgY29kZSAqLwoJUExfcHBhZGRyW09QX1JFUVVJUkVd
ID0gcHBfcmVxdWlyZV9zYWZlOwoJUExfcHBhZGRyW09QX0RPRklMRV0gPSBwcF9yZXF1aXJl
X3NhZmU7CgoJLyoKCSAqIHByZXZlbnQgKGFueSBtb3JlKSB1bnNhZmUgb3Bjb2RlcyBiZWlu
ZyBjb21waWxlZCBQTF9vcF9tYXNrIGlzIHBlcgoJICogaW50ZXJwcmV0ZXIsIHNvIHRoaXMg
b25seSBuZWVkcyB0byBiZSBzZXQgb25jZQoJICovCglQTF9vcF9tYXNrID0gcGxwZXJsX29w
bWFzazsKCgkvKiBkZWxldGUgdGhlIER5bmFMb2FkZXI6OiBuYW1lc3BhY2Ugc28gZXh0ZW5z
aW9ucyBjYW4ndCBiZSBsb2FkZWQgKi8KCXN0YXNoID0gZ3Zfc3Rhc2hwdigiRHluYUxvYWRl
ciIsIEdWX0FERFdBUk4pOwoJaHZfaXRlcmluaXQoc3Rhc2gpOwoJd2hpbGUgKChzdiA9IGh2
X2l0ZXJuZXh0c3Yoc3Rhc2gsICZrZXksICZrbGVuKSkpCgl7CgkJaWYgKCFpc0dWX3dpdGhf
R1Aoc3YpIHx8ICFHdkNWKHN2KSkKCQkJY29udGludWU7CgkJU3ZSRUZDTlRfZGVjKEd2Q1Yo
c3YpKTsgLyogZnJlZSB0aGUgQ1YgKi8KCQlHdkNWX3NldChzdiwgTlVMTCk7CQkvKiBwcmV2
ZW50IGNhbGwgdmlhIEdWICovCgl9Cglodl9jbGVhcihzdGFzaCk7CgoJLyogaW52YWxpZGF0
ZSBhc3NvcnRlZCBjYWNoZXMgKi8KCSsrUExfc3ViX2dlbmVyYXRpb247Cglodl9jbGVhcihQ
TF9zdGFzaGNhY2hlKTsKCgkvKgoJICogRXhlY3V0ZSBwbHBlcmwub25fcGxwZXJsX2luaXQg
aW4gdGhlIGxvY2tlZC1kb3duIGludGVycHJldGVyCgkgKi8KCWlmIChwbHBlcmxfb25fcGxw
ZXJsX2luaXQgJiYgKnBscGVybF9vbl9wbHBlcmxfaW5pdCkKCXsKCQlldmFsX3B2KHBscGVy
bF9vbl9wbHBlcmxfaW5pdCwgRkFMU0UpOwoJCS8qIFhYWCBuZWVkIHRvIGZpbmQgYSB3YXkg
dG8gZGV0ZXJtaW5lIGEgYmV0dGVyIGVycmNvZGUgaGVyZSAqLwoJCWlmIChTdlRSVUUoRVJS
U1YpKQoJCQllcmVwb3J0KEVSUk9SLAoJCQkJCShlcnJjb2RlKEVSUkNPREVfRVhURVJOQUxf
Uk9VVElORV9FWENFUFRJT04pLAoJCQkJCSBlcnJtc2coIiVzIiwgc3RyaXBfdHJhaWxpbmdf
d3Moc3YyY3N0cihFUlJTVikpKSwKCQkJCQkgZXJyY29udGV4dCgid2hpbGUgZXhlY3V0aW5n
IHBscGVybC5vbl9wbHBlcmxfaW5pdCIpKSk7Cgl9Cn0KCgovKgogKiBJbml0aWFsaXplIHRo
ZSBjdXJyZW50IFBlcmwgaW50ZXJwcmV0ZXIgYXMgYW4gdW50cnVzdGVkIGludGVycAogKi8K
c3RhdGljIHZvaWQKcGxwZXJsX3VudHJ1c3RlZF9pbml0KHZvaWQpCnsKCWRUSFg7CgoJLyoK
CSAqIE5vdGhpbmcgdG8gZG8gZXhjZXB0IGV4ZWN1dGUgcGxwZXJsLm9uX3BscGVybHVfaW5p
dAoJICovCglpZiAocGxwZXJsX29uX3BscGVybHVfaW5pdCAmJiAqcGxwZXJsX29uX3BscGVy
bHVfaW5pdCkKCXsKCQlldmFsX3B2KHBscGVybF9vbl9wbHBlcmx1X2luaXQsIEZBTFNFKTsK
CQlpZiAoU3ZUUlVFKEVSUlNWKSkKCQkJZXJlcG9ydChFUlJPUiwKCQkJCQkoZXJyY29kZShF
UlJDT0RFX0VYVEVSTkFMX1JPVVRJTkVfRVhDRVBUSU9OKSwKCQkJCQkgZXJybXNnKCIlcyIs
IHN0cmlwX3RyYWlsaW5nX3dzKHN2MmNzdHIoRVJSU1YpKSksCgkJCQkJIGVycmNvbnRleHQo
IndoaWxlIGV4ZWN1dGluZyBwbHBlcmwub25fcGxwZXJsdV9pbml0IikpKTsKCX0KfQoKCi8q
CiAqIFBlcmwgbGlrZXMgdG8gcHV0IGEgbmV3bGluZSBhZnRlciBpdHMgZXJyb3IgbWVzc2Fn
ZXM7IGNsZWFuIHVwIHN1Y2gKICovCnN0YXRpYyBjaGFyICoKc3RyaXBfdHJhaWxpbmdfd3Mo
Y29uc3QgY2hhciAqbXNnKQp7CgljaGFyCSAgICpyZXMgPSBwc3RyZHVwKG1zZyk7CglpbnQJ
CQlsZW4gPSBzdHJsZW4ocmVzKTsKCgl3aGlsZSAobGVuID4gMCAmJiBpc3NwYWNlKCh1bnNp
Z25lZCBjaGFyKSByZXNbbGVuIC0gMV0pKQoJCXJlc1stLWxlbl0gPSAnXDAnOwoJcmV0dXJu
IHJlczsKfQoKCi8qIEJ1aWxkIGEgdHVwbGUgZnJvbSBhIGhhc2guICovCgpzdGF0aWMgSGVh
cFR1cGxlCnBscGVybF9idWlsZF90dXBsZV9yZXN1bHQoSFYgKnBlcmxoYXNoLCBUdXBsZURl
c2MgdGQpCnsKCWRUSFg7CglEYXR1bQkgICAqdmFsdWVzOwoJYm9vbAkgICAqbnVsbHM7CglI
RQkJICAgKmhlOwoJSGVhcFR1cGxlCXR1cDsKCgl2YWx1ZXMgPSBwYWxsb2MwKHNpemVvZihE
YXR1bSkgKiB0ZC0+bmF0dHMpOwoJbnVsbHMgPSBwYWxsb2Moc2l6ZW9mKGJvb2wpICogdGQt
Pm5hdHRzKTsKCW1lbXNldChudWxscywgdHJ1ZSwgc2l6ZW9mKGJvb2wpICogdGQtPm5hdHRz
KTsKCglodl9pdGVyaW5pdChwZXJsaGFzaCk7Cgl3aGlsZSAoKGhlID0gaHZfaXRlcm5leHQo
cGVybGhhc2gpKSkKCXsKCQlTVgkJICAgKnZhbCA9IEhlVkFMKGhlKTsKCQljaGFyCSAgICpr
ZXkgPSBoZWsyY3N0cihoZSk7CgkJaW50CQkJYXR0biA9IFNQSV9mbnVtYmVyKHRkLCBrZXkp
OwoJCUZvcm1fcGdfYXR0cmlidXRlIGF0dHIgPSBUdXBsZURlc2NBdHRyKHRkLCBhdHRuIC0g
MSk7CgoJCWlmIChhdHRuID09IFNQSV9FUlJPUl9OT0FUVFJJQlVURSkKCQkJZXJlcG9ydChF
UlJPUiwKCQkJCQkoZXJyY29kZShFUlJDT0RFX1VOREVGSU5FRF9DT0xVTU4pLAoJCQkJCSBl
cnJtc2coIlBlcmwgaGFzaCBjb250YWlucyBub25leGlzdGVudCBjb2x1bW4gXCIlc1wiIiwK
CQkJCQkJCWtleSkpKTsKCQlpZiAoYXR0biA8PSAwKQoJCQllcmVwb3J0KEVSUk9SLAoJCQkJ
CShlcnJjb2RlKEVSUkNPREVfRkVBVFVSRV9OT1RfU1VQUE9SVEVEKSwKCQkJCQkgZXJybXNn
KCJjYW5ub3Qgc2V0IHN5c3RlbSBhdHRyaWJ1dGUgXCIlc1wiIiwKCQkJCQkJCWtleSkpKTsK
CgkJdmFsdWVzW2F0dG4gLSAxXSA9IHBscGVybF9zdl90b19kYXR1bSh2YWwsCgkJCQkJCQkJ
CQkJICBhdHRyLT5hdHR0eXBpZCwKCQkJCQkJCQkJCQkgIGF0dHItPmF0dHR5cG1vZCwKCQkJ
CQkJCQkJCQkgIE5VTEwsCgkJCQkJCQkJCQkJICBOVUxMLAoJCQkJCQkJCQkJCSAgSW52YWxp
ZE9pZCwKCQkJCQkJCQkJCQkgICZudWxsc1thdHRuIC0gMV0pOwoKCQlwZnJlZShrZXkpOwoJ
fQoJaHZfaXRlcmluaXQocGVybGhhc2gpOwoKCXR1cCA9IGhlYXBfZm9ybV90dXBsZSh0ZCwg
dmFsdWVzLCBudWxscyk7CglwZnJlZSh2YWx1ZXMpOwoJcGZyZWUobnVsbHMpOwoJcmV0dXJu
IHR1cDsKfQoKLyogY29udmVydCBhIGhhc2ggcmVmZXJlbmNlIHRvIGEgZGF0dW0gKi8Kc3Rh
dGljIERhdHVtCnBscGVybF9oYXNoX3RvX2RhdHVtKFNWICpzcmMsIFR1cGxlRGVzYyB0ZCkK
ewoJSGVhcFR1cGxlCXR1cCA9IHBscGVybF9idWlsZF90dXBsZV9yZXN1bHQoKEhWICopIFN2
UlYoc3JjKSwgdGQpOwoKCXJldHVybiBIZWFwVHVwbGVHZXREYXR1bSh0dXApOwp9CgovKgog
KiBpZiB3ZSBhcmUgYW4gYXJyYXkgcmVmIHJldHVybiB0aGUgcmVmZXJlbmNlLiB0aGlzIGlz
IHNwZWNpYWwgaW4gdGhhdCBpZiB3ZQogKiBhcmUgYSBQb3N0Z3JlU1FMOjpJblNlcnZlcjo6
QVJSQVkgb2JqZWN0IHdlIHdpbGwgcmV0dXJuIHRoZSAnbWFnaWMnIGFycmF5LgogKi8Kc3Rh
dGljIFNWICAqCmdldF9wZXJsX2FycmF5X3JlZihTViAqc3YpCnsKCWRUSFg7CgoJaWYgKFN2
T0soc3YpICYmIFN2Uk9LKHN2KSkKCXsKCQlpZiAoU3ZUWVBFKFN2UlYoc3YpKSA9PSBTVnRf
UFZBVikKCQkJcmV0dXJuIHN2OwoJCWVsc2UgaWYgKHN2X2lzYShzdiwgIlBvc3RncmVTUUw6
OkluU2VydmVyOjpBUlJBWSIpKQoJCXsKCQkJSFYJCSAgICpodiA9IChIViAqKSBTdlJWKHN2
KTsKCQkJU1YJCSAgKipzYXYgPSBodl9mZXRjaF9zdHJpbmcoaHYsICJhcnJheSIpOwoKCQkJ
aWYgKCpzYXYgJiYgU3ZPSygqc2F2KSAmJiBTdlJPSygqc2F2KSAmJgoJCQkJU3ZUWVBFKFN2
UlYoKnNhdikpID09IFNWdF9QVkFWKQoJCQkJcmV0dXJuICpzYXY7CgoJCQllbG9nKEVSUk9S
LCAiY291bGQgbm90IGdldCBhcnJheSByZWZlcmVuY2UgZnJvbSBQb3N0Z3JlU1FMOjpJblNl
cnZlcjo6QVJSQVkgb2JqZWN0Iik7CgkJfQoJfQoJcmV0dXJuIE5VTEw7Cn0KCi8qCiAqIGhl
bHBlciBmdW5jdGlvbiBmb3IgcGxwZXJsX2FycmF5X3RvX2RhdHVtLCByZWN1cnNlcyBmb3Ig
bXVsdGktRCBhcnJheXMKICovCnN0YXRpYyB2b2lkCmFycmF5X3RvX2RhdHVtX2ludGVybmFs
KEFWICphdiwgQXJyYXlCdWlsZFN0YXRlICphc3RhdGUsCgkJCQkJCWludCAqbmRpbXMsIGlu
dCAqZGltcywgaW50IGN1cl9kZXB0aCwKCQkJCQkJT2lkIGFycmF5dHlwaWQsIE9pZCBlbGVt
dHlwaWQsIGludDMyIHR5cG1vZCwKCQkJCQkJRm1nckluZm8gKmZpbmZvLCBPaWQgdHlwaW9w
YXJhbSkKewoJZFRIWDsKCWludAkJCWk7CglpbnQJCQlsZW4gPSBhdl9sZW4oYXYpICsgMTsK
Cglmb3IgKGkgPSAwOyBpIDwgbGVuOyBpKyspCgl7CgkJLyogZmV0Y2ggdGhlIGFycmF5IGVs
ZW1lbnQgKi8KCQlTVgkJICAqKnN2cCA9IGF2X2ZldGNoKGF2LCBpLCBGQUxTRSk7CgoJCS8q
IHNlZSBpZiB0aGlzIGVsZW1lbnQgaXMgYW4gYXJyYXksIGlmIHNvIGdldCB0aGF0ICovCgkJ
U1YJCSAgICpzYXYgPSBzdnAgPyBnZXRfcGVybF9hcnJheV9yZWYoKnN2cCkgOiBOVUxMOwoK
CQkvKiBtdWx0aS1kaW1lbnNpb25hbCBhcnJheT8gKi8KCQlpZiAoc2F2KQoJCXsKCQkJQVYJ
CSAgICpuYXYgPSAoQVYgKikgU3ZSVihzYXYpOwoKCQkJLyogZGltZW5zaW9uYWxpdHkgY2hl
Y2tzICovCgkJCWlmIChjdXJfZGVwdGggKyAxID4gTUFYRElNKQoJCQkJZXJlcG9ydChFUlJP
UiwKCQkJCQkJKGVycmNvZGUoRVJSQ09ERV9QUk9HUkFNX0xJTUlUX0VYQ0VFREVEKSwKCQkJ
CQkJIGVycm1zZygibnVtYmVyIG9mIGFycmF5IGRpbWVuc2lvbnMgKCVkKSBleGNlZWRzIHRo
ZSBtYXhpbXVtIGFsbG93ZWQgKCVkKSIsCgkJCQkJCQkJY3VyX2RlcHRoICsgMSwgTUFYRElN
KSkpOwoKCQkJLyogc2V0IHNpemUgd2hlbiBhdCBmaXJzdCBlbGVtZW50IGluIHRoaXMgbGV2
ZWwsIGVsc2UgY29tcGFyZSAqLwoJCQlpZiAoaSA9PSAwICYmICpuZGltcyA9PSBjdXJfZGVw
dGgpCgkJCXsKCQkJCWRpbXNbKm5kaW1zXSA9IGF2X2xlbihuYXYpICsgMTsKCQkJCSgqbmRp
bXMpKys7CgkJCX0KCQkJZWxzZSBpZiAoYXZfbGVuKG5hdikgKyAxICE9IGRpbXNbY3VyX2Rl
cHRoXSkKCQkJCWVyZXBvcnQoRVJST1IsCgkJCQkJCShlcnJjb2RlKEVSUkNPREVfSU5WQUxJ
RF9URVhUX1JFUFJFU0VOVEFUSU9OKSwKCQkJCQkJIGVycm1zZygibXVsdGlkaW1lbnNpb25h
bCBhcnJheXMgbXVzdCBoYXZlIGFycmF5IGV4cHJlc3Npb25zIHdpdGggbWF0Y2hpbmcgZGlt
ZW5zaW9ucyIpKSk7CgoJCQkvKiByZWN1cnNlIHRvIGZldGNoIGVsZW1lbnRzIG9mIHRoaXMg
c3ViLWFycmF5ICovCgkJCWFycmF5X3RvX2RhdHVtX2ludGVybmFsKG5hdiwgYXN0YXRlLAoJ
CQkJCQkJCQluZGltcywgZGltcywgY3VyX2RlcHRoICsgMSwKCQkJCQkJCQkJYXJyYXl0eXBp
ZCwgZWxlbXR5cGlkLCB0eXBtb2QsCgkJCQkJCQkJCWZpbmZvLCB0eXBpb3BhcmFtKTsKCQl9
CgkJZWxzZQoJCXsKCQkJRGF0dW0JCWRhdDsKCQkJYm9vbAkJaXNudWxsOwoKCQkJLyogc2Nh
bGFyIGFmdGVyIHNvbWUgc3ViLWFycmF5cyBhdCBzYW1lIGxldmVsPyAqLwoJCQlpZiAoKm5k
aW1zICE9IGN1cl9kZXB0aCkKCQkJCWVyZXBvcnQoRVJST1IsCgkJCQkJCShlcnJjb2RlKEVS
UkNPREVfSU5WQUxJRF9URVhUX1JFUFJFU0VOVEFUSU9OKSwKCQkJCQkJIGVycm1zZygibXVs
dGlkaW1lbnNpb25hbCBhcnJheXMgbXVzdCBoYXZlIGFycmF5IGV4cHJlc3Npb25zIHdpdGgg
bWF0Y2hpbmcgZGltZW5zaW9ucyIpKSk7CgoJCQlkYXQgPSBwbHBlcmxfc3ZfdG9fZGF0dW0o
c3ZwID8gKnN2cCA6IE5VTEwsCgkJCQkJCQkJCSBlbGVtdHlwaWQsCgkJCQkJCQkJCSB0eXBt
b2QsCgkJCQkJCQkJCSBOVUxMLAoJCQkJCQkJCQkgZmluZm8sCgkJCQkJCQkJCSB0eXBpb3Bh
cmFtLAoJCQkJCQkJCQkgJmlzbnVsbCk7CgoJCQkodm9pZCkgYWNjdW1BcnJheVJlc3VsdChh
c3RhdGUsIGRhdCwgaXNudWxsLAoJCQkJCQkJCQllbGVtdHlwaWQsIEN1cnJlbnRNZW1vcnlD
b250ZXh0KTsKCQl9Cgl9Cn0KCi8qCiAqIGNvbnZlcnQgcGVybCBhcnJheSByZWYgdG8gYSBk
YXR1bQogKi8Kc3RhdGljIERhdHVtCnBscGVybF9hcnJheV90b19kYXR1bShTViAqc3JjLCBP
aWQgdHlwaWQsIGludDMyIHR5cG1vZCkKewoJZFRIWDsKCUFycmF5QnVpbGRTdGF0ZSAqYXN0
YXRlOwoJT2lkCQkJZWxlbXR5cGlkOwoJRm1nckluZm8JZmluZm87CglPaWQJCQl0eXBpb3Bh
cmFtOwoJaW50CQkJZGltc1tNQVhESU1dOwoJaW50CQkJbGJzW01BWERJTV07CglpbnQJCQlu
ZGltcyA9IDE7CglpbnQJCQlpOwoKCWVsZW10eXBpZCA9IGdldF9lbGVtZW50X3R5cGUodHlw
aWQpOwoJaWYgKCFlbGVtdHlwaWQpCgkJZXJlcG9ydChFUlJPUiwKCQkJCShlcnJjb2RlKEVS
UkNPREVfREFUQVRZUEVfTUlTTUFUQ0gpLAoJCQkJIGVycm1zZygiY2Fubm90IGNvbnZlcnQg
UGVybCBhcnJheSB0byBub24tYXJyYXkgdHlwZSAlcyIsCgkJCQkJCWZvcm1hdF90eXBlX2Jl
KHR5cGlkKSkpKTsKCglhc3RhdGUgPSBpbml0QXJyYXlSZXN1bHQoZWxlbXR5cGlkLCBDdXJy
ZW50TWVtb3J5Q29udGV4dCwgdHJ1ZSk7CgoJX3N2X3RvX2RhdHVtX2ZpbmZvKGVsZW10eXBp
ZCwgJmZpbmZvLCAmdHlwaW9wYXJhbSk7CgoJbWVtc2V0KGRpbXMsIDAsIHNpemVvZihkaW1z
KSk7CglkaW1zWzBdID0gYXZfbGVuKChBViAqKSBTdlJWKHNyYykpICsgMTsKCglhcnJheV90
b19kYXR1bV9pbnRlcm5hbCgoQVYgKikgU3ZSVihzcmMpLCBhc3RhdGUsCgkJCQkJCQkmbmRp
bXMsIGRpbXMsIDEsCgkJCQkJCQl0eXBpZCwgZWxlbXR5cGlkLCB0eXBtb2QsCgkJCQkJCQkm
ZmluZm8sIHR5cGlvcGFyYW0pOwoKCS8qIGVuc3VyZSB3ZSBnZXQgemVyby1EIGFycmF5IGZv
ciBubyBpbnB1dHMsIGFzIHBlciBQRyBjb252ZW50aW9uICovCglpZiAoZGltc1swXSA8PSAw
KQoJCW5kaW1zID0gMDsKCglmb3IgKGkgPSAwOyBpIDwgbmRpbXM7IGkrKykKCQlsYnNbaV0g
PSAxOwoKCXJldHVybiBtYWtlTWRBcnJheVJlc3VsdChhc3RhdGUsIG5kaW1zLCBkaW1zLCBs
YnMsCgkJCQkJCQkgQ3VycmVudE1lbW9yeUNvbnRleHQsIHRydWUpOwp9CgovKiBHZXQgdGhl
IGluZm9ybWF0aW9uIG5lZWRlZCB0byBjb252ZXJ0IGRhdGEgdG8gdGhlIHNwZWNpZmllZCBQ
RyB0eXBlICovCnN0YXRpYyB2b2lkCl9zdl90b19kYXR1bV9maW5mbyhPaWQgdHlwaWQsIEZt
Z3JJbmZvICpmaW5mbywgT2lkICp0eXBpb3BhcmFtKQp7CglPaWQJCQl0eXBpbnB1dDsKCgkv
KiBYWFggd291bGQgYmUgYmV0dGVyIHRvIGNhY2hlIHRoZXNlIGxvb2t1cHMgKi8KCWdldFR5
cGVJbnB1dEluZm8odHlwaWQsCgkJCQkJICZ0eXBpbnB1dCwgdHlwaW9wYXJhbSk7CglmbWdy
X2luZm8odHlwaW5wdXQsIGZpbmZvKTsKfQoKLyoKICogY29udmVydCBQZXJsIFNWIHRvIFBH
IGRhdHVtIG9mIHR5cGUgdHlwaWQsIHR5cG1vZCB0eXBtb2QKICoKICogUGFzcyB0aGUgUEwv
UGVybCBmdW5jdGlvbidzIGZjaW5mbyB3aGVuIGF0dGVtcHRpbmcgdG8gY29udmVydCB0byB0
aGUKICogZnVuY3Rpb24ncyByZXN1bHQgdHlwZTsgb3RoZXJ3aXNlIHBhc3MgTlVMTC4gIFRo
aXMgaXMgdXNlZCB3aGVuIHdlIG5lZWQgdG8KICogcmVzb2x2ZSB0aGUgYWN0dWFsIHJlc3Vs
dCB0eXBlIG9mIGEgZnVuY3Rpb24gcmV0dXJuaW5nIFJFQ09SRC4KICoKICogZmluZm8gYW5k
IHR5cGlvcGFyYW0gc2hvdWxkIGJlIHRoZSByZXN1bHRzIG9mIF9zdl90b19kYXR1bV9maW5m
byBmb3IgdGhlCiAqIGdpdmVuIHR5cGlkLCBvciBOVUxML0ludmFsaWRPaWQgdG8gbGV0IHRo
aXMgZnVuY3Rpb24gZG8gdGhlIGxvb2t1cHMuCiAqCiAqICppc251bGwgaXMgYW4gb3V0cHV0
IHBhcmFtZXRlci4KICovCnN0YXRpYyBEYXR1bQpwbHBlcmxfc3ZfdG9fZGF0dW0oU1YgKnN2
LCBPaWQgdHlwaWQsIGludDMyIHR5cG1vZCwKCQkJCSAgIEZ1bmN0aW9uQ2FsbEluZm8gZmNp
bmZvLAoJCQkJICAgRm1nckluZm8gKmZpbmZvLCBPaWQgdHlwaW9wYXJhbSwKCQkJCSAgIGJv
b2wgKmlzbnVsbCkKewoJRm1nckluZm8JdG1wOwoJT2lkCQkJZnVuY2lkOwoKCS8qIHdlIG1p
Z2h0IHJlY3Vyc2UgKi8KCWNoZWNrX3N0YWNrX2RlcHRoKCk7CgoJKmlzbnVsbCA9IGZhbHNl
OwoKCS8qCgkgKiBSZXR1cm4gTlVMTCBpZiByZXN1bHQgaXMgdW5kZWYsIG9yIGlmIHdlJ3Jl
IGluIGEgZnVuY3Rpb24gcmV0dXJuaW5nCgkgKiBWT0lELiAgSW4gdGhlIGxhdHRlciBjYXNl
LCB3ZSBzaG91bGQgcGF5IG5vIGF0dGVudGlvbiB0byB0aGUgbGFzdCBQZXJsCgkgKiBzdGF0
ZW1lbnQncyByZXN1bHQsIGFuZCB0aGlzIGlzIGEgY29udmVuaWVudCBtZWFucyB0byBlbnN1
cmUgdGhhdC4KCSAqLwoJaWYgKCFzdiB8fCAhU3ZPSyhzdikgfHwgdHlwaWQgPT0gVk9JRE9J
RCkKCXsKCQkvKiBsb29rIHVwIHR5cGUgaW5mbyBpZiB0aGV5IGRpZCBub3QgcGFzcyBpdCAq
LwoJCWlmICghZmluZm8pCgkJewoJCQlfc3ZfdG9fZGF0dW1fZmluZm8odHlwaWQsICZ0bXAs
ICZ0eXBpb3BhcmFtKTsKCQkJZmluZm8gPSAmdG1wOwoJCX0KCQkqaXNudWxsID0gdHJ1ZTsK
CQkvKiBtdXN0IGNhbGwgdHlwaW5wdXQgaW4gY2FzZSBpdCB3YW50cyB0byByZWplY3QgTlVM
TCAqLwoJCXJldHVybiBJbnB1dEZ1bmN0aW9uQ2FsbChmaW5mbywgTlVMTCwgdHlwaW9wYXJh
bSwgdHlwbW9kKTsKCX0KCWVsc2UgaWYgKChmdW5jaWQgPSBnZXRfdHJhbnNmb3JtX3Rvc3Fs
KHR5cGlkLCBjdXJyZW50X2NhbGxfZGF0YS0+cHJvZGVzYy0+bGFuZ19vaWQsIGN1cnJlbnRf
Y2FsbF9kYXRhLT5wcm9kZXNjLT50cmZ0eXBlcykpKQoJCXJldHVybiBPaWRGdW5jdGlvbkNh
bGwxKGZ1bmNpZCwgUG9pbnRlckdldERhdHVtKHN2KSk7CgllbHNlIGlmIChTdlJPSyhzdikp
Cgl7CgkJLyogaGFuZGxlIHJlZmVyZW5jZXMgKi8KCQlTVgkJICAgKnNhdiA9IGdldF9wZXJs
X2FycmF5X3JlZihzdik7CgoJCWlmIChzYXYpCgkJewoJCQkvKiBoYW5kbGUgYW4gYXJyYXly
ZWYgKi8KCQkJcmV0dXJuIHBscGVybF9hcnJheV90b19kYXR1bShzYXYsIHR5cGlkLCB0eXBt
b2QpOwoJCX0KCQllbHNlIGlmIChTdlRZUEUoU3ZSVihzdikpID09IFNWdF9QVkhWKQoJCXsK
CQkJLyogaGFuZGxlIGEgaGFzaHJlZiAqLwoJCQlEYXR1bQkJcmV0OwoJCQlUdXBsZURlc2MJ
dGQ7CgkJCWJvb2wJCWlzZG9tYWluOwoKCQkJaWYgKCF0eXBlX2lzX3Jvd3R5cGUodHlwaWQp
KQoJCQkJZXJlcG9ydChFUlJPUiwKCQkJCQkJKGVycmNvZGUoRVJSQ09ERV9EQVRBVFlQRV9N
SVNNQVRDSCksCgkJCQkJCSBlcnJtc2coImNhbm5vdCBjb252ZXJ0IFBlcmwgaGFzaCB0byBu
b24tY29tcG9zaXRlIHR5cGUgJXMiLAoJCQkJCQkJCWZvcm1hdF90eXBlX2JlKHR5cGlkKSkp
KTsKCgkJCXRkID0gbG9va3VwX3Jvd3R5cGVfdHVwZGVzY19kb21haW4odHlwaWQsIHR5cG1v
ZCwgdHJ1ZSk7CgkJCWlmICh0ZCAhPSBOVUxMKQoJCQl7CgkJCQkvKiBEaWQgd2UgbG9vayB0
aHJvdWdoIGEgZG9tYWluPyAqLwoJCQkJaXNkb21haW4gPSAodHlwaWQgIT0gdGQtPnRkdHlw
ZWlkKTsKCQkJfQoJCQllbHNlCgkJCXsKCQkJCS8qIE11c3QgYmUgUkVDT1JELCB0cnkgdG8g
cmVzb2x2ZSBiYXNlZCBvbiBjYWxsIGluZm8gKi8KCQkJCVR5cGVGdW5jQ2xhc3MgZnVuY2Ns
YXNzOwoKCQkJCWlmIChmY2luZm8pCgkJCQkJZnVuY2NsYXNzID0gZ2V0X2NhbGxfcmVzdWx0
X3R5cGUoZmNpbmZvLCAmdHlwaWQsICZ0ZCk7CgkJCQllbHNlCgkJCQkJZnVuY2NsYXNzID0g
VFlQRUZVTkNfT1RIRVI7CgkJCQlpZiAoZnVuY2NsYXNzICE9IFRZUEVGVU5DX0NPTVBPU0lU
RSAmJgoJCQkJCWZ1bmNjbGFzcyAhPSBUWVBFRlVOQ19DT01QT1NJVEVfRE9NQUlOKQoJCQkJ
CWVyZXBvcnQoRVJST1IsCgkJCQkJCQkoZXJyY29kZShFUlJDT0RFX0ZFQVRVUkVfTk9UX1NV
UFBPUlRFRCksCgkJCQkJCQkgZXJybXNnKCJmdW5jdGlvbiByZXR1cm5pbmcgcmVjb3JkIGNh
bGxlZCBpbiBjb250ZXh0ICIKCQkJCQkJCQkJInRoYXQgY2Fubm90IGFjY2VwdCB0eXBlIHJl
Y29yZCIpKSk7CgkJCQlBc3NlcnQodGQpOwoJCQkJaXNkb21haW4gPSAoZnVuY2NsYXNzID09
IFRZUEVGVU5DX0NPTVBPU0lURV9ET01BSU4pOwoJCQl9CgoJCQlyZXQgPSBwbHBlcmxfaGFz
aF90b19kYXR1bShzdiwgdGQpOwoKCQkJaWYgKGlzZG9tYWluKQoJCQkJZG9tYWluX2NoZWNr
KHJldCwgZmFsc2UsIHR5cGlkLCBOVUxMLCBOVUxMKTsKCgkJCS8qIFJlbGVhc2Ugb24gdGhl
IHJlc3VsdCBvZiBnZXRfY2FsbF9yZXN1bHRfdHlwZSBpcyBoYXJtbGVzcyAqLwoJCQlSZWxl
YXNlVHVwbGVEZXNjKHRkKTsKCgkJCXJldHVybiByZXQ7CgkJfQoKCQkvKgoJCSAqIElmIGl0
J3MgYSByZWZlcmVuY2UgdG8gc29tZXRoaW5nIGVsc2UsIHN1Y2ggYXMgYSBzY2FsYXIsIGp1
c3QKCQkgKiByZWN1cnNpdmVseSBsb29rIHRocm91Z2ggdGhlIHJlZmVyZW5jZS4KCQkgKi8K
CQlyZXR1cm4gcGxwZXJsX3N2X3RvX2RhdHVtKFN2UlYoc3YpLCB0eXBpZCwgdHlwbW9kLAoJ
CQkJCQkJCSAgZmNpbmZvLCBmaW5mbywgdHlwaW9wYXJhbSwKCQkJCQkJCQkgIGlzbnVsbCk7
Cgl9CgllbHNlCgl7CgkJLyogaGFuZGxlIGEgc3RyaW5nL251bWJlciAqLwoJCURhdHVtCQly
ZXQ7CgkJY2hhcgkgICAqc3RyID0gc3YyY3N0cihzdik7CgoJCS8qIGRpZCBub3QgcGFzcyBp
biBhbnkgdHlwZWluZm8/IGxvb2sgaXQgdXAgKi8KCQlpZiAoIWZpbmZvKQoJCXsKCQkJX3N2
X3RvX2RhdHVtX2ZpbmZvKHR5cGlkLCAmdG1wLCAmdHlwaW9wYXJhbSk7CgkJCWZpbmZvID0g
JnRtcDsKCQl9CgoJCXJldCA9IElucHV0RnVuY3Rpb25DYWxsKGZpbmZvLCBzdHIsIHR5cGlv
cGFyYW0sIHR5cG1vZCk7CgkJcGZyZWUoc3RyKTsKCgkJcmV0dXJuIHJldDsKCX0KfQoKLyog
Q29udmVydCB0aGUgcGVybCBTViB0byBhIHN0cmluZyByZXR1cm5lZCBieSB0aGUgdHlwZSBv
dXRwdXQgZnVuY3Rpb24gKi8KY2hhciAqCnBscGVybF9zdl90b19saXRlcmFsKFNWICpzdiwg
Y2hhciAqZnF0eXBlbmFtZSkKewoJT2lkCQkJdHlwaWQ7CglPaWQJCQl0eXBvdXRwdXQ7CglE
YXR1bQkJZGF0dW07Cglib29sCQl0eXBpc3ZhcmxlbmEsCgkJCQlpc251bGw7CgoJY2hlY2tf
c3BpX3VzYWdlX2FsbG93ZWQoKTsKCgl0eXBpZCA9IERpcmVjdEZ1bmN0aW9uQ2FsbDEocmVn
dHlwZWluLCBDU3RyaW5nR2V0RGF0dW0oZnF0eXBlbmFtZSkpOwoJaWYgKCFPaWRJc1ZhbGlk
KHR5cGlkKSkKCQllcmVwb3J0KEVSUk9SLAoJCQkJKGVycmNvZGUoRVJSQ09ERV9VTkRFRklO
RURfT0JKRUNUKSwKCQkJCSBlcnJtc2coImxvb2t1cCBmYWlsZWQgZm9yIHR5cGUgJXMiLCBm
cXR5cGVuYW1lKSkpOwoKCWRhdHVtID0gcGxwZXJsX3N2X3RvX2RhdHVtKHN2LAoJCQkJCQkJ
ICAgdHlwaWQsIC0xLAoJCQkJCQkJICAgTlVMTCwgTlVMTCwgSW52YWxpZE9pZCwKCQkJCQkJ
CSAgICZpc251bGwpOwoKCWlmIChpc251bGwpCgkJcmV0dXJuIE5VTEw7CgoJZ2V0VHlwZU91
dHB1dEluZm8odHlwaWQsCgkJCQkJICAmdHlwb3V0cHV0LCAmdHlwaXN2YXJsZW5hKTsKCgly
ZXR1cm4gT2lkT3V0cHV0RnVuY3Rpb25DYWxsKHR5cG91dHB1dCwgZGF0dW0pOwp9CgovKgog
KiBDb252ZXJ0IFBvc3RncmVTUUwgYXJyYXkgZGF0dW0gdG8gYSBwZXJsIGFycmF5IHJlZmVy
ZW5jZS4KICoKICogdHlwaWQgaXMgYXJnJ3MgT0lELCB3aGljaCBtdXN0IGJlIGFuIGFycmF5
IHR5cGUuCiAqLwpzdGF0aWMgU1YgICoKcGxwZXJsX3JlZl9mcm9tX3BnX2FycmF5KERhdHVt
IGFyZywgT2lkIHR5cGlkKQp7CglkVEhYOwoJQXJyYXlUeXBlICAqYXIgPSBEYXR1bUdldEFy
cmF5VHlwZVAoYXJnKTsKCU9pZAkJCWVsZW1lbnR0eXBlID0gQVJSX0VMRU1UWVBFKGFyKTsK
CWludDE2CQl0eXBsZW47Cglib29sCQl0eXBieXZhbDsKCWNoYXIJCXR5cGFsaWduLAoJCQkJ
dHlwZGVsaW07CglPaWQJCQl0eXBpb3BhcmFtOwoJT2lkCQkJdHlwb3V0cHV0ZnVuYzsKCU9p
ZAkJCXRyYW5zZm9ybV9mdW5jaWQ7CglpbnQJCQlpLAoJCQkJbml0ZW1zLAoJCQkgICAqZGlt
czsKCXBscGVybF9hcnJheV9pbmZvICppbmZvOwoJU1YJCSAgICphdjsKCUhWCQkgICAqaHY7
CgoJLyoKCSAqIEN1cnJlbnRseSB3ZSBtYWtlIG5vIGVmZm9ydCB0byBjYWNoZSBhbnkgb2Yg
dGhlIHN0dWZmIHdlIGxvb2sgdXAgaGVyZSwKCSAqIHdoaWNoIGlzIGJhZC4KCSAqLwoJaW5m
byA9IHBhbGxvYzAoc2l6ZW9mKHBscGVybF9hcnJheV9pbmZvKSk7CgoJLyogZ2V0IGVsZW1l
bnQgdHlwZSBpbmZvcm1hdGlvbiwgaW5jbHVkaW5nIG91dHB1dCBjb252ZXJzaW9uIGZ1bmN0
aW9uICovCglnZXRfdHlwZV9pb19kYXRhKGVsZW1lbnR0eXBlLCBJT0Z1bmNfb3V0cHV0LAoJ
CQkJCSAmdHlwbGVuLCAmdHlwYnl2YWwsICZ0eXBhbGlnbiwKCQkJCQkgJnR5cGRlbGltLCAm
dHlwaW9wYXJhbSwgJnR5cG91dHB1dGZ1bmMpOwoKCS8qIENoZWNrIGZvciBhIHRyYW5zZm9y
bSBmdW5jdGlvbiAqLwoJdHJhbnNmb3JtX2Z1bmNpZCA9IGdldF90cmFuc2Zvcm1fZnJvbXNx
bChlbGVtZW50dHlwZSwKCQkJCQkJCQkJCQkgY3VycmVudF9jYWxsX2RhdGEtPnByb2Rlc2Mt
Pmxhbmdfb2lkLAoJCQkJCQkJCQkJCSBjdXJyZW50X2NhbGxfZGF0YS0+cHJvZGVzYy0+dHJm
dHlwZXMpOwoKCS8qIExvb2sgdXAgdHJhbnNmb3JtIG9yIG91dHB1dCBmdW5jdGlvbiBhcyBh
cHByb3ByaWF0ZSAqLwoJaWYgKE9pZElzVmFsaWQodHJhbnNmb3JtX2Z1bmNpZCkpCgkJZm1n
cl9pbmZvKHRyYW5zZm9ybV9mdW5jaWQsICZpbmZvLT50cmFuc2Zvcm1fcHJvYyk7CgllbHNl
CgkJZm1ncl9pbmZvKHR5cG91dHB1dGZ1bmMsICZpbmZvLT5wcm9jKTsKCglpbmZvLT5lbGVt
X2lzX3Jvd3R5cGUgPSB0eXBlX2lzX3Jvd3R5cGUoZWxlbWVudHR5cGUpOwoKCS8qIEdldCB0
aGUgbnVtYmVyIGFuZCBib3VuZHMgb2YgYXJyYXkgZGltZW5zaW9ucyAqLwoJaW5mby0+bmRp
bXMgPSBBUlJfTkRJTShhcik7CglkaW1zID0gQVJSX0RJTVMoYXIpOwoKCS8qIE5vIGRpbWVu
c2lvbnM/IFJldHVybiBhbiBlbXB0eSBhcnJheSAqLwoJaWYgKGluZm8tPm5kaW1zID09IDAp
Cgl7CgkJYXYgPSBuZXdSVl9ub2luYygoU1YgKikgbmV3QVYoKSk7Cgl9CgllbHNlCgl7CgkJ
ZGVjb25zdHJ1Y3RfYXJyYXkoYXIsIGVsZW1lbnR0eXBlLCB0eXBsZW4sIHR5cGJ5dmFsLAoJ
CQkJCQkgIHR5cGFsaWduLCAmaW5mby0+ZWxlbWVudHMsICZpbmZvLT5udWxscywKCQkJCQkJ
ICAmbml0ZW1zKTsKCgkJLyogR2V0IHRvdGFsIG51bWJlciBvZiBlbGVtZW50cyBpbiBlYWNo
IGRpbWVuc2lvbiAqLwoJCWluZm8tPm5lbGVtcyA9IHBhbGxvYyhzaXplb2YoaW50KSAqIGlu
Zm8tPm5kaW1zKTsKCQlpbmZvLT5uZWxlbXNbMF0gPSBuaXRlbXM7CgkJZm9yIChpID0gMTsg
aSA8IGluZm8tPm5kaW1zOyBpKyspCgkJCWluZm8tPm5lbGVtc1tpXSA9IGluZm8tPm5lbGVt
c1tpIC0gMV0gLyBkaW1zW2kgLSAxXTsKCgkJYXYgPSBzcGxpdF9hcnJheShpbmZvLCAwLCBu
aXRlbXMsIDApOwoJfQoKCWh2ID0gbmV3SFYoKTsKCSh2b2lkKSBodl9zdG9yZShodiwgImFy
cmF5IiwgNSwgYXYsIDApOwoJKHZvaWQpIGh2X3N0b3JlKGh2LCAidHlwZW9pZCIsIDcsIG5l
d1NWdXYodHlwaWQpLCAwKTsKCglyZXR1cm4gc3ZfYmxlc3MobmV3UlZfbm9pbmMoKFNWICop
IGh2KSwKCQkJCQlndl9zdGFzaHB2KCJQb3N0Z3JlU1FMOjpJblNlcnZlcjo6QVJSQVkiLCAw
KSk7Cn0KCi8qCiAqIFJlY3Vyc2l2ZWx5IGZvcm0gYXJyYXkgcmVmZXJlbmNlcyBmcm9tIHNw
bGljZXMgb2YgdGhlIGluaXRpYWwgYXJyYXkKICovCnN0YXRpYyBTViAgKgpzcGxpdF9hcnJh
eShwbHBlcmxfYXJyYXlfaW5mbyAqaW5mbywgaW50IGZpcnN0LCBpbnQgbGFzdCwgaW50IG5l
c3QpCnsKCWRUSFg7CglpbnQJCQlpOwoJQVYJCSAgICpyZXN1bHQ7CgoJLyogd2Ugc2hvdWxk
IG9ubHkgYmUgY2FsbGVkIHdoZW4gd2UgaGF2ZSBzb21ldGhpbmcgdG8gc3BsaXQgKi8KCUFz
c2VydChpbmZvLT5uZGltcyA+IDApOwoKCS8qIHNpbmNlIHRoaXMgZnVuY3Rpb24gcmVjdXJz
ZXMsIGl0IGNvdWxkIGJlIGRyaXZlbiB0byBzdGFjayBvdmVyZmxvdyAqLwoJY2hlY2tfc3Rh
Y2tfZGVwdGgoKTsKCgkvKgoJICogQmFzZSBjYXNlLCByZXR1cm4gYSByZWZlcmVuY2UgdG8g
YSBzaW5nbGUtZGltZW5zaW9uYWwgYXJyYXkKCSAqLwoJaWYgKG5lc3QgPj0gaW5mby0+bmRp
bXMgLSAxKQoJCXJldHVybiBtYWtlX2FycmF5X3JlZihpbmZvLCBmaXJzdCwgbGFzdCk7CgoJ
cmVzdWx0ID0gbmV3QVYoKTsKCWZvciAoaSA9IGZpcnN0OyBpIDwgbGFzdDsgaSArPSBpbmZv
LT5uZWxlbXNbbmVzdCArIDFdKQoJewoJCS8qIFJlY3Vyc2l2ZWx5IGZvcm0gcmVmZXJlbmNl
cyB0byBhcnJheXMgb2YgbG93ZXIgZGltZW5zaW9ucyAqLwoJCVNWCQkgICAqcmVmID0gc3Bs
aXRfYXJyYXkoaW5mbywgaSwgaSArIGluZm8tPm5lbGVtc1tuZXN0ICsgMV0sIG5lc3QgKyAx
KTsKCgkJYXZfcHVzaChyZXN1bHQsIHJlZik7Cgl9CglyZXR1cm4gbmV3UlZfbm9pbmMoKFNW
ICopIHJlc3VsdCk7Cn0KCi8qCiAqIENyZWF0ZSBhIFBlcmwgcmVmZXJlbmNlIGZyb20gYSBv
bmUtZGltZW5zaW9uYWwgQyBhcnJheSwgY29udmVydGluZwogKiBjb21wb3NpdGUgdHlwZSBl
bGVtZW50cyB0byBoYXNoIHJlZmVyZW5jZXMuCiAqLwpzdGF0aWMgU1YgICoKbWFrZV9hcnJh
eV9yZWYocGxwZXJsX2FycmF5X2luZm8gKmluZm8sIGludCBmaXJzdCwgaW50IGxhc3QpCnsK
CWRUSFg7CglpbnQJCQlpOwoJQVYJCSAgICpyZXN1bHQgPSBuZXdBVigpOwoKCWZvciAoaSA9
IGZpcnN0OyBpIDwgbGFzdDsgaSsrKQoJewoJCWlmIChpbmZvLT5udWxsc1tpXSkKCQl7CgkJ
CS8qCgkJCSAqIFdlIGNhbid0IHVzZSAmUExfc3ZfdW5kZWYgaGVyZS4gIFNlZSAiQVZzLCBI
VnMgYW5kIHVuZGVmaW5lZAoJCQkgKiB2YWx1ZXMiIGluIHBlcmxndXRzLgoJCQkgKi8KCQkJ
YXZfcHVzaChyZXN1bHQsIG5ld1NWKDApKTsKCQl9CgkJZWxzZQoJCXsKCQkJRGF0dW0JCWl0
ZW12YWx1ZSA9IGluZm8tPmVsZW1lbnRzW2ldOwoKCQkJaWYgKGluZm8tPnRyYW5zZm9ybV9w
cm9jLmZuX29pZCkKCQkJCWF2X3B1c2gocmVzdWx0LCAoU1YgKikgRGF0dW1HZXRQb2ludGVy
KEZ1bmN0aW9uQ2FsbDEoJmluZm8tPnRyYW5zZm9ybV9wcm9jLCBpdGVtdmFsdWUpKSk7CgkJ
CWVsc2UgaWYgKGluZm8tPmVsZW1faXNfcm93dHlwZSkKCQkJCS8qIEhhbmRsZSBjb21wb3Np
dGUgdHlwZSBlbGVtZW50cyAqLwoJCQkJYXZfcHVzaChyZXN1bHQsIHBscGVybF9oYXNoX2Zy
b21fZGF0dW0oaXRlbXZhbHVlKSk7CgkJCWVsc2UKCQkJewoJCQkJY2hhcgkgICAqdmFsID0g
T3V0cHV0RnVuY3Rpb25DYWxsKCZpbmZvLT5wcm9jLCBpdGVtdmFsdWUpOwoKCQkJCWF2X3B1
c2gocmVzdWx0LCBjc3RyMnN2KHZhbCkpOwoJCQl9CgkJfQoJfQoJcmV0dXJuIG5ld1JWX25v
aW5jKChTViAqKSByZXN1bHQpOwp9CgovKiBTZXQgdXAgdGhlIGFyZ3VtZW50cyBmb3IgYSB0
cmlnZ2VyIGNhbGwuICovCnN0YXRpYyBTViAgKgpwbHBlcmxfdHJpZ2dlcl9idWlsZF9hcmdz
KEZ1bmN0aW9uQ2FsbEluZm8gZmNpbmZvKQp7CglkVEhYOwoJVHJpZ2dlckRhdGEgKnRkYXRh
OwoJVHVwbGVEZXNjCXR1cGRlc2M7CglpbnQJCQlpOwoJY2hhcgkgICAqbGV2ZWw7CgljaGFy
CSAgICpldmVudDsKCWNoYXIJICAgKnJlbGlkOwoJY2hhcgkgICAqd2hlbjsKCUhWCQkgICAq
aHY7CgoJaHYgPSBuZXdIVigpOwoJaHZfa3NwbGl0KGh2LCAxMik7CQkJLyogcHJlLWdyb3cg
dGhlIGhhc2ggKi8KCgl0ZGF0YSA9IChUcmlnZ2VyRGF0YSAqKSBmY2luZm8tPmNvbnRleHQ7
Cgl0dXBkZXNjID0gdGRhdGEtPnRnX3JlbGF0aW9uLT5yZF9hdHQ7CgoJcmVsaWQgPSBEYXR1
bUdldENTdHJpbmcoCgkJCQkJCQlEaXJlY3RGdW5jdGlvbkNhbGwxKG9pZG91dCwKCQkJCQkJ
CQkJCQkJT2JqZWN0SWRHZXREYXR1bSh0ZGF0YS0+dGdfcmVsYXRpb24tPnJkX2lkKQoJCQkJ
CQkJCQkJCQkpCgkJKTsKCglodl9zdG9yZV9zdHJpbmcoaHYsICJuYW1lIiwgY3N0cjJzdih0
ZGF0YS0+dGdfdHJpZ2dlci0+dGduYW1lKSk7Cglodl9zdG9yZV9zdHJpbmcoaHYsICJyZWxp
ZCIsIGNzdHIyc3YocmVsaWQpKTsKCgkvKgoJICogTm90ZTogSW4gQkVGT1JFIHRyaWdnZXIs
IHN0b3JlZCBnZW5lcmF0ZWQgY29sdW1ucyBhcmUgbm90IGNvbXB1dGVkIHlldCwKCSAqIHNv
IGRvbid0IG1ha2UgdGhlbSBhY2Nlc3NpYmxlIGluIE5FVyByb3cuCgkgKi8KCglpZiAoVFJJ
R0dFUl9GSVJFRF9CWV9JTlNFUlQodGRhdGEtPnRnX2V2ZW50KSkKCXsKCQlldmVudCA9ICJJ
TlNFUlQiOwoJCWlmIChUUklHR0VSX0ZJUkVEX0ZPUl9ST1codGRhdGEtPnRnX2V2ZW50KSkK
CQkJaHZfc3RvcmVfc3RyaW5nKGh2LCAibmV3IiwKCQkJCQkJCXBscGVybF9oYXNoX2Zyb21f
dHVwbGUodGRhdGEtPnRnX3RyaWd0dXBsZSwKCQkJCQkJCQkJCQkJICAgdHVwZGVzYywKCQkJ
CQkJCQkJCQkJICAgIVRSSUdHRVJfRklSRURfQkVGT1JFKHRkYXRhLT50Z19ldmVudCkpKTsK
CX0KCWVsc2UgaWYgKFRSSUdHRVJfRklSRURfQllfREVMRVRFKHRkYXRhLT50Z19ldmVudCkp
Cgl7CgkJZXZlbnQgPSAiREVMRVRFIjsKCQlpZiAoVFJJR0dFUl9GSVJFRF9GT1JfUk9XKHRk
YXRhLT50Z19ldmVudCkpCgkJCWh2X3N0b3JlX3N0cmluZyhodiwgIm9sZCIsCgkJCQkJCQlw
bHBlcmxfaGFzaF9mcm9tX3R1cGxlKHRkYXRhLT50Z190cmlndHVwbGUsCgkJCQkJCQkJCQkJ
CSAgIHR1cGRlc2MsCgkJCQkJCQkJCQkJCSAgIHRydWUpKTsKCX0KCWVsc2UgaWYgKFRSSUdH
RVJfRklSRURfQllfVVBEQVRFKHRkYXRhLT50Z19ldmVudCkpCgl7CgkJZXZlbnQgPSAiVVBE
QVRFIjsKCQlpZiAoVFJJR0dFUl9GSVJFRF9GT1JfUk9XKHRkYXRhLT50Z19ldmVudCkpCgkJ
ewoJCQlodl9zdG9yZV9zdHJpbmcoaHYsICJvbGQiLAoJCQkJCQkJcGxwZXJsX2hhc2hfZnJv
bV90dXBsZSh0ZGF0YS0+dGdfdHJpZ3R1cGxlLAoJCQkJCQkJCQkJCQkgICB0dXBkZXNjLAoJ
CQkJCQkJCQkJCQkgICB0cnVlKSk7CgkJCWh2X3N0b3JlX3N0cmluZyhodiwgIm5ldyIsCgkJ
CQkJCQlwbHBlcmxfaGFzaF9mcm9tX3R1cGxlKHRkYXRhLT50Z19uZXd0dXBsZSwKCQkJCQkJ
CQkJCQkJICAgdHVwZGVzYywKCQkJCQkJCQkJCQkJICAgIVRSSUdHRVJfRklSRURfQkVGT1JF
KHRkYXRhLT50Z19ldmVudCkpKTsKCQl9Cgl9CgllbHNlIGlmIChUUklHR0VSX0ZJUkVEX0JZ
X1RSVU5DQVRFKHRkYXRhLT50Z19ldmVudCkpCgkJZXZlbnQgPSAiVFJVTkNBVEUiOwoJZWxz
ZQoJCWV2ZW50ID0gIlVOS05PV04iOwoKCWh2X3N0b3JlX3N0cmluZyhodiwgImV2ZW50Iiwg
Y3N0cjJzdihldmVudCkpOwoJaHZfc3RvcmVfc3RyaW5nKGh2LCAiYXJnYyIsIG5ld1NWaXYo
dGRhdGEtPnRnX3RyaWdnZXItPnRnbmFyZ3MpKTsKCglpZiAodGRhdGEtPnRnX3RyaWdnZXIt
PnRnbmFyZ3MgPiAwKQoJewoJCUFWCQkgICAqYXYgPSBuZXdBVigpOwoKCQlhdl9leHRlbmQo
YXYsIHRkYXRhLT50Z190cmlnZ2VyLT50Z25hcmdzKTsKCQlmb3IgKGkgPSAwOyBpIDwgdGRh
dGEtPnRnX3RyaWdnZXItPnRnbmFyZ3M7IGkrKykKCQkJYXZfcHVzaChhdiwgY3N0cjJzdih0
ZGF0YS0+dGdfdHJpZ2dlci0+dGdhcmdzW2ldKSk7CgkJaHZfc3RvcmVfc3RyaW5nKGh2LCAi
YXJncyIsIG5ld1JWX25vaW5jKChTViAqKSBhdikpOwoJfQoKCWh2X3N0b3JlX3N0cmluZyho
diwgInJlbG5hbWUiLAoJCQkJCWNzdHIyc3YoU1BJX2dldHJlbG5hbWUodGRhdGEtPnRnX3Jl
bGF0aW9uKSkpOwoKCWh2X3N0b3JlX3N0cmluZyhodiwgInRhYmxlX25hbWUiLAoJCQkJCWNz
dHIyc3YoU1BJX2dldHJlbG5hbWUodGRhdGEtPnRnX3JlbGF0aW9uKSkpOwoKCWh2X3N0b3Jl
X3N0cmluZyhodiwgInRhYmxlX3NjaGVtYSIsCgkJCQkJY3N0cjJzdihTUElfZ2V0bnNwbmFt
ZSh0ZGF0YS0+dGdfcmVsYXRpb24pKSk7CgoJaWYgKFRSSUdHRVJfRklSRURfQkVGT1JFKHRk
YXRhLT50Z19ldmVudCkpCgkJd2hlbiA9ICJCRUZPUkUiOwoJZWxzZSBpZiAoVFJJR0dFUl9G
SVJFRF9BRlRFUih0ZGF0YS0+dGdfZXZlbnQpKQoJCXdoZW4gPSAiQUZURVIiOwoJZWxzZSBp
ZiAoVFJJR0dFUl9GSVJFRF9JTlNURUFEKHRkYXRhLT50Z19ldmVudCkpCgkJd2hlbiA9ICJJ
TlNURUFEIE9GIjsKCWVsc2UKCQl3aGVuID0gIlVOS05PV04iOwoJaHZfc3RvcmVfc3RyaW5n
KGh2LCAid2hlbiIsIGNzdHIyc3Yod2hlbikpOwoKCWlmIChUUklHR0VSX0ZJUkVEX0ZPUl9S
T1codGRhdGEtPnRnX2V2ZW50KSkKCQlsZXZlbCA9ICJST1ciOwoJZWxzZSBpZiAoVFJJR0dF
Ul9GSVJFRF9GT1JfU1RBVEVNRU5UKHRkYXRhLT50Z19ldmVudCkpCgkJbGV2ZWwgPSAiU1RB
VEVNRU5UIjsKCWVsc2UKCQlsZXZlbCA9ICJVTktOT1dOIjsKCWh2X3N0b3JlX3N0cmluZyho
diwgImxldmVsIiwgY3N0cjJzdihsZXZlbCkpOwoKCXJldHVybiBuZXdSVl9ub2luYygoU1Yg
KikgaHYpOwp9CgoKLyogU2V0IHVwIHRoZSBhcmd1bWVudHMgZm9yIGFuIGV2ZW50IHRyaWdn
ZXIgY2FsbC4gKi8Kc3RhdGljIFNWICAqCnBscGVybF9ldmVudF90cmlnZ2VyX2J1aWxkX2Fy
Z3MoRnVuY3Rpb25DYWxsSW5mbyBmY2luZm8pCnsKCWRUSFg7CglFdmVudFRyaWdnZXJEYXRh
ICp0ZGF0YTsKCUhWCQkgICAqaHY7CgoJaHYgPSBuZXdIVigpOwoKCXRkYXRhID0gKEV2ZW50
VHJpZ2dlckRhdGEgKikgZmNpbmZvLT5jb250ZXh0OwoKCWh2X3N0b3JlX3N0cmluZyhodiwg
ImV2ZW50IiwgY3N0cjJzdih0ZGF0YS0+ZXZlbnQpKTsKCWh2X3N0b3JlX3N0cmluZyhodiwg
InRhZyIsIGNzdHIyc3YodGRhdGEtPnRhZykpOwoKCXJldHVybiBuZXdSVl9ub2luYygoU1Yg
KikgaHYpOwp9CgovKiBDb25zdHJ1Y3QgdGhlIG1vZGlmaWVkIG5ldyB0dXBsZSB0byBiZSBy
ZXR1cm5lZCBmcm9tIGEgdHJpZ2dlci4gKi8Kc3RhdGljIEhlYXBUdXBsZQpwbHBlcmxfbW9k
aWZ5X3R1cGxlKEhWICpodlRELCBUcmlnZ2VyRGF0YSAqdGRhdGEsIEhlYXBUdXBsZSBvdHVw
KQp7CglkVEhYOwoJU1YJCSAgKipzdnA7CglIVgkJICAgKmh2TmV3OwoJSEUJCSAgICpoZTsK
CUhlYXBUdXBsZQlydHVwOwoJVHVwbGVEZXNjCXR1cGRlc2M7CglpbnQJCQluYXR0czsKCURh
dHVtCSAgICptb2R2YWx1ZXM7Cglib29sCSAgICptb2RudWxsczsKCWJvb2wJICAgKm1vZHJl
cGxzOwoKCXN2cCA9IGh2X2ZldGNoX3N0cmluZyhodlRELCAibmV3Iik7CglpZiAoIXN2cCkK
CQllcmVwb3J0KEVSUk9SLAoJCQkJKGVycmNvZGUoRVJSQ09ERV9VTkRFRklORURfQ09MVU1O
KSwKCQkJCSBlcnJtc2coIiRfVEQtPntuZXd9IGRvZXMgbm90IGV4aXN0IikpKTsKCWlmICgh
U3ZPSygqc3ZwKSB8fCAhU3ZST0soKnN2cCkgfHwgU3ZUWVBFKFN2UlYoKnN2cCkpICE9IFNW
dF9QVkhWKQoJCWVyZXBvcnQoRVJST1IsCgkJCQkoZXJyY29kZShFUlJDT0RFX0RBVEFUWVBF
X01JU01BVENIKSwKCQkJCSBlcnJtc2coIiRfVEQtPntuZXd9IGlzIG5vdCBhIGhhc2ggcmVm
ZXJlbmNlIikpKTsKCWh2TmV3ID0gKEhWICopIFN2UlYoKnN2cCk7CgoJdHVwZGVzYyA9IHRk
YXRhLT50Z19yZWxhdGlvbi0+cmRfYXR0OwoJbmF0dHMgPSB0dXBkZXNjLT5uYXR0czsKCglt
b2R2YWx1ZXMgPSAoRGF0dW0gKikgcGFsbG9jMChuYXR0cyAqIHNpemVvZihEYXR1bSkpOwoJ
bW9kbnVsbHMgPSAoYm9vbCAqKSBwYWxsb2MwKG5hdHRzICogc2l6ZW9mKGJvb2wpKTsKCW1v
ZHJlcGxzID0gKGJvb2wgKikgcGFsbG9jMChuYXR0cyAqIHNpemVvZihib29sKSk7CgoJaHZf
aXRlcmluaXQoaHZOZXcpOwoJd2hpbGUgKChoZSA9IGh2X2l0ZXJuZXh0KGh2TmV3KSkpCgl7
CgkJY2hhcgkgICAqa2V5ID0gaGVrMmNzdHIoaGUpOwoJCVNWCQkgICAqdmFsID0gSGVWQUwo
aGUpOwoJCWludAkJCWF0dG4gPSBTUElfZm51bWJlcih0dXBkZXNjLCBrZXkpOwoJCUZvcm1f
cGdfYXR0cmlidXRlIGF0dHIgPSBUdXBsZURlc2NBdHRyKHR1cGRlc2MsIGF0dG4gLSAxKTsK
CgkJaWYgKGF0dG4gPT0gU1BJX0VSUk9SX05PQVRUUklCVVRFKQoJCQllcmVwb3J0KEVSUk9S
LAoJCQkJCShlcnJjb2RlKEVSUkNPREVfVU5ERUZJTkVEX0NPTFVNTiksCgkJCQkJIGVycm1z
ZygiUGVybCBoYXNoIGNvbnRhaW5zIG5vbmV4aXN0ZW50IGNvbHVtbiBcIiVzXCIiLAoJCQkJ
CQkJa2V5KSkpOwoJCWlmIChhdHRuIDw9IDApCgkJCWVyZXBvcnQoRVJST1IsCgkJCQkJKGVy
cmNvZGUoRVJSQ09ERV9GRUFUVVJFX05PVF9TVVBQT1JURUQpLAoJCQkJCSBlcnJtc2coImNh
bm5vdCBzZXQgc3lzdGVtIGF0dHJpYnV0ZSBcIiVzXCIiLAoJCQkJCQkJa2V5KSkpOwoJCWlm
IChhdHRyLT5hdHRnZW5lcmF0ZWQpCgkJCWVyZXBvcnQoRVJST1IsCgkJCQkJKGVycmNvZGUo
RVJSQ09ERV9FX1JfSV9FX1RSSUdHRVJfUFJPVE9DT0xfVklPTEFURUQpLAoJCQkJCSBlcnJt
c2coImNhbm5vdCBzZXQgZ2VuZXJhdGVkIGNvbHVtbiBcIiVzXCIiLAoJCQkJCQkJa2V5KSkp
OwoKCQltb2R2YWx1ZXNbYXR0biAtIDFdID0gcGxwZXJsX3N2X3RvX2RhdHVtKHZhbCwKCQkJ
CQkJCQkJCQkJIGF0dHItPmF0dHR5cGlkLAoJCQkJCQkJCQkJCQkgYXR0ci0+YXR0dHlwbW9k
LAoJCQkJCQkJCQkJCQkgTlVMTCwKCQkJCQkJCQkJCQkJIE5VTEwsCgkJCQkJCQkJCQkJCSBJ
bnZhbGlkT2lkLAoJCQkJCQkJCQkJCQkgJm1vZG51bGxzW2F0dG4gLSAxXSk7CgkJbW9kcmVw
bHNbYXR0biAtIDFdID0gdHJ1ZTsKCgkJcGZyZWUoa2V5KTsKCX0KCWh2X2l0ZXJpbml0KGh2
TmV3KTsKCglydHVwID0gaGVhcF9tb2RpZnlfdHVwbGUob3R1cCwgdHVwZGVzYywgbW9kdmFs
dWVzLCBtb2RudWxscywgbW9kcmVwbHMpOwoKCXBmcmVlKG1vZHZhbHVlcyk7CglwZnJlZSht
b2RudWxscyk7CglwZnJlZShtb2RyZXBscyk7CgoJcmV0dXJuIHJ0dXA7Cn0KCgovKgogKiBU
aGVyZSBhcmUgdGhyZWUgZXh0ZXJuYWxseSB2aXNpYmxlIHBpZWNlcyB0byBwbHBlcmw6IHBs
cGVybF9jYWxsX2hhbmRsZXIsCiAqIHBscGVybF9pbmxpbmVfaGFuZGxlciwgYW5kIHBscGVy
bF92YWxpZGF0b3IuCiAqLwoKLyoKICogVGhlIGNhbGwgaGFuZGxlciBpcyBjYWxsZWQgdG8g
cnVuIG5vcm1hbCBmdW5jdGlvbnMgKGluY2x1ZGluZyB0cmlnZ2VyCiAqIGZ1bmN0aW9ucykg
dGhhdCBhcmUgZGVmaW5lZCBpbiBwZ19wcm9jLgogKi8KUEdfRlVOQ1RJT05fSU5GT19WMShw
bHBlcmxfY2FsbF9oYW5kbGVyKTsKCkRhdHVtCnBscGVybF9jYWxsX2hhbmRsZXIoUEdfRlVO
Q1RJT05fQVJHUykKewoJRGF0dW0JCXJldHZhbDsKCXBscGVybF9jYWxsX2RhdGEgKnZvbGF0
aWxlIHNhdmVfY2FsbF9kYXRhID0gY3VycmVudF9jYWxsX2RhdGE7CglwbHBlcmxfaW50ZXJw
X2Rlc2MgKnZvbGF0aWxlIG9sZGludGVycCA9IHBscGVybF9hY3RpdmVfaW50ZXJwOwoJcGxw
ZXJsX2NhbGxfZGF0YSB0aGlzX2NhbGxfZGF0YTsKCgkvKiBJbml0aWFsaXplIGN1cnJlbnQt
Y2FsbCBzdGF0dXMgcmVjb3JkICovCglNZW1TZXQoJnRoaXNfY2FsbF9kYXRhLCAwLCBzaXpl
b2YodGhpc19jYWxsX2RhdGEpKTsKCXRoaXNfY2FsbF9kYXRhLmZjaW5mbyA9IGZjaW5mbzsK
CglQR19UUlkoKTsKCXsKCQljdXJyZW50X2NhbGxfZGF0YSA9ICZ0aGlzX2NhbGxfZGF0YTsK
CQlpZiAoQ0FMTEVEX0FTX1RSSUdHRVIoZmNpbmZvKSkKCQkJcmV0dmFsID0gUG9pbnRlckdl
dERhdHVtKHBscGVybF90cmlnZ2VyX2hhbmRsZXIoZmNpbmZvKSk7CgkJZWxzZSBpZiAoQ0FM
TEVEX0FTX0VWRU5UX1RSSUdHRVIoZmNpbmZvKSkKCQl7CgkJCXBscGVybF9ldmVudF90cmln
Z2VyX2hhbmRsZXIoZmNpbmZvKTsKCQkJcmV0dmFsID0gKERhdHVtKSAwOwoJCX0KCQllbHNl
CgkJCXJldHZhbCA9IHBscGVybF9mdW5jX2hhbmRsZXIoZmNpbmZvKTsKCX0KCVBHX0NBVENI
KCk7Cgl7CgkJY3VycmVudF9jYWxsX2RhdGEgPSBzYXZlX2NhbGxfZGF0YTsKCQlhY3RpdmF0
ZV9pbnRlcnByZXRlcihvbGRpbnRlcnApOwoJCWlmICh0aGlzX2NhbGxfZGF0YS5wcm9kZXNj
KQoJCQlkZWNyZW1lbnRfcHJvZGVzY19yZWZjb3VudCh0aGlzX2NhbGxfZGF0YS5wcm9kZXNj
KTsKCQlQR19SRV9USFJPVygpOwoJfQoJUEdfRU5EX1RSWSgpOwoKCWN1cnJlbnRfY2FsbF9k
YXRhID0gc2F2ZV9jYWxsX2RhdGE7CglhY3RpdmF0ZV9pbnRlcnByZXRlcihvbGRpbnRlcnAp
OwoJaWYgKHRoaXNfY2FsbF9kYXRhLnByb2Rlc2MpCgkJZGVjcmVtZW50X3Byb2Rlc2NfcmVm
Y291bnQodGhpc19jYWxsX2RhdGEucHJvZGVzYyk7CglyZXR1cm4gcmV0dmFsOwp9CgovKgog
KiBUaGUgaW5saW5lIGhhbmRsZXIgcnVucyBhbm9ueW1vdXMgY29kZSBibG9ja3MgKERPIGJs
b2NrcykuCiAqLwpQR19GVU5DVElPTl9JTkZPX1YxKHBscGVybF9pbmxpbmVfaGFuZGxlcik7
CgpEYXR1bQpwbHBlcmxfaW5saW5lX2hhbmRsZXIoUEdfRlVOQ1RJT05fQVJHUykKewoJTE9D
QUxfRkNJTkZPKGZha2VfZmNpbmZvLCAwKTsKCUlubGluZUNvZGVCbG9jayAqY29kZWJsb2Nr
ID0gKElubGluZUNvZGVCbG9jayAqKSBQR19HRVRBUkdfUE9JTlRFUigwKTsKCUZtZ3JJbmZv
CWZsaW5mbzsKCXBscGVybF9wcm9jX2Rlc2MgZGVzYzsKCXBscGVybF9jYWxsX2RhdGEgKnZv
bGF0aWxlIHNhdmVfY2FsbF9kYXRhID0gY3VycmVudF9jYWxsX2RhdGE7CglwbHBlcmxfaW50
ZXJwX2Rlc2MgKnZvbGF0aWxlIG9sZGludGVycCA9IHBscGVybF9hY3RpdmVfaW50ZXJwOwoJ
cGxwZXJsX2NhbGxfZGF0YSB0aGlzX2NhbGxfZGF0YTsKCUVycm9yQ29udGV4dENhbGxiYWNr
IHBsX2Vycm9yX2NvbnRleHQ7CgoJLyogSW5pdGlhbGl6ZSBjdXJyZW50LWNhbGwgc3RhdHVz
IHJlY29yZCAqLwoJTWVtU2V0KCZ0aGlzX2NhbGxfZGF0YSwgMCwgc2l6ZW9mKHRoaXNfY2Fs
bF9kYXRhKSk7CgoJLyogU2V0IHVwIGEgY2FsbGJhY2sgZm9yIGVycm9yIHJlcG9ydGluZyAq
LwoJcGxfZXJyb3JfY29udGV4dC5jYWxsYmFjayA9IHBscGVybF9pbmxpbmVfY2FsbGJhY2s7
CglwbF9lcnJvcl9jb250ZXh0LnByZXZpb3VzID0gZXJyb3JfY29udGV4dF9zdGFjazsKCXBs
X2Vycm9yX2NvbnRleHQuYXJnID0gTlVMTDsKCWVycm9yX2NvbnRleHRfc3RhY2sgPSAmcGxf
ZXJyb3JfY29udGV4dDsKCgkvKgoJICogU2V0IHVwIGEgZmFrZSBmY2luZm8gYW5kIGRlc2Ny
aXB0b3Igd2l0aCBqdXN0IGVub3VnaCBpbmZvIHRvIHNhdGlzZnkKCSAqIHBscGVybF9jYWxs
X3BlcmxfZnVuYygpLiAgSW4gcGFydGljdWxhciBub3RlIHRoYXQgdGhpcyBzZXRzIHRoaW5n
cyB1cAoJICogd2l0aCBubyBhcmd1bWVudHMgcGFzc2VkLCBhbmQgYSByZXN1bHQgdHlwZSBv
ZiBWT0lELgoJICovCglNZW1TZXQoZmFrZV9mY2luZm8sIDAsIFNpemVGb3JGdW5jdGlvbkNh
bGxJbmZvKDApKTsKCU1lbVNldCgmZmxpbmZvLCAwLCBzaXplb2YoZmxpbmZvKSk7CglNZW1T
ZXQoJmRlc2MsIDAsIHNpemVvZihkZXNjKSk7CglmYWtlX2ZjaW5mby0+ZmxpbmZvID0gJmZs
aW5mbzsKCWZsaW5mby5mbl9vaWQgPSBJbnZhbGlkT2lkOwoJZmxpbmZvLmZuX21jeHQgPSBD
dXJyZW50TWVtb3J5Q29udGV4dDsKCglkZXNjLnByb25hbWUgPSAiaW5saW5lX2NvZGVfYmxv
Y2siOwoJZGVzYy5mbl9yZWFkb25seSA9IGZhbHNlOwoKCWRlc2MubGFuZ19vaWQgPSBjb2Rl
YmxvY2stPmxhbmdPaWQ7CglkZXNjLnRyZnR5cGVzID0gTklMOwoJZGVzYy5sYW5wbHRydXN0
ZWQgPSBjb2RlYmxvY2stPmxhbmdJc1RydXN0ZWQ7CgoJZGVzYy5mbl9yZXRpc3R1cGxlID0g
ZmFsc2U7CglkZXNjLmZuX3JldGlzc2V0ID0gZmFsc2U7CglkZXNjLmZuX3JldGlzYXJyYXkg
PSBmYWxzZTsKCWRlc2MucmVzdWx0X29pZCA9IEludmFsaWRPaWQ7CglkZXNjLm5hcmdzID0g
MDsKCWRlc2MucmVmZXJlbmNlID0gTlVMTDsKCgl0aGlzX2NhbGxfZGF0YS5mY2luZm8gPSBm
YWtlX2ZjaW5mbzsKCXRoaXNfY2FsbF9kYXRhLnByb2Rlc2MgPSAmZGVzYzsKCS8qIHdlIGRv
IG5vdCBib3RoZXIgd2l0aCByZWZjb3VudGluZyB0aGUgZmFrZSBwcm9kZXNjICovCgoJUEdf
VFJZKCk7Cgl7CgkJU1YJCSAgICpwZXJscmV0OwoKCQljdXJyZW50X2NhbGxfZGF0YSA9ICZ0
aGlzX2NhbGxfZGF0YTsKCgkJaWYgKFNQSV9jb25uZWN0X2V4dChjb2RlYmxvY2stPmF0b21p
YyA/IDAgOiBTUElfT1BUX05PTkFUT01JQykgIT0gU1BJX09LX0NPTk5FQ1QpCgkJCWVsb2co
RVJST1IsICJjb3VsZCBub3QgY29ubmVjdCB0byBTUEkgbWFuYWdlciIpOwoKCQlzZWxlY3Rf
cGVybF9jb250ZXh0KGRlc2MubGFucGx0cnVzdGVkKTsKCgkJcGxwZXJsX2NyZWF0ZV9zdWIo
JmRlc2MsIGNvZGVibG9jay0+c291cmNlX3RleHQsIDApOwoKCQlpZiAoIWRlc2MucmVmZXJl
bmNlKQkvKiBjYW4gdGhpcyBoYXBwZW4/ICovCgkJCWVsb2coRVJST1IsICJjb3VsZCBub3Qg
Y3JlYXRlIGludGVybmFsIHByb2NlZHVyZSBmb3IgYW5vbnltb3VzIGNvZGUgYmxvY2siKTsK
CgkJcGVybHJldCA9IHBscGVybF9jYWxsX3BlcmxfZnVuYygmZGVzYywgZmFrZV9mY2luZm8p
OwoKCQlTdlJFRkNOVF9kZWNfY3VycmVudChwZXJscmV0KTsKCgkJaWYgKFNQSV9maW5pc2go
KSAhPSBTUElfT0tfRklOSVNIKQoJCQllbG9nKEVSUk9SLCAiU1BJX2ZpbmlzaCgpIGZhaWxl
ZCIpOwoJfQoJUEdfQ0FUQ0goKTsKCXsKCQlpZiAoZGVzYy5yZWZlcmVuY2UpCgkJCVN2UkVG
Q05UX2RlY19jdXJyZW50KGRlc2MucmVmZXJlbmNlKTsKCQljdXJyZW50X2NhbGxfZGF0YSA9
IHNhdmVfY2FsbF9kYXRhOwoJCWFjdGl2YXRlX2ludGVycHJldGVyKG9sZGludGVycCk7CgkJ
UEdfUkVfVEhST1coKTsKCX0KCVBHX0VORF9UUlkoKTsKCglpZiAoZGVzYy5yZWZlcmVuY2Up
CgkJU3ZSRUZDTlRfZGVjX2N1cnJlbnQoZGVzYy5yZWZlcmVuY2UpOwoKCWN1cnJlbnRfY2Fs
bF9kYXRhID0gc2F2ZV9jYWxsX2RhdGE7CglhY3RpdmF0ZV9pbnRlcnByZXRlcihvbGRpbnRl
cnApOwoKCWVycm9yX2NvbnRleHRfc3RhY2sgPSBwbF9lcnJvcl9jb250ZXh0LnByZXZpb3Vz
OwoKCVBHX1JFVFVSTl9WT0lEKCk7Cn0KCi8qCiAqIFRoZSB2YWxpZGF0b3IgaXMgY2FsbGVk
IGR1cmluZyBDUkVBVEUgRlVOQ1RJT04gdG8gdmFsaWRhdGUgdGhlIGZ1bmN0aW9uCiAqIGJl
aW5nIGNyZWF0ZWQvcmVwbGFjZWQuIFRoZSBwcmVjaXNlIGJlaGF2aW9yIG9mIHRoZSB2YWxp
ZGF0b3IgbWF5IGJlCiAqIG1vZGlmaWVkIGJ5IHRoZSBjaGVja19mdW5jdGlvbl9ib2RpZXMg
R1VDLgogKi8KUEdfRlVOQ1RJT05fSU5GT19WMShwbHBlcmxfdmFsaWRhdG9yKTsKCkRhdHVt
CnBscGVybF92YWxpZGF0b3IoUEdfRlVOQ1RJT05fQVJHUykKewoJT2lkCQkJZnVuY29pZCA9
IFBHX0dFVEFSR19PSUQoMCk7CglIZWFwVHVwbGUJdHVwbGU7CglGb3JtX3BnX3Byb2MgcHJv
YzsKCWNoYXIJCWZ1bmN0eXB0eXBlOwoJaW50CQkJbnVtYXJnczsKCU9pZAkJICAgKmFyZ3R5
cGVzOwoJY2hhcgkgICoqYXJnbmFtZXM7CgljaGFyCSAgICphcmdtb2RlczsKCWJvb2wJCWlz
X3RyaWdnZXIgPSBmYWxzZTsKCWJvb2wJCWlzX2V2ZW50X3RyaWdnZXIgPSBmYWxzZTsKCWlu
dAkJCWk7CgoJaWYgKCFDaGVja0Z1bmN0aW9uVmFsaWRhdG9yQWNjZXNzKGZjaW5mby0+Zmxp
bmZvLT5mbl9vaWQsIGZ1bmNvaWQpKQoJCVBHX1JFVFVSTl9WT0lEKCk7CgoJLyogR2V0IHRo
ZSBuZXcgZnVuY3Rpb24ncyBwZ19wcm9jIGVudHJ5ICovCgl0dXBsZSA9IFNlYXJjaFN5c0Nh
Y2hlMShQUk9DT0lELCBPYmplY3RJZEdldERhdHVtKGZ1bmNvaWQpKTsKCWlmICghSGVhcFR1
cGxlSXNWYWxpZCh0dXBsZSkpCgkJZWxvZyhFUlJPUiwgImNhY2hlIGxvb2t1cCBmYWlsZWQg
Zm9yIGZ1bmN0aW9uICV1IiwgZnVuY29pZCk7Cglwcm9jID0gKEZvcm1fcGdfcHJvYykgR0VU
U1RSVUNUKHR1cGxlKTsKCglmdW5jdHlwdHlwZSA9IGdldF90eXB0eXBlKHByb2MtPnByb3Jl
dHR5cGUpOwoKCS8qIERpc2FsbG93IHBzZXVkb3R5cGUgcmVzdWx0ICovCgkvKiBleGNlcHQg
Zm9yIFRSSUdHRVIsIEVWVFRSSUdHRVIsIFJFQ09SRCwgb3IgVk9JRCAqLwoJaWYgKGZ1bmN0
eXB0eXBlID09IFRZUFRZUEVfUFNFVURPKQoJewoJCS8qIHdlIGFzc3VtZSBPUEFRVUUgd2l0
aCBubyBhcmd1bWVudHMgbWVhbnMgYSB0cmlnZ2VyICovCgkJaWYgKHByb2MtPnByb3JldHR5
cGUgPT0gVFJJR0dFUk9JRCB8fAoJCQkocHJvYy0+cHJvcmV0dHlwZSA9PSBPUEFRVUVPSUQg
JiYgcHJvYy0+cHJvbmFyZ3MgPT0gMCkpCgkJCWlzX3RyaWdnZXIgPSB0cnVlOwoJCWVsc2Ug
aWYgKHByb2MtPnByb3JldHR5cGUgPT0gRVZUVFJJR0dFUk9JRCkKCQkJaXNfZXZlbnRfdHJp
Z2dlciA9IHRydWU7CgkJZWxzZSBpZiAocHJvYy0+cHJvcmV0dHlwZSAhPSBSRUNPUkRPSUQg
JiYKCQkJCSBwcm9jLT5wcm9yZXR0eXBlICE9IFZPSURPSUQpCgkJCWVyZXBvcnQoRVJST1Is
CgkJCQkJKGVycmNvZGUoRVJSQ09ERV9GRUFUVVJFX05PVF9TVVBQT1JURUQpLAoJCQkJCSBl
cnJtc2coIlBML1BlcmwgZnVuY3Rpb25zIGNhbm5vdCByZXR1cm4gdHlwZSAlcyIsCgkJCQkJ
CQlmb3JtYXRfdHlwZV9iZShwcm9jLT5wcm9yZXR0eXBlKSkpKTsKCX0KCgkvKiBEaXNhbGxv
dyBwc2V1ZG90eXBlcyBpbiBhcmd1bWVudHMgKGVpdGhlciBJTiBvciBPVVQpICovCgludW1h
cmdzID0gZ2V0X2Z1bmNfYXJnX2luZm8odHVwbGUsCgkJCQkJCQkJJmFyZ3R5cGVzLCAmYXJn
bmFtZXMsICZhcmdtb2Rlcyk7Cglmb3IgKGkgPSAwOyBpIDwgbnVtYXJnczsgaSsrKQoJewoJ
CWlmIChnZXRfdHlwdHlwZShhcmd0eXBlc1tpXSkgPT0gVFlQVFlQRV9QU0VVRE8gJiYKCQkJ
YXJndHlwZXNbaV0gIT0gUkVDT1JET0lEKQoJCQllcmVwb3J0KEVSUk9SLAoJCQkJCShlcnJj
b2RlKEVSUkNPREVfRkVBVFVSRV9OT1RfU1VQUE9SVEVEKSwKCQkJCQkgZXJybXNnKCJQTC9Q
ZXJsIGZ1bmN0aW9ucyBjYW5ub3QgYWNjZXB0IHR5cGUgJXMiLAoJCQkJCQkJZm9ybWF0X3R5
cGVfYmUoYXJndHlwZXNbaV0pKSkpOwoJfQoKCVJlbGVhc2VTeXNDYWNoZSh0dXBsZSk7CgoJ
LyogUG9zdHBvbmUgYm9keSBjaGVja3MgaWYgIWNoZWNrX2Z1bmN0aW9uX2JvZGllcyAqLwoJ
aWYgKGNoZWNrX2Z1bmN0aW9uX2JvZGllcykKCXsKCQkodm9pZCkgY29tcGlsZV9wbHBlcmxf
ZnVuY3Rpb24oZnVuY29pZCwgaXNfdHJpZ2dlciwgaXNfZXZlbnRfdHJpZ2dlcik7Cgl9CgoJ
LyogdGhlIHJlc3VsdCBvZiBhIHZhbGlkYXRvciBpcyBpZ25vcmVkICovCglQR19SRVRVUk5f
Vk9JRCgpOwp9CgoKLyoKICogcGxwZXJsdSBsaWtld2lzZSByZXF1aXJlcyB0aHJlZSBleHRl
cm5hbGx5IHZpc2libGUgZnVuY3Rpb25zOgogKiBwbHBlcmx1X2NhbGxfaGFuZGxlciwgcGxw
ZXJsdV9pbmxpbmVfaGFuZGxlciwgYW5kIHBscGVybHVfdmFsaWRhdG9yLgogKiBUaGVzZSBh
cmUgY3VycmVudGx5IGp1c3QgYWxpYXNlcyB0aGF0IHNlbmQgY29udHJvbCB0byB0aGUgcGxw
ZXJsCiAqIGhhbmRsZXIgZnVuY3Rpb25zLCBhbmQgd2UgZGVjaWRlIHdoZXRoZXIgYSBwYXJ0
aWN1bGFyIGZ1bmN0aW9uIGlzCiAqIHRydXN0ZWQgb3Igbm90IGJ5IGluc3BlY3RpbmcgdGhl
IGFjdHVhbCBwZ19sYW5ndWFnZSB0dXBsZS4KICovCgpQR19GVU5DVElPTl9JTkZPX1YxKHBs
cGVybHVfY2FsbF9oYW5kbGVyKTsKCkRhdHVtCnBscGVybHVfY2FsbF9oYW5kbGVyKFBHX0ZV
TkNUSU9OX0FSR1MpCnsKCXJldHVybiBwbHBlcmxfY2FsbF9oYW5kbGVyKGZjaW5mbyk7Cn0K
ClBHX0ZVTkNUSU9OX0lORk9fVjEocGxwZXJsdV9pbmxpbmVfaGFuZGxlcik7CgpEYXR1bQpw
bHBlcmx1X2lubGluZV9oYW5kbGVyKFBHX0ZVTkNUSU9OX0FSR1MpCnsKCXJldHVybiBwbHBl
cmxfaW5saW5lX2hhbmRsZXIoZmNpbmZvKTsKfQoKUEdfRlVOQ1RJT05fSU5GT19WMShwbHBl
cmx1X3ZhbGlkYXRvcik7CgpEYXR1bQpwbHBlcmx1X3ZhbGlkYXRvcihQR19GVU5DVElPTl9B
UkdTKQp7CgkvKiBjYWxsIHBscGVybCB2YWxpZGF0b3Igd2l0aCBvdXIgZmNpbmZvIHNvIGl0
IGdldHMgb3VyIG9pZCAqLwoJcmV0dXJuIHBscGVybF92YWxpZGF0b3IoZmNpbmZvKTsKfQoK
Ci8qCiAqIFVzZXMgbWtzYWZlZnVuYy9ta3Vuc2FmZWZ1bmMgdG8gY3JlYXRlIGEgc3Vicm91
dGluZSB3aG9zZSB0ZXh0IGlzCiAqIHN1cHBsaWVkIGluIHMsIGFuZCByZXR1cm5zIGEgcmVm
ZXJlbmNlIHRvIGl0CiAqLwpzdGF0aWMgdm9pZApwbHBlcmxfY3JlYXRlX3N1YihwbHBlcmxf
cHJvY19kZXNjICpwcm9kZXNjLCBjb25zdCBjaGFyICpzLCBPaWQgZm5fb2lkKQp7CglkVEhY
OwoJZFNQOwoJY2hhcgkJc3VibmFtZVtOQU1FREFUQUxFTiArIDQwXTsKCUhWCQkgICAqcHJh
Z21hX2h2ID0gbmV3SFYoKTsKCVNWCQkgICAqc3VicmVmID0gTlVMTDsKCWludAkJCWNvdW50
OwoKCXNwcmludGYoc3VibmFtZSwgIiVzX18ldSIsIHByb2Rlc2MtPnByb25hbWUsIGZuX29p
ZCk7CgoJaWYgKHBscGVybF91c2Vfc3RyaWN0KQoJCWh2X3N0b3JlX3N0cmluZyhwcmFnbWFf
aHYsICJzdHJpY3QiLCAoU1YgKikgbmV3QVYoKSk7CgoJRU5URVI7CglTQVZFVE1QUzsKCVBV
U0hNQVJLKFNQKTsKCUVYVEVORChTUCwgNCk7CglQVVNIcyhzdl8ybW9ydGFsKGNzdHIyc3Yo
c3VibmFtZSkpKTsKCVBVU0hzKHN2XzJtb3J0YWwobmV3UlZfbm9pbmMoKFNWICopIHByYWdt
YV9odikpKTsKCgkvKgoJICogVXNlICdmYWxzZScgZm9yICRwcm9sb2cgaW4gbWtmdW5jLCB3
aGljaCBpcyBrZXB0IGZvciBjb21wYXRpYmlsaXR5IGluCgkgKiBjYXNlIGEgbW9kdWxlIHN1
Y2ggYXMgUG9zdGdyZVNRTDo6UExQZXJsOjpOWVRwcm9mIHJlcGxhY2VzIHRoZSBmdW5jdGlv
bgoJICogY29tcGlsZXIuCgkgKi8KCVBVU0hzKCZQTF9zdl9ubyk7CglQVVNIcyhzdl8ybW9y
dGFsKGNzdHIyc3YocykpKTsKCVBVVEJBQ0s7CgoJLyoKCSAqIEdfS0VFUEVSUiBzZWVtcyB0
byBiZSBuZWVkZWQgaGVyZSwgZWxzZSB3ZSBkb24ndCByZWNvZ25pemUgY29tcGlsZQoJICog
ZXJyb3JzIHByb3Blcmx5LiAgUGVyaGFwcyBpdCdzIGJlY2F1c2UgdGhlcmUncyBhbm90aGVy
IGxldmVsIG9mIGV2YWwKCSAqIGluc2lkZSBta3NhZmVmdW5jPwoJICovCgljb3VudCA9IGNh
bGxfcHYoIlBvc3RncmVTUUw6OkluU2VydmVyOjpta2Z1bmMiLAoJCQkJCUdfU0NBTEFSIHwg
R19FVkFMIHwgR19LRUVQRVJSKTsKCVNQQUdBSU47CgoJaWYgKGNvdW50ID09IDEpCgl7CgkJ
U1YJCSAgICpzdWJfcnYgPSAoU1YgKikgUE9QczsKCgkJaWYgKHN1Yl9ydiAmJiBTdlJPSyhz
dWJfcnYpICYmIFN2VFlQRShTdlJWKHN1Yl9ydikpID09IFNWdF9QVkNWKQoJCXsKCQkJc3Vi
cmVmID0gbmV3UlZfaW5jKFN2UlYoc3ViX3J2KSk7CgkJfQoJfQoKCVBVVEJBQ0s7CglGUkVF
VE1QUzsKCUxFQVZFOwoKCWlmIChTdlRSVUUoRVJSU1YpKQoJCWVyZXBvcnQoRVJST1IsCgkJ
CQkoZXJyY29kZShFUlJDT0RFX1NZTlRBWF9FUlJPUiksCgkJCQkgZXJybXNnKCIlcyIsIHN0
cmlwX3RyYWlsaW5nX3dzKHN2MmNzdHIoRVJSU1YpKSkpKTsKCglpZiAoIXN1YnJlZikKCQll
cmVwb3J0KEVSUk9SLAoJCQkJKGVycmNvZGUoRVJSQ09ERV9TWU5UQVhfRVJST1IpLAoJCQkJ
IGVycm1zZygiZGlkbid0IGdldCBhIENPREUgcmVmZXJlbmNlIGZyb20gY29tcGlsaW5nIGZ1
bmN0aW9uIFwiJXNcIiIsCgkJCQkJCXByb2Rlc2MtPnByb25hbWUpKSk7CgoJcHJvZGVzYy0+
cmVmZXJlbmNlID0gc3VicmVmOwoKCXJldHVybjsKfQoKCi8qKioqKioqKioqKioqKioqKioq
KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAq
IHBscGVybF9pbml0X3NoYXJlZF9saWJzKCkJCS0KICoqKioqKioqKioqKioqKioqKioqKioq
KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCgpzdGF0
aWMgdm9pZApwbHBlcmxfaW5pdF9zaGFyZWRfbGlicyhwVEhYKQp7CgljaGFyCSAgICpmaWxl
ID0gX19GSUxFX187CgoJbmV3WFMoIkR5bmFMb2FkZXI6OmJvb3RfRHluYUxvYWRlciIsIGJv
b3RfRHluYUxvYWRlciwgZmlsZSk7CgluZXdYUygiUG9zdGdyZVNRTDo6SW5TZXJ2ZXI6OlV0
aWw6OmJvb3RzdHJhcCIsCgkJICBib290X1Bvc3RncmVTUUxfX0luU2VydmVyX19VdGlsLCBm
aWxlKTsKCS8qIG5ld1hTIGZvci4uLjo6U1BJOjpib290c3RyYXAgaXMgaW4gc2VsZWN0X3Bl
cmxfY29udGV4dCgpICovCn0KCgpzdGF0aWMgU1YgICoKcGxwZXJsX2NhbGxfcGVybF9mdW5j
KHBscGVybF9wcm9jX2Rlc2MgKmRlc2MsIEZ1bmN0aW9uQ2FsbEluZm8gZmNpbmZvKQp7Cglk
VEhYOwoJZFNQOwoJU1YJCSAgICpyZXR2YWw7CglpbnQJCQlpOwoJaW50CQkJY291bnQ7CglP
aWQJCSAgICphcmd0eXBlcyA9IE5VTEw7CglpbnQJCQluYXJncyA9IDA7CgoJSFYJCSAgICpo
djsJCQkgLy8gaGFzaAoJU1YJCSAgICpGTnN2OwkJIC8vIHNjYWxhciByZWZlcmVuY2UgdG8g
dGhlIGhhc2gKCVNWCQkgICAqc3ZGTjsJCSAvLyBsb2NhbCByZWZlcmVuY2UgdG8gdGhlIGhh
c2g/CgoJRU5URVI7CglTQVZFVE1QUzsKCgkvKiBHaXZlIGZ1bmN0aW9ucyBzb21lIG1ldGFk
YXRhIGFib3V0IHdoYXQncyBnb2luZyBvbiBpbiAkX0ZOIChTaW1pbGFyIHRvICRfVEQgZm9y
IHRyaWdnZXJzKSAqLwoKCS8vIE5ldyAuLi4uLi4uLi4uIHsKCUZOc3YgPSBnZXRfc3YoIm1h
aW46Ol9GTiIsIEdWX0FERCk7CglpZiAoIUZOc3YpIHsKCQllcmVwb3J0KEVSUk9SLAoJCQkJ
KGVycmNvZGUoRVJSQ09ERV9FWFRFUk5BTF9ST1VUSU5FX0VYQ0VQVElPTiksCgkJCQkgZXJy
bXNnKCJjb3VsZG4ndCBmZXRjaCAkX0ZOIikpKTsKCX0KCglzYXZlX2l0ZW0oRk5zdik7CQkJ
LyogbG9jYWwgJF9GTiAqLwoKCWh2ID0gbmV3SFYoKTsgICAgICAgICAgICAgICAvLyBjcmVh
dGUgbmV3IGhhc2gKCWh2X2tzcGxpdChodiwgMTIpOwkJCS8qIHByZS1ncm93IHRoZSBoYXNo
ICovCglodl9zdG9yZV9zdHJpbmcoaHYsICJuYW1lIiwgY3N0cjJzdihkZXNjLT5wcm9uYW1l
KSk7CgoJc3ZGTiA9IG5ld1JWX25vaW5jKChTViAqKSBodik7IC8vIHJlZmVyZW5jZSB0byB0
aGUgbmV3IGhhc2gKCXN2X3NldHN2KEZOc3YsIHN2Rk4pOwoJLy8gbmV3IC4uLi4uLi4uLi4u
Li4uIH0KCglQVVNITUFSSyhTUCk7CglFWFRFTkQoc3AsIGRlc2MtPm5hcmdzKTsKCgkvKiBH
ZXQgc2lnbmF0dXJlIGZvciB0cnVlIGZ1bmN0aW9uczsgaW5saW5lIGJsb2NrcyBoYXZlIG5v
IGFyZ3MuICovCglpZiAoZmNpbmZvLT5mbGluZm8tPmZuX29pZCkKCQlnZXRfZnVuY19zaWdu
YXR1cmUoZmNpbmZvLT5mbGluZm8tPmZuX29pZCwgJmFyZ3R5cGVzLCAmbmFyZ3MpOwoJQXNz
ZXJ0KG5hcmdzID09IGRlc2MtPm5hcmdzKTsKCglmb3IgKGkgPSAwOyBpIDwgZGVzYy0+bmFy
Z3M7IGkrKykKCXsKCQlpZiAoZmNpbmZvLT5hcmdzW2ldLmlzbnVsbCkKCQkJUFVTSHMoJlBM
X3N2X3VuZGVmKTsKCQllbHNlIGlmIChkZXNjLT5hcmdfaXNfcm93dHlwZVtpXSkKCQl7CgkJ
CVNWCQkgICAqc3YgPSBwbHBlcmxfaGFzaF9mcm9tX2RhdHVtKGZjaW5mby0+YXJnc1tpXS52
YWx1ZSk7CgoJCQlQVVNIcyhzdl8ybW9ydGFsKHN2KSk7CgkJfQoJCWVsc2UKCQl7CgkJCVNW
CQkgICAqc3Y7CgkJCU9pZAkJCWZ1bmNpZDsKCgkJCWlmIChPaWRJc1ZhbGlkKGRlc2MtPmFy
Z19hcnJheXR5cGVbaV0pKQoJCQkJc3YgPSBwbHBlcmxfcmVmX2Zyb21fcGdfYXJyYXkoZmNp
bmZvLT5hcmdzW2ldLnZhbHVlLCBkZXNjLT5hcmdfYXJyYXl0eXBlW2ldKTsKCQkJZWxzZSBp
ZiAoKGZ1bmNpZCA9IGdldF90cmFuc2Zvcm1fZnJvbXNxbChhcmd0eXBlc1tpXSwgY3VycmVu
dF9jYWxsX2RhdGEtPnByb2Rlc2MtPmxhbmdfb2lkLCBjdXJyZW50X2NhbGxfZGF0YS0+cHJv
ZGVzYy0+dHJmdHlwZXMpKSkKCQkJCXN2ID0gKFNWICopIERhdHVtR2V0UG9pbnRlcihPaWRG
dW5jdGlvbkNhbGwxKGZ1bmNpZCwgZmNpbmZvLT5hcmdzW2ldLnZhbHVlKSk7CgkJCWVsc2UK
CQkJewoJCQkJY2hhcgkgICAqdG1wOwoKCQkJCXRtcCA9IE91dHB1dEZ1bmN0aW9uQ2FsbCgm
KGRlc2MtPmFyZ19vdXRfZnVuY1tpXSksCgkJCQkJCQkJCQkgZmNpbmZvLT5hcmdzW2ldLnZh
bHVlKTsKCQkJCXN2ID0gY3N0cjJzdih0bXApOwoJCQkJcGZyZWUodG1wKTsKCQkJfQoKCQkJ
UFVTSHMoc3ZfMm1vcnRhbChzdikpOwoJCX0KCX0KCVBVVEJBQ0s7CgoJLyogRG8gTk9UIHVz
ZSBHX0tFRVBFUlIgaGVyZSAqLwoJY291bnQgPSBjYWxsX3N2KGRlc2MtPnJlZmVyZW5jZSwg
R19TQ0FMQVIgfCBHX0VWQUwpOwoKCVNQQUdBSU47CgoJaWYgKGNvdW50ICE9IDEpCgl7CgkJ
UFVUQkFDSzsKCQlGUkVFVE1QUzsKCQlMRUFWRTsKCQllcmVwb3J0KEVSUk9SLAoJCQkJKGVy
cmNvZGUoRVJSQ09ERV9FWFRFUk5BTF9ST1VUSU5FX0VYQ0VQVElPTiksCgkJCQkgZXJybXNn
KCJkaWRuJ3QgZ2V0IGEgcmV0dXJuIGl0ZW0gZnJvbSBmdW5jdGlvbiIpKSk7Cgl9CgoJaWYg
KFN2VFJVRShFUlJTVikpCgl7CgkJKHZvaWQpIFBPUHM7CgkJUFVUQkFDSzsKCQlGUkVFVE1Q
UzsKCQlMRUFWRTsKCQkvKiBYWFggbmVlZCB0byBmaW5kIGEgd2F5IHRvIGRldGVybWluZSBh
IGJldHRlciBlcnJjb2RlIGhlcmUgKi8KCQllcmVwb3J0KEVSUk9SLAoJCQkJKGVycmNvZGUo
RVJSQ09ERV9FWFRFUk5BTF9ST1VUSU5FX0VYQ0VQVElPTiksCgkJCQkgZXJybXNnKCIlcyIs
IHN0cmlwX3RyYWlsaW5nX3dzKHN2MmNzdHIoRVJSU1YpKSkpKTsKCX0KCglyZXR2YWwgPSBu
ZXdTVnN2KFBPUHMpOwoKCS8vU3ZSRUZDTlRfZGVjX2N1cnJlbnQoRk5zdik7CgoJU3ZSRUZD
TlRfZGVjX2N1cnJlbnQoaHYpOwoJLy8gU3ZSRUZDTlRfZGVjX2N1cnJlbnQoc3ZGTik7CSAv
LyBubyBsb25nZXIgcmVmZXJlbmNlZCBieSBub3cKCglQVVRCQUNLOwoJRlJFRVRNUFM7CglM
RUFWRTsKCglyZXR1cm4gcmV0dmFsOwp9CgoKc3RhdGljIFNWICAqCnBscGVybF9jYWxsX3Bl
cmxfdHJpZ2dlcl9mdW5jKHBscGVybF9wcm9jX2Rlc2MgKmRlc2MsIEZ1bmN0aW9uQ2FsbElu
Zm8gZmNpbmZvLAoJCQkJCQkJICBTViAqdGQpCnsKCWRUSFg7CglkU1A7CglTVgkJICAgKnJl
dHZhbCwKCQkJICAgKlREc3Y7CglpbnQJCQlpLAoJCQkJY291bnQ7CglUcmlnZ2VyICAgICp0
Z190cmlnZ2VyID0gKChUcmlnZ2VyRGF0YSAqKSBmY2luZm8tPmNvbnRleHQpLT50Z190cmln
Z2VyOwoKCUVOVEVSOwoJU0FWRVRNUFM7CgoJVERzdiA9IGdldF9zdigibWFpbjo6X1REIiwg
MCk7CglpZiAoIVREc3YpCgkJZXJlcG9ydChFUlJPUiwKCQkJCShlcnJjb2RlKEVSUkNPREVf
RVhURVJOQUxfUk9VVElORV9FWENFUFRJT04pLAoJCQkJIGVycm1zZygiY291bGRuJ3QgZmV0
Y2ggJF9URCIpKSk7CgoJc2F2ZV9pdGVtKFREc3YpOwkJCS8qIGxvY2FsICRfVEQgKi8KCXN2
X3NldHN2KFREc3YsIHRkKTsKCglQVVNITUFSSyhzcCk7CglFWFRFTkQoc3AsIHRnX3RyaWdn
ZXItPnRnbmFyZ3MpOwoKCWZvciAoaSA9IDA7IGkgPCB0Z190cmlnZ2VyLT50Z25hcmdzOyBp
KyspCgkJUFVTSHMoc3ZfMm1vcnRhbChjc3RyMnN2KHRnX3RyaWdnZXItPnRnYXJnc1tpXSkp
KTsKCVBVVEJBQ0s7CgoJLyogRG8gTk9UIHVzZSBHX0tFRVBFUlIgaGVyZSAqLwoJY291bnQg
PSBjYWxsX3N2KGRlc2MtPnJlZmVyZW5jZSwgR19TQ0FMQVIgfCBHX0VWQUwpOwoKCVNQQUdB
SU47CgoJaWYgKGNvdW50ICE9IDEpCgl7CgkJUFVUQkFDSzsKCQlGUkVFVE1QUzsKCQlMRUFW
RTsKCQllcmVwb3J0KEVSUk9SLAoJCQkJKGVycmNvZGUoRVJSQ09ERV9FWFRFUk5BTF9ST1VU
SU5FX0VYQ0VQVElPTiksCgkJCQkgZXJybXNnKCJkaWRuJ3QgZ2V0IGEgcmV0dXJuIGl0ZW0g
ZnJvbSB0cmlnZ2VyIGZ1bmN0aW9uIikpKTsKCX0KCglpZiAoU3ZUUlVFKEVSUlNWKSkKCXsK
CQkodm9pZCkgUE9QczsKCQlQVVRCQUNLOwoJCUZSRUVUTVBTOwoJCUxFQVZFOwoJCS8qIFhY
WCBuZWVkIHRvIGZpbmQgYSB3YXkgdG8gZGV0ZXJtaW5lIGEgYmV0dGVyIGVycmNvZGUgaGVy
ZSAqLwoJCWVyZXBvcnQoRVJST1IsCgkJCQkoZXJyY29kZShFUlJDT0RFX0VYVEVSTkFMX1JP
VVRJTkVfRVhDRVBUSU9OKSwKCQkJCSBlcnJtc2coIiVzIiwgc3RyaXBfdHJhaWxpbmdfd3Mo
c3YyY3N0cihFUlJTVikpKSkpOwoJfQoKCXJldHZhbCA9IG5ld1NWc3YoUE9Qcyk7CgoJUFVU
QkFDSzsKCUZSRUVUTVBTOwoJTEVBVkU7CgoJcmV0dXJuIHJldHZhbDsKfQoKCnN0YXRpYyB2
b2lkCnBscGVybF9jYWxsX3BlcmxfZXZlbnRfdHJpZ2dlcl9mdW5jKHBscGVybF9wcm9jX2Rl
c2MgKmRlc2MsCgkJCQkJCQkJCUZ1bmN0aW9uQ2FsbEluZm8gZmNpbmZvLAoJCQkJCQkJCQlT
ViAqdGQpCnsKCWRUSFg7CglkU1A7CglTVgkJICAgKnJldHZhbCwKCQkJICAgKlREc3Y7Cglp
bnQJCQljb3VudDsKCglFTlRFUjsKCVNBVkVUTVBTOwoKCVREc3YgPSBnZXRfc3YoIm1haW46
Ol9URCIsIDApOwoJaWYgKCFURHN2KQoJCWVyZXBvcnQoRVJST1IsCgkJCQkoZXJyY29kZShF
UlJDT0RFX0VYVEVSTkFMX1JPVVRJTkVfRVhDRVBUSU9OKSwKCQkJCSBlcnJtc2coImNvdWxk
bid0IGZldGNoICRfVEQiKSkpOwoKCXNhdmVfaXRlbShURHN2KTsJCQkvKiBsb2NhbCAkX1RE
ICovCglzdl9zZXRzdihURHN2LCB0ZCk7CgoJUFVTSE1BUksoc3ApOwoJUFVUQkFDSzsKCgkv
KiBEbyBOT1QgdXNlIEdfS0VFUEVSUiBoZXJlICovCgljb3VudCA9IGNhbGxfc3YoZGVzYy0+
cmVmZXJlbmNlLCBHX1NDQUxBUiB8IEdfRVZBTCk7CgoJU1BBR0FJTjsKCglpZiAoY291bnQg
IT0gMSkKCXsKCQlQVVRCQUNLOwoJCUZSRUVUTVBTOwoJCUxFQVZFOwoJCWVyZXBvcnQoRVJS
T1IsCgkJCQkoZXJyY29kZShFUlJDT0RFX0VYVEVSTkFMX1JPVVRJTkVfRVhDRVBUSU9OKSwK
CQkJCSBlcnJtc2coImRpZG4ndCBnZXQgYSByZXR1cm4gaXRlbSBmcm9tIHRyaWdnZXIgZnVu
Y3Rpb24iKSkpOwoJfQoKCWlmIChTdlRSVUUoRVJSU1YpKQoJewoJCSh2b2lkKSBQT1BzOwoJ
CVBVVEJBQ0s7CgkJRlJFRVRNUFM7CgkJTEVBVkU7CgkJLyogWFhYIG5lZWQgdG8gZmluZCBh
IHdheSB0byBkZXRlcm1pbmUgYSBiZXR0ZXIgZXJyY29kZSBoZXJlICovCgkJZXJlcG9ydChF
UlJPUiwKCQkJCShlcnJjb2RlKEVSUkNPREVfRVhURVJOQUxfUk9VVElORV9FWENFUFRJT04p
LAoJCQkJIGVycm1zZygiJXMiLCBzdHJpcF90cmFpbGluZ193cyhzdjJjc3RyKEVSUlNWKSkp
KSk7Cgl9CgoJcmV0dmFsID0gbmV3U1ZzdihQT1BzKTsKCSh2b2lkKSByZXR2YWw7CQkJCS8q
IHNpbGVuY2UgY29tcGlsZXIgd2FybmluZyAqLwoKCVBVVEJBQ0s7CglGUkVFVE1QUzsKCUxF
QVZFOwoKCXJldHVybjsKfQoKc3RhdGljIERhdHVtCnBscGVybF9mdW5jX2hhbmRsZXIoUEdf
RlVOQ1RJT05fQVJHUykKewoJYm9vbAkJbm9uYXRvbWljOwoJcGxwZXJsX3Byb2NfZGVzYyAq
cHJvZGVzYzsKCVNWCQkgICAqcGVybHJldDsKCURhdHVtCQlyZXR2YWwgPSAwOwoJUmV0dXJu
U2V0SW5mbyAqcnNpOwoJRXJyb3JDb250ZXh0Q2FsbGJhY2sgcGxfZXJyb3JfY29udGV4dDsK
Cglub25hdG9taWMgPSBmY2luZm8tPmNvbnRleHQgJiYKCQlJc0EoZmNpbmZvLT5jb250ZXh0
LCBDYWxsQ29udGV4dCkgJiYKCQkhY2FzdE5vZGUoQ2FsbENvbnRleHQsIGZjaW5mby0+Y29u
dGV4dCktPmF0b21pYzsKCglpZiAoU1BJX2Nvbm5lY3RfZXh0KG5vbmF0b21pYyA/IFNQSV9P
UFRfTk9OQVRPTUlDIDogMCkgIT0gU1BJX09LX0NPTk5FQ1QpCgkJZWxvZyhFUlJPUiwgImNv
dWxkIG5vdCBjb25uZWN0IHRvIFNQSSBtYW5hZ2VyIik7CgoJcHJvZGVzYyA9IGNvbXBpbGVf
cGxwZXJsX2Z1bmN0aW9uKGZjaW5mby0+ZmxpbmZvLT5mbl9vaWQsIGZhbHNlLCBmYWxzZSk7
CgljdXJyZW50X2NhbGxfZGF0YS0+cHJvZGVzYyA9IHByb2Rlc2M7CglpbmNyZW1lbnRfcHJv
ZGVzY19yZWZjb3VudChwcm9kZXNjKTsKCgkvKiBTZXQgYSBjYWxsYmFjayBmb3IgZXJyb3Ig
cmVwb3J0aW5nICovCglwbF9lcnJvcl9jb250ZXh0LmNhbGxiYWNrID0gcGxwZXJsX2V4ZWNf
Y2FsbGJhY2s7CglwbF9lcnJvcl9jb250ZXh0LnByZXZpb3VzID0gZXJyb3JfY29udGV4dF9z
dGFjazsKCXBsX2Vycm9yX2NvbnRleHQuYXJnID0gcHJvZGVzYy0+cHJvbmFtZTsKCWVycm9y
X2NvbnRleHRfc3RhY2sgPSAmcGxfZXJyb3JfY29udGV4dDsKCglyc2kgPSAoUmV0dXJuU2V0
SW5mbyAqKSBmY2luZm8tPnJlc3VsdGluZm87CgoJaWYgKHByb2Rlc2MtPmZuX3JldGlzc2V0
KQoJewoJCS8qIENoZWNrIGNvbnRleHQgYmVmb3JlIGFsbG93aW5nIHRoZSBjYWxsIHRvIGdv
IHRocm91Z2ggKi8KCQlpZiAoIXJzaSB8fCAhSXNBKHJzaSwgUmV0dXJuU2V0SW5mbykgfHwK
CQkJKHJzaS0+YWxsb3dlZE1vZGVzICYgU0ZSTV9NYXRlcmlhbGl6ZSkgPT0gMCkKCQkJZXJl
cG9ydChFUlJPUiwKCQkJCQkoZXJyY29kZShFUlJDT0RFX0ZFQVRVUkVfTk9UX1NVUFBPUlRF
RCksCgkJCQkJIGVycm1zZygic2V0LXZhbHVlZCBmdW5jdGlvbiBjYWxsZWQgaW4gY29udGV4
dCB0aGF0ICIKCQkJCQkJCSJjYW5ub3QgYWNjZXB0IGEgc2V0IikpKTsKCX0KCglhY3RpdmF0
ZV9pbnRlcnByZXRlcihwcm9kZXNjLT5pbnRlcnApOwoKCXBlcmxyZXQgPSBwbHBlcmxfY2Fs
bF9wZXJsX2Z1bmMocHJvZGVzYywgZmNpbmZvKTsKCgkvKioqKioqKioqKioqKioqKioqKioq
KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCgkgKiBEaXNjb25uZWN0
IGZyb20gU1BJIG1hbmFnZXIgYW5kIHRoZW4gY3JlYXRlIHRoZSByZXR1cm4KCSAqIHZhbHVl
cyBkYXR1bSAoaWYgdGhlIGlucHV0IGZ1bmN0aW9uIGRvZXMgYSBwYWxsb2MgZm9yIGl0Cgkg
KiB0aGlzIG11c3Qgbm90IGJlIGFsbG9jYXRlZCBpbiB0aGUgU1BJIG1lbW9yeSBjb250ZXh0
CgkgKiBiZWNhdXNlIFNQSV9maW5pc2ggd291bGQgZnJlZSBpdCkuCgkgKioqKioqKioqKioq
KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwoJaWYg
KFNQSV9maW5pc2goKSAhPSBTUElfT0tfRklOSVNIKQoJCWVsb2coRVJST1IsICJTUElfZmlu
aXNoKCkgZmFpbGVkIik7CgoJaWYgKHByb2Rlc2MtPmZuX3JldGlzc2V0KQoJewoJCVNWCQkg
ICAqc2F2OwoKCQkvKgoJCSAqIElmIHRoZSBQZXJsIGZ1bmN0aW9uIHJldHVybmVkIGFuIGFy
cmF5cmVmLCB3ZSBwcmV0ZW5kIHRoYXQgaXQKCQkgKiBjYWxsZWQgcmV0dXJuX25leHQoKSBm
b3IgZWFjaCBlbGVtZW50IG9mIHRoZSBhcnJheSwgdG8gaGFuZGxlIG9sZAoJCSAqIFNSRnMg
dGhhdCBkaWRuJ3Qga25vdyBhYm91dCByZXR1cm5fbmV4dCgpLiBBbnkgb3RoZXIgc29ydCBv
ZiByZXR1cm4KCQkgKiB2YWx1ZSBpcyBhbiBlcnJvciwgZXhjZXB0IHVuZGVmIHdoaWNoIG1l
YW5zIHJldHVybiBhbiBlbXB0eSBzZXQuCgkJICovCgkJc2F2ID0gZ2V0X3BlcmxfYXJyYXlf
cmVmKHBlcmxyZXQpOwoJCWlmIChzYXYpCgkJewoJCQlkVEhYOwoJCQlpbnQJCQlpID0gMDsK
CQkJU1YJCSAgKipzdnAgPSAwOwoJCQlBVgkJICAgKnJhdiA9IChBViAqKSBTdlJWKHNhdik7
CgoJCQl3aGlsZSAoKHN2cCA9IGF2X2ZldGNoKHJhdiwgaSwgRkFMU0UpKSAhPSBOVUxMKQoJ
CQl7CgkJCQlwbHBlcmxfcmV0dXJuX25leHRfaW50ZXJuYWwoKnN2cCk7CgkJCQlpKys7CgkJ
CX0KCQl9CgkJZWxzZSBpZiAoU3ZPSyhwZXJscmV0KSkKCQl7CgkJCWVyZXBvcnQoRVJST1Is
CgkJCQkJKGVycmNvZGUoRVJSQ09ERV9EQVRBVFlQRV9NSVNNQVRDSCksCgkJCQkJIGVycm1z
Zygic2V0LXJldHVybmluZyBQTC9QZXJsIGZ1bmN0aW9uIG11c3QgcmV0dXJuICIKCQkJCQkJ
CSJyZWZlcmVuY2UgdG8gYXJyYXkgb3IgdXNlIHJldHVybl9uZXh0IikpKTsKCQl9CgoJCXJz
aS0+cmV0dXJuTW9kZSA9IFNGUk1fTWF0ZXJpYWxpemU7CgkJaWYgKGN1cnJlbnRfY2FsbF9k
YXRhLT50dXBsZV9zdG9yZSkKCQl7CgkJCXJzaS0+c2V0UmVzdWx0ID0gY3VycmVudF9jYWxs
X2RhdGEtPnR1cGxlX3N0b3JlOwoJCQlyc2ktPnNldERlc2MgPSBjdXJyZW50X2NhbGxfZGF0
YS0+cmV0X3RkZXNjOwoJCX0KCQlyZXR2YWwgPSAoRGF0dW0pIDA7Cgl9CgllbHNlIGlmIChw
cm9kZXNjLT5yZXN1bHRfb2lkKQoJewoJCXJldHZhbCA9IHBscGVybF9zdl90b19kYXR1bShw
ZXJscmV0LAoJCQkJCQkJCQlwcm9kZXNjLT5yZXN1bHRfb2lkLAoJCQkJCQkJCQktMSwKCQkJ
CQkJCQkJZmNpbmZvLAoJCQkJCQkJCQkmcHJvZGVzYy0+cmVzdWx0X2luX2Z1bmMsCgkJCQkJ
CQkJCXByb2Rlc2MtPnJlc3VsdF90eXBpb3BhcmFtLAoJCQkJCQkJCQkmZmNpbmZvLT5pc251
bGwpOwoKCQlpZiAoZmNpbmZvLT5pc251bGwgJiYgcnNpICYmIElzQShyc2ksIFJldHVyblNl
dEluZm8pKQoJCQlyc2ktPmlzRG9uZSA9IEV4cHJFbmRSZXN1bHQ7Cgl9CgoJLyogUmVzdG9y
ZSB0aGUgcHJldmlvdXMgZXJyb3IgY2FsbGJhY2sgKi8KCWVycm9yX2NvbnRleHRfc3RhY2sg
PSBwbF9lcnJvcl9jb250ZXh0LnByZXZpb3VzOwoKCVN2UkVGQ05UX2RlY19jdXJyZW50KHBl
cmxyZXQpOwoKCXJldHVybiByZXR2YWw7Cn0KCgpzdGF0aWMgRGF0dW0KcGxwZXJsX3RyaWdn
ZXJfaGFuZGxlcihQR19GVU5DVElPTl9BUkdTKQp7CglwbHBlcmxfcHJvY19kZXNjICpwcm9k
ZXNjOwoJU1YJCSAgICpwZXJscmV0OwoJRGF0dW0JCXJldHZhbDsKCVNWCQkgICAqc3ZURDsK
CUhWCQkgICAqaHZURDsKCUVycm9yQ29udGV4dENhbGxiYWNrIHBsX2Vycm9yX2NvbnRleHQ7
CglUcmlnZ2VyRGF0YSAqdGRhdGE7CglpbnQJCQlyYyBQR19VU0VEX0ZPUl9BU1NFUlRTX09O
TFk7CgoJLyogQ29ubmVjdCB0byBTUEkgbWFuYWdlciAqLwoJaWYgKFNQSV9jb25uZWN0KCkg
IT0gU1BJX09LX0NPTk5FQ1QpCgkJZWxvZyhFUlJPUiwgImNvdWxkIG5vdCBjb25uZWN0IHRv
IFNQSSBtYW5hZ2VyIik7CgoJLyogTWFrZSB0cmFuc2l0aW9uIHRhYmxlcyB2aXNpYmxlIHRv
IHRoaXMgU1BJIGNvbm5lY3Rpb24gKi8KCXRkYXRhID0gKFRyaWdnZXJEYXRhICopIGZjaW5m
by0+Y29udGV4dDsKCXJjID0gU1BJX3JlZ2lzdGVyX3RyaWdnZXJfZGF0YSh0ZGF0YSk7CglB
c3NlcnQocmMgPj0gMCk7CgoJLyogRmluZCBvciBjb21waWxlIHRoZSBmdW5jdGlvbiAqLwoJ
cHJvZGVzYyA9IGNvbXBpbGVfcGxwZXJsX2Z1bmN0aW9uKGZjaW5mby0+ZmxpbmZvLT5mbl9v
aWQsIHRydWUsIGZhbHNlKTsKCWN1cnJlbnRfY2FsbF9kYXRhLT5wcm9kZXNjID0gcHJvZGVz
YzsKCWluY3JlbWVudF9wcm9kZXNjX3JlZmNvdW50KHByb2Rlc2MpOwoKCS8qIFNldCBhIGNh
bGxiYWNrIGZvciBlcnJvciByZXBvcnRpbmcgKi8KCXBsX2Vycm9yX2NvbnRleHQuY2FsbGJh
Y2sgPSBwbHBlcmxfZXhlY19jYWxsYmFjazsKCXBsX2Vycm9yX2NvbnRleHQucHJldmlvdXMg
PSBlcnJvcl9jb250ZXh0X3N0YWNrOwoJcGxfZXJyb3JfY29udGV4dC5hcmcgPSBwcm9kZXNj
LT5wcm9uYW1lOwoJZXJyb3JfY29udGV4dF9zdGFjayA9ICZwbF9lcnJvcl9jb250ZXh0OwoK
CWFjdGl2YXRlX2ludGVycHJldGVyKHByb2Rlc2MtPmludGVycCk7CgoJc3ZURCA9IHBscGVy
bF90cmlnZ2VyX2J1aWxkX2FyZ3MoZmNpbmZvKTsKCXBlcmxyZXQgPSBwbHBlcmxfY2FsbF9w
ZXJsX3RyaWdnZXJfZnVuYyhwcm9kZXNjLCBmY2luZm8sIHN2VEQpOwoJaHZURCA9IChIViAq
KSBTdlJWKHN2VEQpOwoKCS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioq
KioqKioqKioqKioqKioqKioqKioqKioKCSogRGlzY29ubmVjdCBmcm9tIFNQSSBtYW5hZ2Vy
IGFuZCB0aGVuIGNyZWF0ZSB0aGUgcmV0dXJuCgkqIHZhbHVlcyBkYXR1bSAoaWYgdGhlIGlu
cHV0IGZ1bmN0aW9uIGRvZXMgYSBwYWxsb2MgZm9yIGl0CgkqIHRoaXMgbXVzdCBub3QgYmUg
YWxsb2NhdGVkIGluIHRoZSBTUEkgbWVtb3J5IGNvbnRleHQKCSogYmVjYXVzZSBTUElfZmlu
aXNoIHdvdWxkIGZyZWUgaXQpLgoJKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioq
KioqKioqKioqKioqKioqKioqKioqKioqKioqLwoJaWYgKFNQSV9maW5pc2goKSAhPSBTUElf
T0tfRklOSVNIKQoJCWVsb2coRVJST1IsICJTUElfZmluaXNoKCkgZmFpbGVkIik7CgoJaWYg
KHBlcmxyZXQgPT0gTlVMTCB8fCAhU3ZPSyhwZXJscmV0KSkKCXsKCQkvKiB1bmRlZiByZXN1
bHQgbWVhbnMgZ28gYWhlYWQgd2l0aCBvcmlnaW5hbCB0dXBsZSAqLwoJCVRyaWdnZXJEYXRh
ICp0cmlnZGF0YSA9ICgoVHJpZ2dlckRhdGEgKikgZmNpbmZvLT5jb250ZXh0KTsKCgkJaWYg
KFRSSUdHRVJfRklSRURfQllfSU5TRVJUKHRyaWdkYXRhLT50Z19ldmVudCkpCgkJCXJldHZh
bCA9IChEYXR1bSkgdHJpZ2RhdGEtPnRnX3RyaWd0dXBsZTsKCQllbHNlIGlmIChUUklHR0VS
X0ZJUkVEX0JZX1VQREFURSh0cmlnZGF0YS0+dGdfZXZlbnQpKQoJCQlyZXR2YWwgPSAoRGF0
dW0pIHRyaWdkYXRhLT50Z19uZXd0dXBsZTsKCQllbHNlIGlmIChUUklHR0VSX0ZJUkVEX0JZ
X0RFTEVURSh0cmlnZGF0YS0+dGdfZXZlbnQpKQoJCQlyZXR2YWwgPSAoRGF0dW0pIHRyaWdk
YXRhLT50Z190cmlndHVwbGU7CgkJZWxzZSBpZiAoVFJJR0dFUl9GSVJFRF9CWV9UUlVOQ0FU
RSh0cmlnZGF0YS0+dGdfZXZlbnQpKQoJCQlyZXR2YWwgPSAoRGF0dW0pIHRyaWdkYXRhLT50
Z190cmlndHVwbGU7CgkJZWxzZQoJCQlyZXR2YWwgPSAoRGF0dW0pIDA7IC8qIGNhbiB0aGlz
IGhhcHBlbj8gKi8KCX0KCWVsc2UKCXsKCQlIZWFwVHVwbGUJdHJ2OwoJCWNoYXIJICAgKnRt
cDsKCgkJdG1wID0gc3YyY3N0cihwZXJscmV0KTsKCgkJaWYgKHBnX3N0cmNhc2VjbXAodG1w
LCAiU0tJUCIpID09IDApCgkJCXRydiA9IE5VTEw7CgkJZWxzZSBpZiAocGdfc3RyY2FzZWNt
cCh0bXAsICJNT0RJRlkiKSA9PSAwKQoJCXsKCQkJVHJpZ2dlckRhdGEgKnRyaWdkYXRhID0g
KFRyaWdnZXJEYXRhICopIGZjaW5mby0+Y29udGV4dDsKCgkJCWlmIChUUklHR0VSX0ZJUkVE
X0JZX0lOU0VSVCh0cmlnZGF0YS0+dGdfZXZlbnQpKQoJCQkJdHJ2ID0gcGxwZXJsX21vZGlm
eV90dXBsZShodlRELCB0cmlnZGF0YSwKCQkJCQkJCQkJCSAgdHJpZ2RhdGEtPnRnX3RyaWd0
dXBsZSk7CgkJCWVsc2UgaWYgKFRSSUdHRVJfRklSRURfQllfVVBEQVRFKHRyaWdkYXRhLT50
Z19ldmVudCkpCgkJCQl0cnYgPSBwbHBlcmxfbW9kaWZ5X3R1cGxlKGh2VEQsIHRyaWdkYXRh
LAoJCQkJCQkJCQkJICB0cmlnZGF0YS0+dGdfbmV3dHVwbGUpOwoJCQllbHNlCgkJCXsKCQkJ
CWVyZXBvcnQoV0FSTklORywKCQkJCQkJKGVycmNvZGUoRVJSQ09ERV9FX1JfSV9FX1RSSUdH
RVJfUFJPVE9DT0xfVklPTEFURUQpLAoJCQkJCQkgZXJybXNnKCJpZ25vcmluZyBtb2RpZmll
ZCByb3cgaW4gREVMRVRFIHRyaWdnZXIiKSkpOwoJCQkJdHJ2ID0gTlVMTDsKCQkJfQoJCX0K
CQllbHNlCgkJewoJCQllcmVwb3J0KEVSUk9SLAoJCQkJCShlcnJjb2RlKEVSUkNPREVfRV9S
X0lfRV9UUklHR0VSX1BST1RPQ09MX1ZJT0xBVEVEKSwKCQkJCQkgZXJybXNnKCJyZXN1bHQg
b2YgUEwvUGVybCB0cmlnZ2VyIGZ1bmN0aW9uIG11c3QgYmUgdW5kZWYsICIKCQkJCQkJCSJc
IlNLSVBcIiwgb3IgXCJNT0RJRllcIiIpKSk7CgkJCXRydiA9IE5VTEw7CgkJfQoJCXJldHZh
bCA9IFBvaW50ZXJHZXREYXR1bSh0cnYpOwoJCXBmcmVlKHRtcCk7Cgl9CgoJLyogUmVzdG9y
ZSB0aGUgcHJldmlvdXMgZXJyb3IgY2FsbGJhY2sgKi8KCWVycm9yX2NvbnRleHRfc3RhY2sg
PSBwbF9lcnJvcl9jb250ZXh0LnByZXZpb3VzOwoKCVN2UkVGQ05UX2RlY19jdXJyZW50KHN2
VEQpOwoJaWYgKHBlcmxyZXQpCgkJU3ZSRUZDTlRfZGVjX2N1cnJlbnQocGVybHJldCk7CgoJ
cmV0dXJuIHJldHZhbDsKfQoKCnN0YXRpYyB2b2lkCnBscGVybF9ldmVudF90cmlnZ2VyX2hh
bmRsZXIoUEdfRlVOQ1RJT05fQVJHUykKewoJcGxwZXJsX3Byb2NfZGVzYyAqcHJvZGVzYzsK
CVNWCQkgICAqc3ZURDsKCUVycm9yQ29udGV4dENhbGxiYWNrIHBsX2Vycm9yX2NvbnRleHQ7
CgoJLyogQ29ubmVjdCB0byBTUEkgbWFuYWdlciAqLwoJaWYgKFNQSV9jb25uZWN0KCkgIT0g
U1BJX09LX0NPTk5FQ1QpCgkJZWxvZyhFUlJPUiwgImNvdWxkIG5vdCBjb25uZWN0IHRvIFNQ
SSBtYW5hZ2VyIik7CgoJLyogRmluZCBvciBjb21waWxlIHRoZSBmdW5jdGlvbiAqLwoJcHJv
ZGVzYyA9IGNvbXBpbGVfcGxwZXJsX2Z1bmN0aW9uKGZjaW5mby0+ZmxpbmZvLT5mbl9vaWQs
IGZhbHNlLCB0cnVlKTsKCWN1cnJlbnRfY2FsbF9kYXRhLT5wcm9kZXNjID0gcHJvZGVzYzsK
CWluY3JlbWVudF9wcm9kZXNjX3JlZmNvdW50KHByb2Rlc2MpOwoKCS8qIFNldCBhIGNhbGxi
YWNrIGZvciBlcnJvciByZXBvcnRpbmcgKi8KCXBsX2Vycm9yX2NvbnRleHQuY2FsbGJhY2sg
PSBwbHBlcmxfZXhlY19jYWxsYmFjazsKCXBsX2Vycm9yX2NvbnRleHQucHJldmlvdXMgPSBl
cnJvcl9jb250ZXh0X3N0YWNrOwoJcGxfZXJyb3JfY29udGV4dC5hcmcgPSBwcm9kZXNjLT5w
cm9uYW1lOwoJZXJyb3JfY29udGV4dF9zdGFjayA9ICZwbF9lcnJvcl9jb250ZXh0OwoKCWFj
dGl2YXRlX2ludGVycHJldGVyKHByb2Rlc2MtPmludGVycCk7CgoJc3ZURCA9IHBscGVybF9l
dmVudF90cmlnZ2VyX2J1aWxkX2FyZ3MoZmNpbmZvKTsKCXBscGVybF9jYWxsX3BlcmxfZXZl
bnRfdHJpZ2dlcl9mdW5jKHByb2Rlc2MsIGZjaW5mbywgc3ZURCk7CgoJaWYgKFNQSV9maW5p
c2goKSAhPSBTUElfT0tfRklOSVNIKQoJCWVsb2coRVJST1IsICJTUElfZmluaXNoKCkgZmFp
bGVkIik7CgoJLyogUmVzdG9yZSB0aGUgcHJldmlvdXMgZXJyb3IgY2FsbGJhY2sgKi8KCWVy
cm9yX2NvbnRleHRfc3RhY2sgPSBwbF9lcnJvcl9jb250ZXh0LnByZXZpb3VzOwoKCVN2UkVG
Q05UX2RlY19jdXJyZW50KHN2VEQpOwp9CgoKc3RhdGljIGJvb2wKdmFsaWRhdGVfcGxwZXJs
X2Z1bmN0aW9uKHBscGVybF9wcm9jX3B0ciAqcHJvY19wdHIsIEhlYXBUdXBsZSBwcm9jVHVw
KQp7CglpZiAocHJvY19wdHIgJiYgcHJvY19wdHItPnByb2NfcHRyKQoJewoJCXBscGVybF9w
cm9jX2Rlc2MgKnByb2Rlc2MgPSBwcm9jX3B0ci0+cHJvY19wdHI7CgkJYm9vbAkJdXB0b2Rh
dGU7CgoJCS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioq
KioqKioqKioqKioqKioKCQkgKiBJZiBpdCdzIHByZXNlbnQsIG11c3QgY2hlY2sgd2hldGhl
ciBpdCdzIHN0aWxsIHVwIHRvIGRhdGUuCgkJICogVGhpcyBpcyBuZWVkZWQgYmVjYXVzZSBD
UkVBVEUgT1IgUkVQTEFDRSBGVU5DVElPTiBjYW4gbW9kaWZ5IHRoZQoJCSAqIGZ1bmN0aW9u
J3MgcGdfcHJvYyBlbnRyeSB3aXRob3V0IGNoYW5naW5nIGl0cyBPSUQuCgkJICoqKioqKioq
KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8K
CQl1cHRvZGF0ZSA9IChwcm9kZXNjLT5mbl94bWluID09IEhlYXBUdXBsZUhlYWRlckdldFJh
d1htaW4ocHJvY1R1cC0+dF9kYXRhKSAmJgoJCQkJCUl0ZW1Qb2ludGVyRXF1YWxzKCZwcm9k
ZXNjLT5mbl90aWQsICZwcm9jVHVwLT50X3NlbGYpKTsKCgkJaWYgKHVwdG9kYXRlKQoJCQly
ZXR1cm4gdHJ1ZTsKCgkJLyogT3RoZXJ3aXNlLCB1bmxpbmsgdGhlIG9ic29sZXRlZCBlbnRy
eSBmcm9tIHRoZSBoYXNodGFibGUgLi4uICovCgkJcHJvY19wdHItPnByb2NfcHRyID0gTlVM
TDsKCQkvKiAuLi4gYW5kIHJlbGVhc2UgdGhlIGNvcnJlc3BvbmRpbmcgcmVmY291bnQsIHBy
b2JhYmx5IGRlbGV0aW5nIGl0ICovCgkJZGVjcmVtZW50X3Byb2Rlc2NfcmVmY291bnQocHJv
ZGVzYyk7Cgl9CgoJcmV0dXJuIGZhbHNlOwp9CgoKc3RhdGljIHZvaWQKZnJlZV9wbHBlcmxf
ZnVuY3Rpb24ocGxwZXJsX3Byb2NfZGVzYyAqcHJvZGVzYykKewoJQXNzZXJ0KHByb2Rlc2Mt
PmZuX3JlZmNvdW50ID09IDApOwoJLyogUmVsZWFzZSBDT0RFIHJlZmVyZW5jZSwgaWYgd2Ug
aGF2ZSBvbmUsIGZyb20gdGhlIGFwcHJvcHJpYXRlIGludGVycCAqLwoJaWYgKHByb2Rlc2Mt
PnJlZmVyZW5jZSkKCXsKCQlwbHBlcmxfaW50ZXJwX2Rlc2MgKm9sZGludGVycCA9IHBscGVy
bF9hY3RpdmVfaW50ZXJwOwoKCQlhY3RpdmF0ZV9pbnRlcnByZXRlcihwcm9kZXNjLT5pbnRl
cnApOwoJCVN2UkVGQ05UX2RlY19jdXJyZW50KHByb2Rlc2MtPnJlZmVyZW5jZSk7CgkJYWN0
aXZhdGVfaW50ZXJwcmV0ZXIob2xkaW50ZXJwKTsKCX0KCS8qIFJlbGVhc2UgYWxsIFBHLW93
bmVkIGRhdGEgZm9yIHRoaXMgcHJvYyAqLwoJTWVtb3J5Q29udGV4dERlbGV0ZShwcm9kZXNj
LT5mbl9jeHQpOwp9CgoKc3RhdGljIHBscGVybF9wcm9jX2Rlc2MgKgpjb21waWxlX3BscGVy
bF9mdW5jdGlvbihPaWQgZm5fb2lkLCBib29sIGlzX3RyaWdnZXIsIGJvb2wgaXNfZXZlbnRf
dHJpZ2dlcikKewoJSGVhcFR1cGxlCXByb2NUdXA7CglGb3JtX3BnX3Byb2MgcHJvY1N0cnVj
dDsKCXBscGVybF9wcm9jX2tleSBwcm9jX2tleTsKCXBscGVybF9wcm9jX3B0ciAqcHJvY19w
dHI7CglwbHBlcmxfcHJvY19kZXNjICp2b2xhdGlsZSBwcm9kZXNjID0gTlVMTDsKCXZvbGF0
aWxlIE1lbW9yeUNvbnRleHQgcHJvY19jeHQgPSBOVUxMOwoJcGxwZXJsX2ludGVycF9kZXNj
ICpvbGRpbnRlcnAgPSBwbHBlcmxfYWN0aXZlX2ludGVycDsKCUVycm9yQ29udGV4dENhbGxi
YWNrIHBscGVybF9lcnJvcl9jb250ZXh0OwoKCS8qIFdlJ2xsIG5lZWQgdGhlIHBnX3Byb2Mg
dHVwbGUgaW4gYW55IGNhc2UuLi4gKi8KCXByb2NUdXAgPSBTZWFyY2hTeXNDYWNoZTEoUFJP
Q09JRCwgT2JqZWN0SWRHZXREYXR1bShmbl9vaWQpKTsKCWlmICghSGVhcFR1cGxlSXNWYWxp
ZChwcm9jVHVwKSkKCQllbG9nKEVSUk9SLCAiY2FjaGUgbG9va3VwIGZhaWxlZCBmb3IgZnVu
Y3Rpb24gJXUiLCBmbl9vaWQpOwoJcHJvY1N0cnVjdCA9IChGb3JtX3BnX3Byb2MpIEdFVFNU
UlVDVChwcm9jVHVwKTsKCgkvKgoJICogVHJ5IHRvIGZpbmQgZnVuY3Rpb24gaW4gcGxwZXJs
X3Byb2NfaGFzaC4gIFRoZSByZWFzb24gZm9yIHRoaXMKCSAqIG92ZXJjb21wbGljYXRlZC1z
ZWVtaW5nIGxvb2t1cCBwcm9jZWR1cmUgaXMgdGhhdCB3ZSBkb24ndCBrbm93IHdoZXRoZXIK
CSAqIGl0J3MgcGxwZXJsIG9yIHBscGVybHUsIGFuZCBkb24ndCB3YW50IHRvIHNwZW5kIGEg
bG9va3VwIGluIHBnX2xhbmd1YWdlCgkgKiB0byBmaW5kIG91dC4KCSAqLwoJcHJvY19rZXku
cHJvY19pZCA9IGZuX29pZDsKCXByb2Nfa2V5LmlzX3RyaWdnZXIgPSBpc190cmlnZ2VyOwoJ
cHJvY19rZXkudXNlcl9pZCA9IEdldFVzZXJJZCgpOwoJcHJvY19wdHIgPSBoYXNoX3NlYXJj
aChwbHBlcmxfcHJvY19oYXNoLCAmcHJvY19rZXksCgkJCQkJCSAgIEhBU0hfRklORCwgTlVM
TCk7CglpZiAodmFsaWRhdGVfcGxwZXJsX2Z1bmN0aW9uKHByb2NfcHRyLCBwcm9jVHVwKSkK
CXsKCQkvKiBGb3VuZCB2YWxpZCBwbHBlcmwgZW50cnkgKi8KCQlSZWxlYXNlU3lzQ2FjaGUo
cHJvY1R1cCk7CgkJcmV0dXJuIHByb2NfcHRyLT5wcm9jX3B0cjsKCX0KCgkvKiBJZiBub3Qg
Zm91bmQgb3Igb2Jzb2xldGUsIG1heWJlIGl0J3MgcGxwZXJsdSAqLwoJcHJvY19rZXkudXNl
cl9pZCA9IEludmFsaWRPaWQ7Cglwcm9jX3B0ciA9IGhhc2hfc2VhcmNoKHBscGVybF9wcm9j
X2hhc2gsICZwcm9jX2tleSwKCQkJCQkJICAgSEFTSF9GSU5ELCBOVUxMKTsKCWlmICh2YWxp
ZGF0ZV9wbHBlcmxfZnVuY3Rpb24ocHJvY19wdHIsIHByb2NUdXApKQoJewoJCS8qIEZvdW5k
IHZhbGlkIHBscGVybHUgZW50cnkgKi8KCQlSZWxlYXNlU3lzQ2FjaGUocHJvY1R1cCk7CgkJ
cmV0dXJuIHByb2NfcHRyLT5wcm9jX3B0cjsKCX0KCgkvKioqKioqKioqKioqKioqKioqKioq
KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCgkgKiBJZiB3ZSBoYXZl
bid0IGZvdW5kIGl0IGluIHRoZSBoYXNodGFibGUsIHdlIGFuYWx5emUKCSAqIHRoZSBmdW5j
dGlvbidzIGFyZ3VtZW50cyBhbmQgcmV0dXJuIHR5cGUgYW5kIHN0b3JlCgkgKiB0aGUgaW4t
L291dC1mdW5jdGlvbnMgaW4gdGhlIHByb2Rlc2MgYmxvY2ssCgkgKiB0aGVuIHdlIGxvYWQg
dGhlIHByb2NlZHVyZSBpbnRvIHRoZSBQZXJsIGludGVycHJldGVyLAoJICogYW5kIGxhc3Qg
d2UgY3JlYXRlIGEgbmV3IGhhc2h0YWJsZSBlbnRyeSBmb3IgaXQuCgkgKioqKioqKioqKioq
KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwoKCS8q
IFNldCBhIGNhbGxiYWNrIGZvciByZXBvcnRpbmcgY29tcGlsYXRpb24gZXJyb3JzICovCglw
bHBlcmxfZXJyb3JfY29udGV4dC5jYWxsYmFjayA9IHBscGVybF9jb21waWxlX2NhbGxiYWNr
OwoJcGxwZXJsX2Vycm9yX2NvbnRleHQucHJldmlvdXMgPSBlcnJvcl9jb250ZXh0X3N0YWNr
OwoJcGxwZXJsX2Vycm9yX2NvbnRleHQuYXJnID0gTmFtZVN0cihwcm9jU3RydWN0LT5wcm9u
YW1lKTsKCWVycm9yX2NvbnRleHRfc3RhY2sgPSAmcGxwZXJsX2Vycm9yX2NvbnRleHQ7CgoJ
UEdfVFJZKCk7Cgl7CgkJSGVhcFR1cGxlCWxhbmdUdXA7CgkJSGVhcFR1cGxlCXR5cGVUdXA7
CgkJRm9ybV9wZ19sYW5ndWFnZSBsYW5nU3RydWN0OwoJCUZvcm1fcGdfdHlwZSB0eXBlU3Ry
dWN0OwoJCURhdHVtCQlwcm90cmZ0eXBlc19kYXR1bTsKCQlEYXR1bQkJcHJvc3JjZGF0dW07
CgkJYm9vbAkJaXNudWxsOwoJCWNoYXIJICAgKnByb2Nfc291cmNlOwoJCU1lbW9yeUNvbnRl
eHQgb2xkY29udGV4dDsKCgkJLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioq
KioqKioqKioqKioqKioqKioqKioqKioqKgoJCSAqIEFsbG9jYXRlIGEgY29udGV4dCB0aGF0
IHdpbGwgaG9sZCBhbGwgUEcgZGF0YSBmb3IgdGhlIHByb2NlZHVyZS4KCQkgKioqKioqKioq
KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwoJ
CXByb2NfY3h0ID0gQWxsb2NTZXRDb250ZXh0Q3JlYXRlKFRvcE1lbW9yeUNvbnRleHQsCgkJ
CQkJCQkJCQkgIlBML1BlcmwgZnVuY3Rpb24iLAoJCQkJCQkJCQkJIEFMTE9DU0VUX1NNQUxM
X1NJWkVTKTsKCgkJLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioq
KioqKioqKioqKioqKioqKioqKgoJCSAqIEFsbG9jYXRlIGFuZCBmaWxsIGEgbmV3IHByb2Nl
ZHVyZSBkZXNjcmlwdGlvbiBibG9jay4KCQkgKiBzdHJ1Y3QgcHJvZGVzYyBhbmQgc3Vic2lk
aWFyeSBkYXRhIG11c3QgYWxsIGxpdmUgaW4gcHJvY19jeHQuCgkJICoqKioqKioqKioqKioq
KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KCQlvbGRj
b250ZXh0ID0gTWVtb3J5Q29udGV4dFN3aXRjaFRvKHByb2NfY3h0KTsKCQlwcm9kZXNjID0g
KHBscGVybF9wcm9jX2Rlc2MgKikgcGFsbG9jMChzaXplb2YocGxwZXJsX3Byb2NfZGVzYykp
OwoJCXByb2Rlc2MtPnByb25hbWUgPSBwc3RyZHVwKE5hbWVTdHIocHJvY1N0cnVjdC0+cHJv
bmFtZSkpOwoJCU1lbW9yeUNvbnRleHRTZXRJZGVudGlmaWVyKHByb2NfY3h0LCBwcm9kZXNj
LT5wcm9uYW1lKTsKCQlwcm9kZXNjLT5mbl9jeHQgPSBwcm9jX2N4dDsKCQlwcm9kZXNjLT5m
bl9yZWZjb3VudCA9IDA7CgkJcHJvZGVzYy0+Zm5feG1pbiA9IEhlYXBUdXBsZUhlYWRlckdl
dFJhd1htaW4ocHJvY1R1cC0+dF9kYXRhKTsKCQlwcm9kZXNjLT5mbl90aWQgPSBwcm9jVHVw
LT50X3NlbGY7CgkJcHJvZGVzYy0+bmFyZ3MgPSBwcm9jU3RydWN0LT5wcm9uYXJnczsKCQlw
cm9kZXNjLT5hcmdfb3V0X2Z1bmMgPSAoRm1nckluZm8gKikgcGFsbG9jMChwcm9kZXNjLT5u
YXJncyAqIHNpemVvZihGbWdySW5mbykpOwoJCXByb2Rlc2MtPmFyZ19pc19yb3d0eXBlID0g
KGJvb2wgKikgcGFsbG9jMChwcm9kZXNjLT5uYXJncyAqIHNpemVvZihib29sKSk7CgkJcHJv
ZGVzYy0+YXJnX2FycmF5dHlwZSA9IChPaWQgKikgcGFsbG9jMChwcm9kZXNjLT5uYXJncyAq
IHNpemVvZihPaWQpKTsKCQlNZW1vcnlDb250ZXh0U3dpdGNoVG8ob2xkY29udGV4dCk7CgoJ
CS8qIFJlbWVtYmVyIGlmIGZ1bmN0aW9uIGlzIFNUQUJMRS9JTU1VVEFCTEUgKi8KCQlwcm9k
ZXNjLT5mbl9yZWFkb25seSA9CgkJCShwcm9jU3RydWN0LT5wcm92b2xhdGlsZSAhPSBQUk9W
T0xBVElMRV9WT0xBVElMRSk7CgoJCS8qIEZldGNoIHByb3RyZnR5cGVzICovCgkJcHJvdHJm
dHlwZXNfZGF0dW0gPSBTeXNDYWNoZUdldEF0dHIoUFJPQ09JRCwgcHJvY1R1cCwKCQkJCQkJ
CQkJCQlBbnVtX3BnX3Byb2NfcHJvdHJmdHlwZXMsICZpc251bGwpOwoJCU1lbW9yeUNvbnRl
eHRTd2l0Y2hUbyhwcm9jX2N4dCk7CgkJcHJvZGVzYy0+dHJmdHlwZXMgPSBpc251bGwgPyBO
SUwgOiBvaWRfYXJyYXlfdG9fbGlzdChwcm90cmZ0eXBlc19kYXR1bSk7CgkJTWVtb3J5Q29u
dGV4dFN3aXRjaFRvKG9sZGNvbnRleHQpOwoKCQkvKioqKioqKioqKioqKioqKioqKioqKioq
KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCgkJICogTG9va3VwIHRoZSBw
Z19sYW5ndWFnZSB0dXBsZSBieSBPaWQKCQkgKioqKioqKioqKioqKioqKioqKioqKioqKioq
KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwoJCWxhbmdUdXAgPSBTZWFyY2hT
eXNDYWNoZTEoTEFOR09JRCwKCQkJCQkJCQkgIE9iamVjdElkR2V0RGF0dW0ocHJvY1N0cnVj
dC0+cHJvbGFuZykpOwoJCWlmICghSGVhcFR1cGxlSXNWYWxpZChsYW5nVHVwKSkKCQkJZWxv
ZyhFUlJPUiwgImNhY2hlIGxvb2t1cCBmYWlsZWQgZm9yIGxhbmd1YWdlICV1IiwKCQkJCSBw
cm9jU3RydWN0LT5wcm9sYW5nKTsKCQlsYW5nU3RydWN0ID0gKEZvcm1fcGdfbGFuZ3VhZ2Up
IEdFVFNUUlVDVChsYW5nVHVwKTsKCQlwcm9kZXNjLT5sYW5nX29pZCA9IGxhbmdTdHJ1Y3Qt
Pm9pZDsKCQlwcm9kZXNjLT5sYW5wbHRydXN0ZWQgPSBsYW5nU3RydWN0LT5sYW5wbHRydXN0
ZWQ7CgkJUmVsZWFzZVN5c0NhY2hlKGxhbmdUdXApOwoKCQkvKioqKioqKioqKioqKioqKioq
KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCgkJICogR2V0IHRo
ZSByZXF1aXJlZCBpbmZvcm1hdGlvbiBmb3IgaW5wdXQgY29udmVyc2lvbiBvZiB0aGUKCQkg
KiByZXR1cm4gdmFsdWUuCgkJICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioq
KioqKioqKioqKioqKioqKioqKioqKioqKi8KCQlpZiAoIWlzX3RyaWdnZXIgJiYgIWlzX2V2
ZW50X3RyaWdnZXIpCgkJewoJCQlPaWQJCQlyZXR0eXBlID0gcHJvY1N0cnVjdC0+cHJvcmV0
dHlwZTsKCgkJCXR5cGVUdXAgPSBTZWFyY2hTeXNDYWNoZTEoVFlQRU9JRCwgT2JqZWN0SWRH
ZXREYXR1bShyZXR0eXBlKSk7CgkJCWlmICghSGVhcFR1cGxlSXNWYWxpZCh0eXBlVHVwKSkK
CQkJCWVsb2coRVJST1IsICJjYWNoZSBsb29rdXAgZmFpbGVkIGZvciB0eXBlICV1IiwgcmV0
dHlwZSk7CgkJCXR5cGVTdHJ1Y3QgPSAoRm9ybV9wZ190eXBlKSBHRVRTVFJVQ1QodHlwZVR1
cCk7CgoJCQkvKiBEaXNhbGxvdyBwc2V1ZG90eXBlIHJlc3VsdCwgZXhjZXB0IFZPSUQgb3Ig
UkVDT1JEICovCgkJCWlmICh0eXBlU3RydWN0LT50eXB0eXBlID09IFRZUFRZUEVfUFNFVURP
KQoJCQl7CgkJCQlpZiAocmV0dHlwZSA9PSBWT0lET0lEIHx8CgkJCQkJcmV0dHlwZSA9PSBS
RUNPUkRPSUQpCgkJCQkJIC8qIG9rYXkgKi8gOwoJCQkJZWxzZSBpZiAocmV0dHlwZSA9PSBU
UklHR0VST0lEIHx8CgkJCQkJCSByZXR0eXBlID09IEVWVFRSSUdHRVJPSUQpCgkJCQkJZXJl
cG9ydChFUlJPUiwKCQkJCQkJCShlcnJjb2RlKEVSUkNPREVfRkVBVFVSRV9OT1RfU1VQUE9S
VEVEKSwKCQkJCQkJCSBlcnJtc2coInRyaWdnZXIgZnVuY3Rpb25zIGNhbiBvbmx5IGJlIGNh
bGxlZCAiCgkJCQkJCQkJCSJhcyB0cmlnZ2VycyIpKSk7CgkJCQllbHNlCgkJCQkJZXJlcG9y
dChFUlJPUiwKCQkJCQkJCShlcnJjb2RlKEVSUkNPREVfRkVBVFVSRV9OT1RfU1VQUE9SVEVE
KSwKCQkJCQkJCSBlcnJtc2coIlBML1BlcmwgZnVuY3Rpb25zIGNhbm5vdCByZXR1cm4gdHlw
ZSAlcyIsCgkJCQkJCQkJCWZvcm1hdF90eXBlX2JlKHJldHR5cGUpKSkpOwoJCQl9CgoJCQlw
cm9kZXNjLT5yZXN1bHRfb2lkID0gcmV0dHlwZTsKCQkJcHJvZGVzYy0+Zm5fcmV0aXNzZXQg
PSBwcm9jU3RydWN0LT5wcm9yZXRzZXQ7CgkJCXByb2Rlc2MtPmZuX3JldGlzdHVwbGUgPSB0
eXBlX2lzX3Jvd3R5cGUocmV0dHlwZSk7CgoJCQlwcm9kZXNjLT5mbl9yZXRpc2FycmF5ID0K
CQkJCSh0eXBlU3RydWN0LT50eXBsZW4gPT0gLTEgJiYgdHlwZVN0cnVjdC0+dHlwZWxlbSk7
CgoJCQlmbWdyX2luZm9fY3h0KHR5cGVTdHJ1Y3QtPnR5cGlucHV0LAoJCQkJCQkgICYocHJv
ZGVzYy0+cmVzdWx0X2luX2Z1bmMpLAoJCQkJCQkgIHByb2NfY3h0KTsKCQkJcHJvZGVzYy0+
cmVzdWx0X3R5cGlvcGFyYW0gPSBnZXRUeXBlSU9QYXJhbSh0eXBlVHVwKTsKCgkJCVJlbGVh
c2VTeXNDYWNoZSh0eXBlVHVwKTsKCQl9CgoJCS8qKioqKioqKioqKioqKioqKioqKioqKioq
KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKCQkgKiBHZXQgdGhlIHJlcXVp
cmVkIGluZm9ybWF0aW9uIGZvciBvdXRwdXQgY29udmVyc2lvbgoJCSAqIG9mIGFsbCBwcm9j
ZWR1cmUgYXJndW1lbnRzCgkJICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioq
KioqKioqKioqKioqKioqKioqKioqKioqKi8KCQlpZiAoIWlzX3RyaWdnZXIgJiYgIWlzX2V2
ZW50X3RyaWdnZXIpCgkJewoJCQlpbnQJCQlpOwoKCQkJZm9yIChpID0gMDsgaSA8IHByb2Rl
c2MtPm5hcmdzOyBpKyspCgkJCXsKCQkJCU9pZAkJCWFyZ3R5cGUgPSBwcm9jU3RydWN0LT5w
cm9hcmd0eXBlcy52YWx1ZXNbaV07CgoJCQkJdHlwZVR1cCA9IFNlYXJjaFN5c0NhY2hlMShU
WVBFT0lELCBPYmplY3RJZEdldERhdHVtKGFyZ3R5cGUpKTsKCQkJCWlmICghSGVhcFR1cGxl
SXNWYWxpZCh0eXBlVHVwKSkKCQkJCQllbG9nKEVSUk9SLCAiY2FjaGUgbG9va3VwIGZhaWxl
ZCBmb3IgdHlwZSAldSIsIGFyZ3R5cGUpOwoJCQkJdHlwZVN0cnVjdCA9IChGb3JtX3BnX3R5
cGUpIEdFVFNUUlVDVCh0eXBlVHVwKTsKCgkJCQkvKiBEaXNhbGxvdyBwc2V1ZG90eXBlIGFy
Z3VtZW50LCBleGNlcHQgUkVDT1JEICovCgkJCQlpZiAodHlwZVN0cnVjdC0+dHlwdHlwZSA9
PSBUWVBUWVBFX1BTRVVETyAmJgoJCQkJCWFyZ3R5cGUgIT0gUkVDT1JET0lEKQoJCQkJCWVy
ZXBvcnQoRVJST1IsCgkJCQkJCQkoZXJyY29kZShFUlJDT0RFX0ZFQVRVUkVfTk9UX1NVUFBP
UlRFRCksCgkJCQkJCQkgZXJybXNnKCJQTC9QZXJsIGZ1bmN0aW9ucyBjYW5ub3QgYWNjZXB0
IHR5cGUgJXMiLAoJCQkJCQkJCQlmb3JtYXRfdHlwZV9iZShhcmd0eXBlKSkpKTsKCgkJCQlp
ZiAodHlwZV9pc19yb3d0eXBlKGFyZ3R5cGUpKQoJCQkJCXByb2Rlc2MtPmFyZ19pc19yb3d0
eXBlW2ldID0gdHJ1ZTsKCQkJCWVsc2UKCQkJCXsKCQkJCQlwcm9kZXNjLT5hcmdfaXNfcm93
dHlwZVtpXSA9IGZhbHNlOwoJCQkJCWZtZ3JfaW5mb19jeHQodHlwZVN0cnVjdC0+dHlwb3V0
cHV0LAoJCQkJCQkJCSAgJihwcm9kZXNjLT5hcmdfb3V0X2Z1bmNbaV0pLAoJCQkJCQkJCSAg
cHJvY19jeHQpOwoJCQkJfQoKCQkJCS8qIElkZW50aWZ5IGFycmF5LXR5cGUgYXJndW1lbnRz
ICovCgkJCQlpZiAodHlwZVN0cnVjdC0+dHlwZWxlbSAhPSAwICYmIHR5cGVTdHJ1Y3QtPnR5
cGxlbiA9PSAtMSkKCQkJCQlwcm9kZXNjLT5hcmdfYXJyYXl0eXBlW2ldID0gYXJndHlwZTsK
CQkJCWVsc2UKCQkJCQlwcm9kZXNjLT5hcmdfYXJyYXl0eXBlW2ldID0gSW52YWxpZE9pZDsK
CgkJCQlSZWxlYXNlU3lzQ2FjaGUodHlwZVR1cCk7CgkJCX0KCQl9CgoJCS8qKioqKioqKioq
KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKCQkg
KiBjcmVhdGUgdGhlIHRleHQgb2YgdGhlIGFub255bW91cyBzdWJyb3V0aW5lLgoJCSAqIHdl
IGRvIG5vdCB1c2UgYSBuYW1lZCBzdWJyb3V0aW5lIHNvIHRoYXQgd2UgY2FuIGNhbGwgZGly
ZWN0bHkKCQkgKiB0aHJvdWdoIHRoZSByZWZlcmVuY2UuCgkJICoqKioqKioqKioqKioqKioq
KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KCQlwcm9zcmNk
YXR1bSA9IFN5c0NhY2hlR2V0QXR0cihQUk9DT0lELCBwcm9jVHVwLAoJCQkJCQkJCQkgIEFu
dW1fcGdfcHJvY19wcm9zcmMsICZpc251bGwpOwoJCWlmIChpc251bGwpCgkJCWVsb2coRVJS
T1IsICJudWxsIHByb3NyYyIpOwoJCXByb2Nfc291cmNlID0gVGV4dERhdHVtR2V0Q1N0cmlu
Zyhwcm9zcmNkYXR1bSk7CgoJCS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioq
KioqKioqKioqKioqKioqKioqKioqKioqKioKCQkgKiBDcmVhdGUgdGhlIHByb2NlZHVyZSBp
biB0aGUgYXBwcm9wcmlhdGUgaW50ZXJwcmV0ZXIKCQkgKioqKioqKioqKioqKioqKioqKioq
KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwoKCQlzZWxlY3RfcGVy
bF9jb250ZXh0KHByb2Rlc2MtPmxhbnBsdHJ1c3RlZCk7CgoJCXByb2Rlc2MtPmludGVycCA9
IHBscGVybF9hY3RpdmVfaW50ZXJwOwoKCQlwbHBlcmxfY3JlYXRlX3N1Yihwcm9kZXNjLCBw
cm9jX3NvdXJjZSwgZm5fb2lkKTsKCgkJYWN0aXZhdGVfaW50ZXJwcmV0ZXIob2xkaW50ZXJw
KTsKCgkJcGZyZWUocHJvY19zb3VyY2UpOwoKCQlpZiAoIXByb2Rlc2MtPnJlZmVyZW5jZSkJ
LyogY2FuIHRoaXMgaGFwcGVuPyAqLwoJCQllbG9nKEVSUk9SLCAiY291bGQgbm90IGNyZWF0
ZSBQTC9QZXJsIGludGVybmFsIHByb2NlZHVyZSIpOwoKCQkvKioqKioqKioqKioqKioqKioq
KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCgkJICogT0ssIGxp
bmsgdGhlIHByb2NlZHVyZSBpbnRvIHRoZSBjb3JyZWN0IGhhc2h0YWJsZSBlbnRyeS4KCQkg
KiBOb3RlIHdlIGFzc3VtZSB0aGF0IHRoZSBoYXNodGFibGUgZW50cnkgZWl0aGVyIGRvZXNu
J3QgZXhpc3QgeWV0LAoJCSAqIG9yIHdlIGFscmVhZHkgY2xlYXJlZCBpdHMgcHJvY19wdHIg
ZHVyaW5nIHRoZSB2YWxpZGF0aW9uIGF0dGVtcHRzCgkJICogYWJvdmUuICBTbyBubyBuZWVk
IHRvIGRlY3JlbWVudCBhbiBvbGQgcmVmY291bnQgaGVyZS4KCQkgKioqKioqKioqKioqKioq
KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwoJCXByb2Nf
a2V5LnVzZXJfaWQgPSBwcm9kZXNjLT5sYW5wbHRydXN0ZWQgPyBHZXRVc2VySWQoKSA6IElu
dmFsaWRPaWQ7CgoJCXByb2NfcHRyID0gaGFzaF9zZWFyY2gocGxwZXJsX3Byb2NfaGFzaCwg
JnByb2Nfa2V5LAoJCQkJCQkJICAgSEFTSF9FTlRFUiwgTlVMTCk7CgkJLyogV2UgYXNzdW1l
IHRoZXNlIHR3byBzdGVwcyBjYW4ndCB0aHJvdyBhbiBlcnJvcjogKi8KCQlwcm9jX3B0ci0+
cHJvY19wdHIgPSBwcm9kZXNjOwoJCWluY3JlbWVudF9wcm9kZXNjX3JlZmNvdW50KHByb2Rl
c2MpOwoJfQoJUEdfQ0FUQ0goKTsKCXsKCQkvKgoJCSAqIElmIHdlIGdvdCBhcyBmYXIgYXMg
Y3JlYXRpbmcgYSByZWZlcmVuY2UsIHdlIHNob3VsZCBiZSBhYmxlIHRvIHVzZQoJCSAqIGZy
ZWVfcGxwZXJsX2Z1bmN0aW9uKCkgdG8gY2xlYW4gdXAuICBJZiBub3QsIHRoZW4gYXQgbW9z
dCB3ZSBoYXZlCgkJICogc29tZSBQRyBtZW1vcnkgcmVzb3VyY2VzIGluIHByb2NfY3h0LCB3
aGljaCB3ZSBjYW4ganVzdCBkZWxldGUuCgkJICovCgkJaWYgKHByb2Rlc2MgJiYgcHJvZGVz
Yy0+cmVmZXJlbmNlKQoJCQlmcmVlX3BscGVybF9mdW5jdGlvbihwcm9kZXNjKTsKCQllbHNl
IGlmIChwcm9jX2N4dCkKCQkJTWVtb3J5Q29udGV4dERlbGV0ZShwcm9jX2N4dCk7CgoJCS8q
IEJlIHN1cmUgdG8gcmVzdG9yZSB0aGUgcHJldmlvdXMgaW50ZXJwcmV0ZXIsIHRvbywgZm9y
IGx1Y2sgKi8KCQlhY3RpdmF0ZV9pbnRlcnByZXRlcihvbGRpbnRlcnApOwoKCQlQR19SRV9U
SFJPVygpOwoJfQoJUEdfRU5EX1RSWSgpOwoKCS8qIHJlc3RvcmUgcHJldmlvdXMgZXJyb3Ig
Y2FsbGJhY2sgKi8KCWVycm9yX2NvbnRleHRfc3RhY2sgPSBwbHBlcmxfZXJyb3JfY29udGV4
dC5wcmV2aW91czsKCglSZWxlYXNlU3lzQ2FjaGUocHJvY1R1cCk7CgoJcmV0dXJuIHByb2Rl
c2M7Cn0KCi8qIEJ1aWxkIGEgaGFzaCBmcm9tIGEgZ2l2ZW4gY29tcG9zaXRlL3JvdyBkYXR1
bSAqLwpzdGF0aWMgU1YgICoKcGxwZXJsX2hhc2hfZnJvbV9kYXR1bShEYXR1bSBhdHRyKQp7
CglIZWFwVHVwbGVIZWFkZXIgdGQ7CglPaWQJCQl0dXBUeXBlOwoJaW50MzIJCXR1cFR5cG1v
ZDsKCVR1cGxlRGVzYwl0dXBkZXNjOwoJSGVhcFR1cGxlRGF0YSB0bXB0dXA7CglTVgkJICAg
KnN2OwoKCXRkID0gRGF0dW1HZXRIZWFwVHVwbGVIZWFkZXIoYXR0cik7CgoJLyogRXh0cmFj
dCByb3d0eXBlIGluZm8gYW5kIGZpbmQgYSB0dXBkZXNjICovCgl0dXBUeXBlID0gSGVhcFR1
cGxlSGVhZGVyR2V0VHlwZUlkKHRkKTsKCXR1cFR5cG1vZCA9IEhlYXBUdXBsZUhlYWRlckdl
dFR5cE1vZCh0ZCk7Cgl0dXBkZXNjID0gbG9va3VwX3Jvd3R5cGVfdHVwZGVzYyh0dXBUeXBl
LCB0dXBUeXBtb2QpOwoKCS8qIEJ1aWxkIGEgdGVtcG9yYXJ5IEhlYXBUdXBsZSBjb250cm9s
IHN0cnVjdHVyZSAqLwoJdG1wdHVwLnRfbGVuID0gSGVhcFR1cGxlSGVhZGVyR2V0RGF0dW1M
ZW5ndGgodGQpOwoJdG1wdHVwLnRfZGF0YSA9IHRkOwoKCXN2ID0gcGxwZXJsX2hhc2hfZnJv
bV90dXBsZSgmdG1wdHVwLCB0dXBkZXNjLCB0cnVlKTsKCVJlbGVhc2VUdXBsZURlc2ModHVw
ZGVzYyk7CgoJcmV0dXJuIHN2Owp9CgovKiBCdWlsZCBhIGhhc2ggZnJvbSBhbGwgYXR0cmli
dXRlcyBvZiBhIGdpdmVuIHR1cGxlLiAqLwpzdGF0aWMgU1YgICoKcGxwZXJsX2hhc2hfZnJv
bV90dXBsZShIZWFwVHVwbGUgdHVwbGUsIFR1cGxlRGVzYyB0dXBkZXNjLCBib29sIGluY2x1
ZGVfZ2VuZXJhdGVkKQp7CglkVEhYOwoJSFYJCSAgICpodjsKCWludAkJCWk7CgoJLyogc2lu
Y2UgdGhpcyBmdW5jdGlvbiByZWN1cnNlcywgaXQgY291bGQgYmUgZHJpdmVuIHRvIHN0YWNr
IG92ZXJmbG93ICovCgljaGVja19zdGFja19kZXB0aCgpOwoKCWh2ID0gbmV3SFYoKTsKCWh2
X2tzcGxpdChodiwgdHVwZGVzYy0+bmF0dHMpOwkvKiBwcmUtZ3JvdyB0aGUgaGFzaCAqLwoK
CWZvciAoaSA9IDA7IGkgPCB0dXBkZXNjLT5uYXR0czsgaSsrKQoJewoJCURhdHVtCQlhdHRy
OwoJCWJvb2wJCWlzbnVsbCwKCQkJCQl0eXBpc3ZhcmxlbmE7CgkJY2hhcgkgICAqYXR0bmFt
ZTsKCQlPaWQJCQl0eXBvdXRwdXQ7CgkJRm9ybV9wZ19hdHRyaWJ1dGUgYXR0ID0gVHVwbGVE
ZXNjQXR0cih0dXBkZXNjLCBpKTsKCgkJaWYgKGF0dC0+YXR0aXNkcm9wcGVkKQoJCQljb250
aW51ZTsKCgkJaWYgKGF0dC0+YXR0Z2VuZXJhdGVkKQoJCXsKCQkJLyogZG9uJ3QgaW5jbHVk
ZSB1bmxlc3MgcmVxdWVzdGVkICovCgkJCWlmICghaW5jbHVkZV9nZW5lcmF0ZWQpCgkJCQlj
b250aW51ZTsKCQl9CgoJCWF0dG5hbWUgPSBOYW1lU3RyKGF0dC0+YXR0bmFtZSk7CgkJYXR0
ciA9IGhlYXBfZ2V0YXR0cih0dXBsZSwgaSArIDEsIHR1cGRlc2MsICZpc251bGwpOwoKCQlp
ZiAoaXNudWxsKQoJCXsKCQkJLyoKCQkJICogU3RvcmUgKGF0dG5hbWUgPT4gdW5kZWYpIGFu
ZCBtb3ZlIG9uLiAgTm90ZSB3ZSBjYW4ndCB1c2UKCQkJICogJlBMX3N2X3VuZGVmIGhlcmU7
IHNlZSAiQVZzLCBIVnMgYW5kIHVuZGVmaW5lZCB2YWx1ZXMiIGluCgkJCSAqIHBlcmxndXRz
IGZvciBhbiBleHBsYW5hdGlvbi4KCQkJICovCgkJCWh2X3N0b3JlX3N0cmluZyhodiwgYXR0
bmFtZSwgbmV3U1YoMCkpOwoJCQljb250aW51ZTsKCQl9CgoJCWlmICh0eXBlX2lzX3Jvd3R5
cGUoYXR0LT5hdHR0eXBpZCkpCgkJewoJCQlTVgkJICAgKnN2ID0gcGxwZXJsX2hhc2hfZnJv
bV9kYXR1bShhdHRyKTsKCgkJCWh2X3N0b3JlX3N0cmluZyhodiwgYXR0bmFtZSwgc3YpOwoJ
CX0KCQllbHNlCgkJewoJCQlTVgkJICAgKnN2OwoJCQlPaWQJCQlmdW5jaWQ7CgoJCQlpZiAo
T2lkSXNWYWxpZChnZXRfYmFzZV9lbGVtZW50X3R5cGUoYXR0LT5hdHR0eXBpZCkpKQoJCQkJ
c3YgPSBwbHBlcmxfcmVmX2Zyb21fcGdfYXJyYXkoYXR0ciwgYXR0LT5hdHR0eXBpZCk7CgkJ
CWVsc2UgaWYgKChmdW5jaWQgPSBnZXRfdHJhbnNmb3JtX2Zyb21zcWwoYXR0LT5hdHR0eXBp
ZCwgY3VycmVudF9jYWxsX2RhdGEtPnByb2Rlc2MtPmxhbmdfb2lkLCBjdXJyZW50X2NhbGxf
ZGF0YS0+cHJvZGVzYy0+dHJmdHlwZXMpKSkKCQkJCXN2ID0gKFNWICopIERhdHVtR2V0UG9p
bnRlcihPaWRGdW5jdGlvbkNhbGwxKGZ1bmNpZCwgYXR0cikpOwoJCQllbHNlCgkJCXsKCQkJ
CWNoYXIJICAgKm91dHB1dHN0cjsKCgkJCQkvKiBYWFggc2hvdWxkIGhhdmUgYSB3YXkgdG8g
Y2FjaGUgdGhlc2UgbG9va3VwcyAqLwoJCQkJZ2V0VHlwZU91dHB1dEluZm8oYXR0LT5hdHR0
eXBpZCwgJnR5cG91dHB1dCwgJnR5cGlzdmFybGVuYSk7CgoJCQkJb3V0cHV0c3RyID0gT2lk
T3V0cHV0RnVuY3Rpb25DYWxsKHR5cG91dHB1dCwgYXR0cik7CgkJCQlzdiA9IGNzdHIyc3Yo
b3V0cHV0c3RyKTsKCQkJCXBmcmVlKG91dHB1dHN0cik7CgkJCX0KCgkJCWh2X3N0b3JlX3N0
cmluZyhodiwgYXR0bmFtZSwgc3YpOwoJCX0KCX0KCXJldHVybiBuZXdSVl9ub2luYygoU1Yg
KikgaHYpOwp9CgoKc3RhdGljIHZvaWQKY2hlY2tfc3BpX3VzYWdlX2FsbG93ZWQodm9pZCkK
ewoJLyogc2VlIGNvbW1lbnQgaW4gcGxwZXJsX2ZpbmkoKSAqLwoJaWYgKHBscGVybF9lbmRp
bmcpCgl7CgkJLyogc2ltcGxlIGNyb2FrIGFzIHdlIGRvbid0IHdhbnQgdG8gaW52b2x2ZSBQ
b3N0Z3JlU1FMIGNvZGUgKi8KCQljcm9haygiU1BJIGZ1bmN0aW9ucyBjYW4gbm90IGJlIHVz
ZWQgaW4gRU5EIGJsb2NrcyIpOwoJfQoKCS8qCgkgKiBEaXNhbGxvdyBTUEkgdXNhZ2UgaWYg
d2UncmUgbm90IGV4ZWN1dGluZyBhIGZ1bGx5LWNvbXBpbGVkIHBscGVybAoJICogZnVuY3Rp
b24uICBJdCBtaWdodCBzZWVtIGltcG9zc2libGUgdG8gZ2V0IGhlcmUgaW4gdGhhdCBjYXNl
LCBidXQgdGhlcmUKCSAqIGFyZSBjYXNlcyB3aGVyZSBQZXJsIHdpbGwgdHJ5IHRvIGV4ZWN1
dGUgY29kZSBkdXJpbmcgY29tcGlsYXRpb24uICBJZgoJICogd2UgcHJvY2VlZCB3ZSBhcmUg
bGlrZWx5IHRvIGNyYXNoIHRyeWluZyB0byBkZXJlZmVyZW5jZSB0aGUgcHJvZGVzYwoJICog
cG9pbnRlci4gIFdvcmtpbmcgYXJvdW5kIHRoYXQgbWlnaHQgYmUgcG9zc2libGUsIGJ1dCBp
dCBzZWVtcyB1bndpc2UKCSAqIGJlY2F1c2UgaXQnZCBhbGxvdyBjb2RlIGV4ZWN1dGlvbiB0
byBoYXBwZW4gd2hpbGUgdmFsaWRhdGluZyBhCgkgKiBmdW5jdGlvbiwgd2hpY2ggaXMgdW5k
ZXNpcmFibGUuCgkgKi8KCWlmIChjdXJyZW50X2NhbGxfZGF0YSA9PSBOVUxMIHx8IGN1cnJl
bnRfY2FsbF9kYXRhLT5wcm9kZXNjID09IE5VTEwpCgl7CgkJLyogc2ltcGxlIGNyb2FrIGFz
IHdlIGRvbid0IHdhbnQgdG8gaW52b2x2ZSBQb3N0Z3JlU1FMIGNvZGUgKi8KCQljcm9haygi
U1BJIGZ1bmN0aW9ucyBjYW4gbm90IGJlIHVzZWQgZHVyaW5nIGZ1bmN0aW9uIGNvbXBpbGF0
aW9uIik7Cgl9Cn0KCgpIViAqCnBscGVybF9zcGlfZXhlYyhjaGFyICpxdWVyeSwgaW50IGxp
bWl0KQp7CglIVgkJICAgKnJldF9odjsKCgkvKgoJICogRXhlY3V0ZSB0aGUgcXVlcnkgaW5z
aWRlIGEgc3ViLXRyYW5zYWN0aW9uLCBzbyB3ZSBjYW4gY29wZSB3aXRoIGVycm9ycwoJICog
c2FuZWx5CgkgKi8KCU1lbW9yeUNvbnRleHQgb2xkY29udGV4dCA9IEN1cnJlbnRNZW1vcnlD
b250ZXh0OwoJUmVzb3VyY2VPd25lciBvbGRvd25lciA9IEN1cnJlbnRSZXNvdXJjZU93bmVy
OwoJcGxwZXJsX2NhbGxfZGF0YSBmYWtlX3BscGVybF9jYWxsX2RhdGE7CglwbHBlcmxfcHJv
Y19kZXNjIGZha2VfcGxwZXJsX3Byb2NfZGVzYzsKCi8vCW1lbXNldCgmZmFrZV9wbHBlcmxf
Y2FsbF9kYXRhLCAwLCBzaXplb2YocGxwZXJsX2NhbGxfZGF0YSkpOwovLwltZW1zZXQoJmZh
a2VfcGxwZXJsX3Byb2NfZGVzYywgMCwgc2l6ZW9mKGZha2VfcGxwZXJsX3Byb2NfZGVzYykp
OwovLwovLwljdXJyZW50X2NhbGxfZGF0YSAgICAgICAgICAgICA9ICZmYWtlX3BscGVybF9j
YWxsX2RhdGE7Ci8vCWN1cnJlbnRfY2FsbF9kYXRhLT5wcm9kZXNjICAgID0gJmZha2VfcGxw
ZXJsX3Byb2NfZGVzYzsKCgljaGVja19zcGlfdXNhZ2VfYWxsb3dlZCgpOwoKCUJlZ2luSW50
ZXJuYWxTdWJUcmFuc2FjdGlvbihOVUxMKTsKCS8qIFdhbnQgdG8gcnVuIGluc2lkZSBmdW5j
dGlvbidzIG1lbW9yeSBjb250ZXh0ICovCglNZW1vcnlDb250ZXh0U3dpdGNoVG8ob2xkY29u
dGV4dCk7CgoJUEdfVFJZKCk7Cgl7CgkJaW50CQkJc3BpX3J2OwoKCQlwZ192ZXJpZnltYnN0
cihxdWVyeSwgc3RybGVuKHF1ZXJ5KSwgZmFsc2UpOwoKCQlzcGlfcnYgPSBTUElfZXhlY3V0
ZShxdWVyeSwgY3VycmVudF9jYWxsX2RhdGEtPnByb2Rlc2MtPmZuX3JlYWRvbmx5LCBsaW1p
dCk7CgkJcmV0X2h2ID0gcGxwZXJsX3NwaV9leGVjdXRlX2ZldGNoX3Jlc3VsdChTUElfdHVw
dGFibGUsIFNQSV9wcm9jZXNzZWQsCgkJCQkJCQkJCQkJCSBzcGlfcnYpOwoKCQkvKiBDb21t
aXQgdGhlIGlubmVyIHRyYW5zYWN0aW9uLCByZXR1cm4gdG8gb3V0ZXIgeGFjdCBjb250ZXh0
ICovCgkJUmVsZWFzZUN1cnJlbnRTdWJUcmFuc2FjdGlvbigpOwoJCU1lbW9yeUNvbnRleHRT
d2l0Y2hUbyhvbGRjb250ZXh0KTsKCQlDdXJyZW50UmVzb3VyY2VPd25lciA9IG9sZG93bmVy
OwoJfQoJUEdfQ0FUQ0goKTsKCXsKCQlFcnJvckRhdGEgICplZGF0YTsKCgkJLyogU2F2ZSBl
cnJvciBpbmZvICovCgkJTWVtb3J5Q29udGV4dFN3aXRjaFRvKG9sZGNvbnRleHQpOwoJCWVk
YXRhID0gQ29weUVycm9yRGF0YSgpOwoJCUZsdXNoRXJyb3JTdGF0ZSgpOwoKCQkvKiBBYm9y
dCB0aGUgaW5uZXIgdHJhbnNhY3Rpb24gKi8KCQlSb2xsYmFja0FuZFJlbGVhc2VDdXJyZW50
U3ViVHJhbnNhY3Rpb24oKTsKCQlNZW1vcnlDb250ZXh0U3dpdGNoVG8ob2xkY29udGV4dCk7
CgkJQ3VycmVudFJlc291cmNlT3duZXIgPSBvbGRvd25lcjsKCgkJLyogUHVudCBUaGUgZXJy
b3IgdG8gUGVybCAqLwoJCQkJaWYgKGVkYXRhLT5kZXRhaWwpIHsKCQkJY3JvYWsoIiVzXG5E
RVRBSUw6ICAlcyIsIGVkYXRhLT5tZXNzYWdlLCBlZGF0YS0+ZGV0YWlsKTsKCQl9CgkJCQll
bHNlIHsKCQkJY3JvYWsoIiVzIiwgZWRhdGEtPm1lc3NhZ2UpOwoJCX0KCgkJCQkvKiBSZWFs
bHkgd2Ugd2FudCBhIFBvc3RncmVTUUw6Okluc2VydmVyOjpTUEk6OkVycm9yRGF0YSBjbGFz
cyB3aXRoIHRoZSBhcHByb3ByaWF0ZSBsb2dpYyAqLwoJCQkJLyogPFJob2RpdW1Ub2FkPiBi
ZWNhdXNlIHlvdSB3YW50IGNvbXBhdGliaWxpdHksIHNvIHlvdSBtYWtlIGl0IHN0cmluZ2lm
eSBpbnRvIHRoZSBzYW1lIG1lc3NhZ2UgeW91IGN1cnJlbnRseSBnZXQgKi8KCQkJCS8qIDxS
aG9kaXVtVG9hZD4gYnV0IHdpdGggLT57ZGV0YWlsfSBhbmQgLT57c3Fsc3RhdGV9IGFuZCB3
aGF0bm90IGZpZWxkcyBhdmFpbGFibGUgdG9vICovCgoJCS8qIENhbid0IGdldCBoZXJlLCBi
dXQga2VlcCBjb21waWxlciBxdWlldCAqLwoKLy8JCWN1cnJlbnRfY2FsbF9kYXRhID0gTlVM
TDsKCgkJcmV0dXJuIE5VTEw7Cgl9CglQR19FTkRfVFJZKCk7CgovLwljdXJyZW50X2NhbGxf
ZGF0YSA9IE5VTEw7CgoJcmV0dXJuIHJldF9odjsKfQoKCnN0YXRpYyBIViAgKgpwbHBlcmxf
c3BpX2V4ZWN1dGVfZmV0Y2hfcmVzdWx0KFNQSVR1cGxlVGFibGUgKnR1cHRhYmxlLCB1aW50
NjQgcHJvY2Vzc2VkLAoJCQkJCQkJCWludCBzdGF0dXMpCnsKCWRUSFg7CglIVgkJICAgKnJl
c3VsdDsKCgljaGVja19zcGlfdXNhZ2VfYWxsb3dlZCgpOwoKCXJlc3VsdCA9IG5ld0hWKCk7
CgoJaHZfc3RvcmVfc3RyaW5nKHJlc3VsdCwgInN0YXR1cyIsCgkJCQkJY3N0cjJzdihTUElf
cmVzdWx0X2NvZGVfc3RyaW5nKHN0YXR1cykpKTsKCWh2X3N0b3JlX3N0cmluZyhyZXN1bHQs
ICJwcm9jZXNzZWQiLAoJCQkJCShwcm9jZXNzZWQgPiAodWludDY0KSBVVl9NQVgpID8KCQkJ
CQluZXdTVm52KChOVikgcHJvY2Vzc2VkKSA6CgkJCQkJbmV3U1Z1digoVVYpIHByb2Nlc3Nl
ZCkpOwoKCWlmIChzdGF0dXMgPiAwICYmIHR1cHRhYmxlKQoJewoJCUFWCQkgICAqcm93czsK
CQlTVgkJICAgKnJvdzsKCQl1aW50NjQJCWk7CgoJCS8qIFByZXZlbnQgb3ZlcmZsb3cgaW4g
Y2FsbCB0byBhdl9leHRlbmQoKSAqLwoJCWlmIChwcm9jZXNzZWQgPiAodWludDY0KSBBVl9T
SVpFX01BWCkKCQkJZXJlcG9ydChFUlJPUiwKCQkJCQkoZXJyY29kZShFUlJDT0RFX1BST0dS
QU1fTElNSVRfRVhDRUVERUQpLAoJCQkJCSBlcnJtc2coInF1ZXJ5IHJlc3VsdCBoYXMgdG9v
IG1hbnkgcm93cyB0byBmaXQgaW4gYSBQZXJsIGFycmF5IikpKTsKCgkJcm93cyA9IG5ld0FW
KCk7CgkJYXZfZXh0ZW5kKHJvd3MsIHByb2Nlc3NlZCk7CgkJZm9yIChpID0gMDsgaSA8IHBy
b2Nlc3NlZDsgaSsrKQoJCXsKCQkJcm93ID0gcGxwZXJsX2hhc2hfZnJvbV90dXBsZSh0dXB0
YWJsZS0+dmFsc1tpXSwgdHVwdGFibGUtPnR1cGRlc2MsIHRydWUpOwoJCQlhdl9wdXNoKHJv
d3MsIHJvdyk7CgkJfQoJCWh2X3N0b3JlX3N0cmluZyhyZXN1bHQsICJyb3dzIiwKCQkJCQkJ
bmV3UlZfbm9pbmMoKFNWICopIHJvd3MpKTsKCX0KCglTUElfZnJlZXR1cHRhYmxlKHR1cHRh
YmxlKTsKCglyZXR1cm4gcmVzdWx0Owp9CgoKLyoKICogcGxwZXJsX3JldHVybl9uZXh0IGNh
dGNoZXMgYW55IGVycm9yIGFuZCBjb252ZXJ0cyBpdCB0byBhIFBlcmwgZXJyb3IuCiAqIFdl
IGFzc3VtZSAocGVyaGFwcyB3aXRob3V0IGFkZXF1YXRlIGp1c3RpZmljYXRpb24pIHRoYXQg
d2UgbmVlZCBub3QgYWJvcnQKICogdGhlIGN1cnJlbnQgdHJhbnNhY3Rpb24gaWYgdGhlIFBl
cmwgY29kZSB0cmFwcyB0aGUgZXJyb3IuCiAqLwp2b2lkCnBscGVybF9yZXR1cm5fbmV4dChT
ViAqc3YpCnsKCU1lbW9yeUNvbnRleHQgb2xkY29udGV4dCA9IEN1cnJlbnRNZW1vcnlDb250
ZXh0OwoKCWNoZWNrX3NwaV91c2FnZV9hbGxvd2VkKCk7CgoJUEdfVFJZKCk7Cgl7CgkJcGxw
ZXJsX3JldHVybl9uZXh0X2ludGVybmFsKHN2KTsKCX0KCVBHX0NBVENIKCk7Cgl7CgkJRXJy
b3JEYXRhICAqZWRhdGE7CgoJCS8qIE11c3QgcmVzZXQgZWxvZy5jJ3Mgc3RhdGUgKi8KCQlN
ZW1vcnlDb250ZXh0U3dpdGNoVG8ob2xkY29udGV4dCk7CgkJZWRhdGEgPSBDb3B5RXJyb3JE
YXRhKCk7CgkJRmx1c2hFcnJvclN0YXRlKCk7CgoJCS8qIFB1bnQgdGhlIGVycm9yIHRvIFBl
cmwgKi8KCQljcm9ha19jc3RyKGVkYXRhLT5tZXNzYWdlKTsKCX0KCVBHX0VORF9UUlkoKTsK
fQoKLyoKICogcGxwZXJsX3JldHVybl9uZXh0X2ludGVybmFsIHJlcG9ydHMgYW55IGVycm9y
cyBpbiBQb3N0Z3JlcyBmYXNoaW9uCiAqICh2aWEgZXJlcG9ydCkuCiAqLwpzdGF0aWMgdm9p
ZApwbHBlcmxfcmV0dXJuX25leHRfaW50ZXJuYWwoU1YgKnN2KQp7CglwbHBlcmxfcHJvY19k
ZXNjICpwcm9kZXNjOwoJRnVuY3Rpb25DYWxsSW5mbyBmY2luZm87CglSZXR1cm5TZXRJbmZv
ICpyc2k7CglNZW1vcnlDb250ZXh0IG9sZF9jeHQ7CgoJaWYgKCFzdikKCQlyZXR1cm47CgoJ
cHJvZGVzYyA9IGN1cnJlbnRfY2FsbF9kYXRhLT5wcm9kZXNjOwoJZmNpbmZvID0gY3VycmVu
dF9jYWxsX2RhdGEtPmZjaW5mbzsKCXJzaSA9IChSZXR1cm5TZXRJbmZvICopIGZjaW5mby0+
cmVzdWx0aW5mbzsKCglpZiAoIXByb2Rlc2MtPmZuX3JldGlzc2V0KQoJCWVyZXBvcnQoRVJS
T1IsCgkJCQkoZXJyY29kZShFUlJDT0RFX1NZTlRBWF9FUlJPUiksCgkJCQkgZXJybXNnKCJj
YW5ub3QgdXNlIHJldHVybl9uZXh0IGluIGEgbm9uLVNFVE9GIGZ1bmN0aW9uIikpKTsKCglp
ZiAoIWN1cnJlbnRfY2FsbF9kYXRhLT5yZXRfdGRlc2MpCgl7CgkJVHVwbGVEZXNjCXR1cGRl
c2M7CgoJCUFzc2VydCghY3VycmVudF9jYWxsX2RhdGEtPnR1cGxlX3N0b3JlKTsKCgkJLyoK
CQkgKiBUaGlzIGlzIHRoZSBmaXJzdCBjYWxsIHRvIHJldHVybl9uZXh0IGluIHRoZSBjdXJy
ZW50IFBML1BlcmwKCQkgKiBmdW5jdGlvbiBjYWxsLCBzbyBpZGVudGlmeSB0aGUgb3V0cHV0
IHR1cGxlIHR5cGUgYW5kIGNyZWF0ZSBhCgkJICogdHVwbGVzdG9yZSB0byBob2xkIHRoZSBy
ZXN1bHQgcm93cy4KCQkgKi8KCQlpZiAocHJvZGVzYy0+Zm5fcmV0aXN0dXBsZSkKCQl7CgkJ
CVR5cGVGdW5jQ2xhc3MgZnVuY2NsYXNzOwoJCQlPaWQJCQl0eXBpZDsKCgkJCWZ1bmNjbGFz
cyA9IGdldF9jYWxsX3Jlc3VsdF90eXBlKGZjaW5mbywgJnR5cGlkLCAmdHVwZGVzYyk7CgkJ
CWlmIChmdW5jY2xhc3MgIT0gVFlQRUZVTkNfQ09NUE9TSVRFICYmCgkJCQlmdW5jY2xhc3Mg
IT0gVFlQRUZVTkNfQ09NUE9TSVRFX0RPTUFJTikKCQkJCWVyZXBvcnQoRVJST1IsCgkJCQkJ
CShlcnJjb2RlKEVSUkNPREVfRkVBVFVSRV9OT1RfU1VQUE9SVEVEKSwKCQkJCQkJIGVycm1z
ZygiZnVuY3Rpb24gcmV0dXJuaW5nIHJlY29yZCBjYWxsZWQgaW4gY29udGV4dCAiCgkJCQkJ
CQkJInRoYXQgY2Fubm90IGFjY2VwdCB0eXBlIHJlY29yZCIpKSk7CgkJCS8qIGlmIGRvbWFp
bi1vdmVyLWNvbXBvc2l0ZSwgcmVtZW1iZXIgdGhlIGRvbWFpbidzIHR5cGUgT0lEICovCgkJ
CWlmIChmdW5jY2xhc3MgPT0gVFlQRUZVTkNfQ09NUE9TSVRFX0RPTUFJTikKCQkJCWN1cnJl
bnRfY2FsbF9kYXRhLT5jZG9tYWluX29pZCA9IHR5cGlkOwoJCX0KCQllbHNlCgkJewoJCQl0
dXBkZXNjID0gcnNpLT5leHBlY3RlZERlc2M7CgkJCS8qIFByb3RlY3QgYXNzdW1wdGlvbiBi
ZWxvdyB0aGF0IHdlIHJldHVybiBleGFjdGx5IG9uZSBjb2x1bW4gKi8KCQkJaWYgKHR1cGRl
c2MgPT0gTlVMTCB8fCB0dXBkZXNjLT5uYXR0cyAhPSAxKQoJCQkJZWxvZyhFUlJPUiwgImV4
cGVjdGVkIHNpbmdsZS1jb2x1bW4gcmVzdWx0IGRlc2NyaXB0b3IgZm9yIG5vbi1jb21wb3Np
dGUgU0VUT0YgcmVzdWx0Iik7CgkJfQoKCQkvKgoJCSAqIE1ha2Ugc3VyZSB0aGUgdHVwbGVf
c3RvcmUgYW5kIHJldF90ZGVzYyBhcmUgc3VmZmljaWVudGx5CgkJICogbG9uZy1saXZlZC4K
CQkgKi8KCQlvbGRfY3h0ID0gTWVtb3J5Q29udGV4dFN3aXRjaFRvKHJzaS0+ZWNvbnRleHQt
PmVjeHRfcGVyX3F1ZXJ5X21lbW9yeSk7CgoJCWN1cnJlbnRfY2FsbF9kYXRhLT5yZXRfdGRl
c2MgPSBDcmVhdGVUdXBsZURlc2NDb3B5KHR1cGRlc2MpOwoJCWN1cnJlbnRfY2FsbF9kYXRh
LT50dXBsZV9zdG9yZSA9CgkJCXR1cGxlc3RvcmVfYmVnaW5faGVhcChyc2ktPmFsbG93ZWRN
b2RlcyAmIFNGUk1fTWF0ZXJpYWxpemVfUmFuZG9tLAoJCQkJCQkJCSAgZmFsc2UsIHdvcmtf
bWVtKTsKCgkJTWVtb3J5Q29udGV4dFN3aXRjaFRvKG9sZF9jeHQpOwoJfQoKCS8qCgkgKiBQ
cm9kdWNpbmcgdGhlIHR1cGxlIHdlIHdhbnQgdG8gcmV0dXJuIHJlcXVpcmVzIG1ha2luZyBw
bGVudHkgb2YKCSAqIHBhbGxvYygpIGFsbG9jYXRpb25zIHRoYXQgYXJlIG5vdCBjbGVhbmVk
IHVwLiBTaW5jZSB0aGlzIGZ1bmN0aW9uIGNhbgoJICogYmUgY2FsbGVkIG1hbnkgdGltZXMg
YmVmb3JlIHRoZSBjdXJyZW50IG1lbW9yeSBjb250ZXh0IGlzIHJlc2V0LCB3ZQoJICogbmVl
ZCB0byBkbyB0aG9zZSBhbGxvY2F0aW9ucyBpbiBhIHRlbXBvcmFyeSBjb250ZXh0LgoJICov
CglpZiAoIWN1cnJlbnRfY2FsbF9kYXRhLT50bXBfY3h0KQoJewoJCWN1cnJlbnRfY2FsbF9k
YXRhLT50bXBfY3h0ID0KCQkJQWxsb2NTZXRDb250ZXh0Q3JlYXRlKEN1cnJlbnRNZW1vcnlD
b250ZXh0LAoJCQkJCQkJCSAgIlBML1BlcmwgcmV0dXJuX25leHQgdGVtcG9yYXJ5IGN4dCIs
CgkJCQkJCQkJICBBTExPQ1NFVF9ERUZBVUxUX1NJWkVTKTsKCX0KCglvbGRfY3h0ID0gTWVt
b3J5Q29udGV4dFN3aXRjaFRvKGN1cnJlbnRfY2FsbF9kYXRhLT50bXBfY3h0KTsKCglpZiAo
cHJvZGVzYy0+Zm5fcmV0aXN0dXBsZSkKCXsKCQlIZWFwVHVwbGUJdHVwbGU7CgoJCWlmICgh
KFN2T0soc3YpICYmIFN2Uk9LKHN2KSAmJiBTdlRZUEUoU3ZSVihzdikpID09IFNWdF9QVkhW
KSkKCQkJZXJlcG9ydChFUlJPUiwKCQkJCQkoZXJyY29kZShFUlJDT0RFX0RBVEFUWVBFX01J
U01BVENIKSwKCQkJCQkgZXJybXNnKCJTRVRPRi1jb21wb3NpdGUtcmV0dXJuaW5nIFBML1Bl
cmwgZnVuY3Rpb24gIgoJCQkJCQkJIm11c3QgY2FsbCByZXR1cm5fbmV4dCB3aXRoIHJlZmVy
ZW5jZSB0byBoYXNoIikpKTsKCgkJdHVwbGUgPSBwbHBlcmxfYnVpbGRfdHVwbGVfcmVzdWx0
KChIViAqKSBTdlJWKHN2KSwKCQkJCQkJCQkJCSAgY3VycmVudF9jYWxsX2RhdGEtPnJldF90
ZGVzYyk7CgoJCWlmIChPaWRJc1ZhbGlkKGN1cnJlbnRfY2FsbF9kYXRhLT5jZG9tYWluX29p
ZCkpCgkJCWRvbWFpbl9jaGVjayhIZWFwVHVwbGVHZXREYXR1bSh0dXBsZSksIGZhbHNlLAoJ
CQkJCQkgY3VycmVudF9jYWxsX2RhdGEtPmNkb21haW5fb2lkLAoJCQkJCQkgJmN1cnJlbnRf
Y2FsbF9kYXRhLT5jZG9tYWluX2luZm8sCgkJCQkJCSByc2ktPmVjb250ZXh0LT5lY3h0X3Bl
cl9xdWVyeV9tZW1vcnkpOwoKCQl0dXBsZXN0b3JlX3B1dHR1cGxlKGN1cnJlbnRfY2FsbF9k
YXRhLT50dXBsZV9zdG9yZSwgdHVwbGUpOwoJfQoJZWxzZSBpZiAocHJvZGVzYy0+cmVzdWx0
X29pZCkKCXsKCQlEYXR1bQkJcmV0WzFdOwoJCWJvb2wJCWlzTnVsbFsxXTsKCgkJcmV0WzBd
ID0gcGxwZXJsX3N2X3RvX2RhdHVtKHN2LAoJCQkJCQkJCQlwcm9kZXNjLT5yZXN1bHRfb2lk
LAoJCQkJCQkJCQktMSwKCQkJCQkJCQkJZmNpbmZvLAoJCQkJCQkJCQkmcHJvZGVzYy0+cmVz
dWx0X2luX2Z1bmMsCgkJCQkJCQkJCXByb2Rlc2MtPnJlc3VsdF90eXBpb3BhcmFtLAoJCQkJ
CQkJCQkmaXNOdWxsWzBdKTsKCgkJdHVwbGVzdG9yZV9wdXR2YWx1ZXMoY3VycmVudF9jYWxs
X2RhdGEtPnR1cGxlX3N0b3JlLAoJCQkJCQkJIGN1cnJlbnRfY2FsbF9kYXRhLT5yZXRfdGRl
c2MsCgkJCQkJCQkgcmV0LCBpc051bGwpOwoJfQoKCU1lbW9yeUNvbnRleHRTd2l0Y2hUbyhv
bGRfY3h0KTsKCU1lbW9yeUNvbnRleHRSZXNldChjdXJyZW50X2NhbGxfZGF0YS0+dG1wX2N4
dCk7Cn0KCgpTViAqCnBscGVybF9zcGlfcXVlcnkoY2hhciAqcXVlcnkpCnsKCVNWCQkgICAq
Y3Vyc29yOwoKCS8qCgkgKiBFeGVjdXRlIHRoZSBxdWVyeSBpbnNpZGUgYSBzdWItdHJhbnNh
Y3Rpb24sIHNvIHdlIGNhbiBjb3BlIHdpdGggZXJyb3JzCgkgKiBzYW5lbHkKCSAqLwoJTWVt
b3J5Q29udGV4dCBvbGRjb250ZXh0ID0gQ3VycmVudE1lbW9yeUNvbnRleHQ7CglSZXNvdXJj
ZU93bmVyIG9sZG93bmVyID0gQ3VycmVudFJlc291cmNlT3duZXI7CgoJY2hlY2tfc3BpX3Vz
YWdlX2FsbG93ZWQoKTsKCglCZWdpbkludGVybmFsU3ViVHJhbnNhY3Rpb24oTlVMTCk7Cgkv
KiBXYW50IHRvIHJ1biBpbnNpZGUgZnVuY3Rpb24ncyBtZW1vcnkgY29udGV4dCAqLwoJTWVt
b3J5Q29udGV4dFN3aXRjaFRvKG9sZGNvbnRleHQpOwoKCVBHX1RSWSgpOwoJewoJCVNQSVBs
YW5QdHIJcGxhbjsKCQlQb3J0YWwJCXBvcnRhbDsKCgkJLyogTWFrZSBzdXJlIHRoZSBxdWVy
eSBpcyB2YWxpZGx5IGVuY29kZWQgKi8KCQlwZ192ZXJpZnltYnN0cihxdWVyeSwgc3RybGVu
KHF1ZXJ5KSwgZmFsc2UpOwoKCQkvKiBDcmVhdGUgYSBjdXJzb3IgZm9yIHRoZSBxdWVyeSAq
LwoJCXBsYW4gPSBTUElfcHJlcGFyZShxdWVyeSwgMCwgTlVMTCk7CgkJaWYgKHBsYW4gPT0g
TlVMTCkKCQkJZWxvZyhFUlJPUiwgIlNQSV9wcmVwYXJlKCkgZmFpbGVkOiVzIiwKCQkJCSBT
UElfcmVzdWx0X2NvZGVfc3RyaW5nKFNQSV9yZXN1bHQpKTsKCgkJcG9ydGFsID0gU1BJX2N1
cnNvcl9vcGVuKE5VTEwsIHBsYW4sIE5VTEwsIE5VTEwsIGZhbHNlKTsKCQlTUElfZnJlZXBs
YW4ocGxhbik7CgkJaWYgKHBvcnRhbCA9PSBOVUxMKQoJCQllbG9nKEVSUk9SLCAiU1BJX2N1
cnNvcl9vcGVuKCkgZmFpbGVkOiVzIiwKCQkJCSBTUElfcmVzdWx0X2NvZGVfc3RyaW5nKFNQ
SV9yZXN1bHQpKTsKCQljdXJzb3IgPSBjc3RyMnN2KHBvcnRhbC0+bmFtZSk7CgoJCVBpblBv
cnRhbChwb3J0YWwpOwoKCQkvKiBDb21taXQgdGhlIGlubmVyIHRyYW5zYWN0aW9uLCByZXR1
cm4gdG8gb3V0ZXIgeGFjdCBjb250ZXh0ICovCgkJUmVsZWFzZUN1cnJlbnRTdWJUcmFuc2Fj
dGlvbigpOwoJCU1lbW9yeUNvbnRleHRTd2l0Y2hUbyhvbGRjb250ZXh0KTsKCQlDdXJyZW50
UmVzb3VyY2VPd25lciA9IG9sZG93bmVyOwoJfQoJUEdfQ0FUQ0goKTsKCXsKCQlFcnJvckRh
dGEgICplZGF0YTsKCgkJLyogU2F2ZSBlcnJvciBpbmZvICovCgkJTWVtb3J5Q29udGV4dFN3
aXRjaFRvKG9sZGNvbnRleHQpOwoJCWVkYXRhID0gQ29weUVycm9yRGF0YSgpOwoJCUZsdXNo
RXJyb3JTdGF0ZSgpOwoKCQkvKiBBYm9ydCB0aGUgaW5uZXIgdHJhbnNhY3Rpb24gKi8KCQlS
b2xsYmFja0FuZFJlbGVhc2VDdXJyZW50U3ViVHJhbnNhY3Rpb24oKTsKCQlNZW1vcnlDb250
ZXh0U3dpdGNoVG8ob2xkY29udGV4dCk7CgkJQ3VycmVudFJlc291cmNlT3duZXIgPSBvbGRv
d25lcjsKCgkJLyogUHVudCBUaGUgZXJyb3IgdG8gUGVybCAqLwoJCQkJaWYgKGVkYXRhLT5k
ZXRhaWwpIHsKCQkJY3JvYWsoIiVzXG5ERVRBSUw6ICAlcyIsIGVkYXRhLT5tZXNzYWdlLCBl
ZGF0YS0+ZGV0YWlsKTsKCQl9CgkJCQllbHNlIHsKCQkJY3JvYWsoIiVzIiwgZWRhdGEtPm1l
c3NhZ2UpOwoJCX0KCgkJLyogQ2FuJ3QgZ2V0IGhlcmUsIGJ1dCBrZWVwIGNvbXBpbGVyIHF1
aWV0ICovCgkJcmV0dXJuIE5VTEw7Cgl9CglQR19FTkRfVFJZKCk7CgoJcmV0dXJuIGN1cnNv
cjsKfQoKClNWICoKcGxwZXJsX3NwaV9mZXRjaHJvdyhjaGFyICpjdXJzb3IpCnsKCVNWCQkg
ICAqcm93OwoKCS8qCgkgKiBFeGVjdXRlIHRoZSBGRVRDSCBpbnNpZGUgYSBzdWItdHJhbnNh
Y3Rpb24sIHNvIHdlIGNhbiBjb3BlIHdpdGggZXJyb3JzCgkgKiBzYW5lbHkKCSAqLwoJTWVt
b3J5Q29udGV4dCBvbGRjb250ZXh0ID0gQ3VycmVudE1lbW9yeUNvbnRleHQ7CglSZXNvdXJj
ZU93bmVyIG9sZG93bmVyID0gQ3VycmVudFJlc291cmNlT3duZXI7CgoJY2hlY2tfc3BpX3Vz
YWdlX2FsbG93ZWQoKTsKCglCZWdpbkludGVybmFsU3ViVHJhbnNhY3Rpb24oTlVMTCk7Cgkv
KiBXYW50IHRvIHJ1biBpbnNpZGUgZnVuY3Rpb24ncyBtZW1vcnkgY29udGV4dCAqLwoJTWVt
b3J5Q29udGV4dFN3aXRjaFRvKG9sZGNvbnRleHQpOwoKCVBHX1RSWSgpOwoJewoJCWRUSFg7
CgkJUG9ydGFsCQlwID0gU1BJX2N1cnNvcl9maW5kKGN1cnNvcik7CgoJCWlmICghcCkKCQl7
CgkJCXJvdyA9ICZQTF9zdl91bmRlZjsKCQl9CgkJZWxzZQoJCXsKCQkJU1BJX2N1cnNvcl9m
ZXRjaChwLCB0cnVlLCAxKTsKCQkJaWYgKFNQSV9wcm9jZXNzZWQgPT0gMCkKCQkJewoJCQkJ
VW5waW5Qb3J0YWwocCk7CgkJCQlTUElfY3Vyc29yX2Nsb3NlKHApOwoJCQkJcm93ID0gJlBM
X3N2X3VuZGVmOwoJCQl9CgkJCWVsc2UKCQkJewoJCQkJcm93ID0gcGxwZXJsX2hhc2hfZnJv
bV90dXBsZShTUElfdHVwdGFibGUtPnZhbHNbMF0sCgkJCQkJCQkJCQkJIFNQSV90dXB0YWJs
ZS0+dHVwZGVzYywKCQkJCQkJCQkJCQkgdHJ1ZSk7CgkJCX0KCQkJU1BJX2ZyZWV0dXB0YWJs
ZShTUElfdHVwdGFibGUpOwoJCX0KCgkJLyogQ29tbWl0IHRoZSBpbm5lciB0cmFuc2FjdGlv
biwgcmV0dXJuIHRvIG91dGVyIHhhY3QgY29udGV4dCAqLwoJCVJlbGVhc2VDdXJyZW50U3Vi
VHJhbnNhY3Rpb24oKTsKCQlNZW1vcnlDb250ZXh0U3dpdGNoVG8ob2xkY29udGV4dCk7CgkJ
Q3VycmVudFJlc291cmNlT3duZXIgPSBvbGRvd25lcjsKCX0KCVBHX0NBVENIKCk7Cgl7CgkJ
RXJyb3JEYXRhICAqZWRhdGE7CgoJCS8qIFNhdmUgZXJyb3IgaW5mbyAqLwoJCU1lbW9yeUNv
bnRleHRTd2l0Y2hUbyhvbGRjb250ZXh0KTsKCQllZGF0YSA9IENvcHlFcnJvckRhdGEoKTsK
CQlGbHVzaEVycm9yU3RhdGUoKTsKCgkJLyogQWJvcnQgdGhlIGlubmVyIHRyYW5zYWN0aW9u
ICovCgkJUm9sbGJhY2tBbmRSZWxlYXNlQ3VycmVudFN1YlRyYW5zYWN0aW9uKCk7CgkJTWVt
b3J5Q29udGV4dFN3aXRjaFRvKG9sZGNvbnRleHQpOwoJCUN1cnJlbnRSZXNvdXJjZU93bmVy
ID0gb2xkb3duZXI7CgoJCS8qIFB1bnQgVGhlIGVycm9yIHRvIFBlcmwgKi8KCQkJCWlmIChl
ZGF0YS0+ZGV0YWlsKSB7CgkJCWNyb2FrKCIlc1xuREVUQUlMOiAgJXMiLCBlZGF0YS0+bWVz
c2FnZSwgZWRhdGEtPmRldGFpbCk7CgkJfQoJCQkJZWxzZSB7CgkJCWNyb2FrKCIlcyIsIGVk
YXRhLT5tZXNzYWdlKTsKCQl9CgoJCS8qIENhbid0IGdldCBoZXJlLCBidXQga2VlcCBjb21w
aWxlciBxdWlldCAqLwoJCXJldHVybiBOVUxMOwoJfQoJUEdfRU5EX1RSWSgpOwoKCXJldHVy
biByb3c7Cn0KCnZvaWQKcGxwZXJsX3NwaV9jdXJzb3JfY2xvc2UoY2hhciAqY3Vyc29yKQp7
CglQb3J0YWwJCXA7CgoJY2hlY2tfc3BpX3VzYWdlX2FsbG93ZWQoKTsKCglwID0gU1BJX2N1
cnNvcl9maW5kKGN1cnNvcik7CgoJaWYgKHApCgl7CgkJVW5waW5Qb3J0YWwocCk7CgkJU1BJ
X2N1cnNvcl9jbG9zZShwKTsKCX0KfQoKU1YgKgpwbHBlcmxfc3BpX3ByZXBhcmUoY2hhciAq
cXVlcnksIGludCBhcmdjLCBTViAqKmFyZ3YpCnsKCXZvbGF0aWxlIFNQSVBsYW5QdHIgcGxh
biA9IE5VTEw7Cgl2b2xhdGlsZSBNZW1vcnlDb250ZXh0IHBsYW5fY3h0ID0gTlVMTDsKCXBs
cGVybF9xdWVyeV9kZXNjICp2b2xhdGlsZSBxZGVzYyA9IE5VTEw7CglwbHBlcmxfcXVlcnlf
ZW50cnkgKnZvbGF0aWxlIGhhc2hfZW50cnkgPSBOVUxMOwoJTWVtb3J5Q29udGV4dCBvbGRj
b250ZXh0ID0gQ3VycmVudE1lbW9yeUNvbnRleHQ7CglSZXNvdXJjZU93bmVyIG9sZG93bmVy
ID0gQ3VycmVudFJlc291cmNlT3duZXI7CglNZW1vcnlDb250ZXh0IHdvcmtfY3h0OwoJYm9v
bAkJZm91bmQ7CglpbnQJCQlpOwoKCWNoZWNrX3NwaV91c2FnZV9hbGxvd2VkKCk7CgoJQmVn
aW5JbnRlcm5hbFN1YlRyYW5zYWN0aW9uKE5VTEwpOwoJTWVtb3J5Q29udGV4dFN3aXRjaFRv
KG9sZGNvbnRleHQpOwoKCVBHX1RSWSgpOwoJewoJCUNIRUNLX0ZPUl9JTlRFUlJVUFRTKCk7
CgoJCS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioq
KioqKioqKioqKioKCQkgKiBBbGxvY2F0ZSB0aGUgbmV3IHF1ZXJ5ZGVzYyBzdHJ1Y3R1cmUK
CQkgKgoJCSAqIFRoZSBxZGVzYyBzdHJ1Y3QsIGFzIHdlbGwgYXMgYWxsIGl0cyBzdWJzaWRp
YXJ5IGRhdGEsIGxpdmVzIGluIGl0cwoJCSAqIHBsYW5fY3h0LiAgQnV0IG5vdGUgdGhhdCB0
aGUgU1BJUGxhbiBkb2VzIG5vdC4KCQkgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioq
KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwoJCXBsYW5fY3h0ID0gQWxsb2NTZXRD
b250ZXh0Q3JlYXRlKFRvcE1lbW9yeUNvbnRleHQsCgkJCQkJCQkJCQkgIlBML1Blcmwgc3Bp
X3ByZXBhcmUgcXVlcnkiLAoJCQkJCQkJCQkJIEFMTE9DU0VUX1NNQUxMX1NJWkVTKTsKCQlN
ZW1vcnlDb250ZXh0U3dpdGNoVG8ocGxhbl9jeHQpOwoJCXFkZXNjID0gKHBscGVybF9xdWVy
eV9kZXNjICopIHBhbGxvYzAoc2l6ZW9mKHBscGVybF9xdWVyeV9kZXNjKSk7CgkJc25wcmlu
dGYocWRlc2MtPnFuYW1lLCBzaXplb2YocWRlc2MtPnFuYW1lKSwgIiVwIiwgcWRlc2MpOwoJ
CXFkZXNjLT5wbGFuX2N4dCA9IHBsYW5fY3h0OwoJCXFkZXNjLT5uYXJncyA9IGFyZ2M7CgkJ
cWRlc2MtPmFyZ3R5cGVzID0gKE9pZCAqKSBwYWxsb2MoYXJnYyAqIHNpemVvZihPaWQpKTsK
CQlxZGVzYy0+YXJnaW5mdW5jcyA9IChGbWdySW5mbyAqKSBwYWxsb2MoYXJnYyAqIHNpemVv
ZihGbWdySW5mbykpOwoJCXFkZXNjLT5hcmd0eXBpb3BhcmFtcyA9IChPaWQgKikgcGFsbG9j
KGFyZ2MgKiBzaXplb2YoT2lkKSk7CgkJTWVtb3J5Q29udGV4dFN3aXRjaFRvKG9sZGNvbnRl
eHQpOwoKCQkvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioq
KioqKioqKioqKioqKioqCgkJICogRG8gdGhlIGZvbGxvd2luZyB3b3JrIGluIGEgc2hvcnQt
bGl2ZWQgY29udGV4dCBzbyB0aGF0IHdlIGRvbid0CgkJICogbGVhayBhIGxvdCBvZiBtZW1v
cnkgaW4gdGhlIFBML1BlcmwgZnVuY3Rpb24ncyBTUEkgUHJvYyBjb250ZXh0LgoJCSAqKioq
KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioq
KiovCgkJd29ya19jeHQgPSBBbGxvY1NldENvbnRleHRDcmVhdGUoQ3VycmVudE1lbW9yeUNv
bnRleHQsCgkJCQkJCQkJCQkgIlBML1Blcmwgc3BpX3ByZXBhcmUgd29ya3NwYWNlIiwKCQkJ
CQkJCQkJCSBBTExPQ1NFVF9ERUZBVUxUX1NJWkVTKTsKCQlNZW1vcnlDb250ZXh0U3dpdGNo
VG8od29ya19jeHQpOwoKCQkvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioq
KioqKioqKioqKioqKioqKioqKioqKioqCgkJICogUmVzb2x2ZSBhcmd1bWVudCB0eXBlIG5h
bWVzIGFuZCB0aGVuIGxvb2sgdGhlbSB1cCBieSBvaWQKCQkgKiBpbiB0aGUgc3lzdGVtIGNh
Y2hlLCBhbmQgcmVtZW1iZXIgdGhlIHJlcXVpcmVkIGluZm9ybWF0aW9uCgkJICogZm9yIGlu
cHV0IGNvbnZlcnNpb24uCgkJICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioq
KioqKioqKioqKioqKioqKioqKioqKioqKi8KCQlmb3IgKGkgPSAwOyBpIDwgYXJnYzsgaSsr
KQoJCXsKCQkJT2lkCQkJdHlwSWQsCgkJCQkJCXR5cElucHV0LAoJCQkJCQl0eXBJT1BhcmFt
OwoJCQlpbnQzMgkJdHlwbW9kOwoJCQljaGFyCSAgICp0eXBzdHI7CgoJCQl0eXBzdHIgPSBz
djJjc3RyKGFyZ3ZbaV0pOwoJCQlwYXJzZVR5cGVTdHJpbmcodHlwc3RyLCAmdHlwSWQsICZ0
eXBtb2QsIGZhbHNlKTsKCQkJcGZyZWUodHlwc3RyKTsKCgkJCWdldFR5cGVJbnB1dEluZm8o
dHlwSWQsICZ0eXBJbnB1dCwgJnR5cElPUGFyYW0pOwoKCQkJcWRlc2MtPmFyZ3R5cGVzW2ld
ID0gdHlwSWQ7CgkJCWZtZ3JfaW5mb19jeHQodHlwSW5wdXQsICYocWRlc2MtPmFyZ2luZnVu
Y3NbaV0pLCBwbGFuX2N4dCk7CgkJCXFkZXNjLT5hcmd0eXBpb3BhcmFtc1tpXSA9IHR5cElP
UGFyYW07CgkJfQoKCQkvKiBNYWtlIHN1cmUgdGhlIHF1ZXJ5IGlzIHZhbGlkbHkgZW5jb2Rl
ZCAqLwoJCXBnX3ZlcmlmeW1ic3RyKHF1ZXJ5LCBzdHJsZW4ocXVlcnkpLCBmYWxzZSk7CgoJ
CS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioq
KioqKioqKioKCQkgKiBQcmVwYXJlIHRoZSBwbGFuIGFuZCBjaGVjayBmb3IgZXJyb3JzCgkJ
ICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioq
KioqKioqKi8KCQlwbGFuID0gU1BJX3ByZXBhcmUocXVlcnksIGFyZ2MsIHFkZXNjLT5hcmd0
eXBlcyk7CgoJCWlmIChwbGFuID09IE5VTEwpCgkJCWVsb2coRVJST1IsICJTUElfcHJlcGFy
ZSgpIGZhaWxlZDolcyIsCgkJCQkgU1BJX3Jlc3VsdF9jb2RlX3N0cmluZyhTUElfcmVzdWx0
KSk7CgoJCS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioq
KioqKioqKioqKioqKioKCQkgKiBTYXZlIHRoZSBwbGFuIGludG8gcGVybWFuZW50IG1lbW9y
eSAocmlnaHQgbm93IGl0J3MgaW4gdGhlCgkJICogU1BJIHByb2NDeHQsIHdoaWNoIHdpbGwg
Z28gYXdheSBhdCBmdW5jdGlvbiBlbmQpLgoJCSAqKioqKioqKioqKioqKioqKioqKioqKioq
KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCgkJaWYgKFNQSV9rZWVwcGxh
bihwbGFuKSkKCQkJZWxvZyhFUlJPUiwgIlNQSV9rZWVwcGxhbigpIGZhaWxlZCIpOwoJCXFk
ZXNjLT5wbGFuID0gcGxhbjsKCgkJLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioq
KioqKioqKioqKioqKioqKioqKioqKioqKioqKgoJCSAqIEluc2VydCBhIGhhc2h0YWJsZSBl
bnRyeSBmb3IgdGhlIHBsYW4uCgkJICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioq
KioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KCQloYXNoX2VudHJ5ID0gaGFzaF9zZWFy
Y2gocGxwZXJsX2FjdGl2ZV9pbnRlcnAtPnF1ZXJ5X2hhc2gsCgkJCQkJCQkJIHFkZXNjLT5x
bmFtZSwKCQkJCQkJCQkgSEFTSF9FTlRFUiwgJmZvdW5kKTsKCQloYXNoX2VudHJ5LT5xdWVy
eV9kYXRhID0gcWRlc2M7CgoJCS8qIEdldCByaWQgb2Ygd29ya3NwYWNlICovCgkJTWVtb3J5
Q29udGV4dERlbGV0ZSh3b3JrX2N4dCk7CgoJCS8qIENvbW1pdCB0aGUgaW5uZXIgdHJhbnNh
Y3Rpb24sIHJldHVybiB0byBvdXRlciB4YWN0IGNvbnRleHQgKi8KCQlSZWxlYXNlQ3VycmVu
dFN1YlRyYW5zYWN0aW9uKCk7CgkJTWVtb3J5Q29udGV4dFN3aXRjaFRvKG9sZGNvbnRleHQp
OwoJCUN1cnJlbnRSZXNvdXJjZU93bmVyID0gb2xkb3duZXI7Cgl9CglQR19DQVRDSCgpOwoJ
ewoJCUVycm9yRGF0YSAgKmVkYXRhOwoKCQkvKiBTYXZlIGVycm9yIGluZm8gKi8KCQlNZW1v
cnlDb250ZXh0U3dpdGNoVG8ob2xkY29udGV4dCk7CgkJZWRhdGEgPSBDb3B5RXJyb3JEYXRh
KCk7CgkJRmx1c2hFcnJvclN0YXRlKCk7CgoJCS8qIERyb3AgYW55dGhpbmcgd2UgbWFuYWdl
ZCB0byBhbGxvY2F0ZSAqLwoJCWlmIChoYXNoX2VudHJ5KQoJCQloYXNoX3NlYXJjaChwbHBl
cmxfYWN0aXZlX2ludGVycC0+cXVlcnlfaGFzaCwKCQkJCQkJcWRlc2MtPnFuYW1lLAoJCQkJ
CQlIQVNIX1JFTU9WRSwgTlVMTCk7CgkJaWYgKHBsYW5fY3h0KQoJCQlNZW1vcnlDb250ZXh0
RGVsZXRlKHBsYW5fY3h0KTsKCQlpZiAocGxhbikKCQkJU1BJX2ZyZWVwbGFuKHBsYW4pOwoK
CQkvKiBBYm9ydCB0aGUgaW5uZXIgdHJhbnNhY3Rpb24gKi8KCQlSb2xsYmFja0FuZFJlbGVh
c2VDdXJyZW50U3ViVHJhbnNhY3Rpb24oKTsKCQlNZW1vcnlDb250ZXh0U3dpdGNoVG8ob2xk
Y29udGV4dCk7CgkJQ3VycmVudFJlc291cmNlT3duZXIgPSBvbGRvd25lcjsKCgkJLyogUHVu
dCBUaGUgZXJyb3IgdG8gUGVybCAqLwoJCQkJaWYgKGVkYXRhLT5kZXRhaWwpIHsKCQkJY3Jv
YWsoIiVzXG5ERVRBSUw6ICAlcyIsIGVkYXRhLT5tZXNzYWdlLCBlZGF0YS0+ZGV0YWlsKTsK
CQl9CgkJCQllbHNlIHsKCQkJY3JvYWsoIiVzIiwgZWRhdGEtPm1lc3NhZ2UpOwoJCX0KCgkJ
LyogQ2FuJ3QgZ2V0IGhlcmUsIGJ1dCBrZWVwIGNvbXBpbGVyIHF1aWV0ICovCgkJcmV0dXJu
IE5VTEw7Cgl9CglQR19FTkRfVFJZKCk7CgoJLyoqKioqKioqKioqKioqKioqKioqKioqKioq
KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgoJICogUmV0dXJuIHRoZSBxdWVy
eSdzIGhhc2gga2V5IHRvIHRoZSBjYWxsZXIuCgkgKioqKioqKioqKioqKioqKioqKioqKioq
KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwoJcmV0dXJuIGNzdHIyc3Yo
cWRlc2MtPnFuYW1lKTsKfQoKSFYgKgpwbHBlcmxfc3BpX2V4ZWNfcHJlcGFyZWQoY2hhciAq
cXVlcnksIEhWICphdHRyLCBpbnQgYXJnYywgU1YgKiphcmd2KQp7CglIVgkJICAgKnJldF9o
djsKCVNWCQkgICoqc3Y7CglpbnQJCQlpLAoJCQkJbGltaXQsCgkJCQlzcGlfcnY7CgljaGFy
CSAgICpudWxsczsKCURhdHVtCSAgICphcmd2YWx1ZXM7CglwbHBlcmxfcXVlcnlfZGVzYyAq
cWRlc2M7CglwbHBlcmxfcXVlcnlfZW50cnkgKmhhc2hfZW50cnk7CgoJLyoKCSAqIEV4ZWN1
dGUgdGhlIHF1ZXJ5IGluc2lkZSBhIHN1Yi10cmFuc2FjdGlvbiwgc28gd2UgY2FuIGNvcGUg
d2l0aCBlcnJvcnMKCSAqIHNhbmVseQoJICovCglNZW1vcnlDb250ZXh0IG9sZGNvbnRleHQg
PSBDdXJyZW50TWVtb3J5Q29udGV4dDsKCVJlc291cmNlT3duZXIgb2xkb3duZXIgPSBDdXJy
ZW50UmVzb3VyY2VPd25lcjsKCgljaGVja19zcGlfdXNhZ2VfYWxsb3dlZCgpOwoKCUJlZ2lu
SW50ZXJuYWxTdWJUcmFuc2FjdGlvbihOVUxMKTsKCS8qIFdhbnQgdG8gcnVuIGluc2lkZSBm
dW5jdGlvbidzIG1lbW9yeSBjb250ZXh0ICovCglNZW1vcnlDb250ZXh0U3dpdGNoVG8ob2xk
Y29udGV4dCk7CgoJUEdfVFJZKCk7Cgl7CgkJZFRIWDsKCgkJLyoqKioqKioqKioqKioqKioq
KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgoJCSAqIEZldGNo
IHRoZSBzYXZlZCBwbGFuIGRlc2NyaXB0b3IsIHNlZSBpZiBpdCdzIG8uay4KCQkgKioqKioq
KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioq
LwoJCWhhc2hfZW50cnkgPSBoYXNoX3NlYXJjaChwbHBlcmxfYWN0aXZlX2ludGVycC0+cXVl
cnlfaGFzaCwgcXVlcnksCgkJCQkJCQkJIEhBU0hfRklORCwgTlVMTCk7CgkJaWYgKGhhc2hf
ZW50cnkgPT0gTlVMTCkKCQkJZWxvZyhFUlJPUiwgInNwaV9leGVjX3ByZXBhcmVkOiBJbnZh
bGlkIHByZXBhcmVkIHF1ZXJ5IHBhc3NlZCIpOwoKCQlxZGVzYyA9IGhhc2hfZW50cnktPnF1
ZXJ5X2RhdGE7CgkJaWYgKHFkZXNjID09IE5VTEwpCgkJCWVsb2coRVJST1IsICJzcGlfZXhl
Y19wcmVwYXJlZDogcGxwZXJsIHF1ZXJ5X2hhc2ggdmFsdWUgdmFuaXNoZWQiKTsKCgkJaWYg
KHFkZXNjLT5uYXJncyAhPSBhcmdjKQoJCQllbG9nKEVSUk9SLCAic3BpX2V4ZWNfcHJlcGFy
ZWQ6IGV4cGVjdGVkICVkIGFyZ3VtZW50KHMpLCAlZCBwYXNzZWQiLAoJCQkJIHFkZXNjLT5u
YXJncywgYXJnYyk7CgoJCS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioq
KioqKioqKioqKioqKioqKioqKioqKioKCQkgKiBQYXJzZSBldmVudHVhbCBhdHRyaWJ1dGVz
CgkJICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioq
KioqKioqKioqKi8KCQlsaW1pdCA9IDA7CgkJaWYgKGF0dHIgIT0gTlVMTCkKCQl7CgkJCXN2
ID0gaHZfZmV0Y2hfc3RyaW5nKGF0dHIsICJsaW1pdCIpOwoJCQlpZiAoc3YgJiYgKnN2ICYm
IFN2SU9LKCpzdikpCgkJCQlsaW1pdCA9IFN2SVYoKnN2KTsKCQl9CgkJLyoqKioqKioqKioq
KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgoJCSAq
IFNldCB1cCBhcmd1bWVudHMKCQkgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioq
KioqKioqKioqKioqKioqKioqKioqKioqKioqLwoJCWlmIChhcmdjID4gMCkKCQl7CgkJCW51
bGxzID0gKGNoYXIgKikgcGFsbG9jKGFyZ2MpOwoJCQlhcmd2YWx1ZXMgPSAoRGF0dW0gKikg
cGFsbG9jKGFyZ2MgKiBzaXplb2YoRGF0dW0pKTsKCQl9CgkJZWxzZQoJCXsKCQkJbnVsbHMg
PSBOVUxMOwoJCQlhcmd2YWx1ZXMgPSBOVUxMOwoJCX0KCgkJZm9yIChpID0gMDsgaSA8IGFy
Z2M7IGkrKykKCQl7CgkJCWJvb2wJCWlzbnVsbDsKCgkJCWFyZ3ZhbHVlc1tpXSA9IHBscGVy
bF9zdl90b19kYXR1bShhcmd2W2ldLAoJCQkJCQkJCQkJCSAgcWRlc2MtPmFyZ3R5cGVzW2ld
LAoJCQkJCQkJCQkJCSAgLTEsCgkJCQkJCQkJCQkJICBOVUxMLAoJCQkJCQkJCQkJCSAgJnFk
ZXNjLT5hcmdpbmZ1bmNzW2ldLAoJCQkJCQkJCQkJCSAgcWRlc2MtPmFyZ3R5cGlvcGFyYW1z
W2ldLAoJCQkJCQkJCQkJCSAgJmlzbnVsbCk7CgkJCW51bGxzW2ldID0gaXNudWxsID8gJ24n
IDogJyAnOwoJCX0KCgkJLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioq
KioqKioqKioqKioqKioqKioqKioqKgoJCSAqIGdvCgkJICoqKioqKioqKioqKioqKioqKioq
KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KCQlzcGlfcnYgPSBT
UElfZXhlY3V0ZV9wbGFuKHFkZXNjLT5wbGFuLCBhcmd2YWx1ZXMsIG51bGxzLAoJCQkJCQkJ
CSAgY3VycmVudF9jYWxsX2RhdGEtPnByb2Rlc2MtPmZuX3JlYWRvbmx5LCBsaW1pdCk7CgkJ
cmV0X2h2ID0gcGxwZXJsX3NwaV9leGVjdXRlX2ZldGNoX3Jlc3VsdChTUElfdHVwdGFibGUs
IFNQSV9wcm9jZXNzZWQsCgkJCQkJCQkJCQkJCSBzcGlfcnYpOwoJCWlmIChhcmdjID4gMCkK
CQl7CgkJCXBmcmVlKGFyZ3ZhbHVlcyk7CgkJCXBmcmVlKG51bGxzKTsKCQl9CgoJCS8qIENv
bW1pdCB0aGUgaW5uZXIgdHJhbnNhY3Rpb24sIHJldHVybiB0byBvdXRlciB4YWN0IGNvbnRl
eHQgKi8KCQlSZWxlYXNlQ3VycmVudFN1YlRyYW5zYWN0aW9uKCk7CgkJTWVtb3J5Q29udGV4
dFN3aXRjaFRvKG9sZGNvbnRleHQpOwoJCUN1cnJlbnRSZXNvdXJjZU93bmVyID0gb2xkb3du
ZXI7Cgl9CglQR19DQVRDSCgpOwoJewoJCUVycm9yRGF0YSAgKmVkYXRhOwoKCQkvKiBTYXZl
IGVycm9yIGluZm8gKi8KCQlNZW1vcnlDb250ZXh0U3dpdGNoVG8ob2xkY29udGV4dCk7CgkJ
ZWRhdGEgPSBDb3B5RXJyb3JEYXRhKCk7CgkJRmx1c2hFcnJvclN0YXRlKCk7CgoJCS8qIEFi
b3J0IHRoZSBpbm5lciB0cmFuc2FjdGlvbiAqLwoJCVJvbGxiYWNrQW5kUmVsZWFzZUN1cnJl
bnRTdWJUcmFuc2FjdGlvbigpOwoJCU1lbW9yeUNvbnRleHRTd2l0Y2hUbyhvbGRjb250ZXh0
KTsKCQlDdXJyZW50UmVzb3VyY2VPd25lciA9IG9sZG93bmVyOwoKCQkvKiBQdW50IFRoZSBl
cnJvciB0byBQZXJsICovCgkJCQlpZiAoZWRhdGEtPmRldGFpbCkgewoJCQljcm9haygiJXNc
bkRFVEFJTDogICVzIiwgZWRhdGEtPm1lc3NhZ2UsIGVkYXRhLT5kZXRhaWwpOwoJCX0KCQkJ
CWVsc2UgewoJCQljcm9haygiJXMiLCBlZGF0YS0+bWVzc2FnZSk7CgkJfQoKCQkvKiBDYW4n
dCBnZXQgaGVyZSwgYnV0IGtlZXAgY29tcGlsZXIgcXVpZXQgKi8KCQlyZXR1cm4gTlVMTDsK
CX0KCVBHX0VORF9UUlkoKTsKCglyZXR1cm4gcmV0X2h2Owp9CgpTViAqCnBscGVybF9zcGlf
cXVlcnlfcHJlcGFyZWQoY2hhciAqcXVlcnksIGludCBhcmdjLCBTViAqKmFyZ3YpCnsKCWlu
dAkJCWk7CgljaGFyCSAgICpudWxsczsKCURhdHVtCSAgICphcmd2YWx1ZXM7CglwbHBlcmxf
cXVlcnlfZGVzYyAqcWRlc2M7CglwbHBlcmxfcXVlcnlfZW50cnkgKmhhc2hfZW50cnk7CglT
VgkJICAgKmN1cnNvcjsKCVBvcnRhbAkJcG9ydGFsID0gTlVMTDsKCgkvKgoJICogRXhlY3V0
ZSB0aGUgcXVlcnkgaW5zaWRlIGEgc3ViLXRyYW5zYWN0aW9uLCBzbyB3ZSBjYW4gY29wZSB3
aXRoIGVycm9ycwoJICogc2FuZWx5CgkgKi8KCU1lbW9yeUNvbnRleHQgb2xkY29udGV4dCA9
IEN1cnJlbnRNZW1vcnlDb250ZXh0OwoJUmVzb3VyY2VPd25lciBvbGRvd25lciA9IEN1cnJl
bnRSZXNvdXJjZU93bmVyOwoKCWNoZWNrX3NwaV91c2FnZV9hbGxvd2VkKCk7CgoJQmVnaW5J
bnRlcm5hbFN1YlRyYW5zYWN0aW9uKE5VTEwpOwoJLyogV2FudCB0byBydW4gaW5zaWRlIGZ1
bmN0aW9uJ3MgbWVtb3J5IGNvbnRleHQgKi8KCU1lbW9yeUNvbnRleHRTd2l0Y2hUbyhvbGRj
b250ZXh0KTsKCglQR19UUlkoKTsKCXsKCQkvKioqKioqKioqKioqKioqKioqKioqKioqKioq
KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCgkJICogRmV0Y2ggdGhlIHNhdmVk
IHBsYW4gZGVzY3JpcHRvciwgc2VlIGlmIGl0J3Mgby5rLgoJCSAqKioqKioqKioqKioqKioq
KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCgkJaGFzaF9l
bnRyeSA9IGhhc2hfc2VhcmNoKHBscGVybF9hY3RpdmVfaW50ZXJwLT5xdWVyeV9oYXNoLCBx
dWVyeSwKCQkJCQkJCQkgSEFTSF9GSU5ELCBOVUxMKTsKCQlpZiAoaGFzaF9lbnRyeSA9PSBO
VUxMKQoJCQllbG9nKEVSUk9SLCAic3BpX3F1ZXJ5X3ByZXBhcmVkOiBJbnZhbGlkIHByZXBh
cmVkIHF1ZXJ5IHBhc3NlZCIpOwoKCQlxZGVzYyA9IGhhc2hfZW50cnktPnF1ZXJ5X2RhdGE7
CgkJaWYgKHFkZXNjID09IE5VTEwpCgkJCWVsb2coRVJST1IsICJzcGlfcXVlcnlfcHJlcGFy
ZWQ6IHBscGVybCBxdWVyeV9oYXNoIHZhbHVlIHZhbmlzaGVkIik7CgoJCWlmIChxZGVzYy0+
bmFyZ3MgIT0gYXJnYykKCQkJZWxvZyhFUlJPUiwgInNwaV9xdWVyeV9wcmVwYXJlZDogZXhw
ZWN0ZWQgJWQgYXJndW1lbnQocyksICVkIHBhc3NlZCIsCgkJCQkgcWRlc2MtPm5hcmdzLCBh
cmdjKTsKCgkJLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioq
KioqKioqKioqKioqKioqKgoJCSAqIFNldCB1cCBhcmd1bWVudHMKCQkgKioqKioqKioqKioq
KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwoJCWlm
IChhcmdjID4gMCkKCQl7CgkJCW51bGxzID0gKGNoYXIgKikgcGFsbG9jKGFyZ2MpOwoJCQlh
cmd2YWx1ZXMgPSAoRGF0dW0gKikgcGFsbG9jKGFyZ2MgKiBzaXplb2YoRGF0dW0pKTsKCQl9
CgkJZWxzZQoJCXsKCQkJbnVsbHMgPSBOVUxMOwoJCQlhcmd2YWx1ZXMgPSBOVUxMOwoJCX0K
CgkJZm9yIChpID0gMDsgaSA8IGFyZ2M7IGkrKykKCQl7CgkJCWJvb2wJCWlzbnVsbDsKCgkJ
CWFyZ3ZhbHVlc1tpXSA9IHBscGVybF9zdl90b19kYXR1bShhcmd2W2ldLAoJCQkJCQkJCQkJ
CSAgcWRlc2MtPmFyZ3R5cGVzW2ldLAoJCQkJCQkJCQkJCSAgLTEsCgkJCQkJCQkJCQkJICBO
VUxMLAoJCQkJCQkJCQkJCSAgJnFkZXNjLT5hcmdpbmZ1bmNzW2ldLAoJCQkJCQkJCQkJCSAg
cWRlc2MtPmFyZ3R5cGlvcGFyYW1zW2ldLAoJCQkJCQkJCQkJCSAgJmlzbnVsbCk7CgkJCW51
bGxzW2ldID0gaXNudWxsID8gJ24nIDogJyAnOwoJCX0KCgkJLyoqKioqKioqKioqKioqKioq
KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgoJCSAqIGdvCgkJ
ICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioq
KioqKioqKi8KCQlwb3J0YWwgPSBTUElfY3Vyc29yX29wZW4oTlVMTCwgcWRlc2MtPnBsYW4s
IGFyZ3ZhbHVlcywgbnVsbHMsCgkJCQkJCQkJIGN1cnJlbnRfY2FsbF9kYXRhLT5wcm9kZXNj
LT5mbl9yZWFkb25seSk7CgkJaWYgKGFyZ2MgPiAwKQoJCXsKCQkJcGZyZWUoYXJndmFsdWVz
KTsKCQkJcGZyZWUobnVsbHMpOwoJCX0KCQlpZiAocG9ydGFsID09IE5VTEwpCgkJCWVsb2co
RVJST1IsICJTUElfY3Vyc29yX29wZW4oKSBmYWlsZWQ6JXMiLAoJCQkJIFNQSV9yZXN1bHRf
Y29kZV9zdHJpbmcoU1BJX3Jlc3VsdCkpOwoKCQljdXJzb3IgPSBjc3RyMnN2KHBvcnRhbC0+
bmFtZSk7CgoJCVBpblBvcnRhbChwb3J0YWwpOwoKCQkvKiBDb21taXQgdGhlIGlubmVyIHRy
YW5zYWN0aW9uLCByZXR1cm4gdG8gb3V0ZXIgeGFjdCBjb250ZXh0ICovCgkJUmVsZWFzZUN1
cnJlbnRTdWJUcmFuc2FjdGlvbigpOwoJCU1lbW9yeUNvbnRleHRTd2l0Y2hUbyhvbGRjb250
ZXh0KTsKCQlDdXJyZW50UmVzb3VyY2VPd25lciA9IG9sZG93bmVyOwoJfQoJUEdfQ0FUQ0go
KTsKCXsKCQlFcnJvckRhdGEgICplZGF0YTsKCgkJLyogU2F2ZSBlcnJvciBpbmZvICovCgkJ
TWVtb3J5Q29udGV4dFN3aXRjaFRvKG9sZGNvbnRleHQpOwoJCWVkYXRhID0gQ29weUVycm9y
RGF0YSgpOwoJCUZsdXNoRXJyb3JTdGF0ZSgpOwoKCQkvKiBBYm9ydCB0aGUgaW5uZXIgdHJh
bnNhY3Rpb24gKi8KCQlSb2xsYmFja0FuZFJlbGVhc2VDdXJyZW50U3ViVHJhbnNhY3Rpb24o
KTsKCQlNZW1vcnlDb250ZXh0U3dpdGNoVG8ob2xkY29udGV4dCk7CgkJQ3VycmVudFJlc291
cmNlT3duZXIgPSBvbGRvd25lcjsKCgkJLyogUHVudCBUaGUgZXJyb3IgdG8gUGVybCAqLwoJ
CQkJaWYgKGVkYXRhLT5kZXRhaWwpIHsKCQkJY3JvYWsoIiVzXG5ERVRBSUw6ICAlcyIsIGVk
YXRhLT5tZXNzYWdlLCBlZGF0YS0+ZGV0YWlsKTsKCQl9CgkJCQllbHNlIHsKCQkJY3JvYWso
IiVzIiwgZWRhdGEtPm1lc3NhZ2UpOwoJCX0KCgkJLyogQ2FuJ3QgZ2V0IGhlcmUsIGJ1dCBr
ZWVwIGNvbXBpbGVyIHF1aWV0ICovCgkJcmV0dXJuIE5VTEw7Cgl9CglQR19FTkRfVFJZKCk7
CgoJcmV0dXJuIGN1cnNvcjsKfQoKdm9pZApwbHBlcmxfc3BpX2ZyZWVwbGFuKGNoYXIgKnF1
ZXJ5KQp7CglTUElQbGFuUHRyCXBsYW47CglwbHBlcmxfcXVlcnlfZGVzYyAqcWRlc2M7Cglw
bHBlcmxfcXVlcnlfZW50cnkgKmhhc2hfZW50cnk7CgoJY2hlY2tfc3BpX3VzYWdlX2FsbG93
ZWQoKTsKCgloYXNoX2VudHJ5ID0gaGFzaF9zZWFyY2gocGxwZXJsX2FjdGl2ZV9pbnRlcnAt
PnF1ZXJ5X2hhc2gsIHF1ZXJ5LAoJCQkJCQkJIEhBU0hfRklORCwgTlVMTCk7CglpZiAoaGFz
aF9lbnRyeSA9PSBOVUxMKQoJCWVsb2coRVJST1IsICJzcGlfZnJlZXBsYW46IEludmFsaWQg
cHJlcGFyZWQgcXVlcnkgcGFzc2VkIik7CgoJcWRlc2MgPSBoYXNoX2VudHJ5LT5xdWVyeV9k
YXRhOwoJaWYgKHFkZXNjID09IE5VTEwpCgkJZWxvZyhFUlJPUiwgInNwaV9mcmVlcGxhbjog
cGxwZXJsIHF1ZXJ5X2hhc2ggdmFsdWUgdmFuaXNoZWQiKTsKCXBsYW4gPSBxZGVzYy0+cGxh
bjsKCgkvKgoJICogZnJlZSBhbGwgbWVtb3J5IGJlZm9yZSBTUElfZnJlZXBsYW4sIHNvIGlm
IGl0IGRpZXMsIG5vdGhpbmcgd2lsbCBiZQoJICogbGVmdCBvdmVyCgkgKi8KCWhhc2hfc2Vh
cmNoKHBscGVybF9hY3RpdmVfaW50ZXJwLT5xdWVyeV9oYXNoLCBxdWVyeSwKCQkJCUhBU0hf
UkVNT1ZFLCBOVUxMKTsKCglNZW1vcnlDb250ZXh0RGVsZXRlKHFkZXNjLT5wbGFuX2N4dCk7
CgoJU1BJX2ZyZWVwbGFuKHBsYW4pOwp9Cgp2b2lkCnBscGVybF9zcGlfY29tbWl0KHZvaWQp
CnsKCU1lbW9yeUNvbnRleHQgb2xkY29udGV4dCA9IEN1cnJlbnRNZW1vcnlDb250ZXh0OwoK
CWNoZWNrX3NwaV91c2FnZV9hbGxvd2VkKCk7CgoJUEdfVFJZKCk7Cgl7CgkJU1BJX2NvbW1p
dCgpOwoJCVNQSV9zdGFydF90cmFuc2FjdGlvbigpOwoJfQoJUEdfQ0FUQ0goKTsKCXsKCQlF
cnJvckRhdGEgICplZGF0YTsKCgkJLyogU2F2ZSBlcnJvciBpbmZvICovCgkJTWVtb3J5Q29u
dGV4dFN3aXRjaFRvKG9sZGNvbnRleHQpOwoJCWVkYXRhID0gQ29weUVycm9yRGF0YSgpOwoJ
CUZsdXNoRXJyb3JTdGF0ZSgpOwoKCQkvKiBQdW50IHRoZSBlcnJvciB0byBQZXJsICovCgkJ
Y3JvYWtfY3N0cihlZGF0YS0+bWVzc2FnZSk7Cgl9CglQR19FTkRfVFJZKCk7Cn0KCnZvaWQK
cGxwZXJsX3NwaV9yb2xsYmFjayh2b2lkKQp7CglNZW1vcnlDb250ZXh0IG9sZGNvbnRleHQg
PSBDdXJyZW50TWVtb3J5Q29udGV4dDsKCgljaGVja19zcGlfdXNhZ2VfYWxsb3dlZCgpOwoK
CVBHX1RSWSgpOwoJewoJCVNQSV9yb2xsYmFjaygpOwoJCVNQSV9zdGFydF90cmFuc2FjdGlv
bigpOwoJfQoJUEdfQ0FUQ0goKTsKCXsKCQlFcnJvckRhdGEgICplZGF0YTsKCgkJLyogU2F2
ZSBlcnJvciBpbmZvICovCgkJTWVtb3J5Q29udGV4dFN3aXRjaFRvKG9sZGNvbnRleHQpOwoJ
CWVkYXRhID0gQ29weUVycm9yRGF0YSgpOwoJCUZsdXNoRXJyb3JTdGF0ZSgpOwoKCQkvKiBQ
dW50IHRoZSBlcnJvciB0byBQZXJsICovCgkJY3JvYWtfY3N0cihlZGF0YS0+bWVzc2FnZSk7
Cgl9CglQR19FTkRfVFJZKCk7Cn0KCi8qCiAqIEltcGxlbWVudGF0aW9uIG9mIHBscGVybCdz
IGVsb2coKSBmdW5jdGlvbgogKgogKiBJZiB0aGUgZXJyb3IgbGV2ZWwgaXMgbGVzcyB0aGFu
IEVSUk9SLCB3ZSdsbCBqdXN0IGVtaXQgdGhlIG1lc3NhZ2UgYW5kCiAqIHJldHVybi4gIFdo
ZW4gaXQgaXMgRVJST1IsIGVsb2coKSB3aWxsIGxvbmdqbXAsIHdoaWNoIHdlIGNhdGNoIGFu
ZAogKiB0dXJuIGludG8gYSBQZXJsIGNyb2FrKCkuICBOb3RlIHdlIGFyZSBhc3N1bWluZyB0
aGF0IGVsb2coKSBjYW4ndCBoYXZlCiAqIGFueSBpbnRlcm5hbCBmYWlsdXJlcyB0aGF0IGFy
ZSBzbyBiYWQgYXMgdG8gcmVxdWlyZSBhIHRyYW5zYWN0aW9uIGFib3J0LgogKgogKiBUaGUg
bWFpbiByZWFzb24gdGhpcyBpcyBvdXQtb2YtbGluZSBpcyB0byBhdm9pZCBjb25mbGljdHMg
YmV0d2VlbiBYU1VCLmgKICogYW5kIHRoZSBQR19UUlkgbWFjcm9zLgogKi8Kdm9pZApwbHBl
cmxfdXRpbF9lbG9nKGludCBsZXZlbCwgU1YgKm1zZykKewoJTWVtb3J5Q29udGV4dCBvbGRj
b250ZXh0ID0gQ3VycmVudE1lbW9yeUNvbnRleHQ7CgljaGFyCSAgICp2b2xhdGlsZSBjbXNn
ID0gTlVMTDsKCgkvKgoJICogV2UgaW50ZW50aW9uYWxseSBvbWl0IGNoZWNrX3NwaV91c2Fn
ZV9hbGxvd2VkKCkgaGVyZSwgYXMgdGhpcyBzZWVtcwoJICogc2FmZSB0byBhbGxvdyBldmVu
IGluIHRoZSBjb250ZXh0cyB0aGF0IHRoYXQgZnVuY3Rpb24gcmVqZWN0cy4KCSAqLwoKCVBH
X1RSWSgpOwoJewoJCWNtc2cgPSBzdjJjc3RyKG1zZyk7CgkJZWxvZyhsZXZlbCwgIiVzIiwg
Y21zZyk7CgkJcGZyZWUoY21zZyk7Cgl9CglQR19DQVRDSCgpOwoJewoJCUVycm9yRGF0YSAg
KmVkYXRhOwoKCQkvKiBNdXN0IHJlc2V0IGVsb2cuYydzIHN0YXRlICovCgkJTWVtb3J5Q29u
dGV4dFN3aXRjaFRvKG9sZGNvbnRleHQpOwoJCWVkYXRhID0gQ29weUVycm9yRGF0YSgpOwoJ
CUZsdXNoRXJyb3JTdGF0ZSgpOwoKCQlpZiAoY21zZykKCQkJcGZyZWUoY21zZyk7CgoJCS8q
IFB1bnQgdGhlIGVycm9yIHRvIFBlcmwgKi8KCQljcm9ha19jc3RyKGVkYXRhLT5tZXNzYWdl
KTsKCX0KCVBHX0VORF9UUlkoKTsKfQoKLyoKICogU3RvcmUgYW4gU1YgaW50byBhIGhhc2gg
dGFibGUgdW5kZXIgYSBrZXkgdGhhdCBpcyBhIHN0cmluZyBhc3N1bWVkIHRvIGJlCiAqIGlu
IHRoZSBjdXJyZW50IGRhdGFiYXNlJ3MgZW5jb2RpbmcuCiAqLwpzdGF0aWMgU1YgKioKaHZf
c3RvcmVfc3RyaW5nKEhWICpodiwgY29uc3QgY2hhciAqa2V5LCBTViAqdmFsKQp7CglkVEhY
OwoJaW50MzIJCWhsZW47CgljaGFyCSAgICpoa2V5OwoJU1YJCSAgKipyZXQ7CgoJaGtleSA9
IHBnX3NlcnZlcl90b19hbnkoa2V5LCBzdHJsZW4oa2V5KSwgUEdfVVRGOCk7CgoJLyoKCSAq
IGh2X3N0b3JlKCkgcmVjb2duaXplcyBhIG5lZ2F0aXZlIGtsZW4gcGFyYW1ldGVyIGFzIG1l
YW5pbmcgYSBVVEYtOAoJICogZW5jb2RlZCBrZXkuCgkgKi8KCWhsZW4gPSAtKGludCkgc3Ry
bGVuKGhrZXkpOwoJcmV0ID0gaHZfc3RvcmUoaHYsIGhrZXksIGhsZW4sIHZhbCwgMCk7CgoJ
aWYgKGhrZXkgIT0ga2V5KQoJCXBmcmVlKGhrZXkpOwoKCXJldHVybiByZXQ7Cn0KCi8qCiAq
IEZldGNoIGFuIFNWIGZyb20gYSBoYXNoIHRhYmxlIHVuZGVyIGEga2V5IHRoYXQgaXMgYSBz
dHJpbmcgYXNzdW1lZCB0byBiZQogKiBpbiB0aGUgY3VycmVudCBkYXRhYmFzZSdzIGVuY29k
aW5nLgogKi8Kc3RhdGljIFNWICoqCmh2X2ZldGNoX3N0cmluZyhIViAqaHYsIGNvbnN0IGNo
YXIgKmtleSkKewoJZFRIWDsKCWludDMyCQlobGVuOwoJY2hhcgkgICAqaGtleTsKCVNWCQkg
ICoqcmV0OwoKCWhrZXkgPSBwZ19zZXJ2ZXJfdG9fYW55KGtleSwgc3RybGVuKGtleSksIFBH
X1VURjgpOwoKCS8qIFNlZSBub3RlcyBpbiBodl9zdG9yZV9zdHJpbmcgKi8KCWhsZW4gPSAt
KGludCkgc3RybGVuKGhrZXkpOwoJcmV0ID0gaHZfZmV0Y2goaHYsIGhrZXksIGhsZW4sIDAp
OwoKCWlmIChoa2V5ICE9IGtleSkKCQlwZnJlZShoa2V5KTsKCglyZXR1cm4gcmV0Owp9Cgov
KgogKiBQcm92aWRlIGZ1bmN0aW9uIG5hbWUgZm9yIFBML1BlcmwgZXhlY3V0aW9uIGVycm9y
cwogKi8Kc3RhdGljIHZvaWQKcGxwZXJsX2V4ZWNfY2FsbGJhY2sodm9pZCAqYXJnKQp7Cglj
aGFyCSAgICpwcm9jbmFtZSA9IChjaGFyICopIGFyZzsKCglpZiAocHJvY25hbWUpCgkJZXJy
Y29udGV4dCgiUEwvUGVybCBmdW5jdGlvbiBcIiVzXCIiLCBwcm9jbmFtZSk7Cn0KCi8qCiAq
IFByb3ZpZGUgZnVuY3Rpb24gbmFtZSBmb3IgUEwvUGVybCBjb21waWxhdGlvbiBlcnJvcnMK
ICovCnN0YXRpYyB2b2lkCnBscGVybF9jb21waWxlX2NhbGxiYWNrKHZvaWQgKmFyZykKewoJ
Y2hhcgkgICAqcHJvY25hbWUgPSAoY2hhciAqKSBhcmc7CgoJaWYgKHByb2NuYW1lKQoJCWVy
cmNvbnRleHQoImNvbXBpbGF0aW9uIG9mIFBML1BlcmwgZnVuY3Rpb24gXCIlc1wiIiwgcHJv
Y25hbWUpOwp9CgovKgogKiBQcm92aWRlIGVycm9yIGNvbnRleHQgZm9yIHRoZSBpbmxpbmUg
aGFuZGxlcgogKi8Kc3RhdGljIHZvaWQKcGxwZXJsX2lubGluZV9jYWxsYmFjayh2b2lkICph
cmcpCnsKCWVycmNvbnRleHQoIlBML1BlcmwgYW5vbnltb3VzIGNvZGUgYmxvY2siKTsKfQoK
Ci8qCiAqIFBlcmwncyBvd24gc2V0bG9jYWxlKCksIGNvcGllZCBmcm9tIFBPU0lYLnhzCiAq
IChuZWVkZWQgYmVjYXVzZSBvZiB0aGUgY2FsbHMgdG8gbmV3XyooKSkKICoKICogU3RhcnRp
bmcgaW4gNS4yOCwgcGVybCBleHBvc2VzIFBlcmxfc2V0bG9jYWxlIHRvIGRvIHNvLgogKi8K
I2lmIGRlZmluZWQoV0lOMzIpICYmIFBFUkxfVkVSU0lPTl9MVCg1LCAyOCwgMCkKc3RhdGlj
IGNoYXIgKgpzZXRsb2NhbGVfcGVybChpbnQgY2F0ZWdvcnksIGNoYXIgKmxvY2FsZSkKewoJ
ZFRIWDsKCWNoYXIJICAgKlJFVFZBTCA9IHNldGxvY2FsZShjYXRlZ29yeSwgbG9jYWxlKTsK
CglpZiAoUkVUVkFMKQoJewojaWZkZWYgVVNFX0xPQ0FMRV9DVFlQRQoJCWlmIChjYXRlZ29y
eSA9PSBMQ19DVFlQRQojaWZkZWYgTENfQUxMCgkJCXx8IGNhdGVnb3J5ID09IExDX0FMTAoj
ZW5kaWYKCQkJKQoJCXsKCQkJY2hhcgkgICAqbmV3Y3R5cGU7CgojaWZkZWYgTENfQUxMCgkJ
CWlmIChjYXRlZ29yeSA9PSBMQ19BTEwpCgkJCQluZXdjdHlwZSA9IHNldGxvY2FsZShMQ19D
VFlQRSwgTlVMTCk7CgkJCWVsc2UKI2VuZGlmCgkJCQluZXdjdHlwZSA9IFJFVFZBTDsKCQkJ
bmV3X2N0eXBlKG5ld2N0eXBlKTsKCQl9CiNlbmRpZgkJCQkJCQkvKiBVU0VfTE9DQUxFX0NU
WVBFICovCiNpZmRlZiBVU0VfTE9DQUxFX0NPTExBVEUKCQlpZiAoY2F0ZWdvcnkgPT0gTENf
Q09MTEFURQojaWZkZWYgTENfQUxMCgkJCXx8IGNhdGVnb3J5ID09IExDX0FMTAojZW5kaWYK
CQkJKQoJCXsKCQkJY2hhcgkgICAqbmV3Y29sbDsKCiNpZmRlZiBMQ19BTEwKCQkJaWYgKGNh
dGVnb3J5ID09IExDX0FMTCkKCQkJCW5ld2NvbGwgPSBzZXRsb2NhbGUoTENfQ09MTEFURSwg
TlVMTCk7CgkJCWVsc2UKI2VuZGlmCgkJCQluZXdjb2xsID0gUkVUVkFMOwoJCQluZXdfY29s
bGF0ZShuZXdjb2xsKTsKCQl9CiNlbmRpZgkJCQkJCQkvKiBVU0VfTE9DQUxFX0NPTExBVEUg
Ki8KCiNpZmRlZiBVU0VfTE9DQUxFX05VTUVSSUMKCQlpZiAoY2F0ZWdvcnkgPT0gTENfTlVN
RVJJQwojaWZkZWYgTENfQUxMCgkJCXx8IGNhdGVnb3J5ID09IExDX0FMTAojZW5kaWYKCQkJ
KQoJCXsKCQkJY2hhcgkgICAqbmV3bnVtOwoKI2lmZGVmIExDX0FMTAoJCQlpZiAoY2F0ZWdv
cnkgPT0gTENfQUxMKQoJCQkJbmV3bnVtID0gc2V0bG9jYWxlKExDX05VTUVSSUMsIE5VTEwp
OwoJCQllbHNlCiNlbmRpZgoJCQkJbmV3bnVtID0gUkVUVkFMOwoJCQluZXdfbnVtZXJpYyhu
ZXdudW0pOwoJCX0KI2VuZGlmCQkJCQkJCS8qIFVTRV9MT0NBTEVfTlVNRVJJQyAqLwoJfQoK
CXJldHVybiBSRVRWQUw7Cn0KI2VuZGlmCQkJCQkJCS8qIGRlZmluZWQoV0lOMzIpICYmIFBF
UkxfVkVSU0lPTl9MVCg1LCAyOCwgMCkgKi8K

--------------JEcHAiaFmwEZbMcRyq0VQYwj--