[openi18n-im:01547] common language engine

Federic Zhang <[email protected]> Mon, 12 Sep 2005 18:17:40 +0800
Newsgroups gmane.comp.internationalization.input-methods
Message-ID <[email protected]>
--Boundary_(ID_d74PqNkcRLuF0bcZ9w0daQ)
Content-type: text/plain
Content-Transfer-Encoding: 7BIT

Hi,

untar the iml.tar under iiimsf/lib/iml, copy IME.h to include/iml and
add the 
attached patch, the prototype of common language engine will be enabled.
it means once you copy any input method which is developed according to
new interface
defined by IME.h to /usr/lib/iiim/le/common directory, the input method
will 
be available in your system. For example, copy the NeiMa.so of cle to 
/usr/lib/iiim/le/common/NeiMa/NeiMa.so, you will have the input method.

Of course, there still have several minor issues to be resolved, also
the cooperation
with Common AUX framework to leverage common AUX will be started soon,
Yong
will continue the effort and make it better before checking into trunk.

In summary, each input method which have been put into the above dir
would be
treated as one language engine. Each input method can get various IMM
services 
with the RegisterIME function which is called by common language engine
to
retrieve ImeInfo and ImeMethods from the input method shared object,
then the
common language engine would call ImeMethods to handling focus in/out
and key
and aux event etc.

As for how new input method can be developed, the neima input method
under 
the leif/sch_le_sun/src/input_methods is one good reference and IME.h,
as the
new interface, should contain all information you want.

-federic

> Hi,
> 
> As first part of common language engine, today i will commit one patch
> which will provide convenient functions for those low-level iml methods
> for input method developer. those functions combine the iml creation and
> execution, see SunIMSubr2.c for details. developer can use them via
> s->If->m_wrapper, attached ime.c can demonstrate how they can be used.
> Of course, the existing iml methods still work and developer still can
> access via s->If->m.
> 
> The second step is to provide one imm service within iml, which would be
> higher than those new convenient functions, it will take various aux
> implementation into account, common aux, default aux and customized aux
> etc and do encoding conversion, so it's unnecessary for developer to
> care about code conversion between native encoding and UTF-16 in their
> code, again, the service will be accessed directly be s->If->imm_service
> to developer in future.
> 
> Based on those work, one real common language engine (adapter) would be
> implemented later and high version of LEIF will be available in one or
> two months eventually.
> 
> Please review, if it's ok i will commit today.
> 
> Almost forget to mention, most of code and idea comes from Ervin's cle,
> i just copy directly.
> 
> -federic

--Boundary_(ID_d74PqNkcRLuF0bcZ9w0daQ)
Content-type: application/x-tar; name=iml.tar
Content-disposition: attachment; filename=iml.tar
Content-Transfer-Encoding: BASE64

YXV4X3Byb3RvY29sLmgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAADAxMDA2NDQAMDI3NzUwMgAwMDAwMDEyADAwMDAwMDA2NTYwADEwMzA1NTI1
NjYzADAxMzEyNQAgMAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAB1c3RhciAgAGZ6aGFuZwAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAd2hlZWwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAjaWZuZGVmIF9MRV9BVVhf
UFJPVE9DT0xfSF8KI2RlZmluZSBfTEVfQVVYX1BST1RPQ09MX0hfCgojZGVmaW5l
IEFVWF9PQkpFQ1RfQ0xBU1NfTkFNRSAgICAgImNvbS5zdW4uaWlpbS5jbGUuYXV4
Lm9iamVjdCIKI2RlZmluZSBQQUxFVFRFX0FVWF9DTEFTU19OQU1FICAgICJjb20u
c3VuLmlpaW0uY2xlLmF1eC5wYWxldHRlIgojZGVmaW5lIFNFTEVDVF9BVVhfQ0xB
U1NfTkFNRSAgICAgImNvbS5zdW4uaWlpbS5jbGUuYXV4LnNlbGVjdCIKI2RlZmlu
ZSBQUk9QRVJUSUVTX0FVWF9DTEFTU19OQU1FICJjb20uc3VuLmlpaW0uY2xlLmF1
eC5wcm9wZXJ0aWVzIgojZGVmaW5lIENPTVBPU0lURV9BVVhfQ0xBU1NfTkFNRSAg
ImNvbS5zdW4uaWlpbS5jbGUuYXV4LmNvbXBvc2l0ZSIKCiNkZWZpbmUgWEFVWF9P
QkpFQ1RfQ0xBU1NfTkFNRSAgICAgICAgICAiY29tLnN1bi5paWltLmNsZS5hdXgu
b2JqZWN0IgojZGVmaW5lIFhBVVhfTUFOQUdFUl9HVEsyX0NMQVNTX05BTUUgICAg
ImNvbS5zdW4uaWlpbS5jbGUuYXV4Lm1hbmFnZXIuZ3RrMiIKI2RlZmluZSBYQVVY
X01PRFVMRV9QQUxFVFRFX0NMQVNTX05BTUUgICJjb20uc3VuLmlpaW0uY2xlLmF1
eC5wYWxldHRlIgojZGVmaW5lIFhBVVhfTU9EVUxFX1NFTEVDVF9DTEFTU19OQU1F
ICAgImNvbS5zdW4uaWlpbS5jbGUuYXV4LnNlbGVjdCIKI2RlZmluZSBYQVVYX01P
RFVMRV9QUk9QRVJUWV9DTEFTU19OQU1FICJjb20uc3VuLmlpaW0uY2xlLmF1eC5w
cm9wZXJ0aWVzIgojZGVmaW5lIFhBVVhfTU9EVUxFX0NPTVBPU0lURV9DTEFTU19O
QU1FICJjb20uc3VuLmlpaW0uY2xlLmF1eC5jb21wb3NpdGUiCgovKiBQcm90b2Nv
bCBOdW1iZXIgYmV0d2VlbiBBdXhpbGlhcnkgV2luZG93IGFuZCBMYW5ndWFnZSBF
bmdpbmUgKi8KCi8qIEZvciBQYWxldHRlQXV4ICovCiNkZWZpbmUgUEFMRVRURUFV
WF9DT05ORUNUICAgICAgICAgICAgICAgICAgICAgIDEKI2RlZmluZSBQQUxFVFRF
QVVYX1NXSVRDSF9DT05WRVJTSU9OICAgICAgICAgICAgMgojZGVmaW5lIFBBTEVU
VEVBVVhfU1dJVENIX0lNRSAgICAgICAgICAgICAgICAgICAzCiNkZWZpbmUgUEFM
RVRURUFVWF9TV0lUQ0hfUUpCSiAgICAgICAgICAgICAgICAgIDQKI2RlZmluZSBQ
QUxFVFRFQVVYX1NXSVRDSF9QVU5DVCAgICAgICAgICAgICAgICAgNQojZGVmaW5l
IFBBTEVUVEVBVVhfQ0hBTkdFX1BPU0lUSU9OICAgICAgICAgICAgICA2CiNkZWZp
bmUgUEFMRVRURUFVWF9VUERBVEVfUFJPUEVSVFkgICAgICAgICAgICAgIDcKI2Rl
ZmluZSBQQUxFVFRFQVVYX1NIT1dfU0VMRUNUQVVYICAgICAgICAgICAgICAgOAoj
ZGVmaW5lIFBBTEVUVEVBVVhfU0hPV19LRVlCT0FSREFVWCAgICAgICAgICAgICA5
CiNkZWZpbmUgUEFMRVRURUFVWF9TSE9XX0xPT0tVUEFVWCAgICAgICAgICAgICAg
IDEwCgojZGVmaW5lIFBBTEVUVEVBVVhfVVBEQVRFX0lNRUlORk9fTk9USUZZICAg
ICAgICAxMgojZGVmaW5lIFBBTEVUVEVBVVhfU1dJVENIX0NPTlZFUlNJT05fTk9U
SUZZICAgICAxMwojZGVmaW5lIFBBTEVUVEVBVVhfU1dJVENIX0lNRV9OT1RJRlkg
ICAgICAgICAgICAxNAojZGVmaW5lIFBBTEVUVEVBVVhfU1dJVENIX1FKQkpfTk9U
SUZZICAgICAgICAgICAxNQojZGVmaW5lIFBBTEVUVEVBVVhfU1dJVENIX1BVTkNU
X05PVElGWSAgICAgICAgICAxNgojZGVmaW5lIFBBTEVUVEVBVVhfQkVFUF9OT1RJ
RlkgICAgICAgICAgICAgICAgICAxNwoKLyogRm9yIENvbW1vbiB1c2VkIHByb3Rv
Y29sICovCiNkZWZpbmUgQ09NTU9OQVVYX0NPTU1JVF9LRVkgICAgICAgICAgICAg
ICAgICAgIDIwCiNkZWZpbmUgQ09NTU9OQVVYX0NPTU1JVF9TVFJJTkcgICAgICAg
ICAgICAgICAgIDIxCiNkZWZpbmUgQ09NTU9OQVVYX1VQREFURV9PUFRJT05TSU5G
TyAgICAgICAgICAgIDIyCiNkZWZpbmUgQ09NTU9OQVVYX0xPU1RfRk9DVVMgICAg
ICAgICAgICAgICAgICAgIDIzCgojZGVmaW5lIENPTU1PTkFVWF9DSEFOR0VfRk9D
VVNfTk9USUZZICAgICAgICAgICAyNAojZGVmaW5lIENPTU1PTkFVWF9VUERBVEVf
S0VZTUFQSU5GT19OT1RJRlkgICAgICAyNQojZGVmaW5lIENPTU1PTkFVWF9JTUVf
SU5GT19OT1RJRlkgICAgICAgICAgICAgICAyNgojZGVmaW5lIENPTU1PTkFVWF9T
SE9XX05PVElGWSAgICAgICAgICAgICAgICAgICAyNwojZGVmaW5lIENPTU1PTkFV
WF9ISURFX05PVElGWSAgICAgICAgICAgICAgICAgICAyOAoKI2RlZmluZSBDT01N
T05BVVhfQ09OTkVDVAkJCTUwCiNkZWZpbmUgQ09NTU9OQVVYX1NIT1dfUFJFRURJ
VF9OT1RJRlkJICAgICAgICA1MQojZGVmaW5lIENPTU1PTkFVWF9ISURFX1BSRUVE
SVRfTk9USUZZCSAgICAgICAgNTIKI2RlZmluZSBDT01NT05BVVhfVVBEQVRFX1BS
RUVESVRfTk9USUZZCSAgICAgICAgNTMKI2RlZmluZSBDT01NT05BVVhfU0hPV19D
QU5ESURBVEVTX05PVElGWQk1NAojZGVmaW5lIENPTU1PTkFVWF9ISURFX0NBTkRJ
REFURVNfTk9USUZZCTU1CiNkZWZpbmUgQ09NTU9OQVVYX1VQREFURV9DQU5ESURB
VEVTX05PVElGWQk1NgoKLyogRm9yIE9wdGlvbkF1eCAqLwojZGVmaW5lIE9QVElP
TkFVWF9DT05ORUNUICAgICAgICAgICAgICAgICAgICAgICAzMAojZGVmaW5lIE9Q
VElPTkFVWF9DSEFOR0VfU1RBVFVTICAgICAgICAgICAgICAgICAzMQoKLyogRm9y
IFNlbGVjdEF1eCAqLwojZGVmaW5lIFNFTEVDVEFVWF9DT05ORUNUICAgICAgICAg
ICAgICAgICAgICAgICA0MAojZGVmaW5lIFNFTEVDVEFVWF9TQVZFX0lNRUlORk8J
CSAgICAgICAgNDEKCi8qRm9yIFByb3BlcnRpZXNBdXggKi8KI2RlZmluZSBQQUxF
VFRFQVVYX1NIT1dfUFJPUEVSVElFU0FVWAkJNDIKCi8qIEZvciBjb21wb3NpdGUg
cHJlZWRpdC9jYW5kaWRhdGUgYXV4IHVzZWQgcHJvdG9jb2wgKi8KI2RlZmluZSBD
T01QT1NJVEVfUENfRklSU1RfRVZFTlRJRCAgICAgICAgICAgICAgMTAwMAojZGVm
aW5lIENPTVBPU0lURV9QQ19PUFRJT04gICAgICAgICAgICAgICAgICAgICAoQ09N
UE9TSVRFX1BDX0ZJUlNUX0VWRU5USUQrMSkKI2RlZmluZSBDT01QT1NJVEVfUENf
UFJFRURJVF9TRUxFQ1RJT04gICAgICAgICAgKENPTVBPU0lURV9QQ19GSVJTVF9F
VkVOVElEKzIpCiNkZWZpbmUgQ09NUE9TSVRFX1BDX0NBTkRJREFURV9TRUxFQ1RJ
T04gICAgICAgIChDT01QT1NJVEVfUENfRklSU1RfRVZFTlRJRCszKQojZGVmaW5l
IENPTVBPU0lURV9QQ19DQU5ESURBVEVfRk9DVVMgICAgICAgICAgICAoQ09NUE9T
SVRFX1BDX0ZJUlNUX0VWRU5USUQrNCkKI2RlZmluZSBDT01QT1NJVEVfUENfQ0FO
RElEQVRFX1BBR0UgICAgICAgICAgICAgKENPTVBPU0lURV9QQ19GSVJTVF9FVkVO
VElEKzUpCiNkZWZpbmUgQ09NUE9TSVRFX1BDX01PVkUgICAgICAgICAgICAgCQko
Q09NUE9TSVRFX1BDX0ZJUlNUX0VWRU5USUQrNikKCiNlbmRpZiAvKiBfTEVfQVVY
X1BST1RPQ09MX0hfICovCgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAGlta2V5LmgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAwMTAwNjQ0ADAyNzc1MDIAMDAwMDAxMgAwMDAw
MDAxNjU0MAAxMDMxMDAwMTUxNAAwMTE1MDAAIDAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAdXN0YXIgIABmemhhbmcA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHdoZWVsAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
I2lmbmRlZiBfSU1fS0VZU19ICiNkZWZpbmUgX0lNX0tFWVNfSAoKI2RlZmluZSBJ
TUVfVktfRU5URVIgICAgICAgICAgJ1xuJwojZGVmaW5lIElNRV9WS19CQUNLX1NQ
QUNFICAgICAnXGInCiNkZWZpbmUgSU1FX1ZLX1RBQiAgICAgICAgICAgICdcdCcK
I2RlZmluZSBJTUVfVktfQ0FOQ0VMICAgICAgICAgMHgwMwojZGVmaW5lIElNRV9W
S19DTEVBUiAgICAgICAgICAweDBDCiNkZWZpbmUgSU1FX1ZLX1NISUZUICAgICAg
ICAgIDB4MTAKI2RlZmluZSBJTUVfVktfQ09OVFJPTCAgICAgICAgMHgxMQojZGVm
aW5lIElNRV9WS19BTFQgICAgICAgICAgICAweDEyCiNkZWZpbmUgSU1FX1ZLX1BB
VVNFICAgICAgICAgIDB4MTMKI2RlZmluZSBJTUVfVktfQ0FQU19MT0NLICAgICAg
MHgxNAojZGVmaW5lIElNRV9WS19FU0NBUEUgICAgICAgICAweDFCCiNkZWZpbmUg
SU1FX1ZLX1NQQUNFICAgICAgICAgIDB4MjAKI2RlZmluZSBJTUVfVktfUEFHRV9V
UCAgICAgICAgMHgyMQojZGVmaW5lIElNRV9WS19QQUdFX0RPV04gICAgICAweDIy
CiNkZWZpbmUgSU1FX1ZLX0VORCAgICAgICAgICAgIDB4MjMKI2RlZmluZSBJTUVf
VktfSE9NRSAgICAgICAgICAgMHgyNAojZGVmaW5lIElNRV9WS19MRUZUICAgICAg
ICAgICAweDI1CiNkZWZpbmUgSU1FX1ZLX1VQICAgICAgICAgICAgIDB4MjYKI2Rl
ZmluZSBJTUVfVktfUklHSFQgICAgICAgICAgMHgyNwojZGVmaW5lIElNRV9WS19E
T1dOICAgICAgICAgICAweDI4CiNkZWZpbmUgSU1FX1ZLX0NPTU1BICAgICAgICAg
IDB4MkMKI2RlZmluZSBJTUVfVktfTUlOVVMgICAgICAgICAgMHgyRAojZGVmaW5l
IElNRV9WS19QRVJJT0QgICAgICAgICAweDJFCiNkZWZpbmUgSU1FX1ZLX1NMQVNI
ICAgICAgICAgIDB4MkYKI2RlZmluZSBJTUVfVktfMCAgICAgICAgICAgICAgMHgz
MAojZGVmaW5lIElNRV9WS18xICAgICAgICAgICAgICAweDMxCiNkZWZpbmUgSU1F
X1ZLXzIgICAgICAgICAgICAgIDB4MzIKI2RlZmluZSBJTUVfVktfMyAgICAgICAg
ICAgICAgMHgzMwojZGVmaW5lIElNRV9WS180ICAgICAgICAgICAgICAweDM0CiNk
ZWZpbmUgSU1FX1ZLXzUgICAgICAgICAgICAgIDB4MzUKI2RlZmluZSBJTUVfVktf
NiAgICAgICAgICAgICAgMHgzNgojZGVmaW5lIElNRV9WS183ICAgICAgICAgICAg
ICAweDM3CiNkZWZpbmUgSU1FX1ZLXzggICAgICAgICAgICAgIDB4MzgKI2RlZmlu
ZSBJTUVfVktfOSAgICAgICAgICAgICAgMHgzOQojZGVmaW5lIElNRV9WS19TRU1J
Q09MT04gICAgICAweDNCCiNkZWZpbmUgSU1FX1ZLX0VRVUFMUyAgICAgICAgIDB4
M0QKI2RlZmluZSBJTUVfVktfQSAgICAgICAgICAgICAgMHg0MQojZGVmaW5lIElN
RV9WS19CICAgICAgICAgICAgICAweDQyCiNkZWZpbmUgSU1FX1ZLX0MgICAgICAg
ICAgICAgIDB4NDMKI2RlZmluZSBJTUVfVktfRCAgICAgICAgICAgICAgMHg0NAoj
ZGVmaW5lIElNRV9WS19FICAgICAgICAgICAgICAweDQ1CiNkZWZpbmUgSU1FX1ZL
X0YgICAgICAgICAgICAgIDB4NDYKI2RlZmluZSBJTUVfVktfRyAgICAgICAgICAg
ICAgMHg0NwojZGVmaW5lIElNRV9WS19IICAgICAgICAgICAgICAweDQ4CiNkZWZp
bmUgSU1FX1ZLX0kgICAgICAgICAgICAgIDB4NDkKI2RlZmluZSBJTUVfVktfSiAg
ICAgICAgICAgICAgMHg0QQojZGVmaW5lIElNRV9WS19LICAgICAgICAgICAgICAw
eDRCCiNkZWZpbmUgSU1FX1ZLX0wgICAgICAgICAgICAgIDB4NEMKI2RlZmluZSBJ
TUVfVktfTSAgICAgICAgICAgICAgMHg0RAojZGVmaW5lIElNRV9WS19OICAgICAg
ICAgICAgICAweDRFCiNkZWZpbmUgSU1FX1ZLX08gICAgICAgICAgICAgIDB4NEYK
I2RlZmluZSBJTUVfVktfUCAgICAgICAgICAgICAgMHg1MAojZGVmaW5lIElNRV9W
S19RICAgICAgICAgICAgICAweDUxCiNkZWZpbmUgSU1FX1ZLX1IgICAgICAgICAg
ICAgIDB4NTIKI2RlZmluZSBJTUVfVktfUyAgICAgICAgICAgICAgMHg1MwojZGVm
aW5lIElNRV9WS19UICAgICAgICAgICAgICAweDU0CiNkZWZpbmUgSU1FX1ZLX1Ug
ICAgICAgICAgICAgIDB4NTUKI2RlZmluZSBJTUVfVktfViAgICAgICAgICAgICAg
MHg1NgojZGVmaW5lIElNRV9WS19XICAgICAgICAgICAgICAweDU3CiNkZWZpbmUg
SU1FX1ZLX1ggICAgICAgICAgICAgIDB4NTgKI2RlZmluZSBJTUVfVktfWSAgICAg
ICAgICAgICAgMHg1OQojZGVmaW5lIElNRV9WS19aICAgICAgICAgICAgICAweDVB
CiNkZWZpbmUgSU1FX1ZLX09QRU5fQlJBQ0tFVCAgIDB4NUIKI2RlZmluZSBJTUVf
VktfQkFDS19TTEFTSCAgICAgMHg1QwojZGVmaW5lIElNRV9WS19DTE9TRV9CUkFD
S0VUICAweDVECiNkZWZpbmUgSU1FX1ZLX05VTVBBRDAgICAgICAgIDB4NjAKI2Rl
ZmluZSBJTUVfVktfTlVNUEFEMSAgICAgICAgMHg2MQojZGVmaW5lIElNRV9WS19O
VU1QQUQyICAgICAgICAweDYyCiNkZWZpbmUgSU1FX1ZLX05VTVBBRDMgICAgICAg
IDB4NjMKI2RlZmluZSBJTUVfVktfTlVNUEFENCAgICAgICAgMHg2NAojZGVmaW5l
IElNRV9WS19OVU1QQUQ1ICAgICAgICAweDY1CiNkZWZpbmUgSU1FX1ZLX05VTVBB
RDYgICAgICAgIDB4NjYKI2RlZmluZSBJTUVfVktfTlVNUEFENyAgICAgICAgMHg2
NwojZGVmaW5lIElNRV9WS19OVU1QQUQ4ICAgICAgICAweDY4CiNkZWZpbmUgSU1F
X1ZLX05VTVBBRDkgICAgICAgIDB4NjkKI2RlZmluZSBJTUVfVktfTVVMVElQTFkg
ICAgICAgMHg2QQojZGVmaW5lIElNRV9WS19BREQgICAgICAgICAgICAweDZCCiNk
ZWZpbmUgSU1FX1ZLX1NFUEFSQVRFUiAgICAgIDB4NkMKI2RlZmluZSBJTUVfVktf
U1VCVFJBQ1QgICAgICAgMHg2RAojZGVmaW5lIElNRV9WS19ERUNJTUFMICAgICAg
ICAweDZFCiNkZWZpbmUgSU1FX1ZLX0RJVklERSAgICAgICAgIDB4NkYKI2RlZmlu
ZSBJTUVfVktfREVMRVRFICAgICAgICAgMHg3RiAvKiBBU0NJSSBERUwgKi8KI2Rl
ZmluZSBJTUVfVktfTlVNX0xPQ0sgICAgICAgMHg5MAojZGVmaW5lIElNRV9WS19T
Q1JPTExfTE9DSyAgICAweDkxCiNkZWZpbmUgSU1FX1ZLX0YxICAgICAgICAgICAg
IDB4NzAKI2RlZmluZSBJTUVfVktfRjIgICAgICAgICAgICAgMHg3MQojZGVmaW5l
IElNRV9WS19GMyAgICAgICAgICAgICAweDcyCiNkZWZpbmUgSU1FX1ZLX0Y0ICAg
ICAgICAgICAgIDB4NzMKI2RlZmluZSBJTUVfVktfRjUgICAgICAgICAgICAgMHg3
NAojZGVmaW5lIElNRV9WS19GNiAgICAgICAgICAgICAweDc1CiNkZWZpbmUgSU1F
X1ZLX0Y3ICAgICAgICAgICAgIDB4NzYKI2RlZmluZSBJTUVfVktfRjggICAgICAg
ICAgICAgMHg3NwojZGVmaW5lIElNRV9WS19GOSAgICAgICAgICAgICAweDc4CiNk
ZWZpbmUgSU1FX1ZLX0YxMCAgICAgICAgICAgIDB4NzkKI2RlZmluZSBJTUVfVktf
RjExICAgICAgICAgICAgMHg3QQojZGVmaW5lIElNRV9WS19GMTIgICAgICAgICAg
ICAweDdCCiNkZWZpbmUgSU1FX1ZLX0YxMyAgICAgICAgICAgIDB4RjAwMAojZGVm
aW5lIElNRV9WS19GMTQgICAgICAgICAgICAweEYwMDEKI2RlZmluZSBJTUVfVktf
RjE1ICAgICAgICAgICAgMHhGMDAyCiNkZWZpbmUgSU1FX1ZLX0YxNiAgICAgICAg
ICAgIDB4RjAwMwojZGVmaW5lIElNRV9WS19GMTcgICAgICAgICAgICAweEYwMDQK
I2RlZmluZSBJTUVfVktfRjE4ICAgICAgICAgICAgMHhGMDA1CiNkZWZpbmUgSU1F
X1ZLX0YxOSAgICAgICAgICAgIDB4RjAwNgojZGVmaW5lIElNRV9WS19GMjAgICAg
ICAgICAgICAweEYwMDcKI2RlZmluZSBJTUVfVktfRjIxICAgICAgICAgICAgMHhG
MDA4CiNkZWZpbmUgSU1FX1ZLX0YyMiAgICAgICAgICAgIDB4RjAwOQojZGVmaW5l
IElNRV9WS19GMjMgICAgICAgICAgICAweEYwMEEKI2RlZmluZSBJTUVfVktfRjI0
ICAgICAgICAgICAgMHhGMDBCCiNkZWZpbmUgSU1FX1ZLX1BSSU5UU0NSRUVOICAg
IDB4OUEKI2RlZmluZSBJTUVfVktfSU5TRVJUICAgICAgICAgMHg5QgojZGVmaW5l
IElNRV9WS19IRUxQICAgICAgICAgICAweDlDCiNkZWZpbmUgSU1FX1ZLX01FVEEg
ICAgICAgICAgIDB4OUQKI2RlZmluZSBJTUVfVktfQkFDS19RVU9URSAgICAgMHhD
MAojZGVmaW5lIElNRV9WS19RVU9URSAgICAgICAgICAweERFCiNkZWZpbmUgSU1F
X1ZLX0tQX1VQICAgICAgICAgIDB4RTAKI2RlZmluZSBJTUVfVktfS1BfRE9XTiAg
ICAgICAgMHhFMQojZGVmaW5lIElNRV9WS19LUF9MRUZUICAgICAgICAweEUyCiNk
ZWZpbmUgSU1FX1ZLX0tQX1JJR0hUICAgICAgIDB4RTMKI2RlZmluZSBJTUVfVktf
REVBRF9HUkFWRSAgICAgICAgICAgICAgIDB4ODAKI2RlZmluZSBJTUVfVktfREVB
RF9BQ1VURSAgICAgICAgICAgICAgIDB4ODEKI2RlZmluZSBJTUVfVktfREVBRF9D
SVJDVU1GTEVYICAgICAgICAgIDB4ODIKI2RlZmluZSBJTUVfVktfREVBRF9USUxE
RSAgICAgICAgICAgICAgIDB4ODMKI2RlZmluZSBJTUVfVktfREVBRF9NQUNST04g
ICAgICAgICAgICAgIDB4ODQKI2RlZmluZSBJTUVfVktfREVBRF9CUkVWRSAgICAg
ICAgICAgICAgIDB4ODUKI2RlZmluZSBJTUVfVktfREVBRF9BQk9WRURPVCAgICAg
ICAgICAgIDB4ODYKI2RlZmluZSBJTUVfVktfREVBRF9ESUFFUkVTSVMgICAgICAg
ICAgIDB4ODcKI2RlZmluZSBJTUVfVktfREVBRF9BQk9WRVJJTkcgICAgICAgICAg
IDB4ODgKI2RlZmluZSBJTUVfVktfREVBRF9ET1VCTEVBQ1VURSAgICAgICAgIDB4
ODkKI2RlZmluZSBJTUVfVktfREVBRF9DQVJPTiAgICAgICAgICAgICAgIDB4OGEK
I2RlZmluZSBJTUVfVktfREVBRF9DRURJTExBICAgICAgICAgICAgIDB4OGIKI2Rl
ZmluZSBJTUVfVktfREVBRF9PR09ORUsgICAgICAgICAgICAgIDB4OGMKI2RlZmlu
ZSBJTUVfVktfREVBRF9JT1RBICAgICAgICAgICAgICAgIDB4OGQKI2RlZmluZSBJ
TUVfVktfREVBRF9WT0lDRURfU09VTkQgICAgICAgIDB4OGUKI2RlZmluZSBJTUVf
VktfREVBRF9TRU1JVk9JQ0VEX1NPVU5EICAgIDB4OGYKI2RlZmluZSBJTUVfVktf
QU1QRVJTQU5EICAgICAgICAgICAgICAgIDB4OTYKI2RlZmluZSBJTUVfVktfQVNU
RVJJU0sgICAgICAgICAgICAgICAgIDB4OTcKI2RlZmluZSBJTUVfVktfUVVPVEVE
QkwgICAgICAgICAgICAgICAgIDB4OTgKI2RlZmluZSBJTUVfVktfTEVTUyAgICAg
ICAgICAgICAgICAgICAgIDB4OTkKI2RlZmluZSBJTUVfVktfR1JFQVRFUiAgICAg
ICAgICAgICAgICAgIDB4YTAKI2RlZmluZSBJTUVfVktfQlJBQ0VMRUZUICAgICAg
ICAgICAgICAgIDB4YTEKI2RlZmluZSBJTUVfVktfQlJBQ0VSSUdIVCAgICAgICAg
ICAgICAgIDB4YTIKI2RlZmluZSBJTUVfVktfQVQgICAgICAgICAgICAgICAgICAg
ICAgIDB4MDIwMAojZGVmaW5lIElNRV9WS19DT0xPTiAgICAgICAgICAgICAgICAg
ICAgMHgwMjAxCiNkZWZpbmUgSU1FX1ZLX0NJUkNVTUZMRVggICAgICAgICAgICAg
ICAweDAyMDIKI2RlZmluZSBJTUVfVktfRE9MTEFSICAgICAgICAgICAgICAgICAg
IDB4MDIwMwojZGVmaW5lIElNRV9WS19FVVJPX1NJR04gICAgICAgICAgICAgICAg
MHgwMjA0CiNkZWZpbmUgSU1FX1ZLX0VYQ0xBTUFUSU9OX01BUksgICAgICAgICAw
eDAyMDUKI2RlZmluZSBJTUVfVktfSU5WRVJURURfRVhDTEFNQVRJT05fTUFSSyAw
eDAyMDYKI2RlZmluZSBJTUVfVktfTEVGVF9QQVJFTlRIRVNJUyAgICAgICAgIDB4
MDIwNwojZGVmaW5lIElNRV9WS19OVU1CRVJfU0lHTiAgICAgICAgICAgICAgMHgw
MjA4CiNkZWZpbmUgSU1FX1ZLX1BMVVMgICAgICAgICAgICAgICAgICAgICAweDAy
MDkKI2RlZmluZSBJTUVfVktfUklHSFRfUEFSRU5USEVTSVMgICAgICAgIDB4MDIw
QQojZGVmaW5lIElNRV9WS19VTkRFUlNDT1JFICAgICAgICAgICAgICAgMHgwMjBC
CiNkZWZpbmUgSU1FX1ZLX0ZJTkFMICAgICAgICAgICAgICAgICAgICAweDAwMTgK
I2RlZmluZSBJTUVfVktfQ09OVkVSVCAgICAgICAgICAgICAgICAgIDB4MDAxQwoj
ZGVmaW5lIElNRV9WS19OT05DT05WRVJUICAgICAgICAgICAgICAgMHgwMDFECiNk
ZWZpbmUgSU1FX1ZLX0FDQ0VQVCAgICAgICAgICAgICAgICAgICAweDAwMUUKI2Rl
ZmluZSBJTUVfVktfTU9ERUNIQU5HRSAgICAgICAgICAgICAgIDB4MDAxRgojZGVm
aW5lIElNRV9WS19LQU5BICAgICAgICAgICAgICAgICAgICAgMHgwMDE1CiNkZWZp
bmUgSU1FX1ZLX0tBTkpJICAgICAgICAgICAgICAgICAgICAweDAwMTkKI2RlZmlu
ZSBJTUVfVktfQUxQSEFOVU1FUklDICAgICAgICAgICAgIDB4MDBGMAojZGVmaW5l
IElNRV9WS19LQVRBS0FOQSAgICAgICAgICAgICAgICAgMHgwMEYxCiNkZWZpbmUg
SU1FX1ZLX0hJUkFHQU5BICAgICAgICAgICAgICAgICAweDAwRjIKI2RlZmluZSBJ
TUVfVktfRlVMTF9XSURUSCAgICAgICAgICAgICAgIDB4MDBGMwojZGVmaW5lIElN
RV9WS19IQUxGX1dJRFRIICAgICAgICAgICAgICAgMHgwMEY0CiNkZWZpbmUgSU1F
X1ZLX1JPTUFOX0NIQVJBQ1RFUlMgICAgICAgICAweDAwRjUKI2RlZmluZSBJTUVf
VktfQUxMX0NBTkRJREFURVMgICAgICAgICAgIDB4MDEwMAojZGVmaW5lIElNRV9W
S19QUkVWSU9VU19DQU5ESURBVEUgICAgICAgMHgwMTAxCiNkZWZpbmUgSU1FX1ZL
X0NPREVfSU5QVVQgICAgICAgICAgICAgICAweDAxMDIKI2RlZmluZSBJTUVfVktf
SkFQQU5FU0VfS0FUQUtBTkEgICAgICAgIDB4MDEwMwojZGVmaW5lIElNRV9WS19K
QVBBTkVTRV9ISVJBR0FOQSAgICAgICAgMHgwMTA0CiNkZWZpbmUgSU1FX1ZLX0pB
UEFORVNFX1JPTUFOICAgICAgICAgICAweDAxMDUKI2RlZmluZSBJTUVfVktfQ1VU
ICAgICAgICAgICAgICAgICAgICAgIDB4RkZEMQojZGVmaW5lIElNRV9WS19DT1BZ
ICAgICAgICAgICAgICAgICAgICAgMHhGRkNECiNkZWZpbmUgSU1FX1ZLX1BBU1RF
ICAgICAgICAgICAgICAgICAgICAweEZGQ0YKI2RlZmluZSBJTUVfVktfVU5ETyAg
ICAgICAgICAgICAgICAgICAgIDB4RkZDQgojZGVmaW5lIElNRV9WS19BR0FJTiAg
ICAgICAgICAgICAgICAgICAgMHhGRkM5CiNkZWZpbmUgSU1FX1ZLX0ZJTkQgICAg
ICAgICAgICAgICAgICAgICAweEZGRDAKI2RlZmluZSBJTUVfVktfUFJPUFMgICAg
ICAgICAgICAgICAgICAgIDB4RkZDQQojZGVmaW5lIElNRV9WS19TVE9QICAgICAg
ICAgICAgICAgICAgICAgMHhGRkM4CiNkZWZpbmUgSU1FX1ZLX0NPTVBPU0UgICAg
ICAgICAgICAgICAgICAweEZGMjAKI2RlZmluZSBJTUVfVktfQUxUX0dSQVBIICAg
ICAgICAgICAgICAgIDB4RkY3RQojZGVmaW5lIElNRV9WS19VTkRFRklORUQgICAg
ICAgICAgICAgICAgMHgwCgojZGVmaW5lCUlNRV9TSElGVF9NQVNLCSAgICAgICAg
KDEgPDwgMCkKI2RlZmluZQlJTUVfQ1RSTF9NQVNLCSAgICAgICAgKDEgPDwgMSkK
I2RlZmluZQlJTUVfTUVUQV9NQVNLCSAgICAgICAgKDEgPDwgMikKI2RlZmluZQlJ
TUVfQUxUX01BU0sJICAgICAgICAoMSA8PCAzKQojZGVmaW5lCUlNRV9BTFRfR1JB
UEhfTUFTSwkoMSA8PCA1KQojZGVmaW5lCUlNRV9CVVRUT04xX01BU0sJKDEgPDwg
NCkKI2RlZmluZQlJTUVfQlVUVE9OMl9NQVNLCUFMVF9NQVNLCiNkZWZpbmUJSU1F
X0JVVFRPTjNfTUFTSwlNRVRBX01BU0sKCiNlbmRpZgoAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
SU1TZXJ2aWNlLmMAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAADAxMDA2NDQAMDI3NzUwMgAwMDAwMDEyADAwMDAwMDQxNDU1ADEwMzExMjMy
MjAxADAxMjIwNgAgMAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAB1c3RhciAgAGZ6aGFuZwAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAd2hlZWwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAvKgogIENvcHlyaWdodCAx
OTkwLTIwMDUgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiBBbGwgUmlnaHRzIFJlc2Vy
dmVkLgoKICBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNo
YXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYQogIGNvcHkgb2YgdGhpcyBz
b2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUK
ICAiU29mdHdhcmUiKSwgdG8gZGVhbCBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCBy
ZXN0cmljdGlvbiwgaW5jbHVkaW5nCiAgd2l0aG91dCBsaW1pdGF0aW9uIHRoZSBy
aWdodHMgdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLAogIGRp
c3RyaWJ1dGUsIHN1YmxpY2Vuc2UsIGFuZC9vciBzZWxsIGNvcGllcyBvZiB0aGUg
U29mdHdhcmUsIGFuZCB0bwogIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlIFNv
ZnR3YXJlIGlzIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0bwogIHRoZSBm
b2xsb3dpbmcgY29uZGl0aW9uczogVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2Ug
YW5kIHRoaXMKICBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZSBpbmNsdWRlZCBp
biBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsCiAgcG9ydGlvbnMgb2YgdGhlIFNv
ZnR3YXJlLgoKCiAgVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJ
VEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MKICBPUiBJTVBMSUVE
LCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9G
CiAgTUVSQ0hBTlRBQklMSVRZLCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVS
UE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULgogIElOIE5PIEVWRU5UIFNIQUxMIFRI
RSBPUEVOIEdST1VQIE9SIFNVTiBNSUNST1NZU1RFTVMsIElOQy4gQkUgTElBQkxF
CiAgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUiBMSUFCSUxJVFksIFdI
RVRIRVIgSU4gQU4gQUNUSU9OIE9GCiAgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJX
SVNFLCBBUklTSU5HIEZST00sIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEgK
ICBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTiBU
SEUgU09GVFdBUkUgRVZFTiBJRgogIEFEVklTRUQgSU4gQURWQU5DRSBPRiBUSEUg
UE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0VTLgoKCiAgRXhjZXB0IGFzIGNvbnRh
aW5lZCBpbiB0aGlzIG5vdGljZSwgdGhlIG5hbWVzIG9mIFRoZSBPcGVuIEdyb3Vw
IGFuZC9vcgogIFN1biBNaWNyb3N5c3RlbXMsIEluYy4gc2hhbGwgbm90IGJlIHVz
ZWQgaW4gYWR2ZXJ0aXNpbmcgb3Igb3RoZXJ3aXNlIHRvCiAgcHJvbW90ZSB0aGUg
c2FsZSwgdXNlIG9yIG90aGVyIGRlYWxpbmdzIGluIHRoaXMgU29mdHdhcmUgd2l0
aG91dCBwcmlvcgogIHdyaXR0ZW4gYXV0aG9yaXphdGlvbiBmcm9tIFRoZSBPcGVu
IEdyb3VwIGFuZC9vciBTdW4gTWljcm9zeXN0ZW1zLAogIEluYy4sIGFzIGFwcGxp
Y2FibGUuCgoKICBYIFdpbmRvdyBTeXN0ZW0gaXMgYSB0cmFkZW1hcmsgb2YgVGhl
IE9wZW4gR3JvdXAKCiAgT1NGLzEsIE9TRi9Nb3RpZiBhbmQgTW90aWYgYXJlIHJl
Z2lzdGVyZWQgdHJhZGVtYXJrcywgYW5kIE9TRiwgdGhlIE9TRgogIGxvZ28sIExC
WCwgWCBXaW5kb3cgU3lzdGVtLCBhbmQgWGluZXJhbWEgYXJlIHRyYWRlbWFya3Mg
b2YgdGhlIE9wZW4KICBHcm91cC4gQWxsIG90aGVyIHRyYWRlbWFya3MgYW5kIHJl
Z2lzdGVyZWQgdHJhZGVtYXJrcyBtZW50aW9uZWQgaGVyZWluCiAgYXJlIHRoZSBw
cm9wZXJ0eSBvZiB0aGVpciByZXNwZWN0aXZlIG93bmVycy4gTm8gcmlnaHQsIHRp
dGxlIG9yCiAgaW50ZXJlc3QgaW4gb3IgdG8gYW55IHRyYWRlbWFyaywgc2Vydmlj
ZSBtYXJrLCBsb2dvIG9yIHRyYWRlIG5hbWUgb2YKICBTdW4gTWljcm9zeXN0ZW1z
LCBJbmMuIG9yIGl0cyBsaWNlbnNvcnMgaXMgZ3JhbnRlZC4KCiovCgojaW5jbHVk
ZSA8c3RkaW8uaD4KI2luY2x1ZGUgPHN0cmluZy5oPgojaW5jbHVkZSA8c3RkbGli
Lmg+CiNpbmNsdWRlICJJTVNlc3Npb24uaCIKI2luY2x1ZGUgImF1eF9wcm90b2Nv
bC5oIgojaW5jbHVkZSAiSU1VdGlsLmgiCiNpbmNsdWRlICJJTUUuaCIKI2luY2x1
ZGUgImlta2V5LmgiCgojZGVmaW5lIElNTV9TRVJWSUNFX1ZFUlNJT04gMHgwMTAx
CgpzdGF0aWMgSW1lSW5mbyBzZXJ2aWNlX2dldF9pbWVfaW5mbyAoSW1lSW5wdXRD
b250ZXh0KTsKc3RhdGljIEltZUVuY29kaW5nIHNlcnZpY2VfZ2V0X3Nlc3Npb25f
ZW5jb2RpbmcgKEltZUlucHV0Q29udGV4dCk7CnN0YXRpYyBJbW1SZXN1bHQgc2Vy
dmljZV9zaG93X3ByZWVkaXQgKEltZUlucHV0Q29udGV4dCk7CnN0YXRpYyBJbW1S
ZXN1bHQgc2VydmljZV9oaWRlX3ByZWVkaXQgKEltZUlucHV0Q29udGV4dCk7CnN0
YXRpYyBJbW1SZXN1bHQgc2VydmljZV91cGRhdGVfcHJlZWRpdCAoSW1lSW5wdXRD
b250ZXh0LCBJbWVQcmVlZGl0KTsKc3RhdGljIEltbVJlc3VsdCBzZXJ2aWNlX21v
dmVfcHJlZWRpdF9jYXJldCAoSW1lSW5wdXRDb250ZXh0LCBpbnQpOwpzdGF0aWMg
SW1tUmVzdWx0IHNlcnZpY2Vfc2hvd19jYW5kaWRhdGVzIChJbWVJbnB1dENvbnRl
eHQpOwpzdGF0aWMgSW1tUmVzdWx0IHNlcnZpY2VfaGlkZV9jYW5kaWRhdGVzIChJ
bWVJbnB1dENvbnRleHQpOwpzdGF0aWMgSW1tUmVzdWx0IHNlcnZpY2VfdXBkYXRl
X2NhbmRpZGF0ZXMgKEltZUlucHV0Q29udGV4dCwgSW1lQ2FuZGlkYXRlcyk7CnN0
YXRpYyBJbW1SZXN1bHQgc2VydmljZV9jb21taXQgKEltZUlucHV0Q29udGV4dCwg
dW5zaWduZWQgY2hhciAqKTsKc3RhdGljIEltbVJlc3VsdCBzZXJ2aWNlX3Nob3df
YXV4IChJbWVJbnB1dENvbnRleHQsIGNvbnN0IGNoYXIgKik7CnN0YXRpYyBJbW1S
ZXN1bHQgc2VydmljZV9oaWRlX2F1eCAoSW1lSW5wdXRDb250ZXh0LCBJbUhhbmRs
ZSk7CnN0YXRpYyBJbW1SZXN1bHQgc2VydmljZV9zZW5kX2F1eF9kYXRhIChJbWVF
dmVudCk7CnN0YXRpYyB2b2lkICpzZXJ2aWNlX2dldF9pbWVfZGF0YSAoSW1lSW5w
dXRDb250ZXh0LCBJbWVTY29wZVR5cGUpOwpzdGF0aWMgSW1tUmVzdWx0IHNlcnZp
Y2Vfc2V0X2ltZV9kYXRhIChJbWVJbnB1dENvbnRleHQsIEltZVNjb3BlVHlwZSwg
dm9pZCAqKTsKc3RhdGljIHZvaWQgKnNlcnZpY2VfbG9hZF91c2VyX3Byb2ZpbGUg
KEltZUlucHV0Q29udGV4dCwgY29uc3QgY2hhciAqLCBpbnQgKik7CnN0YXRpYyBJ
bW1SZXN1bHQgc2VydmljZV9mcmVlX3VzZXJfcHJvZmlsZSAodm9pZCAqKTsKc3Rh
dGljIEltbVJlc3VsdCBzZXJ2aWNlX2JlZXAgKEltZUlucHV0Q29udGV4dCwgSW1l
QmVlcFR5cGUpOwpzdGF0aWMgSW1lS2V5VHlwZSBzZXJ2aWNlX21hcF9rZXlldmVu
dCAoSW1lS2V5KTsKCkltbVNlcnZpY2VzUmVjIGRlZmF1bHRfaW1tX3NlcnZpY2Vz
ID0gewogIElNTV9TRVJWSUNFX1ZFUlNJT04sICAgICAgICAgIC8qIHZlcnNpb24g
ICAgICAgICAgICAgICovCiAgc2VydmljZV9nZXRfaW1lX2luZm8sICAgICAgICAg
LyogSW1tR2V0SW1lSW5mbyAgICAgICAgKi8KICBzZXJ2aWNlX2dldF9zZXNzaW9u
X2VuY29kaW5nLCAvKiBJbW1HZXRTZXNzaW9uRW5jb2RpbmcgKi8KICBzZXJ2aWNl
X3Nob3dfcHJlZWRpdCwgICAgICAgICAvKiBJbW1TaG93UHJlZWRpdCAgICAgICAq
LwogIHNlcnZpY2VfaGlkZV9wcmVlZGl0LCAgICAgICAgIC8qIEltbUhpZGVQcmVl
aXQgICAgICAgICovCiAgc2VydmljZV91cGRhdGVfcHJlZWRpdCwgICAgICAgLyog
SW1tVXBkYXRlUHJlZGl0ICAgICAgKi8KICBzZXJ2aWNlX21vdmVfcHJlZWRpdF9j
YXJldCwgICAvKiBJbW1Nb3ZlUHJlZWRpdENhcmV0ICAqLwogIHNlcnZpY2Vfc2hv
d19jYW5kaWRhdGVzLCAgICAgIC8qIEltbVNob3dDYW5kaWRhdGVzICAgICovCiAg
c2VydmljZV9oaWRlX2NhbmRpZGF0ZXMsICAgICAgLyogSW1tSGlkZUNhbmRpZGF0
ZXMgICAgKi8KICBzZXJ2aWNlX3VwZGF0ZV9jYW5kaWRhdGVzLCAgICAvKiBJbW1V
cGRhdGVDYW5kaWRhdGVzICAqLwogIHNlcnZpY2VfY29tbWl0LCAgICAgICAgICAg
ICAgIC8qIEltbUNvbW1pdCAgICAgICAgICAgICovCiAgc2VydmljZV9zaG93X2F1
eCwgICAgICAgICAgICAgLyogSW1tU3RhcnRVSSAgICAgICAgICAgKi8KICBzZXJ2
aWNlX2hpZGVfYXV4LCAgICAgICAgICAgICAvKiBJbW1DbG9zZVVJICAgICAgICAg
ICAqLwogIHNlcnZpY2Vfc2VuZF9hdXhfZGF0YSwgICAgICAgIC8qIEltbVNlbmRV
aU1lc3NhZ2UgICAgICovCiAgc2VydmljZV9nZXRfaW1lX2RhdGEsICAgICAgICAg
LyogSW1tR2V0RGF0YSAgICAgICAgICAgKi8KICBzZXJ2aWNlX3NldF9pbWVfZGF0
YSwgICAgICAgICAvKiBJbW1TZXREYXRhICAgICAgICAgICAqLwogIHNlcnZpY2Vf
bG9hZF91c2VyX3Byb2ZpbGUsICAgIC8qIEltbUxvYWRVc2VyUHJvZmlsZSAgICov
CiAgc2VydmljZV9mcmVlX3VzZXJfcHJvZmlsZSwgICAgLyogSW1tRnJlZVVzZXJQ
cm9maWxlICAgKi8KICBOVUxMLCAgICAgICAgICAgICAgICAgICAgICAgICAvKiBJ
bW1TYXZlVXNlclByb2ZpbGUgICAqLwogIHNlcnZpY2VfYmVlcCwgICAgICAgICAg
ICAgICAgIC8qIEltbUJlZXAgICAgICAgICAgICAgICovCiAgc2VydmljZV9tYXBf
a2V5ZXZlbnQsICAgICAgICAgLyogSW1tUHJlZmlsdGVyS2V5ICAgICAgKi8KICBO
VUxMICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBJbW1HZXRQcm9wZXJ0eUxp
c3QgICAqLwp9OwoKc3RhdGljIEltZUluZm8Kc2VydmljZV9nZXRfaW1lX2luZm8g
KEltZUlucHV0Q29udGV4dCBpYykKewogIFNlc3Npb25Db250ZXh0ICpzYyA9IChT
ZXNzaW9uQ29udGV4dCAqKSBpYzsKICBJbWVNb2R1bGUgaW1lX21vZHVsZTsKCiAg
aWYgKCFzYyB8fCAhc2MtPnMpIHJldHVybiBOVUxMOwoKICAvLyBGSVhNRSB3aHkg
bm90IHVzZSBjdXJyX2ltZV9tb2R1bGUgaGVyZT8KICBpbWVfbW9kdWxlID0gc2Vz
c2lvbl9nZXRfY3VycmVudF9pbWVfbW9kdWxlIChzYy0+cyk7CgogIHJldHVybiBp
bWVfbW9kdWxlID8gaW1lX21vZHVsZS0+aW5mbyA6IE5VTEw7Cn0KCnN0YXRpYyBJ
bWVFbmNvZGluZwpzZXJ2aWNlX2dldF9zZXNzaW9uX2VuY29kaW5nIChJbWVJbnB1
dENvbnRleHQgaWMpCnsKICBTZXNzaW9uQ29udGV4dCAqc2MgPSAoU2Vzc2lvbkNv
bnRleHQgKikgaWM7CgogIC8qIAogICAqIFVURi04IHdvdWxkIGJlIGRlZmF1bHQg
ZW5jb2RpbmcgaWYgZW5jb2RpbmcgaXNuJ3Qgc3BlY2lmaWVkCiAgICovCiAgaWYg
KCFzYyB8fCAhc2MtPnMpIHJldHVybiBFTkNPREVfVVRGODsKCiAgLy8gRklYTUUg
d2h5IGRvbid0IHVzZSBjbGllbnQgZW5jb2RpbmcgZGlyZWN0bHkgaGVyZT8KICBy
ZXR1cm4gc2Vzc2lvbl9nZXRfY2xpZW50X2VuY29kaW5nIChzYy0+cyk7Cn0KCnN0
YXRpYyBJbW1SZXN1bHQKc2VydmljZV9zaG93X3ByZWVkaXQgKEltZUlucHV0Q29u
dGV4dCBpYykKewogIFNlc3Npb25Db250ZXh0ICpzYyA9IChTZXNzaW9uQ29udGV4
dCAqKSBpYzsKCiAgaWYgKCFzYyB8fCAhc2MtPnMpIHJldHVybiBJbW1GQUlMOwoK
ICBzYy0+cHJlZWRpdF9zaG93ID0gVHJ1ZTsKCiAgLyogRklYTUUgbmVlZCB0byBz
dXBwb3J0IGNvbW1vbiBhdXggd2luIG9yIGF1eCBvYmplY3QgaGVyZSAqLwogIGlm
IChzYy0+YXV4dHlwZSA9PSBERUZBVUxUX0FVWF9UWVBFKQogICAgc2MtPnMtPklm
LT5tX3dyYXBwZXItPmltbF9wcmVlZGl0X3N0YXJ0IChzYy0+cyk7CgogIHJldHVy
biBJbW1PSzsKfQoKc3RhdGljIEltbVJlc3VsdApzZXJ2aWNlX2hpZGVfcHJlZWRp
dCAoSW1lSW5wdXRDb250ZXh0IGljKQp7CiAgU2Vzc2lvbkNvbnRleHQgKnNjID0g
KFNlc3Npb25Db250ZXh0ICopIGljOwoKICBpZiAoIXNjIHx8ICFzYy0+cykgcmV0
dXJuIEltbUZBSUw7CgogIHNjLT5wcmVlZGl0X3Nob3cgPSBGYWxzZTsKCiAgLyog
RklYTUUgbmVlZCB0byBzdXBwb3J0IGNvbW1vbiBhdXggb3IgYXV4IG9iamVjdCBo
ZXJlICovCiAgaWYgKHNjLT5hdXh0eXBlID09IERFRlVMVF9BVVhfVFlQRSkKICAg
IHNjLT5zLT5JZi0+bV93cmFwcGVyLT5pbWxfcHJlZWRpdF9lbmQgKHNjLT5zKTsK
CiAgcmV0dXJuIEltbU9LOwp9CgpzdGF0aWMgdm9pZApkdXBJTVRleHQgKEltZVRl
eHQgZGVzdCwgSW1lVGV4dCBzcmMpCnsKICBpZiAoIWRlc3QpIHJldHVybjsKCiAg
aWYgKCFzcmMpCiAgICBtZW1zZXQgKGRlc3QsIDAsIHNpemVvZiAoSW1lVGV4dFJl
YykpOwoKICBkZXN0LT5jb3VudF9mZWVkYmFja3MgPSBzcmMtPmNvdW50X2ZlZWRi
YWNrczsKCiAgaWYgKHNyYy0+dGV4dCkKICAgIGRlc3QtPnRleHQgPSBzdHJkdXAg
KHNyYy0+dGV4dCk7CgogIGlmIChzcmMtPmZlZWRiYWNrcykKICAgIHsKICAgICAg
aW50IGk7CgogICAgICBkZXN0LT5mZWVkYmFja3MgPSAoSW1lRmVlZGJhY2tSZWMg
KiltYWxsb2MgKHNyYy0+Y291bnRfZmVlZGJhY2tzICoKCQkJCQkJICBzaXplb2Yg
KEltZUZlZWRiYWNrUmVjKSk7CgogICAgICBmb3IgKGkgPSAwOyBpIDwgc3JjLT5j
b3VudF9mZWVkYmFja3M7ICsraSkKCWRlc3QtPmZlZWRiYWNrc1tpXSA9IHNyYy0+
ZmVlZGJhY2tzW2ldOwogICAgfQp9CgpzdGF0aWMgdm9pZApkdXBQcmVlZGl0IChJ
bWVQcmVlZGl0IGRlc3QsIEltZVByZWVkaXQgc3JjKQp7CiAgaWYgKCFkZXN0KSBy
ZXR1cm47CgogIGlmICghc3JjKQogICAgbWVtc2V0IChkZXN0LCAwLCBzaXplb2Yg
KEltZVByZWVkaXRSZWMpKTsKCiAgZGVzdC0+Y2FyZXQgPSBzcmMtPmNhcmV0Owog
IGRlc3QtPmNhbmRfbGlzdF9zdGFydCA9IHNyYy0+Y2FuZF9saXN0X3N0YXJ0OwoK
ICBkdXBJTVRleHQgKCZkZXN0LT5wcmVlZGl0LCAmc3JjLT5wcmVlZGl0KTsKfQoK
c3RhdGljIHZvaWQKZHVwQ2FuZGlkYXRlcyAoSW1lQ2FuZGlkYXRlcyBkZXN0LCBJ
bWVDYW5kaWRhdGVzIHNyYykKewogIGlmICghZGVzdCkgcmV0dXJuOwoKICBpZiAo
IXNyYykKICAgIG1lbXNldCAoZGVzdCwgMCwgc2l6ZW9mIChJbWVDYW5kaWRhdGVz
UmVjKSk7CgogIGRlc3QtPmNvdW50ID0gc3JjLT5jb3VudDsKICBkZXN0LT5mb2N1
cyA9IHNyYy0+Zm9jdXM7CiAgZGVzdC0+cGFnZV9zdGF0ZSA9IHNyYy0+cGFnZV9z
dGF0ZTsKICBkZXN0LT5ob3Jpem9udGFsID0gc3JjLT5ob3Jpem9udGFsOwoKICBp
ZiAoc3JjLT50aXRsZSkKICAgIGRlc3QtPnRpdGxlID0gc3RyZHVwIChzcmMtPnRp
dGxlKTsKCiAgaWYgKHNyYy0+bnVtYmVycykKICAgIGRlc3QtPm51bWJlcnMgPSBz
dHJkdXAgKHNyYy0+bnVtYmVycyk7CgogIGlmIChzcmMtPmNhbmRpZGF0ZXMpCiAg
ICB7CiAgICAgIGludCBpOwoKICAgICAgZGVzdC0+Y2FuZGlkYXRlcyA9IChJbWVU
ZXh0UmVjICopbWFsbG9jIChzcmMtPmNvdW50ICogc2l6ZW9mIChJbWVUZXh0UmVj
KSk7CgogICAgICBmb3IgKGkgPSAwOyBpIDwgc3JjLT5jb3VudDsgKytpKQoJZHVw
SU1UZXh0IChkZXN0LT5jYW5kaWRhdGVzICsgaSwgc3JjLT5jYW5kaWRhdGVzICsg
aSk7CiAgICB9Cn0KCnZvaWQgCmZyZWVQcmVlZGl0SW50ZXJuYWwgKEltZVByZWVk
aXQgcHJlKQp7CiAgaWYgKHByZS0+cHJlZWRpdC50ZXh0KSBmcmVlIChwcmUtPnBy
ZWVkaXQudGV4dCk7CiAgaWYgKHByZS0+cHJlZWRpdC5mZWVkYmFja3MpIGZyZWUg
KHByZS0+cHJlZWRpdC5mZWVkYmFja3MpOwoKICBtZW1zZXQgKHByZSwgMCwgc2l6
ZW9mIChJbWVQcmVlZGl0UmVjKSk7Cn0KCnZvaWQKZnJlZUNhbmRpZGF0ZXNJbnRl
cm5hbCAoSW1lQ2FuZGlkYXRlcyBjYW5kKQp7CiAgaWYgKGNhbmQtPnRpdGxlKSBm
cmVlIChjYW5kLT50aXRsZSk7CiAgaWYgKGNhbmQtPm51bWJlcnMpIGZyZWUgKGNh
bmQtPm51bWJlcnMpOwogIGlmIChjYW5kLT5jYW5kaWRhdGVzKQogICAgewogICAg
ICBpbnQgaTsKCiAgICAgIGZvciAoaSA9IDA7IGkgPCBjYW5kLT5jb3VudDsgKytp
KQoJewkgIAoJICBpZiAoY2FuZC0+Y2FuZGlkYXRlc1tpXS50ZXh0KQoJICAgIGZy
ZWUgKGNhbmQtPmNhbmRpZGF0ZXNbaV0udGV4dCk7CgkgIGlmIChjYW5kLT5jYW5k
aWRhdGVzW2ldLmZlZWRiYWNrcykKCSAgICBmcmVlIChjYW5kLT5jYW5kaWRhdGVz
W2ldLmZlZWRiYWNrcyk7Cgl9CiAgICB9CgogIG1lbXNldCAoY2FuZCwgMCwgc2l6
ZW9mIChJbWVDYW5kaWRhdGVzUmVjKSk7Cn0KCnN0YXRpYyBJbW1SZXN1bHQKc2Vy
dmljZV91cGRhdGVfcHJlZWRpdCAoSW1lSW5wdXRDb250ZXh0IGljLAoJCQlJbWVQ
cmVlZGl0IGltZV9wcmVlZGl0KQp7CiAgU2Vzc2lvbkNvbnRleHQgKnNjID0gKFNl
c3Npb25Db250ZXh0ICopIGljOwoKICBpZiAoIXNjIHx8ICFzYy0+cyB8fCAhaW1l
X3ByZWVkaXQpIHJldHVybiBJbW1GQUlMOwoKI2lmIDAKICBpZiAoaW1lX3ByZWVk
aXQgIT0gKEltZVByZWVkaXQpICZzYy0+cHJlZWRpdF9iYWNrdXApCiAgICB7CiAg
ICAgIGZyZWVQcmVlZGl0SW50ZXJuYWwgKChJbWVQcmVlZGl0KSAmc2MtPnByZWVk
aXRfYmFja3VwKTsKICAgICAgZHVwUHJlZWRpdCAoKEltZVByZWVkaXQpJnNjLT5w
cmVlZGl0X2JhY2t1cCwgaW1lX3ByZWVkaXQpOwogICAgfQojZW5kaWYKCiAgLyog
RklNWEUgbmVlZCB0byBzdXBwb3J0IGNvbW1vbiBhdXggb3IgYXV4IG9iamVjdCBo
ZXJlICovCiAgaWYgKHNjLT5hdXh0eXBlID09IERFRkFVTFRfQVVYX1RZUEUpCiAg
ICB7CiAgICAgIEltZUVuY29kaW5nIGVuY29kaW5nOwogICAgICBVVEZDSEFSICp0
bXBfcHRyID0gTlVMTDsKCiAgICAgIGlmICgoZW5jb2RpbmcgPSBzZXNzaW9uX2dl
dF9jdXJyZW50X2ltZV9lbmNvZGluZyAoc2MtPnMpKSA9PQoJICBFTkNPREVfSU5W
QUxJRCkKCXJldHVybiBJbW1GQUlMOwoKICAgICAgCiAgICAgIGlmIChpbWVfcHJl
ZWRpdC0+cHJlZWRpdC50ZXh0ICYmIGltZV9wcmVlZGl0LT5wcmVlZGl0LnRleHRb
MF0pCgljb252ZXJ0X3RvX3V0ZmNoYXIgKGVuY29kaW5nLCBpbWVfcHJlZWRpdC0+
cHJlZWRpdC50ZXh0LCAmdG1wX3B0cik7CgllbHNlICp0bXBfcHRyID0gY2FsbG9j
ICgxLCBzaXplb2YoVVRGQ0hBUikpOwoKICAgICAgc2MtPnMtPklmLT5tX3dyYXBw
ZXItPmltbF9wcmVlZGl0X3N0YXJ0IChzYy0+cyk7CiAgICAgIHNjLT5zLT5JZi0+
bV93cmFwcGVyLT5pbWxfcHJlZWRpdF9kcmF3IChzYy0+cywgdG1wX3B0ciwgaW1l
X3ByZWVkaXQtPmNhcmV0KTsKCiAgICAgIC8vIGZyZWUgKHRtcF9wdHIpOwogICAg
fQoKICByZXR1cm4gSW1tT0s7Cn0KCnN0YXRpYyBJbW1SZXN1bHQKc2VydmljZV9t
b3ZlX3ByZWVkaXRfY2FyZXQgKEltZUlucHV0Q29udGV4dCBpYywKCQkJICAgIGlu
dCBpbmRleCkKewogIHJldHVybiBJbW1PSzsKfQoKc3RhdGljIEltbVJlc3VsdApz
ZXJ2aWNlX3Nob3dfY2FuZGlkYXRlcyAoSW1lSW5wdXRDb250ZXh0IGljKQp7CiAg
U2Vzc2lvbkNvbnRleHQgKnNjID0gKFNlc3Npb25Db250ZXh0ICopIGljOwoKICBp
ZiAoIXNjIHx8ICFzYy0+cykgcmV0dXJuIEltbUZBSUw7CgogIHNjLT5jYW5kX3No
b3cgPSBUcnVlOwoKICAvKiBGSVhNRSBuZWVkIHRvIHN1cHBvcnQgY29tbW9uIGF1
eCBvciBhdXggb2JqZWN0IGhlcmUgKi8KICBpZiAoc2MtPmF1eHR5cGUgPT0gREVG
QVVMVF9BVVhfVFlQRSkKICAgIHsKICAgICAgTGF5b3V0SW5mbyBsYXlvdXQ7CiAg
ICAgIEJvb2wgdmVydGljYWxfdHlwZSA9IFRydWU7IC8vRklYTUUKICAgICAgaW50
IGxheW91dF9jYXBhY2l0eSA9IDEwOyAvL0ZJWE1FCgogICAgICBsYXlvdXQuY2hv
aWNlX3Blcl93aW5kb3cgPSBsYXlvdXRfY2FwYWNpdHk7CiAgICAgIGlmICh2ZXJ0
aWNhbF90eXBlKQoJewoJICBsYXlvdXQubmNvbHVtbnMgPSAxOwoJICBsYXlvdXQu
bnJvd3MgPSBsYXlvdXRfY2FwYWNpdHk7CgkgIGxheW91dC5kcmF3VXBEaXJlY3Rp
b24gPSBEcmF3VXBWZXJ0aWNhbGx5OwoJfQogICAgICBlbHNlCgl7CgkgIGxheW91
dC5uY29sdW1ucyA9IGxheW91dF9jYXBhY2l0eTsKCSAgbGF5b3V0Lm5yb3dzID0g
MTsKCgkgIGxheW91dC5kcmF3VXBEaXJlY3Rpb24gPSBEcmF3VXBIb3Jpem9udGFs
bHk7Cgl9CgogICAgICBzYy0+cy0+SWYtPm1fd3JhcHBlci0+aW1sX2xvb2t1cF9z
dGFydCAoc2MtPnMsICZsYXlvdXQpOwogICAgfQoKICByZXR1cm4gSW1tT0s7Cn0K
CnN0YXRpYyBJbW1SZXN1bHQKCnNlcnZpY2VfaGlkZV9jYW5kaWRhdGVzIChJbWVJ
bnB1dENvbnRleHQgaWMpCnsKICBTZXNzaW9uQ29udGV4dCAqc2MgPSAoU2Vzc2lv
bkNvbnRleHQgKikgaWM7CgogIGlmICghc2MgfHwgIXNjLT5zKSByZXR1cm4gSW1t
RkFJTDsKCiAgc2MtPmNhbmRfc2hvdyA9IEZhbHNlOwogIAogIC8qIEZJWE1FIG5l
ZWQgdG8gc3VwcG9ydCBjb21tb24gYXV4IG9yIGF1eCBvYmplY3QgaGVyZSAqLwog
IGlmIChzYy0+YXV4dHlwZSA9PSBERUZBVUxUX0FVWF9UWVBFKQogICAgc2MtPnMt
PklmLT5tX3dyYXBwZXItPmltbF9sb29rdXBfZW5kIChzYy0+cyk7CgogIHJldHVy
biBJbW1PSzsKfQoKc3RhdGljIEltbVJlc3VsdApzZXJ2aWNlX3VwZGF0ZV9jYW5k
aWRhdGVzIChJbWVJbnB1dENvbnRleHQgaWMsCgkJCSAgIEltZUNhbmRpZGF0ZXMg
aW1lX2NhbmRpZGF0ZXMpCnsKICBTZXNzaW9uQ29udGV4dCAqc2MgPSAoU2Vzc2lv
bkNvbnRleHQgKikgaWM7CgogIGlmICghc2MgfHwgIXNjLT5zIHx8ICFpbWVfY2Fu
ZGlkYXRlcykgcmV0dXJuIEltbUZBSUw7CgojaWYgMCAvL0ZJWE1FCiAgaWYgKGlt
ZV9jYW5kaWRhdGVzICE9IChJbWVDYW5kaWRhdGVzKSAmc2MtPmNhbmRfYmFja3Vw
KQogICAgewogICAgICBmcmVlQ2FuZGlkYXRlc0ludGVybmFsICgoSW1lQ2FuZGlk
YXRlcykgJnNjLT5jYW5kX2JhY2t1cCk7CiAgICAgIGR1cENhbmRpZGF0ZXMgKChJ
bWVDYW5kaWRhdGVzKSAmc2MtPmNhbmRfYmFja3VwLCBpbWVfY2FuZGlkYXRlcyk7
CiAgICB9CiNlbmRpZgoKICAvKiBGSVhNRSBuZWVkIHRvIHN1cHBvcnQgY29tbW9u
IGF1eCBvciBhdXggb2JqZWN0IGhlcmUgKi8KICBpZiAoc2MtPmF1eHR5cGUgPT0g
REVGQVVMVF9BVVhfVFlQRSkKICAgIHsKICAgICAgVVRGQ0hBUiAqKmxvb2t1cF9z
dHJzLCAqKmxhYmVsX3N0cnM7CiAgICAgIFVURkNIQVIgKmxhYmVsX2J1ZjsKICAg
ICAgSW1lRW5jb2RpbmcgZW5jb2Rpbmc7CiAgICAgIGludCBudW1fY2FuZGlkYXRl
cyA9IGltZV9jYW5kaWRhdGVzLT5jb3VudDsKICAgICAgaW50IGk7CiAgICAgIAog
ICAgICBpZiAoKGVuY29kaW5nID0gc2Vzc2lvbl9nZXRfY3VycmVudF9pbWVfZW5j
b2RpbmcgKHNjLT5zKSkgPT0KCSAgRU5DT0RFX0lOVkFMSUQpCglyZXR1cm4gSW1t
RkFJTDsKCiAgICAgIGxvb2t1cF9zdHJzID0gKFVURkNIQVIgKiopIG1hbGxvYyAo
bnVtX2NhbmRpZGF0ZXMgKiBzaXplb2YgKFVURkNIQVIgKikpOwogICAgICBpZiAo
IWxvb2t1cF9zdHJzKSByZXR1cm4gSW1tRkFJTDsKICAgICAgbWVtc2V0IChsb29r
dXBfc3RycywgMCwgbnVtX2NhbmRpZGF0ZXMgKiBzaXplb2YgKFVURkNIQVIgKikp
OwoKICAgICAgbGFiZWxfc3RycyA9IChVVEZDSEFSICoqKSBtYWxsb2MgKG51bV9j
YW5kaWRhdGVzICogc2l6ZW9mIChVVEZDSEFSICopKTsKICAgICAgaWYgKCFsYWJl
bF9zdHJzKSByZXR1cm4gSW1tRkFJTDsKICAgICAgbWVtc2V0IChsYWJlbF9zdHJz
LCAwLCBudW1fY2FuZGlkYXRlcyAqIHNpemVvZiAoVVRGQ0hBUiAqKSk7CiAgICAg
IAogICAgICBpZiAoaW1lX2NhbmRpZGF0ZXMtPm51bWJlcnMpCgljb252ZXJ0X3Rv
X3V0ZmNoYXIgKGVuY29kaW5nLCBpbWVfY2FuZGlkYXRlcy0+bnVtYmVycywgJmxh
YmVsX2J1Zik7CgogICAgICBmb3IgKGkgPSAwOyBpIDwgbnVtX2NhbmRpZGF0ZXM7
ICsraSkKCXsKCSAgVVRGQ0hBUiAqdG1wX2J1ZjsKCgkgIGlmICghaW1lX2NhbmRp
ZGF0ZXMtPmNhbmRpZGF0ZXNbaV0udGV4dCkKCSAgICBjb250aW51ZTsKCgkgIGNv
bnZlcnRfdG9fdXRmY2hhciAoZW5jb2RpbmcsIGltZV9jYW5kaWRhdGVzLT5jYW5k
aWRhdGVzW2ldLnRleHQsCgkJCSAgICAgICZ0bXBfYnVmKTsKCSAgCgkgIGlmICgo
bG9va3VwX3N0cnNbaV0gPSB1dGZjaGFyX2R1cGwgKHRtcF9idWYpKSA9PSBOVUxM
KQoJICAgIGNvbnRpbnVlOwoKCSAgZnJlZSAodG1wX2J1Zik7CgoJICBsYWJlbF9z
dHJzW2ldID0gKFVURkNIQVIgKikgbWFsbG9jIChzaXplb2YgKFVURkNIQVIpICog
Myk7IC8vRklYTUUKCSAgaWYgKCFsYWJlbF9zdHJzW2ldKSBjb250aW51ZTsKCgkg
IGxhYmVsX3N0cnNbaV1bMF0gPSAoaW1lX2NhbmRpZGF0ZXMtPm51bWJlcnMpID8g
KGxhYmVsX2J1ZltpXSkgOiAoJzEnICsgaSk7CgkgIGxhYmVsX3N0cnNbaV1bMV0g
PSAnLic7CgkgIGxhYmVsX3N0cnNbaV1bMl0gPSAwOwoJfQoKICAgICAgc2MtPnMt
PklmLT5tX3dyYXBwZXItPmltbF9sb29rdXBfZHJhdyAoc2MtPnMsCgkJICAgICAg
IG51bV9jYW5kaWRhdGVzLAoJCSAgICAgICBsb29rdXBfc3RycywKCQkgICAgICAg
TlVMTCwKCQkgICAgICAgbGFiZWxfc3RycywKCQkgICAgICAgTlVMTCwKCQkgICAg
ICAgTlVMTCwKCQkgICAgICAgTlVMTCwKCQkgICAgICAgMCwKCQkgICAgICAgKGlt
ZV9jYW5kaWRhdGVzLT5ob3Jpem9udGFsKSA/IDAgOiAxKTsKCiAgICAgIGZvciAo
aSA9IDA7IGkgPCBudW1fY2FuZGlkYXRlczsgKytpKQoJewoJICBpZiAobG9va3Vw
X3N0cnNbaV0pIGZyZWUgKGxvb2t1cF9zdHJzW2ldKTsKCSAgaWYgKGxhYmVsX3N0
cnNbaV0pIGZyZWUgKGxhYmVsX3N0cnNbaV0pOwoJfQoKICAgICAgZnJlZSAobG9v
a3VwX3N0cnMpOwogICAgICBmcmVlIChsYWJlbF9zdHJzKTsKICAgIH0KCiAgcmV0
dXJuIEltbU9LOwp9CQkJICAgCgpzdGF0aWMgSW1tUmVzdWx0CnNlcnZpY2VfY29t
bWl0IChJbWVJbnB1dENvbnRleHQgaWMsCgkJdW5zaWduZWQgY2hhciAqY29tbWl0
X3N0cikKewogIFNlc3Npb25Db250ZXh0ICpzYyA9IChTZXNzaW9uQ29udGV4dCAq
KSBpYzsKCiAgaWYgKCFzYyB8fCAhc2MtPnMgfHwgIWNvbW1pdF9zdHIpIHJldHVy
biBJbW1GQUlMOwoKICBpZiAoc2MtPmF1eHR5cGUgPT0gREVGQVVMVF9BVVhfVFlQ
RSkKICAgIHsKICAgICAgSW1lRW5jb2RpbmcgZW5jb2Rpbmc7CiAgICAgIFVURkNI
QVIgICp0bXBfcHRyOwoKICAgICAgaWYgKChlbmNvZGluZyA9IHNlc3Npb25fZ2V0
X2N1cnJlbnRfaW1lX2VuY29kaW5nIChzYy0+cykpCgkgID09IEVOQ09ERV9JTlZB
TElEKQoJcmV0dXJuIEltbUZBSUw7CgogICAgICBjb252ZXJ0X3RvX3V0ZmNoYXIg
KGVuY29kaW5nLCBjb21taXRfc3RyLCAmdG1wX3B0cik7CgogICAgICBzYy0+cy0+
SWYtPm1fd3JhcHBlci0+aW1sX2NvbW1pdCAoc2MtPnMsIHRtcF9wdHIpOwoKICAg
ICAgLy8gZnJlZSAodG1wX3B0cik7CiAgICB9CgogIHJldHVybiBJbW1PSzsKfQoK
c3RhdGljIEltbVJlc3VsdCAvL0ZJWE1FCnNlcnZpY2Vfc2hvd19hdXggKEltZUlu
cHV0Q29udGV4dCBpYywKCQkgIGNvbnN0IGNoYXIgKmF1eG5hbWUpCnsKICBTZXNz
aW9uQ29udGV4dCAqc2MgPSAoU2Vzc2lvbkNvbnRleHQgKikgaWM7CiAgaW50IGNv
bW1hbmQgPSBDT01NT05BVVhfU0hPV19OT1RJRlk7IC8vIEZJWE1FCgogIGlmICgh
c2MgfHwgIXNjLT5zIHx8ICFhdXhuYW1lKSByZXR1cm4gSW1tRkFJTDsKCiAgc2Mt
PnMtPklmLT5tX3dyYXBwZXItPmltbF9hdXhfc3RhcnQgKHNjLT5zLCAoY2hhciAq
KSBhdXhuYW1lKTsKICBzYy0+cy0+SWYtPm1fd3JhcHBlci0+aW1sX2F1eF9kcmF3
IChzYy0+cywgKGNoYXIgKikgYXV4bmFtZSwgMSwgJmNvbW1hbmQsIDAsIE5VTEws
IE5VTEwpOwoKICByZXR1cm4gSW1tT0s7Cn0KCnN0YXRpYyBJbW1SZXN1bHQKc2Vy
dmljZV9oaWRlX2F1eCAoSW1lSW5wdXRDb250ZXh0IGljLAoJCSAgSW1IYW5kbGUg
aGFuZGxlKQp7CiAgU2Vzc2lvbkNvbnRleHQgKnNjID0gKFNlc3Npb25Db250ZXh0
ICopIGljOwogIGludCBjb21tYW5kID0gQ09NTU9OQVVYX0hJREVfTk9USUZZOyAv
LyBGSVhNRQogIHVuc2lnbmVkIGNoYXIgKmF1eG5hbWUgPSAodW5zaWduZWQgY2hh
ciAqKWhhbmRsZTsKCiAgaWYgKCFzYyB8fCAhc2MtPnMgfHwgIWF1eG5hbWUpIHJl
dHVybiBJbW1GQUlMOwoKICBzYy0+cy0+SWYtPm1fd3JhcHBlci0+aW1sX2F1eF9k
cmF3IChzYy0+cywgYXV4bmFtZSwgMSwgJmNvbW1hbmQsIDAsIE5VTEwsIE5VTEwp
OwoKICByZXR1cm4gSW1tT0s7Cn0KCnN0YXRpYyBJbW1SZXN1bHQKc2VydmljZV9z
ZW5kX2F1eF9kYXRhIChJbWVFdmVudCBldmVudCkKewogIHJldHVybiBJbW1PSzsg
Ly9GSVhNRQp9CgpzdGF0aWMgdm9pZCAqCnNlcnZpY2VfZ2V0X2ltZV9kYXRhIChJ
bWVJbnB1dENvbnRleHQgaWMsCgkJICAgICAgSW1lU2NvcGVUeXBlIHNjb3BlKQp7
CiAgU2Vzc2lvbkNvbnRleHQgKnNjID0gKFNlc3Npb25Db250ZXh0ICopIGljOwog
IHZvaWQgKmltZV9kYXRhID0gTlVMTDsKCiAgaWYgKCFzYykgcmV0dXJuIE5VTEw7
CgogIHN3aXRjaCAoc2NvcGUpCiAgICB7CiAgICBjYXNlIElNRV9TQ09QRV9TRVNT
SU9OOgogICAgICBpbWVfZGF0YSA9IHNjLT5pbWVfc2Vzc2lvbl9kYXRhOwogICAg
ICBicmVhazsKICAgIGNhc2UgSU1FX1NDT1BFX0RFU0tUT1A6CiAgICAgIGltZV9k
YXRhID0gc2MtPmltZV9kZXNrdG9wX2RhdGE7CiAgICAgIGJyZWFrOwogICAgY2Fz
ZSBJTUVfU0NPUEVfVVNFUjoKICAgICAgaW1lX2RhdGEgPSBzYy0+aW1lX3VzZXJf
ZGF0YTsKICAgICAgYnJlYWs7CiAgICB9CgogIHJldHVybiBpbWVfZGF0YTsgICAg
IAp9CgpzdGF0aWMgSW1tUmVzdWx0CnNlcnZpY2Vfc2V0X2ltZV9kYXRhIChJbWVJ
bnB1dENvbnRleHQgaWMsCgkJICAgICAgSW1lU2NvcGVUeXBlIHNjb3BlLAoJCSAg
ICAgIHZvaWQgKmRhdGEpCnsKICBTZXNzaW9uQ29udGV4dCAqc2MgPSAoU2Vzc2lv
bkNvbnRleHQgKikgaWM7CgogIGlmICghc2MpIHJldHVybiBJbW1GQUlMOwoKICBz
d2l0Y2ggKHNjb3BlKQogICAgewogICAgY2FzZSBJTUVfU0NPUEVfU0VTU0lPTjoK
ICAgICAgc2MtPmltZV9zZXNzaW9uX2RhdGEgPSBkYXRhOwogICAgICBicmVhazsK
ICAgIGNhc2UgSU1FX1NDT1BFX0RFU0tUT1A6CiAgICAgIHNjLT5pbWVfZGVza3Rv
cF9kYXRhID0gZGF0YTsKICAgIGNhc2UgSU1FX1NDT1BFX1VTRVI6CiAgICAgIHNj
LT5pbWVfdXNlcl9kYXRhID0gZGF0YTsKICAgIH0KCiAgcmV0dXJuIEltbU9LOwp9
CgpzdGF0aWMgdm9pZCAqCnNlcnZpY2VfbG9hZF91c2VyX3Byb2ZpbGUgKEltZUlu
cHV0Q29udGV4dCBpYywKCQkJICAgY29uc3QgY2hhciAqY2F0ZWdvcnksCgkJCSAg
IGludCAqcHJvZmlsZSkKewogIHJldHVybiBOVUxMOwp9CgpzdGF0aWMgSW1tUmVz
dWx0CnNlcnZpY2VfZnJlZV91c2VyX3Byb2ZpbGUgKHZvaWQgKmJ1ZikKewogIHJl
dHVybiBJbW1PSzsKfQoKc3RhdGljIEltbVJlc3VsdApzZXJ2aWNlX2JlZXAgKElt
ZUlucHV0Q29udGV4dCBpYywKCSAgICAgIEltZUJlZXBUeXBlIGJlZXBfdHlwZSkK
ewogIHJldHVybiBJbW1PSzsKfQoKc3RhdGljIEltZUtleVR5cGUKc2VydmljZV9t
YXBfa2V5ZXZlbnQgKEltZUtleSBpbWVfa2V5KQp7CiAgICBpbnQga2V5Y29kZSA9
IGltZV9rZXktPmtleWNvZGU7CiAgICBpbnQga2V5Y2hhciA9IGltZV9rZXktPmtl
eWNoYXI7CiAgICBpbnQgbW9kaWZpZXIgPSBpbWVfa2V5LT5tb2RpZmllcjsKCiAg
ICAvKiBOb3JtYWwgQWxwaGFtZXJpYyBrZXkgKi8KICAgIGlmICgoa2V5Y29kZSA+
PSBJTUVfVktfQ09NTUEgJiYga2V5Y29kZSA8PSBJTUVfVktfQ0xPU0VfQlJBQ0tF
VCkgfHwKICAgICAgICAoa2V5Y29kZSA+PSBJTUVfVktfQU1QRVJTQU5EICYmIGtl
eWNvZGUgPD0gSU1FX1ZLX1VOREVSU0NPUkUpIHx8CiAgICAgICAgKGtleWNvZGUg
PT0gSU1FX1ZLX1FVT1RFKSB8fCAoa2V5Y29kZSA9PSBJTUVfVktfQkFDS19RVU9U
RSkpIHsKICAgICAgICBpZiAoIShtb2RpZmllciAmIElNRV9DVFJMX01BU0spICYm
CiAgICAgICAgICAgICEobW9kaWZpZXIgJiBJTUVfTUVUQV9NQVNLKSAmJgogICAg
ICAgICAgICAhKG1vZGlmaWVyICYgSU1FX0FMVF9NQVNLKSAmJgogICAgICAgICAg
ICAhKG1vZGlmaWVyICYgSU1FX0FMVF9HUkFQSF9NQVNLKSkKICAgICAgICAgICAg
cmV0dXJuIChrZXljaGFyKTsKICAgIH0KCiAgICAvKiBTcGVjaWFsIGtleSAqLwog
ICAgaWYgKG1vZGlmaWVyID09IDApIHsKICAgICAgICBzd2l0Y2ggKGtleWNvZGUp
IHsKICAgICAgICBjYXNlIElNRV9WS19FU0NBUEU6CiAgICAgICAgICAgIHJldHVy
biAoSU1FX0ZJTFRFUkVEX0tFWV9FU0NBUEUpOwogICAgICAgIGNhc2UgSU1FX1ZL
X0VOVEVSOgogICAgICAgICAgICByZXR1cm4gKElNRV9GSUxURVJFRF9LRVlfRU5U
RVIpOwogICAgICAgIGNhc2UgSU1FX1ZLX1NQQUNFOgogICAgICAgICAgICByZXR1
cm4gKElNRV9GSUxURVJFRF9LRVlfU1BBQ0VCQVIpOwogICAgICAgIGNhc2UgSU1F
X1ZLX1BBR0VfVVA6CiAgICAgICAgICAgIHJldHVybiAoSU1FX0ZJTFRFUkVEX0tF
WV9QQUdFVVApOwogICAgICAgIGNhc2UgSU1FX1ZLX1BBR0VfRE9XTjoKICAgICAg
ICAgICAgcmV0dXJuIChJTUVfRklMVEVSRURfS0VZX1BBR0VET1dOKTsKICAgICAg
ICBjYXNlIElNRV9WS19JTlNFUlQ6CiAgICAgICAgICAgIHJldHVybiAoSU1FX0ZJ
TFRFUkVEX0tFWV9JTlNFUlQpOwogICAgICAgIGNhc2UgSU1FX1ZLX0RFTEVURToK
ICAgICAgICAgICAgcmV0dXJuIChJTUVfRklMVEVSRURfS0VZX0RFTEVURSk7CiAg
ICAgICAgY2FzZSBJTUVfVktfQkFDS19TUEFDRToKICAgICAgICAgICAgcmV0dXJu
IChJTUVfRklMVEVSRURfS0VZX0JBQ0tTUEFDRSk7CiAgICAgICAgY2FzZSBJTUVf
VktfSE9NRToKICAgICAgICAgICAgcmV0dXJuIChJTUVfRklMVEVSRURfS0VZX0hP
TUUpOwogICAgICAgIGNhc2UgSU1FX1ZLX0VORDoKICAgICAgICAgICAgcmV0dXJu
IChJTUVfRklMVEVSRURfS0VZX0VORCk7CiAgICAgICAgY2FzZSBJTUVfVktfTEVG
VDoKICAgICAgICAgICAgcmV0dXJuIChJTUVfRklMVEVSRURfS0VZX0xFRlQpOwog
ICAgICAgIGNhc2UgSU1FX1ZLX1JJR0hUOgogICAgICAgICAgICByZXR1cm4gKElN
RV9GSUxURVJFRF9LRVlfUklHSFQpOwogICAgICAgIGNhc2UgSU1FX1ZLX1VQOgog
ICAgICAgICAgICByZXR1cm4gKElNRV9GSUxURVJFRF9LRVlfVVApOwogICAgICAg
IGNhc2UgSU1FX1ZLX0RPV046CiAgICAgICAgICAgIHJldHVybiAoSU1FX0ZJTFRF
UkVEX0tFWV9ET1dOKTsKICAgICAgICB9CiAgICB9CiAgICByZXR1cm4gKElNRV9G
SUxURVJFRF9LRVlfVU5VU0VEKTsKCn0KLyogTG9jYWwgVmFyaWFibGVzOiAqLwov
KiBjLWZpbGUtc3R5bGU6ICJpaWltLXByb2plY3QiICovCi8qIEVuZDogKi8KAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAElNU2Vzc2lvbi5jAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAwMTAwNjQ0ADAyNzc1MDIAMDAwMDAxMgAwMDAw
MDAzMzYwMQAxMDMxMTIzMDYxNAAwMTIyMzEAIDAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAdXN0YXIgIABmemhhbmcA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHdoZWVsAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
LyoKICBDb3B5cmlnaHQgMTk5MC0yMDAxIFN1biBNaWNyb3N5c3RlbXMsIEluYy4g
QWxsIFJpZ2h0cyBSZXNlcnZlZC4KCiAgUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3Jh
bnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGEK
ICBjb3B5IG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRh
dGlvbiBmaWxlcyAodGhlCiAgIlNvZnR3YXJlIiksIHRvIGRlYWwgaW4gdGhlIFNv
ZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZwogIHdpdGhvdXQg
bGltaXRhdGlvbiB0aGUgcmlnaHRzIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJn
ZSwgcHVibGlzaCwKICBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3Igc2Vs
bCBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8KICBwZXJtaXQgcGVyc29u
cyB0byB3aG9tIHRoZSBTb2Z0d2FyZSBpcyBmdXJuaXNoZWQgdG8gZG8gc28sIHN1
YmplY3QgdG8KICB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6IFRoZSBhYm92ZSBj
b3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzCiAgcGVybWlzc2lvbiBub3RpY2Ugc2hh
bGwgYmUgaW5jbHVkZWQgaW4gYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbAogIHBv
cnRpb25zIG9mIHRoZSBTb2Z0d2FyZS4KCgogIFRIRSBTT0ZUV0FSRSBJUyBQUk9W
SURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBS
RVNTCiAgT1IgSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBU
SEUgV0FSUkFOVElFUyBPRgogIE1FUkNIQU5UQUJJTElUWSwgRklUTkVTUyBGT1Ig
QSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4KICBJTiBO
TyBFVkVOVCBTSEFMTCBUSEUgT1BFTiBHUk9VUCBPUiBTVU4gTUlDUk9TWVNURU1T
LCBJTkMuIEJFIExJQUJMRQogIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RI
RVIgTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRgogIENPTlRSQUNU
LCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLCBPVVQgT0YgT1IgSU4g
Q09OTkVDVElPTiBXSVRICiAgVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RI
RVIgREVBTElOR1MgSU4gVEhFIFNPRlRXQVJFIEVWRU4gSUYKICBBRFZJU0VEIElO
IEFEVkFOQ0UgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFUy4KCgog
IEV4Y2VwdCBhcyBjb250YWluZWQgaW4gdGhpcyBub3RpY2UsIHRoZSBuYW1lcyBv
ZiBUaGUgT3BlbiBHcm91cCBhbmQvb3IKICBTdW4gTWljcm9zeXN0ZW1zLCBJbmMu
IHNoYWxsIG5vdCBiZSB1c2VkIGluIGFkdmVydGlzaW5nIG9yIG90aGVyd2lzZSB0
bwogIHByb21vdGUgdGhlIHNhbGUsIHVzZSBvciBvdGhlciBkZWFsaW5ncyBpbiB0
aGlzIFNvZnR3YXJlIHdpdGhvdXQgcHJpb3IKICB3cml0dGVuIGF1dGhvcml6YXRp
b24gZnJvbSBUaGUgT3BlbiBHcm91cCBhbmQvb3IgU3VuIE1pY3Jvc3lzdGVtcywK
ICBJbmMuLCBhcyBhcHBsaWNhYmxlLgoKCiAgWCBXaW5kb3cgU3lzdGVtIGlzIGEg
dHJhZGVtYXJrIG9mIFRoZSBPcGVuIEdyb3VwCgogIE9TRi8xLCBPU0YvTW90aWYg
YW5kIE1vdGlmIGFyZSByZWdpc3RlcmVkIHRyYWRlbWFya3MsIGFuZCBPU0YsIHRo
ZSBPU0YKICBsb2dvLCBMQlgsIFggV2luZG93IFN5c3RlbSwgYW5kIFhpbmVyYW1h
IGFyZSB0cmFkZW1hcmtzIG9mIHRoZSBPcGVuCiAgR3JvdXAuIEFsbCBvdGhlciB0
cmFkZW1hcmtzIGFuZCByZWdpc3RlcmVkIHRyYWRlbWFya3MgbWVudGlvbmVkIGhl
cmVpbgogIGFyZSB0aGUgcHJvcGVydHkgb2YgdGhlaXIgcmVzcGVjdGl2ZSBvd25l
cnMuIE5vIHJpZ2h0LCB0aXRsZSBvcgogIGludGVyZXN0IGluIG9yIHRvIGFueSB0
cmFkZW1hcmssIHNlcnZpY2UgbWFyaywgbG9nbyBvciB0cmFkZSBuYW1lIG9mCiAg
U3VuIE1pY3Jvc3lzdGVtcywgSW5jLiBvciBpdHMgbGljZW5zb3JzIGlzIGdyYW50
ZWQuCgoqLwoKI2luY2x1ZGUgPHN0ZGlvLmg+CiNpbmNsdWRlIDxzdHJpbmcuaD4K
I2luY2x1ZGUgPHN0ZGxpYi5oPgojaW5jbHVkZSA8aWNvbnYuaD4KI2luY2x1ZGUg
IklNU2Vzc2lvbi5oIgojaW5jbHVkZSAiYXV4X3Byb3RvY29sLmgiCiNpbmNsdWRl
ICJJTVV0aWwuaCIKI2luY2x1ZGUgIklNRS5oIgoKdW5zaWduZWQgY2hhciBFbmds
aXNoX1N0YXR1c19VVEZbXSA9IHsKICAweGU4LCAweDhiLCAweGIxLCAweDAKfTsK
Ci8qCnVuc2lnbmVkIGNoYXIgQ2hpbmVzZV9TdGF0dXNfVVRGW10gPSB7CiAgMHhl
NCwgMHhiOCwgMHhhZCwgMHgwCn07CiovCgp1bnNpZ25lZCBjaGFyIENvbW1vbl9T
dGF0dXNfVVRGW10gPSB7CiAgMHhlNSwgMHg4NSwgMHhiMSwgMHgwCn07CgpzdGF0
aWMgSW1tUmVzdWx0IHNlc3Npb25fc2V0X2ZvY3VzX291dF9pbnRlcm5hbCAoaW1s
X3Nlc3Npb25fdCAqKTsKc3RhdGljIEltbVJlc3VsdCBzZXNzaW9uX3NldF9mb2N1
c19pbl9pbnRlcm5hbCAoaW1sX3Nlc3Npb25fdCAqKTsKc3RhdGljIEltbVJlc3Vs
dCBzZXNzaW9uX2NvbnRleHRfZGV0YWNoX2ltZV9tb2R1bGUgKFNlc3Npb25Db250
ZXh0ICopOwpzdGF0aWMgSW1tUmVzdWx0IHNlc3Npb25fY29udGV4dF9hdHRhY2hf
aW1lX21vZHVsZSAoU2Vzc2lvbkNvbnRleHQgKiwgSW1lTW9kdWxlUmVjICopOwoK
c3RhdGljIFNlc3Npb25Db250ZXh0ICoKc2Vzc2lvbl9jb250ZXh0X25ldyAoKQp7
CiAgU2Vzc2lvbkNvbnRleHQgKnNjOwoKICBpZiAoKHNjID0gbWFsbG9jIChzaXpl
b2YgKFNlc3Npb25Db250ZXh0KSkpID09IE5VTEwpCiAgICByZXR1cm4gTlVMTDsK
CiAgc2MtPmNsaWVudF9lbmNvZGluZyA9IEVOQ09ERV9VVEY4OwogIHNjLT5pbWVf
bW9kdWxlID0gTlVMTDsKICBzYy0+Y3Vycl9jb252ZXJzaW9uX3N0YXR1cyA9IENP
TlZFUlNJT05fT0ZGOwogIHNjLT5hdXh0eXBlID0gREVGQVVMVF9BVVhfVFlQRTsK
CiAgcmV0dXJuIHNjOwp9CgpzdGF0aWMgSW1tUmVzdWx0CnNlc3Npb25fY29udGV4
dF9kZXN0cm95IChTZXNzaW9uQ29udGV4dCAqc2MpCnsKICBpZiAoc2MpIGZyZWUg
KHNjKTsKCiAgcmV0dXJuIEltbU9LOwp9CgpzdGF0aWMgU2Vzc2lvbkNvbnRleHQg
KgpzZXNzaW9uX2dldF9zZXNzaW9uX2NvbnRleHQgKGltbF9zZXNzaW9uX3QgKnMp
CnsKICByZXR1cm4gKFNlc3Npb25Db250ZXh0ICopIHMtPnNwZWNpZmljX2RhdGE7
Cn0KCnN0YXRpYyBEZXNrdG9wQ29udGV4dCAqCnNlc3Npb25fZ2V0X2Rlc2t0b3Bf
Y29udGV4dCAoaW1sX3Nlc3Npb25fdCAqcykKewogIHJldHVybiAoRGVza3RvcENv
bnRleHQgKikgcy0+ZGVza3RvcC0+c3BlY2lmaWNfZGF0YTsKfQoKU2Vzc2lvbkNv
bnRleHQgKgpzZXNzaW9uX2NyZWF0ZSAoaW1sX3Nlc3Npb25fdCAqcykKewogIERl
c2t0b3BDb250ZXh0ICpkYzsKICBTZXNzaW9uQ29udGV4dCAqc2M7CgogIHNjID0g
KFNlc3Npb25Db250ZXh0ICopIHMtPnNwZWNpZmljX2RhdGE7CiAgaWYgKHNjKSBy
ZXR1cm4gc2M7CgogIGlmICgoc2MgPSBzZXNzaW9uX2NvbnRleHRfbmV3ICgpKSA9
PSBOVUxMKQogICAgcmV0dXJuIE5VTEw7CgogIGRjID0gc2Vzc2lvbl9nZXRfZGVz
a3RvcF9jb250ZXh0IChzKTsKICAvKiBGSVhNRSAqLwogIHNjLT5jdXJyX2NvbnZl
cnNpb25fc3RhdHVzID0gZGVza3RvcF9jb250ZXh0X2dldF9kZWZhdWx0X2NvbnZl
cnNpb25fc3RhdHVzIChkYyk7CiAgc2MtPmF1eHR5cGUgPSBkZXNrdG9wX2NvbnRl
eHRfZ2V0X2F1eHR5cGUgKGRjKTsKCiAgc2MtPnMgPSBzOwoKICBzLT5zcGVjaWZp
Y19kYXRhID0gKHZvaWQgKilzYzsKCiAgcmV0dXJuIHNjOwp9CgpJbW1SZXN1bHQK
c2Vzc2lvbl9kZXN0cm95IChpbWxfc2Vzc2lvbl90ICpzKQp7CiAgU2Vzc2lvbkNv
bnRleHQgKnNjID0gc2Vzc2lvbl9nZXRfc2Vzc2lvbl9jb250ZXh0IChzKTsKCiAg
aWYgKHNjKQogICAgewogICAgICBEZXNrdG9wQ29udGV4dCAqZGMgPSBzZXNzaW9u
X2dldF9kZXNrdG9wX2NvbnRleHQgKHMpOwogICAgICBpbWxfc2Vzc2lvbl90ICpj
ZnMgPSAoaW1sX3Nlc3Npb25fdCAqKSBkZXNrdG9wX2NvbnRleHRfZ2V0X2N1cnJl
bnRfc2Vzc2lvbiAoZGMpOwoKICAgICAgc2Vzc2lvbl9zZXRfZm9jdXNfb3V0X2lu
dGVybmFsIChzKTsKICAgICAgc2Vzc2lvbl9jb250ZXh0X2RldGFjaF9pbWVfbW9k
dWxlIChzYyk7CiAgICAgIHNlc3Npb25fY29udGV4dF9kZXN0cm95IChzYyk7Cgog
ICAgICBpZiAoY2ZzID09IHMpCglkZXNrdG9wX2NvbnRleHRfc2V0X2N1cnJlbnRf
c2Vzc2lvbiAoZGMsIE5VTEwpOwogICAgfQoKICBzLT5zcGVjaWZpY19kYXRhID0g
TlVMTDsKCiAgcmV0dXJuIEltbU9LOwp9CgpJbWVNb2R1bGVSZWMgKgpzZXNzaW9u
X2dldF9jdXJyZW50X2ltZV9tb2R1bGUgKGltbF9zZXNzaW9uX3QgKnMpCnsKICBT
ZXNzaW9uQ29udGV4dCAqc2M7CgogIGlmICgoc2MgPSBzZXNzaW9uX2dldF9zZXNz
aW9uX2NvbnRleHQgKHMpKSA9PSBOVUxMKQogICAgcmV0dXJuIE5VTEw7CgogIHJl
dHVybiBzYy0+aW1lX21vZHVsZTsKfQoKSW1lRW5jb2RpbmcKc2Vzc2lvbl9nZXRf
Y3VycmVudF9pbWVfZW5jb2RpbmcgKGltbF9zZXNzaW9uX3QgKnMpCnsKICBJbWVN
b2R1bGVSZWMgKmltZV9tb2R1bGUgPSAoSW1lTW9kdWxlUmVjICopIHNlc3Npb25f
Z2V0X2N1cnJlbnRfaW1lX21vZHVsZSAocyk7CgogIGlmICghaW1lX21vZHVsZSB8
fCAhaW1lX21vZHVsZS0+aW5mbykgcmV0dXJuIEVOQ09ERV9JTlZBTElEOwoKICBy
ZXR1cm4gaW1lX21vZHVsZS0+aW5mby0+ZW5jb2Rpbmc7Cn0KCkltZUVuY29kaW5n
CnNlc3Npb25fZ2V0X2NsaWVudF9lbmNvZGluZyAoaW1sX3Nlc3Npb25fdCAqcykK
ewogIFNlc3Npb25Db250ZXh0ICpzYzsKCiAgaWYgKChzYyA9IHNlc3Npb25fZ2V0
X3Nlc3Npb25fY29udGV4dCAocykpID09IE5VTEwpCiAgICByZXR1cm4gRU5DT0RF
X1VURjg7CgogIHJldHVybiBzYy0+Y2xpZW50X2VuY29kaW5nOwp9CgpJbW1SZXN1
bHQKc2Vzc2lvbl9zZXRfY2xpZW50X2VuY29kaW5nIChpbWxfc2Vzc2lvbl90ICpz
LAoJCQkgICAgIEltZUVuY29kaW5nIGVuY29kaW5nKQp7CiAgU2Vzc2lvbkNvbnRl
eHQgKnNjOwoKICBpZiAoKHNjID0gc2Vzc2lvbl9nZXRfc2Vzc2lvbl9jb250ZXh0
IChzKSkgPT0gTlVMTCkKICAgIHJldHVybiBJbW1GQUlMOwoKICBzYy0+Y2xpZW50
X2VuY29kaW5nID0gZW5jb2Rpbmc7CgogIHJldHVybiBJbW1PSzsKfQoKQ29udmVy
c2lvblN0YXR1cwpzZXNzaW9uX2dldF9jb252ZXJzaW9uX3N0YXR1cyAoaW1sX3Nl
c3Npb25fdCAqcykKewogIFNlc3Npb25Db250ZXh0ICpzYzsKCiAgaWYgKChzYyA9
IHNlc3Npb25fZ2V0X3Nlc3Npb25fY29udGV4dCAocykpID09IE5VTEwpCiAgICBy
ZXR1cm4gQ09OVkVSU0lPTl9PRkY7CgogIHJldHVybiBzYy0+Y3Vycl9jb252ZXJz
aW9uX3N0YXR1czsKfQoKSW1tUmVzdWx0CnNlc3Npb25fc2V0X2NvbnZlcnNpb25f
c3RhdHVzIChpbWxfc2Vzc2lvbl90ICpzLAoJCQkgICAgICAgQ29udmVyc2lvblN0
YXR1cyBzdGF0dXMpCnsKICBTZXNzaW9uQ29udGV4dCAqc2MgPSAoU2Vzc2lvbkNv
bnRleHQgKikgc2Vzc2lvbl9nZXRfc2Vzc2lvbl9jb250ZXh0IChzKTsKICBEZXNr
dG9wQ29udGV4dCAqZGM7CiAgSW1lTW9kdWxlUmVjICppbWVfbW9kdWxlOwoKICBp
ZiAoIXNjKSBzYyA9IHNlc3Npb25fY3JlYXRlIChzKTsKCiAgaWYgKCFzYykgcmV0
dXJuIEltbUZBSUw7CgogIGltZV9tb2R1bGUgPSBzZXNzaW9uX2dldF9jdXJyZW50
X2ltZV9tb2R1bGUgKHMpOwoKICBpZiAoc3RhdHVzID09IENPTlZFUlNJT05fT0ZG
KQogICAgewogICAgICAvL0ZJWE1FIGhhbmRsZSBwYWxldHRlIGhlcmUKICAgICAg
c2Vzc2lvbl9zZXRfZm9jdXNfb3V0X2ludGVybmFsIChzKTsKICAgICAgc2Vzc2lv
bl9jb250ZXh0X2RldGFjaF9pbWVfbW9kdWxlIChzYyk7CgogICAgICBzLT5JZi0+
bV93cmFwcGVyLT5pbWxfY29udmVyc2lvbl9vZmYgKHMpOwogICAgfQogIGVsc2UK
ICAgIHsKICAgICAgcy0+SWYtPm1fd3JhcHBlci0+aW1sX2NvbnZlcnNpb25fb24g
KHMpOwoKICAgICAgZGMgPSBzZXNzaW9uX2dldF9kZXNrdG9wX2NvbnRleHQgKHMp
OwoKICAgICAgLy9GSVhNRSBkbyB3ZSBuZWVkIHRvIHN3aXRjaCB0byBuZXcgaW1l
IG1vZHVsZSBpZiBpdCBpcyBOVUxMCiAgICAgIGlmICghaW1lX21vZHVsZSkKCWlt
ZV9tb2R1bGUgPSBkZXNrdG9wX2NvbnRleHRfZ2V0X2RlZmF1bHRfaW1lX21vZHVs
ZSAoZGMpOwoKICAgICAgc2Vzc2lvbl9jb250ZXh0X2F0dGFjaF9pbWVfbW9kdWxl
IChzYywgaW1lX21vZHVsZSk7CiAgICAgIHNlc3Npb25fc2V0X2ZvY3VzX2luX2lu
dGVybmFsIChzKTsKICAgICAgLy9GSVhNRSBoYW5kbGUgcGFsZXR0ZSBoZXJlCiAg
ICB9CgogIHJldHVybiBJbW1PSzsKfQoKc3RhdGljIEltbVJlc3VsdApzZXNzaW9u
X2NvbnRleHRfZGV0YWNoX2ltZV9tb2R1bGUgKFNlc3Npb25Db250ZXh0ICpzYykK
ewogIEltZU1vZHVsZVJlYyAqaW1lX21vZHVsZSA9IHNjLT5pbWVfbW9kdWxlOwoK
ICBpZiAoaW1lX21vZHVsZSkKICAgIHsKICAgICAgaWYgKGltZV9tb2R1bGUtPm1l
dGhvZHMtPkltZURlc3Ryb3lTZXNzaW9uKQoJewoJICBpbWVfbW9kdWxlLT5tZXRo
b2RzLT5JbWVEZXN0cm95U2Vzc2lvbiAoKEltZUlucHV0Q29udGV4dCkgc2MpOwoJ
ICBzYy0+aW1lX3Nlc3Npb25fZGF0YSA9IE5VTEw7Cgl9CgojaWYgMCAvLyBzaG91
bGRuJ3QgZnJlZSBGSVhNRQogICAgICBzYy0+cHJlZWRpdF9zaG93ID0gRmFsc2U7
CiAgICAgIHNjLT5jYW5kX3Nob3cgPSBGYWxzZTsKICAgICAgZnJlZVByZWVkaXRJ
bnRlcm5hbCAoJnNjLT5wcmVlZGl0X2JhY2t1cCk7CiAgICAgIGZyZWVDYW5kaWRh
dGVzSW50ZXJuYWwgKCZzYy0+Y2FuZF9iYWNrdXApOwojZW5kaWYKICAgIH0KCiAg
c2MtPmN1cnJfY29udmVyc2lvbl9zdGF0dXMgPSBDT05WRVJTSU9OX09GRjsKICBz
Yy0+YXV4dHlwZSA9IERFRkFVTFRfQVVYX1RZUEU7CgogIHJldHVybiBJbW1PSzsK
fQoKc3RhdGljIEltbVJlc3VsdApzZXNzaW9uX2NvbnRleHRfYXR0YWNoX2ltZV9t
b2R1bGUgKFNlc3Npb25Db250ZXh0ICpzYywKCQkJCSAgIEltZU1vZHVsZVJlYyAq
aW1lX21vZHVsZSkKewogIGlmICghc2MgfHwgIWltZV9tb2R1bGUpIHJldHVybiBJ
bW1GQUlMOwoKICBzYy0+aW1lX21vZHVsZSA9IGltZV9tb2R1bGU7CgogIC8vRklY
TUUgaGFuZGxlIGF1eCBvcHRpb24gaGVyZQoKICBpZiAoaW1lX21vZHVsZS0+bWV0
aG9kcyAmJgogICAgICBpbWVfbW9kdWxlLT5tZXRob2RzLT5JbWVDcmVhdGVTZXNz
aW9uKQogICAgaW1lX21vZHVsZS0+bWV0aG9kcy0+SW1lQ3JlYXRlU2Vzc2lvbiAo
KEltZUlucHV0Q29udGV4dCkgc2MpOwoKICAvL0ZJWE1FIGhhbmRsZSBsYW5ndWFn
ZSBlbmdpZ25lIHNwZWNpZmljIEFVWCBldmVudCBoZXJlLgoKICBzYy0+Y3Vycl9j
b252ZXJzaW9uX3N0YXR1cyA9IENPTlZFUlNJT05fT047CgogIHJldHVybiBJbW1P
SzsKfQoKSW1tUmVzdWx0CnNlc3Npb25fdG9nZ2xlX2NvbnZlcnNpb25fc3RhdHVz
IChpbWxfc2Vzc2lvbl90ICpzKQp7CiAgU2Vzc2lvbkNvbnRleHQgKnNjID0gc2Vz
c2lvbl9nZXRfc2Vzc2lvbl9jb250ZXh0IChzKTsKICBJbW1SZXN1bHQgcmVzdWx0
OwoKICBpZiAoIXNjKSByZXR1cm4gSW1tRkFJTDsKCiAgaWYgKHNjLT5jdXJyX2Nv
bnZlcnNpb25fc3RhdHVzID09IENPTlZFUlNJT05fT0ZGKQogICAgcmVzdWx0ID0g
c2Vzc2lvbl9zZXRfY29udmVyc2lvbl9zdGF0dXMgKHMsIENPTlZFUlNJT05fT04p
OwogIGVsc2UKICAgIHJlc3VsdCA9IHNlc3Npb25fc2V0X2NvbnZlcnNpb25fc3Rh
dHVzIChzLCBDT05WRVJTSU9OX09GRik7CgogIHJldHVybiByZXN1bHQ7Cn0KCklt
bVJlc3VsdApzZXNzaW9uX3VwZGF0ZV9zdGF0dXNfc3RyaW5nIChpbWxfc2Vzc2lv
bl90ICpzLAoJCQkgICAgICBDb252ZXJzaW9uU3RhdHVzIHN0YXR1cykKewogIHVu
c2lnbmVkIGNoYXIgKnN0YXR1c19zdHIgPSBFbmdsaXNoX1N0YXR1c19VVEY7IC8v
IEZJWE1FCiAgSW1lRW5jb2RpbmcgZW5jb2RpbmcgPSBFTkNPREVfVVRGODsKICBV
VEZDSEFSICp0bXBfcHRyOwoKICBpZiAoIXMpIHJldHVybiBJbW1GQUlMOwoKICBp
ZiAoc3RhdHVzID09IENPTlZFUlNJT05fT04pCiAgICBzdGF0dXNfc3RyID0gQ29t
bW9uX1N0YXR1c19VVEY7IC8vRklYTUUKCiAgaWYgKCFzdGF0dXNfc3RyIHx8ICEq
c3RhdHVzX3N0cikgcmV0dXJuIEltbUZBSUw7CgogIGNvbnZlcnRfdG9fdXRmY2hh
ciAoZW5jb2RpbmcsIHN0YXR1c19zdHIsICZ0bXBfcHRyKTsKCiAgcy0+SWYtPm1f
d3JhcHBlci0+aW1sX3N0YXR1c19zdGFydCAocyk7CiAgcy0+SWYtPm1fd3JhcHBl
ci0+aW1sX3N0YXR1c19kcmF3IChzLCB0bXBfcHRyKTsKCiAgLy8gZnJlZSAodG1w
X3B0cik7CgogIHJldHVybiBJbW1PSzsKfQoKSW1tUmVzdWx0CnNlc3Npb25fc2V0
X2FzX2Rlc2t0b3BfY3VycmVudF9zZXNzaW9uIChpbWxfc2Vzc2lvbl90ICpzKQp7
CiAgRGVza3RvcENvbnRleHQgKmRjOwoKICBpZiAoIXMpIHJldHVybiBJbW1GQUlM
OwoKICBpZiAoKGRjID0gc2Vzc2lvbl9nZXRfZGVza3RvcF9jb250ZXh0IChzKSkg
PT0gTlVMTCkKICAgIHJldHVybiBJbW1GQUlMOwogIAogIGRlc2t0b3BfY29udGV4
dF9zZXRfY3VycmVudF9zZXNzaW9uIChkYywgcyk7CgogIHJldHVybiBJbW1PSzsK
fQoKc3RhdGljIEltbVJlc3VsdApzZXNzaW9uX3NldF9mb2N1c19vdXRfaW50ZXJu
YWwgKGltbF9zZXNzaW9uX3QgKnMpCnsKICBEZXNrdG9wQ29udGV4dCAqZGMgPSAo
RGVza3RvcENvbnRleHQgKikgc2Vzc2lvbl9nZXRfZGVza3RvcF9jb250ZXh0IChz
KTsKICBTZXNzaW9uQ29udGV4dCAqc2MgPSAoU2Vzc2lvbkNvbnRleHQgKikgc2Vz
c2lvbl9nZXRfc2Vzc2lvbl9jb250ZXh0IChzKTsKICBJbWVNb2R1bGVSZWMgKmlt
ZV9tb2R1bGU7CgogIGlmICghZGMgfHwgIXNjKSByZXR1cm4gSW1tRkFJTDsKCiAg
c2Vzc2lvbl91cGRhdGVfc3RhdHVzX3N0cmluZyAocywgQ09OVkVSU0lPTl9PRkYp
OwogIC8vIEZJWE1FIGhpZGUgcGFsZXR0ZSBhdXgKCiAgaW1lX21vZHVsZSA9IHNj
LT5pbWVfbW9kdWxlOwoKICBpZiAoaW1lX21vZHVsZSAmJiAKICAgICAgaW1lX21v
ZHVsZS0+bWV0aG9kcyAmJgogICAgICBpbWVfbW9kdWxlLT5tZXRob2RzLT5JbWVG
b2N1c091dCkKICAgICAgaW1lX21vZHVsZS0+bWV0aG9kcy0+SW1lRm9jdXNPdXQg
KChJbWVJbnB1dENvbnRleHQpIHNjKTsKICAvL0ZJWE1FIGhhbmRsZSBhdXggdG8g
aGlkZSBjYW5kaWRhdGUgYW5kIHByZWVkaXQKICAKICByZXR1cm4gSW1tT0s7Cn0K
CkltbVJlc3VsdApzZXNzaW9uX3NldF9mb2N1c19vdXQgKGltbF9zZXNzaW9uX3Qg
KnMpCnsKICBEZXNrdG9wQ29udGV4dCAqZGMgPSAoRGVza3RvcENvbnRleHQgKikg
c2Vzc2lvbl9nZXRfZGVza3RvcF9jb250ZXh0IChzKTsKICBpbWxfc2Vzc2lvbl90
ICpjZnMgPSAoaW1sX3Nlc3Npb25fdCAqKSBkZXNrdG9wX2NvbnRleHRfZ2V0X2N1
cnJlbnRfc2Vzc2lvbiAoZGMpOwoKICBzZXNzaW9uX3NldF9mb2N1c19vdXRfaW50
ZXJuYWwgKHMpOwoKICBpZiAoY2ZzID09IHMpCiAgICBkZXNrdG9wX2NvbnRleHRf
c2V0X2N1cnJlbnRfc2Vzc2lvbiAoZGMsIE5VTEwpOwoKICByZXR1cm4gSW1tT0s7
Cn0KCnN0YXRpYyBJbW1SZXN1bHQKc2Vzc2lvbl9zZXRfZm9jdXNfaW5faW50ZXJu
YWwgKGltbF9zZXNzaW9uX3QgKnMpCnsKICBTZXNzaW9uQ29udGV4dCAqc2MgPSBz
ZXNzaW9uX2dldF9zZXNzaW9uX2NvbnRleHQgKHMpOwogIEltZU1vZHVsZVJlYyAq
aW1lX21vZHVsZTsKCiAgaWYgKCFzYykgcmV0dXJuIEltbUZBSUw7CgogIGltZV9t
b2R1bGUgPSBzYy0+aW1lX21vZHVsZTsKCiAgLy9GSVhNRSBoYW5kbGUgcGFsZXR0
ZSBhdXggaGVyZQoKICBzZXNzaW9uX3VwZGF0ZV9zdGF0dXNfc3RyaW5nIChzLCBz
Yy0+Y3Vycl9jb252ZXJzaW9uX3N0YXR1cyk7CgogIC8vRklYTUUgaGFuZGxlIGF1
eCBoZXJlCgogIGlmIChpbWVfbW9kdWxlICYmIAogICAgICBpbWVfbW9kdWxlLT5t
ZXRob2RzICYmIAogICAgICBpbWVfbW9kdWxlLT5tZXRob2RzLT5JbWVGb2N1c0lu
KQogICAgaW1lX21vZHVsZS0+bWV0aG9kcy0+SW1lRm9jdXNJbiAoKEltZUlucHV0
Q29udGV4dCkgc2MpOwoKICByZXR1cm4gSW1tT0s7Cn0KCkltbVJlc3VsdApzZXNz
aW9uX3NldF9mb2N1c19pbiAoaW1sX3Nlc3Npb25fdCAqcykKewogIERlc2t0b3BD
b250ZXh0ICpkYyA9IChEZXNrdG9wQ29udGV4dCAqKSBzZXNzaW9uX2dldF9kZXNr
dG9wX2NvbnRleHQgKHMpOwogIGltbF9zZXNzaW9uX3QgKmNmcyA9IChpbWxfc2Vz
c2lvbl90ICopIGRlc2t0b3BfY29udGV4dF9nZXRfY3VycmVudF9zZXNzaW9uIChk
Yyk7CgogIGlmIChjZnMpCiAgICB7CiAgICAgIHNlc3Npb25fc2V0X2ZvY3VzX291
dF9pbnRlcm5hbCAoY2ZzKTsKICAgICAgZGVza3RvcF9jb250ZXh0X3NldF9jdXJy
ZW50X3Nlc3Npb24gKGRjLCBOVUxMKTsKICAgICAgLy9GSVhNRSB3aGF0IG1lYW4g
YnkgZm9jdXNfc2VxX3dyb25nCiAgICB9CgogIHNlc3Npb25fc2V0X2ZvY3VzX2lu
X2ludGVybmFsIChzKTsKICBkZXNrdG9wX2NvbnRleHRfc2V0X2N1cnJlbnRfc2Vz
c2lvbiAoZGMsIHMpOwoKICByZXR1cm4gSW1tT0s7Cn0KCklNVGV4dCAqCnNlc3Np
b25fcmVzZXQgKGltbF9zZXNzaW9uX3QgKnMpCnsKICByZXR1cm4gTlVMTDsKfQoK
I2lmIDAKdHlwZWRlZiBlbnVtIHsgSU1NX0tFWV9OT1RfVVNFRCA9IC0xLCAKCSAg
ICAgICBJTU1fS0VZX1VTRUQsIAoJICAgICAgIElNTV9LRVlfU1dJVENIX0lNRV9S
T1VORCwKCSAgICAgICBJTU1fS0VZX1NXSVRDSF9JTUVfUk9VTkRfUkVWRVJTRSB9
IEltbUtleVR5cGU7Cgp0eXBlZGVmIHN0cnVjdCBfSW1tS2V5YmluZGluZ1JlYyB7
CiAgaW50IGtleWNvZGU7CiAgaW50IGtleWNoYXI7CiAgaW50IG1vZGlmaWVyOwog
IEltbUtleVR5cGUgZGVmaW5lZF90eXBlOwp9IEltbUtleWJpbmRpbmdSZWM7CgpJ
bW1LZXlCaW5kaW5nUmVjIGltbV9rZXliaW5kaW5nc19kZWZhdWx0W10gPSB7CiAg
e0lNRV9WS19TSElGVCwgICAwLCBJTUVfQ1RSTF9NQVNLLCAgSU1NX0tFWV9TV0lU
Q0hfSU1FX1JPVU5EX1JFVkVSU0V9LAogIHtJTUVfVktfQ09OVFJPSywgMCwgSU1F
X1NISUZUX01BU0ssIElNTV9LRVlfU1dJVENIX0lNRV9ST1VORH0KfTsKCnN0YXRp
YyBpbnQKZ2V0X2ltbV9rZXlfdHlwZSAoaW1sX3Nlc3Npb25fdCAqcywKCQkgIElN
S2V5RXZlbnRTdHJ1Y3QgKmtleSkKewogIGludCByZXQgPSBJTU1fS0VZX05PVF9V
U0VEOwogIGludCBrZXljb2RlLCBrZXljaGFyLCBtb2RpZmllcjsKICBpbnQgaSwg
bnVtX2tleWJpbmRpbmdzOwoKICBrZXljb2RlID0ga2V5LT5rZXlDb2RlOwogIGtl
eWNoYXIgPSBrZXktPmtleUNoYXI7CiAgbW9kaWZpZXIgPSBrZXktPm1vZGlmaWVy
OwoKICAvL0ZJWE1FIGFib3V0IGxlX2luZm8KCiAgbnVtX2tleWJpbmRpbmdzID0g
c2l6ZW9mIChpbW1fa2V5YmluZGluZ3NfZGVmYXVsdCkgLyBzaXplb2YgKEltbUtl
eWJpbmRpbmdSZWMpOwoKICBmb3IgKGkgPSAwOyBpIDwgbnVtX2tleWJpbmRpbmdz
OyArK2kpCiAgICB7CiAgICAgIEltbUtleWJpbmRpbmdSZWMgKmtiID0gaW1tX2tl
eWJpbmRpbmdzX2RlZmF1bHQgKyBpOwogICAgICBpZiAoa2V5Y29kZSA9PSBrYi0+
a2V5Y29kZSAmJiBtb2RpZmllciA9PSBrYi0+bW9kaWZpZXIpCgl7CgkgIHJldCA9
IGtiLT5kZWZpbmVkX3R5cGU7CgkgIGJyZWFrOwoJfQogICAgfQoKICByZXR1cm4g
cmV0Owp9CgpzdGF0aWMgaW50CnNlc3Npb25fcHJvY2Vzc19rZXlfZXZlbnRfd2l0
aF9pbWVfbWFuYWdlciAoaW1sX3Nlc3Npb25fdCAqcywKCQkJCQkgICAgSU1LZXlF
dmVudFN0cnVjdCAqa2V5KQp7CiAgaW50IGltbV9rZXlfdHlwZSwgc3RhdHVzID0g
SW1tT0s7CgogIGlmICgoaW1tX2tleV90eXBlID0gZ2V0X2ltbV9rZXlfdHlwZSAo
cywga2V5KSkgPT0gSU1NX0tFWV9OT1RfVVNFRCkKICAgIHJldHVybiBpbW1fa2V5
X3R5cGU7CgogIHN3aXRjaCAoaW1tX2tleV90eXBlKQogICAgewogICAgY2FzZSBJ
TU1fS0VZX1NXSVRDSF9JTUVfUk9VTkQ6CiAgICAgIHN0YXR1cyA9IHNlc3Npb25f
c3dpdGNoX3RvX25leHRfaW1lX21vZHVsZSAocyk7CiAgICAgIGJyZWFrOwogICAg
Y2FzZSBJTU1fS0VZX1NXSVRDSF9JTUVfUk9VTkRfUkVWRVJTRToKICAgICAgc3Rh
dHVzID0gc2Vzc2lvbl9zd2l0Y2hfdG9fcHJldmlvdXNfaW1lX21vZHVsZSAocyk7
CiAgICAgIGJyZWFrOwogICAgfQoKICByZXR1cm4gc3RhdHVzID09IEltbU9LID8g
SU1NX0tFWV9VU0VEIDogSU1NX0tFWV9OT1RfVVNFRDsKfQojZW5kaWYKCnN0YXRp
YyBpbnQKc2Vzc2lvbl9wcm9jZXNzX2tleV9ldmVudF93aXRoX2ltZV9tb2R1bGUg
KGltbF9zZXNzaW9uX3QgKnMsCgkJCQkJICAgSU1LZXlFdmVudFN0cnVjdCAqa2V5
KQp7CiAgaW50IHJldCA9IElNRV9VTlVTRURfS0VZOwogIEltZUtleVJlYyBpbWVf
a2V5ZXZlbnQ7CiAgSW1lTW9kdWxlUmVjICppbWVfbW9kdWxlOwogIFNlc3Npb25D
b250ZXh0ICpzYzsKCiAgaW1lX21vZHVsZSA9IChJbWVNb2R1bGVSZWMgKikgc2Vz
c2lvbl9nZXRfY3VycmVudF9pbWVfbW9kdWxlIChzKTsKICBpZiAoIWltZV9tb2R1
bGUgfHwgCiAgICAgICFpbWVfbW9kdWxlLT5tZXRob2RzIHx8IAogICAgICAhaW1l
X21vZHVsZS0+bWV0aG9kcy0+SW1lUHJvY2Vzc0tleUV2ZW50KQogICAgcmV0dXJu
IHJldDsKCiAgaWYgKChzYyA9IChTZXNzaW9uQ29udGV4dCAqKSBzZXNzaW9uX2dl
dF9zZXNzaW9uX2NvbnRleHQgKHMpKSA9PSBOVUxMKQogICAgcmV0dXJuIHJldDsK
CiAgaW1lX2tleWV2ZW50LmtleWNvZGUgPSBrZXktPmtleUNvZGU7CiAgaW1lX2tl
eWV2ZW50LmtleWNoYXIgPSBrZXktPmtleUNoYXI7CiAgaW1lX2tleWV2ZW50Lm1v
ZGlmaWVyID0ga2V5LT5tb2RpZmllcjsKCiAgcmV0ID0gaW1lX21vZHVsZS0+bWV0
aG9kcy0+SW1lUHJvY2Vzc0tleUV2ZW50ICgoSW1lSW5wdXRDb250ZXh0KSBzYywK
CQkJCQkgICAgICAmaW1lX2tleWV2ZW50KTsKCiAgcmV0dXJuIHJldDsKfQoKSW1t
UmVzdWx0CnNlc3Npb25fcHJvY2Vzc19rZXlfZXZlbnQgKGltbF9zZXNzaW9uX3Qg
KnMsCgkJCSBJTUtleUV2ZW50U3RydWN0ICprZXkpCnsKICBTZXNzaW9uQ29udGV4
dCAqc2MgPSAoU2Vzc2lvbkNvbnRleHQgKikgc2Vzc2lvbl9nZXRfc2Vzc2lvbl9j
b250ZXh0IChzKTsKICBpbnQgcmV0OwoKICBpZiAoIXNjKSBzLT5JZi0+bV93cmFw
cGVyLT5pbWxfZm9yd2FyZF9rZXlwcmVzcyAocywga2V5KTsgLy9GSVhNRQoKI2lm
IDAKICBpZiAoKHJldCA9IHNlc3Npb25fcHJvY2Vzc19rZXlfZXZlbnRfd2l0aF9p
bWVfbWFuYWdlciAocywga2V5KSkgPT0KICAgICAgSU1NX0tFWV9VU0VEKQogICAg
cmV0dXJuIEltbU9LOwojZW5kaWYKCiAgaWYgKChyZXQgPSBzZXNzaW9uX3Byb2Nl
c3Nfa2V5X2V2ZW50X3dpdGhfaW1lX21vZHVsZSAocywga2V5KSkgPT0KICAgICAg
SU1FX1VOVVNFRF9LRVkpCiAgICBzLT5JZi0+bV93cmFwcGVyLT5pbWxfZm9yd2Fy
ZF9rZXlwcmVzcyAocywga2V5KTsKCiAgcmV0dXJuIEltbU9LOwp9CgpJbW1SZXN1
bHQKc2Vzc2lvbl9wcm9jZXNzX2F1eF9ldmVudCAoaW1sX3Nlc3Npb25fdCAqcywK
CQkJICAgSU1BdXhFdmVudCAqZXZlbnQpCnsKICBEZXNrdG9wQ29udGV4dCAqZGM7
CiAgSU1BdXhEcmF3Q2FsbGJhY2tTdHJ1Y3QgKmF1eF9kYXRhID0gZXZlbnQtPmF1
eDsKICBpbnQgbkludGVnZXJDb3VudCwgKnBJbnRlcmdlckxpc3Q7CiAgaW50IHJl
cVR5cGU7CgojaWYgMAogIGRjID0gKERlc2t0b3BDb250ZXh0ICopIHNlc3Npb25f
Z2V0X2Rlc2t0b3BfY29udGV4dCAocyk7CiAgbkludGVnZXJDb3VudCA9IGF1eF9k
YXRhLT5jb3VudF9pbnRlZ2VyX3ZhbHVlczsKICBwSW50ZWdlckxpc3QgPSBhdXhf
ZGF0YS0+aW50ZWdlcl92YWx1ZXM7CgogIGlmIChuSW50ZWdlckNvdW50IDw9IDAp
IHJldHVybiBJbW1GQUlMOwoKICByZXFUeXBlID0gKnBJbnRlZ2VyTGlzdDsKCiAg
YXV4X2RhdGEgPSBjb252ZXJ0QXV4RXZlbnRFbmNvZGluZyAoYXV4X2RhdGEsIEVO
Q09ERV9VVEY4KTsKICBzd2l0Y2ggKHJlcVR5cGUpIAogICAgewogICAgICBjYXNl
IENPUE9TSUEKICAgIH0KCiAgZnJlZUNvbnZlcnRlZEV2ZW50IChhdXhfZGF0YSk7
CiNlbmRpZgoKICByZXR1cm4gSW1tT0s7Cn0KCi8qIExvY2FsIFZhcmlhYmxlczog
Ki8KLyogYy1maWxlLXN0eWxlOiAiaWlpbS1wcm9qZWN0IiAqLwovKiBFbmQ6ICov
CgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABJTUNvbW1vbi5jAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDEwMDY0NAAwMjc3
NTAyADAwMDAwMTIAMDAwMDAwMjMxMDcAMTAzMTEyMjA3MzAAMDEyMDM0ACAwAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AHVzdGFyICAAZnpoYW5nAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB3aGVlbAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAC8qCiAgQ29weXJpZ2h0IDE5OTAtMjAwNSBTdW4gTWlj
cm9zeXN0ZW1zLCBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCgogIFBlcm1pc3Np
b24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVy
c29uIG9idGFpbmluZyBhCiAgY29weSBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3Nv
Y2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZQogICJTb2Z0d2FyZSIpLCB0
byBkZWFsIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNs
dWRpbmcKICB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHJpZ2h0cyB0byB1c2UsIGNv
cHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsCiAgZGlzdHJpYnV0ZSwgc3VibGlj
ZW5zZSwgYW5kL29yIHNlbGwgY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRv
CiAgcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUgU29mdHdhcmUgaXMgZnVybmlz
aGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvCiAgdGhlIGZvbGxvd2luZyBjb25kaXRp
b25zOiBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcwogIHBlcm1p
c3Npb24gbm90aWNlIHNoYWxsIGJlIGluY2x1ZGVkIGluIGFsbCBjb3BpZXMgb3Ig
c3Vic3RhbnRpYWwKICBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuCgoKICBUSEUg
U09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBP
RiBBTlkgS0lORCwgRVhQUkVTUwogIE9SIElNUExJRUQsIElOQ0xVRElORyBCVVQg
Tk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YKICBNRVJDSEFOVEFCSUxJ
VFksIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZS
SU5HRU1FTlQuCiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIE9QRU4gR1JPVVAgT1Ig
U1VOIE1JQ1JPU1lTVEVNUywgSU5DLiBCRSBMSUFCTEUKICBGT1IgQU5ZIENMQUlN
LCBEQU1BR0VTIE9SIE9USEVSIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJ
T04gT0YKICBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcgRlJP
TSwgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSAogIFRIRSBTT0ZUV0FSRSBP
UiBUSEUgVVNFIE9SIE9USEVSIERFQUxJTkdTIElOIFRIRSBTT0ZUV0FSRSBFVkVO
IElGCiAgQURWSVNFRCBJTiBBRFZBTkNFIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBT
VUNIIERBTUFHRVMuCgoKICBFeGNlcHQgYXMgY29udGFpbmVkIGluIHRoaXMgbm90
aWNlLCB0aGUgbmFtZXMgb2YgVGhlIE9wZW4gR3JvdXAgYW5kL29yCiAgU3VuIE1p
Y3Jvc3lzdGVtcywgSW5jLiBzaGFsbCBub3QgYmUgdXNlZCBpbiBhZHZlcnRpc2lu
ZyBvciBvdGhlcndpc2UgdG8KICBwcm9tb3RlIHRoZSBzYWxlLCB1c2Ugb3Igb3Ro
ZXIgZGVhbGluZ3MgaW4gdGhpcyBTb2Z0d2FyZSB3aXRob3V0IHByaW9yCiAgd3Jp
dHRlbiBhdXRob3JpemF0aW9uIGZyb20gVGhlIE9wZW4gR3JvdXAgYW5kL29yIFN1
biBNaWNyb3N5c3RlbXMsCiAgSW5jLiwgYXMgYXBwbGljYWJsZS4KCgogIFggV2lu
ZG93IFN5c3RlbSBpcyBhIHRyYWRlbWFyayBvZiBUaGUgT3BlbiBHcm91cAoKICBP
U0YvMSwgT1NGL01vdGlmIGFuZCBNb3RpZiBhcmUgcmVnaXN0ZXJlZCB0cmFkZW1h
cmtzLCBhbmQgT1NGLCB0aGUgT1NGCiAgbG9nbywgTEJYLCBYIFdpbmRvdyBTeXN0
ZW0sIGFuZCBYaW5lcmFtYSBhcmUgdHJhZGVtYXJrcyBvZiB0aGUgT3BlbgogIEdy
b3VwLiBBbGwgb3RoZXIgdHJhZGVtYXJrcyBhbmQgcmVnaXN0ZXJlZCB0cmFkZW1h
cmtzIG1lbnRpb25lZCBoZXJlaW4KICBhcmUgdGhlIHByb3BlcnR5IG9mIHRoZWly
IHJlc3BlY3RpdmUgb3duZXJzLiBObyByaWdodCwgdGl0bGUgb3IKICBpbnRlcmVz
dCBpbiBvciB0byBhbnkgdHJhZGVtYXJrLCBzZXJ2aWNlIG1hcmssIGxvZ28gb3Ig
dHJhZGUgbmFtZSBvZgogIFN1biBNaWNyb3N5c3RlbXMsIEluYy4gb3IgaXRzIGxp
Y2Vuc29ycyBpcyBncmFudGVkLgoKKi8KCiNpbmNsdWRlIDxzdGRpby5oPgojaW5j
bHVkZSA8c3RyaW5nLmg+CiNpbmNsdWRlIDxzdGRsaWIuaD4KCiNpZmRlZiBzdW4K
I2luY2x1ZGUgPHN5cy90eXBlcy5oPgojaW5jbHVkZSA8c3lzL3N0YXQuaD4KI2Vu
ZGlmCgojaW5jbHVkZSA8dW5pc3RkLmg+CiNpbmNsdWRlIDxkbGZjbi5oPgoKI2lu
Y2x1ZGUgIlN1bklNLmgiCiNpbmNsdWRlICJJTVNlc3Npb24uaCIKI2luY2x1ZGUg
ImF1eF9wcm90b2NvbC5oIgojaW5jbHVkZSAiSU1VdGlsLmgiCiNpbmNsdWRlICJJ
TUUuaCIKCnN0YXRpYyBCb29sIGNsZV9PcGVuSUYgKGltbF9pZl90ICopOwpzdGF0
aWMgQm9vbCBjbGVfQ2xvc2VJRiAoaW1sX2lmX3QgKik7CnN0YXRpYyBCb29sIGNs
ZV9HZXRJRlZhbHVlIChpbWxfaWZfdCAqLCBJTUFyZ0xpc3QsIGludCk7CnN0YXRp
YyBCb29sIGNsZV9TZXRJRlZhbHVlIChpbWxfaWZfdCAqLCBJTUFyZ0xpc3QsIGlu
dCk7CnN0YXRpYyBCb29sIGNsZV9PcGVuRGVza3RvcCAoaW1sX2Rlc2t0b3BfdCAq
LCBJTUFyZ0xpc3QsIGludCk7CnN0YXRpYyBCb29sIGNsZV9DbG9zZURlc2t0b3Ag
KGltbF9kZXNrdG9wX3QgKik7CnN0YXRpYyBCb29sIGNsZV9DcmVhdGVTQyAoaW1s
X3Nlc3Npb25fdCAqLCBJTUFyZ0xpc3QsIGludCk7CnN0YXRpYyBCb29sIGNsZV9E
ZXN0cm95U0MgKGltbF9zZXNzaW9uX3QgKik7CnN0YXRpYyBCb29sIGNsZV9HZXRT
Q1ZhbHVlIChpbWxfc2Vzc2lvbl90ICosIElNQXJnTGlzdCwgaW50KTsKc3RhdGlj
IEJvb2wgY2xlX1NldFNDVmFsdWUgKGltbF9zZXNzaW9uX3QgKiwgSU1BcmdMaXN0
LCBpbnQpOwpzdGF0aWMgSU1UZXh0ICpjbGVfUmVzZXRTQyAoaW1sX3Nlc3Npb25f
dCAqKTsKc3RhdGljIHZvaWQgY2xlX1NldFNDRm9jdXMgKGltbF9zZXNzaW9uX3Qg
Kik7CnN0YXRpYyB2b2lkIGNsZV9VbnNldFNDRm9jdXMgKGltbF9zZXNzaW9uX3Qg
Kik7CnN0YXRpYyB2b2lkIGNsZV9TZW5kRXZlbnQgKGltbF9zZXNzaW9uX3QgKiwg
SU1JbnB1dEV2ZW50ICopOwoKI2RlZmluZSBSRUdJU1RFUl9JTUVfUFJPQ05BTUUg
IlJlZ2lzdGVySU1FIgoKI2lmZGVmIF9QT1NJWF9QQVRIX01BWAojZGVmaW5lIFBB
VEhOQU1FX01BWCBfUE9TSVhfUEFUSF9NQVgKI2Vsc2UKI2RlZmluZSBQQVRITkFN
RV9NQVggMTAyNAojZW5kaWYKCiNkZWZpbmUgQ09NTU9OX0xFX1ZFUlNJT04gIjAu
MSI7CgppbWxfaWZfdCAqCmlmX09wZW5Db21tb25JRiAoY29uc3QgY2hhciAqaWZf
cGF0aCwKCQkgY29uc3QgY2hhciAqaW1lX25hbWUsCgkJIGNvbnN0IGNoYXIgKmlm
X2xvY2FsZSwKCQkgQm9vbCBjYWxsX29wZW5pZikKewogIGltbF9pZl90ICpJZjsK
ICBjaGFyIGltZV9wYXRoW1BBVEhOQU1FX01BWF07CiAgdm9pZCAqaW1lX29iamVj
dCA9IE5VTEw7CiAgaW50IGNvdW50OwogIGludCB2ZXJzaW9uX2lkeCwgbGVuYW1l
X2lkeCwgbG9jYWxlc19pZHgsIG9iamVjdHNfaWR4LAogICAgICBrZXlyZWxlYXNl
X2lkeCwgbWV0aG9kc19pZHgsIHRocmVhZF9sb2NrX2lkeCwgaW1laW5mb19pZHg7
CiAgSU1BcmcgcFsxMV07CiAgSW1tUmVzdWx0ICgqaW1lX3JlZ2lzdGVyX21ldGhv
ZCkgKCk7CiAgSW1lSW5mb1JlYyAqaW1lX2luZm8gPSBOVUxMOwogIEltZU1ldGhv
ZHNSZWMgKmltZV9tZXRob2RzOwogIGludCBhcmdjID0gMTsKICBjaGFyICphcmd2
ID0gInpoX0NOIjsgLy9GSVhNRQoKICBJZiA9IChpbWxfaWZfdCAqKSBjYWxsb2Mg
KDEsIHNpemVvZiAoaW1sX2lmX3QpKTsKCiAgLyogRklYTUUgaGtjX2dldF9mdW5j
dGlvbiwgdXBkYXRlU3VwcHJ0ZWRMb2NhbGVzLCBzd2l0Y2hMRVByb2ZpbGUgKi8K
CiAgLyogdmVyaWZ5IHdoZXRoZXIgdGhlIGltZSBtb2R1bGUgZXhpc3RzIG9yIG5v
dCAqLwogIG1lbXNldCAoaW1lX3BhdGgsIDAsIFBBVEhOQU1FX01BWCk7CiAgc3By
aW50ZiAoaW1lX3BhdGgsICIlcy8lcy5zbyIsIGlmX3BhdGgsIGltZV9uYW1lKTsK
ICBpZiAoKGltZV9vYmplY3QgPSBvcGVuX2xlX21vZHVsZSAoaW1lX3BhdGgpKSA9
PSBOVUxMKQogICAgcmV0dXJuIE5VTEw7CgogIC8qIGNoZWNrIHdoZXRoZXIgaXQg
aXMgdmFsaWQgaW1lIG9iamVjdCAqLwogIGlmICgoaW1lX3JlZ2lzdGVyX21ldGhv
ZCA9IGRsc3ltIChpbWVfb2JqZWN0LCBSRUdJU1RFUl9JTUVfUFJPQ05BTUUpKSA9
PSBOVUxMKQogICAgewogICAgICBjbG9zZV9sZV9tb2R1bGUgKGltZV9vYmplY3Qp
OwogICAgICByZXR1cm4gTlVMTDsKICAgIH0KCiAgSWYtPmRsX21vZHVsZSA9IGlt
ZV9vYmplY3Q7CiAgSWYtPmxvY2FsZSA9IHN0cmR1cCAoaWZfbG9jYWxlKTsKICBJ
Zi0+aWZfbmFtZSA9IHN0cmR1cCAoaW1lX25hbWUpOwogIElmLT5pZnBhdGhfbmFt
ZSA9IHN0cmR1cCAoaWZfcGF0aCk7CiAgSWYtPm0gPSBfaW1sX2R1cF9pbWxfbWV0
aG9kcyAoKTsKICBJZi0+bV93cmFwcGVyID0gX2ltbF9kdXBfaW1sX21ldGhvZHNf
d3JhcHBlciAoKTsKCiAgLyogZ2V0IHRoZSBpZiBpbmZvcm1hdGlvbiAqLwogIAog
IGNvdW50ID0gMDsKICBJTVNldEFyZyAocFtjb3VudF0sIElGX1ZFUlNJT04sIE5V
TEwpOyB2ZXJzaW9uX2lkeCA9IGNvdW50Kys7CiAgSU1TZXRBcmcgKHBbY291bnRd
LCBJRl9MRV9OQU1FLCBOVUxMKTsgbGVuYW1lX2lkeCA9IGNvdW50Kys7CiAgSU1T
ZXRBcmcgKHBbY291bnRdLCBJRl9TVVBQT1JURURfTE9DQUxFUywgTlVMTCk7IGxv
Y2FsZXNfaWR4ID0gY291bnQrKzsKICBJTVNldEFyZyAocFtjb3VudF0sIElGX1NV
UFBPUlRFRF9PQkpFQ1RTLCBOVUxMKTsgb2JqZWN0c19pZHggPSBjb3VudCsrOwog
IElNU2V0QXJnIChwW2NvdW50XSwgSUZfTUVUSE9EX1RBQkxFLCBOVUxMKTsgbWV0
aG9kc19pZHggPSBjb3VudCsrOwogIElNU2V0QXJnIChwW2NvdW50XSwgSUZfTkVF
RF9USFJFQURfTE9DSywgTlVMTCk7IHRocmVhZF9sb2NrX2lkeCA9IGNvdW50Kys7
CiAgSU1TZXRBcmcgKHBbY291bnRdLCBJRl9TVVBQT1JURURfS0VZUkVMRUFTRSwg
TlVMTCk7IGtleXJlbGVhc2VfaWR4ID0gY291bnQrKzsKICBJTVNldEFyZyAocFtj
b3VudF0sIElGX1NVUFBPUlRFRF9JTUVJTkZPLCBOVUxMKTsgaW1laW5mb19pZHgg
PSBjb3VudCsrOwogIGNsZV9HZXRJZkluZm8gKHAsIGNvdW50KTsKCiAgSWYtPmlm
X3ZlcnNpb24gPSAoY2hhciAqKSBwW3ZlcnNpb25faWR4XS52YWx1ZTsKICBJZi0+
aWZtID0gKGlmX21ldGhvZHNfdCAqKSBwW21ldGhvZHNfaWR4XS52YWx1ZTsKICBJ
Zi0+bGVuYW1lID0gKElNTEVOYW1lICopIHBbbGVuYW1lX2lkeF0udmFsdWU7CiAg
SWYtPmxvY2FsZV9saXN0ID0gKElNTG9jYWxlICopIHBbbG9jYWxlc19pZHhdLnZh
bHVlOwogIElmLT5vYmplY3RfbGlzdCA9IChJTU9iamVjdERlc2NyaXB0b3JTdHJ1
Y3QgKikgcFtvYmplY3RzX2lkeF0udmFsdWU7CiAgSWYtPm5lZWRfdGhyZWFkX2xv
Y2sgPSAoQm9vbCkgcFt0aHJlYWRfbG9ja19pZHhdLnZhbHVlOwogIElmLT5uZWVk
X2tleXJlbGVhc2UgPSAoQm9vbCkgcFtrZXlyZWxlYXNlX2lkeF0udmFsdWU7CiAg
SWYtPmltZWluZm9fbGlzdCA9IChJTUVJbmZvICopIHBbaW1laW5mb19pZHhdLnZh
bHVlOwoKICBpZiAoIUlmLT5sZW5hbWUpCiAgICB7CiAgICAgIElNTEVOYW1lICps
ZW5hbWUgPSAoSU1MRU5hbWUgKiljYWxsb2MgKDEsIHNpemVvZiAoSU1MRU5hbWUp
KTsKCiAgICAgIGxlbmFtZS0+aWQgPSBzdHJkdXAgKGltZV9uYW1lKTsKICAgICAg
bGVuYW1lLT5uYW1lID0gdXRmY2hhcl9uZXdfd2l0aF9hc2NpaSAoaW1lX25hbWUp
OwoKICAgICAgSWYtPmxlbmFtZSA9IGxlbmFtZTsKICAgIH0KCiAgLy9GSVhNRSBj
YWxsIHRoaXMgcmVnaXN0ZXIgbWV0aG9kIHR3aWNlCiAgLy8gaW1lX3JlZ2lzdGVy
X21ldGhvZCAoTlVMTCwgJmltZV9pbmZvLCAmaW1lX21ldGhvZHMsIGFyZ2MsICZh
cmd2KTsKCiAgaWYgKDAgJiYgIUlmLT5pbWVpbmZvX2xpc3QgJiYgaW1lX2luZm8p
CiAgICB7CiAgICAgIElNRUluZm8gKmluZm8gPSAoSU1FSW5mbyAqKSBtYWxsb2Mg
KHNpemVvZiAoSU1FSW5mbykgKiAyKTsKCiAgICAgIG1lbXNldCAoaW5mbywgMCwg
c2l6ZW9mIChJTUVJbmZvKSAqIDIpOwoKICAgICAgaW5mby0+ZW5hYmxlID0gVHJ1
ZTsKICAgICAgaW5mby0+aW1lX2lkID0gc3RyZHVwIChpbWVfaW5mby0+dXVpZCk7
CiAgICAgIG15X2NvbnZlcnQgKEVOQ09ERV9HQjE4MDMwLCBpbWVfaW5mby0+bmFt
ZSwgJmluZm8tPmltZW5hbWUpOyAvLyBGSVhNRQogICAgICBpZiAoaW1lX2luZm8t
PmF1dGhvcikKCWluZm8tPmF1dGhvciA9IHV0ZmNoYXJfbmV3X3dpdGhfYXNjaWkg
KGltZV9pbmZvLT5hdXRob3IpOyAvLyBGSVhNRQogICAgICBpZiAoaW1lX2luZm8t
PmNvcHlyaWdodCkKCWluZm8tPmNvcHlyaWdodCA9IHV0ZmNoYXJfbmV3X3dpdGhf
YXNjaWkgKGltZV9pbmZvLT5jb3B5cmlnaHQpOyAvLyBGSVhNRQoKICAgICAgSWYt
PmltZWluZm9fbGlzdCA9IGluZm87CiAgICB9CgogIGlmICghSWYtPmxvY2FsZV9s
aXN0KQogICAgewogICAgICBJTUxvY2FsZSAqZGVmYXVsdF9sb2NhbGVzID0gY2Fs
bG9jICgyLCBzaXplb2YgKElNTG9jYWxlKSk7CgogICAgICBkZWZhdWx0X2xvY2Fs
ZXNbMF0uaWQgPSBzdHJkdXAgKCJ6aF9DTiIpOy8vRklYTUUKICAgICAgZGVmYXVs
dF9sb2NhbGVzWzBdLm5hbWUgPSB1dGZjaGFyX25ld193aXRoX2FzY2lpICgiemhf
Q04iKTsvL0ZJWE1FCiAgICAgIElmLT5sb2NhbGVfbGlzdCA9IGRlZmF1bHRfbG9j
YWxlczsKICAgIH0KCiAgaWYgKGltZV9pbmZvKSBmcmVlIChpbWVfaW5mbyk7Cgog
IC8qIEZJWE1FIEhPVEtFWSBJTkZPUk1BVElPTiAqLwoKICBpZiAoY2FsbF9vcGVu
aWYpIGNsZV9PcGVuSUYgKElmKTsKCiAgcmV0dXJuIElmOwp9CgppZl9tZXRob2Rz
X3QgY2xlX21ldGhvZHMgPSB7CiAgY2xlX09wZW5JRiwKICBjbGVfQ2xvc2VJRiwK
ICBjbGVfR2V0SUZWYWx1ZSwKICBjbGVfU2V0SUZWYWx1ZSwKICBjbGVfT3BlbkRl
c2t0b3AsCiAgY2xlX0Nsb3NlRGVza3RvcCwKICBjbGVfQ3JlYXRlU0MsCiAgY2xl
X0Rlc3Ryb3lTQywKICBjbGVfR2V0U0NWYWx1ZSwKICBjbGVfU2V0U0NWYWx1ZSwK
ICBjbGVfUmVzZXRTQywKICBjbGVfU2V0U0NGb2N1cywKICBjbGVfVW5zZXRTQ0Zv
Y3VzLAogIGNsZV9TZW5kRXZlbnQKfTsKCnZvaWQKY2xlX0dldElmSW5mbyAoSU1B
cmdMaXN0IGFyZ3MsIGludCBudW1fYXJncykKewogIGludCBpOwoKICBmb3IgKGkg
PSAwOyBpIDwgbnVtX2FyZ3M7ICsraSwgKythcmdzKQogICAgewogICAgICBzd2l0
Y2ggKGFyZ3MtPmlkKQoJewoJY2FzZSBJRl9WRVJTSU9OOgoJICBhcmdzLT52YWx1
ZSA9IChJTUFyZ1ZhbCkgQ09NTU9OX0xFX1ZFUlNJT047CgkgIGJyZWFrOwoJY2Fz
ZSBJRl9NRVRIT0RfVEFCTEU6CgkgIGFyZ3MtPnZhbHVlID0gKElNQXJnVmFsKSAm
Y2xlX21ldGhvZHM7CgkgIGJyZWFrOwoJY2FzZSBJRl9MRV9OQU1FOgoJICBicmVh
azsKCWNhc2UgSUZfU1VQUE9SVEVEX0xPQ0FMRVM6CgkgIGJyZWFrOwoJY2FzZSBJ
Rl9TVVBQT1JURURfT0JKRUNUUzoKCSAgYnJlYWs7CgljYXNlIElGX05FRURfVEhS
RUFEX0xPQ0s6CgkgIGFyZ3MtPnZhbHVlID0gKElNQXJnVmFsKSBJbW1PSzsKCSAg
YnJlYWs7CgljYXNlIElGX1NVUFBPUlRFRF9JTUVJTkZPOgoJICBicmVhazsKCWRl
ZmF1bHQ6CgkgIGJyZWFrOwoJfQogICAgfQp9CgpzdGF0aWMgQm9vbApjbGVfT3Bl
bklGIChpbWxfaWZfdCAqSWYpCnsKICByZXR1cm4gVHJ1ZTsKfQoKc3RhdGljIEJv
b2wKY2xlX0Nsb3NlSUYgKGltbF9pZl90ICpJZikKewogIHJldHVybiBUcnVlOwp9
CgpzdGF0aWMgQm9vbApjbGVfR2V0SUZWYWx1ZSAoaW1sX2lmX3QgKklmLAoJCUlN
QXJnTGlzdCBhcmdzLAoJCWludCBudW1fYXJncykKewogIHJldHVybiBUcnVlOwp9
CgpzdGF0aWMgQm9vbApjbGVfU2V0SUZWYWx1ZSAoaW1sX2lmX3QgKklmLAoJCUlN
QXJnTGlzdCBhcmdzLAoJCWludCBudW1fYXJncykKewogIHJldHVybiBUcnVlOwp9
CgpzdGF0aWMgQm9vbApjbGVfT3BlbkRlc2t0b3AgKGltbF9kZXNrdG9wX3QgKmRl
c2t0b3AsCgkJIElNQXJnTGlzdCBhcmdzLAoJCSBpbnQgbnVtX2FyZ3MpCnsKICBk
ZXNrdG9wX2NyZWF0ZSAoZGVza3RvcCk7CgogIHJldHVybiBUcnVlOwp9CgpzdGF0
aWMgQm9vbApjbGVfQ2xvc2VEZXNrdG9wIChpbWxfZGVza3RvcF90ICpkZXNrdG9w
KQp7CiAgZGVza3RvcF9kZXN0cm95IChkZXNrdG9wKTsKCiAgcmV0dXJuIFRydWU7
Cn0KCnN0YXRpYyBCb29sCmNsZV9DcmVhdGVTQyAoaW1sX3Nlc3Npb25fdCAqcywK
CSAgICAgIElNQXJnTGlzdCBhcmdzLAoJICAgICAgaW50IG51bV9hcmdzKQp7CiAg
cy0+c3BlY2lmaWNfZGF0YSA9IE5VTEw7CiAgc2Vzc2lvbl9jcmVhdGUgKHMpOwoK
ICByZXR1cm4gVHJ1ZTsKfQoKc3RhdGljIEJvb2wKY2xlX0Rlc3Ryb3lTQyAoaW1s
X3Nlc3Npb25fdCAqcykKewogIHNlc3Npb25fZGVzdHJveSAocyk7CgogIHJldHVy
biBUcnVlOwp9CgpzdGF0aWMgQm9vbApjbGVfR2V0U0NWYWx1ZSAoaW1sX3Nlc3Np
b25fdCAqcywKCQlJTUFyZ0xpc3QgYXJncywKCQlpbnQgbnVtX2FyZ3MpCnsKICBy
ZXR1cm4gVHJ1ZTsKfQoKc3RhdGljIEJvb2wKY2xlX1NldFNDVmFsdWUgKGltbF9z
ZXNzaW9uX3QgKnMsCgkJSU1BcmdMaXN0IGFyZ3MsCgkJaW50IG51bV9hcmdzKQp7
CiAgaW50IGk7CiAgSU1BcmcgKnAgPSBhcmdzOwoKICBzZXNzaW9uX3NldF9hc19k
ZXNrdG9wX2N1cnJlbnRfc2Vzc2lvbiAocyk7CgogIGZvciAoaSA9IDA7IGkgPCBu
dW1fYXJnczsgKytpLCArK3ApCiAgICB7CiAgICAgIHN3aXRjaCAocC0+aWQpCgl7
CgljYXNlIFNDX1RSSUdHRVJfT05fTk9USUZZOgoJICBzZXNzaW9uX3NldF9jb252
ZXJzaW9uX3N0YXR1cyAocywgQ09OVkVSU0lPTl9PTik7CgkgIGJyZWFrOwoJY2Fz
ZSBTQ19UUklHR0VSX09GRl9OT1RJRlk6CgkgIHNlc3Npb25fc2V0X2NvbnZlcnNp
b25fc3RhdHVzIChzLCBDT05WRVJTSU9OX09GRik7CgkgIGJyZWFrOwoJY2FzZSBT
Q19SRUFMSVpFOgoJICAvL0ZJWE1FIGhhbmRsZSBhdXggb2JqZWN0cwoJICBicmVh
azsKCWNhc2UgU0NfQ0xJRU5UX0xPQ0FMRToKCSAgc2Vzc2lvbl9zZXRfY2xpZW50
X2VuY29kaW5nIChzLCBFTkNPREVfR0IxODAzMCk7Ly9GSVhNRQoJICBicmVhazsK
CWNhc2UgU0NfQ0xJRU5UX0lOUFVUX01FVEhPRF9FTkdJTkU6CgkgIGJyZWFrOwoJ
ZGVmYXVsdDoKCSAgYnJlYWs7Cgl9CiAgICB9CgogIHJldHVybiBUcnVlOwp9Cgpz
dGF0aWMgSU1UZXh0ICAqCmNsZV9SZXNldFNDIChpbWxfc2Vzc2lvbl90ICpzKQp7
CiAgSU1UZXh0ICp0ZXh0ID0gc2Vzc2lvbl9yZXNldCAocyk7CgogIHJldHVybiAo
SU1UZXh0ICopIHRleHQ7Cn0KCnN0YXRpYyB2b2lkCmNsZV9TZXRTQ0ZvY3VzIChp
bWxfc2Vzc2lvbl90ICpzKQp7CiAgc2Vzc2lvbl9zZXRfZm9jdXNfaW4gKHMpOwp9
CgpzdGF0aWMgdm9pZApjbGVfVW5zZXRTQ0ZvY3VzIChpbWxfc2Vzc2lvbl90ICpz
KSAgICAgCnsKICBzZXNzaW9uX3NldF9mb2N1c19vdXQgKHMpOwp9CgpzdGF0aWMg
dm9pZApjbGVfU2VuZEV2ZW50IChpbWxfc2Vzc2lvbl90ICpzLAoJICAgICAgIElN
SW5wdXRFdmVudCAqZXZlbnQpCnsKICBpZiAoZXZlbnQpCiAgICB7CiAgICAgIGlm
IChldmVudC0+dHlwZSA9PSBJTV9FdmVudEtleUxpc3QpCglzZXNzaW9uX3Byb2Nl
c3Nfa2V5X2V2ZW50IChzLCAoKElNS2V5TGlzdEV2ZW50ICopZXZlbnQpLT5rZXls
aXN0KTsKICAgICAgZWxzZSBpZiAoZXZlbnQtPnR5cGUgPT0gSU1fRXZlbnRBdXgp
Cgl7CgkgIC8vIEZJWE1FIGhhbmRsZSBhdXggZXZlbnQgaGVyZQoJfQogICAgfQp9
CgovKiBMb2NhbCBWYXJpYWJsZXM6ICovCi8qIGMtZmlsZS1zdHlsZTogImlpaW0t
cHJvamVjdCIgKi8KLyogRW5kOiAqLwoAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABJTURlc2t0b3AuYwAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDEwMDY0NAAwMjc3
NTAyADAwMDAwMTIAMDAwMDAwMTMwNTYAMTAzMTAwMjY0NzcAMDEyMjMyACAwAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AHVzdGFyICAAZnpoYW5nAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB3aGVlbAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAC8qCiAgQ29weXJpZ2h0IDE5OTAtMjAwMSBTdW4gTWlj
cm9zeXN0ZW1zLCBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCgogIFBlcm1pc3Np
b24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVy
c29uIG9idGFpbmluZyBhCiAgY29weSBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3Nv
Y2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZQogICJTb2Z0d2FyZSIpLCB0
byBkZWFsIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNs
dWRpbmcKICB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHJpZ2h0cyB0byB1c2UsIGNv
cHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsCiAgZGlzdHJpYnV0ZSwgc3VibGlj
ZW5zZSwgYW5kL29yIHNlbGwgY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRv
CiAgcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUgU29mdHdhcmUgaXMgZnVybmlz
aGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvCiAgdGhlIGZvbGxvd2luZyBjb25kaXRp
b25zOiBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcwogIHBlcm1p
c3Npb24gbm90aWNlIHNoYWxsIGJlIGluY2x1ZGVkIGluIGFsbCBjb3BpZXMgb3Ig
c3Vic3RhbnRpYWwKICBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuCgoKICBUSEUg
U09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBP
RiBBTlkgS0lORCwgRVhQUkVTUwogIE9SIElNUExJRUQsIElOQ0xVRElORyBCVVQg
Tk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YKICBNRVJDSEFOVEFCSUxJ
VFksIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZS
SU5HRU1FTlQuCiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIE9QRU4gR1JPVVAgT1Ig
U1VOIE1JQ1JPU1lTVEVNUywgSU5DLiBCRSBMSUFCTEUKICBGT1IgQU5ZIENMQUlN
LCBEQU1BR0VTIE9SIE9USEVSIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJ
T04gT0YKICBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcgRlJP
TSwgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSAogIFRIRSBTT0ZUV0FSRSBP
UiBUSEUgVVNFIE9SIE9USEVSIERFQUxJTkdTIElOIFRIRSBTT0ZUV0FSRSBFVkVO
IElGCiAgQURWSVNFRCBJTiBBRFZBTkNFIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBT
VUNIIERBTUFHRVMuCgoKICBFeGNlcHQgYXMgY29udGFpbmVkIGluIHRoaXMgbm90
aWNlLCB0aGUgbmFtZXMgb2YgVGhlIE9wZW4gR3JvdXAgYW5kL29yCiAgU3VuIE1p
Y3Jvc3lzdGVtcywgSW5jLiBzaGFsbCBub3QgYmUgdXNlZCBpbiBhZHZlcnRpc2lu
ZyBvciBvdGhlcndpc2UgdG8KICBwcm9tb3RlIHRoZSBzYWxlLCB1c2Ugb3Igb3Ro
ZXIgZGVhbGluZ3MgaW4gdGhpcyBTb2Z0d2FyZSB3aXRob3V0IHByaW9yCiAgd3Jp
dHRlbiBhdXRob3JpemF0aW9uIGZyb20gVGhlIE9wZW4gR3JvdXAgYW5kL29yIFN1
biBNaWNyb3N5c3RlbXMsCiAgSW5jLiwgYXMgYXBwbGljYWJsZS4KCgogIFggV2lu
ZG93IFN5c3RlbSBpcyBhIHRyYWRlbWFyayBvZiBUaGUgT3BlbiBHcm91cAoKICBP
U0YvMSwgT1NGL01vdGlmIGFuZCBNb3RpZiBhcmUgcmVnaXN0ZXJlZCB0cmFkZW1h
cmtzLCBhbmQgT1NGLCB0aGUgT1NGCiAgbG9nbywgTEJYLCBYIFdpbmRvdyBTeXN0
ZW0sIGFuZCBYaW5lcmFtYSBhcmUgdHJhZGVtYXJrcyBvZiB0aGUgT3BlbgogIEdy
b3VwLiBBbGwgb3RoZXIgdHJhZGVtYXJrcyBhbmQgcmVnaXN0ZXJlZCB0cmFkZW1h
cmtzIG1lbnRpb25lZCBoZXJlaW4KICBhcmUgdGhlIHByb3BlcnR5IG9mIHRoZWly
IHJlc3BlY3RpdmUgb3duZXJzLiBObyByaWdodCwgdGl0bGUgb3IKICBpbnRlcmVz
dCBpbiBvciB0byBhbnkgdHJhZGVtYXJrLCBzZXJ2aWNlIG1hcmssIGxvZ28gb3Ig
dHJhZGUgbmFtZSBvZgogIFN1biBNaWNyb3N5c3RlbXMsIEluYy4gb3IgaXRzIGxp
Y2Vuc29ycyBpcyBncmFudGVkLgoKKi8KCiNpbmNsdWRlIDxzdGRpby5oPgojaW5j
bHVkZSA8c3RyaW5nLmg+CiNpbmNsdWRlIDxzdGRsaWIuaD4KI2luY2x1ZGUgIklN
U2Vzc2lvbi5oIgojaW5jbHVkZSAiYXV4X3Byb3RvY29sLmgiCiNpbmNsdWRlICJJ
TUUuaCIKCmV4dGVybiBJbW1TZXJ2aWNlc1JlYyBkZWZhdWx0X2ltbV9zZXJ2aWNl
czsKCnN0YXRpYyBEZXNrdG9wQ29udGV4dCAqCmRlc2t0b3BfY29udGV4dF9uZXcg
KEltZU1vZHVsZVJlYyAqaW1lX21vZHVsZSkKewogIERlc2t0b3BDb250ZXh0ICpk
YzsKICBJbWVNb2R1bGVDb250ZXh0UmVjICppbWVfbW9kdWxlX2NvbnRleHQ7Cgog
IGlmICgoZGMgPSAoRGVza3RvcENvbnRleHQgKikgbWFsbG9jIChzaXplb2YgKERl
c2t0b3BDb250ZXh0KSkpID09IE5VTEwpCiAgICByZXR1cm4gTlVMTDsKCiAgbWVt
c2V0IChkYywgMCwgc2l6ZW9mIChEZXNrdG9wQ29udGV4dCkpOwoKICBkYy0+ZGVm
YXVsdF9jb252ZXJzaW9uX3N0YXR1cyA9IENPTlZFUlNJT05fT0ZGOyAvL0ZJWE1F
CiAgZGMtPmF1eHR5cGUgPSBERUZBVUxUX0FVWF9UWVBFOwoKICAvL0ZJWE1FIGhv
dyB0byBnZXQgaW1lIG1vZHVsZSBpbmZvIGZyb20gaW5mbz8KICBpZiAoKGltZV9t
b2R1bGVfY29udGV4dCA9IChJbWVNb2R1bGVDb250ZXh0UmVjICopIGNhbGxvYyAo
MSwgc2l6ZW9mIChJbWVNb2R1bGVDb250ZXh0UmVjKSkpID09IE5VTEwpCiAgICB7
CiAgICAgIGZyZWUgKGRjKTsKICAgICAgcmV0dXJuIE5VTEw7CiAgICB9CgogIGlt
ZV9tb2R1bGVfY29udGV4dC0+aW1lX21vZHVsZSAgPSBpbWVfbW9kdWxlOwoKICBk
Yy0+aW1lX21vZHVsZV9jb250ZXh0ID0gaW1lX21vZHVsZV9jb250ZXh0OwogIGRj
LT5pbWVfbW9kdWxlX2NvbnRleHQtPmVuYWJsZWQgPSBUcnVlOyAvLyBGSVhNRQoK
ICAvLyBGSVhNRSBuZWVkIHRvIGhhbmRsZSBpbWUgcHJvcGVydHkgbGlzdAoKICBy
ZXR1cm4gZGM7Cn0KCnN0YXRpYyBJbW1SZXN1bHQKZGVza3RvcF9jb250ZXh0X2Rl
c3Ryb3kgKERlc2t0b3BDb250ZXh0ICpkYykKewogIGlmICghZGMpIHJldHVybiBJ
bW1GQUlMOwoKICBpZiAoZGMtPmltZV9tb2R1bGVfY29udGV4dC0+aW1lX21vZHVs
ZSkgZnJlZSAoZGMtPmltZV9tb2R1bGVfY29udGV4dC0+aW1lX21vZHVsZSk7CiAg
aWYgKGRjLT5pbWVfbW9kdWxlX2NvbnRleHQpIGZyZWUgKGRjLT5pbWVfbW9kdWxl
X2NvbnRleHQpOwogIGlmIChkYy0+bG9jYWxlKSBmcmVlIChkYy0+bG9jYWxlKTsK
CiAgZnJlZSAoZGMpOwoKICByZXR1cm4gSW1tT0s7Cn0KCmltbF9zZXNzaW9uX3Qg
KgpkZXNrdG9wX2NvbnRleHRfZ2V0X2N1cnJlbnRfc2Vzc2lvbiAoRGVza3RvcENv
bnRleHQgKmRjKQp7CiAgcmV0dXJuIGRjID8gZGMtPmN1cnJlbnRfc2Vzc2lvbiA6
IE5VTEw7Cn0KCkltbVJlc3VsdApkZXNrdG9wX2NvbnRleHRfc2V0X2N1cnJlbnRf
c2Vzc2lvbiAoRGVza3RvcENvbnRleHQgKmRjLAoJCQkJICAgICBpbWxfc2Vzc2lv
bl90ICpzKQp7CiAgaWYgKCFkYykgcmV0dXJuIEltbUZBSUw7CgogIGRjLT5jdXJy
ZW50X3Nlc3Npb24gPSBzOwoKICByZXR1cm4gSW1tT0s7Cn0KCkltZU1vZHVsZVJl
YyAqCmRlc2t0b3BfY29udGV4dF9nZXRfZGVmYXVsdF9pbWVfbW9kdWxlIChEZXNr
dG9wQ29udGV4dCAqZGMpCnsKICByZXR1cm4gZGMgPyAoZGMtPmltZV9tb2R1bGVf
Y29udGV4dCA/IAoJICAgICAgIGRjLT5pbWVfbW9kdWxlX2NvbnRleHQtPmltZV9t
b2R1bGUgOiAwKSA6IE5VTEw7Cn0KCkNvbnZlcnNpb25TdGF0dXMKZGVza3RvcF9j
b250ZXh0X2dldF9kZWZhdWx0X2NvbnZlcnNpb25fc3RhdHVzIChEZXNrdG9wQ29u
dGV4dCAqZGMpCnsKICByZXR1cm4gZGMgPyBkYy0+ZGVmYXVsdF9jb252ZXJzaW9u
X3N0YXR1cyA6IENPTlZFUlNJT05fT0ZGOwp9CgpBVVhUWVBFCmRlc2t0b3BfY29u
dGV4dF9nZXRfYXV4dHlwZSAoRGVza3RvcENvbnRleHQgKmRjKQp7CiAgcmV0dXJu
IGRjID8gZGMtPmF1eHR5cGUgOiBERUZBVUxUX0FVWF9UWVBFOwp9CgpJbW1SZXN1
bHQKZGVza3RvcF9jb250ZXh0X3NldF9hdXh0eXBlIChEZXNrdG9wQ29udGV4dCAq
ZGMsCgkJCSAgICAgQVVYVFlQRSBhdXh0eXBlKQp7CiAgaWYgKCFkYykgcmV0dXJu
IEltbUZBSUw7CgogIGRjLT5hdXh0eXBlID0gYXV4dHlwZTsKCiAgcmV0dXJuIElt
bU9LOwp9CgpJbW1SZXN1bHQKZGVza3RvcF9jb250ZXh0X3NldF9kZWZhdWx0X2Nv
bnZlcnNpb25fc3RhdHVzIChEZXNrdG9wQ29udGV4dCAqZGMsCgkJCQkJICAgICAg
IENvbnZlcnNpb25TdGF0dXMgc3RhdHVzKQp7CiAgaWYgKCFkYykgcmV0dXJuIElt
bUZBSUw7CgogIGRjLT5kZWZhdWx0X2NvbnZlcnNpb25fc3RhdHVzID0gc3RhdHVz
OwoKICByZXR1cm4gSW1tT0s7Cn0KCkltbVJlc3VsdApkZXNrdG9wX2NvbnRleHRf
c2V0X2xvY2FsZSAoRGVza3RvcENvbnRleHQgKmRjLAoJCQkgICAgY2hhciAqbG9j
YWxlKQp7CiAgaWYgKCFkYyB8fCAhbG9jYWxlKSByZXR1cm4gSW1tRkFJTDsKCiAg
aWYgKGRjLT5sb2NhbGUpIGZyZWUgKGRjLT5sb2NhbGUpOwoKICBkYy0+bG9jYWxl
ID0gbG9jYWxlOwoKICByZXR1cm4gSW1tT0s7Cn0KCmNoYXIgKgpkZXNrdG9wX2Nv
bnRleHRfZ2V0X2xvY2FsZSAoRGVza3RvcENvbnRleHQgKmRjKQp7CiAgcmV0dXJu
IGRjID8gZGMtPmxvY2FsZSA6IE5VTEw7Cn0KCkRlc2t0b3BDb250ZXh0ICoKZGVz
a3RvcF9jcmVhdGUgKGltbF9kZXNrdG9wX3QgKmQpCnsKICBEZXNrdG9wQ29udGV4
dCAqZGMgPSBOVUxMOwogIEltbVJlc3VsdCAoKmltZV9yZWdpc3Rlcl9tZXRob2Qp
ICgpOwogIEltZUluZm9SZWMgKmltZV9pbmZvOwogIEltZU1ldGhvZHNSZWMgKmlt
ZV9tZXRob2RzOwogIEltZU1vZHVsZVJlYyAqaW1lX21vZHVsZTsKICBpbnQgYXJn
YyA9IDE7CiAgY2hhciAqYXJndiA9ICJ6aF9DTiI7Ly9GSVhNRQoKICBpbWVfcmVn
aXN0ZXJfbWV0aG9kID0gZGxzeW0gKGQtPklmLT5kbF9tb2R1bGUsICJSZWdpc3Rl
cklNRSIpOwogIC8vRklYTUUKICBpbWVfcmVnaXN0ZXJfbWV0aG9kICgmZGVmYXVs
dF9pbW1fc2VydmljZXMsICZpbWVfaW5mbywgJmltZV9tZXRob2RzLCBhcmdjLCAm
YXJndik7CiAgaWYgKGltZV9pbmZvICYmCiAgICAgIGltZV9tZXRob2RzICYmCiAg
ICAgIGltZV9tZXRob2RzLT5JbWVJbml0aWFsaXplKQogICAgaW1lX21ldGhvZHMt
PkltZUluaXRpYWxpemUgKGltZV9pbmZvKTsKCiAgaW1lX21vZHVsZSA9IChJbWVN
b2R1bGVSZWMgKikgY2FsbG9jICgxLCBzaXplb2YgKEltZU1vZHVsZVJlYykpOwog
IC8vRklYTUUKICBpbWVfbW9kdWxlLT5pbmZvID0gaW1lX2luZm87CiAgaW1lX21v
ZHVsZS0+bWV0aG9kcyA9IGltZV9tZXRob2RzOwogIGltZV9tb2R1bGUtPmluaXRp
YWxpemVkID0gVHJ1ZTsKCiAgZGMgPSBkZXNrdG9wX2NvbnRleHRfbmV3IChpbWVf
bW9kdWxlKTsKCiAgZC0+c3BlY2lmaWNfZGF0YSA9ICh2b2lkICopIGRjOwoKICBy
ZXR1cm4gZGM7Cn0KCkltbVJlc3VsdApkZXNrdG9wX2Rlc3Ryb3kgKGltbF9kZXNr
dG9wX3QgKmQpCnsKICBEZXNrdG9wQ29udGV4dCAqZGMgPSAoRGVza3RvcENvbnRl
eHQgKikgZC0+c3BlY2lmaWNfZGF0YTsKCiAgZGVza3RvcF9jb250ZXh0X2Rlc3Ry
b3kgKGRjKTsKCiAgZC0+c3BlY2lmaWNfZGF0YSA9IE5VTEw7CgogIHJldHVybiBJ
bW1PSzsKfQoKLyogTG9jYWwgVmFyaWFibGVzOiAqLwovKiBjLWZpbGUtc3R5bGU6
ICJpaWltLXByb2plY3QiICovCi8qIEVuZDogKi8KAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAElNU2Vzc2lvbi5oAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAwMTAwNjQ0ADAyNzc1MDIAMDAwMDAxMgAwMDAw
MDAxMTIyNwAxMDMxMDAyNjUzNQAwMTIyNDIAIDAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAdXN0YXIgIABmemhhbmcA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHdoZWVsAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
LyoKICBDb3B5cmlnaHQgMTk5MC0yMDAxIFN1biBNaWNyb3N5c3RlbXMsIEluYy4g
QWxsIFJpZ2h0cyBSZXNlcnZlZC4KCiAgUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3Jh
bnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGEK
ICBjb3B5IG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRh
dGlvbiBmaWxlcyAodGhlCiAgIlNvZnR3YXJlIiksIHRvIGRlYWwgaW4gdGhlIFNv
ZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZwogIHdpdGhvdXQg
bGltaXRhdGlvbiB0aGUgcmlnaHRzIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJn
ZSwgcHVibGlzaCwKICBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3Igc2Vs
bCBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8KICBwZXJtaXQgcGVyc29u
cyB0byB3aG9tIHRoZSBTb2Z0d2FyZSBpcyBmdXJuaXNoZWQgdG8gZG8gc28sIHN1
YmplY3QgdG8KICB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6IFRoZSBhYm92ZSBj
b3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzCiAgcGVybWlzc2lvbiBub3RpY2Ugc2hh
bGwgYmUgaW5jbHVkZWQgaW4gYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbAogIHBv
cnRpb25zIG9mIHRoZSBTb2Z0d2FyZS4KCgogIFRIRSBTT0ZUV0FSRSBJUyBQUk9W
SURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBS
RVNTCiAgT1IgSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBU
SEUgV0FSUkFOVElFUyBPRgogIE1FUkNIQU5UQUJJTElUWSwgRklUTkVTUyBGT1Ig
QSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4KICBJTiBO
TyBFVkVOVCBTSEFMTCBUSEUgT1BFTiBHUk9VUCBPUiBTVU4gTUlDUk9TWVNURU1T
LCBJTkMuIEJFIExJQUJMRQogIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RI
RVIgTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRgogIENPTlRSQUNU
LCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLCBPVVQgT0YgT1IgSU4g
Q09OTkVDVElPTiBXSVRICiAgVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RI
RVIgREVBTElOR1MgSU4gVEhFIFNPRlRXQVJFIEVWRU4gSUYKICBBRFZJU0VEIElO
IEFEVkFOQ0UgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFUy4KCgog
IEV4Y2VwdCBhcyBjb250YWluZWQgaW4gdGhpcyBub3RpY2UsIHRoZSBuYW1lcyBv
ZiBUaGUgT3BlbiBHcm91cCBhbmQvb3IKICBTdW4gTWljcm9zeXN0ZW1zLCBJbmMu
IHNoYWxsIG5vdCBiZSB1c2VkIGluIGFkdmVydGlzaW5nIG9yIG90aGVyd2lzZSB0
bwogIHByb21vdGUgdGhlIHNhbGUsIHVzZSBvciBvdGhlciBkZWFsaW5ncyBpbiB0
aGlzIFNvZnR3YXJlIHdpdGhvdXQgcHJpb3IKICB3cml0dGVuIGF1dGhvcml6YXRp
b24gZnJvbSBUaGUgT3BlbiBHcm91cCBhbmQvb3IgU3VuIE1pY3Jvc3lzdGVtcywK
ICBJbmMuLCBhcyBhcHBsaWNhYmxlLgoKCiAgWCBXaW5kb3cgU3lzdGVtIGlzIGEg
dHJhZGVtYXJrIG9mIFRoZSBPcGVuIEdyb3VwCgogIE9TRi8xLCBPU0YvTW90aWYg
YW5kIE1vdGlmIGFyZSByZWdpc3RlcmVkIHRyYWRlbWFya3MsIGFuZCBPU0YsIHRo
ZSBPU0YKICBsb2dvLCBMQlgsIFggV2luZG93IFN5c3RlbSwgYW5kIFhpbmVyYW1h
IGFyZSB0cmFkZW1hcmtzIG9mIHRoZSBPcGVuCiAgR3JvdXAuIEFsbCBvdGhlciB0
cmFkZW1hcmtzIGFuZCByZWdpc3RlcmVkIHRyYWRlbWFya3MgbWVudGlvbmVkIGhl
cmVpbgogIGFyZSB0aGUgcHJvcGVydHkgb2YgdGhlaXIgcmVzcGVjdGl2ZSBvd25l
cnMuIE5vIHJpZ2h0LCB0aXRsZSBvcgogIGludGVyZXN0IGluIG9yIHRvIGFueSB0
cmFkZW1hcmssIHNlcnZpY2UgbWFyaywgbG9nbyBvciB0cmFkZSBuYW1lIG9mCiAg
U3VuIE1pY3Jvc3lzdGVtcywgSW5jLiBvciBpdHMgbGljZW5zb3JzIGlzIGdyYW50
ZWQuCgoqLwoKI2lmbmRlZiBfSU1FX1NFU1NJT05fSF8KI2RlZmluZSBfSU1FX1NF
U1NJT05fSF8KCiNpbmNsdWRlICJJTUUuaCIKI2luY2x1ZGUgIlN1bklNLmgiCgp0
eXBlZGVmIHN0cnVjdCBfSW1lTW9kdWxlUmVjIHsKICBpbnQgaW5pdGlhbGl6ZWQ7
CiAgSW1lSW5mb1JlYyAqaW5mbzsKICBJbWVNZXRob2RzUmVjICptZXRob2RzOwp9
IEltZU1vZHVsZVJlYzsKCnR5cGVkZWYgSW1lTW9kdWxlUmVjICogSW1lTW9kdWxl
OwoKdHlwZWRlZiBlbnVtIHsgREVGQVVMVF9BVVhfVFlQRSwgQ09NTU9OX0FVWF9U
WVBFLCBBVVhfT0JKRUNUX1RZUEUgfSBBVVhUWVBFOwoKdHlwZWRlZiBlbnVtIHsg
Q09OVkVSU0lPTl9PTiwgQ09OVkVSU0lPTl9PRkZ9IENvbnZlcnNpb25TdGF0dXM7
Cgp0eXBlZGVmIHN0cnVjdCBfU2Vzc2lvbkNvbnRleHRSZWMgewogIGltbF9zZXNz
aW9uX3QgKnM7CgogIEltZU1vZHVsZVJlYyAqaW1lX21vZHVsZTsKICBJbWVFbmNv
ZGluZyBjbGllbnRfZW5jb2Rpbmc7CiAgQVVYVFlQRSBhdXh0eXBlOwogIENvbnZl
cnNpb25TdGF0dXMgY3Vycl9jb252ZXJzaW9uX3N0YXR1czsKCiAgLyogcmVzdG9y
ZSB3aGVuIGZvY3VzIGluL291dCAqLwogIEJvb2wgICAgICAgICAgcHJlZWRpdF9z
aG93OwogIEltZVByZWVkaXQgICAgcHJlZWRpdF9iYWNrdXA7CiAgQm9vbCAgICAg
ICAgICBjYW5kX3Nob3c7CiAgSW1lQ2FuZGlkYXRlcyBjYW5kX2JhY2t1cDsKCiAg
LyogcHJpdmF0ZSBkYXRhICovCiAgdm9pZCAqaW1lX3VzZXJfZGF0YTsKICB2b2lk
ICppbWVfZGVza3RvcF9kYXRhOwogIHZvaWQgKmltZV9zZXNzaW9uX2RhdGE7Cn0g
U2Vzc2lvbkNvbnRleHQ7CgpTZXNzaW9uQ29udGV4dCAqc2Vzc2lvbl9jcmVhdGUg
KGltbF9zZXNzaW9uX3QgKik7CkltbVJlc3VsdCBzZXNzaW9uX2Rlc3Ryb3kgKGlt
bF9zZXNzaW9uX3QgKik7CgpJbWVNb2R1bGVSZWMgKnNlc3Npb25fZ2V0X2ltZV9t
b2R1bGUgKGltbF9zZXNzaW9uX3QgKik7CkltZUVuY29kaW5nIHNlc3Npb25fZ2V0
X2NsaWVudF9lbmNvZGluZyAoaW1sX3Nlc3Npb25fdCAqKTsKSW1tUmVzdWx0IHNl
c3Npb25fc2V0X2NsaWVudF9lbmNvZGluZyAoaW1sX3Nlc3Npb25fdCAqLCBJbWVF
bmNvZGluZyk7CkNvbnZlcnNpb25TdGF0dXMgc2Vzc2lvbl9nZXRfY29udmVyc2lv
bl9zdGF0dXMgKGltbF9zZXNzaW9uX3QgKik7CkltbVJlc3VsdCBzZXNzaW9uX3Nl
dF9jb252ZXJzaW9uX3N0YXR1cyAoaW1sX3Nlc3Npb25fdCAqLCBDb252ZXJzaW9u
U3RhdHVzKTsKSW1tUmVzdWx0IHNlc3Npb25fdG9nZ2xlX2NvbnZlcnNpb25fc3Rh
dHVzIChpbWxfc2Vzc2lvbl90ICopOwpJbW1SZXN1bHQgc2Vzc2lvbl91cGRhdGVf
c3RhdHVzX3N0cmluZyAoaW1sX3Nlc3Npb25fdCAqLCBDb252ZXJzaW9uU3RhdHVz
KTsKSW1tUmVzdWx0IHNlc3Npb25fc2V0X2FzX2Rlc2t0b3BfY3VycmVudF9zZXNz
aW9uIChpbWxfc2Vzc2lvbl90ICopOwpJbW1SZXN1bHQgc2Vzc2lvbl9zZXRfZm9j
dXNfb3V0IChpbWxfc2Vzc2lvbl90ICopOwpJbW1SZXN1bHQgc2Vzc2lvbl9zZXRf
Zm9jdXNfaW4gKGltbF9zZXNzaW9uX3QgKik7CklNVGV4dCAqc2Vzc2lvbl9yZXNl
dCAoaW1sX3Nlc3Npb25fdCAqKTsKCnR5cGVkZWYgc3RydWN0IF9JbWVNb2R1bGVD
b250ZXh0UmVjIHsKICBJbWVNb2R1bGVSZWMgKmltZV9tb2R1bGU7CgogIGludCBl
bmFibGVkOwoKICBpbnQgdXNlcl9kYXRhX2xlbjsKICB2b2lkICp1c2VyX2RhdGFf
cHRyOwp9IEltZU1vZHVsZUNvbnRleHRSZWM7Cgp0eXBlZGVmIHN0cnVjdCBfRGVz
a3RvcENvbnRleHRSZWMgewogIGltbF9zZXNzaW9uX3QgKmN1cnJlbnRfc2Vzc2lv
bjsKCiAgY2hhciAqbG9jYWxlOwoKICBJbWVNb2R1bGVDb250ZXh0UmVjICppbWVf
bW9kdWxlX2NvbnRleHQ7CgogIENvbnZlcnNpb25TdGF0dXMgZGVmYXVsdF9jb252
ZXJzaW9uX3N0YXR1czsKICBBVVhUWVBFIGF1eHR5cGU7Cn0gRGVza3RvcENvbnRl
eHQ7CgppbWxfc2Vzc2lvbl90ICpkZXNrdG9wX2NvbnRleHRfZ2V0X2N1cnJlbnRf
c2Vzc2lvbiAoRGVza3RvcENvbnRleHQgKik7CkltbVJlc3VsdCBkZXNrdG9wX2Nv
bnRleHRfc2V0X2N1cnJlbnRfc2Vzc2lvbiAoRGVza3RvcENvbnRleHQgKiwgaW1s
X3Nlc3Npb25fdCAqKTsKSW1lTW9kdWxlUmVjICpkZXNrdG9wX2NvbnRleHRfZ2V0
X2RlZmF1bHRfaW1lX21vZHVsZSAoRGVza3RvcENvbnRleHQgKik7CkNvbnZlcnNp
b25TdGF0dXMgZGVza3RvcF9jb250ZXh0X2dldF9kZWZhdWx0X2NvbnZlcnNpb25f
c3RhdHVzIChEZXNrdG9wQ29udGV4dCAqKTsKQVVYVFlQRSBkZXNrdG9wX2NvbnRl
eHRfZ2V0X2F1eHR5cGUgKERlc2t0b3BDb250ZXh0ICopOwpJbW1SZXN1bHQgZGVz
a3RvcF9jb250ZXh0X3NldF9hdXh0eXBlIChEZXNrdG9wQ29udGV4dCAqLCBBVVhU
WVBFKTsKSW1tUmVzdWx0IGRlc2t0b3BfY29udGV4dF9zZXRfZGVmYXVsdF9jb252
ZXJzaW9uX3N0YXR1cyAoRGVza3RvcENvbnRleHQgKiwgQ29udmVyc2lvblN0YXR1
cyk7CkltbVJlc3VsdCBkZXNrdG9wX2NvbnRleHRfc2V0X2xvY2FsZSAoRGVza3Rv
cENvbnRleHQgKiwgY2hhciAqKTsKY2hhciAqZGVza3RvcF9jb250ZXh0X2dldF9s
b2NhbGUgKERlc2t0b3BDb250ZXh0ICopOwpEZXNrdG9wQ29udGV4dCAqZGVza3Rv
cF9jcmVhdGUgKGltbF9kZXNrdG9wX3QgKik7CkltbVJlc3VsdCBkZXNrdG9wX2Rl
c3Ryb3kgKGltbF9kZXNrdG9wX3QgKik7CgojZW5kaWYKCi8qIExvY2FsIFZhcmlh
YmxlczogKi8KLyogYy1maWxlLXN0eWxlOiAiaWlpbS1wcm9qZWN0IiAqLwovKiBF
bmQ6ICovCgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAA==

--Boundary_(ID_d74PqNkcRLuF0bcZ9w0daQ)
Content-type: text/x-patch; name=iiim-common-le.diff; charset=GB18030
Content-disposition: attachment; filename=iiim-common-le.diff
Content-Transfer-Encoding: 7BIT

Index: iiimsf/lib/iml/SunIMConf.c
===================================================================
--- iiimsf/lib/iml/SunIMConf.c	(revision 2811)
+++ iiimsf/lib/iml/SunIMConf.c	(working copy)
@@ -72,7 +72,7 @@
 int is_engine_available(char *locale, char *engine);
 #endif
 
-Private void *open_le_module(char *);
+Public void *open_le_module(char *);
 Public void close_le_module(void *);
 Private Bool get_ifinfo(const char*, iml_if_t *, void *);
 
@@ -103,7 +103,7 @@
 
 extern if_methods_t sunim_default_methods;
 
-Private void *
+Public void *
 open_le_module(
 	       char *if_path
 	       )
Index: iiimsf/lib/iml/IMUtil.c
===================================================================
--- iiimsf/lib/iml/IMUtil.c	(revision 2811)
+++ iiimsf/lib/iml/IMUtil.c	(working copy)
@@ -43,9 +43,11 @@
 #include <stdlib.h>
 #include <string.h>
 #include <sys/param.h>
+#include <iconv.h>
 
 #include "SunIM.h"
 #include "SunIMLock.h"
+#include "IME.h"
 #ifdef  sun
 #include <unistd.h>
 #endif
@@ -75,6 +77,118 @@
   return dest;
 }
 
+UTFCHAR *
+utfchar_dupl (UTFCHAR *src)
+{
+  int len;
+  UTFCHAR *dest;
+
+  if (!src) return NULL;
+
+  len = utfchar_length (src);
+  dest = (UTFCHAR *) malloc (sizeof (UTFCHAR) * (len+1));
+
+  return utfchar_copy (dest, src);
+}
+
+UTFCHAR *
+utfchar_new_with_ascii (const char *s)
+{
+  int len, i;
+  UTFCHAR *u;
+
+  if (!s) return NULL;
+
+  len = strlen (s);
+  u = (UTFCHAR *) malloc (sizeof (UTFCHAR) * (len+1));
+  if (!u) return NULL;
+
+  for (i = 0; i < len; ++i)
+    u[i] = s[i];
+
+  u[len] = 0x0;
+
+  return u;
+}
+
+static char *
+map_encoding_name (ImeEncoding encoding)
+{
+}
+
+Bool
+convert_to_utfchar (ImeEncoding encoding,
+		    const char *text,
+		    UTFCHAR **u16_text)
+{
+  char *native = "GB18030";
+  iconv_t *cd;
+  iconv_t *ucd = iconv_open ("UTF-16", "UTF-8");
+  char *inbuf;
+  int inbytesleft;
+  char *outbuf;
+  int outbytesleft;
+  char *utfstr;
+  UTFCHAR u16_buf[1024], *pu;
+  Bool ret = False;
+
+  *u16_text = NULL;
+
+#if 0
+  /* the encoding isn't recognized */
+  if ((native = map_encoding_name (encoding)) == NULL)
+    return ret;
+#endif
+
+  /* can't open the converter */
+  if ((cd = iconv_open ("UTF-8", native)) == (iconv_t) -1)
+    return ret;
+
+  if (encoding == ENCODE_UTF8)
+    utfstr = strdup (text);
+  else
+    {
+      char utf_buf[1024]; //FIXME with 1024 limitation
+
+      inbuf = (char *)text;
+      inbytesleft = strlen (text);
+      outbuf = utf_buf;
+      outbytesleft = 1024;
+
+      memset (utf_buf, 0, 1024);
+
+      /* convert from native encoding to UTF-8 */
+      if ((iconv (cd, &inbuf, &inbytesleft, &outbuf, &outbytesleft)) == (iconv_t) -1)
+	goto EndCodeConversion;
+
+      utfstr = strdup (utf_buf);
+    }
+
+  memset (u16_buf, 0, 1024 * sizeof (UTFCHAR));
+  inbuf = utfstr;
+  inbytesleft = strlen (utfstr);
+  outbuf = (char *) u16_buf;
+  outbytesleft = 1024 * sizeof (UTFCHAR *);
+
+  /* convert from UTF-8 to UTF-16 */
+  if ((iconv (ucd, &inbuf, &inbytesleft, &outbuf, &outbytesleft)) == (iconv_t) -1)
+    goto EndCodeConversion;
+
+  pu = u16_buf;
+  if (*pu == 0xFEFF) ++pu;
+
+  *u16_text = utfchar_dupl (pu);
+
+  ret = True;
+
+EndCodeConversion:
+
+  iconv_close (cd);
+  iconv_close (ucd);
+  
+  return ret;
+}
+		  
 /* Local Variables: */
 /* c-file-style: "iiim-project" */
 /* End: */
Index: iiimsf/lib/iml/ChangeLog
===================================================================
--- iiimsf/lib/iml/ChangeLog	(revision 2811)
+++ iiimsf/lib/iml/ChangeLog	(working copy)
@@ -1,3 +1,8 @@
+2005-09-08  Federic Zhang <[email protected]>
+
+	* SunIMSubr2.c (iml_lookup_draw): set whoIsMaster with IMIsMaster for
+	  IMLookupStartCallbackStruct
+
 2005-09-02  AShiZaWa KaZuNoRi  <[email protected]>
 
 	* fop.c (fop_get_function): fix memory leak
Index: iiimsf/lib/iml/IMUtil.h
===================================================================
--- iiimsf/lib/iml/IMUtil.h	(revision 2811)
+++ iiimsf/lib/iml/IMUtil.h	(working copy)
@@ -44,9 +44,13 @@
 #define _IM_UTIL_H_
 
 #include "SunIM.h"
+#include "IME.h"
 
 int utfchar_length (UTFCHAR *);
 UTFCHAR *utfchar_copy (UTFCHAR *, UTFCHAR *);
+UTFCHAR *utfchar_dupl (UTFCHAR *);
+UTFCHAR *utfchar_new_with_ascii (const char *);
+Bool *convert_to_utfchar (ImeEncoding, const char *, UTFCHAR **);
 
 #endif
 
Index: iiimsf/lib/iml/SunIMSubr2.c
===================================================================
--- iiimsf/lib/iml/SunIMSubr2.c	(revision 2811)
+++ iiimsf/lib/iml/SunIMSubr2.c	(working copy)
@@ -254,7 +254,7 @@
   iml_inst *lp;
   IMText *text;
 
-  if (len) return;
+  if (!len) return;
 
   text = iml_make_imtext (s, commit_str, NULL);
   lp = (iml_inst *) s->If->m->iml_make_commit_inst (s, text);
Index: iiimsf/lib/iml/Makefile.am
===================================================================
--- iiimsf/lib/iml/Makefile.am	(revision 2811)
+++ iiimsf/lib/iml/Makefile.am	(working copy)
@@ -1,2 +1,2 @@
-libiml_la_SOURCES = SunIM.c SunIMConf.c SunIMConf2.c SunIMMMan.c SunIMSubr.c IMLSubr.c SunIMSubr2.c IMUtil.c fop.c fop_file.c
+libiml_la_SOURCES = SunIM.c SunIMConf.c SunIMConf2.c SunIMMMan.c SunIMSubr.c IMLSubr.c SunIMSubr2.c IMService.c IMSession.c IMDesktop.c IMUtil.c IMCommon.c fop.c fop_file.c
 noinst_LTLIBRARIES = libiml.la
Index: iiimsf/src/LE.cpp
===================================================================
--- iiimsf/src/LE.cpp	(revision 2811)
+++ iiimsf/src/LE.cpp	(working copy)
@@ -95,10 +95,11 @@
     
     if (try_lename.empty()) return false;
 
-    {
-	IMLock lock(get_leif_sync_object());
-	iml_if = if_OpenIF(dirname.c_str(), try_lename.c_str(), "", False);
-    }
+    IMLock lock(get_leif_sync_object());
+    if (common_lebase)
+      iml_if = if_OpenCommonIF(dirname.c_str (),try_lename.c_str(), "", False);
+    else
+      iml_if = if_OpenIF(dirname.c_str(), try_lename.c_str(), "", False);
 
     if (!iml_if) return false;
     if (!iml_if->lename) {
@@ -184,7 +185,11 @@
     }
     IMLock lock(get_leif_sync_object());
     
-    iml_if_context = if_OpenIF(dirname.c_str(), lename.c_str(), real_locale, True);
+    if (common_lebase)
+      iml_if_context = if_OpenCommonIF(dirname.c_str(), lename.c_str(), real_locale, True);
+    else
+      iml_if_context = if_OpenIF(dirname.c_str(), lename.c_str(), real_locale, True);
+
     iml_if_context_ref_count = 1;
     return iml_if_context;
 }
@@ -366,8 +371,10 @@
 
 LEBase::LEBase(
     const string &x_dirname,
-    const string &x_filename
-) : error(false), dirname(x_dirname), filename(x_filename), sunim_default(false), need_reload(false), need_thread_lock(false)
+    const string &x_filename,
+    bool x_common_lebase
+) : error(false), dirname(x_dirname), filename(x_filename), sunim_default(false), need_reload(false), need_thread_lock(false),
+common_lebase (x_common_lebase)
 {
     iml_if = NULL;
     iml_if_context = NULL;
@@ -391,6 +398,7 @@
 	filename = "sunim_default";
 	langlist.push_back(IMLang("C", "C"));
 	sunim_default = true;
+	common_lebase = false;
     } else {
 	ERROR_INTERNAL("Invalid LEBase option");
     }
Index: iiimsf/src/LEMgr.cpp
===================================================================
--- iiimsf/src/LEMgr.cpp	(revision 2811)
+++ iiimsf/src/LEMgr.cpp	(working copy)
@@ -12,6 +12,7 @@
 {
     LEDirectoryInfo di;
     DirectoryInfoVec *pdv;
+    LEBase *pleb;
 
     if (di.refresh(lepath.c_str())) {
         pdv = di.get_directory_info();
@@ -43,7 +44,8 @@
 		  matched:;
 		}
 	    }
-    	    LEBase *pleb = new LEBase(i->dirname, i->filename);
+
+	    pleb = new LEBase(i->dirname, i->filename, False);
 	    // memory error.
 	    if (!pleb) return;
 	    if (pleb->errorp()) {
@@ -53,12 +55,34 @@
 	    lemap.insert(make_pair(i->filename, pleb));
         }
     }
+
+    /* Load input method engine under common language engine */
+    string common_lepath = lepath + string ("/common");
+    if (di.refresh (common_lepath.c_str()))
+      {
+	pdv = di.get_directory_info ();
+	DirectoryInfoVec::const_iterator i = pdv->begin ();
+
+	for (; i != pdv->end (); ++i)
+	  {
+	    pleb = new LEBase (i->dirname, i->filename, True);
+	    if (!pleb) return;
+	    if (pleb->errorp ())
+	      {
+		delete pleb;
+		continue;
+	      }
+	    lemap.insert (make_pair (i->filename, pleb));
+	  }
+      }
+
     psunim_default_lebase = new LEBase(LEBase::SUNIM_DEFAULT);
     if (!psunim_default_lebase || psunim_default_lebase->errorp()) {
 	LOG_CRITICAL("Could not create default sunim LE.  Exit.");
 	// TODO! we should use exception.
 	exit(255);
     }
+
     LEBaseMap::iterator itl;
     LEBase* ple;
     IMHotkeyManagerStruct *hkm;
@@ -93,7 +117,7 @@
     pdv = di.get_directory_info();
     for (i = pdv->begin(); i != pdv->end(); ++i) {
 	if (lemap.find(i->filename) != lemap.end()) continue;
-	LEBase *pleb = new LEBase(i->dirname, i->filename);
+	LEBase *pleb = new LEBase(i->dirname, i->filename, False);
 	if (!pleb) return;
 	if (pleb->errorp()) {
 	    delete pleb;
Index: iiimsf/src/LE.hh
===================================================================
--- iiimsf/src/LE.hh	(revision 2811)
+++ iiimsf/src/LE.hh	(working copy)
@@ -31,6 +31,7 @@
     LEDesktopDescMap le_ddmap;
 
     bool sunim_default;
+    bool common_lebase;
     if_methods_t *ifm;
     iml_if_t *iml_if;
     iml_if_t *iml_if_context;
@@ -104,11 +105,12 @@
 
     LEBase(
 	const string &dirname,
-	const string &filename
+	const string &filename,
+	bool x_common_lebase
     );
 
     enum BUILTIN_OPTION {
-	    SUNIM_DEFAULT
+        SUNIM_DEFAULT
     };
     LEBase(
 	enum BUILTIN_OPTION option
Index: include/iml/SunIMPub.h
===================================================================
--- include/iml/SunIMPub.h	(revision 2811)
+++ include/iml/SunIMPub.h	(working copy)
@@ -188,6 +188,12 @@
     iml_session_t *s,
     iml_inst **rrv
 );
+extern iml_if_t *if_OpenCommonIF(
+    const char *if_path,
+    const char *if_name,
+    const char *locale,
+    Bool  call_openif
+);
 extern iml_if_t *if_OpenIF(
     const char *if_path,
     const char *if_name,

--Boundary_(ID_d74PqNkcRLuF0bcZ9w0daQ)
Content-type: text/x-chdr; name=IME.h; charset=GB18030
Content-disposition: attachment; filename=IME.h
Content-Transfer-Encoding: quoted-printable
X-MIME-Autoconverted: from 8bit to quoted-printable by brmea-mail-4.sun.com id j8CA20XX003407

#ifndef _Ime_INFO_H_
#define _Ime_INFO_H_

// #include "imkey.h"

/** \brief The Encoding alias definition for exchange between LE and IME =
*/
typedef enum {
    ENCODE_INVALID =3D -1,
    ENCODE_GB2312 =3D 0,
    ENCODE_GBK,
    ENCODE_GB18030,
    ENCODE_BIG5,
    ENCODE_BIG5HKSCS,
    ENCODE_EUCTW,
    ENCODE_EUCKR,
    ENCODE_EUCJP,
    ENCODE_EUCTH,
    ENCODE_UTF8,
    ENCODE_UTF16,
    ENCODE_UTF16BE,
    ENCODE_UTF16LE,
    ENCODE_UTF32,
    ENCODE_UCS4,
    ENCODE_UCS4LE,
    ENCODE_UCS4BE,
    ENCODES_NUM,
} ImeEncoding;

typedef struct {
    int keycode;        ///< virtual key code for the key just be pressed=
, please IME_VK_xxx
    int keychar;        ///< corresponding ASCII char value if the key pr=
ess is an ASCII value. Valid for \n and [0x20-0x7E]
    int modifier;       ///< status for modify key and mouse buttons, ref=
erence IME_XXX_MASK definition
    int time_stamp;     ///< incremental integers (per client), time_stam=
p when the key press happened.
} ImeKeyRec;

typedef ImeKeyRec* ImeKey;  ///< Pointer type to ImeKeyRec

typedef unsigned int   ImHandle;

typedef ImHandle    ImeInputContext;

typedef enum {
    ImeFeedbackDecoration =3D 0,  ///< common decoration, such as highlig=
ht, underline, etc
    ImeFeedbackForegroundRGB,   ///< decoration with foreground color
    ImeFeedbackBackgroundRGB    ///< decoration with background color
} ImeFeedbackType;

typedef enum {
    IME_SCOPE_SESSION =3D 0,
    IME_SCOPE_DESKTOP,
    IME_SCOPE_USER
} ImeScopeType;

/** \brief decoration/feedback for sub-string
*
* A feedback would specify decoration of all characters in a specific ran=
ge of an string.
*/
typedef struct {
    ImeFeedbackType type;       ///< type of the decoration
    int             value;      ///< depending on type, value could be st=
yle, color
    int             start;      ///< starting position of the sub-string,=
 (count start from 0)
    int             length;     ///< number of characters in the sub-stri=
ng
} ImeFeedbackRec;

typedef ImeFeedbackRec* ImeFeedback;    ///< pointer type to ImeFeedbackR=
ec

/** \brief possible values for ImeFeedbackRec::value when ImeFeedbackRec:=
:type is ImeFeedbackDecoration */
typedef enum {
    IME_DECORATION_NORMAL       =3D 0,                                ///=
< No specitial decoration
    IME_DECORATION_REVERSE      =3D 1,                                ///=
< reverse
    IME_DECORATION_HIGHLIGHT    =3D (IME_DECORATION_REVERSE << 1),    ///=
< highligh
    IME_DECORATION_UNDERLINE    =3D (IME_DECORATION_HIGHLIGHT << 1),  ///=
< under_line
    IME_DECORATION_UNDERWAVE    =3D (IME_DECORATION_UNDERLINE << 1)   ///=
< under_line wave
} ImeDecorationStyle;

// values for type =3D ImeFeedbackForegroundRGB || ImeFeedbackBackgroundR=
GB
#define IME_RGB_COLOR(red, green, blue)     ((int)((red<<16) + (green<<8)=
 + blue))
#define IME_RGB_COLOR_RED(color)            ((int)(color>>16))
#define IME_RGB_COLOR_GREEN(color)          ((int)((color>>8)&0x00ff))
#define IME_RGB_COLOR_BLUE(color)           ((int)(color&0x0000ff))

/** \brief Text with decorations
*
* A string could have multiple feedback to give it presentation. When IME=
 sends these
* Decoration, it should make sure there is no conflicts among them. Other=
wise, the
* exact decoration result is not defined. Please note that the sub-string=
s in
* different feedback could be overlaped as long as they do not conflicts =
with
* each other.
*/
typedef struct {
    unsigned char  *text;           ///< pointer to the text buffer
    unsigned int    count_feedbacks;///< number of feedbacks
    ImeFeedbackRec *feedbacks;      ///< feedback array
} ImeTextRec;

typedef ImeTextRec* ImeText;            ///< Pointer type to ImeTextRec

/** \brief Preedit data with decoration and caret position */
typedef struct {
    int             caret;        ///< the caret lays just before which c=
haracter
    ImeTextRec      preedit;      ///< the decorated text
    int             cand_list_start;     ///< the candidate list starting=
 position, to locate the candidate list window position
} ImePreeditRec;

typedef ImePreeditRec* ImePreedit;      ///< Pointer type to ImePreeditRe=
c

/** \brief bit mask to indicate whether or not current page is first page=
 or last page. Used as value for ImeCandidatsRec::page_state */
typedef enum {
    ImeCandidatesFirstPage    =3D 1,            ///< is first page
    ImeCandidatesLastPage     =3D 2             ///< is last page
} ImeCandidatePageMask;

typedef struct {
    unsigned char  *title;          ///< title for the candidates, whethe=
r or not Aux support candidate area title is implementation depenedent.
    int             count;          ///< How many candidates here
    ImeText         candidates;     ///< Pointer array, 'count' items in =
the array.
    unsigned char  *numbers;        ///< numbering
    int             focus;          ///< current focused candidate, [0..c=
ount], 0 means no focused candidate
    int	            page_state;     ///< first/last page information, saf=
e to set it to 0 for those IME do not know how many pages and current pag=
e.
    int             horizontal;     ///< 1 to use horizental layout, 0 to=
 use vertical layout, to make it compatible default vertical (0)
} ImeCandidatesRec;

typedef ImeCandidatesRec* ImeCandidates;  ///< Pointer type to ImeCandida=
tesRec

/*! \addtogroup Basic_Types */
/** \brief Propertyies type.
*
* Property could be used to construct GUI for user to specify their value=
s.
*
* @note, Properties used only for configuration user preference, do not t=
hink
* about using this could help other things greatly.
*/
typedef enum {
    ImeProperty_String,     ///< String type, have length limits
    ImeProperty_Int,        ///< Integer type, have value limits
    ImeProperty_Float,      ///< float type, have value limits
    ImeProperty_Toggle,     ///< boolean, or [0,1] int value, value is in=
t value, do not care range
    ImeProperty_Selection,  ///< select one from multiple strings. Range =
is char **, value is the selection idx.
} ImePropertyType;

/** \brief limits for the string length. (0, 0) means no limitation */
typedef struct {
    unsigned int min_length;    ///< minimum length
    unsigned int max_length;    ///< maximum length
} ImeStringPropertyRangeRec;

/** \brief limits for integer values. (0, 0) means no limitation */
typedef struct {
    int min;    ///< min value
    int max;    ///< max value
} ImeIntPropertyRange;

/** \brief  limits for float values, (0, 0) means no limits */
typedef struct {
    float min;  ///< min value
    float max;  ///< max value
} ImeFloatPropertyRangeRec;

/** \brief simple union for serveral range types */
typedef union {
    ImeIntPropertyRange	       int_range;         ///< integer value rang=
e
    ImeStringPropertyRangeRec  len_range;         ///< string len range
    ImeFloatPropertyRangeRec   float_range;       ///< float range
    char **                    multiString_range; ///< MultiString to sel=
ect, the last string must be NULL
} ImePropertyRangeRec;

/** \brief union type for property values */
typedef union {
    int		int_value;      ///< int value
    float	float_value;    ///< float value
    char*	string_value;   ///< string value
} ImePropertyValueRec;

/** \brief standard property for configuration */
typedef struct  {
    int   		id;      ///< ??? maybe not needed???
    ImeEncoding		encode;  ///< encode for the following strings
    const char *	key;     ///< Path string looks like unix file path, for=
 uniquely identify a property
    const char *	name;    ///< for display usage
    const char *	tip;     ///< simple description
    ImePropertyType 	type;    ///< type of the property
    ImePropertyRangeRec	range;   ///< range of the property
    ImePropertyValueRec	value;   ///< current value of the property
} ImePropertyRec;

typedef ImePropertyRec* ImeProperty; ///< Pointer type to ImePropertyRec

/** \brief Infact a property array with count information
*
* @note Please look at  ImeMethodsRec::ImmConfigIme()
*/
typedef struct {
    int           count;         ///< number of properties
    ImeProperty   properties;    ///< pointer to properties array
} ImePropertyListRec;

typedef ImePropertyListRec* ImePropertyList; ///< Pointer type to ImeProp=
ertyListRec
/**@}*/

typedef struct {
    int              version;            ///< IME's version. version%100 =
is minor version, version/100 is major version
    int              mt_safe;            ///< whether or not this IME is =
MultiThread safe.
    ImeEncoding      encoding;           ///< encoding used by all string=
s communicating with IMM, like preedit
    const char      *uuid;               ///< IME's English name.
    const char      *name;               ///< localized input method name=
, also in above encoding
    const char      *author;             ///< IME's author
    const char      *hinting;            ///< Simple descrition for the I=
ME. Maybe displayed as StatusBar's button hinting.
    const char      *copyright;          ///< Copyright string
    const char      *icon_file;          ///< If relative path, to the di=
r of IME's so file. File format: XPM
    const char      *support_locales;    ///< locale the IME supports, st=
ring with different locales seperated by ',' .
    ImePropertyList  pl;                 ///< property list used to do st=
andard configuration. could be NULL.
    void            *specific_data;      ///< IME's specific data. used f=
or single so get into serveral IMEs.
} ImeInfoRec;

typedef ImeInfoRec  *ImeInfo;       ////< pointer type to ImeInfoRec

/*! \addtogroup Events Events between IME and Aux */
/*@{*/

/** \brief standard event/message type definition */
typedef enum {
    IME_EVENT_CUSTOM_DATA  =3D 0,    ///< custom defined user type event/=
data
    IME_EVENT_IMM_NOTIFY,          ///< Notification event from the statu=
s bar, Full/half punc, Configure Request, etc
    IME_EVENT_QUIT,                ///< UI quit event.
    IME_EVENT_EXPOSE,              ///< Show/Hide/Check status change eve=
nt
    IME_EVENT_MOVE,                ///< Aux window move event
    IME_EVENT_PREEDIT_DATA,        ///< Preedit area data event
    IME_EVENT_PREEDIT_CARET_MOVE,  ///< Preedit area caret position event
    IME_EVENT_CANDI_DATA,          ///< Candidate area data event
    IME_EVENT_PROPERTY,            ///< Porperty message
    IME_EVENT_CANDI_PAGE,          ///< Candidate area page event
    IME_EVENT_CANDI_FOCUS,         ///< Candidate area focus event
    IME_EVENT_CANDI_SELECT,        ///< Candidate area selection event
    IME_EVENT_NONE
} ImeAuxEventType;

/** \brief Standard event head, also used for common event */
typedef struct {
    int		    type;           ///< could be values defined in ImeAuxEventT=
ype
    ImHandle	    peer;           ///< to IME it's an Auxilary window hand=
le, to Aux, it is an IME handle
    ImeInputContext ic;             ///< the ic the communication is base=
d on
    int		    param;          ///< semantic determined by type
} ImeEventHeadRec;

typedef ImeEventHeadRec* ImeEventHead;  ///< Pointer type to  ImeEventHea=
dRec

typedef enum {
    IMM_TRIGGER_FULL_HALF_SIMBOL =3D 0,   ///< Full/half simbol status,  =
0 =3D=3D half, 1 =3D=3D full
    IMM_TRIGGER_FULL_HALF_PUNC,         ///< Full/half punction status, 0=
 =3D=3D half, 1 =3D=3D full
    IMM_TRIGGER_LANGUAGE,               ///< Cn/En status, 0 =3D=3D en, 1=
 =3D=3D zh_CN
    IMM_TRIGGER_CONFIG_REQUEST          ///< Comes a configuration reques=
t from status bar
} ImmTriggerType;

/** \brief Standard notification from status bar, including full/half pun=
c status, confige request, etc
*
* @note, if IME do not process this messages, please return IME_UNPROCESS=
ED_EVENT=A1=A3
*        This is important if you want to use default configuration UI by=
 just providing
*        property list.
*/
typedef struct {
    int		    type;           ///< could be values defined in ImeAuxEventT=
ype
    ImHandle	    peer;           ///< to IME it's an Auxilary window hand=
le, to Aux, it is an IME handle
    ImeInputContext ic;             ///< the ic the communication is base=
d on
    ImmTriggerType  trigger;        ///< id represented different notific=
ation, see
    int             value;          ///< value of above trigger
} ImeEventImmNotifyRec;

typedef ImeEventImmNotifyRec* ImeEventImmNotify;

/** \brief Quit event, same as ImeEventHeadRec. type must be IME_EVENT_QU=
IT, param is the exit code from the Aux
*
*    UI notify IMM/IME that it will quit (send from UI to IME), or IME/IM=
M force UI quit (send from IME to UI)
*/
typedef ImeEventHeadRec     ImeQuitEventRec;
typedef ImeQuitEventRec*    ImeQuitEvent;    ///< Pointer type to ImeQuit=
EventRec

/** \brief Status definition for GUI status about show/hide, bit masks */
typedef enum {
    IMUI_STATE_SHOW         =3D 1,                        ///< whether GU=
I is show/hide
    IMUI_STATE_ENABLE       =3D (IMUI_STATE_SHOW <<1),    ///< whether th=
e GUI element is enabled/disabled.
    IMUI_STATE_CHECK        =3D (IMUI_STATE_ENABLE<<1)    ///< whether or=
 not the GUI element is checked (such as menu item)
} ImeUIStatusMask;

/** \brief page operations */
typedef enum {
    ImeCandidatesPageFirst,        ///< to first page
    ImeCandidatesPagePrevious,     ///< to previous page
    ImeCandidatesPageNext,         ///< to next page
    ImeCandidatesPageLast          ///< to last page
} ImePageOperation;

/** \brief Expose event, same as ImeEventHeadRec. type must be IME_EVENT_=
EXPOSE, param is from ImeUIStatusMask
*
* UI notify IMM/IME that its show/hide status changed, or IME/IMM command=
 UI changeits show/hide status
*
* @note ImmServicesRec::ImmShowPreedit() and ImmServicesRec::ImmHidePreed=
it() are implemented by sending this
* event to preedit. So about the ImmServicesRec::ImmShowCandidates() and =
ImmServicesRec::ImmHideCandidates().
* So, Your owner-draw Preedit/Candidates area should response to these ev=
ent.
* @note param should be combination of the ImeUIStatusMask
*/
typedef ImeEventHeadRec     ImeExposeEventRec;
typedef ImeExposeEventRec*  ImeExposeEvent;     ///< Pointer type to ImeE=
xposeEventRec

typedef ImeEventHeadRec     ImeCandidateSelectEventRec;
typedef ImeEventHeadRec     ImeCandidatePageEventRec;

#define IME_MOVE_FREELY     (-65535)            ///< When used in ImeMove=
EventRec, means UI determines the position/size

/** \brief Move Event type must be IME_EVENT_MOVE, param is not used.
*
* notify IMM/IME that its position/size changed, or IME/MM command UI cha=
nge its position/size
*
* @note As Expose Event, ImmServicesRec::ImmShowPreedit() and ImmServices=
Rec::ImmHidePreedit() are implemented by sending this
* event to preedit. So about the ImmServicesRec::ImmShowCandidates() and =
ImmServicesRec::ImmHideCandidates().
* So, Your owner-draw Preedit/Candidates area should response to these ev=
ent.
*/
typedef struct {
    int		    type;    ///< Must be IME_EVENT_MOVE
    ImHandle	    peer;    ///< to IME it's an Auxilary window handle, to =
Aux, it is an IME handle
    ImeInputContext ic;      ///< the ic the communication is based on
    int		    param;   ///< not used
    int		    left;    ///< window's left position in pixel, could be IME_=
MOVE_FREELY
    int             top;     ///< window's top position, in pixel, could =
be IME_MOVE_FREELY
    int             width;   ///< window's width, in pixel, could be IME_=
MOVE_FREELY
    int             height;  ///< window's height, in pixel, could be  IM=
E_MOVE_FREELY
} ImeMoveEventRec;

typedef ImeMoveEventRec*    ImeMoveEvent;   ///< Pointer type to ImeMoveE=
ventRec

/** \brief Preedit data event
*
* IME/IMM command Preedit-UI to change the preedit data
*
* @note owner-draw Preedit/Candidates area should response to these event=
,
* also they have to remember the ic handel and im handle to send back oth=
er request, such
* as page next request from the user.
*/
typedef struct {
    int		    type;    ///< IME_EVENT_PREEDIT_DATA
    ImHandle	    peer;    ///< to IME it's an Auxilary window handle, to =
Aux, it is an IME handle
    ImeInputContext ic;      ///< the ic the communication is based on
    int		    param;   ///< not used
    ImePreedit*     preedit; ///< data used to update the preedit-area
} ImePreeditDataEventRec;

typedef ImePreeditDataEventRec* ImePreeditDataEvent;    ///< Pointer type=
 to ImePreeditDataEventRec

/** \brief Preedit caret move event, same as ImeEventHeadRec. type must b=
e IME_EVENT_PREEDIT_CARET_MOVE, param is caret position
*
* Preedit-UI notify IME/IMM that caret position changed, or IME/IMM comma=
nd Preedit-UI change its caret position
*/
typedef ImeEventHeadRec              ImePreeditCaretMoveEventRec;
typedef ImePreeditCaretMoveEventRec* ImePreeditCaretMoveEvent;   ///< Poi=
nter type to ImePreeditCaretMoveEventRec

/** \brief Candidates data event
*
* IME/IMM command candidates-UI to update candidates-data
*/
typedef struct  {
    int		    type;       ///< IME_EVENT_CANDI_DATA
    ImHandle	    peer;       ///< to IME it's an Auxilary window handle, =
to Aux, it is an IME handle
    ImeInputContext ic;         ///< the ic the communication is based on
    int		    param;      ///< encoding id
    ImeCandidates   candidates; ///< new candidates to update the candida=
tes area
} ImeCandidateDataEventRec;

typedef ImeCandidateDataEventRec* ImeCandidateDataEvent;    ///< Pointer =
type to ImeCandidateDataEventRec

/** \brief event for propertis. Normally it is used inside IMM, but IME c=
ould also utilized this if possible. */
typedef struct {
    int		        type;    ///< IME_EVENT_PROPERTY
    ImHandle	        peer;    ///< to IME it's an Auxilary window handle,=
 to Aux, it is an IME handle
    ImeInputContext     ic;      ///< the ic the communication is based o=
n
    int		        param;   ///< encoding id
} ImePropertyEventRec;

typedef ImePropertyEventRec*    ImePropertyEvent;

/** \brief common user customized event/message
*
*  For user defined protocals, param could be used as user defined protoc=
al number.
*/
typedef struct  {
    int		        type;    ///< IME_EVENT_CUSTOM_DATA
    ImHandle	        peer;    ///< to IME, it's an Auxilary window handle=
, to Aux, it is an IC handle
    ImeInputContext     ic;      ///< an handle of IME, only used by Auxi=
lary window, IME would not care about this
    int		        param;   ///< Could be used as user defined protocal num=
ber
    int		        nInteger;///< how many integers to be transfer, any LE/B=
E related data should be transfer here
    int*	        integers;///< integer array
    int		        nBuf;    ///< how many byte buffer to be transfered
    int*	        buf_lens;///< buf len array for those buffers. If you ar=
e transfering string, please count the ending '\0'
    unsigned char**     bufs;    ///< buffer pointer's array
} ImeDataEventRec;

typedef ImeDataEventRec* ImeDataEvent;  ///< Pointer type to ImeDataEvent=
Rec

typedef union {
    int 		        type;                     ///< event type
    ImeEventHeadRec	        any_event;                ///< event head
    ImeQuitEventRec	        quit_event;               ///< Quit Event
    ImeCandidateSelectEventRec  candidate_select_event;   ///< candidate =
selection
    ImeCandidatePageEventRec    candidate_page_event;     ///< candidate =
page
    ImeMoveEventRec		move_event;               ///< Move Event
    ImeExposeEventRec	        expose_event;             ///< Expose Event
    ImeEventImmNotifyRec        notify_event;             ///< notificati=
on event from IMM
    ImePreeditDataEventRec	preedit_data_event;       ///< Preedit data ev=
ent
    ImePreeditCaretMoveEventRec	preedit_caret_move_event; ///< Preedit ca=
ret moe event
    ImeCandidateDataEventRec	candidate_data_event;     ///< candidates da=
ta event
    ImeDataEventRec 		data_event;               ///< customized event
    ImePropertyEventRec         property_event;           ///< property_v=
alue for current ic user
} ImeEventRec;

typedef ImeEventRec*            ImeEvent;       ///<  Pointer type to Ime=
EventRec
/*@}*/

/** \brief Type of beeps */
typedef enum {
    ImeBeepWarning, ///< beep for warning
    ImeBeepError    ///< beep for an error
} ImeBeepType;

/** \brief some key value definition returned by ImmPrefilterKey */
typedef enum {
    IME_FILTERED_KEY_UNUSED =3D 0,
    IME_FILTERED_KEY_ESCAPE,
    IME_FILTERED_KEY_ENTER,
    IME_FILTERED_KEY_SPACEBAR,
    IME_FILTERED_KEY_PAGEUP,
    IME_FILTERED_KEY_PAGEDOWN,
    IME_FILTERED_KEY_INSERT,
    IME_FILTERED_KEY_DELETE,
    IME_FILTERED_KEY_BACKSPACE,
    IME_FILTERED_KEY_HOME,
    IME_FILTERED_KEY_END,
    IME_FILTERED_KEY_LEFT,
    IME_FILTERED_KEY_RIGHT,
    IME_FILTERED_KEY_UP,
    IME_FILTERED_KEY_DOWN,
} ImeKeyType;

typedef enum {
    ImmFAIL =3D 0,                     ///< general fail
    ImmOK                            ///< Success
} ImmResult;

typedef struct {
    int        version;     ///< API version of the IMM services. version=
%100 is minor version. version/100 is major version.

    ImeInfo    (*ImmGetImeInfo)(ImeInputContext ic);

    ImeEncoding(*ImmGetSessionEncoding)(ImeInputContext ic);


    ImmResult  (*ImmShowPreedit)(ImeInputContext ic);

    ImmResult  (*ImmHidePreedit)(ImeInputContext ic);

    ImmResult  (*ImmUpdatePreedit)(ImeInputContext ic, ImePreedit preedit=
_data);

    ImmResult  (*ImmMovePreeditCaret)(ImeInputContext ic, int idx);

    ImmResult  (*ImmShowCandidates)(ImeInputContext ic);

    ImmResult  (*ImmHideCandidates)(ImeInputContext ic);

    ImmResult  (*ImmUpdateCandidates)(ImeInputContext ic, ImeCandidates c=
andi);

    ImmResult  (*ImmCommit)(ImeInputContext ic, unsigned char* commit_tex=
t);


    ImHandle   (*ImmStartUI)(ImeInputContext ic, const char* aux_name);

    ImmResult  (*ImmCloseUI)(ImeInputContext ic, ImHandle aux_handle);

    ImmResult  (*ImmSendUiMessage)(ImeEvent event);


    void*      (*ImmGetData)(ImeInputContext ic, int scope); // "scope" p=
lease ref ImeScopeType

    ImmResult  (*ImmSetData)(ImeInputContext ic, int scope, void* pdata);


    void*      (*ImmLoadUserProfile)(ImeInputContext ic, const char* cate=
gory, int* psz);

    ImmResult  (*ImmFreeUserProfile)(void* buf);

    ImmResult  (*ImmSaveUserProfile)(ImeInputContext ic, const char* cate=
gory, void* buf, int sz);


    ImmResult  (*ImmBeep)(ImeInputContext ic, ImeBeepType ime_beep_type);

    ImeKeyType (*ImmPrefilterKey)(ImeKey key);

    ImePropertyListRec* (*ImmGetPropertyList)(ImeInputContext ic);

} ImmServicesRec;

typedef ImmServicesRec*     ImmServices;            ///< Pointer type to =
ImmServicesRec


typedef enum {
    IME_OK                  =3D 0,        ///< success
    IME_FAIL,                           ///< general error
    IME_UNUSED_KEY,                     ///< return by ImeProcessKeyEvent=
()
    IME_INVALID_KEY,                    ///< unexpected key, should not r=
eturn to application, normally ring a bell
    IME_UNPROCESSED_EVENT,              ///< a event is not cared by the =
ime, IMM may continue processing, like some StatusEvent
    IME_UNSUPPORT_VERSION,              ///< error version
    IME_WRONG_ARGS,                     ///< error in args
    IME_FIRST_CUSTOM_ERROR   =3D 1000     ///< user could define his own =
error using error larger than this.
} ImeResult;

typedef struct {
    int        version;                 ///< API verion. version%100 as m=
inor version. version/100 is major version.

    ImeResult  (*ImeInitialize)(ImeInfo ime_info);
    ImeResult  (*ImeDestroy)(ImeInfo ime_info);

    ImeResult  (*ImeProcessKeyEvent)(ImeInputContext ic, ImeKey ime_key);
    ImeResult  (*ImeProcessUIEvent)(ImeInputContext ic, ImeEvent event);

    ImeResult  (*ImeCreateSession)(ImeInputContext ic);

    ImeResult  (*ImeDestroySession)(ImeInputContext ic);

    ImeResult  (*ImeFocusIn)(ImeInputContext ic);

    ImeResult  (*ImeFocusOut)(ImeInputContext ic);

    ImeResult  (*ImeAttachUser)(ImeInputContext ic);

    ImeResult  (*ImeDetachUser)(ImeInputContext ic);

    ImeResult  (*ImeAttachDesktop)(ImeInputContext ic);

    ImeResult  (*ImeDetachDesktop)(ImeInputContext ic);

    const char*(*ImeGetErrorMessage)(int error_id);

} ImeMethodsRec;

typedef ImeMethodsRec*  ImeMethods;     ///< Pointer to ImeMethodsRec

#if defined(__CPLUSPLUS__) || defined(__cplusplus)
extern "C"
#endif
ImeResult RegisterIME(ImmServices srvs, ImeInfo* ppinfo, ImeMethods* pmth=
ds, int argc, char **argv);


typedef struct {
    int        version;
    ImmResult  (*ImmSendImeMessage)(ImeEvent event);
    ImmResult  (*ImmCommit)(unsigned char* commit_text, ImeEncoding enc);
} ImmServicesUiRec;

typedef ImmServicesUiRec* ImmServicesUi;

typedef struct {
    int        version;
    ImeResult  (*ImUiInitialize)(ImmServicesUi pservices);
    ImeResult  (*ImUiDestroy)();
    ImeResult  (*ImUiProcessEvent)(ImeEvent event);
} ImUiMethodsRec;

typedef ImUiMethodsRec*  ImUiMethods;

#endif /* _Ime_INFO_H_ */

--Boundary_(ID_d74PqNkcRLuF0bcZ9w0daQ)--