<?xml version="1.0" encoding="UTF-8" standalone="yes" ?>
<!DOCTYPE bugzilla SYSTEM "http://bugs.gentoo.org/bugzilla.dtd">

<bugzilla version="2.22.7"
          urlbase="http://bugs.gentoo.org/"
          maintainer="bugzilla@gentoo.org"
>

    <bug>
          <bug_id>80989</bug_id>
          
          <creation_ts>2005-02-06 07:59 0000</creation_ts>
          <short_desc>Alsa detects no sound card on XBox 1.6 (alsa-driver 1.0.8, xbox-sources 2.6.10-r1)</short_desc>
          <delta_ts>2006-03-07 10:58:41 0000</delta_ts>
          <reporter_accessible>1</reporter_accessible>
          <cclist_accessible>1</cclist_accessible>
          <classification_id>1</classification_id>
          <classification>Unclassified</classification>
          <product>Gentoo Linux</product>
          <component>Ebuilds</component>
          <version>unspecified</version>
          <rep_platform>x86</rep_platform>
          <op_sys>Linux</op_sys>
          <bug_status>RESOLVED</bug_status>
          <resolution>FIXED</resolution>
          
          
          
          <priority>P2</priority>
          <bug_severity>major</bug_severity>
          <target_milestone>---</target_milestone>
          
          
          
          <everconfirmed>1</everconfirmed>
          <reporter>mxa@xs4all.nl</reporter>
          <assigned_to>sound@gentoo.org</assigned_to>
          <cc>apgo@patchbomb.org</cc>
    
    <cc>chrb@gentoo.org</cc>
    
    <cc>christoph.gysin@fr33z3.org</cc>
    
    <cc>timmy@invisibles.org</cc>

      

      
          <long_desc isprivate="0">
            <who>mxa@xs4all.nl</who>
            <bug_when>2005-02-06 07:59:15 0000</bug_when>
            <thetext>alsa-1.0.8 builds fine now on my Xbox. However, when I load the alsa module (see below for my modules.d/alsa), no sound card is detected. It may be important to note that my XBox is a newer model (1.6).

Reproducible: Always
Steps to Reproduce:
1. ACCEPT_KEYWORDS=&quot;~x86&quot; emerge alsa-driver
2. edit /etc/modules.d/alsa (see below), then run modules-update
3. /etc/init.d/alsasound start, or modprobe -v snd-card-0

Actual Results:  
When running /etc/init.d/alsasound start:
 * Loading ALSA modules...
 *   Loading: snd-card-0...                                               [ ok ]
 * ERROR: Failed to load necessary drivers                                [ ok ]
 * Restoring Mixer Levels...
 * No mixer config in /etc/asound.state, you have to unmute your card!    [ !! ]

When loading manually (modprobe -v snd-card-0):
xbox root # modprobe -v snd-card-0
insmod /lib/modules/2.6.10-xbox/kernel/sound/acore/snd-page-alloc.ko
insmod /lib/modules/2.6.10-xbox/kernel/sound/soundcore.ko
insmod /lib/modules/2.6.10-xbox/kernel/sound/acore/snd.ko cards_limit=1
insmod /lib/modules/2.6.10-xbox/kernel/sound/acore/snd-timer.ko
insmod /lib/modules/2.6.10-xbox/kernel/sound/acore/snd-pcm.ko
insmod /lib/modules/2.6.10-xbox/kernel/sound/pci/ac97/snd-ac97-codec.ko
insmod /lib/modules/2.6.10-xbox/kernel/sound/pci/snd-intel8x0.ko xbox=1
xbox root # cat /proc/asound/cards
--- no soundcards ---
xbox root # lsmod
Module                  Size  Used by
snd_intel8x0           28672  0
snd_ac97_codec         74520  1 snd_intel8x0
snd_pcm                83496  2 snd_intel8x0,snd_ac97_codec
snd_timer              21348  1 snd_pcm
snd                    47300  4 snd_intel8x0,snd_ac97_codec,snd_pcm,snd_timer
soundcore               7424  1 snd
snd_page_alloc          7460  2 snd_intel8x0,snd_pcm


Expected Results:  
Sound card should be detected and accessible. Sound card should be visible 
in /proc/asound/cards.

xbox root # cat /proc/asound/version
Advanced Linux Sound Architecture Driver Version 1.0.8.
Compiled on Jan 30 2005 for kernel 2.6.10-xbox.

xbox root # cat /etc/modules.d/alsa
alias char-major-116 snd option cards_limit=1
alias char-major-14 soundcore
alias snd-card-0 snd-intel8x0
alias sound-slot-0 snd-card-0
alias sound-service-0-0 snd-mixer-oss
alias sound-service-0-1 snd-seq-oss
alias sound-service-0-3 snd-pcm-oss
alias sound-service-0-12 snd-pcm-oss
options snd cards_limit=1
options snd-intel8x0 xbox=1

xbox root # emerge info
Portage 2.0.51-r15 (default-linux/x86/xbox, gcc-3.3.4, glibc-2.3.4.20040808-r1, 
2.6.10-xbox i686)
=================================================================
System uname: 2.6.10-xbox i686 Celeron (Coppermine)
Gentoo Base System version 1.4.16
Python:              dev-lang/python-2.3.4 [2.3.4 (#1, Oct 24 2004, 07:40:35)]
dev-lang/python:     2.3.4
sys-devel/autoconf:  2.59-r5
sys-devel/automake:  1.8.5-r1
sys-devel/binutils:  2.14.90.0.8-r1
sys-devel/libtool:   1.5.2-r5
virtual/os-headers:  2.4.21-r1
ACCEPT_KEYWORDS=&quot;x86&quot;
AUTOCLEAN=&quot;yes&quot;
CFLAGS=&quot;-O2 -march=pentium3 -pipe -fomit-frame-pointer&quot;
CHOST=&quot;i686-pc-linux-gnu&quot;
CONFIG_PROTECT=&quot;/etc /usr/kde/2/share/config /usr/kde/3.3/env /usr/kde/3.3/share
/config /usr/kde/3.3/shutdown /usr/kde/3/share/config /usr/share/config /var/qma
il/control&quot;
CONFIG_PROTECT_MASK=&quot;/etc/gconf /etc/terminfo /etc/env.d&quot;
CXXFLAGS=&quot;-O2 -march=pentium3 -pipe -fomit-frame-pointer&quot;
DISTDIR=&quot;/usr/portage/distfiles&quot;
FEATURES=&quot;autoaddcvs autoconfig ccache distlocks sandbox sfperms&quot;
GENTOO_MIRRORS=&quot;ftp://ftp.easynet.nl/mirror/gentoo/ 
http://ftp.snt.utwente.nl/pub/os/linux/gentoo 
http://ftp.easynet.nl/mirror/gentoo/ http://mirrors.sec.informatik.tu-
darmstadt.de/gentoo/&quot;
MAKEOPTS=&quot;-j2&quot;
PKGDIR=&quot;/usr/portage/packages&quot;
PORTAGE_TMPDIR=&quot;/var/tmp&quot;
PORTDIR=&quot;/usr/portage&quot;
SYNC=&quot;rsync://rsync.gentoo.org/gentoo-portage&quot;
USE=&quot;X alsa apache2 apm avi berkdb bitmap-fonts crypt cscope cups dvd encode 
esd f77 fam flac font-server foomaticdb fortran gdbm gif gnome gpm gtk gtk2 
imlib ipv6 joystick jpeg kde libg++ libwww lirc mad matroska mikmod mmx motif 
mpeg mysql ncurses net nvidia oggvorbis opengl oss pam pdflib perl png python 
qt quicktime readline sdl slang spell sse ssl svga tcpd theora tiff transcode 
truetype truetype-fonts type1-fonts v412 x86 xinerama xml2 xmms xv xvid zlib&quot;
Unset:  ASFLAGS, CBUILD, CTARGET, LANG, LC_ALL, LDFLAGS, PORTDIR_OVERLAY</thetext>
          </long_desc>
          <long_desc isprivate="0">
            <who>david-tom@cosmicsys.com</who>
            <bug_when>2005-02-06 08:06:59 0000</bug_when>
            <thetext>When building alsa-driver, you should have had ALSA_CARDS=&apos;intel8x0&apos; in your make.conf.  Is this the case?</thetext>
          </long_desc>
          <long_desc isprivate="0">
            <who>mxa@xs4all.nl</who>
            <bug_when>2005-02-06 11:13:19 0000</bug_when>
            <thetext>Yes, I have ALSA_CARDS=&apos;intel8x0&apos; in make.conf. The module is built and it loads just fine (see the lsmod output), it just does not detect the card.</thetext>
          </long_desc>
          <long_desc isprivate="0">
            <who>chrb@gentoo.org</who>
            <bug_when>2005-02-23 15:52:20 0000</bug_when>
            <thetext>Did you use &quot;modprobe snd-intel8x0 xbox=1&quot;? Alsa can&apos;t auto detect the xbox sound hw.</thetext>
          </long_desc>
          <long_desc isprivate="0">
            <who>mxa@xs4all.nl</who>
            <bug_when>2005-02-24 05:16:09 0000</bug_when>
            <thetext>Yes. That is, I&apos;ve put xbox=1 as option for the card in /etc/modules.d/alsa, which gets folded into /etc/modules.conf by modules-update. When I do (as shown above in the problem description):
xbox root # modprobe -v snd-card-0
it says
[other insmods]
insmod /lib/modules/2.6.10-xbox/kernel/sound/pci/snd-intel8x0.ko xbox=1

So that should be the same, right?</thetext>
          </long_desc>
          <long_desc isprivate="0">
            <who>eradicator@gentoo.org</who>
            <bug_when>2005-02-24 10:40:14 0000</bug_when>
            <thetext>That is the same (assuming you did modules-update before the modprobe).</thetext>
          </long_desc>
          <long_desc isprivate="0">
            <who>mxa@xs4all.nl</who>
            <bug_when>2005-02-25 07:59:50 0000</bug_when>
            <thetext>Yes, I did run modules-update...

Maybe this is helpful info: the following appears in /var/log/kernel/current each time I try to load the module:
Feb 25 17:44:11 [kernel] PCI: Setting latency timer of device 0000:00:06.0 to 64
Feb 25 17:44:11 [kernel] ohci_hcd 0000:00:03.0: wakeup
                - Last output repeated 2 times -
Feb 25 17:44:12 [kernel] Intel ICH: probe of 0000:00:06.0 failed with error -13
Feb 25 17:44:13 [kernel] ohci_hcd 0000:00:03.0: wakeup

I don&apos;t know what to make of &quot;error -13&quot;, but 0000:00:06.0 is the pci address of the audio device (it has two, for some reason?):
xbox root # lspci | grep audio
0000:00:05.0 Multimedia audio controller: nVidia Corporation nForce Audio (rev d2)
0000:00:06.0 Multimedia audio controller: nVidia Corporation nForce Audio (rev d2)

Any ideas, anyone?</thetext>
          </long_desc>
          <long_desc isprivate="0">
            <who>chrb@gentoo.org</who>
            <bug_when>2005-03-16 10:39:55 0000</bug_when>
            <thetext>Could be related to the &quot;No sound in 2.6.10&quot; thread on xbox-linux-user? http://sourceforge.net/mailarchive/message.php?msg_id=10500378</thetext>
          </long_desc>
          <long_desc isprivate="0">
            <who>mxa@xs4all.nl</who>
            <bug_when>2005-03-17 11:12:48 0000</bug_when>
            <thetext>Thanks for the link Chris, you made my day! I changed (in sound/pci/ac97/ac97_codec.c):

if (!(ac97-&gt;scaps &amp; AC97_SCAP_SKIP_AUDIO) &amp;&amp; !(ac97-&gt;scaps &amp; AC97_SCAP_AUDIO)) {
         /* test if we can write to the record gain volume register */
         snd_ac97_write_cache(ac97, AC97_REC_GAIN, 0x8a06);
         if (((err = snd_ac97_read(ac97, AC97_REC_GAIN)) &amp; 0x7fff) == 0x0a06)
                 ac97-&gt;scaps |= AC97_SCAP_AUDIO;
}

to

if (!(ac97-&gt;scaps &amp; AC97_SCAP_SKIP_AUDIO) &amp;&amp; !(ac97-&gt;scaps &amp; AC97_SCAP_$
       if ((ac97-&gt;scaps &amp; AC97_SCAP_DETECT_BY_VENDOR))
               ac97-&gt;scaps |= AC97_SCAP_AUDIO;
       else {
         /* test if we can write to the record gain volume register */
         snd_ac97_write_cache(ac97, AC97_REC_GAIN, 0x8a06);
         if (((err = snd_ac97_read(ac97, AC97_REC_GAIN)) &amp; 0x7fff) == 0x$
                 ac97-&gt;scaps |= AC97_SCAP_AUDIO;
      }
}

And now it works! The intel_8x0 card is detected:
xbox root # cat /proc/asound/cards
0 [nForce         ]: NFORCE - NVidia nForce
                     NVidia nForce with unknown codec at 0xfec00000, irq 6

My Xbox is playing through the stereo as I write this. :-D

Could someone with more Gentoo-hacking experience than me convert this into a patch and add it to the alsa-driver ebuild?

</thetext>
          </long_desc>
          <long_desc isprivate="0">
            <who>chrb@gentoo.org</who>
            <bug_when>2005-03-17 11:58:58 0000</bug_when>
            <thetext>I&apos;ve emailed David Pye, I think maybe the fix never got sent upstream..</thetext>
          </long_desc>
          <long_desc isprivate="0">
            <who>chrb@gentoo.org</who>
            <bug_when>2005-03-18 02:34:45 0000</bug_when>
            <thetext>Searching the alsa bugs I found this:

https://bugtrack.alsa-project.org/alsa-bug/view.php?id=778

Looks like the same bug.</thetext>
          </long_desc>
          <long_desc isprivate="0">
            <who>mxa@xs4all.nl</who>
            <bug_when>2005-03-18 07:07:18 0000</bug_when>
            <thetext>That&apos;s because I submitted it... ;-) 
Too bad nobody reacted; there is a lot more activity here at bugs.gentoo.org (fortunately).</thetext>
          </long_desc>
          <long_desc isprivate="0">
            <who>mxa@xs4all.nl</who>
            <bug_when>2005-03-19 04:06:23 0000</bug_when>
            <thetext>Oh, and that first line in the fixed version should read:
if (!(ac97-&gt;scaps &amp; AC97_SCAP_SKIP_AUDIO) &amp;&amp; !(ac97-&gt;scaps &amp; AC97_SCAP_AUDIO)) {

(not AC97_SCAP_$, that&apos;s what you get when cutting/pasting from nano -w ;-)</thetext>
          </long_desc>
          <long_desc isprivate="0">
            <who>mxa@xs4all.nl</who>
            <bug_when>2005-03-19 04:17:33 0000</bug_when>
            <thetext>Created an attachment (id=53849)
Working version of sound/pci/ac97/ac97_codec.c
</thetext>
          </long_desc>
          <long_desc isprivate="0">
            <who>chrb@gentoo.org</who>
            <bug_when>2005-04-03 10:54:53 0000</bug_when>
            <thetext>Thanks for that, I&apos;ve added it to cvs. Re-open this bug if it doesn&apos;t work.</thetext>
          </long_desc>
      
          <attachment
              isobsolete="0"
              ispatch="0"
              isprivate="0"
          >
            <attachid>53849</attachid>
            <date>2005-03-19 04:17 0000</date>
            <desc>Working version of sound/pci/ac97/ac97_codec.c</desc>
            <filename>ac97_codec.c</filename>
            <type>text/plain</type>
            <data encoding="base64">LyoKICogIENvcHlyaWdodCAoYykgYnkgSmFyb3NsYXYgS3lzZWxhIDxwZXJleEBzdXNlLmN6Pgog
KiAgVW5pdmVyc2FsIGludGVyZmFjZSBmb3IgQXVkaW8gQ29kZWMgJzk3CiAqCiAqICBGb3IgbW9y
ZSBkZXRhaWxzIGxvb2sgdG8gQUMgJzk3IGNvbXBvbmVudCBzcGVjaWZpY2F0aW9uIHJldmlzaW9u
IDIuMgogKiAgYnkgSW50ZWwgQ29ycG9yYXRpb24gKGh0dHA6Ly9kZXZlbG9wZXIuaW50ZWwuY29t
KS4KICoKICoKICogICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRp
c3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQogKiAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUg
R05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CiAqICAgdGhlIEZyZWUg
U29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IK
ICogICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgogKgogKiAgIFRoaXMgcHJv
Z3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAog
KiAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdh
cnJhbnR5IG9mCiAqICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxB
UiBQVVJQT1NFLiAgU2VlIHRoZQogKiAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBt
b3JlIGRldGFpbHMuCiAqCiAqICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0
aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKICogICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3Jh
bTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQogKiAgIEZvdW5kYXRpb24sIElu
Yy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3IFVT
QQogKgogKi8KCiNpbmNsdWRlIDxzb3VuZC9kcml2ZXIuaD4KI2luY2x1ZGUgPGxpbnV4L2RlbGF5
Lmg+CiNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CiNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CiNpbmNs
dWRlIDxsaW51eC9wY2kuaD4KI2luY2x1ZGUgPGxpbnV4L21vZHVsZXBhcmFtLmg+CiNpbmNsdWRl
IDxzb3VuZC9jb3JlLmg+CiNpbmNsdWRlIDxzb3VuZC9wY20uaD4KI2luY2x1ZGUgPHNvdW5kL2Fj
OTdfY29kZWMuaD4KI2luY2x1ZGUgPHNvdW5kL2Fzb3VuZGVmLmg+CiNpbmNsdWRlIDxzb3VuZC9p
bml0dmFsLmg+CiNpbmNsdWRlICJhYzk3X2xvY2FsLmgiCiNpbmNsdWRlICJhYzk3X2lkLmgiCiNp
bmNsdWRlICJhYzk3X3BhdGNoLmgiCgpNT0RVTEVfQVVUSE9SKCJKYXJvc2xhdiBLeXNlbGEgPHBl
cmV4QHN1c2UuY3o+Iik7Ck1PRFVMRV9ERVNDUklQVElPTigiVW5pdmVyc2FsIGludGVyZmFjZSBm
b3IgQXVkaW8gQ29kZWMgJzk3Iik7Ck1PRFVMRV9MSUNFTlNFKCJHUEwiKTsKCnN0YXRpYyBpbnQg
ZW5hYmxlX2xvb3BiYWNrOwoKbW9kdWxlX3BhcmFtKGVuYWJsZV9sb29wYmFjaywgYm9vbCwgMDQ0
NCk7Ck1PRFVMRV9QQVJNX0RFU0MoZW5hYmxlX2xvb3BiYWNrLCAiRW5hYmxlIEFDOTcgQURDL0RB
QyBMb29wYmFjayBDb250cm9sIik7CgovKgoKICovCgp0eXBlZGVmIHN0cnVjdCB7Cgl1bnNpZ25l
ZCBpbnQgaWQ7Cgl1bnNpZ25lZCBpbnQgbWFzazsKCWNvbnN0IGNoYXIgKm5hbWU7CglpbnQgKCpw
YXRjaCkoYWM5N190ICphYzk3KTsKCWludCAoKm1wYXRjaCkoYWM5N190ICphYzk3KTsKfSBhYzk3
X2NvZGVjX2lkX3Q7CgpzdGF0aWMgY29uc3QgYWM5N19jb2RlY19pZF90IHNuZF9hYzk3X2NvZGVj
X2lkX3ZlbmRvcnNbXSA9IHsKeyAweDQxNGI0ZDAwLCAweGZmZmZmZjAwLCAiQXNhaGkgS2FzZWki
LAlOVUxMLAlOVUxMIH0sCnsgMHg0MTQ0NTMwMCwgMHhmZmZmZmYwMCwgIkFuYWxvZyBEZXZpY2Vz
IiwJTlVMTCwJTlVMTCB9LAp7IDB4NDE0YzQzMDAsIDB4ZmZmZmZmMDAsICJSZWFsdGVrIiwJCU5V
TEwsCU5VTEwgfSwKeyAweDQxNGM0NzAwLCAweGZmZmZmZjAwLCAiUmVhbHRlayIsCQlOVUxMLAlO
VUxMIH0sCnsgMHg0MzRkNDkwMCwgMHhmZmZmZmYwMCwgIkMtTWVkaWEgRWxlY3Ryb25pY3MiLCBO
VUxMLAlOVUxMIH0sCnsgMHg0MzUyNTkwMCwgMHhmZmZmZmYwMCwgIkNpcnJ1cyBMb2dpYyIsCU5V
TEwsCU5VTEwgfSwKeyAweDQzNTg1NDAwLCAweGZmZmZmZjAwLCAiQ29uZXhhbnQiLCAgICAgICAg
ICAgTlVMTCwJTlVMTCB9LAp7IDB4NDQ1NDMwMDAsIDB4ZmZmZmZmMDAsICJEaWFtb25kIFRlY2hu
b2xvZ3kiLCBOVUxMLAlOVUxMIH0sCnsgMHg0NTRkNDMwMCwgMHhmZmZmZmYwMCwgImVNaWNybyIs
CQlOVUxMLAlOVUxMIH0sCnsgMHg0NTgzODMwMCwgMHhmZmZmZmYwMCwgIkVTUyBUZWNobm9sb2d5
IiwJTlVMTCwJTlVMTCB9LAp7IDB4NDg1MjUzMDAsIDB4ZmZmZmZmMDAsICJJbnRlcnNpbCIsCQlO
VUxMLAlOVUxMIH0sCnsgMHg0OTQzNDUwMCwgMHhmZmZmZmYwMCwgIklDRW5zZW1ibGUiLAkJTlVM
TCwJTlVMTCB9LAp7IDB4NDk1NDQ1MDAsIDB4ZmZmZmZmMDAsICJJVEUgVGVjaC5JbmMiLAlOVUxM
LAlOVUxMIH0sCnsgMHg0ZTUzNDMwMCwgMHhmZmZmZmYwMCwgIk5hdGlvbmFsIFNlbWljb25kdWN0
b3IiLCBOVUxMLCBOVUxMIH0sCnsgMHg1MDUzNDMwMCwgMHhmZmZmZmYwMCwgIlBoaWxpcHMiLAkJ
TlVMTCwJTlVMTCB9LAp7IDB4NTM0OTRjMDAsIDB4ZmZmZmZmMDAsICJTaWxpY29uIExhYm9yYXRv
cnkiLAlOVUxMLAlOVUxMIH0sCnsgMHg1NDUyNDEwMCwgMHhmZmZmZmYwMCwgIlRyaVRlY2giLAkJ
TlVMTCwJTlVMTCB9LAp7IDB4NTQ1ODRlMDAsIDB4ZmZmZmZmMDAsICJUZXhhcyBJbnN0cnVtZW50
cyIsCU5VTEwsCU5VTEwgfSwKeyAweDU2NDk0MTAwLCAweGZmZmZmZjAwLCAiVklBIFRlY2hub2xv
Z2llcyIsICAgTlVMTCwJTlVMTCB9LAp7IDB4NTc0NTQzMDAsIDB4ZmZmZmZmMDAsICJXaW5ib25k
IiwJCU5VTEwsCU5VTEwgfSwKeyAweDU3NGQ0YzAwLCAweGZmZmZmZjAwLCAiV29sZnNvbiIsCQlO
VUxMLAlOVUxMIH0sCnsgMHg1OTRkNDgwMCwgMHhmZmZmZmYwMCwgIllhbWFoYSIsCQlOVUxMLAlO
VUxMIH0sCnsgMHg4Mzg0NzYwMCwgMHhmZmZmZmYwMCwgIlNpZ21hVGVsIiwJCU5VTEwsCU5VTEwg
fSwKeyAwLAkgICAgICAwLCAJICBOVUxMLAkJCU5VTEwsCU5VTEwgfQp9OwoKc3RhdGljIGNvbnN0
IGFjOTdfY29kZWNfaWRfdCBzbmRfYWM5N19jb2RlY19pZHNbXSA9IHsKeyAweDQxNGI0ZDAwLCAw
eGZmZmZmZmZmLCAiQUs0NTQwIiwJCU5VTEwsCQlOVUxMIH0sCnsgMHg0MTRiNGQwMSwgMHhmZmZm
ZmZmZiwgIkFLNDU0MiIsCQlOVUxMLAkJTlVMTCB9LAp7IDB4NDE0YjRkMDIsIDB4ZmZmZmZmZmYs
ICJBSzQ1NDMiLAkJTlVMTCwJCU5VTEwgfSwKeyAweDQxNGI0ZDA2LCAweGZmZmZmZmZmLCAiQUs0
NTQ0QSIsCQlOVUxMLAkJTlVMTCB9LAp7IDB4NDE0YjRkMDcsIDB4ZmZmZmZmZmYsICJBSzQ1NDUi
LAkJTlVMTCwJCU5VTEwgfSwKeyAweDQxNDQ1MzAzLCAweGZmZmZmZmZmLCAiQUQxODE5IiwJCXBh
dGNoX2FkMTgxOSwJTlVMTCB9LAp7IDB4NDE0NDUzNDAsIDB4ZmZmZmZmZmYsICJBRDE4ODEiLAkJ
cGF0Y2hfYWQxODgxLAlOVUxMIH0sCnsgMHg0MTQ0NTM0OCwgMHhmZmZmZmZmZiwgIkFEMTg4MUEi
LAkJcGF0Y2hfYWQxODgxLAlOVUxMIH0sCnsgMHg0MTQ0NTM2MCwgMHhmZmZmZmZmZiwgIkFEMTg4
NSIsCQlwYXRjaF9hZDE4ODUsCU5VTEwgfSwKeyAweDQxNDQ1MzYxLCAweGZmZmZmZmZmLCAiQUQx
ODg2IiwJCXBhdGNoX2FkMTg4NiwJTlVMTCB9LAp7IDB4NDE0NDUzNjIsIDB4ZmZmZmZmZmYsICJB
RDE4ODciLAkJcGF0Y2hfYWQxODgxLAlOVUxMIH0sCnsgMHg0MTQ0NTM2MywgMHhmZmZmZmZmZiwg
IkFEMTg4NkEiLAkJcGF0Y2hfYWQxODgxLAlOVUxMIH0sCnsgMHg0MTQ0NTM2OCwgMHhmZmZmZmZm
ZiwgIkFEMTg4OCIsCQlwYXRjaF9hZDE4ODgsCU5VTEwgfSwKeyAweDQxNDQ1MzcwLCAweGZmZmZm
ZmZmLCAiQUQxOTgwIiwJCXBhdGNoX2FkMTk4MCwJTlVMTCB9LAp7IDB4NDE0NDUzNzIsIDB4ZmZm
ZmZmZmYsICJBRDE5ODFBIiwJCXBhdGNoX2FkMTk4MWEsCU5VTEwgfSwKeyAweDQxNDQ1Mzc0LCAw
eGZmZmZmZmZmLCAiQUQxOTgxQiIsCQlwYXRjaF9hZDE5ODFiLAlOVUxMIH0sCnsgMHg0MTQ0NTM3
NSwgMHhmZmZmZmZmZiwgIkFEMTk4NSIsCQlwYXRjaF9hZDE5ODUsCU5VTEwgfSwKeyAweDQxNGM0
MzAwLCAweGZmZmZmZjAwLCAiQUxDMTAwLzEwMFAiLCAJTlVMTCwJCU5VTEwgfSwKeyAweDQxNGM0
NzEwLCAweGZmZmZmZmYwLCAiQUxDMjAwLzIwMFAiLAlOVUxMLAkJTlVMTCB9LAp7IDB4NDE0YzQ3
MjEsIDB4ZmZmZmZmZmYsICJBTEM2NTBEIiwJCU5VTEwsCU5VTEwgfSwgLyogYWxyZWFkeSBwYXRj
aGVkICovCnsgMHg0MTRjNDcyMiwgMHhmZmZmZmZmZiwgIkFMQzY1MEUiLAkJTlVMTCwJTlVMTCB9
LCAvKiBhbHJlYWR5IHBhdGNoZWQgKi8KeyAweDQxNGM0NzIzLCAweGZmZmZmZmZmLCAiQUxDNjUw
RiIsCQlOVUxMLAlOVUxMIH0sIC8qIGFscmVhZHkgcGF0Y2hlZCAqLwp7IDB4NDE0YzQ3MjAsIDB4
ZmZmZmZmZjAsICJBTEM2NTAiLAkJcGF0Y2hfYWxjNjUwLAlOVUxMIH0sCnsgMHg0MTRjNDc2MCwg
MHhmZmZmZmZmMCwgIkFMQzY1NSIsCQlwYXRjaF9hbGM2NTUsCU5VTEwgfSwKeyAweDQxNGM0Nzgw
LCAweGZmZmZmZmYwLCAiQUxDNjU4IiwJCXBhdGNoX2FsYzY1NSwJTlVMTCB9LAp7IDB4NDE0YzQ3
OTAsIDB4ZmZmZmZmZjAsICJBTEM4NTAiLAkJcGF0Y2hfYWxjODUwLAlOVUxMIH0sCnsgMHg0MTRj
NDczMCwgMHhmZmZmZmZmZiwgIkFMQzEwMSIsCQlOVUxMLAkJTlVMTCB9LAp7IDB4NDE0YzQ3NDAs
IDB4ZmZmZmZmZjAsICJBTEMyMDIiLAkJTlVMTCwJCU5VTEwgfSwKeyAweDQxNGM0NzUwLCAweGZm
ZmZmZmYwLCAiQUxDMjUwIiwJCU5VTEwsCQlOVUxMIH0sCnsgMHg0MTRjNDc3MCwgMHhmZmZmZmZm
MCwgIkFMQzIwMyIsCQlOVUxMLAkJTlVMTCB9LAp7IDB4NDM0ZDQ5NDEsIDB4ZmZmZmZmZmYsICJD
TUk5NzM4IiwJCXBhdGNoX2NtOTczOCwJTlVMTCB9LAp7IDB4NDM0ZDQ5NjEsIDB4ZmZmZmZmZmYs
ICJDTUk5NzM5IiwJCXBhdGNoX2NtOTczOSwJTlVMTCB9LAp7IDB4NDM0ZDQ5NzgsIDB4ZmZmZmZm
ZmYsICJDTUk5NzYxIiwJCXBhdGNoX2NtOTc2MSwJTlVMTCB9LAp7IDB4NDM0ZDQ5ODIsIDB4ZmZm
ZmZmZmYsICJDTUk5NzYxIiwJCXBhdGNoX2NtOTc2MSwJTlVMTCB9LAp7IDB4NDM0ZDQ5ODMsIDB4
ZmZmZmZmZmYsICJDTUk5NzYxIiwJCXBhdGNoX2NtOTc2MSwJTlVMTCB9LAp7IDB4NDM1MjU5MDAs
IDB4ZmZmZmZmZjgsICJDUzQyOTciLAkJTlVMTCwJCU5VTEwgfSwKeyAweDQzNTI1OTEwLCAweGZm
ZmZmZmY4LCAiQ1M0Mjk3QSIsCQlwYXRjaF9jaXJydXNfc3BkaWYsCU5VTEwgfSwKeyAweDQzNTI1
OTIwLCAweGZmZmZmZmY4LCAiQ1M0Mjk4IiwJCXBhdGNoX2NpcnJ1c19zcGRpZiwJCU5VTEwgfSwK
eyAweDQzNTI1OTI4LCAweGZmZmZmZmY4LCAiQ1M0Mjk0IiwJCU5VTEwsCQlOVUxMIH0sCnsgMHg0
MzUyNTkzMCwgMHhmZmZmZmZmOCwgIkNTNDI5OSIsCQlwYXRjaF9jaXJydXNfY3M0Mjk5LAlOVUxM
IH0sCnsgMHg0MzUyNTk0OCwgMHhmZmZmZmZmOCwgIkNTNDIwMSIsCQlOVUxMLAkJTlVMTCB9LAp7
IDB4NDM1MjU5NTgsIDB4ZmZmZmZmZjgsICJDUzQyMDUiLAkJcGF0Y2hfY2lycnVzX3NwZGlmLAlO
VUxMIH0sCnsgMHg0MzUyNTk2MCwgMHhmZmZmZmZmOCwgIkNTNDI5MSIsCQlOVUxMLAkJTlVMTCB9
LAp7IDB4NDM1MjU5NzAsIDB4ZmZmZmZmZjgsICJDUzQyMDIiLAkJTlVMTCwJCU5VTEwgfSwKeyAw
eDQzNTg1NDIxLCAweGZmZmZmZmZmLCAiSFNEMTEyNDYiLAkJTlVMTCwJCU5VTEwgfSwJLy8gU21h
cnRNQyBJSQp7IDB4NDM1ODU0MjgsIDB4ZmZmZmZmZjgsICJDeDIwNDY4IiwJCXBhdGNoX2NvbmV4
YW50LAlOVUxMIH0sIC8vIFNtYXJ0QU1DIGZpeG1lOiB0aGUgbWFzayBtaWdodCBiZSBkaWZmZXJl
bnQKeyAweDQ0NTQzMDMxLCAweGZmZmZmZmYwLCAiRFQwMzk4IiwJCU5VTEwsCQlOVUxMIH0sCnsg
MHg0NTRkNDMyOCwgMHhmZmZmZmZmZiwgIjI4MDI4IiwJCU5VTEwsCQlOVUxMIH0sICAvLyBzYW1l
IGFzIFRSMjgwMjg/CnsgMHg0NTgzODMwOCwgMHhmZmZmZmZmZiwgIkVTUzE5ODgiLAkJTlVMTCwJ
CU5VTEwgfSwKeyAweDQ4NTI1MzAwLCAweGZmZmZmZjAwLCAiSE1QOTcwMSIsCQlOVUxMLAkJTlVM
TCB9LAp7IDB4NDk0MzQ1MDEsIDB4ZmZmZmZmZmYsICJJQ0UxMjMwIiwJCU5VTEwsCQlOVUxMIH0s
CnsgMHg0OTQzNDUxMSwgMHhmZmZmZmZmZiwgIklDRTEyMzIiLAkJTlVMTCwJCU5VTEwgfSwgLy8g
YWxpYXMgVklBIFZUMTYxMUE/CnsgMHg0OTQzNDUxNCwgMHhmZmZmZmZmZiwgIklDRTEyMzJBIiwJ
CU5VTEwsCQlOVUxMIH0sCnsgMHg0OTQzNDU1MSwgMHhmZmZmZmZmZiwgIlZUMTYxNiIsIAkJcGF0
Y2hfdnQxNjE2LAlOVUxMIH0sIAp7IDB4NDk0MzQ1NTIsIDB4ZmZmZmZmZmYsICJWVDE2MTZpIiwJ
CXBhdGNoX3Z0MTYxNiwJTlVMTCB9LCAvLyBWVDE2MTYgY29tcGF0aWJsZSAoY2hpcHNldCBpbnRl
Z3JhdGVkKQp7IDB4NDk1NDQ1MjAsIDB4ZmZmZmZmZmYsICJJVDIyMjZFIiwJCU5VTEwsCQlOVUxM
IH0sCnsgMHg0OTU0NDU2MSwgMHhmZmZmZmZmZiwgIklUMjY0NkUiLAkJcGF0Y2hfaXQyNjQ2LAlO
VUxMIH0sCnsgMHg0ZTUzNDMwMCwgMHhmZmZmZmZmZiwgIkxNNDU0MC80My80NS80Ni80OCIsCU5V
TEwsCQlOVUxMIH0sIC8vIG9ubHkgZ3Vlc3MgLS1qawp7IDB4NGU1MzQzMzEsIDB4ZmZmZmZmZmYs
ICJMTTQ1NDkiLAkJTlVMTCwJCU5VTEwgfSwKeyAweDRlNTM0MzUwLCAweGZmZmZmZmZmLCAiTE00
NTUwIiwJCU5VTEwsCQlOVUxMIH0sCnsgMHg1MDUzNDMwNCwgMHhmZmZmZmZmZiwgIlVDQjE0MDAi
LAkJTlVMTCwJCU5VTEwgfSwKeyAweDUzNDk0YzIwLCAweGZmZmZmZmUwLCAiU2kzMDM2LzgiLAkJ
TlVMTCwJCW1wYXRjaF9zaTMwMzYgfSwKeyAweDU0NTI0MTAyLCAweGZmZmZmZmZmLCAiVFIyODAy
MiIsCQlOVUxMLAkJTlVMTCB9LAp7IDB4NTQ1MjQxMDYsIDB4ZmZmZmZmZmYsICJUUjI4MDI2IiwJ
CU5VTEwsCQlOVUxMIH0sCnsgMHg1NDUyNDEwOCwgMHhmZmZmZmZmZiwgIlRSMjgwMjgiLAkJcGF0
Y2hfdHJpdGVjaF90cjI4MDI4LAlOVUxMIH0sIC8vIGFkZGVkIGJ5IHhpbiBqaW4gWzA3LzA5Lzk5
XQp7IDB4NTQ1MjQxMjMsIDB4ZmZmZmZmZmYsICJUUjI4NjAyIiwJCU5VTEwsCQlOVUxMIH0sIC8v
IG9ubHkgZ3Vlc3MgLS1qayBbVFIyODAyMyA9IGVNaWNybyBFTTI4MDIzIChuZXcgQ1QxMjk3KV0K
eyAweDU0NTg0ZTIwLCAweGZmZmZmZmZmLCAiVExDMzIwQUQ5eEMiLAlOVUxMLAkJTlVMTCB9LAp7
IDB4NTY0OTQxNjEsIDB4ZmZmZmZmZmYsICJWSUExNjEyQSIsCQlOVUxMLAkJTlVMTCB9LCAvLyBt
b2RpZmllZCBJQ0UxMjMyIHdpdGggUy9QRElGCnsgMHg1NzQ1NDMwMSwgMHhmZmZmZmZmZiwgIlc4
Mzk3MUQiLAkJTlVMTCwJCU5VTEwgfSwKeyAweDU3NGQ0YzAwLCAweGZmZmZmZmZmLCAiV005NzAx
QSIsCQlOVUxMLAkJTlVMTCB9LAp7IDB4NTc0ZDRDMDMsIDB4ZmZmZmZmZmYsICJXTTk3MDMvV005
NzA3L1dNOTcwOC9XTTk3MTciLCBwYXRjaF93b2xmc29uMDMsIE5VTEx9LAp7IDB4NTc0ZDRDMDQs
IDB4ZmZmZmZmZmYsICJXTTk3MDRNL1dNOTcwNFEiLAlwYXRjaF93b2xmc29uMDQsIE5VTEx9LAp7
IDB4NTc0ZDRDMDUsIDB4ZmZmZmZmZmYsICJXTTk3MDUvV005NzEwIiwJcGF0Y2hfd29sZnNvbjA1
LCBOVUxMfSwKeyAweDU3NGQ0QzA5LCAweGZmZmZmZmZmLCAiV005NzA5IiwJCU5VTEwsCQlOVUxM
fSwKeyAweDU3NGQ0QzEyLCAweGZmZmZmZmZmLCAiV005NzExL1dNOTcxMiIsCXBhdGNoX3dvbGZz
b24xMSwgTlVMTH0sCnsgMHg1OTRkNDgwMCwgMHhmZmZmZmZmZiwgIllNRjc0MyIsCQlOVUxMLAkJ
TlVMTCB9LAp7IDB4NTk0ZDQ4MDIsIDB4ZmZmZmZmZmYsICJZTUY3NTIiLAkJTlVMTCwJCU5VTEwg
fSwKeyAweDU5NGQ0ODAzLCAweGZmZmZmZmZmLCAiWU1GNzUzIiwJCXBhdGNoX3lhbWFoYV95bWY3
NTMsCU5VTEwgfSwKeyAweDgzODQ3NjAwLCAweGZmZmZmZmZmLCAiU1RBQzk3MDAvODMvODQiLAlw
YXRjaF9zaWdtYXRlbF9zdGFjOTcwMCwJTlVMTCB9LAp7IDB4ODM4NDc2MDQsIDB4ZmZmZmZmZmYs
ICJTVEFDOTcwMS8zLzQvNSIsCU5VTEwsCQlOVUxMIH0sCnsgMHg4Mzg0NzYwNSwgMHhmZmZmZmZm
ZiwgIlNUQUM5NzA0IiwJCU5VTEwsCQlOVUxMIH0sCnsgMHg4Mzg0NzYwOCwgMHhmZmZmZmZmZiwg
IlNUQUM5NzA4LzExIiwJcGF0Y2hfc2lnbWF0ZWxfc3RhYzk3MDgsCU5VTEwgfSwKeyAweDgzODQ3
NjA5LCAweGZmZmZmZmZmLCAiU1RBQzk3MjEvMjMiLAlwYXRjaF9zaWdtYXRlbF9zdGFjOTcyMSwJ
TlVMTCB9LAp7IDB4ODM4NDc2NDQsIDB4ZmZmZmZmZmYsICJTVEFDOTc0NCIsCQlwYXRjaF9zaWdt
YXRlbF9zdGFjOTc0NCwJTlVMTCB9LAp7IDB4ODM4NDc2NTAsIDB4ZmZmZmZmZmYsICJTVEFDOTc1
MC81MSIsCU5VTEwsCQlOVUxMIH0sCS8vIHBhdGNoPwp7IDB4ODM4NDc2NTIsIDB4ZmZmZmZmZmYs
ICJTVEFDOTc1Mi81MyIsCU5VTEwsCQlOVUxMIH0sIC8vIHBhdGNoPwp7IDB4ODM4NDc2NTYsIDB4
ZmZmZmZmZmYsICJTVEFDOTc1Ni81NyIsCXBhdGNoX3NpZ21hdGVsX3N0YWM5NzU2LAlOVUxMIH0s
CnsgMHg4Mzg0NzY1OCwgMHhmZmZmZmZmZiwgIlNUQUM5NzU4LzU5IiwJcGF0Y2hfc2lnbWF0ZWxf
c3RhYzk3NTgsCU5VTEwgfSwKeyAweDgzODQ3NjY2LCAweGZmZmZmZmZmLCAiU1RBQzk3NjYvNjci
LAlOVUxMLAkJTlVMTCB9LCAvLyBwYXRjaD8KeyAwLCAJICAgICAgMCwJICBOVUxMLAkJCU5VTEws
CQlOVUxMIH0KfTsKCmNvbnN0IGNoYXIgKnNuZF9hYzk3X3N0ZXJlb19lbmhhbmNlbWVudHNbXSA9
CnsKICAvKiAgIDAgKi8gIk5vIDNEIFN0ZXJlbyBFbmhhbmNlbWVudCIsCiAgLyogICAxICovICJB
bmFsb2cgRGV2aWNlcyBQaGF0IFN0ZXJlbyIsCiAgLyogICAyICovICJDcmVhdGl2ZSBTdGVyZW8g
RW5oYW5jZW1lbnQiLAogIC8qICAgMyAqLyAiTmF0aW9uYWwgU2VtaSAzRCBTdGVyZW8gRW5oYW5j
ZW1lbnQiLAogIC8qICAgNCAqLyAiWUFNQUhBIFltZXJzaW9uIiwKICAvKiAgIDUgKi8gIkJCRSAz
RCBTdGVyZW8gRW5oYW5jZW1lbnQiLAogIC8qICAgNiAqLyAiQ3J5c3RhbCBTZW1pIDNEIFN0ZXJl
byBFbmhhbmNlbWVudCIsCiAgLyogICA3ICovICJRc291bmQgUVhwYW5kZXIiLAogIC8qICAgOCAq
LyAiU3BhdGlhbGl6ZXIgM0QgU3RlcmVvIEVuaGFuY2VtZW50IiwKICAvKiAgIDkgKi8gIlNSUyAz
RCBTdGVyZW8gRW5oYW5jZW1lbnQiLAogIC8qICAxMCAqLyAiUGxhdGZvcm0gVGVjaCAzRCBTdGVy
ZW8gRW5oYW5jZW1lbnQiLAogIC8qICAxMSAqLyAiQUtNIDNEIEF1ZGlvIiwKICAvKiAgMTIgKi8g
IkF1cmVhbCBTdGVyZW8gRW5oYW5jZW1lbnQiLAogIC8qICAxMyAqLyAiQXp0ZWNoIDNEIEVuaGFu
Y2VtZW50IiwKICAvKiAgMTQgKi8gIkJpbmF1cmEgM0QgQXVkaW8gRW5oYW5jZW1lbnQiLAogIC8q
ICAxNSAqLyAiRVNTIFRlY2hub2xvZ3kgU3RlcmVvIEVuaGFuY2VtZW50IiwKICAvKiAgMTYgKi8g
Ikhhcm1hbiBJbnRlcm5hdGlvbmFsIFZNQXgiLAogIC8qICAxNyAqLyAiTnZpZGVhL0lDIEVuc2Vt
YmxlL0tTIFdhdmVzIDNEIFN0ZXJlbyBFbmhhbmNlbWVudCIsCiAgLyogIDE4ICovICJQaGlsaXBz
IEluY3JlZGlibGUgU291bmQiLAogIC8qICAxOSAqLyAiVGV4YXMgSW5zdHJ1bWVudHMgM0QgU3Rl
cmVvIEVuaGFuY2VtZW50IiwKICAvKiAgMjAgKi8gIlZMU0kgVGVjaG5vbG9neSAzRCBTdGVyZW8g
RW5oYW5jZW1lbnQiLAogIC8qICAyMSAqLyAiVHJpVGVjaCAzRCBTdGVyZW8gRW5oYW5jZW1lbnQi
LAogIC8qICAyMiAqLyAiUmVhbHRlayAzRCBTdGVyZW8gRW5oYW5jZW1lbnQiLAogIC8qICAyMyAq
LyAiU2Ftc3VuZyAzRCBTdGVyZW8gRW5oYW5jZW1lbnQiLAogIC8qICAyNCAqLyAiV29sZnNvbiBN
aWNyb2VsZWN0cm9uaWNzIDNEIEVuaGFuY2VtZW50IiwKICAvKiAgMjUgKi8gIkRlbHRhIEludGVn
cmF0aW9uIDNEIEVuaGFuY2VtZW50IiwKICAvKiAgMjYgKi8gIlNpZ21hVGVsIDNEIEVuaGFuY2Vt
ZW50IiwKICAvKiAgMjcgKi8gIklDIEVuc2VtYmxlL0tTIFdhdmVzIiwKICAvKiAgMjggKi8gIlJv
Y2t3ZWxsIDNEIFN0ZXJlbyBFbmhhbmNlbWVudCIsCiAgLyogIDI5ICovICJSZXNlcnZlZCAyOSIs
CiAgLyogIDMwICovICJSZXNlcnZlZCAzMCIsCiAgLyogIDMxICovICJSZXNlcnZlZCAzMSIKfTsK
Ci8qCiAqIFNoYXJlZCBBQzk3IGNvbnRyb2xsZXJzIChJQ0gsIEFUSUlYUC4uLikKICovCnN0YXRp
YyBERUNMQVJFX01VVEVYKHNoYXJlZF9jb2RlY19tdXRleCk7CnN0YXRpYyBhYzk3X3QgKnNoYXJl
ZF9jb2RlY1tBQzk3X1NIQVJFRF9UWVBFU11bNF07CgoKLyoKICogIEkvTyByb3V0aW5lcwogKi8K
CnN0YXRpYyBpbnQgc25kX2FjOTdfdmFsaWRfcmVnKGFjOTdfdCAqYWM5NywgdW5zaWduZWQgc2hv
cnQgcmVnKQp7CglpZiAoYWM5Ny0+bGltaXRlZF9yZWdzICYmICEgdGVzdF9iaXQocmVnLCBhYzk3
LT5yZWdfYWNjZXNzZWQpKQogIAkJcmV0dXJuIDA7CgoJLyogZmlsdGVyIHNvbWUgcmVnaXN0ZXJz
IGZvciBidWdneSBjb2RlY3MgKi8KCXN3aXRjaCAoYWM5Ny0+aWQpIHsKCWNhc2UgQUM5N19JRF9B
SzQ1NDA6CgljYXNlIEFDOTdfSURfQUs0NTQyOgoJCWlmIChyZWcgPD0gMHgxYyB8fCByZWcgPT0g
MHgyMCB8fCByZWcgPT0gMHgyNiB8fCByZWcgPj0gMHg3YykKCQkJcmV0dXJuIDE7CgkJcmV0dXJu
IDA7CgljYXNlIEFDOTdfSURfQUQxODE5OgkvKiBBRDE4MTkgKi8KCWNhc2UgQUM5N19JRF9BRDE4
ODE6CS8qIEFEMTg4MSAqLwoJY2FzZSBBQzk3X0lEX0FEMTg4MUE6CS8qIEFEMTg4MUEgKi8KCQlp
ZiAocmVnID49IDB4M2EgJiYgcmVnIDw9IDB4NmUpCS8qIDB4NTkgKi8KCQkJcmV0dXJuIDA7CgkJ
cmV0dXJuIDE7CgljYXNlIEFDOTdfSURfQUQxODg1OgkvKiBBRDE4ODUgKi8KCWNhc2UgQUM5N19J
RF9BRDE4ODY6CS8qIEFEMTg4NiAqLwoJY2FzZSBBQzk3X0lEX0FEMTg4NkE6CS8qIEFEMTg4NkEg
LSAhIXZlcmlmeSEhIC0tamsgKi8KCWNhc2UgQUM5N19JRF9BRDE4ODc6CS8qIEFEMTg4NyAtICEh
dmVyaWZ5ISEgLS1qayAqLwoJCWlmIChyZWcgPT0gMHg1YSkKCQkJcmV0dXJuIDE7CgkJaWYgKHJl
ZyA+PSAweDNjICYmIHJlZyA8PSAweDZlKQkvKiAweDU5ICovCgkJCXJldHVybiAwOwoJCXJldHVy
biAxOwoJY2FzZSBBQzk3X0lEX1NUQUM5NzAwOgoJY2FzZSBBQzk3X0lEX1NUQUM5NzA0OgoJY2Fz
ZSBBQzk3X0lEX1NUQUM5NzA1OgoJY2FzZSBBQzk3X0lEX1NUQUM5NzA4OgoJY2FzZSBBQzk3X0lE
X1NUQUM5NzIxOgoJY2FzZSBBQzk3X0lEX1NUQUM5NzQ0OgoJY2FzZSBBQzk3X0lEX1NUQUM5NzU2
OgoJCWlmIChyZWcgPD0gMHgzYSB8fCByZWcgPj0gMHg1YSkKCQkJcmV0dXJuIDE7CgkJcmV0dXJu
IDA7Cgl9CglyZXR1cm4gMTsKfQoKLyoqCiAqIHNuZF9hYzk3X3dyaXRlIC0gd3JpdGUgYSB2YWx1
ZSBvbiB0aGUgZ2l2ZW4gcmVnaXN0ZXIKICogQGFjOTc6IHRoZSBhYzk3IGluc3RhbmNlCiAqIEBy
ZWc6IHRoZSByZWdpc3RlciB0byBjaGFuZ2UKICogQHZhbHVlOiB0aGUgdmFsdWUgdG8gc2V0CiAq
CiAqIFdyaXRlcyBhIHZhbHVlIG9uIHRoZSBnaXZlbiByZWdpc3Rlci4gIFRoaXMgd2lsbCBpbnZv
a2UgdGhlIHdyaXRlCiAqIGNhbGxiYWNrIGRpcmVjdGx5IGFmdGVyIHRoZSByZWdpc3RlciBjaGVj
ay4KICogVGhpcyBmdW5jdGlvbiBkb2Vzbid0IGNoYW5nZSB0aGUgcmVnaXN0ZXIgY2FjaGUgdW5s
aWtlCiAqICNzbmRfY2E5N193cml0ZV9jYWNoZSgpLCBzbyB1c2UgdGhpcyBvbmx5IHdoZW4geW91
IGRvbid0IHdhbnQgdG8KICogcmVmbGVjdCB0aGUgY2hhbmdlIHRvIHRoZSBzdXNwZW5kL3Jlc3Vt
ZSBzdGF0ZS4KICovCnZvaWQgc25kX2FjOTdfd3JpdGUoYWM5N190ICphYzk3LCB1bnNpZ25lZCBz
aG9ydCByZWcsIHVuc2lnbmVkIHNob3J0IHZhbHVlKQp7CglpZiAoIXNuZF9hYzk3X3ZhbGlkX3Jl
ZyhhYzk3LCByZWcpKQoJCXJldHVybjsKCWlmICgoYWM5Ny0+aWQgJiAweGZmZmZmZjAwKSA9PSBB
Qzk3X0lEX0FMQzEwMCkgewoJCS8qIEZpeCBIL1cgYnVnIG9mIEFMQzEwMC8xMDBQICovCgkJaWYg
KHJlZyA9PSBBQzk3X01BU1RFUiB8fCByZWcgPT0gQUM5N19IRUFEUEhPTkUpCgkJCWFjOTctPmJ1
cy0+b3BzLT53cml0ZShhYzk3LCBBQzk3X1JFU0VULCAwKTsJLyogcmVzZXQgYXVkaW8gY29kZWMg
Ki8KCX0KCWFjOTctPmJ1cy0+b3BzLT53cml0ZShhYzk3LCByZWcsIHZhbHVlKTsKfQoKLyoqCiAq
IHNuZF9hYzk3X3JlYWQgLSByZWFkIGEgdmFsdWUgZnJvbSB0aGUgZ2l2ZW4gcmVnaXN0ZXIKICog
CiAqIEBhYzk3OiB0aGUgYWM5NyBpbnN0YW5jZQogKiBAcmVnOiB0aGUgcmVnaXN0ZXIgdG8gcmVh
ZAogKgogKiBSZWFkcyBhIHZhbHVlIGZyb20gdGhlIGdpdmVuIHJlZ2lzdGVyLiAgVGhpcyB3aWxs
IGludm9rZSB0aGUgcmVhZAogKiBjYWxsYmFjayBkaXJlY3RseSBhZnRlciB0aGUgcmVnaXN0ZXIg
Y2hlY2suCiAqCiAqIFJldHVybnMgdGhlIHJlYWQgdmFsdWUuCiAqLwp1bnNpZ25lZCBzaG9ydCBz
bmRfYWM5N19yZWFkKGFjOTdfdCAqYWM5NywgdW5zaWduZWQgc2hvcnQgcmVnKQp7CglpZiAoIXNu
ZF9hYzk3X3ZhbGlkX3JlZyhhYzk3LCByZWcpKQoJCXJldHVybiAwOwoJcmV0dXJuIGFjOTctPmJ1
cy0+b3BzLT5yZWFkKGFjOTcsIHJlZyk7Cn0KCi8qIHJlYWQgYSByZWdpc3RlciAtIHJldHVybiB0
aGUgY2FjaGVkIHZhbHVlIGlmIGFscmVhZHkgcmVhZCAqLwpzdGF0aWMgaW5saW5lIHVuc2lnbmVk
IHNob3J0IHNuZF9hYzk3X3JlYWRfY2FjaGUoYWM5N190ICphYzk3LCB1bnNpZ25lZCBzaG9ydCBy
ZWcpCnsKCWlmICghIHRlc3RfYml0KHJlZywgYWM5Ny0+cmVnX2FjY2Vzc2VkKSkgewoJCWFjOTct
PnJlZ3NbcmVnXSA9IGFjOTctPmJ1cy0+b3BzLT5yZWFkKGFjOTcsIHJlZyk7CgkJLy8gc2V0X2Jp
dChyZWcsIGFjOTctPnJlZ19hY2Nlc3NlZCk7Cgl9CglyZXR1cm4gYWM5Ny0+cmVnc1tyZWddOwp9
CgovKioKICogc25kX2FjOTdfd3JpdGVfY2FjaGUgLSB3cml0ZSBhIHZhbHVlIG9uIHRoZSBnaXZl
biByZWdpc3RlciBhbmQgdXBkYXRlIHRoZSBjYWNoZQogKiBAYWM5NzogdGhlIGFjOTcgaW5zdGFu
Y2UKICogQHJlZzogdGhlIHJlZ2lzdGVyIHRvIGNoYW5nZQogKiBAdmFsdWU6IHRoZSB2YWx1ZSB0
byBzZXQKICoKICogV3JpdGVzIGEgdmFsdWUgb24gdGhlIGdpdmVuIHJlZ2lzdGVyIGFuZCB1cGRh
dGVzIHRoZSByZWdpc3RlcgogKiBjYWNoZS4gIFRoZSBjYWNoZWQgdmFsdWVzIGFyZSB1c2VkIGZv
ciB0aGUgY2FjaGVkLXJlYWQgYW5kIHRoZQogKiBzdXNwZW5kL3Jlc3VtZS4KICovCnZvaWQgc25k
X2FjOTdfd3JpdGVfY2FjaGUoYWM5N190ICphYzk3LCB1bnNpZ25lZCBzaG9ydCByZWcsIHVuc2ln
bmVkIHNob3J0IHZhbHVlKQp7CglpZiAoIXNuZF9hYzk3X3ZhbGlkX3JlZyhhYzk3LCByZWcpKQoJ
CXJldHVybjsKCWRvd24oJmFjOTctPnJlZ19tdXRleCk7CglhYzk3LT5yZWdzW3JlZ10gPSB2YWx1
ZTsKCWFjOTctPmJ1cy0+b3BzLT53cml0ZShhYzk3LCByZWcsIHZhbHVlKTsKCXNldF9iaXQocmVn
LCBhYzk3LT5yZWdfYWNjZXNzZWQpOwoJdXAoJmFjOTctPnJlZ19tdXRleCk7Cn0KCi8qKgogKiBz
bmRfYWM5N191cGRhdGUgLSB1cGRhdGUgdGhlIHZhbHVlIG9uIHRoZSBnaXZlbiByZWdpc3Rlcgog
KiBAYWM5NzogdGhlIGFjOTcgaW5zdGFuY2UKICogQHJlZzogdGhlIHJlZ2lzdGVyIHRvIGNoYW5n
ZQogKiBAdmFsdWU6IHRoZSB2YWx1ZSB0byBzZXQKICoKICogQ29tcGFyZXMgdGhlIHZhbHVlIHdp
dGggdGhlIHJlZ2lzdGVyIGNhY2hlIGFuZCB1cGRhdGVzIHRoZSB2YWx1ZQogKiBvbmx5IHdoZW4g
dGhlIHZhbHVlIGlzIGNoYW5nZWQuCiAqCiAqIFJldHVybnMgMSBpZiB0aGUgdmFsdWUgaXMgY2hh
bmdlZCwgMCBpZiBubyBjaGFuZ2UsIG9yIGEgbmVnYXRpdmUKICogY29kZSBvbiBmYWlsdXJlLgog
Ki8KaW50IHNuZF9hYzk3X3VwZGF0ZShhYzk3X3QgKmFjOTcsIHVuc2lnbmVkIHNob3J0IHJlZywg
dW5zaWduZWQgc2hvcnQgdmFsdWUpCnsKCWludCBjaGFuZ2U7CgoJaWYgKCFzbmRfYWM5N192YWxp
ZF9yZWcoYWM5NywgcmVnKSkKCQlyZXR1cm4gLUVJTlZBTDsKCWRvd24oJmFjOTctPnJlZ19tdXRl
eCk7CgljaGFuZ2UgPSBhYzk3LT5yZWdzW3JlZ10gIT0gdmFsdWU7CglpZiAoY2hhbmdlKSB7CgkJ
YWM5Ny0+cmVnc1tyZWddID0gdmFsdWU7CgkJYWM5Ny0+YnVzLT5vcHMtPndyaXRlKGFjOTcsIHJl
ZywgdmFsdWUpOwoJfQoJdXAoJmFjOTctPnJlZ19tdXRleCk7CglyZXR1cm4gY2hhbmdlOwp9Cgov
KioKICogc25kX2FjOTdfdXBkYXRlX2JpdHMgLSB1cGRhdGUgdGhlIGJpdHMgb24gdGhlIGdpdmVu
IHJlZ2lzdGVyCiAqIEBhYzk3OiB0aGUgYWM5NyBpbnN0YW5jZQogKiBAcmVnOiB0aGUgcmVnaXN0
ZXIgdG8gY2hhbmdlCiAqIEBtYXNrOiB0aGUgYml0LW1hc2sgdG8gY2hhbmdlCiAqIEB2YWx1ZTog
dGhlIHZhbHVlIHRvIHNldAogKgogKiBVcGRhdGVzIHRoZSBtYXNrZWQtYml0cyBvbiB0aGUgZ2l2
ZW4gcmVnaXN0ZXIgb25seSB3aGVuIHRoZSB2YWx1ZQogKiBpcyBjaGFuZ2VkLgogKgogKiBSZXR1
cm5zIDEgaWYgdGhlIGJpdHMgYXJlIGNoYW5nZWQsIDAgaWYgbm8gY2hhbmdlLCBvciBhIG5lZ2F0
aXZlCiAqIGNvZGUgb24gZmFpbHVyZS4KICovCmludCBzbmRfYWM5N191cGRhdGVfYml0cyhhYzk3
X3QgKmFjOTcsIHVuc2lnbmVkIHNob3J0IHJlZywgdW5zaWduZWQgc2hvcnQgbWFzaywgdW5zaWdu
ZWQgc2hvcnQgdmFsdWUpCnsKCWludCBjaGFuZ2U7CgoJaWYgKCFzbmRfYWM5N192YWxpZF9yZWco
YWM5NywgcmVnKSkKCQlyZXR1cm4gLUVJTlZBTDsKCWRvd24oJmFjOTctPnJlZ19tdXRleCk7Cglj
aGFuZ2UgPSBzbmRfYWM5N191cGRhdGVfYml0c19ub2xvY2soYWM5NywgcmVnLCBtYXNrLCB2YWx1
ZSk7Cgl1cCgmYWM5Ny0+cmVnX211dGV4KTsKCXJldHVybiBjaGFuZ2U7Cn0KCi8qIG5vIGxvY2sg
dmVyc2lvbiAtIHNlZSBzbmRfYWM5N191cGRhdF9iaXRzKCkgKi8KaW50IHNuZF9hYzk3X3VwZGF0
ZV9iaXRzX25vbG9jayhhYzk3X3QgKmFjOTcsIHVuc2lnbmVkIHNob3J0IHJlZywKCQkJCXVuc2ln
bmVkIHNob3J0IG1hc2ssIHVuc2lnbmVkIHNob3J0IHZhbHVlKQp7CglpbnQgY2hhbmdlOwoJdW5z
aWduZWQgc2hvcnQgb2xkLCBuZXc7CgoJb2xkID0gc25kX2FjOTdfcmVhZF9jYWNoZShhYzk3LCBy
ZWcpOwoJbmV3ID0gKG9sZCAmIH5tYXNrKSB8IHZhbHVlOwoJY2hhbmdlID0gb2xkICE9IG5ldzsK
CWlmIChjaGFuZ2UpIHsKCQlhYzk3LT5yZWdzW3JlZ10gPSBuZXc7CgkJYWM5Ny0+YnVzLT5vcHMt
PndyaXRlKGFjOTcsIHJlZywgbmV3KTsKCX0KCXJldHVybiBjaGFuZ2U7Cn0KCnN0YXRpYyBpbnQg
c25kX2FjOTdfYWQxOHh4X3VwZGF0ZV9wY21fYml0cyhhYzk3X3QgKmFjOTcsIGludCBjb2RlYywg
dW5zaWduZWQgc2hvcnQgbWFzaywgdW5zaWduZWQgc2hvcnQgdmFsdWUpCnsKCWludCBjaGFuZ2U7
Cgl1bnNpZ25lZCBzaG9ydCBvbGQsIG5ldywgY2ZnOwoKCWRvd24oJmFjOTctPnBhZ2VfbXV0ZXgp
OwoJb2xkID0gYWM5Ny0+c3BlYy5hZDE4eHgucGNtcmVnW2NvZGVjXTsKCW5ldyA9IChvbGQgJiB+
bWFzaykgfCB2YWx1ZTsKCWNoYW5nZSA9IG9sZCAhPSBuZXc7CglpZiAoY2hhbmdlKSB7CgkJZG93
bigmYWM5Ny0+cmVnX211dGV4KTsKCQljZmcgPSBzbmRfYWM5N19yZWFkX2NhY2hlKGFjOTcsIEFD
OTdfQURfU0VSSUFMX0NGRyk7CgkJYWM5Ny0+c3BlYy5hZDE4eHgucGNtcmVnW2NvZGVjXSA9IG5l
dzsKCQkvKiBzZWxlY3Qgc2luZ2xlIGNvZGVjICovCgkJYWM5Ny0+YnVzLT5vcHMtPndyaXRlKGFj
OTcsIEFDOTdfQURfU0VSSUFMX0NGRywKCQkJCSAoY2ZnICYgfjB4NzAwMCkgfAoJCQkJIGFjOTct
PnNwZWMuYWQxOHh4LnVuY2hhaW5lZFtjb2RlY10gfCBhYzk3LT5zcGVjLmFkMTh4eC5jaGFpbmVk
W2NvZGVjXSk7CgkJLyogdXBkYXRlIFBDTSBiaXRzICovCgkJYWM5Ny0+YnVzLT5vcHMtPndyaXRl
KGFjOTcsIEFDOTdfUENNLCBuZXcpOwoJCS8qIHNlbGVjdCBhbGwgY29kZWNzICovCgkJYWM5Ny0+
YnVzLT5vcHMtPndyaXRlKGFjOTcsIEFDOTdfQURfU0VSSUFMX0NGRywKCQkJCSBjZmcgfCAweDcw
MDApOwoJCXVwKCZhYzk3LT5yZWdfbXV0ZXgpOwoJfQoJdXAoJmFjOTctPnBhZ2VfbXV0ZXgpOwoJ
cmV0dXJuIGNoYW5nZTsKfQoKLyoKICoKICovCgpzdGF0aWMgaW50IHNuZF9hYzk3X2luZm9fbXV4
KHNuZF9rY29udHJvbF90ICprY29udHJvbCwgc25kX2N0bF9lbGVtX2luZm9fdCAqIHVpbmZvKQp7
CglzdGF0aWMgY2hhciAqdGV4dHNbOF0gPSB7CgkJIk1pYyIsICJDRCIsICJWaWRlbyIsICJBdXgi
LCAiTGluZSIsCgkJIk1peCIsICJNaXggTW9ubyIsICJQaG9uZSIKCX07CgoJdWluZm8tPnR5cGUg
PSBTTkRSVl9DVExfRUxFTV9UWVBFX0VOVU1FUkFURUQ7Cgl1aW5mby0+Y291bnQgPSAyOwoJdWlu
Zm8tPnZhbHVlLmVudW1lcmF0ZWQuaXRlbXMgPSA4OwoJaWYgKHVpbmZvLT52YWx1ZS5lbnVtZXJh
dGVkLml0ZW0gPiA3KQoJCXVpbmZvLT52YWx1ZS5lbnVtZXJhdGVkLml0ZW0gPSA3OwoJc3RyY3B5
KHVpbmZvLT52YWx1ZS5lbnVtZXJhdGVkLm5hbWUsIHRleHRzW3VpbmZvLT52YWx1ZS5lbnVtZXJh
dGVkLml0ZW1dKTsKCXJldHVybiAwOwp9CgpzdGF0aWMgaW50IHNuZF9hYzk3X2dldF9tdXgoc25k
X2tjb250cm9sX3QgKiBrY29udHJvbCwgc25kX2N0bF9lbGVtX3ZhbHVlX3QgKiB1Y29udHJvbCkK
ewoJYWM5N190ICphYzk3ID0gc25kX2tjb250cm9sX2NoaXAoa2NvbnRyb2wpOwoJdW5zaWduZWQg
c2hvcnQgdmFsOwoJCgl2YWwgPSBzbmRfYWM5N19yZWFkX2NhY2hlKGFjOTcsIEFDOTdfUkVDX1NF
TCk7Cgl1Y29udHJvbC0+dmFsdWUuZW51bWVyYXRlZC5pdGVtWzBdID0gKHZhbCA+PiA4KSAmIDc7
Cgl1Y29udHJvbC0+dmFsdWUuZW51bWVyYXRlZC5pdGVtWzFdID0gKHZhbCA+PiAwKSAmIDc7Cgly
ZXR1cm4gMDsKfQoKc3RhdGljIGludCBzbmRfYWM5N19wdXRfbXV4KHNuZF9rY29udHJvbF90ICog
a2NvbnRyb2wsIHNuZF9jdGxfZWxlbV92YWx1ZV90ICogdWNvbnRyb2wpCnsKCWFjOTdfdCAqYWM5
NyA9IHNuZF9rY29udHJvbF9jaGlwKGtjb250cm9sKTsKCXVuc2lnbmVkIHNob3J0IHZhbDsKCQoJ
aWYgKHVjb250cm9sLT52YWx1ZS5lbnVtZXJhdGVkLml0ZW1bMF0gPiA3IHx8CgkgICAgdWNvbnRy
b2wtPnZhbHVlLmVudW1lcmF0ZWQuaXRlbVsxXSA+IDcpCgkJcmV0dXJuIC1FSU5WQUw7Cgl2YWwg
PSAodWNvbnRyb2wtPnZhbHVlLmVudW1lcmF0ZWQuaXRlbVswXSA8PCA4KSB8CgkgICAgICAodWNv
bnRyb2wtPnZhbHVlLmVudW1lcmF0ZWQuaXRlbVsxXSA8PCAwKTsKCXJldHVybiBzbmRfYWM5N191
cGRhdGUoYWM5NywgQUM5N19SRUNfU0VMLCB2YWwpOwp9CgojZGVmaW5lIEFDOTdfRU5VTV9ET1VC
TEUoeG5hbWUsIHJlZywgc2hpZnQsIGludmVydCkgXAp7IC5pZmFjZSA9IFNORFJWX0NUTF9FTEVN
X0lGQUNFX01JWEVSLCAubmFtZSA9IHhuYW1lLCAuaW5mbyA9IHNuZF9hYzk3X2luZm9fZW51bV9k
b3VibGUsIFwKICAuZ2V0ID0gc25kX2FjOTdfZ2V0X2VudW1fZG91YmxlLCAucHV0ID0gc25kX2Fj
OTdfcHV0X2VudW1fZG91YmxlLCBcCiAgLnByaXZhdGVfdmFsdWUgPSByZWcgfCAoc2hpZnQgPDwg
OCkgfCAoaW52ZXJ0IDw8IDI0KSB9CgpzdGF0aWMgaW50IHNuZF9hYzk3X2luZm9fZW51bV9kb3Vi
bGUoc25kX2tjb250cm9sX3QgKmtjb250cm9sLCBzbmRfY3RsX2VsZW1faW5mb190ICogdWluZm8p
CnsKCXN0YXRpYyBjaGFyICp0ZXh0czFbMl0gPSB7ICJwcmUgM0QiLCAicG9zdCAzRCIgfTsKCXN0
YXRpYyBjaGFyICp0ZXh0czJbMl0gPSB7ICJNaXgiLCAiTWljIiB9OwoJc3RhdGljIGNoYXIgKnRl
eHRzM1syXSA9IHsgIk1pYzEiLCAiTWljMiIgfTsKCWNoYXIgKip0ZXh0cyA9IE5VTEw7CglpbnQg
cmVnID0ga2NvbnRyb2wtPnByaXZhdGVfdmFsdWUgJiAweGZmOwoJaW50IHNoaWZ0ID0gKGtjb250
cm9sLT5wcml2YXRlX3ZhbHVlID4+IDgpICYgMHhmZjsKCglzd2l0Y2ggKHJlZykgewoJY2FzZSBB
Qzk3X0dFTkVSQUxfUFVSUE9TRToKCQlzd2l0Y2ggKHNoaWZ0KSB7CgkJY2FzZSAxNTogdGV4dHMg
PSB0ZXh0czE7IGJyZWFrOwoJCWNhc2UgOTogdGV4dHMgPSB0ZXh0czI7IGJyZWFrOwoJCWNhc2Ug
ODogdGV4dHMgPSB0ZXh0czM7IGJyZWFrOwoJCX0KCX0KCXVpbmZvLT50eXBlID0gU05EUlZfQ1RM
X0VMRU1fVFlQRV9FTlVNRVJBVEVEOwoJdWluZm8tPmNvdW50ID0gMTsKCXVpbmZvLT52YWx1ZS5l
bnVtZXJhdGVkLml0ZW1zID0gMjsKCWlmICh1aW5mby0+dmFsdWUuZW51bWVyYXRlZC5pdGVtID4g
MSkKCQl1aW5mby0+dmFsdWUuZW51bWVyYXRlZC5pdGVtID0gMTsKCXN0cmNweSh1aW5mby0+dmFs
dWUuZW51bWVyYXRlZC5uYW1lLCB0ZXh0c1t1aW5mby0+dmFsdWUuZW51bWVyYXRlZC5pdGVtXSk7
CglyZXR1cm4gMDsKfQoKc3RhdGljIGludCBzbmRfYWM5N19nZXRfZW51bV9kb3VibGUoc25kX2tj
b250cm9sX3QgKiBrY29udHJvbCwgc25kX2N0bF9lbGVtX3ZhbHVlX3QgKiB1Y29udHJvbCkKewoJ
YWM5N190ICphYzk3ID0gc25kX2tjb250cm9sX2NoaXAoa2NvbnRyb2wpOwoJdW5zaWduZWQgc2hv
cnQgdmFsOwoJaW50IHJlZyA9IGtjb250cm9sLT5wcml2YXRlX3ZhbHVlICYgMHhmZjsKCWludCBz
aGlmdCA9IChrY29udHJvbC0+cHJpdmF0ZV92YWx1ZSA+PiA4KSAmIDB4ZmY7CglpbnQgaW52ZXJ0
ID0gKGtjb250cm9sLT5wcml2YXRlX3ZhbHVlID4+IDI0KSAmIDB4ZmY7CgkKCXZhbCA9IChzbmRf
YWM5N19yZWFkX2NhY2hlKGFjOTcsIHJlZykgPj4gc2hpZnQpICYgMTsKCWlmIChpbnZlcnQpCgkJ
dmFsIF49IDE7Cgl1Y29udHJvbC0+dmFsdWUuZW51bWVyYXRlZC5pdGVtWzBdID0gdmFsOwoJcmV0
dXJuIDA7Cn0KCnN0YXRpYyBpbnQgc25kX2FjOTdfcHV0X2VudW1fZG91YmxlKHNuZF9rY29udHJv
bF90ICoga2NvbnRyb2wsIHNuZF9jdGxfZWxlbV92YWx1ZV90ICogdWNvbnRyb2wpCnsKCWFjOTdf
dCAqYWM5NyA9IHNuZF9rY29udHJvbF9jaGlwKGtjb250cm9sKTsKCXVuc2lnbmVkIHNob3J0IHZh
bDsKCWludCByZWcgPSBrY29udHJvbC0+cHJpdmF0ZV92YWx1ZSAmIDB4ZmY7CglpbnQgc2hpZnQg
PSAoa2NvbnRyb2wtPnByaXZhdGVfdmFsdWUgPj4gOCkgJiAweGZmOwoJaW50IGludmVydCA9IChr
Y29udHJvbC0+cHJpdmF0ZV92YWx1ZSA+PiAyNCkgJiAweGZmOwoJCglpZiAodWNvbnRyb2wtPnZh
bHVlLmVudW1lcmF0ZWQuaXRlbVswXSA+IDEpCgkJcmV0dXJuIC1FSU5WQUw7Cgl2YWwgPSAhIXVj
b250cm9sLT52YWx1ZS5lbnVtZXJhdGVkLml0ZW1bMF07CglpZiAoaW52ZXJ0KQoJCXZhbCA9ICF2
YWw7CglyZXR1cm4gc25kX2FjOTdfdXBkYXRlX2JpdHMoYWM5NywgcmVnLCAxIDw8IHNoaWZ0LCB2
YWwgPDwgc2hpZnQpOwp9CgppbnQgc25kX2FjOTdfaW5mb192b2xzdyhzbmRfa2NvbnRyb2xfdCAq
a2NvbnRyb2wsIHNuZF9jdGxfZWxlbV9pbmZvX3QgKiB1aW5mbykKewoJaW50IG1hc2sgPSAoa2Nv
bnRyb2wtPnByaXZhdGVfdmFsdWUgPj4gMTYpICYgMHhmZjsKCWludCBzaGlmdCA9IChrY29udHJv
bC0+cHJpdmF0ZV92YWx1ZSA+PiA4KSAmIDB4MGY7CglpbnQgcnNoaWZ0ID0gKGtjb250cm9sLT5w
cml2YXRlX3ZhbHVlID4+IDEyKSAmIDB4MGY7CgoJdWluZm8tPnR5cGUgPSBtYXNrID09IDEgPyBT
TkRSVl9DVExfRUxFTV9UWVBFX0JPT0xFQU4gOiBTTkRSVl9DVExfRUxFTV9UWVBFX0lOVEVHRVI7
Cgl1aW5mby0+Y291bnQgPSBzaGlmdCA9PSByc2hpZnQgPyAxIDogMjsKCXVpbmZvLT52YWx1ZS5p
bnRlZ2VyLm1pbiA9IDA7Cgl1aW5mby0+dmFsdWUuaW50ZWdlci5tYXggPSBtYXNrOwoJcmV0dXJu
IDA7Cn0KCmludCBzbmRfYWM5N19nZXRfdm9sc3coc25kX2tjb250cm9sX3QgKiBrY29udHJvbCwg
c25kX2N0bF9lbGVtX3ZhbHVlX3QgKiB1Y29udHJvbCkKewoJYWM5N190ICphYzk3ID0gc25kX2tj
b250cm9sX2NoaXAoa2NvbnRyb2wpOwoJaW50IHJlZyA9IGtjb250cm9sLT5wcml2YXRlX3ZhbHVl
ICYgMHhmZjsKCWludCBzaGlmdCA9IChrY29udHJvbC0+cHJpdmF0ZV92YWx1ZSA+PiA4KSAmIDB4
MGY7CglpbnQgcnNoaWZ0ID0gKGtjb250cm9sLT5wcml2YXRlX3ZhbHVlID4+IDEyKSAmIDB4MGY7
CglpbnQgbWFzayA9IChrY29udHJvbC0+cHJpdmF0ZV92YWx1ZSA+PiAxNikgJiAweGZmOwoJaW50
IGludmVydCA9IChrY29udHJvbC0+cHJpdmF0ZV92YWx1ZSA+PiAyNCkgJiAweDAxOwoJCgl1Y29u
dHJvbC0+dmFsdWUuaW50ZWdlci52YWx1ZVswXSA9IChzbmRfYWM5N19yZWFkX2NhY2hlKGFjOTcs
IHJlZykgPj4gc2hpZnQpICYgbWFzazsKCWlmIChzaGlmdCAhPSByc2hpZnQpCgkJdWNvbnRyb2wt
PnZhbHVlLmludGVnZXIudmFsdWVbMV0gPSAoc25kX2FjOTdfcmVhZF9jYWNoZShhYzk3LCByZWcp
ID4+IHJzaGlmdCkgJiBtYXNrOwoJaWYgKGludmVydCkgewoJCXVjb250cm9sLT52YWx1ZS5pbnRl
Z2VyLnZhbHVlWzBdID0gbWFzayAtIHVjb250cm9sLT52YWx1ZS5pbnRlZ2VyLnZhbHVlWzBdOwoJ
CWlmIChzaGlmdCAhPSByc2hpZnQpCgkJCXVjb250cm9sLT52YWx1ZS5pbnRlZ2VyLnZhbHVlWzFd
ID0gbWFzayAtIHVjb250cm9sLT52YWx1ZS5pbnRlZ2VyLnZhbHVlWzFdOwoJfQoJcmV0dXJuIDA7
Cn0KCmludCBzbmRfYWM5N19wdXRfdm9sc3coc25kX2tjb250cm9sX3QgKiBrY29udHJvbCwgc25k
X2N0bF9lbGVtX3ZhbHVlX3QgKiB1Y29udHJvbCkKewoJYWM5N190ICphYzk3ID0gc25kX2tjb250
cm9sX2NoaXAoa2NvbnRyb2wpOwoJaW50IHJlZyA9IGtjb250cm9sLT5wcml2YXRlX3ZhbHVlICYg
MHhmZjsKCWludCBzaGlmdCA9IChrY29udHJvbC0+cHJpdmF0ZV92YWx1ZSA+PiA4KSAmIDB4MGY7
CglpbnQgcnNoaWZ0ID0gKGtjb250cm9sLT5wcml2YXRlX3ZhbHVlID4+IDEyKSAmIDB4MGY7Cglp
bnQgbWFzayA9IChrY29udHJvbC0+cHJpdmF0ZV92YWx1ZSA+PiAxNikgJiAweGZmOwoJaW50IGlu
dmVydCA9IChrY29udHJvbC0+cHJpdmF0ZV92YWx1ZSA+PiAyNCkgJiAweDAxOwoJdW5zaWduZWQg
c2hvcnQgdmFsLCB2YWwyLCB2YWxfbWFzazsKCQoJdmFsID0gKHVjb250cm9sLT52YWx1ZS5pbnRl
Z2VyLnZhbHVlWzBdICYgbWFzayk7CglpZiAoaW52ZXJ0KQoJCXZhbCA9IG1hc2sgLSB2YWw7Cgl2
YWxfbWFzayA9IG1hc2sgPDwgc2hpZnQ7Cgl2YWwgPSB2YWwgPDwgc2hpZnQ7CglpZiAoc2hpZnQg
IT0gcnNoaWZ0KSB7CgkJdmFsMiA9ICh1Y29udHJvbC0+dmFsdWUuaW50ZWdlci52YWx1ZVsxXSAm
IG1hc2spOwoJCWlmIChpbnZlcnQpCgkJCXZhbDIgPSBtYXNrIC0gdmFsMjsKCQl2YWxfbWFzayB8
PSBtYXNrIDw8IHJzaGlmdDsKCQl2YWwgfD0gdmFsMiA8PCByc2hpZnQ7Cgl9CglyZXR1cm4gc25k
X2FjOTdfdXBkYXRlX2JpdHMoYWM5NywgcmVnLCB2YWxfbWFzaywgdmFsKTsKfQoKI2RlZmluZSBB
Qzk3X0RPVUJMRSh4bmFtZSwgcmVnLCBzaGlmdF9sZWZ0LCBzaGlmdF9yaWdodCwgbWFzaywgaW52
ZXJ0KSBcCnsgLmlmYWNlID0gU05EUlZfQ1RMX0VMRU1fSUZBQ0VfTUlYRVIsIC5uYW1lID0gKHhu
YW1lKSwgLmluZm8gPSBzbmRfYWM5N19pbmZvX3ZvbHN3LCBcCiAgLmdldCA9IHNuZF9hYzk3X2dl
dF92b2xzdywgLnB1dCA9IHNuZF9hYzk3X3B1dF92b2xzdywgXAogIC5wcml2YXRlX3ZhbHVlID0g
KHJlZykgfCAoKHNoaWZ0X2xlZnQpIDw8IDgpIHwgKChzaGlmdF9yaWdodCkgPDwgMTIpIHwgKCht
YXNrKSA8PCAxNikgfCAoKGludmVydCkgPDwgMjQpIH0KCnN0YXRpYyBpbnQgc25kX2FjOTdfZ2V0
cHV0X3BhZ2Uoc25kX2tjb250cm9sX3QgKmtjb250cm9sLCBzbmRfY3RsX2VsZW1fdmFsdWVfdCAq
dWNvbnRyb2wsCgkJCSBpbnQgKCpmdW5jKShzbmRfa2NvbnRyb2xfdCAqLCBzbmRfY3RsX2VsZW1f
dmFsdWVfdCAqKSkKewoJYWM5N190ICphYzk3ID0gc25kX2tjb250cm9sX2NoaXAoa2NvbnRyb2wp
OwoJaW50IHJlZyA9IGtjb250cm9sLT5wcml2YXRlX3ZhbHVlICYgMHhmZjsKCWludCBlcnI7CgoJ
aWYgKChhYzk3LT5leHRfaWQgJiBBQzk3X0VJX1JFVl9NQVNLKSA+PSBBQzk3X0VJX1JFVl8yMyAm
JgoJICAgIChyZWcgPj0gMHg2MCAmJiByZWcgPCAweDcwKSkgewoJCXVuc2lnbmVkIHNob3J0IHBh
Z2Vfc2F2ZTsKCQl1bnNpZ25lZCBzaG9ydCBwYWdlID0gKGtjb250cm9sLT5wcml2YXRlX3ZhbHVl
ID4+IDI1KSAmIDB4MGY7CgkJZG93bigmYWM5Ny0+cGFnZV9tdXRleCk7IC8qIGxvY2sgcGFnaW5n
ICovCgkJcGFnZV9zYXZlID0gc25kX2FjOTdfcmVhZChhYzk3LCBBQzk3X0lOVF9QQUdJTkcpICYg
QUM5N19QQUdFX01BU0s7CgkJc25kX2FjOTdfdXBkYXRlX2JpdHMoYWM5NywgQUM5N19JTlRfUEFH
SU5HLCBBQzk3X1BBR0VfTUFTSywgcGFnZSk7CgkJZXJyID0gZnVuYyhrY29udHJvbCwgdWNvbnRy
b2wpOwoJCXNuZF9hYzk3X3VwZGF0ZV9iaXRzKGFjOTcsIEFDOTdfSU5UX1BBR0lORywgQUM5N19Q
QUdFX01BU0ssIHBhZ2Vfc2F2ZSk7CgkJdXAoJmFjOTctPnBhZ2VfbXV0ZXgpOyAvKiB1bmxvY2sg
cGFnaW5nICovCgl9IGVsc2UKCQllcnIgPSBmdW5jKGtjb250cm9sLCB1Y29udHJvbCk7CglyZXR1
cm4gZXJyOwp9CgovKiBmb3IgcmV2Mi4zIHBhZ2luZyAqLwppbnQgc25kX2FjOTdfcGFnZV9nZXRf
dm9sc3coc25kX2tjb250cm9sX3QgKmtjb250cm9sLCBzbmRfY3RsX2VsZW1fdmFsdWVfdCAqdWNv
bnRyb2wpCnsKCXJldHVybiBzbmRfYWM5N19nZXRwdXRfcGFnZShrY29udHJvbCwgdWNvbnRyb2ws
IHNuZF9hYzk3X2dldF92b2xzdyk7Cn0KCi8qIGZvciByZXYyLjMgcGFnaW5nICovCmludCBzbmRf
YWM5N19wYWdlX3B1dF92b2xzdyhzbmRfa2NvbnRyb2xfdCAqa2NvbnRyb2wsIHNuZF9jdGxfZWxl
bV92YWx1ZV90ICp1Y29udHJvbCkKewoJcmV0dXJuIHNuZF9hYzk3X2dldHB1dF9wYWdlKGtjb250
cm9sLCB1Y29udHJvbCwgc25kX2FjOTdfcHV0X3ZvbHN3KTsKfQoKc3RhdGljIGNvbnN0IHNuZF9r
Y29udHJvbF9uZXdfdCBzbmRfYWM5N19jb250cm9sc19tYXN0ZXJfbW9ub1syXSA9IHsKQUM5N19T
SU5HTEUoIk1hc3RlciBNb25vIFBsYXliYWNrIFN3aXRjaCIsIEFDOTdfTUFTVEVSX01PTk8sIDE1
LCAxLCAxKSwKQUM5N19TSU5HTEUoIk1hc3RlciBNb25vIFBsYXliYWNrIFZvbHVtZSIsIEFDOTdf
TUFTVEVSX01PTk8sIDAsIDMxLCAxKQp9OwoKc3RhdGljIGNvbnN0IHNuZF9rY29udHJvbF9uZXdf
dCBzbmRfYWM5N19jb250cm9sc190b25lWzJdID0gewpBQzk3X1NJTkdMRSgiVG9uZSBDb250cm9s
IC0gQmFzcyIsIEFDOTdfTUFTVEVSX1RPTkUsIDgsIDE1LCAxKSwKQUM5N19TSU5HTEUoIlRvbmUg
Q29udHJvbCAtIFRyZWJsZSIsIEFDOTdfTUFTVEVSX1RPTkUsIDAsIDE1LCAxKQp9OwoKc3RhdGlj
IGNvbnN0IHNuZF9rY29udHJvbF9uZXdfdCBzbmRfYWM5N19jb250cm9sc19wY19iZWVwWzJdID0g
ewpBQzk3X1NJTkdMRSgiUEMgU3BlYWtlciBQbGF5YmFjayBTd2l0Y2giLCBBQzk3X1BDX0JFRVAs
IDE1LCAxLCAxKSwKQUM5N19TSU5HTEUoIlBDIFNwZWFrZXIgUGxheWJhY2sgVm9sdW1lIiwgQUM5
N19QQ19CRUVQLCAxLCAxNSwgMSkKfTsKCnN0YXRpYyBjb25zdCBzbmRfa2NvbnRyb2xfbmV3X3Qg
c25kX2FjOTdfY29udHJvbHNfbWljX2Jvb3N0ID0KCUFDOTdfU0lOR0xFKCJNaWMgQm9vc3QgKCsy
MGRCKSIsIEFDOTdfTUlDLCA2LCAxLCAwKTsKCgpzdGF0aWMgY29uc3Qgc25kX2tjb250cm9sX25l
d190IHNuZF9hYzk3X2NvbnRyb2xfY2FwdHVyZV9zcmMgPSB7CgkuaWZhY2UgPSBTTkRSVl9DVExf
RUxFTV9JRkFDRV9NSVhFUiwKCS5uYW1lID0gIkNhcHR1cmUgU291cmNlIiwKCS5pbmZvID0gc25k
X2FjOTdfaW5mb19tdXgsCgkuZ2V0ID0gc25kX2FjOTdfZ2V0X211eCwKCS5wdXQgPSBzbmRfYWM5
N19wdXRfbXV4LAp9OwoKc3RhdGljIGNvbnN0IHNuZF9rY29udHJvbF9uZXdfdCBzbmRfYWM5N19j
b250cm9sX2NhcHR1cmVfdm9sID0KQUM5N19ET1VCTEUoIkNhcHR1cmUgVm9sdW1lIiwgQUM5N19S
RUNfR0FJTiwgOCwgMCwgMTUsIDApOwoKc3RhdGljIGNvbnN0IHNuZF9rY29udHJvbF9uZXdfdCBz
bmRfYWM5N19jb250cm9sc19taWNfY2FwdHVyZVsyXSA9IHsKQUM5N19TSU5HTEUoIk1pYyBDYXB0
dXJlIFN3aXRjaCIsIEFDOTdfUkVDX0dBSU5fTUlDLCAxNSwgMSwgMSksCkFDOTdfU0lOR0xFKCJN
aWMgQ2FwdHVyZSBWb2x1bWUiLCBBQzk3X1JFQ19HQUlOX01JQywgMCwgMTUsIDApCn07Cgp0eXBl
ZGVmIGVudW0gewoJQUM5N19HRU5FUkFMX1BDTV9PVVQgPSAwLAoJQUM5N19HRU5FUkFMX1NURVJF
T19FTkhBTkNFTUVOVCwKCUFDOTdfR0VORVJBTF8zRCwKCUFDOTdfR0VORVJBTF9MT1VETkVTUywK
CUFDOTdfR0VORVJBTF9NT05PLAoJQUM5N19HRU5FUkFMX01JQywKCUFDOTdfR0VORVJBTF9MT09Q
QkFDSwp9IGFjOTdfZ2VuZXJhbF9pbmRleF90OwoKc3RhdGljIGNvbnN0IHNuZF9rY29udHJvbF9u
ZXdfdCBzbmRfYWM5N19jb250cm9sc19nZW5lcmFsWzddID0gewpBQzk3X0VOVU1fRE9VQkxFKCJQ
Q00gT3V0IFBhdGggJiBNdXRlIiwgQUM5N19HRU5FUkFMX1BVUlBPU0UsIDE1LCAwKSwKQUM5N19T
SU5HTEUoIlNpbXVsYXRlZCBTdGVyZW8gRW5oYW5jZW1lbnQiLCBBQzk3X0dFTkVSQUxfUFVSUE9T
RSwgMTQsIDEsIDApLApBQzk3X1NJTkdMRSgiM0QgQ29udHJvbCAtIFN3aXRjaCIsIEFDOTdfR0VO
RVJBTF9QVVJQT1NFLCAxMywgMSwgMCksCkFDOTdfU0lOR0xFKCJMb3VkbmVzcyAoYmFzcyBib29z
dCkiLCBBQzk3X0dFTkVSQUxfUFVSUE9TRSwgMTIsIDEsIDApLApBQzk3X0VOVU1fRE9VQkxFKCJN
b25vIE91dHB1dCBTZWxlY3QiLCBBQzk3X0dFTkVSQUxfUFVSUE9TRSwgOSwgMCksCkFDOTdfRU5V
TV9ET1VCTEUoIk1pYyBTZWxlY3QiLCBBQzk3X0dFTkVSQUxfUFVSUE9TRSwgOCwgMCksCkFDOTdf
U0lOR0xFKCJBREMvREFDIExvb3BiYWNrIiwgQUM5N19HRU5FUkFMX1BVUlBPU0UsIDcsIDEsIDAp
Cn07Cgpjb25zdCBzbmRfa2NvbnRyb2xfbmV3X3Qgc25kX2FjOTdfY29udHJvbHNfM2RbMl0gPSB7
CkFDOTdfU0lOR0xFKCIzRCBDb250cm9sIC0gQ2VudGVyIiwgQUM5N18zRF9DT05UUk9MLCA4LCAx
NSwgMCksCkFDOTdfU0lOR0xFKCIzRCBDb250cm9sIC0gRGVwdGgiLCBBQzk3XzNEX0NPTlRST0ws
IDAsIDE1LCAwKQp9OwoKc3RhdGljIGNvbnN0IHNuZF9rY29udHJvbF9uZXdfdCBzbmRfYWM5N19j
b250cm9sc19jZW50ZXJbMl0gPSB7CkFDOTdfU0lOR0xFKCJDZW50ZXIgUGxheWJhY2sgU3dpdGNo
IiwgQUM5N19DRU5URVJfTEZFX01BU1RFUiwgNywgMSwgMSksCkFDOTdfU0lOR0xFKCJDZW50ZXIg
UGxheWJhY2sgVm9sdW1lIiwgQUM5N19DRU5URVJfTEZFX01BU1RFUiwgMCwgMzEsIDEpCn07Cgpz
dGF0aWMgY29uc3Qgc25kX2tjb250cm9sX25ld190IHNuZF9hYzk3X2NvbnRyb2xzX2xmZVsyXSA9
IHsKQUM5N19TSU5HTEUoIkxGRSBQbGF5YmFjayBTd2l0Y2giLCBBQzk3X0NFTlRFUl9MRkVfTUFT
VEVSLCAxNSwgMSwgMSksCkFDOTdfU0lOR0xFKCJMRkUgUGxheWJhY2sgVm9sdW1lIiwgQUM5N19D
RU5URVJfTEZFX01BU1RFUiwgOCwgMzEsIDEpCn07CgpzdGF0aWMgY29uc3Qgc25kX2tjb250cm9s
X25ld190IHNuZF9hYzk3X2NvbnRyb2xzX3N1cnJvdW5kWzJdID0gewpBQzk3X0RPVUJMRSgiU3Vy
cm91bmQgUGxheWJhY2sgU3dpdGNoIiwgQUM5N19TVVJST1VORF9NQVNURVIsIDE1LCA3LCAxLCAx
KSwKQUM5N19ET1VCTEUoIlN1cnJvdW5kIFBsYXliYWNrIFZvbHVtZSIsIEFDOTdfU1VSUk9VTkRf
TUFTVEVSLCA4LCAwLCAzMSwgMSksCn07CgpzdGF0aWMgY29uc3Qgc25kX2tjb250cm9sX25ld190
IHNuZF9hYzk3X2NvbnRyb2xfZWFwZCA9CkFDOTdfU0lOR0xFKCJFeHRlcm5hbCBBbXBsaWZpZXIi
LCBBQzk3X1BPV0VSRE9XTiwgMTUsIDEsIDEpOwoKLyogY2hhbmdlIHRoZSBleGlzdGluZyBFQVBE
IGNvbnRyb2wgYXMgaW52ZXJ0ZWQgKi8Kc3RhdGljIHZvaWQgc2V0X2ludl9lYXBkKGFjOTdfdCAq
YWM5Nywgc25kX2tjb250cm9sX3QgKmtjdGwpCnsKCWtjdGwtPnByaXZhdGVfdmFsdWUgPSBBQzk3
X1NJTkdMRV9WQUxVRShBQzk3X1BPV0VSRE9XTiwgMTUsIDEsIDApOwoJc25kX2FjOTdfdXBkYXRl
X2JpdHMoYWM5NywgQUM5N19QT1dFUkRPV04sICgxPDwxNSksICgxPDwxNSkpOyAvKiBFQVBEIHVw
ICovCglhYzk3LT5zY2FwcyB8PSBBQzk3X1NDQVBfSU5WX0VBUEQ7Cn0KCnN0YXRpYyBpbnQgc25k
X2FjOTdfc3BkaWZfbWFza19pbmZvKHNuZF9rY29udHJvbF90ICprY29udHJvbCwgc25kX2N0bF9l
bGVtX2luZm9fdCAqIHVpbmZvKQp7Cgl1aW5mby0+dHlwZSA9IFNORFJWX0NUTF9FTEVNX1RZUEVf
SUVDOTU4OwoJdWluZm8tPmNvdW50ID0gMTsKCXJldHVybiAwOwp9CiAgICAgICAgICAgICAgICAg
ICAgICAgIApzdGF0aWMgaW50IHNuZF9hYzk3X3NwZGlmX2NtYXNrX2dldChzbmRfa2NvbnRyb2xf
dCAqa2NvbnRyb2wsIHNuZF9jdGxfZWxlbV92YWx1ZV90ICogdWNvbnRyb2wpCnsKCXVjb250cm9s
LT52YWx1ZS5pZWM5NTguc3RhdHVzWzBdID0gSUVDOTU4X0FFUzBfUFJPRkVTU0lPTkFMIHwKCQkJ
CQkgICBJRUM5NThfQUVTMF9OT05BVURJTyB8CgkJCQkJICAgSUVDOTU4X0FFUzBfQ09OX0VNUEhB
U0lTXzUwMTUgfAoJCQkJCSAgIElFQzk1OF9BRVMwX0NPTl9OT1RfQ09QWVJJR0hUOwoJdWNvbnRy
b2wtPnZhbHVlLmllYzk1OC5zdGF0dXNbMV0gPSBJRUM5NThfQUVTMV9DT05fQ0FURUdPUlkgfAoJ
CQkJCSAgIElFQzk1OF9BRVMxX0NPTl9PUklHSU5BTDsKCXVjb250cm9sLT52YWx1ZS5pZWM5NTgu
c3RhdHVzWzNdID0gSUVDOTU4X0FFUzNfQ09OX0ZTOwoJcmV0dXJuIDA7Cn0KICAgICAgICAgICAg
ICAgICAgICAgICAgCnN0YXRpYyBpbnQgc25kX2FjOTdfc3BkaWZfcG1hc2tfZ2V0KHNuZF9rY29u
dHJvbF90ICprY29udHJvbCwgc25kX2N0bF9lbGVtX3ZhbHVlX3QgKiB1Y29udHJvbCkKewoJLyog
RklYTUU6IEFDJzk3IHNwZWMgZG9lc24ndCBzYXkgd2hpY2ggYml0cyBhcmUgdXNlZCBmb3Igd2hh
dCAqLwoJdWNvbnRyb2wtPnZhbHVlLmllYzk1OC5zdGF0dXNbMF0gPSBJRUM5NThfQUVTMF9QUk9G
RVNTSU9OQUwgfAoJCQkJCSAgIElFQzk1OF9BRVMwX05PTkFVRElPIHwKCQkJCQkgICBJRUM5NThf
QUVTMF9QUk9fRlMgfAoJCQkJCSAgIElFQzk1OF9BRVMwX1BST19FTVBIQVNJU181MDE1OwoJcmV0
dXJuIDA7Cn0KCnN0YXRpYyBpbnQgc25kX2FjOTdfc3BkaWZfZGVmYXVsdF9nZXQoc25kX2tjb250
cm9sX3QgKmtjb250cm9sLCBzbmRfY3RsX2VsZW1fdmFsdWVfdCAqIHVjb250cm9sKQp7CglhYzk3
X3QgKmFjOTcgPSBzbmRfa2NvbnRyb2xfY2hpcChrY29udHJvbCk7CgoJZG93bigmYWM5Ny0+cmVn
X211dGV4KTsKCXVjb250cm9sLT52YWx1ZS5pZWM5NTguc3RhdHVzWzBdID0gYWM5Ny0+c3BkaWZf
c3RhdHVzICYgMHhmZjsKCXVjb250cm9sLT52YWx1ZS5pZWM5NTguc3RhdHVzWzFdID0gKGFjOTct
PnNwZGlmX3N0YXR1cyA+PiA4KSAmIDB4ZmY7Cgl1Y29udHJvbC0+dmFsdWUuaWVjOTU4LnN0YXR1
c1syXSA9IChhYzk3LT5zcGRpZl9zdGF0dXMgPj4gMTYpICYgMHhmZjsKCXVjb250cm9sLT52YWx1
ZS5pZWM5NTguc3RhdHVzWzNdID0gKGFjOTctPnNwZGlmX3N0YXR1cyA+PiAyNCkgJiAweGZmOwoJ
dXAoJmFjOTctPnJlZ19tdXRleCk7CglyZXR1cm4gMDsKfQogICAgICAgICAgICAgICAgICAgICAg
ICAKc3RhdGljIGludCBzbmRfYWM5N19zcGRpZl9kZWZhdWx0X3B1dChzbmRfa2NvbnRyb2xfdCAq
a2NvbnRyb2wsIHNuZF9jdGxfZWxlbV92YWx1ZV90ICogdWNvbnRyb2wpCnsKCWFjOTdfdCAqYWM5
NyA9IHNuZF9rY29udHJvbF9jaGlwKGtjb250cm9sKTsKCXVuc2lnbmVkIGludCBuZXcgPSAwOwoJ
dW5zaWduZWQgc2hvcnQgdmFsID0gMDsKCWludCBjaGFuZ2U7CgoJbmV3ID0gdmFsID0gdWNvbnRy
b2wtPnZhbHVlLmllYzk1OC5zdGF0dXNbMF0gJiAoSUVDOTU4X0FFUzBfUFJPRkVTU0lPTkFMfElF
Qzk1OF9BRVMwX05PTkFVRElPKTsKCWlmICh1Y29udHJvbC0+dmFsdWUuaWVjOTU4LnN0YXR1c1sw
XSAmIElFQzk1OF9BRVMwX1BST0ZFU1NJT05BTCkgewoJCW5ldyB8PSB1Y29udHJvbC0+dmFsdWUu
aWVjOTU4LnN0YXR1c1swXSAmIChJRUM5NThfQUVTMF9QUk9fRlN8SUVDOTU4X0FFUzBfUFJPX0VN
UEhBU0lTXzUwMTUpOwoJCXN3aXRjaCAobmV3ICYgSUVDOTU4X0FFUzBfUFJPX0ZTKSB7CgkJY2Fz
ZSBJRUM5NThfQUVTMF9QUk9fRlNfNDQxMDA6IHZhbCB8PSAwPDwxMjsgYnJlYWs7CgkJY2FzZSBJ
RUM5NThfQUVTMF9QUk9fRlNfNDgwMDA6IHZhbCB8PSAyPDwxMjsgYnJlYWs7CgkJY2FzZSBJRUM5
NThfQUVTMF9QUk9fRlNfMzIwMDA6IHZhbCB8PSAzPDwxMjsgYnJlYWs7CgkJZGVmYXVsdDoJCSAg
ICAgICB2YWwgfD0gMTw8MTI7IGJyZWFrOwoJCX0KCQlpZiAoKG5ldyAmIElFQzk1OF9BRVMwX1BS
T19FTVBIQVNJUykgPT0gSUVDOTU4X0FFUzBfUFJPX0VNUEhBU0lTXzUwMTUpCgkJCXZhbCB8PSAx
PDwzOwoJfSBlbHNlIHsKCQluZXcgfD0gdWNvbnRyb2wtPnZhbHVlLmllYzk1OC5zdGF0dXNbMF0g
JiAoSUVDOTU4X0FFUzBfQ09OX0VNUEhBU0lTXzUwMTV8SUVDOTU4X0FFUzBfQ09OX05PVF9DT1BZ
UklHSFQpOwoJCW5ldyB8PSAoKHVjb250cm9sLT52YWx1ZS5pZWM5NTguc3RhdHVzWzFdICYgKElF
Qzk1OF9BRVMxX0NPTl9DQVRFR09SWXxJRUM5NThfQUVTMV9DT05fT1JJR0lOQUwpKSA8PCA4KTsK
CQluZXcgfD0gKCh1Y29udHJvbC0+dmFsdWUuaWVjOTU4LnN0YXR1c1szXSAmIElFQzk1OF9BRVMz
X0NPTl9GUykgPDwgMjQpOwoJCWlmICgobmV3ICYgSUVDOTU4X0FFUzBfQ09OX0VNUEhBU0lTKSA9
PSBJRUM5NThfQUVTMF9DT05fRU1QSEFTSVNfNTAxNSkKCQkJdmFsIHw9IDE8PDM7CgkJaWYgKCEo
bmV3ICYgSUVDOTU4X0FFUzBfQ09OX05PVF9DT1BZUklHSFQpKQoJCQl2YWwgfD0gMTw8MjsKCQl2
YWwgfD0gKChuZXcgPj4gOCkgJiAweGZmKSA8PCA0OwkvLyBjYXRlZ29yeSArIG9yaWdpbmFsCgkJ
c3dpdGNoICgobmV3ID4+IDI0KSAmIDB4ZmYpIHsKCQljYXNlIElFQzk1OF9BRVMzX0NPTl9GU180
NDEwMDogdmFsIHw9IDA8PDEyOyBicmVhazsKCQljYXNlIElFQzk1OF9BRVMzX0NPTl9GU180ODAw
MDogdmFsIHw9IDI8PDEyOyBicmVhazsKCQljYXNlIElFQzk1OF9BRVMzX0NPTl9GU18zMjAwMDog
dmFsIHw9IDM8PDEyOyBicmVhazsKCQlkZWZhdWx0OgkJICAgICAgIHZhbCB8PSAxPDwxMjsgYnJl
YWs7CgkJfQoJfQoKCWRvd24oJmFjOTctPnJlZ19tdXRleCk7CgljaGFuZ2UgPSBhYzk3LT5zcGRp
Zl9zdGF0dXMgIT0gbmV3OwoJYWM5Ny0+c3BkaWZfc3RhdHVzID0gbmV3OwoKCWlmIChhYzk3LT5m
bGFncyAmIEFDOTdfQ1NfU1BESUYpIHsKCQlpbnQgeCA9ICh2YWwgPj4gMTIpICYgMHgwMzsKCQlz
d2l0Y2ggKHgpIHsKCQljYXNlIDA6IHggPSAxOyBicmVhazsgIC8vIDQ0LjEKCQljYXNlIDI6IHgg
PSAwOyBicmVhazsgIC8vIDQ4LjAKCQlkZWZhdWx0OiB4ID0gMDsgYnJlYWs7IC8vIGlsbGVnYWwu
CgkJfQoJCWNoYW5nZSB8PSBzbmRfYWM5N191cGRhdGVfYml0c19ub2xvY2soYWM5NywgQUM5N19D
U1JfU1BESUYsIDB4M2ZmZiwgKCh2YWwgJiAweGNmZmYpIHwgKHggPDwgMTIpKSk7Cgl9IGVsc2Ug
aWYgKGFjOTctPmZsYWdzICYgQUM5N19DWF9TUERJRikgewoJCWludCB2OwoJCXYgPSBuZXcgJiAo
SUVDOTU4X0FFUzBfQ09OX0VNUEhBU0lTXzUwMTV8SUVDOTU4X0FFUzBfQ09OX05PVF9DT1BZUklH
SFQpID8gMCA6IEFDOTdfQ1hSX0NPUFlSR1Q7CgkJdiB8PSBuZXcgJiBJRUM5NThfQUVTMF9OT05B
VURJTyA/IEFDOTdfQ1hSX1NQRElGX0FDMyA6IEFDOTdfQ1hSX1NQRElGX1BDTTsKCQljaGFuZ2Ug
fD0gc25kX2FjOTdfdXBkYXRlX2JpdHNfbm9sb2NrKGFjOTcsIEFDOTdfQ1hSX0FVRElPX01JU0Ms
IAoJCQkJCQkgICAgICBBQzk3X0NYUl9TUERJRl9NQVNLIHwgQUM5N19DWFJfQ09QWVJHVCwKCQkJ
CQkJICAgICAgdik7Cgl9IGVsc2UgewoJCXVuc2lnbmVkIHNob3J0IGV4dHN0ID0gc25kX2FjOTdf
cmVhZF9jYWNoZShhYzk3LCBBQzk3X0VYVEVOREVEX1NUQVRVUyk7CgkJc25kX2FjOTdfdXBkYXRl
X2JpdHNfbm9sb2NrKGFjOTcsIEFDOTdfRVhURU5ERURfU1RBVFVTLCBBQzk3X0VBX1NQRElGLCAw
KTsgLyogdHVybiBvZmYgKi8KCgkJY2hhbmdlIHw9IHNuZF9hYzk3X3VwZGF0ZV9iaXRzX25vbG9j
ayhhYzk3LCBBQzk3X1NQRElGLCAweDNmZmYsIHZhbCk7CgkJaWYgKGV4dHN0ICYgQUM5N19FQV9T
UERJRikgewoJCQlzbmRfYWM5N191cGRhdGVfYml0c19ub2xvY2soYWM5NywgQUM5N19FWFRFTkRF
RF9TVEFUVVMsIEFDOTdfRUFfU1BESUYsIEFDOTdfRUFfU1BESUYpOyAvKiB0dXJuIG9uIGFnYWlu
ICovCiAgICAgICAgICAgICAgICB9Cgl9Cgl1cCgmYWM5Ny0+cmVnX211dGV4KTsKCglyZXR1cm4g
Y2hhbmdlOwp9CgpzdGF0aWMgaW50IHNuZF9hYzk3X3B1dF9zcHNhKHNuZF9rY29udHJvbF90ICpr
Y29udHJvbCwgc25kX2N0bF9lbGVtX3ZhbHVlX3QgKnVjb250cm9sKQp7CglhYzk3X3QgKmFjOTcg
PSBzbmRfa2NvbnRyb2xfY2hpcChrY29udHJvbCk7CglpbnQgcmVnID0ga2NvbnRyb2wtPnByaXZh
dGVfdmFsdWUgJiAweGZmOwoJaW50IHNoaWZ0ID0gKGtjb250cm9sLT5wcml2YXRlX3ZhbHVlID4+
IDgpICYgMHhmZjsKCWludCBtYXNrID0gKGtjb250cm9sLT5wcml2YXRlX3ZhbHVlID4+IDE2KSAm
IDB4ZmY7CgkvLyBpbnQgaW52ZXJ0ID0gKGtjb250cm9sLT5wcml2YXRlX3ZhbHVlID4+IDI0KSAm
IDB4ZmY7Cgl1bnNpZ25lZCBzaG9ydCB2YWx1ZSwgb2xkLCBuZXc7CglpbnQgY2hhbmdlOwoKCXZh
bHVlID0gKHVjb250cm9sLT52YWx1ZS5pbnRlZ2VyLnZhbHVlWzBdICYgbWFzayk7CgoJZG93bigm
YWM5Ny0+cmVnX211dGV4KTsKCW1hc2sgPDw9IHNoaWZ0OwoJdmFsdWUgPDw9IHNoaWZ0OwoJb2xk
ID0gc25kX2FjOTdfcmVhZF9jYWNoZShhYzk3LCByZWcpOwoJbmV3ID0gKG9sZCAmIH5tYXNrKSB8
IHZhbHVlOwoJY2hhbmdlID0gb2xkICE9IG5ldzsKCglpZiAoY2hhbmdlKSB7CgkJdW5zaWduZWQg
c2hvcnQgZXh0c3QgPSBzbmRfYWM5N19yZWFkX2NhY2hlKGFjOTcsIEFDOTdfRVhURU5ERURfU1RB
VFVTKTsKCQlzbmRfYWM5N191cGRhdGVfYml0c19ub2xvY2soYWM5NywgQUM5N19FWFRFTkRFRF9T
VEFUVVMsIEFDOTdfRUFfU1BESUYsIDApOyAvKiB0dXJuIG9mZiAqLwoJCWNoYW5nZSA9IHNuZF9h
Yzk3X3VwZGF0ZV9iaXRzX25vbG9jayhhYzk3LCByZWcsIG1hc2ssIHZhbHVlKTsKCQlpZiAoZXh0
c3QgJiBBQzk3X0VBX1NQRElGKQoJCQlzbmRfYWM5N191cGRhdGVfYml0c19ub2xvY2soYWM5Nywg
QUM5N19FWFRFTkRFRF9TVEFUVVMsIEFDOTdfRUFfU1BESUYsIEFDOTdfRUFfU1BESUYpOyAvKiB0
dXJuIG9uIGFnYWluICovCgl9Cgl1cCgmYWM5Ny0+cmVnX211dGV4KTsKCXJldHVybiBjaGFuZ2U7
Cn0KCmNvbnN0IHNuZF9rY29udHJvbF9uZXdfdCBzbmRfYWM5N19jb250cm9sc19zcGRpZls1XSA9
IHsKCXsKCQkuYWNjZXNzID0gU05EUlZfQ1RMX0VMRU1fQUNDRVNTX1JFQUQsCgkJLmlmYWNlID0g
U05EUlZfQ1RMX0VMRU1fSUZBQ0VfTUlYRVIsCgkJLm5hbWUgPSBTTkRSVl9DVExfTkFNRV9JRUM5
NTgoIiIsUExBWUJBQ0ssQ09OX01BU0spLAoJCS5pbmZvID0gc25kX2FjOTdfc3BkaWZfbWFza19p
bmZvLAoJCS5nZXQgPSBzbmRfYWM5N19zcGRpZl9jbWFza19nZXQsCgl9LAoJewoJCS5hY2Nlc3Mg
PSBTTkRSVl9DVExfRUxFTV9BQ0NFU1NfUkVBRCwKCQkuaWZhY2UgPSBTTkRSVl9DVExfRUxFTV9J
RkFDRV9NSVhFUiwKCQkubmFtZSA9IFNORFJWX0NUTF9OQU1FX0lFQzk1OCgiIixQTEFZQkFDSyxQ
Uk9fTUFTSyksCgkJLmluZm8gPSBzbmRfYWM5N19zcGRpZl9tYXNrX2luZm8sCgkJLmdldCA9IHNu
ZF9hYzk3X3NwZGlmX3BtYXNrX2dldCwKCX0sCgl7CgkJLmlmYWNlID0gU05EUlZfQ1RMX0VMRU1f
SUZBQ0VfTUlYRVIsCgkJLm5hbWUgPSBTTkRSVl9DVExfTkFNRV9JRUM5NTgoIiIsUExBWUJBQ0ss
REVGQVVMVCksCgkJLmluZm8gPSBzbmRfYWM5N19zcGRpZl9tYXNrX2luZm8sCgkJLmdldCA9IHNu
ZF9hYzk3X3NwZGlmX2RlZmF1bHRfZ2V0LAoJCS5wdXQgPSBzbmRfYWM5N19zcGRpZl9kZWZhdWx0
X3B1dCwKCX0sCgoJQUM5N19TSU5HTEUoU05EUlZfQ1RMX05BTUVfSUVDOTU4KCIiLFBMQVlCQUNL
LFNXSVRDSCksQUM5N19FWFRFTkRFRF9TVEFUVVMsIDIsIDEsIDApLAoJewoJCS5pZmFjZSA9IFNO
RFJWX0NUTF9FTEVNX0lGQUNFX01JWEVSLAoJCS5uYW1lID0gU05EUlZfQ1RMX05BTUVfSUVDOTU4
KCIiLFBMQVlCQUNLLE5PTkUpICJBQzk3LVNQU0EiLAoJCS5pbmZvID0gc25kX2FjOTdfaW5mb192
b2xzdywKCQkuZ2V0ID0gc25kX2FjOTdfZ2V0X3ZvbHN3LAoJCS5wdXQgPSBzbmRfYWM5N19wdXRf
c3BzYSwKCQkucHJpdmF0ZV92YWx1ZSA9IEFDOTdfU0lOR0xFX1ZBTFVFKEFDOTdfRVhURU5ERURf
U1RBVFVTLCA0LCAzLCAwKQoJfSwKfTsKCiNkZWZpbmUgQUQxOFhYX1BDTV9CSVRTKHhuYW1lLCBj
b2RlYywgbHNoaWZ0LCByc2hpZnQsIG1hc2spIFwKeyAuaWZhY2UgPSBTTkRSVl9DVExfRUxFTV9J
RkFDRV9NSVhFUiwgLm5hbWUgPSB4bmFtZSwgLmluZm8gPSBzbmRfYWM5N19hZDE4eHhfcGNtX2lu
Zm9fYml0cywgXAogIC5nZXQgPSBzbmRfYWM5N19hZDE4eHhfcGNtX2dldF9iaXRzLCAucHV0ID0g
c25kX2FjOTdfYWQxOHh4X3BjbV9wdXRfYml0cywgXAogIC5wcml2YXRlX3ZhbHVlID0gKGNvZGVj
KSB8ICgobHNoaWZ0KSA8PCA4KSB8ICgocnNoaWZ0KSA8PCAxMikgfCAoKG1hc2spIDw8IDE2KSB9
CgpzdGF0aWMgaW50IHNuZF9hYzk3X2FkMTh4eF9wY21faW5mb19iaXRzKHNuZF9rY29udHJvbF90
ICprY29udHJvbCwgc25kX2N0bF9lbGVtX2luZm9fdCAqIHVpbmZvKQp7CglhYzk3X3QgKmFjOTcg
PSBzbmRfa2NvbnRyb2xfY2hpcChrY29udHJvbCk7CglpbnQgbWFzayA9IChrY29udHJvbC0+cHJp
dmF0ZV92YWx1ZSA+PiAxNikgJiAweDBmOwoJaW50IGxzaGlmdCA9IChrY29udHJvbC0+cHJpdmF0
ZV92YWx1ZSA+PiA4KSAmIDB4MGY7CglpbnQgcnNoaWZ0ID0gKGtjb250cm9sLT5wcml2YXRlX3Zh
bHVlID4+IDEyKSAmIDB4MGY7CgoJdWluZm8tPnR5cGUgPSBtYXNrID09IDEgPyBTTkRSVl9DVExf
RUxFTV9UWVBFX0JPT0xFQU4gOiBTTkRSVl9DVExfRUxFTV9UWVBFX0lOVEVHRVI7CglpZiAobHNo
aWZ0ICE9IHJzaGlmdCAmJiAoYWM5Ny0+ZmxhZ3MgJiBBQzk3X1NURVJFT19NVVRFUykpCgkJdWlu
Zm8tPmNvdW50ID0gMjsKCWVsc2UKCQl1aW5mby0+Y291bnQgPSAxOwoJdWluZm8tPnZhbHVlLmlu
dGVnZXIubWluID0gMDsKCXVpbmZvLT52YWx1ZS5pbnRlZ2VyLm1heCA9IG1hc2s7CglyZXR1cm4g
MDsKfQoKc3RhdGljIGludCBzbmRfYWM5N19hZDE4eHhfcGNtX2dldF9iaXRzKHNuZF9rY29udHJv
bF90ICoga2NvbnRyb2wsIHNuZF9jdGxfZWxlbV92YWx1ZV90ICogdWNvbnRyb2wpCnsKCWFjOTdf
dCAqYWM5NyA9IHNuZF9rY29udHJvbF9jaGlwKGtjb250cm9sKTsKCWludCBjb2RlYyA9IGtjb250
cm9sLT5wcml2YXRlX3ZhbHVlICYgMzsKCWludCBsc2hpZnQgPSAoa2NvbnRyb2wtPnByaXZhdGVf
dmFsdWUgPj4gOCkgJiAweDBmOwoJaW50IHJzaGlmdCA9IChrY29udHJvbC0+cHJpdmF0ZV92YWx1
ZSA+PiAxMikgJiAweDBmOwoJaW50IG1hc2sgPSAoa2NvbnRyb2wtPnByaXZhdGVfdmFsdWUgPj4g
MTYpICYgMHhmZjsKCQoJdWNvbnRyb2wtPnZhbHVlLmludGVnZXIudmFsdWVbMF0gPSBtYXNrIC0g
KChhYzk3LT5zcGVjLmFkMTh4eC5wY21yZWdbY29kZWNdID4+IGxzaGlmdCkgJiBtYXNrKTsKCWlm
IChsc2hpZnQgIT0gcnNoaWZ0ICYmIChhYzk3LT5mbGFncyAmIEFDOTdfU1RFUkVPX01VVEVTKSkK
CQl1Y29udHJvbC0+dmFsdWUuaW50ZWdlci52YWx1ZVsxXSA9IG1hc2sgLSAoKGFjOTctPnNwZWMu
YWQxOHh4LnBjbXJlZ1tjb2RlY10gPj4gcnNoaWZ0KSAmIG1hc2spOwoJcmV0dXJuIDA7Cn0KCnN0
YXRpYyBpbnQgc25kX2FjOTdfYWQxOHh4X3BjbV9wdXRfYml0cyhzbmRfa2NvbnRyb2xfdCAqIGtj
b250cm9sLCBzbmRfY3RsX2VsZW1fdmFsdWVfdCAqIHVjb250cm9sKQp7CglhYzk3X3QgKmFjOTcg
PSBzbmRfa2NvbnRyb2xfY2hpcChrY29udHJvbCk7CglpbnQgY29kZWMgPSBrY29udHJvbC0+cHJp
dmF0ZV92YWx1ZSAmIDM7CglpbnQgbHNoaWZ0ID0gKGtjb250cm9sLT5wcml2YXRlX3ZhbHVlID4+
IDgpICYgMHgwZjsKCWludCByc2hpZnQgPSAoa2NvbnRyb2wtPnByaXZhdGVfdmFsdWUgPj4gMTIp
ICYgMHgwZjsKCWludCBtYXNrID0gKGtjb250cm9sLT5wcml2YXRlX3ZhbHVlID4+IDE2KSAmIDB4
ZmY7Cgl1bnNpZ25lZCBzaG9ydCB2YWwsIHZhbG1hc2s7CgkKCXZhbCA9IChtYXNrIC0gKHVjb250
cm9sLT52YWx1ZS5pbnRlZ2VyLnZhbHVlWzBdICYgbWFzaykpIDw8IGxzaGlmdDsKCXZhbG1hc2sg
PSBtYXNrIDw8IGxzaGlmdDsKCWlmIChsc2hpZnQgIT0gcnNoaWZ0ICYmIChhYzk3LT5mbGFncyAm
IEFDOTdfU1RFUkVPX01VVEVTKSkgewoJCXZhbCB8PSAobWFzayAtICh1Y29udHJvbC0+dmFsdWUu
aW50ZWdlci52YWx1ZVsxXSAmIG1hc2spKSA8PCByc2hpZnQ7CgkJdmFsbWFzayB8PSBtYXNrIDw8
IHJzaGlmdDsKCX0KCXJldHVybiBzbmRfYWM5N19hZDE4eHhfdXBkYXRlX3BjbV9iaXRzKGFjOTcs
IGNvZGVjLCB2YWxtYXNrLCB2YWwpOwp9CgojZGVmaW5lIEFEMThYWF9QQ01fVk9MVU1FKHhuYW1l
LCBjb2RlYykgXAp7IC5pZmFjZSA9IFNORFJWX0NUTF9FTEVNX0lGQUNFX01JWEVSLCAubmFtZSA9
IHhuYW1lLCAuaW5mbyA9IHNuZF9hYzk3X2FkMTh4eF9wY21faW5mb192b2x1bWUsIFwKICAuZ2V0
ID0gc25kX2FjOTdfYWQxOHh4X3BjbV9nZXRfdm9sdW1lLCAucHV0ID0gc25kX2FjOTdfYWQxOHh4
X3BjbV9wdXRfdm9sdW1lLCBcCiAgLnByaXZhdGVfdmFsdWUgPSBjb2RlYyB9CgpzdGF0aWMgaW50
IHNuZF9hYzk3X2FkMTh4eF9wY21faW5mb192b2x1bWUoc25kX2tjb250cm9sX3QgKmtjb250cm9s
LCBzbmRfY3RsX2VsZW1faW5mb190ICogdWluZm8pCnsKCXVpbmZvLT50eXBlID0gU05EUlZfQ1RM
X0VMRU1fVFlQRV9JTlRFR0VSOwoJdWluZm8tPmNvdW50ID0gMjsKCXVpbmZvLT52YWx1ZS5pbnRl
Z2VyLm1pbiA9IDA7Cgl1aW5mby0+dmFsdWUuaW50ZWdlci5tYXggPSAzMTsKCXJldHVybiAwOwp9
CgpzdGF0aWMgaW50IHNuZF9hYzk3X2FkMTh4eF9wY21fZ2V0X3ZvbHVtZShzbmRfa2NvbnRyb2xf
dCAqIGtjb250cm9sLCBzbmRfY3RsX2VsZW1fdmFsdWVfdCAqIHVjb250cm9sKQp7CglhYzk3X3Qg
KmFjOTcgPSBzbmRfa2NvbnRyb2xfY2hpcChrY29udHJvbCk7CglpbnQgY29kZWMgPSBrY29udHJv
bC0+cHJpdmF0ZV92YWx1ZSAmIDM7CgkKCWRvd24oJmFjOTctPnBhZ2VfbXV0ZXgpOwoJdWNvbnRy
b2wtPnZhbHVlLmludGVnZXIudmFsdWVbMF0gPSAzMSAtICgoYWM5Ny0+c3BlYy5hZDE4eHgucGNt
cmVnW2NvZGVjXSA+PiAwKSAmIDMxKTsKCXVjb250cm9sLT52YWx1ZS5pbnRlZ2VyLnZhbHVlWzFd
ID0gMzEgLSAoKGFjOTctPnNwZWMuYWQxOHh4LnBjbXJlZ1tjb2RlY10gPj4gOCkgJiAzMSk7Cgl1
cCgmYWM5Ny0+cGFnZV9tdXRleCk7CglyZXR1cm4gMDsKfQoKc3RhdGljIGludCBzbmRfYWM5N19h
ZDE4eHhfcGNtX3B1dF92b2x1bWUoc25kX2tjb250cm9sX3QgKiBrY29udHJvbCwgc25kX2N0bF9l
bGVtX3ZhbHVlX3QgKiB1Y29udHJvbCkKewoJYWM5N190ICphYzk3ID0gc25kX2tjb250cm9sX2No
aXAoa2NvbnRyb2wpOwoJaW50IGNvZGVjID0ga2NvbnRyb2wtPnByaXZhdGVfdmFsdWUgJiAzOwoJ
dW5zaWduZWQgc2hvcnQgdmFsMSwgdmFsMjsKCQoJdmFsMSA9IDMxIC0gKHVjb250cm9sLT52YWx1
ZS5pbnRlZ2VyLnZhbHVlWzBdICYgMzEpOwoJdmFsMiA9IDMxIC0gKHVjb250cm9sLT52YWx1ZS5p
bnRlZ2VyLnZhbHVlWzFdICYgMzEpOwoJcmV0dXJuIHNuZF9hYzk3X2FkMTh4eF91cGRhdGVfcGNt
X2JpdHMoYWM5NywgY29kZWMsIDB4MWYxZiwgKHZhbDEgPDwgOCkgfCB2YWwyKTsKfQoKc3RhdGlj
IGNvbnN0IHNuZF9rY29udHJvbF9uZXdfdCBzbmRfYWM5N19jb250cm9sc19hZDE4eHhfcGNtWzJd
ID0gewpBRDE4WFhfUENNX0JJVFMoIlBDTSBQbGF5YmFjayBTd2l0Y2giLCAwLCAxNSwgNywgMSks
CkFEMThYWF9QQ01fVk9MVU1FKCJQQ00gUGxheWJhY2sgVm9sdW1lIiwgMCkKfTsKCnN0YXRpYyBj
b25zdCBzbmRfa2NvbnRyb2xfbmV3X3Qgc25kX2FjOTdfY29udHJvbHNfYWQxOHh4X3N1cnJvdW5k
WzJdID0gewpBRDE4WFhfUENNX0JJVFMoIlN1cnJvdW5kIFBsYXliYWNrIFN3aXRjaCIsIDEsIDE1
LCA3LCAxKSwKQUQxOFhYX1BDTV9WT0xVTUUoIlN1cnJvdW5kIFBsYXliYWNrIFZvbHVtZSIsIDEp
Cn07CgpzdGF0aWMgY29uc3Qgc25kX2tjb250cm9sX25ld190IHNuZF9hYzk3X2NvbnRyb2xzX2Fk
MTh4eF9jZW50ZXJbMl0gPSB7CkFEMThYWF9QQ01fQklUUygiQ2VudGVyIFBsYXliYWNrIFN3aXRj
aCIsIDIsIDE1LCAxNSwgMSksCkFEMThYWF9QQ01fQklUUygiQ2VudGVyIFBsYXliYWNrIFZvbHVt
ZSIsIDIsIDgsIDgsIDMxKQp9OwoKc3RhdGljIGNvbnN0IHNuZF9rY29udHJvbF9uZXdfdCBzbmRf
YWM5N19jb250cm9sc19hZDE4eHhfbGZlWzJdID0gewpBRDE4WFhfUENNX0JJVFMoIkxGRSBQbGF5
YmFjayBTd2l0Y2giLCAyLCA3LCA3LCAxKSwKQUQxOFhYX1BDTV9CSVRTKCJMRkUgUGxheWJhY2sg
Vm9sdW1lIiwgMiwgMCwgMCwgMzEpCn07CgovKgogKgogKi8KCnN0YXRpYyB2b2lkIHNuZF9hYzk3
X3Bvd2VyZG93bihhYzk3X3QgKmFjOTcpOwoKc3RhdGljIGludCBzbmRfYWM5N19idXNfZnJlZShh
Yzk3X2J1c190ICpidXMpCnsKCWlmIChidXMpIHsKCQlzbmRfYWM5N19idXNfcHJvY19kb25lKGJ1
cyk7CgkJa2ZyZWUoYnVzLT5wY21zKTsKCQlpZiAoYnVzLT5wcml2YXRlX2ZyZWUpCgkJCWJ1cy0+
cHJpdmF0ZV9mcmVlKGJ1cyk7CgkJa2ZyZWUoYnVzKTsKCX0KCXJldHVybiAwOwp9CgpzdGF0aWMg
aW50IHNuZF9hYzk3X2J1c19kZXZfZnJlZShzbmRfZGV2aWNlX3QgKmRldmljZSkKewoJYWM5N19i
dXNfdCAqYnVzID0gZGV2aWNlLT5kZXZpY2VfZGF0YTsKCXJldHVybiBzbmRfYWM5N19idXNfZnJl
ZShidXMpOwp9CgpzdGF0aWMgaW50IHNuZF9hYzk3X2ZyZWUoYWM5N190ICphYzk3KQp7CglpZiAo
YWM5NykgewoJCXNuZF9hYzk3X3Byb2NfZG9uZShhYzk3KTsKCQlpZiAoYWM5Ny0+YnVzKSB7CgkJ
CWFjOTctPmJ1cy0+Y29kZWNbYWM5Ny0+bnVtXSA9IE5VTEw7CgkJCWlmIChhYzk3LT5idXMtPnNo
YXJlZF90eXBlKSB7CgkJCQlkb3duKCZzaGFyZWRfY29kZWNfbXV0ZXgpOwoJCQkJc2hhcmVkX2Nv
ZGVjW2FjOTctPmJ1cy0+c2hhcmVkX3R5cGUtMV1bYWM5Ny0+bnVtXSA9IE5VTEw7CgkJCQl1cCgm
c2hhcmVkX2NvZGVjX211dGV4KTsKCQkJfQoJCX0KCQlpZiAoYWM5Ny0+cHJpdmF0ZV9mcmVlKQoJ
CQlhYzk3LT5wcml2YXRlX2ZyZWUoYWM5Nyk7CgkJa2ZyZWUoYWM5Nyk7Cgl9CglyZXR1cm4gMDsK
fQoKc3RhdGljIGludCBzbmRfYWM5N19kZXZfZnJlZShzbmRfZGV2aWNlX3QgKmRldmljZSkKewoJ
YWM5N190ICphYzk3ID0gZGV2aWNlLT5kZXZpY2VfZGF0YTsKCXNuZF9hYzk3X3Bvd2VyZG93bihh
Yzk3KTsgLyogZm9yIGF2b2lkaW5nIGNsaWNrIG5vaXNlcyBkdXJpbmcgc2h1dCBkb3duICovCgly
ZXR1cm4gc25kX2FjOTdfZnJlZShhYzk3KTsKfQoKc3RhdGljIGludCBzbmRfYWM5N190cnlfdm9s
dW1lX21peChhYzk3X3QgKiBhYzk3LCBpbnQgcmVnKQp7Cgl1bnNpZ25lZCBzaG9ydCB2YWwsIG1h
c2sgPSAweDgwMDA7CgoJaWYgKCEgc25kX2FjOTdfdmFsaWRfcmVnKGFjOTcsIHJlZykpCgkJcmV0
dXJuIDA7CgoJc3dpdGNoIChyZWcpIHsKCWNhc2UgQUM5N19NQVNURVJfVE9ORToKCQlyZXR1cm4g
YWM5Ny0+Y2FwcyAmIDB4MDQgPyAxIDogMDsKCWNhc2UgQUM5N19IRUFEUEhPTkU6CgkJcmV0dXJu
IGFjOTctPmNhcHMgJiAweDEwID8gMSA6IDA7CgljYXNlIEFDOTdfUkVDX0dBSU5fTUlDOgoJCXJl
dHVybiBhYzk3LT5jYXBzICYgMHgwMSA/IDEgOiAwOwoJY2FzZSBBQzk3XzNEX0NPTlRST0w6CgkJ
aWYgKGFjOTctPmNhcHMgJiAweDdjMDApIHsKCQkJdmFsID0gc25kX2FjOTdfcmVhZChhYzk3LCBy
ZWcpOwoJCQkvKiBpZiBub256ZXJvIC0gZml4ZWQgYW5kIHdlIGNhbid0IHNldCBpdCAqLwoJCQly
ZXR1cm4gdmFsID09IDA7CgkJfQoJCXJldHVybiAwOwoJY2FzZSBBQzk3X0NFTlRFUl9MRkVfTUFT
VEVSOgkvKiBjZW50ZXIgKi8KCQlpZiAoKGFjOTctPmV4dF9pZCAmIEFDOTdfRUlfQ0RBQykgPT0g
MCkKCQkJcmV0dXJuIDA7CgkJYnJlYWs7CgljYXNlIEFDOTdfQ0VOVEVSX0xGRV9NQVNURVIrMToJ
LyogbGZlICovCgkJaWYgKChhYzk3LT5leHRfaWQgJiBBQzk3X0VJX0xEQUMpID09IDApCgkJCXJl
dHVybiAwOwoJCXJlZyA9IEFDOTdfQ0VOVEVSX0xGRV9NQVNURVI7CgkJbWFzayA9IDB4MDA4MDsK
CQlicmVhazsKCWNhc2UgQUM5N19TVVJST1VORF9NQVNURVI6CgkJaWYgKChhYzk3LT5leHRfaWQg
JiBBQzk3X0VJX1NEQUMpID09IDApCgkJCXJldHVybiAwOwoJCWJyZWFrOwoJfQoKCWlmIChhYzk3
LT5saW1pdGVkX3JlZ3MgJiYgdGVzdF9iaXQocmVnLCBhYzk3LT5yZWdfYWNjZXNzZWQpKQoJCXJl
dHVybiAxOyAvKiBhbGxvdyB3aXRob3V0IGNoZWNrICovCgoJdmFsID0gc25kX2FjOTdfcmVhZChh
Yzk3LCByZWcpOwoJaWYgKCEodmFsICYgbWFzaykpIHsKCQkvKiBub3RoaW5nIHNlZW1zIHRvIGJl
IGhlcmUgLSBtdXRlIGZsYWcgaXMgbm90IHNldCAqLwoJCS8qIHRyeSBhbm90aGVyIHRlc3QgKi8K
CQlzbmRfYWM5N193cml0ZV9jYWNoZShhYzk3LCByZWcsIHZhbCB8IG1hc2spOwoJCXZhbCA9IHNu
ZF9hYzk3X3JlYWQoYWM5NywgcmVnKTsKCQlpZiAoISh2YWwgJiBtYXNrKSkKCQkJcmV0dXJuIDA7
CS8qIG5vdGhpbmcgaGVyZSAqLwoJfQoJcmV0dXJuIDE7CQkvKiBzdWNjZXNzLCB1c2VhYmxlICov
Cn0KCnN0YXRpYyB2b2lkIGNoZWNrX3ZvbHVtZV9yZXNvbHV0aW9uKGFjOTdfdCAqYWM5NywgaW50
IHJlZywgdW5zaWduZWQgY2hhciAqbG9fbWF4LCB1bnNpZ25lZCBjaGFyICpoaV9tYXgpCnsKCXVu
c2lnbmVkIHNob3J0IGNiaXRbM10gPSB7IDB4MjAsIDB4MTAsIDB4MDEgfTsKCXVuc2lnbmVkIGNo
YXIgbWF4WzNdID0geyA2MywgMzEsIDE1IH07CglpbnQgaTsKCgkqbG9fbWF4ID0gKmhpX21heCA9
IDA7Cglmb3IgKGkgPSAwIDsgaSA8IEFSUkFZX1NJWkUoY2JpdCk7IGkrKykgewoJCXVuc2lnbmVk
IHNob3J0IHZhbDsKCQlzbmRfYWM5N193cml0ZShhYzk3LCByZWcsIDB4ODA4MCB8IGNiaXRbaV0g
fCAoY2JpdFtpXSA8PCA4KSk7CgkJdmFsID0gc25kX2FjOTdfcmVhZChhYzk3LCByZWcpOwoJCWlm
ICghICpsb19tYXggJiYgKHZhbCAmIGNiaXRbaV0pKQoJCQkqbG9fbWF4ID0gbWF4W2ldOwoJCWlm
ICghICpoaV9tYXggJiYgKHZhbCAmIChjYml0W2ldIDw8IDgpKSkKCQkJKmhpX21heCA9IG1heFtp
XTsKCQlpZiAoKmxvX21heCAmJiAqaGlfbWF4KQoJCQlicmVhazsKCX0KfQoKaW50IHNuZF9hYzk3
X3RyeV9iaXQoYWM5N190ICogYWM5NywgaW50IHJlZywgaW50IGJpdCkKewoJdW5zaWduZWQgc2hv
cnQgbWFzaywgdmFsLCBvcmlnLCByZXM7CgoJbWFzayA9IDEgPDwgYml0OwoJb3JpZyA9IHNuZF9h
Yzk3X3JlYWQoYWM5NywgcmVnKTsKCXZhbCA9IG9yaWcgXiBtYXNrOwoJc25kX2FjOTdfd3JpdGUo
YWM5NywgcmVnLCB2YWwpOwoJcmVzID0gc25kX2FjOTdfcmVhZChhYzk3LCByZWcpOwoJc25kX2Fj
OTdfd3JpdGVfY2FjaGUoYWM5NywgcmVnLCBvcmlnKTsKCXJldHVybiByZXMgPT0gdmFsOwp9Cgov
KiBjaGVjayB0aGUgdm9sdW1lIHJlc29sdXRpb24gb2YgY2VudGVyL2xmZSAqLwpzdGF0aWMgdm9p
ZCBzbmRfYWM5N19jaGFuZ2Vfdm9sdW1lX3BhcmFtczIoYWM5N190ICogYWM5NywgaW50IHJlZywg
aW50IHNoaWZ0LCB1bnNpZ25lZCBjaGFyICptYXgpCnsKCXVuc2lnbmVkIHNob3J0IHZhbCwgdmFs
MTsKCgkqbWF4ID0gNjM7Cgl2YWwgPSAweDgwODAgfCAoMHgyMCA8PCBzaGlmdCk7CglzbmRfYWM5
N193cml0ZShhYzk3LCByZWcsIHZhbCk7Cgl2YWwxID0gc25kX2FjOTdfcmVhZChhYzk3LCByZWcp
OwoJaWYgKHZhbCAhPSB2YWwxKSB7CgkJKm1heCA9IDMxOwoJfQoJLyogcmVzZXQgdm9sdW1lIHRv
IHplcm8gKi8KCXNuZF9hYzk3X3dyaXRlX2NhY2hlKGFjOTcsIHJlZywgMHg4MDgwKTsKfQoKc3Rh
dGljIGlubGluZSBpbnQgcHJpbnRhYmxlKHVuc2lnbmVkIGludCB4KQp7Cgl4ICY9IDB4ZmY7Cglp
ZiAoeCA8ICcgJyB8fCB4ID49IDB4NzEpIHsKCQlpZiAoeCA8PSAweDg5KQoJCQlyZXR1cm4geCAt
IDB4NzEgKyAnQSc7CgkJcmV0dXJuICc/JzsKCX0KCXJldHVybiB4Owp9CgpzbmRfa2NvbnRyb2xf
dCAqc25kX2FjOTdfY25ldyhjb25zdCBzbmRfa2NvbnRyb2xfbmV3X3QgKl90ZW1wbGF0ZSwgYWM5
N190ICogYWM5NykKewoJc25kX2tjb250cm9sX25ld190IHRlbXBsYXRlOwoJbWVtY3B5KCZ0ZW1w
bGF0ZSwgX3RlbXBsYXRlLCBzaXplb2YodGVtcGxhdGUpKTsKCXNuZF9ydW50aW1lX2NoZWNrKCF0
ZW1wbGF0ZS5pbmRleCwgcmV0dXJuIE5VTEwpOwoJdGVtcGxhdGUuaW5kZXggPSBhYzk3LT5udW07
CglyZXR1cm4gc25kX2N0bF9uZXcxKCZ0ZW1wbGF0ZSwgYWM5Nyk7Cn0KCi8qCiAqIGNyZWF0ZSBt
dXRlIHN3aXRjaChlcykgZm9yIG5vcm1hbCBzdGVyZW8gY29udHJvbHMKICovCnN0YXRpYyBpbnQg
c25kX2FjOTdfY211dGVfbmV3KHNuZF9jYXJkX3QgKmNhcmQsIGNoYXIgKm5hbWUsIGludCByZWcs
IGFjOTdfdCAqYWM5NykKewoJc25kX2tjb250cm9sX3QgKmtjdGw7CglpbnQgZXJyOwoJdW5zaWdu
ZWQgc2hvcnQgdmFsLCB2YWwxLCBtdXRlX21hc2s7CgoJaWYgKCEgc25kX2FjOTdfdmFsaWRfcmVn
KGFjOTcsIHJlZykpCgkJcmV0dXJuIDA7CgoJbXV0ZV9tYXNrID0gMHg4MDAwOwoJdmFsID0gc25k
X2FjOTdfcmVhZChhYzk3LCByZWcpOwoJaWYgKGFjOTctPmZsYWdzICYgQUM5N19TVEVSRU9fTVVU
RVMpIHsKCQkvKiBjaGVjayB3aGV0aGVyIGJvdGggbXV0ZSBiaXRzIHdvcmsgKi8KCQl2YWwxID0g
dmFsIHwgMHg4MDgwOwoJCXNuZF9hYzk3X3dyaXRlKGFjOTcsIHJlZywgdmFsMSk7CgkJaWYgKHZh
bDEgPT0gc25kX2FjOTdfcmVhZChhYzk3LCByZWcpKQoJCQltdXRlX21hc2sgPSAweDgwODA7Cgl9
CglpZiAobXV0ZV9tYXNrID09IDB4ODA4MCkgewoJCXNuZF9rY29udHJvbF9uZXdfdCB0bXAgPSBB
Qzk3X0RPVUJMRShuYW1lLCByZWcsIDE1LCA3LCAxLCAxKTsKCQl0bXAuaW5kZXggPSBhYzk3LT5u
dW07CgkJa2N0bCA9IHNuZF9jdGxfbmV3MSgmdG1wLCBhYzk3KTsKCX0gZWxzZSB7CgkJc25kX2tj
b250cm9sX25ld190IHRtcCA9IEFDOTdfU0lOR0xFKG5hbWUsIHJlZywgMTUsIDEsIDEpOwoJCXRt
cC5pbmRleCA9IGFjOTctPm51bTsKCQlrY3RsID0gc25kX2N0bF9uZXcxKCZ0bXAsIGFjOTcpOwoJ
fQoJZXJyID0gc25kX2N0bF9hZGQoY2FyZCwga2N0bCk7CglpZiAoZXJyIDwgMCkKCQlyZXR1cm4g
ZXJyOwoJLyogbXV0ZSBhcyBkZWZhdWx0ICovCglzbmRfYWM5N193cml0ZV9jYWNoZShhYzk3LCBy
ZWcsIHZhbCB8IG11dGVfbWFzayk7CglyZXR1cm4gMDsKfQoKLyoKICogY3JlYXRlIGEgdm9sdW1l
IGZvciBub3JtYWwgc3RlcmVvL21vbm8gY29udHJvbHMKICovCnN0YXRpYyBpbnQgc25kX2FjOTdf
Y3ZvbF9uZXcoc25kX2NhcmRfdCAqY2FyZCwgY2hhciAqbmFtZSwgaW50IHJlZywgdW5zaWduZWQg
aW50IGxvX21heCwKCQkJICAgICB1bnNpZ25lZCBpbnQgaGlfbWF4LCBhYzk3X3QgKmFjOTcpCnsK
CWludCBlcnI7CglzbmRfa2NvbnRyb2xfdCAqa2N0bDsKCglpZiAoISBzbmRfYWM5N192YWxpZF9y
ZWcoYWM5NywgcmVnKSkKCQlyZXR1cm4gMDsKCWlmIChoaV9tYXgpIHsKCQkvKiBpbnZlcnQgKi8K
CQlzbmRfa2NvbnRyb2xfbmV3X3QgdG1wID0gQUM5N19ET1VCTEUobmFtZSwgcmVnLCA4LCAwLCBs
b19tYXgsIDEpOwoJCXRtcC5pbmRleCA9IGFjOTctPm51bTsKCQlrY3RsID0gc25kX2N0bF9uZXcx
KCZ0bXAsIGFjOTcpOwoJfSBlbHNlIHsKCQkvKiBpbnZlcnQgKi8KCQlzbmRfa2NvbnRyb2xfbmV3
X3QgdG1wID0gQUM5N19TSU5HTEUobmFtZSwgcmVnLCAwLCBsb19tYXgsIDEpOwoJCXRtcC5pbmRl
eCA9IGFjOTctPm51bTsKCQlrY3RsID0gc25kX2N0bF9uZXcxKCZ0bXAsIGFjOTcpOwoJfQoJZXJy
ID0gc25kX2N0bF9hZGQoY2FyZCwga2N0bCk7CglpZiAoZXJyIDwgMCkKCQlyZXR1cm4gZXJyOwoJ
c25kX2FjOTdfd3JpdGVfY2FjaGUoYWM5NywgcmVnLAoJCQkgICAgIChzbmRfYWM5N19yZWFkKGFj
OTcsIHJlZykgJiAweDgwODApIHwKCQkJICAgICBsb19tYXggfCAoaGlfbWF4IDw8IDgpKTsKCXJl
dHVybiAwOwp9CgovKgogKiBjcmVhdGUgYSBtdXRlLXN3aXRjaCBhbmQgYSB2b2x1bWUgZm9yIG5v
cm1hbCBzdGVyZW8vbW9ubyBjb250cm9scwogKi8Kc3RhdGljIGludCBzbmRfYWM5N19jbWl4X25l
dyhzbmRfY2FyZF90ICpjYXJkLCBjb25zdCBjaGFyICpwZngsIGludCByZWcsIGFjOTdfdCAqYWM5
NykKewoJaW50IGVycjsKCWNoYXIgbmFtZVs0NF07Cgl1bnNpZ25lZCBjaGFyIGxvX21heCwgaGlf
bWF4OwoKCWlmICghIHNuZF9hYzk3X3ZhbGlkX3JlZyhhYzk3LCByZWcpKQoJCXJldHVybiAwOwoK
CWlmIChzbmRfYWM5N190cnlfYml0KGFjOTcsIHJlZywgMTUpKSB7CgkJc3ByaW50ZihuYW1lLCAi
JXMgU3dpdGNoIiwgcGZ4KTsKCQlpZiAoKGVyciA9IHNuZF9hYzk3X2NtdXRlX25ldyhjYXJkLCBu
YW1lLCByZWcsIGFjOTcpKSA8IDApCgkJCXJldHVybiBlcnI7Cgl9CgljaGVja192b2x1bWVfcmVz
b2x1dGlvbihhYzk3LCByZWcsICZsb19tYXgsICZoaV9tYXgpOwoJaWYgKGxvX21heCkgewoJCXNw
cmludGYobmFtZSwgIiVzIFZvbHVtZSIsIHBmeCk7CgkJaWYgKChlcnIgPSBzbmRfYWM5N19jdm9s
X25ldyhjYXJkLCBuYW1lLCByZWcsIGxvX21heCwgaGlfbWF4LCBhYzk3KSkgPCAwKQoJCQlyZXR1
cm4gZXJyOwoJfQoJcmV0dXJuIDA7Cn0KCgpzdGF0aWMgdW5zaWduZWQgaW50IHNuZF9hYzk3X2Rl
dGVybWluZV9zcGRpZl9yYXRlcyhhYzk3X3QgKmFjOTcpOwoKc3RhdGljIGludCBzbmRfYWM5N19t
aXhlcl9idWlsZChhYzk3X3QgKiBhYzk3KQp7CglzbmRfY2FyZF90ICpjYXJkID0gYWM5Ny0+YnVz
LT5jYXJkOwoJc25kX2tjb250cm9sX3QgKmtjdGw7CglpbnQgZXJyOwoJdW5zaWduZWQgaW50IGlk
eDsKCXVuc2lnbmVkIGNoYXIgbWF4OwoKCS8qIGJ1aWxkIG1hc3RlciBjb250cm9scyAqLwoJLyog
QUQgY2xhaW1zIHRvIHJlbW92ZSB0aGlzIGNvbnRyb2wgZnJvbSBBRDE4ODcsIGFsdGhvdWdoIHNw
ZWMgdjIuMiBkb2VzIG5vdCBhbGxvdyB0aGlzICovCglpZiAoc25kX2FjOTdfdHJ5X3ZvbHVtZV9t
aXgoYWM5NywgQUM5N19NQVNURVIpKSB7CgkJaWYgKGFjOTctPmZsYWdzICYgQUM5N19IQVNfTk9f
TUFTVEVSX1ZPTCkKCQkJZXJyID0gc25kX2FjOTdfY211dGVfbmV3KGNhcmQsICJNYXN0ZXIgUGxh
eWJhY2sgU3dpdGNoIiwgQUM5N19NQVNURVIsIGFjOTcpOwoJCWVsc2UKCQkJZXJyID0gc25kX2Fj
OTdfY21peF9uZXcoY2FyZCwgIk1hc3RlciBQbGF5YmFjayIsIEFDOTdfTUFTVEVSLCBhYzk3KTsK
CQlpZiAoZXJyIDwgMCkKCQkJcmV0dXJuIGVycjsKCX0KCglhYzk3LT5yZWdzW0FDOTdfQ0VOVEVS
X0xGRV9NQVNURVJdID0gMHg4MDgwOwoKCS8qIGJ1aWxkIGNlbnRlciBjb250cm9scyAqLwoJaWYg
KHNuZF9hYzk3X3RyeV92b2x1bWVfbWl4KGFjOTcsIEFDOTdfQ0VOVEVSX0xGRV9NQVNURVIpKSB7
CgkJaWYgKChlcnIgPSBzbmRfY3RsX2FkZChjYXJkLCBzbmRfYWM5N19jbmV3KCZzbmRfYWM5N19j
b250cm9sc19jZW50ZXJbMF0sIGFjOTcpKSkgPCAwKQoJCQlyZXR1cm4gZXJyOwoJCWlmICgoZXJy
ID0gc25kX2N0bF9hZGQoY2FyZCwga2N0bCA9IHNuZF9hYzk3X2NuZXcoJnNuZF9hYzk3X2NvbnRy
b2xzX2NlbnRlclsxXSwgYWM5NykpKSA8IDApCgkJCXJldHVybiBlcnI7CgkJc25kX2FjOTdfY2hh
bmdlX3ZvbHVtZV9wYXJhbXMyKGFjOTcsIEFDOTdfQ0VOVEVSX0xGRV9NQVNURVIsIDAsICZtYXgp
OwoJCWtjdGwtPnByaXZhdGVfdmFsdWUgJj0gfigweGZmIDw8IDE2KTsKCQlrY3RsLT5wcml2YXRl
X3ZhbHVlIHw9IChpbnQpbWF4IDw8IDE2OwoJCXNuZF9hYzk3X3dyaXRlX2NhY2hlKGFjOTcsIEFD
OTdfQ0VOVEVSX0xGRV9NQVNURVIsIGFjOTctPnJlZ3NbQUM5N19DRU5URVJfTEZFX01BU1RFUl0g
fCBtYXgpOwoJfQoKCS8qIGJ1aWxkIExGRSBjb250cm9scyAqLwoJaWYgKHNuZF9hYzk3X3RyeV92
b2x1bWVfbWl4KGFjOTcsIEFDOTdfQ0VOVEVSX0xGRV9NQVNURVIrMSkpIHsKCQlpZiAoKGVyciA9
IHNuZF9jdGxfYWRkKGNhcmQsIHNuZF9hYzk3X2NuZXcoJnNuZF9hYzk3X2NvbnRyb2xzX2xmZVsw
XSwgYWM5NykpKSA8IDApCgkJCXJldHVybiBlcnI7CgkJaWYgKChlcnIgPSBzbmRfY3RsX2FkZChj
YXJkLCBrY3RsID0gc25kX2FjOTdfY25ldygmc25kX2FjOTdfY29udHJvbHNfbGZlWzFdLCBhYzk3
KSkpIDwgMCkKCQkJcmV0dXJuIGVycjsKCQlzbmRfYWM5N19jaGFuZ2Vfdm9sdW1lX3BhcmFtczIo
YWM5NywgQUM5N19DRU5URVJfTEZFX01BU1RFUiwgOCwgJm1heCk7CgkJa2N0bC0+cHJpdmF0ZV92
YWx1ZSAmPSB+KDB4ZmYgPDwgMTYpOwoJCWtjdGwtPnByaXZhdGVfdmFsdWUgfD0gKGludCltYXgg
PDwgMTY7CgkJc25kX2FjOTdfd3JpdGVfY2FjaGUoYWM5NywgQUM5N19DRU5URVJfTEZFX01BU1RF
UiwgYWM5Ny0+cmVnc1tBQzk3X0NFTlRFUl9MRkVfTUFTVEVSXSB8IG1heCA8PCA4KTsKCX0KCgkv
KiBidWlsZCBzdXJyb3VuZCBjb250cm9scyAqLwoJaWYgKHNuZF9hYzk3X3RyeV92b2x1bWVfbWl4
KGFjOTcsIEFDOTdfU1VSUk9VTkRfTUFTVEVSKSkgewoJCWlmICgoZXJyID0gc25kX2FjOTdfY21p
eF9uZXcoY2FyZCwgIlN1cnJvdW5kIFBsYXliYWNrIiwgQUM5N19TVVJST1VORF9NQVNURVIsIGFj
OTcpKSA8IDApCgkJCXJldHVybiBlcnI7Cgl9CgoJLyogYnVpbGQgaGVhZHBob25lIGNvbnRyb2xz
ICovCglpZiAoc25kX2FjOTdfdHJ5X3ZvbHVtZV9taXgoYWM5NywgQUM5N19IRUFEUEhPTkUpKSB7
CgkJaWYgKChlcnIgPSBzbmRfYWM5N19jbWl4X25ldyhjYXJkLCAiSGVhZHBob25lIFBsYXliYWNr
IiwgQUM5N19IRUFEUEhPTkUsIGFjOTcpKSA8IDApCgkJCXJldHVybiBlcnI7Cgl9CgkKCS8qIGJ1
aWxkIG1hc3RlciBtb25vIGNvbnRyb2xzICovCglpZiAoc25kX2FjOTdfdHJ5X3ZvbHVtZV9taXgo
YWM5NywgQUM5N19NQVNURVJfTU9OTykpIHsKCQlpZiAoKGVyciA9IHNuZF9hYzk3X2NtaXhfbmV3
KGNhcmQsICJNYXN0ZXIgTW9ubyBQbGF5YmFjayIsIEFDOTdfTUFTVEVSX01PTk8sIGFjOTcpKSA8
IDApCgkJCXJldHVybiBlcnI7Cgl9CgkKCS8qIGJ1aWxkIG1hc3RlciB0b25lIGNvbnRyb2xzICov
CglpZiAoc25kX2FjOTdfdHJ5X3ZvbHVtZV9taXgoYWM5NywgQUM5N19NQVNURVJfVE9ORSkpIHsK
CQlmb3IgKGlkeCA9IDA7IGlkeCA8IDI7IGlkeCsrKSB7CgkJCWlmICgoZXJyID0gc25kX2N0bF9h
ZGQoY2FyZCwga2N0bCA9IHNuZF9hYzk3X2NuZXcoJnNuZF9hYzk3X2NvbnRyb2xzX3RvbmVbaWR4
XSwgYWM5NykpKSA8IDApCgkJCQlyZXR1cm4gZXJyOwoJCQlpZiAoYWM5Ny0+aWQgPT0gQUM5N19J
RF9ZTUY3NTMpIHsKCQkJCWtjdGwtPnByaXZhdGVfdmFsdWUgJj0gfigweGZmIDw8IDE2KTsKCQkJ
CWtjdGwtPnByaXZhdGVfdmFsdWUgfD0gNyA8PCAxNjsKCQkJfQoJCX0KCQlzbmRfYWM5N193cml0
ZV9jYWNoZShhYzk3LCBBQzk3X01BU1RFUl9UT05FLCAweDBmMGYpOwoJfQoJCgkvKiBidWlsZCBQ
QyBTcGVha2VyIGNvbnRyb2xzICovCglpZiAoKGFjOTctPmZsYWdzICYgQUM5N19IQVNfUENfQkVF
UCkgfHwKCSAgICBzbmRfYWM5N190cnlfdm9sdW1lX21peChhYzk3LCBBQzk3X1BDX0JFRVApKSB7
CgkJZm9yIChpZHggPSAwOyBpZHggPCAyOyBpZHgrKykKCQkJaWYgKChlcnIgPSBzbmRfY3RsX2Fk
ZChjYXJkLCBzbmRfYWM5N19jbmV3KCZzbmRfYWM5N19jb250cm9sc19wY19iZWVwW2lkeF0sIGFj
OTcpKSkgPCAwKQoJCQkJcmV0dXJuIGVycjsKCQlzbmRfYWM5N193cml0ZV9jYWNoZShhYzk3LCBB
Qzk3X1BDX0JFRVAsCgkJCQkgICAgIHNuZF9hYzk3X3JlYWQoYWM5NywgQUM5N19QQ19CRUVQKSB8
IDB4ODAxZSk7Cgl9CgkKCS8qIGJ1aWxkIFBob25lIGNvbnRyb2xzICovCglpZiAoc25kX2FjOTdf
dHJ5X3ZvbHVtZV9taXgoYWM5NywgQUM5N19QSE9ORSkpIHsKCQlpZiAoKGVyciA9IHNuZF9hYzk3
X2NtaXhfbmV3KGNhcmQsICJQaG9uZSBQbGF5YmFjayIsIEFDOTdfUEhPTkUsIGFjOTcpKSA8IDAp
CgkJCXJldHVybiBlcnI7Cgl9CgkKCS8qIGJ1aWxkIE1JQyBjb250cm9scyAqLwoJaWYgKHNuZF9h
Yzk3X3RyeV92b2x1bWVfbWl4KGFjOTcsIEFDOTdfTUlDKSkgewoJCWlmICgoZXJyID0gc25kX2Fj
OTdfY21peF9uZXcoY2FyZCwgIk1pYyBQbGF5YmFjayIsIEFDOTdfTUlDLCBhYzk3KSkgPCAwKQoJ
CQlyZXR1cm4gZXJyOwoJCWlmICgoZXJyID0gc25kX2N0bF9hZGQoY2FyZCwgc25kX2FjOTdfY25l
dygmc25kX2FjOTdfY29udHJvbHNfbWljX2Jvb3N0LCBhYzk3KSkpIDwgMCkKCQkJcmV0dXJuIGVy
cjsKCX0KCgkvKiBidWlsZCBMaW5lIGNvbnRyb2xzICovCglpZiAoc25kX2FjOTdfdHJ5X3ZvbHVt
ZV9taXgoYWM5NywgQUM5N19MSU5FKSkgewoJCWlmICgoZXJyID0gc25kX2FjOTdfY21peF9uZXco
Y2FyZCwgIkxpbmUgUGxheWJhY2siLCBBQzk3X0xJTkUsIGFjOTcpKSA8IDApCgkJCXJldHVybiBl
cnI7Cgl9CgkKCS8qIGJ1aWxkIENEIGNvbnRyb2xzICovCglpZiAoc25kX2FjOTdfdHJ5X3ZvbHVt
ZV9taXgoYWM5NywgQUM5N19DRCkpIHsKCQlpZiAoKGVyciA9IHNuZF9hYzk3X2NtaXhfbmV3KGNh
cmQsICJDRCBQbGF5YmFjayIsIEFDOTdfQ0QsIGFjOTcpKSA8IDApCgkJCXJldHVybiBlcnI7Cgl9
CgkKCS8qIGJ1aWxkIFZpZGVvIGNvbnRyb2xzICovCglpZiAoc25kX2FjOTdfdHJ5X3ZvbHVtZV9t
aXgoYWM5NywgQUM5N19WSURFTykpIHsKCQlpZiAoKGVyciA9IHNuZF9hYzk3X2NtaXhfbmV3KGNh
cmQsICJWaWRlbyBQbGF5YmFjayIsIEFDOTdfVklERU8sIGFjOTcpKSA8IDApCgkJCXJldHVybiBl
cnI7Cgl9CgoJLyogYnVpbGQgQXV4IGNvbnRyb2xzICovCglpZiAoc25kX2FjOTdfdHJ5X3ZvbHVt
ZV9taXgoYWM5NywgQUM5N19BVVgpKSB7CgkJaWYgKChlcnIgPSBzbmRfYWM5N19jbWl4X25ldyhj
YXJkLCAiQXV4IFBsYXliYWNrIiwgQUM5N19BVVgsIGFjOTcpKSA8IDApCgkJCXJldHVybiBlcnI7
Cgl9CgoJLyogYnVpbGQgUENNIGNvbnRyb2xzICovCglpZiAoYWM5Ny0+ZmxhZ3MgJiBBQzk3X0FE
X01VTFRJKSB7CgkJdW5zaWduZWQgc2hvcnQgaW5pdF92YWw7CgkJaWYgKGFjOTctPmZsYWdzICYg
QUM5N19TVEVSRU9fTVVURVMpCgkJCWluaXRfdmFsID0gMHg5ZjlmOwoJCWVsc2UKCQkJaW5pdF92
YWwgPSAweDlmMWY7CgkJZm9yIChpZHggPSAwOyBpZHggPCAyOyBpZHgrKykKCQkJaWYgKChlcnIg
PSBzbmRfY3RsX2FkZChjYXJkLCBzbmRfYWM5N19jbmV3KCZzbmRfYWM5N19jb250cm9sc19hZDE4
eHhfcGNtW2lkeF0sIGFjOTcpKSkgPCAwKQoJCQkJcmV0dXJuIGVycjsKCQlhYzk3LT5zcGVjLmFk
MTh4eC5wY21yZWdbMF0gPSBpbml0X3ZhbDsKCQlpZiAoYWM5Ny0+c2NhcHMgJiBBQzk3X1NDQVBf
U1VSUk9VTkRfREFDKSB7CgkJCWZvciAoaWR4ID0gMDsgaWR4IDwgMjsgaWR4KyspCgkJCQlpZiAo
KGVyciA9IHNuZF9jdGxfYWRkKGNhcmQsIHNuZF9hYzk3X2NuZXcoJnNuZF9hYzk3X2NvbnRyb2xz
X2FkMTh4eF9zdXJyb3VuZFtpZHhdLCBhYzk3KSkpIDwgMCkKCQkJCQlyZXR1cm4gZXJyOwoJCQlh
Yzk3LT5zcGVjLmFkMTh4eC5wY21yZWdbMV0gPSBpbml0X3ZhbDsKCQl9CgkJaWYgKGFjOTctPnNj
YXBzICYgQUM5N19TQ0FQX0NFTlRFUl9MRkVfREFDKSB7CgkJCWZvciAoaWR4ID0gMDsgaWR4IDwg
MjsgaWR4KyspCgkJCQlpZiAoKGVyciA9IHNuZF9jdGxfYWRkKGNhcmQsIHNuZF9hYzk3X2NuZXco
JnNuZF9hYzk3X2NvbnRyb2xzX2FkMTh4eF9jZW50ZXJbaWR4XSwgYWM5NykpKSA8IDApCgkJCQkJ
cmV0dXJuIGVycjsKCQkJZm9yIChpZHggPSAwOyBpZHggPCAyOyBpZHgrKykKCQkJCWlmICgoZXJy
ID0gc25kX2N0bF9hZGQoY2FyZCwgc25kX2FjOTdfY25ldygmc25kX2FjOTdfY29udHJvbHNfYWQx
OHh4X2xmZVtpZHhdLCBhYzk3KSkpIDwgMCkKCQkJCQlyZXR1cm4gZXJyOwoJCQlhYzk3LT5zcGVj
LmFkMTh4eC5wY21yZWdbMl0gPSBpbml0X3ZhbDsKCQl9CgkJc25kX2FjOTdfd3JpdGVfY2FjaGUo
YWM5NywgQUM5N19QQ00sIGluaXRfdmFsKTsKCX0gZWxzZSB7CgkJaWYgKGFjOTctPmZsYWdzICYg
QUM5N19IQVNfTk9fUENNX1ZPTCkKCQkJZXJyID0gc25kX2FjOTdfY211dGVfbmV3KGNhcmQsICJQ
Q00gUGxheWJhY2sgU3dpdGNoIiwgQUM5N19QQ00sIGFjOTcpOwoJCWVsc2UKCQkJZXJyID0gc25k
X2FjOTdfY21peF9uZXcoY2FyZCwgIlBDTSBQbGF5YmFjayIsIEFDOTdfUENNLCBhYzk3KTsKCQlp
ZiAoZXJyIDwgMCkKCQkJcmV0dXJuIGVycjsKCX0KCgkvKiBidWlsZCBDYXB0dXJlIGNvbnRyb2xz
ICovCglpZiAoKGVyciA9IHNuZF9jdGxfYWRkKGNhcmQsIHNuZF9hYzk3X2NuZXcoJnNuZF9hYzk3
X2NvbnRyb2xfY2FwdHVyZV9zcmMsIGFjOTcpKSkgPCAwKQoJCXJldHVybiBlcnI7CglpZiAoc25k
X2FjOTdfdHJ5X2JpdChhYzk3LCBBQzk3X1JFQ19HQUlOLCAxNSkpIHsKCQlpZiAoKGVyciA9IHNu
ZF9hYzk3X2NtdXRlX25ldyhjYXJkLCAiQ2FwdHVyZSBTd2l0Y2giLCBBQzk3X1JFQ19HQUlOLCBh
Yzk3KSkgPCAwKQoJCQlyZXR1cm4gZXJyOwoJfQoJaWYgKChlcnIgPSBzbmRfY3RsX2FkZChjYXJk
LCBzbmRfYWM5N19jbmV3KCZzbmRfYWM5N19jb250cm9sX2NhcHR1cmVfdm9sLCBhYzk3KSkpIDwg
MCkKCQlyZXR1cm4gZXJyOwoJc25kX2FjOTdfd3JpdGVfY2FjaGUoYWM5NywgQUM5N19SRUNfU0VM
LCAweDAwMDApOwoJc25kX2FjOTdfd3JpdGVfY2FjaGUoYWM5NywgQUM5N19SRUNfR0FJTiwgMHgw
MDAwKTsKCgkvKiBidWlsZCBNSUMgQ2FwdHVyZSBjb250cm9scyAqLwoJaWYgKHNuZF9hYzk3X3Ry
eV92b2x1bWVfbWl4KGFjOTcsIEFDOTdfUkVDX0dBSU5fTUlDKSkgewoJCWZvciAoaWR4ID0gMDsg
aWR4IDwgMjsgaWR4KyspCgkJCWlmICgoZXJyID0gc25kX2N0bF9hZGQoY2FyZCwgc25kX2FjOTdf
Y25ldygmc25kX2FjOTdfY29udHJvbHNfbWljX2NhcHR1cmVbaWR4XSwgYWM5NykpKSA8IDApCgkJ
CQlyZXR1cm4gZXJyOwoJCXNuZF9hYzk3X3dyaXRlX2NhY2hlKGFjOTcsIEFDOTdfUkVDX0dBSU5f
TUlDLCAweDAwMDApOwoJfQoKCS8qIGJ1aWxkIFBDTSBvdXQgcGF0aCAmIG11dGUgY29udHJvbCAq
LwoJaWYgKHNuZF9hYzk3X3RyeV9iaXQoYWM5NywgQUM5N19HRU5FUkFMX1BVUlBPU0UsIDE1KSkg
ewoJCWlmICgoZXJyID0gc25kX2N0bF9hZGQoY2FyZCwgc25kX2FjOTdfY25ldygmc25kX2FjOTdf
Y29udHJvbHNfZ2VuZXJhbFtBQzk3X0dFTkVSQUxfUENNX09VVF0sIGFjOTcpKSkgPCAwKQoJCQly
ZXR1cm4gZXJyOwoJfQoKCS8qIGJ1aWxkIFNpbXVsYXRlZCBTdGVyZW8gRW5oYW5jZW1lbnQgY29u
dHJvbCAqLwoJaWYgKGFjOTctPmNhcHMgJiAweDAwMDgpIHsKCQlpZiAoKGVyciA9IHNuZF9jdGxf
YWRkKGNhcmQsIHNuZF9hYzk3X2NuZXcoJnNuZF9hYzk3X2NvbnRyb2xzX2dlbmVyYWxbQUM5N19H
RU5FUkFMX1NURVJFT19FTkhBTkNFTUVOVF0sIGFjOTcpKSkgPCAwKQoJCQlyZXR1cm4gZXJyOwoJ
fQoKCS8qIGJ1aWxkIDNEIFN0ZXJlbyBFbmhhbmNlbWVudCBjb250cm9sICovCglpZiAoc25kX2Fj
OTdfdHJ5X2JpdChhYzk3LCBBQzk3X0dFTkVSQUxfUFVSUE9TRSwgMTMpKSB7CgkJaWYgKChlcnIg
PSBzbmRfY3RsX2FkZChjYXJkLCBzbmRfYWM5N19jbmV3KCZzbmRfYWM5N19jb250cm9sc19nZW5l
cmFsW0FDOTdfR0VORVJBTF8zRF0sIGFjOTcpKSkgPCAwKQoJCQlyZXR1cm4gZXJyOwoJfQoKCS8q
IGJ1aWxkIExvdWRuZXNzIGNvbnRyb2wgKi8KCWlmIChhYzk3LT5jYXBzICYgMHgwMDIwKSB7CgkJ
aWYgKChlcnIgPSBzbmRfY3RsX2FkZChjYXJkLCBzbmRfYWM5N19jbmV3KCZzbmRfYWM5N19jb250
cm9sc19nZW5lcmFsW0FDOTdfR0VORVJBTF9MT1VETkVTU10sIGFjOTcpKSkgPCAwKQoJCQlyZXR1
cm4gZXJyOwoJfQoKCS8qIGJ1aWxkIE1vbm8gb3V0cHV0IHNlbGVjdCBjb250cm9sICovCglpZiAo
c25kX2FjOTdfdHJ5X2JpdChhYzk3LCBBQzk3X0dFTkVSQUxfUFVSUE9TRSwgOSkpIHsKCQlpZiAo
KGVyciA9IHNuZF9jdGxfYWRkKGNhcmQsIHNuZF9hYzk3X2NuZXcoJnNuZF9hYzk3X2NvbnRyb2xz
X2dlbmVyYWxbQUM5N19HRU5FUkFMX01PTk9dLCBhYzk3KSkpIDwgMCkKCQkJcmV0dXJuIGVycjsK
CX0KCgkvKiBidWlsZCBNaWMgc2VsZWN0IGNvbnRyb2wgKi8KCWlmIChzbmRfYWM5N190cnlfYml0
KGFjOTcsIEFDOTdfR0VORVJBTF9QVVJQT1NFLCA4KSkgewoJCWlmICgoZXJyID0gc25kX2N0bF9h
ZGQoY2FyZCwgc25kX2FjOTdfY25ldygmc25kX2FjOTdfY29udHJvbHNfZ2VuZXJhbFtBQzk3X0dF
TkVSQUxfTUlDXSwgYWM5NykpKSA8IDApCgkJCXJldHVybiBlcnI7Cgl9CgoJLyogYnVpbGQgQURD
L0RBQyBsb29wYmFjayBjb250cm9sICovCglpZiAoZW5hYmxlX2xvb3BiYWNrICYmIHNuZF9hYzk3
X3RyeV9iaXQoYWM5NywgQUM5N19HRU5FUkFMX1BVUlBPU0UsIDcpKSB7CgkJaWYgKChlcnIgPSBz
bmRfY3RsX2FkZChjYXJkLCBzbmRfYWM5N19jbmV3KCZzbmRfYWM5N19jb250cm9sc19nZW5lcmFs
W0FDOTdfR0VORVJBTF9MT09QQkFDS10sIGFjOTcpKSkgPCAwKQoJCQlyZXR1cm4gZXJyOwoJfQoK
CXNuZF9hYzk3X3VwZGF0ZV9iaXRzKGFjOTcsIEFDOTdfR0VORVJBTF9QVVJQT1NFLCB+QUM5N19H
UF9EUlNTX01BU0ssIDB4MDAwMCk7CgoJLyogYnVpbGQgM0QgY29udHJvbHMgKi8KCWlmIChhYzk3
LT5idWlsZF9vcHMtPmJ1aWxkXzNkKSB7CgkJYWM5Ny0+YnVpbGRfb3BzLT5idWlsZF8zZChhYzk3
KTsKCX0gZWxzZSB7CgkJaWYgKHNuZF9hYzk3X3RyeV92b2x1bWVfbWl4KGFjOTcsIEFDOTdfM0Rf
Q09OVFJPTCkpIHsKCQkJdW5zaWduZWQgc2hvcnQgdmFsOwoJCQl2YWwgPSAweDA3MDc7CgkJCXNu
ZF9hYzk3X3dyaXRlKGFjOTcsIEFDOTdfM0RfQ09OVFJPTCwgdmFsKTsKCQkJdmFsID0gc25kX2Fj
OTdfcmVhZChhYzk3LCBBQzk3XzNEX0NPTlRST0wpOwoJCQl2YWwgPSB2YWwgPT0gMHgwNjA2OwoJ
CQlpZiAoKGVyciA9IHNuZF9jdGxfYWRkKGNhcmQsIGtjdGwgPSBzbmRfYWM5N19jbmV3KCZzbmRf
YWM5N19jb250cm9sc18zZFswXSwgYWM5NykpKSA8IDApCgkJCQlyZXR1cm4gZXJyOwoJCQlpZiAo
dmFsKQoJCQkJa2N0bC0+cHJpdmF0ZV92YWx1ZSA9IEFDOTdfM0RfQ09OVFJPTCB8ICg5IDw8IDgp
IHwgKDcgPDwgMTYpOwoJCQlpZiAoKGVyciA9IHNuZF9jdGxfYWRkKGNhcmQsIGtjdGwgPSBzbmRf
YWM5N19jbmV3KCZzbmRfYWM5N19jb250cm9sc18zZFsxXSwgYWM5NykpKSA8IDApCgkJCQlyZXR1
cm4gZXJyOwoJCQlpZiAodmFsKQoJCQkJa2N0bC0+cHJpdmF0ZV92YWx1ZSA9IEFDOTdfM0RfQ09O
VFJPTCB8ICgxIDw8IDgpIHwgKDcgPDwgMTYpOwoJCQlzbmRfYWM5N193cml0ZV9jYWNoZShhYzk3
LCBBQzk3XzNEX0NPTlRST0wsIDB4MDAwMCk7CgkJfQoJfQoKCS8qIGJ1aWxkIFMvUERJRiBjb250
cm9scyAqLwoJaWYgKGFjOTctPmV4dF9pZCAmIEFDOTdfRUlfU1BESUYpIHsKCQlpZiAoYWM5Ny0+
YnVpbGRfb3BzLT5idWlsZF9zcGRpZikgewoJCQlpZiAoKGVyciA9IGFjOTctPmJ1aWxkX29wcy0+
YnVpbGRfc3BkaWYoYWM5NykpIDwgMCkKCQkJCXJldHVybiBlcnI7CgkJfSBlbHNlIHsKCQkJZm9y
IChpZHggPSAwOyBpZHggPCA1OyBpZHgrKykKCQkJCWlmICgoZXJyID0gc25kX2N0bF9hZGQoY2Fy
ZCwgc25kX2FjOTdfY25ldygmc25kX2FjOTdfY29udHJvbHNfc3BkaWZbaWR4XSwgYWM5NykpKSA8
IDApCgkJCQkJcmV0dXJuIGVycjsKCQkJaWYgKGFjOTctPmJ1aWxkX29wcy0+YnVpbGRfcG9zdF9z
cGRpZikgewoJCQkJaWYgKChlcnIgPSBhYzk3LT5idWlsZF9vcHMtPmJ1aWxkX3Bvc3Rfc3BkaWYo
YWM5NykpIDwgMCkKCQkJCQlyZXR1cm4gZXJyOwoJCQl9CgkJCS8qIHNldCBkZWZhdWx0IFBDTSBT
L1BESUYgcGFyYW1zICovCgkJCS8qIGNvbnN1bWVyLFBDTSBhdWRpbyxubyBjb3B5cmlnaHQsbm8g
cHJlZW1waGFzaXMsUENNIGNvZGVyLG9yaWdpbmFsLDQ4MDAwSHogKi8KCQkJc25kX2FjOTdfd3Jp
dGVfY2FjaGUoYWM5NywgQUM5N19TUERJRiwgMHgyYTIwKTsKCQkJYWM5Ny0+cmF0ZXNbQUM5N19S
QVRFU19TUERJRl0gPSBzbmRfYWM5N19kZXRlcm1pbmVfc3BkaWZfcmF0ZXMoYWM5Nyk7CgkJfQoJ
CWFjOTctPnNwZGlmX3N0YXR1cyA9IFNORFJWX1BDTV9ERUZBVUxUX0NPTl9TUERJRjsKCX0KCQoJ
LyogYnVpbGQgY2hpcCBzcGVjaWZpYyBjb250cm9scyAqLwoJaWYgKGFjOTctPmJ1aWxkX29wcy0+
YnVpbGRfc3BlY2lmaWMpCgkJaWYgKChlcnIgPSBhYzk3LT5idWlsZF9vcHMtPmJ1aWxkX3NwZWNp
ZmljKGFjOTcpKSA8IDApCgkJCXJldHVybiBlcnI7CgoJaWYgKHNuZF9hYzk3X3RyeV9iaXQoYWM5
NywgQUM5N19QT1dFUkRPV04sIDE1KSkgewoJCWtjdGwgPSBzbmRfYWM5N19jbmV3KCZzbmRfYWM5
N19jb250cm9sX2VhcGQsIGFjOTcpOwoJCWlmICghIGtjdGwpCgkJCXJldHVybiAtRU5PTUVNOwoJ
CWlmIChhYzk3LT5zY2FwcyAmIEFDOTdfU0NBUF9JTlZfRUFQRCkKCQkJc2V0X2ludl9lYXBkKGFj
OTcsIGtjdGwpOwoJCWlmICgoZXJyID0gc25kX2N0bF9hZGQoY2FyZCwga2N0bCkpIDwgMCkKCQkJ
cmV0dXJuIGVycjsKCX0KCglyZXR1cm4gMDsKfQoKc3RhdGljIGludCBzbmRfYWM5N19tb2RlbV9i
dWlsZChzbmRfY2FyZF90ICogY2FyZCwgYWM5N190ICogYWM5NykKewoJLyogVE9ETyAqLwoJLy9w
cmludGsoIkFDOTdfR1BJT19DRkcgPSAleFxuIixzbmRfYWM5N19yZWFkKGFjOTcsQUM5N19HUElP
X0NGRykpOwoJc25kX2FjOTdfd3JpdGUoYWM5NywgQUM5N19HUElPX0NGRywgMHhmZmZmICYgfihB
Qzk3X0dQSU9fTElORTFfT0gpKTsKCXNuZF9hYzk3X3dyaXRlKGFjOTcsIEFDOTdfR1BJT19QT0xB
UklUWSwgMHhmZmZmICYgfihBQzk3X0dQSU9fTElORTFfT0gpKTsKCXNuZF9hYzk3X3dyaXRlKGFj
OTcsIEFDOTdfR1BJT19TVElDS1ksIDB4ZmZmZik7CglzbmRfYWM5N193cml0ZShhYzk3LCBBQzk3
X0dQSU9fV0FLRVVQLCAweDApOwoJc25kX2FjOTdfd3JpdGUoYWM5NywgQUM5N19NSVNDX0FGRSwg
MHgwKTsKCXJldHVybiAwOwp9CgpzdGF0aWMgaW50IHNuZF9hYzk3X3Rlc3RfcmF0ZShhYzk3X3Qg
KmFjOTcsIGludCByZWcsIGludCBzaGFkb3dfcmVnLCBpbnQgcmF0ZSkKewoJdW5zaWduZWQgc2hv
cnQgdmFsOwoJdW5zaWduZWQgaW50IHRtcDsKCgl0bXAgPSAoKHVuc2lnbmVkIGludClyYXRlICog
YWM5Ny0+YnVzLT5jbG9jaykgLyA0ODAwMDsKCXNuZF9hYzk3X3dyaXRlX2NhY2hlKGFjOTcsIHJl
ZywgdG1wICYgMHhmZmZmKTsKCWlmIChzaGFkb3dfcmVnKQoJCXNuZF9hYzk3X3dyaXRlX2NhY2hl
KGFjOTcsIHNoYWRvd19yZWcsIHRtcCAmIDB4ZmZmZik7Cgl2YWwgPSBzbmRfYWM5N19yZWFkKGFj
OTcsIHJlZyk7CglyZXR1cm4gdmFsID09ICh0bXAgJiAweGZmZmYpOwp9CgpzdGF0aWMgdm9pZCBz
bmRfYWM5N19kZXRlcm1pbmVfcmF0ZXMoYWM5N190ICphYzk3LCBpbnQgcmVnLCBpbnQgc2hhZG93
X3JlZywgdW5zaWduZWQgaW50ICpyX3Jlc3VsdCkKewoJdW5zaWduZWQgaW50IHJlc3VsdCA9IDA7
CgoJaWYgKGFjOTctPmJ1cy0+bm9fdnJhKSB7CgkJKnJfcmVzdWx0ID0gU05EUlZfUENNX1JBVEVf
NDgwMDA7CgkJaWYgKChhYzk3LT5mbGFncyAmIEFDOTdfRE9VQkxFX1JBVEUpICYmCgkJICAgIHJl
ZyA9PSBBQzk3X1BDTV9GUk9OVF9EQUNfUkFURSkKCQkJKnJfcmVzdWx0IHw9IFNORFJWX1BDTV9S
QVRFXzk2MDAwOwoJCXJldHVybjsKCX0KCglpZiAoKGFjOTctPmV4dF9pZCAmIEFDOTdfRUlfRFJB
KSAmJiByZWcgPT0gQUM5N19QQ01fRlJPTlRfREFDX1JBVEUpCgkJc25kX2FjOTdfdXBkYXRlX2Jp
dHMoYWM5NywgQUM5N19FWFRFTkRFRF9TVEFUVVMsCgkJCQkgICAgIEFDOTdfRUFfRFJBLCAwKTsK
CS8qIHRlc3QgYSBub24tc3RhbmRhcmQgcmF0ZSAqLwoJaWYgKHNuZF9hYzk3X3Rlc3RfcmF0ZShh
Yzk3LCByZWcsIHNoYWRvd19yZWcsIDExMDAwKSkKCQlyZXN1bHQgfD0gU05EUlZfUENNX1JBVEVf
Q09OVElOVU9VUzsKCS8qIGxldCdzIHRyeSB0byBvYnRhaW4gc3RhbmRhcmQgcmF0ZXMgKi8KCWlm
IChzbmRfYWM5N190ZXN0X3JhdGUoYWM5NywgcmVnLCBzaGFkb3dfcmVnLCA4MDAwKSkKCQlyZXN1
bHQgfD0gU05EUlZfUENNX1JBVEVfODAwMDsKCWlmIChzbmRfYWM5N190ZXN0X3JhdGUoYWM5Nywg
cmVnLCBzaGFkb3dfcmVnLCAxMTAyNSkpCgkJcmVzdWx0IHw9IFNORFJWX1BDTV9SQVRFXzExMDI1
OwoJaWYgKHNuZF9hYzk3X3Rlc3RfcmF0ZShhYzk3LCByZWcsIHNoYWRvd19yZWcsIDE2MDAwKSkK
CQlyZXN1bHQgfD0gU05EUlZfUENNX1JBVEVfMTYwMDA7CglpZiAoc25kX2FjOTdfdGVzdF9yYXRl
KGFjOTcsIHJlZywgc2hhZG93X3JlZywgMjIwNTApKQoJCXJlc3VsdCB8PSBTTkRSVl9QQ01fUkFU
RV8yMjA1MDsKCWlmIChzbmRfYWM5N190ZXN0X3JhdGUoYWM5NywgcmVnLCBzaGFkb3dfcmVnLCAz
MjAwMCkpCgkJcmVzdWx0IHw9IFNORFJWX1BDTV9SQVRFXzMyMDAwOwoJaWYgKHNuZF9hYzk3X3Rl
c3RfcmF0ZShhYzk3LCByZWcsIHNoYWRvd19yZWcsIDQ0MTAwKSkKCQlyZXN1bHQgfD0gU05EUlZf
UENNX1JBVEVfNDQxMDA7CglpZiAoc25kX2FjOTdfdGVzdF9yYXRlKGFjOTcsIHJlZywgc2hhZG93
X3JlZywgNDgwMDApKQoJCXJlc3VsdCB8PSBTTkRSVl9QQ01fUkFURV80ODAwMDsKCWlmICgoYWM5
Ny0+ZmxhZ3MgJiBBQzk3X0RPVUJMRV9SQVRFKSAmJgoJICAgIHJlZyA9PSBBQzk3X1BDTV9GUk9O
VF9EQUNfUkFURSkgewoJCS8qIHRlc3Qgc3RhbmRhcmQgZG91YmxlIHJhdGVzICovCgkJc25kX2Fj
OTdfdXBkYXRlX2JpdHMoYWM5NywgQUM5N19FWFRFTkRFRF9TVEFUVVMsCgkJCQkgICAgIEFDOTdf
RUFfRFJBLCBBQzk3X0VBX0RSQSk7CgkJaWYgKHNuZF9hYzk3X3Rlc3RfcmF0ZShhYzk3LCByZWcs
IHNoYWRvd19yZWcsIDY0MDAwIC8gMikpCgkJCXJlc3VsdCB8PSBTTkRSVl9QQ01fUkFURV82NDAw
MDsKCQlpZiAoc25kX2FjOTdfdGVzdF9yYXRlKGFjOTcsIHJlZywgc2hhZG93X3JlZywgODgyMDAg
LyAyKSkKCQkJcmVzdWx0IHw9IFNORFJWX1BDTV9SQVRFXzg4MjAwOwoJCWlmIChzbmRfYWM5N190
ZXN0X3JhdGUoYWM5NywgcmVnLCBzaGFkb3dfcmVnLCA5NjAwMCAvIDIpKQoJCQlyZXN1bHQgfD0g
U05EUlZfUENNX1JBVEVfOTYwMDA7CgkJLyogc29tZSBjb2RlY3MgZG9uJ3Qgc3VwcG9ydCB2YXJp
YWJsZSBkb3VibGUgcmF0ZXMgKi8KCQlpZiAoIXNuZF9hYzk3X3Rlc3RfcmF0ZShhYzk3LCByZWcs
IHNoYWRvd19yZWcsIDc2MTAwIC8gMikpCgkJCXJlc3VsdCAmPSB+U05EUlZfUENNX1JBVEVfQ09O
VElOVU9VUzsKCQlzbmRfYWM5N191cGRhdGVfYml0cyhhYzk3LCBBQzk3X0VYVEVOREVEX1NUQVRV
UywKCQkJCSAgICAgQUM5N19FQV9EUkEsIDApOwoJfQoJKnJfcmVzdWx0ID0gcmVzdWx0Owp9Cgov
KiBjaGVjayBBQzk3X1NQRElGIHJlZ2lzdGVyIHRvIGFjY2VwdCB3aGljaCBzYW1wbGUgcmF0ZXMg
Ki8Kc3RhdGljIHVuc2lnbmVkIGludCBzbmRfYWM5N19kZXRlcm1pbmVfc3BkaWZfcmF0ZXMoYWM5
N190ICphYzk3KQp7Cgl1bnNpZ25lZCBpbnQgcmVzdWx0ID0gMDsKCWludCBpOwoJc3RhdGljIHVu
c2lnbmVkIHNob3J0IGN0bF9iaXRzW10gPSB7CgkJQUM5N19TQ19TUFNSXzQ0SywgQUM5N19TQ19T
UFNSXzMySywgQUM5N19TQ19TUFNSXzQ4SwoJfTsKCXN0YXRpYyB1bnNpZ25lZCBpbnQgcmF0ZV9i
aXRzW10gPSB7CgkJU05EUlZfUENNX1JBVEVfNDQxMDAsIFNORFJWX1BDTV9SQVRFXzMyMDAwLCBT
TkRSVl9QQ01fUkFURV80ODAwMAoJfTsKCglmb3IgKGkgPSAwOyBpIDwgKGludClBUlJBWV9TSVpF
KGN0bF9iaXRzKTsgaSsrKSB7CgkJc25kX2FjOTdfdXBkYXRlX2JpdHMoYWM5NywgQUM5N19TUERJ
RiwgQUM5N19TQ19TUFNSX01BU0ssIGN0bF9iaXRzW2ldKTsKCQlpZiAoKHNuZF9hYzk3X3JlYWQo
YWM5NywgQUM5N19TUERJRikgJiBBQzk3X1NDX1NQU1JfTUFTSykgPT0gY3RsX2JpdHNbaV0pCgkJ
CXJlc3VsdCB8PSByYXRlX2JpdHNbaV07Cgl9CglyZXR1cm4gcmVzdWx0Owp9Cgp2b2lkIHNuZF9h
Yzk3X2dldF9uYW1lKGFjOTdfdCAqYWM5NywgdW5zaWduZWQgaW50IGlkLCBjaGFyICpuYW1lLCBp
bnQgbW9kZW0pCnsKCWNvbnN0IGFjOTdfY29kZWNfaWRfdCAqcGlkOwoKCXNwcmludGYobmFtZSwg
IjB4JXggJWMlYyVjIiwgaWQsCgkJcHJpbnRhYmxlKGlkID4+IDI0KSwKCQlwcmludGFibGUoaWQg
Pj4gMTYpLAoJCXByaW50YWJsZShpZCA+PiA4KSk7Cglmb3IgKHBpZCA9IHNuZF9hYzk3X2NvZGVj
X2lkX3ZlbmRvcnM7IHBpZC0+aWQ7IHBpZCsrKQoJCWlmIChwaWQtPmlkID09IChpZCAmIHBpZC0+
bWFzaykpIHsKCQkJc3RyY3B5KG5hbWUsIHBpZC0+bmFtZSk7CgkJCWlmIChhYzk3KSB7CgkJCQlp
ZiAoIW1vZGVtICYmIHBpZC0+cGF0Y2gpCgkJCQkJcGlkLT5wYXRjaChhYzk3KTsKCQkJCWVsc2Ug
aWYgKG1vZGVtICYmIHBpZC0+bXBhdGNoKQoJCQkJCXBpZC0+bXBhdGNoKGFjOTcpOwoJCQl9IAoJ
CQlnb3RvIF9fdmVuZG9yX29rOwoJCX0KCXJldHVybjsKCiAgICAgIF9fdmVuZG9yX29rOgoJZm9y
IChwaWQgPSBzbmRfYWM5N19jb2RlY19pZHM7IHBpZC0+aWQ7IHBpZCsrKQoJCWlmIChwaWQtPmlk
ID09IChpZCAmIHBpZC0+bWFzaykpIHsKCQkJc3RyY2F0KG5hbWUsICIgIik7CgkJCXN0cmNhdChu
YW1lLCBwaWQtPm5hbWUpOwoJCQlpZiAocGlkLT5tYXNrICE9IDB4ZmZmZmZmZmYpCgkJCQlzcHJp
bnRmKG5hbWUgKyBzdHJsZW4obmFtZSksICIgcmV2ICVkIiwgaWQgJiB+cGlkLT5tYXNrKTsKCQkJ
aWYgKGFjOTcpIHsKCQkJCWlmICghbW9kZW0gJiYgcGlkLT5wYXRjaCkKCQkJCQlwaWQtPnBhdGNo
KGFjOTcpOwoJCQkJZWxzZSBpZiAobW9kZW0gJiYgcGlkLT5tcGF0Y2gpCgkJCQkJcGlkLT5tcGF0
Y2goYWM5Nyk7CgkJCX0KCQkJcmV0dXJuOwoJCX0KCXNwcmludGYobmFtZSArIHN0cmxlbihuYW1l
KSwgIiBpZCAleCIsIGlkICYgMHhmZik7Cn0KCi8qKgogKiBzbmRfYWM5N19nZXRfc2hvcnRfbmFt
ZSAtIHJldHJpZXZlIGNvZGVjIG5hbWUKICogQGFjOTc6IHRoZSBjb2RlYyBpbnN0YW5jZQogKgog
KiBSZXR1cm5zIHRoZSBzaG9ydCBpZGVudGlmeWluZyBuYW1lIG9mIHRoZSBjb2RlYy4KICovCmNv
bnN0IGNoYXIgKnNuZF9hYzk3X2dldF9zaG9ydF9uYW1lKGFjOTdfdCAqYWM5NykKewoJY29uc3Qg
YWM5N19jb2RlY19pZF90ICpwaWQ7CgoJZm9yIChwaWQgPSBzbmRfYWM5N19jb2RlY19pZHM7IHBp
ZC0+aWQ7IHBpZCsrKQoJCWlmIChwaWQtPmlkID09IChhYzk3LT5pZCAmIHBpZC0+bWFzaykpCgkJ
CXJldHVybiBwaWQtPm5hbWU7CglyZXR1cm4gInVua25vd24gY29kZWMiOwp9CgoKLyogd2FpdCBm
b3IgYSB3aGlsZSB1bnRpbCByZWdpc3RlcnMgYXJlIGFjY2Vzc2libGUgYWZ0ZXIgUkVTRVQKICog
cmV0dXJuIDAgaWYgb2ssIG5lZ2F0aXZlIG5vdCByZWFkeQogKi8Kc3RhdGljIGludCBhYzk3X3Jl
c2V0X3dhaXQoYWM5N190ICphYzk3LCBpbnQgdGltZW91dCwgaW50IHdpdGhfbW9kZW0pCnsKCXVu
c2lnbmVkIGxvbmcgZW5kX3RpbWU7Cgl1bnNpZ25lZCBzaG9ydCB2YWw7CgoJZW5kX3RpbWUgPSBq
aWZmaWVzICsgdGltZW91dDsKCWRvIHsKCQkKCQkvKiB1c2UgcHJlbGltaW5hcnkgcmVhZHMgdG8g
c2V0dGxlIHRoZSBjb21tdW5pY2F0aW9uICovCgkJc25kX2FjOTdfcmVhZChhYzk3LCBBQzk3X1JF
U0VUKTsKCQlzbmRfYWM5N19yZWFkKGFjOTcsIEFDOTdfVkVORE9SX0lEMSk7CgkJc25kX2FjOTdf
cmVhZChhYzk3LCBBQzk3X1ZFTkRPUl9JRDIpOwoJCS8qIG1vZGVtPyAqLwoJCWlmICh3aXRoX21v
ZGVtKSB7CgkJCXZhbCA9IHNuZF9hYzk3X3JlYWQoYWM5NywgQUM5N19FWFRFTkRFRF9NSUQpOwoJ
CQlpZiAodmFsICE9IDB4ZmZmZiAmJiAodmFsICYgMSkgIT0gMCkKCQkJCXJldHVybiAwOwoJCX0K
CQlpZiAoYWM5Ny0+c2NhcHMgJiBBQzk3X1NDQVBfREVURUNUX0JZX1ZFTkRPUikgewoJCQkvKiBw
cm9iYWJseSBvbmx5IFhib3ggaXNzdWUgLSBhbGwgcmVnaXN0ZXJzIGFyZSByZWFkIGFzIHplcm8g
Ki8KCQkJdmFsID0gc25kX2FjOTdfcmVhZChhYzk3LCBBQzk3X1ZFTkRPUl9JRDEpOwoJCQlpZiAo
dmFsICE9IDAgJiYgdmFsICE9IDB4ZmZmZikKCQkJCXJldHVybiAwOwoJCX0gZWxzZSB7CgkJCS8q
IGJlY2F1c2UgdGhlIFBDTSBvciBNQVNURVIgdm9sdW1lIHJlZ2lzdGVycyBjYW4gYmUgbW9kaWZp
ZWQsCgkJCSAqIHRoZSBSRUNfR0FJTiByZWdpc3RlciBpcyB1c2VkIGZvciB0ZXN0cwoJCQkgKi8K
CQkJLyogdGVzdCBpZiB3ZSBjYW4gd3JpdGUgdG8gdGhlIHJlY29yZCBnYWluIHZvbHVtZSByZWdp
c3RlciAqLwoJCQlzbmRfYWM5N193cml0ZV9jYWNoZShhYzk3LCBBQzk3X1JFQ19HQUlOLCAweDhh
MDUpOwoJCQlpZiAoKHNuZF9hYzk3X3JlYWQoYWM5NywgQUM5N19SRUNfR0FJTikgJiAweDdmZmYp
ID09IDB4MGEwNSkKCQkJCXJldHVybiAwOwoJCX0KCQlzZXRfY3VycmVudF9zdGF0ZShUQVNLX1VO
SU5URVJSVVBUSUJMRSk7CgkJc2NoZWR1bGVfdGltZW91dCgxKTsKCX0gd2hpbGUgKHRpbWVfYWZ0
ZXJfZXEoZW5kX3RpbWUsIGppZmZpZXMpKTsKCXJldHVybiAtRU5PREVWOwp9CgovKioKICogc25k
X2FjOTdfYnVzIC0gY3JlYXRlIGFuIEFDOTcgYnVzIGNvbXBvbmVudAogKiBAY2FyZDogdGhlIGNh
cmQgaW5zdGFuY2UKICogQG51bTogdGhlIGJ1cyBudW1iZXIKICogQG9wczogdGhlIGJ1cyBjYWxs
YmFja3MgdGFibGUKICogQHByaXZhdGVfZGF0YTogcHJpdmF0ZSBkYXRhIHBvaW50ZXIgZm9yIHRo
ZSBuZXcgaW5zdGFuY2UKICogQHJidXM6IHRoZSBwb2ludGVyIHRvIHN0b3JlIHRoZSBuZXcgQUM5
NyBidXMgaW5zdGFuY2UuCiAqCiAqIENyZWF0ZXMgYW4gQUM5NyBidXMgY29tcG9uZW50LiAgQW4g
YWM5N19idXNfdCBpbnN0YW5jZSBpcyBuZXdseQogKiBhbGxvY2F0ZWQgYW5kIGluaXRpYWxpemVk
LgogKgogKiBUaGUgb3BzIHRhYmxlIG11c3QgaW5jbHVkZSB2YWxpZCBjYWxsYmFja3MgKGF0IGxl
YXN0IHJlYWQgYW5kCiAqIHdyaXRlKS4gIFRoZSBvdGhlciBjYWxsYmFja3MsIHdhaXQgYW5kIHJl
c2V0LCBhcmUgbm90IG1hbmRhdG9yeS4KICogCiAqIFRoZSBjbG9jayBpcyBzZXQgdG8gNDgwMDAu
ICBJZiBhbm90aGVyIGNsb2NrIGlzIG5lZWRlZCwgc2V0CiAqICgqcmJ1cyktPmNsb2NrIG1hbnVh
bGx5LgogKgogKiBUaGUgQUM5NyBidXMgaW5zdGFuY2UgaXMgcmVnaXN0ZXJlZCBhcyBhIGxvdy1s
ZXZlbCBkZXZpY2UsIHNvIHlvdSBkb24ndAogKiBoYXZlIHRvIHJlbGVhc2UgaXQgbWFudWFsbHku
CiAqCiAqIFJldHVybnMgemVybyBpZiBzdWNjZXNzZnVsLCBvciBhIG5lZ2F0aXZlIGVycm9yIGNv
ZGUgb24gZmFpbHVyZS4KICovCmludCBzbmRfYWM5N19idXMoc25kX2NhcmRfdCAqY2FyZCwgaW50
IG51bSwgYWM5N19idXNfb3BzX3QgKm9wcywKCQkgdm9pZCAqcHJpdmF0ZV9kYXRhLCBhYzk3X2J1
c190ICoqcmJ1cykKewoJaW50IGVycjsKCWFjOTdfYnVzX3QgKmJ1czsKCXN0YXRpYyBzbmRfZGV2
aWNlX29wc190IGRldl9vcHMgPSB7CgkJLmRldl9mcmVlID0Jc25kX2FjOTdfYnVzX2Rldl9mcmVl
LAoJfTsKCglzbmRfYXNzZXJ0KGNhcmQgIT0gTlVMTCwgcmV0dXJuIC1FSU5WQUwpOwoJc25kX2Fz
c2VydChyYnVzICE9IE5VTEwsIHJldHVybiAtRUlOVkFMKTsKCWJ1cyA9IGtjYWxsb2MoMSwgc2l6
ZW9mKCpidXMpLCBHRlBfS0VSTkVMKTsKCWlmIChidXMgPT0gTlVMTCkKCQlyZXR1cm4gLUVOT01F
TTsKCWJ1cy0+Y2FyZCA9IGNhcmQ7CglidXMtPm51bSA9IG51bTsKCWJ1cy0+b3BzID0gb3BzOwoJ
YnVzLT5wcml2YXRlX2RhdGEgPSBwcml2YXRlX2RhdGE7CglidXMtPmNsb2NrID0gNDgwMDA7Cglz
cGluX2xvY2tfaW5pdCgmYnVzLT5idXNfbG9jayk7CglzbmRfYWM5N19idXNfcHJvY19pbml0KGJ1
cyk7CglpZiAoKGVyciA9IHNuZF9kZXZpY2VfbmV3KGNhcmQsIFNORFJWX0RFVl9CVVMsIGJ1cywg
JmRldl9vcHMpKSA8IDApIHsKCQlzbmRfYWM5N19idXNfZnJlZShidXMpOwoJCXJldHVybiBlcnI7
Cgl9CgkqcmJ1cyA9IGJ1czsKCXJldHVybiAwOwp9CgovKiBidWlsZF9vcHMgdG8gZG8gbm90aGlu
ZyAqLwpzdGF0aWMgc3RydWN0IHNuZF9hYzk3X2J1aWxkX29wcyBudWxsX2J1aWxkX29wczsKCi8q
KgogKiBzbmRfYWM5N19taXhlciAtIGNyZWF0ZSBhbiBDb2RlYzk3IGNvbXBvbmVudAogKiBAYnVz
OiB0aGUgQUM5NyBidXMgd2hpY2ggY29kZWMgaXMgYXR0YWNoZWQgdG8KICogQHRlbXBsYXRlOiB0
aGUgdGVtcGxhdGUgb2YgYWM5NywgaW5jbHVkaW5nIGluZGV4LCBjYWxsYmFja3MgYW5kCiAqICAg
ICAgICAgdGhlIHByaXZhdGUgZGF0YS4KICogQHJhYzk3OiB0aGUgcG9pbnRlciB0byBzdG9yZSB0
aGUgbmV3IGFjOTcgaW5zdGFuY2UuCiAqCiAqIENyZWF0ZXMgYW4gQ29kZWM5NyBjb21wb25lbnQu
ICBBbiBhYzk3X3QgaW5zdGFuY2UgaXMgbmV3bHkKICogYWxsb2NhdGVkIGFuZCBpbml0aWFsaXpl
ZCBmcm9tIHRoZSB0ZW1wbGF0ZS4gIFRoZSBjb2RlYwogKiBpcyB0aGVuIGluaXRpYWxpemVkIGJ5
IHRoZSBzdGFuZGFyZCBwcm9jZWR1cmUuCiAqCiAqIFRoZSB0ZW1wbGF0ZSBtdXN0IGluY2x1ZGUg
dGhlIGNvZGVjIG51bWJlciAobnVtKSBhbmQgYWRkcmVzcyAoYWRkciksCiAqIGFuZCB0aGUgcHJp
dmF0ZSBkYXRhIChwcml2YXRlX2RhdGEpLgogKiAKICogVGhlIGFjOTcgaW5zdGFuY2UgaXMgcmVn
aXN0ZXJlZCBhcyBhIGxvdy1sZXZlbCBkZXZpY2UsIHNvIHlvdSBkb24ndAogKiBoYXZlIHRvIHJl
bGVhc2UgaXQgbWFudWFsbHkuCiAqCiAqIFJldHVybnMgemVybyBpZiBzdWNjZXNzZnVsLCBvciBh
IG5lZ2F0aXZlIGVycm9yIGNvZGUgb24gZmFpbHVyZS4KICovCmludCBzbmRfYWM5N19taXhlcihh
Yzk3X2J1c190ICpidXMsIGFjOTdfdGVtcGxhdGVfdCAqdGVtcGxhdGUsIGFjOTdfdCAqKnJhYzk3
KQp7CglpbnQgZXJyOwoJYWM5N190ICphYzk3OwoJc25kX2NhcmRfdCAqY2FyZDsKCWNoYXIgbmFt
ZVs2NF07Cgl1bnNpZ25lZCBsb25nIGVuZF90aW1lOwoJdW5zaWduZWQgaW50IHJlZzsKCXN0YXRp
YyBzbmRfZGV2aWNlX29wc190IG9wcyA9IHsKCQkuZGV2X2ZyZWUgPQlzbmRfYWM5N19kZXZfZnJl
ZSwKCX07CgoJc25kX2Fzc2VydChyYWM5NyAhPSBOVUxMLCByZXR1cm4gLUVJTlZBTCk7CgkqcmFj
OTcgPSBOVUxMOwoJc25kX2Fzc2VydChidXMgIT0gTlVMTCAmJiB0ZW1wbGF0ZSAhPSBOVUxMLCBy
ZXR1cm4gLUVJTlZBTCk7CglzbmRfYXNzZXJ0KHRlbXBsYXRlLT5udW0gPCA0ICYmIGJ1cy0+Y29k
ZWNbdGVtcGxhdGUtPm51bV0gPT0gTlVMTCwgcmV0dXJuIC1FSU5WQUwpOwoKCXNuZF9hc3NlcnQo
YnVzLT5zaGFyZWRfdHlwZSA8PSBBQzk3X1NIQVJFRF9UWVBFUywgcmV0dXJuIC1FSU5WQUwpOwoJ
aWYgKGJ1cy0+c2hhcmVkX3R5cGUpIHsKCQkvKiBhbHJlYWR5IHNoYXJlZD8gKi8KCQlkb3duKCZz
aGFyZWRfY29kZWNfbXV0ZXgpOwoJCWFjOTcgPSBzaGFyZWRfY29kZWNbYnVzLT5zaGFyZWRfdHlw
ZS0xXVt0ZW1wbGF0ZS0+bnVtXTsKCQlpZiAoYWM5NykgewoJCQlpZiAoKGFjOTdfaXNfYXVkaW8o
YWM5NykgJiYgKHRlbXBsYXRlLT5zY2FwcyAmIEFDOTdfU0NBUF9TS0lQX0FVRElPKSkgfHwKCQkJ
ICAgIChhYzk3X2lzX21vZGVtKGFjOTcpICYmICh0ZW1wbGF0ZS0+c2NhcHMgJiBBQzk3X1NDQVBf
U0tJUF9NT0RFTSkpKSB7CgkJCQl1cCgmc2hhcmVkX2NvZGVjX211dGV4KTsKCQkJCXJldHVybiAt
RUFDQ0VTOyAvKiBza2lwIHRoaXMgKi8KCQkJfQoJCX0KCQl1cCgmc2hhcmVkX2NvZGVjX211dGV4
KTsKCX0KCgljYXJkID0gYnVzLT5jYXJkOwoJYWM5NyA9IGtjYWxsb2MoMSwgc2l6ZW9mKCphYzk3
KSwgR0ZQX0tFUk5FTCk7CglpZiAoYWM5NyA9PSBOVUxMKQoJCXJldHVybiAtRU5PTUVNOwoJYWM5
Ny0+cHJpdmF0ZV9kYXRhID0gdGVtcGxhdGUtPnByaXZhdGVfZGF0YTsKCWFjOTctPnByaXZhdGVf
ZnJlZSA9IHRlbXBsYXRlLT5wcml2YXRlX2ZyZWU7CglhYzk3LT5idXMgPSBidXM7CglhYzk3LT5w
Y2kgPSB0ZW1wbGF0ZS0+cGNpOwoJYWM5Ny0+bnVtID0gdGVtcGxhdGUtPm51bTsKCWFjOTctPmFk
ZHIgPSB0ZW1wbGF0ZS0+YWRkcjsKCWFjOTctPnNjYXBzID0gdGVtcGxhdGUtPnNjYXBzOwoJYWM5
Ny0+bGltaXRlZF9yZWdzID0gdGVtcGxhdGUtPmxpbWl0ZWRfcmVnczsKCW1lbWNweShhYzk3LT5y
ZWdfYWNjZXNzZWQsIHRlbXBsYXRlLT5yZWdfYWNjZXNzZWQsIHNpemVvZihhYzk3LT5yZWdfYWNj
ZXNzZWQpKTsKCWJ1cy0+Y29kZWNbYWM5Ny0+bnVtXSA9IGFjOTc7Cglpbml0X01VVEVYKCZhYzk3
LT5yZWdfbXV0ZXgpOwoJaW5pdF9NVVRFWCgmYWM5Ny0+cGFnZV9tdXRleCk7CgoJaWYgKGFjOTct
PnBjaSkgewoJCXBjaV9yZWFkX2NvbmZpZ193b3JkKGFjOTctPnBjaSwgUENJX1NVQlNZU1RFTV9W
RU5ET1JfSUQsICZhYzk3LT5zdWJzeXN0ZW1fdmVuZG9yKTsKCQlwY2lfcmVhZF9jb25maWdfd29y
ZChhYzk3LT5wY2ksIFBDSV9TVUJTWVNURU1fSUQsICZhYzk3LT5zdWJzeXN0ZW1fZGV2aWNlKTsK
CX0KCWlmIChidXMtPm9wcy0+cmVzZXQpIHsKCQlidXMtPm9wcy0+cmVzZXQoYWM5Nyk7CgkJZ290
byBfX2FjY2Vzc19vazsKCX0KCglzbmRfYWM5N193cml0ZShhYzk3LCBBQzk3X1JFU0VULCAwKTsJ
LyogcmVzZXQgdG8gZGVmYXVsdHMgKi8KCWlmIChidXMtPm9wcy0+d2FpdCkKCQlidXMtPm9wcy0+
d2FpdChhYzk3KTsKCWVsc2UgewoJCXVkZWxheSg1MCk7CgkJaWYgKGFjOTctPnNjYXBzICYgQUM5
N19TQ0FQX1NLSVBfQVVESU8pCgkJCWVyciA9IGFjOTdfcmVzZXRfd2FpdChhYzk3LCBIWi8yLCAx
KTsKCQllbHNlIHsKCQkJZXJyID0gYWM5N19yZXNldF93YWl0KGFjOTcsIEhaLzIsIDApOwoJCQlp
ZiAoZXJyIDwgMCkKCQkJCWVyciA9IGFjOTdfcmVzZXRfd2FpdChhYzk3LCBIWi8yLCAxKTsKCQl9
CgkJaWYgKGVyciA8IDApIHsKCQkJc25kX3ByaW50ayhLRVJOX1dBUk5JTkcgIkFDJzk3ICVkIGRv
ZXMgbm90IHJlc3BvbmQgLSBSRVNFVFxuIiwgYWM5Ny0+bnVtKTsKCQkJLyogcHJvY2VlZCBhbnl3
YXkgLSBpdCdzIG9mdGVuIG5vbi1jcml0aWNhbCAqLwoJCX0KCX0KICAgICAgX19hY2Nlc3Nfb2s6
CglhYzk3LT5pZCA9IHNuZF9hYzk3X3JlYWQoYWM5NywgQUM5N19WRU5ET1JfSUQxKSA8PCAxNjsK
CWFjOTctPmlkIHw9IHNuZF9hYzk3X3JlYWQoYWM5NywgQUM5N19WRU5ET1JfSUQyKTsKCWlmICgh
IChhYzk3LT5zY2FwcyAmIEFDOTdfU0NBUF9ERVRFQ1RfQllfVkVORE9SKSAmJgoJICAgIChhYzk3
LT5pZCA9PSAweDAwMDAwMDAwIHx8IGFjOTctPmlkID09IDB4ZmZmZmZmZmYpKSB7CgkJc25kX3By
aW50ayhLRVJOX0VSUiAiQUMnOTcgJWQgYWNjZXNzIGlzIG5vdCB2YWxpZCBbMHgleF0sIHJlbW92
aW5nIG1peGVyLlxuIiwgYWM5Ny0+bnVtLCBhYzk3LT5pZCk7CgkJc25kX2FjOTdfZnJlZShhYzk3
KTsKCQlyZXR1cm4gLUVJTzsKCX0KCQoJLyogdGVzdCBmb3IgQUMnOTcgKi8KCWlmICghKGFjOTct
PnNjYXBzICYgQUM5N19TQ0FQX1NLSVBfQVVESU8pICYmICEoYWM5Ny0+c2NhcHMgJiBBQzk3X1ND
QVBfQVVESU8pKSB7CgkgICAgICAgaWYgKChhYzk3LT5zY2FwcyAmIEFDOTdfU0NBUF9ERVRFQ1Rf
QllfVkVORE9SKSkKCSAgICAgICAgICAgICAgIGFjOTctPnNjYXBzIHw9IEFDOTdfU0NBUF9BVURJ
TzsKCSAgICAgICBlbHNlIHsKCSAgICAgICAgIC8qIHRlc3QgaWYgd2UgY2FuIHdyaXRlIHRvIHRo
ZSByZWNvcmQgZ2FpbiB2b2x1bWUgcmVnaXN0ZXIgKi8KCSAgICAgICAgIHNuZF9hYzk3X3dyaXRl
X2NhY2hlKGFjOTcsIEFDOTdfUkVDX0dBSU4sIDB4OGEwNik7CgkgICAgICAgICBpZiAoKChlcnIg
PSBzbmRfYWM5N19yZWFkKGFjOTcsIEFDOTdfUkVDX0dBSU4pKSAmIDB4N2ZmZikgPT0gMHgwYTA2
KQoJICAgICAgICAgICAgICAgICBhYzk3LT5zY2FwcyB8PSBBQzk3X1NDQVBfQVVESU87CgkgICAg
ICB9Cgl9CgoJaWYgKGFjOTctPnNjYXBzICYgQUM5N19TQ0FQX0FVRElPKSB7CgkJYWM5Ny0+Y2Fw
cyA9IHNuZF9hYzk3X3JlYWQoYWM5NywgQUM5N19SRVNFVCk7CgkJYWM5Ny0+ZXh0X2lkID0gc25k
X2FjOTdfcmVhZChhYzk3LCBBQzk3X0VYVEVOREVEX0lEKTsKCQlpZiAoYWM5Ny0+ZXh0X2lkID09
IDB4ZmZmZikJLyogaW52YWxpZCBjb21iaW5hdGlvbiAqLwoJCQlhYzk3LT5leHRfaWQgPSAwOwoJ
fQoKCS8qIHRlc3QgZm9yIE1DJzk3ICovCglpZiAoIShhYzk3LT5zY2FwcyAmIEFDOTdfU0NBUF9T
S0lQX01PREVNKSAmJiAhKGFjOTctPnNjYXBzICYgQUM5N19TQ0FQX01PREVNKSkgewoJCWFjOTct
PmV4dF9taWQgPSBzbmRfYWM5N19yZWFkKGFjOTcsIEFDOTdfRVhURU5ERURfTUlEKTsKCQlpZiAo
YWM5Ny0+ZXh0X21pZCA9PSAweGZmZmYpCS8qIGludmFsaWQgY29tYmluYXRpb24gKi8KCQkJYWM5
Ny0+ZXh0X21pZCA9IDA7CgkJaWYgKGFjOTctPmV4dF9taWQgJiAxKQoJCQlhYzk3LT5zY2FwcyB8
PSBBQzk3X1NDQVBfTU9ERU07Cgl9CgoJaWYgKCFhYzk3X2lzX2F1ZGlvKGFjOTcpICYmICFhYzk3
X2lzX21vZGVtKGFjOTcpKSB7CgkJaWYgKCEoYWM5Ny0+c2NhcHMgJiAoQUM5N19TQ0FQX1NLSVBf
QVVESU98QUM5N19TQ0FQX1NLSVBfTU9ERU0pKSkKCQkJc25kX3ByaW50ayhLRVJOX0VSUiAiQUMn
OTcgJWQgYWNjZXNzIGVycm9yIChub3QgYXVkaW8gb3IgbW9kZW0gY29kZWMpXG4iLCBhYzk3LT5u
dW0pOwoJCXNuZF9hYzk3X2ZyZWUoYWM5Nyk7CgkJcmV0dXJuIC1FQUNDRVM7Cgl9CgoJaWYgKGJ1
cy0+b3BzLT5yZXNldCkgLy8gRklYTUU6IGFsd2F5cyBza2lwcGluZz8KCQlnb3RvIF9fcmVhZHlf
b2s7CgoJLyogRklYTUU6IGFkZCBwb3dlcmRvd24gY29udHJvbCAqLwoJaWYgKGFjOTdfaXNfYXVk
aW8oYWM5NykpIHsKCQkvKiBub3RoaW5nIHNob3VsZCBiZSBpbiBwb3dlcmRvd24gbW9kZSAqLwoJ
CXNuZF9hYzk3X3dyaXRlX2NhY2hlKGFjOTcsIEFDOTdfUE9XRVJET1dOLCAwKTsKCQlzbmRfYWM5
N193cml0ZV9jYWNoZShhYzk3LCBBQzk3X1JFU0VULCAwKTsJCS8qIHJlc2V0IHRvIGRlZmF1bHRz
ICovCgkJdWRlbGF5KDEwMCk7CgkJLyogbm90aGluZyBzaG91bGQgYmUgaW4gcG93ZXJkb3duIG1v
ZGUgKi8KCQlzbmRfYWM5N193cml0ZV9jYWNoZShhYzk3LCBBQzk3X1BPV0VSRE9XTiwgMCk7CgkJ
c25kX2FjOTdfd3JpdGVfY2FjaGUoYWM5NywgQUM5N19HRU5FUkFMX1BVUlBPU0UsIDApOwoJCWVu
ZF90aW1lID0gamlmZmllcyArIChIWiAvIDEwKTsKCQlkbyB7CgkJCWlmICgoc25kX2FjOTdfcmVh
ZChhYzk3LCBBQzk3X1BPV0VSRE9XTikgJiAweDBmKSA9PSAweDBmKQoJCQkJZ290byBfX3JlYWR5
X29rOwoJCQlzZXRfY3VycmVudF9zdGF0ZShUQVNLX1VOSU5URVJSVVBUSUJMRSk7CgkJCXNjaGVk
dWxlX3RpbWVvdXQoMSk7CgkJfSB3aGlsZSAodGltZV9hZnRlcl9lcShlbmRfdGltZSwgamlmZmll
cykpOwoJCXNuZF9wcmludGsoS0VSTl9XQVJOSU5HICJBQyc5NyAlZCBhbmFsb2cgc3Vic2VjdGlv
bnMgbm90IHJlYWR5XG4iLCBhYzk3LT5udW0pOwoJfQoKCS8qIEZJWE1FOiBhZGQgcG93ZXJkb3du
IGNvbnRyb2wgKi8KCWlmIChhYzk3X2lzX21vZGVtKGFjOTcpKSB7CgkJdW5zaWduZWQgY2hhciB0
bXA7CgoJCS8qIG5vdGhpbmcgc2hvdWxkIGJlIGluIHBvd2VyZG93biBtb2RlICovCgkJLyogbm90
ZTogaXQncyBpbXBvcnRhbnQgdG8gc2V0IHRoZSByYXRlIGF0IGZpcnN0ICovCgkJdG1wID0gQUM5
N19NRUFfR1BJTzsKCQlpZiAoYWM5Ny0+ZXh0X21pZCAmIEFDOTdfTUVJX0xJTkUxKSB7CgkJCXNu
ZF9hYzk3X3dyaXRlX2NhY2hlKGFjOTcsIEFDOTdfTElORTFfUkFURSwgMTIwMDApOwoJCQl0bXAg
fD0gQUM5N19NRUFfQURDMSB8IEFDOTdfTUVBX0RBQzE7CgkJfQoJCWlmIChhYzk3LT5leHRfbWlk
ICYgQUM5N19NRUlfTElORTIpIHsKCQkJc25kX2FjOTdfd3JpdGVfY2FjaGUoYWM5NywgQUM5N19M
SU5FMl9SQVRFLCAxMjAwMCk7CgkJCXRtcCB8PSBBQzk3X01FQV9BREMyIHwgQUM5N19NRUFfREFD
MjsKCQl9CgkJaWYgKGFjOTctPmV4dF9taWQgJiBBQzk3X01FSV9IQU5EU0VUKSB7CgkJCXNuZF9h
Yzk3X3dyaXRlX2NhY2hlKGFjOTcsIEFDOTdfSEFORFNFVF9SQVRFLCAxMjAwMCk7CgkJCXRtcCB8
PSBBQzk3X01FQV9IQURDIHwgQUM5N19NRUFfSERBQzsKCQl9CgkJc25kX2FjOTdfd3JpdGVfY2Fj
aGUoYWM5NywgQUM5N19FWFRFTkRFRF9NU1RBVFVTLCAweGZmMDAgJiB+KHRtcCA8PCA4KSk7CgkJ
dWRlbGF5KDEwMCk7CgkJLyogbm90aGluZyBzaG91bGQgYmUgaW4gcG93ZXJkb3duIG1vZGUgKi8K
CQlzbmRfYWM5N193cml0ZV9jYWNoZShhYzk3LCBBQzk3X0VYVEVOREVEX01TVEFUVVMsIDB4ZmYw
MCAmIH4odG1wIDw8IDgpKTsKCQllbmRfdGltZSA9IGppZmZpZXMgKyAoSFogLyAxMCk7CgkJZG8g
ewoJCQlpZiAoKHNuZF9hYzk3X3JlYWQoYWM5NywgQUM5N19FWFRFTkRFRF9NU1RBVFVTKSAmIHRt
cCkgPT0gdG1wKQoJCQkJZ290byBfX3JlYWR5X29rOwoJCQlzZXRfY3VycmVudF9zdGF0ZShUQVNL
X1VOSU5URVJSVVBUSUJMRSk7CgkJCXNjaGVkdWxlX3RpbWVvdXQoMSk7CgkJfSB3aGlsZSAodGlt
ZV9hZnRlcl9lcShlbmRfdGltZSwgamlmZmllcykpOwoJCXNuZF9wcmludGsoS0VSTl9XQVJOSU5H
ICJNQyc5NyAlZCBjb252ZXJ0ZXJzIGFuZCBHUElPIG5vdCByZWFkeSAoMHgleClcbiIsIGFjOTct
Pm51bSwgc25kX2FjOTdfcmVhZChhYzk3LCBBQzk3X0VYVEVOREVEX01TVEFUVVMpKTsKCX0KCQog
ICAgICBfX3JlYWR5X29rOgoJaWYgKGFjOTdfaXNfYXVkaW8oYWM5NykpCgkJYWM5Ny0+YWRkciA9
IChhYzk3LT5leHRfaWQgJiBBQzk3X0VJX0FERFJfTUFTSykgPj4gQUM5N19FSV9BRERSX1NISUZU
OwoJZWxzZQoJCWFjOTctPmFkZHIgPSAoYWM5Ny0+ZXh0X21pZCAmIEFDOTdfTUVJX0FERFJfTUFT
SykgPj4gQUM5N19NRUlfQUREUl9TSElGVDsKCWlmIChhYzk3LT5leHRfaWQgJiAweDAxYzkpIHsJ
LyogTC9SLCBNSUMsIFNEQUMsIExEQUMgVlJBIHN1cHBvcnQgKi8KCQlyZWcgPSBzbmRfYWM5N19y
ZWFkKGFjOTcsIEFDOTdfRVhURU5ERURfU1RBVFVTKTsKCQlyZWcgfD0gYWM5Ny0+ZXh0X2lkICYg
MHgwMWMwOyAvKiBMREFDL1NEQUMvQ0RBQyAqLwoJCWlmICghIGJ1cy0+bm9fdnJhKQoJCQlyZWcg
fD0gYWM5Ny0+ZXh0X2lkICYgMHgwMDA5OyAvKiBWUkEvVlJNICovCgkJc25kX2FjOTdfd3JpdGVf
Y2FjaGUoYWM5NywgQUM5N19FWFRFTkRFRF9TVEFUVVMsIHJlZyk7Cgl9CglpZiAoKGFjOTctPmV4
dF9pZCAmIEFDOTdfRUlfRFJBKSAmJiBidXMtPmRyYSkgewoJCS8qIEludGVsIGNvbnRyb2xsZXJz
IHJlcXVpcmUgZG91YmxlIHJhdGUgZGF0YSB0byBiZSBwdXQgaW4KCQkgKiBzbG90cyA3KzgsIHNv
IGxldCdzIGhvcGUgdGhlIGNvZGVjIHN1cHBvcnRzIGl0LiAqLwoJCXNuZF9hYzk3X3VwZGF0ZV9i
aXRzKGFjOTcsIEFDOTdfR0VORVJBTF9QVVJQT1NFLCBBQzk3X0dQX0RSU1NfTUFTSywgQUM5N19H
UF9EUlNTXzc4KTsKCQlpZiAoKHNuZF9hYzk3X3JlYWQoYWM5NywgQUM5N19HRU5FUkFMX1BVUlBP
U0UpICYgQUM5N19HUF9EUlNTX01BU0spID09IEFDOTdfR1BfRFJTU183OCkKCQkJYWM5Ny0+Zmxh
Z3MgfD0gQUM5N19ET1VCTEVfUkFURTsKCX0KCWlmIChhYzk3LT5leHRfaWQgJiBBQzk3X0VJX1ZS
QSkgewkvKiBWUkEgc3VwcG9ydCAqLwoJCXNuZF9hYzk3X2RldGVybWluZV9yYXRlcyhhYzk3LCBB
Qzk3X1BDTV9GUk9OVF9EQUNfUkFURSwgMCwgJmFjOTctPnJhdGVzW0FDOTdfUkFURVNfRlJPTlRf
REFDXSk7CgkJc25kX2FjOTdfZGV0ZXJtaW5lX3JhdGVzKGFjOTcsIEFDOTdfUENNX0xSX0FEQ19S
QVRFLCAwLCAmYWM5Ny0+cmF0ZXNbQUM5N19SQVRFU19BRENdKTsKCX0gZWxzZSB7CgkJYWM5Ny0+
cmF0ZXNbQUM5N19SQVRFU19GUk9OVF9EQUNdID0gU05EUlZfUENNX1JBVEVfNDgwMDA7CgkJaWYg
KGFjOTctPmZsYWdzICYgQUM5N19ET1VCTEVfUkFURSkKCQkJYWM5Ny0+cmF0ZXNbQUM5N19SQVRF
U19GUk9OVF9EQUNdIHw9IFNORFJWX1BDTV9SQVRFXzk2MDAwOwoJCWFjOTctPnJhdGVzW0FDOTdf
UkFURVNfQURDXSA9IFNORFJWX1BDTV9SQVRFXzQ4MDAwOwoJfQoJaWYgKGFjOTctPmV4dF9pZCAm
IEFDOTdfRUlfU1BESUYpIHsKCQkvKiBjb2RlYyBzcGVjaWZpYyBjb2RlIChwYXRjaCkgc2hvdWxk
IG92ZXJyaWRlIHRoZXNlIHZhbHVlcyAqLwoJCWFjOTctPnJhdGVzW0FDOTdfUkFURVNfU1BESUZd
ID0gU05EUlZfUENNX1JBVEVfNDgwMDAgfCBTTkRSVl9QQ01fUkFURV80NDEwMCB8IFNORFJWX1BD
TV9SQVRFXzMyMDAwOwoJfQoJaWYgKGFjOTctPmV4dF9pZCAmIEFDOTdfRUlfVlJNKSB7CS8qIE1J
QyBWUkEgc3VwcG9ydCAqLwoJCXNuZF9hYzk3X2RldGVybWluZV9yYXRlcyhhYzk3LCBBQzk3X1BD
TV9NSUNfQURDX1JBVEUsIDAsICZhYzk3LT5yYXRlc1tBQzk3X1JBVEVTX01JQ19BRENdKTsKCX0g
ZWxzZSB7CgkJYWM5Ny0+cmF0ZXNbQUM5N19SQVRFU19NSUNfQURDXSA9IFNORFJWX1BDTV9SQVRF
XzQ4MDAwOwoJfQoJaWYgKGFjOTctPmV4dF9pZCAmIEFDOTdfRUlfU0RBQykgewkvKiBTREFDIHN1
cHBvcnQgKi8KCQlzbmRfYWM5N19kZXRlcm1pbmVfcmF0ZXMoYWM5NywgQUM5N19QQ01fU1VSUl9E
QUNfUkFURSwgQUM5N19QQ01fRlJPTlRfREFDX1JBVEUsICZhYzk3LT5yYXRlc1tBQzk3X1JBVEVT
X1NVUlJfREFDXSk7CgkJYWM5Ny0+c2NhcHMgfD0gQUM5N19TQ0FQX1NVUlJPVU5EX0RBQzsKCX0K
CWlmIChhYzk3LT5leHRfaWQgJiBBQzk3X0VJX0xEQUMpIHsJLyogTERBQyBzdXBwb3J0ICovCgkJ
c25kX2FjOTdfZGV0ZXJtaW5lX3JhdGVzKGFjOTcsIEFDOTdfUENNX0xGRV9EQUNfUkFURSwgQUM5
N19QQ01fRlJPTlRfREFDX1JBVEUsICZhYzk3LT5yYXRlc1tBQzk3X1JBVEVTX0xGRV9EQUNdKTsK
CQlhYzk3LT5zY2FwcyB8PSBBQzk3X1NDQVBfQ0VOVEVSX0xGRV9EQUM7Cgl9CgkvKiBhZGRpdGlv
bmFsIGluaXRpYWxpemF0aW9ucyAqLwoJaWYgKGJ1cy0+b3BzLT5pbml0KQoJCWJ1cy0+b3BzLT5p
bml0KGFjOTcpOwoJc25kX2FjOTdfZ2V0X25hbWUoYWM5NywgYWM5Ny0+aWQsIG5hbWUsICFhYzk3
X2lzX2F1ZGlvKGFjOTcpKTsKCXNuZF9hYzk3X2dldF9uYW1lKE5VTEwsIGFjOTctPmlkLCBuYW1l
LCAhYWM5N19pc19hdWRpbyhhYzk3KSk7ICAvLyBhYzk3LT5pZCBtaWdodCBiZSBjaGFuZ2VkIGlu
IHRoZSBzcGVjaWFsIHNldHVwIGNvZGUKCWlmICghIGFjOTctPmJ1aWxkX29wcykKCQlhYzk3LT5i
dWlsZF9vcHMgPSAmbnVsbF9idWlsZF9vcHM7CgoJaWYgKGFjOTdfaXNfYXVkaW8oYWM5NykpIHsK
CQljaGFyIGNvbXBbMTZdOwoJCWlmIChjYXJkLT5taXhlcm5hbWVbMF0gPT0gJ1wwJykgewoJCQlz
dHJjcHkoY2FyZC0+bWl4ZXJuYW1lLCBuYW1lKTsKCQl9IGVsc2UgewoJCQlpZiAoc3RybGVuKGNh
cmQtPm1peGVybmFtZSkgKyAxICsgc3RybGVuKG5hbWUpICsgMSA8PSBzaXplb2YoY2FyZC0+bWl4
ZXJuYW1lKSkgewoJCQkJc3RyY2F0KGNhcmQtPm1peGVybmFtZSwgIiwiKTsKCQkJCXN0cmNhdChj
YXJkLT5taXhlcm5hbWUsIG5hbWUpOwoJCQl9CgkJfQoJCXNwcmludGYoY29tcCwgIkFDOTdhOiUw
OHgiLCBhYzk3LT5pZCk7CgkJaWYgKChlcnIgPSBzbmRfY29tcG9uZW50X2FkZChjYXJkLCBjb21w
KSkgPCAwKSB7CgkJCXNuZF9hYzk3X2ZyZWUoYWM5Nyk7CgkJCXJldHVybiBlcnI7CgkJfQoJCWlm
IChzbmRfYWM5N19taXhlcl9idWlsZChhYzk3KSA8IDApIHsKCQkJc25kX2FjOTdfZnJlZShhYzk3
KTsKCQkJcmV0dXJuIC1FTk9NRU07CgkJfQoJfQoJaWYgKGFjOTdfaXNfbW9kZW0oYWM5NykpIHsK
CQljaGFyIGNvbXBbMTZdOwoJCWlmIChjYXJkLT5taXhlcm5hbWVbMF0gPT0gJ1wwJykgewoJCQlz
dHJjcHkoY2FyZC0+bWl4ZXJuYW1lLCBuYW1lKTsKCQl9IGVsc2UgewoJCQlpZiAoc3RybGVuKGNh
cmQtPm1peGVybmFtZSkgKyAxICsgc3RybGVuKG5hbWUpICsgMSA8PSBzaXplb2YoY2FyZC0+bWl4
ZXJuYW1lKSkgewoJCQkJc3RyY2F0KGNhcmQtPm1peGVybmFtZSwgIiwiKTsKCQkJCXN0cmNhdChj
YXJkLT5taXhlcm5hbWUsIG5hbWUpOwoJCQl9CgkJfQoJCXNwcmludGYoY29tcCwgIkFDOTdtOiUw
OHgiLCBhYzk3LT5pZCk7CgkJaWYgKChlcnIgPSBzbmRfY29tcG9uZW50X2FkZChjYXJkLCBjb21w
KSkgPCAwKSB7CgkJCXNuZF9hYzk3X2ZyZWUoYWM5Nyk7CgkJCXJldHVybiBlcnI7CgkJfQoJCWlm
IChzbmRfYWM5N19tb2RlbV9idWlsZChjYXJkLCBhYzk3KSA8IDApIHsKCQkJc25kX2FjOTdfZnJl
ZShhYzk3KTsKCQkJcmV0dXJuIC1FTk9NRU07CgkJfQoJfQoJLyogbWFrZSBzdXJlIHRoZSBwcm9w
ZXIgcG93ZXJkb3duIGJpdHMgYXJlIGNsZWFyZWQgKi8KCWlmIChhYzk3LT5zY2FwcykgewoJCXJl
ZyA9IHNuZF9hYzk3X3JlYWQoYWM5NywgQUM5N19FWFRFTkRFRF9TVEFUVVMpOwoJCWlmIChhYzk3
LT5zY2FwcyAmIEFDOTdfU0NBUF9TVVJST1VORF9EQUMpIAoJCQlyZWcgJj0gfkFDOTdfRUFfUFJK
OwoJCWlmIChhYzk3LT5zY2FwcyAmIEFDOTdfU0NBUF9DRU5URVJfTEZFX0RBQykgCgkJCXJlZyAm
PSB+KEFDOTdfRUFfUFJJIHwgQUM5N19FQV9QUkspOwoJCXNuZF9hYzk3X3dyaXRlX2NhY2hlKGFj
OTcsIEFDOTdfRVhURU5ERURfU1RBVFVTLCByZWcpOwoJfQoJc25kX2FjOTdfcHJvY19pbml0KGFj
OTcpOwoJaWYgKChlcnIgPSBzbmRfZGV2aWNlX25ldyhjYXJkLCBTTkRSVl9ERVZfQ09ERUMsIGFj
OTcsICZvcHMpKSA8IDApIHsKCQlzbmRfYWM5N19mcmVlKGFjOTcpOwoJCXJldHVybiBlcnI7Cgl9
CgkqcmFjOTcgPSBhYzk3OwoKCWlmIChidXMtPnNoYXJlZF90eXBlKSB7CgkJZG93bigmc2hhcmVk
X2NvZGVjX211dGV4KTsKCQlzaGFyZWRfY29kZWNbYnVzLT5zaGFyZWRfdHlwZS0xXVthYzk3LT5u
dW1dID0gYWM5NzsKCQl1cCgmc2hhcmVkX2NvZGVjX211dGV4KTsKCX0KCglyZXR1cm4gMDsKfQoK
Ci8qCiAqIFBvd2VyIGRvd24gdGhlIGNoaXAuCiAqCiAqIE1BU1RFUiBhbmQgSEVBRFBIT05FIHJl
Z2lzdGVycyBhcmUgbXV0ZWQgYnV0IHRoZSByZWdpc3RlciBjYWNoZSB2YWx1ZXMKICogYXJlIG5v
dCBjaGFuZ2VkLCBzbyB0aGF0IHRoZSB2YWx1ZXMgY2FuIGJlIHJlc3RvcmVkIGluIHNuZF9hYzk3
X3Jlc3VtZSgpLgogKi8Kc3RhdGljIHZvaWQgc25kX2FjOTdfcG93ZXJkb3duKGFjOTdfdCAqYWM5
NykKewoJdW5zaWduZWQgc2hvcnQgcG93ZXI7CgoJaWYgKGFjOTdfaXNfYXVkaW8oYWM5NykpIHsK
CQkvKiBzb21lIGNvZGVjcyBoYXZlIHN0ZXJlbyBtdXRlIGJpdHMgKi8KCQlzbmRfYWM5N193cml0
ZShhYzk3LCBBQzk3X01BU1RFUiwgMHg5ZjlmKTsKCQlzbmRfYWM5N193cml0ZShhYzk3LCBBQzk3
X0hFQURQSE9ORSwgMHg5ZjlmKTsKCX0KCglwb3dlciA9IGFjOTctPnJlZ3NbQUM5N19QT1dFUkRP
V05dIHwgMHg4MDAwOwkvKiBFQVBEICovCglwb3dlciB8PSAweDQwMDA7CS8qIEhlYWRwaG9uZSBh
bXBsaWZpZXIgcG93ZXJkb3duICovCglwb3dlciB8PSAweDAzMDA7CS8qIEFEQyAmIERBQyBwb3dl
cmRvd24gKi8KCXNuZF9hYzk3X3dyaXRlKGFjOTcsIEFDOTdfUE9XRVJET1dOLCBwb3dlcik7Cgl1
ZGVsYXkoMTAwKTsKCXBvd2VyIHw9IDB4MDQwMDsJLyogQW5hbG9nIE1peGVyIHBvd2VyZG93biAo
VnJlZiBvbikgKi8KCXNuZF9hYzk3X3dyaXRlKGFjOTcsIEFDOTdfUE9XRVJET1dOLCBwb3dlcik7
Cgl1ZGVsYXkoMTAwKTsKI2lmIDAKCS8qIEZJWE1FOiB0aGlzIGNhdXNlcyBjbGljayBub2lzZXMg
b24gc29tZSBib2FyZHMgYXQgcmVzdW1lICovCglwb3dlciB8PSAweDM4MDA7CS8qIEFDLWxpbmsg
cG93ZXJkb3duLCBpbnRlcm5hbCBDbGsgZGlzYWJsZSAqLwoJc25kX2FjOTdfd3JpdGUoYWM5Nywg
QUM5N19QT1dFUkRPV04sIHBvd2VyKTsKI2VuZGlmCn0KCgojaWZkZWYgQ09ORklHX1BNCi8qKgog
KiBzbmRfYWM5N19zdXNwZW5kIC0gR2VuZXJhbCBzdXNwZW5kIGZ1bmN0aW9uIGZvciBBQzk3IGNv
ZGVjCiAqIEBhYzk3OiB0aGUgYWM5NyBpbnN0YW5jZQogKgogKiBTdXNwZW5kcyB0aGUgY29kZWMs
IHBvd2VyIGRvd24gdGhlIGNoaXAuCiAqLwp2b2lkIHNuZF9hYzk3X3N1c3BlbmQoYWM5N190ICph
Yzk3KQp7CglpZiAoYWM5Ny0+YnVpbGRfb3BzLT5zdXNwZW5kKQoJCWFjOTctPmJ1aWxkX29wcy0+
c3VzcGVuZChhYzk3KTsKCXNuZF9hYzk3X3Bvd2VyZG93bihhYzk3KTsKfQoKLyoKICogcmVzdG9y
ZSBhYzk3IHN0YXR1cwogKi8Kdm9pZCBzbmRfYWM5N19yZXN0b3JlX3N0YXR1cyhhYzk3X3QgKmFj
OTcpCnsKCWludCBpOwoKCWZvciAoaSA9IDI7IGkgPCAweDdjIDsgaSArPSAyKSB7CgkJaWYgKGkg
PT0gQUM5N19QT1dFUkRPV04gfHwgaSA9PSBBQzk3X0VYVEVOREVEX0lEKQoJCQljb250aW51ZTsK
CQkvKiByZXN0b3JlIG9ubHkgYWNjZXNzaWJsZSByZWdpc3RlcnMKCQkgKiBzb21lIGNoaXAgKGUu
Zy4gbm0yNTYpIG1heSBoYW5nIHVwIHdoZW4gdW5zdXBwb3J0ZWQgcmVnaXN0ZXJzCgkJICogYXJl
IGFjY2Vzc2VkLi4hCgkJICovCgkJaWYgKHRlc3RfYml0KGksIGFjOTctPnJlZ19hY2Nlc3NlZCkp
IHsKCQkJc25kX2FjOTdfd3JpdGUoYWM5NywgaSwgYWM5Ny0+cmVnc1tpXSk7CgkJCXNuZF9hYzk3
X3JlYWQoYWM5NywgaSk7CgkJfQoJfQp9CgovKgogKiByZXN0b3JlIElFQzk1OCBzdGF0dXMKICov
CnZvaWQgc25kX2FjOTdfcmVzdG9yZV9pZWM5NTgoYWM5N190ICphYzk3KQp7CglpZiAoYWM5Ny0+
ZXh0X2lkICYgQUM5N19FSV9TUERJRikgewoJCWlmIChhYzk3LT5yZWdzW0FDOTdfRVhURU5ERURf
U1RBVFVTXSAmIEFDOTdfRUFfU1BESUYpIHsKCQkJLyogcmVzZXQgc3BkaWYgc3RhdHVzICovCgkJ
CXNuZF9hYzk3X3VwZGF0ZV9iaXRzKGFjOTcsIEFDOTdfRVhURU5ERURfU1RBVFVTLCBBQzk3X0VB
X1NQRElGLCAwKTsKCQkJc25kX2FjOTdfd3JpdGUoYWM5NywgQUM5N19FWFRFTkRFRF9TVEFUVVMs
IGFjOTctPnJlZ3NbQUM5N19FWFRFTkRFRF9TVEFUVVNdKTsKCQkJaWYgKGFjOTctPmZsYWdzICYg
QUM5N19DU19TUERJRikKCQkJCXNuZF9hYzk3X3dyaXRlKGFjOTcsIEFDOTdfQ1NSX1NQRElGLCBh
Yzk3LT5yZWdzW0FDOTdfQ1NSX1NQRElGXSk7CgkJCWVsc2UKCQkJCXNuZF9hYzk3X3dyaXRlKGFj
OTcsIEFDOTdfU1BESUYsIGFjOTctPnJlZ3NbQUM5N19TUERJRl0pOwoJCQlzbmRfYWM5N191cGRh
dGVfYml0cyhhYzk3LCBBQzk3X0VYVEVOREVEX1NUQVRVUywgQUM5N19FQV9TUERJRiwgQUM5N19F
QV9TUERJRik7IC8qIHR1cm4gb24gYWdhaW4gKi8KCQl9Cgl9Cn0KCi8qKgogKiBzbmRfYWM5N19y
ZXN1bWUgLSBHZW5lcmFsIHJlc3VtZSBmdW5jdGlvbiBmb3IgQUM5NyBjb2RlYwogKiBAYWM5Nzog
dGhlIGFjOTcgaW5zdGFuY2UKICoKICogRG8gdGhlIHN0YW5kYXJkIHJlc3VtZSBwcm9jZWR1cmUs
IHBvd2VyIHVwIGFuZCByZXN0b3JpbmcgdGhlCiAqIG9sZCByZWdpc3RlciB2YWx1ZXMuCiAqLwp2
b2lkIHNuZF9hYzk3X3Jlc3VtZShhYzk3X3QgKmFjOTcpCnsKCWludCBpOwoKCWlmIChhYzk3LT5i
dXMtPm9wcy0+cmVzZXQpIHsKCQlhYzk3LT5idXMtPm9wcy0+cmVzZXQoYWM5Nyk7CgkJZ290byAg
X19yZXNldF9yZWFkeTsKCX0KCglzbmRfYWM5N193cml0ZShhYzk3LCBBQzk3X1BPV0VSRE9XTiwg
MCk7CglzbmRfYWM5N193cml0ZShhYzk3LCBBQzk3X1JFU0VULCAwKTsKCXVkZWxheSgxMDApOwoJ
c25kX2FjOTdfd3JpdGUoYWM5NywgQUM5N19QT1dFUkRPV04sIDApOwoJc25kX2FjOTdfd3JpdGUo
YWM5NywgQUM5N19HRU5FUkFMX1BVUlBPU0UsIDApOwoKCXNuZF9hYzk3X3dyaXRlKGFjOTcsIEFD
OTdfUE9XRVJET1dOLCBhYzk3LT5yZWdzW0FDOTdfUE9XRVJET1dOXSk7CglpZiAoYWM5N19pc19h
dWRpbyhhYzk3KSkgewoJCWFjOTctPmJ1cy0+b3BzLT53cml0ZShhYzk3LCBBQzk3X01BU1RFUiwg
MHg4MTAxKTsKCQlmb3IgKGkgPSBIWi8xMDsgaSA+PSAwOyBpLS0pIHsKCQkJaWYgKHNuZF9hYzk3
X3JlYWQoYWM5NywgQUM5N19NQVNURVIpID09IDB4ODEwMSkKCQkJCWJyZWFrOwoJCQlzZXRfY3Vy
cmVudF9zdGF0ZShUQVNLX1VOSU5URVJSVVBUSUJMRSk7CgkJCXNjaGVkdWxlX3RpbWVvdXQoMSk7
CgkJfQoJCS8qIEZJWE1FOiBleHRyYSBkZWxheSAqLwoJCWFjOTctPmJ1cy0+b3BzLT53cml0ZShh
Yzk3LCBBQzk3X01BU1RFUiwgMHg4MDAwKTsKCQlpZiAoc25kX2FjOTdfcmVhZChhYzk3LCBBQzk3
X01BU1RFUikgIT0gMHg4MDAwKSB7CgkJCXNldF9jdXJyZW50X3N0YXRlKFRBU0tfVU5JTlRFUlJV
UFRJQkxFKTsKCQkJc2NoZWR1bGVfdGltZW91dChIWi80KTsKCQl9Cgl9IGVsc2UgewoJCWZvciAo
aSA9IEhaLzEwOyBpID49IDA7IGktLSkgewoJCQl1bnNpZ25lZCBzaG9ydCB2YWwgPSBzbmRfYWM5
N19yZWFkKGFjOTcsIEFDOTdfRVhURU5ERURfTUlEKTsKCQkJaWYgKHZhbCAhPSAweGZmZmYgJiYg
KHZhbCAmIDEpICE9IDApCgkJCQlicmVhazsKCQkJc2V0X2N1cnJlbnRfc3RhdGUoVEFTS19VTklO
VEVSUlVQVElCTEUpOwoJCQlzY2hlZHVsZV90aW1lb3V0KDEpOwoJCX0KCX0KX19yZXNldF9yZWFk
eToKCglpZiAoYWM5Ny0+YnVzLT5vcHMtPmluaXQpCgkJYWM5Ny0+YnVzLT5vcHMtPmluaXQoYWM5
Nyk7CgoJaWYgKGFjOTctPmJ1aWxkX29wcy0+cmVzdW1lKQoJCWFjOTctPmJ1aWxkX29wcy0+cmVz
dW1lKGFjOTcpOwoJZWxzZSB7CgkJc25kX2FjOTdfcmVzdG9yZV9zdGF0dXMoYWM5Nyk7CgkJc25k
X2FjOTdfcmVzdG9yZV9pZWM5NTgoYWM5Nyk7Cgl9Cn0KI2VuZGlmCgoKLyoKICogSGFyZHdhcmUg
dHVuaW5nCiAqLwpzdGF0aWMgdm9pZCBzZXRfY3RsX25hbWUoY2hhciAqZHN0LCBjb25zdCBjaGFy
ICpzcmMsIGNvbnN0IGNoYXIgKnN1ZmZpeCkKewoJaWYgKHN1ZmZpeCkKCQlzcHJpbnRmKGRzdCwg
IiVzICVzIiwgc3JjLCBzdWZmaXgpOwoJZWxzZQoJCXN0cmNweShkc3QsIHNyYyk7Cn0JCgovKiBy
ZW1vdmUgdGhlIGNvbnRyb2wgd2l0aCB0aGUgZ2l2ZW4gbmFtZSBhbmQgb3B0aW9uYWwgc3VmZml4
ICovCmludCBzbmRfYWM5N19yZW1vdmVfY3RsKGFjOTdfdCAqYWM5NywgY29uc3QgY2hhciAqbmFt
ZSwgY29uc3QgY2hhciAqc3VmZml4KQp7CglzbmRfY3RsX2VsZW1faWRfdCBpZDsKCW1lbXNldCgm
aWQsIDAsIHNpemVvZihpZCkpOwoJc2V0X2N0bF9uYW1lKGlkLm5hbWUsIG5hbWUsIHN1ZmZpeCk7
CglpZC5pZmFjZSA9IFNORFJWX0NUTF9FTEVNX0lGQUNFX01JWEVSOwoJcmV0dXJuIHNuZF9jdGxf
cmVtb3ZlX2lkKGFjOTctPmJ1cy0+Y2FyZCwgJmlkKTsKfQoKc3RhdGljIHNuZF9rY29udHJvbF90
ICpjdGxfZmluZChhYzk3X3QgKmFjOTcsIGNvbnN0IGNoYXIgKm5hbWUsIGNvbnN0IGNoYXIgKnN1
ZmZpeCkKewoJc25kX2N0bF9lbGVtX2lkX3Qgc2lkOwoJbWVtc2V0KCZzaWQsIDAsIHNpemVvZihz
aWQpKTsKCXNldF9jdGxfbmFtZShzaWQubmFtZSwgbmFtZSwgc3VmZml4KTsKCXNpZC5pZmFjZSA9
IFNORFJWX0NUTF9FTEVNX0lGQUNFX01JWEVSOwoJcmV0dXJuIHNuZF9jdGxfZmluZF9pZChhYzk3
LT5idXMtPmNhcmQsICZzaWQpOwp9CgovKiByZW5hbWUgdGhlIGNvbnRyb2wgd2l0aCB0aGUgZ2l2
ZW4gbmFtZSBhbmQgb3B0aW9uYWwgc3VmZml4ICovCmludCBzbmRfYWM5N19yZW5hbWVfY3RsKGFj
OTdfdCAqYWM5NywgY29uc3QgY2hhciAqc3JjLCBjb25zdCBjaGFyICpkc3QsIGNvbnN0IGNoYXIg
KnN1ZmZpeCkKewoJc25kX2tjb250cm9sX3QgKmtjdGwgPSBjdGxfZmluZChhYzk3LCBzcmMsIHN1
ZmZpeCk7CglpZiAoa2N0bCkgewoJCXNldF9jdGxfbmFtZShrY3RsLT5pZC5uYW1lLCBkc3QsIHN1
ZmZpeCk7CgkJcmV0dXJuIDA7Cgl9CglyZXR1cm4gLUVOT0VOVDsKfQoKLyogcmVuYW1lIGJvdGgg
Vm9sdW1lIGFuZCBTd2l0Y2ggY29udHJvbHMgLSBkb24ndCBjaGVjayB0aGUgcmV0dXJuIHZhbHVl
ICovCnZvaWQgc25kX2FjOTdfcmVuYW1lX3ZvbF9jdGwoYWM5N190ICphYzk3LCBjb25zdCBjaGFy
ICpzcmMsIGNvbnN0IGNoYXIgKmRzdCkKewoJc25kX2FjOTdfcmVuYW1lX2N0bChhYzk3LCBzcmMs
IGRzdCwgIlN3aXRjaCIpOwoJc25kX2FjOTdfcmVuYW1lX2N0bChhYzk3LCBzcmMsIGRzdCwgIlZv
bHVtZSIpOwp9CgovKiBzd2FwIGNvbnRyb2xzICovCmludCBzbmRfYWM5N19zd2FwX2N0bChhYzk3
X3QgKmFjOTcsIGNvbnN0IGNoYXIgKnMxLCBjb25zdCBjaGFyICpzMiwgY29uc3QgY2hhciAqc3Vm
Zml4KQp7CglzbmRfa2NvbnRyb2xfdCAqa2N0bDEsICprY3RsMjsKCWtjdGwxID0gY3RsX2ZpbmQo
YWM5NywgczEsIHN1ZmZpeCk7CglrY3RsMiA9IGN0bF9maW5kKGFjOTcsIHMyLCBzdWZmaXgpOwoJ
aWYgKGtjdGwxICYmIGtjdGwyKSB7CgkJc2V0X2N0bF9uYW1lKGtjdGwxLT5pZC5uYW1lLCBzMiwg
c3VmZml4KTsKCQlzZXRfY3RsX25hbWUoa2N0bDItPmlkLm5hbWUsIHMxLCBzdWZmaXgpOwoJCXJl
dHVybiAwOwoJfQoJcmV0dXJuIC1FTk9FTlQ7Cn0KCi8qIGFjOTcgdHVuZTogdXNlIEhlYWRwaG9u
ZSBjb250cm9sIGFzIG1hc3RlciAqLwpzdGF0aWMgaW50IHR1bmVfaHBfb25seShhYzk3X3QgKmFj
OTcpCnsKCWlmIChjdGxfZmluZChhYzk3LCAiSGVhZHBob25lIFBsYXliYWNrIFN3aXRjaCIsIE5V
TEwpID09IE5VTEwpCgkJcmV0dXJuIC1FTk9FTlQ7CglzbmRfYWM5N19yZW1vdmVfY3RsKGFjOTcs
ICJNYXN0ZXIgUGxheWJhY2siLCAiU3dpdGNoIik7CglzbmRfYWM5N19yZW1vdmVfY3RsKGFjOTcs
ICJNYXN0ZXIgUGxheWJhY2siLCAiVm9sdW1lIik7CglzbmRfYWM5N19yZW5hbWVfdm9sX2N0bChh
Yzk3LCAiSGVhZHBob25lIFBsYXliYWNrIiwgIk1hc3RlciBQbGF5YmFjayIpOwoJcmV0dXJuIDA7
Cn0KCi8qIGFjOTcgdHVuZTogc3dhcCBIZWFkcGhvbmUgYW5kIE1hc3RlciBjb250cm9scyAqLwpz
dGF0aWMgaW50IHR1bmVfc3dhcF9ocChhYzk3X3QgKmFjOTcpCnsKCWlmIChjdGxfZmluZChhYzk3
LCAiSGVhZHBob25lIFBsYXliYWNrIFN3aXRjaCIsIE5VTEwpID09IE5VTEwpCgkJcmV0dXJuIC1F
Tk9FTlQ7CglzbmRfYWM5N19yZW5hbWVfdm9sX2N0bChhYzk3LCAiTWFzdGVyIFBsYXliYWNrIiwg
IkxpbmUtT3V0IFBsYXliYWNrIik7CglzbmRfYWM5N19yZW5hbWVfdm9sX2N0bChhYzk3LCAiSGVh
ZHBob25lIFBsYXliYWNrIiwgIk1hc3RlciBQbGF5YmFjayIpOwoJcmV0dXJuIDA7Cn0KCi8qIGFj
OTcgdHVuZTogc3dhcCBTdXJyb3VuZCBhbmQgTWFzdGVyIGNvbnRyb2xzICovCnN0YXRpYyBpbnQg
dHVuZV9zd2FwX3N1cnJvdW5kKGFjOTdfdCAqYWM5NykKewoJaWYgKHNuZF9hYzk3X3N3YXBfY3Rs
KGFjOTcsICJNYXN0ZXIgUGxheWJhY2siLCAiU3Vycm91bmQgUGxheWJhY2siLCAiU3dpdGNoIikg
fHwKCSAgICBzbmRfYWM5N19zd2FwX2N0bChhYzk3LCAiTWFzdGVyIFBsYXliYWNrIiwgIlN1cnJv
dW5kIFBsYXliYWNrIiwgIlZvbHVtZSIpKQoJCXJldHVybiAtRU5PRU5UOwoJcmV0dXJuIDA7Cn0K
Ci8qIGFjOTcgdHVuZTogc2V0IHVwIG1pYyBzaGFyaW5nIGZvciBBRCBjb2RlY3MgKi8Kc3RhdGlj
IGludCB0dW5lX2FkX3NoYXJpbmcoYWM5N190ICphYzk3KQp7Cgl1bnNpZ25lZCBzaG9ydCBzY2Zn
OwoJaWYgKChhYzk3LT5pZCAmIDB4ZmZmZmZmMDApICE9IDB4NDE0NDUzMDApIHsKCQlzbmRfcHJp
bnRrKEtFUk5fRVJSICJhYzk3X3F1aXJrIEFEX1NIQVJJTkcgaXMgb25seSBmb3IgQUQgY29kZWNz
XG4iKTsKCQlyZXR1cm4gLUVJTlZBTDsKCX0KCS8qIFR1cm4gb24gT01TIGJpdCB0byByb3V0ZSBt
aWNyb3Bob25lIHRvIGJhY2sgcGFuZWwgKi8KCXNjZmcgPSBzbmRfYWM5N19yZWFkKGFjOTcsIEFD
OTdfQURfU0VSSUFMX0NGRyk7CglzbmRfYWM5N193cml0ZV9jYWNoZShhYzk3LCBBQzk3X0FEX1NF
UklBTF9DRkcsIHNjZmcgfCAweDAyMDApOwoJcmV0dXJuIDA7Cn0KCnN0YXRpYyBjb25zdCBzbmRf
a2NvbnRyb2xfbmV3X3Qgc25kX2FjOTdfYWxjX2phY2tfZGV0ZWN0ID0gCkFDOTdfU0lOR0xFKCJK
YWNrIERldGVjdCIsIEFDOTdfQUxDNjUwX0NMT0NLLCA1LCAxLCAwKTsKCi8qIGFjOTcgdHVuZTog
c2V0IHVwIEFMQyBqYWNrLXNlbGVjdCAqLwpzdGF0aWMgaW50IHR1bmVfYWxjX2phY2soYWM5N190
ICphYzk3KQp7CglpZiAoKGFjOTctPmlkICYgMHhmZmZmZmYwMCkgIT0gMHg0MTRjNDcwMCkgewoJ
CXNuZF9wcmludGsoS0VSTl9FUlIgImFjOTdfcXVpcmsgQUxDX0pBQ0sgaXMgb25seSBmb3IgUmVh
bHRlayBjb2RlY3NcbiIpOwoJCXJldHVybiAtRUlOVkFMOwoJfQoJc25kX2FjOTdfdXBkYXRlX2Jp
dHMoYWM5NywgMHg3YSwgMHgyMCwgMHgyMCk7IC8qIHNlbGVjdCBqYWNrIGRldGVjdCBmdW5jdGlv
biAqLwoJc25kX2FjOTdfdXBkYXRlX2JpdHMoYWM5NywgMHg3YSwgMHgwMSwgMHgwMSk7IC8qIExp
bmUtb3V0IGF1dG8gbXV0ZSAqLwoJcmV0dXJuIHNuZF9jdGxfYWRkKGFjOTctPmJ1cy0+Y2FyZCwg
c25kX2FjOTdfY25ldygmc25kX2FjOTdfYWxjX2phY2tfZGV0ZWN0LCBhYzk3KSk7Cn0KCi8qIGFj
OTcgdHVuZTogaW52ZXJzZWQgRUFQRCBiaXQgKi8Kc3RhdGljIGludCB0dW5lX2ludl9lYXBkKGFj
OTdfdCAqYWM5NykKewoJc25kX2tjb250cm9sX3QgKmtjdGwgPSBjdGxfZmluZChhYzk3LCAiRXh0
ZXJuYWwgQW1wbGlmaWVyIiwgTlVMTCk7CglpZiAoISBrY3RsKQoJCXJldHVybiAtRU5PRU5UOwoJ
c2V0X2ludl9lYXBkKGFjOTcsIGtjdGwpOwoJcmV0dXJuIDA7Cn0KCnN0YXRpYyBpbnQgbWFzdGVy
X211dGVfc3dfcHV0KHNuZF9rY29udHJvbF90ICprY29udHJvbCwgc25kX2N0bF9lbGVtX3ZhbHVl
X3QgKnVjb250cm9sKQp7CglpbnQgZXJyID0gc25kX2FjOTdfcHV0X3ZvbHN3KGtjb250cm9sLCB1
Y29udHJvbCk7CglpZiAoZXJyID4gMCkgewoJCWFjOTdfdCAqYWM5NyA9IHNuZF9rY29udHJvbF9j
aGlwKGtjb250cm9sKTsKCQlpbnQgc2hpZnQgPSAoa2NvbnRyb2wtPnByaXZhdGVfdmFsdWUgPj4g
OCkgJiAweDBmOwoJCWludCByc2hpZnQgPSAoa2NvbnRyb2wtPnByaXZhdGVfdmFsdWUgPj4gMTIp
ICYgMHgwZjsKCQl1bnNpZ25lZCBzaG9ydCBtYXNrOwoJCWlmIChzaGlmdCAhPSByc2hpZnQpCgkJ
CW1hc2sgPSAweDgwODA7CgkJZWxzZQoJCQltYXNrID0gMHg4MDAwOwoJCXNuZF9hYzk3X3VwZGF0
ZV9iaXRzKGFjOTcsIEFDOTdfUE9XRVJET1dOLCAweDgwMDAsCgkJCQkgICAgIChhYzk3LT5yZWdz
W0FDOTdfTUFTVEVSXSAmIG1hc2spID09IG1hc2sgPwoJCQkJICAgICAweDgwMDAgOiAwKTsKCX0K
CXJldHVybiBlcnI7Cn0KCi8qIGFjOTcgdHVuZTogRUFQRCBjb250cm9scyBtdXRlIExFRCBib3Vu
ZCB3aXRoIHRoZSBtYXN0ZXIgbXV0ZSAqLwpzdGF0aWMgaW50IHR1bmVfbXV0ZV9sZWQoYWM5N190
ICphYzk3KQp7CglzbmRfa2NvbnRyb2xfdCAqbXN3ID0gY3RsX2ZpbmQoYWM5NywgIk1hc3RlciBQ
bGF5YmFjayBTd2l0Y2giLCBOVUxMKTsKCWlmICghIG1zdykKCQlyZXR1cm4gLUVOT0VOVDsKCW1z
dy0+cHV0ID0gbWFzdGVyX211dGVfc3dfcHV0OwoJc25kX2FjOTdfcmVtb3ZlX2N0bChhYzk3LCAi
RXh0ZXJuYWwgQW1wbGlmaWVyIiwgTlVMTCk7CglzbmRfYWM5N191cGRhdGVfYml0cyhhYzk3LCBB
Qzk3X1BPV0VSRE9XTiwgMHg4MDAwLCAweDgwMDApOyAvKiBtdXRlIExFRCBvbiAqLwoJcmV0dXJu
IDA7Cn0KCnN0cnVjdCBxdWlya190YWJsZSB7Cgljb25zdCBjaGFyICpuYW1lOwoJaW50ICgqZnVu
YykoYWM5N190ICopOwp9OwoKc3RhdGljIHN0cnVjdCBxdWlya190YWJsZSBhcHBsaWNhYmxlX3F1
aXJrc1tdID0gewoJeyAibm9uZSIsIE5VTEwgfSwKCXsgImhwX29ubHkiLCB0dW5lX2hwX29ubHkg
fSwKCXsgInN3YXBfaHAiLCB0dW5lX3N3YXBfaHAgfSwKCXsgInN3YXBfc3Vycm91bmQiLCB0dW5l
X3N3YXBfc3Vycm91bmQgfSwKCXsgImFkX3NoYXJpbmciLCB0dW5lX2FkX3NoYXJpbmcgfSwKCXsg
ImFsY19qYWNrIiwgdHVuZV9hbGNfamFjayB9LAoJeyAiaW52X2VhcGQiLCB0dW5lX2ludl9lYXBk
IH0sCgl7ICJtdXRlX2xlZCIsIHR1bmVfbXV0ZV9sZWQgfSwKfTsKCi8qIGFwcGx5IHRoZSBxdWly
ayB3aXRoIHRoZSBnaXZlbiB0eXBlICovCnN0YXRpYyBpbnQgYXBwbHlfcXVpcmsoYWM5N190ICph
Yzk3LCBpbnQgdHlwZSkKewoJaWYgKHR5cGUgPD0gMCkKCQlyZXR1cm4gMDsKCWVsc2UgaWYgKHR5
cGUgPj0gQVJSQVlfU0laRShhcHBsaWNhYmxlX3F1aXJrcykpCgkJcmV0dXJuIC1FSU5WQUw7Cglp
ZiAoYXBwbGljYWJsZV9xdWlya3NbdHlwZV0uZnVuYykKCQlyZXR1cm4gYXBwbGljYWJsZV9xdWly
a3NbdHlwZV0uZnVuYyhhYzk3KTsKCXJldHVybiAwOwp9CgovKiBhcHBseSB0aGUgcXVpcmsgd2l0
aCB0aGUgZ2l2ZW4gbmFtZSAqLwpzdGF0aWMgaW50IGFwcGx5X3F1aXJrX3N0cihhYzk3X3QgKmFj
OTcsIGNvbnN0IGNoYXIgKnR5cGVzdHIpCnsKCWludCBpOwoJc3RydWN0IHF1aXJrX3RhYmxlICpx
OwoKCWZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKGFwcGxpY2FibGVfcXVpcmtzKTsgaSsrKSB7
CgkJcSA9ICZhcHBsaWNhYmxlX3F1aXJrc1tpXTsKCQlpZiAocS0+bmFtZSAmJiAhIHN0cmNtcCh0
eXBlc3RyLCBxLT5uYW1lKSkKCQkJcmV0dXJuIGFwcGx5X3F1aXJrKGFjOTcsIGkpOwoJfQoJLyog
Zm9yIGNvbXBhdGliaWxpdHksIGFjY2VwdCB0aGUgbnVtYmVycywgdG9vICovCglpZiAoKnR5cGVz
dHIgPj0gJzAnICYmICp0eXBlc3RyIDw9ICc5JykKCQlyZXR1cm4gYXBwbHlfcXVpcmsoYWM5Nywg
KGludClzaW1wbGVfc3RydG9sKHR5cGVzdHIsIE5VTEwsIDEwKSk7CglyZXR1cm4gLUVJTlZBTDsK
fQoKLyoqCiAqIHNuZF9hYzk3X3R1bmVfaGFyZHdhcmUgLSB0dW5lIHVwIHRoZSBoYXJkd2FyZQog
KiBAYWM5NzogdGhlIGFjOTcgaW5zdGFuY2UKICogQHF1aXJrOiBxdWlyayBsaXN0CiAqIEBvdmVy
cmlkZTogZXhwbGljaXQgcXVpcmsgdmFsdWUgKG92ZXJyaWRlcyB0aGUgbGlzdCBpZiBub24tTlVM
TCkKICoKICogRG8gc29tZSB3b3JrYXJvdW5kIGZvciBlYWNoIHBjaSBkZXZpY2UsIHN1Y2ggYXMg
cmVuYW1pbmcgb2YgdGhlCiAqIGhlYWRwaG9uZSAodHJ1ZSBsaW5lLW91dCkgY29udHJvbCBhcyAi
TWFzdGVyIi4KICogVGhlIHF1aXJrLWxpc3QgbXVzdCBiZSB0ZXJtaW5hdGVkIHdpdGggYSB6ZXJv
LWZpbGxlZCBlbnRyeS4KICoKICogUmV0dXJucyB6ZXJvIGlmIHN1Y2Nlc3NmdWwsIG9yIGEgbmVn
YXRpdmUgZXJyb3IgY29kZSBvbiBmYWlsdXJlLgogKi8KCmludCBzbmRfYWM5N190dW5lX2hhcmR3
YXJlKGFjOTdfdCAqYWM5Nywgc3RydWN0IGFjOTdfcXVpcmsgKnF1aXJrLCBjb25zdCBjaGFyICpv
dmVycmlkZSkKewoJaW50IHJlc3VsdDsKCglzbmRfYXNzZXJ0KHF1aXJrLCByZXR1cm4gLUVJTlZB
TCk7CgoJLyogcXVpcmsgb3ZlcnJpZGVuPyAqLwoJaWYgKG92ZXJyaWRlICYmIHN0cmNtcChvdmVy
cmlkZSwgIi0xIikgJiYgc3RyY21wKG92ZXJyaWRlLCAiZGVmYXVsdCIpKSB7CgkJcmVzdWx0ID0g
YXBwbHlfcXVpcmtfc3RyKGFjOTcsIG92ZXJyaWRlKTsKCQlpZiAocmVzdWx0IDwgMCkKCQkJc25k
X3ByaW50ayhLRVJOX0VSUiAiYXBwbHlpbmcgcXVpcmsgdHlwZSAlcyBmYWlsZWQgKCVkKVxuIiwg
b3ZlcnJpZGUsIHJlc3VsdCk7CgkJcmV0dXJuIHJlc3VsdDsKCX0KCglmb3IgKDsgcXVpcmstPnZl
bmRvcjsgcXVpcmsrKykgewoJCWlmIChxdWlyay0+dmVuZG9yICE9IGFjOTctPnN1YnN5c3RlbV92
ZW5kb3IpCgkJCWNvbnRpbnVlOwoJCWlmICgoISBxdWlyay0+bWFzayAmJiBxdWlyay0+ZGV2aWNl
ID09IGFjOTctPnN1YnN5c3RlbV9kZXZpY2UpIHx8CgkJICAgIHF1aXJrLT5kZXZpY2UgPT0gKHF1
aXJrLT5tYXNrICYgYWM5Ny0+c3Vic3lzdGVtX2RldmljZSkpIHsKCQkJaWYgKHF1aXJrLT5jb2Rl
Y19pZCAmJiBxdWlyay0+Y29kZWNfaWQgIT0gYWM5Ny0+aWQpCgkJCQljb250aW51ZTsKCQkJc25k
X3ByaW50ZGQoImFjOTcgcXVpcmsgZm9yICVzICglMDR4OiUwNHgpXG4iLCBxdWlyay0+bmFtZSwg
YWM5Ny0+c3Vic3lzdGVtX3ZlbmRvciwgYWM5Ny0+c3Vic3lzdGVtX2RldmljZSk7CgkJCXJlc3Vs
dCA9IGFwcGx5X3F1aXJrKGFjOTcsIHF1aXJrLT50eXBlKTsKCQkJaWYgKHJlc3VsdCA8IDApCgkJ
CQlzbmRfcHJpbnRrKEtFUk5fRVJSICJhcHBseWluZyBxdWlyayB0eXBlICVkIGZvciAlcyBmYWls
ZWQgKCVkKVxuIiwgcXVpcmstPnR5cGUsIHF1aXJrLT5uYW1lLCByZXN1bHQpOwoJCQlyZXR1cm4g
cmVzdWx0OwoJCX0KCX0KCXJldHVybiAwOwp9CgoKLyoKICogIEV4cG9ydGVkIHN5bWJvbHMKICov
CgpFWFBPUlRfU1lNQk9MKHNuZF9hYzk3X3dyaXRlKTsKRVhQT1JUX1NZTUJPTChzbmRfYWM5N19y
ZWFkKTsKRVhQT1JUX1NZTUJPTChzbmRfYWM5N193cml0ZV9jYWNoZSk7CkVYUE9SVF9TWU1CT0wo
c25kX2FjOTdfdXBkYXRlKTsKRVhQT1JUX1NZTUJPTChzbmRfYWM5N191cGRhdGVfYml0cyk7CkVY
UE9SVF9TWU1CT0woc25kX2FjOTdfZ2V0X3Nob3J0X25hbWUpOwpFWFBPUlRfU1lNQk9MKHNuZF9h
Yzk3X2J1cyk7CkVYUE9SVF9TWU1CT0woc25kX2FjOTdfbWl4ZXIpOwpFWFBPUlRfU1lNQk9MKHNu
ZF9hYzk3X3BjbV9hc3NpZ24pOwpFWFBPUlRfU1lNQk9MKHNuZF9hYzk3X3BjbV9vcGVuKTsKRVhQ
T1JUX1NZTUJPTChzbmRfYWM5N19wY21fY2xvc2UpOwpFWFBPUlRfU1lNQk9MKHNuZF9hYzk3X3Bj
bV9kb3VibGVfcmF0ZV9ydWxlcyk7CkVYUE9SVF9TWU1CT0woc25kX2FjOTdfdHVuZV9oYXJkd2Fy
ZSk7CkVYUE9SVF9TWU1CT0woc25kX2FjOTdfc2V0X3JhdGUpOwojaWZkZWYgQ09ORklHX1BNCkVY
UE9SVF9TWU1CT0woc25kX2FjOTdfcmVzdW1lKTsKRVhQT1JUX1NZTUJPTChzbmRfYWM5N19zdXNw
ZW5kKTsKI2VuZGlmCgovKgogKiAgSU5JVCBwYXJ0CiAqLwoKc3RhdGljIGludCBfX2luaXQgYWxz
YV9hYzk3X2luaXQodm9pZCkKewoJcmV0dXJuIDA7Cn0KCnN0YXRpYyB2b2lkIF9fZXhpdCBhbHNh
X2FjOTdfZXhpdCh2b2lkKQp7Cn0KCm1vZHVsZV9pbml0KGFsc2FfYWM5N19pbml0KQptb2R1bGVf
ZXhpdChhbHNhX2FjOTdfZXhpdCkK
</data>        

          </attachment>
    </bug>

</bugzilla>