Skip site navigation (1)Skip section navigation (2)
Date:      Wed, 11 Jul 2007 10:09:32 +0000
From:      Pawel Wieczorek <wieczyk@trzask.int.pl>
To:        freebsd-arch@freebsd.org
Subject:   new friend of sys/queue.h and sys/tree.h 
Message-ID:  <4694AC5C.9040107@trzask.int.pl>
In-Reply-To: <20070710.205751.-1962670861.imp@bsdimp.com>
References:  <20070708081511.GX1221@funkthat.com>	<200707101833.l6AIX0xl049962@ambrisko.com> <20070710.205751.-1962670861.imp@bsdimp.com>

next in thread | previous in thread | raw e-mail | index | archive | help
This is a multi-part message in MIME format.
--------------020003070002010103050303
Content-Type: text/plain; charset=ISO-8859-1; format=flowed
Content-Transfer-Encoding: 7bit

Hi,

I did something like sys/queue.h and sys/tree.h: sys/bds.h

bds - Basic Data Structures.

Hash table are basic data structure, it is good to have it in kernel, 
but i did not see some easy to use framework like sys/queue.h in our kernel.

At current time it have only hash table and multi-value hash table,
but i want to add in near future something else.

I did not done full documentation how to use it(yet),
but i did two examples. One is how to use it user-space
and one how to use it in kernel-space.

I tested code on "cc" on OpenSolaris (because cc on sunos is more 
pedantic) and "cc" "c++" "c89" "c99" on FreeBSD 6.2-RELEASE.


I develop sys/bds.h for my private usage, but i think it can be used in 
freebsd kernel programming, because is safe, easy to use and similar to 
sys/queue.h.

I am waiting for comments...


--------------020003070002010103050303
Content-Type: application/octet-stream;
 name="bdsm.tar"
Content-Transfer-Encoding: base64
Content-Disposition: attachment;
 filename="bdsm.tar"

YmRzbQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADAwMDc1NSAA
MDAxNzUxIAAwMDE3NTAgADAwMDAwMDAwMDAwIDEwNjQ1MTI0Mjc2IDAxMjU3NwAgNQAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB1c3RhcgAwMHdpZWN6
eWsAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAa29udGEAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAwMDAwMDAgADAwMDAwMCAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABiZHNtL01ha2VmaWxlAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAMDAwNzU1IAAwMDE3NTEgADAwMTc1MCAAMDAwMDAwMDAxNzIg
MTA2NDUxMjM3NDMgMDE0MzE3ACAwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAHVzdGFyADAwd2llY3p5awAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABr
b250YQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADAwMDAwMCAAMDAwMDAwIAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFNV
QkRJUj1leGFtcGxlMCBleGFtcGxlMQoKbG9hZDoKCWNkIGV4YW1wbGUxL2RldjsgbWFrZSBs
b2FkCgoKY29weToKCWNwIGV4YW1wbGUxL3V0aWwvYmRzY3RsIC4KCgoKLmluY2x1ZGU8YnNk
LnN1YmRpci5taz4KAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAYmRzbS9tYW4AAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAADAwMDc1NSAAMDAxNzUxIAAwMDE3NTAgADAwMDAwMDAwMDAwIDEw
NjQ0MTc3NzQyIDAxMzM1NwAgNQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAB1c3RhcgAwMHdpZWN6eWsAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAa29u
dGEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAwMDAwMDAgADAwMDAwMCAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABiZHNt
L3N5cwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDAwNzU1IAAwMDE3
NTEgADAwMTc1MCAAMDAwMDAwMDAwMDAgMTA2NDUxMjQ3MzMgMDEzNDEzACA1AAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHVzdGFyADAwd2llY3p5awAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAABrb250YQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
ADAwMDAwMCAAMDAwMDAwIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAGJkc20vZXhhbXBsZTAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAwMDA3NTUgADAwMTc1MSAAMDAxNzUwIAAwMDAwMDAwMDAwMCAxMDY0
NTEyNDM0NCAwMTQzMDYAIDUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAdXN0YXIAMDB3aWVjenlrAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAGtvbnRh
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDAwMDAwIAAwMDAwMDAgAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAYmRzbS9l
eGFtcGxlMQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADAwMDc1NSAAMDAxNzUx
IAAwMDE3NTAgADAwMDAwMDAwMDAwIDEwNjQ1MDIyNTA3IDAxNDMwNQAgNQAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB1c3RhcgAwMHdpZWN6eWsAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAa29udGEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAw
MDAwMDAgADAwMDAwMCAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAABiZHNtL1JFQURNRQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAMDAwNjQ0IAAwMDAwMDAgADAwMTc1MCAAMDAwMDAwMDEyMTMgMTA2NDUx
MjQxNzYgMDEzMDEyACAwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAHVzdGFyADAwcm9vdAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABrb250YQAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADAwMDAwMCAAMDAwMDAwIAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEV4YW1wbGUg
dXNhZ2Ugb2Ygc3lzL2Jkcy5oCj09PT09PT09PT09PT09PT09PT09PT09PT09CgpUbyBjb21w
aWxlIHR5cGU6CiMgbWFrZQoKCmV4YW1wbGUwLwkJU21hbGwgcHJvZ3JhbW0gd2hpY2ggYWxs
b3cgdGVzdAoJCQlvbmUgc3RydWN0dXJlIHVzZWQgYnkgTUFQIGFuZCBNTUFQLgoJCQlBZnRl
ciBjb21waWxhdGlvbiB5b3UgY2FuIGV4ZWN1dGUKCQkJZXhhbXBsZTAvZXhhbXBsZTAgYmlu
YXJ5LgoKCmV4YW1wbGUxCQlTbWFsbCBrZXJuZWwgbW9kdWxlIGFuZCB1dGlsaXR5IHByb2dy
YW1tCgkJCXdoaWNoIGFsbG93IHRlc3QgTUFQIG9uIGtlcm5lbCBzaWRlLgoJCQlBZnRlciBj
b21waWxhdGlvbiB5b3Ugc2hvdWxkIHR5cGUgCgkJCSMgbWFrZSBsb2FkIGNvcHkKCQkJdG8g
bG9hZCBtb2R1bGUgaW50byBrZXJuZWwgYW5kIGNvcHkgYmRzY3RsCgkJCXV0aWxpdHkgdG8g
eW91ciBjdXJyZW50IGRpcmVjb3RyeS4KCQkJUnVuIHV0aWxpdHkKCQkJIyAuL2Jkc2N0bAoJ
CQkuLi5hbmQgaGF2ZSBmdW4uCgkJCVdBUk5JTkc6IEJlY2F1c2Uga2VybmVsIG1vZHVsZSBp
cyB1c2luZwoJCQkJIHByaW50Zig5KSByb3V0aW5lLCBwbGVhc2UKCQkJCSBiZSBvbiBmaXJz
dCB0ZXJtaW5hbCBvbiBjb25zb2xlCgkJCQkgb3Igd2F0Y2ggZG1lc2cuCgoJCQkKCgAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABiZHNtL2V4YW1w
bGUxL2RldgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDAwNzU1IAAwMDE3NTEgADAw
MTc1MCAAMDAwMDAwMDAwMDAgMTA2NDUxMjQzNzEgMDE1MDY1ACA1AAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHVzdGFyADAwd2llY3p5awAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAABrb250YQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADAwMDAw
MCAAMDAwMDAwIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAGJkc20vZXhhbXBsZTEvTWFrZWZpbGUAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAwMDA3NTUgADAwMTc1MSAAMDAxNzUwIAAwMDAwMDAwMDA1MSAxMDY0NTAzMDcy
NSAwMTYwMjQAIDAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAdXN0YXIAMDB3aWVjenlrAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAGtvbnRhAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAMDAwMDAwIAAwMDAwMDAgAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAU1VCRElSPWRldiB1
dGlsCgouaW5jbHVkZTxic2Quc3ViZGlyLm1rPgoAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAABiZHNtL2V4YW1wbGUxL3V0aWwAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAMDAwNzU1IAAwMDE3NTEgADAwMTc1MCAAMDAwMDAwMDAwMDAgMTA2NDUxMjQ2MDMg
MDE1MjYyACA1AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AHVzdGFyADAwd2llY3p5awAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABrb250YQAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAADAwMDAwMCAAMDAwMDAwIAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAGJkc20vZXhhbXBsZTEv
dXRpbC9NYWtlZmlsZQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAwMDA2NDQgADAwMTc1MSAAMDAxNzUw
IAAwMDAwMDAwMDExNSAxMDY0NTAzNzI0MiAwMTcwMDAAIDAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAdXN0YXIAMDB3aWVjenlrAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAGtvbnRhAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDAwMDAwIAAw
MDAwMDAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAUFJPRz1iZHNjdGwKU1JDUz1tYWluLmMKQ0ZMQUdTPS1JLi4vLi4gLUku
Li9kZXYKTUFOPQoKLmluY2x1ZGU8YnNkLnByb2cubWs+CgoAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABiZHNtL2V4YW1wbGUxL3V0
aWwvbWFpbi5jAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDAwNjQ0IAAwMDE3NTEgADAwMTc1MCAA
MDAwMDAwMDcwMDAgMTA2NDUxMjQ1NjUgMDE2NDM1ACAwAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHVzdGFyADAwd2llY3p5awAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAABrb250YQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADAwMDAwMCAAMDAw
MDAwIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAC8qLQogKiBDb3B5cmlnaHQgKGMpIDIwMDcgUGF3ZWwgV2llY3pvcmVrIDx3
aWVjenlrQGdtYWlsLmNvbT4KICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KICoKICogUmVkaXN0
cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3
aXRob3V0CiAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRo
ZSBmb2xsb3dpbmcgY29uZGl0aW9ucwogKiBhcmUgbWV0OgogKgogKiAxLiBSZWRpc3RyaWJ1
dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAog
KiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5n
IGRpc2NsYWltZXIuCiAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0
IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CiAqICAgIG5vdGljZSwgdGhpcyBsaXN0
IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKICog
ICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGgg
dGhlIGRpc3RyaWJ1dGlvbi4KICoKICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBU
SEUgQVVUSE9SIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1MgT1IKICogSU1QTElFRCBXQVJS
QU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FS
UkFOVElFUwogKiBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElD
VUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELgogKiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUg
QVVUSE9SIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsCiAqIElOQ0lERU5U
QUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNM
VURJTkcsIEJVVAogKiBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVU
RSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCiAqIERBVEEsIE9SIFBST0ZJVFM7
IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQog
KiBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElB
QklMSVRZLCBPUiBUT1JUCiAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0Up
IEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRgogKiBUSElTIFNPRlRXQVJF
LCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgog
KgogKi8KCiNpbmNsdWRlIDxzeXMvcGFyYW0uaD4KI2luY2x1ZGUgPHN5cy9wcm9jLmg+CiNp
bmNsdWRlIDxzeXMvaW9jdGwuaD4KI2luY2x1ZGUgInN5cy9iZHMuaCIKI2luY2x1ZGUgImti
ZHMuaCIKCiNpbmNsdWRlIDxzdGRsaWIuaD4KI2luY2x1ZGUgPHVuaXN0ZC5oPgojaW5jbHVk
ZSA8ZmNudGwuaD4KI2luY2x1ZGUgPHN0ZGlvLmg+CiNpbmNsdWRlIDxhc3NlcnQuaD4KCmlu
dCBfX2ZkOwoKdm9pZApvcGVuZGV2KCkKewoJX19mZCA9IG9wZW4oIi9kZXYvYmRzIixPX1JE
V1IpOwoJYXNzZXJ0KCBfX2ZkICE9IC0xICk7Cn0KCgojZGVmaW5lIEZMX0ZJUlNUIDB4MDEK
I2RlZmluZSBGTF9MQVNUIDB4MDIKI2RlZmluZSBGTF9JRCAweDA0CiNkZWZpbmUgRkxfUFJJ
TlQgMHgwOAojZGVmaW5lIEZMX1JFTU9WRSAweDEwCiNkZWZpbmUgRkxfUkVTRVQgMHgyMAoK
I2RlZmluZSBDX0lOU0VSVCAoRkxfRklSU1R8RkxfTEFTVCkKI2RlZmluZSBDX1BSSU5UIChG
TF9QUklOVCkKI2RlZmluZSBDX0xPT0tVUCAoRkxfSUQpCiNkZWZpbmUgQ19SRVNFVCAoRkxf
UkVTRVQpCiNkZWZpbmUgQ19SRU1PVkUgKEZMX1JFTU9WRSkKCnZvaWQKdXNhZ2UoKQp7Cglw
cmludGYoImJkc2N0bCAtZiBbZmlyc3RdIC1sIFtsYXN0XWkJIyBhZGQgbmV3IHBlcnNvbiBp
bnRvIGtlcm5lbCBjaXRpemVuIHJlZ2lzdHJ5XG4iKTsKCXByaW50ZigiYnNkY3RsIC1pIFtp
ZF0JCQkjIGxvb2t1cCBLQ1IgZm9yIElEXG4iKTsKCXByaW50ZigiYnNkY3RsIC1wCQkJIyBy
ZXF1ZXN0IGtlcm5lbCB0byBwcmludCBLQ1JcbiIpOwoJcHJpbnRmKCJic2RjdGwgLXIJCQkj
IHJlc2V0IEtDUlxuIik7CglwcmludGYoImJzZGN0bCAtZCBbaWRdCQkJIyByZW1vdmUgZnJv
bSBLQ1IgcGVyc29uIHdpdGggaWRcbiIpOwoJcHJpbnRmKCJXQVJOSU5HOiBmb3IgJ2FkZCcg
J3Jlc2V0JyBjb21tYW5kcyBrZXJuZWwgaXMgcHJpbnRpbmcgb3V0cHV0IGJ5IHByaW50Zig5
KVxuIik7Cn0KCmludAptYWluKGludCBhcmdjLCBjaGFyICoqYXJndikKewoJY2hhciBjaDsK
CXN0cnVjdCBrcGVyc29uIGs7CglpbnQgaWQ7CglpbnQgZmxhZyA9IDA7Cgl3aGlsZSAoIChj
aCA9IGdldG9wdChhcmdjLGFyZ3YsImY6bDppOmQ6cnBoIikpICE9IC0xICkKCQlzd2l0Y2gg
KGNoKSB7CgkJCWNhc2UgJ2YnOgoJCQkJZmxhZyB8PSBGTF9GSVJTVDsKCQkJCXN0cm5jcHko
ay5maXJzdCxvcHRhcmcsRklSU1RfTUFYLTEpOwoJCQkJYnJlYWs7CgoJCQljYXNlICdsJzoK
CQkJCWZsYWcgfD0gRkxfTEFTVDsKCQkJCXN0cm5jcHkoay5sYXN0LG9wdGFyZyxMQVNUX01B
WC0xKTsKCQkJCWJyZWFrOwoKCQkJY2FzZSAnaSc6CgkJCQlmbGFnIHw9IEZMX0lEOwoJCQkJ
aWQgPSBzdHJ0b2wob3B0YXJnLE5VTEwsMTApOwoJCQkJYnJlYWs7CgoJCQljYXNlICdkJzoK
CQkJCWZsYWcgfD0gRkxfUkVNT1ZFOwoJCQkJaWQgPSBzdHJ0b2wob3B0YXJnLE5VTEwsMTAp
OwoJCQkJYnJlYWs7CgkJCQoJCQljYXNlICdyJzoKCQkJCWZsYWcgfD0gRkxfUkVTRVQ7CgkJ
CQlicmVhazsKCgkJCWNhc2UgJ3AnOgoJCQkJZmxhZyB8PSBGTF9QUklOVDsKCQkJCWJyZWFr
OwoJCQlkZWZhdWx0OgoJCQljYXNlICdoJzoKCQkJCXVzYWdlKCk7CgkJCQlyZXR1cm4oMCk7
CgkJfQoJaWYgKGZsYWcgPT0gMCkgewoJCXVzYWdlKCk7CgkJcmV0dXJuKC0xKTsKCX0KCW9w
ZW5kZXYoKTsKCWlmICggZmxhZyA9PSBDX0lOU0VSVCApIHsKCQlpb2N0bChfX2ZkLCBCRFNJ
T1NQRVJTT04sICZrICk7CgkJcHJpbnRmKCJJbnNlcnRlZCB3aXRoIGlkICV1XG4iLGsuaWQp
OwoJfSBlbHNlIGlmICggZmxhZyA9PSBDX1BSSU5UICkgewoJCWlvY3RsKF9fZmQsIEJEU0lP
Q0tQUklOVCApOwoJfSBlbHNlIGlmICggZmxhZyA9PSBDX0xPT0tVUCApIHsKCQlrLmlkID0g
aWQ7CgkJaW9jdGwoX19mZCwgQkRTSU9HUEVSU09OLCZrICk7CgkJaWYgKCBrLmlkID09IC0x
ICkgewoJCQlwcmludGYoIk5vdCBmb3VuZFxuIik7CgkJfSBlbHNlIHsKCQkJcHJpbnRmKCIl
LjR1CQklcwkJJXNcbiIsay5pZCxrLmZpcnN0LGsubGFzdCk7CgkJfQoJfSBlbHNlIGlmICgg
ZmxhZyA9PSBDX1JFU0VUICkgewoJCWlvY3RsKF9fZmQsIEJEU0lPQ0tSRVNFVCApOwoJfSBl
bHNlIGlmICggZmxhZyA9PSBDX1JFTU9WRSApIHsKCQlwcmludGYoInggJWx1ICV1XG4iLEJE
U0lPQ1JFTU9WRSxpZCk7CgkJaW9jdGwoX19mZCwgQkRTSU9DUkVNT1ZFLCZpZCApOwoJfSBl
bHNlCgkJdXNhZ2UoKTsKCXJldHVybiAoMCk7Cn0KYmRzbS9leGFtcGxlMS9kZXYvTWFrZWZp
bGUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAADAwMDc1NSAAMDAxNzUxIAAwMDE3NTAgADAwMDAwMDAw
MTE0IDEwNjQ1MDM2MDQyIDAxNjYwMAAgMAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAB1c3RhcgAwMHdpZWN6eWsAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAa29udGEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAwMDAwMDAgADAwMDAwMCAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AABLTU9EPQliZHMKU1JDUz0JYmRzLmMgaGFzaF9zdXBwb3J0LmMKQ0ZMQUdTPSAtSS4uLy4u
Ci5pbmNsdWRlIDxic2Qua21vZC5taz4KAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAGJkc20vZXhhbXBsZTEvZGV2L2Jkcy5jAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAwMDA3NTUgADAwMTc1MSAAMDAxNzUwIAAwMDAwMDAxMjU3
NCAxMDY0NTEyNDcwNCAwMTYwNzQAIDAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAdXN0YXIAMDB3aWVjenlrAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AGtvbnRhAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDAwMDAwIAAwMDAwMDAgAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
LyotCiAqIENvcHlyaWdodCAoYykgMjAwNyBQYXdlbCBXaWVjem9yZWsgPHdpZWN6eWtAZ21h
aWwuY29tPgogKiBBbGwgcmlnaHRzIHJlc2VydmVkLgogKgogKiBSZWRpc3RyaWJ1dGlvbiBh
bmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKICog
bW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2lu
ZyBjb25kaXRpb25zCiAqIGFyZSBtZXQ6CiAqCiAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBz
b3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CiAqICAgIG5vdGlj
ZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1l
ci4KICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNl
IHRoZSBhYm92ZSBjb3B5cmlnaHQKICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0
aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQogKiAgICBkb2N1bWVu
dGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJp
YnV0aW9uLgogKgogKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBBVVRIT1Ig
YGBBUyBJUycnIEFORCBBTlkgRVhQUkVTUyBPUgogKiBJTVBMSUVEIFdBUlJBTlRJRVMsIElO
Q0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTCiAq
IE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBP
U0UgQVJFIERJU0NMQUlNRUQuCiAqIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgQkUg
TElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwKICogSU5DSURFTlRBTCwgU1BFQ0lB
TCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVU
CiAqIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9S
IFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKICogREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5F
U1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCiAqIFRIRU9SWSBP
RiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9S
IFRPUlQKICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJ
TiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GCiAqIFRISVMgU09GVFdBUkUsIEVWRU4gSUYg
QURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCiAqCiAqLwoKI2lu
Y2x1ZGUgPHN5cy9wYXJhbS5oPgojaW5jbHVkZSA8c3lzL3Vpby5oPgojaW5jbHVkZSA8c3lz
L3Byb2MuaD4KI2luY2x1ZGUgPHN5cy9zeXN0bS5oPgojaW5jbHVkZSA8c3lzL2tlcm5lbC5o
PgojaW5jbHVkZSA8c3lzL2lvY2NvbS5oPgojaW5jbHVkZSA8c3lzL2NvbmYuaD4KI2luY2x1
ZGUgPHN5cy9tb2R1bGUuaD4KI2luY2x1ZGUgPHN5cy9tYWxsb2MuaD4KI2luY2x1ZGUgInN5
cy9iZHMuaCIKCiNpbmNsdWRlICJrYmRzLmgiCgoKCgoKc3RydWN0IGNpdGl6ZW5fcmVnaXN0
cnkgY2l0aXplbl9yZWdpc3RyeTsKCi8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogKiBEYXRhIG1hbmFnZW1l
bnQKICovCgoKTUFMTE9DX0RFRklORShNX0tDUkVOVFJZLCAiS2VybmVsIENpdGl6ZW4gUmVn
aXN0cnkgRW50cnkiLCAiIik7CgoKc3RhdGljIHZvaWQga2NyX2FkZCggc3RydWN0IGtwZXJz
b24gKmsgKTsKc3RhdGljIHZvaWQga2NyX2dldCggc3RydWN0IGtwZXJzb24gKmsgKTsKc3Rh
dGljIHZvaWQga2NyX3ByaW50KHZvaWQpOwpzdGF0aWMgdm9pZCBrY3JfcmVtb3ZlKCBpbnQg
aWQgKTsKc3RhdGljIHZvaWQga2NyX3Jlc2V0KHZvaWQpOwoKdm9pZAprY3JfYWRkKCBzdHJ1
Y3Qga3BlcnNvbiAqcGFyYW0gKQp7CglzdGF0aWMgaW50IF9pZCA9IDB4NzQ2MTsKCXN0cnVj
dCBrZXlfaWQga2lkOwoJc3RydWN0IGtwZXJzb24gKnBjb3B5OwoJcGFyYW0tPmlkID0ga2lk
LmlkID0gX2lkKys7CglwYXJhbS0+Zmlyc3RbRklSU1RfTUFYLTFdID0gMDsKCXBhcmFtLT5s
YXN0W0xBU1RfTUFYLTFdID0gMDsKCXBjb3B5ID0gKHN0cnVjdCBrcGVyc29uICopIG1hbGxv
Yyggc2l6ZW9mKCpwY29weSksIE1fS0NSRU5UUlksIE1fV0FJVE9LICk7CgltZW1jcHkocGNv
cHkscGFyYW0sc2l6ZW9mKCpwY29weSkpOwoJTUFQX0lOU0VSVCggJmNpdGl6ZW5fcmVnaXN0
cnksICZraWQsIHBjb3B5LCBjaXRyZWdfZW50cnkgKTsKfQoKdm9pZAprY3JfZ2V0KCBzdHJ1
Y3Qga3BlcnNvbiAqcGFyYW0gKQp7CglzdHJ1Y3Qga2V5X2lkIGtpZDsKCXN0cnVjdCBrcGVy
c29uICpwY29weTsKCglraWQuaWQgPSBwYXJhbS0+aWQ7CglNQVBfTE9PS1VQKCAmY2l0aXpl
bl9yZWdpc3RyeSwgJmtpZCwgcGNvcHksIGNpdHJlZ19lbnRyeSApOwoJaWYgKCBwY29weSAp
IHsKCQltZW1jcHkocGFyYW0scGNvcHksc2l6ZW9mKCpwY29weSkpOwoJfSBlbHNlIHsKCQlw
YXJhbS0+aWQgPSAtMTsKCX0KfQoKdm9pZAprY3JfcHJpbnQoKQp7CglzdHJ1Y3Qga3BlcnNv
biAqazsKCXByaW50ZigiXG4tLS0tLUtlcm5lbCBDaXRpemVuIFJlZ2lzdHJ5LS0tLS0tLS0t
LS0tXG4iKTsKCU1BUF9GT1JFQUNIKCBrLCAmY2l0aXplbl9yZWdpc3RyeSwgY2l0cmVnX2Vu
dHJ5ICkgewoJCXByaW50ZigiJS40dQkJJXMJCSVzXG4iLGstPmlkLGstPmZpcnN0LGstPmxh
c3QpOwoJfQoJcHJpbnRmKCItLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tXG4iKTsKfQoKdm9pZAprY3JfcmVtb3ZlKGludCBpZCApCnsKCXN0cnVjdCBrcGVyc29u
ICpwZXJzb247CglzdHJ1Y3Qga2V5X2lkIGtpZDsKCWtpZC5pZCA9IGlkOwoJTUFQX0xPT0tV
UCggJmNpdGl6ZW5fcmVnaXN0cnksICZraWQsIHBlcnNvbiwgY2l0cmVnX2VudHJ5ICk7Cglp
ZiAoIHBlcnNvbiApIHsKCQlNQVBfUkVNT1ZFKCAmY2l0aXplbl9yZWdpc3RyeSwgcGVyc29u
LCBrcGVyc29uLCBjaXRyZWdfZW50cnkgKTsKCQlmcmVlKHBlcnNvbixNX0tDUkVOVFJZKTsK
CX0gZWxzZSB7CgkJcHJpbnRmKCJObyBwZXJzb24gd2l0aCBpZCAlaVxuIixpZCk7Cgl9Cn0K
CnZvaWQKa2NyX3Jlc2V0KCkKewoJc3RydWN0IGtwZXJzb24gKnBlcnNvbjsKCU1BUF9GT1JF
QUNIX1NBRkUoIHBlcnNvbiwgJmNpdGl6ZW5fcmVnaXN0cnksIGNpdHJlZ19lbnRyeSApIHsK
CQlNQVBfUkVNT1ZFKCAmY2l0aXplbl9yZWdpc3RyeSwgcGVyc29uLCBrcGVyc29uLCBjaXRy
ZWdfZW50cnkgKTsKCQlmcmVlKHBlcnNvbixNX0tDUkVOVFJZKTsKCX0KfQoKCi8qLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLQogKiBEZXZpY2UgCiAqLwoKc3RhdGljIGludCBiZHNkZXZfb3BlbihzdHJ1Y3Qg
Y2RldiAqZGV2LCBpbnQgZmxhZywgaW50IG90eXAsIHN0cnVjdCB0aHJlYWQgKnRkKTsKc3Rh
dGljIGludCBiZHNkZXZfY2xvc2Uoc3RydWN0IGNkZXYgKmRldiwgaW50IGZsYWcsIGludCBv
dHlwLCBzdHJ1Y3QgdGhyZWFkICp0ZCk7CnN0YXRpYyBpbnQgYmRzZGV2X2lvY3RsKHN0cnVj
dCBjZGV2ICpkZXYsIHVfbG9uZyBjbWQsIGNhZGRyX3QgYXJnLCBpbnQgbW9kZSwgc3RydWN0
IHRocmVhZCAqdGQpOwpzdGF0aWMgaW50IGJkc2Rldl93cml0ZShzdHJ1Y3QgY2RldiAqZGV2
LCBzdHJ1Y3QgdWlvICp1aW8sIGludCBpb2ZsYWcpOwpzdGF0aWMgaW50IGJkc2Rldl9yZWFk
KHN0cnVjdCBjZGV2ICpkZXYsIHN0cnVjdCB1aW8gKnVpbywgaW50IGlvZmxhZyk7CgoKaW50
CmJkc2Rldl9vcGVuKHN0cnVjdCBjZGV2ICpkZXYsIGludCBmbGFnLCBpbnQgb3R5cCwgc3Ry
dWN0IHRocmVhZCAqdGQpCnsKCXJldHVybiAoMCk7Cn0KCmludApiZHNkZXZfY2xvc2Uoc3Ry
dWN0IGNkZXYgKmRldiwgaW50IGZsYWcsIGludCBvdHlwLCBzdHJ1Y3QgdGhyZWFkICp0ZCkK
ewoJcmV0dXJuICgwKTsKfQoKaW50CmJkc2Rldl9pb2N0bChzdHJ1Y3QgY2RldiAqZGV2LCB1
X2xvbmcgY21kLCBjYWRkcl90IGFyZywgaW50IG1vZGUsCiAgICBzdHJ1Y3QgdGhyZWFkICp0
ZCkKewoJaW50IGVycm9yID0gMDsKCXVuaW9uIHsKCQljYWRkcl90IGFyZzsKCQlzdHJ1Y3Qg
a3BlcnNvbiAqcGVyc29uOwoJCWludCAqaWQ7Cgl9IEFSRzsKCgkKCUFSRy5hcmcgPSBhcmc7
Cglzd2l0Y2goY21kKSB7CgkJY2FzZSBCRFNJT1NQRVJTT046CgkJCWtjcl9hZGQoQVJHLnBl
cnNvbik7CgkJCWJyZWFrOwoJCWNhc2UgQkRTSU9HUEVSU09OOgoJCQlrY3JfZ2V0KEFSRy5w
ZXJzb24pOwoJCQlicmVhazsKCQljYXNlIEJEU0lPQ0tQUklOVDoKCQkJa2NyX3ByaW50KCk7
CgkJCWJyZWFrOwoJCWNhc2UgQkRTSU9DS1JFU0VUOgoJCQlrY3JfcmVzZXQoKTsKCQkJYnJl
YWs7CgkJY2FzZSBCRFNJT0NSRU1PVkU6CgkJCWtjcl9yZW1vdmUoKkFSRy5pZCk7CgkJCWJy
ZWFrOwoJCWRlZmF1bHQ6CgkJCWVycm9yID0gRUlOVkFMOwoJCQlicmVhazsKCX0KCXJldHVy
biAoZXJyb3IpOwp9CgppbnQKYmRzZGV2X3dyaXRlKHN0cnVjdCBjZGV2ICpkZXYsIHN0cnVj
dCB1aW8gKnVpbywgaW50IGlvZmxhZykKewogICAgcmV0dXJuKEVOT1RTVVApOwp9CgppbnQK
YmRzZGV2X3JlYWQoc3RydWN0IGNkZXYgKmRldiwgc3RydWN0IHVpbyAqdWlvLCBpbnQgaW9m
bGFnKQp7CiAgICByZXR1cm4oRU5PVFNVUCk7Cn0KCi8qLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogKiBNb2R1
bGUKICovCgpzdGF0aWMgc3RydWN0IGNkZXZzdyBiZHNfYmRzZGV2c3cgPSB7CgkuZF92ZXJz
aW9uID0gRF9WRVJTSU9OLAoJLmRfb3BlbiA9IGJkc2Rldl9vcGVuLAoJLmRfY2xvc2UgPSBi
ZHNkZXZfY2xvc2UsCgkuZF9yZWFkID0gYmRzZGV2X3JlYWQsCgkuZF93cml0ZSA9IGJkc2Rl
dl93cml0ZSwKCS5kX2lvY3RsID0gYmRzZGV2X2lvY3RsLAoJLmRfbmFtZSA9ICJiZHMiCn07
CgpzdGF0aWMgc3RydWN0IGNkZXYgKnNkZXY7CgoKc3RhdGljIGludApiZHNkZXZfbG9hZCht
b2R1bGVfdCBtb2QsIGludCBjbWQsIHZvaWQgKmFyZykKewogICAgaW50ICBlcnIgPSAwOwog
ICAgc3dpdGNoIChjbWQpIHsKICAgIGNhc2UgTU9EX0xPQUQ6CgloYXNoX2luaXQoJmNpdGl6
ZW5fcmVnaXN0cnkpOwoJc2RldiA9IG1ha2VfZGV2KCZiZHNfYmRzZGV2c3csIDAsIFVJRF9S
T09ULCBHSURfV0hFRUwsIDA2MDAsICJiZHMiKTsKCWJyZWFrOwoKICAgIGNhc2UgTU9EX1VO
TE9BRDoKCWtjcl9yZXNldCgpOwoJZGVzdHJveV9kZXYoc2Rldik7CglicmVhazsKICAgIGRl
ZmF1bHQ6CgllcnIgPSBFT1BOT1RTVVBQOwoJYnJlYWs7CiAgICB9CgogICAgcmV0dXJuKGVy
cik7Cn0KCkRFVl9NT0RVTEUoYmRzZGV2LCBiZHNkZXZfbG9hZCwgTlVMTCk7CgAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAGJkc20vZXhhbXBsZTEvZGV2L2hhc2hfc3VwcG9ydC5jAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAwMDA3NTUgADAwMTc1MSAAMDAxNzUwIAAwMDAwMDAwMzc0NCAxMDY0NTAyNjA1
MCAwMjAwMzUAIDAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAdXN0YXIAMDB3aWVjenlrAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAGtvbnRhAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAMDAwMDAwIAAwMDAwMDAgAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAALyotCiAqIENvcHly
aWdodCAoYykgMjAwNyBQYXdlbCBXaWVjem9yZWsgPHdpZWN6eWtAZ21haWwuY29tPgogKiBB
bGwgcmlnaHRzIHJlc2VydmVkLgogKgogKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNv
dXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKICogbW9kaWZpY2F0aW9u
LCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25z
CiAqIGFyZSBtZXQ6CiAqCiAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBt
dXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CiAqICAgIG5vdGljZSwgdGhpcyBsaXN0
IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KICogMi4gUmVk
aXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBj
b3B5cmlnaHQKICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhl
IGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQogKiAgICBkb2N1bWVudGF0aW9uIGFuZC9v
ciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgogKgog
KiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBBVVRIT1IgYGBBUyBJUycnIEFO
RCBBTlkgRVhQUkVTUyBPUgogKiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVU
IE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTCiAqIE9GIE1FUkNIQU5U
QUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NM
QUlNRUQuCiAqIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgQkUgTElBQkxFIEZPUiBB
TlkgRElSRUNULCBJTkRJUkVDVCwKICogSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZ
LCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUCiAqIE5PVCBMSU1J
VEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBM
T1NTIE9GIFVTRSwKICogREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBU
SU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCiAqIFRIRU9SWSBPRiBMSUFCSUxJVFks
IFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKICogKElO
Q0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9V
VCBPRiBUSEUgVVNFIE9GCiAqIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBU
SEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCiAqCiAqLwojaW5jbHVkZSA8c3lzL3Bh
cmFtLmg+CgojaW5jbHVkZSA8c3lzL3F1ZXVlLmg+CiNpbmNsdWRlICJzeXMvYmRzLmgiCgoj
aW5jbHVkZSAia2Jkcy5oIgoKc3RhdGljIHVuc2lnbmVkIGludCBrZXlfaWRfaGFzaCggY29u
c3Qgc3RydWN0IGtleV9pZCAqayApOwpzdGF0aWMgaW50IGtleV9pZF9jbXAoIGNvbnN0IHN0
cnVjdCBrZXlfaWQgKmsxLCBjb25zdCBzdHJ1Y3Qga2V5X2lkICprMiApOwpzdGF0aWMgdm9p
ZCBrZXlfaWRfY3AoIHN0cnVjdCBrZXlfaWQgKmRzdCwgY29uc3Qgc3RydWN0IGtleV9pZCAq
c3JjICk7CgoKc3RhdGljIHVuc2lnbmVkIGludAprZXlfaWRfaGFzaCggY29uc3Qgc3RydWN0
IGtleV9pZCAqayApCnsKCXJldHVybihrLT5pZCk7Cn0KCnN0YXRpYyBpbnQKa2V5X2lkX2Nt
cCggY29uc3Qgc3RydWN0IGtleV9pZCAqazEsIGNvbnN0IHN0cnVjdCBrZXlfaWQgKmsyICkK
ewoJcmV0dXJuKCBrMS0+aWQgPT0gazItPmlkICk7Cn0KCnN0YXRpYyB2b2lkCmtleV9pZF9j
cCggc3RydWN0IGtleV9pZCAqZHN0LCBjb25zdCBzdHJ1Y3Qga2V5X2lkICpzcmMgKQp7Cglk
c3QtPmlkID0gc3JjLT5pZDsKfQoKCnZvaWQKaGFzaF9pbml0KCBzdHJ1Y3QgY2l0aXplbl9y
ZWdpc3RyeSAqaCApCnsKCU1BUF9JTklUKGgsa2V5X2lkX2hhc2gsa2V5X2lkX2NtcCxrZXlf
aWRfY3ApOwp9CgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABiZHNtL2V4YW1wbGUxL2Rl
di9rYmRzLmgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDAwNzU1IAAwMDE3NTEgADAwMTc1MCAA
MDAwMDAwMDM2NjIgMTA2NDUxMjQ2MzEgMDE2MjUxACAwAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHVzdGFyADAwd2llY3p5awAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAABrb250YQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADAwMDAwMCAAMDAw
MDAwIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAC8qLQogKiBDb3B5cmlnaHQgKGMpIDIwMDcgUGF3ZWwgV2llY3pvcmVrIDx3
aWVjenlrQGdtYWlsLmNvbT4KICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KICoKICogUmVkaXN0
cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3
aXRob3V0CiAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRo
ZSBmb2xsb3dpbmcgY29uZGl0aW9ucwogKiBhcmUgbWV0OgogKgogKiAxLiBSZWRpc3RyaWJ1
dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAog
KiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5n
IGRpc2NsYWltZXIuCiAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0
IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CiAqICAgIG5vdGljZSwgdGhpcyBsaXN0
IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKICog
ICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGgg
dGhlIGRpc3RyaWJ1dGlvbi4KICoKICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBU
SEUgQVVUSE9SIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1MgT1IKICogSU1QTElFRCBXQVJS
QU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FS
UkFOVElFUwogKiBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElD
VUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELgogKiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUg
QVVUSE9SIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsCiAqIElOQ0lERU5U
QUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNM
VURJTkcsIEJVVAogKiBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVU
RSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCiAqIERBVEEsIE9SIFBST0ZJVFM7
IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQog
KiBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElB
QklMSVRZLCBPUiBUT1JUCiAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0Up
IEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRgogKiBUSElTIFNPRlRXQVJF
LCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgog
KgogKi8KCiNpZm5kZWYgS19CRFNfSAojZGVmaW5lIEtfQkRTX0gKCgoKc3RydWN0IGtleV9p
ZCB7CglpbnQgaWQ7Cn07CgojZGVmaW5lIEZJUlNUX01BWCAxMDAKI2RlZmluZSBMQVNUX01B
WCAxMDAKCnN0cnVjdCBrcGVyc29uIHsKCWludCBpZDsKCWNoYXIgZmlyc3RbRklSU1RfTUFY
XTsKCWNoYXIgbGFzdFtGSVJTVF9NQVhdOwoJTUFQX0VOVFJZKGtwZXJzb24sa2V5X2lkKSBj
aXRyZWdfZW50cnk7Cn07CgoKI2RlZmluZSBCRFNJT1NQRVJTT04JX0lPV1IoJ3AnLCAxLCBz
dHJ1Y3Qga3BlcnNvbikKI2RlZmluZSBCRFNJT0dQRVJTT04JX0lPV1IoJ3AnLCAyLCBzdHJ1
Y3Qga3BlcnNvbikKI2RlZmluZSBCRFNJT0NLUFJJTlQJX0lPKCdjJywzKQojZGVmaW5lIEJE
U0lPQ0tSRVNFVAlfSU8oJ2MnLDQpCiNkZWZpbmUgQkRTSU9DUkVNT1ZFCV9JT1coJ3AnLDUs
aW50KQoKI2lmZGVmIF9LRVJORUwKCi8qIEtlcm5lbCB3b3JsZCwga2VybmVsIGNpdGl6ZW5z
IF09O10gKi8KCk1BUF9IRUFEKCBjaXRpemVuX3JlZ2lzdHJ5LCBrcGVyc29uLCAxMyApOwoK
dm9pZCBoYXNoX2luaXQoIHN0cnVjdCBjaXRpemVuX3JlZ2lzdHJ5ICpoICk7CgojZW5kaWYg
LyogX0tFUk5FTCAqLwoKI2VuZGlmIC8qIEtfQkRTX0ggKi8KAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAYmRzbS9leGFtcGxlMC9NYWtlZmlsZQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADAw
MDc1NSAAMDAxNzUxIAAwMDE3NTAgADAwMDAwMDAwMTMyIDEwNjQ1MTI0MzM2IDAxNjAyNQAg
MAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB1c3RhcgAw
MHdpZWN6eWsAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAa29udGEAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAwMDAwMDAgADAwMDAwMCAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABDQz1jYwpQUk9HPWV4YW1wbGUwClNS
Q1M9bWFpbi5jIGhhc2hfc3VwcG9ydC5jCkNGTEFHUz0gLUkuLiAKTUFOPQoKCi5pbmNsdWRl
PGJzZC5wcm9nLm1rPgoAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAGJkc20vZXhhbXBsZTAvbWFpbi5jAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAwMDA3
NTUgADAwMTc1MSAAMDAxNzUwIAAwMDAwMDAxNTYwMSAxMDY0NTEyMjczMCAwMTU0NjAAIDAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAdXN0YXIAMDB3
aWVjenlrAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAGtvbnRhAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAMDAwMDAwIAAwMDAwMDAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAALyotCiAqIENvcHlyaWdodCAoYykgMjAw
NyBQYXdlbCBXaWVjem9yZWsgPHdpZWN6eWtAZ21haWwuY29tPgogKiBBbGwgcmlnaHRzIHJl
c2VydmVkLgogKgogKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmlu
YXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0
dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCiAqIGFyZSBtZXQ6
CiAqCiAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0
aGUgYWJvdmUgY29weXJpZ2h0CiAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlv
bnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KICogMi4gUmVkaXN0cmlidXRpb25z
IGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKICog
ICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBk
aXNjbGFpbWVyIGluIHRoZQogKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRl
cmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgogKgogKiBUSElTIFNPRlRX
QVJFIElTIFBST1ZJREVEIEJZIFRIRSBBVVRIT1IgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVT
UyBPUgogKiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVE
IFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTCiAqIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQg
RklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuCiAqIElO
IE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJ
TkRJUkVDVCwKICogSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFV
RU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUCiAqIE5PVCBMSU1JVEVEIFRPLCBQUk9D
VVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwK
ICogREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVS
IENBVVNFRCBBTkQgT04gQU5ZCiAqIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4g
Q09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKICogKElOQ0xVRElORyBORUdM
SUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNF
IE9GCiAqIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJ
VFkgT0YgU1VDSCBEQU1BR0UuCiAqCiAqLwoKI2luY2x1ZGUgPHN5cy9xdWV1ZS5oPgojaW5j
bHVkZSAic3lzL2Jkcy5oIgojaW5jbHVkZSA8c3RkaW8uaD4KI2luY2x1ZGUgPHN0cmluZy5o
PgojaW5jbHVkZSA8c3RkbGliLmg+CgojaW5jbHVkZSAiZXhhbXBsZTAuaCIKCgpzdHJ1Y3Qg
d29ya2Vyc19ieV9pZCB3cmtzX2J5X2lkOwpzdHJ1Y3Qgd29ya2Vyc19ieV9sYXN0IHdya3Nf
YnlfbGFzdDsKCgovKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT0KICogRGF0YSBtYW5hZ2VtZW50IHJvdXRpbmVz
CiAqLwoKCgpzdGF0aWMgdm9pZAp3b3JrZXJfYWRkKCBzdHJ1Y3Qgd29ya2VyICp3b3JrZXIg
KQp7CglzdGF0aWMgaW50IF9rZXkgPSAweDEyMzQ7CglzdHJ1Y3Qga2V5X2lkIGtpZDsKCXN0
cnVjdCBrZXlfbGFzdCBrbGFzdDsKCgl3b3JrZXItPmlkID0gX2tleSsrOwoJa2lkLmlkID0g
d29ya2VyLT5pZDsKCU1BUF9JTlNFUlQoJndya3NfYnlfaWQsICZraWQsIHdvcmtlciwgaGFz
aF9ieV9pZCApOwoKCXN0cmNweShrbGFzdC5sYXN0LHdvcmtlci0+bGFzdCk7CglNTUFQX0lO
U0VSVCgmd3Jrc19ieV9sYXN0LCZrbGFzdCwgd29ya2VyLCBoYXNoX2J5X2xhc3QgKTsKCQp9
CgpzdGF0aWMgc3RydWN0IHdvcmtlciAqCndvcmtlcl9sb29rdXAoIGludCBpZCApCnsKCXN0
cnVjdCB3b3JrZXIgKndvcmtlcjsKCXN0cnVjdCBrZXlfaWQgazsKCglrLmlkID0gaWQ7CglN
QVBfTE9PS1VQKCZ3cmtzX2J5X2lkLCAmaywgd29ya2VyLCBoYXNoX2J5X2lkICk7CglyZXR1
cm4gKHdvcmtlcik7Cn0KCgpzdGF0aWMgaW50Cndvcmtlcl9yZW1vdmVfYnlfbGFzdCggY29u
c3QgY2hhciAqIGxhc3QgKQp7CglzdHJ1Y3Qgd29ya2VyICp3b3JrZXI7CglzdHJ1Y3Qga2V5
X2xhc3Qga2xhc3Q7CglzdHJjcHkoa2xhc3QubGFzdCxsYXN0KTsKCU1NQVBfTE9PS1VQX0ZP
UkVBQ0hfU0FGRSggJndya3NfYnlfbGFzdCwgJmtsYXN0LCB3b3JrZXIsIGhhc2hfYnlfbGFz
dCApIHsKCQlNQVBfUkVNT1ZFKCZ3cmtzX2J5X2lkLHdvcmtlcix3b3JrZXIsaGFzaF9ieV9p
ZCApOwoJCU1NQVBfUkVNT1ZFKCZ3cmtzX2J5X2xhc3Qsd29ya2VyLHdvcmtlcixoYXNoX2J5
X2xhc3QpOwkJCgkJcHJpbnRmKCIlLjR1ICUtMTVzICUtMTVzICUuMnUgJS0xNXNcbiIsd29y
a2VyLT5pZCx3b3JrZXItPmZpcnN0LHdvcmtlci0+bGFzdCx3b3JrZXItPmFnZSx3b3JrZXIt
PmNpdHkpOwkKCX0KCXJldHVybigwKTsKfQoKc3RhdGljIGludAp3b3JrZXJfcmVtb3ZlKCBp
bnQgaWQgKQp7CglzdHJ1Y3Qgd29ya2VyICp3b3JrZXI7Cgl3b3JrZXIgPSB3b3JrZXJfbG9v
a3VwKCBpZCApOwoKCWlmICggd29ya2VyID09IE5VTEwgKSByZXR1cm4oLTEpOwoJTUFQX1JF
TU9WRSgmd3Jrc19ieV9pZCx3b3JrZXIsd29ya2VyLGhhc2hfYnlfaWQgKTsKCU1NQVBfUkVN
T1ZFKCZ3cmtzX2J5X2xhc3Qsd29ya2VyLHdvcmtlcixoYXNoX2J5X2xhc3QpOwoKCWZyZWUo
d29ya2VyKTsKCXJldHVybigxKTsKfQoKCnN0YXRpYyB2b2lkCndvcmtlcl9saXN0X2J5X2xh
c3QoY29uc3QgY2hhciAqbGFzdCkKewoJc3RydWN0IHdvcmtlciAqd29ya2VyOwoJc3RydWN0
IGtleV9sYXN0IGtsYXN0OwoJc3RyY3B5KGtsYXN0Lmxhc3QsbGFzdCk7CglNTUFQX0xPT0tV
UF9GT1JFQUNIKCAmd3Jrc19ieV9sYXN0LCAma2xhc3QsIHdvcmtlciwgaGFzaF9ieV9sYXN0
KSB7CgkJcHJpbnRmKCIlLjR1ICUtMTVzICUtMTVzICUuMnUgJS0xNXNcbiIsd29ya2VyLT5p
ZCx3b3JrZXItPmZpcnN0LHdvcmtlci0+bGFzdCx3b3JrZXItPmFnZSx3b3JrZXItPmNpdHkp
OwkKCX0KfQoKc3RhdGljIHZvaWQKd29ya2VyX2xpc3QoKQp7CglzdHJ1Y3Qgd29ya2VyICp3
b3JrZXI7CglNQVBfRk9SRUFDSCggIHdvcmtlciwgJndya3NfYnlfaWQsIGhhc2hfYnlfaWQp
IHsKCQlwcmludGYoIiUuNHUgJS0xNXMgJS0xNXMgJS4ydSAlLTE1c1xuIix3b3JrZXItPmlk
LHdvcmtlci0+Zmlyc3Qsd29ya2VyLT5sYXN0LHdvcmtlci0+YWdlLHdvcmtlci0+Y2l0eSk7
CQoJfQp9CgoKLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09CiAqIFVzZXIgaW50ZXJmYWNlIGhhbmRsZXJzCiAq
LwoKc3RhdGljIGludCBfX2dldChjaGFyICprLGNoYXIgKmRhdGEsIGludCBsZW4pOwojZGVm
aW5lIF9fR0VUKCBrb20sIGQsIGwgKSBpZiAoX19nZXQoa29tLGQsbCkgKSByZXR1cm47Cgpz
dGF0aWMgdm9pZCB1aV9pbnNlcnQoKTsKc3RhdGljIHZvaWQgdWlfc2VsZWN0X2lkKCk7Cgpz
dGF0aWMgaW50Cl9fZ2V0KGNoYXIgKmssY2hhciAqZGF0YSwgaW50IGxlbikKewoJaW50IG47
CglwcmludGYoIiVzOiAiLGspOwoJZmZsdXNoKHN0ZG91dCk7CglkYXRhWzBdID0gMDsKCWZw
dXJnZShzdGRpbik7CglpZiAoIGZnZXRzKGRhdGEsbGVuLHN0ZGluKSA9PSBOVUxMICkgcmV0
dXJuKDEpOwoJbiA9IHN0cmxlbihkYXRhKTsKCWlmICggbiA+IDEgKQoJZGF0YVtuLTFdID0g
MDsKCXJldHVybigwKTsKfQoKc3RhdGljIHZvaWQKdWlfbGlzdCgpCnsKCXdvcmtlcl9saXN0
KCk7Cn0KCnN0YXRpYyB2b2lkCnVpX3NlbGVjdF9pZCgpCnsKCXN0cnVjdCB3b3JrZXIgKndv
cmtlcjsKCWNoYXIgaWRbMTBdOwoJaW50IF9pZDsKCglfX0dFVCgiSUQiLGlkLHNpemVvZihp
ZCkpOwoJX2lkID0gc3RydG9sKGlkLE5VTEwsMTApOwoKCXdvcmtlciA9IHdvcmtlcl9sb29r
dXAoX2lkKTsKCWlmICggd29ya2VyID09IE5VTEwgKSB7CgkJcHJpbnRmKCJFcnJvcjogY2Fu
bm90IGZpbmQgd29ya2VyIHdpdGggaWQgJS40dVxuIixfaWQpOwoJCXJldHVybjsKCX0KCXBy
aW50ZigiRm91bmQ6ICUuNHUgJS0xNXMgJS0xNXMgJS4ydSAlLTE1c1xuIix3b3JrZXItPmlk
LHdvcmtlci0+Zmlyc3Qsd29ya2VyLT5sYXN0LHdvcmtlci0+YWdlLHdvcmtlci0+Y2l0eSk7
CQp9CgoKc3RhdGljIHZvaWQKdWlfc2VsZWN0X2xhc3QoKQp7CgljaGFyIGxhc3RbTEFTVF9N
QVhdOwoKCV9fR0VUKCJMYXN0IixsYXN0LHNpemVvZihsYXN0KSk7CgoJd29ya2VyX2xpc3Rf
YnlfbGFzdChsYXN0KTsKfQoKc3RhdGljIHZvaWQKdWlfcmVtb3ZlX2lkKCkKewoJY2hhciBp
ZFsxMF07CglpbnQgX2lkOwoKCV9fR0VUKCJJRCIsaWQsc2l6ZW9mKGlkKSk7CglfaWQgPSBz
dHJ0b2woaWQsTlVMTCwxMCk7CgoJaWYgKCB3b3JrZXJfcmVtb3ZlKF9pZCkgKSB7CgkJcHJp
bnRmKCJFcnJvcjogbm8gdXNlciB3aXRoIHRoaXMgaWRcbiIpOwoJfSBlbHNlIHsKCQlwcmlu
dGYoIlJlbW92ZWRcbiIpOwoJfQp9CgpzdGF0aWMgdm9pZAp1aV9yZW1vdmVfbGFzdCgpCnsK
CWNoYXIgbGFzdFtMQVNUX01BWF07CglfX0dFVCgiTGFzdCIsbGFzdCxzaXplb2YobGFzdCkp
OwoKCXdvcmtlcl9yZW1vdmVfYnlfbGFzdChsYXN0KTsKfQoKCnN0YXRpYyB2b2lkCnVpX2lu
c2VydCgpCnsKCXN0cnVjdCB3b3JrZXIgKndvcmtlcjsKCXN0cnVjdCB3b3JrZXIgdGVtcDsK
CWNoYXIgYWdlWzEwXTsKCglwdXRzKCI9PT4gQWRkaW5nIG5ldyB3b3JrZXIgaW50byBtZW1v
cnkiKTsKCV9fR0VUKCJGaXJzdCBuYW1lIix0ZW1wLmZpcnN0LHNpemVvZih0ZW1wLmZpcnN0
KSk7CglfX0dFVCgiTGFzdCBuYW1lIix0ZW1wLmxhc3Qsc2l6ZW9mKHRlbXAubGFzdCkpOwoJ
X19HRVQoIkFnZSIsYWdlLHNpemVvZihhZ2UpKTsKCV9fR0VUKCJDaXR5Iix0ZW1wLmNpdHks
c2l6ZW9mKHRlbXAuY2l0eSkpOwoJCgl0ZW1wLmFnZSA9IHN0cnRvbChhZ2UsTlVMTCwxMCk7
CgkKCXdvcmtlciA9IChzdHJ1Y3Qgd29ya2VyKikgbWFsbG9jKCBzaXplb2YoKndvcmtlcikp
OwoJbWVtY3B5KHdvcmtlciwmdGVtcCxzaXplb2YoKndvcmtlcikpOwoKCXdvcmtlcl9hZGQo
d29ya2VyKTsKCXByaW50ZigiQWRkZWQgd2l0aCBpZCAlLjR1XG4iLHdvcmtlci0+aWQpOwoK
fQoKCgovKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT0KICogTWFpbiBtZW51CiAqLwoKCmVudW0gb3B0aW9uX3Yg
ewoJT1BfSU5WQUxJRCwKCU9QX1FVSVQsCglPUF9JTlNFUlQsCglPUF9MSVNULAoJT1BfU0VM
RUNUX0lELAoJT1BfU0VMRUNUX0xBU1QsCglPUF9SRU1PVkVfSUQsCglPUF9SRU1PVkVfTEFT
VAp9OwoKCnN0cnVjdCBvcHRpb24gewoJY29uc3QgY2hhciAqdGV4dDsKCWVudW0gb3B0aW9u
X3YgdmFsdWU7Cn07CgoKc3RhdGljIGVudW0gb3B0aW9uX3YgZmluZF9vcHRpb24oY2hhciBj
KTsKc3RhdGljIGVudW0gb3B0aW9uX3YgZ2V0X29wdGlvbl9mcm9tX3VzZXIodm9pZCk7Cgpz
dHJ1Y3Qgb3B0aW9uIG9wdGlvbnNbXSA9IHsKCXsgIlF1aXQiLCBPUF9RVUlUIH0sCgl7ICJJ
bnNlcnQgbmV3IHBlcnNvbiB0byBtZW1vcnkiLCBPUF9JTlNFUlQgfSwKCXsgIkxpc3QgcGVy
c29ucyBmcm9tIG1lbW9ydCIsIE9QX0xJU1QgfSwKCXsgIkNoZWNrIHBlcnNvbiBJRCIsIE9Q
X1NFTEVDVF9JRCB9LAoJeyAiU2hvdyBwZXJzb25zIGJ5IGxhc3QgbmFtZSIsIE9QX1NFTEVD
VF9MQVNUIH0sCgl7ICJSZW1vdmUgYnkgSUQiLCBPUF9SRU1PVkVfSUQgfSwKCXsgIlJlbW92
ZSBieSBsYXN0IiwgT1BfUkVNT1ZFX0xBU1QgfSwKCXsgTlVMTCwgT1BfSU5WQUxJRCB9LAp9
OwoKCnN0YXRpYyBlbnVtIG9wdGlvbl92CmZpbmRfb3B0aW9uKGNoYXIgYykKewoJc3RydWN0
IG9wdGlvbiAqb3AgPSBvcHRpb25zOwoJd2hpbGUgKCBvcC0+dGV4dCAmJiBjLS0gKSB7CgkJ
b3ArKzsKCX0KCQoJcmV0dXJuIChvcC0+dmFsdWUpOwp9CgpzdGF0aWMgZW51bSBvcHRpb25f
diAKZ2V0X29wdGlvbl9mcm9tX3VzZXIoKQp7CgljaGFyIGM7CglmcHVyZ2Uoc3RkaW4pOwoJ
YyA9IGZnZXRjKHN0ZGluKSAtICcwJzsKCWlmICggZmVvZihzdGRpbikgKSB7CgkJcmV0dXJu
IChPUF9RVUlUKTsKCX0KCXJldHVybiAoZmluZF9vcHRpb24oYykpOwoJCn0KCgpzdGF0aWMg
aW50Cm1haW5fbWVudSgpCnsKCWludCBpOwoJaW50IHIgPSAxOwoJc3RydWN0IG9wdGlvbiAq
b3AgPSBvcHRpb25zOwoJcHJpbnRmKCItLS0tLVxuIik7Cglmb3IgKGkgPSAwOyBvcC0+dGV4
dDsgaSsrLG9wKysgKSB7CiAJCXByaW50ZigiIC0gJS4xdQkJJXNcbiIsaSxvcC0+dGV4dCk7
Cgl9CglwcmludGYoIlxuUHJlc3Mgb3B0aW9uIG51bWJlciBrZXkgYW5kIGhpdCBlbnRlcjog
Iik7Cglzd2l0Y2ggKCBnZXRfb3B0aW9uX2Zyb21fdXNlcigpICkgewoJCWNhc2UgT1BfUVVJ
VDoKCQkJciA9IDA7CgkJCWJyZWFrOwoKCQljYXNlIE9QX0lOU0VSVDoKCQkJdWlfaW5zZXJ0
KCk7CgkJCWJyZWFrOwoKCQljYXNlIE9QX0xJU1Q6CgkJCXVpX2xpc3QoKTsKCQkJYnJlYWs7
CgoJCWNhc2UgT1BfU0VMRUNUX0lEOgoJCQl1aV9zZWxlY3RfaWQoKTsKCQkJYnJlYWs7CgoJ
CWNhc2UgT1BfU0VMRUNUX0xBU1Q6CgkJCXVpX3NlbGVjdF9sYXN0KCk7CgkJCWJyZWFrOwoK
CQljYXNlIE9QX0lOVkFMSUQ6CgkJCWJyZWFrOwoKCQljYXNlIE9QX1JFTU9WRV9JRDoKCQkJ
dWlfcmVtb3ZlX2lkKCk7CgkJCWJyZWFrOwoKCQljYXNlIE9QX1JFTU9WRV9MQVNUOgoJCQl1
aV9yZW1vdmVfbGFzdCgpOwoJCQlicmVhazsKCgl9CglyZXR1cm4gKHIpOwp9CgppbnQKbWFp
bigpCnsKCWlkX2hhc2hfaW5pdCgmd3Jrc19ieV9pZCk7CglsYXN0X2hhc2hfaW5pdCgmd3Jr
c19ieV9sYXN0KTsKCXdoaWxlICggbWFpbl9tZW51KCkgKTsKCXJldHVybiAoMCk7Cn0KAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAGJkc20vZXhhbXBsZTAvaGFzaF9zdXBwb3J0LmMAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAwMDA3NTUgADAwMTc1MSAAMDAxNzUwIAAwMDAwMDAwNDQ3MyAxMDY0NTAwMTMx
NSAwMTcyNTMAIDAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAdXN0YXIAMDB3aWVjenlrAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAGtvbnRhAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAMDAwMDAwIAAwMDAwMDAgAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAALyotCiAqIENvcHly
aWdodCAoYykgMjAwNyBQYXdlbCBXaWVjem9yZWsgPHdpZWN6eWtAZ21haWwuY29tPgogKiBB
bGwgcmlnaHRzIHJlc2VydmVkLgogKgogKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNv
dXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKICogbW9kaWZpY2F0aW9u
LCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25z
CiAqIGFyZSBtZXQ6CiAqCiAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBt
dXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CiAqICAgIG5vdGljZSwgdGhpcyBsaXN0
IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KICogMi4gUmVk
aXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBj
b3B5cmlnaHQKICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhl
IGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQogKiAgICBkb2N1bWVudGF0aW9uIGFuZC9v
ciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgogKgog
KiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBBVVRIT1IgYGBBUyBJUycnIEFO
RCBBTlkgRVhQUkVTUyBPUgogKiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVU
IE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTCiAqIE9GIE1FUkNIQU5U
QUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NM
QUlNRUQuCiAqIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgQkUgTElBQkxFIEZPUiBB
TlkgRElSRUNULCBJTkRJUkVDVCwKICogSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZ
LCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUCiAqIE5PVCBMSU1J
VEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBM
T1NTIE9GIFVTRSwKICogREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBU
SU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCiAqIFRIRU9SWSBPRiBMSUFCSUxJVFks
IFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKICogKElO
Q0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9V
VCBPRiBUSEUgVVNFIE9GCiAqIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBU
SEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCiAqCiAqLwoKI2luY2x1ZGUgPHN5cy9x
dWV1ZS5oPgojaW5jbHVkZSAic3lzL2Jkcy5oIgoKI2luY2x1ZGUgPHN0ZGlvLmg+CiNpbmNs
dWRlIDxzdHJpbmcuaD4KCiNpbmNsdWRlICJleGFtcGxlMC5oIgoKCnN0YXRpYyB1bnNpZ25l
ZCBpbnQKa2V5X2lkX2hhc2goIGNvbnN0IHN0cnVjdCBrZXlfaWQgKmsgKQp7CglyZXR1cm4o
ay0+aWQpOwp9CgpzdGF0aWMgaW50CmtleV9pZF9jbXAoIGNvbnN0IHN0cnVjdCBrZXlfaWQg
KmsxLCBjb25zdCBzdHJ1Y3Qga2V5X2lkICprMiApCnsKCXJldHVybiggazEtPmlkID09IGsy
LT5pZCApOwp9CgpzdGF0aWMgdm9pZAprZXlfaWRfY3AoIHN0cnVjdCBrZXlfaWQgKmRzdCwg
Y29uc3Qgc3RydWN0IGtleV9pZCAqc3JjICkKewoJZHN0LT5pZCA9IHNyYy0+aWQ7Cn0KCgp2
b2lkCmlkX2hhc2hfaW5pdCggc3RydWN0IHdvcmtlcnNfYnlfaWQgKmhhc2ggKQp7CglNQVBf
SU5JVChoYXNoLGtleV9pZF9oYXNoLGtleV9pZF9jbXAsa2V5X2lkX2NwKTsKfQoKCgpzdGF0
aWMgdW5zaWduZWQgaW50CmtleV9sYXN0X2hhc2goIGNvbnN0IHN0cnVjdCBrZXlfbGFzdCAq
ayApCnsKCWludCBoID0gMjk7Cgljb25zdCBjaGFyICpwOwoJZm9yICggcCA9IGstPmxhc3Q7
ICpwICE9ICdcMCc7IHArKyApIHsKCQloICs9ICpwOwoJfQoJcmV0dXJuIChoKTsKfQoKc3Rh
dGljIGludAprZXlfbGFzdF9jbXAoIGNvbnN0IHN0cnVjdCBrZXlfbGFzdCAqazEsIGNvbnN0
IHN0cnVjdCBrZXlfbGFzdCAqazIgKQp7CglyZXR1cm4gKHN0cmNhc2VjbXAoazEtPmxhc3Qs
azItPmxhc3QpID09IDApOwp9CgoKc3RhdGljIHZvaWQKa2V5X2xhc3RfY3AoIHN0cnVjdCBr
ZXlfbGFzdCAqZHN0LCBjb25zdCBzdHJ1Y3Qga2V5X2xhc3QgKnNyYyApCnsKCXN0cmNweShk
c3QtPmxhc3Qsc3JjLT5sYXN0KTsKfQoKdm9pZApsYXN0X2hhc2hfaW5pdCggc3RydWN0IHdv
cmtlcnNfYnlfbGFzdCAqaGFzaCApCnsKCU1NQVBfSU5JVChoYXNoLGtleV9sYXN0X2hhc2gs
a2V5X2xhc3RfY21wLGtleV9sYXN0X2NwKTsKfQoAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAGJkc20vZXhhbXBsZTAvZXhhbXBsZTAuaAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAwMDA3NTUgADAwMTc1MSAAMDAxNzUwIAAwMDAwMDAwMzYzMCAxMDY0NDc3MTMxNyAwMTYy
NjUAIDAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAdXN0
YXIAMDB3aWVjenlrAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAGtvbnRhAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAMDAwMDAwIAAwMDAwMDAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAALyotCiAqIENvcHlyaWdodCAo
YykgMjAwNyBQYXdlbCBXaWVjem9yZWsgPHdpZWN6eWtAZ21haWwuY29tPgogKiBBbGwgcmln
aHRzIHJlc2VydmVkLgogKgogKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBh
bmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKICogbW9kaWZpY2F0aW9uLCBhcmUg
cGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCiAqIGFy
ZSBtZXQ6CiAqCiAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJl
dGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CiAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNv
bmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KICogMi4gUmVkaXN0cmli
dXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmln
aHQKICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxv
d2luZyBkaXNjbGFpbWVyIGluIHRoZQogKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhl
ciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgogKgogKiBUSElT
IFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBBVVRIT1IgYGBBUyBJUycnIEFORCBBTlkg
RVhQUkVTUyBPUgogKiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBM
SU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTCiAqIE9GIE1FUkNIQU5UQUJJTElU
WSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQu
CiAqIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgQkUgTElBQkxFIEZPUiBBTlkgRElS
RUNULCBJTkRJUkVDVCwKICogSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBD
T05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUCiAqIE5PVCBMSU1JVEVEIFRP
LCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9G
IFVTRSwKICogREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBI
T1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCiAqIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRI
RVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKICogKElOQ0xVRElO
RyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBU
SEUgVVNFIE9GCiAqIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9T
U0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCiAqCiAqLwoKI2lmbmRlZiBFWEFNUExFXzAKI2Rl
ZmluZSBFWEFNUExFXzAKCiNkZWZpbmUgUFJJTUVfTlVNQkVSIDEzCgoKI2RlZmluZSBGSVJT
VF9NQVggMTIwCiNkZWZpbmUgTEFTVF9NQVggMTIwCiNkZWZpbmUgQ0lUWV9NQVggMTIwCgpz
dHJ1Y3Qga2V5X2lkIHsKCWludCBpZDsKfTsKCnN0cnVjdCBrZXlfbGFzdCB7CgljaGFyIGxh
c3RbTEFTVF9NQVhdOwp9OwoKc3RydWN0IHdvcmtlciB7CglpbnQgaWQ7CgljaGFyIGZpcnN0
W0ZJUlNUX01BWF07CgljaGFyIGxhc3RbTEFTVF9NQVhdOwoJaW50IGFnZTsKCWNoYXIgY2l0
eVtDSVRZX01BWF07CgoJTUFQX0VOVFJZKHdvcmtlcixrZXlfaWQpIGhhc2hfYnlfaWQ7CglN
TUFQX0VOVFJZKHdvcmtlcixrZXlfbGFzdCkgaGFzaF9ieV9sYXN0Owp9OwoKTUFQX0hFQUQo
d29ya2Vyc19ieV9pZCx3b3JrZXIsUFJJTUVfTlVNQkVSKTsKTU1BUF9IRUFEKHdvcmtlcnNf
YnlfbGFzdCx3b3JrZXIsUFJJTUVfTlVNQkVSKTsKCnZvaWQgaWRfaGFzaF9pbml0KCBzdHJ1
Y3Qgd29ya2Vyc19ieV9pZCAqdGFibGUgKTsKdm9pZCBsYXN0X2hhc2hfaW5pdCggc3RydWN0
IHdvcmtlcnNfYnlfbGFzdCAqdGFibGUgKTsKCgojZW5kaWYKAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABiZHNtL3N5cy9iZHMuaAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDAwNzU1IAAwMDE3NTEgADAwMTc1MCAAMDAwMDAw
MjI3MDMgMTA2NDUxMjQ3MjQgMDE0NDIyACAwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAHVzdGFyADAwd2llY3p5awAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAABrb250YQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADAwMDAwMCAAMDAwMDAwIAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAC8qLQogKiBDb3B5cmlnaHQgKGMpIDIwMDcgUGF3ZWwgV2llY3pvcmVrIDx3aWVjenlr
QGdtYWlsLmNvbT4KICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KICoKICogUmVkaXN0cmlidXRp
b24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0
CiAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xs
b3dpbmcgY29uZGl0aW9ucwogKiBhcmUgbWV0OgogKgogKiAxLiBSZWRpc3RyaWJ1dGlvbnMg
b2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAogKiAgICBu
b3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2Ns
YWltZXIuCiAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJv
ZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CiAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNv
bmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKICogICAgZG9j
dW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRp
c3RyaWJ1dGlvbi4KICoKICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQVVU
SE9SIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1MgT1IKICogSU1QTElFRCBXQVJSQU5USUVT
LCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElF
UwogKiBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQ
VVJQT1NFIEFSRSBESVNDTEFJTUVELgogKiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9S
IEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsCiAqIElOQ0lERU5UQUwsIFNQ
RUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcs
IEJVVAogKiBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09E
UyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCiAqIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJV
U0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQogKiBUSEVP
UlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZ
LCBPUiBUT1JUCiAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJ
TkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRgogKiBUSElTIFNPRlRXQVJFLCBFVkVO
IElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgogKgogKi8K
CiNpZm5kZWYgU1lTX0JEU19ICiNkZWZpbmUgU1lTX0JEU19ICgoKLyoKICogVGhpcyBmaWxl
IGNvbnRhaW4gYmFzaWMgZGF0YSBzdHJ1Y3R1cmVzLiBUaGV5IGFyZSBzaW1pbGFyIHRvIHN0
cnVjdHVyZXMKICogaW4gc3lzL3F1ZXVlLmgsIHBsZWFzZSByZWFkIGRvY3VtZW50YXRpb24g
Zm9yIGl0IGZpcnN0LiAKICoKICogISEgSW5jbHVkZSBzeXMvcXVldWUuaCBiZWZvcmUgdGhp
cyBmaWxlLgogKiAKICogQSBtYXAgKCBkaWN0aW9uYXJ5LCBoYXNoLXRhYmxlLCBhc3NvY2lh
dGl2ZSBhcnJheSApIHN0cnVjdHVyZSBpcyBoZWFkZWQKICogYnkgTUFQX0hFQUQgbWFjcm8u
IFRoaXMgc3RydWN0dXJlIGNvbnRhaW5zIHRhYmxlIG9mIGxpc3RzIHJlcHJlc2VudGVkCiAq
IGJ5IFNMSVNUIHN0cnVjdHVyZSBmcm9tIHN5cy9xdWV1ZS5oLiBUaGUgbGVuZ3RoIG9mIHRh
YmxlIGlzIHR5cGVkIGJ5IHVzZXIKICogYXMgcHJpbWUtbnVtYmVyLXBhcmFtZXRlciBpbiBI
RUFEIG1hY3JvLiBTdHJ1Y3R1cmVzIGFyZSB1c2VkIHRvCiAqIGRlY3Jhc2UgdGltZSBvZiBp
dGVtIGFjY2VzcyAuIFVzZXIgaGFkIHRvIHNwZWNpZnkgYSBzdHJ1Y3R1cmUKICogd2hpY2gg
d2lsbCBiZSB1c2VyIGFzIGtleS4KICogVGhlIGluaXRpYWxpemVyIChNQVBfSU5JVCkgbmVl
ZCBwb2ludGVycyB0byBoYXNoLWZ1bmN0aW9uLCBrZXktY29weSBhbmQKICoga2V5LWNvbXBh
cmUgcm91dGluZXMuIE1lbW9yeSBhZGRyZXNzZXMgb2YgdGhlbiB0aGVtIHdpbGwgYmUgc3Rv
cmVkCiAqIGluIGRhdGEgc3RydWN0dXJlIGZvciBsYXRlciB1c2FnZS4gUGxlYXNlIHNlZSBk
ZWZpbml0aW9uIG9mIGJkc18qIHR5cGVzCiAqIGluIHRoaXMgZmlsZSBmb3IgbW9yZSBpbmZv
cm1hdGlvbi4KICogQSBtdWx0aSBtYXAgc3RydWN0dXJlIGlzIGhlYWRlZCBieSBNTUFQX0hF
QUQgbWFjcm8gdG8gcmVkdWNlIGxpbmVzIG9mIGNvZGUKICouKGxlc3MgcHJvYmFsaXR5IHRv
IG1ha2UgYnVnKS4gSXQgaXMgaWRlbnRpY2FsIHRvCiAqIHNpbmdsZSBtYXAgd2l0aCBkaWZm
ZXJlbmNlIHRoYXQgY2FuIHN0b3JlIG1hbnkgdmFyaWFibGVzIGZvciB0aGlzIHNhbWUga2V5
LgogKiBGb3IgdGhpcyBmZWF0dXJlIGl0IGlzIGltcGxlbWVudGluZyBhZGRpdGlvbmFsIG1h
Y3JvOiBfTE9PS1VQX0ZPUkVBQ0gKICogKGFuZCBfU0FGRSB2ZXJzaW9uKS4KICogSW4gaW1w
bGVtZW50YXRpb24gdGhlIE1BUCBhbmQgTU1BUCBhcmUgaWRlbnRpY2FsLCBpdCBoYXZlIGRp
ZmZlcmVudCBuYW1lcwogKiBmb3IgbG9naWNhbCBzZXBlcmF0aW9uLiBJdCBpcyBhbHNvIHVz
aW5nIGludGVybmFsIHRlbXBsYXRlIGZvciBnZW5lcmF0ZQogKiBhbm90aGVyIGludGVybmFs
IG5hbWVzIGZvciBNQVAgYW5kIE1NQVAsIGluIHRoaXMgd2F5IGNvbXBpbGVyIGNhbiBnZW5l
cmF0ZQogKiBlcnJvciAgd2hlbiBwcm9ncmFtbWVyIHdpbGwgdXNlIGZvciBleGFtcGxlIE1B
UCBtYWNybyBvbiBNTUFQIHN0cnVjdHVyZS4KICoKICogICAgICAgICAgICAgICAgICAgICAg
ICAgIE1BUCAgICBNTUFQCiAqIF9IRUFEICAgICAgICAgICAgICAgICAgICArICAgICAgKwog
KiBfSEVBRF9JTklUSUFMSVpFUiAgICAgICAgLSAgICAgIC0KICogX0VOVFJZICAgICAgICAg
ICAgICAgICAgICsgICAgICArCiAqIF9JTklUICAgICAgICAgICAgICAgICAgICArICAgICAg
KwogKiBfRU1QVFkgICAgICAgICAgICAgICAgICAgKyAgICAgICsKICogX0ZJUlNUICAgICAg
ICAgICAgICAgICAgIC0gICAgICAtCiAqIF9ORVhUICAgICAgICAgICAgICAgICAgICAtICAg
ICAgLQogKiBfUFJFViAgICAgICAgICAgICAgICAgICAgLSAgICAgIC0KICogX0xBU1QgICAg
ICAgICAgICAgICAgICAgIC0gICAgICAtCiAqIF9LRVkgICAgICAgICAgICAgICAgICAgICAr
ICAgICAgKwogKiBfRk9SRUFDSCAgICAgICAgICAgICAgICAgKyAgICAgICsKICogX0ZPUkVB
Q0hfU0FGRSAgICAgICAgICAgICsgICAgICArCiAqIF9GT1JFQUNIX1JFVkVSU0UgICAgICAg
ICAtICAgICAgLQogKiBfRk9SRUFDSF9SRVZFUlNFX1NBRkUgICAgLSAgICAgIC0KICogX0lO
U0VSVCAgICAgICAgICAgICAgICAgICsgICAgICArCiAqIF9JTlNFUlRfSEVBRCAgICAgICAg
ICAgICAtICAgICAgLQogKiBfSU5TRVJUX0JFRk9SRSAgICAgICAgICAgLSAgICAgIC0KICog
X0lOU0VSVF9BRlRFUiAgICAgICAgICAgIC0gICAgICAtCiAqIF9JTlNFUlRfVEFJTCAgICAg
ICAgICAgICAtICAgICAgLQogKiBfQ09OQ0FUICAgICAgICAgICAgICAgICAgLSAgICAgIC0K
ICogX1JFTU9WRV9IRUFEICAgICAgICAgICAgIC0gICAgICAtCiAqIF9SRU1PVkUgICAgICAg
ICAgICAgICAgICArICAgICAgKwogKiBfTE9PS1VQICAgICAgICAgICAgICAgICAgKyAgICAg
ICsKICogX0xPT0tVUF9GT1JFQUNIICAgICAgICAgIC0gICAgICArCiAqIF9MT09LVVBfRk9S
RUFDSF9TQUZFICAgICAtICAgICAgKwogKgogKiBJbXBsZW1lbnRhdGlvbiBub3RlcwogKiAt
LS0tLS0tLS0tLS0tLS0tLS0tLQogKgogKi8KCgp0eXBlZGVmIHVuc2lnbmVkIGludCBiZHNf
aGFzaF9mdW5jX3QoIGNvbnN0IHZvaWQgKmtleSApOwp0eXBlZGVmIGludCBiZHNfa2V5X2Nt
cF9mdW5jX3QgKCBjb25zdCB2b2lkICprZXkxLCBjb25zdCB2b2lkICprZXkyICk7CnR5cGVk
ZWYgdm9pZCBiZHNfa2V5X2NwX2Z1bmNfdCggdm9pZCAqa2V5ZHN0LCBjb25zdCB2b2lkICpr
ZXlzcmMgKTsKCi8qCiAqIEdlbmVyaWMgbWFwIHRlbXBsYXRlCiAqLwoKI2RlZmluZSBfdE1B
UF9QUklNRV9USU5ZCTQ5CiNkZWZpbmUgX3RNQVBfUFJJTUVfU01BTEwJMTQ5CiNkZWZpbmUg
X3RNQVBfUFJJTUVfTUVESVVNCTk3NwojZGVmaW5lIF90TUFQX1BSSU1FX0xBUkdFCTEyNzcK
I2RlZmluZSBfdE1BUF9QUklNRV9IVUdFCTI0NTkKCgojZGVmaW5lIF90TUFQX0xPT0tVUF9G
Uk9NX0xJU1QoaGVhZCwgbGlzdCxrZXksdmFyLGZpZWxkLF90ZmllbGQpIGRvIHsJXAoJaW50
IF9oaWZvdW5kID0gMDsJCQkJCQlcCglTTElTVF9GT1JFQUNIKHZhciwgbGlzdCwgZmllbGQu
X3RmaWVsZCApIHsJCQlcCgkJaWYgKCBoZWFkLT5jbXBmdW5jKGtleSwmdmFyLT5maWVsZC5r
ZXljb3B5KSApIHsJXAoJCQlfaGlmb3VuZCA9IDE7CQkJCQlcCgkJCWJyZWFrOwkJCQkJCVwK
CQl9CQkJCQkJCVwKCX0JCQkJCQkJCVwKCWlmICggIV9oaWZvdW5kICkgdmFyID0gTlVMTDsJ
CQkJCVwKfSB3aGlsZSgwKQoKI2RlZmluZSBfdE1BUF9JTlNFUlRfSU5UT19MSVNUKGhlYWQs
bGlzdCxrZXksdmFyLGZpZWxkLF90ZmllbGQpIGRvIHsJXAoJaGVhZC0+Y3BmdW5jKCYodmFy
LT5maWVsZC5rZXljb3B5KSxrZXkpOwkJCVwKCWhlYWQtPmNvdW50Kys7CQkJCQkJCVwKCVNM
SVNUX0lOU0VSVF9IRUFEKCBsaXN0LCB2YXIsIGZpZWxkLl90ZmllbGQgKTsJCQlcCn0gd2hp
bGUoMCkKCgojZGVmaW5lIF90TUFQX0xJU1QoaGVhZCxpKSAmKChoZWFkKS0+bGlzdFtpXSkK
CiNkZWZpbmUgX3RNQVBfTEVOR1RIKGhlYWQpICAoc2l6ZW9mKChoZWFkKS0+bGlzdCkvc2l6
ZW9mKChoZWFkKS0+bGlzdFswXSkpCgojZGVmaW5lIF90TUFQX0lOREVYKGhlYWQsa2V5KSAo
KChoZWFkKS0+aGZ1bmMoa2V5KSklX3RNQVBfTEVOR1RIKGhlYWQpKQoKCiNkZWZpbmUgX3RN
QVBfSEVBRChuYW1lLHR5cGUscHJpbWUpCQkJCQlcCnN0cnVjdCBuYW1lIHsJCQkJCQkJCVwK
CXVuc2lnbmVkIGludCB0bXBfaTsJCQkJCQlcCglzdHJ1Y3QgdHlwZSAqdG1wX3Y7CQkJCQkJ
XAoJaW50IGNvdW50OwkJCQkJCQlcCgliZHNfaGFzaF9mdW5jX3QgKmhmdW5jOwkJCQkJCVwK
CWJkc19rZXlfY21wX2Z1bmNfdCAqY21wZnVuYzsJCQkJCVwKCWJkc19rZXlfY3BfZnVuY190
ICpjcGZ1bmM7CQkJCQlcCglTTElTVF9IRUFEKCx0eXBlKSBsaXN0W3ByaW1lXTsJCQkJCVwK
fQoKCiNkZWZpbmUgX3RNQVBfRU5UUlkodHlwZSxrZXl0eXBlLF90ZmllbGQpCQkJCVwKc3Ry
dWN0IHsJCQkJCQkJCVwKCVNMSVNUX0VOVFJZKHR5cGUpIF90ZmllbGQ7CQkJCQlcCglzdHJ1
Y3Qga2V5dHlwZSBrZXljb3B5OwkJCQkJCVwKfQoKCiNkZWZpbmUgX3RNQVBfSU5JVChoZWFk
LF9oZnVuYyxfY21wZnVuYyxfY3BmdW5jKSBkbyB7CQkJXAoJdW5zaWduZWQgaW50IF9oaWw7
CQkJCQkJXAoJKGhlYWQpLT5oZnVuYyA9IChiZHNfaGFzaF9mdW5jX3QqKV9oZnVuYzsJCQlc
CgkoaGVhZCktPmNtcGZ1bmMgPSAoYmRzX2tleV9jbXBfZnVuY190KilfY21wZnVuYzsJCVwK
CShoZWFkKS0+Y3BmdW5jID0gKGJkc19rZXlfY3BfZnVuY190KilfY3BmdW5jOwkJCVwKCSho
ZWFkKS0+Y291bnQgPSAwOwkJCQkJCVwKICAgIGZvciAoIF9oaWwgPSAwOyBfaGlsIDwgX3RN
QVBfTEVOR1RIKGhlYWQpOyBfaGlsKysgKSB7CQlcCgkJU0xJU1RfSU5JVCggX3RNQVBfTElT
VChoZWFkLF9oaWwpICk7CQkJXAogICAgfQkJCQkJCQkJCVwKfSB3aGlsZSgwKQoKI2RlZmlu
ZSBfdE1BUF9FTVBUWShoZWFkKSAoKGhlYWQpLT5jb3VudCA9PSAwKQoKI2RlZmluZSBfdE1B
UF9LRVkodmFyLGZpZWxkKSAoJih2YXIpLT5maWVsZC5rZXljb3B5KQoKCiNkZWZpbmUgX3RN
QVBfSU5TRVJUKGhlYWQsIGtleSwgdmFyLCBmaWVsZCxfdGZpZWxkICkgZG8gewkJXAoJdW5z
aWduZWQgaW50IF9oaWwgPSBfdE1BUF9JTkRFWChoZWFkLGtleSk7CQkJXAoJX3RNQVBfSU5T
RVJUX0lOVE9fTElTVCgoaGVhZCksIF90TUFQX0xJU1QoaGVhZCxfaGlsKSwJCVwKCQkJa2V5
LHZhcixmaWVsZCxfdGZpZWxkKTsJCQkJXAp9IHdoaWxlKDApCgoKI2RlZmluZSBfdE1BUF9G
T1JFQUNIKHZhciwgaGVhZCwgZmllbGQsX3RmaWVsZCkJCQkJXApmb3IgKCAoaGVhZCktPnRt
cF9pID0gMDsJCQkJCQlcCgkJKGhlYWQpLT50bXBfaSA8IF90TUFQX0xFTkdUSChoZWFkKTsJ
CQlcCgkJKGhlYWQpLT50bXBfaSsrICkJCQkJCVwKCVNMSVNUX0ZPUkVBQ0godmFyLCBfdE1B
UF9MSVNUKGhlYWQsKGhlYWQpLT50bXBfaSksIGZpZWxkLl90ZmllbGQpCgoKI2RlZmluZSBf
dE1BUF9GT1JFQUNIX1NBRkUodmFyLCBoZWFkLCBmaWVsZCwgX3RmaWVsZCApCQkJXApmb3Ig
KCAoaGVhZCktPnRtcF9pID0gMDsJCQkJCQlcCgkJKGhlYWQpLT50bXBfaSA8IF90TUFQX0xF
TkdUSChoZWFkKTsJCQlcCgkJKGhlYWQpLT50bXBfaSsrICkJCQkJCVwKCVNMSVNUX0ZPUkVB
Q0hfU0FGRSh2YXIsIF90TUFQX0xJU1QoaGVhZCwoaGVhZCktPnRtcF9pKSwgZmllbGQuX3Rm
aWVsZCwoaGVhZCktPnRtcF92ICkKCgoKI2RlZmluZSBfdE1BUF9SRU1PVkUoIGhlYWQsIHZh
ciwgdHlwZSwgZmllbGQsIF90ZmllbGQgKSBkbyB7CQlcCglpbnQgX2hpbCA9IF90TUFQX0lO
REVYKGhlYWQsICYodmFyKS0+ZmllbGQua2V5Y29weSk7CQlcCglTTElTVF9SRU1PVkUoIF90
TUFQX0xJU1QoaGVhZCxfaGlsKSwgdmFyLCB0eXBlLGZpZWxkLl90ZmllbGQgKTtcCn0gd2hp
bGUoMCkKCQoKCiNkZWZpbmUgX3RNQVBfTE9PS1VQKCBoZWFkLCBrZXksIHZhciwgZmllbGQs
X3RmaWVsZCApIGRvIHsJCVwKCXVuc2lnbmVkIGludCBfaGlsID0gX3RNQVBfSU5ERVgoaGVh
ZCxrZXkpOwkJCVwKCV90TUFQX0xPT0tVUF9GUk9NX0xJU1QoIChoZWFkKSwgX3RNQVBfTElT
VChoZWFkLF9oaWwpLAkJXAoJCQlrZXksIHZhciwgZmllbGQsIF90ZmllbGQpOwkJCVwKfSB3
aGlsZSgwKQoKCiNkZWZpbmUgX3RNQVBfTE9PS1VQX0ZPUkVBQ0goaCwga2V5LCB2YXIsZmll
bGQsX3RmaWVsZCkJCQlcCglTTElTVF9GT1JFQUNIKHZhciwgX3RNQVBfTElTVChoLF90TUFQ
X0lOREVYKGgsa2V5KSksIGZpZWxkLl90ZmllbGQpXAoJCWlmICggKGgpLT5jbXBmdW5jKGtl
eSwmdmFyLT5maWVsZC5rZXljb3B5KSApCgkKCiNkZWZpbmUgX3RNQVBfTE9PS1VQX0ZPUkVB
Q0hfU0FGRShoLCBrLCBkLGYsIF90ZmllbGQpCQkJXAoJU0xJU1RfRk9SRUFDSF9TQUZFKGQs
IF90TUFQX0xJU1QoaCxfdE1BUF9JTkRFWChoLGspKSwgZi5fdGZpZWxkLChoKS0+dG1wX3Yp
XAoJCWlmICggKGgpLT5jbXBmdW5jKGssJmQtPmYua2V5Y29weSkgKQoKCi8qCiAqIE1hcCBk
ZWZpbml0aW9ucwogKi8KCgojZGVmaW5lIF9NQVBfTEZJRUxECW1wZmxkCgojZGVmaW5lIE1B
UF9IRUFEKG5hbWUsdHlwZSxwcmltZSkJCQkJCVwKCV90TUFQX0hFQUQobmFtZSx0eXBlLHBy
aW1lKQoKI2RlZmluZSBNQVBfRU5UUlkodHlwZSxrZXl0eXBlKQkJCQkJCVwKCV90TUFQX0VO
VFJZKHR5cGUsa2V5dHlwZSxfTUFQX0xGSUVMRCkKCiNkZWZpbmUgTUFQX0tFWSh2YXIsZmll
bGQpCQkJCQkJXAoJX3RNQVBfS0VZKHZhcixmaWVsZCkKCiNkZWZpbmUgTUFQX0lOSVQoaGVh
ZCxfaGZ1bmMsX2NtcGZ1bmMsX2NwZnVuYykJCQkJXAoJX3RNQVBfSU5JVChoZWFkLF9oZnVu
YyxfY21wZnVuYyxfY3BmdW5jKQoKI2RlZmluZSBNQVBfRU1QVFkoaGVhZCkJCQkJCQkJXAoJ
X3RNQVBfRU1QVFkoaGVhZCkKCiNkZWZpbmUgTUFQX0ZPUkVBQ0goIHZhciwgaGVhZCwgZmll
bGQpCQkJCQlcCglfdE1BUF9GT1JFQUNIKCB2YXIsIGhlYWQsIGZpZWxkLF9NQVBfTEZJRUxE
KQoKI2RlZmluZSBNQVBfRk9SRUFDSF9TQUZFKCB2YXIsIGhlYWQsIGZpZWxkICkJCQkJXAoJ
X3RNQVBfRk9SRUFDSF9TQUZFKCB2YXIsIGhlYWQsIGZpZWxkLCBfTUFQX0xGSUVMRCApCgoj
ZGVmaW5lIE1BUF9SRU1PVkUoIGhlYWQsIHZhciwgdHlwZSwgZmllbGQgKQkJCQlcCglfdE1B
UF9SRU1PVkUoIGhlYWQsIHZhciwgdHlwZSwgZmllbGQsX01BUF9MRklFTEQgKQoKI2RlZmlu
ZSBNQVBfUkVNT1ZFX0JZX0tFWSggaGVhZCwga2V5LCB0eXBlLCBmaWVsZCApCQkJXAoJX3RN
QVBfUkVNT1ZFX0JZX0tFWSggaGVhZCwga2V5LCB0eXBlLCBmaWVsZCxfTUFQX0xGSUVMRCAp
CgojZGVmaW5lIE1BUF9MT09LVVAoIGhlYWQsIGtleSwgdmFyLCBmaWVsZCApCQkJCVwKCV90
TUFQX0xPT0tVUCggaGVhZCwga2V5LCB2YXIsIGZpZWxkLF9NQVBfTEZJRUxEICkKCiNkZWZp
bmUgTUFQX0lOU0VSVChoZWFkLCBrZXksIHZhciwgZmllbGQgKQkJCQlcCglfdE1BUF9JTlNF
UlQoaGVhZCwga2V5LCB2YXIsIGZpZWxkLF9NQVBfTEZJRUxEICkKCi8qCiAqIE11bHRpIG1h
cCBkZWZpbml0aW9ucwogKi8KCiNkZWZpbmUgX01NQVBfTEZJRUxECW1tcGZsZAoKI2RlZmlu
ZSBNTUFQX0hFQUQobmFtZSx0eXBlLHByaW1lKQkJCQkJXAoJX3RNQVBfSEVBRChuYW1lLHR5
cGUscHJpbWUpCgojZGVmaW5lIE1NQVBfRU5UUlkodHlwZSxrZXl0eXBlKQkJCQkJXAoJX3RN
QVBfRU5UUlkodHlwZSxrZXl0eXBlLF9NTUFQX0xGSUVMRCkKCiNkZWZpbmUgTU1BUF9LRVko
dmFyLGZpZWxkKQkJCQkJCVwKCV90TUFQX0tFWSh2YXIsZmllbGQpCgojZGVmaW5lIE1NQVBf
SU5JVChoZWFkLF9oZnVuYyxfY21wZnVuYyxfY3BmdW5jKQkJCQlcCglfdE1BUF9JTklUKGhl
YWQsX2hmdW5jLF9jbXBmdW5jLF9jcGZ1bmMpCgojZGVmaW5lIE1NQVBfRU1QVFkoaGVhZCkJ
CQkJCQlcCglfdE1BUF9FTVBUWShoZWFkKQoKI2RlZmluZSBNTUFQX0ZPUkVBQ0goIHZhciwg
aGVhZCwgZmllbGQpCQkJCQlcCglfdE1BUF9GT1JFQUNIKCB2YXIsIGhlYWQsIGZpZWxkLF9N
TUFQX0xGSUVMRCkKCiNkZWZpbmUgTU1BUF9GT1JFQUNIX1NBRkUoIHZhciwgaGVhZCwgZmll
bGQgKQkJCQlcCglfdE1BUF9GT1JFQUNIX1NBRkUoIHZhciwgaGVhZCwgZmllbGQsX01NQVBf
TEZJRUxEICkKCiNkZWZpbmUgTU1BUF9SRU1PVkUoIGhlYWQsIHZhciwgdHlwZSwgZmllbGQg
KQkJCQlcCglfdE1BUF9SRU1PVkUoIGhlYWQsIHZhciwgdHlwZSwgZmllbGQsX01NQVBfTEZJ
RUxEICkKCiNkZWZpbmUgTU1BUF9SRU1PVkVfQllfS0VZKCBoZWFkLCBrZXksIHR5cGUsIGZp
ZWxkICkJCQlcCglfdE1BUF9SRU1PVkVfQllfS0VZKCBoZWFkLCBrZXksIHR5cGUsIGZpZWxk
LF9NTUFQX0xGSUVMRCApCgojZGVmaW5lIE1NQVBfTE9PS1VQKCBoZWFkLCBrZXksIHZhciwg
ZmllbGQgKQkJCQlcCglfdE1BUF9MT09LVVAoIGhlYWQsIGtleSwgdmFyLCBmaWVsZCxfTU1B
UF9MRklFTEQgKQoKI2RlZmluZSBNTUFQX0xPT0tVUF9GT1JFQUNIKCBoZWFkLCBrZXksIHZh
ciwgZmllbGQgKQkJCVwKCV90TUFQX0xPT0tVUF9GT1JFQUNIKCBoZWFkLCBrZXksIHZhciwg
ZmllbGQsX01NQVBfTEZJRUxEICkKCiNkZWZpbmUgTU1BUF9MT09LVVBfRk9SRUFDSF9TQUZF
KCBoZWFkLCBrZXksIHZhciwgZmllbGQgKQkJXAoJX3RNQVBfTE9PS1VQX0ZPUkVBQ0hfU0FG
RSggaGVhZCwga2V5LCB2YXIsIGZpZWxkLF9NTUFQX0xGSUVMRCApCgojZGVmaW5lIE1NQVBf
SU5TRVJUKGhlYWQsIGtleSwgdmFyLCBmaWVsZCApCQkJCVwKCV90TUFQX0lOU0VSVChoZWFk
LCBrZXksIHZhciwgZmllbGQsX01NQVBfTEZJRUxEICkKCgoKI2VuZGlmIC8qIFNZU19CRFNf
SCAqLwoAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAA==
--------------020003070002010103050303
Content-Type: text/plain;
 name="bds.h"
Content-Transfer-Encoding: 7bit
Content-Disposition: inline;
 filename="bds.h"

/*-
 * Copyright (c) 2007 Pawel Wieczorek <wieczyk@gmail.com>
 * All rights reserved.
 *
 * Redistribution and use in source and binary forms, with or without
 * modification, are permitted provided that the following conditions
 * are met:
 *
 * 1. Redistributions of source code must retain the above copyright
 *    notice, this list of conditions and the following disclaimer.
 * 2. Redistributions in binary form must reproduce the above copyright
 *    notice, this list of conditions and the following disclaimer in the
 *    documentation and/or other materials provided with the distribution.
 *
 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
 * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
 * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
 * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
 * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
 * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
 * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 *
 */

#ifndef SYS_BDS_H
#define SYS_BDS_H


/*
 * This file contain basic data structures. They are similar to structures
 * in sys/queue.h, please read documentation for it first. 
 *
 * !! Include sys/queue.h before this file.
 * 
 * A map ( dictionary, hash-table, associative array ) structure is headed
 * by MAP_HEAD macro. This structure contains table of lists represented
 * by SLIST structure from sys/queue.h. The length of table is typed by user
 * as prime-number-parameter in HEAD macro. Structures are used to
 * decrase time of item access . User had to specify a structure
 * which will be user as key.
 * The initializer (MAP_INIT) need pointers to hash-function, key-copy and
 * key-compare routines. Memory addresses of then them will be stored
 * in data structure for later usage. Please see definition of bds_* types
 * in this file for more information.
 * A multi map structure is headed by MMAP_HEAD macro to reduce lines of code
 *.(less probality to make bug). It is identical to
 * single map with difference that can store many variables for this same key.
 * For this feature it is implementing additional macro: _LOOKUP_FOREACH
 * (and _SAFE version).
 * In implementation the MAP and MMAP are identical, it have different names
 * for logical seperation. It is also using internal template for generate
 * another internal names for MAP and MMAP, in this way compiler can generate
 * error  when programmer will use for example MAP macro on MMAP structure.
 *
 *                          MAP    MMAP
 * _HEAD                    +      +
 * _HEAD_INITIALIZER        -      -
 * _ENTRY                   +      +
 * _INIT                    +      +
 * _EMPTY                   +      +
 * _FIRST                   -      -
 * _NEXT                    -      -
 * _PREV                    -      -
 * _LAST                    -      -
 * _KEY                     +      +
 * _FOREACH                 +      +
 * _FOREACH_SAFE            +      +
 * _FOREACH_REVERSE         -      -
 * _FOREACH_REVERSE_SAFE    -      -
 * _INSERT                  +      +
 * _INSERT_HEAD             -      -
 * _INSERT_BEFORE           -      -
 * _INSERT_AFTER            -      -
 * _INSERT_TAIL             -      -
 * _CONCAT                  -      -
 * _REMOVE_HEAD             -      -
 * _REMOVE                  +      +
 * _LOOKUP                  +      +
 * _LOOKUP_FOREACH          -      +
 * _LOOKUP_FOREACH_SAFE     -      +
 *
 * Implementation notes
 * --------------------
 *
 */


typedef unsigned int bds_hash_func_t( const void *key );
typedef int bds_key_cmp_func_t ( const void *key1, const void *key2 );
typedef void bds_key_cp_func_t( void *keydst, const void *keysrc );

/*
 * Generic map template
 */

#define _tMAP_PRIME_TINY	49
#define _tMAP_PRIME_SMALL	149
#define _tMAP_PRIME_MEDIUM	977
#define _tMAP_PRIME_LARGE	1277
#define _tMAP_PRIME_HUGE	2459


#define _tMAP_LOOKUP_FROM_LIST(head, list,key,var,field,_tfield) do {	\
	int _hifound = 0;						\
	SLIST_FOREACH(var, list, field._tfield ) {			\
		if ( head->cmpfunc(key,&var->field.keycopy) ) {	\
			_hifound = 1;					\
			break;						\
		}							\
	}								\
	if ( !_hifound ) var = NULL;					\
} while(0)

#define _tMAP_INSERT_INTO_LIST(head,list,key,var,field,_tfield) do {	\
	head->cpfunc(&(var->field.keycopy),key);			\
	head->count++;							\
	SLIST_INSERT_HEAD( list, var, field._tfield );			\
} while(0)


#define _tMAP_LIST(head,i) &((head)->list[i])

#define _tMAP_LENGTH(head)  (sizeof((head)->list)/sizeof((head)->list[0]))

#define _tMAP_INDEX(head,key) (((head)->hfunc(key))%_tMAP_LENGTH(head))


#define _tMAP_HEAD(name,type,prime)					\
struct name {								\
	unsigned int tmp_i;						\
	struct type *tmp_v;						\
	int count;							\
	bds_hash_func_t *hfunc;						\
	bds_key_cmp_func_t *cmpfunc;					\
	bds_key_cp_func_t *cpfunc;					\
	SLIST_HEAD(,type) list[prime];					\
}


#define _tMAP_ENTRY(type,keytype,_tfield)				\
struct {								\
	SLIST_ENTRY(type) _tfield;					\
	struct keytype keycopy;						\
}


#define _tMAP_INIT(head,_hfunc,_cmpfunc,_cpfunc) do {			\
	unsigned int _hil;						\
	(head)->hfunc = (bds_hash_func_t*)_hfunc;			\
	(head)->cmpfunc = (bds_key_cmp_func_t*)_cmpfunc;		\
	(head)->cpfunc = (bds_key_cp_func_t*)_cpfunc;			\
	(head)->count = 0;						\
    for ( _hil = 0; _hil < _tMAP_LENGTH(head); _hil++ ) {		\
		SLIST_INIT( _tMAP_LIST(head,_hil) );			\
    }									\
} while(0)

#define _tMAP_EMPTY(head) ((head)->count == 0)

#define _tMAP_KEY(var,field) (&(var)->field.keycopy)


#define _tMAP_INSERT(head, key, var, field,_tfield ) do {		\
	unsigned int _hil = _tMAP_INDEX(head,key);			\
	_tMAP_INSERT_INTO_LIST((head), _tMAP_LIST(head,_hil),		\
			key,var,field,_tfield);				\
} while(0)


#define _tMAP_FOREACH(var, head, field,_tfield)				\
for ( (head)->tmp_i = 0;						\
		(head)->tmp_i < _tMAP_LENGTH(head);			\
		(head)->tmp_i++ )					\
	SLIST_FOREACH(var, _tMAP_LIST(head,(head)->tmp_i), field._tfield)


#define _tMAP_FOREACH_SAFE(var, head, field, _tfield )			\
for ( (head)->tmp_i = 0;						\
		(head)->tmp_i < _tMAP_LENGTH(head);			\
		(head)->tmp_i++ )					\
	SLIST_FOREACH_SAFE(var, _tMAP_LIST(head,(head)->tmp_i), field._tfield,(head)->tmp_v )



#define _tMAP_REMOVE( head, var, type, field, _tfield ) do {		\
	int _hil = _tMAP_INDEX(head, &(var)->field.keycopy);		\
	SLIST_REMOVE( _tMAP_LIST(head,_hil), var, type,field._tfield );\
} while(0)
	


#define _tMAP_LOOKUP( head, key, var, field,_tfield ) do {		\
	unsigned int _hil = _tMAP_INDEX(head,key);			\
	_tMAP_LOOKUP_FROM_LIST( (head), _tMAP_LIST(head,_hil),		\
			key, var, field, _tfield);			\
} while(0)


#define _tMAP_LOOKUP_FOREACH(h, key, var,field,_tfield)			\
	SLIST_FOREACH(var, _tMAP_LIST(h,_tMAP_INDEX(h,key)), field._tfield)\
		if ( (h)->cmpfunc(key,&var->field.keycopy) )
	

#define _tMAP_LOOKUP_FOREACH_SAFE(h, k, d,f, _tfield)			\
	SLIST_FOREACH_SAFE(d, _tMAP_LIST(h,_tMAP_INDEX(h,k)), f._tfield,(h)->tmp_v)\
		if ( (h)->cmpfunc(k,&d->f.keycopy) )


/*
 * Map definitions
 */


#define _MAP_LFIELD	mpfld

#define MAP_HEAD(name,type,prime)					\
	_tMAP_HEAD(name,type,prime)

#define MAP_ENTRY(type,keytype)						\
	_tMAP_ENTRY(type,keytype,_MAP_LFIELD)

#define MAP_KEY(var,field)						\
	_tMAP_KEY(var,field)

#define MAP_INIT(head,_hfunc,_cmpfunc,_cpfunc)				\
	_tMAP_INIT(head,_hfunc,_cmpfunc,_cpfunc)

#define MAP_EMPTY(head)							\
	_tMAP_EMPTY(head)

#define MAP_FOREACH( var, head, field)					\
	_tMAP_FOREACH( var, head, field,_MAP_LFIELD)

#define MAP_FOREACH_SAFE( var, head, field )				\
	_tMAP_FOREACH_SAFE( var, head, field, _MAP_LFIELD )

#define MAP_REMOVE( head, var, type, field )				\
	_tMAP_REMOVE( head, var, type, field,_MAP_LFIELD )

#define MAP_REMOVE_BY_KEY( head, key, type, field )			\
	_tMAP_REMOVE_BY_KEY( head, key, type, field,_MAP_LFIELD )

#define MAP_LOOKUP( head, key, var, field )				\
	_tMAP_LOOKUP( head, key, var, field,_MAP_LFIELD )

#define MAP_INSERT(head, key, var, field )				\
	_tMAP_INSERT(head, key, var, field,_MAP_LFIELD )

/*
 * Multi map definitions
 */

#define _MMAP_LFIELD	mmpfld

#define MMAP_HEAD(name,type,prime)					\
	_tMAP_HEAD(name,type,prime)

#define MMAP_ENTRY(type,keytype)					\
	_tMAP_ENTRY(type,keytype,_MMAP_LFIELD)

#define MMAP_KEY(var,field)						\
	_tMAP_KEY(var,field)

#define MMAP_INIT(head,_hfunc,_cmpfunc,_cpfunc)				\
	_tMAP_INIT(head,_hfunc,_cmpfunc,_cpfunc)

#define MMAP_EMPTY(head)						\
	_tMAP_EMPTY(head)

#define MMAP_FOREACH( var, head, field)					\
	_tMAP_FOREACH( var, head, field,_MMAP_LFIELD)

#define MMAP_FOREACH_SAFE( var, head, field )				\
	_tMAP_FOREACH_SAFE( var, head, field,_MMAP_LFIELD )

#define MMAP_REMOVE( head, var, type, field )				\
	_tMAP_REMOVE( head, var, type, field,_MMAP_LFIELD )

#define MMAP_REMOVE_BY_KEY( head, key, type, field )			\
	_tMAP_REMOVE_BY_KEY( head, key, type, field,_MMAP_LFIELD )

#define MMAP_LOOKUP( head, key, var, field )				\
	_tMAP_LOOKUP( head, key, var, field,_MMAP_LFIELD )

#define MMAP_LOOKUP_FOREACH( head, key, var, field )			\
	_tMAP_LOOKUP_FOREACH( head, key, var, field,_MMAP_LFIELD )

#define MMAP_LOOKUP_FOREACH_SAFE( head, key, var, field )		\
	_tMAP_LOOKUP_FOREACH_SAFE( head, key, var, field,_MMAP_LFIELD )

#define MMAP_INSERT(head, key, var, field )				\
	_tMAP_INSERT(head, key, var, field,_MMAP_LFIELD )



#endif /* SYS_BDS_H */

--------------020003070002010103050303--



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?4694AC5C.9040107>