WG: [Xorp-hackers] Bugzilla #161

"Patrick Preuß" deathdealer@gmx.net
Thu, 8 Sep 2005 13:41:01 +0200 (MEST)


This is a MIME encapsulated multipart message -
please use a MIME-compliant e-mail program to open it.

Dies ist eine mehrteilige Nachricht im MIME-Format -
bitte verwenden Sie zum Lesen ein MIME-konformes Mailprogramm.

--========GMXBoundary186531126179661
Content-Type: text/plain; charset="iso-8859-1"
Content-Transfer-Encoding: 8bit

> --- Ursprüngliche Nachricht ---
> Von: 'Kristian Larsson' <kristian@juniks.net>
> An: Patrick Preuss <deathdealer@gmx.net>
> Kopie: xorp-hackers@xorp.org
> Betreff: Re: WG: [Xorp-hackers] Bugzilla #161
> Datum: Wed, 7 Sep 2005 13:36:31 +0200
> 
> On Wed, Sep 07, 2005 at 12:05:35PM +0200, Patrick Preuss wrote:
> > Hello Kristian,
> > 
> > > Sorry for dual posts here but I couldn't confirm
> > > this before as I did not have access to a xorp box
> > > When doing show route table ipv4 unicast final I
> > > see:
> > > Xorp> show route table ipv4 unicast final 
> > > Network 10.0.0.0/24
> > >   Nexthop := 192.168.77.1
> > >   Metric := 0    Protocol := static Interface := eth0 Vif := eth0
> > > Network 192.168.77.0/24
> > >   Nexthop := 192.168.77.90
> > >   Metric := 0    Protocol := connected Interface := eth0 Vif := eth0
> > > 
> > > Isn't that information enough?
> > 
> > Have used <TAB> or <?> for completing the line, I know there is a
> problem
> > with both in the current cvs, I've found the point for <?> completion so
> far
> > It is in the cli_command.cc there are two entrys with <Enter> for the
> <?> I
> > have found the formatting line, for the <Tab> not jet.
> 
> <?> gives me an extra blank line
>  Xorp> show route table ipv4 unicast final ?
>  Possible completions:
>   <[Enter]>       Execute this command
> 
>   brief           Show IPv4 winning routes
>   |               Pipe through a command
> 
> while <tab> is missing one :
>  Xorp> show route table ipv4 unicast final  
>  `final' is ambiguous.
>  Possible completions:
>   <[Enter]>       Execute this command  brief Show IPv4 winning routes
>   |               Pipe through a command
> 
> It seems that the missing blank line exist 
> on every node that are both executable and 
> have sub-nodes.
> 
> Patrick, I checked the code regarding administrative
> distance and protocol. I now see what you mean and I
> agree that it's not a pretty solution. There should be
> something like origin: ospf.0
> where ospf.0 would be your first ospf process. Later
> when we (cause we will :) ) support several routing 
> processes it would just use a different number. 
> Just my $0.02
> 
> Regards,
> Kristian
> 

Hello Kristian,

can you try the attactched cli_command.cc should go the dir cli. i think no 
it should work fine.

Regards,
   Patrick


-- 
best regards 
Patrick Marc Preuss
----------------------------------------------------------------------
--

 "...a hundred billion castaways looking for a home."
                                  - Sting "Message in a Bottle" (1979)

GMX DSL = Maximale Leistung zum minimalen Preis!
2000 MB nur 2,99, Flatrate ab 4,99 Euro/Monat: http://www.gmx.net/de/go/dsl
--========GMXBoundary186531126179661
Content-Type: application/octet-stream; name="cli_command.cc"
Content-Transfer-Encoding: base64
Content-Disposition: attachment; filename="cli_command.cc"

Ly8gLSotIGMtYmFzaWMtb2Zmc2V0OiA0OyB0YWItd2lkdGg6IDg7IGluZGVudC10YWJzLW1vZGU6
IHQgLSotCgovLyBDb3B5cmlnaHQgKGMpIDIwMDEtMjAwNSBJbnRlcm5hdGlvbmFsIENvbXB1dGVy
IFNjaWVuY2UgSW5zdGl0dXRlCi8vCi8vIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZy
ZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhCi8vIGNvcHkgb2YgdGhpcyBz
b2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUgIlNvZnR3YXJl
IikKLy8gdG8gZGVhbCBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgc3ViamVj
dCB0byB0aGUgY29uZGl0aW9ucwovLyBsaXN0ZWQgaW4gdGhlIFhPUlAgTElDRU5TRSBmaWxlLiBU
aGVzZSBjb25kaXRpb25zIGluY2x1ZGU6IHlvdSBtdXN0Ci8vIHByZXNlcnZlIHRoaXMgY29weXJp
Z2h0IG5vdGljZSwgYW5kIHlvdSBjYW5ub3QgbWVudGlvbiB0aGUgY29weXJpZ2h0Ci8vIGhvbGRl
cnMgaW4gYWR2ZXJ0aXNpbmcgcmVsYXRlZCB0byB0aGUgU29mdHdhcmUgd2l0aG91dCB0aGVpciBw
ZXJtaXNzaW9uLgovLyBUaGUgU29mdHdhcmUgaXMgcHJvdmlkZWQgV0lUSE9VVCBBTlkgV0FSUkFO
VFksIEVYUFJFU1MgT1IgSU1QTElFRC4gVGhpcwovLyBub3RpY2UgaXMgYSBzdW1tYXJ5IG9mIHRo
ZSBYT1JQIExJQ0VOU0UgZmlsZTsgdGhlIGxpY2Vuc2UgaW4gdGhhdCBmaWxlIGlzCi8vIGxlZ2Fs
bHkgYmluZGluZy4KCiNpZGVudCAiJFhPUlA6IHhvcnAvY2xpL2NsaV9jb21tYW5kLmNjLHYgMS4x
OSAyMDA1LzA4LzIzIDAxOjE4OjU5IHBhdmxpbiBFeHAgJCIKCgovLwovLyBDTEkgKENvbW1hbmQt
TGluZSBJbnRlcmZhY2UpIGNvbW1hbmRzIHN0cnVjdHVyaW5nIGltcGxlbWVudGF0aW9uCi8vCgoK
I2luY2x1ZGUgImNsaV9tb2R1bGUuaCIKI2luY2x1ZGUgImxpYnhvcnAveG9ycC5oIgojaW5jbHVk
ZSAibGlieG9ycC94bG9nLmgiCiNpbmNsdWRlICJsaWJ4b3JwL2RlYnVnLmgiCiNpbmNsdWRlICJs
aWJ4b3JwL2lwdnguaGgiCiNpbmNsdWRlICJsaWJ4b3JwL3Rva2VuLmhoIgojaW5jbHVkZSAibGli
eG9ycC91dGlscy5oaCIKCiNpbmNsdWRlICJjbGlfY29tbWFuZF9waXBlLmhoIgoKCi8vCi8vIEV4
cG9ydGVkIHZhcmlhYmxlcwovLwoKLy8KLy8gTG9jYWwgY29uc3RhbnRzIGRlZmluaXRpb25zCi8v
CgovLwovLyBMb2NhbCBzdHJ1Y3R1cmVzL2NsYXNzZXMsIHR5cGVkZWZzIGFuZCBtYWNyb3MKLy8K
CgovLwovLyBMb2NhbCB2YXJpYWJsZXMKLy8KCi8vCi8vIExvY2FsIGZ1bmN0aW9ucyBwcm90b3R5
cGVzCi8vCgoKQ2xpQ29tbWFuZDo6Q2xpQ29tbWFuZChDbGlDb21tYW5kICppbml0X3BhcmVudF9j
b21tYW5kLAoJCSAgICAgICBjb25zdCBzdHJpbmcmIGluaXRfY29tbWFuZF9uYW1lLAoJCSAgICAg
ICBjb25zdCBzdHJpbmcmIGluaXRfY29tbWFuZF9oZWxwKQogICAgOiBfcGFyZW50X2NvbW1hbmQo
aW5pdF9wYXJlbnRfY29tbWFuZCksCiAgICAgIF9uYW1lKGluaXRfY29tbWFuZF9uYW1lKSwKICAg
ICAgX2hlbHAoaW5pdF9jb21tYW5kX2hlbHApCnsKICAgIGlmIChfcGFyZW50X2NvbW1hbmQgIT0g
TlVMTCkKCV9yb290X2NvbW1hbmQgPSBfcGFyZW50X2NvbW1hbmQtPnJvb3RfY29tbWFuZCgpOwog
ICAgZWxzZQoJX3Jvb3RfY29tbWFuZCA9IHRoaXM7CiAgICAKICAgIHNldF9hbGxvd19jZChmYWxz
ZSwgIiIpOwogICAgc2V0X2Nhbl9waXBlKGZhbHNlKTsJLy8gWFhYOiBkZWZhdWx0CiAgICBzZXRf
Y2xpX2NvbW1hbmRfcGlwZShOVUxMKTsKICAgIAogICAgLy8gU2V0IHRoZSBjb21tYW5kLWNvbXBs
ZXRpb24gaGVscCBzdHJpbmcKICAgIC8vIFRPRE86IHBhcmFtZXRlcml6ZSB0aGUgaGFyZC1jb2Rl
ZCBudW1iZXIKICAgIF9oZWxwX2NvbXBsZXRpb24gPSBjX2Zvcm1hdCgiICUqcyVzXHJcbiIsIChp
bnQpKDE1IC0gX25hbWUuc2l6ZSgpKSwgIiAiLAoJCQkJX2hlbHAuY19zdHIoKSk7CgogICAgLy8g
WFhYOiBzZXQgdGhlIENMSSBjb21wbGV0aW9uIGZ1bmN0aW9uIHRvIGl0cyBkZWZhdWx0IHZhbHVl
CiAgICBzZXRfY2xpX2NvbXBsZXRpb25fZnVuYyhjbGlfYXR0ZW1wdF9jb21tYW5kX2NvbXBsZXRp
b25fYnluYW1lKTsKICAgIAogICAgX2hhc19keW5hbWljX2NoaWxkcmVuID0gZmFsc2U7Cn0KCkNs
aUNvbW1hbmQ6On5DbGlDb21tYW5kKCkKewogICAgLy8gRGVsZXRlIHJlY3Vyc2l2ZWx5IGFsbCBj
aGlsZCBjb21tYW5kcwogICAgZGVsZXRlX3BvaW50ZXJzX2xpc3QoX2NoaWxkX2NvbW1hbmRfbGlz
dCk7Cn0KCi8vCi8vIEVuYWJsZS9kaXNhYmxlICJjZCIgdG8gdGhpcyBjb21tYW5kLCBhbmQgc2V0
IHRoZSAiY2QgcHJvbXB0IgovLwp2b2lkCkNsaUNvbW1hbmQ6OnNldF9hbGxvd19jZChib29sIHYs
IGNvbnN0IHN0cmluZyYgaW5pdF9jZF9wcm9tcHQpCnsKICAgIF9hbGxvd19jZCA9IHY7CiAgICBp
ZiAoaW5pdF9jZF9wcm9tcHQuc2l6ZSgpKQoJX2NkX3Byb21wdCA9IGluaXRfY2RfcHJvbXB0Owp9
CgovLwovLyBSZXR1cm4gJVhPUlBfT0ssIG9uIHN1Y2Nlc3MsIG90aGVyd2lzZSAlWE9SUF9FUlJP
UgovLwppbnQKQ2xpQ29tbWFuZDo6YWRkX2NvbW1hbmQoQ2xpQ29tbWFuZCAqY2hpbGRfY29tbWFu
ZCkKewogICAgbGlzdDxDbGlDb21tYW5kICo+OjppdGVyYXRvciBpdGVyLCBpbnNlcnRfcG9zOwog
ICAgCiAgICBpbnNlcnRfcG9zID0gY2hpbGRfY29tbWFuZF9saXN0KCkuYmVnaW4oKTsKICAgIAog
ICAgLy8gQ2hlY2sgaWYgY29tbWFuZCBhbHJlYWR5IGluc3RhbGxlZCwgYXMgd2VsbCBhcyBmaW5k
IHRoZQogICAgLy8gcG9zaXRpb24gdG8gaW5zdGFsbCB0aGUgY29tbWFuZCAoYmFzZWQgb24gbGV4
aWNvZ3JhcGhpY2FsIG9yZGVyaW5nKS4KICAgIGZvciAoaXRlciA9IGNoaWxkX2NvbW1hbmRfbGlz
dCgpLmJlZ2luKCk7CgkgaXRlciAhPSBjaGlsZF9jb21tYW5kX2xpc3QoKS5lbmQoKTsKCSArK2l0
ZXIpIHsKCUNsaUNvbW1hbmQgKmNsaV9jb21tYW5kID0gKml0ZXI7CglpZiAoY2xpX2NvbW1hbmQt
PmlzX3NhbWVfY29tbWFuZChjaGlsZF9jb21tYW5kLT5uYW1lKCkpKSB7CgkgICAgLy8gQ29tbWFu
ZCBhbHJlYWR5IGluc3RhbGxlZAoJICAgIFhMT0dfRVJST1IoIkNvbW1hbmQgYWxyZWFkeSBpbnN0
YWxsZWQiKTsKCSAgICByZXR1cm4gKFhPUlBfRVJST1IpOwoJfQoJaWYgKGNsaV9jb21tYW5kLT5u
YW1lKCkgPCBjaGlsZF9jb21tYW5kLT5uYW1lKCkpIHsKCSAgICBpbnNlcnRfcG9zID0gaXRlcjsK
CSAgICArK2luc2VydF9wb3M7Cgl9CiAgICB9CiAgICAKICAgIGlmIChpbnNlcnRfcG9zID09IGNo
aWxkX2NvbW1hbmRfbGlzdCgpLmVuZCgpKQoJX2NoaWxkX2NvbW1hbmRfbGlzdC5wdXNoX2JhY2so
Y2hpbGRfY29tbWFuZCk7CiAgICBlbHNlCglfY2hpbGRfY29tbWFuZF9saXN0Lmluc2VydChpbnNl
cnRfcG9zLCBjaGlsZF9jb21tYW5kKTsKICAgIGNoaWxkX2NvbW1hbmQtPnNldF9yb290X2NvbW1h
bmQodGhpcy0+cm9vdF9jb21tYW5kKCkpOwogICAgCiAgICByZXR1cm4oWE9SUF9PSyk7Cn0KCi8v
Ci8vIENyZWF0ZSBhIG5ldyBjb21tYW5kLgovLyBSZXR1cm4gdGhlIG5ldyBjaGlsZCBjb21tYW5k
IG9uIHN1Y2Nlc3MsIG90aGVyd2lzZSBOVUxMLgovLyBYWFg6IEJ5IGRlZmF1bHQsIHdlIENBTk5P
VCAiY2QiIHRvIHRoaXMgY29tbWFuZC4KLy8gWFhYOiBJZiBAaXNfbXVsdGlsZXZlbF9jb21tYW5k
IGlzIHRydWUsIHRoZW4gQGluaXRfY29tbWFuZF9uYW1lIGNhbgovLyBpbmNsdWRlIG1vcmUgdGhh
biBvbmUgY29tbWFuZCBsZXZlbHMgaW4gdGhlIG1pZGRsZS4KLy8gRS5nLiAic2hvdyB2ZXJzaW9u
IHBpbSIuIEhvd2V2ZXIsIGNvbW1hbmRzICJzaG93IiBhbmQgInNob3cgdmVyc2lvbiIgbXVzdAov
LyBoYXZlIGJlZW4gaW5zdGFsbGVkIGZpcnN0LgovLwpDbGlDb21tYW5kICoKQ2xpQ29tbWFuZDo6
YWRkX2NvbW1hbmQoY29uc3Qgc3RyaW5nJiBpbml0X2NvbW1hbmRfbmFtZSwKCQkJY29uc3Qgc3Ry
aW5nJiBpbml0X2NvbW1hbmRfaGVscCwKCQkJYm9vbCBpc19tdWx0aWxldmVsX2NvbW1hbmQpCnsK
ICAgIENsaUNvbW1hbmQgKnBhcmVudF9jbGlfY29tbWFuZCA9IE5VTEw7CiAgICBDbGlDb21tYW5k
ICpjbGlfY29tbWFuZCA9IE5VTEw7CiAgICB2ZWN0b3I8c3RyaW5nPiBjb21tYW5kX3Rva2VuczsK
ICAgIHN0cmluZyB0b2tlbjsKICAgIHN0cmluZyB0b2tlbl9saW5lID0gaW5pdF9jb21tYW5kX25h
bWU7CiAgICBzdHJpbmcgY29tbWFuZF9uYW1lX3N0cmluZzsKICAgIAogICAgaWYgKGlzX211bHRp
bGV2ZWxfY29tbWFuZCkgewoJLy8gQ3JlYXRlIGEgdmVjdG9yIG9mIGFsbCB0YWtlbnMgaW4gdGhl
IGNvbW1hbmQKCWZvciAodG9rZW4gPSBwb3BfdG9rZW4odG9rZW5fbGluZSk7CgkgICAgICEgdG9r
ZW4uZW1wdHkoKTsKCSAgICAgdG9rZW4gPSBwb3BfdG9rZW4odG9rZW5fbGluZSkpIHsKCSAgICBj
b21tYW5kX3Rva2Vucy5wdXNoX2JhY2sodG9rZW4pOwoJfQogICAgfSBlbHNlIHsKCWlmICh0b2tl
bl9saW5lLmVtcHR5KCkpCgkgICAgcmV0dXJuIChOVUxMKTsKCWNvbW1hbmRfdG9rZW5zLnB1c2hf
YmFjayh0b2tlbl9saW5lKTsKICAgIH0KCiAgICBpZiAoY29tbWFuZF90b2tlbnMuZW1wdHkoKSkK
CXJldHVybiAoTlVMTCk7CiAgICBjb21tYW5kX25hbWVfc3RyaW5nID0gY29tbWFuZF90b2tlbnNb
Y29tbWFuZF90b2tlbnMuc2l6ZSgpIC0gMV07CiAgICAKICAgIC8vIFRyYXZlcnNlIGFsbCB0b2tl
bnMgYW5kIGZpbmQgdGhlIHBhcmVudCBjb21tYW5kIHdoZXJlIHRvIGluc3RhbGwKICAgIC8vIHRo
ZSBuZXcgY29tbWFuZAogICAgcGFyZW50X2NsaV9jb21tYW5kID0gdGhpczsKICAgIGZvciAoc2l6
ZV90IGkgPSAwOyBpIDwgY29tbWFuZF90b2tlbnMuc2l6ZSgpIC0gMTsgaSsrKSB7CglwYXJlbnRf
Y2xpX2NvbW1hbmQgPSBwYXJlbnRfY2xpX2NvbW1hbmQtPmNvbW1hbmRfZmluZChjb21tYW5kX3Rv
a2Vuc1tpXSk7CglpZiAocGFyZW50X2NsaV9jb21tYW5kID09IE5VTEwpCgkgICAgYnJlYWs7CiAg
ICB9CiAgICBpZiAocGFyZW50X2NsaV9jb21tYW5kID09IE5VTEwpCglnb3RvIGVycm9yX2xhYmVs
X21pc3Npbmc7CiAgICAKICAgIGNsaV9jb21tYW5kID0gbmV3IENsaUNvbW1hbmQocGFyZW50X2Ns
aV9jb21tYW5kLAoJCQkJIGNvbW1hbmRfbmFtZV9zdHJpbmcsCgkJCQkgaW5pdF9jb21tYW5kX2hl
bHApOwogICAgCiAgICBpZiAocGFyZW50X2NsaV9jb21tYW5kLT5hZGRfY29tbWFuZChjbGlfY29t
bWFuZCkgPCAwKSB7CglkZWxldGUgY2xpX2NvbW1hbmQ7Cglnb3RvIGVycm9yX2xhYmVsX2ZhaWxl
ZDsKICAgIH0KICAgIAogICAgY2xpX2NvbW1hbmQtPnNldF9hbGxvd19jZChmYWxzZSwgIiIpOwog
ICAgCiAgICByZXR1cm4gKGNsaV9jb21tYW5kKTsKICAgIAogZXJyb3JfbGFiZWxfbWlzc2luZzoK
ICAgIFhMT0dfRVJST1IoIkVycm9yIGluc3RhbGxpbmcgJyVzJyBvbiBub24tZXhpc3RlbnQgbm9k
ZSAnJXMnIiwgCgkgICAgICAgaW5pdF9jb21tYW5kX25hbWUuY19zdHIoKSwKCSAgICAgICAodGhp
cy0+bmFtZSgpLnNpemUoKSA+IDApID8gdGhpcy0+bmFtZSgpLmNfc3RyKCkgOiAiPFJPT1Q+Iik7
CiAgICByZXR1cm4gKE5VTEwpOwkJLy8gSW52YWxpZCBwYXRoIHRvIHRoZSBjb21tYW5kCiBlcnJv
cl9sYWJlbF9mYWlsZWQ6CiAgICBYTE9HX0VSUk9SKCJFcnJvciBpbnN0YWxsaW5nICclcycgb24g
JyVzJyIsIGluaXRfY29tbWFuZF9uYW1lLmNfc3RyKCksCgkgICAgICAgKHRoaXMtPm5hbWUoKS5z
aXplKCkgPiAwKSA/IHRoaXMtPm5hbWUoKS5jX3N0cigpIDogIjxST09UPiIpOwogICAgcmV0dXJu
IChOVUxMKTsJCS8vIEludmFsaWQgcGF0aCB0byB0aGUgY29tbWFuZAp9CgovLwovLyBDcmVhdGUg
YSBjb21tYW5kIGFuZCBhc3NpZ24gYSBwcm9jZXNzaW5nIGNhbGxiYWNrIHRvIGl0LgovLyBSZXR1
cm4gdGhlIG5ldyBjaGlsZCBjb21tYW5kIG9uIHN1Y2Nlc3MsIG90aGVyd2lzZSBOVUxMLgovLwpD
bGlDb21tYW5kICoKQ2xpQ29tbWFuZDo6YWRkX2NvbW1hbmQoY29uc3Qgc3RyaW5nJiBpbml0X2Nv
bW1hbmRfbmFtZSwKCQkJY29uc3Qgc3RyaW5nJiBpbml0X2NvbW1hbmRfaGVscCwKCQkJYm9vbCBp
c19tdWx0aWxldmVsX2NvbW1hbmQsCgkJCWNvbnN0IENMSV9QUk9DRVNTX0NBTExCQUNLJiBpbml0
X2NsaV9wcm9jZXNzX2NhbGxiYWNrKQp7CiAgICBDbGlDb21tYW5kICpjbGlfY29tbWFuZCA9IGFk
ZF9jb21tYW5kKGluaXRfY29tbWFuZF9uYW1lLAoJCQkJCSAgaW5pdF9jb21tYW5kX2hlbHAsCgkJ
CQkJICBpc19tdWx0aWxldmVsX2NvbW1hbmQpOwogICAgCiAgICBpZiAoY2xpX2NvbW1hbmQgPT0g
TlVMTCkKCXJldHVybiAoTlVMTCk7CiAgICBjbGlfY29tbWFuZC0+c2V0X2NsaV9wcm9jZXNzX2Nh
bGxiYWNrKGluaXRfY2xpX3Byb2Nlc3NfY2FsbGJhY2spOwogICAgY2xpX2NvbW1hbmQtPnNldF9h
bGxvd19jZChmYWxzZSwgIiIpOwogICAgaWYgKCEgaW5pdF9jbGlfcHJvY2Vzc19jYWxsYmFjay5p
c19lbXB0eSgpKSB7CgkvLyBYWFg6IGJ5IGRlZmF1bHQsIGVuYWJsZSBwaXBlIHByb2Nlc3Npbmcg
aWYgdGhlcmUgaXMgYSBjYWxsYmFjayBmdW5jCgljbGlfY29tbWFuZC0+c2V0X2Nhbl9waXBlKHRy
dWUpOwogICAgfQogICAgCiAgICByZXR1cm4gKGNsaV9jb21tYW5kKTsKfQoKLy8KLy8gQ3JlYXRl
IGEgY29tbWFuZCBhbmQgYXNzaWduIGEgcHJvY2Vzc2luZyBhbmQgYW4gaW50ZXJydXB0IGNhbGxi
YWNrcyB0byBpdC4KLy8gUmV0dXJuIHRoZSBuZXcgY2hpbGQgY29tbWFuZCBvbiBzdWNjZXNzLCBv
dGhlcndpc2UgTlVMTC4KLy8KQ2xpQ29tbWFuZCAqCkNsaUNvbW1hbmQ6OmFkZF9jb21tYW5kKGNv
bnN0IHN0cmluZyYgaW5pdF9jb21tYW5kX25hbWUsCgkJCWNvbnN0IHN0cmluZyYgaW5pdF9jb21t
YW5kX2hlbHAsCgkJCWJvb2wgaXNfbXVsdGlsZXZlbF9jb21tYW5kLAoJCQljb25zdCBDTElfUFJP
Q0VTU19DQUxMQkFDSyYgaW5pdF9jbGlfcHJvY2Vzc19jYWxsYmFjaywKCQkJY29uc3QgQ0xJX0lO
VEVSUlVQVF9DQUxMQkFDSyYgaW5pdF9jbGlfaW50ZXJydXB0X2NhbGxiYWNrKQp7CiAgICBDbGlD
b21tYW5kICpjbGlfY29tbWFuZCA9IGFkZF9jb21tYW5kKGluaXRfY29tbWFuZF9uYW1lLAoJCQkJ
CSAgaW5pdF9jb21tYW5kX2hlbHAsCgkJCQkJICBpc19tdWx0aWxldmVsX2NvbW1hbmQsCgkJCQkJ
ICBpbml0X2NsaV9wcm9jZXNzX2NhbGxiYWNrKTsKICAgIAogICAgaWYgKGNsaV9jb21tYW5kID09
IE5VTEwpCglyZXR1cm4gKE5VTEwpOwogICAgY2xpX2NvbW1hbmQtPnNldF9jbGlfaW50ZXJydXB0
X2NhbGxiYWNrKGluaXRfY2xpX2ludGVycnVwdF9jYWxsYmFjayk7CiAgICAKICAgIHJldHVybiAo
Y2xpX2NvbW1hbmQpOwp9CgovLwovLyBSZXR1cm4gdGhlIG5ldyBjaGlsZCBjb21tYW5kIG9uIHN1
Y2Nlc3MsIG90aGVyd2lzZSBOVUxMLgovLyBTZXR1cCBhIGNvbW1hbmQgd2UgY2FuICJjZCIgdG8u
IElmIEBjZF9wcm9tcHQgaXMgbm90LU5VTEwsCi8vIHRoZW4gdGhlIENMSSBwcm9tcHQgd2lsbCBi
ZSBzZXQgdG8gQGNkX3Byb21wdDsKLy8gb3RoZXJ3aXNlLCBpdCB3aWxsIHJlbWFpbiB1bmNoYW5n
ZWQuCi8vCkNsaUNvbW1hbmQgKgpDbGlDb21tYW5kOjphZGRfY29tbWFuZChjb25zdCBzdHJpbmcm
IGluaXRfY29tbWFuZF9uYW1lLAoJCQljb25zdCBzdHJpbmcmIGluaXRfY29tbWFuZF9oZWxwLAoJ
CQljb25zdCBzdHJpbmcmIGluaXRfY2RfcHJvbXB0LAoJCQlib29sIGlzX211bHRpbGV2ZWxfY29t
bWFuZCkKewogICAgQ2xpQ29tbWFuZCAqY2xpX2NvbW1hbmQgPSBhZGRfY29tbWFuZChpbml0X2Nv
bW1hbmRfbmFtZSwKCQkJCQkgIGluaXRfY29tbWFuZF9oZWxwLAoJCQkJCSAgaXNfbXVsdGlsZXZl
bF9jb21tYW5kKTsKICAgIAogICAgaWYgKGNsaV9jb21tYW5kID09IE5VTEwpCglyZXR1cm4gKE5V
TEwpOwogICAgY2xpX2NvbW1hbmQtPnNldF9hbGxvd19jZCh0cnVlLCBpbml0X2NkX3Byb21wdCk7
CiAgICAKICAgIHJldHVybiAoY2xpX2NvbW1hbmQpOwp9CgoKLy8KLy8gRGVsZXRlIGEgY29tbWFu
ZCwgYW5kIGFsbCBzdWItY29tbWFuZHMgYmVsb3cgaXQKLy8gUmV0dXJuOiAlWE9SUF9PSyBvbiBz
dWNjZXNzLCBvdGhlcndpc2UgJVhPUlBfRVJST1IKLy8KaW50CkNsaUNvbW1hbmQ6OmRlbGV0ZV9j
b21tYW5kKENsaUNvbW1hbmQgKmNoaWxkX2NvbW1hbmQpCnsKICAgIGxpc3Q8Q2xpQ29tbWFuZCAq
Pjo6aXRlcmF0b3IgaXRlcjsKICAgIAogICAgaXRlciA9IGZpbmQoX2NoaWxkX2NvbW1hbmRfbGlz
dC5iZWdpbigpLAoJCV9jaGlsZF9jb21tYW5kX2xpc3QuZW5kKCksCgkJY2hpbGRfY29tbWFuZCk7
CiAgICBpZiAoaXRlciA9PSBfY2hpbGRfY29tbWFuZF9saXN0LmVuZCgpKQoJcmV0dXJuIChYT1JQ
X0VSUk9SKTsKICAgIAogICAgX2NoaWxkX2NvbW1hbmRfbGlzdC5lcmFzZShpdGVyKTsKICAgIGRl
bGV0ZSBjaGlsZF9jb21tYW5kOwogICAgCiAgICByZXR1cm4gKFhPUlBfT0spOwp9CgovLwovLyBE
ZWxldGUgYSBjb21tYW5kLCBhbmQgYWxsIHN1Yi1jb21tYW5kcyBiZWxvdyBpdAovLyBSZXR1cm46
ICVYT1JQX09LIG9uIHN1Y2Nlc3MsIG90aGVyd2lzZSAlWE9SUF9FUlJPUgovLyBYWFg6IEBkZWxl
dGVfY29tbWFuZF9uYW1lIGNhbiBiZSB0aGUgZnVsbCBwYXRoLW5hbWUgZm9yIHRoYXQgY29tbWFu
ZAovLwppbnQKQ2xpQ29tbWFuZDo6ZGVsZXRlX2NvbW1hbmQoY29uc3Qgc3RyaW5nJiBkZWxldGVf
Y29tbWFuZF9uYW1lKQp7CiAgICBDbGlDb21tYW5kICpwYXJlbnRfY2xpX2NvbW1hbmQgPSBOVUxM
OwogICAgQ2xpQ29tbWFuZCAqZGVsZXRlX2NsaV9jb21tYW5kID0gTlVMTDsKICAgIHZlY3Rvcjxz
dHJpbmc+IGNvbW1hbmRfdG9rZW5zOwogICAgc3RyaW5nIHRva2VuOwogICAgc3RyaW5nIHRva2Vu
X2xpbmUgPSBkZWxldGVfY29tbWFuZF9uYW1lOwogICAgCiAgICAvLyBDcmVhdGUgYSB2ZWN0b3Ig
b2YgYWxsIHRha2VucyBpbiB0aGUgY29tbWFuZAogICAgZm9yICh0b2tlbiA9IHBvcF90b2tlbih0
b2tlbl9saW5lKTsKCSAhIHRva2VuLmVtcHR5KCk7CgkgdG9rZW4gPSBwb3BfdG9rZW4odG9rZW5f
bGluZSkpIHsKCWNvbW1hbmRfdG9rZW5zLnB1c2hfYmFjayh0b2tlbik7CiAgICB9CiAgICBpZiAo
Y29tbWFuZF90b2tlbnMuZW1wdHkoKSkKCXJldHVybiAoWE9SUF9FUlJPUik7CiAgICAKICAgIC8v
IFRyYXZlcnNlIGFsbCB0b2tlbnMgYW5kIGZpbmQgdGhlIGNvbW1hbmQgdG8gZGVsZXRlCiAgICBw
YXJlbnRfY2xpX2NvbW1hbmQgPSB0aGlzOwogICAgZGVsZXRlX2NsaV9jb21tYW5kID0gTlVMTDsK
ICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgY29tbWFuZF90b2tlbnMuc2l6ZSgpOyBpKyspIHsK
CWlmIChkZWxldGVfY2xpX2NvbW1hbmQgIT0gTlVMTCkKCSAgICBwYXJlbnRfY2xpX2NvbW1hbmQg
PSBkZWxldGVfY2xpX2NvbW1hbmQ7CglkZWxldGVfY2xpX2NvbW1hbmQgPSBwYXJlbnRfY2xpX2Nv
bW1hbmQtPmNvbW1hbmRfZmluZChjb21tYW5kX3Rva2Vuc1tpXSk7CglpZiAoZGVsZXRlX2NsaV9j
b21tYW5kID09IE5VTEwpCgkgICAgYnJlYWs7CiAgICB9CiAgICBpZiAoZGVsZXRlX2NsaV9jb21t
YW5kID09IE5VTEwpCglnb3RvIGVycm9yX2xhYmVsOwogICAgCiAgICBpZiAocGFyZW50X2NsaV9j
b21tYW5kLT5kZWxldGVfY29tbWFuZChkZWxldGVfY2xpX2NvbW1hbmQpIDwgMCkKCWdvdG8gZXJy
b3JfbGFiZWw7CiAgICByZXR1cm4gKFhPUlBfT0spOwogICAgCiBlcnJvcl9sYWJlbDoKICAgIFhM
T0dfRVJST1IoIkVycm9yIGRlbGV0aW5nICVzIG9uICVzIiwgZGVsZXRlX2NvbW1hbmRfbmFtZS5j
X3N0cigpLAoJICAgICAgIHRoaXMtPm5hbWUoKS5jX3N0cigpKTsKICAgIHJldHVybiAoWE9SUF9F
UlJPUik7Cn0KCi8vIFJlY3Vyc2l2ZWx5IGRlbGV0ZSBhbGwgdGhlIGNoaWxkcmVuIG9mIHRoaXMg
Y29tbWFuZC4Kdm9pZApDbGlDb21tYW5kOjpkZWxldGVfYWxsX2NvbW1hbmRzKCkgCnsKICAgIGxp
c3QgPENsaUNvbW1hbmQqPjo6aXRlcmF0b3IgaXRlcjsKICAgIGZvciAoaXRlciA9IF9jaGlsZF9j
b21tYW5kX2xpc3QuYmVnaW4oKTsKCSBpdGVyICE9IF9jaGlsZF9jb21tYW5kX2xpc3QuZW5kKCk7
ICsraXRlcikgewoJKCppdGVyKS0+ZGVsZXRlX2FsbF9jb21tYW5kcygpOwoJZGVsZXRlICppdGVy
OwogICAgfQogICAgd2hpbGUgKCEgX2NoaWxkX2NvbW1hbmRfbGlzdC5lbXB0eSgpKQoJX2NoaWxk
X2NvbW1hbmRfbGlzdC5wb3BfZnJvbnQoKTsKfQoKLyoqCiAqIENsaUNvbW1hbmQ6OmNyZWF0ZV9k
ZWZhdWx0X2NsaV9jb21tYW5kczoKICogQDogCiAqIAogKiBDcmVhdGUgdGhlIGRlZmF1bHQgQ0xJ
IGNvbW1hbmRzIGF0IGVhY2ggbGV2ZWwgb2YgdGhlIGNvbW1hbmQgdHJlZS4KICogCiAqIFJldHVy
biB2YWx1ZTogJVhPUlBfT0sgb24gc3VjY2Vzcywgb3RoZXJ3aXNlICVYT1JQX0VSUk9SLgogKiov
CmludApDbGlDb21tYW5kOjpjcmVhdGVfZGVmYXVsdF9jbGlfY29tbWFuZHMoKQp7CiAgICAvLyBU
T0RPOiBhZGQgY29tbWFuZHMgbGlrZSAiaGVscCIsICJsaXN0IiAoYWxsIGF2YWlsYWJsZSBzdWJj
b21tYW5kcywgZXRjCiAgICAKICAgIHJldHVybiAoWE9SUF9PSyk7Cn0KCi8qKgogKiBDbGlDb21t
YW5kOjphZGRfcGlwZXM6CiAqIEA6IAogKiAKICogQ3JlYXRlIGFuZCBhZGQgdGhlIGRlZmF1bHQg
Q0xJIHBpcGUgY29tbWFuZHMuCiAqIAogKiBSZXR1cm4gdmFsdWU6ICVYT1JQX09LIG9uIHN1Y2Nl
c3MsIG90aGVyd2lzZSAlWE9SUF9FUlJPUi4KICoqLwppbnQKQ2xpQ29tbWFuZDo6YWRkX3BpcGVz
KCkKewogICAgQ2xpUGlwZSAqY2xpX3BpcGU7CiAgICBDbGlDb21tYW5kICpjb20wOwogICAgCiAg
ICBjb20wID0gbmV3IENsaUNvbW1hbmQodGhpcywgInwiLCAiUGlwZSB0aHJvdWdoIGEgY29tbWFu
ZCIpOwogICAgLy8gY29tMCA9IGFkZF9jb21tYW5kKCJ8IiwgIlBpcGUgdGhyb3VnaCBhIGNvbW1h
bmQiLCBmYWxzZSk7CiAgICBpZiAoY29tMCA9PSBOVUxMKSB7CglyZXR1cm4gKFhPUlBfRVJST1Ip
OwogICAgfQogICAgc2V0X2NsaV9jb21tYW5kX3BpcGUoY29tMCk7CiAgICAKICAgIGNsaV9waXBl
ID0gbmV3IENsaVBpcGUoImNvdW50Iik7CiAgICBpZiAoY29tMC0+YWRkX2NvbW1hbmQoY2xpX3Bp
cGUpICE9IFhPUlBfT0spIHsKCWRlbGV0ZV9waXBlcygpOwoJcmV0dXJuIChYT1JQX0VSUk9SKTsK
ICAgIH0KICAgIGNsaV9waXBlID0gbmV3IENsaVBpcGUoImV4Y2VwdCIpOwogICAgaWYgKGNvbTAt
PmFkZF9jb21tYW5kKGNsaV9waXBlKSAhPSBYT1JQX09LKSB7CglkZWxldGVfcGlwZXMoKTsKCXJl
dHVybiAoWE9SUF9FUlJPUik7CiAgICB9CiAgICBjbGlfcGlwZSA9IG5ldyBDbGlQaXBlKCJmaW5k
Iik7CiAgICBpZiAoY29tMC0+YWRkX2NvbW1hbmQoY2xpX3BpcGUpICE9IFhPUlBfT0spIHsKCWRl
bGV0ZV9waXBlcygpOwoJcmV0dXJuIChYT1JQX0VSUk9SKTsKICAgIH0KICAgIGNsaV9waXBlID0g
bmV3IENsaVBpcGUoImhvbGQiKTsKICAgIGlmIChjb20wLT5hZGRfY29tbWFuZChjbGlfcGlwZSkg
IT0gWE9SUF9PSykgewoJZGVsZXRlX3BpcGVzKCk7CglyZXR1cm4gKFhPUlBfRVJST1IpOwogICAg
fQogICAgY2xpX3BpcGUgPSBuZXcgQ2xpUGlwZSgibWF0Y2giKTsKICAgIGlmIChjb20wLT5hZGRf
Y29tbWFuZChjbGlfcGlwZSkgIT0gWE9SUF9PSykgewoJZGVsZXRlX3BpcGVzKCk7CglyZXR1cm4g
KFhPUlBfRVJST1IpOwogICAgfQogICAgY2xpX3BpcGUgPSBuZXcgQ2xpUGlwZSgibm8tbW9yZSIp
OwogICAgaWYgKGNvbTAtPmFkZF9jb21tYW5kKGNsaV9waXBlKSAhPSBYT1JQX09LKSB7CglkZWxl
dGVfcGlwZXMoKTsKCXJldHVybiAoWE9SUF9FUlJPUik7CiAgICB9CiAgICBjbGlfcGlwZSA9IG5l
dyBDbGlQaXBlKCJyZXNvbHZlIik7CiAgICBpZiAoY29tMC0+YWRkX2NvbW1hbmQoY2xpX3BpcGUp
ICE9IFhPUlBfT0spIHsKCWRlbGV0ZV9waXBlcygpOwoJcmV0dXJuIChYT1JQX0VSUk9SKTsKICAg
IH0KICAgIGNsaV9waXBlID0gbmV3IENsaVBpcGUoInNhdmUiKTsKICAgIGlmIChjb20wLT5hZGRf
Y29tbWFuZChjbGlfcGlwZSkgIT0gWE9SUF9PSykgewoJZGVsZXRlX3BpcGVzKCk7CglyZXR1cm4g
KFhPUlBfRVJST1IpOwogICAgfQogICAgY2xpX3BpcGUgPSBuZXcgQ2xpUGlwZSgidHJpbSIpOwog
ICAgaWYgKGNvbTAtPmFkZF9jb21tYW5kKGNsaV9waXBlKSAhPSBYT1JQX09LKSB7CglkZWxldGVf
cGlwZXMoKTsKCXJldHVybiAoWE9SUF9FUlJPUik7CiAgICB9CiAgICAKICAgIHJldHVybiAoWE9S
UF9PSyk7Cn0KCi8qKgogKiBDbGlDb21tYW5kOjpkZWxldGVfcGlwZXM6CiAqIEA6IAogKiAKICog
RGVsZXRlIHRoZSBkZWZhdWx0IENMSSBwaXBlIGNvbW1hbmRzLgogKiAKICogUmV0dXJuIHZhbHVl
OiAlWE9SUF9PSyBvbiBzdWNjZXNzLCBvdGhlcndpc2UgJVhPUlBfRVJST1IuCiAqKi8KaW50CkNs
aUNvbW1hbmQ6OmRlbGV0ZV9waXBlcygpCnsKICAgIGlmIChfY2xpX2NvbW1hbmRfcGlwZSAhPSBO
VUxMKQoJZGVsZXRlIF9jbGlfY29tbWFuZF9waXBlOwogICAgCiAgICByZXR1cm4gKFhPUlBfT0sp
OwogICAgLy8gcmV0dXJuIChkZWxldGVfY29tbWFuZCgifCIpKTsKfQoKLy8KLy8gQXR0ZW1wdHMg
dG8gY29tcGxldGUgdGhlIGN1cnJlbnQgY29tbWFuZC4KLy8gUmV0dXJuOiB0cnVlIGlmIHRoZSBh
dHRlbXB0IHdhcyBzdWNjZXNzZnVsLCBvdGhlcndpc2UgZmFsc2UuCi8vCmJvb2wKQ2xpQ29tbWFu
ZDo6Y2xpX2F0dGVtcHRfY29tbWFuZF9jb21wbGV0aW9uX2J5bmFtZSh2b2lkICpvYmosCgkJCQkJ
CSAgV29yZENvbXBsZXRpb24gKmNwbCwKCQkJCQkJICB2b2lkICpkYXRhLAoJCQkJCQkgIGNvbnN0
IGNoYXIgKmxpbmUsCgkJCQkJCSAgaW50IHdvcmRfZW5kLAoJCQkJCQkgIGxpc3Q8Q2xpQ29tbWFu
ZCAqPiYgY2xpX2NvbW1hbmRfbWF0Y2hfbGlzdCkKewogICAgQ2xpQ29tbWFuZCAqY2xpX2NvbW1h
bmQgPSByZWludGVycHJldF9jYXN0PENsaUNvbW1hbmQqPihvYmopOwogICAgaW50IHdvcmRfc3Rh
cnQgPSAwOwkJLy8gWFhYOiBjb21wbGV0ZSBmcm9tIHRoZSBiZWdpbm5pbmcgb2YgJ2xpbmUnCiAg
ICBjb25zdCBjaGFyICp0eXBlX3N1ZmZpeCA9IE5VTEw7CiAgICBjb25zdCBjaGFyICpjb250X3N1
ZmZpeCA9ICIgIjsgLy8gWFhYOiBhIHNwYWNlIGFmdGVyIGEgY29tbWFuZCBpcyBjb21wbGV0ZWQK
ICAgIHN0cmluZyB0b2tlbiwgdG9rZW5fbGluZTsKICAgIGNvbnN0IHN0cmluZyBuYW1lX3N0cmlu
ZyA9IGNsaV9jb21tYW5kLT5uYW1lKCk7CiAgICBib29sIGlzX2NvbW1hbmRfY29tcGxldGVkOwkv
LyAndHJ1ZScgaWYgY29tcGxldGUgY29tbWFuZCB0eXBlZAogICAgCiAgICBpZiAoKGNwbCA9PSBO
VUxMKSB8fCAobGluZSA9PSBOVUxMKSB8fCAod29yZF9lbmQgPCAwKSkgewoJcmV0dXJuIChmYWxz
ZSk7CiAgICB9CiAgICAKICAgIHRva2VuX2xpbmUgPSBzdHJpbmcobGluZSwgd29yZF9lbmQpOwog
ICAgdG9rZW4gPSBwb3BfdG9rZW4odG9rZW5fbGluZSk7CiAgICBpZiAoKCEgY2xpX2NvbW1hbmQt
PmlzX3NhbWVfcHJlZml4KHRva2VuKSkKCSYmICghIGNsaV9jb21tYW5kLT5oYXNfdHlwZV9tYXRj
aF9jYigpKSkgewoJICAgIHJldHVybiAoZmFsc2UpOwogICAgfQogICAgCiAgICBpZiAodG9rZW5f
bGluZS5sZW5ndGgoKQoJJiYgKGlzX3Rva2VuX3NlcGFyYXRvcih0b2tlbl9saW5lWzBdKSB8fCAo
dG9rZW4gPT0gInwiKSkpCglpc19jb21tYW5kX2NvbXBsZXRlZCA9IHRydWU7CiAgICBlbHNlCglp
c19jb21tYW5kX2NvbXBsZXRlZCA9IGZhbHNlOwogICAgCiAgICAvLyBDaGVjayBpZiBhIHBvdGVu
dGlhbCBzdWItcHJlZml4CiAgICBpZiAoISBpc19jb21tYW5kX2NvbXBsZXRlZCkgewoJc3RyaW5n
IG5hbWVfY29tcGxldGU7CgoJaWYgKGNsaV9jb21tYW5kLT5oYXNfdHlwZV9tYXRjaF9jYigpKSB7
CgkgICAgbmFtZV9jb21wbGV0ZSA9ICIiOwoJfSBlbHNlIHsKCSAgICBuYW1lX2NvbXBsZXRlID0g
bmFtZV9zdHJpbmcuc3Vic3RyKHRva2VuLmxlbmd0aCgpKTsKCSAgICBpZiAoY2xpX2NvbW1hbmQt
PmhlbHBfY29tcGxldGlvbigpLnNpemUoKSA+IDApCgkJdHlwZV9zdWZmaXggPSBjbGlfY29tbWFu
ZC0+aGVscF9jb21wbGV0aW9uKCkuY19zdHIoKTsKCX0KCQoJLy8gQWRkIHR3byBlbXB0eSBzcGFj
ZXMgaW4gZnJvbnQKCXN0cmluZyBsaW5lX3N0cmluZyA9ICIgICI7CglpZiAodG9rZW4uZW1wdHko
KSkgewoJICAgIC8vIFhYWDogaWdub3JlIHRoZSByZXN0IG9mIHRoZSBlbXB0eSBzcGFjZXMKCSAg
ICB3b3JkX2VuZCA9IDA7Cgl9IGVsc2UgewoJICAgIGxpbmVfc3RyaW5nICs9IGxpbmU7Cgl9Cglj
cGxfYWRkX2NvbXBsZXRpb24oY3BsLCBsaW5lX3N0cmluZy5jX3N0cigpLCB3b3JkX3N0YXJ0LCB3
b3JkX2VuZCArIDIsCgkJCSAgIG5hbWVfY29tcGxldGUuY19zdHIoKSwKCQkJICAgdHlwZV9zdWZm
aXgsIGNvbnRfc3VmZml4KTsKCWNsaV9jb21tYW5kX21hdGNoX2xpc3QucHVzaF9iYWNrKGNsaV9j
b21tYW5kKTsKCXJldHVybiAodHJ1ZSk7CiAgICB9CiAgICAKICAgIC8vIE11c3QgYmUgYSBjb21w
bGV0ZSBjb21tYW5kCgogICAgYm9vbCBpc190b2tlbl9tYXRjaCA9IGZhbHNlOwogICAgaWYgKGNs
aV9jb21tYW5kLT5oYXNfdHlwZV9tYXRjaF9jYigpKSB7CglzdHJpbmcgZXJybXNnOwoJaXNfdG9r
ZW5fbWF0Y2ggPSBjbGlfY29tbWFuZC0+dHlwZV9tYXRjaF9jYigpLT5kaXNwYXRjaCh0b2tlbiwg
ZXJybXNnKTsKICAgIH0gZWxzZSB7Cglpc190b2tlbl9tYXRjaCA9IGNsaV9jb21tYW5kLT5pc19z
YW1lX2NvbW1hbmQodG9rZW4pOwogICAgfQogICAgaWYgKCEgaXNfdG9rZW5fbWF0Y2gpIHsKCXJl
dHVybiAoZmFsc2UpOwogICAgfQogICAgCiAgICBib29sIGlzX2NoaWxkX2NvbXBsZXRpb24gPSBm
YWxzZTsKICAgIAogICAgaWYgKGNsaV9jb21tYW5kLT5jYW5fY29tcGxldGUoKQoJJiYgISBoYXNf
bW9yZV90b2tlbnModG9rZW5fbGluZSkpIHsKCS8vIEFkZCB0aGUgYXBwcm9wcmlhdGUgY29tcGxl
dGlvbiBpbmZvIGlmIHRoZSBjb21tYW5kIGNhbiBiZSBydW4KCXN0cmluZyBsaW5lX3N0cmluZzEg
PSAiICA8W0VudGVyXT4gICAgICAgRXhlY3V0ZSB0aGlzIGNvbW1hbmRcciI7CgljcGxfYWRkX2Nv
bXBsZXRpb24oY3BsLCBsaW5lX3N0cmluZzEuY19zdHIoKSwgd29yZF9zdGFydCwKCQkJICAgbGlu
ZV9zdHJpbmcxLnNpemUoKSwKCQkJICAgIiIsCgkJCSAgIHR5cGVfc3VmZml4LCBjb250X3N1ZmZp
eCk7Cglpc19jaGlsZF9jb21wbGV0aW9uID0gdHJ1ZTsKICAgIH0KICAgIAogICAgaWYgKGNsaV9j
b21tYW5kLT5jYW5fcGlwZSgpICYmIChjbGlfY29tbWFuZC0+Y2xpX2NvbW1hbmRfcGlwZSgpICE9
IE5VTEwpKSB7CgkvLyBBZGQgdGhlIHBpcGUgY29tcGxldGlvbnMKCWlmIChjbGlfY29tbWFuZC0+
X2NsaV9jb21wbGV0aW9uX2Z1bmMoY2xpX2NvbW1hbmQtPmNsaV9jb21tYW5kX3BpcGUoKSwKCQkJ
CQkgICAgICBjcGwsCgkJCQkJICAgICAgZGF0YSwKCQkJCQkgICAgICB0b2tlbl9saW5lLmNfc3Ry
KCksCgkJCQkJICAgICAgdG9rZW5fbGluZS5sZW5ndGgoKSwKCQkJCQkgICAgICBjbGlfY29tbWFu
ZF9tYXRjaF9saXN0KSkgewoJICAgIGlzX2NoaWxkX2NvbXBsZXRpb24gPSB0cnVlOwoJfQogICAg
fQoKICAgIC8vIEFkZCBjb21wbGV0aW9ucyBmb3IgdGhlIHN1Yi1jb21tYW5kcyAoaWYgYW55KQog
ICAgbGlzdDxDbGlDb21tYW5kICo+OjppdGVyYXRvciBpdGVyOwogICAgZm9yIChpdGVyID0gY2xp
X2NvbW1hbmQtPmNoaWxkX2NvbW1hbmRfbGlzdCgpLmJlZ2luKCk7CgkgaXRlciAhPSBjbGlfY29t
bWFuZC0+Y2hpbGRfY29tbWFuZF9saXN0KCkuZW5kKCk7CgkgKytpdGVyKSB7CglDbGlDb21tYW5k
ICpjbGlfY29tbWFuZF9jaGlsZCA9ICppdGVyOwoJaWYgKCEgY2xpX2NvbW1hbmRfY2hpbGQtPmhh
c19jbGlfY29tcGxldGlvbl9mdW5jKCkpCgkgICAgY29udGludWU7CglpZiAoY2xpX2NvbW1hbmRf
Y2hpbGQtPl9jbGlfY29tcGxldGlvbl9mdW5jKGNsaV9jb21tYW5kX2NoaWxkLAoJCQkJCQkgICAg
Y3BsLAoJCQkJCQkgICAgZGF0YSwKCQkJCQkJICAgIHRva2VuX2xpbmUuY19zdHIoKSwKCQkJCQkJ
ICAgIHRva2VuX2xpbmUubGVuZ3RoKCksCgkJCQkJCSAgICBjbGlfY29tbWFuZF9tYXRjaF9saXN0
KSkgewoJICAgIGlzX2NoaWxkX2NvbXBsZXRpb24gPSB0cnVlOwoJfQogICAgfQogICAgCiAgICBy
ZXR1cm4gKGlzX2NoaWxkX2NvbXBsZXRpb24pOwp9CgpDbGlDb21tYW5kICoKQ2xpQ29tbWFuZDo6
Y29tbWFuZF9maW5kKGNvbnN0IHN0cmluZyYgdG9rZW4pCnsKICAgIGxpc3Q8Q2xpQ29tbWFuZCAq
Pjo6aXRlcmF0b3IgaXRlcjsKICAgIAogICAgZm9yIChpdGVyID0gY2hpbGRfY29tbWFuZF9saXN0
KCkuYmVnaW4oKTsKCSBpdGVyICE9IGNoaWxkX2NvbW1hbmRfbGlzdCgpLmVuZCgpOwoJICsraXRl
cikgewoJQ2xpQ29tbWFuZCAqY2xpX2NvbW1hbmQgPSAqaXRlcjsKCWlmIChjbGlfY29tbWFuZC0+
aGFzX3R5cGVfbWF0Y2hfY2IoKSkgewoJICAgIHN0cmluZyBlcnJtc2c7CgkgICAgaWYgKGNsaV9j
b21tYW5kLT50eXBlX21hdGNoX2NiKCktPmRpc3BhdGNoKHRva2VuLCBlcnJtc2cpKQoJCXJldHVy
biAoY2xpX2NvbW1hbmQpOwoJICAgIGNvbnRpbnVlOwoJfQoJaWYgKGNsaV9jb21tYW5kLT5pc19z
YW1lX2NvbW1hbmQodG9rZW4pKSB7CgkgICAgLy8gWFhYOiBhc3N1bWUgdGhhdCBubyB0d28gc3Vi
Y29tbWFuZHMgaGF2ZSB0aGUgc2FtZSBuYW1lCgkgICAgcmV0dXJuIChjbGlfY29tbWFuZCk7Cgl9
CiAgICB9CiAgICAKICAgIHJldHVybiAoTlVMTCk7Cn0KCi8vCi8vIFRlc3QgaWYgdGhlIGNvbW1h
bmQgbGluZSBpcyBhIHByZWZpeCBmb3IgYSBtdWx0aS1sZXZlbCBjb21tYW5kLgovLyBOb3RlIHRo
YXQgaWYgdGhlcmUgaXMgYW4gZXhhY3QgbWF0Y2gsIHRoZW4gdGhlIHJldHVybiB2YWx1ZSBpcyBm
YWxzZS4KLy8KYm9vbApDbGlDb21tYW5kOjppc19tdWx0aV9jb21tYW5kX3ByZWZpeChjb25zdCBz
dHJpbmcmIGNvbW1hbmRfbGluZSkKewogICAgc3RyaW5nIHRva2VuOwogICAgc3RyaW5nIHRva2Vu
X2xpbmUgPSBjb21tYW5kX2xpbmU7CiAgICBDbGlDb21tYW5kICpwYXJlbnRfY2xpX2NvbW1hbmQg
PSB0aGlzOwogICAgQ2xpQ29tbWFuZCAqY2hpbGRfY2xpX2NvbW1hbmQgPSBOVUxMOwoKICAgIGZv
ciAodG9rZW4gPSBwb3BfdG9rZW4odG9rZW5fbGluZSk7CgkgISB0b2tlbi5lbXB0eSgpOwoJIHRv
a2VuID0gcG9wX3Rva2VuKHRva2VuX2xpbmUpKSB7CgljaGlsZF9jbGlfY29tbWFuZCA9IHBhcmVu
dF9jbGlfY29tbWFuZC0+Y29tbWFuZF9maW5kKHRva2VuKTsKCWlmIChjaGlsZF9jbGlfY29tbWFu
ZCAhPSBOVUxMKSB7CgkgICAgcGFyZW50X2NsaV9jb21tYW5kID0gY2hpbGRfY2xpX2NvbW1hbmQ7
CgkgICAgY29udGludWU7Cgl9CgoJLy8gVGVzdCBpZiB0aGUgdG9rZW4gaXMgYSBwcmVmaXggZm9y
IGEgY2hpbGQgY29tbWFuZAoJbGlzdDxDbGlDb21tYW5kICo+Ojpjb25zdF9pdGVyYXRvciBpdGVy
OwoJZm9yIChpdGVyID0gcGFyZW50X2NsaV9jb21tYW5kLT5jaGlsZF9jb21tYW5kX2xpc3QoKS5i
ZWdpbigpOwoJICAgICBpdGVyICE9IHBhcmVudF9jbGlfY29tbWFuZC0+Y2hpbGRfY29tbWFuZF9s
aXN0KCkuZW5kKCk7CgkgICAgICsraXRlcikgewoJICAgIGNoaWxkX2NsaV9jb21tYW5kID0gKml0
ZXI7CgkgICAgaWYgKGNoaWxkX2NsaV9jb21tYW5kLT5pc19zYW1lX3ByZWZpeCh0b2tlbikpCgkJ
cmV0dXJuIHRydWU7Cgl9CgoJYnJlYWs7CiAgICB9CgogICAgcmV0dXJuIChmYWxzZSk7Cn0KCi8v
IFRlc3RzIGlmIHRoZSBzdHJpbmcgaW4gQHRva2VuIGNhbiBiZSBhIHByZWZpeCBmb3IgdGhpcyBj
b21tYW5kCmJvb2wKQ2xpQ29tbWFuZDo6aXNfc2FtZV9wcmVmaXgoY29uc3Qgc3RyaW5nJiB0b2tl
bikKewogICAgc2l6ZV90IHMgPSB0b2tlbi5sZW5ndGgoKTsKICAgIAogICAgaWYgKHMgPiBfbmFt
ZS5sZW5ndGgoKSkKCXJldHVybiAoZmFsc2UpOwogICAgCiAgICByZXR1cm4gKHRva2VuLnN1YnN0
cigwLCBzKSA9PSBfbmFtZS5zdWJzdHIoMCwgcykpOwp9CgovLyBUZXN0cyBpZiB0aGUgc3RyaW5n
IGluIEB0b2tlbiBtYXRjaGVzIHRoaXMgY29tbWFuZApib29sCkNsaUNvbW1hbmQ6OmlzX3NhbWVf
Y29tbWFuZChjb25zdCBzdHJpbmcmIHRva2VuKQp7CiAgICByZXR1cm4gKHRva2VuID09IF9uYW1l
KTsKfQoKYm9vbApDbGlDb21tYW5kOjpmaW5kX2NvbW1hbmRfaGVscChjb25zdCBjaGFyICpsaW5l
LCBpbnQgd29yZF9lbmQsCgkJCSAgICAgIHN0cmluZyYgcmV0X3N0cmluZykKewogICAgc3RyaW5n
IHRva2VuLCB0b2tlbl9saW5lOwogICAgYm9vbCByZXRfdmFsdWUgPSBmYWxzZTsKICAgIGJvb2wg
aXNfbm9fc3BhY2VfYXRfZW5kOwogICAgCiAgICBpZiAoKGxpbmUgPT0gTlVMTCkgfHwgKHdvcmRf
ZW5kIDwgMCkpIHsKICAgICAgICByZXR1cm4gKGZhbHNlKTsKICAgIH0KICAgIAogICAgdG9rZW5f
bGluZSA9IHN0cmluZyhsaW5lLCB3b3JkX2VuZCk7CiAgICB0b2tlbiA9IHBvcF90b2tlbih0b2tl
bl9saW5lKTsKCiAgICBpZiAoKCEgaXNfc2FtZV9wcmVmaXgodG9rZW4pKSAmJiAoISBoYXNfdHlw
ZV9tYXRjaF9jYigpKSkKCXJldHVybiAoZmFsc2UpOwoKICAgIC8vCiAgICAvLyBUZXN0IGlmIHRo
ZSB0b2tlbiBtYXRjaGVzIHRoZSBjb21tYW5kCiAgICAvLwogICAgYm9vbCBpc190b2tlbl9tYXRj
aCA9IGZhbHNlOwogICAgaWYgKGhhc190eXBlX21hdGNoX2NiKCkpIHsKCXN0cmluZyBlcnJtc2c7
Cglpc190b2tlbl9tYXRjaCA9IHR5cGVfbWF0Y2hfY2IoKS0+ZGlzcGF0Y2godG9rZW4sIGVycm1z
Zyk7CiAgICB9IGVsc2UgewoJaXNfdG9rZW5fbWF0Y2ggPSBpc19zYW1lX2NvbW1hbmQodG9rZW4p
OwogICAgfQoKICAgIGlmICh0b2tlbl9saW5lLmxlbmd0aCgpCgkmJiBpc190b2tlbl9zZXBhcmF0
b3IodG9rZW5fbGluZVswXSkKCSYmICghIGlzX3Rva2VuX21hdGNoKSkgewoJLy8gTm90IGEgbWF0
Y2gKCXJldHVybiAoZmFsc2UpOwogICAgfQogICAgCiAgICBpc19ub19zcGFjZV9hdF9lbmQgPSAo
dG9rZW5fbGluZS5lbXB0eSgpKSA/ICh0cnVlKSA6IChmYWxzZSk7CiAgICAKICAgIC8vIEdldCB0
aGUgdG9rZW4gZm9yIHRoZSBjaGlsZCdzIGNvbW1hbmQgKGlmIGFueSkKICAgIHRva2VuID0gcG9w
X3Rva2VuKHRva2VuX2xpbmUpOwogICAgCiAgICBpZiAoKHRva2VuLmxlbmd0aCgpID09IDApICYm
IGlzX25vX3NwYWNlX2F0X2VuZCkgewoJLy8gVGhlIGxhc3QgdG9rZW4sIGFuZCB0aGVyZSBpcyBu
byBzcGFjZSwgc28gcHJpbnQgbXkgaGVscC4KCXJldF9zdHJpbmcgKz0gY19mb3JtYXQoIiAgJS0x
NXMgJXNcclxuIiwKCQkJICAgICAgIG5hbWUoKS5jX3N0cigpLCBoZWxwKCkuY19zdHIoKSk7Cgly
ZXR1cm4gKHRydWUpOwogICAgfQogICAgCiAgICBpZiAoKHRva2VuLmxlbmd0aCgpID09IDApICYm
IGNhbl9jb21wbGV0ZSgpKSB7CgkvLyBUaGUgbGFzdCB0b2tlbiwgYW5kIHRoZXJlIGlzIHNwYWNl
IGF0IHRoZSBlbmQsCgkvLyBzbyBwcmludCB0aGUgImRlZmF1bHQiIGhlbHAuCglyZXRfc3RyaW5n
ICs9IGNfZm9ybWF0KCIgICUtMTVzICVzXHJcbiIsCgkJCSAgICAgICAiPFtFbnRlcl0+IiwgIkV4
ZWN1dGUgdGhpcyBjb21tYW5kIik7CglyZXRfdmFsdWUgPSB0cnVlOwogICAgfQogICAgCiAgICAv
LyBOb3QgdGhlIGxhc3QgdG9rZW4sIHNvIHNlYXJjaCBkb3duIGZvciBoZWxwCiAgICBsaXN0PENs
aUNvbW1hbmQgKj46Oml0ZXJhdG9yIGl0ZXI7ICAgIAogICAgZm9yIChpdGVyID0gY2hpbGRfY29t
bWFuZF9saXN0KCkuYmVnaW4oKTsKCSBpdGVyICE9IGNoaWxkX2NvbW1hbmRfbGlzdCgpLmVuZCgp
OwoJICsraXRlcikgewoJQ2xpQ29tbWFuZCAqY2xpX2NvbW1hbmQgPSAqaXRlcjsKCXN0cmluZyB0
bXBfdG9rZW5fbGluZSA9IGNvcHlfdG9rZW4odG9rZW4pICsgdG9rZW5fbGluZTsKCXJldF92YWx1
ZSB8PSBjbGlfY29tbWFuZC0+ZmluZF9jb21tYW5kX2hlbHAodG1wX3Rva2VuX2xpbmUuY19zdHIo
KSwKCQkJCQkJICAgIHRtcF90b2tlbl9saW5lLmxlbmd0aCgpLAoJCQkJCQkgICAgcmV0X3N0cmlu
Zyk7CiAgICB9CiAgICAKICAgIGlmIChjYW5fcGlwZSgpICYmIChjbGlfY29tbWFuZF9waXBlKCkg
IT0gTlVMTCkpIHsKCS8vIEFkZCB0aGUgcGlwZSBjb21wbGV0aW9ucwoJc3RyaW5nIHRtcF90b2tl
bl9saW5lID0gY29weV90b2tlbih0b2tlbikgKyB0b2tlbl9saW5lOwoJcmV0X3ZhbHVlIHw9IGNs
aV9jb21tYW5kX3BpcGUoKS0+ZmluZF9jb21tYW5kX2hlbHAoCgkgICAgdG1wX3Rva2VuX2xpbmUu
Y19zdHIoKSwKCSAgICB0bXBfdG9rZW5fbGluZS5sZW5ndGgoKSwKCSAgICByZXRfc3RyaW5nKTsK
ICAgIH0KICAgIAogICAgcmV0dXJuIChyZXRfdmFsdWUpOwp9Cgpib29sCkNsaUNvbW1hbmQ6OmNh
bl9jb21wbGV0ZSgpCnsKICAgIGlmIChoYXNfY2xpX3Byb2Nlc3NfY2FsbGJhY2soKSB8fCBhbGxv
d19jZCgpKQoJcmV0dXJuIHRydWU7CiAgICByZXR1cm4gZmFsc2U7Cn0KCkNsaUNvbW1hbmQgKgpD
bGlDb21tYW5kOjpjbGlfY29tbWFuZF9waXBlKCkKewogICAgaWYgKF9yb290X2NvbW1hbmQgIT0g
dGhpcykKCXJldHVybiAoX3Jvb3RfY29tbWFuZC0+Y2xpX2NvbW1hbmRfcGlwZSgpKTsKICAgIGVs
c2UKCXJldHVybiAoX2NsaV9jb21tYW5kX3BpcGUpOwp9Cgp2b2lkCkNsaUNvbW1hbmQ6OnNldF9k
eW5hbWljX2NoaWxkcmVuX2NhbGxiYWNrKERZTkFNSUNfQ0hJTERSRU5fQ0FMTEJBQ0sgdikKewog
ICAgWExPR19BU1NFUlQoIV9nbG9iYWxfbmFtZS5lbXB0eSgpKTsKICAgIF9keW5hbWljX2NoaWxk
cmVuX2NhbGxiYWNrID0gdjsKICAgIF9oYXNfZHluYW1pY19jaGlsZHJlbiA9IHRydWU7Cn0KCmJv
b2wKQ2xpQ29tbWFuZDo6aGFzX2R5bmFtaWNfcHJvY2Vzc19jYWxsYmFjaygpCnsKICAgIHJldHVy
biAoIV9keW5hbWljX3Byb2Nlc3NfY2FsbGJhY2suaXNfZW1wdHkoKSk7Cn0KCmJvb2wKQ2xpQ29t
bWFuZDo6aGFzX2R5bmFtaWNfaW50ZXJydXB0X2NhbGxiYWNrKCkKewogICAgcmV0dXJuICghX2R5
bmFtaWNfaW50ZXJydXB0X2NhbGxiYWNrLmlzX2VtcHR5KCkpOwp9Cgpib29sCkNsaUNvbW1hbmQ6
Omhhc19jbGlfcHJvY2Vzc19jYWxsYmFjaygpCnsKICAgIGlmIChfaGFzX2R5bmFtaWNfY2hpbGRy
ZW4pIHsKCS8vCgkvLyBGb3JjZSB0aGUgY2hpbGRyZW4gdG8gYmUgZXZhbHVhdGVkLCB3aGljaCBm
b3JjZXMgdGhlCgkvLyBjbGlfcHJvY2Vzc19jYWxsYmFjayB0byBiZSBzZXQuCgkvLwoJY2hpbGRf
Y29tbWFuZF9saXN0KCk7CiAgICB9CiAgICByZXR1cm4gKCFfY2xpX3Byb2Nlc3NfY2FsbGJhY2su
aXNfZW1wdHkoKSk7Cn0KCmJvb2wKQ2xpQ29tbWFuZDo6aGFzX2NsaV9pbnRlcnJ1cHRfY2FsbGJh
Y2soKQp7CiAgICByZXR1cm4gKCFfY2xpX2ludGVycnVwdF9jYWxsYmFjay5pc19lbXB0eSgpKTsK
fQoKYm9vbApDbGlDb21tYW5kOjpoYXNfdHlwZV9tYXRjaF9jYigpIGNvbnN0CnsKICAgIHJldHVy
biAoISBfdHlwZV9tYXRjaF9jYi5pc19lbXB0eSgpKTsKfQoKbGlzdDxDbGlDb21tYW5kICo+JgpD
bGlDb21tYW5kOjpjaGlsZF9jb21tYW5kX2xpc3QoKQp7CiAgICBpZiAoX2hhc19keW5hbWljX2No
aWxkcmVuKQoJWExPR19BU1NFUlQoX2NoaWxkX2NvbW1hbmRfbGlzdC5lbXB0eSgpKTsKCiAgICAv
LyBIYW5kbGUgZHluYW1pYyBjaGlsZHJlbiBnZW5lcmF0aW9uCiAgICBpZiAoX2NoaWxkX2NvbW1h
bmRfbGlzdC5lbXB0eSgpICYmIF9oYXNfZHluYW1pY19jaGlsZHJlbikgewoJLy8gTm93IHdlJ3Zl
IHJ1biB0aGlzLCB3ZSB3b24ndCBuZWVkIHRvIHJ1biBpdCBhZ2Fpbi4KCV9oYXNfZHluYW1pY19j
aGlsZHJlbiA9IGZhbHNlOwoKCS8vIEFkZCBkeW5hbWljIGNoaWxkcmVuCglYTE9HX0FTU0VSVChn
bG9iYWxfbmFtZSgpLnNpemUoKSA+IDApOwoJbWFwPHN0cmluZywgQ2xpQ29tbWFuZE1hdGNoPiBk
eW5hbWljX2NoaWxkcmVuOwoJbWFwPHN0cmluZywgQ2xpQ29tbWFuZE1hdGNoPjo6aXRlcmF0b3Ig
aXRlcjsKCWR5bmFtaWNfY2hpbGRyZW4gPSBfZHluYW1pY19jaGlsZHJlbl9jYWxsYmFjay0+ZGlz
cGF0Y2goZ2xvYmFsX25hbWUoKSk7CglDbGlDb21tYW5kICpuZXdfY21kOwoJZm9yIChpdGVyID0g
ZHluYW1pY19jaGlsZHJlbi5iZWdpbigpOwoJICAgICBpdGVyICE9IGR5bmFtaWNfY2hpbGRyZW4u
ZW5kKCk7CgkgICAgICsraXRlcikgewoJICAgIGNvbnN0IENsaUNvbW1hbmRNYXRjaCYgY2NtID0g
aXRlci0+c2Vjb25kOwoJICAgIGNvbnN0IHN0cmluZyYgY29tbWFuZF9uYW1lID0gY2NtLmNvbW1h
bmRfbmFtZSgpOwoJICAgIGNvbnN0IHN0cmluZyYgaGVscF9zdHJpbmcgPSBjY20uaGVscF9zdHJp
bmcoKTsKCSAgICBib29sIGlzX2V4ZWN1dGFibGUgPSBjY20uaXNfZXhlY3V0YWJsZSgpOwoJICAg
IGJvb2wgY2FuX3BpcGUgPSBjY20uY2FuX3BpcGUoKTsKCSAgICBuZXdfY21kID0gYWRkX2NvbW1h
bmQoY29tbWFuZF9uYW1lLCBoZWxwX3N0cmluZywgZmFsc2UpOwoJICAgIHN0cmluZyBjaGlsZF9u
YW1lID0gZ2xvYmFsX25hbWUoKSArICIgIiArIGNvbW1hbmRfbmFtZTsKCSAgICBuZXdfY21kLT5z
ZXRfZ2xvYmFsX25hbWUoY2hpbGRfbmFtZSk7CgkgICAgbmV3X2NtZC0+c2V0X2Nhbl9waXBlKGNh
bl9waXBlKTsKCSAgICBuZXdfY21kLT5zZXRfdHlwZV9tYXRjaF9jYihjY20udHlwZV9tYXRjaF9j
YigpKTsKCSAgICBuZXdfY21kLT5zZXRfZHluYW1pY19jaGlsZHJlbl9jYWxsYmFjayhfZHluYW1p
Y19jaGlsZHJlbl9jYWxsYmFjayk7CgkgICAgbmV3X2NtZC0+c2V0X2R5bmFtaWNfcHJvY2Vzc19j
YWxsYmFjayhfZHluYW1pY19wcm9jZXNzX2NhbGxiYWNrKTsKCSAgICBuZXdfY21kLT5zZXRfZHlu
YW1pY19pbnRlcnJ1cHRfY2FsbGJhY2soX2R5bmFtaWNfaW50ZXJydXB0X2NhbGxiYWNrKTsKCSAg
ICBpZiAoaXNfZXhlY3V0YWJsZSkgewoJCW5ld19jbWQtPnNldF9jbGlfcHJvY2Vzc19jYWxsYmFj
ayhfZHluYW1pY19wcm9jZXNzX2NhbGxiYWNrKTsKCQluZXdfY21kLT5zZXRfY2xpX2ludGVycnVw
dF9jYWxsYmFjayhfZHluYW1pY19pbnRlcnJ1cHRfY2FsbGJhY2spOwoJICAgIH0KCX0KICAgIH0K
CiAgICByZXR1cm4gKF9jaGlsZF9jb21tYW5kX2xpc3QpOyAKfQo=

--========GMXBoundary186531126179661--