Subject: NetBSD 3.1 OpenSSL Padlock support
To: None <netbsd-users@netbsd.org, port-i386@netbsd.org>
From: Daniel de Kok <danieldk@pobox.com>
List: netbsd-users
Date: 01/09/2007 19:36:06
  This message is in MIME format.  The first part should be readable text,
  while the remaining parts are likely unreadable without MIME-aware tools.

--0-1446624538-1168367766=:2812
Content-Type: TEXT/PLAIN; charset=US-ASCII; format=flowed

Hi all,

Yesterday I bought a VIA Nehemiah box, partly because of its AES logic. It 
seems that OpenSSL with Padlock support has been imported in netbsd-4
and head, but I am running NetBSD 3.1 on this machine.

The attached (trivial) patch adds Padlock support from OpenSSL 0.9.8d to 
OpenSSL in NetBSD 3.1. Maybe it's useful to others too :). The benchmarks 
give nice results:

---
$ openssl engine padlock
(padlock) VIA PadLock (no-RNG, ACE)

$ openssl speed -evp aes-256-cbc
To get the most accurate results, try to run this
program when this computer is idle.
Doing aes-256-cbc for 3s on 16 size blocks: 883423 aes-256-cbc's in 2.97s
Doing aes-256-cbc for 3s on 64 size blocks: 234067 aes-256-cbc's in 2.98s
Doing aes-256-cbc for 3s on 256 size blocks: 59549 aes-256-cbc's in 2.98s
Doing aes-256-cbc for 3s on 1024 size blocks: 14949 aes-256-cbc's in 2.98s
Doing aes-256-cbc for 3s on 8192 size blocks: 1871 aes-256-cbc's in 2.98s
OpenSSL 0.9.7d 17 Mar 2004
built on: NetBSD 3.1
options:bn(32,32) md2(int) rc4(ptr,int) des(ptr,risc2,16,long) 
aes(partial) blow
fish(ptr2)
compiler: gcc version 3.3.3 (NetBSD nb3 20040520)
available timing options: USE_TOD HZ=100 [sysconf value]
timing function used: getrusage
The 'numbers' are in 1000s of bytes per second processed.
type             16 bytes     64 bytes    256 bytes   1024 bytes   8192 
bytes
aes-256-cbc       4755.78k     5028.69k     5116.56k     5137.66k 
5144.63k

$ openssl speed -evp aes-256-cbc -engine padlock
engine "padlock" set.
To get the most accurate results, try to run this
program when this computer is idle.
Doing aes-256-cbc for 3s on 16 size blocks: 6041611 aes-256-cbc's in 2.97s
Doing aes-256-cbc for 3s on 64 size blocks: 4866167 aes-256-cbc's in 2.95s
Doing aes-256-cbc for 3s on 256 size blocks: 2794934 aes-256-cbc's in 
2.98s
Doing aes-256-cbc for 3s on 1024 size blocks: 1032627 aes-256-cbc's in 
2.98s
Doing aes-256-cbc for 3s on 8192 size blocks: 149950 aes-256-cbc's in 
2.98s
OpenSSL 0.9.7d 17 Mar 2004
built on: NetBSD 3.1
options:bn(32,32) md2(int) rc4(ptr,int) des(ptr,risc2,16,long) 
aes(partial) blow
fish(ptr2)
compiler: gcc version 3.3.3 (NetBSD nb3 20040520)
available timing options: USE_TOD HZ=100 [sysconf value]
timing function used: getrusage
The 'numbers' are in 1000s of bytes per second processed.
type             16 bytes     64 bytes    256 bytes   1024 bytes   8192 
bytes
aes-256-cbc      32526.16k   105648.51k   240187.07k   354907.52k 
412312.13k
---

(The RNG code is disabled by default in the upstream code, see the code 
comments for more information.)

-- Daniel
--0-1446624538-1168367766=:2812
Content-Type: TEXT/PLAIN; charset=US-ASCII; name=netbsd31-openssl-padlock.c
Content-Transfer-Encoding: BASE64
Content-ID: <Pine.NEB.4.64.0701091936060.2812@liza.taickim.net>
Content-Description: 
Content-Disposition: attachment; filename=netbsd31-openssl-padlock.c

SW5kZXg6IGxpYi9saWJjcnlwdG8vZW5naW5lLmluYw0KPT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PQ0KUkNTIGZpbGU6IC9jdnNyb290L3NyYy9saWIvbGliY3J5
cHRvL2VuZ2luZS5pbmMsdg0KcmV0cmlldmluZyByZXZpc2lvbiAxLjENCmRp
ZmYgLXUgLXIxLjEgZW5naW5lLmluYw0KLS0tIGxpYi9saWJjcnlwdG8vZW5n
aW5lLmluYwkyNCBKdWwgMjAwMyAxNDoxNjozMiAtMDAwMAkxLjENCisrKyBs
aWIvbGliY3J5cHRvL2VuZ2luZS5pbmMJOSBKYW4gMjAwNyAxMDoxNTozMyAt
MDAwMA0KQEAgLTE0LDQgKzE0LDUgQEANCiAJdGJfcnNhLmMgdGJfZHNhLmMg
dGJfZGguYyB0Yl9yYW5kLmMgdGJfY2lwaGVyLmMgdGJfZGlnZXN0LmMgXA0K
IAllbmdfb3BlbnNzbC5jIGVuZ19keW4uYyBlbmdfY25mLmMgXA0KIAlod19h
dGFsbGEuYyBod19jc3dpZnQuYyBod19uY2lwaGVyLmMgaHdfbnVyb24uYyBo
d191YnNlYy5jIFwNCi0JaHdfY3J5cHRvZGV2LmMgaHdfYWVwLmMgaHdfc3Vy
ZXdhcmUuYyBod180NzU4X2NjYS5jDQorCWh3X2NyeXB0b2Rldi5jIGh3X2Fl
cC5jIGh3X3N1cmV3YXJlLmMgaHdfNDc1OF9jY2EuYyBcDQorCWh3X3BhZGxv
Y2suYw0KSW5kZXg6IGNyeXB0by9kaXN0L29wZW5zc2wvY3J5cHRvL2VuZ2lu
ZS9NYWtlZmlsZS5zc2wNCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0NClJDUyBm
aWxlOiAvY3Zzcm9vdC9zcmMvY3J5cHRvL2Rpc3Qvb3BlbnNzbC9jcnlwdG8v
ZW5naW5lL0F0dGljL01ha2VmaWxlLnNzbCx2DQpyZXRyaWV2aW5nIHJldmlz
aW9uIDEuMS4xLjINCmRpZmYgLXUgLXIxLjEuMS4yIE1ha2VmaWxlLnNzbA0K
LS0tIGNyeXB0by9kaXN0L29wZW5zc2wvY3J5cHRvL2VuZ2luZS9NYWtlZmls
ZS5zc2wJMjAgTWFyIDIwMDQgMDQ6MjI6NTQgLTAwMDAJMS4xLjEuMg0KKysr
IGNyeXB0by9kaXN0L29wZW5zc2wvY3J5cHRvL2VuZ2luZS9NYWtlZmlsZS5z
c2wJOSBKYW4gMjAwNyAxMDoxNTozNCAtMDAwMA0KQEAgLTI4LDEzICsyOCwx
NSBAQA0KIAl0Yl9yc2EuYyB0Yl9kc2EuYyB0Yl9kaC5jIHRiX3JhbmQuYyB0
Yl9jaXBoZXIuYyB0Yl9kaWdlc3QuYyBcDQogCWVuZ19vcGVuc3NsLmMgZW5n
X2R5bi5jIGVuZ19jbmYuYyBcDQogCWh3X2F0YWxsYS5jIGh3X2Nzd2lmdC5j
IGh3X25jaXBoZXIuYyBod19udXJvbi5jIGh3X3Vic2VjLmMgXA0KLQlod19j
cnlwdG9kZXYuYyBod19hZXAuYyBod19zdXJld2FyZS5jIGh3XzQ3NThfY2Nh
LmMNCisJaHdfY3J5cHRvZGV2LmMgaHdfYWVwLmMgaHdfc3VyZXdhcmUuYyBo
d180NzU4X2NjYS5jIFwNCisJaHdfcGFkbG9jay5jDQogTElCT0JKPSBlbmdf
ZXJyLm8gZW5nX2xpYi5vIGVuZ19saXN0Lm8gZW5nX2luaXQubyBlbmdfY3Ry
bC5vIFwNCiAJZW5nX3RhYmxlLm8gZW5nX3BrZXkubyBlbmdfZmF0Lm8gZW5n
X2FsbC5vIFwNCiAJdGJfcnNhLm8gdGJfZHNhLm8gdGJfZGgubyB0Yl9yYW5k
Lm8gdGJfY2lwaGVyLm8gdGJfZGlnZXN0Lm8gXA0KIAllbmdfb3BlbnNzbC5v
IGVuZ19keW4ubyBlbmdfY25mLm8gXA0KIAlod19hdGFsbGEubyBod19jc3dp
ZnQubyBod19uY2lwaGVyLm8gaHdfbnVyb24ubyBod191YnNlYy5vIFwNCi0J
aHdfY3J5cHRvZGV2Lm8gaHdfYWVwLm8gaHdfc3VyZXdhcmUubyBod180NzU4
X2NjYS5vDQorCWh3X2NyeXB0b2Rldi5vIGh3X2FlcC5vIGh3X3N1cmV3YXJl
Lm8gaHdfNDc1OF9jY2EubyBcDQorCWh3X3BhZGxvY2subw0KIA0KIFNSQz0g
JChMSUJTUkMpDQogDQpJbmRleDogY3J5cHRvL2Rpc3Qvb3BlbnNzbC9jcnlw
dG8vZW5naW5lL2VuZ19hbGwuYw0KPT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQ0K
UkNTIGZpbGU6IC9jdnNyb290L3NyYy9jcnlwdG8vZGlzdC9vcGVuc3NsL2Ny
eXB0by9lbmdpbmUvZW5nX2FsbC5jLHYNCnJldHJpZXZpbmcgcmV2aXNpb24g
MS4yDQpkaWZmIC11IC1yMS4yIGVuZ19hbGwuYw0KLS0tIGNyeXB0by9kaXN0
L29wZW5zc2wvY3J5cHRvL2VuZ2luZS9lbmdfYWxsLmMJMjAgTm92IDIwMDMg
MDA6NTU6NTEgLTAwMDAJMS4yDQorKysgY3J5cHRvL2Rpc3Qvb3BlbnNzbC9j
cnlwdG8vZW5naW5lL2VuZ19hbGwuYwk5IEphbiAyMDA3IDEwOjE1OjM0IC0w
MDAwDQpAQCAtOTgsNiArOTgsOSBAQA0KICNpZiBkZWZpbmVkKF9fT3BlbkJT
RF9fKSB8fCBkZWZpbmVkKF9fRnJlZUJTRF9fKSB8fCBkZWZpbmVkKF9fTmV0
QlNEX18pDQogCUVOR0lORV9sb2FkX2NyeXB0b2RldigpOw0KICNlbmRpZg0K
KyNpZm5kZWYgT1BFTlNTTF9OT19IV19QQURMT0NLDQorCUVOR0lORV9sb2Fk
X3BhZGxvY2soKTsNCisjZW5kaWYNCiAjZW5kaWYNCiAJfQ0KIA0KSW5kZXg6
IGNyeXB0by9kaXN0L29wZW5zc2wvY3J5cHRvL2VuZ2luZS9lbmdpbmUuaA0K
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PQ0KUkNTIGZpbGU6IC9jdnNyb290L3Ny
Yy9jcnlwdG8vZGlzdC9vcGVuc3NsL2NyeXB0by9lbmdpbmUvZW5naW5lLmgs
dg0KcmV0cmlldmluZyByZXZpc2lvbiAxLjQNCmRpZmYgLXUgLXIxLjQgZW5n
aW5lLmgNCi0tLSBjcnlwdG8vZGlzdC9vcGVuc3NsL2NyeXB0by9lbmdpbmUv
ZW5naW5lLmgJMjAgTWFyIDIwMDQgMDQ6MzI6MzUgLTAwMDAJMS40DQorKysg
Y3J5cHRvL2Rpc3Qvb3BlbnNzbC9jcnlwdG8vZW5naW5lL2VuZ2luZS5oCTkg
SmFuIDIwMDcgMTA6MTU6MzQgLTAwMDANCkBAIC0yOTIsNiArMjkyLDcgQEAN
CiB2b2lkIEVOR0lORV9sb2FkX2F0YWxsYSh2b2lkKTsNCiB2b2lkIEVOR0lO
RV9sb2FkX251cm9uKHZvaWQpOw0KIHZvaWQgRU5HSU5FX2xvYWRfdWJzZWMo
dm9pZCk7DQordm9pZCBFTkdJTkVfbG9hZF9wYWRsb2NrKHZvaWQpOw0KIHZv
aWQgRU5HSU5FX2xvYWRfYWVwKHZvaWQpOw0KIHZvaWQgRU5HSU5FX2xvYWRf
c3VyZXdhcmUodm9pZCk7DQogdm9pZCBFTkdJTkVfbG9hZF80NzU4Y2NhKHZv
aWQpOw0KSW5kZXg6IGNyeXB0by9kaXN0L29wZW5zc2wvY3J5cHRvL2VuZ2lu
ZS9od19wYWRsb2NrLmMNCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0NClJDUyBm
aWxlOiBjcnlwdG8vZGlzdC9vcGVuc3NsL2NyeXB0by9lbmdpbmUvaHdfcGFk
bG9jay5jDQpkaWZmIC1OIGNyeXB0by9kaXN0L29wZW5zc2wvY3J5cHRvL2Vu
Z2luZS9od19wYWRsb2NrLmMNCi0tLSAvZGV2L251bGwJMSBKYW4gMTk3MCAw
MDowMDowMCAtMDAwMA0KKysrIGNyeXB0by9kaXN0L29wZW5zc2wvY3J5cHRv
L2VuZ2luZS9od19wYWRsb2NrLmMJOSBKYW4gMjAwNyAxMDoxODo1NSAtMDAw
MA0KQEAgLTAsMCArMSwxMjE2IEBADQorLyogDQorICogU3VwcG9ydCBmb3Ig
VklBIFBhZExvY2sgQWR2YW5jZWQgQ3J5cHRvZ3JhcGh5IEVuZ2luZSAoQUNF
KQ0KKyAqIFdyaXR0ZW4gYnkgTWljaGFsIEx1ZHZpZyA8bWljaGFsQGxvZ2l4
LmN6Pg0KKyAqICAgICAgICAgICAgaHR0cDovL3d3dy5sb2dpeC5jei9taWNo
YWwNCisgKg0KKyAqIEJpZyB0aGFua3MgdG8gQW5keSBQb2x5YWtvdiBmb3Ig
YSBoZWxwIHdpdGggb3B0aW1pemF0aW9uLCANCisgKiBhc3NlbWJsZXIgZml4
ZXMsIHBvcnQgdG8gTVMgV2luZG93cyBhbmQgYSBsb3Qgb2Ygb3RoZXIgDQor
ICogdmFsdWFibGUgd29yayBvbiB0aGlzIGVuZ2luZSENCisgKi8NCisNCisv
KiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PQ0KKyAqIENvcHlyaWdodCAoYykg
MTk5OS0yMDAxIFRoZSBPcGVuU1NMIFByb2plY3QuICBBbGwgcmlnaHRzIHJl
c2VydmVkLg0KKyAqDQorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBz
b3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0DQorICog
bW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhl
IGZvbGxvd2luZyBjb25kaXRpb25zDQorICogYXJlIG1ldDoNCisgKg0KKyAq
IDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFp
biB0aGUgYWJvdmUgY29weXJpZ2h0DQorICogICAgbm90aWNlLCB0aGlzIGxp
c3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVy
Lg0KKyAqDQorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3Jt
IG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQNCisgKiAgICBu
b3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93
aW5nIGRpc2NsYWltZXIgaW4NCisgKiAgICB0aGUgZG9jdW1lbnRhdGlvbiBh
bmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlDQorICog
ICAgZGlzdHJpYnV0aW9uLg0KKyAqDQorICogMy4gQWxsIGFkdmVydGlzaW5n
IG1hdGVyaWFscyBtZW50aW9uaW5nIGZlYXR1cmVzIG9yIHVzZSBvZiB0aGlz
DQorICogICAgc29mdHdhcmUgbXVzdCBkaXNwbGF5IHRoZSBmb2xsb3dpbmcg
YWNrbm93bGVkZ21lbnQ6DQorICogICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRl
cyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlIE9wZW5TU0wgUHJvamVjdA0K
KyAqICAgIGZvciB1c2UgaW4gdGhlIE9wZW5TU0wgVG9vbGtpdC4gKGh0dHA6
Ly93d3cuT3BlblNTTC5vcmcvKSINCisgKg0KKyAqIDQuIFRoZSBuYW1lcyAi
T3BlblNTTCBUb29sa2l0IiBhbmQgIk9wZW5TU0wgUHJvamVjdCIgbXVzdCBu
b3QgYmUgdXNlZCB0bw0KKyAqICAgIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9k
dWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0DQorICog
ICAgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLiBGb3Igd3JpdHRlbiBwZXJt
aXNzaW9uLCBwbGVhc2UgY29udGFjdA0KKyAqICAgIGxpY2Vuc2luZ0BPcGVu
U1NMLm9yZy4NCisgKg0KKyAqIDUuIFByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0
aGlzIHNvZnR3YXJlIG1heSBub3QgYmUgY2FsbGVkICJPcGVuU1NMIg0KKyAq
ICAgIG5vciBtYXkgIk9wZW5TU0wiIGFwcGVhciBpbiB0aGVpciBuYW1lcyB3
aXRob3V0IHByaW9yIHdyaXR0ZW4NCisgKiAgICBwZXJtaXNzaW9uIG9mIHRo
ZSBPcGVuU1NMIFByb2plY3QuDQorICoNCisgKiA2LiBSZWRpc3RyaWJ1dGlv
bnMgb2YgYW55IGZvcm0gd2hhdHNvZXZlciBtdXN0IHJldGFpbiB0aGUgZm9s
bG93aW5nDQorICogICAgYWNrbm93bGVkZ21lbnQ6DQorICogICAgIlRoaXMg
cHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlIE9w
ZW5TU0wgUHJvamVjdA0KKyAqICAgIGZvciB1c2UgaW4gdGhlIE9wZW5TU0wg
VG9vbGtpdCAoaHR0cDovL3d3dy5PcGVuU1NMLm9yZy8pIg0KKyAqDQorICog
VEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgT3BlblNTTCBQUk9K
RUNUIGBgQVMgSVMnJyBBTkQgQU5ZDQorICogRVhQUkVTU0VEIE9SIElNUExJ
RUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8s
IFRIRQ0KKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJ
VFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUg0KKyAqIFBVUlBPU0Ug
QVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgT3BlblNT
TCBQUk9KRUNUIE9SDQorICogSVRTIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUg
Rk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLA0KKyAqIFNQ
RUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJ
TkNMVURJTkcsIEJVVA0KKyAqIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVO
VCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOw0KKyAqIExPU1Mg
T0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJV
UFRJT04pDQorICogSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkg
T0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULA0KKyAqIFNUUklD
VCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9S
IE9USEVSV0lTRSkNCisgKiBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRI
RSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEDQorICog
T0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLg0KKyAqID09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09DQorICoNCisgKiBUaGlzIHByb2R1Y3QgaW5j
bHVkZXMgY3J5cHRvZ3JhcGhpYyBzb2Z0d2FyZSB3cml0dGVuIGJ5IEVyaWMg
WW91bmcNCisgKiAoZWF5QGNyeXB0c29mdC5jb20pLiAgVGhpcyBwcm9kdWN0
IGluY2x1ZGVzIHNvZnR3YXJlIHdyaXR0ZW4gYnkgVGltDQorICogSHVkc29u
ICh0amhAY3J5cHRzb2Z0LmNvbSkuDQorICoNCisgKi8NCisNCisNCisjaW5j
bHVkZSA8c3RkaW8uaD4NCisjaW5jbHVkZSA8c3RyaW5nLmg+DQorDQorI2lu
Y2x1ZGUgPG9wZW5zc2wvb3BlbnNzbGNvbmYuaD4NCisjaW5jbHVkZSA8b3Bl
bnNzbC9jcnlwdG8uaD4NCisjaW5jbHVkZSA8b3BlbnNzbC9kc28uaD4NCisj
aW5jbHVkZSA8b3BlbnNzbC9lbmdpbmUuaD4NCisjaW5jbHVkZSA8b3BlbnNz
bC9ldnAuaD4NCisjaWZuZGVmIE9QRU5TU0xfTk9fQUVTDQorI2luY2x1ZGUg
PG9wZW5zc2wvYWVzLmg+DQorI2VuZGlmDQorI2luY2x1ZGUgPG9wZW5zc2wv
cmFuZC5oPg0KKyNpbmNsdWRlIDxvcGVuc3NsL2Vyci5oPg0KKw0KKyNpZm5k
ZWYgT1BFTlNTTF9OT19IVw0KKyNpZm5kZWYgT1BFTlNTTF9OT19IV19QQURM
T0NLDQorDQorLyogQXR0ZW1wdCB0byBoYXZlIGEgc2luZ2xlIHNvdXJjZSBm
b3IgYm90aCAwLjkuNyBhbmQgMC45LjggOi0pICovDQorI2lmIChPUEVOU1NM
X1ZFUlNJT05fTlVNQkVSID49IDB4MDA5MDgwMDBMKQ0KKyMgIGlmbmRlZiBP
UEVOU1NMX05PX0RZTkFNSUNfRU5HSU5FDQorIyAgICBkZWZpbmUgRFlOQU1J
Q19FTkdJTkUNCisjICBlbmRpZg0KKyNlbGlmIChPUEVOU1NMX1ZFUlNJT05f
TlVNQkVSID49IDB4MDA5MDcwMDBMKQ0KKyMgIGlmZGVmIEVOR0lORV9EWU5B
TUlDX1NVUFBPUlQNCisjICAgIGRlZmluZSBEWU5BTUlDX0VOR0lORQ0KKyMg
IGVuZGlmDQorI2Vsc2UNCisjICBlcnJvciAiT25seSBPcGVuU1NMID49IDAu
OS43IGlzIHN1cHBvcnRlZCINCisjZW5kaWYNCisNCisvKiBWSUEgUGFkTG9j
ayBBRVMgaXMgYXZhaWxhYmxlICpPTkxZKiBvbiBzb21lIHg4NiBDUFVzLg0K
KyAgIE5vdCBvbmx5IHRoYXQgaXQgZG9lc24ndCBleGlzdCBlbHNld2hlcmUs
IGJ1dCBpdA0KKyAgIGV2ZW4gY2FuJ3QgYmUgY29tcGlsZWQgb24gb3RoZXIg
cGxhdGZvcm1zIQ0KKyANCisgICBJbiBhZGRpdGlvbiwgYmVjYXVzZSBvZiB0
aGUgaGVhdnkgdXNlIG9mIGlubGluZSBhc3NlbWJsZXIsDQorICAgY29tcGls
ZXIgY2hvaWNlIGlzIGxpbWl0ZWQgdG8gR0NDIGFuZCBNaWNyb3NvZnQgQy4g
Ki8NCisjdW5kZWYgQ09NUElMRV9IV19QQURMT0NLDQorI2lmICFkZWZpbmVk
KEkzODZfT05MWSkgJiYgIWRlZmluZWQoT1BFTlNTTF9OT19JTkxJTkVfQVNN
KQ0KKyMgaWYgKGRlZmluZWQoX19HTlVDX18pICYmIChkZWZpbmVkKF9faTM4
Nl9fKSB8fCBkZWZpbmVkKF9faTM4NikpKSB8fCBcDQorICAgICAoZGVmaW5l
ZChfTVNDX1ZFUikgJiYgZGVmaW5lZChfTV9JWDg2KSkNCisjICBkZWZpbmUg
Q09NUElMRV9IV19QQURMT0NLDQorc3RhdGljIEVOR0lORSAqRU5HSU5FX3Bh
ZGxvY2sgKHZvaWQpOw0KKyMgZW5kaWYNCisjZW5kaWYNCisNCit2b2lkIEVO
R0lORV9sb2FkX3BhZGxvY2sgKHZvaWQpDQorew0KKy8qIE9uIG5vbi14ODYg
Q1BVcyBpdCBqdXN0IHJldHVybnMuICovDQorI2lmZGVmIENPTVBJTEVfSFdf
UEFETE9DSw0KKwlFTkdJTkUgKnRvYWRkID0gRU5HSU5FX3BhZGxvY2sgKCk7
DQorCWlmICghdG9hZGQpIHJldHVybjsNCisJRU5HSU5FX2FkZCAodG9hZGQp
Ow0KKwlFTkdJTkVfZnJlZSAodG9hZGQpOw0KKwlFUlJfY2xlYXJfZXJyb3Ig
KCk7DQorI2VuZGlmDQorfQ0KKw0KKyNpZmRlZiBDT01QSUxFX0hXX1BBRExP
Q0sNCisvKiBXZSBkbyB0aGVzZSBpbmNsdWRlcyBoZXJlIHRvIGF2b2lkIGhl
YWRlciBwcm9ibGVtcyBvbiBwbGF0Zm9ybXMgdGhhdA0KKyAgIGRvIG5vdCBo
YXZlIHRoZSBWSUEgcGFkbG9jayBhbnl3YXkuLi4gKi8NCisjaWZkZWYgX01T
Q19WRVINCisjIGluY2x1ZGUgPG1hbGxvYy5oPg0KKyMgZGVmaW5lIGFsbG9j
YSBfYWxsb2NhDQorI2Vsc2UNCisjIGluY2x1ZGUgPHN0ZGxpYi5oPg0KKyNl
bmRpZg0KKw0KKy8qIEZ1bmN0aW9uIGZvciBFTkdJTkUgZGV0ZWN0aW9uIGFu
ZCBjb250cm9sICovDQorc3RhdGljIGludCBwYWRsb2NrX2F2YWlsYWJsZSh2
b2lkKTsNCitzdGF0aWMgaW50IHBhZGxvY2tfaW5pdChFTkdJTkUgKmUpOw0K
Kw0KKy8qIFJORyBTdHVmZiAqLw0KK3N0YXRpYyBSQU5EX01FVEhPRCBwYWRs
b2NrX3JhbmQ7DQorDQorLyogQ2lwaGVyIFN0dWZmICovDQorI2lmbmRlZiBP
UEVOU1NMX05PX0FFUw0KK3N0YXRpYyBpbnQgcGFkbG9ja19jaXBoZXJzKEVO
R0lORSAqZSwgY29uc3QgRVZQX0NJUEhFUiAqKmNpcGhlciwgY29uc3QgaW50
ICoqbmlkcywgaW50IG5pZCk7DQorI2VuZGlmDQorDQorLyogRW5naW5lIG5h
bWVzICovDQorc3RhdGljIGNvbnN0IGNoYXIgKnBhZGxvY2tfaWQgPSAicGFk
bG9jayI7DQorc3RhdGljIGNoYXIgcGFkbG9ja19uYW1lWzEwMF07DQorDQor
LyogQXZhaWxhYmxlIGZlYXR1cmVzICovDQorc3RhdGljIGludCBwYWRsb2Nr
X3VzZV9hY2UgPSAwOwkvKiBBZHZhbmNlZCBDcnlwdG9ncmFwaHkgRW5naW5l
ICovDQorc3RhdGljIGludCBwYWRsb2NrX3VzZV9ybmcgPSAwOwkvKiBSYW5k
b20gTnVtYmVyIEdlbmVyYXRvciAqLw0KKyNpZm5kZWYgT1BFTlNTTF9OT19B
RVMNCitzdGF0aWMgaW50IHBhZGxvY2tfYWVzX2FsaWduX3JlcXVpcmVkID0g
MTsNCisjZW5kaWYNCisNCisvKiA9PT09PSBFbmdpbmUgIm1hbmFnZW1lbnQi
IGZ1bmN0aW9ucyA9PT09PSAqLw0KKw0KKy8qIFByZXBhcmUgdGhlIEVOR0lO
RSBzdHJ1Y3R1cmUgZm9yIHJlZ2lzdHJhdGlvbiAqLw0KK3N0YXRpYyBpbnQN
CitwYWRsb2NrX2JpbmRfaGVscGVyKEVOR0lORSAqZSkNCit7DQorCS8qIENo
ZWNrIGF2YWlsYWJsZSBmZWF0dXJlcyAqLw0KKwlwYWRsb2NrX2F2YWlsYWJs
ZSgpOw0KKw0KKyNpZiAxCS8qIGRpc2FibGUgUk5HIGZvciBub3csIHNlZSBj
b21tZW50YXJ5IGluIHZpY2luaXR5IG9mIFJORyBjb2RlICovDQorCXBhZGxv
Y2tfdXNlX3JuZz0wOw0KKyNlbmRpZg0KKw0KKwkvKiBHZW5lcmF0ZSBhIG5p
Y2UgZW5naW5lIG5hbWUgd2l0aCBhdmFpbGFibGUgZmVhdHVyZXMgKi8NCisJ
QklPX3NucHJpbnRmKHBhZGxvY2tfbmFtZSwgc2l6ZW9mKHBhZGxvY2tfbmFt
ZSksDQorCQkiVklBIFBhZExvY2sgKCVzLCAlcykiLCANCisJCSBwYWRsb2Nr
X3VzZV9ybmcgPyAiUk5HIiA6ICJuby1STkciLA0KKwkJIHBhZGxvY2tfdXNl
X2FjZSA/ICJBQ0UiIDogIm5vLUFDRSIpOw0KKw0KKwkvKiBSZWdpc3RlciBl
dmVyeXRoaW5nIG9yIHJldHVybiB3aXRoIGFuIGVycm9yICovIA0KKwlpZiAo
IUVOR0lORV9zZXRfaWQoZSwgcGFkbG9ja19pZCkgfHwNCisJICAgICFFTkdJ
TkVfc2V0X25hbWUoZSwgcGFkbG9ja19uYW1lKSB8fA0KKw0KKwkgICAgIUVO
R0lORV9zZXRfaW5pdF9mdW5jdGlvbihlLCBwYWRsb2NrX2luaXQpIHx8DQor
I2lmbmRlZiBPUEVOU1NMX05PX0FFUw0KKwkgICAgKHBhZGxvY2tfdXNlX2Fj
ZSAmJiAhRU5HSU5FX3NldF9jaXBoZXJzIChlLCBwYWRsb2NrX2NpcGhlcnMp
KSB8fA0KKyNlbmRpZg0KKwkgICAgKHBhZGxvY2tfdXNlX3JuZyAmJiAhRU5H
SU5FX3NldF9SQU5EIChlLCAmcGFkbG9ja19yYW5kKSkpIHsNCisJCXJldHVy
biAwOw0KKwl9DQorDQorCS8qIEV2ZXJ5dGhpbmcgbG9va3MgZ29vZCAqLw0K
KwlyZXR1cm4gMTsNCit9DQorDQorLyogQ29uc3RydWN0b3IgKi8NCitzdGF0
aWMgRU5HSU5FICoNCitFTkdJTkVfcGFkbG9jayh2b2lkKQ0KK3sNCisJRU5H
SU5FICplbmcgPSBFTkdJTkVfbmV3KCk7DQorDQorCWlmICghZW5nKSB7DQor
CQlyZXR1cm4gTlVMTDsNCisJfQ0KKw0KKwlpZiAoIXBhZGxvY2tfYmluZF9o
ZWxwZXIoZW5nKSkgew0KKwkJRU5HSU5FX2ZyZWUoZW5nKTsNCisJCXJldHVy
biBOVUxMOw0KKwl9DQorDQorCXJldHVybiBlbmc7DQorfQ0KKw0KKy8qIENo
ZWNrIGF2YWlsYWJpbGl0eSBvZiB0aGUgZW5naW5lICovDQorc3RhdGljIGlu
dA0KK3BhZGxvY2tfaW5pdChFTkdJTkUgKmUpDQorew0KKwlyZXR1cm4gKHBh
ZGxvY2tfdXNlX3JuZyB8fCBwYWRsb2NrX3VzZV9hY2UpOw0KK30NCisNCisv
KiBUaGlzIHN0dWZmIGlzIG5lZWRlZCBpZiB0aGlzIEVOR0lORSBpcyBiZWlu
ZyBjb21waWxlZCBpbnRvIGEgc2VsZi1jb250YWluZWQNCisgKiBzaGFyZWQt
bGlicmFyeS4NCisgKi8NCisjaWZkZWYgRFlOQU1JQ19FTkdJTkUNCitzdGF0
aWMgaW50DQorcGFkbG9ja19iaW5kX2ZuKEVOR0lORSAqZSwgY29uc3QgY2hh
ciAqaWQpDQorew0KKwlpZiAoaWQgJiYgKHN0cmNtcChpZCwgcGFkbG9ja19p
ZCkgIT0gMCkpIHsNCisJCXJldHVybiAwOw0KKwl9DQorDQorCWlmICghcGFk
bG9ja19iaW5kX2hlbHBlcihlKSkgIHsNCisJCXJldHVybiAwOw0KKwl9DQor
DQorCXJldHVybiAxOw0KK30NCisNCitJTVBMRU1FTlRfRFlOQU1JQ19DSEVD
S19GTiAoKTsNCitJTVBMRU1FTlRfRFlOQU1JQ19CSU5EX0ZOIChwYWRsb2Nr
X2JpbmRfZm4pOw0KKyNlbmRpZiAvKiBEWU5BTUlDX0VOR0lORSAqLw0KKw0K
Ky8qID09PT09IEhlcmUgY29tZXMgdGhlICJyZWFsIiBlbmdpbmUgPT09PT0g
Ki8NCisNCisjaWZuZGVmIE9QRU5TU0xfTk9fQUVTDQorLyogU29tZSBBRVMt
cmVsYXRlZCBjb25zdGFudHMgKi8NCisjZGVmaW5lIEFFU19CTE9DS19TSVpF
CQkxNg0KKyNkZWZpbmUgQUVTX0tFWV9TSVpFXzEyOAkxNg0KKyNkZWZpbmUg
QUVTX0tFWV9TSVpFXzE5MgkyNA0KKyNkZWZpbmUgQUVTX0tFWV9TSVpFXzI1
NgkzMg0KKw0KKy8qIEhlcmUgd2Ugc3RvcmUgdGhlIHN0YXR1cyBpbmZvcm1h
dGlvbiByZWxldmFudCB0byB0aGUgDQorICAgY3VycmVudCBjb250ZXh0LiAq
Lw0KKy8qIEJJRyBGQVQgV0FSTklORzoNCisgKiAJSW5saW5lIGFzc2VtYmxl
ciBpbiBQQURMT0NLX1hDUllQVF9BU00oKQ0KKyAqIAlkZXBlbmRzIG9uIHRo
ZSBvcmRlciBvZiBpdGVtcyBpbiB0aGlzIHN0cnVjdHVyZS4NCisgKiAJRG9u
J3QgYmxpbmRseSBtb2RpZnksIHJlb3JkZXIsIGV0YyENCisgKi8NCitzdHJ1
Y3QgcGFkbG9ja19jaXBoZXJfZGF0YQ0KK3sNCisJdW5zaWduZWQgY2hhciBp
dltBRVNfQkxPQ0tfU0laRV07CS8qIEluaXRpYWxpemF0aW9uIHZlY3RvciAq
Lw0KKwl1bmlvbiB7CXVuc2lnbmVkIGludCBwYWRbNF07DQorCQlzdHJ1Y3Qg
ew0KKwkJCWludCByb3VuZHM6NDsNCisJCQlpbnQgZGdzdDoxOwkvKiBuL2Eg
aW4gQzMgKi8NCisJCQlpbnQgYWxpZ246MTsJLyogbi9hIGluIEMzICovDQor
CQkJaW50IGNpcGhyOjE7CS8qIG4vYSBpbiBDMyAqLw0KKwkJCXVuc2lnbmVk
IGludCBrZXlnZW46MTsNCisJCQlpbnQgaW50ZXJtOjE7DQorCQkJdW5zaWdu
ZWQgaW50IGVuY2RlYzoxOw0KKwkJCWludCBrc2l6ZToyOw0KKwkJfSBiOw0K
Kwl9IGN3b3JkOwkJLyogQ29udHJvbCB3b3JkICovDQorCUFFU19LRVkga3M7
CQkvKiBFbmNyeXB0aW9uIGtleSAqLw0KK307DQorDQorLyoNCisgKiBFc3Nl
bnRpYWxseSB0aGlzIHZhcmlhYmxlIGJlbG9uZ3MgaW4gdGhyZWFkIGxvY2Fs
IHN0b3JhZ2UuDQorICogSGF2aW5nIHRoaXMgdmFyaWFibGUgZ2xvYmFsIG9u
IHRoZSBvdGhlciBoYW5kIGNhbiBvbmx5IGNhdXNlDQorICogZmV3IGJvZ3Vz
IGtleSByZWxvYWRzIFtpZiBhbnkgYXQgYWxsIG9uIHNpbmdsZS1DUFUgc3lz
dGVtXSwNCisgKiBzbyB3ZSBhY2NlcHQgdGhlIHBlbmF0bHkuLi4NCisgKi8N
CitzdGF0aWMgdm9sYXRpbGUgc3RydWN0IHBhZGxvY2tfY2lwaGVyX2RhdGEg
KnBhZGxvY2tfc2F2ZWRfY29udGV4dDsNCisjZW5kaWYNCisNCisvKg0KKyAq
ID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT0NCisgKiBJbmxpbmUgYXNzZW1ibGVyIHNlY3Rpb24ocyku
DQorICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PQ0KKyAqIE9yZGVyIG9mIGFyZ3VtZW50cyBpcyBj
aG9zZW4gdG8gZmFjaWxpdGF0ZSBXaW5kb3dzIHBvcnQNCisgKiB1c2luZyBf
X2Zhc3RjYWxsIGNhbGxpbmcgY29udmVudGlvbi4gSWYgeW91IHdpc2ggdG8g
YWRkDQorICogbW9yZSByb3V0aW5lcywga2VlcCBpbiBtaW5kIHRoYXQgZmly
c3QgX19mYXN0Y2FsbA0KKyAqIGFyZ3VtZW50IGlzIHBhc3NlZCBpbiAlZWN4
IGFuZCBzZWNvbmQgLSBpbiAlZWR4Lg0KKyAqID09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0NCisgKi8N
CisjaWYgZGVmaW5lZChfX0dOVUNfXykgJiYgX19HTlVDX18+PTINCisvKg0K
KyAqIEFzIGZvciBleGNlc3NpdmUgInB1c2ggJWVieCIvInBvcCAlZWJ4IiBm
b3VuZCBhbGwgb3Zlci4NCisgKiBXaGVuIGdlbmVyYXRpbmcgcG9zaXRpb24t
aW5kZXBlbmRlbnQgY29kZSBHQ0Mgd29uJ3QgbGV0DQorICogdXMgdXNlICJi
IiBpbiBhc3NlbWJsZXIgdGVtcGxhdGVzIG5vciBldmVuIHJlc3BlY3QgImVi
eCINCisgKiBpbiAiY2xvYmJlciBkZXNjcmlwdGlvbi4iIFRoZXJlZm9yZSB0
aGUgdHJvdWJsZS4uLg0KKyAqLw0KKw0KKy8qIEhlbHBlciBmdW5jdGlvbiAt
IGNoZWNrIGlmIGEgQ1BVSUQgaW5zdHJ1Y3Rpb24NCisgICBpcyBhdmFpbGFi
bGUgb24gdGhpcyBDUFUgKi8NCitzdGF0aWMgaW50DQorcGFkbG9ja19pbnNu
X2NwdWlkX2F2YWlsYWJsZSh2b2lkKQ0KK3sNCisJaW50IHJlc3VsdCA9IC0x
Ow0KKw0KKwkvKiBXZSdyZSBjaGVja2luZyBpZiB0aGUgYml0ICMyMSBvZiBF
RkxBR1MgDQorCSAgIGNhbiBiZSB0b2dnbGVkLiBJZiB5ZXMgPSBDUFVJRCBp
cyBhdmFpbGFibGUuICovDQorCWFzbSB2b2xhdGlsZSAoDQorCQkicHVzaGZc
biINCisJCSJwb3BsICUlZWF4XG4iDQorCQkieG9ybCAkMHgyMDAwMDAsICUl
ZWF4XG4iDQorCQkibW92bCAlJWVheCwgJSVlY3hcbiINCisJCSJhbmRsICQw
eDIwMDAwMCwgJSVlY3hcbiINCisJCSJwdXNobCAlJWVheFxuIg0KKwkJInBv
cGZcbiINCisJCSJwdXNoZlxuIg0KKwkJInBvcGwgJSVlYXhcbiINCisJCSJh
bmRsICQweDIwMDAwMCwgJSVlYXhcbiINCisJCSJ4b3JsICUlZWF4LCAlJWVj
eFxuIg0KKwkJIm1vdmwgJSVlY3gsICUwXG4iDQorCQk6ICI9ciIgKHJlc3Vs
dCkgOiA6ICJlYXgiLCAiZWN4Iik7DQorCQ0KKwlyZXR1cm4gKHJlc3VsdCA9
PSAwKTsNCit9DQorDQorLyogTG9hZCBzdXBwb3J0ZWQgZmVhdHVyZXMgb2Yg
dGhlIENQVSB0byBzZWUgaWYNCisgICB0aGUgUGFkTG9jayBpcyBhdmFpbGFi
bGUuICovDQorc3RhdGljIGludA0KK3BhZGxvY2tfYXZhaWxhYmxlKHZvaWQp
DQorew0KKwljaGFyIHZlbmRvcl9zdHJpbmdbMTZdOw0KKwl1bnNpZ25lZCBp
bnQgZWF4LCBlZHg7DQorDQorCS8qIEZpcnN0IGNoZWNrIGlmIHRoZSBDUFVJ
RCBpbnN0cnVjdGlvbiBpcyBhdmFpbGFibGUgYXQgYWxsLi4uICovDQorCWlm
ICghIHBhZGxvY2tfaW5zbl9jcHVpZF9hdmFpbGFibGUoKSkNCisJCXJldHVy
biAwOw0KKw0KKwkvKiBBcmUgd2UgcnVubmluZyBvbiB0aGUgQ2VudGF1ciAo
VklBKSBDUFU/ICovDQorCWVheCA9IDB4MDAwMDAwMDA7DQorCXZlbmRvcl9z
dHJpbmdbMTJdID0gMDsNCisJYXNtIHZvbGF0aWxlICgNCisJCSJwdXNobAkl
JWVieFxuIg0KKwkJImNwdWlkXG4iDQorCQkibW92bAklJWVieCwoJSVlZGkp
XG4iDQorCQkibW92bAklJWVkeCw0KCUlZWRpKVxuIg0KKwkJIm1vdmwJJSVl
Y3gsOCglJWVkaSlcbiINCisJCSJwb3BsCSUlZWJ4Ig0KKwkJOiAiK2EiKGVh
eCkgOiAiRCIodmVuZG9yX3N0cmluZykgOiAiZWN4IiwgImVkeCIpOw0KKwlp
ZiAoc3RyY21wKHZlbmRvcl9zdHJpbmcsICJDZW50YXVySGF1bHMiKSAhPSAw
KQ0KKwkJcmV0dXJuIDA7DQorDQorCS8qIENoZWNrIGZvciBDZW50YXVyIEV4
dGVuZGVkIEZlYXR1cmUgRmxhZ3MgcHJlc2VuY2UgKi8NCisJZWF4ID0gMHhD
MDAwMDAwMDsNCisJYXNtIHZvbGF0aWxlICgicHVzaGwgJSVlYng7IGNwdWlk
OyBwb3BsCSUlZWJ4Ig0KKwkJOiAiK2EiKGVheCkgOiA6ICJlY3giLCAiZWR4
Iik7DQorCWlmIChlYXggPCAweEMwMDAwMDAxKQ0KKwkJcmV0dXJuIDA7DQor
DQorCS8qIFJlYWQgdGhlIENlbnRhdXIgRXh0ZW5kZWQgRmVhdHVyZSBGbGFn
cyAqLw0KKwllYXggPSAweEMwMDAwMDAxOw0KKwlhc20gdm9sYXRpbGUgKCJw
dXNobCAlJWVieDsgY3B1aWQ7IHBvcGwgJSVlYngiDQorCQk6ICIrYSIoZWF4
KSwgIj1kIihlZHgpIDogOiAiZWN4Iik7DQorDQorCS8qIEZpbGwgdXAgc29t
ZSBmbGFncyAqLw0KKwlwYWRsb2NrX3VzZV9hY2UgPSAoKGVkeCAmICgweDM8
PDYpKSA9PSAoMHgzPDw2KSk7DQorCXBhZGxvY2tfdXNlX3JuZyA9ICgoZWR4
ICYgKDB4Mzw8MikpID09ICgweDM8PDIpKTsNCisNCisJcmV0dXJuIHBhZGxv
Y2tfdXNlX2FjZSArIHBhZGxvY2tfdXNlX3JuZzsNCit9DQorDQorI2lmbmRl
ZiBPUEVOU1NMX05PX0FFUw0KKy8qIE91ciBvd24gaHRvbmwoKS9udG9obCgp
ICovDQorc3RhdGljIGlubGluZSB2b2lkDQorcGFkbG9ja19ic3dhcGwoQUVT
X0tFWSAqa3MpDQorew0KKwlzaXplX3QgaSA9IHNpemVvZihrcy0+cmRfa2V5
KS9zaXplb2Yoa3MtPnJkX2tleVswXSk7DQorCXVuc2lnbmVkIGludCAqa2V5
ID0ga3MtPnJkX2tleTsNCisNCisJd2hpbGUgKGktLSkgew0KKwkJYXNtIHZv
bGF0aWxlICgiYnN3YXBsICUwIiA6ICIrciIoKmtleSkpOw0KKwkJa2V5Kys7
DQorCX0NCit9DQorI2VuZGlmDQorDQorLyogRm9yY2Uga2V5IHJlbG9hZCBm
cm9tIG1lbW9yeSB0byB0aGUgQ1BVIG1pY3JvY29kZS4NCisgICBMb2FkaW5n
IEVGTEFHUyBmcm9tIHRoZSBzdGFjayBjbGVhcnMgRUZMQUdTWzMwXSANCisg
ICB3aGljaCBkb2VzIHRoZSB0cmljay4gKi8NCitzdGF0aWMgaW5saW5lIHZv
aWQNCitwYWRsb2NrX3JlbG9hZF9rZXkodm9pZCkNCit7DQorCWFzbSB2b2xh
dGlsZSAoInB1c2hmbDsgcG9wZmwiKTsNCit9DQorDQorI2lmbmRlZiBPUEVO
U1NMX05PX0FFUw0KKy8qDQorICogVGhpcyBpcyBoZXVyaXN0aWMga2V5IGNv
bnRleHQgdHJhY2luZy4gQXQgZmlyc3Qgb25lDQorICogYmVsaWV2ZXMgdGhh
dCBvbmUgc2hvdWxkIHVzZSBhdG9taWMgc3dhcCBpbnN0cnVjdGlvbnMsDQor
ICogYnV0IGl0J3Mgbm90IGFjdHVhbGx5IG5lY2Vzc2FyeS4gUG9pbnQgaXMg
dGhhdCBpZg0KKyAqIHBhZGxvY2tfc2F2ZWRfY29udGV4dCB3YXMgY2hhbmdl
ZCBieSBhbm90aGVyIHRocmVhZA0KKyAqIGFmdGVyIHdlJ3ZlIHJlYWQgaXQg
YW5kIGJlZm9yZSB3ZSBjb21wYXJlIGl0IHdpdGggY2RhdGEsDQorICogb3Vy
IGtleSAqc2hhbGwqIGJlIHJlbG9hZGVkIHVwb24gdGhyZWFkIGNvbnRleHQg
c3dpdGNoDQorICogYW5kIHdlIGFyZSB0aGVyZWZvcmUgc2V0IGluIGVpdGhl
ciBjYXNlLi4uDQorICovDQorc3RhdGljIGlubGluZSB2b2lkDQorcGFkbG9j
a192ZXJpZnlfY29udGV4dChzdHJ1Y3QgcGFkbG9ja19jaXBoZXJfZGF0YSAq
Y2RhdGEpDQorew0KKwlhc20gdm9sYXRpbGUgKA0KKwkicHVzaGZsXG4iDQor
IglidGwJJDMwLCglJWVzcClcbiINCisiCWpuYwkxZlxuIg0KKyIJY21wbAkl
MiwlMVxuIg0KKyIJamUJMWZcbiINCisiCXBvcGZsXG4iDQorIglzdWJsCSQ0
LCUlZXNwXG4iDQorIjE6CWFkZGwJJDQsJSVlc3BcbiINCisiCW1vdmwJJTIs
JTAiDQorCToiK20iKHBhZGxvY2tfc2F2ZWRfY29udGV4dCkNCisJOiAiciIo
cGFkbG9ja19zYXZlZF9jb250ZXh0KSwgInIiKGNkYXRhKSA6ICJjYyIpOw0K
K30NCisNCisvKiBUZW1wbGF0ZSBmb3IgcGFkbG9ja194Y3J5cHRfKiBtb2Rl
cyAqLw0KKy8qIEJJRyBGQVQgV0FSTklORzogDQorICogCVRoZSBvZmZzZXRz
IHVzZWQgd2l0aCAnbGVhbCcgaW5zdHJ1Y3Rpb25zDQorICogCWRlc2NyaWJl
IGl0ZW1zIG9mIHRoZSAncGFkbG9ja19jaXBoZXJfZGF0YScNCisgKiAJc3Ry
dWN0dXJlLg0KKyAqLw0KKyNkZWZpbmUgUEFETE9DS19YQ1JZUFRfQVNNKG5h
bWUscmVwX3hjcnlwdCkJXA0KK3N0YXRpYyBpbmxpbmUgdm9pZCAqbmFtZShz
aXplX3QgY250LAkJXA0KKwlzdHJ1Y3QgcGFkbG9ja19jaXBoZXJfZGF0YSAq
Y2RhdGEsCVwNCisJdm9pZCAqb3V0LCBjb25zdCB2b2lkICppbnApIAkJXA0K
K3sJdm9pZCAqaXY7IAkJCQlcDQorCWFzbSB2b2xhdGlsZSAoICJwdXNobAkl
JWVieFxuIglcDQorCQkiCWxlYWwJMTYoJTApLCUlZWR4XG4iCVwNCisJCSIJ
bGVhbAkzMiglMCksJSVlYnhcbiIJXA0KKwkJCXJlcF94Y3J5cHQgIlxuIgkJ
XA0KKwkJIglwb3BsCSUlZWJ4IgkJXA0KKwkJOiAiPWEiKGl2KSwgIj1jIihj
bnQpLCAiPUQiKG91dCksICI9UyIoaW5wKSBcDQorCQk6ICIwIihjZGF0YSks
ICIxIihjbnQpLCAiMiIob3V0KSwgIjMiKGlucCkgXA0KKwkJOiAiZWR4Iiwg
ImNjIik7CQkJXA0KKwlyZXR1cm4gaXY7CQkJCVwNCit9DQorDQorLyogR2Vu
ZXJhdGUgYWxsIGZ1bmN0aW9ucyB3aXRoIGFwcHJvcHJpYXRlIG9wY29kZXMg
Ki8NCitQQURMT0NLX1hDUllQVF9BU00ocGFkbG9ja194Y3J5cHRfZWNiLCAi
LmJ5dGUgMHhmMywweDBmLDB4YTcsMHhjOCIpCS8qIHJlcCB4Y3J5cHRlY2Ig
Ki8NCitQQURMT0NLX1hDUllQVF9BU00ocGFkbG9ja194Y3J5cHRfY2JjLCAi
LmJ5dGUgMHhmMywweDBmLDB4YTcsMHhkMCIpCS8qIHJlcCB4Y3J5cHRjYmMg
Ki8NCitQQURMT0NLX1hDUllQVF9BU00ocGFkbG9ja194Y3J5cHRfY2ZiLCAi
LmJ5dGUgMHhmMywweDBmLDB4YTcsMHhlMCIpCS8qIHJlcCB4Y3J5cHRjZmIg
Ki8NCitQQURMT0NLX1hDUllQVF9BU00ocGFkbG9ja194Y3J5cHRfb2ZiLCAi
LmJ5dGUgMHhmMywweDBmLDB4YTcsMHhlOCIpCS8qIHJlcCB4Y3J5cHRvZmIg
Ki8NCisjZW5kaWYNCisNCisvKiBUaGUgUk5HIGNhbGwgaXRzZWxmICovDQor
c3RhdGljIGlubGluZSB1bnNpZ25lZCBpbnQNCitwYWRsb2NrX3hzdG9yZSh2
b2lkICphZGRyLCB1bnNpZ25lZCBpbnQgZWR4X2luKQ0KK3sNCisJdW5zaWdu
ZWQgaW50IGVheF9vdXQ7DQorDQorCWFzbSB2b2xhdGlsZSAoIi5ieXRlIDB4
MGYsMHhhNywweGMwIgkvKiB4c3RvcmUgKi8NCisJICAgIDogIj1hIihlYXhf
b3V0KSwiPW0iKCoodW5zaWduZWQgKilhZGRyKQ0KKwkgICAgOiAiRCIoYWRk
ciksICJkIiAoZWR4X2luKQ0KKwkgICAgKTsNCisNCisJcmV0dXJuIGVheF9v
dXQ7DQorfQ0KKw0KKy8qIFdoeSBub3QgaW5saW5lICdyZXAgbW92c2QnPyBJ
IGZhaWxlZCB0byBmaW5kIGluZm9ybWF0aW9uIG9uIHdoYXQNCisgKiB2YWx1
ZSBpbiBEaXJlY3Rpb24gRmxhZyBvbmUgY2FuIGV4cGVjdCBhbmQgY29uc2Vx
dWVudGx5IGhhdmUgdG8NCisgKiBhcHBseSAiYmV0dGVyLXNhZmUtdGhhbi1z
b3JyeSIgYXBwcm9hY2ggYW5kIGFzc3VtZSAidW5kZWZpbmVkLiINCisgKiBJ
IGNvdWxkIGV4cGxpY2l0bHkgY2xlYXIgaXQgYW5kIHJlc3RvcmUgdGhlIG9y
aWdpbmFsIHZhbHVlIHVwb24NCisgKiByZXR1cm4gZnJvbSBwYWRsb2NrX2Fl
c19jaXBoZXIsIGJ1dCBpdCdzIHByZXN1bWFibHkgdG9vIG11Y2gNCisgKiB0
cm91YmxlIGZvciB0b28gbGl0dGxlIGdhaW4uLi4NCisgKg0KKyAqIEluIGNh
c2UgeW91IHdvbmRlciAncmVwIHhjcnlwdConIGluc3RydWN0aW9ucyBhYm92
ZSBhcmUgKm5vdCoNCisgKiBhZmZlY3RlZCBieSB0aGUgRGlyZWN0aW9uIEZs
YWcgYW5kIHBvaW50ZXJzIGFkdmFuY2UgdG93YXJkDQorICogbGFyZ2VyIGFk
ZHJlc3NlcyB1bmNvbmRpdGlvbmFsbHkuDQorICovIA0KK3N0YXRpYyBpbmxp
bmUgdW5zaWduZWQgY2hhciAqDQorcGFkbG9ja19tZW1jcHkodm9pZCAqZHN0
LGNvbnN0IHZvaWQgKnNyYyxzaXplX3QgbikNCit7DQorCWxvbmcgICAgICAg
KmQ9ZHN0Ow0KKwljb25zdCBsb25nICpzPXNyYzsNCisNCisJbiAvPSBzaXpl
b2YoKmQpOw0KKwlkbyB7ICpkKysgPSAqcysrOyB9IHdoaWxlICgtLW4pOw0K
Kw0KKwlyZXR1cm4gZHN0Ow0KK30NCisNCisjZWxpZiBkZWZpbmVkKF9NU0Nf
VkVSKQ0KKy8qDQorICogVW5saWtlIEdDQyB0aGVzZSBhcmUgcmVhbCBmdW5j
dGlvbnMuIEluIG9yZGVyIHRvIG1pbmltaXplIGltcGFjdA0KKyAqIG9uIHBl
cmZvcm1hbmNlIHdlIGFkaGVyZSB0byBfX2Zhc3RjYWxsIGNhbGxpbmcgY29u
dmVudGlvbiBpbg0KKyAqIG9yZGVyIHRvIGdldCB0d28gZmlyc3QgYXJndW1l
bnRzIHBhc3NlZCB0aHJvdWdoICVlY3ggYW5kICVlZHguDQorICogV2hpY2gg
a2luZCBvZiBzdWl0cyB2ZXJ5IHdlbGwsIGFzIGluc3RydWN0aW9ucyBpbiBx
dWVzdGlvbiB1c2UNCisgKiBib3RoICVlY3ggYW5kICVlZHggYXMgaW5wdXQ6
LSkNCisgKi8NCisjZGVmaW5lIFJFUF9YQ1JZUFQoY29kZSkJCVwNCisJX2Fz
bSBfZW1pdCAweGYzCQkJXA0KKwlfYXNtIF9lbWl0IDB4MGYgX2FzbSBfZW1p
dCAweGE3CVwNCisJX2FzbSBfZW1pdCBjb2RlDQorDQorLyogQklHIEZBVCBX
QVJOSU5HOiANCisgKiAJVGhlIG9mZnNldHMgdXNlZCB3aXRoICdsZWEnIGlu
c3RydWN0aW9ucw0KKyAqIAlkZXNjcmliZSBpdGVtcyBvZiB0aGUgJ3BhZGxv
Y2tfY2lwaGVyX2RhdGEnDQorICogCXN0cnVjdHVyZS4NCisgKi8NCisjZGVm
aW5lIFBBRExPQ0tfWENSWVBUX0FTTShuYW1lLGNvZGUpCVwNCitzdGF0aWMg
dm9pZCAqIF9fZmFzdGNhbGwgCQlcDQorCW5hbWUgKHNpemVfdCBjbnQsIHZv
aWQgKmNkYXRhLAlcDQorCXZvaWQgKm91dHAsIGNvbnN0IHZvaWQgKmlucCkJ
XA0KK3sJX2FzbQltb3YJZWF4LGVkeAkJXA0KKwlfYXNtCWxlYQllZHgsW2Vh
eCsxNl0JXA0KKwlfYXNtCWxlYQllYngsW2VheCszMl0JXA0KKwlfYXNtCW1v
dgllZGksb3V0cAlcDQorCV9hc20JbW92CWVzaSxpbnAJCVwNCisJUkVQX1hD
UllQVChjb2RlKQkJXA0KK30NCisNCitQQURMT0NLX1hDUllQVF9BU00ocGFk
bG9ja194Y3J5cHRfZWNiLDB4YzgpDQorUEFETE9DS19YQ1JZUFRfQVNNKHBh
ZGxvY2tfeGNyeXB0X2NiYywweGQwKQ0KK1BBRExPQ0tfWENSWVBUX0FTTShw
YWRsb2NrX3hjcnlwdF9jZmIsMHhlMCkNCitQQURMT0NLX1hDUllQVF9BU00o
cGFkbG9ja194Y3J5cHRfb2ZiLDB4ZTgpDQorDQorc3RhdGljIGludCBfX2Zh
c3RjYWxsDQorcGFkbG9ja194c3RvcmUodm9pZCAqb3V0cCx1bnNpZ25lZCBp
bnQgY29kZSkNCit7CV9hc20JbW92CWVkaSxlY3gNCisJX2FzbSBfZW1pdCAw
eDBmIF9hc20gX2VtaXQgMHhhNyBfYXNtIF9lbWl0IDB4YzANCit9DQorDQor
c3RhdGljIHZvaWQgX19mYXN0Y2FsbA0KK3BhZGxvY2tfcmVsb2FkX2tleSh2
b2lkKQ0KK3sJX2FzbSBwdXNoZmQgX2FzbSBwb3BmZAkJfQ0KKw0KK3N0YXRp
YyB2b2lkIF9fZmFzdGNhbGwNCitwYWRsb2NrX3ZlcmlmeV9jb250ZXh0KHZv
aWQgKmNkYXRhKQ0KK3sJX2FzbQl7DQorCQlwdXNoZmQNCisJCWJ0CURXT1JE
IFBUUltlc3BdLDMwDQorCQlqbmMJc2tpcA0KKwkJY21wCWVjeCxwYWRsb2Nr
X3NhdmVkX2NvbnRleHQNCisJCWplCXNraXANCisJCXBvcGZkDQorCQlzdWIJ
ZXNwLDQNCisJc2tpcDoJYWRkCWVzcCw0DQorCQltb3YJcGFkbG9ja19zYXZl
ZF9jb250ZXh0LGVjeA0KKwkJfQ0KK30NCisNCitzdGF0aWMgaW50DQorcGFk
bG9ja19hdmFpbGFibGUodm9pZCkNCit7CV9hc20Jew0KKwkJcHVzaGZkDQor
CQlwb3AJZWF4DQorCQltb3YJZWN4LGVheA0KKwkJeG9yCWVheCwxPDwyMQ0K
KwkJcHVzaAllYXgNCisJCXBvcGZkDQorCQlwdXNoZmQNCisJCXBvcAllYXgN
CisJCXhvcgllYXgsZWN4DQorCQlidAllYXgsMjENCisJCWpuYwlub2x1Y2sN
CisJCW1vdgllYXgsMA0KKwkJY3B1aWQNCisJCXhvcgllYXgsZWF4DQorCQlj
bXAJZWJ4LCd0bmVDJw0KKwkJam5lCW5vbHVjaw0KKwkJY21wCWVkeCwnSHJ1
YScNCisJCWpuZQlub2x1Y2sNCisJCWNtcAllY3gsJ3NsdWEnDQorCQlqbmUJ
bm9sdWNrDQorCQltb3YJZWF4LDB4QzAwMDAwMDANCisJCWNwdWlkDQorCQlt
b3YJZWR4LGVheA0KKwkJeG9yCWVheCxlYXgNCisJCWNtcAllZHgsMHhDMDAw
MDAwMQ0KKwkJamIJbm9sdWNrDQorCQltb3YJZWF4LDB4QzAwMDAwMDENCisJ
CWNwdWlkDQorCQl4b3IJZWF4LGVheA0KKwkJYnQJZWR4LDYNCisJCWpuYwlz
a2lwX2ENCisJCWJ0CWVkeCw3DQorCQlqbmMJc2tpcF9hDQorCQltb3YJcGFk
bG9ja191c2VfYWNlLDENCisJCWluYwllYXgNCisJc2tpcF9hOglidAllZHgs
Mg0KKwkJam5jCXNraXBfcg0KKwkJYnQJZWR4LDMNCisJCWpuYwlza2lwX3IN
CisJCW1vdglwYWRsb2NrX3VzZV9ybmcsMQ0KKwkJaW5jCWVheA0KKwlza2lw
X3I6DQorCW5vbHVjazoNCisJCX0NCit9DQorDQorc3RhdGljIHZvaWQgX19m
YXN0Y2FsbA0KK3BhZGxvY2tfYnN3YXBsKHZvaWQgKmtleSkNCit7CV9hc20J
ew0KKwkJcHVzaGZkDQorCQljbGQNCisJCW1vdgllc2ksZWN4DQorCQltb3YJ
ZWRpLGVjeA0KKwkJbW92CWVjeCw2MA0KKwl1cDoJbG9kc2QNCisJCWJzd2Fw
CWVheA0KKwkJc3Rvc2QNCisJCWxvb3AJdXANCisJCXBvcGZkDQorCQl9DQor
fQ0KKw0KKy8qIE1TIGFjdHVhbGx5IHNwZWNpZmllcyBzdGF0dXMgb2YgRGly
ZWN0aW9uIEZsYWcgYW5kIGNvbXBpbGVyIGV2ZW4NCisgKiBtYW5hZ2VzIHRv
IGNvbXBpbGUgZm9sbG93aW5nIGFzICdyZXAgbW92c2QnIGFsbCBieSBpdHNl
bGYuLi4NCisgKi8NCisjZGVmaW5lIHBhZGxvY2tfbWVtY3B5KG8saSxuKSAo
KHVuc2lnbmVkIGNoYXIgKiltZW1jcHkoKG8pLChpKSwobikmfjNVKSkNCisj
ZW5kaWYNCisNCisvKiA9PT09PSBBRVMgZW5jcnlwdGlvbi9kZWNyeXB0aW9u
ID09PT09ICovDQorI2lmbmRlZiBPUEVOU1NMX05PX0FFUw0KKw0KKyNpZiBk
ZWZpbmVkKE5JRF9hZXNfMTI4X2NmYjEyOCkgJiYgISBkZWZpbmVkIChOSURf
YWVzXzEyOF9jZmIpDQorI2RlZmluZSBOSURfYWVzXzEyOF9jZmIJTklEX2Fl
c18xMjhfY2ZiMTI4DQorI2VuZGlmDQorDQorI2lmIGRlZmluZWQoTklEX2Fl
c18xMjhfb2ZiMTI4KSAmJiAhIGRlZmluZWQgKE5JRF9hZXNfMTI4X29mYikN
CisjZGVmaW5lIE5JRF9hZXNfMTI4X29mYglOSURfYWVzXzEyOF9vZmIxMjgN
CisjZW5kaWYNCisNCisjaWYgZGVmaW5lZChOSURfYWVzXzE5Ml9jZmIxMjgp
ICYmICEgZGVmaW5lZCAoTklEX2Flc18xOTJfY2ZiKQ0KKyNkZWZpbmUgTklE
X2Flc18xOTJfY2ZiCU5JRF9hZXNfMTkyX2NmYjEyOA0KKyNlbmRpZg0KKw0K
KyNpZiBkZWZpbmVkKE5JRF9hZXNfMTkyX29mYjEyOCkgJiYgISBkZWZpbmVk
IChOSURfYWVzXzE5Ml9vZmIpDQorI2RlZmluZSBOSURfYWVzXzE5Ml9vZmIJ
TklEX2Flc18xOTJfb2ZiMTI4DQorI2VuZGlmDQorDQorI2lmIGRlZmluZWQo
TklEX2Flc18yNTZfY2ZiMTI4KSAmJiAhIGRlZmluZWQgKE5JRF9hZXNfMjU2
X2NmYikNCisjZGVmaW5lIE5JRF9hZXNfMjU2X2NmYglOSURfYWVzXzI1Nl9j
ZmIxMjgNCisjZW5kaWYNCisNCisjaWYgZGVmaW5lZChOSURfYWVzXzI1Nl9v
ZmIxMjgpICYmICEgZGVmaW5lZCAoTklEX2Flc18yNTZfb2ZiKQ0KKyNkZWZp
bmUgTklEX2Flc18yNTZfb2ZiCU5JRF9hZXNfMjU2X29mYjEyOA0KKyNlbmRp
Zg0KKw0KKy8qIExpc3Qgb2Ygc3VwcG9ydGVkIGNpcGhlcnMuICovDQorc3Rh
dGljIGludCBwYWRsb2NrX2NpcGhlcl9uaWRzW10gPSB7DQorCU5JRF9hZXNf
MTI4X2VjYiwNCisJTklEX2Flc18xMjhfY2JjLA0KKwlOSURfYWVzXzEyOF9j
ZmIsDQorCU5JRF9hZXNfMTI4X29mYiwNCisNCisJTklEX2Flc18xOTJfZWNi
LA0KKwlOSURfYWVzXzE5Ml9jYmMsDQorCU5JRF9hZXNfMTkyX2NmYiwNCisJ
TklEX2Flc18xOTJfb2ZiLA0KKw0KKwlOSURfYWVzXzI1Nl9lY2IsDQorCU5J
RF9hZXNfMjU2X2NiYywNCisJTklEX2Flc18yNTZfY2ZiLA0KKwlOSURfYWVz
XzI1Nl9vZmIsDQorfTsNCitzdGF0aWMgaW50IHBhZGxvY2tfY2lwaGVyX25p
ZHNfbnVtID0gKHNpemVvZihwYWRsb2NrX2NpcGhlcl9uaWRzKS8NCisJCQkJ
ICAgICAgc2l6ZW9mKHBhZGxvY2tfY2lwaGVyX25pZHNbMF0pKTsNCisNCisv
KiBGdW5jdGlvbiBwcm90b3R5cGVzIC4uLiAqLw0KK3N0YXRpYyBpbnQgcGFk
bG9ja19hZXNfaW5pdF9rZXkoRVZQX0NJUEhFUl9DVFggKmN0eCwgY29uc3Qg
dW5zaWduZWQgY2hhciAqa2V5LA0KKwkJCQljb25zdCB1bnNpZ25lZCBjaGFy
ICppdiwgaW50IGVuYyk7DQorc3RhdGljIGludCBwYWRsb2NrX2Flc19jaXBo
ZXIoRVZQX0NJUEhFUl9DVFggKmN0eCwgdW5zaWduZWQgY2hhciAqb3V0LA0K
KwkJCSAgICAgIGNvbnN0IHVuc2lnbmVkIGNoYXIgKmluLCBzaXplX3QgbmJ5
dGVzKTsNCisNCisjZGVmaW5lIE5FQVJFU1RfQUxJR05FRChwdHIpICggKHVu
c2lnbmVkIGNoYXIgKikocHRyKSArCQlcDQorCSggKDB4MTAgLSAoKHNpemVf
dCkocHRyKSAmIDB4MEYpKSAmIDB4MEYgKQkpDQorI2RlZmluZSBBTElHTkVE
X0NJUEhFUl9EQVRBKGN0eCkgKChzdHJ1Y3QgcGFkbG9ja19jaXBoZXJfZGF0
YSAqKVwNCisJTkVBUkVTVF9BTElHTkVEKGN0eC0+Y2lwaGVyX2RhdGEpKQ0K
Kw0KKyNkZWZpbmUgRVZQX0NJUEhFUl9ibG9ja19zaXplX0VDQglBRVNfQkxP
Q0tfU0laRQ0KKyNkZWZpbmUgRVZQX0NJUEhFUl9ibG9ja19zaXplX0NCQwlB
RVNfQkxPQ0tfU0laRQ0KKyNkZWZpbmUgRVZQX0NJUEhFUl9ibG9ja19zaXpl
X09GQgkxDQorI2RlZmluZSBFVlBfQ0lQSEVSX2Jsb2NrX3NpemVfQ0ZCCTEN
CisNCisvKiBEZWNsYXJpbmcgc28gbWFueSBjaXBoZXJzIGJ5IGhhbmQgd291
bGQgYmUgYSBwYWluLg0KKyAgIEluc3RlYWQgaW50cm9kdWNlIGEgYml0IG9m
IHByZXByb2Nlc3NvciBtYWdpYyA6LSkgKi8NCisjZGVmaW5lCURFQ0xBUkVf
QUVTX0VWUChrc2l6ZSxsbW9kZSx1bW9kZSkJXA0KK3N0YXRpYyBjb25zdCBF
VlBfQ0lQSEVSIHBhZGxvY2tfYWVzXyMja3NpemUjI18jI2xtb2RlID0gewlc
DQorCU5JRF9hZXNfIyNrc2l6ZSMjXyMjbG1vZGUsCQlcDQorCUVWUF9DSVBI
RVJfYmxvY2tfc2l6ZV8jI3Vtb2RlLAlcDQorCUFFU19LRVlfU0laRV8jI2tz
aXplLAkJXA0KKwlBRVNfQkxPQ0tfU0laRSwJCQlcDQorCTAgfCBFVlBfQ0lQ
SF8jI3Vtb2RlIyNfTU9ERSwJXA0KKwlwYWRsb2NrX2Flc19pbml0X2tleSwJ
CVwNCisJcGFkbG9ja19hZXNfY2lwaGVyLAkJXA0KKwlOVUxMLAkJCQlcDQor
CXNpemVvZihzdHJ1Y3QgcGFkbG9ja19jaXBoZXJfZGF0YSkgKyAxNiwJXA0K
KwlFVlBfQ0lQSEVSX3NldF9hc24xX2l2LAkJXA0KKwlFVlBfQ0lQSEVSX2dl
dF9hc24xX2l2LAkJXA0KKwlOVUxMLAkJCQlcDQorCU5VTEwJCQkJXA0KK30N
CisNCitERUNMQVJFX0FFU19FVlAoMTI4LGVjYixFQ0IpOw0KK0RFQ0xBUkVf
QUVTX0VWUCgxMjgsY2JjLENCQyk7DQorREVDTEFSRV9BRVNfRVZQKDEyOCxj
ZmIsQ0ZCKTsNCitERUNMQVJFX0FFU19FVlAoMTI4LG9mYixPRkIpOw0KKw0K
K0RFQ0xBUkVfQUVTX0VWUCgxOTIsZWNiLEVDQik7DQorREVDTEFSRV9BRVNf
RVZQKDE5MixjYmMsQ0JDKTsNCitERUNMQVJFX0FFU19FVlAoMTkyLGNmYixD
RkIpOw0KK0RFQ0xBUkVfQUVTX0VWUCgxOTIsb2ZiLE9GQik7DQorDQorREVD
TEFSRV9BRVNfRVZQKDI1NixlY2IsRUNCKTsNCitERUNMQVJFX0FFU19FVlAo
MjU2LGNiYyxDQkMpOw0KK0RFQ0xBUkVfQUVTX0VWUCgyNTYsY2ZiLENGQik7
DQorREVDTEFSRV9BRVNfRVZQKDI1NixvZmIsT0ZCKTsNCisNCitzdGF0aWMg
aW50DQorcGFkbG9ja19jaXBoZXJzIChFTkdJTkUgKmUsIGNvbnN0IEVWUF9D
SVBIRVIgKipjaXBoZXIsIGNvbnN0IGludCAqKm5pZHMsIGludCBuaWQpDQor
ew0KKwkvKiBObyBzcGVjaWZpYyBjaXBoZXIgPT4gcmV0dXJuIGEgbGlzdCBv
ZiBzdXBwb3J0ZWQgbmlkcyAuLi4gKi8NCisJaWYgKCFjaXBoZXIpIHsNCisJ
CSpuaWRzID0gcGFkbG9ja19jaXBoZXJfbmlkczsNCisJCXJldHVybiBwYWRs
b2NrX2NpcGhlcl9uaWRzX251bTsNCisJfQ0KKw0KKwkvKiAuLi4gb3IgdGhl
IHJlcXVlc3RlZCAiY2lwaGVyIiBvdGhlcndpc2UgKi8NCisJc3dpdGNoIChu
aWQpIHsNCisJICBjYXNlIE5JRF9hZXNfMTI4X2VjYjoNCisJICAgICpjaXBo
ZXIgPSAmcGFkbG9ja19hZXNfMTI4X2VjYjsNCisJICAgIGJyZWFrOw0KKwkg
IGNhc2UgTklEX2Flc18xMjhfY2JjOg0KKwkgICAgKmNpcGhlciA9ICZwYWRs
b2NrX2Flc18xMjhfY2JjOw0KKwkgICAgYnJlYWs7DQorCSAgY2FzZSBOSURf
YWVzXzEyOF9jZmI6DQorCSAgICAqY2lwaGVyID0gJnBhZGxvY2tfYWVzXzEy
OF9jZmI7DQorCSAgICBicmVhazsNCisJICBjYXNlIE5JRF9hZXNfMTI4X29m
YjoNCisJICAgICpjaXBoZXIgPSAmcGFkbG9ja19hZXNfMTI4X29mYjsNCisJ
ICAgIGJyZWFrOw0KKw0KKwkgIGNhc2UgTklEX2Flc18xOTJfZWNiOg0KKwkg
ICAgKmNpcGhlciA9ICZwYWRsb2NrX2Flc18xOTJfZWNiOw0KKwkgICAgYnJl
YWs7DQorCSAgY2FzZSBOSURfYWVzXzE5Ml9jYmM6DQorCSAgICAqY2lwaGVy
ID0gJnBhZGxvY2tfYWVzXzE5Ml9jYmM7DQorCSAgICBicmVhazsNCisJICBj
YXNlIE5JRF9hZXNfMTkyX2NmYjoNCisJICAgICpjaXBoZXIgPSAmcGFkbG9j
a19hZXNfMTkyX2NmYjsNCisJICAgIGJyZWFrOw0KKwkgIGNhc2UgTklEX2Fl
c18xOTJfb2ZiOg0KKwkgICAgKmNpcGhlciA9ICZwYWRsb2NrX2Flc18xOTJf
b2ZiOw0KKwkgICAgYnJlYWs7DQorDQorCSAgY2FzZSBOSURfYWVzXzI1Nl9l
Y2I6DQorCSAgICAqY2lwaGVyID0gJnBhZGxvY2tfYWVzXzI1Nl9lY2I7DQor
CSAgICBicmVhazsNCisJICBjYXNlIE5JRF9hZXNfMjU2X2NiYzoNCisJICAg
ICpjaXBoZXIgPSAmcGFkbG9ja19hZXNfMjU2X2NiYzsNCisJICAgIGJyZWFr
Ow0KKwkgIGNhc2UgTklEX2Flc18yNTZfY2ZiOg0KKwkgICAgKmNpcGhlciA9
ICZwYWRsb2NrX2Flc18yNTZfY2ZiOw0KKwkgICAgYnJlYWs7DQorCSAgY2Fz
ZSBOSURfYWVzXzI1Nl9vZmI6DQorCSAgICAqY2lwaGVyID0gJnBhZGxvY2tf
YWVzXzI1Nl9vZmI7DQorCSAgICBicmVhazsNCisNCisJICBkZWZhdWx0Og0K
KwkgICAgLyogU29ycnksIHdlIGRvbid0IHN1cHBvcnQgdGhpcyBOSUQgKi8N
CisJICAgICpjaXBoZXIgPSBOVUxMOw0KKwkgICAgcmV0dXJuIDA7DQorCX0N
CisNCisJcmV0dXJuIDE7DQorfQ0KKw0KKy8qIFByZXBhcmUgdGhlIGVuY3J5
cHRpb24ga2V5IGZvciBQYWRMb2NrIHVzYWdlICovDQorc3RhdGljIGludA0K
K3BhZGxvY2tfYWVzX2luaXRfa2V5IChFVlBfQ0lQSEVSX0NUWCAqY3R4LCBj
b25zdCB1bnNpZ25lZCBjaGFyICprZXksDQorCQkgICAgICBjb25zdCB1bnNp
Z25lZCBjaGFyICppdiwgaW50IGVuYykNCit7DQorCXN0cnVjdCBwYWRsb2Nr
X2NpcGhlcl9kYXRhICpjZGF0YTsNCisJaW50IGtleV9sZW4gPSBFVlBfQ0lQ
SEVSX0NUWF9rZXlfbGVuZ3RoKGN0eCkgKiA4Ow0KKw0KKwlpZiAoa2V5PT1O
VUxMKSByZXR1cm4gMDsJLyogRVJST1IgKi8NCisNCisJY2RhdGEgPSBBTElH
TkVEX0NJUEhFUl9EQVRBKGN0eCk7DQorCW1lbXNldChjZGF0YSwgMCwgc2l6
ZW9mKHN0cnVjdCBwYWRsb2NrX2NpcGhlcl9kYXRhKSk7DQorDQorCS8qIFBy
ZXBhcmUgQ29udHJvbCB3b3JkLiAqLw0KKwlpZiAoRVZQX0NJUEhFUl9DVFhf
bW9kZShjdHgpID09IEVWUF9DSVBIX09GQl9NT0RFKQ0KKwkJY2RhdGEtPmN3
b3JkLmIuZW5jZGVjID0gMDsNCisJZWxzZQ0KKwkJY2RhdGEtPmN3b3JkLmIu
ZW5jZGVjID0gKGN0eC0+ZW5jcnlwdCA9PSAwKTsNCisJY2RhdGEtPmN3b3Jk
LmIucm91bmRzID0gMTAgKyAoa2V5X2xlbiAtIDEyOCkgLyAzMjsNCisJY2Rh
dGEtPmN3b3JkLmIua3NpemUgPSAoa2V5X2xlbiAtIDEyOCkgLyA2NDsNCisN
CisJc3dpdGNoKGtleV9sZW4pIHsNCisJCWNhc2UgMTI4Og0KKwkJCS8qIFBh
ZExvY2sgY2FuIGdlbmVyYXRlIGFuIGV4dGVuZGVkIGtleSBmb3INCisJCQkg
ICBBRVMxMjggaW4gaGFyZHdhcmUgKi8NCisJCQltZW1jcHkoY2RhdGEtPmtz
LnJkX2tleSwga2V5LCBBRVNfS0VZX1NJWkVfMTI4KTsNCisJCQljZGF0YS0+
Y3dvcmQuYi5rZXlnZW4gPSAwOw0KKwkJCWJyZWFrOw0KKw0KKwkJY2FzZSAx
OTI6DQorCQljYXNlIDI1NjoNCisJCQkvKiBHZW5lcmF0ZSBhbiBleHRlbmRl
ZCBBRVMga2V5IGluIHNvZnR3YXJlLg0KKwkJCSAgIE5lZWRlZCBmb3IgQUVT
MTkyL0FFUzI1NiAqLw0KKwkJCS8qIFdlbGwsIHRoZSBhYm92ZSBhcHBsaWVz
IHRvIFN0ZXBwaW5nIDggQ1BVcw0KKwkJCSAgIGFuZCBpcyBsaXN0ZWQgYXMg
aGFyZHdhcmUgZXJyYXRhLiBUaGV5IG1vc3QNCisJCQkgICBsaWtlbHkgd2ls
bCBmaXggaXQgYXQgc29tZSBwb2ludCBhbmQgdGhlbg0KKwkJCSAgIGEgY2hl
Y2sgZm9yIHN0ZXBwaW5nIHdvdWxkIGJlIGR1ZSBoZXJlLiAqLw0KKwkJCWlm
IChFVlBfQ0lQSEVSX0NUWF9tb2RlKGN0eCkgPT0gRVZQX0NJUEhfQ0ZCX01P
REUgfHwNCisJCQkgICAgRVZQX0NJUEhFUl9DVFhfbW9kZShjdHgpID09IEVW
UF9DSVBIX09GQl9NT0RFIHx8DQorCQkJICAgIGVuYykNCisJCQkJQUVTX3Nl
dF9lbmNyeXB0X2tleShrZXksIGtleV9sZW4sICZjZGF0YS0+a3MpOw0KKwkJ
CWVsc2UNCisJCQkJQUVTX3NldF9kZWNyeXB0X2tleShrZXksIGtleV9sZW4s
ICZjZGF0YS0+a3MpOw0KKyNpZm5kZWYgQUVTX0FTTQ0KKwkJCS8qIE9wZW5T
U0wgQyBmdW5jdGlvbnMgdXNlIGJ5dGUtc3dhcHBlZCBleHRlbmRlZCBrZXku
ICovDQorCQkJcGFkbG9ja19ic3dhcGwoJmNkYXRhLT5rcyk7DQorI2VuZGlm
DQorCQkJY2RhdGEtPmN3b3JkLmIua2V5Z2VuID0gMTsNCisJCQlicmVhazsN
CisNCisJCWRlZmF1bHQ6DQorCQkJLyogRVJST1IgKi8NCisJCQlyZXR1cm4g
MDsNCisJfQ0KKw0KKwkvKg0KKwkgKiBUaGlzIGlzIGRvbmUgdG8gY292ZXIg
Zm9yIGNhc2VzIHdoZW4gdXNlciByZXVzZXMgdGhlDQorCSAqIGNvbnRleHQg
Zm9yIG5ldyBrZXkuIFRoZSBjYXRjaCBpcyB0aGF0IGlmIHdlIGRvbid0IGRv
DQorCSAqIHRoaXMsIHBhZGxvY2tfZWFzX2NpcGhlciBtaWdodCBwcm9jZWVk
IHdpdGggb2xkIGtleS4uLg0KKwkgKi8NCisJcGFkbG9ja19yZWxvYWRfa2V5
ICgpOw0KKw0KKwlyZXR1cm4gMTsNCit9DQorDQorLyogDQorICogU2ltcGxp
ZmllZCB2ZXJzaW9uIG9mIHBhZGxvY2tfYWVzX2NpcGhlcigpIHVzZWQgd2hl
bg0KKyAqIDEpIGJvdGggaW5wdXQgYW5kIG91dHB1dCBidWZmZXJzIGFyZSBh
dCBhbGlnbmVkIGFkZHJlc3Nlcy4NCisgKiBvciB3aGVuDQorICogMikgcnVu
bmluZyBvbiBhIG5ld2VyIENQVSB0aGF0IGRvZXNuJ3QgcmVxdWlyZSBhbGln
bmVkIGJ1ZmZlcnMuDQorICovDQorc3RhdGljIGludA0KK3BhZGxvY2tfYWVz
X2NpcGhlcl9vbW5pdm9yb3VzKEVWUF9DSVBIRVJfQ1RYICpjdHgsIHVuc2ln
bmVkIGNoYXIgKm91dF9hcmcsDQorCQljb25zdCB1bnNpZ25lZCBjaGFyICpp
bl9hcmcsIHNpemVfdCBuYnl0ZXMpDQorew0KKwlzdHJ1Y3QgcGFkbG9ja19j
aXBoZXJfZGF0YSAqY2RhdGE7DQorCXZvaWQgICppdjsNCisNCisJY2RhdGEg
PSBBTElHTkVEX0NJUEhFUl9EQVRBKGN0eCk7DQorCXBhZGxvY2tfdmVyaWZ5
X2NvbnRleHQoY2RhdGEpOw0KKw0KKwlzd2l0Y2ggKEVWUF9DSVBIRVJfQ1RY
X21vZGUoY3R4KSkgew0KKwljYXNlIEVWUF9DSVBIX0VDQl9NT0RFOg0KKwkJ
cGFkbG9ja194Y3J5cHRfZWNiKG5ieXRlcy9BRVNfQkxPQ0tfU0laRSwgY2Rh
dGEsIG91dF9hcmcsIGluX2FyZyk7DQorCQlicmVhazsNCisNCisJY2FzZSBF
VlBfQ0lQSF9DQkNfTU9ERToNCisJCW1lbWNweShjZGF0YS0+aXYsIGN0eC0+
aXYsIEFFU19CTE9DS19TSVpFKTsNCisJCWl2ID0gcGFkbG9ja194Y3J5cHRf
Y2JjKG5ieXRlcy9BRVNfQkxPQ0tfU0laRSwgY2RhdGEsIG91dF9hcmcsIGlu
X2FyZyk7DQorCQltZW1jcHkoY3R4LT5pdiwgaXYsIEFFU19CTE9DS19TSVpF
KTsNCisJCWJyZWFrOw0KKw0KKwljYXNlIEVWUF9DSVBIX0NGQl9NT0RFOg0K
KwkJbWVtY3B5KGNkYXRhLT5pdiwgY3R4LT5pdiwgQUVTX0JMT0NLX1NJWkUp
Ow0KKwkJaXYgPSBwYWRsb2NrX3hjcnlwdF9jZmIobmJ5dGVzL0FFU19CTE9D
S19TSVpFLCBjZGF0YSwgb3V0X2FyZywgaW5fYXJnKTsNCisJCW1lbWNweShj
dHgtPml2LCBpdiwgQUVTX0JMT0NLX1NJWkUpOw0KKwkJYnJlYWs7DQorDQor
CWNhc2UgRVZQX0NJUEhfT0ZCX01PREU6DQorCQltZW1jcHkoY2RhdGEtPml2
LCBjdHgtPml2LCBBRVNfQkxPQ0tfU0laRSk7DQorCQlwYWRsb2NrX3hjcnlw
dF9vZmIobmJ5dGVzL0FFU19CTE9DS19TSVpFLCBjZGF0YSwgb3V0X2FyZywg
aW5fYXJnKTsNCisJCW1lbWNweShjdHgtPml2LCBjZGF0YS0+aXYsIEFFU19C
TE9DS19TSVpFKTsNCisJCWJyZWFrOw0KKw0KKwlkZWZhdWx0Og0KKwkJcmV0
dXJuIDA7DQorCX0NCisNCisJbWVtc2V0KGNkYXRhLT5pdiwgMCwgQUVTX0JM
T0NLX1NJWkUpOw0KKw0KKwlyZXR1cm4gMTsNCit9DQorDQorI2lmbmRlZiAg
UEFETE9DS19DSFVOSw0KKyMgZGVmaW5lIFBBRExPQ0tfQ0hVTksJNTEyCS8q
IE11c3QgYmUgYSBwb3dlciBvZiAyIGxhcmdlciB0aGFuIDE2ICovDQorI2Vu
ZGlmDQorI2lmIFBBRExPQ0tfQ0hVTks8MTYgfHwgUEFETE9DS19DSFVOSyYo
UEFETE9DS19DSFVOSy0xKQ0KKyMgZXJyb3IgImluc2FuZSBQQURMT0NLX0NI
VU5LLi4uIg0KKyNlbmRpZg0KKw0KKy8qIFJlLWFsaWduIHRoZSBhcmd1bWVu
dHMgdG8gMTYtQnl0ZXMgYm91bmRhcmllcyBhbmQgcnVuIHRoZSANCisgICBl
bmNyeXB0aW9uIGZ1bmN0aW9uIGl0c2VsZi4gVGhpcyBmdW5jdGlvbiBpcyBu
b3QgQUVTLXNwZWNpZmljLiAqLw0KK3N0YXRpYyBpbnQNCitwYWRsb2NrX2Fl
c19jaXBoZXIoRVZQX0NJUEhFUl9DVFggKmN0eCwgdW5zaWduZWQgY2hhciAq
b3V0X2FyZywNCisJCSAgIGNvbnN0IHVuc2lnbmVkIGNoYXIgKmluX2FyZywg
c2l6ZV90IG5ieXRlcykNCit7DQorCXN0cnVjdCBwYWRsb2NrX2NpcGhlcl9k
YXRhICpjZGF0YTsNCisJY29uc3QgIHZvaWQgKmlucDsNCisJdW5zaWduZWQg
Y2hhciAgKm91dDsNCisJdm9pZCAgKml2Ow0KKwlpbnQgICAgaW5wX21pc2Fs
aWduZWQsIG91dF9taXNhbGlnbmVkLCByZWFsaWduX2luX2xvb3A7DQorCXNp
emVfdCBjaHVuaywgYWxsb2NhdGVkPTA7DQorDQorCS8qIGN0eC0+bnVtIGlz
IG1haW50YWluZWQgaW4gYnl0ZS1vcmllbnRlZCBtb2RlcywNCisJICAgc3Vj
aCBhcyBDRkIgYW5kIE9GQi4uLiAqLw0KKwlpZiAoKGNodW5rID0gY3R4LT5u
dW0pKSB7IC8qIGJvcnJvdyBjaHVuayB2YXJpYWJsZSAqLw0KKwkJdW5zaWdu
ZWQgY2hhciAqaXZwPWN0eC0+aXY7DQorDQorCQlzd2l0Y2ggKEVWUF9DSVBI
RVJfQ1RYX21vZGUoY3R4KSkgew0KKwkJY2FzZSBFVlBfQ0lQSF9DRkJfTU9E
RToNCisJCQlpZiAoY2h1bmsgPj0gQUVTX0JMT0NLX1NJWkUpDQorCQkJCXJl
dHVybiAwOyAvKiBib2d1cyB2YWx1ZSAqLw0KKw0KKwkJCWlmIChjdHgtPmVu
Y3J5cHQpDQorCQkJCXdoaWxlIChjaHVuazxBRVNfQkxPQ0tfU0laRSAmJiBu
Ynl0ZXMhPTApIHsNCisJCQkJCWl2cFtjaHVua10gPSAqKG91dF9hcmcrKykg
PSAqKGluX2FyZysrKSBeIGl2cFtjaHVua107DQorCQkJCQljaHVuaysrLCBu
Ynl0ZXMtLTsNCisJCQkJfQ0KKwkJCWVsc2UJd2hpbGUgKGNodW5rPEFFU19C
TE9DS19TSVpFICYmIG5ieXRlcyE9MCkgew0KKwkJCQkJdW5zaWduZWQgY2hh
ciBjID0gKihpbl9hcmcrKyk7DQorCQkJCQkqKG91dF9hcmcrKykgPSBjIF4g
aXZwW2NodW5rXTsNCisJCQkJCWl2cFtjaHVuaysrXSA9IGMsIG5ieXRlcy0t
Ow0KKwkJCQl9DQorDQorCQkJY3R4LT5udW0gPSBjaHVuayVBRVNfQkxPQ0tf
U0laRTsNCisJCQlicmVhazsNCisJCWNhc2UgRVZQX0NJUEhfT0ZCX01PREU6
DQorCQkJaWYgKGNodW5rID49IEFFU19CTE9DS19TSVpFKQ0KKwkJCQlyZXR1
cm4gMDsgLyogYm9ndXMgdmFsdWUgKi8NCisNCisJCQl3aGlsZSAoY2h1bms8
QUVTX0JMT0NLX1NJWkUgJiYgbmJ5dGVzIT0wKSB7DQorCQkJCSoob3V0X2Fy
ZysrKSA9ICooaW5fYXJnKyspIF4gaXZwW2NodW5rXTsNCisJCQkJY2h1bmsr
KywgbmJ5dGVzLS07DQorCQkJfQ0KKw0KKwkJCWN0eC0+bnVtID0gY2h1bmsl
QUVTX0JMT0NLX1NJWkU7DQorCQkJYnJlYWs7DQorCQl9DQorCX0NCisNCisJ
aWYgKG5ieXRlcyA9PSAwKQ0KKwkJcmV0dXJuIDE7DQorI2lmIDANCisJaWYg
KG5ieXRlcyAlIEFFU19CTE9DS19TSVpFKQ0KKwkJcmV0dXJuIDA7IC8qIGFy
ZSB3ZSBleHBlY3RlZCB0byBkbyB0YWlsIHByb2Nlc3Npbmc/ICovDQorI2Vs
c2UNCisJLyogbmJ5dGVzIGlzIGFsd2F5cyBtdWx0aXBsZSBvZiBBRVNfQkxP
Q0tfU0laRSBpbiBFQ0IgYW5kIENCQw0KKwkgICBtb2RlcyBhbmQgYXJiaXRy
YXJ5IHZhbHVlIGluIGJ5dGUtb3JpZW50ZWQgbW9kZXMsIHN1Y2ggYXMNCisJ
ICAgQ0ZCIGFuZCBPRkIuLi4gKi8NCisjZW5kaWYNCisNCisJLyogVklBIHBy
b21pc2VzIENQVXMgdGhhdCB3b24ndCByZXF1aXJlIGFsaWdubWVudCBpbiB0
aGUgZnV0dXJlLg0KKwkgICBGb3Igbm93IHBhZGxvY2tfYWVzX2FsaWduX3Jl
cXVpcmVkIGlzIGluaXRpYWxpemVkIHRvIDEgYW5kDQorCSAgIHRoZSBjb25k
aXRpb24gaXMgbmV2ZXIgbWV0Li4uICovDQorCS8qIEM3IGNvcmUgaXMgY2Fw
YWJsZSB0byBtYW5hZ2UgdW5hbGlnbmVkIGlucHV0IGluIG5vbi1FQ0JbIV0N
CisJICAgbW9kZSwgYnV0IHBlcmZvcm1hbmNlIHBlbmFsdGllcyBhcHBlYXIg
dG8gYmUgYXBwcm94aW1hdGVseQ0KKwkgICBzYW1lIGFzIGZvciBzb2Z0d2Fy
ZSBhbGlnbm1lbnQgYmVsb3cgb3IgfjN4LiBUaGV5IHByb21pc2UgdG8NCisJ
ICAgaW1wcm92ZSBpdCBpbiB0aGUgZnV0dXJlLCBidXQgZm9yIG5vdyB3ZSBj
YW4ganVzdCBhcyB3ZWxsDQorCSAgIHByZXRlbmQgdGhhdCBpdCBjYW4gb25s
eSBoYW5kbGUgYWxpZ25lZCBpbnB1dC4uLiAqLw0KKwlpZiAoIXBhZGxvY2tf
YWVzX2FsaWduX3JlcXVpcmVkICYmIChuYnl0ZXMlQUVTX0JMT0NLX1NJWkUp
PT0wKQ0KKwkJcmV0dXJuIHBhZGxvY2tfYWVzX2NpcGhlcl9vbW5pdm9yb3Vz
KGN0eCwgb3V0X2FyZywgaW5fYXJnLCBuYnl0ZXMpOw0KKw0KKwlpbnBfbWlz
YWxpZ25lZCA9ICgoKHNpemVfdClpbl9hcmcpICYgMHgwRik7DQorCW91dF9t
aXNhbGlnbmVkID0gKCgoc2l6ZV90KW91dF9hcmcpICYgMHgwRik7DQorDQor
CS8qIE5vdGUgdGhhdCBldmVuIGlmIG91dHB1dCBpcyBhbGlnbmVkIGFuZCBp
bnB1dCBub3QsDQorCSAqIEkgc3RpbGwgcHJlZmVyIHRvIGxvb3AgaW5zdGVh
ZCBvZiBjb3B5IHRoZSB3aG9sZQ0KKwkgKiBpbnB1dCBhbmQgdGhlbiBlbmNy
eXB0IGluIG9uZSBzdHJva2UuIFRoaXMgaXMgZG9uZQ0KKwkgKiBpbiBvcmRl
ciB0byBpbXByb3ZlIEwxIGNhY2hlIHV0aWxpemF0aW9uLi4uICovDQorCXJl
YWxpZ25faW5fbG9vcCA9IG91dF9taXNhbGlnbmVkfGlucF9taXNhbGlnbmVk
Ow0KKw0KKwlpZiAoIXJlYWxpZ25faW5fbG9vcCAmJiAobmJ5dGVzJUFFU19C
TE9DS19TSVpFKT09MCkNCisJCXJldHVybiBwYWRsb2NrX2Flc19jaXBoZXJf
b21uaXZvcm91cyhjdHgsIG91dF9hcmcsIGluX2FyZywgbmJ5dGVzKTsNCisN
CisJLyogdGhpcyB0YWtlcyBvbmUgImlmIiBvdXQgb2YgdGhlIGxvb3BzICov
DQorCWNodW5rICA9IG5ieXRlczsNCisJY2h1bmsgJT0gUEFETE9DS19DSFVO
SzsNCisJaWYgKGNodW5rPT0wKSBjaHVuayA9IFBBRExPQ0tfQ0hVTks7DQor
DQorCWlmIChvdXRfbWlzYWxpZ25lZCkgew0KKwkJLyogb3B0bWl6ZSBmb3Ig
c21hbGwgaW5wdXQgKi8NCisJCWFsbG9jYXRlZCA9IChjaHVuazxuYnl0ZXM/
UEFETE9DS19DSFVOSzpuYnl0ZXMpOw0KKwkJb3V0ID0gYWxsb2NhKDB4MTAg
KyBhbGxvY2F0ZWQpOw0KKwkJb3V0ID0gTkVBUkVTVF9BTElHTkVEKG91dCk7
DQorCX0NCisJZWxzZQ0KKwkJb3V0ID0gb3V0X2FyZzsNCisNCisJY2RhdGEg
PSBBTElHTkVEX0NJUEhFUl9EQVRBKGN0eCk7DQorCXBhZGxvY2tfdmVyaWZ5
X2NvbnRleHQoY2RhdGEpOw0KKw0KKwlzd2l0Y2ggKEVWUF9DSVBIRVJfQ1RY
X21vZGUoY3R4KSkgew0KKwljYXNlIEVWUF9DSVBIX0VDQl9NT0RFOg0KKwkJ
ZG8Jew0KKwkJCWlmIChpbnBfbWlzYWxpZ25lZCkNCisJCQkJaW5wID0gcGFk
bG9ja19tZW1jcHkob3V0LCBpbl9hcmcsIGNodW5rKTsNCisJCQllbHNlDQor
CQkJCWlucCA9IGluX2FyZzsNCisJCQlpbl9hcmcgKz0gY2h1bms7DQorDQor
CQkJcGFkbG9ja194Y3J5cHRfZWNiKGNodW5rL0FFU19CTE9DS19TSVpFLCBj
ZGF0YSwgb3V0LCBpbnApOw0KKw0KKwkJCWlmIChvdXRfbWlzYWxpZ25lZCkN
CisJCQkJb3V0X2FyZyA9IHBhZGxvY2tfbWVtY3B5KG91dF9hcmcsIG91dCwg
Y2h1bmspICsgY2h1bms7DQorCQkJZWxzZQ0KKwkJCQlvdXQgICAgID0gb3V0
X2FyZys9Y2h1bms7DQorDQorCQkJbmJ5dGVzIC09IGNodW5rOw0KKwkJCWNo
dW5rICAgPSBQQURMT0NLX0NIVU5LOw0KKwkJfSB3aGlsZSAobmJ5dGVzKTsN
CisJCWJyZWFrOw0KKw0KKwljYXNlIEVWUF9DSVBIX0NCQ19NT0RFOg0KKwkJ
bWVtY3B5KGNkYXRhLT5pdiwgY3R4LT5pdiwgQUVTX0JMT0NLX1NJWkUpOw0K
KwkJZ290byBjYmNfc2hvcnRjdXQ7DQorCQlkbwl7DQorCQkJaWYgKGl2ICE9
IGNkYXRhLT5pdikNCisJCQkJbWVtY3B5KGNkYXRhLT5pdiwgaXYsIEFFU19C
TE9DS19TSVpFKTsNCisJCQljaHVuayA9IFBBRExPQ0tfQ0hVTks7DQorCQlj
YmNfc2hvcnRjdXQ6IC8qIG9wdGltaXplIGZvciBzbWFsbCBpbnB1dCAqLw0K
KwkJCWlmIChpbnBfbWlzYWxpZ25lZCkNCisJCQkJaW5wID0gcGFkbG9ja19t
ZW1jcHkob3V0LCBpbl9hcmcsIGNodW5rKTsNCisJCQllbHNlDQorCQkJCWlu
cCA9IGluX2FyZzsNCisJCQlpbl9hcmcgKz0gY2h1bms7DQorDQorCQkJaXYg
PSBwYWRsb2NrX3hjcnlwdF9jYmMoY2h1bmsvQUVTX0JMT0NLX1NJWkUsIGNk
YXRhLCBvdXQsIGlucCk7DQorDQorCQkJaWYgKG91dF9taXNhbGlnbmVkKQ0K
KwkJCQlvdXRfYXJnID0gcGFkbG9ja19tZW1jcHkob3V0X2FyZywgb3V0LCBj
aHVuaykgKyBjaHVuazsNCisJCQllbHNlDQorCQkJCW91dCAgICAgPSBvdXRf
YXJnKz1jaHVuazsNCisNCisJCX0gd2hpbGUgKG5ieXRlcyAtPSBjaHVuayk7
DQorCQltZW1jcHkoY3R4LT5pdiwgaXYsIEFFU19CTE9DS19TSVpFKTsNCisJ
CWJyZWFrOw0KKw0KKwljYXNlIEVWUF9DSVBIX0NGQl9NT0RFOg0KKwkJbWVt
Y3B5IChpdiA9IGNkYXRhLT5pdiwgY3R4LT5pdiwgQUVTX0JMT0NLX1NJWkUp
Ow0KKwkJY2h1bmsgJj0gfihBRVNfQkxPQ0tfU0laRS0xKTsNCisJCWlmIChj
aHVuaykJZ290byBjZmJfc2hvcnRjdXQ7DQorCQllbHNlCQlnb3RvIGNmYl9z
a2lwbG9vcDsNCisJCWRvCXsNCisJCQlpZiAoaXYgIT0gY2RhdGEtPml2KQ0K
KwkJCQltZW1jcHkoY2RhdGEtPml2LCBpdiwgQUVTX0JMT0NLX1NJWkUpOw0K
KwkJCWNodW5rID0gUEFETE9DS19DSFVOSzsNCisJCWNmYl9zaG9ydGN1dDog
Lyogb3B0aW1pemUgZm9yIHNtYWxsIGlucHV0ICovDQorCQkJaWYgKGlucF9t
aXNhbGlnbmVkKQ0KKwkJCQlpbnAgPSBwYWRsb2NrX21lbWNweShvdXQsIGlu
X2FyZywgY2h1bmspOw0KKwkJCWVsc2UNCisJCQkJaW5wID0gaW5fYXJnOw0K
KwkJCWluX2FyZyArPSBjaHVuazsNCisNCisJCQlpdiA9IHBhZGxvY2tfeGNy
eXB0X2NmYihjaHVuay9BRVNfQkxPQ0tfU0laRSwgY2RhdGEsIG91dCwgaW5w
KTsNCisNCisJCQlpZiAob3V0X21pc2FsaWduZWQpDQorCQkJCW91dF9hcmcg
PSBwYWRsb2NrX21lbWNweShvdXRfYXJnLCBvdXQsIGNodW5rKSArIGNodW5r
Ow0KKwkJCWVsc2UNCisJCQkJb3V0ICAgICA9IG91dF9hcmcrPWNodW5rOw0K
Kw0KKwkJCW5ieXRlcyAtPSBjaHVuazsNCisJCX0gd2hpbGUgKG5ieXRlcyA+
PSBBRVNfQkxPQ0tfU0laRSk7DQorDQorCQljZmJfc2tpcGxvb3A6DQorCQlp
ZiAobmJ5dGVzKSB7DQorCQkJdW5zaWduZWQgY2hhciAqaXZwID0gY2RhdGEt
Pml2Ow0KKw0KKwkJCWlmIChpdiAhPSBpdnApIHsNCisJCQkJbWVtY3B5KGl2
cCwgaXYsIEFFU19CTE9DS19TSVpFKTsNCisJCQkJaXYgPSBpdnA7DQorCQkJ
fQ0KKwkJCWN0eC0+bnVtID0gbmJ5dGVzOw0KKwkJCWlmIChjZGF0YS0+Y3dv
cmQuYi5lbmNkZWMpIHsNCisJCQkJY2RhdGEtPmN3b3JkLmIuZW5jZGVjPTA7
DQorCQkJCXBhZGxvY2tfcmVsb2FkX2tleSgpOw0KKwkJCQlwYWRsb2NrX3hj
cnlwdF9lY2IoMSxjZGF0YSxpdnAsaXZwKTsNCisJCQkJY2RhdGEtPmN3b3Jk
LmIuZW5jZGVjPTE7DQorCQkJCXBhZGxvY2tfcmVsb2FkX2tleSgpOw0KKwkJ
CQl3aGlsZShuYnl0ZXMpIHsNCisJCQkJCXVuc2lnbmVkIGNoYXIgYyA9ICoo
aW5fYXJnKyspOw0KKwkJCQkJKihvdXRfYXJnKyspID0gYyBeICppdnA7DQor
CQkJCQkqKGl2cCsrKSA9IGMsIG5ieXRlcy0tOw0KKwkJCQl9DQorCQkJfQ0K
KwkJCWVsc2UgewlwYWRsb2NrX3JlbG9hZF9rZXkoKTsNCisJCQkJcGFkbG9j
a194Y3J5cHRfZWNiKDEsY2RhdGEsaXZwLGl2cCk7DQorCQkJCXBhZGxvY2tf
cmVsb2FkX2tleSgpOw0KKwkJCQl3aGlsZSAobmJ5dGVzKSB7DQorCQkJCQkq
aXZwID0gKihvdXRfYXJnKyspID0gKihpbl9hcmcrKykgXiAqaXZwOw0KKwkJ
CQkJaXZwKyssIG5ieXRlcy0tOw0KKwkJCQl9DQorCQkJfQ0KKwkJfQ0KKw0K
KwkJbWVtY3B5KGN0eC0+aXYsIGl2LCBBRVNfQkxPQ0tfU0laRSk7DQorCQli
cmVhazsNCisNCisJY2FzZSBFVlBfQ0lQSF9PRkJfTU9ERToNCisJCW1lbWNw
eShjZGF0YS0+aXYsIGN0eC0+aXYsIEFFU19CTE9DS19TSVpFKTsNCisJCWNo
dW5rICY9IH4oQUVTX0JMT0NLX1NJWkUtMSk7DQorCQlpZiAoY2h1bmspIGRv
CXsNCisJCQlpZiAoaW5wX21pc2FsaWduZWQpDQorCQkJCWlucCA9IHBhZGxv
Y2tfbWVtY3B5KG91dCwgaW5fYXJnLCBjaHVuayk7DQorCQkJZWxzZQ0KKwkJ
CQlpbnAgPSBpbl9hcmc7DQorCQkJaW5fYXJnICs9IGNodW5rOw0KKw0KKwkJ
CXBhZGxvY2tfeGNyeXB0X29mYihjaHVuay9BRVNfQkxPQ0tfU0laRSwgY2Rh
dGEsIG91dCwgaW5wKTsNCisNCisJCQlpZiAob3V0X21pc2FsaWduZWQpDQor
CQkJCW91dF9hcmcgPSBwYWRsb2NrX21lbWNweShvdXRfYXJnLCBvdXQsIGNo
dW5rKSArIGNodW5rOw0KKwkJCWVsc2UNCisJCQkJb3V0ICAgICA9IG91dF9h
cmcrPWNodW5rOw0KKw0KKwkJCW5ieXRlcyAtPSBjaHVuazsNCisJCQljaHVu
ayAgID0gUEFETE9DS19DSFVOSzsNCisJCX0gd2hpbGUgKG5ieXRlcyA+PSBB
RVNfQkxPQ0tfU0laRSk7DQorDQorCQlpZiAobmJ5dGVzKSB7DQorCQkJdW5z
aWduZWQgY2hhciAqaXZwID0gY2RhdGEtPml2Ow0KKw0KKwkJCWN0eC0+bnVt
ID0gbmJ5dGVzOw0KKwkJCXBhZGxvY2tfcmVsb2FkX2tleSgpOwkvKiBlbXBp
cmljYWxseSBmb3VuZCAqLw0KKwkJCXBhZGxvY2tfeGNyeXB0X2VjYigxLGNk
YXRhLGl2cCxpdnApOw0KKwkJCXBhZGxvY2tfcmVsb2FkX2tleSgpOwkvKiBl
bXBpcmljYWxseSBmb3VuZCAqLw0KKwkJCXdoaWxlIChuYnl0ZXMpIHsNCisJ
CQkJKihvdXRfYXJnKyspID0gKihpbl9hcmcrKykgXiAqaXZwOw0KKwkJCQlp
dnArKywgbmJ5dGVzLS07DQorCQkJfQ0KKwkJfQ0KKw0KKwkJbWVtY3B5KGN0
eC0+aXYsIGNkYXRhLT5pdiwgQUVTX0JMT0NLX1NJWkUpOw0KKwkJYnJlYWs7
DQorDQorCWRlZmF1bHQ6DQorCQlyZXR1cm4gMDsNCisJfQ0KKw0KKwkvKiBD
bGVhbiB0aGUgcmVhbGlnbiBidWZmZXIgaWYgaXQgd2FzIHVzZWQgKi8NCisJ
aWYgKG91dF9taXNhbGlnbmVkKSB7DQorCQl2b2xhdGlsZSB1bnNpZ25lZCBs
b25nICpwPSh2b2lkICopb3V0Ow0KKwkJc2l6ZV90ICAgbiA9IGFsbG9jYXRl
ZC9zaXplb2YoKnApOw0KKwkJd2hpbGUgKG4tLSkgKnArKz0wOw0KKwl9DQor
DQorCW1lbXNldChjZGF0YS0+aXYsIDAsIEFFU19CTE9DS19TSVpFKTsNCisN
CisJcmV0dXJuIDE7DQorfQ0KKw0KKyNlbmRpZiAvKiBPUEVOU1NMX05PX0FF
UyAqLw0KKw0KKy8qID09PT09IFJhbmRvbSBOdW1iZXIgR2VuZXJhdG9yID09
PT09ICovDQorLyoNCisgKiBUaGlzIGNvZGUgaXMgbm90IGVuZ2FnZWQuIFRo
ZSByZWFzb24gaXMgdGhhdCBpdCBkb2VzIG5vdCBjb21wbHkNCisgKiB3aXRo
IHJlY29tbWVuZGF0aW9ucyBmb3IgVklBIFJORyB1c2FnZSBmb3Igc2VjdXJl
IGFwcGxpY2F0aW9ucw0KKyAqIChwb3N0ZWQgYXQgaHR0cDovL3d3dy52aWEu
Y29tLnR3L2VuL3ZpYWMzL2MzLmpzcCkgbm9yIGRvZXMgaXQNCisgKiBwcm92
aWRlIG1lYW5pbmdmdWwgZXJyb3IgY29udHJvbC4uLg0KKyAqLw0KKy8qIFdy
YXBwZXIgdGhhdCBwcm92aWRlcyBhbiBpbnRlcmZhY2UgYmV0d2VlbiB0aGUg
QVBJIGFuZCANCisgICB0aGUgcmF3IFBhZExvY2sgUk5HICovDQorc3RhdGlj
IGludA0KK3BhZGxvY2tfcmFuZF9ieXRlcyh1bnNpZ25lZCBjaGFyICpvdXRw
dXQsIGludCBjb3VudCkNCit7DQorCXVuc2lnbmVkIGludCBlYXgsIGJ1ZjsN
CisNCisJd2hpbGUgKGNvdW50ID49IDgpIHsNCisJCWVheCA9IHBhZGxvY2tf
eHN0b3JlKG91dHB1dCwgMCk7DQorCQlpZiAoIShlYXgmKDE8PDYpKSkJcmV0
dXJuIDA7IC8qIFJORyBkaXNhYmxlZCAqLw0KKwkJLyogdGhpcyAtLS12di0t
LSBjb3ZlcnMgREMgYmlhcywgUmF3IEJpdHMgYW5kIFN0cmluZyBGaWx0ZXIg
Ki8NCisJCWlmIChlYXgmKDB4MUY8PDEwKSkJcmV0dXJuIDA7DQorCQlpZiAo
KGVheCYweDFGKT09MCkJY29udGludWU7IC8qIG5vIGRhdGEsIHJldHJ5Li4u
ICovDQorCQlpZiAoKGVheCYweDFGKSE9OCkJcmV0dXJuIDA7IC8qIGZhdGFs
IGZhaWx1cmUuLi4gICovDQorCQlvdXRwdXQgKz0gODsNCisJCWNvdW50ICAt
PSA4Ow0KKwl9DQorCXdoaWxlIChjb3VudCA+IDApIHsNCisJCWVheCA9IHBh
ZGxvY2tfeHN0b3JlKCZidWYsIDMpOw0KKwkJaWYgKCEoZWF4JigxPDw2KSkp
CXJldHVybiAwOyAvKiBSTkcgZGlzYWJsZWQgKi8NCisJCS8qIHRoaXMgLS0t
dnYtLS0gY292ZXJzIERDIGJpYXMsIFJhdyBCaXRzIGFuZCBTdHJpbmcgRmls
dGVyICovDQorCQlpZiAoZWF4JigweDFGPDwxMCkpCXJldHVybiAwOw0KKwkJ
aWYgKChlYXgmMHgxRik9PTApCWNvbnRpbnVlOyAvKiBubyBkYXRhLCByZXRy
eS4uLiAqLw0KKwkJaWYgKChlYXgmMHgxRikhPTEpCXJldHVybiAwOyAvKiBm
YXRhbCBmYWlsdXJlLi4uICAqLw0KKwkJKm91dHB1dCsrID0gKHVuc2lnbmVk
IGNoYXIpYnVmOw0KKwkJY291bnQtLTsNCisJfQ0KKwkqKHZvbGF0aWxlIHVu
c2lnbmVkIGludCAqKSZidWY9MDsNCisNCisJcmV0dXJuIDE7DQorfQ0KKw0K
Ky8qIER1bW15IGJ1dCBuZWNlc3NhcnkgZnVuY3Rpb24gKi8NCitzdGF0aWMg
aW50DQorcGFkbG9ja19yYW5kX3N0YXR1cyh2b2lkKQ0KK3sNCisJcmV0dXJu
IDE7DQorfQ0KKw0KKy8qIFByZXBhcmUgc3RydWN0dXJlIGZvciByZWdpc3Ry
YXRpb24gKi8NCitzdGF0aWMgUkFORF9NRVRIT0QgcGFkbG9ja19yYW5kID0g
ew0KKwlOVUxMLAkJCS8qIHNlZWQgKi8NCisJcGFkbG9ja19yYW5kX2J5dGVz
LAkvKiBieXRlcyAqLw0KKwlOVUxMLAkJCS8qIGNsZWFudXAgKi8NCisJTlVM
TCwJCQkvKiBhZGQgKi8NCisJcGFkbG9ja19yYW5kX2J5dGVzLAkvKiBwc2V1
ZG9yYW5kICovDQorCXBhZGxvY2tfcmFuZF9zdGF0dXMsCS8qIHJhbmQgc3Rh
dHVzICovDQorfTsNCisNCisjZW5kaWYgLyogQ09NUElMRV9IV19QQURMT0NL
ICovDQorDQorI2VuZGlmIC8qICFPUEVOU1NMX05PX0hXX1BBRExPQ0sgKi8N
CisjZW5kaWYgLyogIU9QRU5TU0xfTk9fSFcgKi8NCg==

--0-1446624538-1168367766=:2812--