add %ram% device support

"david zuhn" <[email protected]> Sat, 30 Sep 2006 21:58:58 -0500
Newsgroups gmane.comp.printing.ghostscript.patches
Message-ID <[email protected]>
------=_Part_9768_1366625.1159671538533
Content-Type: text/plain; charset=ISO-8859-1; format=flowed
Content-Transfer-Encoding: 7bit
Content-Disposition: inline

Here is a set of patches that is a start at implementing the %ram*%
family of devices.   These follow the suggestion of using a directory
in /tmp (or other suitable location) and real files on disk rather
then a filesystem implemented solely in-memory.

These patches address bug 226943,

http://bugs.ghostscript.com/show_bug.cgi?id=226943

These are not yet complete, for the known reasons listed below.
However, I think they're far enough along to allow me to ask a couple
of questions about how to proceed.

1.  This is only tested on Linux/x86 and Linux/AMD64.  Those are the
   only platforms that I have development access to these days.
   The code uses mkdtemp, the status of which on Windows & MacOS
   I do not know.   I don't think anything else is horribly non-portable.
   See gp_unifs.c/gp_create_scratch_directory.

2.  There is OS level code in the gsioram.c file (which implements the
   %ram*% devices.   This is opendir/readdir, plus unlink and rmdir.
   Again, I don't know if this is sufficiently portable for Win32 &
   Mac, or if I need to abstract that code out of gsio* files and into
   some compatibility layer.
   See gsioram.c/ramdisk_delete_all_files

3.  The put_params code is needed by my reading of the PS Supplement,
   since InitializeAction is required to erase all existing files.

4.  This device always creates a gsram-XXXXXX temporary directory
   when initialized.   From what I can tell, this introduces a need
   for a shutdown process for devices.  I've added the field to the
   device structure, and to all of the rest of the devices (which
   clearly don't need one).   But I'm having trouble following the
   end-of-process code to figure out the best place to call a
   proposed new gs_iodev_shutdown function that will call the shutdown
   hook from procs.

   I think that an explicit call to a new gs_iodev_shutdown is better
   than playing games with atexit.   Agreed?

5.  BlockSize and LogicalSize have no real meaning in this code.  I have
   a start at some real in-ram based code which do make use of these
   values.   Suggested alternatives for the current defaults are welcome.
   See gsioram.c/ramdisk_get_params


This patches have been developed against GS 8.54.  Brief examinations of
the SVN trunk lead me to believe that updating this patchset will be little
trouble.

------=_Part_9768_1366625.1159671538533
Content-Type: text/x-patch; name="ramdisk-v8.54.patch"
Content-Transfer-Encoding: base64
Content-Disposition: attachment; filename="ramdisk-v8.54.patch"
X-Attachment-Id: f_esquhebu

SGVyZSBpcyBhIHNldCBvZiBwYXRjaGVzIHRoYXQgaXMgYSBzdGFydCBhdCBpbXBsZW1lbnRpbmcg
dGhlICVyYW0qJSAKZmFtaWx5IG9mIGRldmljZXMuICAgVGhlc2UgZm9sbG93IHRoZSBzdWdnZXN0
aW9uIG9mIHVzaW5nIGEgZGlyZWN0b3J5CmluIC90bXAgKG9yIG90aGVyIHN1aXRhYmxlIGxvY2F0
aW9uKSBhbmQgcmVhbCBmaWxlcyBvbiBkaXNrIHJhdGhlcgp0aGVuIGEgZmlsZXN5c3RlbSBpbXBs
ZW1lbnRlZCBzb2xlbHkgaW4tbWVtb3J5LiAgCgpUaGVzZSBwYXRjaGVzIGFkZHJlc3MgYnVnIDIy
Njk0MywKCmh0dHA6Ly9idWdzLmdob3N0c2NyaXB0LmNvbS9zaG93X2J1Zy5jZ2k/aWQ9MjI2OTQz
CgpUaGVzZSBhcmUgbm90IHlldCBjb21wbGV0ZSwgZm9yIHRoZSBrbm93biByZWFzb25zIGxpc3Rl
ZCBiZWxvdy4KSG93ZXZlciwgSSB0aGluayB0aGV5J3JlIGZhciBlbm91Z2ggYWxvbmcgdG8gYWxs
b3cgbWUgdG8gYXNrIGEgY291cGxlCm9mIHF1ZXN0aW9ucyBhYm91dCBob3cgdG8gcHJvY2VlZC4K
CjEuICBUaGlzIGlzIG9ubHkgdGVzdGVkIG9uIExpbnV4L3g4NiBhbmQgTGludXgvQU1ENjQuICBU
aG9zZSBhcmUgdGhlCiAgICBvbmx5IHBsYXRmb3JtcyB0aGF0IEkgaGF2ZSBkZXZlbG9wbWVudCBh
Y2Nlc3MgdG8gdGhlc2UgZGF5cy4KICAgIFRoZSBjb2RlIHVzZXMgbWtkdGVtcCwgdGhlIHN0YXR1
cyBvZiB3aGljaCBvbiBXaW5kb3dzICYgTWFjT1MKICAgIEkgZG8gbm90IGtub3cuICAgSSBkb24n
dCB0aGluayBhbnl0aGluZyBlbHNlIGlzIGhvcnJpYmx5IG5vbi1wb3J0YWJsZS4KICAgIFNlZSBn
cF91bmlmcy5jL2dwX2NyZWF0ZV9zY3JhdGNoX2RpcmVjdG9yeS4gCgoyLiAgVGhlcmUgaXMgT1Mg
bGV2ZWwgY29kZSBpbiB0aGUgZ3Npb3JhbS5jIGZpbGUgKHdoaWNoIGltcGxlbWVudHMgdGhlCiAg
ICAlcmFtKiUgZGV2aWNlcy4gICBUaGlzIGlzIG9wZW5kaXIvcmVhZGRpciwgcGx1cyB1bmxpbmsg
YW5kIHJtZGlyLgogICAgQWdhaW4sIEkgZG9uJ3Qga25vdyBpZiB0aGlzIGlzIHN1ZmZpY2llbnRs
eSBwb3J0YWJsZSBmb3IgV2luMzIgJgogICAgTWFjLCBvciBpZiBJIG5lZWQgdG8gYWJzdHJhY3Qg
dGhhdCBjb2RlIG91dCBvZiBnc2lvKiBmaWxlcyBhbmQgaW50bwogICAgc29tZSBjb21wYXRpYmls
aXR5IGxheWVyLgogICAgU2VlIGdzaW9yYW0uYy9yYW1kaXNrX2RlbGV0ZV9hbGxfZmlsZXMKCjMu
ICBUaGUgcHV0X3BhcmFtcyBjb2RlIGlzIG5lZWRlZCBieSBteSByZWFkaW5nIG9mIHRoZSBQUyBT
dXBwbGVtZW50LAogICAgc2luY2UgSW5pdGlhbGl6ZUFjdGlvbiBpcyByZXF1aXJlZCB0byBlcmFz
ZSBhbGwgZXhpc3RpbmcgZmlsZXMuCgo0LiAgVGhpcyBkZXZpY2UgYWx3YXlzIGNyZWF0ZXMgYSBn
c3JhbS1YWFhYWFggdGVtcG9yYXJ5IGRpcmVjdG9yeQogICAgd2hlbiBpbml0aWFsaXplZC4gICBG
cm9tIHdoYXQgSSBjYW4gdGVsbCwgdGhpcyBpbnRyb2R1Y2VzIGEgbmVlZAogICAgZm9yIGEgc2h1
dGRvd24gcHJvY2VzcyBmb3IgZGV2aWNlcy4gIEkndmUgYWRkZWQgdGhlIGZpZWxkIHRvIHRoZQog
ICAgZGV2aWNlIHN0cnVjdHVyZSwgYW5kIHRvIGFsbCBvZiB0aGUgcmVzdCBvZiB0aGUgZGV2aWNl
cyAod2hpY2gKICAgIGNsZWFybHkgZG9uJ3QgbmVlZCBvbmUpLiAgIEJ1dCBJJ20gaGF2aW5nIHRy
b3VibGUgZm9sbG93aW5nIHRoZQogICAgZW5kLW9mLXByb2Nlc3MgY29kZSB0byBmaWd1cmUgb3V0
IHRoZSBiZXN0IHBsYWNlIHRvIGNhbGwgYSAKICAgIHByb3Bvc2VkIG5ldyBnc19pb2Rldl9zaHV0
ZG93biBmdW5jdGlvbiB0aGF0IHdpbGwgY2FsbCB0aGUgc2h1dGRvd24gCiAgICBob29rIGZyb20g
cHJvY3MuICAKCiAgICBJIHRoaW5rIHRoYXQgYW4gZXhwbGljaXQgY2FsbCB0byBhIG5ldyBnc19p
b2Rldl9zaHV0ZG93biBpcyBiZXR0ZXIKICAgIHRoYW4gcGxheWluZyBnYW1lcyB3aXRoIGF0ZXhp
dC4gICBBZ3JlZWQ/Cgo1LiAgQmxvY2tTaXplIGFuZCBMb2dpY2FsU2l6ZSBoYXZlIG5vIHJlYWwg
bWVhbmluZyBpbiB0aGlzIGNvZGUuICBJIGhhdmUKICAgIGEgc3RhcnQgYXQgc29tZSByZWFsIGlu
LXJhbSBiYXNlZCBjb2RlIHdoaWNoIGRvIG1ha2UgdXNlIG9mIHRoZXNlCiAgICB2YWx1ZXMuICAg
U3VnZ2VzdGVkIGFsdGVybmF0aXZlcyBmb3IgdGhlIGN1cnJlbnQgZGVmYXVsdHMgYXJlIHdlbGNv
bWUuCiAgICBTZWUgZ3Npb3JhbS5jL3JhbWRpc2tfZ2V0X3BhcmFtcwoKClRoaXMgcGF0Y2hlcyBo
YXZlIGJlZW4gZGV2ZWxvcGVkIGFnYWluc3QgR1MgOC41NC4gIEJyaWVmIGV4YW1pbmF0aW9ucyBv
Zgp0aGUgU1ZOIHRydW5rIGxlYWQgbWUgdG8gYmVsaWV2ZSB0aGF0IHVwZGF0aW5nIHRoaXMgcGF0
Y2hzZXQgd2lsbCBiZSBsaXR0bGUKdHJvdWJsZS4KCgpQYXRjaCBSb2FkbWFwOgoKTXVjaCBvZiBn
c2lvZGlzay5jIHdhcyB1c2VkIGFzIGluc3BpcmF0aW9uIGZvciBnc2lvcmFtLmMsIHdoaWNoIGlz
IHRoZSBmaWxlCndoaWNoIGltcGxlbWVudHMgdGhlIG5ldyBkZXZpY2UuICBUaGUgbWFwIGZpbGUg
Y29kZSB3YXMgZ29pbmcgdG8gYmUgdXNlZnVsCmZvciBib3RoIGdzaW9kaXNrIGFuZCBnc2lvcmFt
LCBzbyBJIG1vdmVkIGl0IGludG8gbmV3IGZpbGVzIG5hbWVkCmdzaW9tYXAuW2NoXS4KCmxpYi5t
YWssIGludC5tYWsgYW5kIGdzLm1hayBhbGwgaGFkIGVudHJpZXMgYWRkZWQgZm9yIGdzaW9yYW0u
YywgcGx1cyB0aGUgCmFkZGl0aW9uIG9mIGRlcGVuZGVuY2llcyBmb3IgZ3Npb21hcC5bY2hdCgpn
cF91bmlmcy5jIGdldHMgdGhlIGltcGxlbWVudGF0aW9uIG9mIGdwX2NyZWF0ZV9zY3JhdGNoX2Rp
cmVjdG9yeS4gIGdwLmgKZ2V0cyB0aGUgcHJvdG90eXBlLiAgY29uZmlndXJlLmFjIGdldHMgYSBu
ZXcgdGVzdCBmb3IgbWtkdGVtcCwgYW5kCk1ha2VmaWxlLmluIGdldHMgYSBuZXcgY2FwYWJpbGl0
eSBkZWZpbmUuICBJZiBhbGwgcGxhdGZvcm1zIGNhbiBiZSBleHBlY3RlZAp0byBoYXZlIHRoaXMg
ZnVuY3Rpb24sIHRoZXNlIHRlc3RzIGFyZW4ndCBzbyB1c2VmdWwuICAKCnRlc3RzL3JhbS1pbml0
LnBzIGFuZCB0ZXN0cy9yYW0td3JpdGUxLnBzIGFyZSB0aGUgY29kZSBJIHVzZWQgdG8gdGVzdCB0
aGF0CnRoaXMgc3R1ZmYgYWN0dWFsbHkgd29ya3MuICAgCgpUaGUgcmVtYWluZGVyIG9mIHRoZSBw
YXRjaGVzIGFyZSBhZGRpbmcgdGhlIGlvZGV2IHByb2NzIGVudHJ5IGZvciB0aGUKc2h1dGRvd24g
ZnVuY3Rpb24gcGlvaW50ZXIuCgoKCkFwcGx5IHdpdGggInBhdGNoIC1wMCA8IHRoaXMtZmlsZSIK
CgpJbmRleDogc3JjL2dzaW9kaXNrLmMKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gc3JjL2dzaW9kaXNrLmMJKC4u
Li90YWdzL2dzOC41NCkJKHJldmlzaW9uIDIyKQorKysgc3JjL2dzaW9kaXNrLmMJKC4uLi90cnVu
ay9ncykJKHJldmlzaW9uIDIyKQpAQCAtMzQsNjUgKzM0LDggQEAKICAqIGxvZ2ljYWwgZmlsZSBu
YW1lcy4gIChUaGlzIG1heSBiZSBjaGFuZ2VkIGluIHRoZSBmdXR1cmUuICBCdXQgZm9yCiAgKiBu
b3cgaXQgbWFrZXMgdGhlIGltcGxlbWVudGF0aW9uIGVhc2llci4pCiAgKgotICogQSBzcGVjaWFs
IHRoYW5rcyBpcyBnaXZlbiBmb3IgTm9yaXl1a2kgTWF0c3VzaGltYSBmb3IgaGlzIGNyZWF0aW9u
IG9mCi0gKiB0aGUgb3JpZ2luYWwgdmVyc2lvbiBvZiB0aGUgbWFwcGluZyBmaWxlIGxvZ2ljLgog
ICovCiAKLS8qCi0gKiBNYXBwaW5nIGZpbGU6Ci0gKgotICogVGhlIG1hcHBpbmcgZmlsZSBpcyB1
c2VkIHRvIGNyZWF0ZSBhICdmbGF0IGRpc2snIGZpbGUgc3RydWN0dXJlLiAgQWxsIGZpbGUKLSAq
IGFyZSBzdG9yZWQgaW4gYSBzaW5nbGUgZGlyZWN0b3J5LiAgVG8gYWNjb21wbGlzaCB0aGlzLCB0
aGUgbG9naWNhbCBmaWxlCi0gKiBuYW1lLCBpbmNsdWRpbmcgdGhlIHBhdGgsIGFyZSBzdG9yZWQg
aW4gYSAnbWFwcGluZyBmaWxlJy4gIEZvciBlYWNoIGZpbGUgaW4KLSAqIGZsYXQgZGlzaywgdGhl
cmUgaXMgYSBzaW5nbGUgbGluZSBlbnRyeSBpbiB0aGUgbWFwcGluZyBmaWxlLiAgVGhlIG1hcHBp
bmcKLSAqIGZpbGUgZW50cnkgYWxzbyBpbmNsdWRlcyBhIGZpbGUgbnVtYmVyIHZhbHVlLiAgVGhp
cyBmaWxlIG51bWJlciBpcyB1c2VkIGFzCi0gKiB0aGUgYWN0dWFsIGZpbGUgbmFtZSBpbiB0aGUg
ZmxhdCBkaXNrIGRpcmVjdG9yeS4KLSAqCi0gKiBUaGUgZmxhdCBkaXNrIGZvcm1hdCBhbmQgdGhl
IG1hcHBpbmcgZmlsZSBhcmUgdXNlZCB0byBlbGltaW5hdGUgcHJvYmxlbXMKLSAqIHdpdGggdHJ5
aW5nIHRvIGVtdWxhdGUgYSBsb2dpY2FsIGRpcmVjdG9yeSBzdHJ1Y3R1cmUgb24gZGlmZmVyZW50
IG9wZXJhdGluZwotICogc3lzdGVtcyB3aGljaCBoYXZlIGRpZmZlcmVudCBydWxlcyBhYm91dCB3
aGF0IGlzIGFsbG93ZWQgYW5kIG5vdCBhbGxvd2VkCi0gKiBpbiBhIGZpbGUgbmFtZSBhbmQgcGF0
aC4KLSAqCi0gKiBNYXBwaW5nIGZpbGUgZm9ybWF0OgotICoKLSAqIEZpcnN0IGxpbmU6Ci0gKiBG
aWxlVmVyc2lvbjx0YWI+MTx0YWI+VGhpcyBmaWxlIGlzIG1hY2hpbmUgZ2VuZXJhdGVkLiBObyBu
b3QgZWRpdC48bmV3bGluZT4KLSAqCi0gKiBSZW1haW5pbmcgbGluZXM6Ci0gKiA8c3BhY2U+Zmls
ZW51bWJlcjx0YWI+ZmlsZV9uYW1lPG5ld2xpbmU+Ci0gKgotICogVGhlIGZpcnN0IGxpbmUgb2Yg
dGhlIG1hcHBpbmcgZmlsZSBjb250YWlucyB0aGUgdGV4dCAiRmlsZVZlcnNpb24iIGZvbGxvd2Vk
Ci0gKiBieSBhIHRhYiBjaGFyYWN0ZXIuIFRoZW4gdGhlIG51bWJlciAxIChhc2NpaSAtIDMxIGhl
eCkgZm9sbG93ZWQgYnkgYSB0YWIKLSAqIGFuZCB0aGVuIGEgc2hvcnQgbWVzc2FnZSB0ZWxsaW5n
IHBlb3BsZSB0byBub3QgZWRpdCB0aGUgZmlsZS4gIFRoaXMgaXMgYW4KLSAqIGF0dGVtcHQgdG8g
a2VlcCB0aGUgbWFwcGluZyBmaWxlIGZyb20gYmVpbmcgY29ycnVwdGVkLgotICoKLSAqIFRoZSBm
aWxlIHZlcnNpb24gbnVtYmVyIG11c3QgYmUgYSAiMSIuICBUaGlzIGlzIHRoZSBvbmx5IHZlcnNp
b24gY3VycmVudGx5Ci0gKiBzdXBwb3J0ZWQuICBUaGlzIGxpbmUgZXhpc3RzIGluIGNhc2UgaXQg
aXMgbmVjZXNzYXJ5IHRvIG1vZGlmeSB0aGUgbWFwcGluZwotICogZmlsZSBmb3JtYXQgYXQgc29t
ZSBmdXR1cmUgZGF0ZS4gIFRoZSBwcmVzZW5jZSBvZiBhIHZlcnNpb24gbnVtYmVyIGFsbG93cwot
ICogZm9yIHNlYW1sZXNzIHVwZ3JhZGluZyBvZiB0aGUgZmlsZSBmb3JtYXQuCi0gKgotICogVGhl
IGZvcm1hdCBvZiB0aGUgZW50cnkgbGluZXMgaGFzIGJlZW4gY3JlYXRlZCBzbyB0aGF0IHRoZSBy
ZWFkIGVudHJ5Ci0gKiByb3V0aW5lIHdvdWxkOgotICogMS4gR3JhYiB0aGUgbnVtYmVyIChpbmNs
dWRpbmcgdGhlIHNwYWNlIGlmIGl0IGhhcyBub3QgYWxyZWFkeSBiZWVuIHJlYWQuKQotICogMi4g
R3JhYiB0aGUgdGFiCi0gKiAzLiBHcmFiIGV2ZXJ5dGhpbmcgdXAgdG8gYSBsaW5lZmVlZCBvciBj
YXJyaWFnZSByZXR1cm4gYXMgdGhlIGZpbGUgbmFtZS4KLSAqIDQuIEdyYWIgYW55IHJlbWFpbmlu
ZyBsaW5lZmVlZHMvY2FycmlhZ2UgcmV0dXJucy4gTm90ZSB0aGlzIHN0ZXAgbWlnaHQKLSAqIGdy
YWIgdGhlIGZpcnN0IGNoYXJhY3RlciBvZiB0aGUgbmV4dCBsaW5lIGlmIHRoZXJlIGlzIG9ubHkg
YSBzaW5nbGUKLSAqIGNhcnJpYWdlIHJldHVybiBvciBsaW5lZmVlZC4gIFNpbmNlIGl0IGlzIG5v
dCBkZXNpcmVhYmxlIHRvIGhhdmUgdG8gd29ycnkKLSAqIGFib3V0IGRvaW5nIGFuICd1bmdldCBj
aGFyYWN0ZXInLCBhbiBleHRyYSBzcGFjZSBoYXMgYmVlbiBwdXQgYXQgdGhlCi0gKiBiZWdpbm5p
bmcgb2YgZWFjaCBsaW5lLiAgVGhlIGV4dHJhIGxvZ2ljIHdpdGggdGhlIGxpbmVmZWVkL2NhcnJp
YWdlIHJldHVybgotICogaXMgcHJpbWFyaWx5IHRoZXJlIGluIGNhc2Ugc29tZW9uZSBhY2NpZGVu
dGFsbHkgbWFuZ2xlcyB0aGUgZmlsZSBieSBsb29raW5nCi0gKiBhdCBpdCB3aXRoIGEgdGV4dCBl
ZGl0b3IuCi0gKgotICogVGhpcyBiYXNpY2FsbHkgYWxsb3dzIGZvciBhbnkgZmlsZSBuYW1lIGV4
Y2VwdCBvbmUgdGhhdCBpbmNsdWRlcwotICogYSB6ZXJvLCBhIGNhcnJpYWdlIHJldHVybiwgb3Ig
YSBsaW5lZmVlZC4gIFRoZSByZXF1aXJlbWVudCBmb3IgZXhjbHVkaW5nCi0gKiB6ZXJvIGlzIHRo
YXQgdGhlcmUgYXJlIHRvbyBtYW55IEMgc3RyaW5nIHJvdXRpbmVzIHRoYXQgYXNzdW1lIHplcm8g
aXMKLSAqIGEgc3RyaW5nIHRlcm1pbmF0b3IgKGluY2x1ZGluZyBtdWNoIG9mIHRoZSBjdXJyZW50
IEdob3N0c2NyaXB0IGNvZGUgYW5kCi0gKiB0aGUgY3VycmVudCBtYXAgaGFuZGxlcikuICBUaGUg
Y2FycmlhZ2UgcmV0dXJuL2xpbmVmZWVkIHJlcXVpcmVtZW50IGlzCi0gKiB0aGVyZSBzaW1wbHkg
YmVjYXVzZSBpdCBpcyBiZWluZyB1c2VkIGFzIGEgdGVybWluYXRvciBmb3IgdGhlIGZpbGUgbmFt
ZS4KLSAqIEl0IGNvdWxkIGVhc2lseSBiZSBlbGltaW5hdGVkIGJ5IGFkZGluZyBhIHplcm8gYXMg
dGhlIG5hbWUgdGVybWluYXRvci4KLSAqIFRoZSBvbmx5IGRpc2FkdmFudGFnZSBpcyB0aGF0IHRo
ZSBmaWxlIGlzIG5vIGxvbmdlciB0b3RhbGx5IHByaW50YWJsZSBhc2NpaS4KLSAqLyAKIAogI2lu
Y2x1ZGUgImVycm5vXy5oIgogI2luY2x1ZGUgInN0cmluZ18uaCIKQEAgLTEwNSw2ICs0OCw3IEBA
CiAjaW5jbHVkZSAiZ3NzdHJ1Y3QuaCIKICNpbmNsdWRlICJneGlvZGV2LmgiCiAjaW5jbHVkZSAi
Z3N1dGlsLmgiCisjaW5jbHVkZSAiZ3Npb21hcC5oIgogCiAvKiBGdW5jdGlvbiBwcm90b3R5cGVz
ICovCiBwcml2YXRlIGlvZGV2X3Byb2NfaW5pdChpb2Rldl9kaXNrbl9pbml0KTsKQEAgLTEyNCw3
ICs2OCw3IEBACiBjb25zdCBneF9pb19kZXZpY2UgdmFybmFtZSA9IFwKIHsgXAogICAgIGRpc2tu
YW1lLCAiRmlsZVN5c3RlbSIsIFwKLSAgICB7aW9kZXZfZGlza25faW5pdCwgaW9kZXZfbm9fb3Bl
bl9kZXZpY2UsIFwKKyAgICB7aW9kZXZfZGlza25faW5pdCwgaW9kZXZfbm9fc2h1dGRvd24sIGlv
ZGV2X25vX29wZW5fZGV2aWNlLAkgICAgIFwKICAgICAgTlVMTCAvKiBubyBsb25nZXIgdXNlZCAq
LyAsIGlvZGV2X2Rpc2tuX2ZvcGVuLCBpb2Rldl9vc19mY2xvc2UsIFwKICAgICAgZGlza25fZGVs
ZXRlLCBkaXNrbl9yZW5hbWUsIGRpc2tuX3N0YXR1cywgXAogICAgICBpb2Rldl9ub19lbnVtZXJh
dGVfZmlsZXMsIC8qIE9ubHkgdW50aWwgd2UgaGF2ZSBhIHJvb3QgbG9jYXRpb24gKi8gXApAQCAt
MTU3LDMwICsxMDEsOSBAQAogZ3NfcHJpdmF0ZV9zdF9wdHJzMShzdF9kaXNrbl9zdGF0ZSwgc3Ry
dWN0IGRpc2tuX3N0YXRlX3MsICJkaXNrbl9zdGF0ZSIsCiAgICAgZGlza25fc3RhdGVfZW51bV9w
dHJzLCBkaXNrbl9zdGF0ZV9yZWxvY19wdHJzLCByb290KTsKIAotI2RlZmluZSBNQVBfRklMRV9O
QU1FICJtYXAudHh0IgotI2RlZmluZSBURU1QX0ZJTEVfTkFNRSAiVG1wLnR4dCIKLSNkZWZpbmUg
TUFQX0ZJTEVfVkVSU0lPTiAxCi0jZGVmaW5lIEluaXRpYWxOdW1iZXIgMAotI2RlZmluZSBCVUZG
RVJfTEVOR1RIIGdwX2ZpbGVfbmFtZV9zaXplb2YKIAotdHlwZWRlZiBzdHJ1Y3QgbWFwX2ZpbGVf
ZW51bV9zIHsKLSAgICBGSUxFICogIHN0cmVhbTsgICAgICAgICAvKiBzdHJlYW0gdG8gbWFwIGZp
bGUgKi8KLSAgICBjaGFyICogIHBhdHRlcm47ICAgICAgICAvKiBwYXR0ZXJuIHBvaW50ZXIgICAg
Ki8KLSAgICBjaGFyICogIHJvb3Q7ICAgICAgICAgICAvKiByb290IHBhdGggcG9pbnRlciAgKi8K
LSAgICBnc19tZW1vcnlfdCAqIG1lbW9yeTsgICAvKiBtZW1vcnkgc3RydWN0dXJlIHVzZWQgKi8K
LX0gbWFwX2ZpbGVfZW51bTsKIAotZ3NfcHJpdmF0ZV9zdF9wdHJzMihzdF9tYXBfZmlsZV9lbnVt
LCBzdHJ1Y3QgbWFwX2ZpbGVfZW51bV9zLCAibWFwX2ZpbGVfZW51bSIsCi0gICAgbWFwX2ZpbGVf
ZW51bV9lbnVtX3B0cnMsIG1hcF9maWxlX2VudW1fcmVsb2NfcHRycywgcGF0dGVybiwgcm9vdCk7
CiAKLXByaXZhdGUgdm9pZCAqIG1hcF9maWxlX2VudW1faW5pdChnc19tZW1vcnlfdCAqLCBjb25z
dCBjaGFyICosIGNvbnN0IGNoYXIgKik7Ci1wcml2YXRlIGJvb2wgbWFwX2ZpbGVfZW51bV9uZXh0
KHZvaWQgKiwgY2hhciAqKTsKLXByaXZhdGUgdm9pZCBtYXBfZmlsZV9lbnVtX2Nsb3NlKHZvaWQg
Kik7Ci1wcml2YXRlIGJvb2wgbWFwX2ZpbGVfbmFtZV9nZXQoY29uc3QgY2hhciAqLCBjb25zdCBj
aGFyICosIGNoYXIgKik7Ci1wcml2YXRlIHZvaWQgbWFwX2ZpbGVfbmFtZV9hZGQoY29uc3QgY2hh
ciAqLCBjb25zdCBjaGFyICopOwotcHJpdmF0ZSB2b2lkIG1hcF9maWxlX25hbWVfcmVuKGNvbnN0
IGNoYXIqLCBjb25zdCBjaGFyICosIGNvbnN0IGNoYXIgKik7Ci1wcml2YXRlIHZvaWQgbWFwX2Zp
bGVfbmFtZV9kZWwoY29uc3QgY2hhciAqLCBjb25zdCBjaGFyICopOwotCiBwcml2YXRlIGludAog
aW9kZXZfZGlza25faW5pdChneF9pb19kZXZpY2UgKiBpb2RldiwgZ3NfbWVtb3J5X3QgKiBtZW0p
CiB7CkBAIC0zOTksNDg1ICszMjIsMyBAQAogICAgIHJldHVybiAwOwogfQogCi0vKgotICogT3Bl
biB0aGUgc3BlY2lmaWVkIGZpbGUgd2l0aCBzcGVjaWZpZWQgYXR0cmlidXRlcy4KLSAqCi0gKiBy
b290cGF0aCAtIFBhdGggdG8gYmFzZSBkaXNrIGxvY2F0aW9uLgotICogZmlsZW5hbWUgLSBGaWxl
IG5hbWUgc3RyaW5nCi0gKiBhdHRyaWJ1dGVzIC0gRmlsZSBhdHRyaWJ1dGVzIHN0cmluZwotICog
UmV0dXJucyAtIE5VTEwgaWYgZXJyb3IsIGZpbGUgc3RydWN0dXJlIHBvaW50ZXIgaWYgbm8gZXJy
b3IKLSAqLwotcHJpdmF0ZSBGSUxFICoKLU1hcEZpbGVPcGVuKGNvbnN0IGNoYXIgKiByb290cGF0
aCwgY29uc3QgY2hhciAqIGZpbGVuYW1lLCBjb25zdCBjaGFyICogYXR0cmlidXRlcykKLXsKLSAg
ICBjaGFyIGZ1bGxuYW1lW0JVRkZFUl9MRU5HVEhdOwotCi0gICAgaWYgKHN0cmxlbihyb290cGF0
aCkgKyBzdHJsZW4oZmlsZW5hbWUpID49IEJVRkZFUl9MRU5HVEgpCi0gICAgICAgIHJldHVybiBO
VUxMOwotICAgIHNwcmludGYoZnVsbG5hbWUsICIlcyVzIiwgcm9vdHBhdGgsIGZpbGVuYW1lKTsK
LSAgICByZXR1cm4gZ3BfZm9wZW4oZnVsbG5hbWUsIGF0dHJpYnV0ZXMpOwotfQotCi0vKgotICog
UmVhZCBtYXAgZmlsZSB2ZXJzaW9uIChmaXJzdCBsaW5lKQotICoKLSAqIG1hcGZpbGUgLSBNYXBw
aW5nIGZpbGUgc3RydWN0dXJlIHBvaW50ZXIKLSAqIHZhbHVlIC0gcG9pbnRlciB0byB2ZXJzaW9u
IG51bWJlciBzdG9yYWdlIGxvY2F0aW9uCi0gKiBSZXR1cm5zIDEgaWYgZGF0YSByZWFkLCBlbHNl
IDAKLSAqLwotcHJpdmF0ZSBpbnQKLU1hcEZpbGVSZWFkVmVyc2lvbihGSUxFICogbWFwZmlsZSwg
aW50ICogdmFsdWUpCi17Ci0gICAgaW50IGNvZGUgPSBmc2NhbmYobWFwZmlsZSwgIkZpbGVWZXJz
aW9uXHQlZFx0IiwgdmFsdWUpID09IDEgPyAxIDogMDsKLSAgICBpbnQgYzsKLQotICAgIC8qIFNr
aXAgY29tbWVudCBvbiB2ZXJzaW9uIGxpbmUuICovCi0gICAgZG8gewotCWMgPSBmZ2V0YyhtYXBm
aWxlKTsKLSAgICB9IHdoaWxlIChjICE9IEVPRiAmJiBjICE9ICdcbicgJiYgYyAhPSAnXHInKTsK
LQotICAgIC8qIENsZWFuIHVwIGFueSB0cmFpbGluZyBsaW5lZmVlZHMgb3IgY2FycmlhZ2UgcmV0
dXJucyAqLwotICAgIHdoaWxlIChjICE9IEVPRiAmJiAoYyA9PSAnXG4nIHx8IGMgPT0gJ1xyJykp
IHsKLQljID0gZmdldGMobWFwZmlsZSk7Ci0gICAgfQotICAgIHJldHVybiBjb2RlOwotfQotCi0v
KgotICogV3JpdGUgYSBtYXAgZmlsZSB2ZXJzaW9uIChmaXJzdCBsaW5lKSBpbnRvIHRoZSBtYXAg
ZmlsZQotICoKLSAqIHN0cmVhbSAtIEZpbGUgc3RydWN0dXJlIHBvaW50ZXIKLSAqIHZhbHVlIC0g
dmVyc2lvbiBudW1iZXIKLSAqLwotcHJpdmF0ZSB2b2lkCi1NYXBGaWxlV3JpdGVWZXJzaW9uKEZJ
TEUgKiBtYXBmaWxlLCBpbnQgdmFsdWUpCi17Ci0gICAgZnByaW50ZihtYXBmaWxlLAotICAgIAki
RmlsZVZlcnNpb25cdCVkXHRUaGlzIGZpbGUgaXMgbWFjaGluZSBnZW5lcmF0ZWQuICBEbyBub3Qg
ZWRpdC5cbiIsCi0gICAgCXZhbHVlKTsKLX0KLQotLyoKLSAqIFJlYWQgYW4gZW50cnkgaW4gdGhl
IG1hcCBmaWxlCi0gKgotICogbWFwZmlsZSAtIE1hcHBpbmcgZmlsZSBzdHJ1Y3R1cmUgcG9pbnRl
cgotICogbmFtZWJ1ZiAtIEJ1ZmZlciBmb3IgdGhlIGZpbGUgbmFtZSBzdG9yYWdlCi0gKiB2YWx1
ZSAtIHBvaW50ZXIgdG8gZmlsZSBudW1iZXIgc3RvcmFnZSBsb2NhdGlvbgotICogUmV0dXJucyAx
IGlmIGRhdGEgcmVhZCwgZWxzZSAwCi0gKi8KLXByaXZhdGUgaW50Ci1NYXBGaWxlUmVhZChGSUxF
ICogbWFwZmlsZSwgY2hhciAqIG5hbWVidWYsIGludCAqIHZhbHVlKQotewotICAgIGludCBjb3Vu
dCA9IDA7Ci0gICAgaW50IGM7Ci0KLSAgICAvKiBHZXQgdGhlIGZpbGUgbnVtYmVyICovCi0gICAg
aWYgKGZzY2FuZihtYXBmaWxlLCAiJWRcdCIsIHZhbHVlKSAhPSAxKQotICAgIAlyZXR1cm4gMDsK
LSAgICAKLSAgICAvKiBHZXQgdGhlIGZpbGUgbmFtZSAqLwotICAgIGRvIHsKLQluYW1lYnVmW2Nv
dW50KytdID0gYyA9IGZnZXRjKG1hcGZpbGUpOwotICAgIH0gd2hpbGUgKGNvdW50IDwgQlVGRkVS
X0xFTkdUSCAmJiBjICE9IEVPRiAmJiBjICE9ICdcbicgJiYgYyAhPSAnXHInKTsKLSAgICBuYW1l
YnVmWy0tY291bnRdID0gMDsgICAgLyogVGVybWluYXRlIGZpbGUgbmFtZSAqLwotCi0gICAgLyog
Q2xlYW4gdXAgYW55IHRyYWlsaW5nIGxpbmVmZWVkcyBvciBjYXJyaWFnZSByZXR1cm5zICovCi0g
ICAgd2hpbGUgKGMgIT0gRU9GICYmIChjID09ICdcbicgfHwgYyA9PSAnXHInKSkgewotCWMgPSBm
Z2V0YyhtYXBmaWxlKTsKLSAgICB9Ci0KLSAgICByZXR1cm4gY291bnQgIT0gMCA/IDE6IDA7Ci19
Ci0KLS8qCi0gKiBXcml0ZSBhbiBlbnRyeSBpbiB0aGUgbWFwIGZpbGUKLSAqCi0gKiBzdHJlYW0g
LSBGaWxlIHN0cnVjdHVyZSBwb2ludGVyCi0gKiBuYW1lYnVmIC0gQnVmZmVyIGZvciB0aGUgZmls
ZSBuYW1lIHN0b3JhZ2UKLSAqIHZhbHVlIC0gZmlsZSBudW1iZXIKLSAqLwotcHJpdmF0ZSB2b2lk
Ci1NYXBGaWxlV3JpdGUoRklMRSAqIG1hcGZpbGUsIGNvbnN0IGNoYXIgKiBuYW1lYnVmLCBpbnQg
dmFsdWUpCi17Ci0gICAgZnByaW50ZihtYXBmaWxlLCAiICVkXHQlc1xuIiwgdmFsdWUsIG5hbWVi
dWYpOwotfQotCi0vKgotICogUmVtb3ZlIHRoZSBzcGVjaWZpZWQgZmlsZSAKLSAqCi0gKiByb290
cGF0aCAtIFBhdGggdG8gYmFzZSBkaXNrIGxvY2F0aW9uLgotICogZmlsZW5hbWUgLSBGaWxlIG5h
bWUgc3RyaW5nCi0gKi8KLXByaXZhdGUgdm9pZAotTWFwRmlsZVVubGluayhjb25zdCBjaGFyICog
cm9vdHBhdGgsIGNvbnN0IGNoYXIgKiBmaWxlbmFtZSkKLXsKLSAgICBjaGFyIGZ1bGxuYW1lW0JV
RkZFUl9MRU5HVEhdOwotCi0gICAgaWYgKHN0cmxlbihyb290cGF0aCkgKyBzdHJsZW4oZmlsZW5h
bWUpID49IEJVRkZFUl9MRU5HVEgpCi0gICAgICAgIHJldHVybjsKLSAgICBzcHJpbnRmKGZ1bGxu
YW1lLCAiJXMlcyIsIHJvb3RwYXRoLCBmaWxlbmFtZSk7Ci0gICAgdW5saW5rKGZ1bGxuYW1lKTsK
LX0KLQotLyoKLSAqIFJlbmFtZSB0aGUgc3BlY2lmaWVkIGZpbGUgdG8gbmV3IHNwZWNpZmllZCBu
YW1lCi0gKgotICogcm9vdHBhdGggLSBQYXRoIHRvIGJhc2UgZGlzayBsb2NhdGlvbi4KLSAqIG9s
ZGZpbGVuYW1lIC0gT2xkIGZpbGUgbmFtZSBzdHJpbmcKLSAqIG5ld2ZpbGVuYW1lIC0gTmV3IGZp
bGUgbmFtZSBzdHJpbmcKLSAqLwotcHJpdmF0ZSB2b2lkCi1NYXBGaWxlUmVuYW1lKGNvbnN0IGNo
YXIgKiByb290cGF0aCwgY29uc3QgY2hhciAqIG5ld2ZpbGVuYW1lLCBjb25zdCBjaGFyICogb2xk
ZmlsZW5hbWUpCi17Ci0gICAgY2hhciBvbGRmdWxsbmFtZVtCVUZGRVJfTEVOR1RIXTsKLSAgICBj
aGFyIG5ld2Z1bGxuYW1lW0JVRkZFUl9MRU5HVEhdOwotCi0gICAgaWYgKHN0cmxlbihyb290cGF0
aCkgKyBzdHJsZW4ob2xkZmlsZW5hbWUpID49IEJVRkZFUl9MRU5HVEgpCi0gICAgICAgIHJldHVy
bjsKLSAgICBpZiAoc3RybGVuKHJvb3RwYXRoKSArIHN0cmxlbihuZXdmaWxlbmFtZSkgPj0gQlVG
RkVSX0xFTkdUSCkKLSAgICAgICAgcmV0dXJuOwotICAgIHNwcmludGYob2xkZnVsbG5hbWUsICIl
cyVzIiwgcm9vdHBhdGgsIG9sZGZpbGVuYW1lKTsKLSAgICBzcHJpbnRmKG5ld2Z1bGxuYW1lLCAi
JXMlcyIsIHJvb3RwYXRoLCBuZXdmaWxlbmFtZSk7Ci0gICAgcmVuYW1lKG9sZGZ1bGxuYW1lLCBu
ZXdmdWxsbmFtZSk7Ci19Ci0KLS8qCi0gKiBNYXBUb0ZpbGUKLSAqCi0gKiBTZWFyY2ggZm9yIG1h
cHBlZCBudW1iZXIgZnJvbSBtYXAgZmlsZSB3aXRoIHJlcXVpZWQgbmFtZS4gSWYgc2FtZSBuYW1l
IGV4aXN0LAotICogZmlyc3QgKGxvd2VzdCBudW1iZXIpIHdpbGwgYmUgcmV0dXJuZWQuCi0gKiBy
b290cGF0aCAgICAgICAgY2hhciogICBzdHJpbmcgb2YgdGhlIGJhc2UgcGF0aCB3aGVyZSBpbiBk
aXNrMCByZXNpZGUgKEM6XFBTXERpc2swXCkKLSAqIG5hbWUgICAgICAgICAgICBjaGFyKiAgIHN0
cmluZyB0byBzZWFyY2ggcGF0dGVybiBmb3IgZnVsbCBtYXRjaCAoZm9udFxSeXVtaW4tTGlnaHQp
Ci0gKiByZXR1cm5zCSAgICAtMSBpZiBmaWxlIG5vdCBmb3VuZCwgZmlsZSBudW1iZXIgaWYgZm91
bmQuCi0gKi8KLXByaXZhdGUgaW50Ci1NYXBUb0ZpbGUoY29uc3QgY2hhciogcm9vdHBhdGgsIGNv
bnN0IGNoYXIqIG5hbWUpCi17Ci0gICAgRklMRSAqIG1hcGZpbGU7Ci0gICAgaW50IGQgPSAtMTsK
LSAgICBjaGFyIGZpbGVuYW1lW0JVRkZFUl9MRU5HVEhdOwotICAgIGludCBmaWxlX3ZlcnNpb247
Ci0KLSAgICBtYXBmaWxlID0gTWFwRmlsZU9wZW4ocm9vdHBhdGgsIE1BUF9GSUxFX05BTUUsICJy
Iik7Ci0gICAgaWYgKG1hcGZpbGUgPT0gTlVMTCkKLSAgICAgICAgcmV0dXJuIC0xOwotCi0gICAg
LyogVmVyaWZ5IHRoZSBtYXBwaW5nIGZpbGUgdmVyc2lvbiBudW1iZXIgKi8KLQotICAgIGlmIChN
YXBGaWxlUmVhZFZlcnNpb24obWFwZmlsZSwgJmZpbGVfdmVyc2lvbikKLSAgICAJJiYgZmlsZV92
ZXJzaW9uID09IE1BUF9GSUxFX1ZFUlNJT04pIHsKLQotICAgICAgICAvKiBTY2FuIHRoZSBmaWxl
IGxvb2tpbmcgZm9yIHRoZSBnaXZlbiBuYW1lICovCi0KLSAgICAgICAgd2hpbGUgKE1hcEZpbGVS
ZWFkKG1hcGZpbGUsIGZpbGVuYW1lLCAmZCkpIHsKLSAgICAgICAgICAgIGlmIChzdHJjbXAoZmls
ZW5hbWUsIG5hbWUpID09IDApCi0gICAgCSAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICBkID0g
LTE7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgZmNsb3NlKG1hcGZpbGUpOwotICAgIHJldHVybiBk
OwotfQotCi0vKgotICogbWFwX2ZpbGVfZW51bV9pbml0Ci0gKgotICogY3JlYXRlIGVudW1pYXRl
IHN0cnVjdHVyZSBmb3IgYSBtYXBwZWQgZmlsZSBhbmQgZmlsbCBwYXR0ZXJuIGZvciBzZWFyY2gK
LSAqIHJvb3RfbmFtZSAgICAgICBjaGFyKiAgIHN0cmluZyBvZiB0aGUgYmFzZSBwYXRoIHdoZXJl
IGluIGRpc2swIHJlc2lkZSAoZS5nLiBDOlxQU1xEaXNrMFwpCi0gKiBzZWFyY2hfcGF0dGVybiAg
Y2hhciogICBzdHJpbmcgdG8gc2VhcmNoIHBhdHRlcm4gKGZvbnRcKikgb3IgZnVsbCBtYXRjaAot
ICogICAgICAgICAgICAgICAgICAgICAgICAgIChlLmcuIGZvbnRcUnl1bWluLUxpZ2h0KSBvciBO
VUxMCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCBtZWFucyBhbGwgZmlsZXMKLSAq
IFJldHVybnM6CQkgICAgTlVMTCBpZiBlcnJvciwgZWxzZSBwb2ludGVyIHRvIGVudW1lcmF0aW9u
IHN0cnVjdHVyZS4KLSAqLwotcHJpdmF0ZSB2b2lkICoKLW1hcF9maWxlX2VudW1faW5pdChnc19t
ZW1vcnlfdCAqIG1lbSwgY29uc3QgY2hhciAqIHJvb3RfbmFtZSwgY29uc3QgY2hhciAqIHNlYXJj
aF9wYXR0ZXJuKQotewotICAgIGludCBmaWxlX3ZlcnNpb247Ci0gICAgbWFwX2ZpbGVfZW51bSAq
IG1hcGZpbGVlbnVtID0gZ3NfYWxsb2Nfc3RydWN0KG1lbSwgbWFwX2ZpbGVfZW51bSwgJnN0X21h
cF9maWxlX2VudW0sCi0JCQkgICAJCQkJImRpc2tuOmVudW1faW5pdChmaWxlX2VudW0pIik7Ci0K
LSAgICBpZiAobWFwZmlsZWVudW0gPT0gTlVMTCkKLSAgICAgICAgcmV0dXJuIE5VTEw7Ci0gICAg
bWVtc2V0KG1hcGZpbGVlbnVtLCAwLCBzaXplb2YobWFwX2ZpbGVfZW51bSkpOwotICAgIG1hcGZp
bGVlbnVtLT5tZW1vcnkgPSBtZW07Ci0KLSAgICBpZiAoc2VhcmNoX3BhdHRlcm4pIHsKLSAgICAg
ICAgbWFwZmlsZWVudW0tPnBhdHRlcm4gPSAoY2hhciAqKWdzX2FsbG9jX2J5dGVzKG1lbSwgc3Ry
bGVuKHNlYXJjaF9wYXR0ZXJuKSArIDEsCi0JCQkJCQkJImRpc2tuOmVudW1faW5pdChwYXR0ZXJu
KSIpOwotICAgICAgICBpZiAobWFwZmlsZWVudW0tPnBhdHRlcm4gPT0gTlVMTCkgewotCSAgICBt
YXBfZmlsZV9lbnVtX2Nsb3NlKChmaWxlX2VudW0gKikgbWFwZmlsZWVudW0pOwotICAgICAgICAg
ICAgcmV0dXJuIE5VTEw7Ci0gICAgICAgIH0KLSAgICAgICAgc3RyY3B5KG1hcGZpbGVlbnVtLT5w
YXR0ZXJuLCBzZWFyY2hfcGF0dGVybik7Ci0gICAgfQotCi0gICAgbWFwZmlsZWVudW0tPnJvb3Qg
PSAoY2hhciAqKWdzX2FsbG9jX2J5dGVzKG1lbSwgc3RybGVuKHJvb3RfbmFtZSkgKyAxLCAKLSAg
ICAJCQkJCQkiZGlza246ZW51bV9pbml0KHJvb3QpIik7Ci0gICAgaWYgKG1hcGZpbGVlbnVtLT5y
b290ID09IE5VTEwpIHsKLQltYXBfZmlsZV9lbnVtX2Nsb3NlKChmaWxlX2VudW0gKikgbWFwZmls
ZWVudW0pOwotICAgICAgICByZXR1cm4gTlVMTDsKLSAgICB9Ci0KLSAgICBpZiAoc3RybGVuKHJv
b3RfbmFtZSkgPj0gQlVGRkVSX0xFTkdUSCkKLSAgICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgc3Ry
Y3B5KG1hcGZpbGVlbnVtLT5yb290LCByb290X25hbWUpOwotICAgIG1hcGZpbGVlbnVtLT5zdHJl
YW0gPSBNYXBGaWxlT3Blbihyb290X25hbWUsIE1BUF9GSUxFX05BTUUsICJyIik7Ci0KLSAgICAv
KiBDaGVjayB0aGUgbWFwcGluZyBmaWxlIHZlcnNpb24gbnVtYmVyICovCi0gICAgaWYgKG1hcGZp
bGVlbnVtLT5zdHJlYW0gIT0gTlVMTAotCSYmICghTWFwRmlsZVJlYWRWZXJzaW9uKG1hcGZpbGVl
bnVtLT5zdHJlYW0sICZmaWxlX3ZlcnNpb24pCi0JICAgIHx8IGZpbGVfdmVyc2lvbiAhPSBNQVBf
RklMRV9WRVJTSU9OKSkgewotCWZjbG9zZShtYXBmaWxlZW51bS0+c3RyZWFtKTsgICAvKiBJbnZh
bGlkIGZpbGUgdmVyc2lvbiAqLwotICAgICAgICBtYXBmaWxlZW51bS0+c3RyZWFtID0gTlVMTDsK
LSAgICB9Ci0KLSAgICByZXR1cm4gbWFwZmlsZWVudW07Ci19Ci0KLS8qCi0gKiBtYXBfZmlsZV9l
bnVtX25leHQKLSAqCi0gKiBlbnVtX21lbSAgICAgICAgdm9pZCogICBwb2ludGVyIGZvciBtYXAg
ZmlsZSBlbnVtIHN0cnVjdHVyZQotICogc2VhcmNoX3BhdHRlcm4gIGNoYXIqICAgc3RyaW5nIGFy
cmF5IGZvciBuZXh0IHRhcmdldAotICovCi1wcml2YXRlIGJvb2wKLW1hcF9maWxlX2VudW1fbmV4
dCh2b2lkICogZW51bV9tZW0sIGNoYXIqIHRhcmdldCkKLXsKLSAgICBpbnQgZCA9IC0xOwotICAg
IG1hcF9maWxlX2VudW0gKiBtYXBmaWxlZW51bTsKLQotICAgIGlmIChlbnVtX21lbSA9PSBOVUxM
KQotCXJldHVybiBmYWxzZTsKLQotICAgIG1hcGZpbGVlbnVtID0gKG1hcF9maWxlX2VudW0qKWVu
dW1fbWVtOwotICAgIGlmIChtYXBmaWxlZW51bS0+c3RyZWFtID09IE5VTEwpCi0JcmV0dXJuIGZh
bHNlOwotCi0gICAgaWYgKG1hcGZpbGVlbnVtLT5wYXR0ZXJuKSB7Ci0gICAgICAgIC8qICBTZWFy
Y2ggZm9yIG5leHQgZW50cnkgdGhhdCBtYXRjaGVzIHBhdHRlcm4gKi8KLSAgICAgICAgd2hpbGUg
KE1hcEZpbGVSZWFkKG1hcGZpbGVlbnVtLT5zdHJlYW0sIHRhcmdldCwgJmQpKSB7Ci0gICAgICAg
ICAgICBpZiAoc3RyaW5nX21hdGNoKChieXRlICopdGFyZ2V0LCBzdHJsZW4odGFyZ2V0KSwKLQkJ
CSAgICAgKGJ5dGUgKiltYXBmaWxlZW51bS0+cGF0dGVybiwKLQkJCSAgICAgc3RybGVuKG1hcGZp
bGVlbnVtLT5wYXR0ZXJuKSwgMCkpCi0JCXJldHVybiB0cnVlOwotCX0KLSAgICB9Ci0gICAgZWxz
ZSB7Ci0gICAgICAgIC8qICBKdXN0IGdldCBuZXh0ICovCi0gICAgICAgIGlmIChNYXBGaWxlUmVh
ZChtYXBmaWxlZW51bS0+c3RyZWFtLCB0YXJnZXQsICZkKSkKLSAgICAgICAgICAgIHJldHVybiB0
cnVlOwotICAgIH0KLSAgICByZXR1cm4gZmFsc2U7Ci19Ci0KLS8qIAotICogbWFwX2ZpbGVfZW51
bV9jbG9zZQotICoKLSAqIGNsZWFucyB1cCBhZnRlciBhbiBlbnVtZXJhdGlvbiwgdGhpcyBtYXkg
b25seSBiZSBjYWxsZWQKLSAqIGlmIG1hcF9maWxlX2VudW1faW5pdCBkaWQgbm90IGZhaWwKLSAq
LwotcHJpdmF0ZSB2b2lkCi1tYXBfZmlsZV9lbnVtX2Nsb3NlKHZvaWQgKiBlbnVtX21lbSkKLXsK
LSAgICBtYXBfZmlsZV9lbnVtICogbWFwZmlsZWVudW0gPSAobWFwX2ZpbGVfZW51bSAqKSBlbnVt
X21lbTsKLSAgICBnc19tZW1vcnlfdCAqIG1lbSA9IG1hcGZpbGVlbnVtLT5tZW1vcnk7Ci0KLSAg
ICBpZiAobWFwZmlsZWVudW0tPnN0cmVhbSkKLSAgICAgICAgZmNsb3NlKG1hcGZpbGVlbnVtLT5z
dHJlYW0pOwotICAgIGlmIChtYXBmaWxlZW51bS0+cm9vdCkKLSAgICAgICAgZ3NfZnJlZV9vYmpl
Y3QobWVtLCBtYXBmaWxlZW51bS0+cm9vdCwgImRpc2tuX2VudW1faW5pdChyb290KSIpOwotICAg
IGlmIChtYXBmaWxlZW51bS0+cGF0dGVybikKLQlnc19mcmVlX29iamVjdChtZW0sIG1hcGZpbGVl
bnVtLT5wYXR0ZXJuLCAiZGlza25fZW51bV9pbml0KHBhdHRlcm4pIik7Ci0gICAgZ3NfZnJlZV9v
YmplY3QobWVtLCBtYXBmaWxlZW51bSwgImRpc2tuX2VudW1faW5pdChtYXBmaWxlZW51bSkiKTsK
LX0KLQotLyoKLSAqIG1hcF9maWxlX25hbWVfZ2V0Ci0gKgotICogbWFwcyB0aGUgcHNuYW1lKEZu
YW1lKSB0byB0aGUgb3NuYW1lIHVzaW5nIGNvbmNhdGVuaW5nIHRoZSByb290X25hbWUgYW5kIGlk
Ci0gKiBJZCB3aWxsIGJlIGEgbG93ZXN0IG9uZSBpZiBzYW1lIHBzbmFtZSBleGlzdHMgbW9yZSB0
aGFuIG9uZSBpbiBtYXAgZmlsZS4gU2VlIE1hcFRvRmlsZQotICogZm9yIGRldGFpbC4KLSAqIHJv
b3RfbmFtZSAgICAgICBjaGFyKiAgIHN0cmluZyBvZiB0aGUgYmFzZSBwYXRoIHdoZXJlIGluIGRp
c2swIHJlc2lkZQotICogICAgICAgICAgICAgICAgICAgICAgICAgKGUuZy5DOlxQU1xEaXNrMFwp
Ci0gKiBGbmFtZSAgICAgICAgICAgY2hhciogICBuYW1lIG9mIHRoZSBlbnRyeSB0byBmaW5kIGlu
IHRoZSBtYXAKLSAqIG9zbmFtZSAgICAgICAgICBjaGFyKiAgIHJlc3VsdGluZyBvcyBzcGVjaWZp
YyBwYXRoIHRvIHRoZSBmaWxlCi0gKi8KLXByaXZhdGUgYm9vbAotbWFwX2ZpbGVfbmFtZV9nZXQo
Y29uc3QgY2hhciAqIHJvb3RfbmFtZSwgY29uc3QgY2hhciAqIEZuYW1lLCBjaGFyICogb3NuYW1l
KQotewotICAgIGludCBkID0gTWFwVG9GaWxlKHJvb3RfbmFtZSwgRm5hbWUpOwotCi0gICAgaWYg
KGQgIT0gLTEpIHsKLQkvKiAyMCBjaGFyYWN0ZXJzIGFyZSBlbm91Z2ggZm9yIGV2ZW4gYSA2NCBi
aXQgaW50ZWdlciAqLwotICAgICAgICBpZiAoKHN0cmxlbihyb290X25hbWUpICsgMjApIDwgQlVG
RkVSX0xFTkdUSCkgewotCSAgICBzcHJpbnRmKG9zbmFtZSwgIiVzJWQiLCByb290X25hbWUsIGQp
OwotCSAgICByZXR1cm4gdHJ1ZTsKLQl9Ci0gICAgfQotCi0gICAgKm9zbmFtZSA9IDA7Ci0gICAg
cmV0dXJuIGZhbHNlOwotfQotCi0vKgotICogbWFwX2ZpbGVfbmFtZV9kZWwKLSAqCi0gKiBEZWxl
dGVzIEZuYW1lIGZyb20gdGhlIG1hcHBpbmcgdGFibGUgYW5kIGRvZXMgbm90IGRlbGV0ZSB0aGUg
YWN0dWFsIGZpbGUKLSAqIElmIHNhbWUgRm5hbWUgZXhpc3RzLCBhbGwgc2FtZSBGbmFtZSB3aWxs
IGJlIGRlbGV0ZWQKLSAqIHJvb3RfbmFtZSAgICAgICBjaGFyKiAgIHN0cmluZyBvZiB0aGUgYmFz
ZSBwYXRoIHdoZXJlIGluIGRpc2swIHJlc2lkZSAoQzpcUFNcRGlzazBcKQotICogRm5hbWUgICAg
ICAgICAgIGNoYXIqICAgbmFtZSBvZiB0aGUgZW50cnkgdG8gYWRkIHRvIHRoZSBtYXAKLSAqLwot
cHJpdmF0ZSB2b2lkCi1tYXBfZmlsZV9uYW1lX2RlbChjb25zdCBjaGFyICogcm9vdF9uYW1lLCBj
b25zdCBjaGFyICogRm5hbWUpCi17Ci0gICAgLyogIHNlYXJjaCBmb3IgdGFyZ2V0IGVudHJ5ICov
Ci0gICAgaW50IGQgPSBNYXBUb0ZpbGUocm9vdF9uYW1lLCBGbmFtZSk7Ci0gICAgaW50IGZpbGVf
dmVyc2lvbjsKLQotICAgIGlmIChkICE9IC0xKSB7CQkJIC8qIGlmIHRoZSBmaWxlIGV4aXN0cyAu
Li4gKi8KLSAgICAgICAgY2hhciAgICBuYW1lW0JVRkZFUl9MRU5HVEhdOwotICAgICAgICBGSUxF
KiAgIG5ld01hcDsKLSAgICAgICAgRklMRSogICBvbGRNYXA7Ci0KLQkvKiBPcGVuIGN1cnJlbnQg
bWFwIGZpbGUgYW5kIGEgd29ya2luZyBmaWxlICovCi0KLSAgICAgICAgTWFwRmlsZVVubGluayhy
b290X25hbWUsIFRFTVBfRklMRV9OQU1FICk7Ci0gICAgICAgIG5ld01hcCA9IE1hcEZpbGVPcGVu
KHJvb3RfbmFtZSwgVEVNUF9GSUxFX05BTUUsICJ3Iik7Ci0gICAgICAgIGlmIChuZXdNYXAgPT0g
TlVMTCkKLQkgICAgcmV0dXJuOwotICAgICAgICBvbGRNYXAgPSBNYXBGaWxlT3Blbihyb290X25h
bWUsIE1BUF9GSUxFX05BTUUsICJyIik7Ci0gICAgICAgIGlmIChvbGRNYXAgIT0gTlVMTCAmJiAo
IU1hcEZpbGVSZWFkVmVyc2lvbihvbGRNYXAsICZmaWxlX3ZlcnNpb24pCi0JICAgIHx8IGZpbGVf
dmVyc2lvbiAhPSBNQVBfRklMRV9WRVJTSU9OKSkgewotICAgICAgICAgICAgZmNsb3NlKG9sZE1h
cCk7Ci0JICAgIG9sZE1hcD0gTlVMTDsKLQl9Ci0gICAgICAgIGlmIChvbGRNYXAgPT0gTlVMTCkg
ewotICAgICAgICAgICAgZmNsb3NlKG5ld01hcCk7Ci0gICAgICAgICAgICBNYXBGaWxlVW5saW5r
KHJvb3RfbmFtZSwgVEVNUF9GSUxFX05BTUUpOwotCSAgICByZXR1cm47Ci0gICAgICAgIH0KLQot
CS8qIENvcHkgZXZlcnkgbGluZSBvZiB0aGUgbWFwIGZpbGUgZXhjZXB0IHRoZSBvbmUgd2l0aCBn
aXZlbiBuYW1lICovCi0KLSAgICAgICAgTWFwRmlsZVdyaXRlVmVyc2lvbihuZXdNYXAsIE1BUF9G
SUxFX1ZFUlNJT04pOwotICAgICAgICB3aGlsZSAoTWFwRmlsZVJlYWQob2xkTWFwLCBuYW1lLCAm
ZCkpCi0gICAgICAgICAgICBpZiAoc3RyY21wKG5hbWUsIEZuYW1lKSkKLSAgICAgICAgICAgICAg
ICBNYXBGaWxlV3JpdGUobmV3TWFwLCBuYW1lLCBkKTsKLSAgICAgICAgZmNsb3NlKG5ld01hcCk7
Ci0gICAgICAgIGZjbG9zZShvbGRNYXApOwotICAgICAgICBNYXBGaWxlVW5saW5rKHJvb3RfbmFt
ZSwgTUFQX0ZJTEVfTkFNRSk7Ci0gICAgICAgIE1hcEZpbGVSZW5hbWUocm9vdF9uYW1lLCBNQVBf
RklMRV9OQU1FLCBURU1QX0ZJTEVfTkFNRSk7Ci0gICAgfQotfQotCi0vKgotICogbWFwX2ZpbGVf
YWRkCi0gKgotICogYWRkcyBGbmFtZSB0byB0aGUgbWFwcGluZyB0YWJsZSBhbmQgZG9lcyBub3Qg
Y3JlYXRlIGFuIHVuaXF1ZSBuZXcgZW1wdHkgZmlsZQotICogSWYgc2FtZSBGbmFtZSBleGlzdHMs
IG5ldyBGbmFtZSB3aWxsIG5vdCBiZSBhZGRlZC4KLSAqIHJvb3RfbmFtZSAgICAgICBjaGFyKiAg
IHN0cmluZyBvZiB0aGUgYmFzZSBwYXRoIHdoZXJlIGluIGRpc2swIHJlc2lkZSAoQzpcUFNcRGlz
azBcKQotICogRm5hbWUgICAgICAgICAgIGNoYXIqICAgbmFtZSBvZiB0aGUgZW50cnkgdG8gYWRk
IHRvIHRoZSBtYXAKLSAqLwotcHJpdmF0ZSB2b2lkCi1tYXBfZmlsZV9uYW1lX2FkZChjb25zdCBj
aGFyICogcm9vdF9uYW1lLCBjb25zdCBjaGFyICogRm5hbWUpCi17Ci0gICAgLyogCi0gICAgICog
YWRkIGVudHJ5IHRvIG1hcCBmaWxlCi0gICAgICogZW50cnkgbnVtYmVyIGlzIG9uZSBncmVhdGVy
IHRoYW4gYmlnZ2VzdCBudW1iZXIKLSAgICAgKi8KLSAgICBjaGFyICAgIG5hbWVbQlVGRkVSX0xF
TkdUSF07Ci0gICAgaW50IGQ7Ci0gICAgaW50IGRtYXggPSAtMTsKLSAgICBpbnQgZmlsZV92ZXJz
aW9uOwotICAgIEZJTEUqICAgbmV3TWFwOwotICAgIEZJTEUqICAgb2xkTWFwOwotICAgIAotICAg
IG9sZE1hcCA9IE1hcEZpbGVPcGVuKHJvb3RfbmFtZSwgTUFQX0ZJTEVfTkFNRSwgInIiKTsKLSAg
ICBpZiAob2xkTWFwICE9IE5VTEwgJiYgKCFNYXBGaWxlUmVhZFZlcnNpb24ob2xkTWFwLCAmZmls
ZV92ZXJzaW9uKQotCXx8IGZpbGVfdmVyc2lvbiAhPSBNQVBfRklMRV9WRVJTSU9OKSkgewotICAg
ICAgICBmY2xvc2Uob2xkTWFwKTsKLQlvbGRNYXAgPSBOVUxMOwotICAgIH0KLSAgICBpZiAob2xk
TWFwID09IE5VTEwpIHsKLSAgICAgICAgb2xkTWFwID0gTWFwRmlsZU9wZW4ocm9vdF9uYW1lLCBN
QVBfRklMRV9OQU1FLCAidyIpOwotCWlmICghb2xkTWFwKSAKLQkgICAgcmV0dXJuOwotICAgICAg
ICBNYXBGaWxlV3JpdGVWZXJzaW9uKG9sZE1hcCwgTUFQX0ZJTEVfVkVSU0lPTik7Ci0gICAgICAg
IE1hcEZpbGVXcml0ZShvbGRNYXAsIEZuYW1lLCBJbml0aWFsTnVtYmVyKTsKLSAgICAgICAgZmNs
b3NlKG9sZE1hcCk7Ci0gICAgfQotICAgIGVsc2UgewotICAgICAgICBNYXBGaWxlVW5saW5rKHJv
b3RfbmFtZSwgVEVNUF9GSUxFX05BTUUpOwotICAgICAgICBuZXdNYXAgPSBNYXBGaWxlT3Blbihy
b290X25hbWUsIFRFTVBfRklMRV9OQU1FLCAidyIpOwotICAgICAgICBpZiAobmV3TWFwICE9IE5V
TEwpIHsKLSAgICAgICAgICAgIE1hcEZpbGVXcml0ZVZlcnNpb24obmV3TWFwLCBNQVBfRklMRV9W
RVJTSU9OKTsKLSAgICAgICAgICAgIHdoaWxlIChNYXBGaWxlUmVhZChvbGRNYXAsIG5hbWUsICZk
KSkgewotICAgICAgICAJTWFwRmlsZVdyaXRlKG5ld01hcCwgbmFtZSwgZCk7Ci0gICAgICAgICAg
ICAgICAgaWYgKGRtYXggPCBkKQotICAgICAgICAgICAgICAgICAgICBkbWF4ID0gZDsKLSAgICAg
ICAgICAgIH0KLQotICAgICAgICAgICAgZG1heCArPSAxOwotICAgICAgICAgICAgTWFwRmlsZVdy
aXRlKG5ld01hcCwgRm5hbWUsIGRtYXgpOwotICAgICAgICAgICAgZmNsb3NlKG5ld01hcCk7Ci0g
ICAgICAgICAgICBmY2xvc2Uob2xkTWFwKTsKLSAgICAgICAgICAgIE1hcEZpbGVVbmxpbmsocm9v
dF9uYW1lLCBNQVBfRklMRV9OQU1FKTsKLSAgICAgICAgICAgIE1hcEZpbGVSZW5hbWUocm9vdF9u
YW1lLCBNQVBfRklMRV9OQU1FLCBURU1QX0ZJTEVfTkFNRSk7Ci0gICAgICAgIH0KLSAgICB9Ci19
Ci0KLS8qCi0gKiBtYXBfZmlsZV9uYW1lX3JlbgotICoKLSAqIHJlbmFtZXMgdGhlIG9sZG5hbWUg
aW50byBuZXduYW1lIGluIHRoZSBtYXBwaW5nIHRhYmxlLiBuZXduYW1lIG11c3Qgbm90IGV4aXN0
IGFuZCBtdXN0IGJlCi0gKiBjaGVja2VkIGJ5IHRoZSBjYWxsZXIuIElmIHNhbWUgbmFtZSBleGlz
dCwgYWxsIHNhbWUgbmFtZSB3aWxsIGJlIHJlbmFtZWQuCi0gKiByb290X25hbWUgICAgICAgY2hh
ciogICBzdHJpbmcgb2YgdGhlIGJhc2UgcGF0aCB3aGVyZSBpbiBkaXNrMCByZXNpZGUgKEM6XFBT
XERpc2swXCkKLSAqIG9sZG5hbWUgICAgICAgICBjaGFyKiAgIG5hbWUgY3VycmVudGx5IGV4aXN0
aW5nIGluIHRoZSBtYXAKLSAqIG5ld25hbWUgICAgICAgICBjaGFyKiAgIG5hbWUgdG8gY2hhbmdl
IHRoZSBlbnRyeSBpbmRpY2F0ZWQgYnkgb2xkbmFtZSBpbnRvCi0gKi8KLXByaXZhdGUgdm9pZAot
bWFwX2ZpbGVfbmFtZV9yZW4oY29uc3QgY2hhciogcm9vdF9uYW1lLCBjb25zdCBjaGFyICogb2xk
bmFtZSwgY29uc3QgY2hhciAqIG5ld25hbWUpCi17ICAgCi0gICAgLyogIHNlYXJjaCBmb3IgdGFy
Z2V0IGVudHJ5ICovCi0KLSAgICBpbnQgZCA9IE1hcFRvRmlsZShyb290X25hbWUsIG9sZG5hbWUp
OwotICAgIGludCBmaWxlX3ZlcnNpb247Ci0KLSAgICBpZiAoZCAhPSAtMSkgeyAJCS8qIGlmIHRh
cmdldCBleGlzdHMgLi4uICovCi0gICAgICAgIGNoYXIgICAgbmFtZVtCVUZGRVJfTEVOR1RIXTsK
LSAgICAgICAgRklMRSogICBuZXdNYXA7Ci0gICAgICAgIEZJTEUqICAgb2xkTWFwOwotICAgICAg
ICAKLQkvKiBPcGVuIGN1cnJlbnQgbWFwIGZpbGUgYW5kIGEgd29ya2luZyBmaWxlICovCi0KLSAg
ICAgICAgTWFwRmlsZVVubGluayhyb290X25hbWUsIFRFTVBfRklMRV9OQU1FICk7Ci0gICAgICAg
IG5ld01hcCA9IE1hcEZpbGVPcGVuKHJvb3RfbmFtZSwgVEVNUF9GSUxFX05BTUUsICJ3Iik7Ci0g
ICAgICAgIGlmIChuZXdNYXAgPT0gTlVMTCkKLQkgICAgcmV0dXJuOwotICAgICAgICBvbGRNYXAg
PSBNYXBGaWxlT3Blbihyb290X25hbWUsIE1BUF9GSUxFX05BTUUsICJyIik7Ci0gICAgICAgIGlm
IChvbGRNYXAgIT0gTlVMTCAmJiAoIU1hcEZpbGVSZWFkVmVyc2lvbihvbGRNYXAsICZmaWxlX3Zl
cnNpb24pCi0JICAgIHx8IGZpbGVfdmVyc2lvbiAhPSBNQVBfRklMRV9WRVJTSU9OKSkgewotICAg
ICAgICAgICAgZmNsb3NlKG9sZE1hcCk7Ci0JICAgIG9sZE1hcD0gTlVMTDsKLQl9Ci0gICAgICAg
IGlmIChvbGRNYXAgPT0gTlVMTCkgewotICAgICAgICAgICAgZmNsb3NlKG5ld01hcCk7Ci0gICAg
ICAgICAgICBNYXBGaWxlVW5saW5rKHJvb3RfbmFtZSwgVEVNUF9GSUxFX05BTUUpOwotCSAgICBy
ZXR1cm47Ci0gICAgICAgIH0KLQotCS8qIE5vdyBjb3B5IGRhdGEgZnJvbSBvbGQgdG8gbmV3LCBj
aGFuZ2UgZmlsZSBuYW1lIHdoZW4gZm91bmQgKi8KLQotICAgICAgICBNYXBGaWxlV3JpdGVWZXJz
aW9uKG5ld01hcCwgTUFQX0ZJTEVfVkVSU0lPTik7ICAvKiBDb3B5IHRoZSB2ZXJzaW9uIG51bWJl
ciAqLwotICAgICAgICB3aGlsZSAoTWFwRmlsZVJlYWQob2xkTWFwLCBuYW1lLCAmZCkpCi0gICAg
ICAgICAgICBpZiAoc3RyY21wKG5hbWUsIG9sZG5hbWUpKQotICAgICAgICAgICAgICAgIE1hcEZp
bGVXcml0ZShuZXdNYXAsIG5hbWUsIGQpOwotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAg
ICAgIE1hcEZpbGVXcml0ZShuZXdNYXAsIG5ld25hbWUsIGQpOwotICAgICAgICBmY2xvc2UobmV3
TWFwKTsKLSAgICAgICAgZmNsb3NlKG9sZE1hcCk7Ci0gICAgICAgIE1hcEZpbGVVbmxpbmsocm9v
dF9uYW1lLCBNQVBfRklMRV9OQU1FKTsKLSAgICAgICAgTWFwRmlsZVJlbmFtZShyb290X25hbWUs
IE1BUF9GSUxFX05BTUUsIFRFTVBfRklMRV9OQU1FKTsKLSAgICB9Ci19CkluZGV4OiBzcmMvZ3Np
b21hcC5jCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT0KLS0tIHNyYy9nc2lvbWFwLmMJKC4uLi90YWdzL2dzOC41NCkJKHJl
dmlzaW9uIDApCisrKyBzcmMvZ3Npb21hcC5jCSguLi4vdHJ1bmsvZ3MpCShyZXZpc2lvbiAyMikK
QEAgLTAsMCArMSw1ODQgQEAKKy8qIENvcHlyaWdodCAoQykgMjAwMS0yMDA2IGFydG9mY29kZSBM
TEMuCisgICBBbGwgUmlnaHRzIFJlc2VydmVkLgorICAKKyAgIFRoaXMgc29mdHdhcmUgaXMgcHJv
dmlkZWQgQVMtSVMgd2l0aCBubyB3YXJyYW50eSwgZWl0aGVyIGV4cHJlc3Mgb3IKKyAgIGltcGxp
ZWQuCisKKyAgIFRoaXMgc29mdHdhcmUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgbGljZW5zZSBhbmQg
bWF5IG5vdCBiZSBjb3BpZWQsIG1vZGlmaWVkCisgICBvciBkaXN0cmlidXRlZCBleGNlcHQgYXMg
ZXhwcmVzc2x5IGF1dGhvcml6ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoYXQKKyAgIGxpY2Vuc2Uu
ICBSZWZlciB0byBsaWNlbnNpbmcgaW5mb3JtYXRpb24gYXQgaHR0cDovL3d3dy5hcnRpZmV4LmNv
bS8KKyAgIG9yIGNvbnRhY3QgQXJ0aWZleCBTb2Z0d2FyZSwgSW5jLiwgIDcgTXQuIExhc3NlbiBE
cml2ZSAtIFN1aXRlIEEtMTM0LAorICAgU2FuIFJhZmFlbCwgQ0EgIDk0OTAzLCBVLlMuQS4sICsx
KDQxNSk0OTItOTg2MSwgZm9yIGZ1cnRoZXIgaW5mb3JtYXRpb24uCisqLworCisvKiRJZDogZ3Np
b21hcC5jIDY2NTEgMjAwNi0wMy0xMyAxNjoxODoxOVogc3RlZmFuICQgKi8KKy8qICVkaXNrKiUg
YW5kICVyYW0qJSBwb3J0YWJsZSBmaWxlbmFtZSBtYXBwaW5nIGNvZGUgKi8KKworLyoKKyAqIE1h
cCBmaWxlIHN1cHBvcnQKKyAqCisgKiBEdWUgdG8gY29uZmxpY3RzIGJldHdlZW4gZmlsZSBuYW1l
IGZvcm1hdHMgKG5hbWUgbGVuZ3RocywgcmVzdHJpY3RlZAorICogY2hhcmFjdGVycywgZXRjLikg
YSAnbWFwcGluZyBmaWxlJyAobWFwLnR4dCkgaXMgdXNlZCB0byB0cmFuc2xhdGUKKyAqIGJldHdl
ZW4gYSBsb2dpY2FsIGZpbGUgbmFtZSBhbmQgYSByZWFsIGZpbGUgbmFtZSBvbiB0aGUgc3lzdGVt
LgorICogVGhpcyBuYW1lIHRyYW5zbGF0aW9uIGFsc28gZmxhdHRlbnMgdGhlIGRpcmVjdG9yeSBz
dHJ1Y3R1cmUgb2YgdGhlCisgKiBsb2dpY2FsIGZpbGUgbmFtZXMuICAoVGhpcyBtYXkgYmUgY2hh
bmdlZCBpbiB0aGUgZnV0dXJlLiAgQnV0IGZvcgorICogbm93IGl0IG1ha2VzIHRoZSBpbXBsZW1l
bnRhdGlvbiBlYXNpZXIuKQorICoKKyAqIE1hcHBpbmcgZmlsZToKKyAqCisgKiBUaGUgbWFwcGlu
ZyBmaWxlIGlzIHVzZWQgdG8gY3JlYXRlIGEgJ2ZsYXQgZGlzaycgZmlsZSBzdHJ1Y3R1cmUuICBB
bGwgZmlsZQorICogYXJlIHN0b3JlZCBpbiBhIHNpbmdsZSBkaXJlY3RvcnkuICBUbyBhY2NvbXBs
aXNoIHRoaXMsIHRoZSBsb2dpY2FsIGZpbGUKKyAqIG5hbWUsIGluY2x1ZGluZyB0aGUgcGF0aCwg
YXJlIHN0b3JlZCBpbiBhICdtYXBwaW5nIGZpbGUnLiAgRm9yIGVhY2ggZmlsZSBpbgorICogZmxh
dCBkaXNrLCB0aGVyZSBpcyBhIHNpbmdsZSBsaW5lIGVudHJ5IGluIHRoZSBtYXBwaW5nIGZpbGUu
ICBUaGUgbWFwcGluZworICogZmlsZSBlbnRyeSBhbHNvIGluY2x1ZGVzIGEgZmlsZSBudW1iZXIg
dmFsdWUuICBUaGlzIGZpbGUgbnVtYmVyIGlzIHVzZWQgYXMKKyAqIHRoZSBhY3R1YWwgZmlsZSBu
YW1lIGluIHRoZSBmbGF0IGRpc2sgZGlyZWN0b3J5LgorICoKKyAqIFRoZSBmbGF0IGRpc2sgZm9y
bWF0IGFuZCB0aGUgbWFwcGluZyBmaWxlIGFyZSB1c2VkIHRvIGVsaW1pbmF0ZSBwcm9ibGVtcwor
ICogd2l0aCB0cnlpbmcgdG8gZW11bGF0ZSBhIGxvZ2ljYWwgZGlyZWN0b3J5IHN0cnVjdHVyZSBv
biBkaWZmZXJlbnQgb3BlcmF0aW5nCisgKiBzeXN0ZW1zIHdoaWNoIGhhdmUgZGlmZmVyZW50IHJ1
bGVzIGFib3V0IHdoYXQgaXMgYWxsb3dlZCBhbmQgbm90IGFsbG93ZWQKKyAqIGluIGEgZmlsZSBu
YW1lIGFuZCBwYXRoLgorICoKKyAqIE1hcHBpbmcgZmlsZSBmb3JtYXQ6CisgKgorICogRmlyc3Qg
bGluZToKKyAqIEZpbGVWZXJzaW9uPHRhYj4xPHRhYj5UaGlzIGZpbGUgaXMgbWFjaGluZSBnZW5l
cmF0ZWQuIE5vIG5vdCBlZGl0LjxuZXdsaW5lPgorICoKKyAqIFJlbWFpbmluZyBsaW5lczoKKyAq
IDxzcGFjZT5maWxlbnVtYmVyPHRhYj5maWxlX25hbWU8bmV3bGluZT4KKyAqCisgKiBUaGUgZmly
c3QgbGluZSBvZiB0aGUgbWFwcGluZyBmaWxlIGNvbnRhaW5zIHRoZSB0ZXh0ICJGaWxlVmVyc2lv
biIgZm9sbG93ZWQKKyAqIGJ5IGEgdGFiIGNoYXJhY3Rlci4gVGhlbiB0aGUgbnVtYmVyIDEgKGFz
Y2lpIC0gMzEgaGV4KSBmb2xsb3dlZCBieSBhIHRhYgorICogYW5kIHRoZW4gYSBzaG9ydCBtZXNz
YWdlIHRlbGxpbmcgcGVvcGxlIHRvIG5vdCBlZGl0IHRoZSBmaWxlLiAgVGhpcyBpcyBhbgorICog
YXR0ZW1wdCB0byBrZWVwIHRoZSBtYXBwaW5nIGZpbGUgZnJvbSBiZWluZyBjb3JydXB0ZWQuCisg
KgorICogVGhlIGZpbGUgdmVyc2lvbiBudW1iZXIgbXVzdCBiZSBhICIxIi4gIFRoaXMgaXMgdGhl
IG9ubHkgdmVyc2lvbiBjdXJyZW50bHkKKyAqIHN1cHBvcnRlZC4gIFRoaXMgbGluZSBleGlzdHMg
aW4gY2FzZSBpdCBpcyBuZWNlc3NhcnkgdG8gbW9kaWZ5IHRoZSBtYXBwaW5nCisgKiBmaWxlIGZv
cm1hdCBhdCBzb21lIGZ1dHVyZSBkYXRlLiAgVGhlIHByZXNlbmNlIG9mIGEgdmVyc2lvbiBudW1i
ZXIgYWxsb3dzCisgKiBmb3Igc2VhbWxlc3MgdXBncmFkaW5nIG9mIHRoZSBmaWxlIGZvcm1hdC4K
KyAqCisgKiBUaGUgZm9ybWF0IG9mIHRoZSBlbnRyeSBsaW5lcyBoYXMgYmVlbiBjcmVhdGVkIHNv
IHRoYXQgdGhlIHJlYWQgZW50cnkKKyAqIHJvdXRpbmUgd291bGQ6CisgKiAxLiBHcmFiIHRoZSBu
dW1iZXIgKGluY2x1ZGluZyB0aGUgc3BhY2UgaWYgaXQgaGFzIG5vdCBhbHJlYWR5IGJlZW4gcmVh
ZC4pCisgKiAyLiBHcmFiIHRoZSB0YWIKKyAqIDMuIEdyYWIgZXZlcnl0aGluZyB1cCB0byBhIGxp
bmVmZWVkIG9yIGNhcnJpYWdlIHJldHVybiBhcyB0aGUgZmlsZSBuYW1lLgorICogNC4gR3JhYiBh
bnkgcmVtYWluaW5nIGxpbmVmZWVkcy9jYXJyaWFnZSByZXR1cm5zLiBOb3RlIHRoaXMgc3RlcCBt
aWdodAorICogZ3JhYiB0aGUgZmlyc3QgY2hhcmFjdGVyIG9mIHRoZSBuZXh0IGxpbmUgaWYgdGhl
cmUgaXMgb25seSBhIHNpbmdsZQorICogY2FycmlhZ2UgcmV0dXJuIG9yIGxpbmVmZWVkLiAgU2lu
Y2UgaXQgaXMgbm90IGRlc2lyZWFibGUgdG8gaGF2ZSB0byB3b3JyeQorICogYWJvdXQgZG9pbmcg
YW4gJ3VuZ2V0IGNoYXJhY3RlcicsIGFuIGV4dHJhIHNwYWNlIGhhcyBiZWVuIHB1dCBhdCB0aGUK
KyAqIGJlZ2lubmluZyBvZiBlYWNoIGxpbmUuICBUaGUgZXh0cmEgbG9naWMgd2l0aCB0aGUgbGlu
ZWZlZWQvY2FycmlhZ2UgcmV0dXJuCisgKiBpcyBwcmltYXJpbHkgdGhlcmUgaW4gY2FzZSBzb21l
b25lIGFjY2lkZW50YWxseSBtYW5nbGVzIHRoZSBmaWxlIGJ5IGxvb2tpbmcKKyAqIGF0IGl0IHdp
dGggYSB0ZXh0IGVkaXRvci4KKyAqCisgKiBUaGlzIGJhc2ljYWxseSBhbGxvd3MgZm9yIGFueSBm
aWxlIG5hbWUgZXhjZXB0IG9uZSB0aGF0IGluY2x1ZGVzCisgKiBhIHplcm8sIGEgY2FycmlhZ2Ug
cmV0dXJuLCBvciBhIGxpbmVmZWVkLiAgVGhlIHJlcXVpcmVtZW50IGZvciBleGNsdWRpbmcKKyAq
IHplcm8gaXMgdGhhdCB0aGVyZSBhcmUgdG9vIG1hbnkgQyBzdHJpbmcgcm91dGluZXMgdGhhdCBh
c3N1bWUgemVybyBpcworICogYSBzdHJpbmcgdGVybWluYXRvciAoaW5jbHVkaW5nIG11Y2ggb2Yg
dGhlIGN1cnJlbnQgR2hvc3RzY3JpcHQgY29kZSBhbmQKKyAqIHRoZSBjdXJyZW50IG1hcCBoYW5k
bGVyKS4gIFRoZSBjYXJyaWFnZSByZXR1cm4vbGluZWZlZWQgcmVxdWlyZW1lbnQgaXMKKyAqIHRo
ZXJlIHNpbXBseSBiZWNhdXNlIGl0IGlzIGJlaW5nIHVzZWQgYXMgYSB0ZXJtaW5hdG9yIGZvciB0
aGUgZmlsZSBuYW1lLgorICogSXQgY291bGQgZWFzaWx5IGJlIGVsaW1pbmF0ZWQgYnkgYWRkaW5n
IGEgemVybyBhcyB0aGUgbmFtZSB0ZXJtaW5hdG9yLgorICogVGhlIG9ubHkgZGlzYWR2YW50YWdl
IGlzIHRoYXQgdGhlIGZpbGUgaXMgbm8gbG9uZ2VyIHRvdGFsbHkgcHJpbnRhYmxlIGFzY2lpLgor
ICoKKyAqIEEgc3BlY2lhbCB0aGFua3MgaXMgZ2l2ZW4gZm9yIE5vcml5dWtpIE1hdHN1c2hpbWEg
Zm9yIGhpcyBjcmVhdGlvbiBvZgorICogdGhlIG9yaWdpbmFsIHZlcnNpb24gb2YgdGhlIG1hcHBp
bmcgZmlsZSBsb2dpYy4KKyAqLyAKKworI2luY2x1ZGUgImVycm5vXy5oIgorI2luY2x1ZGUgInN0
cmluZ18uaCIKKyNpbmNsdWRlICJ1bmlzdGRfLmgiCisjaW5jbHVkZSAiZ3guaCIKKyNpbmNsdWRl
ICJnc2Vycm9ycy5oIgorI2luY2x1ZGUgImdwLmgiCisjaW5jbHVkZSAiZ3NjZGVmcy5oIgorI2lu
Y2x1ZGUgImdzcGFyYW0uaCIKKyNpbmNsdWRlICJnc3N0cnVjdC5oIgorI2luY2x1ZGUgImd4aW9k
ZXYuaCIKKyNpbmNsdWRlICJnc3V0aWwuaCIKKyNpbmNsdWRlICJnc2lvbWFwLmgiCisKKworZ3Nf
cHVibGljX3N0X3B0cnMyKHN0X21hcF9maWxlX2VudW0sIHN0cnVjdCBtYXBfZmlsZV9lbnVtX3Ms
ICJtYXBfZmlsZV9lbnVtIiwKKyAgICBtYXBfZmlsZV9lbnVtX2VudW1fcHRycywgbWFwX2ZpbGVf
ZW51bV9yZWxvY19wdHJzLCBwYXR0ZXJuLCByb290KTsKKworCisvKgorICogT3BlbiB0aGUgc3Bl
Y2lmaWVkIGZpbGUgd2l0aCBzcGVjaWZpZWQgYXR0cmlidXRlcy4KKyAqCisgKiByb290cGF0aCAt
IFBhdGggdG8gYmFzZSBkaXNrIGxvY2F0aW9uLgorICogZmlsZW5hbWUgLSBGaWxlIG5hbWUgc3Ry
aW5nCisgKiBhdHRyaWJ1dGVzIC0gRmlsZSBhdHRyaWJ1dGVzIHN0cmluZworICogUmV0dXJucyAt
IE5VTEwgaWYgZXJyb3IsIGZpbGUgc3RydWN0dXJlIHBvaW50ZXIgaWYgbm8gZXJyb3IKKyAqLwor
cHJpdmF0ZSBGSUxFICoKK01hcEZpbGVPcGVuKGNvbnN0IGNoYXIgKiByb290cGF0aCwgY29uc3Qg
Y2hhciAqIGZpbGVuYW1lLCBjb25zdCBjaGFyICogYXR0cmlidXRlcykKK3sKKyAgICBjaGFyIGZ1
bGxuYW1lW0JVRkZFUl9MRU5HVEhdOworCisgICAgaWYgKHN0cmxlbihyb290cGF0aCkgKyBzdHJs
ZW4oZmlsZW5hbWUpID49IEJVRkZFUl9MRU5HVEgpCisgICAgICAgIHJldHVybiBOVUxMOworICAg
IHNucHJpbnRmKGZ1bGxuYW1lLCBCVUZGRVJfTEVOR1RILCAiJXMlcyIsIHJvb3RwYXRoLCBmaWxl
bmFtZSk7CisgICAgcmV0dXJuIGdwX2ZvcGVuKGZ1bGxuYW1lLCBhdHRyaWJ1dGVzKTsKK30KKwor
LyoKKyAqIFJlYWQgbWFwIGZpbGUgdmVyc2lvbiAoZmlyc3QgbGluZSkKKyAqCisgKiBtYXBmaWxl
IC0gTWFwcGluZyBmaWxlIHN0cnVjdHVyZSBwb2ludGVyCisgKiB2YWx1ZSAtIHBvaW50ZXIgdG8g
dmVyc2lvbiBudW1iZXIgc3RvcmFnZSBsb2NhdGlvbgorICogUmV0dXJucyAxIGlmIGRhdGEgcmVh
ZCwgZWxzZSAwCisgKi8KK3ByaXZhdGUgaW50CitNYXBGaWxlUmVhZFZlcnNpb24oRklMRSAqIG1h
cGZpbGUsIGludCAqIHZhbHVlKQoreworICAgIGludCBjb2RlID0gZnNjYW5mKG1hcGZpbGUsICJG
aWxlVmVyc2lvblx0JWRcdCIsIHZhbHVlKSA9PSAxID8gMSA6IDA7CisgICAgaW50IGM7CisKKyAg
ICAvKiBTa2lwIGNvbW1lbnQgb24gdmVyc2lvbiBsaW5lLiAqLworICAgIGRvIHsKKwljID0gZmdl
dGMobWFwZmlsZSk7CisgICAgfSB3aGlsZSAoYyAhPSBFT0YgJiYgYyAhPSAnXG4nICYmIGMgIT0g
J1xyJyk7CisKKyAgICAvKiBDbGVhbiB1cCBhbnkgdHJhaWxpbmcgbGluZWZlZWRzIG9yIGNhcnJp
YWdlIHJldHVybnMgKi8KKyAgICB3aGlsZSAoYyAhPSBFT0YgJiYgKGMgPT0gJ1xuJyB8fCBjID09
ICdccicpKSB7CisJYyA9IGZnZXRjKG1hcGZpbGUpOworICAgIH0KKyAgICByZXR1cm4gY29kZTsK
K30KKworLyoKKyAqIFdyaXRlIGEgbWFwIGZpbGUgdmVyc2lvbiAoZmlyc3QgbGluZSkgaW50byB0
aGUgbWFwIGZpbGUKKyAqCisgKiBzdHJlYW0gLSBGaWxlIHN0cnVjdHVyZSBwb2ludGVyCisgKiB2
YWx1ZSAtIHZlcnNpb24gbnVtYmVyCisgKi8KK3ByaXZhdGUgdm9pZAorTWFwRmlsZVdyaXRlVmVy
c2lvbihGSUxFICogbWFwZmlsZSwgaW50IHZhbHVlKQoreworICAgIGZwcmludGYobWFwZmlsZSwK
KyAgICAJIkZpbGVWZXJzaW9uXHQlZFx0VGhpcyBmaWxlIGlzIG1hY2hpbmUgZ2VuZXJhdGVkLiAg
RG8gbm90IGVkaXQuXG4iLAorICAgIAl2YWx1ZSk7Cit9CisKKy8qCisgKiBSZWFkIGFuIGVudHJ5
IGluIHRoZSBtYXAgZmlsZQorICoKKyAqIG1hcGZpbGUgLSBNYXBwaW5nIGZpbGUgc3RydWN0dXJl
IHBvaW50ZXIKKyAqIG5hbWVidWYgLSBCdWZmZXIgZm9yIHRoZSBmaWxlIG5hbWUgc3RvcmFnZQor
ICogdmFsdWUgLSBwb2ludGVyIHRvIGZpbGUgbnVtYmVyIHN0b3JhZ2UgbG9jYXRpb24KKyAqIFJl
dHVybnMgMSBpZiBkYXRhIHJlYWQsIGVsc2UgMAorICovCitwcml2YXRlIGludAorTWFwRmlsZVJl
YWQoRklMRSAqIG1hcGZpbGUsIGNoYXIgKiBuYW1lYnVmLCBpbnQgKiB2YWx1ZSkKK3sKKyAgICBp
bnQgY291bnQgPSAwOworICAgIGludCBjOworCisgICAgLyogR2V0IHRoZSBmaWxlIG51bWJlciAq
LworICAgIGlmIChmc2NhbmYobWFwZmlsZSwgIiVkXHQiLCB2YWx1ZSkgIT0gMSkKKyAgICAJcmV0
dXJuIDA7CisgICAgCisgICAgLyogR2V0IHRoZSBmaWxlIG5hbWUgKi8KKyAgICBkbyB7CisJbmFt
ZWJ1Zltjb3VudCsrXSA9IGMgPSBmZ2V0YyhtYXBmaWxlKTsKKyAgICB9IHdoaWxlIChjb3VudCA8
IEJVRkZFUl9MRU5HVEggJiYgYyAhPSBFT0YgJiYgYyAhPSAnXG4nICYmIGMgIT0gJ1xyJyk7Cisg
ICAgbmFtZWJ1ZlstLWNvdW50XSA9IDA7ICAgIC8qIFRlcm1pbmF0ZSBmaWxlIG5hbWUgKi8KKwor
ICAgIC8qIENsZWFuIHVwIGFueSB0cmFpbGluZyBsaW5lZmVlZHMgb3IgY2FycmlhZ2UgcmV0dXJu
cyAqLworICAgIHdoaWxlIChjICE9IEVPRiAmJiAoYyA9PSAnXG4nIHx8IGMgPT0gJ1xyJykpIHsK
KwljID0gZmdldGMobWFwZmlsZSk7CisgICAgfQorCisgICAgcmV0dXJuIGNvdW50ICE9IDAgPyAx
OiAwOworfQorCisvKgorICogV3JpdGUgYW4gZW50cnkgaW4gdGhlIG1hcCBmaWxlCisgKgorICog
c3RyZWFtIC0gRmlsZSBzdHJ1Y3R1cmUgcG9pbnRlcgorICogbmFtZWJ1ZiAtIEJ1ZmZlciBmb3Ig
dGhlIGZpbGUgbmFtZSBzdG9yYWdlCisgKiB2YWx1ZSAtIGZpbGUgbnVtYmVyCisgKi8KK3ByaXZh
dGUgdm9pZAorTWFwRmlsZVdyaXRlKEZJTEUgKiBtYXBmaWxlLCBjb25zdCBjaGFyICogbmFtZWJ1
ZiwgaW50IHZhbHVlKQoreworICAgIGZwcmludGYobWFwZmlsZSwgIiAlZFx0JXNcbiIsIHZhbHVl
LCBuYW1lYnVmKTsKK30KKworLyoKKyAqIFJlbW92ZSB0aGUgc3BlY2lmaWVkIGZpbGUgCisgKgor
ICogcm9vdHBhdGggLSBQYXRoIHRvIGJhc2UgZGlzayBsb2NhdGlvbi4KKyAqIGZpbGVuYW1lIC0g
RmlsZSBuYW1lIHN0cmluZworICovCitwcml2YXRlIHZvaWQKK01hcEZpbGVVbmxpbmsoY29uc3Qg
Y2hhciAqIHJvb3RwYXRoLCBjb25zdCBjaGFyICogZmlsZW5hbWUpCit7CisgICAgY2hhciBmdWxs
bmFtZVtCVUZGRVJfTEVOR1RIXTsKKworICAgIGlmIChzdHJsZW4ocm9vdHBhdGgpICsgc3RybGVu
KGZpbGVuYW1lKSA+PSBCVUZGRVJfTEVOR1RIKQorICAgICAgICByZXR1cm47CisgICAgc25wcmlu
dGYoZnVsbG5hbWUsIEJVRkZFUl9MRU5HVEgsICIlcyVzIiwgcm9vdHBhdGgsIGZpbGVuYW1lKTsK
KyAgICB1bmxpbmsoZnVsbG5hbWUpOworfQorCisvKgorICogUmVuYW1lIHRoZSBzcGVjaWZpZWQg
ZmlsZSB0byBuZXcgc3BlY2lmaWVkIG5hbWUKKyAqCisgKiByb290cGF0aCAtIFBhdGggdG8gYmFz
ZSBkaXNrIGxvY2F0aW9uLgorICogb2xkZmlsZW5hbWUgLSBPbGQgZmlsZSBuYW1lIHN0cmluZwor
ICogbmV3ZmlsZW5hbWUgLSBOZXcgZmlsZSBuYW1lIHN0cmluZworICovCitwcml2YXRlIHZvaWQK
K01hcEZpbGVSZW5hbWUoY29uc3QgY2hhciAqIHJvb3RwYXRoLCBjb25zdCBjaGFyICogbmV3Zmls
ZW5hbWUsIGNvbnN0IGNoYXIgKiBvbGRmaWxlbmFtZSkKK3sKKyAgICBjaGFyIG9sZGZ1bGxuYW1l
W0JVRkZFUl9MRU5HVEhdOworICAgIGNoYXIgbmV3ZnVsbG5hbWVbQlVGRkVSX0xFTkdUSF07CisK
KyAgICBpZiAoc3RybGVuKHJvb3RwYXRoKSArIHN0cmxlbihvbGRmaWxlbmFtZSkgPj0gQlVGRkVS
X0xFTkdUSCkKKyAgICAgICAgcmV0dXJuOworICAgIGlmIChzdHJsZW4ocm9vdHBhdGgpICsgc3Ry
bGVuKG5ld2ZpbGVuYW1lKSA+PSBCVUZGRVJfTEVOR1RIKQorICAgICAgICByZXR1cm47CisgICAg
c25wcmludGYob2xkZnVsbG5hbWUsIEJVRkZFUl9MRU5HVEgsICIlcyVzIiwgcm9vdHBhdGgsIG9s
ZGZpbGVuYW1lKTsKKyAgICBzbnByaW50ZihuZXdmdWxsbmFtZSwgQlVGRkVSX0xFTkdUSCwgIiVz
JXMiLCByb290cGF0aCwgbmV3ZmlsZW5hbWUpOworICAgIHJlbmFtZShvbGRmdWxsbmFtZSwgbmV3
ZnVsbG5hbWUpOworfQorCisvKgorICogTWFwVG9GaWxlCisgKgorICogU2VhcmNoIGZvciBtYXBw
ZWQgbnVtYmVyIGZyb20gbWFwIGZpbGUgd2l0aCByZXF1aWVkIG5hbWUuIElmIHNhbWUgbmFtZSBl
eGlzdCwKKyAqIGZpcnN0IChsb3dlc3QgbnVtYmVyKSB3aWxsIGJlIHJldHVybmVkLgorICogcm9v
dHBhdGggICAgICAgIGNoYXIqICAgc3RyaW5nIG9mIHRoZSBiYXNlIHBhdGggd2hlcmUgaW4gZGlz
azAgcmVzaWRlIChDOlxQU1xEaXNrMFwpCisgKiBuYW1lICAgICAgICAgICAgY2hhciogICBzdHJp
bmcgdG8gc2VhcmNoIHBhdHRlcm4gZm9yIGZ1bGwgbWF0Y2ggKGZvbnRcUnl1bWluLUxpZ2h0KQor
ICogcmV0dXJucwkgICAgLTEgaWYgZmlsZSBub3QgZm91bmQsIGZpbGUgbnVtYmVyIGlmIGZvdW5k
LgorICovCitwcml2YXRlIGludAorTWFwVG9GaWxlKGNvbnN0IGNoYXIqIHJvb3RwYXRoLCBjb25z
dCBjaGFyKiBuYW1lKQoreworICAgIEZJTEUgKiBtYXBmaWxlOworICAgIGludCBkID0gLTE7Cisg
ICAgY2hhciBmaWxlbmFtZVtCVUZGRVJfTEVOR1RIXTsKKyAgICBpbnQgZmlsZV92ZXJzaW9uOwor
CisgICAgbWFwZmlsZSA9IE1hcEZpbGVPcGVuKHJvb3RwYXRoLCBNQVBfRklMRV9OQU1FLCAiciIp
OworICAgIGlmIChtYXBmaWxlID09IE5VTEwpCisgICAgICAgIHJldHVybiAtMTsKKworICAgIC8q
IFZlcmlmeSB0aGUgbWFwcGluZyBmaWxlIHZlcnNpb24gbnVtYmVyICovCisKKyAgICBpZiAoTWFw
RmlsZVJlYWRWZXJzaW9uKG1hcGZpbGUsICZmaWxlX3ZlcnNpb24pCisgICAgCSYmIGZpbGVfdmVy
c2lvbiA9PSBNQVBfRklMRV9WRVJTSU9OKSB7CisKKyAgICAgICAgLyogU2NhbiB0aGUgZmlsZSBs
b29raW5nIGZvciB0aGUgZ2l2ZW4gbmFtZSAqLworCisgICAgICAgIHdoaWxlIChNYXBGaWxlUmVh
ZChtYXBmaWxlLCBmaWxlbmFtZSwgJmQpKSB7CisgICAgICAgICAgICBpZiAoc3RyY21wKGZpbGVu
YW1lLCBuYW1lKSA9PSAwKQorICAgIAkgICAgICAgIGJyZWFrOworICAgICAgICAgICAgZCA9IC0x
OworICAgICAgICB9CisgICAgfQorICAgIGZjbG9zZShtYXBmaWxlKTsKKyAgICByZXR1cm4gZDsK
K30KKworLyoKKyAqIG1hcF9maWxlX2VudW1faW5pdAorICoKKyAqIGNyZWF0ZSBlbnVtaWF0ZSBz
dHJ1Y3R1cmUgZm9yIGEgbWFwcGVkIGZpbGUgYW5kIGZpbGwgcGF0dGVybiBmb3Igc2VhcmNoCisg
KiByb290X25hbWUgICAgICAgY2hhciogICBzdHJpbmcgb2YgdGhlIGJhc2UgcGF0aCB3aGVyZSBp
biBkaXNrMCByZXNpZGUgKGUuZy4gQzpcUFNcRGlzazBcKQorICogc2VhcmNoX3BhdHRlcm4gIGNo
YXIqICAgc3RyaW5nIHRvIHNlYXJjaCBwYXR0ZXJuIChmb250XCopIG9yIGZ1bGwgbWF0Y2gKKyAq
ICAgICAgICAgICAgICAgICAgICAgICAgICAoZS5nLiBmb250XFJ5dW1pbi1MaWdodCkgb3IgTlVM
TAorICogICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwgbWVhbnMgYWxsIGZpbGVzCisgKiBS
ZXR1cm5zOgkJICAgIE5VTEwgaWYgZXJyb3IsIGVsc2UgcG9pbnRlciB0byBlbnVtZXJhdGlvbiBz
dHJ1Y3R1cmUuCisgKi8KK3ZvaWQgKgorbWFwX2ZpbGVfZW51bV9pbml0KGdzX21lbW9yeV90ICog
bWVtLCBjb25zdCBjaGFyICogcm9vdF9uYW1lLCBjb25zdCBjaGFyICogc2VhcmNoX3BhdHRlcm4p
Cit7CisgICAgaW50IGZpbGVfdmVyc2lvbjsKKyAgICBtYXBfZmlsZV9lbnVtICogbWFwZmlsZWVu
dW0gPSBnc19hbGxvY19zdHJ1Y3QobWVtLCBtYXBfZmlsZV9lbnVtLCAmc3RfbWFwX2ZpbGVfZW51
bSwKKwkJCSAgIAkJCQkiZGlza246ZW51bV9pbml0KGZpbGVfZW51bSkiKTsKKworICAgIGlmICht
YXBmaWxlZW51bSA9PSBOVUxMKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBtZW1zZXQobWFw
ZmlsZWVudW0sIDAsIHNpemVvZihtYXBfZmlsZV9lbnVtKSk7CisgICAgbWFwZmlsZWVudW0tPm1l
bW9yeSA9IG1lbTsKKworICAgIGlmIChzZWFyY2hfcGF0dGVybikgeworICAgICAgICBtYXBmaWxl
ZW51bS0+cGF0dGVybiA9IChjaGFyICopZ3NfYWxsb2NfYnl0ZXMobWVtLCBzdHJsZW4oc2VhcmNo
X3BhdHRlcm4pICsgMSwKKwkJCQkJCQkiZGlza246ZW51bV9pbml0KHBhdHRlcm4pIik7CisgICAg
ICAgIGlmIChtYXBmaWxlZW51bS0+cGF0dGVybiA9PSBOVUxMKSB7CisJICAgIG1hcF9maWxlX2Vu
dW1fY2xvc2UoKGZpbGVfZW51bSAqKSBtYXBmaWxlZW51bSk7CisgICAgICAgICAgICByZXR1cm4g
TlVMTDsKKyAgICAgICAgfQorICAgICAgICBzdHJjcHkobWFwZmlsZWVudW0tPnBhdHRlcm4sIHNl
YXJjaF9wYXR0ZXJuKTsKKyAgICB9CisKKyAgICBtYXBmaWxlZW51bS0+cm9vdCA9IChjaGFyICop
Z3NfYWxsb2NfYnl0ZXMobWVtLCBzdHJsZW4ocm9vdF9uYW1lKSArIDEsIAorICAgIAkJCQkJCSJk
aXNrbjplbnVtX2luaXQocm9vdCkiKTsKKyAgICBpZiAobWFwZmlsZWVudW0tPnJvb3QgPT0gTlVM
TCkgeworCW1hcF9maWxlX2VudW1fY2xvc2UoKGZpbGVfZW51bSAqKSBtYXBmaWxlZW51bSk7Cisg
ICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKworICAgIGlmIChzdHJsZW4ocm9vdF9uYW1lKSA+
PSBCVUZGRVJfTEVOR1RIKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBzdHJjcHkobWFwZmls
ZWVudW0tPnJvb3QsIHJvb3RfbmFtZSk7CisgICAgbWFwZmlsZWVudW0tPnN0cmVhbSA9IE1hcEZp
bGVPcGVuKHJvb3RfbmFtZSwgTUFQX0ZJTEVfTkFNRSwgInIiKTsKKworICAgIC8qIENoZWNrIHRo
ZSBtYXBwaW5nIGZpbGUgdmVyc2lvbiBudW1iZXIgKi8KKyAgICBpZiAobWFwZmlsZWVudW0tPnN0
cmVhbSAhPSBOVUxMCisJJiYgKCFNYXBGaWxlUmVhZFZlcnNpb24obWFwZmlsZWVudW0tPnN0cmVh
bSwgJmZpbGVfdmVyc2lvbikKKwkgICAgfHwgZmlsZV92ZXJzaW9uICE9IE1BUF9GSUxFX1ZFUlNJ
T04pKSB7CisJZmNsb3NlKG1hcGZpbGVlbnVtLT5zdHJlYW0pOyAgIC8qIEludmFsaWQgZmlsZSB2
ZXJzaW9uICovCisgICAgICAgIG1hcGZpbGVlbnVtLT5zdHJlYW0gPSBOVUxMOworICAgIH0KKwor
ICAgIHJldHVybiBtYXBmaWxlZW51bTsKK30KKworLyoKKyAqIG1hcF9maWxlX2VudW1fbmV4dAor
ICoKKyAqIGVudW1fbWVtICAgICAgICB2b2lkKiAgIHBvaW50ZXIgZm9yIG1hcCBmaWxlIGVudW0g
c3RydWN0dXJlCisgKiBzZWFyY2hfcGF0dGVybiAgY2hhciogICBzdHJpbmcgYXJyYXkgZm9yIG5l
eHQgdGFyZ2V0CisgKi8KK2Jvb2wKK21hcF9maWxlX2VudW1fbmV4dCh2b2lkICogZW51bV9tZW0s
IGNoYXIqIHRhcmdldCkKK3sKKyAgICBpbnQgZCA9IC0xOworICAgIG1hcF9maWxlX2VudW0gKiBt
YXBmaWxlZW51bTsKKworICAgIGlmIChlbnVtX21lbSA9PSBOVUxMKQorCXJldHVybiBmYWxzZTsK
KworICAgIG1hcGZpbGVlbnVtID0gKG1hcF9maWxlX2VudW0qKWVudW1fbWVtOworICAgIGlmICht
YXBmaWxlZW51bS0+c3RyZWFtID09IE5VTEwpCisJcmV0dXJuIGZhbHNlOworCisgICAgaWYgKG1h
cGZpbGVlbnVtLT5wYXR0ZXJuKSB7CisgICAgICAgIC8qICBTZWFyY2ggZm9yIG5leHQgZW50cnkg
dGhhdCBtYXRjaGVzIHBhdHRlcm4gKi8KKyAgICAgICAgd2hpbGUgKE1hcEZpbGVSZWFkKG1hcGZp
bGVlbnVtLT5zdHJlYW0sIHRhcmdldCwgJmQpKSB7CisgICAgICAgICAgICBpZiAoc3RyaW5nX21h
dGNoKChieXRlICopdGFyZ2V0LCBzdHJsZW4odGFyZ2V0KSwKKwkJCSAgICAgKGJ5dGUgKiltYXBm
aWxlZW51bS0+cGF0dGVybiwKKwkJCSAgICAgc3RybGVuKG1hcGZpbGVlbnVtLT5wYXR0ZXJuKSwg
MCkpCisJCXJldHVybiB0cnVlOworCX0KKyAgICB9CisgICAgZWxzZSB7CisgICAgICAgIC8qICBK
dXN0IGdldCBuZXh0ICovCisgICAgICAgIGlmIChNYXBGaWxlUmVhZChtYXBmaWxlZW51bS0+c3Ry
ZWFtLCB0YXJnZXQsICZkKSkKKyAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKyAgICBy
ZXR1cm4gZmFsc2U7Cit9CisKKy8qIAorICogbWFwX2ZpbGVfZW51bV9jbG9zZQorICoKKyAqIGNs
ZWFucyB1cCBhZnRlciBhbiBlbnVtZXJhdGlvbiwgdGhpcyBtYXkgb25seSBiZSBjYWxsZWQKKyAq
IGlmIG1hcF9maWxlX2VudW1faW5pdCBkaWQgbm90IGZhaWwKKyAqLwordm9pZAorbWFwX2ZpbGVf
ZW51bV9jbG9zZSh2b2lkICogZW51bV9tZW0pCit7CisgICAgbWFwX2ZpbGVfZW51bSAqIG1hcGZp
bGVlbnVtID0gKG1hcF9maWxlX2VudW0gKikgZW51bV9tZW07CisgICAgZ3NfbWVtb3J5X3QgKiBt
ZW0gPSBtYXBmaWxlZW51bS0+bWVtb3J5OworCisgICAgaWYgKG1hcGZpbGVlbnVtLT5zdHJlYW0p
CisgICAgICAgIGZjbG9zZShtYXBmaWxlZW51bS0+c3RyZWFtKTsKKyAgICBpZiAobWFwZmlsZWVu
dW0tPnJvb3QpCisgICAgICAgIGdzX2ZyZWVfb2JqZWN0KG1lbSwgbWFwZmlsZWVudW0tPnJvb3Qs
ICJkaXNrbl9lbnVtX2luaXQocm9vdCkiKTsKKyAgICBpZiAobWFwZmlsZWVudW0tPnBhdHRlcm4p
CisJZ3NfZnJlZV9vYmplY3QobWVtLCBtYXBmaWxlZW51bS0+cGF0dGVybiwgImRpc2tuX2VudW1f
aW5pdChwYXR0ZXJuKSIpOworICAgIGdzX2ZyZWVfb2JqZWN0KG1lbSwgbWFwZmlsZWVudW0sICJk
aXNrbl9lbnVtX2luaXQobWFwZmlsZWVudW0pIik7Cit9CisKKy8qCisgKiBtYXBfZmlsZV9uYW1l
X2dldAorICoKKyAqIG1hcHMgdGhlIHBzbmFtZShGbmFtZSkgdG8gdGhlIG9zbmFtZSB1c2luZyBj
b25jYXRlbmluZyB0aGUgcm9vdF9uYW1lIGFuZCBpZAorICogSWQgd2lsbCBiZSBhIGxvd2VzdCBv
bmUgaWYgc2FtZSBwc25hbWUgZXhpc3RzIG1vcmUgdGhhbiBvbmUgaW4gbWFwIGZpbGUuIFNlZSBN
YXBUb0ZpbGUKKyAqIGZvciBkZXRhaWwuCisgKiByb290X25hbWUgICAgICAgY2hhciogICBzdHJp
bmcgb2YgdGhlIGJhc2UgcGF0aCB3aGVyZSBpbiBkaXNrMCByZXNpZGUKKyAqICAgICAgICAgICAg
ICAgICAgICAgICAgIChlLmcuQzpcUFNcRGlzazBcKQorICogRm5hbWUgICAgICAgICAgIGNoYXIq
ICAgbmFtZSBvZiB0aGUgZW50cnkgdG8gZmluZCBpbiB0aGUgbWFwCisgKiBvc25hbWUgICAgICAg
ICAgY2hhciogICByZXN1bHRpbmcgb3Mgc3BlY2lmaWMgcGF0aCB0byB0aGUgZmlsZQorICovCiti
b29sCittYXBfZmlsZV9uYW1lX2dldChjb25zdCBjaGFyICogcm9vdF9uYW1lLCBjb25zdCBjaGFy
ICogRm5hbWUsIGNoYXIgKiBvc25hbWUpCit7CisgICAgaW50IGQgPSBNYXBUb0ZpbGUocm9vdF9u
YW1lLCBGbmFtZSk7CisKKyAgICBpZiAoZCAhPSAtMSkgeworCS8qIDIwIGNoYXJhY3RlcnMgYXJl
IGVub3VnaCBmb3IgZXZlbiBhIDY0IGJpdCBpbnRlZ2VyICovCisgICAgICAgIGlmICgoc3RybGVu
KHJvb3RfbmFtZSkgKyAyMCkgPCBCVUZGRVJfTEVOR1RIKSB7CisJICAgIHNwcmludGYob3NuYW1l
LCAiJXMlZCIsIHJvb3RfbmFtZSwgZCk7CisJICAgIHJldHVybiB0cnVlOworCX0KKyAgICB9CisK
KyAgICAqb3NuYW1lID0gMDsKKyAgICByZXR1cm4gZmFsc2U7Cit9CisKKy8qCisgKiBtYXBfZmls
ZV9uYW1lX2RlbAorICoKKyAqIERlbGV0ZXMgRm5hbWUgZnJvbSB0aGUgbWFwcGluZyB0YWJsZSBh
bmQgZG9lcyBub3QgZGVsZXRlIHRoZSBhY3R1YWwgZmlsZQorICogSWYgc2FtZSBGbmFtZSBleGlz
dHMsIGFsbCBzYW1lIEZuYW1lIHdpbGwgYmUgZGVsZXRlZAorICogcm9vdF9uYW1lICAgICAgIGNo
YXIqICAgc3RyaW5nIG9mIHRoZSBiYXNlIHBhdGggd2hlcmUgaW4gZGlzazAgcmVzaWRlIChDOlxQ
U1xEaXNrMFwpCisgKiBGbmFtZSAgICAgICAgICAgY2hhciogICBuYW1lIG9mIHRoZSBlbnRyeSB0
byBhZGQgdG8gdGhlIG1hcAorICovCit2b2lkCittYXBfZmlsZV9uYW1lX2RlbChjb25zdCBjaGFy
ICogcm9vdF9uYW1lLCBjb25zdCBjaGFyICogRm5hbWUpCit7CisgICAgLyogIHNlYXJjaCBmb3Ig
dGFyZ2V0IGVudHJ5ICovCisgICAgaW50IGQgPSBNYXBUb0ZpbGUocm9vdF9uYW1lLCBGbmFtZSk7
CisgICAgaW50IGZpbGVfdmVyc2lvbjsKKworICAgIGlmIChkICE9IC0xKSB7CQkJIC8qIGlmIHRo
ZSBmaWxlIGV4aXN0cyAuLi4gKi8KKyAgICAgICAgY2hhciAgICBuYW1lW0JVRkZFUl9MRU5HVEhd
OworICAgICAgICBGSUxFKiAgIG5ld01hcDsKKyAgICAgICAgRklMRSogICBvbGRNYXA7CisKKwkv
KiBPcGVuIGN1cnJlbnQgbWFwIGZpbGUgYW5kIGEgd29ya2luZyBmaWxlICovCisKKyAgICAgICAg
TWFwRmlsZVVubGluayhyb290X25hbWUsIFRFTVBfRklMRV9OQU1FICk7CisgICAgICAgIG5ld01h
cCA9IE1hcEZpbGVPcGVuKHJvb3RfbmFtZSwgVEVNUF9GSUxFX05BTUUsICJ3Iik7CisgICAgICAg
IGlmIChuZXdNYXAgPT0gTlVMTCkKKwkgICAgcmV0dXJuOworICAgICAgICBvbGRNYXAgPSBNYXBG
aWxlT3Blbihyb290X25hbWUsIE1BUF9GSUxFX05BTUUsICJyIik7CisgICAgICAgIGlmIChvbGRN
YXAgIT0gTlVMTCAmJiAoIU1hcEZpbGVSZWFkVmVyc2lvbihvbGRNYXAsICZmaWxlX3ZlcnNpb24p
CisJICAgIHx8IGZpbGVfdmVyc2lvbiAhPSBNQVBfRklMRV9WRVJTSU9OKSkgeworICAgICAgICAg
ICAgZmNsb3NlKG9sZE1hcCk7CisJICAgIG9sZE1hcD0gTlVMTDsKKwl9CisgICAgICAgIGlmIChv
bGRNYXAgPT0gTlVMTCkgeworICAgICAgICAgICAgZmNsb3NlKG5ld01hcCk7CisgICAgICAgICAg
ICBNYXBGaWxlVW5saW5rKHJvb3RfbmFtZSwgVEVNUF9GSUxFX05BTUUpOworCSAgICByZXR1cm47
CisgICAgICAgIH0KKworCS8qIENvcHkgZXZlcnkgbGluZSBvZiB0aGUgbWFwIGZpbGUgZXhjZXB0
IHRoZSBvbmUgd2l0aCBnaXZlbiBuYW1lICovCisKKyAgICAgICAgTWFwRmlsZVdyaXRlVmVyc2lv
bihuZXdNYXAsIE1BUF9GSUxFX1ZFUlNJT04pOworICAgICAgICB3aGlsZSAoTWFwRmlsZVJlYWQo
b2xkTWFwLCBuYW1lLCAmZCkpCisgICAgICAgICAgICBpZiAoc3RyY21wKG5hbWUsIEZuYW1lKSkK
KyAgICAgICAgICAgICAgICBNYXBGaWxlV3JpdGUobmV3TWFwLCBuYW1lLCBkKTsKKyAgICAgICAg
ZmNsb3NlKG5ld01hcCk7CisgICAgICAgIGZjbG9zZShvbGRNYXApOworICAgICAgICBNYXBGaWxl
VW5saW5rKHJvb3RfbmFtZSwgTUFQX0ZJTEVfTkFNRSk7CisgICAgICAgIE1hcEZpbGVSZW5hbWUo
cm9vdF9uYW1lLCBNQVBfRklMRV9OQU1FLCBURU1QX0ZJTEVfTkFNRSk7CisgICAgfQorfQorCisv
KgorICogbWFwX2ZpbGVfYWRkCisgKgorICogYWRkcyBGbmFtZSB0byB0aGUgbWFwcGluZyB0YWJs
ZSBhbmQgZG9lcyBub3QgY3JlYXRlIGFuIHVuaXF1ZSBuZXcgZW1wdHkgZmlsZQorICogSWYgc2Ft
ZSBGbmFtZSBleGlzdHMsIG5ldyBGbmFtZSB3aWxsIG5vdCBiZSBhZGRlZC4KKyAqIHJvb3RfbmFt
ZSAgICAgICBjaGFyKiAgIHN0cmluZyBvZiB0aGUgYmFzZSBwYXRoIHdoZXJlIGluIGRpc2swIHJl
c2lkZSAoQzpcUFNcRGlzazBcKQorICogRm5hbWUgICAgICAgICAgIGNoYXIqICAgbmFtZSBvZiB0
aGUgZW50cnkgdG8gYWRkIHRvIHRoZSBtYXAKKyAqLwordm9pZAorbWFwX2ZpbGVfbmFtZV9hZGQo
Y29uc3QgY2hhciAqIHJvb3RfbmFtZSwgY29uc3QgY2hhciAqIEZuYW1lKQoreworICAgIC8qIAor
ICAgICAqIGFkZCBlbnRyeSB0byBtYXAgZmlsZQorICAgICAqIGVudHJ5IG51bWJlciBpcyBvbmUg
Z3JlYXRlciB0aGFuIGJpZ2dlc3QgbnVtYmVyCisgICAgICovCisgICAgY2hhciAgICBuYW1lW0JV
RkZFUl9MRU5HVEhdOworICAgIGludCBkOworICAgIGludCBkbWF4ID0gLTE7CisgICAgaW50IGZp
bGVfdmVyc2lvbjsKKyAgICBGSUxFKiAgIG5ld01hcDsKKyAgICBGSUxFKiAgIG9sZE1hcDsKKyAg
ICAKKyAgICBvbGRNYXAgPSBNYXBGaWxlT3Blbihyb290X25hbWUsIE1BUF9GSUxFX05BTUUsICJy
Iik7CisgICAgaWYgKG9sZE1hcCAhPSBOVUxMICYmICghTWFwRmlsZVJlYWRWZXJzaW9uKG9sZE1h
cCwgJmZpbGVfdmVyc2lvbikKKwl8fCBmaWxlX3ZlcnNpb24gIT0gTUFQX0ZJTEVfVkVSU0lPTikp
IHsKKyAgICAgICAgZmNsb3NlKG9sZE1hcCk7CisJb2xkTWFwID0gTlVMTDsKKyAgICB9CisgICAg
aWYgKG9sZE1hcCA9PSBOVUxMKSB7CisgICAgICAgIG9sZE1hcCA9IE1hcEZpbGVPcGVuKHJvb3Rf
bmFtZSwgTUFQX0ZJTEVfTkFNRSwgInciKTsKKwlpZiAoIW9sZE1hcCkgCisJICAgIHJldHVybjsK
KyAgICAgICAgTWFwRmlsZVdyaXRlVmVyc2lvbihvbGRNYXAsIE1BUF9GSUxFX1ZFUlNJT04pOwor
ICAgICAgICBNYXBGaWxlV3JpdGUob2xkTWFwLCBGbmFtZSwgSW5pdGlhbE51bWJlcik7CisgICAg
ICAgIGZjbG9zZShvbGRNYXApOworICAgIH0KKyAgICBlbHNlIHsKKyAgICAgICAgTWFwRmlsZVVu
bGluayhyb290X25hbWUsIFRFTVBfRklMRV9OQU1FKTsKKyAgICAgICAgbmV3TWFwID0gTWFwRmls
ZU9wZW4ocm9vdF9uYW1lLCBURU1QX0ZJTEVfTkFNRSwgInciKTsKKyAgICAgICAgaWYgKG5ld01h
cCAhPSBOVUxMKSB7CisgICAgICAgICAgICBNYXBGaWxlV3JpdGVWZXJzaW9uKG5ld01hcCwgTUFQ
X0ZJTEVfVkVSU0lPTik7CisgICAgICAgICAgICB3aGlsZSAoTWFwRmlsZVJlYWQob2xkTWFwLCBu
YW1lLCAmZCkpIHsKKyAgICAgICAgCU1hcEZpbGVXcml0ZShuZXdNYXAsIG5hbWUsIGQpOworICAg
ICAgICAgICAgICAgIGlmIChkbWF4IDwgZCkKKyAgICAgICAgICAgICAgICAgICAgZG1heCA9IGQ7
CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGRtYXggKz0gMTsKKyAgICAgICAgICAgIE1h
cEZpbGVXcml0ZShuZXdNYXAsIEZuYW1lLCBkbWF4KTsKKyAgICAgICAgICAgIGZjbG9zZShuZXdN
YXApOworICAgICAgICAgICAgZmNsb3NlKG9sZE1hcCk7CisgICAgICAgICAgICBNYXBGaWxlVW5s
aW5rKHJvb3RfbmFtZSwgTUFQX0ZJTEVfTkFNRSk7CisgICAgICAgICAgICBNYXBGaWxlUmVuYW1l
KHJvb3RfbmFtZSwgTUFQX0ZJTEVfTkFNRSwgVEVNUF9GSUxFX05BTUUpOworICAgICAgICB9Cisg
ICAgfQorfQorCisvKgorICogbWFwX2ZpbGVfbmFtZV9yZW4KKyAqCisgKiByZW5hbWVzIHRoZSBv
bGRuYW1lIGludG8gbmV3bmFtZSBpbiB0aGUgbWFwcGluZyB0YWJsZS4gbmV3bmFtZSBtdXN0IG5v
dCBleGlzdCBhbmQgbXVzdCBiZQorICogY2hlY2tlZCBieSB0aGUgY2FsbGVyLiBJZiBzYW1lIG5h
bWUgZXhpc3QsIGFsbCBzYW1lIG5hbWUgd2lsbCBiZSByZW5hbWVkLgorICogcm9vdF9uYW1lICAg
ICAgIGNoYXIqICAgc3RyaW5nIG9mIHRoZSBiYXNlIHBhdGggd2hlcmUgaW4gZGlzazAgcmVzaWRl
IChDOlxQU1xEaXNrMFwpCisgKiBvbGRuYW1lICAgICAgICAgY2hhciogICBuYW1lIGN1cnJlbnRs
eSBleGlzdGluZyBpbiB0aGUgbWFwCisgKiBuZXduYW1lICAgICAgICAgY2hhciogICBuYW1lIHRv
IGNoYW5nZSB0aGUgZW50cnkgaW5kaWNhdGVkIGJ5IG9sZG5hbWUgaW50bworICovCit2b2lkCitt
YXBfZmlsZV9uYW1lX3Jlbihjb25zdCBjaGFyKiByb290X25hbWUsIGNvbnN0IGNoYXIgKiBvbGRu
YW1lLCBjb25zdCBjaGFyICogbmV3bmFtZSkKK3sgICAKKyAgICAvKiAgc2VhcmNoIGZvciB0YXJn
ZXQgZW50cnkgKi8KKworICAgIGludCBkID0gTWFwVG9GaWxlKHJvb3RfbmFtZSwgb2xkbmFtZSk7
CisgICAgaW50IGZpbGVfdmVyc2lvbjsKKworICAgIGlmIChkICE9IC0xKSB7IAkJLyogaWYgdGFy
Z2V0IGV4aXN0cyAuLi4gKi8KKyAgICAgICAgY2hhciAgICBuYW1lW0JVRkZFUl9MRU5HVEhdOwor
ICAgICAgICBGSUxFKiAgIG5ld01hcDsKKyAgICAgICAgRklMRSogICBvbGRNYXA7CisgICAgICAg
IAorCS8qIE9wZW4gY3VycmVudCBtYXAgZmlsZSBhbmQgYSB3b3JraW5nIGZpbGUgKi8KKworICAg
ICAgICBNYXBGaWxlVW5saW5rKHJvb3RfbmFtZSwgVEVNUF9GSUxFX05BTUUgKTsKKyAgICAgICAg
bmV3TWFwID0gTWFwRmlsZU9wZW4ocm9vdF9uYW1lLCBURU1QX0ZJTEVfTkFNRSwgInciKTsKKyAg
ICAgICAgaWYgKG5ld01hcCA9PSBOVUxMKQorCSAgICByZXR1cm47CisgICAgICAgIG9sZE1hcCA9
IE1hcEZpbGVPcGVuKHJvb3RfbmFtZSwgTUFQX0ZJTEVfTkFNRSwgInIiKTsKKyAgICAgICAgaWYg
KG9sZE1hcCAhPSBOVUxMICYmICghTWFwRmlsZVJlYWRWZXJzaW9uKG9sZE1hcCwgJmZpbGVfdmVy
c2lvbikKKwkgICAgfHwgZmlsZV92ZXJzaW9uICE9IE1BUF9GSUxFX1ZFUlNJT04pKSB7CisgICAg
ICAgICAgICBmY2xvc2Uob2xkTWFwKTsKKwkgICAgb2xkTWFwPSBOVUxMOworCX0KKyAgICAgICAg
aWYgKG9sZE1hcCA9PSBOVUxMKSB7CisgICAgICAgICAgICBmY2xvc2UobmV3TWFwKTsKKyAgICAg
ICAgICAgIE1hcEZpbGVVbmxpbmsocm9vdF9uYW1lLCBURU1QX0ZJTEVfTkFNRSk7CisJICAgIHJl
dHVybjsKKyAgICAgICAgfQorCisJLyogTm93IGNvcHkgZGF0YSBmcm9tIG9sZCB0byBuZXcsIGNo
YW5nZSBmaWxlIG5hbWUgd2hlbiBmb3VuZCAqLworCisgICAgICAgIE1hcEZpbGVXcml0ZVZlcnNp
b24obmV3TWFwLCBNQVBfRklMRV9WRVJTSU9OKTsgIC8qIENvcHkgdGhlIHZlcnNpb24gbnVtYmVy
ICovCisgICAgICAgIHdoaWxlIChNYXBGaWxlUmVhZChvbGRNYXAsIG5hbWUsICZkKSkKKyAgICAg
ICAgICAgIGlmIChzdHJjbXAobmFtZSwgb2xkbmFtZSkpCisgICAgICAgICAgICAgICAgTWFwRmls
ZVdyaXRlKG5ld01hcCwgbmFtZSwgZCk7CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAg
ICAgTWFwRmlsZVdyaXRlKG5ld01hcCwgbmV3bmFtZSwgZCk7CisgICAgICAgIGZjbG9zZShuZXdN
YXApOworICAgICAgICBmY2xvc2Uob2xkTWFwKTsKKyAgICAgICAgTWFwRmlsZVVubGluayhyb290
X25hbWUsIE1BUF9GSUxFX05BTUUpOworICAgICAgICBNYXBGaWxlUmVuYW1lKHJvb3RfbmFtZSwg
TUFQX0ZJTEVfTkFNRSwgVEVNUF9GSUxFX05BTUUpOworICAgIH0KK30KSW5kZXg6IHNyYy9nc2lv
cmFtLmMKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PQotLS0gc3JjL2dzaW9yYW0uYwkoLi4uL3RhZ3MvZ3M4LjU0KQkocmV2
aXNpb24gMCkKKysrIHNyYy9nc2lvcmFtLmMJKC4uLi90cnVuay9ncykJKHJldmlzaW9uIDIyKQpA
QCAtMCwwICsxLDM5OSBAQAorLyogQ29weXJpZ2h0IChDKSAyMDAxLTIwMDYgYXJ0b2Zjb2RlIExM
Qy4KKyAgIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisKKyAgIFRoaXMgc29mdHdhcmUgaXMgcHJvdmlk
ZWQgQVMtSVMgd2l0aCBubyB3YXJyYW50eSwgZWl0aGVyIGV4cHJlc3Mgb3IKKyAgIGltcGxpZWQu
CisKKyAgIFRoaXMgc29mdHdhcmUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgbGljZW5zZSBhbmQgbWF5
IG5vdCBiZSBjb3BpZWQsIG1vZGlmaWVkCisgICBvciBkaXN0cmlidXRlZCBleGNlcHQgYXMgZXhw
cmVzc2x5IGF1dGhvcml6ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoYXQKKyAgIGxpY2Vuc2UuICBS
ZWZlciB0byBsaWNlbnNpbmcgaW5mb3JtYXRpb24gYXQgaHR0cDovL3d3dy5hcnRpZmV4LmNvbS8K
KyAgIG9yIGNvbnRhY3QgQXJ0aWZleCBTb2Z0d2FyZSwgSW5jLiwgIDcgTXQuIExhc3NlbiBEcml2
ZSAtIFN1aXRlIEEtMTM0LAorICAgU2FuIFJhZmFlbCwgQ0EgIDk0OTAzLCBVLlMuQS4sICsxKDQx
NSk0OTItOTg2MSwgZm9yIGZ1cnRoZXIgaW5mb3JtYXRpb24uCisqLworCisvKiRJZDogZ3Npb3Jh
bS5jIDY2NTEgMjAwNi0wMy0xMyAxNjoxODoxOVogc3RlZmFuICQgKi8KKy8qICVyYW0qJSBSQU1E
aXNrIElPRGV2aWNlIGltcGxlbWVudGF0aW9uIGZvciBHaG9zdHNjcmlwdCAqLworCisvKgorICog
VGhpcyBmaWxlIGNvbnRhaW5zIHRoZSBzb3VyY2VzIGZvciBpbXBsbWVudGluZyB0aGUgJ2ZsYXQn
IHJhbSBkaXNrCisgKiBmaWxlIHN0cnVjdHVyZSBzcGVjaWZpZWQgYnkgQWRvYmUuICBUaGlzIGZp
bGUgc3RydWN0dXJlIGlzIHVzZWQKKyAqIHRvIGltcGxlbWVudCB0aGUgSS9PIGRldmljZXMgcmVm
ZXJlZCB0byBhcyAlcmFtJSBvciAlcmFtMCUgdG8gJXJhbTklLgorICoKKyAqIFRoZXNlICdkaXNr
cycgYXJlIGltcGxlbWVudGVkIGFzIHRlbXBvcmFyeSBkaXJlY3RvcmllcyB1bmRlciAvdG1wLgor
ICoKKyAqLworCisjaW5jbHVkZSAiZXJybm9fLmgiCisjaW5jbHVkZSAic3RyaW5nXy5oIgorI2lu
Y2x1ZGUgInVuaXN0ZF8uaCIKKyNpbmNsdWRlICJkaXJlbnRfLmgiCisjaW5jbHVkZSAiZ3guaCIK
KyNpbmNsdWRlICJnc2Vycm9ycy5oIgorI2luY2x1ZGUgImdwLmgiCisjaW5jbHVkZSAiZ3NjZGVm
cy5oIgorI2luY2x1ZGUgImdzcGFyYW0uaCIKKyNpbmNsdWRlICJnc3N0cnVjdC5oIgorI2luY2x1
ZGUgImd4aW9kZXYuaCIKKyNpbmNsdWRlICJnc3V0aWwuaCIKKyNpbmNsdWRlICJnc21hbGxvYy5o
IgorI2luY2x1ZGUgImdzaW9tYXAuaCIKKworLyogRnVuY3Rpb24gcHJvdG90eXBlcyAqLworcHJp
dmF0ZSBpb2Rldl9wcm9jX2luaXQocmFtZGlza19pbml0KTsKK3ByaXZhdGUgaW9kZXZfcHJvY19z
aHV0ZG93bihyYW1kaXNrX3NodXRkb3duKTsKK3ByaXZhdGUgaW9kZXZfcHJvY19mb3BlbihyYW1k
aXNrX2ZvcGVuKTsKK3ByaXZhdGUgaW9kZXZfcHJvY19kZWxldGVfZmlsZShyYW1kaXNrX2RlbGV0
ZSk7Citwcml2YXRlIGlvZGV2X3Byb2NfcmVuYW1lX2ZpbGUocmFtZGlza19yZW5hbWUpOworcHJp
dmF0ZSBpb2Rldl9wcm9jX2ZpbGVfc3RhdHVzKHJhbWRpc2tfc3RhdHVzKTsKK3ByaXZhdGUgaW9k
ZXZfcHJvY19lbnVtZXJhdGVfZmlsZXMocmFtZGlza19lbnVtZXJhdGVfZmlsZXMpOworcHJpdmF0
ZSBpb2Rldl9wcm9jX2VudW1lcmF0ZV9uZXh0KHJhbWRpc2tfZW51bWVyYXRlX25leHQpOworcHJp
dmF0ZSBpb2Rldl9wcm9jX2VudW1lcmF0ZV9jbG9zZShyYW1kaXNrX2VudW1lcmF0ZV9jbG9zZSk7
Citwcml2YXRlIGlvZGV2X3Byb2NfZ2V0X3BhcmFtcyhyYW1kaXNrX2dldF9wYXJhbXMpOworcHJp
dmF0ZSBpb2Rldl9wcm9jX3B1dF9wYXJhbXMocmFtZGlza19wdXRfcGFyYW1zKTsKKworLyogRGVm
aW5lIGEgcmFtZGlzayAoJXJhbWRpc2slKSBkZXZpY2UgbWFjcm8gKi8KKyNkZWZpbmUgcmFtZGlz
ayh2YXJuYW1lLHJhbWRpc2thbWUpIFwKK2NvbnN0IGd4X2lvX2RldmljZSB2YXJuYW1lID0gXAor
eyBcCisgICAgcmFtZGlza2FtZSwgIkZpbGVTeXN0ZW0iLCBcCisgICAge3JhbWRpc2tfaW5pdCwg
XAorICAgICByYW1kaXNrX3NodXRkb3duLCBcCisgICAgIE5VTEwsIFwKKyAgICAgTlVMTCwgXAor
ICAgICByYW1kaXNrX2ZvcGVuLCBcCisgICAgIGlvZGV2X29zX2ZjbG9zZSwgXAorICAgICByYW1k
aXNrX2RlbGV0ZSwgXAorICAgICByYW1kaXNrX3JlbmFtZSwgXAorICAgICByYW1kaXNrX3N0YXR1
cywgXAorICAgICByYW1kaXNrX2VudW1lcmF0ZV9maWxlcywgXAorICAgICByYW1kaXNrX2VudW1l
cmF0ZV9uZXh0LCBcCisgICAgIHJhbWRpc2tfZW51bWVyYXRlX2Nsb3NlLCBcCisgICAgIHJhbWRp
c2tfZ2V0X3BhcmFtcywgXAorICAgICByYW1kaXNrX3B1dF9wYXJhbXMgXAorICAgIH0gXAorfQor
CisKKy8qCisgKiBEZWZpbmUgdGhlIHJhbSAoJXJhbSolKSBkZXZpY2VzLiBUaGVzZSBkZXZpY2Vz
IGFyZQorICogdXNlZCBpbiB0aGUgZGV2aWNlIGxpc3QgaW4gZ2NvbmYuYy4KKyAqLworcmFtZGlz
ayhnc19pb2Rldl9yYW0sICIlcmFtJSIpOworcmFtZGlzayhnc19pb2Rldl9yYW0wLCAiJXJhbTAl
Iik7CityYW1kaXNrKGdzX2lvZGV2X3JhbTEsICIlcmFtMSUiKTsKKworI3VuZGVmIHJhbWRpc2sK
KworI2RlZmluZSBSQU1ESVNLX0JMT0NLX1NJWkUgMTAyNAorI2RlZmluZSBSQU1ESVNLX0JMT0NL
X01BWCAxMDI0CisKK3R5cGVkZWYgc3RydWN0IHJhbWRpc2tfc3RhdGVfcworeworICAgIGNoYXIg
KnJvb3Q7CisgICAgZ3NfbWVtb3J5X3QgKm1lbTsKK30gcmFtZGlza19zdGF0ZTsKKworZ3NfcHJp
dmF0ZV9zdF9jb25zdF9zdHJpbmdzMV9wdHJzMShzdF9yYW1kaXNrX3N0YXRlLCBzdHJ1Y3QgcmFt
ZGlza19zdGF0ZV9zLAorCQkJCSAgICJyYW1kaXNrX3N0YXRlIiwgcmFtZGlza19zdGF0ZV9lbnVt
X3B0cnMsCisJCQkJICAgcmFtZGlza19zdGF0ZV9yZWxvY19wdHJzLCByb290LCBtZW0pOworCisK
Ky8qIHJlbW92ZSBhbGwgZmlsZXMgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IGZvciB0aGlzIHJhbWRp
c2ssCisgKiB0aGVuIHRoZSByb290IGRpcmVjdG9yeSBpdHNlbGYuICBJZiB0aGVyZSdzIGFuIGVy
cm9yIGluIGRlbGV0aW5nCisgKiBhIGZpbGUsIHdlIHN0b3AgYXQgdGhhdCBwb2ludCBpbnN0ZWFk
IG9mIGFnZ3Jlc2l2ZWx5IHRyeWluZyB0byBkZWxldGUKKyAqIGV2ZXJ5dGhpbmcuCisgKi8KK3By
aXZhdGUgaW50CityYW1kaXNrX2RlbGV0ZV9hbGxfZmlsZXMocmFtZGlza19zdGF0ZSAqIHJhbWRp
c2spCit7CisgICAgRElSICpkaXI7CisgICAgc3RydWN0IGRpcmVudCAqZGlyZW50OworCisgICAg
Y2hhciByZWFsbmFtZVtncF9maWxlX25hbWVfc2l6ZW9mXTsKKyAgICBpbnQgbmFtZWxlbjsKKwor
ICAgIGlmIChyYW1kaXNrID09IE5VTEwpCisJcmV0dXJuX2Vycm9yKGdzX2Vycm9yX2lvZXJyb3Ip
OworCisgICAgbmFtZWxlbiA9IHN0cmxlbihyYW1kaXNrLT5yb290KSAtIDE7CisgICAgc3RybmNw
eShyZWFsbmFtZSwgcmFtZGlzay0+cm9vdCwgbmFtZWxlbik7CisKKyAgICBpZiAoKGRpciA9IG9w
ZW5kaXIocmFtZGlzay0+cm9vdCkpID09IE5VTEwpCisJcmV0dXJuX2Vycm9yKGdzX2Vycm9yX2lv
ZXJyb3IpOworCisgICAgd2hpbGUgKChkaXJlbnQgPSByZWFkZGlyKGRpcikpICE9IE5VTEwpIHsK
KworCWlmIChzdHJjbXAoZGlyZW50LT5kX25hbWUsICIuIikgIT0gMCAmJgorCSAgICBzdHJjbXAo
ZGlyZW50LT5kX25hbWUsICIuLiIpICE9IDApIHsKKworCSAgICBzdHJjcHkocmVhbG5hbWUsIHJh
bWRpc2stPnJvb3QpOworCSAgICBzdHJjYXQocmVhbG5hbWUsIGRpcmVudC0+ZF9uYW1lKTsKKwor
CSAgICBpZiAodW5saW5rKHJlYWxuYW1lKSAhPSAwKSB7CisJCXJldHVybl9lcnJvcihnc19lcnJv
cl9pb2Vycm9yKTsKKwkgICAgfQorCX0KKyAgICB9CisKKyAgICBjbG9zZWRpcihkaXIpOworCisg
ICAgaWYgKHJtZGlyKHJhbWRpc2stPnJvb3QpICE9IDApCisJcmV0dXJuX2Vycm9yKGdzX2Vycm9y
X2lvZXJyb3IpOworCisgICAgcmV0dXJuIDA7Cit9CisKKworLyogZmluZCBhIHNjcmF0Y2ggZGly
ZWN0b3J5IGZvciB0aGUgInJhbWRpc2siLCBhbmQgdGhlbiBzYXZlCisgKiB0aGUgbmFtZSBpbnRv
IHRoZSByYW1kaXNrX3N0YXRlLiAgdGhpcyBpcyBjYWxsZWQgYXQgaW5pdAorICogdGltZSwgYW5k
IHdoZW5ldmVyIHdlIG5lZWQgdG8gcmVpbml0aWFsaXplIHRoZSByYW1kaXNrCisgKi8KK3ByaXZh
dGUgaW50CityYW1kaXNrX2NyZWF0ZV93b3JraW5nX2RpcmVjdG9yeShyYW1kaXNrX3N0YXRlICog
cHN0YXRlKQoreworICAgIGNoYXIgKmRuYW1lOworCisjZGVmaW5lIERJUk5BTUVfU0laRSAzMgor
ICAgIGNoYXIgZGlybmFtZVtESVJOQU1FX1NJWkVdOworCisgICAgc3RyY3B5KGRpcm5hbWUsICJn
c3JhbS0iKTsKKworICAgIGlmICgoZG5hbWUgPSBncF9jcmVhdGVfc2NyYXRjaF9kaXJlY3Rvcnko
ZGlybmFtZSkpKSB7CisJcHN0YXRlLT5yb290ID0gc3RyZHVwKGRuYW1lKTsKKyAgICB9IGVsc2Ug
eworCXJldHVybl9lcnJvcihnc19lcnJvcl91bmRlZmluZWRmaWxlbmFtZSk7CisgICAgfQorCisg
ICAgcmV0dXJuIDA7Cit9CisKKworCitwcml2YXRlIGludAorcmFtZGlza19pbml0KGd4X2lvX2Rl
dmljZSAqIGlvZGV2LCBnc19tZW1vcnlfdCAqIG1lbSkKK3sKKyAgICBpbnQgY29kZTsKKworICAg
IHJhbWRpc2tfc3RhdGUgKnBzdGF0ZSA9CisJZ3NfYWxsb2Nfc3RydWN0KG1lbSwgcmFtZGlza19z
dGF0ZSwgJnN0X3JhbWRpc2tfc3RhdGUsCisJCQkiaW9kZXZfcmFtZGlza19pbml0KHN0YXRlKSIp
OworCisgICAgaWYgKCFwc3RhdGUpCisJcmV0dXJuIGdzX2Vycm9yX1ZNZXJyb3I7CisKKyAgICBp
ZiAoKGNvZGUgPSByYW1kaXNrX2NyZWF0ZV93b3JraW5nX2RpcmVjdG9yeShwc3RhdGUpKSAhPSAw
KQorCXJldHVybl9lcnJvcihjb2RlKTsKKworICAgIHBzdGF0ZS0+bWVtID0gbWVtOworICAgIGlv
ZGV2LT5zdGF0ZSA9IHBzdGF0ZTsKKyAgICByZXR1cm4gMDsKK30KKworCitwcml2YXRlIGludAor
cmFtZGlza19zaHV0ZG93bihneF9pb19kZXZpY2UgKiBpb2RldikKK3sKKyAgICByYW1kaXNrX3N0
YXRlICpwc3RhdGUgPSAocmFtZGlza19zdGF0ZSAqKSBpb2Rldi0+c3RhdGU7CisKKyAgICByZXR1
cm4gcmFtZGlza19kZWxldGVfYWxsX2ZpbGVzKHBzdGF0ZSk7Cit9CisKKworCitwcml2YXRlIGlu
dAorcmFtZGlza19kZWxldGUoZ3hfaW9fZGV2aWNlICogaW9kZXYsIGNvbnN0IGNoYXIgKmZuYW1l
KQoreworICAgIGNoYXIgcmVhbG5hbWVbZ3BfZmlsZV9uYW1lX3NpemVvZl07CisgICAgcmFtZGlz
a19zdGF0ZSAqcHN0YXRlID0gKHJhbWRpc2tfc3RhdGUgKikgaW9kZXYtPnN0YXRlOworCisgICAg
LyogRXhpdCBpZiB3ZSBkbyBub3QgaGF2ZSBhIHJvb3QgbG9jYXRpb24gKi8KKyAgICBpZiAoIXBz
dGF0ZS0+cm9vdCkKKwlyZXR1cm5fZXJyb3IoZ3NfZXJyb3JfdW5kZWZpbmVkZmlsZW5hbWUpOwor
CisgICAgLyogTWFwIGZpbGVuYW1lIChpZiBpdCBleGlzdHMpLiAqLworICAgIGlmICghbWFwX2Zp
bGVfbmFtZV9nZXQocHN0YXRlLT5yb290LCBmbmFtZSwgcmVhbG5hbWUpKQorCXJldHVybl9lcnJv
cihnc19lcnJvcl91bmRlZmluZWRmaWxlbmFtZSk7CisKKyAgICBtYXBfZmlsZV9uYW1lX2RlbChw
c3RhdGUtPnJvb3QsIGZuYW1lKTsKKyAgICByZXR1cm4gKHVubGluayhyZWFsbmFtZSkgPT0gMCA/
IDAgOiBnc19lcnJvcl9pb2Vycm9yKTsKK30KKworCitwcml2YXRlIGludAorcmFtZGlza19yZW5h
bWUoZ3hfaW9fZGV2aWNlICogaW9kZXYsIGNvbnN0IGNoYXIgKmZyb20sIGNvbnN0IGNoYXIgKnRv
KQoreworICAgIGNoYXIgdG9yZWFsW2dwX2ZpbGVfbmFtZV9zaXplb2ZdOworICAgIHJhbWRpc2tf
c3RhdGUgKnBzdGF0ZSA9IChyYW1kaXNrX3N0YXRlICopIGlvZGV2LT5zdGF0ZTsKKyAgICBpbnQg
Y29kZSA9IDA7CisKKyAgICAvKiBFeGl0IGlmIHdlIGRvIG5vdCBoYXZlIGEgcm9vdCBsb2NhdGlv
biAqLworICAgIGlmICghcHN0YXRlLT5yb290KQorCXJldHVybl9lcnJvcihnc19lcnJvcl91bmRl
ZmluZWRmaWxlbmFtZSk7CisKKyAgICAvKiBpZiBmaWxlbmFtZXMgYXJlIHRoZSBzYW1lIHRoZW0g
d2UgYXJlIGRvbmUuICovCisgICAgaWYgKHN0cmNtcCh0bywgZnJvbSkgPT0gMCkKKwlyZXR1cm4g
MDsKKworICAgIC8qCisgICAgICogSWYgdGhlIGRlc3RpbmF0aW9uIGZpbGUgYWxyZWFkeSBleGlz
dHMsIHRoZW4gd2Ugd2FudCB0byBkZWxldGUgaXQuCisgICAgICovCisgICAgaWYgKG1hcF9maWxl
X25hbWVfZ2V0KHBzdGF0ZS0+cm9vdCwgdG8sIHRvcmVhbCkpIHsKKwltYXBfZmlsZV9uYW1lX2Rl
bChwc3RhdGUtPnJvb3QsIHRvKTsKKwljb2RlID0gdW5saW5rKHRvcmVhbCkgPT0gMCA/IDAgOiBn
c19lcnJvcl9pb2Vycm9yOworICAgIH0KKworICAgIG1hcF9maWxlX25hbWVfcmVuKHBzdGF0ZS0+
cm9vdCwgZnJvbSwgdG8pOworICAgIHJldHVybiBjb2RlOworfQorCisKK3ByaXZhdGUgaW50City
YW1kaXNrX3N0YXR1cyhneF9pb19kZXZpY2UgKiBpb2RldiwgY29uc3QgY2hhciAqZm5hbWUsIHN0
cnVjdCBzdGF0ICpwc3RhdCkKK3sKKyAgICBjaGFyIHJlYWxuYW1lW2dwX2ZpbGVfbmFtZV9zaXpl
b2ZdOworICAgIHJhbWRpc2tfc3RhdGUgKnBzdGF0ZSA9IChyYW1kaXNrX3N0YXRlICopIGlvZGV2
LT5zdGF0ZTsKKworICAgIC8qIEV4aXQgaWYgd2UgZG8gbm90IGhhdmUgYSByb290IGxvY2F0aW9u
ICovCisgICAgaWYgKCFwc3RhdGUtPnJvb3QpCisJcmV0dXJuX2Vycm9yKGdzX2Vycm9yX3VuZGVm
aW5lZGZpbGVuYW1lKTsKKworICAgIC8qIE1hcCBmaWxlbmFtZSAoaWYgaXQgZXhpc3RzKS4gKi8K
KyAgICBpZiAoIW1hcF9maWxlX25hbWVfZ2V0KHBzdGF0ZS0+cm9vdCwgZm5hbWUsIHJlYWxuYW1l
KSkKKwlyZXR1cm5fZXJyb3IoZ3NfZXJyb3JfdW5kZWZpbmVkZmlsZW5hbWUpOworCisgICAgcmV0
dXJuIChzdGF0KChjaGFyICopcmVhbG5hbWUsIHBzdGF0KSA8CisJICAgIDAgPyBnc19lcnJvcl91
bmRlZmluZWRmaWxlbmFtZSA6IDApOworfQorCisKK3ByaXZhdGUgdm9pZAorcmFtZGlza19lbnVt
ZXJhdGVfY2xvc2UoZmlsZV9lbnVtICogcGZlbikKK3sKKyAgICBtYXBfZmlsZV9lbnVtX2Nsb3Nl
KCh2b2lkICopcGZlbik7Cit9CisKKworcHJpdmF0ZSB1aW50CityYW1kaXNrX2VudW1lcmF0ZV9u
ZXh0KGZpbGVfZW51bSAqIHBmZW4sIGNoYXIgKnB0ciwgdWludCBtYXhsZW4pCit7CisgICAgaWYg
KG1hcF9maWxlX2VudW1fbmV4dCgodm9pZCAqKXBmZW4sIHB0cikpCisJcmV0dXJuIHN0cmxlbihw
dHIpOworICAgIC8qIElmIHdlIGRpZCBub3QgZmluZCBhIGZpbGUgdGhlbiBjbGVhbiB1cCAqLwor
ICAgIHJhbWRpc2tfZW51bWVyYXRlX2Nsb3NlKHBmZW4pOworICAgIHJldHVybiB+KHVpbnQpIDA7
Cit9CisKKworcHJpdmF0ZSBpbnQKK3JhbWRpc2tfZ2V0X3BhcmFtcyhneF9pb19kZXZpY2UgKiBp
b2RldiwgZ3NfcGFyYW1fbGlzdCAqIHBsaXN0KQoreworICAgIGludCBjb2RlOworICAgIGludCBz
byA9IDEwMDsKKyAgICBib29sIGJ0cnVlID0gdHJ1ZSwgYmZhbHNlID0gZmFsc2U7CisgICAgaW50
IEJsb2NrU2l6ZTsKKyAgICBpbnQgSW5pdGlhbGl6ZTsKKyAgICBpbnQgRnJlZTsKKyAgICBpbnQg
UGh5c2ljYWxTaXplOworICAgIGludCBMb2dpY2FsU2l6ZTsKKyAgICBnc19wYXJhbV9zdHJpbmcg
cm9vdF9wYXJhbTsKKyAgICByYW1kaXNrX3N0YXRlICpwc3RhdGUgPSAocmFtZGlza19zdGF0ZSAq
KSBpb2Rldi0+c3RhdGU7CisKKyAgICBJbml0aWFsaXplID0gRnJlZSA9IDA7CisKKyAgICBQaHlz
aWNhbFNpemUgPSBMb2dpY2FsU2l6ZSA9IEJsb2NrU2l6ZSA9IFJBTURJU0tfQkxPQ0tfU0laRTsK
KworICAgIGlmIChwc3RhdGUpIHsKKwlwYXJhbV9zdHJpbmdfZnJvbV9zdHJpbmcocm9vdF9wYXJh
bSwgcHN0YXRlLT5yb290KTsKKyAgICB9IGVsc2UgeworCXJldHVybl9lcnJvcihnc19lcnJvcl9p
b2Vycm9yKTsKKyAgICB9CisKKworICAgIGNvZGUgPSBwYXJhbV93cml0ZV9ib29sKHBsaXN0LCAi
SGFzTmFtZXMiLCAmYnRydWUpIDwgMCB8fAorCXBhcmFtX3dyaXRlX2Jvb2wocGxpc3QsICJNb3Vu
dGVkIiwgJmJ0cnVlKSA8IDAgfHwKKwlwYXJhbV93cml0ZV9ib29sKHBsaXN0LCAiUmVtb3ZhYmxl
IiwgJmJ0cnVlKSA8IDAgfHwKKwlwYXJhbV93cml0ZV9ib29sKHBsaXN0LCAiV3JpdGVhYmxlIiwg
JmJ0cnVlKSA8IDAgfHwKKwlwYXJhbV93cml0ZV9ib29sKHBsaXN0LCAiU2VhcmNoYWJsZSIsICZi
ZmFsc2UpIDwgMCB8fAorCXBhcmFtX3dyaXRlX3N0cmluZyhwbGlzdCwgIlJvb3QiLCAmcm9vdF9w
YXJhbSkgPCAwIHx8CisJcGFyYW1fd3JpdGVfaW50KHBsaXN0LCAiU2VhcmNoT3JkZXIiLCAmc28p
IDwgMCB8fAorCXBhcmFtX3dyaXRlX2ludChwbGlzdCwgIkJsb2NrU2l6ZSIsICZCbG9ja1NpemUp
IDwgMCB8fAorCXBhcmFtX3dyaXRlX2ludChwbGlzdCwgIkZyZWUiLCAmRnJlZSkgPCAwIHx8CisJ
cGFyYW1fd3JpdGVfaW50KHBsaXN0LCAiUGh5c2ljYWxTaXplIiwgJlBoeXNpY2FsU2l6ZSkgPCAw
IHx8CisJcGFyYW1fd3JpdGVfaW50KHBsaXN0LCAiTG9naWNhbFNpemUiLCAmTG9naWNhbFNpemUp
IDwgMCB8fAorCXBhcmFtX3dyaXRlX2ludChwbGlzdCwgIkluaXRpYWxpemVBY3Rpb24iLCAmSW5p
dGlhbGl6ZSkgPCAwOworICAgIHJldHVybiBjb2RlOworfQorCisKK3ByaXZhdGUgaW50CityYW1k
aXNrX3B1dF9wYXJhbXMoZ3hfaW9fZGV2aWNlICogaW9kZXYsIGdzX3BhcmFtX2xpc3QgKiBwbGlz
dCkKK3sKKyAgICByYW1kaXNrX3N0YXRlICpwc3RhdGUgPSAocmFtZGlza19zdGF0ZSAqKSBpb2Rl
di0+c3RhdGU7CisgICAgaW50IEluaXRpYWxpemUgPSAtMTsKKworICAgIGJvb2wgZG9faW5pdGlh
bGl6YXRpb24gPSBmYWxzZTsKKyAgICBpbnQgY29kZTsKKworICAgIGNvZGUgPSBwYXJhbV9yZWFk
X2ludChwbGlzdCwgIkluaXRpYWxpemVBY3Rpb24iLCAmSW5pdGlhbGl6ZSk7CisgICAgaWYgKGNv
ZGUgPT0gMCkgeworCWRvX2luaXRpYWxpemF0aW9uID0gKEluaXRpYWxpemUgPT0gMSk7CisgICAg
fSBlbHNlIGlmIChjb2RlID09IDEpIHsKKwkvKiBkbyBub3RoaW5nICovCisgICAgfSBlbHNlIHsK
KwlwYXJhbV9zaWduYWxfZXJyb3IocGxpc3QsICJJbml0aWFsaXplQWN0aW9uIiwgY29kZSk7Cisg
ICAgfQorCisgICAgLyogYSByZWFsIHJhbWRpc2sgaW1wbGVtZW50YXRpb24gc2hvdWxkIGNoZWNr
IGZvciBhIGNoYW5nZQorICAgICAqIGluIHRoZSBMb2dpY2FsU2l6ZSBwYXJhbWV0ZXIgYXQgdGhp
cyBwb2ludAorICAgICAqLworCisgICAgaWYgKGRvX2luaXRpYWxpemF0aW9uKSB7CisJcmV0dXJu
IHJhbWRpc2tfZGVsZXRlX2FsbF9maWxlcyhwc3RhdGUpIHx8CisJICAgIHJhbWRpc2tfY3JlYXRl
X3dvcmtpbmdfZGlyZWN0b3J5KHBzdGF0ZSk7CisKKyAgICB9CisKKyAgICByZXR1cm4gMDsKK30K
KworCisKKworCitwcml2YXRlIGZpbGVfZW51bSAqCityYW1kaXNrX2VudW1lcmF0ZV9maWxlcyhn
eF9pb19kZXZpY2UgKiBpb2RldiwgY29uc3QgY2hhciAqcGF0LCB1aW50IHBhdGxlbiwKKwkJCWdz
X21lbW9yeV90ICogbWVtKQoreworICAgIGNoYXIgcGF0c3RyW2dwX2ZpbGVfbmFtZV9zaXplb2Zd
OworICAgIHJhbWRpc2tfc3RhdGUgKnBzdGF0ZSA9IChyYW1kaXNrX3N0YXRlICopIGlvZGV2LT5z
dGF0ZTsKKworICAgIG1lbWNweShwYXRzdHIsIHBhdCwgcGF0bGVuKTsJLyogQ29weSBzdHJpbmcg
dG8gYnVmZmVyICovCisgICAgcGF0c3RyW3BhdGxlbl0gPSAwOwkJLyogVGVybWluYXRlIHN0cmlu
ZyAqLworICAgIHJldHVybiAoZmlsZV9lbnVtICopIG1hcF9maWxlX2VudW1faW5pdChtZW0sIHBz
dGF0ZS0+cm9vdCwgcGF0c3RyKTsKK30KKworCisKK3ByaXZhdGUgaW50CityYW1kaXNrX2ZvcGVu
KGd4X2lvX2RldmljZSAqIGlvZGV2LCBjb25zdCBjaGFyICpmbmFtZSwgY29uc3QgY2hhciAqYWNj
ZXNzLAorCSAgICAgIEZJTEUgKiogcGZpbGUsIGNoYXIgKnJmbmFtZSwgdWludCBybmFtZWxlbikK
K3sKKyAgICBjaGFyIHJlYWxuYW1lW2dwX2ZpbGVfbmFtZV9zaXplb2ZdOworICAgIHJhbWRpc2tf
c3RhdGUgKnBzdGF0ZSA9IChyYW1kaXNrX3N0YXRlICopIGlvZGV2LT5zdGF0ZTsKKworICAgIC8q
IEV4aXQgaWYgd2UgZG8gbm90IGhhdmUgYSByb290IGxvY2F0aW9uICovCisgICAgaWYgKCFwc3Rh
dGUtPnJvb3QpCisJcmV0dXJuX2Vycm9yKGdzX2Vycm9yX3VuZGVmaW5lZGZpbGVuYW1lKTsKKwor
ICAgIC8qIFJlbWFwIGZpbGVuYW1lIChpZiBpdCBleGlzdHMpLiAqLworICAgIGlmICghbWFwX2Zp
bGVfbmFtZV9nZXQocHN0YXRlLT5yb290LCBmbmFtZSwgcmVhbG5hbWUpKSB7CisJaWYgKHN0cmNo
cihhY2Nlc3MsICd3JykpIHsKKwkgICAgbWFwX2ZpbGVfbmFtZV9hZGQocHN0YXRlLT5yb290LCBm
bmFtZSk7CisJICAgIG1hcF9maWxlX25hbWVfZ2V0KHBzdGF0ZS0+cm9vdCwgZm5hbWUsIHJlYWxu
YW1lKTsKKwl9IGVsc2UKKwkgICAgcmV0dXJuX2Vycm9yKGdzX2Vycm9yX3VuZGVmaW5lZGZpbGVu
YW1lKTsKKyAgICB9CisKKyAgICByZXR1cm4gaW9kZXZfb3NfZm9wZW4oaW9kZXZfZGVmYXVsdCwg
cmVhbG5hbWUsIGFjY2VzcywgcGZpbGUsIHJmbmFtZSwKKwkJCSAgcm5hbWVsZW4pOworfQpJbmRl
eDogc3JjL2xpYi5tYWsKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gc3JjL2xpYi5tYWsJKC4uLi90YWdzL2dzOC41
NCkJKHJldmlzaW9uIDIyKQorKysgc3JjL2xpYi5tYWsJKC4uLi90cnVuay9ncykJKHJldmlzaW9u
IDIyKQpAQCAtMTA0LDYgKzEwNCw3IEBACiAKICMgTWlzY2VsbGFuZW91cwogCitnc2lvbWFwX2g9
JChHTFNSQylnc2lvbWFwLmgKIGdzaW9faD0kKEdMU1JDKWdzaW8uaAogZ3hzdGRpb19oPSQoR0xT
UkMpZ3hzdGRpby5oICQoZ3Npb19oKQogZ3NfZGxsX2NhbGxfaD0kKEdMU1JDKWdzX2RsbF9jYWxs
LmgKQEAgLTI2MzcsMjAgKzI2MzgsMzMgQEAKIE1LUk9NRlNfQ09NTU9OX0RFUFM9JChzdGRwcmVf
aCkgJChzdGRpbnRfX2gpICQoZ3Npb3JvbV9oKSBcCiAJJChnc21lbXJldF9oKSAkKGdzbWFsbG9j
X2gpICQoZ3NzdHlwZV9oKSAkKGdwX2gpICQodGltZV9faCkKIAotIyBUaGUgZm9sbG93aW5nIGlz
IG9ubHkgYW5kIGV4YW1wbGUgc2luY2UgdGhlICVyb20lIElPRGV2aWNlIGlzIG5vdCBleGNsdXNp
dmVseQorIyBUaGUgZm9sbG93aW5nIGlzIG9ubHkgYW4gZXhhbXBsZSBzaW5jZSB0aGUgJXJvbSUg
SU9EZXZpY2UgaXMgbm90IGV4Y2x1c2l2ZWx5CiAjIGEgUG9zdFNjcmlwdCBmZWF0dXJlIChhbHRo
b3VnaCBpdCBpcyB1c3VhbGx5IHVzZWQgZm9yIENPTVBJTEVfSU5JVFMKICMgSWYgbm90IHVzaW5n
IHRoZSBQUyBpbnRlcnByZXRlciwgdGhlIHJ1bGUgZm9yIGdzcm9tZnMuYyBpbiBpbnQubWFrIGlz
IG5vdCB1c2VkCiAjIEluIHRoYXQgY2FzZSBidWlsZCBpdCBoZXJlIHVzaW5nIHRoZSBleGFtcGxl
IGJlbG93OgogIyAkKEdMT0JKKWdzcm9tZnMuYzogJChHTFNSQylta3JvbWZzLmMgJChNS1JPTUZT
X1hFKQogIyAJJChFWFApJChNS1JPTUZTX1hFKSAtbyAkKEdMT0JKKWdzcm9tZnMuYyAtYyAtUCBt
eV9yb21fY29udGVudHMvICoKIAorJChHTE9CSilnc2lvbWFwLiQoT0JKKSA6ICQoR0xTUkMpZ3Np
b21hcC5jICQoR1hFUlIpXAorICQoZXJybm9fX2gpICQoc3RyaW5nX19oKSAkKHVuaXN0ZF9faClc
CisgJChncF9oKSAkKGdzY2RlZnNfaCkgJChnc3BhcmFtX2gpICQoZ3NzdHJ1Y3RfaCkgJChneGlv
ZGV2X2gpICQoZ3N1dGlsX2gpICQoZ3Npb21hcF9oKQorCSQoR0xDQykgJChHTE9fKWdzaW9tYXAu
JChPQkopICQoQ18pICQoR0xTUkMpZ3Npb21hcC5jCisKKwogIyAtLS0tLS0tLS0tLS0tLS0tIFN1
cHBvcnQgZm9yICVkaXNrIElPRGV2aWNlcyAtLS0tLS0tLS0tLS0tLS0tICMKICMgVGhlIGZvbGxv
d2luZyBtb2R1bGUgaXMgaW5jbHVkZWQgb25seSBpZiB0aGUgZGlza24uZGV2IEZFQVRVUkUgaXMg
aW5jbHVkZWQKICQoR0xPQkopZ3Npb2Rpc2suJChPQkopIDogJChHTFNSQylnc2lvZGlzay5jICQo
R1hFUlIpXAogICQoZXJybm9fX2gpICQoc3RyaW5nX19oKSAkKHVuaXN0ZF9faClcCi0gJChncF9o
KSAkKGdzY2RlZnNfaCkgJChnc3BhcmFtX2gpICQoZ3NzdHJ1Y3RfaCkgJChneGlvZGV2X2gpICQo
Z3N1dGlsX2gpCisgJChncF9oKSAkKGdzY2RlZnNfaCkgJChnc3BhcmFtX2gpICQoZ3NzdHJ1Y3Rf
aCkgJChneGlvZGV2X2gpICQoZ3N1dGlsX2gpICQoZ3Npb21hcF9oKQogCSQoR0xDQykgJChHTE9f
KWdzaW9kaXNrLiQoT0JKKSAkKENfKSAkKEdMU1JDKWdzaW9kaXNrLmMKIAorIyAtLS0tLS0tLS0t
LS0tLS0tIFN1cHBvcnQgZm9yICVyYW0gSU9EZXZpY2VzIC0tLS0tLS0tLS0tLS0tLS0gIworIyBU
aGUgZm9sbG93aW5nIG1vZHVsZSBpcyBpbmNsdWRlZCBvbmx5IGlmIHRoZSByYW1kaXNrbi5kZXYg
RkVBVFVSRSBpcyBpbmNsdWRlZAorJChHTE9CSilnc2lvcmFtLiQoT0JKKSA6ICQoR0xTUkMpZ3Np
b3JhbS5jICQoR1hFUlIpXAorICQoZXJybm9fX2gpICQoc3RyaW5nX19oKSAkKHVuaXN0ZF9faClc
CisgJChncF9oKSAkKGdzY2RlZnNfaCkgJChnc3BhcmFtX2gpICQoZ3NzdHJ1Y3RfaCkgJChneGlv
ZGV2X2gpICQoZ3N1dGlsX2gpICQoZ3Npb21hcF9oKQorCSQoR0xDQykgJChHTE9fKWdzaW9yYW0u
JChPQkopICQoQ18pICQoR0xTUkMpZ3Npb3JhbS5jCisKICMgLS0tLS0tLS0tLS0tIFN1cHBvcnQg
Zm9yICVtYWNyZXNvdXJjZSUgSU9EZXZpY2UgLS0tLS0tLS0tLS0tLSAjCiAjIFRoaXMgaXMgdXNl
ZCB0byBsb2FkIG5hdGl2ZS1mb3JtYXQgZm9udHMgb24gTWFjT1MKICMgRGVmaW5lIHRoZSBtYWNy
ZXMuZGV2IEZFQVRVUkUKSW5kZXg6IHNyYy9nc2lvbWFwLmgKPT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gc3JjL2dz
aW9tYXAuaAkoLi4uL3RhZ3MvZ3M4LjU0KQkocmV2aXNpb24gMCkKKysrIHNyYy9nc2lvbWFwLmgJ
KC4uLi90cnVuay9ncykJKHJldmlzaW9uIDIyKQpAQCAtMCwwICsxLDM4IEBACisvKiBDb3B5cmln
aHQgKEMpIDIwMDEtMjAwNiBhcnRvZmNvZGUgTExDLgorICAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4K
KyAgCisgICBUaGlzIHNvZnR3YXJlIGlzIHByb3ZpZGVkIEFTLUlTIHdpdGggbm8gd2FycmFudHks
IGVpdGhlciBleHByZXNzIG9yCisgICBpbXBsaWVkLgorCisgICBUaGlzIHNvZnR3YXJlIGlzIGRp
c3RyaWJ1dGVkIHVuZGVyIGxpY2Vuc2UgYW5kIG1heSBub3QgYmUgY29waWVkLCBtb2RpZmllZAor
ICAgb3IgZGlzdHJpYnV0ZWQgZXhjZXB0IGFzIGV4cHJlc3NseSBhdXRob3JpemVkIHVuZGVyIHRo
ZSB0ZXJtcyBvZiB0aGF0CisgICBsaWNlbnNlLiAgUmVmZXIgdG8gbGljZW5zaW5nIGluZm9ybWF0
aW9uIGF0IGh0dHA6Ly93d3cuYXJ0aWZleC5jb20vCisgICBvciBjb250YWN0IEFydGlmZXggU29m
dHdhcmUsIEluYy4sICA3IE10LiBMYXNzZW4gRHJpdmUgLSBTdWl0ZSBBLTEzNCwKKyAgIFNhbiBS
YWZhZWwsIENBICA5NDkwMywgVS5TLkEuLCArMSg0MTUpNDkyLTk4NjEsIGZvciBmdXJ0aGVyIGlu
Zm9ybWF0aW9uLgorKi8KKworLyokSWQ6IGdzaW9tYXAuaCA2NjUxIDIwMDYtMDMtMTMgMTY6MTg6
MTlaIHN0ZWZhbiAkICovCisvKiAlZGlzayolIGFuZCAlcmFtKiUgcG9ydGFibGUgZmlsZW5hbWUg
bWFwcGluZyBjb2RlICovCisKKwordm9pZCAqbWFwX2ZpbGVfZW51bV9pbml0KGdzX21lbW9yeV90
ICosIGNvbnN0IGNoYXIgKiwgY29uc3QgY2hhciAqKTsKK2Jvb2wgbWFwX2ZpbGVfZW51bV9uZXh0
KHZvaWQgKiwgY2hhciAqKTsKK3ZvaWQgbWFwX2ZpbGVfZW51bV9jbG9zZSh2b2lkICopOworYm9v
bCBtYXBfZmlsZV9uYW1lX2dldChjb25zdCBjaGFyICosIGNvbnN0IGNoYXIgKiwgY2hhciAqKTsK
K3ZvaWQgbWFwX2ZpbGVfbmFtZV9hZGQoY29uc3QgY2hhciAqLCBjb25zdCBjaGFyICopOwordm9p
ZCBtYXBfZmlsZV9uYW1lX3Jlbihjb25zdCBjaGFyKiwgY29uc3QgY2hhciAqLCBjb25zdCBjaGFy
ICopOwordm9pZCBtYXBfZmlsZV9uYW1lX2RlbChjb25zdCBjaGFyICosIGNvbnN0IGNoYXIgKik7
CisKKyNkZWZpbmUgTUFQX0ZJTEVfTkFNRSAibWFwLnR4dCIKKyNkZWZpbmUgVEVNUF9GSUxFX05B
TUUgIlRtcC50eHQiCisjZGVmaW5lIE1BUF9GSUxFX1ZFUlNJT04gMQorI2RlZmluZSBJbml0aWFs
TnVtYmVyIDAKKyNkZWZpbmUgQlVGRkVSX0xFTkdUSCBncF9maWxlX25hbWVfc2l6ZW9mCisKK3R5
cGVkZWYgc3RydWN0IG1hcF9maWxlX2VudW1fcyB7CisgICAgRklMRSAqICBzdHJlYW07ICAgICAg
ICAgLyogc3RyZWFtIHRvIG1hcCBmaWxlICovCisgICAgY2hhciAqICBwYXR0ZXJuOyAgICAgICAg
LyogcGF0dGVybiBwb2ludGVyICAgICovCisgICAgY2hhciAqICByb290OyAgICAgICAgICAgLyog
cm9vdCBwYXRoIHBvaW50ZXIgICovCisgICAgZ3NfbWVtb3J5X3QgKiBtZW1vcnk7ICAgLyogbWVt
b3J5IHN0cnVjdHVyZSB1c2VkICovCit9IG1hcF9maWxlX2VudW07CisKSW5kZXg6IHNyYy9ncF91
bmlmcy5jCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT0KLS0tIHNyYy9ncF91bmlmcy5jCSguLi4vdGFncy9nczguNTQpCShy
ZXZpc2lvbiAyMikKKysrIHNyYy9ncF91bmlmcy5jCSguLi4vdHJ1bmsvZ3MpCShyZXZpc2lvbiAy
MikKQEAgLTU1LDYgKzU1LDQ0IEBACiAvKiBEZWZpbmUgdGhlIG5hbWUgdGhhdCBkZXNpZ25hdGVz
IHRoZSBjdXJyZW50IGRpcmVjdG9yeS4gKi8KIGNvbnN0IGNoYXIgZ3BfY3VycmVudF9kaXJlY3Rv
cnlfbmFtZVtdID0gIi4iOwogCisKKy8qIENyZWF0ZSBhIHNjcmF0Y2ggZGlyZWN0b3J5IHdpdGgg
YSBnaXZlbiBuYW1lIHByZWZpeCAqLworLyogV3JpdGUgdGhlIGFjdHVhbCBkaXJlY3RvcnkgbmFt
ZSBhdCBkbmFtZS4gKi8KK2NoYXIgKgorZ3BfY3JlYXRlX3NjcmF0Y2hfZGlyZWN0b3J5IChjb25z
dCBjaGFyICpwcmVmaXgpCit7CisgICAgaW50IHByZWZpeF9sZW5ndGggPSBzdHJsZW4ocHJlZml4
KTsKKyAgICBpbnQgbGVuID0gZ3BfZmlsZV9uYW1lX3NpemVvZiAtIHByZWZpeF9sZW5ndGggLSA4
OworICAgIGNoYXIgZG5hbWVbZ3BfZmlsZV9uYW1lX3NpemVvZl07CisgICAgY2hhciAqcnY7CisK
KyAgICBpZiAoZ3BfZmlsZV9uYW1lX2lzX2Fic29sdXRlKHByZWZpeCwgcHJlZml4X2xlbmd0aCkp
CisJKmRuYW1lID0gMDsKKyAgICBlbHNlIGlmIChncF9nZXR0bXBkaXIoZG5hbWUsICZsZW4pICE9
IDApCisJc3RyY3B5KGRuYW1lLCAiL3RtcC8iKTsKKyAgICBlbHNlIHsKKwlpZiAoc3RybGVuKGRu
YW1lKSAhPSAwICYmIGRuYW1lW3N0cmxlbihkbmFtZSkgLSAxXSAhPSAnLycpCisJICAgIHN0cmNh
dChkbmFtZSwgIi8iKTsKKyAgICB9CisgICAgaWYgKHN0cmxlbihkbmFtZSkgKyBwcmVmaXhfbGVu
Z3RoICsgOCA+PSBncF9maWxlX25hbWVfc2l6ZW9mKQorCXJldHVybiAwOwkJLyogZmlsZSBuYW1l
IHRvbyBsb25nICovCisgICAgc3RyY2F0KGRuYW1lLCBwcmVmaXgpOworICAgIC8qIFByZXZlbnQg
dHJhaWxpbmcgWCdzIGluIHBhdGggZnJvbSBiZWluZyBjb252ZXJ0ZWQgYnkgbWt0ZW1wLiAqLwor
ICAgIGlmICgqZG5hbWUgIT0gMCAmJiBkbmFtZVtzdHJsZW4oZG5hbWUpIC0gMV0gPT0gJ1gnKQor
CXN0cmNhdChkbmFtZSwgIi0iKTsKKyAgICBzdHJjYXQoZG5hbWUsICJYWFhYWFgiKTsKKworI2lm
IEhBVkVfTUtEVEVNUAorICAgIHJ2ID0gbWtkdGVtcCAoZG5hbWUpOworI2Vsc2UKKyAgICAjZXJy
b3IgTm8gaW1wbGVtZW50YXRpb24gd2l0aG91dCBta2R0ZW1wCisjZW5kaWYKKworICAgIHN0cmNh
dChkbmFtZSwgIi8iKTsKKyAgICByZXR1cm4gcnY7CisKK30KKwogLyogQ3JlYXRlIGFuZCBvcGVu
IGEgc2NyYXRjaCBmaWxlIHdpdGggYSBnaXZlbiBuYW1lIHByZWZpeC4gKi8KIC8qIFdyaXRlIHRo
ZSBhY3R1YWwgZmlsZSBuYW1lIGF0IGZuYW1lLiAqLwogRklMRSAqCkluZGV4OiB0ZXN0cy9yYW0t
d3JpdGUxLnBzCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT0KLS0tIHRlc3RzL3JhbS13cml0ZTEucHMJKC4uLi90YWdzL2dz
OC41NCkJKHJldmlzaW9uIDApCisrKyB0ZXN0cy9yYW0td3JpdGUxLnBzCSguLi4vdHJ1bmsvZ3Mp
CShyZXZpc2lvbiAyMikKQEAgLTAsMCArMSw1OSBAQAorL3BkaWN0IHsgZHVwIHsgZXhjaCA9PSA9
PSB9IGZvcmFsbCB9IGRlZgorCisoJXJhbSUpIGN1cnJlbnRkZXZwYXJhbXMgcGRpY3QKKworL2hl
bGxvZmlsZSAoJXJhbSVoZWxsbykgKHcpIGZpbGUgZGVmCisKK2hlbGxvZmlsZSBzdGF0dXMgeyAK
KyAgaGVsbG9maWxlIChoZWxsbyB3b3JsZFxuKSB3cml0ZXN0cmluZworICBoZWxsb2ZpbGUgY2xv
c2VmaWxlCit9IHsKKyAgKGVycm9yIGluIHN0YXR1cyBmb3Igd3JpdGVzdHJpbmcpIHByaW50Cisg
IHBzdGFjaworICBleGl0Cit9IGlmZWxzZQorCisoJXJhbSVoZWxsbykgKCVyYW0ld29ybGQpIHJl
bmFtZWZpbGUKKworL3dvcmxkICglcmFtJXdvcmxkKSAocikgZmlsZSBkZWYKKword29ybGQgc3Rh
dHVzIHsKKyAgd29ybGQgMTAwIHN0cmluZyByZWFkbGluZSB7CisgICAgKHJlYWQgZnJvbSBmaWxl
OikgcHJpbnQKKyAgICBwcmludCAKKyAgICAoXG4pIHByaW50CisgICAgd29ybGQgY2xvc2VmaWxl
CisgIH0geworICAgIChlcnJvciBpbiByZWFkbGluZSkgcHJpbnQKKyAgfSBpZmVsc2UKK30gewor
ICAoZXJyb3IgaW4gc3RhdHVzIGZvciByZWFkbGluZSkgcHJpbnQKKyAgcHN0YWNrCisgIGV4aXQK
K30gaWZlbHNlCisKKworKCVyYW0laGVsbG8xKSAodykgZmlsZQorKCVyYW0laGVsbG8yKSAodykg
ZmlsZQorKCVyYW0laGVsbG8zKSAodykgZmlsZQorKCVyYW0laGVsbG80KSAodykgZmlsZQorKCVy
YW0laGVsbG81KSAodykgZmlsZQorKCVyYW0laGVsbG82KSAodykgZmlsZQorCisobGlzdGZpbGVz
LCB3b3JsZCBwbHVzIGhlbGxvMS4uNlxuKSBwcmludAorKCVyYW0lKikgeyBwcmludCAoXG4pIHBy
aW50IH0gMTAwIHN0cmluZyBmaWxlbmFtZWZvcmFsbAorCisKKworKCVyYW0ld29ybGQpIGRlbGV0
ZWZpbGUKKworKGxpc3RmaWxlcyBhZ2Fpbiwgd29ybGQgc2hvdWxkIGJlIGdvbmVcbikgcHJpbnQK
KyglcmFtJSopIHsgcHJpbnQgKFxuKSBwcmludCB9IDEwMCBzdHJpbmcgZmlsZW5hbWVmb3JhbGwK
KworKCVyYW0lKikgeyBkZWxldGVmaWxlIH0gMTAwIHN0cmluZyBmaWxlbmFtZWZvcmFsbAorCiso
bGlzdGZpbGVzIG9uZSBsYXN0IHRpbWUsIG5vIGZpbGVzIHRvIHByaW50OlxuKSBwcmludAorKCVy
YW0lKikgeyBwcmludCAoXG4pIHByaW50IH0gMTAwIHN0cmluZyBmaWxlbmFtZWZvcmFsbAorCiso
ZG9uZVxuKSBwcmludAorcXVpdApJbmRleDogc3JjL2ludC5tYWsKPT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gc3Jj
L2ludC5tYWsJKC4uLi90YWdzL2dzOC41NCkJKHJldmlzaW9uIDIyKQorKysgc3JjL2ludC5tYWsJ
KC4uLi90cnVuay9ncykJKHJldmlzaW9uIDIyKQpAQCAtMTgxMywxMiArMTgxMywyMSBAQAogIyBv
dmVyaGVhZCBvZiBhbnkgdW51c2VkICVkaXNrIHN0cnVjdHVyZXMgaXMgbWluaW1hbC4KICMgV2Ug
Y291bGQgaGF2ZSBtb3JlLCBidXQgdGhlIER5bmFMYWIgZm9udCBpbnN0YWxsZXIgaGFzIHByb2Js
ZW1zCiAjIHdpdGggbW9yZSB0aGFuIDcgZGlzayBkZXZpY2VzLgotZGlza25fPSQoR0xPQkopZ3Np
b2Rpc2suJChPQkopCitkaXNrbl89JChHTE9CSilnc2lvZGlzay4kKE9CSikgJChHTE9CSilnc2lv
bWFwLiQoT0JKKQogJChHTEQpZGlza24uZGV2IDogJChMSUJfTUFLKSAkKEVDSE9HU19YRSkgJChk
aXNrbl8pCiAJJChTRVRNT0QpICQoR0xEKWRpc2tuICQoZGlza25fKQogCSQoQURETU9EKSAkKEdM
RClkaXNrbiAtaW9kZXYgZGlzazAgZGlzazEgZGlzazIgZGlzazMgZGlzazQgZGlzazUgZGlzazYK
IAkkKEFERE1PRCkgJChHTEQpZGlza24gLXBzIGdzX2Rpc2tuCiAKKyMgLS0tLS0tLS0tLS0tLS0t
LSBTdXBwb3J0IGZvciAlcmFtIFJBTURpc2tEZXZpY2VzIC0tLS0tLS0tLS0tLS0tLS0gIworCisj
IE5vdGUgdGhhdCB3ZSBnbyBhaGVhZCBhbmQgY3JlYXRlIDMgJXJhbSBkZXZpY2VzLiBUaGUgaW50
ZXJuYWwKKyMgb3ZlcmhlYWQgb2YgYW55IHVudXNlZCAlZGlzayBzdHJ1Y3R1cmVzIGlzIG1pbmlt
YWwuCityYW1kaXNrbl89JChHTE9CSilnc2lvcmFtLiQoT0JKKSAkKEdMT0JKKWdzaW9tYXAuJChP
QkopCiskKEdMRClyYW1kaXNrbi5kZXYgOiAkKExJQl9NQUspICQoRUNIT0dTX1hFKSAkKHJhbWRp
c2tuXykKKwkkKFNFVE1PRCkgJChHTEQpcmFtZGlza24gJChyYW1kaXNrbl8pCisJJChBRERNT0Qp
ICQoR0xEKXJhbWRpc2tuIC1pb2RldiByYW0gcmFtMCByYW0xCisKICMgPT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT0gUERGID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICMK
IAogIyBXZSBuZWVkIG5lYXJseSBhbGwgb2YgdGhlIFBvc3RTY3JpcHQgTGFuZ3VhZ2VMZXZlbCAz
IGludGVycHJldGVyIGZvciBQREYsCkluZGV4OiBzcmMvZ3AuaAo9PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBzcmMv
Z3AuaAkoLi4uL3RhZ3MvZ3M4LjU0KQkocmV2aXNpb24gMjIpCisrKyBzcmMvZ3AuaAkoLi4uL3Ry
dW5rL2dzKQkocmV2aXNpb24gMjIpCkBAIC0xODMsNiArMTgzLDIxIEBACiAJCQkgICBjaGFyIGZu
YW1lW2dwX2ZpbGVfbmFtZV9zaXplb2ZdLAogCQkJICAgY29uc3QgY2hhciAqbW9kZSk7CiAKKy8q
KgorICogZ3BfY3JlYXRlX3NjcmF0Y2hfZGlyZWN0b3J5OiBDcmVhdGUgYSBzY3JhdGNoIGRpcmVj
dG9yeQorICogQHByZWZpeDogTmFtZSBwcmVmaXguCisgKgorICogQ3JlYXRlcyBhIHNjcmF0Y2gg
KHRlbXBvcmFyeSkgZGlyZWN0b3J5IGluIHRoZSBmaWxlc3lzdGVtLiBUaGUgZXhhY3QKKyAqIGxv
Y2F0aW9uIGFuZCBuYW1lIGlzIHBsYXRmb3JtIGRlcGVuZGVudCwgYnV0IGluIGdlbmVyYWwgdXNl
cyBAcHJlZml4IAorICogYXMgYSBwcmVmaXguIElmIEBwcmVmaXggaXMgbm90IGFic29sdXRlLCB0
aGVuIGNob29zZSBhbiBhcHByb3ByaWF0ZSAKKyAqIHN5c3RlbSBkaXJlY3RvcnksIHVzdWFsbHkg
YXMgZGV0ZXJtaW5lZCBmcm9tIGdwX2dldHRtcGRpcigpLCBmb2xsb3dlZCAKKyAqIGJ5IGEgcGF0
aCBhcyByZXR1cm5lZCBmcm9tIGEgc3lzdGVtIGNhbGwuCisgKgorICogUmV0dXJuIHZhbHVlOiBw
b2ludGVyIHRvIHRoZSBwYXRobmFtZSBvbiBzdWNjZXNzLCAwIG9uIGVycm9yCisgKiovCitjaGFy
ICpncF9jcmVhdGVfc2NyYXRjaF9kaXJlY3RvcnkgKGNvbnN0IGNoYXIgKnByZWZpeCk7CisKKwog
LyogT3BlbiBhIGZpbGUgd2l0aCB0aGUgZ2l2ZW4gbmFtZSwgYXMgYSBzdHJlYW0gb2YgdW5pbnRl
cnByZXRlZCBieXRlcy4gKi8KIEZJTEUgKmdwX2ZvcGVuKGNvbnN0IGNoYXIgKmZuYW1lLCBjb25z
dCBjaGFyICptb2RlKTsKIApJbmRleDogc3JjL2d4aW9kZXYuaAo9PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBzcmMv
Z3hpb2Rldi5oCSguLi4vdGFncy9nczguNTQpCShyZXZpc2lvbiAyMikKKysrIHNyYy9neGlvZGV2
LmgJKC4uLi90cnVuay9ncykJKHJldmlzaW9uIDIyKQpAQCAtNzksNiArNzksMTAgQEAKICAgaW50
IHByb2MoZ3hfaW9fZGV2aWNlICppb2RldiwgZ3NfbWVtb3J5X3QgKm1lbSkKICAgICBpb2Rldl9w
cm9jX2luaXQoKCppbml0KSk7CS8qIG9uZS10aW1lIGluaXRpYWxpemF0aW9uICovCiAKKyNkZWZp
bmUgaW9kZXZfcHJvY19zaHV0ZG93bihwcm9jKVwKKyAgaW50IHByb2MoZ3hfaW9fZGV2aWNlICpp
b2RldikKKyAgICBpb2Rldl9wcm9jX3NodXRkb3duKCgqc2h1dGRvd24pKTsgICAvKiBvbmUtdGlt
ZSBzaHV0ZG93biwgYXQgcHJvZ3JhbSBlbmQgKi8KKwogI2RlZmluZSBpb2Rldl9wcm9jX29wZW5f
ZGV2aWNlKHByb2MpXAogICBpbnQgcHJvYyhneF9pb19kZXZpY2UgKmlvZGV2LCBjb25zdCBjaGFy
ICphY2Nlc3MsIHN0cmVhbSAqKnBzLFwKIAkgICBnc19tZW1vcnlfdCAqbWVtKQpAQCAtMTQ0LDYg
KzE0OCw3IEBACiAKIC8qIERlZmF1bHQgaW1wbGVtZW50YXRpb25zIG9mIHByb2NlZHVyZXMgKi8K
IGlvZGV2X3Byb2NfaW5pdChpb2Rldl9ub19pbml0KTsKK2lvZGV2X3Byb2Nfc2h1dGRvd24oaW9k
ZXZfbm9fc2h1dGRvd24pOwogaW9kZXZfcHJvY19vcGVuX2RldmljZShpb2Rldl9ub19vcGVuX2Rl
dmljZSk7CiBpb2Rldl9wcm9jX29wZW5fZmlsZShpb2Rldl9ub19vcGVuX2ZpbGUpOwogaW9kZXZf
cHJvY19mb3Blbihpb2Rldl9ub19mb3Blbik7CkluZGV4OiBzcmMvZ3Npb2Rldi5jCj09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT0KLS0tIHNyYy9nc2lvZGV2LmMJKC4uLi90YWdzL2dzOC41NCkJKHJldmlzaW9uIDIyKQorKysg
c3JjL2dzaW9kZXYuYwkoLi4uL3RydW5rL2dzKQkocmV2aXNpb24gMjIpCkBAIC00OSw3ICs0OSw3
IEBACiBjb25zdCBneF9pb19kZXZpY2UgZ3NfaW9kZXZfb3MgPQogewogICAgICIlb3MlIiwgIkZp
bGVTeXN0ZW0iLAotICAgIHtpb2Rldl9ub19pbml0LCBpb2Rldl9ub19vcGVuX2RldmljZSwKKyAg
ICB7aW9kZXZfbm9faW5pdCwgaW9kZXZfbm9fc2h1dGRvd24sIGlvZGV2X25vX29wZW5fZGV2aWNl
LAogICAgICBOVUxMIC8qaW9kZXZfb3Nfb3Blbl9maWxlICovICwgaW9kZXZfb3NfZm9wZW4sIGlv
ZGV2X29zX2ZjbG9zZSwKICAgICAgb3NfZGVsZXRlLCBvc19yZW5hbWUsIG9zX3N0YXR1cywKICAg
ICAgb3NfZW51bWVyYXRlLCBncF9lbnVtZXJhdGVfZmlsZXNfbmV4dCwgZ3BfZW51bWVyYXRlX2Zp
bGVzX2Nsb3NlLApAQCAtMTEyLDYgKzExMiwxMiBAQAogfQogCiBpbnQKK2lvZGV2X25vX3NodXRk
b3duKGd4X2lvX2RldmljZSAqIGlvZGV2KQoreworICAgIHJldHVybiAwOworfQorCitpbnQKIGlv
ZGV2X25vX29wZW5fZGV2aWNlKGd4X2lvX2RldmljZSAqIGlvZGV2LCBjb25zdCBjaGFyICphY2Nl
c3MsIHN0cmVhbSAqKiBwcywKIAkJICAgICBnc19tZW1vcnlfdCAqIG1lbSkKIHsKSW5kZXg6IHRl
c3RzL3JhbS1pbml0LnBzCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIHRlc3RzL3JhbS1pbml0LnBzCSguLi4vdGFn
cy9nczguNTQpCShyZXZpc2lvbiAwKQorKysgdGVzdHMvcmFtLWluaXQucHMJKC4uLi90cnVuay9n
cykJKHJldmlzaW9uIDIyKQpAQCAtMCwwICsxLDE4IEBACisvcGRpY3QgeyBkdXAgeyBleGNoID09
ID09IH0gZm9yYWxsIH0gZGVmCisKKyUgKCVyYW0lKSBkdXAgPT0gY3VycmVudGRldnBhcmFtcyBw
ZGljdCBwb3AKKworKGluaXRpYWwgc2V0dGluZykgPT0KKyglcmFtJSkgY3VycmVudGRldnBhcmFt
cyAvTG9naWNhbFNpemUgZHVwID09IGdldCA9PQorCisoJXJhbSUpIDw8IC9Jbml0aWFsaXplQWN0
aW9uIDEgPj4gc2V0ZGV2cGFyYW1zCisoYWZ0ZXIgZmlyc3QgaW5pdGlhbGl6YXRpb24pID09Ciso
JXJhbSUpIGN1cnJlbnRkZXZwYXJhbXMgL0xvZ2ljYWxTaXplIGR1cCA9PSBnZXQgPT0KKworKCVy
YW0lKSA8PCAvTG9naWNhbFNpemUgMjA0OCAvSW5pdGlhbGl6ZUFjdGlvbiAxID4+IHNldGRldnBh
cmFtcworKGFmdGVyIHNlY29uZCBpbml0aWFsaXphdGlvbiwgc2hvdWxkIGJlIDIwNDgpID09Ciso
JXJhbSUpIGN1cnJlbnRkZXZwYXJhbXMgL0xvZ2ljYWxTaXplIGR1cCA9PSBnZXQgPT0KKworKG9r
YXksIGRvbmUgd2l0aCB0aGF0KSA9PQorCitxdWl0CkluZGV4OiBzcmMvemlvZGV2c2MuYwo9PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09Ci0tLSBzcmMvemlvZGV2c2MuYwkoLi4uL3RhZ3MvZ3M4LjU0KQkocmV2aXNpb24gMjIp
CisrKyBzcmMvemlvZGV2c2MuYwkoLi4uL3RydW5rL2dzKQkocmV2aXNpb24gMjIpCkBAIC0yOSw3
ICsyOSw3IEBACiBjb25zdCBjaGFyIGlvZGV2X2R0eXBlX3N0ZGlvW10gPSAiU3BlY2lhbCI7CiAj
ZGVmaW5lIGlvZGV2X3NwZWNpYWwoZG5hbWUsIGluaXQsIG9wZW4pIHtcCiAgICAgZG5hbWUsIGlv
ZGV2X2R0eXBlX3N0ZGlvLFwKLQl7IGluaXQsIG9wZW4sIGlvZGV2X25vX29wZW5fZmlsZSwgaW9k
ZXZfbm9fZm9wZW4sIGlvZGV2X25vX2ZjbG9zZSxcCisJeyBpbml0LCBpb2Rldl9ub19zaHV0ZG93
biwgb3BlbiwgaW9kZXZfbm9fb3Blbl9maWxlLCBpb2Rldl9ub19mb3BlbiwgaW9kZXZfbm9fZmNs
b3NlLCBcCiAJICBpb2Rldl9ub19kZWxldGVfZmlsZSwgaW9kZXZfbm9fcmVuYW1lX2ZpbGUsIGlv
ZGV2X25vX2ZpbGVfc3RhdHVzLFwKIAkgIGlvZGV2X25vX2VudW1lcmF0ZV9maWxlcywgTlVMTCwg
TlVMTCxcCiAJICBpb2Rldl9ub19nZXRfcGFyYW1zLCBpb2Rldl9ub19wdXRfcGFyYW1zXApJbmRl
eDogc3JjL3ppb2RldnMuYwo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBzcmMvemlvZGV2cy5jCSguLi4vdGFncy9n
czguNTQpCShyZXZpc2lvbiAyMikKKysrIHNyYy96aW9kZXZzLmMJKC4uLi90cnVuay9ncykJKHJl
dmlzaW9uIDIyKQpAQCAtMjgsNyArMjgsNyBAQAogY29uc3QgY2hhciBpb2Rldl9kdHlwZV9zdGRp
b1tdID0gIlNwZWNpYWwiOwogI2RlZmluZSBpb2Rldl9zcGVjaWFsKGRuYW1lLCBpbml0LCBvcGVu
KSB7XAogICAgIGRuYW1lLCBpb2Rldl9kdHlwZV9zdGRpbyxcCi0JeyBpbml0LCBvcGVuLCBpb2Rl
dl9ub19vcGVuX2ZpbGUsIGlvZGV2X25vX2ZvcGVuLCBpb2Rldl9ub19mY2xvc2UsXAorCXsgaW5p
dCwgaW9kZXZfbm9fc2h1dGRvd24sIG9wZW4sIGlvZGV2X25vX29wZW5fZmlsZSwgaW9kZXZfbm9f
Zm9wZW4sIGlvZGV2X25vX2ZjbG9zZSwgXAogCSAgaW9kZXZfbm9fZGVsZXRlX2ZpbGUsIGlvZGV2
X25vX3JlbmFtZV9maWxlLCBpb2Rldl9ub19maWxlX3N0YXR1cyxcCiAJICBpb2Rldl9ub19lbnVt
ZXJhdGVfZmlsZXMsIE5VTEwsIE5VTEwsXAogCSAgaW9kZXZfbm9fZ2V0X3BhcmFtcywgaW9kZXZf
bm9fcHV0X3BhcmFtc1wKSW5kZXg6IHNyYy96ZGV2Y2FsLmMKPT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gc3JjL3pk
ZXZjYWwuYwkoLi4uL3RhZ3MvZ3M4LjU0KQkocmV2aXNpb24gMjIpCisrKyBzcmMvemRldmNhbC5j
CSguLi4vdHJ1bmsvZ3MpCShyZXZpc2lvbiAyMikKQEAgLTI0LDcgKzI0LDggQEAKIHByaXZhdGUg
aW9kZXZfcHJvY19nZXRfcGFyYW1zKGNhbGVuZGFyX2dldF9wYXJhbXMpOwogY29uc3QgZ3hfaW9f
ZGV2aWNlIGdzX2lvZGV2X2NhbGVuZGFyID0gewogICAgICIlQ2FsZW5kYXIlIiwgIlNwZWNpYWwi
LAotICAgIHsgaW9kZXZfbm9faW5pdCwgaW9kZXZfbm9fb3Blbl9kZXZpY2UsIGlvZGV2X25vX29w
ZW5fZmlsZSwKKyAgICB7IGlvZGV2X25vX2luaXQsIGlvZGV2X25vX3NodXRkb3duLCAKKyAgICAg
IGlvZGV2X25vX29wZW5fZGV2aWNlLCBpb2Rldl9ub19vcGVuX2ZpbGUsCiAgICAgICBpb2Rldl9u
b19mb3BlbiwgaW9kZXZfbm9fZmNsb3NlLAogICAgICAgaW9kZXZfbm9fZGVsZXRlX2ZpbGUsIGlv
ZGV2X25vX3JlbmFtZV9maWxlLCBpb2Rldl9ub19maWxlX3N0YXR1cywKICAgICAgIGlvZGV2X25v
X2VudW1lcmF0ZV9maWxlcywgTlVMTCwgTlVMTCwKSW5kZXg6IHNyYy96aW9kZXYuYwo9PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09Ci0tLSBzcmMvemlvZGV2LmMJKC4uLi90YWdzL2dzOC41NCkJKHJldmlzaW9uIDIyKQorKysg
c3JjL3ppb2Rldi5jCSguLi4vdHJ1bmsvZ3MpCShyZXZpc2lvbiAyMikKQEAgLTM4LDcgKzM4LDcg
QEAKIC8qIERlZmluZSB0aGUgc3BlY2lhbCBkZXZpY2VzLiAqLwogI2RlZmluZSBpb2Rldl9zcGVj
aWFsKGRuYW1lLCBpbml0LCBvcGVuKSB7XAogICAgIGRuYW1lLCBpb2Rldl9kdHlwZV9zdGRpbyxc
Ci0JeyBpbml0LCBvcGVuLCBpb2Rldl9ub19vcGVuX2ZpbGUsIGlvZGV2X25vX2ZvcGVuLCBpb2Rl
dl9ub19mY2xvc2UsXAorCXsgaW5pdCwgaW9kZXZfbm9fc2h1dGRvd24sIG9wZW4sIGlvZGV2X25v
X29wZW5fZmlsZSwgaW9kZXZfbm9fZm9wZW4sIGlvZGV2X25vX2ZjbG9zZSwgXAogCSAgaW9kZXZf
bm9fZGVsZXRlX2ZpbGUsIGlvZGV2X25vX3JlbmFtZV9maWxlLCBpb2Rldl9ub19maWxlX3N0YXR1
cyxcCiAJICBpb2Rldl9ub19lbnVtZXJhdGVfZmlsZXMsIE5VTEwsIE5VTEwsXAogCSAgaW9kZXZf
bm9fZ2V0X3BhcmFtcywgaW9kZXZfbm9fcHV0X3BhcmFtc1wKSW5kZXg6IHNyYy9ncF9tc2hkbC5j
Cj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT0KLS0tIHNyYy9ncF9tc2hkbC5jCSguLi4vdGFncy9nczguNTQpCShyZXZpc2lv
biAyMikKKysrIHNyYy9ncF9tc2hkbC5jCSguLi4vdHJ1bmsvZ3MpCShyZXZpc2lvbiAyMikKQEAg
LTQxLDcgKzQxLDcgQEAKIHByaXZhdGUgaW9kZXZfcHJvY19mY2xvc2UobXN3aW5faGFuZGxlX2Zj
bG9zZSk7CiBjb25zdCBneF9pb19kZXZpY2UgZ3NfaW9kZXZfaGFuZGxlID0gewogICAgICIlaGFu
ZGxlJSIsICJGaWxlU3lzdGVtIiwKLSAgICB7aW9kZXZfbm9faW5pdCwgaW9kZXZfbm9fb3Blbl9k
ZXZpY2UsCisgICAge2lvZGV2X25vX2luaXQsIGlvZGV2X25vX3NodXRkb3duLCBpb2Rldl9ub19v
cGVuX2RldmljZSwKICAgICAgTlVMTCAvKmlvZGV2X29zX29wZW5fZmlsZSAqLyAsIG1zd2luX2hh
bmRsZV9mb3BlbiwgbXN3aW5faGFuZGxlX2ZjbG9zZSwKICAgICAgaW9kZXZfbm9fZGVsZXRlX2Zp
bGUsIGlvZGV2X25vX3JlbmFtZV9maWxlLCBpb2Rldl9ub19maWxlX3N0YXR1cywKICAgICAgaW9k
ZXZfbm9fZW51bWVyYXRlX2ZpbGVzLCBOVUxMLCBOVUxMLApJbmRleDogc3JjL2dzaW9kZXZzLmMK
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PQotLS0gc3JjL2dzaW9kZXZzLmMJKC4uLi90YWdzL2dzOC41NCkJKHJldmlzaW9u
IDIyKQorKysgc3JjL2dzaW9kZXZzLmMJKC4uLi90cnVuay9ncykJKHJldmlzaW9uIDIyKQpAQCAt
MjIsNyArMjIsOCBAQAogY29uc3QgY2hhciBpb2Rldl9kdHlwZV9zdGRpb1tdID0gIlNwZWNpYWwi
OwogI2RlZmluZSBpb2Rldl9zdGRpbyhkbmFtZSwgb3Blbikge1wKICAgICBkbmFtZSwgaW9kZXZf
ZHR5cGVfc3RkaW8sXAotCXsgaW9kZXZfbm9faW5pdCwgb3BlbiwgaW9kZXZfbm9fb3Blbl9maWxl
LFwKKwl7IGlvZGV2X25vX2luaXQsIGlvZGV2X25vX3NodXRkb3duLCBcCisgICAgICAgICAgb3Bl
biwgaW9kZXZfbm9fb3Blbl9maWxlLAlcCiAJICBpb2Rldl9ub19mb3BlbiwgaW9kZXZfbm9fZmNs
b3NlLFwKIAkgIGlvZGV2X25vX2RlbGV0ZV9maWxlLCBpb2Rldl9ub19yZW5hbWVfZmlsZSwgaW9k
ZXZfbm9fZmlsZV9zdGF0dXMsXAogCSAgaW9kZXZfbm9fZW51bWVyYXRlX2ZpbGVzLCBOVUxMLCBO
VUxMLFwKSW5kZXg6IHNyYy96aW9kZXZzdC5jCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIHNyYy96aW9kZXZzdC5j
CSguLi4vdGFncy9nczguNTQpCShyZXZpc2lvbiAyMikKKysrIHNyYy96aW9kZXZzdC5jCSguLi4v
dHJ1bmsvZ3MpCShyZXZpc2lvbiAyMikKQEAgLTEyNCw3ICsxMjQsOCBAQAogCiBjb25zdCBneF9p
b19kZXZpY2UgZ3NfaW9kZXZfc3RhdGljID0gewogICAgICIlc3RhdGljJSIsIGlvZGV2X2R0eXBl
X3N0YXRpYywKLQl7IGlvc3RhdGljX2luaXQsIGlvZGV2X25vX29wZW5fZGV2aWNlLCBpb3N0YXRp
Y19vcGVuX2ZpbGUsCisgICAgICAgIHsgaW9zdGF0aWNfaW5pdCwgaW9kZXZfbm9fc2h1dGRvd24s
CisgICAgICAgICAgaW9kZXZfbm9fb3Blbl9kZXZpY2UsIGlvc3RhdGljX29wZW5fZmlsZSwKIAkg
IGlvZGV2X25vX2ZvcGVuLCBpb2Rldl9ub19mY2xvc2UsCiAJICBpb2Rldl9ub19kZWxldGVfZmls
ZSwgaW9kZXZfbm9fcmVuYW1lX2ZpbGUsIGlvZGV2X25vX2ZpbGVfc3RhdHVzLAogCSAgaW9kZXZf
bm9fZW51bWVyYXRlX2ZpbGVzLCBOVUxMLCBOVUxMLApJbmRleDogc3JjL2dkZXZwaXBlLmMKPT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PQotLS0gc3JjL2dkZXZwaXBlLmMJKC4uLi90YWdzL2dzOC41NCkJKHJldmlzaW9uIDIy
KQorKysgc3JjL2dkZXZwaXBlLmMJKC4uLi90cnVuay9ncykJKHJldmlzaW9uIDIyKQpAQCAtMjgs
NyArMjgsNyBAQAogcHJpdmF0ZSBpb2Rldl9wcm9jX2ZjbG9zZShwaXBlX2ZjbG9zZSk7CiBjb25z
dCBneF9pb19kZXZpY2UgZ3NfaW9kZXZfcGlwZSA9IHsKICAgICAiJXBpcGUlIiwgIlNwZWNpYWwi
LAotICAgIHtpb2Rldl9ub19pbml0LCBpb2Rldl9ub19vcGVuX2RldmljZSwKKyAgICB7aW9kZXZf
bm9faW5pdCwgaW9kZXZfbm9fc2h1dGRvd24sIGlvZGV2X25vX29wZW5fZGV2aWNlLAogICAgICBO
VUxMIC8qaW9kZXZfb3Nfb3Blbl9maWxlICovICwgcGlwZV9mb3BlbiwgcGlwZV9mY2xvc2UsCiAg
ICAgIGlvZGV2X25vX2RlbGV0ZV9maWxlLCBpb2Rldl9ub19yZW5hbWVfZmlsZSwgaW9kZXZfbm9f
ZmlsZV9zdGF0dXMsCiAgICAgIGlvZGV2X25vX2VudW1lcmF0ZV9maWxlcywgTlVMTCwgTlVMTCwK
SW5kZXg6IHNyYy96aW9kZXYyLmMKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gc3JjL3ppb2RldjIuYwkoLi4uL3Rh
Z3MvZ3M4LjU0KQkocmV2aXNpb24gMjIpCisrKyBzcmMvemlvZGV2Mi5jCSguLi4vdHJ1bmsvZ3Mp
CShyZXZpc2lvbiAyMikKQEAgLTMyLDcgKzMyLDcgQEAKIGNvbnN0IGd4X2lvX2RldmljZSBnc19p
b2Rldl9udWxsID0gewogICAgICIlbnVsbCUiLCAiU3BlY2lhbCIsCiAgICAgewotCWlvZGV2X25v
X2luaXQsIG51bGxfb3BlbiwgaW9kZXZfbm9fb3Blbl9maWxlLAorCWlvZGV2X25vX2luaXQsIGlv
ZGV2X25vX3NodXRkb3duLCBudWxsX29wZW4sIGlvZGV2X25vX29wZW5fZmlsZSwKIAlpb2Rldl9v
c19mb3BlbiwgaW9kZXZfb3NfZmNsb3NlLAogCWlvZGV2X25vX2RlbGV0ZV9maWxlLCBpb2Rldl9u
b19yZW5hbWVfZmlsZSwgaW9kZXZfbm9fZmlsZV9zdGF0dXMsCiAJaW9kZXZfbm9fZW51bWVyYXRl
X2ZpbGVzLCBOVUxMLCBOVUxMLApJbmRleDogc3JjL2NvbmZpZ3VyZS5hYwo9PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0t
LSBzcmMvY29uZmlndXJlLmFjCSguLi4vdGFncy9nczguNTQpCShyZXZpc2lvbiAyMikKKysrIHNy
Yy9jb25maWd1cmUuYWMJKC4uLi90cnVuay9ncykJKHJldmlzaW9uIDIyKQpAQCAtNDA0LDYgKzQw
NCw5IEBACiBBQ19DSEVDS19GVU5DUyhbbWtzdGVtcF0sIFtIQVZFX01LU1RFTVA9LURIQVZFX01L
U1RFTVBdKQogQUNfU1VCU1QoSEFWRV9NS1NURU1QKQogCitBQ19DSEVDS19GVU5DUyhbbWtkdGVt
cF0sIFtIQVZFX01LRFRFTVA9LURIQVZFX01LRFRFTVBdKQorQUNfU1VCU1QoSEFWRV9NS0RURU1Q
KQorCiBBQ19DSEVDS19GVU5DUyhbaHlwb3RdLCBbSEFWRV9IWVBPVD0tREhBVkVfSFlQT1RdKQog
QUNfU1VCU1QoSEFWRV9IWVBPVCkKIApJbmRleDogc3JjL2dzLm1hawo9PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBz
cmMvZ3MubWFrCSguLi4vdGFncy9nczguNTQpCShyZXZpc2lvbiAyMikKKysrIHNyYy9ncy5tYWsJ
KC4uLi90cnVuay9ncykJKHJldmlzaW9uIDIyKQpAQCAtMzY2LDcgKzM2Niw3IEBACiAKICMgRkVB
VFVSRV9ERVZTX0VYVFJBIGFuZCBERVZJQ0VfREVWU19FWFRSQSBhcmUgZXhwbGljaXRseSByZXNl
cnZlZAogIyB0byBiZSBzZXQgZnJvbSB0aGUgY29tbWFuZCBsaW5lLgotRkVBVFVSRV9ERVZTX0VY
VFJBPQorRkVBVFVSRV9ERVZTX0VYVFJBPSQoUFNEKWRpc2tuLmRldiAkKFBTRClyYW1kaXNrbi5k
ZXYKIERFVklDRV9ERVZTX0VYVFJBPQogCiBERVZTX0FMTD0kKEdMR0VORElSKSQoRCkkKFBMQVRG
T1JNKS5kZXZcCkluZGV4OiBzcmMvTWFrZWZpbGUuaW4KPT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gc3JjL01ha2Vm
aWxlLmluCSguLi4vdGFncy9nczguNTQpCShyZXZpc2lvbiAyMikKKysrIHNyYy9NYWtlZmlsZS5p
bgkoLi4uL3RydW5rL2dzKQkocmV2aXNpb24gMjIpCkBAIC0xMTAsNyArMTEwLDcgQEAKICMgLURI
QVZFX0hZUE9UCiAjCXVzZSB0aGUgc3lzdGVtIGh5cG90KCkgY2FsbAogCi1DQVBPUFQ9IEBIQVZF
X01LU1RFTVBAIEBIQVZFX0hZUE9UQAorQ0FQT1BUPSBASEFWRV9NS1NURU1QQCBASEFWRV9NS0RU
RU1QQCBASEFWRV9IWVBPVEAKIAogIyBEZWZpbmUgdGhlIG5hbWUgb2YgdGhlIGV4ZWN1dGFibGUg
ZmlsZS4KIAo=
------=_Part_9768_1366625.1159671538533
Content-Type: text/plain; charset="us-ascii"
MIME-Version: 1.0
Content-Transfer-Encoding: 7bit
Content-Disposition: inline

_______________________________________________
gs-code-review mailing list
[email protected]
http://www.ghostscript.com/mailman/listinfo/gs-code-review

------=_Part_9768_1366625.1159671538533--