This is the mail archive of the gcc-bugs@gcc.gnu.org mailing list for the GCC project.
| Index Nav: | [Date Index] [Subject Index] [Author Index] [Thread Index] | |
|---|---|---|
| Message Nav: | [Date Prev] [Date Next] | [Thread Prev] [Thread Next] |
| Other format: | [Raw text] | |
>Number: 5785 >Category: middle-end >Synopsis: g++ crashes on modified libgcj interpreter >Confidential: no >Severity: serious >Priority: medium >Responsible: unassigned >State: open >Class: sw-bug >Submitter-Id: net >Arrival-Date: Tue Feb 26 08:36:01 PST 2002 >Closed-Date: >Last-Modified: >Originator: Tom Tromey <tromey@redhat.com> >Release: GNU C++ version 3.1 20020225 (experimental) (i686-pc-linux-gnu) >Organization: >Environment: x86 Red Hat Linux 6.2 >Description: I've modified the libgcj interpreter to do direct threading and some other tricks. Now g++ crashes when compiling it at -O2. I've attached the .ii file. The code is pretty unusual in that it uses computed goto as well as exception handling in one huge function. Compiling with -g (and not -O) works, but it defeats the purpose of this work, which is making the interpreter faster. >How-To-Repeat: Here is the command-line I used to generate the .ii file: /x1/egcs/build/gcc/xgcc -v -B/x1/egcs/build/gcc/ -nostdinc++ -L/x1/egcs/build/i686-pc-linux-gnu/libstdc++-v3/src -L/x1/egcs/build/i686-pc-linux-gnu/libstdc++-v3/src/.libs -B/x1/egcs/install/i686-pc-linux-gnu/bin/ -B/x1/egcs/install/i686-pc-linux-gnu/lib/ -isystem /x1/egcs/install/i686-pc-linux-gnu/include -DHAVE_CONFIG_H -I. -I../../../gcc/libjava -I./include -I./gcj -I../../../gcc/libjava -Iinclude -I../../../gcc/libjava/include -I../../../gcc/libjava/../boehm-gc/include -DGC_LINUX_THREADS=1 -D_REENTRANT=1 -DTHREAD_LOCAL_ALLOC=1 -DSILENT=1 -DNO_SIGNALS=1 -DNO_EXECUTE_PERMISSION=1 -DALL_INTERIOR_POINTERS=1 -DJAVA_FINALIZATION=1 -DGC_GCJ_SUPPORT=1 -DATOMIC_UNCOLLECTABLE=1 -I../../../gcc/libjava/libltdl -I../../../gcc/libjava/libltdl -I../../../gcc/libjava/.././libjava/../gcc -I../../../gcc/libjava/../zlib -I../../../gcc/libjava/../libffi/include -I../libffi/include -fno-rtti -fnon-call-exceptions -fdollars-in-identifiers -D__NO_MATH_INLINES -ffloat-store -I/usr/X11R6/include -W -Wall -D_GNU_SOURCE -DPREFIX=\"/x1/egcs/install\" -O2 ../../../gcc/libjava/interpret.cc -fPIC -DPIC -c -save-temps >Fix: >Release-Note: >Audit-Trail: >Unformatted: ----gnatsweb-attachment---- Content-Type: application/octet-stream; name="interpret.ii" Content-Transfer-Encoding: base64 Content-Disposition: attachment; filename="interpret.ii" IyAxICIuLi8uLi8uLi9nY2MvbGliamF2YS9pbnRlcnByZXQuY2MiCiMgMSAiPGJ1aWx0LWluPiIK IyAxICI8Y29tbWFuZCBsaW5lPiIKIyAxICIuLi8uLi8uLi9nY2MvbGliamF2YS9pbnRlcnByZXQu Y2MiCiMgMTMgIi4uLy4uLy4uL2djYy9saWJqYXZhL2ludGVycHJldC5jYyIKIyAxICJpbmNsdWRl L2NvbmZpZy5oIiAxCiMgMTQgIi4uLy4uLy4uL2djYy9saWJqYXZhL2ludGVycHJldC5jYyIgMgoK I3ByYWdtYSBpbXBsZW1lbnRhdGlvbiAiamF2YS1pbnRlcnAuaCIKCiMgMSAiLi4vLi4vLi4vZ2Nj L2xpYmphdmEvaW5jbHVkZS9qdm0uaCIgMQojIDIwICIuLi8uLi8uLi9nY2MvbGliamF2YS9pbmNs dWRlL2p2bS5oIgojIDEgIi4uLy4uLy4uL2djYy9saWJqYXZhL2djai9qYXZhcHJpbXMuaCIgMQoj IDE1ICIuLi8uLi8uLi9nY2MvbGliamF2YS9nY2ovamF2YXByaW1zLmgiCiNwcmFnbWEgR0NDIGph dmFfZXhjZXB0aW9ucwoKIyAxICJnY2ovbGliZ2NqLWNvbmZpZy5oIiAxCiMgMTggIi4uLy4uLy4u L2djYy9saWJqYXZhL2djai9qYXZhcHJpbXMuaCIgMgojIDI5ICIuLi8uLi8uLi9nY2MvbGliamF2 YS9nY2ovamF2YXByaW1zLmgiCmV4dGVybiAiSmF2YSIKewogIHR5cGVkZWYgX19qYXZhX2J5dGUg amJ5dGU7CiAgdHlwZWRlZiBfX2phdmFfc2hvcnQganNob3J0OwogIHR5cGVkZWYgX19qYXZhX2lu dCBqaW50OwogIHR5cGVkZWYgX19qYXZhX2xvbmcgamxvbmc7CiAgdHlwZWRlZiBfX2phdmFfZmxv YXQgamZsb2F0OwogIHR5cGVkZWYgX19qYXZhX2RvdWJsZSBqZG91YmxlOwogIHR5cGVkZWYgX19q YXZhX2NoYXIgamNoYXI7CiAgdHlwZWRlZiBfX2phdmFfYm9vbGVhbiBqYm9vbGVhbjsKICB0eXBl ZGVmIGppbnQganNpemU7CgoKCiAgbmFtZXNwYWNlIGphdmEKICB7CiAgICBuYW1lc3BhY2UgaW8K ICAgIHsKICAgICAgY2xhc3MgQnVmZmVyZWRJbnB1dFN0cmVhbTsKICAgICAgY2xhc3MgQnVmZmVy ZWRPdXRwdXRTdHJlYW07CiAgICAgIGNsYXNzIEJ1ZmZlcmVkUmVhZGVyOwogICAgICBjbGFzcyBC dWZmZXJlZFdyaXRlcjsKICAgICAgY2xhc3MgQnl0ZUFycmF5SW5wdXRTdHJlYW07CiAgICAgIGNs YXNzIEJ5dGVBcnJheU91dHB1dFN0cmVhbTsKICAgICAgY2xhc3MgQ2hhckFycmF5UmVhZGVyOwog ICAgICBjbGFzcyBDaGFyQXJyYXlXcml0ZXI7CiAgICAgIGNsYXNzIENoYXJDb252ZXJzaW9uRXhj ZXB0aW9uOwogICAgICBjbGFzcyBEYXRhSW5wdXQ7CiAgICAgIGNsYXNzIERhdGFJbnB1dFN0cmVh bTsKICAgICAgY2xhc3MgRGF0YU91dHB1dDsKICAgICAgY2xhc3MgRGF0YU91dHB1dFN0cmVhbTsK ICAgICAgY2xhc3MgRU9GRXhjZXB0aW9uOwogICAgICBjbGFzcyBFeHRlcm5hbGl6YWJsZTsKICAg ICAgY2xhc3MgRmlsZTsKICAgICAgY2xhc3MgRmlsZURlc2NyaXB0b3I7CiAgICAgIGNsYXNzIEZp bGVGaWx0ZXI7CiAgICAgIGNsYXNzIEZpbGVJbnB1dFN0cmVhbTsKICAgICAgY2xhc3MgRmlsZU5v dEZvdW5kRXhjZXB0aW9uOwogICAgICBjbGFzcyBGaWxlT3V0cHV0U3RyZWFtOwogICAgICBjbGFz cyBGaWxlUGVybWlzc2lvbjsKICAgICAgY2xhc3MgRmlsZVJlYWRlcjsKICAgICAgY2xhc3MgRmls ZVdyaXRlcjsKICAgICAgY2xhc3MgRmlsZW5hbWVGaWx0ZXI7CiAgICAgIGNsYXNzIEZpbHRlcklu cHV0U3RyZWFtOwogICAgICBjbGFzcyBGaWx0ZXJPdXRwdXRTdHJlYW07CiAgICAgIGNsYXNzIEZp bHRlclJlYWRlcjsKICAgICAgY2xhc3MgRmlsdGVyV3JpdGVyOwogICAgICBjbGFzcyBJT0V4Y2Vw dGlvbjsKICAgICAgY2xhc3MgSW5wdXRTdHJlYW07CiAgICAgIGNsYXNzIElucHV0U3RyZWFtUmVh ZGVyOwogICAgICBjbGFzcyBJbnRlcmZhY2VDb21wYXJhdG9yOwogICAgICBjbGFzcyBJbnRlcnJ1 cHRlZElPRXhjZXB0aW9uOwogICAgICBjbGFzcyBJbnZhbGlkQ2xhc3NFeGNlcHRpb247CiAgICAg IGNsYXNzIEludmFsaWRPYmplY3RFeGNlcHRpb247CiAgICAgIGNsYXNzIExpbmVOdW1iZXJJbnB1 dFN0cmVhbTsKICAgICAgY2xhc3MgTGluZU51bWJlclJlYWRlcjsKICAgICAgY2xhc3MgTWVtYmVy Q29tcGFyYXRvcjsKICAgICAgY2xhc3MgTm90QWN0aXZlRXhjZXB0aW9uOwogICAgICBjbGFzcyBO b3RTZXJpYWxpemFibGVFeGNlcHRpb247CiAgICAgIGNsYXNzIE9iamVjdElucHV0OwogICAgICBj bGFzcyBPYmplY3RJbnB1dFN0cmVhbTsKICAgICAgY2xhc3MgT2JqZWN0SW5wdXRTdHJlYW0kR2V0 RmllbGQ7CiAgICAgIGNsYXNzIE9iamVjdElucHV0VmFsaWRhdGlvbjsKICAgICAgY2xhc3MgT2Jq ZWN0T3V0cHV0OwogICAgICBjbGFzcyBPYmplY3RPdXRwdXRTdHJlYW07CiAgICAgIGNsYXNzIE9i amVjdE91dHB1dFN0cmVhbSRQdXRGaWVsZDsKICAgICAgY2xhc3MgT2JqZWN0U3RyZWFtQ2xhc3M7 CiAgICAgIGNsYXNzIE9iamVjdFN0cmVhbUNvbnN0YW50czsKICAgICAgY2xhc3MgT2JqZWN0U3Ry ZWFtRXhjZXB0aW9uOwogICAgICBjbGFzcyBPYmplY3RTdHJlYW1GaWVsZDsKICAgICAgY2xhc3Mg T3B0aW9uYWxEYXRhRXhjZXB0aW9uOwogICAgICBjbGFzcyBPdXRwdXRTdHJlYW07CiAgICAgIGNs YXNzIE91dHB1dFN0cmVhbVdyaXRlcjsKICAgICAgY2xhc3MgUGlwZWRJbnB1dFN0cmVhbTsKICAg ICAgY2xhc3MgUGlwZWRPdXRwdXRTdHJlYW07CiAgICAgIGNsYXNzIFBpcGVkUmVhZGVyOwogICAg ICBjbGFzcyBQaXBlZFdyaXRlcjsKICAgICAgY2xhc3MgUHJpbnRTdHJlYW07CiAgICAgIGNsYXNz IFByaW50V3JpdGVyOwogICAgICBjbGFzcyBQdXNoYmFja0lucHV0U3RyZWFtOwogICAgICBjbGFz cyBQdXNoYmFja1JlYWRlcjsKICAgICAgY2xhc3MgUmFuZG9tQWNjZXNzRmlsZTsKICAgICAgY2xh c3MgUmVhZGVyOwogICAgICBjbGFzcyBTZXF1ZW5jZUlucHV0U3RyZWFtOwogICAgICBjbGFzcyBT ZXJpYWxpemFibGU7CiAgICAgIGNsYXNzIFNlcmlhbGl6YWJsZVBlcm1pc3Npb247CiAgICAgIGNs YXNzIFN0cmVhbUNvcnJ1cHRlZEV4Y2VwdGlvbjsKICAgICAgY2xhc3MgU3RyZWFtVG9rZW5pemVy OwogICAgICBjbGFzcyBTdHJpbmdCdWZmZXJJbnB1dFN0cmVhbTsKICAgICAgY2xhc3MgU3RyaW5n UmVhZGVyOwogICAgICBjbGFzcyBTdHJpbmdXcml0ZXI7CiAgICAgIGNsYXNzIFN5bmNGYWlsZWRF eGNlcHRpb247CiAgICAgIGNsYXNzIFVURkRhdGFGb3JtYXRFeGNlcHRpb247CiAgICAgIGNsYXNz IFVuc3VwcG9ydGVkRW5jb2RpbmdFeGNlcHRpb247CiAgICAgIGNsYXNzIFZhbGlkYXRvckFuZFBy aW9yaXR5OwogICAgICBjbGFzcyBXcml0ZUFib3J0ZWRFeGNlcHRpb247CiAgICAgIGNsYXNzIFdy aXRlcjsKICAgIH07CgogICAgbmFtZXNwYWNlIGxhbmcKICAgIHsKICAgICAgY2xhc3MgQWJzdHJh Y3RNZXRob2RFcnJvcjsKICAgICAgY2xhc3MgQXJpdGhtZXRpY0V4Y2VwdGlvbjsKICAgICAgY2xh c3MgQXJyYXlJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uOwogICAgICBjbGFzcyBBcnJheVN0b3Jl RXhjZXB0aW9uOwogICAgICBjbGFzcyBCb29sZWFuOwogICAgICBjbGFzcyBCeXRlOwogICAgICBj bGFzcyBDUGx1c1BsdXNEZW1hbmdsZXI7CiAgICAgIGNsYXNzIENoYXJTZXF1ZW5jZTsKICAgICAg Y2xhc3MgQ2hhcmFjdGVyOwogICAgICBjbGFzcyBDaGFyYWN0ZXIkU3Vic2V0OwogICAgICBjbGFz cyBDaGFyYWN0ZXIkVW5pY29kZUJsb2NrOwogICAgICBjbGFzcyBDbGFzczsKICAgICAgY2xhc3Mg Q2xhc3NDYXN0RXhjZXB0aW9uOwogICAgICBjbGFzcyBDbGFzc0NpcmN1bGFyaXR5RXJyb3I7CiAg ICAgIGNsYXNzIENsYXNzRm9ybWF0RXJyb3I7CiAgICAgIGNsYXNzIENsYXNzTG9hZGVyOwogICAg ICBjbGFzcyBDbGFzc05vdEZvdW5kRXhjZXB0aW9uOwogICAgICBjbGFzcyBDbG9uZU5vdFN1cHBv cnRlZEV4Y2VwdGlvbjsKICAgICAgY2xhc3MgQ2xvbmVhYmxlOwogICAgICBjbGFzcyBDb21wYXJh YmxlOwogICAgICBjbGFzcyBDb21waWxlcjsKICAgICAgY2xhc3MgQ29uY3JldGVQcm9jZXNzOwog ICAgICBjbGFzcyBEb3VibGU7CiAgICAgIGNsYXNzIEVycm9yOwogICAgICBjbGFzcyBFeGNlcHRp b247CiAgICAgIGNsYXNzIEV4Y2VwdGlvbkluSW5pdGlhbGl6ZXJFcnJvcjsKICAgICAgY2xhc3Mg RmxvYXQ7CiAgICAgIGNsYXNzIElsbGVnYWxBY2Nlc3NFcnJvcjsKICAgICAgY2xhc3MgSWxsZWdh bEFjY2Vzc0V4Y2VwdGlvbjsKICAgICAgY2xhc3MgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uOwog ICAgICBjbGFzcyBJbGxlZ2FsTW9uaXRvclN0YXRlRXhjZXB0aW9uOwogICAgICBjbGFzcyBJbGxl Z2FsU3RhdGVFeGNlcHRpb247CiAgICAgIGNsYXNzIElsbGVnYWxUaHJlYWRTdGF0ZUV4Y2VwdGlv bjsKICAgICAgY2xhc3MgSW5jb21wYXRpYmxlQ2xhc3NDaGFuZ2VFcnJvcjsKICAgICAgY2xhc3Mg SW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbjsKICAgICAgY2xhc3MgSW5oZXJpdGFibGVUaHJlYWRM b2NhbDsKICAgICAgY2xhc3MgSW5zdGFudGlhdGlvbkVycm9yOwogICAgICBjbGFzcyBJbnN0YW50 aWF0aW9uRXhjZXB0aW9uOwogICAgICBjbGFzcyBJbnRlZ2VyOwogICAgICBjbGFzcyBJbnRlcm5h bEVycm9yOwogICAgICBjbGFzcyBJbnRlcnJ1cHRlZEV4Y2VwdGlvbjsKICAgICAgY2xhc3MgTGlu a2FnZUVycm9yOwogICAgICBjbGFzcyBMb25nOwogICAgICBjbGFzcyBNYXRoOwogICAgICBjbGFz cyBOZWdhdGl2ZUFycmF5U2l6ZUV4Y2VwdGlvbjsKICAgICAgY2xhc3MgTm9DbGFzc0RlZkZvdW5k RXJyb3I7CiAgICAgIGNsYXNzIE5vU3VjaEZpZWxkRXJyb3I7CiAgICAgIGNsYXNzIE5vU3VjaEZp ZWxkRXhjZXB0aW9uOwogICAgICBjbGFzcyBOb1N1Y2hNZXRob2RFcnJvcjsKICAgICAgY2xhc3Mg Tm9TdWNoTWV0aG9kRXhjZXB0aW9uOwogICAgICBjbGFzcyBOdWxsUG9pbnRlckV4Y2VwdGlvbjsK ICAgICAgY2xhc3MgTnVtYmVyOwogICAgICBjbGFzcyBOdW1iZXJGb3JtYXRFeGNlcHRpb247CiAg ICAgIGNsYXNzIE9iamVjdDsKICAgICAgY2xhc3MgT3V0T2ZNZW1vcnlFcnJvcjsKICAgICAgY2xh c3MgUGFja2FnZTsKICAgICAgY2xhc3MgUHJvY2VzczsKICAgICAgY2xhc3MgUnVubmFibGU7CiAg ICAgIGNsYXNzIFJ1bnRpbWU7CiAgICAgIGNsYXNzIFJ1bnRpbWVFeGNlcHRpb247CiAgICAgIGNs YXNzIFJ1bnRpbWVQZXJtaXNzaW9uOwogICAgICBjbGFzcyBTZWN1cml0eUNvbnRleHQ7CiAgICAg IGNsYXNzIFNlY3VyaXR5RXhjZXB0aW9uOwogICAgICBjbGFzcyBTZWN1cml0eU1hbmFnZXI7CiAg ICAgIGNsYXNzIFNob3J0OwogICAgICBjbGFzcyBTdGFja092ZXJmbG93RXJyb3I7CiAgICAgIGNs YXNzIFN0cmljdE1hdGg7CiAgICAgIGNsYXNzIFN0cmluZzsKICAgICAgY2xhc3MgU3RyaW5nJENh c2VJbnNlbnNpdGl2ZUNvbXBhcmF0b3I7CiAgICAgIGNsYXNzIFN0cmluZ0J1ZmZlcjsKICAgICAg Y2xhc3MgU3RyaW5nSW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbjsKICAgICAgY2xhc3MgU3lzdGVt OwogICAgICBjbGFzcyBUaHJlYWQ7CiAgICAgIGNsYXNzIFRocmVhZERlYXRoOwogICAgICBjbGFz cyBUaHJlYWRHcm91cDsKICAgICAgY2xhc3MgVGhyZWFkTG9jYWw7CiAgICAgIGNsYXNzIFRocmVh ZExvY2FsJFZhbHVlOwogICAgICBjbGFzcyBUaHJvd2FibGU7CiAgICAgIGNsYXNzIFVua25vd25F cnJvcjsKICAgICAgY2xhc3MgVW5zYXRpc2ZpZWRMaW5rRXJyb3I7CiAgICAgIGNsYXNzIFVuc3Vw cG9ydGVkQ2xhc3NWZXJzaW9uRXJyb3I7CiAgICAgIGNsYXNzIFVuc3VwcG9ydGVkT3BlcmF0aW9u RXhjZXB0aW9uOwogICAgICBjbGFzcyBWTUNsYXNzTG9hZGVyOwogICAgICBjbGFzcyBWTVNlY3Vy aXR5TWFuYWdlcjsKICAgICAgY2xhc3MgVmVyaWZ5RXJyb3I7CiAgICAgIGNsYXNzIFZpcnR1YWxN YWNoaW5lRXJyb3I7CiAgICAgIGNsYXNzIFZvaWQ7CiAgICAgIG5hbWVzcGFjZSByZWYKICAgICAg ewogICAgICAgIGNsYXNzIFBoYW50b21SZWZlcmVuY2U7CiAgICAgICAgY2xhc3MgUmVmZXJlbmNl OwogICAgICAgIGNsYXNzIFJlZmVyZW5jZVF1ZXVlOwogICAgICAgIGNsYXNzIFNvZnRSZWZlcmVu Y2U7CiAgICAgICAgY2xhc3MgV2Vha1JlZmVyZW5jZTsKICAgICAgfTsKCiAgICAgIG5hbWVzcGFj ZSByZWZsZWN0CiAgICAgIHsKICAgICAgICBjbGFzcyBBY2Nlc3NpYmxlT2JqZWN0OwogICAgICAg IGNsYXNzIEFycmF5OwogICAgICAgIGNsYXNzIENvbnN0cnVjdG9yOwogICAgICAgIGNsYXNzIEZp ZWxkOwogICAgICAgIGNsYXNzIEludm9jYXRpb25UYXJnZXRFeGNlcHRpb247CiAgICAgICAgY2xh c3MgTWVtYmVyOwogICAgICAgIGNsYXNzIE1ldGhvZDsKICAgICAgICBjbGFzcyBNb2RpZmllcjsK ICAgICAgICBjbGFzcyBSZWZsZWN0UGVybWlzc2lvbjsKICAgICAgfTsKICAgIH07CgogICAgbmFt ZXNwYWNlIHV0aWwKICAgIHsKICAgICAgY2xhc3MgQWJzdHJhY3RDb2xsZWN0aW9uOwogICAgICBj bGFzcyBBYnN0cmFjdExpc3Q7CiAgICAgIGNsYXNzIEFic3RyYWN0TGlzdCRBYnN0cmFjdExpc3RJ dHI7CiAgICAgIGNsYXNzIEFic3RyYWN0TWFwOwogICAgICBjbGFzcyBBYnN0cmFjdFNlcXVlbnRp YWxMaXN0OwogICAgICBjbGFzcyBBYnN0cmFjdFNldDsKICAgICAgY2xhc3MgQXJyYXlMaXN0Owog ICAgICBjbGFzcyBBcnJheXM7CiAgICAgIGNsYXNzIEFycmF5cyRMaXN0SW1wbDsKICAgICAgY2xh c3MgQmFzaWNNYXBFbnRyeTsKICAgICAgY2xhc3MgQml0U2V0OwogICAgICBjbGFzcyBDYWxlbmRh cjsKICAgICAgY2xhc3MgQ29sbGVjdGlvbjsKICAgICAgY2xhc3MgQ29sbGVjdGlvbnM7CiAgICAg IGNsYXNzIENvbGxlY3Rpb25zJFJldmVyc2VDb21wYXJhdG9yOwogICAgICBjbGFzcyBDb2xsZWN0 aW9ucyRTeW5jaHJvbml6ZWRDb2xsZWN0aW9uOwogICAgICBjbGFzcyBDb2xsZWN0aW9ucyRTeW5j aHJvbml6ZWRJdGVyYXRvcjsKICAgICAgY2xhc3MgQ29sbGVjdGlvbnMkU3luY2hyb25pemVkTGlz dDsKICAgICAgY2xhc3MgQ29sbGVjdGlvbnMkU3luY2hyb25pemVkTGlzdEl0ZXJhdG9yOwogICAg ICBjbGFzcyBDb2xsZWN0aW9ucyRTeW5jaHJvbml6ZWRNYXA7CiAgICAgIGNsYXNzIENvbGxlY3Rp b25zJFN5bmNocm9uaXplZFNldDsKICAgICAgY2xhc3MgQ29sbGVjdGlvbnMkU3luY2hyb25pemVk U29ydGVkTWFwOwogICAgICBjbGFzcyBDb2xsZWN0aW9ucyRTeW5jaHJvbml6ZWRTb3J0ZWRTZXQ7 CiAgICAgIGNsYXNzIENvbGxlY3Rpb25zJFVubW9kaWZpYWJsZUNvbGxlY3Rpb247CiAgICAgIGNs YXNzIENvbGxlY3Rpb25zJFVubW9kaWZpYWJsZUl0ZXJhdG9yOwogICAgICBjbGFzcyBDb2xsZWN0 aW9ucyRVbm1vZGlmaWFibGVMaXN0OwogICAgICBjbGFzcyBDb2xsZWN0aW9ucyRVbm1vZGlmaWFi bGVMaXN0SXRlcmF0b3I7CiAgICAgIGNsYXNzIENvbGxlY3Rpb25zJFVubW9kaWZpYWJsZU1hcDsK ICAgICAgY2xhc3MgQ29sbGVjdGlvbnMkVW5tb2RpZmlhYmxlU2V0OwogICAgICBjbGFzcyBDb2xs ZWN0aW9ucyRVbm1vZGlmaWFibGVTb3J0ZWRNYXA7CiAgICAgIGNsYXNzIENvbGxlY3Rpb25zJFVu bW9kaWZpYWJsZVNvcnRlZFNldDsKICAgICAgY2xhc3MgQ29tcGFyYXRvcjsKICAgICAgY2xhc3Mg Q29uY3VycmVudE1vZGlmaWNhdGlvbkV4Y2VwdGlvbjsKICAgICAgY2xhc3MgRGF0ZTsKICAgICAg Y2xhc3MgRGljdGlvbmFyeTsKICAgICAgY2xhc3MgRW1wdHlTdGFja0V4Y2VwdGlvbjsKICAgICAg Y2xhc3MgRW51bWVyYXRpb247CiAgICAgIGNsYXNzIEV2ZW50TGlzdGVuZXI7CiAgICAgIGNsYXNz IEV2ZW50T2JqZWN0OwogICAgICBjbGFzcyBHcmVnb3JpYW5DYWxlbmRhcjsKICAgICAgY2xhc3Mg SGFzaE1hcDsKICAgICAgY2xhc3MgSGFzaE1hcCRIYXNoRW50cnk7CiAgICAgIGNsYXNzIEhhc2hN YXAkSGFzaEl0ZXJhdG9yOwogICAgICBjbGFzcyBIYXNoU2V0OwogICAgICBjbGFzcyBIYXNodGFi bGU7CiAgICAgIGNsYXNzIEhhc2h0YWJsZSRFbnVtZXJhdG9yOwogICAgICBjbGFzcyBIYXNodGFi bGUkSGFzaEVudHJ5OwogICAgICBjbGFzcyBIYXNodGFibGUkSGFzaEl0ZXJhdG9yOwogICAgICBj bGFzcyBJZGVudGl0eUhhc2hNYXA7CiAgICAgIGNsYXNzIElkZW50aXR5SGFzaE1hcCRJZGVudGl0 eUl0ZXJhdG9yOwogICAgICBjbGFzcyBJdGVyYXRvcjsKICAgICAgY2xhc3MgTGlua2VkSGFzaE1h cDsKICAgICAgY2xhc3MgTGlua2VkSGFzaE1hcCRMaW5rZWRIYXNoRW50cnk7CiAgICAgIGNsYXNz IExpbmtlZExpc3Q7CiAgICAgIGNsYXNzIExpbmtlZExpc3QkRW50cnk7CiAgICAgIGNsYXNzIExp bmtlZExpc3QkTGlua2VkTGlzdEl0cjsKICAgICAgY2xhc3MgTGlzdDsKICAgICAgY2xhc3MgTGlz dEl0ZXJhdG9yOwogICAgICBjbGFzcyBMaXN0UmVzb3VyY2VCdW5kbGU7CiAgICAgIGNsYXNzIExv Y2FsZTsKICAgICAgY2xhc3MgTWFwOwogICAgICBjbGFzcyBNYXAkRW50cnk7CiAgICAgIGNsYXNz IE1hcCRNYXA7CiAgICAgIGNsYXNzIE1pc3NpbmdSZXNvdXJjZUV4Y2VwdGlvbjsKICAgICAgY2xh c3MgTm9TdWNoRWxlbWVudEV4Y2VwdGlvbjsKICAgICAgY2xhc3MgT2JzZXJ2YWJsZTsKICAgICAg Y2xhc3MgT2JzZXJ2ZXI7CiAgICAgIGNsYXNzIFByb3BlcnRpZXM7CiAgICAgIGNsYXNzIFByb3Bl cnR5UGVybWlzc2lvbjsKICAgICAgY2xhc3MgUHJvcGVydHlSZXNvdXJjZUJ1bmRsZTsKICAgICAg Y2xhc3MgUmFuZG9tOwogICAgICBjbGFzcyBSYW5kb21BY2Nlc3M7CiAgICAgIGNsYXNzIFJlc291 cmNlQnVuZGxlOwogICAgICBjbGFzcyBTZXQ7CiAgICAgIGNsYXNzIFNpbXBsZVRpbWVab25lOwog ICAgICBjbGFzcyBTb3J0ZWRNYXA7CiAgICAgIGNsYXNzIFNvcnRlZFNldDsKICAgICAgY2xhc3Mg U3RhY2s7CiAgICAgIGNsYXNzIFN0cmluZ1Rva2VuaXplcjsKICAgICAgY2xhc3MgU3ViTGlzdDsK ICAgICAgY2xhc3MgVGltZVpvbmU7CiAgICAgIGNsYXNzIFRpbWVyOwogICAgICBjbGFzcyBUaW1l ciRTY2hlZHVsZXI7CiAgICAgIGNsYXNzIFRpbWVyJFRhc2tRdWV1ZTsKICAgICAgY2xhc3MgVGlt ZXJUYXNrOwogICAgICBjbGFzcyBUb29NYW55TGlzdGVuZXJzRXhjZXB0aW9uOwogICAgICBjbGFz cyBUcmVlTWFwOwogICAgICBjbGFzcyBUcmVlTWFwJE5vZGU7CiAgICAgIGNsYXNzIFRyZWVNYXAk U3ViTWFwOwogICAgICBjbGFzcyBUcmVlTWFwJFRyZWVJdGVyYXRvcjsKICAgICAgY2xhc3MgVHJl ZU1hcCRWZXJpZnlSZXN1bHQ7CiAgICAgIGNsYXNzIFRyZWVTZXQ7CiAgICAgIGNsYXNzIFZlY3Rv cjsKICAgICAgY2xhc3MgV2Vha0hhc2hNYXA7CiAgICAgIGNsYXNzIFdlYWtIYXNoTWFwJEVudHJ5 OwogICAgICBjbGFzcyBXZWFrSGFzaE1hcCRXZWFrQnVja2V0OwogICAgICBjbGFzcyBXZWFrSGFz aE1hcCRXZWFrRW50cnlTZXQ7CiAgICAgIG5hbWVzcGFjZSBqYXIKICAgICAgewogICAgICAgIGNs YXNzIEF0dHJpYnV0ZXM7CiAgICAgICAgY2xhc3MgQXR0cmlidXRlcyROYW1lOwogICAgICAgIGNs YXNzIEphckVudHJ5OwogICAgICAgIGNsYXNzIEphckV4Y2VwdGlvbjsKICAgICAgICBjbGFzcyBK YXJGaWxlOwogICAgICAgIGNsYXNzIEphckZpbGUkSmFyRW51bWVyYXRpb247CiAgICAgICAgY2xh c3MgSmFySW5wdXRTdHJlYW07CiAgICAgICAgY2xhc3MgSmFyT3V0cHV0U3RyZWFtOwogICAgICAg IGNsYXNzIE1hbmlmZXN0OwogICAgICB9OwoKICAgICAgbmFtZXNwYWNlIHppcAogICAgICB7CiAg ICAgICAgY2xhc3MgQWRsZXIzMjsKICAgICAgICBjbGFzcyBDUkMzMjsKICAgICAgICBjbGFzcyBD aGVja2VkSW5wdXRTdHJlYW07CiAgICAgICAgY2xhc3MgQ2hlY2tlZE91dHB1dFN0cmVhbTsKICAg ICAgICBjbGFzcyBDaGVja3N1bTsKICAgICAgICBjbGFzcyBEYXRhRm9ybWF0RXhjZXB0aW9uOwog ICAgICAgIGNsYXNzIERlZmxhdGVyOwogICAgICAgIGNsYXNzIERlZmxhdGVyT3V0cHV0U3RyZWFt OwogICAgICAgIGNsYXNzIEdaSVBJbnB1dFN0cmVhbTsKICAgICAgICBjbGFzcyBHWklQT3V0cHV0 U3RyZWFtOwogICAgICAgIGNsYXNzIEluZmxhdGVyOwogICAgICAgIGNsYXNzIEluZmxhdGVySW5w dXRTdHJlYW07CiAgICAgICAgY2xhc3MgWmlwQ29uc3RhbnRzOwogICAgICAgIGNsYXNzIFppcEVu dHJ5OwogICAgICAgIGNsYXNzIFppcEVudW1lcmF0aW9uOwogICAgICAgIGNsYXNzIFppcEV4Y2Vw dGlvbjsKICAgICAgICBjbGFzcyBaaXBGaWxlOwogICAgICAgIGNsYXNzIFppcElucHV0U3RyZWFt OwogICAgICAgIGNsYXNzIFppcE91dHB1dFN0cmVhbTsKICAgICAgfTsKICAgIH07CiAgfTsKfTsK CnR5cGVkZWYgc3RydWN0IGphdmE6Omxhbmc6Ok9iamVjdCogam9iamVjdDsKdHlwZWRlZiBjbGFz cyBqYXZhOjpsYW5nOjpDbGFzcyogamNsYXNzOwp0eXBlZGVmIGNsYXNzIGphdmE6Omxhbmc6OlRo cm93YWJsZSoganRocm93YWJsZTsKdHlwZWRlZiBjbGFzcyBqYXZhOjpsYW5nOjpTdHJpbmcqIGpz dHJpbmc7CnN0cnVjdCBfSnZfSk5JRW52OwoKdHlwZWRlZiBzdHJ1Y3QgX0p2X0ZpZWxkICpqZmll bGRJRDsKdHlwZWRlZiBzdHJ1Y3QgX0p2X01ldGhvZCAqam1ldGhvZElEOwoKZXh0ZXJuICJDIiBq b2JqZWN0IF9Kdl9BbGxvY09iamVjdCAoamNsYXNzLCBqaW50KSBfX2F0dHJpYnV0ZV9fKChfX21h bGxvY19fKSk7CmV4dGVybiAiQyIgam9iamVjdCBfSnZfQWxsb2NPYmplY3ROb0ZpbmFsaXplciAo amNsYXNzLCBqaW50KSBfX2F0dHJpYnV0ZV9fKChfX21hbGxvY19fKSk7CmV4dGVybiAiQyIgam9i amVjdCBfSnZfQWxsb2NPYmplY3ROb0luaXROb0ZpbmFsaXplciAoamNsYXNzLCBqaW50KSBfX2F0 dHJpYnV0ZV9fKChfX21hbGxvY19fKSk7CgogIGV4dGVybiAiQyIgam9iamVjdCBfSnZfQWxsb2NQ dHJGcmVlT2JqZWN0IChqY2xhc3MsIGppbnQpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBf X2F0dHJpYnV0ZV9fKChfX21hbGxvY19fKSk7CgoKCgoKCgpleHRlcm4gIkMiIGpib29sZWFuIF9K dl9Jc0luc3RhbmNlT2Yoam9iamVjdCwgamNsYXNzKTsKZXh0ZXJuICJDIiBqc3RyaW5nIF9Kdl9B bGxvY1N0cmluZyhqc2l6ZSkgX19hdHRyaWJ1dGVfXygoX19tYWxsb2NfXykpOwpleHRlcm4gIkMi IGpzdHJpbmcgX0p2X05ld1N0cmluZyAoY29uc3QgamNoYXIqLCBqc2l6ZSkKICBfX2F0dHJpYnV0 ZV9fKChfX21hbGxvY19fKSk7CmV4dGVybiBqaW50IF9Kdl9Gb3JtYXRJbnQgKGpjaGFyKiBidWZl bmQsIGppbnQgbnVtKTsKZXh0ZXJuICJDIiBqY2hhciogX0p2X0dldFN0cmluZ0NoYXJzIChqc3Ry aW5nIHN0cik7CmV4dGVybiAiQyIgdm9pZCBfSnZfTW9uaXRvckVudGVyIChqb2JqZWN0KTsKZXh0 ZXJuICJDIiB2b2lkIF9Kdl9Nb25pdG9yRXhpdCAoam9iamVjdCk7CmV4dGVybiAiQyIganN0cmlu ZyBfSnZfTmV3U3RyaW5nTGF0aW4xKGNvbnN0IGNoYXIqLCBqc2l6ZSkKICBfX2F0dHJpYnV0ZV9f KChfX21hbGxvY19fKSk7CmV4dGVybiAiQyIganNpemUgX0p2X0dldFN0cmluZ1VURkxlbmd0aCAo anN0cmluZyk7CmV4dGVybiAiQyIganNpemUgX0p2X0dldFN0cmluZ1VURlJlZ2lvbiAoanN0cmlu ZywganNpemUsIGpzaXplLCBjaGFyICopOwoKZXh0ZXJuIGppbnQgX0p2X0NyZWF0ZUphdmFWTSAo dm9pZCogKTsKCnZvaWQKX0p2X1RocmVhZFJ1biAoamF2YTo6bGFuZzo6VGhyZWFkKiB0aHJlYWQp OwpqaW50Cl9Kdl9BdHRhY2hDdXJyZW50VGhyZWFkKGphdmE6Omxhbmc6OlRocmVhZCogdGhyZWFk KTsKZXh0ZXJuICJDIiBqYXZhOjpsYW5nOjpUaHJlYWQqCl9Kdl9BdHRhY2hDdXJyZW50VGhyZWFk KGpzdHJpbmcgbmFtZSwgamF2YTo6bGFuZzo6VGhyZWFkR3JvdXAqIGdyb3VwKTsKZXh0ZXJuICJD IiBqaW50IF9Kdl9EZXRhY2hDdXJyZW50VGhyZWFkICh2b2lkKTsKCmV4dGVybiAiQyIgdm9pZCBf SnZfVGhyb3cgKGp0aHJvd2FibGUpIF9fYXR0cmlidXRlX18gKChfX25vcmV0dXJuX18pKTsKZXh0 ZXJuICJDIiB2b2lkKiBfSnZfTWFsbG9jIChqc2l6ZSkgX19hdHRyaWJ1dGVfXygoX19tYWxsb2Nf XykpOwpleHRlcm4gIkMiIHZvaWQqIF9Kdl9SZWFsbG9jICh2b2lkICosIGpzaXplKTsKZXh0ZXJu ICJDIiB2b2lkIF9Kdl9GcmVlICh2b2lkKik7CmV4dGVybiB2b2lkICgqX0p2X1JlZ2lzdGVyQ2xh c3NIb29rKSAoamNsYXNzIGNsKTsKZXh0ZXJuICJDIiB2b2lkIF9Kdl9SZWdpc3RlckNsYXNzSG9v a0RlZmF1bHQgKGpjbGFzcyk7Cgp0eXBlZGVmIHVuc2lnbmVkIHNob3J0IF9Kdl91c2hvcnQgX19h dHRyaWJ1dGVfXygoX19tb2RlX18oX19ISV9fKSkpOwp0eXBlZGVmIHVuc2lnbmVkIGludCBfSnZf dWludCBfX2F0dHJpYnV0ZV9fKChfX21vZGVfXyhfX1NJX18pKSk7CgpzdHJ1Y3QgX0p2X1V0ZjhD b25zdAp7CiAgX0p2X3VzaG9ydCBoYXNoOwogIF9Kdl91c2hvcnQgbGVuZ3RoOwogIGNoYXIgZGF0 YVsxXTsKfTsKIyAyMSAiLi4vLi4vLi4vZ2NjL2xpYmphdmEvaW5jbHVkZS9qdm0uaCIgMgoKIyAx ICIuLi8uLi8uLi9nY2MvbGliamF2YS9pbmNsdWRlL2phdmEtYXNzZXJ0LmgiIDEKIyAxNiAiLi4v Li4vLi4vZ2NjL2xpYmphdmEvaW5jbHVkZS9qYXZhLWFzc2VydC5oIgp2b2lkIF9Kdl9BYm9ydCAo Y29uc3QgY2hhciAqLCBjb25zdCBjaGFyICosIGludCwgY29uc3QgY2hhciAqKQogIF9fYXR0cmli dXRlX18gKChfX25vcmV0dXJuX18pKTsKIyAyMyAiLi4vLi4vLi4vZ2NjL2xpYmphdmEvaW5jbHVk ZS9qdm0uaCIgMgojIDEgImluY2x1ZGUvamF2YS10aHJlYWRzLmgiIDEKIyAyMCAiaW5jbHVkZS9q YXZhLXRocmVhZHMuaCIKIyAxICIvdXNyL2luY2x1ZGUvcHRocmVhZC5oIiAxIDMKIyAxOCAiL3Vz ci9pbmNsdWRlL3B0aHJlYWQuaCIgMwojIDEgIi91c3IvaW5jbHVkZS9mZWF0dXJlcy5oIiAxIDMK IyAyNTAgIi91c3IvaW5jbHVkZS9mZWF0dXJlcy5oIiAzCiMgMSAiL3Vzci9pbmNsdWRlL3N5cy9j ZGVmcy5oIiAxIDMKIyAyNTEgIi91c3IvaW5jbHVkZS9mZWF0dXJlcy5oIiAyIDMKIyAyNzggIi91 c3IvaW5jbHVkZS9mZWF0dXJlcy5oIiAzCiMgMSAiL3Vzci9pbmNsdWRlL2dudS9zdHVicy5oIiAx IDMKIyAyNzkgIi91c3IvaW5jbHVkZS9mZWF0dXJlcy5oIiAyIDMKIyAxOSAiL3Vzci9pbmNsdWRl L3B0aHJlYWQuaCIgMiAzCgojIDEgIi91c3IvaW5jbHVkZS9zY2hlZC5oIiAxIDMKIyAyNiAiL3Vz ci9pbmNsdWRlL3NjaGVkLmgiIDMKIyAxICIvdXNyL2luY2x1ZGUvYml0cy90eXBlcy5oIiAxIDMK IyAyOSAiL3Vzci9pbmNsdWRlL2JpdHMvdHlwZXMuaCIgMwojIDEgIi94MS9lZ2NzL2J1aWxkL2dj Yy9pbmNsdWRlL3N0ZGRlZi5oIiAxIDMKIyAyMDEgIi94MS9lZ2NzL2J1aWxkL2djYy9pbmNsdWRl L3N0ZGRlZi5oIiAzCnR5cGVkZWYgdW5zaWduZWQgaW50IHNpemVfdDsKIyAzMCAiL3Vzci9pbmNs dWRlL2JpdHMvdHlwZXMuaCIgMiAzCgoKdHlwZWRlZiB1bnNpZ25lZCBjaGFyIF9fdV9jaGFyOwp0 eXBlZGVmIHVuc2lnbmVkIHNob3J0IF9fdV9zaG9ydDsKdHlwZWRlZiB1bnNpZ25lZCBpbnQgX191 X2ludDsKdHlwZWRlZiB1bnNpZ25lZCBsb25nIF9fdV9sb25nOwoKX19leHRlbnNpb25fXyB0eXBl ZGVmIHVuc2lnbmVkIGxvbmcgbG9uZyBpbnQgX191X3F1YWRfdDsKX19leHRlbnNpb25fXyB0eXBl ZGVmIGxvbmcgbG9uZyBpbnQgX19xdWFkX3Q7CiMgNDkgIi91c3IvaW5jbHVkZS9iaXRzL3R5cGVz LmgiIDMKdHlwZWRlZiBzaWduZWQgY2hhciBfX2ludDhfdDsKdHlwZWRlZiB1bnNpZ25lZCBjaGFy IF9fdWludDhfdDsKdHlwZWRlZiBzaWduZWQgc2hvcnQgaW50IF9faW50MTZfdDsKdHlwZWRlZiB1 bnNpZ25lZCBzaG9ydCBpbnQgX191aW50MTZfdDsKdHlwZWRlZiBzaWduZWQgaW50IF9faW50MzJf dDsKdHlwZWRlZiB1bnNpZ25lZCBpbnQgX191aW50MzJfdDsKCl9fZXh0ZW5zaW9uX18gdHlwZWRl ZiBzaWduZWQgbG9uZyBsb25nIGludCBfX2ludDY0X3Q7Cl9fZXh0ZW5zaW9uX18gdHlwZWRlZiB1 bnNpZ25lZCBsb25nIGxvbmcgaW50IF9fdWludDY0X3Q7Cgp0eXBlZGVmIF9fcXVhZF90ICpfX3Fh ZGRyX3Q7Cgp0eXBlZGVmIF9fdV9xdWFkX3QgX19kZXZfdDsKdHlwZWRlZiBfX3VfaW50IF9fdWlk X3Q7CnR5cGVkZWYgX191X2ludCBfX2dpZF90Owp0eXBlZGVmIF9fdV9sb25nIF9faW5vX3Q7CnR5 cGVkZWYgX191X2ludCBfX21vZGVfdDsKdHlwZWRlZiBfX3VfaW50IF9fbmxpbmtfdDsKdHlwZWRl ZiBsb25nIGludCBfX29mZl90Owp0eXBlZGVmIF9fcXVhZF90IF9fbG9mZl90Owp0eXBlZGVmIGlu dCBfX3BpZF90Owp0eXBlZGVmIGludCBfX3NzaXplX3Q7CnR5cGVkZWYgbG9uZyBpbnQgX19ybGlt X3Q7CnR5cGVkZWYgX19xdWFkX3QgX19ybGltNjRfdDsKdHlwZWRlZiBfX3VfaW50IF9faWRfdDsK CnR5cGVkZWYgc3RydWN0CiAgewogICAgaW50IF9fdmFsWzJdOwogIH0gX19mc2lkX3Q7CgoKdHlw ZWRlZiBpbnQgX19kYWRkcl90Owp0eXBlZGVmIGNoYXIgKl9fY2FkZHJfdDsKdHlwZWRlZiBsb25n IGludCBfX3RpbWVfdDsKdHlwZWRlZiBsb25nIGludCBfX3N3YmxrX3Q7Cgp0eXBlZGVmIGxvbmcg aW50IF9fY2xvY2tfdDsKCgp0eXBlZGVmIHVuc2lnbmVkIGxvbmcgaW50IF9fZmRfbWFzazsKIyAx MDAgIi91c3IvaW5jbHVkZS9iaXRzL3R5cGVzLmgiIDMKdHlwZWRlZiBzdHJ1Y3QKICB7CgoKCiAg ICBfX2ZkX21hc2sgZmRzX2JpdHNbMTAyNCAvICg4ICogc2l6ZW9mIChfX2ZkX21hc2spKV07CgoK CgoKICB9IF9fZmRfc2V0OwoKCnR5cGVkZWYgaW50IF9fa2V5X3Q7CgoKdHlwZWRlZiB1bnNpZ25l ZCBzaG9ydCBpbnQgX19pcGNfcGlkX3Q7CgoKCgoKdHlwZWRlZiBsb25nIGludCBfX2Jsa2NudF90 Owp0eXBlZGVmIF9fcXVhZF90IF9fYmxrY250NjRfdDsKCgp0eXBlZGVmIF9fdV9sb25nIF9fZnNi bGtjbnRfdDsKdHlwZWRlZiBfX3VfcXVhZF90IF9fZnNibGtjbnQ2NF90OwoKCnR5cGVkZWYgX191 X2xvbmcgX19mc2ZpbGNudF90Owp0eXBlZGVmIF9fdV9xdWFkX3QgX19mc2ZpbGNudDY0X3Q7CgoK dHlwZWRlZiBfX3VfbG9uZyBfX2lubzY0X3Q7CgoKdHlwZWRlZiBfX2xvZmZfdCBfX29mZjY0X3Q7 CgoKdHlwZWRlZiBsb25nIGludCBfX3Rfc2NhbGFyX3Q7CnR5cGVkZWYgdW5zaWduZWQgbG9uZyBp bnQgX190X3VzY2FsYXJfdDsKCgp0eXBlZGVmIGludCBfX2ludHB0cl90OwoKCgoKIyAxICIvdXNy L2luY2x1ZGUvYml0cy9wdGhyZWFkdHlwZXMuaCIgMSAzCiMgMjMgIi91c3IvaW5jbHVkZS9iaXRz L3B0aHJlYWR0eXBlcy5oIiAzCiMgMSAiL3Vzci9pbmNsdWRlL2JpdHMvc2NoZWQuaCIgMSAzCiMg NjggIi91c3IvaW5jbHVkZS9iaXRzL3NjaGVkLmgiIDMKc3RydWN0IF9fc2NoZWRfcGFyYW0KICB7 CiAgICBpbnQgc2NoZWRfcHJpb3JpdHk7CiAgfTsKIyAyNCAiL3Vzci9pbmNsdWRlL2JpdHMvcHRo cmVhZHR5cGVzLmgiIDIgMwoKCnN0cnVjdCBfcHRocmVhZF9mYXN0bG9jawp7CiAgbG9uZyBpbnQg X19zdGF0dXM7CiAgaW50IF9fc3BpbmxvY2s7Cn07CgoKCnR5cGVkZWYgc3RydWN0IF9wdGhyZWFk X2Rlc2NyX3N0cnVjdCAqX3B0aHJlYWRfZGVzY3I7CgoKCgoKdHlwZWRlZiBzdHJ1Y3QKewogIGlu dCBfX2RldGFjaHN0YXRlOwogIGludCBfX3NjaGVkcG9saWN5OwogIHN0cnVjdCBfX3NjaGVkX3Bh cmFtIF9fc2NoZWRwYXJhbTsKICBpbnQgX19pbmhlcml0c2NoZWQ7CiAgaW50IF9fc2NvcGU7CiAg c2l6ZV90IF9fZ3VhcmRzaXplOwogIGludCBfX3N0YWNrYWRkcl9zZXQ7CiAgdm9pZCAqX19zdGFj a2FkZHI7CiAgc2l6ZV90IF9fc3RhY2tzaXplOwp9IHB0aHJlYWRfYXR0cl90OwoKCgp0eXBlZGVm IHN0cnVjdAp7CiAgc3RydWN0IF9wdGhyZWFkX2Zhc3Rsb2NrIF9fY19sb2NrOwogIF9wdGhyZWFk X2Rlc2NyIF9fY193YWl0aW5nOwp9IHB0aHJlYWRfY29uZF90OwoKCgp0eXBlZGVmIHN0cnVjdAp7 CiAgaW50IF9fZHVtbXk7Cn0gcHRocmVhZF9jb25kYXR0cl90OwoKCnR5cGVkZWYgdW5zaWduZWQg aW50IHB0aHJlYWRfa2V5X3Q7CgoKCgoKdHlwZWRlZiBzdHJ1Y3QKewogIGludCBfX21fcmVzZXJ2 ZWQ7CiAgaW50IF9fbV9jb3VudDsKICBfcHRocmVhZF9kZXNjciBfX21fb3duZXI7CiAgaW50IF9f bV9raW5kOwogIHN0cnVjdCBfcHRocmVhZF9mYXN0bG9jayBfX21fbG9jazsKfSBwdGhyZWFkX211 dGV4X3Q7CgoKCnR5cGVkZWYgc3RydWN0CnsKICBpbnQgX19tdXRleGtpbmQ7Cn0gcHRocmVhZF9t dXRleGF0dHJfdDsKCgoKdHlwZWRlZiBpbnQgcHRocmVhZF9vbmNlX3Q7CgoKCgp0eXBlZGVmIHN0 cnVjdCBfcHRocmVhZF9yd2xvY2tfdAp7CiAgc3RydWN0IF9wdGhyZWFkX2Zhc3Rsb2NrIF9fcndf bG9jazsKICBpbnQgX19yd19yZWFkZXJzOwogIF9wdGhyZWFkX2Rlc2NyIF9fcndfd3JpdGVyOwog IF9wdGhyZWFkX2Rlc2NyIF9fcndfcmVhZF93YWl0aW5nOwogIF9wdGhyZWFkX2Rlc2NyIF9fcndf d3JpdGVfd2FpdGluZzsKICBpbnQgX19yd19raW5kOwogIGludCBfX3J3X3BzaGFyZWQ7Cn0gcHRo cmVhZF9yd2xvY2tfdDsKCgoKdHlwZWRlZiBzdHJ1Y3QKewogIGludCBfX2xvY2traW5kOwogIGlu dCBfX3BzaGFyZWQ7Cn0gcHRocmVhZF9yd2xvY2thdHRyX3Q7CgoKCgp0eXBlZGVmIHVuc2lnbmVk IGxvbmcgaW50IHB0aHJlYWRfdDsKIyAxNTEgIi91c3IvaW5jbHVkZS9iaXRzL3R5cGVzLmgiIDIg MwojIDI3ICIvdXNyL2luY2x1ZGUvc2NoZWQuaCIgMiAzCgoKIyAxICIvdXNyL2luY2x1ZGUvdGlt ZS5oIiAxIDMKIyA4MyAiL3Vzci9pbmNsdWRlL3RpbWUuaCIgMwpzdHJ1Y3QgdGltZXNwZWMKICB7 CiAgICBsb25nIGludCB0dl9zZWM7CiAgICBsb25nIGludCB0dl9uc2VjOwogIH07CiMgMzAgIi91 c3IvaW5jbHVkZS9zY2hlZC5oIiAyIDMKCgojIDEgIi91c3IvaW5jbHVkZS9iaXRzL3NjaGVkLmgi IDEgMwojIDQ3ICIvdXNyL2luY2x1ZGUvYml0cy9zY2hlZC5oIiAzCnN0cnVjdCBzY2hlZF9wYXJh bQogIHsKICAgIGludCBzY2hlZF9wcmlvcml0eTsKICB9OwoKZXh0ZXJuICJDIiB7CgoKCmV4dGVy biBpbnQgY2xvbmUgKGludCAoKl9fZm4pICh2b2lkICpfX2FyZyksIHZvaWQgKl9fY2hpbGRfc3Rh Y2ssIGludCBfX2ZsYWdzLCB2b2lkICpfX2FyZykgdGhyb3cgKCk7CgoKCn0KIyAzMyAiL3Vzci9p bmNsdWRlL3NjaGVkLmgiIDIgMwoKZXh0ZXJuICJDIiB7CgoKZXh0ZXJuIGludCBfX3NjaGVkX3Nl dHBhcmFtIChfX3BpZF90IF9fcGlkLCBfX2NvbnN0IHN0cnVjdCBzY2hlZF9wYXJhbSAqX19wYXJh bSkgdGhyb3cgKCk7CgpleHRlcm4gaW50IHNjaGVkX3NldHBhcmFtIChfX3BpZF90IF9fcGlkLCBf X2NvbnN0IHN0cnVjdCBzY2hlZF9wYXJhbSAqX19wYXJhbSkgdGhyb3cgKCk7CgoKCmV4dGVybiBp bnQgX19zY2hlZF9nZXRwYXJhbSAoX19waWRfdCBfX3BpZCwgc3RydWN0IHNjaGVkX3BhcmFtICpf X3BhcmFtKSB0aHJvdyAoKTsKZXh0ZXJuIGludCBzY2hlZF9nZXRwYXJhbSAoX19waWRfdCBfX3Bp ZCwgc3RydWN0IHNjaGVkX3BhcmFtICpfX3BhcmFtKSB0aHJvdyAoKTsKCgpleHRlcm4gaW50IF9f c2NoZWRfc2V0c2NoZWR1bGVyIChfX3BpZF90IF9fcGlkLCBpbnQgX19wb2xpY3ksIF9fY29uc3Qg c3RydWN0IHNjaGVkX3BhcmFtICpfX3BhcmFtKSB0aHJvdyAoKTsKCmV4dGVybiBpbnQgc2NoZWRf c2V0c2NoZWR1bGVyIChfX3BpZF90IF9fcGlkLCBpbnQgX19wb2xpY3ksIF9fY29uc3Qgc3RydWN0 IHNjaGVkX3BhcmFtICpfX3BhcmFtKSB0aHJvdyAoKTsKCgoKZXh0ZXJuIGludCBfX3NjaGVkX2dl dHNjaGVkdWxlciAoX19waWRfdCBfX3BpZCkgdGhyb3cgKCk7CmV4dGVybiBpbnQgc2NoZWRfZ2V0 c2NoZWR1bGVyIChfX3BpZF90IF9fcGlkKSB0aHJvdyAoKTsKCgpleHRlcm4gaW50IF9fc2NoZWRf eWllbGQgKHZvaWQpIHRocm93ICgpOwpleHRlcm4gaW50IHNjaGVkX3lpZWxkICh2b2lkKSB0aHJv dyAoKTsKCgpleHRlcm4gaW50IF9fc2NoZWRfZ2V0X3ByaW9yaXR5X21heCAoaW50IF9fYWxnb3Jp dGhtKSB0aHJvdyAoKTsKZXh0ZXJuIGludCBzY2hlZF9nZXRfcHJpb3JpdHlfbWF4IChpbnQgX19h bGdvcml0aG0pIHRocm93ICgpOwoKCmV4dGVybiBpbnQgX19zY2hlZF9nZXRfcHJpb3JpdHlfbWlu IChpbnQgX19hbGdvcml0aG0pIHRocm93ICgpOwpleHRlcm4gaW50IHNjaGVkX2dldF9wcmlvcml0 eV9taW4gKGludCBfX2FsZ29yaXRobSkgdGhyb3cgKCk7CgoKZXh0ZXJuIGludCBfX3NjaGVkX3Jy X2dldF9pbnRlcnZhbCAoX19waWRfdCBfX3BpZCwgc3RydWN0IHRpbWVzcGVjICpfX3QpIHRocm93 ICgpOwpleHRlcm4gaW50IHNjaGVkX3JyX2dldF9pbnRlcnZhbCAoX19waWRfdCBfX3BpZCwgc3Ry dWN0IHRpbWVzcGVjICpfX3QpIHRocm93ICgpOwoKfQojIDIxICIvdXNyL2luY2x1ZGUvcHRocmVh ZC5oIiAyIDMKIyAxICIvdXNyL2luY2x1ZGUvdGltZS5oIiAxIDMKIyAzMCAiL3Vzci9pbmNsdWRl L3RpbWUuaCIgMwpleHRlcm4gIkMiIHsKCgoKCgoKCiMgMSAiL3gxL2VnY3MvYnVpbGQvZ2NjL2lu Y2x1ZGUvc3RkZGVmLmgiIDEgMwojIDM5ICIvdXNyL2luY2x1ZGUvdGltZS5oIiAyIDMKCgoKIyAx ICIvdXNyL2luY2x1ZGUvYml0cy90aW1lLmgiIDEgMwojIDQzICIvdXNyL2luY2x1ZGUvdGltZS5o IiAyIDMKIyA2MCAiL3Vzci9pbmNsdWRlL3RpbWUuaCIgMwp0eXBlZGVmIF9fY2xvY2tfdCBjbG9j a190OwojIDcxICIvdXNyL2luY2x1ZGUvdGltZS5oIiAzCnR5cGVkZWYgX190aW1lX3QgdGltZV90 OwojIDk1ICIvdXNyL2luY2x1ZGUvdGltZS5oIiAzCnN0cnVjdCB0bQp7CiAgaW50IHRtX3NlYzsK ICBpbnQgdG1fbWluOwogIGludCB0bV9ob3VyOwogIGludCB0bV9tZGF5OwogIGludCB0bV9tb247 CiAgaW50IHRtX3llYXI7CiAgaW50IHRtX3dkYXk7CiAgaW50IHRtX3lkYXk7CiAgaW50IHRtX2lz ZHN0OwoKCiAgbG9uZyBpbnQgdG1fZ210b2ZmOwogIF9fY29uc3QgY2hhciAqdG1fem9uZTsKCgoK Cn07CgoKCgpleHRlcm4gY2xvY2tfdCBjbG9jayAodm9pZCkgdGhyb3cgKCk7CgoKZXh0ZXJuIHRp bWVfdCB0aW1lICh0aW1lX3QgKl9fdGltZXIpIHRocm93ICgpOwoKCmV4dGVybiBkb3VibGUgZGlm ZnRpbWUgKHRpbWVfdCBfX3RpbWUxLCB0aW1lX3QgX190aW1lMCkgdGhyb3cgKCkKICAgICBfX2F0 dHJpYnV0ZV9fICgoX19jb25zdF9fKSk7CgoKZXh0ZXJuIHRpbWVfdCBta3RpbWUgKHN0cnVjdCB0 bSAqX190cCkgdGhyb3cgKCk7CgoKCgoKZXh0ZXJuIHNpemVfdCBzdHJmdGltZSAoY2hhciAqX19y ZXN0cmljdCBfX3MsIHNpemVfdCBfX21heHNpemUsIF9fY29uc3QgY2hhciAqX19yZXN0cmljdCBf X2Zvcm1hdCwgX19jb25zdCBzdHJ1Y3QgdG0gKl9fcmVzdHJpY3QgX190cCkgdGhyb3cgKCk7CgoK CgoKCmV4dGVybiBjaGFyICpzdHJwdGltZSAoX19jb25zdCBjaGFyICpfX3MsIF9fY29uc3QgY2hh ciAqX19mbXQsIHN0cnVjdCB0bSAqX190cCkgdGhyb3cgKCk7CgoKCgoKCmV4dGVybiBzdHJ1Y3Qg dG0gKmdtdGltZSAoX19jb25zdCB0aW1lX3QgKl9fdGltZXIpIHRocm93ICgpOwoKCgpleHRlcm4g c3RydWN0IHRtICpsb2NhbHRpbWUgKF9fY29uc3QgdGltZV90ICpfX3RpbWVyKSB0aHJvdyAoKTsK CgoKCmV4dGVybiBzdHJ1Y3QgdG0gKl9fZ210aW1lX3IgKF9fY29uc3QgdGltZV90ICpfX3Jlc3Ry aWN0IF9fdGltZXIsIHN0cnVjdCB0bSAqX19yZXN0cmljdCBfX3RwKSB0aHJvdyAoKTsKCmV4dGVy biBzdHJ1Y3QgdG0gKmdtdGltZV9yIChfX2NvbnN0IHRpbWVfdCAqX19yZXN0cmljdCBfX3RpbWVy LCBzdHJ1Y3QgdG0gKl9fcmVzdHJpY3QgX190cCkgdGhyb3cgKCk7CgoKCgpleHRlcm4gc3RydWN0 IHRtICpsb2NhbHRpbWVfciAoX19jb25zdCB0aW1lX3QgKl9fcmVzdHJpY3QgX190aW1lciwgc3Ry dWN0IHRtICpfX3Jlc3RyaWN0IF9fdHApIHRocm93ICgpOwoKCgoKCmV4dGVybiBjaGFyICphc2N0 aW1lIChfX2NvbnN0IHN0cnVjdCB0bSAqX190cCkgdGhyb3cgKCk7CgoKZXh0ZXJuIGNoYXIgKmN0 aW1lIChfX2NvbnN0IHRpbWVfdCAqX190aW1lcikgdGhyb3cgKCk7CgoKCgoKCmV4dGVybiBjaGFy ICphc2N0aW1lX3IgKF9fY29uc3Qgc3RydWN0IHRtICpfX3Jlc3RyaWN0IF9fdHAsIGNoYXIgKl9f cmVzdHJpY3QgX19idWYpIHRocm93ICgpOwoKCgpleHRlcm4gY2hhciAqY3RpbWVfciAoX19jb25z dCB0aW1lX3QgKl9fcmVzdHJpY3QgX190aW1lciwgY2hhciAqX19yZXN0cmljdCBfX2J1ZikgdGhy b3cgKCk7CgoKCgoKZXh0ZXJuIGNoYXIgKl9fdHpuYW1lWzJdOwpleHRlcm4gaW50IF9fZGF5bGln aHQ7CmV4dGVybiBsb25nIGludCBfX3RpbWV6b25lOwoKCgoKZXh0ZXJuIGNoYXIgKnR6bmFtZVsy XTsKCgoKZXh0ZXJuIHZvaWQgdHpzZXQgKHZvaWQpIHRocm93ICgpOwoKCgpleHRlcm4gaW50IGRh eWxpZ2h0OwpleHRlcm4gbG9uZyBpbnQgdGltZXpvbmU7CgoKCgoKZXh0ZXJuIGludCBzdGltZSAo X19jb25zdCB0aW1lX3QgKl9fd2hlbikgdGhyb3cgKCk7CiMgMjI4ICIvdXNyL2luY2x1ZGUvdGlt ZS5oIiAzCmV4dGVybiB0aW1lX3QgdGltZWdtIChzdHJ1Y3QgdG0gKl9fdHApIHRocm93ICgpOwoK CmV4dGVybiB0aW1lX3QgdGltZWxvY2FsIChzdHJ1Y3QgdG0gKl9fdHApIHRocm93ICgpOwoKCmV4 dGVybiBpbnQgZHlzaXplIChpbnQgX195ZWFyKSB0aHJvdyAoKTsKCgoKCgpleHRlcm4gaW50IG5h bm9zbGVlcCAoX19jb25zdCBzdHJ1Y3QgdGltZXNwZWMgKl9fcmVxdWVzdGVkX3RpbWUsIHN0cnVj dCB0aW1lc3BlYyAqX19yZW1haW5pbmcpIHRocm93ICgpOwojIDI1NyAiL3Vzci9pbmNsdWRlL3Rp bWUuaCIgMwpleHRlcm4gaW50IGdldGRhdGVfZXJyOwoKCgoKCmV4dGVybiBzdHJ1Y3QgdG0gKmdl dGRhdGUgKF9fY29uc3QgY2hhciAqX19zdHJpbmcpIHRocm93ICgpOwojIDI3MiAiL3Vzci9pbmNs dWRlL3RpbWUuaCIgMwpleHRlcm4gaW50IGdldGRhdGVfciAoX19jb25zdCBjaGFyICpfX3Jlc3Ry aWN0IF9fc3RyaW5nLCBzdHJ1Y3QgdG0gKl9fcmVzdHJpY3QgX19yZXNidWZwKSB0aHJvdyAoKTsK CgoKCn0KIyAyMiAiL3Vzci9pbmNsdWRlL3B0aHJlYWQuaCIgMiAzCgoKIyAxICIvdXNyL2luY2x1 ZGUvc2lnbmFsLmgiIDEgMwojIDMxICIvdXNyL2luY2x1ZGUvc2lnbmFsLmgiIDMKZXh0ZXJuICJD IiB7CgojIDEgIi91c3IvaW5jbHVkZS9iaXRzL3NpZ3NldC5oIiAxIDMKIyAyMyAiL3Vzci9pbmNs dWRlL2JpdHMvc2lnc2V0LmgiIDMKdHlwZWRlZiBpbnQgX19zaWdfYXRvbWljX3Q7CgoKCgp0eXBl ZGVmIHN0cnVjdAogIHsKICAgIHVuc2lnbmVkIGxvbmcgaW50IF9fdmFsWygxMDI0IC8gKDggKiBz aXplb2YgKHVuc2lnbmVkIGxvbmcgaW50KSkpXTsKICB9IF9fc2lnc2V0X3Q7CiMgMzQgIi91c3Iv aW5jbHVkZS9zaWduYWwuaCIgMiAzCiMgNDkgIi91c3IvaW5jbHVkZS9zaWduYWwuaCIgMwp0eXBl ZGVmIF9fc2lnc2V0X3Qgc2lnc2V0X3Q7CiMgMzYyICIvdXNyL2luY2x1ZGUvc2lnbmFsLmgiIDMK fQojIDI1ICIvdXNyL2luY2x1ZGUvcHRocmVhZC5oIiAyIDMKIyAxICIvdXNyL2luY2x1ZGUvYml0 cy9wdGhyZWFkdHlwZXMuaCIgMSAzCiMgMjYgIi91c3IvaW5jbHVkZS9wdGhyZWFkLmgiIDIgMwoK CmV4dGVybiAiQyIgewojIDQ5ICIvdXNyL2luY2x1ZGUvcHRocmVhZC5oIiAzCmVudW0KewogIFBU SFJFQURfQ1JFQVRFX0pPSU5BQkxFLAoKICBQVEhSRUFEX0NSRUFURV9ERVRBQ0hFRAoKfTsKCmVu dW0KewogIFBUSFJFQURfSU5IRVJJVF9TQ0hFRCwKCiAgUFRIUkVBRF9FWFBMSUNJVF9TQ0hFRAoK fTsKCmVudW0KewogIFBUSFJFQURfU0NPUEVfU1lTVEVNLAoKICBQVEhSRUFEX1NDT1BFX1BST0NF U1MKCn07CgplbnVtCnsKICBQVEhSRUFEX01VVEVYX0ZBU1RfTlAsCiAgUFRIUkVBRF9NVVRFWF9S RUNVUlNJVkVfTlAsCiAgUFRIUkVBRF9NVVRFWF9FUlJPUkNIRUNLX05QCgogICwKICBQVEhSRUFE X01VVEVYX05PUk1BTCA9IFBUSFJFQURfTVVURVhfRkFTVF9OUCwKICBQVEhSRUFEX01VVEVYX1JF Q1VSU0lWRSA9IFBUSFJFQURfTVVURVhfUkVDVVJTSVZFX05QLAogIFBUSFJFQURfTVVURVhfRVJS T1JDSEVDSyA9IFBUSFJFQURfTVVURVhfRVJST1JDSEVDS19OUCwKICBQVEhSRUFEX01VVEVYX0RF RkFVTFQgPSBQVEhSRUFEX01VVEVYX05PUk1BTAoKfTsKCmVudW0KewogIFBUSFJFQURfUFJPQ0VT U19QUklWQVRFLAoKICBQVEhSRUFEX1BST0NFU1NfU0hBUkVECgp9OwoKCmVudW0KewogIFBUSFJF QURfUldMT0NLX1BSRUZFUl9SRUFERVJfTlAsCiAgUFRIUkVBRF9SV0xPQ0tfUFJFRkVSX1dSSVRF Ul9OUCwKICBQVEhSRUFEX1JXTE9DS19QUkVGRVJfV1JJVEVSX05PTlJFQ1VSU0lWRV9OUCwKICBQ VEhSRUFEX1JXTE9DS19ERUZBVUxUX05QID0gUFRIUkVBRF9SV0xPQ0tfUFJFRkVSX1dSSVRFUl9O UAp9OwoKCgoKCgpzdHJ1Y3QgX3B0aHJlYWRfY2xlYW51cF9idWZmZXIKewogIHZvaWQgKCpfX3Jv dXRpbmUpICh2b2lkICopOwogIHZvaWQgKl9fYXJnOwogIGludCBfX2NhbmNlbHR5cGU7CiAgc3Ry dWN0IF9wdGhyZWFkX2NsZWFudXBfYnVmZmVyICpfX3ByZXY7Cn07CgoKCmVudW0KewogIFBUSFJF QURfQ0FOQ0VMX0VOQUJMRSwKCiAgUFRIUkVBRF9DQU5DRUxfRElTQUJMRQoKfTsKZW51bQp7CiAg UFRIUkVBRF9DQU5DRUxfREVGRVJSRUQsCgogIFBUSFJFQURfQ0FOQ0VMX0FTWU5DSFJPTk9VUwoK fTsKIyAxNDEgIi91c3IvaW5jbHVkZS9wdGhyZWFkLmgiIDMKZXh0ZXJuIGludCBwdGhyZWFkX2Ny ZWF0ZSAocHRocmVhZF90ICpfX3RocmVhZCwgX19jb25zdCBwdGhyZWFkX2F0dHJfdCAqX19hdHRy LCB2b2lkICooKl9fc3RhcnRfcm91dGluZSkgKHZvaWQgKiksIHZvaWQgKl9fYXJnKSB0aHJvdyAo KTsKCgoKCgpleHRlcm4gcHRocmVhZF90IHB0aHJlYWRfc2VsZiAodm9pZCkgdGhyb3cgKCk7CgoK ZXh0ZXJuIGludCBwdGhyZWFkX2VxdWFsIChwdGhyZWFkX3QgX190aHJlYWQxLCBwdGhyZWFkX3Qg X190aHJlYWQyKSB0aHJvdyAoKTsKCgpleHRlcm4gdm9pZCBwdGhyZWFkX2V4aXQgKHZvaWQgKl9f cmV0dmFsKSB0aHJvdyAoKSBfX2F0dHJpYnV0ZV9fICgoX19ub3JldHVybl9fKSk7CgoKCgpleHRl cm4gaW50IHB0aHJlYWRfam9pbiAocHRocmVhZF90IF9fdGgsIHZvaWQgKipfX3RocmVhZF9yZXR1 cm4pIHRocm93ICgpOwoKCgoKCmV4dGVybiBpbnQgcHRocmVhZF9kZXRhY2ggKHB0aHJlYWRfdCBf X3RoKSB0aHJvdyAoKTsKCgoKCgoKCmV4dGVybiBpbnQgcHRocmVhZF9hdHRyX2luaXQgKHB0aHJl YWRfYXR0cl90ICpfX2F0dHIpIHRocm93ICgpOwoKCmV4dGVybiBpbnQgcHRocmVhZF9hdHRyX2Rl c3Ryb3kgKHB0aHJlYWRfYXR0cl90ICpfX2F0dHIpIHRocm93ICgpOwoKCmV4dGVybiBpbnQgcHRo cmVhZF9hdHRyX3NldGRldGFjaHN0YXRlIChwdGhyZWFkX2F0dHJfdCAqX19hdHRyLCBpbnQgX19k ZXRhY2hzdGF0ZSkgdGhyb3cgKCk7CgoKCmV4dGVybiBpbnQgcHRocmVhZF9hdHRyX2dldGRldGFj aHN0YXRlIChfX2NvbnN0IHB0aHJlYWRfYXR0cl90ICpfX2F0dHIsIGludCAqX19kZXRhY2hzdGF0 ZSkgdGhyb3cgKCk7CgoKCmV4dGVybiBpbnQgcHRocmVhZF9hdHRyX3NldHNjaGVkcGFyYW0gKHB0 aHJlYWRfYXR0cl90ICpfX2F0dHIsIF9fY29uc3Qgc3RydWN0IHNjaGVkX3BhcmFtICpfX3BhcmFt KSB0aHJvdyAoKTsKCgoKZXh0ZXJuIGludCBwdGhyZWFkX2F0dHJfZ2V0c2NoZWRwYXJhbSAoX19j b25zdCBwdGhyZWFkX2F0dHJfdCAqX19hdHRyLCBzdHJ1Y3Qgc2NoZWRfcGFyYW0gKl9fcGFyYW0p IHRocm93ICgpOwoKCgpleHRlcm4gaW50IHB0aHJlYWRfYXR0cl9zZXRzY2hlZHBvbGljeSAocHRo cmVhZF9hdHRyX3QgKl9fYXR0ciwgaW50IF9fcG9saWN5KSB0aHJvdyAoKTsKCgoKZXh0ZXJuIGlu dCBwdGhyZWFkX2F0dHJfZ2V0c2NoZWRwb2xpY3kgKF9fY29uc3QgcHRocmVhZF9hdHRyX3QgKl9f YXR0ciwgaW50ICpfX3BvbGljeSkgdGhyb3cgKCk7CgoKCmV4dGVybiBpbnQgcHRocmVhZF9hdHRy X3NldGluaGVyaXRzY2hlZCAocHRocmVhZF9hdHRyX3QgKl9fYXR0ciwgaW50IF9faW5oZXJpdCkg dGhyb3cgKCk7CgoKCmV4dGVybiBpbnQgcHRocmVhZF9hdHRyX2dldGluaGVyaXRzY2hlZCAoX19j b25zdCBwdGhyZWFkX2F0dHJfdCAqX19hdHRyLCBpbnQgKl9faW5oZXJpdCkgdGhyb3cgKCk7CgoK CmV4dGVybiBpbnQgcHRocmVhZF9hdHRyX3NldHNjb3BlIChwdGhyZWFkX2F0dHJfdCAqX19hdHRy LCBpbnQgX19zY29wZSkgdGhyb3cgKCk7CgoKZXh0ZXJuIGludCBwdGhyZWFkX2F0dHJfZ2V0c2Nv cGUgKF9fY29uc3QgcHRocmVhZF9hdHRyX3QgKl9fYXR0ciwgaW50ICpfX3Njb3BlKSB0aHJvdyAo KTsKCgoKCmV4dGVybiBpbnQgcHRocmVhZF9hdHRyX3NldGd1YXJkc2l6ZSAocHRocmVhZF9hdHRy X3QgKl9fYXR0ciwgc2l6ZV90IF9fZ3VhcmRzaXplKSB0aHJvdyAoKTsKCgoKZXh0ZXJuIGludCBw dGhyZWFkX2F0dHJfZ2V0Z3VhcmRzaXplIChfX2NvbnN0IHB0aHJlYWRfYXR0cl90ICpfX2F0dHIs IHNpemVfdCAqX19ndWFyZHNpemUpIHRocm93ICgpOwoKCgoKCgoKZXh0ZXJuIGludCBwdGhyZWFk X2F0dHJfc2V0c3RhY2thZGRyIChwdGhyZWFkX2F0dHJfdCAqX19hdHRyLCB2b2lkICpfX3N0YWNr YWRkcikgdGhyb3cgKCk7CgoKCmV4dGVybiBpbnQgcHRocmVhZF9hdHRyX2dldHN0YWNrYWRkciAo X19jb25zdCBwdGhyZWFkX2F0dHJfdCAqX19hdHRyLCB2b2lkICoqX19zdGFja2FkZHIpIHRocm93 ICgpOwoKCgoKCmV4dGVybiBpbnQgcHRocmVhZF9hdHRyX3NldHN0YWNrc2l6ZSAocHRocmVhZF9h dHRyX3QgKl9fYXR0ciwgc2l6ZV90IF9fc3RhY2tzaXplKSB0aHJvdyAoKTsKCgoKZXh0ZXJuIGlu dCBwdGhyZWFkX2F0dHJfZ2V0c3RhY2tzaXplIChfX2NvbnN0IHB0aHJlYWRfYXR0cl90ICpfX2F0 dHIsIHNpemVfdCAqX19zdGFja3NpemUpIHRocm93ICgpOwoKCgoKCgpleHRlcm4gaW50IHB0aHJl YWRfc2V0c2NoZWRwYXJhbSAocHRocmVhZF90IF9fdGFyZ2V0X3RocmVhZCwgaW50IF9fcG9saWN5 LCBfX2NvbnN0IHN0cnVjdCBzY2hlZF9wYXJhbSAqX19wYXJhbSkgdGhyb3cgKCk7CgoKCmV4dGVy biBpbnQgcHRocmVhZF9nZXRzY2hlZHBhcmFtIChwdGhyZWFkX3QgX190YXJnZXRfdGhyZWFkLCBp bnQgKl9fcG9saWN5LCBzdHJ1Y3Qgc2NoZWRfcGFyYW0gKl9fcGFyYW0pIHRocm93ICgpOwoKCgoK CmV4dGVybiBpbnQgcHRocmVhZF9nZXRjb25jdXJyZW5jeSAodm9pZCkgdGhyb3cgKCk7CgoKZXh0 ZXJuIGludCBwdGhyZWFkX3NldGNvbmN1cnJlbmN5IChpbnQgX19sZXZlbCkgdGhyb3cgKCk7CgoK CgoKCmV4dGVybiBpbnQgX19wdGhyZWFkX211dGV4X2luaXQgKHB0aHJlYWRfbXV0ZXhfdCAqX19t dXRleCwgX19jb25zdCBwdGhyZWFkX211dGV4YXR0cl90ICpfX211dGV4X2F0dHIpIHRocm93ICgp OwoKZXh0ZXJuIGludCBwdGhyZWFkX211dGV4X2luaXQgKHB0aHJlYWRfbXV0ZXhfdCAqX19tdXRl eCwgX19jb25zdCBwdGhyZWFkX211dGV4YXR0cl90ICpfX211dGV4X2F0dHIpIHRocm93ICgpOwoK CgpleHRlcm4gaW50IF9fcHRocmVhZF9tdXRleF9kZXN0cm95IChwdGhyZWFkX211dGV4X3QgKl9f bXV0ZXgpIHRocm93ICgpOwpleHRlcm4gaW50IHB0aHJlYWRfbXV0ZXhfZGVzdHJveSAocHRocmVh ZF9tdXRleF90ICpfX211dGV4KSB0aHJvdyAoKTsKCgpleHRlcm4gaW50IF9fcHRocmVhZF9tdXRl eF90cnlsb2NrIChwdGhyZWFkX211dGV4X3QgKl9fbXV0ZXgpIHRocm93ICgpOwpleHRlcm4gaW50 IHB0aHJlYWRfbXV0ZXhfdHJ5bG9jayAocHRocmVhZF9tdXRleF90ICpfX211dGV4KSB0aHJvdyAo KTsKCgpleHRlcm4gaW50IF9fcHRocmVhZF9tdXRleF9sb2NrIChwdGhyZWFkX211dGV4X3QgKl9f bXV0ZXgpIHRocm93ICgpOwpleHRlcm4gaW50IHB0aHJlYWRfbXV0ZXhfbG9jayAocHRocmVhZF9t dXRleF90ICpfX211dGV4KSB0aHJvdyAoKTsKCgpleHRlcm4gaW50IF9fcHRocmVhZF9tdXRleF91 bmxvY2sgKHB0aHJlYWRfbXV0ZXhfdCAqX19tdXRleCkgdGhyb3cgKCk7CmV4dGVybiBpbnQgcHRo cmVhZF9tdXRleF91bmxvY2sgKHB0aHJlYWRfbXV0ZXhfdCAqX19tdXRleCkgdGhyb3cgKCk7CgoK CgoKCmV4dGVybiBpbnQgX19wdGhyZWFkX211dGV4YXR0cl9pbml0IChwdGhyZWFkX211dGV4YXR0 cl90ICpfX2F0dHIpIHRocm93ICgpOwpleHRlcm4gaW50IHB0aHJlYWRfbXV0ZXhhdHRyX2luaXQg KHB0aHJlYWRfbXV0ZXhhdHRyX3QgKl9fYXR0cikgdGhyb3cgKCk7CgoKZXh0ZXJuIGludCBfX3B0 aHJlYWRfbXV0ZXhhdHRyX2Rlc3Ryb3kgKHB0aHJlYWRfbXV0ZXhhdHRyX3QgKl9fYXR0cikgdGhy b3cgKCk7CmV4dGVybiBpbnQgcHRocmVhZF9tdXRleGF0dHJfZGVzdHJveSAocHRocmVhZF9tdXRl eGF0dHJfdCAqX19hdHRyKSB0aHJvdyAoKTsKCgoKCgpleHRlcm4gaW50IF9fcHRocmVhZF9tdXRl eGF0dHJfc2V0dHlwZSAocHRocmVhZF9tdXRleGF0dHJfdCAqX19hdHRyLCBpbnQgX19raW5kKSB0 aHJvdyAoKTsKCmV4dGVybiBpbnQgcHRocmVhZF9tdXRleGF0dHJfc2V0dHlwZSAocHRocmVhZF9t dXRleGF0dHJfdCAqX19hdHRyLCBpbnQgX19raW5kKSB0aHJvdyAoKTsKCgoKZXh0ZXJuIGludCBw dGhyZWFkX211dGV4YXR0cl9nZXR0eXBlIChfX2NvbnN0IHB0aHJlYWRfbXV0ZXhhdHRyX3QgKl9f YXR0ciwgaW50ICpfX2tpbmQpIHRocm93ICgpOwojIDMyMyAiL3Vzci9pbmNsdWRlL3B0aHJlYWQu aCIgMwpleHRlcm4gaW50IHB0aHJlYWRfY29uZF9pbml0IChwdGhyZWFkX2NvbmRfdCAqX19jb25k LCBfX2NvbnN0IHB0aHJlYWRfY29uZGF0dHJfdCAqX19jb25kX2F0dHIpIHRocm93ICgpOwoKCgpl eHRlcm4gaW50IHB0aHJlYWRfY29uZF9kZXN0cm95IChwdGhyZWFkX2NvbmRfdCAqX19jb25kKSB0 aHJvdyAoKTsKCgpleHRlcm4gaW50IHB0aHJlYWRfY29uZF9zaWduYWwgKHB0aHJlYWRfY29uZF90 ICpfX2NvbmQpIHRocm93ICgpOwoKCmV4dGVybiBpbnQgcHRocmVhZF9jb25kX2Jyb2FkY2FzdCAo cHRocmVhZF9jb25kX3QgKl9fY29uZCkgdGhyb3cgKCk7CgoKCmV4dGVybiBpbnQgcHRocmVhZF9j b25kX3dhaXQgKHB0aHJlYWRfY29uZF90ICpfX2NvbmQsIHB0aHJlYWRfbXV0ZXhfdCAqX19tdXRl eCkgdGhyb3cgKCk7CgoKCgoKCmV4dGVybiBpbnQgcHRocmVhZF9jb25kX3RpbWVkd2FpdCAocHRo cmVhZF9jb25kX3QgKl9fY29uZCwgcHRocmVhZF9tdXRleF90ICpfX211dGV4LCBfX2NvbnN0IHN0 cnVjdCB0aW1lc3BlYyAqX19hYnN0aW1lKSB0aHJvdyAoKTsKCgoKCgoKZXh0ZXJuIGludCBwdGhy ZWFkX2NvbmRhdHRyX2luaXQgKHB0aHJlYWRfY29uZGF0dHJfdCAqX19hdHRyKSB0aHJvdyAoKTsK CgpleHRlcm4gaW50IHB0aHJlYWRfY29uZGF0dHJfZGVzdHJveSAocHRocmVhZF9jb25kYXR0cl90 ICpfX2F0dHIpIHRocm93ICgpOwoKCgoKCgoKZXh0ZXJuIGludCBwdGhyZWFkX3J3bG9ja19pbml0 IChwdGhyZWFkX3J3bG9ja190ICpfX3J3bG9jaywgX19jb25zdCBwdGhyZWFkX3J3bG9ja2F0dHJf dCAqX19hdHRyKSB0aHJvdyAoKTsKCgoKZXh0ZXJuIGludCBwdGhyZWFkX3J3bG9ja19kZXN0cm95 IChwdGhyZWFkX3J3bG9ja190ICpfX3J3bG9jaykgdGhyb3cgKCk7CgoKZXh0ZXJuIGludCBwdGhy ZWFkX3J3bG9ja19yZGxvY2sgKHB0aHJlYWRfcndsb2NrX3QgKl9fcndsb2NrKSB0aHJvdyAoKTsK CgpleHRlcm4gaW50IHB0aHJlYWRfcndsb2NrX3RyeXJkbG9jayAocHRocmVhZF9yd2xvY2tfdCAq X19yd2xvY2spIHRocm93ICgpOwoKCmV4dGVybiBpbnQgcHRocmVhZF9yd2xvY2tfd3Jsb2NrIChw dGhyZWFkX3J3bG9ja190ICpfX3J3bG9jaykgdGhyb3cgKCk7CgoKZXh0ZXJuIGludCBwdGhyZWFk X3J3bG9ja190cnl3cmxvY2sgKHB0aHJlYWRfcndsb2NrX3QgKl9fcndsb2NrKSB0aHJvdyAoKTsK CgpleHRlcm4gaW50IHB0aHJlYWRfcndsb2NrX3VubG9jayAocHRocmVhZF9yd2xvY2tfdCAqX19y d2xvY2spIHRocm93ICgpOwoKCgoKCmV4dGVybiBpbnQgcHRocmVhZF9yd2xvY2thdHRyX2luaXQg KHB0aHJlYWRfcndsb2NrYXR0cl90ICpfX2F0dHIpIHRocm93ICgpOwoKCmV4dGVybiBpbnQgcHRo cmVhZF9yd2xvY2thdHRyX2Rlc3Ryb3kgKHB0aHJlYWRfcndsb2NrYXR0cl90ICpfX2F0dHIpIHRo cm93ICgpOwoKCmV4dGVybiBpbnQgcHRocmVhZF9yd2xvY2thdHRyX2dldHBzaGFyZWQgKF9fY29u c3QgcHRocmVhZF9yd2xvY2thdHRyX3QgKl9fYXR0ciwgaW50ICpfX3BzaGFyZWQpIHRocm93ICgp OwoKCgoKZXh0ZXJuIGludCBwdGhyZWFkX3J3bG9ja2F0dHJfc2V0cHNoYXJlZCAocHRocmVhZF9y d2xvY2thdHRyX3QgKl9fYXR0ciwgaW50IF9fcHNoYXJlZCkgdGhyb3cgKCk7CgoKCmV4dGVybiBp bnQgcHRocmVhZF9yd2xvY2thdHRyX2dldGtpbmRfbnAgKF9fY29uc3QgcHRocmVhZF9yd2xvY2th dHRyX3QgKl9fYXR0ciwgaW50ICpfX3ByZWYpIHRocm93ICgpOwoKCgoKZXh0ZXJuIGludCBwdGhy ZWFkX3J3bG9ja2F0dHJfc2V0a2luZF9ucCAocHRocmVhZF9yd2xvY2thdHRyX3QgKl9fYXR0ciwg aW50IF9fcHJlZikgdGhyb3cgKCk7CiMgNDIwICIvdXNyL2luY2x1ZGUvcHRocmVhZC5oIiAzCmV4 dGVybiBpbnQgX19wdGhyZWFkX2tleV9jcmVhdGUgKHB0aHJlYWRfa2V5X3QgKl9fa2V5LCB2b2lk ICgqX19kZXN0cl9mdW5jdGlvbikgKHZvaWQgKikpIHRocm93ICgpOwoKZXh0ZXJuIGludCBwdGhy ZWFkX2tleV9jcmVhdGUgKHB0aHJlYWRfa2V5X3QgKl9fa2V5LCB2b2lkICgqX19kZXN0cl9mdW5j dGlvbikgKHZvaWQgKikpIHRocm93ICgpOwoKCgpleHRlcm4gaW50IHB0aHJlYWRfa2V5X2RlbGV0 ZSAocHRocmVhZF9rZXlfdCBfX2tleSkgdGhyb3cgKCk7CgoKZXh0ZXJuIGludCBfX3B0aHJlYWRf c2V0c3BlY2lmaWMgKHB0aHJlYWRfa2V5X3QgX19rZXksIF9fY29uc3Qgdm9pZCAqX19wb2ludGVy KSB0aHJvdyAoKTsKCmV4dGVybiBpbnQgcHRocmVhZF9zZXRzcGVjaWZpYyAocHRocmVhZF9rZXlf dCBfX2tleSwgX19jb25zdCB2b2lkICpfX3BvaW50ZXIpIHRocm93ICgpOwoKCgpleHRlcm4gdm9p ZCAqX19wdGhyZWFkX2dldHNwZWNpZmljIChwdGhyZWFkX2tleV90IF9fa2V5KSB0aHJvdyAoKTsK ZXh0ZXJuIHZvaWQgKnB0aHJlYWRfZ2V0c3BlY2lmaWMgKHB0aHJlYWRfa2V5X3QgX19rZXkpIHRo cm93ICgpOwojIDQ0NSAiL3Vzci9pbmNsdWRlL3B0aHJlYWQuaCIgMwpleHRlcm4gaW50IF9fcHRo cmVhZF9vbmNlIChwdGhyZWFkX29uY2VfdCAqX19vbmNlX2NvbnRyb2wsIHZvaWQgKCpfX2luaXRf cm91dGluZSkgKHZvaWQpKSB0aHJvdyAoKTsKCmV4dGVybiBpbnQgcHRocmVhZF9vbmNlIChwdGhy ZWFkX29uY2VfdCAqX19vbmNlX2NvbnRyb2wsIHZvaWQgKCpfX2luaXRfcm91dGluZSkgKHZvaWQp KSB0aHJvdyAoKTsKCgoKCgoKCmV4dGVybiBpbnQgcHRocmVhZF9zZXRjYW5jZWxzdGF0ZSAoaW50 IF9fc3RhdGUsIGludCAqX19vbGRzdGF0ZSkgdGhyb3cgKCk7CgoKCmV4dGVybiBpbnQgcHRocmVh ZF9zZXRjYW5jZWx0eXBlIChpbnQgX190eXBlLCBpbnQgKl9fb2xkdHlwZSkgdGhyb3cgKCk7CgoK ZXh0ZXJuIGludCBwdGhyZWFkX2NhbmNlbCAocHRocmVhZF90IF9fdGhyZWFkKSB0aHJvdyAoKTsK CgoKCmV4dGVybiB2b2lkIHB0aHJlYWRfdGVzdGNhbmNlbCAodm9pZCkgdGhyb3cgKCk7CiMgNDgx ICIvdXNyL2luY2x1ZGUvcHRocmVhZC5oIiAzCmV4dGVybiB2b2lkIF9wdGhyZWFkX2NsZWFudXBf cHVzaCAoc3RydWN0IF9wdGhyZWFkX2NsZWFudXBfYnVmZmVyICpfX2J1ZmZlciwgdm9pZCAoKl9f cm91dGluZSkgKHZvaWQgKiksIHZvaWQgKl9fYXJnKSB0aHJvdyAoKTsKIyA0OTEgIi91c3IvaW5j bHVkZS9wdGhyZWFkLmgiIDMKZXh0ZXJuIHZvaWQgX3B0aHJlYWRfY2xlYW51cF9wb3AgKHN0cnVj dCBfcHRocmVhZF9jbGVhbnVwX2J1ZmZlciAqX19idWZmZXIsIGludCBfX2V4ZWN1dGUpIHRocm93 ICgpOwojIDUwMiAiL3Vzci9pbmNsdWRlL3B0aHJlYWQuaCIgMwpleHRlcm4gdm9pZCBfcHRocmVh ZF9jbGVhbnVwX3B1c2hfZGVmZXIgKHN0cnVjdCBfcHRocmVhZF9jbGVhbnVwX2J1ZmZlciAqX19i dWZmZXIsIHZvaWQgKCpfX3JvdXRpbmUpICh2b2lkICopLCB2b2lkICpfX2FyZykgdGhyb3cgKCk7 CiMgNTEzICIvdXNyL2luY2x1ZGUvcHRocmVhZC5oIiAzCmV4dGVybiB2b2lkIF9wdGhyZWFkX2Ns ZWFudXBfcG9wX3Jlc3RvcmUgKHN0cnVjdCBfcHRocmVhZF9jbGVhbnVwX2J1ZmZlciAqX19idWZm ZXIsIGludCBfX2V4ZWN1dGUpIHRocm93ICgpOwoKCgoKIyAxICIvdXNyL2luY2x1ZGUvYml0cy9z aWd0aHJlYWQuaCIgMSAzCiMgMzEgIi91c3IvaW5jbHVkZS9iaXRzL3NpZ3RocmVhZC5oIiAzCmV4 dGVybiBpbnQgcHRocmVhZF9zaWdtYXNrIChpbnQgX19ob3csIF9fY29uc3QgX19zaWdzZXRfdCAq X19uZXdtYXNrLCBfX3NpZ3NldF90ICpfX29sZG1hc2spIHRocm93ICgpOwoKCgpleHRlcm4gaW50 IHB0aHJlYWRfa2lsbCAocHRocmVhZF90IF9fdGhyZWFkLCBpbnQgX19zaWdubykgdGhyb3cgKCk7 CiMgNTE5ICIvdXNyL2luY2x1ZGUvcHRocmVhZC5oIiAyIDMKIyA1MzQgIi91c3IvaW5jbHVkZS9w dGhyZWFkLmgiIDMKZXh0ZXJuIGludCBfX3B0aHJlYWRfYXRmb3JrICh2b2lkICgqX19wcmVwYXJl KSAodm9pZCksIHZvaWQgKCpfX3BhcmVudCkgKHZvaWQpLCB2b2lkICgqX19jaGlsZCkgKHZvaWQp KSB0aHJvdyAoKTsKCgpleHRlcm4gaW50IHB0aHJlYWRfYXRmb3JrICh2b2lkICgqX19wcmVwYXJl KSAodm9pZCksIHZvaWQgKCpfX3BhcmVudCkgKHZvaWQpLCB2b2lkICgqX19jaGlsZCkgKHZvaWQp KSB0aHJvdyAoKTsKCgoKCgoKZXh0ZXJuIHZvaWQgcHRocmVhZF9raWxsX290aGVyX3RocmVhZHNf bnAgKHZvaWQpIHRocm93ICgpOwoKCgpleHRlcm4gdm9pZCBfX3B0aHJlYWRfaW5pdGlhbGl6ZSAo dm9pZCkgdGhyb3cgKCk7Cgp9CiMgMjEgImluY2x1ZGUvamF2YS10aHJlYWRzLmgiIDIKCgoKCgoK dHlwZWRlZiBzdHJ1Y3QgX0p2X1RocmVhZF90CnsKCiAgaW50IGZsYWdzOwoKCiAgcHRocmVhZF90 IHRocmVhZDsKCgogIGphdmE6Omxhbmc6OlRocmVhZCAqdGhyZWFkX29iajsKCgoKICBwdGhyZWFk X2NvbmRfdCB3YWl0X2NvbmQ7CiAgcHRocmVhZF9tdXRleF90IHdhaXRfbXV0ZXg7CgoKICBfSnZf VGhyZWFkX3QgKm5leHQ7Cgp9IF9Kdl9UaHJlYWRfdDsKCnR5cGVkZWYgdm9pZCBfSnZfVGhyZWFk U3RhcnRGdW5jIChqYXZhOjpsYW5nOjpUaHJlYWQgKik7CgoKCnR5cGVkZWYgc3RydWN0CnsKCiAg X0p2X1RocmVhZF90ICpmaXJzdDsKCn0gX0p2X0NvbmRpdGlvblZhcmlhYmxlX3Q7Cgp0eXBlZGVm IHN0cnVjdAp7CgoKCgogIHB0aHJlYWRfbXV0ZXhfdCBtdXRleDsKCgogIHB0aHJlYWRfdCBvd25l cjsKCgogIGludCBjb3VudDsKfSBfSnZfTXV0ZXhfdDsKCgoKCgoKaW5saW5lIGludApfSnZfUHRo cmVhZENoZWNrTW9uaXRvciAoX0p2X011dGV4X3QgKm11KQp7CiAgcHRocmVhZF90IHNlbGYgPSBw dGhyZWFkX3NlbGYoKTsKICBpZiAobXUtPm93bmVyID09IHNlbGYpCiAgICByZXR1cm4gMDsKICBl bHNlIHJldHVybiAxOwp9CgoKCgoKaW50IF9Kdl9Db25kV2FpdCAoX0p2X0NvbmRpdGlvblZhcmlh YmxlX3QgKmN2LCBfSnZfTXV0ZXhfdCAqbXUsCiAgICAgICAgICAgICAgICAgIGpsb25nIG1pbGxp cywgamludCBuYW5vcyk7CgppbnQgX0p2X0NvbmROb3RpZnkgKF9Kdl9Db25kaXRpb25WYXJpYWJs ZV90ICpjdiwgX0p2X011dGV4X3QgKm11KTsKCmludCBfSnZfQ29uZE5vdGlmeUFsbCAoX0p2X0Nv bmRpdGlvblZhcmlhYmxlX3QgKmN2LCBfSnZfTXV0ZXhfdCAqbXUpOwoKaW5saW5lIHZvaWQKX0p2 X0NvbmRJbml0IChfSnZfQ29uZGl0aW9uVmFyaWFibGVfdCAqY3YpCnsKICBjdi0+Zmlyc3QgPSAw Owp9CiMgMTEzICJpbmNsdWRlL2phdmEtdGhyZWFkcy5oIgppbmxpbmUgdm9pZApfSnZfTXV0ZXhJ bml0IChfSnZfTXV0ZXhfdCAqbXUpCnsKCgoKCgoKICBwdGhyZWFkX211dGV4X2luaXQgKCZtdS0+ bXV0ZXgsIDApOwoKCiAgbXUtPmNvdW50ID0gMDsKICBtdS0+b3duZXIgPSAwOwp9CgppbmxpbmUg aW50Cl9Kdl9NdXRleExvY2sgKF9Kdl9NdXRleF90ICptdSkKewogIHB0aHJlYWRfdCBzZWxmID0g cHRocmVhZF9zZWxmICgpOwogIGlmIChtdS0+b3duZXIgPT0gc2VsZikKICAgIHsKICAgICAgbXUt PmNvdW50Kys7CiAgICB9CiAgZWxzZQogICAgewojIDE0NyAiaW5jbHVkZS9qYXZhLXRocmVhZHMu aCIKICAgICAgICBwdGhyZWFkX211dGV4X2xvY2sgKCZtdS0+bXV0ZXgpOwoKICAgICAgbXUtPmNv dW50ID0gMTsKICAgICAgbXUtPm93bmVyID0gc2VsZjsKICAgIH0KICByZXR1cm4gMDsKfQoKaW5s aW5lIGludApfSnZfTXV0ZXhVbmxvY2sgKF9Kdl9NdXRleF90ICptdSkKewogIGlmIChfSnZfUHRo cmVhZENoZWNrTW9uaXRvciAobXUpKQogICAgewoKCgoKICAgICAgcmV0dXJuIDE7CiAgICB9Cgog IG11LT5jb3VudC0tOwoKICBpZiAobXUtPmNvdW50ID09IDApCiAgICB7CiAgICAgIG11LT5vd25l ciA9IDA7CiMgMTgwICJpbmNsdWRlL2phdmEtdGhyZWFkcy5oIgogICAgICAgIHB0aHJlYWRfbXV0 ZXhfdW5sb2NrICgmbXUtPm11dGV4KTsKCiAgICB9CiAgcmV0dXJuIDA7Cn0KIyAyMDUgImluY2x1 ZGUvamF2YS10aHJlYWRzLmgiCnZvaWQgX0p2X0luaXRUaHJlYWRzICh2b2lkKTsKCl9Kdl9UaHJl YWRfdCAqX0p2X1RocmVhZEluaXREYXRhIChqYXZhOjpsYW5nOjpUaHJlYWQgKnRocmVhZCk7CnZv aWQgX0p2X1RocmVhZERlc3Ryb3lEYXRhIChfSnZfVGhyZWFkX3QgKmRhdGEpOwoKaW5saW5lIGph dmE6Omxhbmc6OlRocmVhZCAqCl9Kdl9UaHJlYWRDdXJyZW50ICh2b2lkKQp7CiAgZXh0ZXJuIHB0 aHJlYWRfa2V5X3QgX0p2X1RocmVhZEtleTsKICByZXR1cm4gKGphdmE6Omxhbmc6OlRocmVhZCAq KSBwdGhyZWFkX2dldHNwZWNpZmljIChfSnZfVGhyZWFkS2V5KTsKfQojIDI3MyAiaW5jbHVkZS9q YXZhLXRocmVhZHMuaCIKdHlwZWRlZiBwdGhyZWFkX3QgX0p2X1RocmVhZElkX3Q7CiMgMzA0ICJp bmNsdWRlL2phdmEtdGhyZWFkcy5oIgpleHRlcm4gdm9sYXRpbGUKc3RydWN0IHNlbGZfY2FjaGVf ZW50cnkgewogIHNpemVfdCBoaWdoX3NwX2JpdHM7CiAgcHRocmVhZF90IHNlbGY7Cn0gX0p2X3Nl bGZfY2FjaGVbXTsKCnZvaWQgX0p2X1NlbGZfQ2FjaGVfSW5pdCgpOwoKX0p2X1RocmVhZElkX3QK X0p2X1RocmVhZFNlbGZfb3V0X29mX2xpbmUodm9sYXRpbGUgc2VsZl9jYWNoZV9lbnRyeSAqc2Nl LAogICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QgaGlnaF9zcF9iaXRzKTsKCmlubGlu ZSBfSnZfVGhyZWFkSWRfdApfSnZfVGhyZWFkU2VsZiAodm9pZCkKewogIGludCBkdW1teTsKICBz aXplX3Qgc3AgPSAoc2l6ZV90KSgmZHVtbXkpOwogIHVuc2lnbmVkIGggPSAoKCh1bnNpZ25lZCBs b25nKShzcCkgPj4gMTkpICYgKDEwMjQgLTEpKTsKICB2b2xhdGlsZSBzZWxmX2NhY2hlX2VudHJ5 ICpzY2UgPSBfSnZfc2VsZl9jYWNoZSArIGg7CiAgcHRocmVhZF90IGNhbmRpZGF0ZV9zZWxmID0g c2NlIC0+IHNlbGY7CgogIGlmIChzY2UgLT4gaGlnaF9zcF9iaXRzID09IHNwID4+IDEyKQogICAg ewoKCgoKICAgICAgcmV0dXJuIGNhbmRpZGF0ZV9zZWxmOwogICAgfQogIGVsc2UKICAgIHJldHVy biBfSnZfVGhyZWFkU2VsZl9vdXRfb2ZfbGluZShzY2UsIHNwID4+IDEyKTsKfQojIDM1NSAiaW5j bHVkZS9qYXZhLXRocmVhZHMuaCIKaW5saW5lIF9Kdl9UaHJlYWRfdCAqCl9Kdl9UaHJlYWRDdXJy ZW50RGF0YSAodm9pZCkKewogIGV4dGVybiBwdGhyZWFkX2tleV90IF9Kdl9UaHJlYWREYXRhS2V5 OwogIHJldHVybiAoX0p2X1RocmVhZF90ICopIHB0aHJlYWRfZ2V0c3BlY2lmaWMgKF9Kdl9UaHJl YWREYXRhS2V5KTsKfQoKaW5saW5lIHZvaWQKX0p2X1RocmVhZFlpZWxkICh2b2lkKQp7CgogIHNj aGVkX3lpZWxkICgpOwoKfQoKdm9pZCBfSnZfVGhyZWFkUmVnaXN0ZXIgKF9Kdl9UaHJlYWRfdCAq ZGF0YSk7CnZvaWQgX0p2X1RocmVhZFVuUmVnaXN0ZXIgKCk7Cgp2b2lkIF9Kdl9UaHJlYWRTZXRQ cmlvcml0eSAoX0p2X1RocmVhZF90ICpkYXRhLCBqaW50IHByaW8pOwoKdm9pZCBfSnZfVGhyZWFk U3RhcnQgKGphdmE6Omxhbmc6OlRocmVhZCAqdGhyZWFkLCBfSnZfVGhyZWFkX3QgKmRhdGEsCiAg ICAgICAgICAgICAgICAgICAgICBfSnZfVGhyZWFkU3RhcnRGdW5jICptZXRoKTsKCnZvaWQgX0p2 X1RocmVhZFdhaXQgKHZvaWQpOwoKdm9pZCBfSnZfVGhyZWFkSW50ZXJydXB0IChfSnZfVGhyZWFk X3QgKmRhdGEpOwojIDI0ICIuLi8uLi8uLi9nY2MvbGliamF2YS9pbmNsdWRlL2p2bS5oIiAyCgoj IDEgImluY2x1ZGUvamF2YS1nYy5oIiAxCiMgMTggImluY2x1ZGUvamF2YS1nYy5oIgpleHRlcm4g IkMiCnsKICB2b2lkICpfSnZfTWFya09iaiAodm9pZCAqLCB2b2lkICosIHZvaWQgKiwgdm9pZCAq KTsKICB2b2lkICpfSnZfTWFya0FycmF5ICh2b2lkICosIHZvaWQgKiwgdm9pZCAqLCB2b2lkICop Owp9OwoKCgojIDEgIi4uLy4uLy4uL2djYy9saWJqYXZhL2phdmEvbGFuZy9DbGFzcy5oIiAxCiMg MTUgIi4uLy4uLy4uL2djYy9saWJqYXZhL2phdmEvbGFuZy9DbGFzcy5oIgojcHJhZ21hIGludGVy ZmFjZQoKIyAxICIuLi8uLi8uLi9nY2MvbGliamF2YS9qYXZhL2xhbmcvT2JqZWN0LmgiIDEKIyAx NCAiLi4vLi4vLi4vZ2NjL2xpYmphdmEvamF2YS9sYW5nL09iamVjdC5oIgojcHJhZ21hIGludGVy ZmFjZQoKCgoKCnN0cnVjdCBfSnZPYmplY3RQcmVmaXgKewpwcm90ZWN0ZWQ6CgogIHZpcnR1YWwg dm9pZCBuYWNkXzEgKHZvaWQpIHt9OwoKCiAgICB2aXJ0dWFsIHZvaWQgbmFjZF8yICh2b2lkKSB7 fTsKCn07CgpjbGFzcyBqYXZhOjpsYW5nOjpPYmplY3QgOiBwdWJsaWMgX0p2T2JqZWN0UHJlZml4 CnsKcHJvdGVjdGVkOgogIHZpcnR1YWwgdm9pZCBmaW5hbGl6ZSAodm9pZCk7CnB1YmxpYzoKCiAg amNsYXNzIGdldENsYXNzICh2b2lkKTsKICB2aXJ0dWFsIGppbnQgaGFzaENvZGUgKHZvaWQpOwog IHZvaWQgbm90aWZ5ICh2b2lkKTsKICB2b2lkIG5vdGlmeUFsbCAodm9pZCk7CiAgdm9pZCB3YWl0 IChqbG9uZyB0aW1lb3V0LCBqaW50IG5hbm9zKTsKICB2aXJ0dWFsIGpib29sZWFuIGVxdWFscyAo am9iamVjdCBvYmopOwogIE9iamVjdCAodm9pZCk7CiAgdmlydHVhbCBqc3RyaW5nIHRvU3RyaW5n ICh2b2lkKTsKICB2b2lkIHdhaXQgKHZvaWQpOwogIHZvaWQgd2FpdCAoamxvbmcgdGltZW91dCk7 CgogIGZyaWVuZCB2b2lkIF9Kdl9Nb25pdG9yRW50ZXIgKGpvYmplY3Qgb2JqKTsKICBmcmllbmQg dm9pZCBfSnZfTW9uaXRvckV4aXQgKGpvYmplY3Qgb2JqKTsKICBmcmllbmQgdm9pZCBfSnZfSW5p dGlhbGl6ZVN5bmNNdXRleCAodm9pZCk7CiAgZnJpZW5kIHZvaWQgX0p2X0ZpbmFsaXplT2JqZWN0 IChqb2JqZWN0IG9iaik7CgoKICBmcmllbmQgdm9pZCAqX0p2X01hcmtPYmogKHZvaWQgKiwgdm9p ZCAqLCB2b2lkICosIHZvaWQgKik7CgoKICBmcmllbmQgdm9pZCAqX0p2X01hcmtBcnJheSAodm9p ZCAqLCB2b2lkICosIHZvaWQgKiwgdm9pZCAqKTsKCgogIHN0YXRpYyBqYXZhOjpsYW5nOjpDbGFz cyBjbGFzcyQ7Cgpwcm90ZWN0ZWQ6CiAgdmlydHVhbCBqb2JqZWN0IGNsb25lICh2b2lkKTsKCnBy aXZhdGU6CiMgNzQgIi4uLy4uLy4uL2djYy9saWJqYXZhL2phdmEvbGFuZy9PYmplY3QuaCIKICAg IHZvaWQgc3luY19pbml0ICh2b2lkKTsKfTsKIyAxOCAiLi4vLi4vLi4vZ2NjL2xpYmphdmEvamF2 YS9sYW5nL0NsYXNzLmgiIDIKIyAxICJqYXZhL2xhbmcvU3RyaW5nLmgiIDEKCgoKCgojcHJhZ21h IGludGVyZmFjZQoKCiMgMSAiLi4vLi4vLi4vZ2NjL2xpYmphdmEvZ2NqL2FycmF5LmgiIDEKIyAx NiAiLi4vLi4vLi4vZ2NjL2xpYmphdmEvZ2NqL2FycmF5LmgiCmV4dGVybiAiSmF2YSIgewoKY2xh c3MgX19KQXJyYXkgOiBwdWJsaWMgamF2YTo6bGFuZzo6T2JqZWN0CnsKcHJvdGVjdGVkOgoKCgog IF9fSkFycmF5ICgpIDogbGVuZ3RoICgwKQogIHsKICB9CnB1YmxpYzoKICBjb25zdCBqc2l6ZSBs ZW5ndGg7CiAgZnJpZW5kIGpzaXplIEp2R2V0QXJyYXlMZW5ndGggKF9fSkFycmF5Kik7Cn07Cgp0 ZW1wbGF0ZTxjbGFzcyBUPgpjbGFzcyBKQXJyYXkgOiBwdWJsaWMgX19KQXJyYXkKewogIFQgZGF0 YVswXTsKcHVibGljOgogIGZyaWVuZCBUKiBlbGVtZW50czw+KEpBcnJheTxUPiYgeCk7CiAgZnJp ZW5kIFQqIGVsZW1lbnRzPD4oSkFycmF5PFQ+KiB4KTsKCgp9OwoKdGVtcGxhdGU8Y2xhc3MgVD4K aW5saW5lIFQqIGVsZW1lbnRzKEpBcnJheTxUPiYgeCkgeyByZXR1cm4geC5kYXRhOyB9CnRlbXBs YXRlPGNsYXNzIFQ+CmlubGluZSBUKiBlbGVtZW50cyhKQXJyYXk8VD4qIHgpIHsgcmV0dXJuIHgt PmRhdGE7IH0KCn07CgoKdHlwZWRlZiBfX0pBcnJheSAqamFycmF5Owp0eXBlZGVmIEpBcnJheTxq b2JqZWN0PiAqam9iamVjdEFycmF5Owp0eXBlZGVmIEpBcnJheTxqYm9vbGVhbj4gKmpib29sZWFu QXJyYXk7CnR5cGVkZWYgSkFycmF5PGpieXRlPiAqamJ5dGVBcnJheTsKdHlwZWRlZiBKQXJyYXk8 amNoYXI+ICpqY2hhckFycmF5Owp0eXBlZGVmIEpBcnJheTxqc2hvcnQ+ICpqc2hvcnRBcnJheTsK dHlwZWRlZiBKQXJyYXk8amludD4gKmppbnRBcnJheTsKdHlwZWRlZiBKQXJyYXk8amxvbmc+ICpq bG9uZ0FycmF5Owp0eXBlZGVmIEpBcnJheTxqZmxvYXQ+ICpqZmxvYXRBcnJheTsKdHlwZWRlZiBK QXJyYXk8amRvdWJsZT4gKmpkb3VibGVBcnJheTsKdHlwZWRlZiBKQXJyYXk8anN0cmluZz4gKmpz dHJpbmdBcnJheTsKCmV4dGVybiBqYXZhOjpsYW5nOjpDbGFzcyBfSnZfYnl0ZUNsYXNzLCBfSnZf c2hvcnRDbGFzcywgX0p2X2ludENsYXNzLAogIF9Kdl9sb25nQ2xhc3MsIF9Kdl9ib29sZWFuQ2xh c3MsIF9Kdl9jaGFyQ2xhc3MsIF9Kdl9mbG9hdENsYXNzLAogIF9Kdl9kb3VibGVDbGFzcywgX0p2 X3ZvaWRDbGFzczsKCgpleHRlcm4gIkMiIGpvYmplY3RBcnJheSBfSnZfTmV3T2JqZWN0QXJyYXko anNpemUgbGVuZ3RoLCBqY2xhc3MsIGpvYmplY3QgaW5pdCk7CmV4dGVybiAiQyIgam9iamVjdCBf SnZfTmV3UHJpbUFycmF5IChqY2xhc3MgZWx0eXBlLCBqaW50IGNvdW50KTsKCmV4dGVybiBpbmxp bmUgam9iamVjdEFycmF5Ckp2TmV3T2JqZWN0QXJyYXkgKGpzaXplIGxlbmd0aCwgamNsYXNzIGNs cywgam9iamVjdCBpbml0KQp7CiAgcmV0dXJuIF9Kdl9OZXdPYmplY3RBcnJheSAobGVuZ3RoLCBj bHMsIGluaXQpOwp9CgpleHRlcm4gaW5saW5lIGpjaGFyQXJyYXkKSnZOZXdDaGFyQXJyYXkgKGpp bnQgbGVuZ3RoKQp7CiAgcmV0dXJuIChqY2hhckFycmF5KSBfSnZfTmV3UHJpbUFycmF5ICgoJiBf SnZfY2hhckNsYXNzKSwgbGVuZ3RoKTsKfQoKZXh0ZXJuIGlubGluZSBqYm9vbGVhbkFycmF5Ckp2 TmV3Qm9vbGVhbkFycmF5IChqaW50IGxlbmd0aCkKewogIHJldHVybiAoamJvb2xlYW5BcnJheSkg X0p2X05ld1ByaW1BcnJheSAoKCYgX0p2X2Jvb2xlYW5DbGFzcyksIGxlbmd0aCk7Cn0KCmV4dGVy biBpbmxpbmUgamJ5dGVBcnJheQpKdk5ld0J5dGVBcnJheSAoamludCBsZW5ndGgpCnsKICByZXR1 cm4gKGpieXRlQXJyYXkpIF9Kdl9OZXdQcmltQXJyYXkgKCgmIF9Kdl9ieXRlQ2xhc3MpLCBsZW5n dGgpOwp9CgpleHRlcm4gaW5saW5lIGpzaG9ydEFycmF5Ckp2TmV3U2hvcnRBcnJheSAoamludCBs ZW5ndGgpCnsKICByZXR1cm4gKGpzaG9ydEFycmF5KSBfSnZfTmV3UHJpbUFycmF5ICgoJiBfSnZf c2hvcnRDbGFzcyksIGxlbmd0aCk7Cn0KCmV4dGVybiBpbmxpbmUgamludEFycmF5Ckp2TmV3SW50 QXJyYXkgKGppbnQgbGVuZ3RoKQp7CiAgcmV0dXJuIChqaW50QXJyYXkpIF9Kdl9OZXdQcmltQXJy YXkgKCgmIF9Kdl9pbnRDbGFzcyksIGxlbmd0aCk7Cn0KCmV4dGVybiBpbmxpbmUgamxvbmdBcnJh eQpKdk5ld0xvbmdBcnJheSAoamludCBsZW5ndGgpCnsKICByZXR1cm4gKGpsb25nQXJyYXkpIF9K dl9OZXdQcmltQXJyYXkgKCgmIF9Kdl9sb25nQ2xhc3MpLCBsZW5ndGgpOwp9CgpleHRlcm4gaW5s aW5lIGpmbG9hdEFycmF5Ckp2TmV3RmxvYXRBcnJheSAoamludCBsZW5ndGgpCnsKICByZXR1cm4g KGpmbG9hdEFycmF5KSBfSnZfTmV3UHJpbUFycmF5ICgoJiBfSnZfZmxvYXRDbGFzcyksIGxlbmd0 aCk7Cn0KCmV4dGVybiBpbmxpbmUgamRvdWJsZUFycmF5Ckp2TmV3RG91YmxlQXJyYXkgKGppbnQg bGVuZ3RoKQp7CiAgcmV0dXJuIChqZG91YmxlQXJyYXkpIF9Kdl9OZXdQcmltQXJyYXkgKCgmIF9K dl9kb3VibGVDbGFzcyksIGxlbmd0aCk7Cn0KCgpleHRlcm4gIkMiIGpzdHJpbmdBcnJheSBKdkNv bnZlcnRBcmd2KGludCBhcmdjLCBjb25zdCBjaGFyICoqYXJndik7CgppbmxpbmUganNpemUgSnZH ZXRBcnJheUxlbmd0aCAoamFycmF5IGFycmF5KSB7IHJldHVybiBhcnJheS0+bGVuZ3RoOyB9CiMg MTAgImphdmEvbGFuZy9TdHJpbmcuaCIgMgoKZXh0ZXJuICJKYXZhIgp7CiAgbmFtZXNwYWNlIGdu dQogIHsKICAgIG5hbWVzcGFjZSBnY2oKICAgIHsKICAgICAgbmFtZXNwYWNlIHJ1bnRpbWUKICAg ICAgewogICAgICAgIGNsYXNzIFN0cmluZ0J1ZmZlcjsKICAgICAgfQogICAgfQogIH0KfTsKCmNs YXNzIDo6amF2YTo6bGFuZzo6U3RyaW5nIDogcHVibGljIDo6amF2YTo6bGFuZzo6T2JqZWN0CnsK cHVibGljOgogIFN0cmluZyAoKTsKICBTdHJpbmcgKDo6amF2YTo6bGFuZzo6U3RyaW5nICopOwog IFN0cmluZyAoOjpqYXZhOjpsYW5nOjpTdHJpbmdCdWZmZXIgKik7CnB1YmxpYzoKICBTdHJpbmcg KDo6Z251OjpnY2o6OnJ1bnRpbWU6OlN0cmluZ0J1ZmZlciAqKTsKcHVibGljOgogIFN0cmluZyAo amNoYXJBcnJheSk7CiAgU3RyaW5nIChqY2hhckFycmF5LCBqaW50LCBqaW50KTsKICBTdHJpbmcg KGpieXRlQXJyYXkpOwogIFN0cmluZyAoamJ5dGVBcnJheSwgamludCwgamludCk7CiAgU3RyaW5n IChqYnl0ZUFycmF5LCA6OmphdmE6Omxhbmc6OlN0cmluZyAqKTsKICBTdHJpbmcgKGpieXRlQXJy YXksIGppbnQsIGppbnQsIDo6amF2YTo6bGFuZzo6U3RyaW5nICopOwogIHN0YXRpYyA6OmphdmE6 Omxhbmc6OlN0cmluZyAqY29weVZhbHVlT2YgKGpjaGFyQXJyYXkpOwogIHN0YXRpYyA6OmphdmE6 Omxhbmc6OlN0cmluZyAqY29weVZhbHVlT2YgKGpjaGFyQXJyYXksIGppbnQsIGppbnQpOwogIFN0 cmluZyAoamJ5dGVBcnJheSwgamludCk7CiAgU3RyaW5nIChqYnl0ZUFycmF5LCBqaW50LCBqaW50 LCBqaW50KTsKICA6OmphdmE6Omxhbmc6OlN0cmluZyAqdG9TdHJpbmcgKCkgeyByZXR1cm4gdGhp czsgfQogIGpib29sZWFuIGVxdWFscyAoOjpqYXZhOjpsYW5nOjpPYmplY3QgKik7CiAgamludCBo YXNoQ29kZSAoKTsKICBqaW50IGxlbmd0aCAoKSB7IHJldHVybiBjb3VudDsgfQogIGpjaGFyIGNo YXJBdCAoamludCk7CiAgdm9pZCBnZXRDaGFycyAoamludCwgamludCwgamNoYXJBcnJheSwgamlu dCk7CiAgamJ5dGVBcnJheSBnZXRCeXRlcyAoKTsKICBqYnl0ZUFycmF5IGdldEJ5dGVzICg6Omph dmE6Omxhbmc6OlN0cmluZyAqKTsKICB2b2lkIGdldEJ5dGVzIChqaW50LCBqaW50LCBqYnl0ZUFy cmF5LCBqaW50KTsKICBqY2hhckFycmF5IHRvQ2hhckFycmF5ICgpOwogIGpib29sZWFuIGVxdWFs c0lnbm9yZUNhc2UgKDo6amF2YTo6bGFuZzo6U3RyaW5nICopOwogIGppbnQgY29tcGFyZVRvICg6 OmphdmE6Omxhbmc6OlN0cmluZyAqKTsKICBqaW50IGNvbXBhcmVUbyAoOjpqYXZhOjpsYW5nOjpP YmplY3QgKik7CiAgamludCBjb21wYXJlVG9JZ25vcmVDYXNlICg6OmphdmE6Omxhbmc6OlN0cmlu ZyAqKTsKICBqYm9vbGVhbiByZWdpb25NYXRjaGVzIChqaW50LCA6OmphdmE6Omxhbmc6OlN0cmlu ZyAqLCBqaW50LCBqaW50KTsKICBqYm9vbGVhbiByZWdpb25NYXRjaGVzIChqYm9vbGVhbiwgamlu dCwgOjpqYXZhOjpsYW5nOjpTdHJpbmcgKiwgamludCwgamludCk7CiAgamJvb2xlYW4gc3RhcnRz V2l0aCAoOjpqYXZhOjpsYW5nOjpTdHJpbmcgKik7CiAgamJvb2xlYW4gc3RhcnRzV2l0aCAoOjpq YXZhOjpsYW5nOjpTdHJpbmcgKiwgamludCk7CiAgamJvb2xlYW4gZW5kc1dpdGggKDo6amF2YTo6 bGFuZzo6U3RyaW5nICopOwogIGppbnQgaW5kZXhPZiAoamludCk7CiAgamludCBpbmRleE9mIChq aW50LCBqaW50KTsKICBqaW50IGluZGV4T2YgKDo6amF2YTo6bGFuZzo6U3RyaW5nICopOwogIGpp bnQgaW5kZXhPZiAoOjpqYXZhOjpsYW5nOjpTdHJpbmcgKiwgamludCk7CiAgamludCBsYXN0SW5k ZXhPZiAoamludCk7CiAgamludCBsYXN0SW5kZXhPZiAoamludCwgamludCk7CiAgamludCBsYXN0 SW5kZXhPZiAoOjpqYXZhOjpsYW5nOjpTdHJpbmcgKik7CiAgamludCBsYXN0SW5kZXhPZiAoOjpq YXZhOjpsYW5nOjpTdHJpbmcgKiwgamludCk7CiAgOjpqYXZhOjpsYW5nOjpDaGFyU2VxdWVuY2Ug KnN1YlNlcXVlbmNlIChqaW50LCBqaW50KTsKICA6OmphdmE6Omxhbmc6OlN0cmluZyAqc3Vic3Ry aW5nIChqaW50KTsKICA6OmphdmE6Omxhbmc6OlN0cmluZyAqc3Vic3RyaW5nIChqaW50LCBqaW50 KTsKICA6OmphdmE6Omxhbmc6OlN0cmluZyAqY29uY2F0ICg6OmphdmE6Omxhbmc6OlN0cmluZyAq KTsKICA6OmphdmE6Omxhbmc6OlN0cmluZyAqcmVwbGFjZSAoamNoYXIsIGpjaGFyKTsKICA6Omph dmE6Omxhbmc6OlN0cmluZyAqdG9Mb3dlckNhc2UgKDo6amF2YTo6dXRpbDo6TG9jYWxlICopOwog IDo6amF2YTo6bGFuZzo6U3RyaW5nICp0b1VwcGVyQ2FzZSAoOjpqYXZhOjp1dGlsOjpMb2NhbGUg Kik7CiAgOjpqYXZhOjpsYW5nOjpTdHJpbmcgKnRvTG93ZXJDYXNlICgpOwogIDo6amF2YTo6bGFu Zzo6U3RyaW5nICp0b1VwcGVyQ2FzZSAoKTsKICA6OmphdmE6Omxhbmc6OlN0cmluZyAqdHJpbSAo KTsKICBzdGF0aWMgOjpqYXZhOjpsYW5nOjpTdHJpbmcgKnZhbHVlT2YgKDo6amF2YTo6bGFuZzo6 T2JqZWN0ICopOwogIHN0YXRpYyA6OmphdmE6Omxhbmc6OlN0cmluZyAqdmFsdWVPZiAoamNoYXJB cnJheSk7CiAgc3RhdGljIDo6amF2YTo6bGFuZzo6U3RyaW5nICp2YWx1ZU9mIChqY2hhckFycmF5 LCBqaW50LCBqaW50KTsKICBzdGF0aWMgOjpqYXZhOjpsYW5nOjpTdHJpbmcgKnZhbHVlT2YgKGpi b29sZWFuKTsKICBzdGF0aWMgOjpqYXZhOjpsYW5nOjpTdHJpbmcgKnZhbHVlT2YgKGpjaGFyKTsK ICBzdGF0aWMgOjpqYXZhOjpsYW5nOjpTdHJpbmcgKnZhbHVlT2YgKGppbnQpOwogIHN0YXRpYyA6 OmphdmE6Omxhbmc6OlN0cmluZyAqdmFsdWVPZiAoamxvbmcpOwogIHN0YXRpYyA6OmphdmE6Omxh bmc6OlN0cmluZyAqdmFsdWVPZiAoamZsb2F0KTsKICBzdGF0aWMgOjpqYXZhOjpsYW5nOjpTdHJp bmcgKnZhbHVlT2YgKGpkb3VibGUpOwogIDo6amF2YTo6bGFuZzo6U3RyaW5nICppbnRlcm4gKCk7 CnByaXZhdGU6CiAgdm9pZCBpbml0ICgpOwogIHZvaWQgaW5pdCAoamNoYXJBcnJheSwgamludCwg amludCwgamJvb2xlYW4pOwogIHZvaWQgaW5pdCAoamJ5dGVBcnJheSwgamludCwgamludCwgamlu dCk7CiAgdm9pZCBpbml0IChqYnl0ZUFycmF5LCBqaW50LCBqaW50LCA6OmphdmE6Omxhbmc6OlN0 cmluZyAqKTsKICBzdGF0aWMgdm9pZCByZWhhc2ggKCk7CiAgOjpqYXZhOjpsYW5nOjpPYmplY3Qg KmRhdGE7CiAgamludCBib2Zmc2V0OwogIGppbnQgY291bnQ7CiAgc3RhdGljIGNvbnN0IGpsb25n IHNlcmlhbFZlcnNpb25VSUQgPSAtNjg0OTc5NDQ3MDc1NDY2NzcxMExMOwpwdWJsaWM6CiAgc3Rh dGljIDo6amF2YTo6dXRpbDo6Q29tcGFyYXRvciAqQ0FTRV9JTlNFTlNJVElWRV9PUkRFUjsKICBm cmllbmQgamNoYXIqIF9Kdl9HZXRTdHJpbmdDaGFycyAoanN0cmluZyBzdHIpOwogIGZyaWVuZCBq c3RyaW5nKiBfSnZfU3RyaW5nRmluZFNsb3QgKGpjaGFyKiwgamludCwgamludCk7CiAgZnJpZW5k IGpzdHJpbmcqIF9Kdl9TdHJpbmdHZXRTbG90IChqc3RyaW5nKTsKICBmcmllbmQganN0cmluZyBf SnZfTmV3U3RyaW5nVXRmOENvbnN0IChfSnZfVXRmOENvbnN0KiBzdHIpOwogIGZyaWVuZCBqc3Ry aW5nIF9Kdl9OZXdTdHJpbmdMYXRpbjEgKGNvbnN0IGNoYXIqLCBqc2l6ZSk7CiAgZnJpZW5kIGpz dHJpbmcgX0p2X0FsbG9jU3RyaW5nIChqc2l6ZSk7CgogIHN0YXRpYyA6OmphdmE6Omxhbmc6OkNs YXNzIGNsYXNzJDsKfTsKIyAxOSAiLi4vLi4vLi4vZ2NjL2xpYmphdmEvamF2YS9sYW5nL0NsYXNz LmgiIDIKIyAxICJqYXZhL25ldC9VUkwuaCIgMQoKCgoKCiNwcmFnbWEgaW50ZXJmYWNlCgoKCmV4 dGVybiAiSmF2YSIKewogIG5hbWVzcGFjZSBqYXZhCiAgewogICAgbmFtZXNwYWNlIG5ldAogICAg ewogICAgICBjbGFzcyBVUkxDb25uZWN0aW9uOwogICAgICBjbGFzcyBVUkw7CiAgICAgIGNsYXNz IFVSTFN0cmVhbUhhbmRsZXJGYWN0b3J5OwogICAgICBjbGFzcyBVUkxTdHJlYW1IYW5kbGVyOwog ICAgfQogIH0KfTsKCmNsYXNzIDo6amF2YTo6bmV0OjpVUkwgOiBwdWJsaWMgOjpqYXZhOjpsYW5n OjpPYmplY3QKewpwdWJsaWM6CiAgVVJMICg6OmphdmE6Omxhbmc6OlN0cmluZyAqLCA6OmphdmE6 Omxhbmc6OlN0cmluZyAqLCBqaW50LCA6OmphdmE6Omxhbmc6OlN0cmluZyAqKTsKICBVUkwgKDo6 amF2YTo6bGFuZzo6U3RyaW5nICosIDo6amF2YTo6bGFuZzo6U3RyaW5nICosIDo6amF2YTo6bGFu Zzo6U3RyaW5nICopOwogIFVSTCAoOjpqYXZhOjpsYW5nOjpTdHJpbmcgKiwgOjpqYXZhOjpsYW5n OjpTdHJpbmcgKiwgamludCwgOjpqYXZhOjpsYW5nOjpTdHJpbmcgKiwgOjpqYXZhOjpuZXQ6OlVS TFN0cmVhbUhhbmRsZXIgKik7CiAgVVJMICg6OmphdmE6Omxhbmc6OlN0cmluZyAqKTsKICBVUkwg KDo6amF2YTo6bmV0OjpVUkwgKiwgOjpqYXZhOjpsYW5nOjpTdHJpbmcgKik7CiAgVVJMICg6Omph dmE6Om5ldDo6VVJMICosIDo6amF2YTo6bGFuZzo6U3RyaW5nICosIDo6amF2YTo6bmV0OjpVUkxT dHJlYW1IYW5kbGVyICopOwogIGpib29sZWFuIGVxdWFscyAoOjpqYXZhOjpsYW5nOjpPYmplY3Qg Kik7CiAgOjpqYXZhOjpsYW5nOjpPYmplY3QgKmdldENvbnRlbnQgKCk7CiAgOjpqYXZhOjpsYW5n OjpTdHJpbmcgKmdldEZpbGUgKCkgeyByZXR1cm4gZmlsZTsgfQogIDo6amF2YTo6bGFuZzo6U3Ry aW5nICpnZXRQYXRoICgpOwogIDo6amF2YTo6bGFuZzo6U3RyaW5nICpnZXRIb3N0ICgpIHsgcmV0 dXJuIGhvc3Q7IH0KICBqaW50IGdldFBvcnQgKCkgeyByZXR1cm4gcG9ydDsgfQogIDo6amF2YTo6 bGFuZzo6U3RyaW5nICpnZXRQcm90b2NvbCAoKSB7IHJldHVybiBwcm90b2NvbDsgfQogIDo6amF2 YTo6bGFuZzo6U3RyaW5nICpnZXRSZWYgKCkgeyByZXR1cm4gcmVmOyB9CiAgamludCBoYXNoQ29k ZSAoKTsKICA6OmphdmE6Om5ldDo6VVJMQ29ubmVjdGlvbiAqb3BlbkNvbm5lY3Rpb24gKCk7CiAg OjpqYXZhOjppbzo6SW5wdXRTdHJlYW0gKm9wZW5TdHJlYW0gKCk7CiAgamJvb2xlYW4gc2FtZUZp bGUgKDo6amF2YTo6bmV0OjpVUkwgKik7CnB1YmxpYzoKICB2b2lkIHNldCAoOjpqYXZhOjpsYW5n OjpTdHJpbmcgKiwgOjpqYXZhOjpsYW5nOjpTdHJpbmcgKiwgamludCwgOjpqYXZhOjpsYW5nOjpT dHJpbmcgKiwgOjpqYXZhOjpsYW5nOjpTdHJpbmcgKik7CnB1YmxpYzoKICBzdGF0aWMgdm9pZCBz ZXRVUkxTdHJlYW1IYW5kbGVyRmFjdG9yeSAoOjpqYXZhOjpuZXQ6OlVSTFN0cmVhbUhhbmRsZXJG YWN0b3J5ICopOwogIDo6amF2YTo6bGFuZzo6U3RyaW5nICp0b0V4dGVybmFsRm9ybSAoKTsKICA6 OmphdmE6Omxhbmc6OlN0cmluZyAqdG9TdHJpbmcgKCk7CnByaXZhdGU6CiAgOjpqYXZhOjpuZXQ6 OlVSTFN0cmVhbUhhbmRsZXIgKnNldFVSTFN0cmVhbUhhbmRsZXIgKDo6amF2YTo6bGFuZzo6U3Ry aW5nICopOwogIHZvaWQgcmVhZE9iamVjdCAoOjpqYXZhOjppbzo6T2JqZWN0SW5wdXRTdHJlYW0g Kik7CiAgdm9pZCB3cml0ZU9iamVjdCAoOjpqYXZhOjppbzo6T2JqZWN0T3V0cHV0U3RyZWFtICop OwogIDo6amF2YTo6bGFuZzo6U3RyaW5nICpwcm90b2NvbDsKICA6OmphdmE6Omxhbmc6OlN0cmlu ZyAqaG9zdDsKICBqaW50IHBvcnQ7CiAgOjpqYXZhOjpsYW5nOjpTdHJpbmcgKmZpbGU7CiAgOjpq YXZhOjpsYW5nOjpTdHJpbmcgKnJlZjsKICBqaW50IGhhc2hDb2RlX187CiAgOjpqYXZhOjpuZXQ6 OlVSTFN0cmVhbUhhbmRsZXIgKmhhbmRsZXI7CiAgc3RhdGljIDo6amF2YTo6dXRpbDo6SGFzaHRh YmxlICpoYW5kbGVyczsKICBzdGF0aWMgOjpqYXZhOjpuZXQ6OlVSTFN0cmVhbUhhbmRsZXJGYWN0 b3J5ICpmYWN0b3J5OwogIHN0YXRpYyBjb25zdCBqbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gLTc2 Mjc2Mjk2ODgzNjE1MjQxMTBMTDsKcHVibGljOgoKICBzdGF0aWMgOjpqYXZhOjpsYW5nOjpDbGFz cyBjbGFzcyQ7Cn07CiMgMjAgIi4uLy4uLy4uL2djYy9saWJqYXZhL2phdmEvbGFuZy9DbGFzcy5o IiAyCiMgMSAiamF2YS9sYW5nL3JlZmxlY3QvTW9kaWZpZXIuaCIgMQoKCgoKCiNwcmFnbWEgaW50 ZXJmYWNlCgoKCmNsYXNzIDo6amF2YTo6bGFuZzo6cmVmbGVjdDo6TW9kaWZpZXIgOiBwdWJsaWMg OjpqYXZhOjpsYW5nOjpPYmplY3QKewpwdWJsaWM6CiAgTW9kaWZpZXIgKCk7CiAgc3RhdGljIGpi b29sZWFuIGlzQWJzdHJhY3QgKGppbnQpOwogIHN0YXRpYyBqYm9vbGVhbiBpc0ZpbmFsIChqaW50 KTsKICBzdGF0aWMgamJvb2xlYW4gaXNJbnRlcmZhY2UgKGppbnQpOwogIHN0YXRpYyBqYm9vbGVh biBpc05hdGl2ZSAoamludCk7CiAgc3RhdGljIGpib29sZWFuIGlzUHJpdmF0ZSAoamludCk7CiAg c3RhdGljIGpib29sZWFuIGlzUHJvdGVjdGVkIChqaW50KTsKICBzdGF0aWMgamJvb2xlYW4gaXNQ dWJsaWMgKGppbnQpOwogIHN0YXRpYyBqYm9vbGVhbiBpc1N0YXRpYyAoamludCk7CiAgc3RhdGlj IGpib29sZWFuIGlzU3RyaWN0IChqaW50KTsKICBzdGF0aWMgamJvb2xlYW4gaXNTeW5jaHJvbml6 ZWQgKGppbnQpOwogIHN0YXRpYyBqYm9vbGVhbiBpc1RyYW5zaWVudCAoamludCk7CiAgc3RhdGlj IGpib29sZWFuIGlzVm9sYXRpbGUgKGppbnQpOwogIHN0YXRpYyA6OmphdmE6Omxhbmc6OlN0cmlu ZyAqdG9TdHJpbmcgKGppbnQpOwpwdWJsaWM6CiAgc3RhdGljIDo6amF2YTo6bGFuZzo6U3RyaW5n QnVmZmVyICp0b1N0cmluZyAoamludCwgOjpqYXZhOjpsYW5nOjpTdHJpbmdCdWZmZXIgKik7CnB1 YmxpYzoKICBzdGF0aWMgY29uc3QgamludCBQVUJMSUMgPSAxTDsKICBzdGF0aWMgY29uc3Qgamlu dCBQUklWQVRFID0gMkw7CiAgc3RhdGljIGNvbnN0IGppbnQgUFJPVEVDVEVEID0gNEw7CiAgc3Rh dGljIGNvbnN0IGppbnQgU1RBVElDID0gOEw7CiAgc3RhdGljIGNvbnN0IGppbnQgRklOQUwgPSAx Nkw7CiAgc3RhdGljIGNvbnN0IGppbnQgU1lOQ0hST05JWkVEID0gMzJMOwogIHN0YXRpYyBjb25z dCBqaW50IFZPTEFUSUxFID0gNjRMOwogIHN0YXRpYyBjb25zdCBqaW50IFRSQU5TSUVOVCA9IDEy OEw7CiAgc3RhdGljIGNvbnN0IGppbnQgTkFUSVZFID0gMjU2TDsKICBzdGF0aWMgY29uc3Qgamlu dCBJTlRFUkZBQ0UgPSA1MTJMOwogIHN0YXRpYyBjb25zdCBqaW50IEFCU1RSQUNUID0gMTAyNEw7 CiAgc3RhdGljIGNvbnN0IGppbnQgU1RSSUNUID0gMjA0OEw7CnB1YmxpYzoKICBzdGF0aWMgY29u c3QgamludCBTVVBFUiA9IDMyTDsKICBzdGF0aWMgY29uc3QgamludCBBTExfRkxBR1MgPSA0MDk1 TDsKcHVibGljOgoKICBzdGF0aWMgOjpqYXZhOjpsYW5nOjpDbGFzcyBjbGFzcyQ7Cn07CiMgMjEg Ii4uLy4uLy4uL2djYy9saWJqYXZhL2phdmEvbGFuZy9DbGFzcy5oIiAyCiMgMSAiamF2YS9zZWN1 cml0eS9Qcm90ZWN0aW9uRG9tYWluLmgiIDEKCgoKCgojcHJhZ21hIGludGVyZmFjZQoKCgpleHRl cm4gIkphdmEiCnsKICBuYW1lc3BhY2UgamF2YQogIHsKICAgIG5hbWVzcGFjZSBzZWN1cml0eQog ICAgewogICAgICBjbGFzcyBQcm90ZWN0aW9uRG9tYWluOwogICAgICBjbGFzcyBQZXJtaXNzaW9u OwogICAgICBjbGFzcyBQZXJtaXNzaW9uQ29sbGVjdGlvbjsKICAgICAgY2xhc3MgQ29kZVNvdXJj ZTsKICAgIH0KICB9Cn07CgpjbGFzcyA6OmphdmE6OnNlY3VyaXR5OjpQcm90ZWN0aW9uRG9tYWlu IDogcHVibGljIDo6amF2YTo6bGFuZzo6T2JqZWN0CnsKcHVibGljOgogIFByb3RlY3Rpb25Eb21h aW4gKDo6amF2YTo6c2VjdXJpdHk6OkNvZGVTb3VyY2UgKiwgOjpqYXZhOjpzZWN1cml0eTo6UGVy bWlzc2lvbkNvbGxlY3Rpb24gKik7CiAgOjpqYXZhOjpzZWN1cml0eTo6Q29kZVNvdXJjZSAqZ2V0 Q29kZVNvdXJjZSAoKSB7IHJldHVybiBjb2RlX3NvdXJjZTsgfQogIDo6amF2YTo6c2VjdXJpdHk6 OlBlcm1pc3Npb25Db2xsZWN0aW9uICpnZXRQZXJtaXNzaW9ucyAoKSB7IHJldHVybiBwZXJtczsg fQogIHZpcnR1YWwgamJvb2xlYW4gaW1wbGllcyAoOjpqYXZhOjpzZWN1cml0eTo6UGVybWlzc2lv biAqKTsKICB2aXJ0dWFsIDo6amF2YTo6bGFuZzo6U3RyaW5nICp0b1N0cmluZyAoKTsKcHJpdmF0 ZToKICBzdGF0aWMgOjpqYXZhOjpsYW5nOjpTdHJpbmcgKmxpbmVzZXA7CiAgOjpqYXZhOjpzZWN1 cml0eTo6Q29kZVNvdXJjZSAqY29kZV9zb3VyY2U7CiAgOjpqYXZhOjpzZWN1cml0eTo6UGVybWlz c2lvbkNvbGxlY3Rpb24gKnBlcm1zOwpwdWJsaWM6CgogIHN0YXRpYyA6OmphdmE6Omxhbmc6OkNs YXNzIGNsYXNzJDsKfTsKIyAyMiAiLi4vLi4vLi4vZ2NjL2xpYmphdmEvamF2YS9sYW5nL0NsYXNz LmgiIDIKCgpleHRlcm4gIkMiIHZvaWQgX0p2X0luaXRDbGFzcyAoamNsYXNzIGtsYXNzKTsKZXh0 ZXJuICJDIiB2b2lkIF9Kdl9SZWdpc3RlckNsYXNzZXMgKGpjbGFzcyAqY2xhc3Nlcyk7CgoKZXh0 ZXJuICJDIiB2b2lkICpfSnZfTG9va3VwSW50ZXJmYWNlTWV0aG9kSWR4IChqY2xhc3Mga2xhc3Ms IGpjbGFzcyBpZmFjZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICBpbnQgbWV0aF9pZHgpOwoKCgoKZW51bQp7CiAgSlZfU1RBVEVfTk9USElORyA9IDAsCgog IEpWX1NUQVRFX1BSRUxPQURJTkcgPSAxLAogIEpWX1NUQVRFX0xPQURJTkcgPSAzLAogIEpWX1NU QVRFX0xPQURFRCA9IDUsCgogIEpWX1NUQVRFX0NPTVBJTEVEID0gNiwKCiAgSlZfU1RBVEVfUFJF UEFSRUQgPSA3LAogIEpWX1NUQVRFX0xJTktFRCA9IDksCgogIEpWX1NUQVRFX0lOX1BST0dSRVNT ID0gMTAsCiAgSlZfU1RBVEVfRE9ORSA9IDEyLAoKICBKVl9TVEFURV9FUlJPUiA9IDE0Cn07Cgpz dHJ1Y3QgX0p2X0ZpZWxkOwpzdHJ1Y3QgX0p2X1ZUYWJsZTsKdW5pb24gX0p2X3dvcmQ7CnN0cnVj dCBfSnZfQXJyYXlWVGFibGU7CgpzdHJ1Y3QgX0p2X0NvbnN0YW50cwp7CiAgamludCBzaXplOwog IGpieXRlICp0YWdzOwogIF9Kdl93b3JkICpkYXRhOwp9OwoKc3RydWN0IF9Kdl9NZXRob2QKewoK ICBfSnZfVXRmOENvbnN0ICpuYW1lOwoKICBfSnZfVXRmOENvbnN0ICpzaWduYXR1cmU7CgogIF9K dl91c2hvcnQgYWNjZmxhZ3M7CgogIF9Kdl91c2hvcnQgaW5kZXg7CgogIHZvaWQgKm5jb2RlOwoK CiAgX0p2X1V0ZjhDb25zdCAqKnRocm93czsKCiAgX0p2X01ldGhvZCAqZ2V0TmV4dE1ldGhvZCAo KQogIHsgcmV0dXJuIHRoaXMgKyAxOyB9Cn07CgoKdW5pb24gX0p2X0lEaXNwYXRjaFRhYmxlCnsK ICBzdHJ1Y3QKICB7CgogICAganNob3J0IGlpbmRleDsKICAgIGpzaG9ydCBpdGFibGVfbGVuZ3Ro OwoKICAgIHZvaWQgKippdGFibGU7CiAgfSBjbHM7CgogIHN0cnVjdAogIHsKCiAgICBqc2hvcnQg KmlvZmZzZXRzOwogIH0gaWZhY2U7Cn07CgoKc3RydWN0IF9Kdl9pZmFjZXMKewogIGpjbGFzcyAq bGlzdDsKICBqc2hvcnQgbGVuOwogIGpzaG9ydCBjb3VudDsKfTsKCnN0cnVjdCBfSnZfTWV0aG9k U3ltYm9sCnsKICBfSnZfVXRmOENvbnN0ICpjbGFzc19uYW1lOwogIF9Kdl9VdGY4Q29uc3QgKm5h bWU7CiAgX0p2X1V0ZjhDb25zdCAqc2lnbmF0dXJlOwp9OwoKc3RydWN0IF9Kdl9PZmZzZXRUYWJs ZQp7CiAgamludCBzdGF0ZTsKICBqaW50IG9mZnNldHNbXTsKfTsKCgoKCgpjbGFzcyBqYXZhOjps YW5nOjpDbGFzcyA6IHB1YmxpYyBqYXZhOjpsYW5nOjpPYmplY3QKewpwdWJsaWM6CiAgc3RhdGlj IGpjbGFzcyBmb3JOYW1lIChqc3RyaW5nIGNsYXNzTmFtZSwgamJvb2xlYW4gaW5pdGlhbGl6ZSwK ICAgICAgICAgICAgICAgICAgICAgICAgIGphdmE6Omxhbmc6OkNsYXNzTG9hZGVyICpsb2FkZXIp OwogIHN0YXRpYyBqY2xhc3MgZm9yTmFtZSAoanN0cmluZyBjbGFzc05hbWUpOwogIEpBcnJheTxq Y2xhc3M+ICpnZXRDbGFzc2VzICh2b2lkKTsKCiAgamF2YTo6bGFuZzo6Q2xhc3NMb2FkZXIgKmdl dENsYXNzTG9hZGVyICh2b2lkKTsKCiAgamF2YTo6bGFuZzo6cmVmbGVjdDo6Q29uc3RydWN0b3Ig KmdldENvbnN0cnVjdG9yIChKQXJyYXk8amNsYXNzPiAqKTsKICBKQXJyYXk8amF2YTo6bGFuZzo6 cmVmbGVjdDo6Q29uc3RydWN0b3IgKj4gKmdldENvbnN0cnVjdG9ycyAodm9pZCk7CiAgamF2YTo6 bGFuZzo6cmVmbGVjdDo6Q29uc3RydWN0b3IgKmdldERlY2xhcmVkQ29uc3RydWN0b3IgKEpBcnJh eTxqY2xhc3M+ICopOwogIEpBcnJheTxqYXZhOjpsYW5nOjpyZWZsZWN0OjpDb25zdHJ1Y3RvciAq PiAqZ2V0RGVjbGFyZWRDb25zdHJ1Y3RvcnMgKHZvaWQpOwogIGphdmE6Omxhbmc6OnJlZmxlY3Q6 OkZpZWxkICpnZXREZWNsYXJlZEZpZWxkIChqc3RyaW5nKTsKICBKQXJyYXk8amF2YTo6bGFuZzo6 cmVmbGVjdDo6RmllbGQgKj4gKmdldERlY2xhcmVkRmllbGRzICh2b2lkKTsKICBqYXZhOjpsYW5n OjpyZWZsZWN0OjpNZXRob2QgKmdldERlY2xhcmVkTWV0aG9kIChqc3RyaW5nLCBKQXJyYXk8amNs YXNzPiAqKTsKICBKQXJyYXk8amF2YTo6bGFuZzo6cmVmbGVjdDo6TWV0aG9kICo+ICpnZXREZWNs YXJlZE1ldGhvZHMgKHZvaWQpOwoKICBKQXJyYXk8amNsYXNzPiAqZ2V0RGVjbGFyZWRDbGFzc2Vz ICh2b2lkKTsKICBqY2xhc3MgZ2V0RGVjbGFyaW5nQ2xhc3MgKHZvaWQpOwoKICBqYXZhOjpsYW5n OjpyZWZsZWN0OjpGaWVsZCAqZ2V0RmllbGQgKGpzdHJpbmcpOwpwcml2YXRlOgogIGppbnQgX2dl dEZpZWxkcyAoSkFycmF5PGphdmE6Omxhbmc6OnJlZmxlY3Q6OkZpZWxkICo+ICpyZXN1bHQsIGpp bnQgb2Zmc2V0KTsKICBKQXJyYXk8amF2YTo6bGFuZzo6cmVmbGVjdDo6Q29uc3RydWN0b3IgKj4g Kl9nZXRDb25zdHJ1Y3RvcnMgKGpib29sZWFuKTsKICBqYXZhOjpsYW5nOjpyZWZsZWN0OjpGaWVs ZCAqZ2V0RmllbGQgKGpzdHJpbmcsIGppbnQpOwogIGppbnQgX2dldE1ldGhvZHMgKEpBcnJheTxq YXZhOjpsYW5nOjpyZWZsZWN0OjpNZXRob2QgKj4gKnJlc3VsdCwKICAgICAgICAgICAgICAgICAg ICBqaW50IG9mZnNldCk7CiAgamF2YTo6bGFuZzo6cmVmbGVjdDo6RmllbGQgKmdldFByaXZhdGVG aWVsZCAoanN0cmluZyk7CiAgamF2YTo6bGFuZzo6cmVmbGVjdDo6TWV0aG9kICpnZXRQcml2YXRl TWV0aG9kIChqc3RyaW5nLCBKQXJyYXk8amNsYXNzPiAqKTsKICBqYXZhOjpzZWN1cml0eTo6UHJv dGVjdGlvbkRvbWFpbiAqZ2V0UHJvdGVjdGlvbkRvbWFpbjAgKCk7CgpwdWJsaWM6CiAgSkFycmF5 PGphdmE6Omxhbmc6OnJlZmxlY3Q6OkZpZWxkICo+ICpnZXRGaWVsZHMgKHZvaWQpOwoKICBKQXJy YXk8amNsYXNzPiAqZ2V0SW50ZXJmYWNlcyAodm9pZCk7CgogIHZvaWQgZ2V0U2lnbmF0dXJlIChq YXZhOjpsYW5nOjpTdHJpbmdCdWZmZXIgKmJ1ZmZlcik7CiAgc3RhdGljIGpzdHJpbmcgZ2V0U2ln bmF0dXJlIChKQXJyYXk8amNsYXNzPiAqLCBqYm9vbGVhbiBpc19jb25zdHJ1Y3Rvcik7CiAgamF2 YTo6bGFuZzo6cmVmbGVjdDo6TWV0aG9kICpnZXRNZXRob2QgKGpzdHJpbmcsIEpBcnJheTxqY2xh c3M+ICopOwogIEpBcnJheTxqYXZhOjpsYW5nOjpyZWZsZWN0OjpNZXRob2QgKj4gKmdldE1ldGhv ZHMgKHZvaWQpOwoKICBpbmxpbmUgamludCBnZXRNb2RpZmllcnMgKHZvaWQpCiAgICB7CiAgICAg IHJldHVybiBhY2NmbGFnczsKICAgIH0KCiAganN0cmluZyBnZXROYW1lICh2b2lkKTsKCiAgamF2 YTo6bmV0OjpVUkwgKmdldFJlc291cmNlIChqc3RyaW5nIHJlc291cmNlTmFtZSk7CiAgamF2YTo6 aW86OklucHV0U3RyZWFtICpnZXRSZXNvdXJjZUFzU3RyZWFtIChqc3RyaW5nIHJlc291cmNlTmFt ZSk7CiAgSkFycmF5PGpvYmplY3Q+ICpnZXRTaWduZXJzICh2b2lkKTsKCiAgaW5saW5lIGpjbGFz cyBnZXRTdXBlcmNsYXNzICh2b2lkKQogICAgewogICAgICByZXR1cm4gc3VwZXJjbGFzczsKICAg IH0KCiAgaW5saW5lIGpib29sZWFuIGlzQXJyYXkgKHZvaWQpCiAgICB7CiAgICAgIHJldHVybiBu YW1lLT5kYXRhWzBdID09ICdbJzsKICAgIH0KCiAgaW5saW5lIGpjbGFzcyBnZXRDb21wb25lbnRU eXBlICh2b2lkKQogICAgewogICAgICByZXR1cm4gaXNBcnJheSAoKSA/ICgqIChqY2xhc3MgKikg Jm1ldGhvZHMpIDogMDsKICAgIH0KCiAgamJvb2xlYW4gaXNBc3NpZ25hYmxlRnJvbSAoamNsYXNz IGNscyk7CiAgamJvb2xlYW4gaXNJbnN0YW5jZSAoam9iamVjdCBvYmopOwoKICBpbmxpbmUgamJv b2xlYW4gaXNJbnRlcmZhY2UgKHZvaWQpCiAgewogICAgcmV0dXJuIChhY2NmbGFncyAmIGphdmE6 Omxhbmc6OnJlZmxlY3Q6Ok1vZGlmaWVyOjpJTlRFUkZBQ0UpICE9IDA7CiAgfQoKICBpbmxpbmUg amJvb2xlYW4gaXNQcmltaXRpdmUgKHZvaWQpCiAgICB7CiAgICAgIHJldHVybiB2dGFibGUgPT0g KChfSnZfVlRhYmxlICopIC0xKTsKICAgIH0KCiAgam9iamVjdCBuZXdJbnN0YW5jZSAodm9pZCk7 CiAganN0cmluZyB0b1N0cmluZyAodm9pZCk7CgoKICBqaW50IHNpemUgKHZvaWQpCiAgICB7CiAg ICAgIHJldHVybiBzaXplX2luX2J5dGVzOwogICAgfQoKCiAgdm9pZCBmaW5hbGl6ZSAoKTsKCgoK ICBDbGFzcyAoKTsKCiAgc3RhdGljIGphdmE6Omxhbmc6OkNsYXNzIGNsYXNzJDsKCnByaXZhdGU6 CgogIHZvaWQgY2hlY2tNZW1iZXJBY2Nlc3MgKGppbnQgZmxhZ3MpOwoKICB2b2lkIGluaXRpYWxp emVDbGFzcyAodm9pZCk7CgoKICBmcmllbmQgX0p2X01ldGhvZCAqX0p2X0dldE1ldGhvZExvY2Fs IChqY2xhc3Mga2xhc3MsIF9Kdl9VdGY4Q29uc3QgKm5hbWUsCiAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgX0p2X1V0ZjhDb25zdCAqc2lnbmF0dXJlKTsKICBmcmllbmQg amJvb2xlYW4gX0p2X0lzQXNzaWduYWJsZUZyb20oamNsYXNzLCBqY2xhc3MpOwogIGZyaWVuZCBq Ym9vbGVhbiBfSnZfSW50ZXJmYWNlQXNzaWduYWJsZUZyb20gKGpjbGFzcywgamNsYXNzKTsKICBm cmllbmQgdm9pZCAqX0p2X0xvb2t1cEludGVyZmFjZU1ldGhvZElkeCAoamNsYXNzIGtsYXNzLCBq Y2xhc3MgaWZhY2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg IGludCBtZXRob2RfaWR4KTsKCiAgaW5saW5lIGZyaWVuZCB2b2lkCiAgX0p2X0luaXRDbGFzcyAo amNsYXNzIGtsYXNzKQogIHsKICAgIGlmIChfX2J1aWx0aW5fZXhwZWN0IChrbGFzcy0+c3RhdGUg PT0gSlZfU1RBVEVfRE9ORSwgdHJ1ZSkpCiAgICAgIHJldHVybjsKICAgIGtsYXNzLT5pbml0aWFs aXplQ2xhc3MgKCk7CiAgfQoKICBmcmllbmQgX0p2X01ldGhvZCogX0p2X0xvb2t1cERlY2xhcmVk TWV0aG9kIChqY2xhc3MsIF9Kdl9VdGY4Q29uc3QgKiwKICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICBfSnZfVXRmOENvbnN0Kik7CiAgZnJpZW5kIGpmaWVsZElE IEp2R2V0Rmlyc3RJbnN0YW5jZUZpZWxkIChqY2xhc3MpOwogIGZyaWVuZCBqaW50IEp2TnVtSW5z dGFuY2VGaWVsZHMgKGpjbGFzcyk7CiAgZnJpZW5kIGpmaWVsZElEIEp2R2V0Rmlyc3RTdGF0aWNG aWVsZCAoamNsYXNzKTsKICBmcmllbmQgamludCBKdk51bVN0YXRpY0ZpZWxkcyAoamNsYXNzKTsK CiAgZnJpZW5kIGpvYmplY3QgX0p2X0FsbG9jT2JqZWN0IChqY2xhc3MsIGppbnQpOwogIGZyaWVu ZCB2b2lkICpfSnZfQWxsb2NPYmogKGppbnQsIGpjbGFzcyk7CiAgZnJpZW5kIHZvaWQgKl9Kdl9B bGxvY1B0ckZyZWVPYmogKGppbnQsIGpjbGFzcyk7CiAgZnJpZW5kIHZvaWQgKl9Kdl9BbGxvY0Fy cmF5IChqaW50LCBqY2xhc3MpOwoKICBmcmllbmQgam9iamVjdCBfSnZfSk5JX1RvUmVmbGVjdGVk RmllbGQgKF9Kdl9KTklFbnYgKiwgamNsYXNzLCBqZmllbGRJRCwKICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgIGpib29sZWFuKTsKICBmcmllbmQgam9iamVjdCBfSnZf Sk5JX1RvUmVmbGVjdGVkTWV0aG9kIChfSnZfSk5JRW52ICosIGpjbGFzcywgam1ldGhvZElELAog ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGpib29sZWFuKTsKICBm cmllbmQgamZpZWxkSUQgX0p2X0Zyb21SZWZsZWN0ZWRGaWVsZCAoamF2YTo6bGFuZzo6cmVmbGVj dDo6RmllbGQgKik7CgogIGZyaWVuZCBqbWV0aG9kSUQgX0p2X0Zyb21SZWZsZWN0ZWRNZXRob2Qg KGphdmE6Omxhbmc6OnJlZmxlY3Q6Ok1ldGhvZCAqKTsKICBmcmllbmQgam1ldGhvZElEIF9Kdl9G cm9tUmVmbGVjdGVkQ29uc3RydWN0b3IgKGphdmE6Omxhbmc6OnJlZmxlY3Q6OkNvbnN0cnVjdG9y ICopOwogIGZyaWVuZCBqaW50IEp2TnVtTWV0aG9kcyAoamNsYXNzKTsKICBmcmllbmQgam1ldGhv ZElEIEp2R2V0Rmlyc3RNZXRob2QgKGpjbGFzcyk7CgoKICBmcmllbmQgY2xhc3MgamF2YTo6bGFu Zzo6Q2xhc3NMb2FkZXI7CgogIGZyaWVuZCBjbGFzcyBqYXZhOjppbzo6T2JqZWN0T3V0cHV0U3Ry ZWFtOwogIGZyaWVuZCBjbGFzcyBqYXZhOjppbzo6T2JqZWN0SW5wdXRTdHJlYW07CiAgZnJpZW5k IGNsYXNzIGphdmE6OmlvOjpPYmplY3RTdHJlYW1DbGFzczsKCiAgZnJpZW5kIHZvaWQgX0p2X1dh aXRGb3JTdGF0ZSAoamNsYXNzLCBpbnQpOwogIGZyaWVuZCB2b2lkIF9Kdl9SZWdpc3RlckNsYXNz ZXMgKGpjbGFzcyAqY2xhc3Nlcyk7CiAgZnJpZW5kIHZvaWQgX0p2X1JlZ2lzdGVyQ2xhc3NIb29r RGVmYXVsdCAoamNsYXNzIGtsYXNzKTsKICBmcmllbmQgdm9pZCBfSnZfUmVnaXN0ZXJJbml0aWF0 aW5nTG9hZGVyIChqY2xhc3MsamF2YTo6bGFuZzo6Q2xhc3NMb2FkZXIqKTsKICBmcmllbmQgdm9p ZCBfSnZfVW5yZWdpc3RlckNsYXNzIChqY2xhc3MpOwogIGZyaWVuZCBqY2xhc3MgX0p2X0ZpbmRD bGFzcyAoX0p2X1V0ZjhDb25zdCAqbmFtZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg IGphdmE6Omxhbmc6OkNsYXNzTG9hZGVyICpsb2FkZXIpOwogIGZyaWVuZCBqY2xhc3MgX0p2X0Zp bmRDbGFzc0luQ2FjaGUgKF9Kdl9VdGY4Q29uc3QgKm5hbWUsCiAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgamF2YTo6bGFuZzo6Q2xhc3NMb2FkZXIgKmxvYWRlcik7CiAgZnJp ZW5kIHZvaWQgX0p2X05ld0FycmF5Q2xhc3MgKGpjbGFzcyBlbGVtZW50LAogICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICBqYXZhOjpsYW5nOjpDbGFzc0xvYWRlciAqbG9hZGVyLAogICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfSnZfVlRhYmxlICphcnJheV92dGFibGUgPSAw KTsKICBmcmllbmQgamNsYXNzIF9Kdl9OZXdDbGFzcyAoX0p2X1V0ZjhDb25zdCAqbmFtZSwgamNs YXNzIHN1cGVyY2xhc3MsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGphdmE6Omxhbmc6 OkNsYXNzTG9hZGVyICpsb2FkZXIpOwogIGZyaWVuZCB2b2lkIF9Kdl9Jbml0TmV3Q2xhc3NGaWVs ZHMgKGpjbGFzcyBrbGFzcyk7CgoKICBmcmllbmQgdm9pZCBfSnZfSW5pdFByaW1DbGFzcyAoamNs YXNzLCBjaGFyICosIGNoYXIsIGludCwgX0p2X0FycmF5VlRhYmxlICopOwoKICBmcmllbmQgdm9p ZCBfSnZfUHJlcGFyZUNvbXBpbGVkQ2xhc3MgKGpjbGFzcyk7CiAgZnJpZW5kIHZvaWQgX0p2X1By ZXBhcmVDb25zdGFudFRpbWVUYWJsZXMgKGpjbGFzcyk7CiAgZnJpZW5kIGpzaG9ydCBfSnZfR2V0 SW50ZXJmYWNlcyAoamNsYXNzLCBfSnZfaWZhY2VzICopOwogIGZyaWVuZCB2b2lkIF9Kdl9HZW5l cmF0ZUlUYWJsZSAoamNsYXNzLCBfSnZfaWZhY2VzICosIGpzaG9ydCAqKTsKICBmcmllbmQganN0 cmluZyBfSnZfR2V0TWV0aG9kU3RyaW5nKGpjbGFzcywgX0p2X1V0ZjhDb25zdCAqKTsKICBmcmll bmQganNob3J0IF9Kdl9BcHBlbmRQYXJ0aWFsSVRhYmxlIChqY2xhc3MsIGpjbGFzcywgdm9pZCAq KiwganNob3J0KTsKICBmcmllbmQganNob3J0IF9Kdl9GaW5kSUluZGV4IChqY2xhc3MgKiwganNo b3J0ICosIGpzaG9ydCk7CiAgZnJpZW5kIHZvaWQgX0p2X0xpbmtPZmZzZXRUYWJsZSAoamNsYXNz KTsKICBmcmllbmQgdm9pZCBfSnZfTGF5b3V0VlRhYmxlTWV0aG9kcyAoamNsYXNzIGtsYXNzKTsK ICBmcmllbmQgdm9pZCBfSnZfU2V0VlRhYmxlRW50cmllcyAoamNsYXNzLCBfSnZfVlRhYmxlICop OwogIGZyaWVuZCB2b2lkIF9Kdl9NYWtlVlRhYmxlIChqY2xhc3MpOwoKCgogIGlubGluZSBmcmll bmQgamNsYXNzCiAgX0p2X0dldEFycmF5Q2xhc3MgKGpjbGFzcyBrbGFzcywgamF2YTo6bGFuZzo6 Q2xhc3NMb2FkZXIgKmxvYWRlcikKICB7CiAgICBpZiAoX19idWlsdGluX2V4cGVjdCAoIWtsYXNz LT5hcnJheWNsYXNzLCBmYWxzZSkpCiAgICAgIF9Kdl9OZXdBcnJheUNsYXNzIChrbGFzcywgbG9h ZGVyKTsKICAgIHJldHVybiBrbGFzcy0+YXJyYXljbGFzczsKICB9CgoKICBmcmllbmQgamJvb2xl YW4gX0p2X0lzSW50ZXJwcmV0ZWRDbGFzcyAoamNsYXNzKTsKICBmcmllbmQgdm9pZCBfSnZfSW5p dEZpZWxkIChqb2JqZWN0LCBqY2xhc3MsIF9Kdl9GaWVsZCopOwogIGZyaWVuZCBpbnQgX0p2X0Rl dGVybWluZVZUYWJsZUluZGV4IChqY2xhc3MsIF9Kdl9VdGY4Q29uc3QgKiwKICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgX0p2X1V0ZjhDb25zdCopOwogIGZyaWVuZCB2b2lk IF9Kdl9Jbml0RmllbGQgKGpvYmplY3QsIGpjbGFzcywgaW50KTsKICBmcmllbmQgX0p2X3dvcmQg X0p2X1Jlc29sdmVQb29sRW50cnkgKGpjbGFzcywgaW50KTsKICBmcmllbmQgX0p2X01ldGhvZCAq X0p2X1NlYXJjaE1ldGhvZEluQ2xhc3MgKGpjbGFzcyBjbHMsIGpjbGFzcyBrbGFzcywKICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9Kdl9VdGY4Q29uc3QgKm1l dGhvZF9uYW1lLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg X0p2X1V0ZjhDb25zdCAqbWV0aG9kX3NpZ25hdHVyZSk7CgogIGZyaWVuZCB2b2lkIF9Kdl9QcmVw YXJlQ2xhc3MgKGpjbGFzcyk7CgogIGZyaWVuZCBjbGFzcyBfSnZfQ2xhc3NSZWFkZXI7CiAgZnJp ZW5kIGNsYXNzIF9Kdl9JbnRlcnBDbGFzczsKICBmcmllbmQgY2xhc3MgX0p2X0ludGVycE1ldGhv ZDsKCgoKICBmcmllbmQgdm9pZCAqX0p2X01hcmtPYmogKHZvaWQgKiwgdm9pZCAqLCB2b2lkICos IHZvaWQgKik7CgoKICBmcmllbmQgY2xhc3MgX0p2X0J5dGVjb2RlVmVyaWZpZXI7CgoKICBqY2xh c3MgbmV4dDsKCiAgX0p2X1V0ZjhDb25zdCAqbmFtZTsKCiAgX0p2X3VzaG9ydCBhY2NmbGFnczsK CiAgamNsYXNzIHN1cGVyY2xhc3M7CgogIF9Kdl9Db25zdGFudHMgY29uc3RhbnRzOwoKCiAgX0p2 X01ldGhvZCAqbWV0aG9kczsKCgogIGpzaG9ydCBtZXRob2RfY291bnQ7CgogIGpzaG9ydCB2dGFi bGVfbWV0aG9kX2NvdW50OwoKICBfSnZfRmllbGQgKmZpZWxkczsKCiAgamludCBzaXplX2luX2J5 dGVzOwoKICBqc2hvcnQgZmllbGRfY291bnQ7CgogIGpzaG9ydCBzdGF0aWNfZmllbGRfY291bnQ7 CgogIF9Kdl9WVGFibGUgKnZ0YWJsZTsKCiAgX0p2X09mZnNldFRhYmxlICpvdGFibGU7CgogIF9K dl9NZXRob2RTeW1ib2wgKm90YWJsZV9zeW1zOwoKICBqY2xhc3MgKmludGVyZmFjZXM7CgogIGph dmE6Omxhbmc6OkNsYXNzTG9hZGVyICpsb2FkZXI7CgogIGpzaG9ydCBpbnRlcmZhY2VfY291bnQ7 CgogIGpieXRlIHN0YXRlOwoKCiAgamF2YTo6bGFuZzo6VGhyZWFkICp0aHJlYWQ7CgogIGpzaG9y dCBkZXB0aDsKCiAgamNsYXNzICphbmNlc3RvcnM7CgogIF9Kdl9JRGlzcGF0Y2hUYWJsZSAqaWR0 OwoKICBqY2xhc3MgYXJyYXljbGFzczsKCiAgamF2YTo6c2VjdXJpdHk6OlByb3RlY3Rpb25Eb21h aW4gKnByb3RlY3Rpb25Eb21haW47Cn07CiMgMjcgImluY2x1ZGUvamF2YS1nYy5oIiAyCiMgMSAi L3Vzci9pbmNsdWRlL3N0cmluZy5oIiAxIDMKIyAyOCAiL3Vzci9pbmNsdWRlL3N0cmluZy5oIiAz CmV4dGVybiAiQyIgewoKCgoKIyAxICIveDEvZWdjcy9idWlsZC9nY2MvaW5jbHVkZS9zdGRkZWYu aCIgMSAzCiMgMzQgIi91c3IvaW5jbHVkZS9zdHJpbmcuaCIgMiAzCgoKCmV4dGVybiB2b2lkICog bWVtY3B5ICh2b2lkICogX19yZXN0cmljdCBfX2Rlc3QsIF9fY29uc3Qgdm9pZCAqIF9fcmVzdHJp Y3QgX19zcmMsIHNpemVfdCBfX24pIHRocm93ICgpOwoKCgpleHRlcm4gdm9pZCAqIG1lbW1vdmUg KHZvaWQgKiBfX2Rlc3QsIF9fY29uc3Qgdm9pZCAqIF9fc3JjLCBzaXplX3QgX19uKSB0aHJvdyAo KTsKCgoKCgoKZXh0ZXJuIHZvaWQgKiBtZW1jY3B5ICh2b2lkICogX19kZXN0LCBfX2NvbnN0IHZv aWQgKiBfX3NyYywgaW50IF9fYywgc2l6ZV90IF9fbikgdGhyb3cgKCk7CgoKCgoKZXh0ZXJuIHZv aWQgKiBtZW1zZXQgKHZvaWQgKiBfX3MsIGludCBfX2MsIHNpemVfdCBfX24pIHRocm93ICgpOwoK CmV4dGVybiBpbnQgbWVtY21wIChfX2NvbnN0IHZvaWQgKiBfX3MxLCBfX2NvbnN0IHZvaWQgKiBf X3MyLCBzaXplX3QgX19uKSB0aHJvdyAoKTsKCgoKZXh0ZXJuIHZvaWQgKiBtZW1jaHIgKF9fY29u c3Qgdm9pZCAqIF9fcywgaW50IF9fYywgc2l6ZV90IF9fbikgdGhyb3cgKCk7CgoKCgpleHRlcm4g dm9pZCAqIHJhd21lbWNociAoX19jb25zdCB2b2lkICogX19zLCBpbnQgX19jKSB0aHJvdyAoKTsK CgoKCmV4dGVybiBjaGFyICpzdHJjcHkgKGNoYXIgKl9fcmVzdHJpY3QgX19kZXN0LCBfX2NvbnN0 IGNoYXIgKl9fcmVzdHJpY3QgX19zcmMpIHRocm93ICgpOwoKCmV4dGVybiBjaGFyICpzdHJuY3B5 IChjaGFyICpfX3Jlc3RyaWN0IF9fZGVzdCwgX19jb25zdCBjaGFyICpfX3Jlc3RyaWN0IF9fc3Jj LCBzaXplX3QgX19uKSB0aHJvdyAoKTsKCgoKZXh0ZXJuIGNoYXIgKnN0cmNhdCAoY2hhciAqX19y ZXN0cmljdCBfX2Rlc3QsIF9fY29uc3QgY2hhciAqX19yZXN0cmljdCBfX3NyYykgdGhyb3cgKCk7 CgoKZXh0ZXJuIGNoYXIgKnN0cm5jYXQgKGNoYXIgKl9fcmVzdHJpY3QgX19kZXN0LCBfX2NvbnN0 IGNoYXIgKl9fcmVzdHJpY3QgX19zcmMsIHNpemVfdCBfX24pIHRocm93ICgpOwoKCgpleHRlcm4g aW50IHN0cmNtcCAoX19jb25zdCBjaGFyICpfX3MxLCBfX2NvbnN0IGNoYXIgKl9fczIpIHRocm93 ICgpOwoKZXh0ZXJuIGludCBzdHJuY21wIChfX2NvbnN0IGNoYXIgKl9fczEsIF9fY29uc3QgY2hh ciAqX19zMiwgc2l6ZV90IF9fbikgdGhyb3cgKCk7CgoKZXh0ZXJuIGludCBzdHJjb2xsIChfX2Nv bnN0IGNoYXIgKl9fczEsIF9fY29uc3QgY2hhciAqX19zMikgdGhyb3cgKCk7CgpleHRlcm4gc2l6 ZV90IHN0cnhmcm0gKGNoYXIgKl9fcmVzdHJpY3QgX19kZXN0LCBfX2NvbnN0IGNoYXIgKl9fcmVz dHJpY3QgX19zcmMsIHNpemVfdCBfX24pIHRocm93ICgpOwoKCgoKCgojIDEgIi91c3IvaW5jbHVk ZS94bG9jYWxlLmgiIDEgMwojIDI4ICIvdXNyL2luY2x1ZGUveGxvY2FsZS5oIiAzCnR5cGVkZWYg c3RydWN0IF9fbG9jYWxlX3N0cnVjdAp7CiAgc3RydWN0IGxvY2FsZV9kYXRhICpfX2xvY2FsZXNb Nl07CgoKICBjb25zdCB1bnNpZ25lZCBzaG9ydCBpbnQgKl9fY3R5cGVfYjsKICBjb25zdCBpbnQg Kl9fY3R5cGVfdG9sb3dlcjsKICBjb25zdCBpbnQgKl9fY3R5cGVfdG91cHBlcjsKfSAqX19sb2Nh bGVfdDsKIyAxMDAgIi91c3IvaW5jbHVkZS9zdHJpbmcuaCIgMiAzCgoKZXh0ZXJuIGludCBfX3N0 cmNvbGxfbCAoX19jb25zdCBjaGFyICpfX3MxLCBfX2NvbnN0IGNoYXIgKl9fczIsIF9fbG9jYWxl X3QgX19sKSB0aHJvdyAoKTsKCgpleHRlcm4gc2l6ZV90IF9fc3RyeGZybV9sIChjaGFyICpfX2Rl c3QsIF9fY29uc3QgY2hhciAqX19zcmMsIHNpemVfdCBfX24sIF9fbG9jYWxlX3QgX19sKSB0aHJv dyAoKTsKCgoKCgpleHRlcm4gY2hhciAqX19zdHJkdXAgKF9fY29uc3QgY2hhciAqX19zKSB0aHJv dyAoKTsKZXh0ZXJuIGNoYXIgKnN0cmR1cCAoX19jb25zdCBjaGFyICpfX3MpIHRocm93ICgpOwoK CgoKCgpleHRlcm4gY2hhciAqc3RybmR1cCAoX19jb25zdCBjaGFyICpfX3N0cmluZywgc2l6ZV90 IF9fbikgdGhyb3cgKCk7CiMgMTQ2ICIvdXNyL2luY2x1ZGUvc3RyaW5nLmgiIDMKZXh0ZXJuIGNo YXIgKnN0cmNociAoX19jb25zdCBjaGFyICpfX3MsIGludCBfX2MpIHRocm93ICgpOwoKZXh0ZXJu IGNoYXIgKnN0cnJjaHIgKF9fY29uc3QgY2hhciAqX19zLCBpbnQgX19jKSB0aHJvdyAoKTsKCgoK CmV4dGVybiBjaGFyICpzdHJjaHJudWwgKF9fY29uc3QgY2hhciAqX19zLCBpbnQgX19jKSB0aHJv dyAoKTsKCgoKCmV4dGVybiBzaXplX3Qgc3RyY3NwbiAoX19jb25zdCBjaGFyICpfX3MsIF9fY29u c3QgY2hhciAqX19yZWplY3QpIHRocm93ICgpOwoKCmV4dGVybiBzaXplX3Qgc3Ryc3BuIChfX2Nv bnN0IGNoYXIgKl9fcywgX19jb25zdCBjaGFyICpfX2FjY2VwdCkgdGhyb3cgKCk7CgpleHRlcm4g Y2hhciAqc3RycGJyayAoX19jb25zdCBjaGFyICpfX3MsIF9fY29uc3QgY2hhciAqX19hY2NlcHQp IHRocm93ICgpOwoKZXh0ZXJuIGNoYXIgKnN0cnN0ciAoX19jb25zdCBjaGFyICpfX2hheXN0YWNr LCBfX2NvbnN0IGNoYXIgKl9fbmVlZGxlKSB0aHJvdyAoKTsKCgoKZXh0ZXJuIGNoYXIgKl9fc3Ry Y2FzZXN0ciAoX19jb25zdCBjaGFyICpfX2hheXN0YWNrLCBfX2NvbnN0IGNoYXIgKl9fbmVlZGxl KSB0aHJvdyAoKTsKCmV4dGVybiBjaGFyICpzdHJjYXNlc3RyIChfX2NvbnN0IGNoYXIgKl9faGF5 c3RhY2ssIF9fY29uc3QgY2hhciAqX19uZWVkbGUpIHRocm93ICgpOwoKCgoKZXh0ZXJuIGNoYXIg KnN0cnRvayAoY2hhciAqX19yZXN0cmljdCBfX3MsIF9fY29uc3QgY2hhciAqX19yZXN0cmljdCBf X2RlbGltKSB0aHJvdyAoKTsKCgoKCmV4dGVybiBjaGFyICpfX3N0cnRva19yIChjaGFyICpfX3Jl c3RyaWN0IF9fcywgX19jb25zdCBjaGFyICpfX3Jlc3RyaWN0IF9fZGVsaW0sIGNoYXIgKipfX3Jl c3RyaWN0IF9fc2F2ZV9wdHIpIHRocm93ICgpOwoKCgpleHRlcm4gY2hhciAqc3RydG9rX3IgKGNo YXIgKl9fcmVzdHJpY3QgX19zLCBfX2NvbnN0IGNoYXIgKl9fcmVzdHJpY3QgX19kZWxpbSwgY2hh ciAqKl9fcmVzdHJpY3QgX19zYXZlX3B0cikgdGhyb3cgKCk7CiMgMTk0ICIvdXNyL2luY2x1ZGUv c3RyaW5nLmgiIDMKZXh0ZXJuIHZvaWQgKiBtZW1tZW0gKF9fY29uc3Qgdm9pZCAqIF9faGF5c3Rh Y2ssIHNpemVfdCBfX2hheXN0YWNrbGVuLCBfX2NvbnN0IHZvaWQgKiBfX25lZWRsZSwgc2l6ZV90 IF9fbmVlZGxlbGVuKSB0aHJvdyAoKTsKCgoKCmV4dGVybiB2b2lkICogX19tZW1wY3B5ICh2b2lk ICogX19yZXN0cmljdCBfX2Rlc3QsIF9fY29uc3Qgdm9pZCAqIF9fcmVzdHJpY3QgX19zcmMsIHNp emVfdCBfX24pIHRocm93ICgpOwoKZXh0ZXJuIHZvaWQgKiBtZW1wY3B5ICh2b2lkICogX19yZXN0 cmljdCBfX2Rlc3QsIF9fY29uc3Qgdm9pZCAqIF9fcmVzdHJpY3QgX19zcmMsIHNpemVfdCBfX24p IHRocm93ICgpOwoKCgoKCmV4dGVybiBzaXplX3Qgc3RybGVuIChfX2NvbnN0IGNoYXIgKl9fcykg dGhyb3cgKCk7CgoKCgpleHRlcm4gc2l6ZV90IHN0cm5sZW4gKF9fY29uc3QgY2hhciAqX19zdHJp bmcsIHNpemVfdCBfX21heGxlbikgdGhyb3cgKCk7CgoKCgpleHRlcm4gY2hhciAqc3RyZXJyb3Ig KGludCBfX2Vycm51bSkgdGhyb3cgKCk7CgoKCmV4dGVybiBjaGFyICpfX3N0cmVycm9yX3IgKGlu dCBfX2Vycm51bSwgY2hhciAqX19idWYsIHNpemVfdCBfX2J1ZmxlbikgdGhyb3cgKCk7CmV4dGVy biBjaGFyICpzdHJlcnJvcl9yIChpbnQgX19lcnJudW0sIGNoYXIgKl9fYnVmLCBzaXplX3QgX19i dWZsZW4pIHRocm93ICgpOwoKCgoKZXh0ZXJuIHZvaWQgX19iemVybyAodm9pZCAqIF9fcywgc2l6 ZV90IF9fbikgdGhyb3cgKCk7CgoKCmV4dGVybiB2b2lkIGJjb3B5IChfX2NvbnN0IHZvaWQgKiBf X3NyYywgdm9pZCAqIF9fZGVzdCwgc2l6ZV90IF9fbikgdGhyb3cgKCk7CgoKZXh0ZXJuIHZvaWQg Ynplcm8gKHZvaWQgKiBfX3MsIHNpemVfdCBfX24pIHRocm93ICgpOwoKCmV4dGVybiBpbnQgYmNt cCAoX19jb25zdCB2b2lkICogX19zMSwgX19jb25zdCB2b2lkICogX19zMiwgc2l6ZV90IF9fbikg dGhyb3cgKCk7CgoKZXh0ZXJuIGNoYXIgKmluZGV4IChfX2NvbnN0IGNoYXIgKl9fcywgaW50IF9f YykgdGhyb3cgKCk7CgoKZXh0ZXJuIGNoYXIgKnJpbmRleCAoX19jb25zdCBjaGFyICpfX3MsIGlu dCBfX2MpIHRocm93ICgpOwoKCgpleHRlcm4gaW50IF9fZmZzIChpbnQgX19pKSB0aHJvdyAoKSBf X2F0dHJpYnV0ZV9fICgoY29uc3QpKTsKZXh0ZXJuIGludCBmZnMgKGludCBfX2kpIHRocm93ICgp IF9fYXR0cmlidXRlX18gKChjb25zdCkpOwoKCgoKZXh0ZXJuIGludCBmZnNsIChsb25nIGludCBf X2wpIHRocm93ICgpIF9fYXR0cmlidXRlX18gKChjb25zdCkpOwoKX19leHRlbnNpb25fXyBleHRl cm4gaW50IGZmc2xsIChsb25nIGxvbmcgaW50IF9fbGwpIHRocm93ICgpCiAgICAgX19hdHRyaWJ1 dGVfXyAoKGNvbnN0KSk7CgoKCgpleHRlcm4gaW50IF9fc3RyY2FzZWNtcCAoX19jb25zdCBjaGFy ICpfX3MxLCBfX2NvbnN0IGNoYXIgKl9fczIpIHRocm93ICgpOwpleHRlcm4gaW50IHN0cmNhc2Vj bXAgKF9fY29uc3QgY2hhciAqX19zMSwgX19jb25zdCBjaGFyICpfX3MyKSB0aHJvdyAoKTsKCgpl eHRlcm4gaW50IHN0cm5jYXNlY21wIChfX2NvbnN0IGNoYXIgKl9fczEsIF9fY29uc3QgY2hhciAq X19zMiwgc2l6ZV90IF9fbikgdGhyb3cgKCk7CgoKCgoKCmV4dGVybiBpbnQgX19zdHJjYXNlY21w X2wgKF9fY29uc3QgY2hhciAqX19zMSwgX19jb25zdCBjaGFyICpfX3MyLCBfX2xvY2FsZV90IF9f bG9jKSB0aHJvdyAoKTsKCgpleHRlcm4gaW50IF9fc3RybmNhc2VjbXBfbCAoX19jb25zdCBjaGFy ICpfX3MxLCBfX2NvbnN0IGNoYXIgKl9fczIsIHNpemVfdCBfX24sIF9fbG9jYWxlX3QgX19sb2Mp IHRocm93ICgpOwoKCgoKCgpleHRlcm4gY2hhciAqc3Ryc2VwIChjaGFyICoqX19yZXN0cmljdCBf X3N0cmluZ3AsIF9fY29uc3QgY2hhciAqX19yZXN0cmljdCBfX2RlbGltKSB0aHJvdyAoKTsKCgoK CgpleHRlcm4gaW50IHN0cnZlcnNjbXAgKF9fY29uc3QgY2hhciAqX19zMSwgX19jb25zdCBjaGFy ICpfX3MyKSB0aHJvdyAoKTsKCgpleHRlcm4gY2hhciAqc3Ryc2lnbmFsIChpbnQgX19zaWcpIHRo cm93ICgpOwoKCmV4dGVybiBjaGFyICpfX3N0cGNweSAoY2hhciAqX19yZXN0cmljdCBfX2Rlc3Qs IF9fY29uc3QgY2hhciAqX19yZXN0cmljdCBfX3NyYykgdGhyb3cgKCk7CgpleHRlcm4gY2hhciAq c3RwY3B5IChjaGFyICpfX3Jlc3RyaWN0IF9fZGVzdCwgX19jb25zdCBjaGFyICpfX3Jlc3RyaWN0 IF9fc3JjKSB0aHJvdyAoKTsKCgoKCmV4dGVybiBjaGFyICpfX3N0cG5jcHkgKGNoYXIgKl9fcmVz dHJpY3QgX19kZXN0LCBfX2NvbnN0IGNoYXIgKl9fcmVzdHJpY3QgX19zcmMsIHNpemVfdCBfX24p IHRocm93ICgpOwoKZXh0ZXJuIGNoYXIgKnN0cG5jcHkgKGNoYXIgKl9fcmVzdHJpY3QgX19kZXN0 LCBfX2NvbnN0IGNoYXIgKl9fcmVzdHJpY3QgX19zcmMsIHNpemVfdCBfX24pIHRocm93ICgpOwoK CgpleHRlcm4gY2hhciAqc3RyZnJ5IChjaGFyICpfX3N0cmluZykgdGhyb3cgKCk7CgoKZXh0ZXJu IHZvaWQgKiBtZW1mcm9iICh2b2lkICogX19zLCBzaXplX3QgX19uKSB0aHJvdyAoKTsKCgoKCgoK ZXh0ZXJuIGNoYXIgKmJhc2VuYW1lIChfX2NvbnN0IGNoYXIgKl9fZmlsZW5hbWUpIHRocm93ICgp OwojIDM1MCAiL3Vzci9pbmNsdWRlL3N0cmluZy5oIiAzCn0KIyAyOCAiaW5jbHVkZS9qYXZhLWdj LmgiIDIKCmV4dGVybiAiQyIgdm9pZCAqIEdDX2djal9tYWxsb2Moc2l6ZV90LCB2b2lkICopOwpl eHRlcm4gIkMiIHZvaWQgKiBHQ19tYWxsb2NfYXRvbWljKHNpemVfdCk7CgpleHRlcm4gIkMiIHZv aWQgKiBHQ19sb2NhbF9nY2pfbWFsbG9jKHNpemVfdCwgdm9pZCAqKTsKZXh0ZXJuICJDIiB2b2lk ICogR0NfbG9jYWxfbWFsbG9jX2F0b21pYyhzaXplX3QpOwoKCmlubGluZSB2b2lkICoKX0p2X0Fs bG9jT2JqIChqc2l6ZSBzaXplLCBqY2xhc3Mga2xhc3MpCnsKCgoKICByZXR1cm4gR0NfbG9jYWxf Z2NqX21hbGxvYyAoc2l6ZSwga2xhc3MtPnZ0YWJsZSk7CgoKCn0KCmlubGluZSB2b2lkICoKX0p2 X0FsbG9jUHRyRnJlZU9iaiAoanNpemUgc2l6ZSwgamNsYXNzIGtsYXNzKQp7CgoKICAgIHZvaWQg KiBvYmogPSBHQ19sb2NhbF9tYWxsb2NfYXRvbWljKHNpemUpOwoKCgogICooKF9Kdl9WVGFibGUg KiopIG9iaikgPSBrbGFzcy0+dnRhYmxlOwoKCgoKCgoKICByZXR1cm4gb2JqOwp9CiMgMjYgIi4u Ly4uLy4uL2djYy9saWJqYXZhL2luY2x1ZGUvanZtLmgiIDIKCgoKCiMgMSAiLi4vLi4vLi4vZ2Nj L2xpYmphdmEvZ2NqL2NuaS5oIiAxCiMgMjMgIi4uLy4uLy4uL2djYy9saWJqYXZhL2djai9jbmku aCIKZXh0ZXJuIGlubGluZSBqb2JqZWN0Ckp2QWxsb2NPYmplY3QgKGpjbGFzcyBjbHMpCnsKICBy ZXR1cm4gX0p2X0FsbG9jT2JqZWN0IChjbHMsIGNscy0+c2l6ZSgpKTsKfQoKZXh0ZXJuIGlubGlu ZSBqb2JqZWN0Ckp2QWxsb2NPYmplY3QgKGpjbGFzcyBjbHMsIGpzaXplIHN6KQp7CiAgcmV0dXJu IF9Kdl9BbGxvY09iamVjdCAoY2xzLCBzeik7Cn0KCmV4dGVybiAiQyIganN0cmluZyBfSnZfTmV3 U3RyaW5nVVRGIChjb25zdCBjaGFyICpieXRlcyk7CmV4dGVybiAiQyIgdm9pZCBfSnZfSW5pdENs YXNzIChqY2xhc3MpOwoKZXh0ZXJuIGlubGluZSB2b2lkCkp2SW5pdENsYXNzIChqY2xhc3MgY2xz KQp7CiAgcmV0dXJuIF9Kdl9Jbml0Q2xhc3MgKGNscyk7Cn0KCmV4dGVybiBpbmxpbmUganN0cmlu ZwpKdkFsbG9jU3RyaW5nIChqc2l6ZSBzeikKewogIHJldHVybiBfSnZfQWxsb2NTdHJpbmcgKHN6 KTsKfQoKZXh0ZXJuIGlubGluZSBqc3RyaW5nCkp2TmV3U3RyaW5nIChjb25zdCBqY2hhciAqY2hh cnMsIGpzaXplIGxlbikKewogIHJldHVybiBfSnZfTmV3U3RyaW5nIChjaGFycywgbGVuKTsKfQoK ZXh0ZXJuIGlubGluZSBqc3RyaW5nCkp2TmV3U3RyaW5nTGF0aW4xIChjb25zdCBjaGFyICpieXRl cywganNpemUgbGVuKQp7CiAgcmV0dXJuIF9Kdl9OZXdTdHJpbmdMYXRpbjEgKGJ5dGVzLCBsZW4p Owp9CgpleHRlcm4gaW5saW5lIGpzdHJpbmcKSnZOZXdTdHJpbmdMYXRpbjEgKGNvbnN0IGNoYXIg KmJ5dGVzKQp7CiAgcmV0dXJuIF9Kdl9OZXdTdHJpbmdMYXRpbjEgKGJ5dGVzLCBzdHJsZW4gKGJ5 dGVzKSk7Cn0KCmV4dGVybiBpbmxpbmUgamNoYXIgKgpfSnZfR2V0U3RyaW5nQ2hhcnMgKGpzdHJp bmcgc3RyKQp7CiAgcmV0dXJuIChqY2hhciopKChjaGFyKikgc3RyLT5kYXRhICsgc3RyLT5ib2Zm c2V0KTsKfQoKZXh0ZXJuIGlubGluZSBqY2hhcioKSnZHZXRTdHJpbmdDaGFycyAoanN0cmluZyBz dHIpCnsKICByZXR1cm4gX0p2X0dldFN0cmluZ0NoYXJzIChzdHIpOwp9CgpleHRlcm4gaW5saW5l IGpzaXplCkp2R2V0U3RyaW5nVVRGTGVuZ3RoIChqc3RyaW5nIHN0cmluZykKewogIHJldHVybiBf SnZfR2V0U3RyaW5nVVRGTGVuZ3RoIChzdHJpbmcpOwp9CgpleHRlcm4gaW5saW5lIGpzaXplCkp2 R2V0U3RyaW5nVVRGUmVnaW9uIChqc3RyaW5nIHN0ciwganNpemUgc3RhcnQsIGpzaXplIGxlbiwg Y2hhciAqYnVmKQp7CiAgcmV0dXJuIF9Kdl9HZXRTdHJpbmdVVEZSZWdpb24gKHN0ciwgc3RhcnQs IGxlbiwgYnVmKTsKfQoKZXh0ZXJuIGlubGluZSBqc3RyaW5nCkp2TmV3U3RyaW5nVVRGIChjb25z dCBjaGFyICpieXRlcykKewogIHJldHVybiBfSnZfTmV3U3RyaW5nVVRGIChieXRlcyk7Cn0KCmNs YXNzIEp2U3luY2hyb25pemUKewpwcml2YXRlOgogIGpvYmplY3Qgb2JqOwpwdWJsaWM6CiAgSnZT eW5jaHJvbml6ZSAoY29uc3Qgam9iamVjdCAmbykgOiBvYmogKG8pCiAgICB7IF9Kdl9Nb25pdG9y RW50ZXIgKG9iaik7IH0KICB+SnZTeW5jaHJvbml6ZSAoKQogICAgeyBfSnZfTW9uaXRvckV4aXQg KG9iaik7IH0KfTsKCgpleHRlcm4gaW5saW5lIHZvaWQgKgpKdk1hbGxvYyAoanNpemUgc2l6ZSkK ewogIHJldHVybiBfSnZfTWFsbG9jIChzaXplKTsKfQoKZXh0ZXJuIGlubGluZSB2b2lkCkp2RnJl ZSAodm9pZCAqcHRyKQp7CiAgcmV0dXJuIF9Kdl9GcmVlIChwdHIpOwp9CgpleHRlcm4gaW5saW5l IGppbnQKSnZDcmVhdGVKYXZhVk0gKHZvaWQqIHZtX2FyZ3MpCnsKICByZXR1cm4gX0p2X0NyZWF0 ZUphdmFWTSAodm1fYXJncyk7Cn0KCmV4dGVybiBpbmxpbmUgamF2YTo6bGFuZzo6VGhyZWFkKgpK dkF0dGFjaEN1cnJlbnRUaHJlYWQgKGpzdHJpbmcgbmFtZSwgamF2YTo6bGFuZzo6VGhyZWFkR3Jv dXAqIGdyb3VwKQp7CiAgcmV0dXJuIF9Kdl9BdHRhY2hDdXJyZW50VGhyZWFkIChuYW1lLCBncm91 cCk7Cn0KCmV4dGVybiBpbmxpbmUgamludApKdkRldGFjaEN1cnJlbnRUaHJlYWQgKHZvaWQpCnsK ICByZXR1cm4gX0p2X0RldGFjaEN1cnJlbnRUaHJlYWQgKCk7Cn0KIyAzMSAiLi4vLi4vLi4vZ2Nj L2xpYmphdmEvaW5jbHVkZS9qdm0uaCIgMgojIDEgIi4uLy4uLy4uL2djYy9saWJqYXZhL2djai9m aWVsZC5oIiAxCiMgMTUgIi4uLy4uLy4uL2djYy9saWJqYXZhL2djai9maWVsZC5oIgojIDEgImph dmEvbGFuZy9yZWZsZWN0L0ZpZWxkLmgiIDEKCgoKCgojcHJhZ21hIGludGVyZmFjZQoKIyAxICJq YXZhL2xhbmcvcmVmbGVjdC9BY2Nlc3NpYmxlT2JqZWN0LmgiIDEKCgoKCgojcHJhZ21hIGludGVy ZmFjZQoKCgoKY2xhc3MgOjpqYXZhOjpsYW5nOjpyZWZsZWN0OjpBY2Nlc3NpYmxlT2JqZWN0IDog cHVibGljIDo6amF2YTo6bGFuZzo6T2JqZWN0CnsKcHVibGljOgogIEFjY2Vzc2libGVPYmplY3Qg KCk7CnB1YmxpYzoKICB2aXJ0dWFsIGpib29sZWFuIGlzQWNjZXNzaWJsZSAoKSB7IHJldHVybiBm bGFnOyB9CiAgc3RhdGljIHZvaWQgc2V0QWNjZXNzaWJsZSAoSkFycmF5PCA6OmphdmE6Omxhbmc6 OnJlZmxlY3Q6OkFjY2Vzc2libGVPYmplY3QgKj4gKiwgamJvb2xlYW4pOwogIHZpcnR1YWwgdm9p ZCBzZXRBY2Nlc3NpYmxlIChqYm9vbGVhbik7CnByaXZhdGU6CiAgc3RhdGljIHZvaWQgY2hlY2tQ ZXJtaXNzaW9uICgpOwogIHZvaWQgc2VjdXJlU2V0QWNjZXNzaWJsZSAoamJvb2xlYW4pOwpwdWJs aWM6CiAgamJvb2xlYW4gZmxhZzsKcHVibGljOgoKICBzdGF0aWMgOjpqYXZhOjpsYW5nOjpDbGFz cyBjbGFzcyQ7Cn07CiMgOSAiamF2YS9sYW5nL3JlZmxlY3QvRmllbGQuaCIgMgoKY2xhc3MgOjpq YXZhOjpsYW5nOjpyZWZsZWN0OjpGaWVsZCA6IHB1YmxpYyA6OmphdmE6Omxhbmc6OnJlZmxlY3Q6 OkFjY2Vzc2libGVPYmplY3QKewpwdWJsaWM6CiAgRmllbGQgKCk7CnB1YmxpYzoKICBqYm9vbGVh biBlcXVhbHMgKDo6amF2YTo6bGFuZzo6T2JqZWN0ICopOwogIDo6amF2YTo6bGFuZzo6Q2xhc3Mg KmdldERlY2xhcmluZ0NsYXNzICgpIHsgcmV0dXJuIGRlY2xhcmluZ0NsYXNzOyB9CiAgOjpqYXZh OjpsYW5nOjpTdHJpbmcgKmdldE5hbWUgKCk7CiAgOjpqYXZhOjpsYW5nOjpDbGFzcyAqZ2V0VHlw ZSAoKTsKICBqaW50IGdldE1vZGlmaWVycyAoKTsKICBqaW50IGhhc2hDb2RlICgpOwogIGpib29s ZWFuIGdldEJvb2xlYW4gKDo6amF2YTo6bGFuZzo6T2JqZWN0ICopOwogIGpjaGFyIGdldENoYXIg KDo6amF2YTo6bGFuZzo6T2JqZWN0ICopOwogIGpieXRlIGdldEJ5dGUgKDo6amF2YTo6bGFuZzo6 T2JqZWN0ICopOwogIGpzaG9ydCBnZXRTaG9ydCAoOjpqYXZhOjpsYW5nOjpPYmplY3QgKik7CiAg amludCBnZXRJbnQgKDo6amF2YTo6bGFuZzo6T2JqZWN0ICopOwogIGpsb25nIGdldExvbmcgKDo6 amF2YTo6bGFuZzo6T2JqZWN0ICopOwogIGpmbG9hdCBnZXRGbG9hdCAoOjpqYXZhOjpsYW5nOjpP YmplY3QgKik7CiAgamRvdWJsZSBnZXREb3VibGUgKDo6amF2YTo6bGFuZzo6T2JqZWN0ICopOwog IDo6amF2YTo6bGFuZzo6T2JqZWN0ICpnZXQgKDo6amF2YTo6bGFuZzo6T2JqZWN0ICopOwpwcml2 YXRlOgogIGpib29sZWFuIGdldEJvb2xlYW4gKDo6amF2YTo6bGFuZzo6Q2xhc3MgKiwgOjpqYXZh OjpsYW5nOjpPYmplY3QgKik7CiAgamNoYXIgZ2V0Q2hhciAoOjpqYXZhOjpsYW5nOjpDbGFzcyAq LCA6OmphdmE6Omxhbmc6Ok9iamVjdCAqKTsKICBqYnl0ZSBnZXRCeXRlICg6OmphdmE6Omxhbmc6 OkNsYXNzICosIDo6amF2YTo6bGFuZzo6T2JqZWN0ICopOwogIGpzaG9ydCBnZXRTaG9ydCAoOjpq YXZhOjpsYW5nOjpDbGFzcyAqLCA6OmphdmE6Omxhbmc6Ok9iamVjdCAqKTsKICBqaW50IGdldElu dCAoOjpqYXZhOjpsYW5nOjpDbGFzcyAqLCA6OmphdmE6Omxhbmc6Ok9iamVjdCAqKTsKICBqbG9u ZyBnZXRMb25nICg6OmphdmE6Omxhbmc6OkNsYXNzICosIDo6amF2YTo6bGFuZzo6T2JqZWN0ICop OwogIGpmbG9hdCBnZXRGbG9hdCAoOjpqYXZhOjpsYW5nOjpDbGFzcyAqLCA6OmphdmE6Omxhbmc6 Ok9iamVjdCAqKTsKICBqZG91YmxlIGdldERvdWJsZSAoOjpqYXZhOjpsYW5nOjpDbGFzcyAqLCA6 OmphdmE6Omxhbmc6Ok9iamVjdCAqKTsKICA6OmphdmE6Omxhbmc6Ok9iamVjdCAqZ2V0ICg6Omph dmE6Omxhbmc6OkNsYXNzICosIDo6amF2YTo6bGFuZzo6T2JqZWN0ICopOwpwdWJsaWM6CiAgdm9p ZCBzZXRCeXRlICg6OmphdmE6Omxhbmc6Ok9iamVjdCAqLCBqYnl0ZSk7CiAgdm9pZCBzZXRTaG9y dCAoOjpqYXZhOjpsYW5nOjpPYmplY3QgKiwganNob3J0KTsKICB2b2lkIHNldEludCAoOjpqYXZh OjpsYW5nOjpPYmplY3QgKiwgamludCk7CiAgdm9pZCBzZXRMb25nICg6OmphdmE6Omxhbmc6Ok9i amVjdCAqLCBqbG9uZyk7CiAgdm9pZCBzZXRGbG9hdCAoOjpqYXZhOjpsYW5nOjpPYmplY3QgKiwg amZsb2F0KTsKICB2b2lkIHNldERvdWJsZSAoOjpqYXZhOjpsYW5nOjpPYmplY3QgKiwgamRvdWJs ZSk7CiAgdm9pZCBzZXRDaGFyICg6OmphdmE6Omxhbmc6Ok9iamVjdCAqLCBqY2hhcik7CiAgdm9p ZCBzZXRCb29sZWFuICg6OmphdmE6Omxhbmc6Ok9iamVjdCAqLCBqYm9vbGVhbik7CnByaXZhdGU6 CiAgdm9pZCBzZXRCeXRlICg6OmphdmE6Omxhbmc6OkNsYXNzICosIDo6amF2YTo6bGFuZzo6T2Jq ZWN0ICosIGpieXRlKTsKICB2b2lkIHNldFNob3J0ICg6OmphdmE6Omxhbmc6OkNsYXNzICosIDo6 amF2YTo6bGFuZzo6T2JqZWN0ICosIGpzaG9ydCk7CiAgdm9pZCBzZXRJbnQgKDo6amF2YTo6bGFu Zzo6Q2xhc3MgKiwgOjpqYXZhOjpsYW5nOjpPYmplY3QgKiwgamludCk7CiAgdm9pZCBzZXRMb25n ICg6OmphdmE6Omxhbmc6OkNsYXNzICosIDo6amF2YTo6bGFuZzo6T2JqZWN0ICosIGpsb25nKTsK ICB2b2lkIHNldEZsb2F0ICg6OmphdmE6Omxhbmc6OkNsYXNzICosIDo6amF2YTo6bGFuZzo6T2Jq ZWN0ICosIGpmbG9hdCk7CiAgdm9pZCBzZXREb3VibGUgKDo6amF2YTo6bGFuZzo6Q2xhc3MgKiwg OjpqYXZhOjpsYW5nOjpPYmplY3QgKiwgamRvdWJsZSk7CiAgdm9pZCBzZXRDaGFyICg6OmphdmE6 Omxhbmc6OkNsYXNzICosIDo6amF2YTo6bGFuZzo6T2JqZWN0ICosIGpjaGFyKTsKICB2b2lkIHNl dEJvb2xlYW4gKDo6amF2YTo6bGFuZzo6Q2xhc3MgKiwgOjpqYXZhOjpsYW5nOjpPYmplY3QgKiwg amJvb2xlYW4pOwogIHZvaWQgc2V0ICg6OmphdmE6Omxhbmc6OkNsYXNzICosIDo6amF2YTo6bGFu Zzo6T2JqZWN0ICosIDo6amF2YTo6bGFuZzo6T2JqZWN0ICosIDo6amF2YTo6bGFuZzo6Q2xhc3Mg Kik7CnB1YmxpYzoKICB2b2lkIHNldCAoOjpqYXZhOjpsYW5nOjpPYmplY3QgKiwgOjpqYXZhOjps YW5nOjpPYmplY3QgKik7CnByaXZhdGU6CiAgdm9pZCBzZXQgKDo6amF2YTo6bGFuZzo6Q2xhc3Mg KiwgOjpqYXZhOjpsYW5nOjpPYmplY3QgKiwgOjpqYXZhOjpsYW5nOjpPYmplY3QgKik7CnB1Ymxp YzoKICA6OmphdmE6Omxhbmc6OlN0cmluZyAqdG9TdHJpbmcgKCk7CnByaXZhdGU6CiAgOjpqYXZh OjpsYW5nOjpDbGFzcyAqZGVjbGFyaW5nQ2xhc3M7CiAgOjpqYXZhOjpsYW5nOjpTdHJpbmcgKm5h bWU7CiAgamludCBvZmZzZXQ7CiAgZnJpZW5kIGpmaWVsZElEIF9Kdl9Gcm9tUmVmbGVjdGVkRmll bGQgKGphdmE6Omxhbmc6OnJlZmxlY3Q6OkZpZWxkICopOwogIGZyaWVuZCBqb2JqZWN0IF9Kdl9K TklfVG9SZWZsZWN0ZWRGaWVsZCAoX0p2X0pOSUVudiosIGpjbGFzcywgamZpZWxkSUQsIGpib29s ZWFuKTsKICBmcmllbmQgY2xhc3MgamF2YTo6bGFuZzo6Q2xhc3M7CnB1YmxpYzoKCiAgc3RhdGlj IDo6amF2YTo6bGFuZzo6Q2xhc3MgY2xhc3MkOwp9OwojIDE2ICIuLi8uLi8uLi9nY2MvbGliamF2 YS9nY2ovZmllbGQuaCIgMgoKIyAxICJnbnUvZ2NqL1Jhd0RhdGEuaCIgMQoKCgoKCiNwcmFnbWEg aW50ZXJmYWNlCgoKCmV4dGVybiAiSmF2YSIKewogIG5hbWVzcGFjZSBnbnUKICB7CiAgICBuYW1l c3BhY2UgZ2NqCiAgICB7CiAgICAgIGNsYXNzIFJhd0RhdGE7CiAgICB9CiAgfQp9OwoKY2xhc3Mg OjpnbnU6Omdjajo6UmF3RGF0YSA6IHB1YmxpYyA6OmphdmE6Omxhbmc6Ok9iamVjdAp7CnByaXZh dGU6CiAgUmF3RGF0YSAoKTsKcHVibGljOgoKICBzdGF0aWMgOjpqYXZhOjpsYW5nOjpDbGFzcyBj bGFzcyQ7Cn07CiMgMTggIi4uLy4uLy4uL2djYy9saWJqYXZhL2djai9maWVsZC5oIiAyCgoKCgpz dHJ1Y3QgX0p2X0ZpZWxkCnsKCiAgc3RydWN0IF9Kdl9VdGY4Q29uc3QqIG5hbWU7CgoKCgogIGpj bGFzcyB0eXBlOwoKICBfSnZfdXNob3J0IGZsYWdzOwoKCgoKICBfSnZfdXNob3J0IGJzaXplOwoK CiAgdW5pb24gewogICAgamludCBib2Zmc2V0OwogICAgdm9pZCogYWRkcjsKICB9IHU7CgoKICBq Ym9vbGVhbiBpc1Jlc29sdmVkICgpCiAgeyByZXR1cm4gISAoZmxhZ3MgJiAweDgwMDApOyB9Cgog IHB1YmxpYzoKCiAgaW50IGdldE9mZnNldCAoKSB7IHJldHVybiB1LmJvZmZzZXQ7IH0KCiAgam9i amVjdCBnZXRPYmplY3RGaWVsZCAoam9iamVjdCBvYmopCiAgeyByZXR1cm4gKihqb2JqZWN0ICop KChjaGFyICopb2JqICsgZ2V0T2Zmc2V0ICgpKTsgfQoKICBqZmllbGRJRCBnZXROZXh0RmllbGQg KCkgeyByZXR1cm4gdGhpcyArIDE7IH0KCiAgamJvb2xlYW4gaXNSZWYgKCkKICAgIHsKICAgICAg aWYgKCFpc1Jlc29sdmVkICgpKQogICAgICAgIHsKICAgICAgICAgIGNoYXIgZmlyc3QgPSAoKF9K dl9VdGY4Q29uc3QqKXR5cGUpLT5kYXRhWzBdOwogICAgICAgICAgcmV0dXJuIGZpcnN0ID09ICdb JyB8fCBmaXJzdCA9PSAnTCc7CiAgICAgICAgfQogICAgICBlbHNlCiAgICAgICAgewogICAgICAg ICAgcmV0dXJuICEgdHlwZS0+aXNQcmltaXRpdmUgKCk7CiAgICAgICAgfQogICAgfQoKICBqY2xh c3MgZ2V0Q2xhc3MgKCkKICB7CgoKCiAgICByZXR1cm4gdHlwZTsKICB9CgoKICBpbnQgZ2V0TW9k aWZpZXJzKCkKICB7CiAgICByZXR1cm4gZmxhZ3MgJiBqYXZhOjpsYW5nOjpyZWZsZWN0OjpNb2Rp Zmllcjo6QUxMX0ZMQUdTOwogIH0KCgoKCgogIF9Kdl9VdGY4Q29uc3QgKiBnZXROYW1lVXRmOENv bnN0IChqY2xhc3MpIHsgcmV0dXJuIG5hbWU7IH0KCgp9OwoKCgppbmxpbmUgamJ5dGUKX0p2X0dl dFN0YXRpY0J5dGVGaWVsZCAoamNsYXNzLCBfSnZfRmllbGQqIGZpZWxkKQp7CiAgcmV0dXJuICog KGpieXRlICopIGZpZWxkLT51LmFkZHI7Cn0KCmlubGluZSBqc2hvcnQKX0p2X0dldFN0YXRpY1No b3J0RmllbGQgKGpjbGFzcywgX0p2X0ZpZWxkKiBmaWVsZCkKewogIHJldHVybiAqIChqc2hvcnQg KikgZmllbGQtPnUuYWRkcjsKfQoKaW5saW5lIGppbnQKX0p2X0dldFN0YXRpY0ludEZpZWxkIChq Y2xhc3MsIF9Kdl9GaWVsZCogZmllbGQpCnsKICByZXR1cm4gKiAoamludCAqKSBmaWVsZC0+dS5h ZGRyOwp9CgppbmxpbmUgamxvbmcKX0p2X0dldFN0YXRpY0xvbmdGaWVsZCAoamNsYXNzLCBfSnZf RmllbGQqIGZpZWxkKQp7CiAgcmV0dXJuICogKGpsb25nICopIGZpZWxkLT51LmFkZHI7Cn0KCmlu bGluZSBqb2JqZWN0Cl9Kdl9HZXRPYmplY3RGaWVsZCAoam9iamVjdCBvYmosIF9Kdl9GaWVsZCog ZmllbGQpCnsKICByZXR1cm4gZmllbGQtPmdldE9iamVjdEZpZWxkIChvYmopOwp9CgppbmxpbmUg amJ5dGUKX0p2X0dldEJ5dGVGaWVsZCAoam9iamVjdCBvYmosIF9Kdl9GaWVsZCogZmllbGQpCnsK ICByZXR1cm4gKiAoamJ5dGUgKikgKChjaGFyKikgb2JqICsgZmllbGQtPmdldE9mZnNldCAoKSk7 Cn0KCmlubGluZSBqc2hvcnQKX0p2X0dldFNob3J0RmllbGQgKGpvYmplY3Qgb2JqLCBfSnZfRmll bGQqIGZpZWxkKQp7CiAgcmV0dXJuICogKGpzaG9ydCAqKSAoKGNoYXIqKSBvYmogKyBmaWVsZC0+ Z2V0T2Zmc2V0ICgpKTsKfQppbmxpbmUgamludApfSnZfR2V0SW50RmllbGQgKGpvYmplY3Qgb2Jq LCBfSnZfRmllbGQqIGZpZWxkKQp7CiAgcmV0dXJuICogKGppbnQgKikgKChjaGFyKikgb2JqICsg ZmllbGQtPmdldE9mZnNldCAoKSk7Cn0KaW5saW5lIGpsb25nCl9Kdl9HZXRMb25nRmllbGQgKGpv YmplY3Qgb2JqLCBfSnZfRmllbGQqIGZpZWxkKQp7CiAgcmV0dXJuICogKGpsb25nICopICgoY2hh ciopIG9iaiArIGZpZWxkLT5nZXRPZmZzZXQgKCkpOwp9CgpleHRlcm4gaW5saW5lIGpmaWVsZElE Cl9Kdl9Gcm9tUmVmbGVjdGVkRmllbGQgKGphdmE6Omxhbmc6OnJlZmxlY3Q6OkZpZWxkICpmaWVs ZCkKewogIHJldHVybiAoamZpZWxkSUQpICgoY2hhciAqKSBmaWVsZC0+ZGVjbGFyaW5nQ2xhc3Mt PmZpZWxkcyArIGZpZWxkLT5vZmZzZXQpOwp9CgoKCmV4dGVybiBpbmxpbmUgamZpZWxkSUQKSnZH ZXRGaXJzdEluc3RhbmNlRmllbGQgKGpjbGFzcyBrbGFzcykKewogIHJldHVybiAmKGtsYXNzLT5m aWVsZHNba2xhc3MtPnN0YXRpY19maWVsZF9jb3VudF0pOwp9CgpleHRlcm4gaW5saW5lIGppbnQK SnZOdW1JbnN0YW5jZUZpZWxkcyAoamNsYXNzIGtsYXNzKQp7CiAgcmV0dXJuIGtsYXNzLT5maWVs ZF9jb3VudCAtIGtsYXNzLT5zdGF0aWNfZmllbGRfY291bnQ7Cn0KCmV4dGVybiBpbmxpbmUgamZp ZWxkSUQKSnZHZXRGaXJzdFN0YXRpY0ZpZWxkIChqY2xhc3Mga2xhc3MpCnsKICByZXR1cm4gJihr bGFzcy0+ZmllbGRzWzBdKTsKfQoKZXh0ZXJuIGlubGluZSBqaW50Ckp2TnVtU3RhdGljRmllbGRz IChqY2xhc3Mga2xhc3MpCnsKICByZXR1cm4ga2xhc3MtPnN0YXRpY19maWVsZF9jb3VudDsKfQoK ZXh0ZXJuIGlubGluZSBqYm9vbGVhbgpKdkZpZWxkSXNSZWYgKGpmaWVsZElEIGZpZWxkKQp7CiAg cmV0dXJuIGZpZWxkLT5pc1JlZiAoKSAmJiBmaWVsZC0+dHlwZSAhPSAmZ251OjpnY2o6OlJhd0Rh dGE6OmNsYXNzJDsKfQoKZXh0ZXJuIGlubGluZSBqb2JqZWN0Ckp2R2V0T2JqZWN0RmllbGQgKGpv YmplY3Qgb2JqLCBfSnZfRmllbGQqIGZpZWxkKQp7CiAgcmV0dXJuIF9Kdl9HZXRPYmplY3RGaWVs ZCAob2JqLCBmaWVsZCk7Cn0KIyAzMiAiLi4vLi4vLi4vZ2NjL2xpYmphdmEvaW5jbHVkZS9qdm0u aCIgMgoKCnN0cnVjdCBfSnZfVlRhYmxlCnsKCgoKICB0eXBlZGVmIHZvaWQgKnZ0YWJsZV9lbHQ7 CgogIGpjbGFzcyBjbGFzOwogIHZvaWQgKmdjX2Rlc2NyOwoKCgogIHZ0YWJsZV9lbHQgbWV0aG9k WzFdOwojIDYwICIuLi8uLi8uLi9nY2MvbGliamF2YS9pbmNsdWRlL2p2bS5oIgogIHZvaWQgKmdl dF9tZXRob2QoaW50IGkpIHsgcmV0dXJuIG1ldGhvZFtpXTsgfQogIHZvaWQgc2V0X21ldGhvZChp bnQgaSwgdm9pZCAqZnB0cikgeyBtZXRob2RbaV0gPSBmcHRyOyB9CiAgdm9pZCAqZ2V0X2ZpbmFs aXplcigpIHsgcmV0dXJuIGdldF9tZXRob2QoMCk7IH0KCgogIHN0YXRpYyBzaXplX3QgdnRhYmxl X2VsdF9zaXplKCkgeyByZXR1cm4gc2l6ZW9mKHZ0YWJsZV9lbHQpOyB9CgoKICBzdGF0aWMgamlu dCBpZHhfdG9fb2Zmc2V0IChpbnQgaW5kZXgpCiAgewogICAgcmV0dXJuICgyICogc2l6ZW9mICh2 b2lkICopKSArIChpbmRleCAqIHZ0YWJsZV9lbHRfc2l6ZSAoKSk7CiAgfQogIHN0YXRpYyBfSnZf VlRhYmxlICpuZXdfdnRhYmxlIChpbnQgY291bnQpOwp9OwoKCgoKCgpzdHJ1Y3QgX0p2X0FycmF5 VlRhYmxlIDogcHVibGljIF9Kdl9WVGFibGUKewogIHZ0YWJsZV9lbHQgZXh0cmFfbWV0aG9kWzUg LSAxXTsKfTsKCnVuaW9uIF9Kdl93b3JkCnsKICBqb2JqZWN0IG87CiAgamludCBpOwogIGpmbG9h dCBmOwogIGppbnQgaWFbMV07CiAgdm9pZCogcDsKIyAxMDAgIi4uLy4uLy4uL2djYy9saWJqYXZh L2luY2x1ZGUvanZtLmgiCiAgamNsYXNzIGNsYXp6OwogIGpzdHJpbmcgc3RyaW5nOwogIHN0cnVj dCBfSnZfRmllbGQgKmZpZWxkOwogIHN0cnVjdCBfSnZfVXRmOENvbnN0ICp1dGY4OwogIHN0cnVj dCBfSnZfUmVzb2x2ZWRNZXRob2QgKnJtZXRob2Q7Cn07Cgp1bmlvbiBfSnZfd29yZDIKewogIGpp bnQgaWFbMl07CiAgamxvbmcgbDsKICBqZG91YmxlIGQ7Cn07CiMgMTI5ICIuLi8uLi8uLi9nY2Mv bGliamF2YS9pbmNsdWRlL2p2bS5oIgpleHRlcm4gaW50IF9Kdl9zdHJMZW5ndGhVdGY4KGNoYXIq IHN0ciwgaW50IGxlbik7Cgp0eXBlZGVmIHN0cnVjdCBfSnZfVXRmOENvbnN0IFV0ZjhDb25zdDsK X0p2X1V0ZjhDb25zdCAqX0p2X21ha2VVdGY4Q29uc3QgKGNoYXIgKnMsIGludCBsZW4pOwpfSnZf VXRmOENvbnN0ICpfSnZfbWFrZVV0ZjhDb25zdCAoanN0cmluZyBzdHJpbmcpOwpleHRlcm4gamJv b2xlYW4gX0p2X2VxdWFsVXRmOENvbnN0cyAoX0p2X1V0ZjhDb25zdCAqLCBfSnZfVXRmOENvbnN0 ICopOwpleHRlcm4gamJvb2xlYW4gX0p2X2VxdWFsIChfSnZfVXRmOENvbnN0ICosIGpzdHJpbmcs IGppbnQpOwpleHRlcm4gamJvb2xlYW4gX0p2X2VxdWFsbiAoX0p2X1V0ZjhDb25zdCAqLCBqc3Ry aW5nLCBqaW50KTsKCgoKCm5hbWVzcGFjZSBnY2oKewoKICBleHRlcm4gX0p2X1V0ZjhDb25zdCAq dm9pZF9zaWduYXR1cmU7CiAgZXh0ZXJuIF9Kdl9VdGY4Q29uc3QgKmNsaW5pdF9uYW1lOwogIGV4 dGVybiBfSnZfVXRmOENvbnN0ICppbml0X25hbWU7CiAgZXh0ZXJuIF9Kdl9VdGY4Q29uc3QgKmZp bml0X25hbWU7CgoKICBleHRlcm4gYm9vbCBydW50aW1lSW5pdGlhbGl6ZWQ7Cn07CgoKdHlwZWRl ZiB2b2lkIF9Kdl9GaW5hbGl6ZXJGdW5jIChqb2JqZWN0KTsKCgp2b2lkICpfSnZfQWxsb2NPYmog KGpzaXplIHNpemUsIGpjbGFzcyBjbCkgX19hdHRyaWJ1dGVfXygoX19tYWxsb2NfXykpOwoKCnZv aWQgKl9Kdl9BbGxvY1B0ckZyZWVPYmogKGpzaXplIHNpemUsIGpjbGFzcyBjbCkgX19hdHRyaWJ1 dGVfXygoX19tYWxsb2NfXykpOwoKdm9pZCAqX0p2X0FsbG9jQXJyYXkgKGpzaXplIHNpemUsIGpj bGFzcyBjbCkgX19hdHRyaWJ1dGVfXygoX19tYWxsb2NfXykpOwoKdm9pZCAqX0p2X0FsbG9jQnl0 ZXMgKGpzaXplIHNpemUpIF9fYXR0cmlidXRlX18oKF9fbWFsbG9jX18pKTsKCgp2b2lkICpfSnZf QWxsb2NSYXdPYmogKGpzaXplIHNpemUpIF9fYXR0cmlidXRlX18oKF9fbWFsbG9jX18pKTsKCnZv aWQgX0p2X1Rocm93Tm9NZW1vcnkoKSBfX2F0dHJpYnV0ZV9fKChfX25vcmV0dXJuX18pKTsKCgp2 b2lkICpfSnZfQWxsb2NUcmFjZU9uZSAoanNpemUgc2l6ZSApOwoKdm9pZCAqX0p2X0FsbG9jVHJh Y2VUd28gKGpzaXplIHNpemUgKTsKCnZvaWQgX0p2X0luaXRHQyAodm9pZCk7Cgp2b2lkIF9Kdl9S ZWdpc3RlckZpbmFsaXplciAodm9pZCAqb2JqZWN0LCBfSnZfRmluYWxpemVyRnVuYyAqbWV0aG9k KTsKCnZvaWQgKiBfSnZfQnVpbGRHQ0Rlc2NyKGpjbGFzcyk7CgoKCnZvaWQgKl9Kdl9NYWxsb2NV bmNoZWNrZWQgKGpzaXplIHNpemUpIF9fYXR0cmlidXRlX18oKF9fbWFsbG9jX18pKTsKCgoKdm9p ZCBfSnZfR0NJbml0aWFsaXplRmluYWxpemVycyAodm9pZCAoKm5vdGlmaWVyKSAodm9pZCkpOwoK dm9pZCBfSnZfUnVuRmluYWxpemVycyAodm9pZCk7Cgp2b2lkIF9Kdl9SdW5BbGxGaW5hbGl6ZXJz ICh2b2lkKTsKCnZvaWQgX0p2X1J1bkdDICh2b2lkKTsKCnZvaWQgX0p2X0Rpc2FibGVHQyAodm9p ZCk7CnZvaWQgX0p2X0VuYWJsZUdDICh2b2lkKTsKCgoKdm9pZCBfSnZfR0NSZWdpc3RlckRpc2Fw cGVhcmluZ0xpbmsgKGpvYmplY3QgKm9ianApOwoKCmpib29sZWFuIF9Kdl9HQ0NhblJlY2xhaW1T b2Z0UmVmZXJlbmNlIChqb2JqZWN0IG9iaik7CgoKbG9uZyBfSnZfR0NUb3RhbE1lbW9yeSAodm9p ZCk7Cgpsb25nIF9Kdl9HQ0ZyZWVNZW1vcnkgKHZvaWQpOwoKCgp2b2lkIF9Kdl9HQ1NldEluaXRp YWxIZWFwU2l6ZSAoc2l6ZV90IHNpemUpOwoKCgp2b2lkIF9Kdl9HQ1NldE1heGltdW1IZWFwU2l6 ZSAoc2l6ZV90IHNpemUpOwoKCgoKdm9pZCBfSnZfU2V0SW5pdGlhbEhlYXBTaXplIChjb25zdCBj aGFyICphcmcpOwoKCgoKdm9pZCBfSnZfU2V0TWF4aW11bUhlYXBTaXplIChjb25zdCBjaGFyICph cmcpOwoKZXh0ZXJuICJDIiB2b2lkIEp2UnVuTWFpbiAoamNsYXNzIGtsYXNzLCBpbnQgYXJnYywg Y29uc3QgY2hhciAqKmFyZ3YpOwp2b2lkIF9Kdl9SdW5NYWluIChqY2xhc3Mga2xhc3MsIGNvbnN0 IGNoYXIgKm5hbWUsIGludCBhcmdjLCBjb25zdCBjaGFyICoqYXJndiwKICAgICAgICAgICAgICAg ICAgYm9vbCBpc19qYXIpOwoKCgoKCgppbmxpbmUgX0p2X1ZUYWJsZSAqCl9Kdl9WVGFibGU6Om5l d192dGFibGUgKGludCBjb3VudCkKewogIHNpemVfdCBzaXplID0gc2l6ZW9mKF9Kdl9WVGFibGUp ICsgKGNvdW50IC0gMSkgKiB2dGFibGVfZWx0X3NpemUgKCk7CiAgcmV0dXJuIChfSnZfVlRhYmxl ICopIF9Kdl9BbGxvY0J5dGVzIChzaXplKTsKfQoKCmlubGluZSBqaW50Cl9Kdl9IYXNoQ29kZSAo am9iamVjdCBvYmopCnsKCgoKICByZXR1cm4gKGppbnQpICgodW5zaWduZWQgbG9uZykgb2JqICUg MHg3ZmZmZmZmZik7Cn0KCgoKCgoKaW5saW5lIGNoYXIgKgpfSnZfR2V0QXJyYXlFbGVtZW50RnJv bUVsZW1lbnRUeXBlIChqb2JqZWN0IGFycmF5LAogICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICBqY2xhc3MgZWxlbWVudF90eXBlKQp7CiAgY2hhciAqZWx0czsKICBpZiAoZWxlbWVu dF90eXBlID09ICgmIF9Kdl9ieXRlQ2xhc3MpKQogICAgZWx0cyA9IChjaGFyICopIGVsZW1lbnRz ICgoamJ5dGVBcnJheSkgYXJyYXkpOwogIGVsc2UgaWYgKGVsZW1lbnRfdHlwZSA9PSAoJiBfSnZf c2hvcnRDbGFzcykpCiAgICBlbHRzID0gKGNoYXIgKikgZWxlbWVudHMgKChqc2hvcnRBcnJheSkg YXJyYXkpOwogIGVsc2UgaWYgKGVsZW1lbnRfdHlwZSA9PSAoJiBfSnZfaW50Q2xhc3MpKQogICAg ZWx0cyA9IChjaGFyICopIGVsZW1lbnRzICgoamludEFycmF5KSBhcnJheSk7CiAgZWxzZSBpZiAo ZWxlbWVudF90eXBlID09ICgmIF9Kdl9sb25nQ2xhc3MpKQogICAgZWx0cyA9IChjaGFyICopIGVs ZW1lbnRzICgoamxvbmdBcnJheSkgYXJyYXkpOwogIGVsc2UgaWYgKGVsZW1lbnRfdHlwZSA9PSAo JiBfSnZfYm9vbGVhbkNsYXNzKSkKICAgIGVsdHMgPSAoY2hhciAqKSBlbGVtZW50cyAoKGpib29s ZWFuQXJyYXkpIGFycmF5KTsKICBlbHNlIGlmIChlbGVtZW50X3R5cGUgPT0gKCYgX0p2X2NoYXJD bGFzcykpCiAgICBlbHRzID0gKGNoYXIgKikgZWxlbWVudHMgKChqY2hhckFycmF5KSBhcnJheSk7 CiAgZWxzZSBpZiAoZWxlbWVudF90eXBlID09ICgmIF9Kdl9mbG9hdENsYXNzKSkKICAgIGVsdHMg PSAoY2hhciAqKSBlbGVtZW50cyAoKGpmbG9hdEFycmF5KSBhcnJheSk7CiAgZWxzZSBpZiAoZWxl bWVudF90eXBlID09ICgmIF9Kdl9kb3VibGVDbGFzcykpCiAgICBlbHRzID0gKGNoYXIgKikgZWxl bWVudHMgKChqZG91YmxlQXJyYXkpIGFycmF5KTsKICBlbHNlCiAgICBlbHRzID0gKGNoYXIgKikg ZWxlbWVudHMgKChqb2JqZWN0QXJyYXkpIGFycmF5KTsKICByZXR1cm4gZWx0czsKfQoKZXh0ZXJu ICJDIiB2b2lkIF9Kdl9UaHJvd0JhZEFycmF5SW5kZXggKGppbnQgYmFkX2luZGV4KTsKZXh0ZXJu ICJDIiB2b2lkIF9Kdl9UaHJvd051bGxQb2ludGVyRXhjZXB0aW9uICh2b2lkKTsKZXh0ZXJuICJD IiBqb2JqZWN0IF9Kdl9OZXdBcnJheSAoamludCB0eXBlLCBqaW50IHNpemUpCiAgX19hdHRyaWJ1 dGVfXygoX19tYWxsb2NfXykpOwpleHRlcm4gIkMiIGpvYmplY3QgX0p2X05ld011bHRpQXJyYXkg KGpjbGFzcyBrbGFzcywgamludCBkaW1zLCAuLi4pCiAgX19hdHRyaWJ1dGVfXygoX19tYWxsb2Nf XykpOwpleHRlcm4gIkMiIHZvaWQgKl9Kdl9DaGVja0Nhc3QgKGpjbGFzcyBrbGFzcywgam9iamVj dCBvYmopOwpleHRlcm4gIkMiIHZvaWQgKl9Kdl9Mb29rdXBJbnRlcmZhY2VNZXRob2QgKGpjbGFz cyBrbGFzcywgVXRmOENvbnN0ICpuYW1lLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgVXRmOENvbnN0ICpzaWduYXR1cmUpOwpleHRlcm4gIkMiIHZvaWQgKl9Kdl9M b29rdXBJbnRlcmZhY2VNZXRob2RJZHggKGpjbGFzcyBrbGFzcywgamNsYXNzIGlmYWNlLAogICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBtZXRoX2lkeCk7 CmV4dGVybiAiQyIgdm9pZCBfSnZfQ2hlY2tBcnJheVN0b3JlIChqb2JqZWN0IGFycmF5LCBqb2Jq ZWN0IG9iaik7CmV4dGVybiAiQyIgdm9pZCBfSnZfUmVnaXN0ZXJDbGFzcyAoamNsYXNzIGtsYXNz KTsKZXh0ZXJuICJDIiB2b2lkIF9Kdl9SZWdpc3RlckNsYXNzZXMgKGpjbGFzcyAqY2xhc3Nlcyk7 CmV4dGVybiAiQyIgdm9pZCBfSnZfUmVnaXN0ZXJSZXNvdXJjZSAodm9pZCAqdnB0cik7CmV4dGVy biB2b2lkIF9Kdl9VbnJlZ2lzdGVyQ2xhc3MgKF9Kdl9VdGY4Q29uc3QqLCBqYXZhOjpsYW5nOjpD bGFzc0xvYWRlciopOwpleHRlcm4gdm9pZCBfSnZfUmVzb2x2ZUZpZWxkIChfSnZfRmllbGQgKiwg amF2YTo6bGFuZzo6Q2xhc3NMb2FkZXIqKTsKCmV4dGVybiBqY2xhc3MgX0p2X0ZpbmRDbGFzcyAo X0p2X1V0ZjhDb25zdCAqbmFtZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqYXZhOjps YW5nOjpDbGFzc0xvYWRlciAqbG9hZGVyKTsKZXh0ZXJuIGpjbGFzcyBfSnZfRmluZENsYXNzRnJv bVNpZ25hdHVyZSAoY2hhciAqLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICBqYXZhOjpsYW5nOjpDbGFzc0xvYWRlciAqbG9hZGVyKTsKZXh0ZXJuIHZvaWQgX0p2X0dl dFR5cGVzRnJvbVNpZ25hdHVyZSAoam1ldGhvZElEIG1ldGhvZCwKICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgamNsYXNzIGRlY2xhcmluZ0NsYXNzLAogICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICBKQXJyYXk8amNsYXNzPiAqKmFyZ190eXBlc19vdXQs CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGpjbGFzcyAqcmV0dXJuX3R5 cGVfb3V0KTsKCmV4dGVybiBqb2JqZWN0IF9Kdl9DYWxsQW55TWV0aG9kQSAoam9iamVjdCBvYmos IGpjbGFzcyByZXR1cm5fdHlwZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBq bWV0aG9kSUQgbWV0aCwgamJvb2xlYW4gaXNfY29uc3RydWN0b3IsCiAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgSkFycmF5PGpjbGFzcz4gKnBhcmFtZXRlcl90eXBlcywKICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqb2JqZWN0QXJyYXkgYXJncyk7Cgp1bmlvbiBq dmFsdWU7CmV4dGVybiBqdGhyb3dhYmxlIF9Kdl9DYWxsQW55TWV0aG9kQSAoam9iamVjdCBvYmos CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgamNsYXNzIHJldHVybl90eXBl LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGptZXRob2RJRCBtZXRoLAog ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGpib29sZWFuIGlzX2NvbnN0cnVj dG9yLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEpBcnJheTxqY2xhc3M+ ICpwYXJhbWV0ZXJfdHlwZXMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg anZhbHVlICphcmdzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGp2YWx1 ZSAqcmVzdWx0KTsKCmV4dGVybiBqb2JqZWN0IF9Kdl9OZXdNdWx0aUFycmF5IChqY2xhc3MsIGpp bnQgbmRpbXMsIGppbnQqIGRpbXMpCiAgX19hdHRyaWJ1dGVfXygoX19tYWxsb2NfXykpOwoKCmV4 dGVybiAiQyIKewogIGppbnQgX0p2X2RpdkkgKGppbnQsIGppbnQpOwogIGppbnQgX0p2X3JlbUkg KGppbnQsIGppbnQpOwogIGpsb25nIF9Kdl9kaXZKIChqbG9uZywgamxvbmcpOwogIGpsb25nIF9K dl9yZW1KIChqbG9uZywgamxvbmcpOwp9CgoKZXh0ZXJuIGNoYXIgKl9Kdl9UaGlzRXhlY3V0YWJs ZSAodm9pZCk7CmV4dGVybiB2b2lkIF9Kdl9UaGlzRXhlY3V0YWJsZSAoY29uc3QgY2hhciAqKTsK Cgp2b2lkICpfSnZfRmluZFN5bWJvbEluRXhlY3V0YWJsZSAoY29uc3QgY2hhciAqKTsKCgpleHRl cm4gdm9pZCBfSnZfSk5JX0luaXQgKHZvaWQpOwoKCl9Kdl9KTklFbnYgKl9Kdl9HZXRDdXJyZW50 Sk5JRW52ICgpOwp2b2lkIF9Kdl9TZXRDdXJyZW50Sk5JRW52IChfSnZfSk5JRW52ICopOwoKc3Ry dWN0IF9Kdl9KYXZhVk07Cl9Kdl9KYXZhVk0gKl9Kdl9HZXRKYXZhVk0gKCk7CgoKYm9vbCBfSnZf VmVyaWZ5RmllbGRTaWduYXR1cmUgKF9Kdl9VdGY4Q29uc3Qqc2lnKTsKYm9vbCBfSnZfVmVyaWZ5 TWV0aG9kU2lnbmF0dXJlIChfSnZfVXRmOENvbnN0KnNpZyk7CmJvb2wgX0p2X1ZlcmlmeUNsYXNz TmFtZSAodW5zaWduZWQgY2hhciogcHRyLCBfSnZfdXNob3J0IGxlbmd0aCk7CmJvb2wgX0p2X1Zl cmlmeUNsYXNzTmFtZSAoX0p2X1V0ZjhDb25zdCAqbmFtZSk7CmJvb2wgX0p2X1ZlcmlmeUlkZW50 aWZpZXIgKF9Kdl9VdGY4Q29uc3QgKik7CmJvb2wgX0p2X0NsYXNzTmFtZVNhbWVQYWNrYWdlIChf SnZfVXRmOENvbnN0ICpuYW1lMSwgX0p2X1V0ZjhDb25zdCAqbmFtZTIpOwoKCgojIDEgIi4uLy4u Ly4uL2djYy9saWJqYXZhL2luY2x1ZGUvanZtcGkuaCIgMQojIDE3ICIuLi8uLi8uLi9nY2MvbGli amF2YS9pbmNsdWRlL2p2bXBpLmgiCiMgMSAiLi4vLi4vLi4vZ2NjL2xpYmphdmEvaW5jbHVkZS9q bmkuaCIgMQojIDE3ICIuLi8uLi8uLi9nY2MvbGliamF2YS9pbmNsdWRlL2puaS5oIgojIDEgImdj ai9saWJnY2otY29uZmlnLmgiIDEKIyAxOCAiLi4vLi4vLi4vZ2NjL2xpYmphdmEvaW5jbHVkZS9q bmkuaCIgMgoKIyAxICIveDEvZWdjcy9idWlsZC9nY2MvaW5jbHVkZS9zdGRhcmcuaCIgMSAzCiMg NDMgIi94MS9lZ2NzL2J1aWxkL2djYy9pbmNsdWRlL3N0ZGFyZy5oIiAzCnR5cGVkZWYgX19idWls dGluX3ZhX2xpc3QgX19nbnVjX3ZhX2xpc3Q7CiMgMTEwICIveDEvZWdjcy9idWlsZC9nY2MvaW5j bHVkZS9zdGRhcmcuaCIgMwp0eXBlZGVmIF9fZ251Y192YV9saXN0IHZhX2xpc3Q7CiMgMjAgIi4u Ly4uLy4uL2djYy9saWJqYXZhL2luY2x1ZGUvam5pLmgiIDIKIyAyOSAiLi4vLi4vLi4vZ2NjL2xp YmphdmEvaW5jbHVkZS9qbmkuaCIKIyAxICJnbnUvZ2NqL3J1bnRpbWUvSk5JV2Vha1JlZi5oIiAx CgoKCgoKI3ByYWdtYSBpbnRlcmZhY2UKCiMgMSAiamF2YS9sYW5nL3JlZi9XZWFrUmVmZXJlbmNl LmgiIDEKCgoKCgojcHJhZ21hIGludGVyZmFjZQoKIyAxICJqYXZhL2xhbmcvcmVmL1JlZmVyZW5j ZS5oIiAxCgoKCgoKI3ByYWdtYSBpbnRlcmZhY2UKCgoKZXh0ZXJuICJKYXZhIgp7CiAgbmFtZXNw YWNlIGdudQogIHsKICAgIG5hbWVzcGFjZSBnY2oKICAgIHsKICAgICAgY2xhc3MgUmF3RGF0YTsK ICAgIH0KICB9Cn07CgpjbGFzcyA6OmphdmE6Omxhbmc6OnJlZjo6UmVmZXJlbmNlIDogcHVibGlj IDo6amF2YTo6bGFuZzo6T2JqZWN0CnsKcHVibGljOgogIFJlZmVyZW5jZSAoOjpqYXZhOjpsYW5n OjpPYmplY3QgKik7CiAgUmVmZXJlbmNlICg6OmphdmE6Omxhbmc6Ok9iamVjdCAqLCA6OmphdmE6 Omxhbmc6OnJlZjo6UmVmZXJlbmNlUXVldWUgKik7CnByaXZhdGU6CiAgdm9pZCBjcmVhdGUgKDo6 amF2YTo6bGFuZzo6T2JqZWN0ICopOwpwdWJsaWM6CiAgdmlydHVhbCA6OmphdmE6Omxhbmc6Ok9i amVjdCAqZ2V0ICgpOwogIHZpcnR1YWwgdm9pZCBjbGVhciAoKTsKICB2aXJ0dWFsIGpib29sZWFu IGlzRW5xdWV1ZWQgKCk7CiAgdmlydHVhbCBqYm9vbGVhbiBlbnF1ZXVlICgpOwpwdWJsaWM6CiAg OjpnbnU6Omdjajo6UmF3RGF0YSAqcmVmZXJlbnQ7CiAgOjpnbnU6Omdjajo6UmF3RGF0YSAqY29w eTsKICA6OmphdmE6Omxhbmc6OnJlZjo6UmVmZXJlbmNlUXVldWUgKnF1ZXVlOwogIDo6amF2YTo6 bGFuZzo6cmVmOjpSZWZlcmVuY2UgKm5leHRPblF1ZXVlOwogIHN0YXRpYyA6OmphdmE6Omxhbmc6 Ok9iamVjdCAqbG9jazsKcHVibGljOgoKICBzdGF0aWMgOjpqYXZhOjpsYW5nOjpDbGFzcyBjbGFz cyQ7Cn07CiMgOSAiamF2YS9sYW5nL3JlZi9XZWFrUmVmZXJlbmNlLmgiIDIKCmNsYXNzIDo6amF2 YTo6bGFuZzo6cmVmOjpXZWFrUmVmZXJlbmNlIDogcHVibGljIDo6amF2YTo6bGFuZzo6cmVmOjpS ZWZlcmVuY2UKewpwdWJsaWM6CiAgV2Vha1JlZmVyZW5jZSAoOjpqYXZhOjpsYW5nOjpPYmplY3Qg Kik7CiAgV2Vha1JlZmVyZW5jZSAoOjpqYXZhOjpsYW5nOjpPYmplY3QgKiwgOjpqYXZhOjpsYW5n OjpyZWY6OlJlZmVyZW5jZVF1ZXVlICopOwoKICBzdGF0aWMgOjpqYXZhOjpsYW5nOjpDbGFzcyBj bGFzcyQ7Cn07CiMgOSAiZ251L2djai9ydW50aW1lL0pOSVdlYWtSZWYuaCIgMgoKZXh0ZXJuICJK YXZhIgp7CiAgbmFtZXNwYWNlIGdudQogIHsKICAgIG5hbWVzcGFjZSBnY2oKICAgIHsKICAgICAg bmFtZXNwYWNlIHJ1bnRpbWUKICAgICAgewogICAgICAgIGNsYXNzIEpOSVdlYWtSZWY7CiAgICAg IH0KICAgIH0KICB9Cn07CgpjbGFzcyA6OmdudTo6Z2NqOjpydW50aW1lOjpKTklXZWFrUmVmIDog cHVibGljIDo6amF2YTo6bGFuZzo6cmVmOjpXZWFrUmVmZXJlbmNlCnsKcHVibGljOgogIEpOSVdl YWtSZWYgKDo6amF2YTo6bGFuZzo6T2JqZWN0ICopOwoKICBzdGF0aWMgOjpqYXZhOjpsYW5nOjpD bGFzcyBjbGFzcyQ7Cn07CiMgMzAgIi4uLy4uLy4uL2djYy9saWJqYXZhL2luY2x1ZGUvam5pLmgi IDIKCnR5cGVkZWYgZ251OjpnY2o6OnJ1bnRpbWU6OkpOSVdlYWtSZWYgKmp3ZWFrOwoKdHlwZWRl ZiBzdHJ1Y3QgX0p2X0pOSUVudiBKTklFbnY7CnR5cGVkZWYgc3RydWN0IF9Kdl9KYXZhVk0gSmF2 YVZNOwojIDE3MyAiLi4vLi4vLi4vZ2NjL2xpYmphdmEvaW5jbHVkZS9qbmkuaCIKZXh0ZXJuICJD Igp7CgoKCgpleHRlcm4gamludCBKTklfT25Mb2FkIChKYXZhVk0gKiwgdm9pZCAqKTsKZXh0ZXJu IHZvaWQgSk5JX09uVW5sb2FkIChKYXZhVk0gKiwgdm9pZCAqKTsKCgoKZXh0ZXJuIGppbnQgSk5J X0dldERlZmF1bHRKYXZhVk1Jbml0QXJncyAodm9pZCAqKTsKZXh0ZXJuIGppbnQgSk5JX0NyZWF0 ZUphdmFWTSAoSmF2YVZNICoqLCB2b2lkICoqLCB2b2lkICopOwpleHRlcm4gamludCBKTklfR2V0 Q3JlYXRlZEphdmFWTXMoSmF2YVZNICoqLCBqc2l6ZSwganNpemUgKik7CgoKfTsKCgp0eXBlZGVm IHVuaW9uIGp2YWx1ZQp7CiAgamJvb2xlYW4gejsKICBqYnl0ZSBiOwogIGpjaGFyIGM7CiAganNo b3J0IHM7CiAgamludCBpOwogIGpsb25nIGo7CiAgamZsb2F0IGY7CiAgamRvdWJsZSBkOwogIGpv YmplY3QgbDsKfSBqdmFsdWU7CgoKdHlwZWRlZiB2b2lkICogKCpfSnZfZnVuYykgKC4uLik7CgoK CgoKdHlwZWRlZiBzdHJ1Y3QKewogIGNoYXIgKm5hbWU7CiAgY2hhciAqc2lnbmF0dXJlOwogIHZv aWQgKmZuUHRyOwp9IEpOSU5hdGl2ZU1ldGhvZDsKCnN0cnVjdCBKTklOYXRpdmVJbnRlcmZhY2UK ewogIF9Kdl9mdW5jIHJlc2VydmVkMDsKICBfSnZfZnVuYyByZXNlcnZlZDE7CiAgX0p2X2Z1bmMg cmVzZXJ2ZWQyOwogIF9Kdl9mdW5jIHJlc2VydmVkMzsKCiAgamludCAoKkdldFZlcnNpb24pIChK TklFbnYgKik7CiAgamNsYXNzICgqRGVmaW5lQ2xhc3MpIChKTklFbnYgKiwgam9iamVjdCwKICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBqYnl0ZSAqLCBq c2l6ZSk7CiAgamNsYXNzICgqRmluZENsYXNzKSAoSk5JRW52ICosIGNvbnN0IGNoYXIgKik7Cgog IGptZXRob2RJRCAoKkZyb21SZWZsZWN0ZWRNZXRob2QpIChKTklFbnYgKiwgam9iamVjdCk7CiAg amZpZWxkSUQgKCpGcm9tUmVmbGVjdGVkRmllbGQpIChKTklFbnYgKiwgam9iamVjdCk7CiAgam9i amVjdCAoKlRvUmVmbGVjdGVkTWV0aG9kKSAoSk5JRW52ICosIGpjbGFzcywgam1ldGhvZElELAog ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGpib29sZWFuKTsKCiAg amNsYXNzICgqR2V0U3VwZXJjbGFzcykgKEpOSUVudiAqLCBqY2xhc3MpOwogIGpib29sZWFuICgq SXNBc3NpZ25hYmxlRnJvbSkgKEpOSUVudiAqLCBqY2xhc3MsIGpjbGFzcyk7CgogIGpvYmplY3Qg KCpUb1JlZmxlY3RlZEZpZWxkKSAoSk5JRW52ICosIGpjbGFzcywgamZpZWxkSUQsCiAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgamJvb2xlYW4pOwoKICBqaW50ICgq VGhyb3cpIChKTklFbnYgKiwganRocm93YWJsZSk7CiAgamludCAoKlRocm93TmV3KSAoSk5JRW52 ICosIGpjbGFzcywgY29uc3QgY2hhciAqKTsKICBqdGhyb3dhYmxlICgqRXhjZXB0aW9uT2NjdXJy ZWQpIChKTklFbnYgKik7CiAgdm9pZCAoKkV4Y2VwdGlvbkRlc2NyaWJlKSAoSk5JRW52ICopOwog IHZvaWQgKCpFeGNlcHRpb25DbGVhcikgKEpOSUVudiAqKTsKICB2b2lkICgqRmF0YWxFcnJvcikg KEpOSUVudiAqLCBjb25zdCBjaGFyICopOwoKICBqaW50ICgqUHVzaExvY2FsRnJhbWUpIChKTklF bnYgKiwgamludCk7CiAgam9iamVjdCAoKlBvcExvY2FsRnJhbWUpIChKTklFbnYgKiwgam9iamVj dCk7CgogIGpvYmplY3QgKCpOZXdHbG9iYWxSZWYpIChKTklFbnYgKiwgam9iamVjdCk7CiAgdm9p ZCAoKkRlbGV0ZUdsb2JhbFJlZikgKEpOSUVudiAqLCBqb2JqZWN0KTsKICB2b2lkICgqRGVsZXRl TG9jYWxSZWYpIChKTklFbnYgKiwgam9iamVjdCk7CiAgamJvb2xlYW4gKCpJc1NhbWVPYmplY3Qp IChKTklFbnYgKiwgam9iamVjdCwgam9iamVjdCk7CgogIGpvYmplY3QgKCpOZXdMb2NhbFJlZikg KEpOSUVudiAqLCBqb2JqZWN0KTsKICBqaW50ICgqRW5zdXJlTG9jYWxDYXBhY2l0eSkgKEpOSUVu diAqLCBqaW50KTsKCiAgam9iamVjdCAoKkFsbG9jT2JqZWN0KSAoSk5JRW52ICosIGpjbGFzcyk7 CiAgam9iamVjdCAoKk5ld09iamVjdCkgKEpOSUVudiAqLCBqY2xhc3MsIGptZXRob2RJRCwgLi4u KTsKICBqb2JqZWN0ICgqTmV3T2JqZWN0VikgKEpOSUVudiAqLCBqY2xhc3MsIGptZXRob2RJRCwK ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YV9saXN0KTsKICBq b2JqZWN0ICgqTmV3T2JqZWN0QSkgKEpOSUVudiAqLCBqY2xhc3MsIGptZXRob2RJRCwKICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqdmFsdWUgKik7CgogIGpjbGFz cyAoKkdldE9iamVjdENsYXNzKSAoSk5JRW52ICosIGpvYmplY3QpOwogIGpib29sZWFuICgqSXNJ bnN0YW5jZU9mKSAoSk5JRW52ICosIGpvYmplY3QsIGpjbGFzcyk7CiAgam1ldGhvZElEICgqR2V0 TWV0aG9kSUQpIChKTklFbnYgKiwgamNsYXNzLCBjb25zdCBjaGFyICosCiAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqKTsKCiAgam9iamVjdCAo KkNhbGxPYmplY3RNZXRob2QpIChKTklFbnYgKiwgam9iamVjdCwgam1ldGhvZElELAogICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC4uLik7CiAgam9iamVjdCAoKkNh bGxPYmplY3RNZXRob2RWKSAoSk5JRW52ICosIGpvYmplY3QsIGptZXRob2RJRCwKICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YV9saXN0KTsKICBqb2JqZWN0ICgq Q2FsbE9iamVjdE1ldGhvZEEpIChKTklFbnYgKiwgam9iamVjdCwgam1ldGhvZElELAogICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGp2YWx1ZSAqKTsKICBqYm9vbGVh biAoKkNhbGxCb29sZWFuTWV0aG9kKSAoSk5JRW52ICosIGpvYmplY3QsIGptZXRob2RJRCwKICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuLi4pOwogIGpib29sZWFu ICgqQ2FsbEJvb2xlYW5NZXRob2RWKSAoSk5JRW52ICosIGpvYmplY3QsIGptZXRob2RJRCwKICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YV9saXN0KTsKICBqYm9v bGVhbiAoKkNhbGxCb29sZWFuTWV0aG9kQSkgKEpOSUVudiAqLCBqb2JqZWN0LCBqbWV0aG9kSUQs CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAganZhbHVlICopOwog IGpieXRlICgqQ2FsbEJ5dGVNZXRob2QpIChKTklFbnYgKiwgam9iamVjdCwgam1ldGhvZElELAog ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC4uLik7CiAgamJ5dGUg KCpDYWxsQnl0ZU1ldGhvZFYpIChKTklFbnYgKiwgam9iamVjdCwgam1ldGhvZElELAogICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhX2xpc3QpOwogIGpieXRlICgq Q2FsbEJ5dGVNZXRob2RBKSAoSk5JRW52ICosIGpvYmplY3QsIGptZXRob2RJRCwKICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqdmFsdWUgKik7CiAgamNoYXIgKCpD YWxsQ2hhck1ldGhvZCkgKEpOSUVudiAqLCBqb2JqZWN0LCBqbWV0aG9kSUQsCiAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLi4uKTsKICBqY2hhciAoKkNhbGxDaGFy TWV0aG9kVikgKEpOSUVudiAqLCBqb2JqZWN0LCBqbWV0aG9kSUQsCiAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFfbGlzdCk7CiAgamNoYXIgKCpDYWxsQ2hhck1l dGhvZEEpIChKTklFbnYgKiwgam9iamVjdCwgam1ldGhvZElELAogICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgIGp2YWx1ZSAqKTsKICBqc2hvcnQgKCpDYWxsU2hvcnRN ZXRob2QpIChKTklFbnYgKiwgam9iamVjdCwgam1ldGhvZElELAogICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgIC4uLik7CiAganNob3J0ICgqQ2FsbFNob3J0TWV0aG9k VikgKEpOSUVudiAqLCBqb2JqZWN0LCBqbWV0aG9kSUQsCiAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgdmFfbGlzdCk7CiAganNob3J0ICgqQ2FsbFNob3J0TWV0aG9k QSkgKEpOSUVudiAqLCBqb2JqZWN0LCBqbWV0aG9kSUQsCiAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAganZhbHVlICopOwogIGppbnQgKCpDYWxsSW50TWV0aG9kKSAo Sk5JRW52ICosIGpvYmplY3QsIGptZXRob2RJRCwKICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAuLi4pOwogIGppbnQgKCpDYWxsSW50TWV0aG9kVikgKEpOSUVudiAq LCBqb2JqZWN0LCBqbWV0aG9kSUQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgdmFfbGlzdCk7CiAgamludCAoKkNhbGxJbnRNZXRob2RBKSAoSk5JRW52ICosIGpv YmplY3QsIGptZXRob2RJRCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICBqdmFsdWUgKik7CiAgamxvbmcgKCpDYWxsTG9uZ01ldGhvZCkgKEpOSUVudiAqLCBqb2Jq ZWN0LCBqbWV0aG9kSUQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgLi4uKTsKICBqbG9uZyAoKkNhbGxMb25nTWV0aG9kVikgKEpOSUVudiAqLCBqb2JqZWN0LCBq bWV0aG9kSUQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFf bGlzdCk7CiAgamxvbmcgKCpDYWxsTG9uZ01ldGhvZEEpIChKTklFbnYgKiwgam9iamVjdCwgam1l dGhvZElELAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGp2YWx1 ZSAqKTsKICBqZmxvYXQgKCpDYWxsRmxvYXRNZXRob2QpIChKTklFbnYgKiwgam9iamVjdCwgam1l dGhvZElELAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC4uLik7 CiAgamZsb2F0ICgqQ2FsbEZsb2F0TWV0aG9kVikgKEpOSUVudiAqLCBqb2JqZWN0LCBqbWV0aG9k SUQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFfbGlzdCk7 CiAgamZsb2F0ICgqQ2FsbEZsb2F0TWV0aG9kQSkgKEpOSUVudiAqLCBqb2JqZWN0LCBqbWV0aG9k SUQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAganZhbHVlICop OwogIGpkb3VibGUgKCpDYWxsRG91YmxlTWV0aG9kKSAoSk5JRW52ICosIGpvYmplY3QsIGptZXRo b2RJRCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuLi4pOwog IGpkb3VibGUgKCpDYWxsRG91YmxlTWV0aG9kVikgKEpOSUVudiAqLCBqb2JqZWN0LCBqbWV0aG9k SUQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFfbGlzdCk7 CiAgamRvdWJsZSAoKkNhbGxEb3VibGVNZXRob2RBKSAoSk5JRW52ICosIGpvYmplY3QsIGptZXRo b2RJRCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqdmFsdWUg Kik7CiAgdm9pZCAoKkNhbGxWb2lkTWV0aG9kKSAoSk5JRW52ICosIGpvYmplY3QsIGptZXRob2RJ RCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuLi4pOwogIHZv aWQgKCpDYWxsVm9pZE1ldGhvZFYpIChKTklFbnYgKiwgam9iamVjdCwgam1ldGhvZElELAogICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhX2xpc3QpOwogIHZvaWQg KCpDYWxsVm9pZE1ldGhvZEEpIChKTklFbnYgKiwgam9iamVjdCwgam1ldGhvZElELAogICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGp2YWx1ZSAqKTsKCiAgam9iamVj dCAoKkNhbGxOb252aXJ0dWFsT2JqZWN0TWV0aG9kKSAoSk5JRW52ICosIGpvYmplY3QsIGpjbGFz cywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqbWV0aG9kSUQs IC4uLik7CiAgam9iamVjdCAoKkNhbGxOb252aXJ0dWFsT2JqZWN0TWV0aG9kVikgKEpOSUVudiAq LCBqb2JqZWN0LCBqY2xhc3MsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgam1ldGhvZElELCB2YV9saXN0KTsKICBqb2JqZWN0ICgqQ2FsbE5vbnZpcnR1YWxPYmpl Y3RNZXRob2RBKSAoSk5JRW52ICosIGpvYmplY3QsIGpjbGFzcywKICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICBqbWV0aG9kSUQsIGp2YWx1ZSAqKTsKICBqYm9vbGVh biAoKkNhbGxOb252aXJ0dWFsQm9vbGVhbk1ldGhvZCkgKEpOSUVudiAqLCBqb2JqZWN0LCBqY2xh c3MsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgam1ldGhvZElE LCAuLi4pOwogIGpib29sZWFuICgqQ2FsbE5vbnZpcnR1YWxCb29sZWFuTWV0aG9kVikgKEpOSUVu diAqLCBqb2JqZWN0LCBqY2xhc3MsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgIGptZXRob2RJRCwgdmFfbGlzdCk7CiAgamJvb2xlYW4gKCpDYWxsTm9udmlydHVh bEJvb2xlYW5NZXRob2RBKSAoSk5JRW52ICosIGpvYmplY3QsIGpjbGFzcywKICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgam1ldGhvZElELCBqdmFsdWUgKik7CiAg amJ5dGUgKCpDYWxsTm9udmlydHVhbEJ5dGVNZXRob2QpIChKTklFbnYgKiwgam9iamVjdCwgamNs YXNzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGptZXRob2RJ RCwgLi4uKTsKICBqYnl0ZSAoKkNhbGxOb252aXJ0dWFsQnl0ZU1ldGhvZFYpIChKTklFbnYgKiwg am9iamVjdCwgamNsYXNzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgIGptZXRob2RJRCwgdmFfbGlzdCk7CiAgamJ5dGUgKCpDYWxsTm9udmlydHVhbEJ5dGVNZXRo b2RBKSAoSk5JRW52ICosIGpvYmplY3QsIGpjbGFzcywKICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICBqbWV0aG9kSUQsIGp2YWx1ZSAqKTsKICBqY2hhciAoKkNhbGxO b252aXJ0dWFsQ2hhck1ldGhvZCkgKEpOSUVudiAqLCBqb2JqZWN0LCBqY2xhc3MsCiAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgam1ldGhvZElELCAuLi4pOwogIGpj aGFyICgqQ2FsbE5vbnZpcnR1YWxDaGFyTWV0aG9kVikgKEpOSUVudiAqLCBqb2JqZWN0LCBqY2xh c3MsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgam1ldGhvZElE LCB2YV9saXN0KTsKICBqY2hhciAoKkNhbGxOb252aXJ0dWFsQ2hhck1ldGhvZEEpIChKTklFbnYg Kiwgam9iamVjdCwgamNsYXNzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgIGptZXRob2RJRCwganZhbHVlICopOwogIGpzaG9ydCAoKkNhbGxOb252aXJ0dWFsU2hv cnRNZXRob2QpIChKTklFbnYgKiwgam9iamVjdCwgamNsYXNzLAogICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgIGptZXRob2RJRCwgLi4uKTsKICBqc2hvcnQgKCpDYWxs Tm9udmlydHVhbFNob3J0TWV0aG9kVikgKEpOSUVudiAqLCBqb2JqZWN0LCBqY2xhc3MsCiAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgam1ldGhvZElELCB2YV9saXN0 KTsKICBqc2hvcnQgKCpDYWxsTm9udmlydHVhbFNob3J0TWV0aG9kQSkgKEpOSUVudiAqLCBqb2Jq ZWN0LCBqY2xhc3MsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg am1ldGhvZElELCBqdmFsdWUgKik7CiAgamludCAoKkNhbGxOb252aXJ0dWFsSW50TWV0aG9kKSAo Sk5JRW52ICosIGpvYmplY3QsIGpjbGFzcywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICBqbWV0aG9kSUQsIC4uLik7CiAgamludCAoKkNhbGxOb252aXJ0dWFsSW50 TWV0aG9kVikgKEpOSUVudiAqLCBqb2JqZWN0LCBqY2xhc3MsCiAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgam1ldGhvZElELCB2YV9saXN0KTsKICBqaW50ICgqQ2Fs bE5vbnZpcnR1YWxJbnRNZXRob2RBKSAoSk5JRW52ICosIGpvYmplY3QsIGpjbGFzcywKICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqbWV0aG9kSUQsIGp2YWx1ZSAq KTsKICBqbG9uZyAoKkNhbGxOb252aXJ0dWFsTG9uZ01ldGhvZCkgKEpOSUVudiAqLCBqb2JqZWN0 LCBqY2xhc3MsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgam1l dGhvZElELCAuLi4pOwogIGpsb25nICgqQ2FsbE5vbnZpcnR1YWxMb25nTWV0aG9kVikgKEpOSUVu diAqLCBqb2JqZWN0LCBqY2xhc3MsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgam1ldGhvZElELCB2YV9saXN0KTsKICBqbG9uZyAoKkNhbGxOb252aXJ0dWFsTG9u Z01ldGhvZEEpIChKTklFbnYgKiwgam9iamVjdCwgamNsYXNzLAogICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgIGptZXRob2RJRCwganZhbHVlICopOwogIGpmbG9hdCAo KkNhbGxOb252aXJ0dWFsRmxvYXRNZXRob2QpIChKTklFbnYgKiwgam9iamVjdCwgamNsYXNzLAog ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGptZXRob2RJRCwgLi4u KTsKICBqZmxvYXQgKCpDYWxsTm9udmlydHVhbEZsb2F0TWV0aG9kVikgKEpOSUVudiAqLCBqb2Jq ZWN0LCBqY2xhc3MsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg am1ldGhvZElELCB2YV9saXN0KTsKICBqZmxvYXQgKCpDYWxsTm9udmlydHVhbEZsb2F0TWV0aG9k QSkgKEpOSUVudiAqLCBqb2JqZWN0LCBqY2xhc3MsCiAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgam1ldGhvZElELCBqdmFsdWUgKik7CiAgamRvdWJsZSAoKkNhbGxO b252aXJ0dWFsRG91YmxlTWV0aG9kKSAoSk5JRW52ICosIGpvYmplY3QsIGpjbGFzcywKICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqbWV0aG9kSUQsIC4uLik7CiAg amRvdWJsZSAoKkNhbGxOb252aXJ0dWFsRG91YmxlTWV0aG9kVikgKEpOSUVudiAqLCBqb2JqZWN0 LCBqY2xhc3MsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgam1l dGhvZElELCB2YV9saXN0KTsKICBqZG91YmxlICgqQ2FsbE5vbnZpcnR1YWxEb3VibGVNZXRob2RB KSAoSk5JRW52ICosIGpvYmplY3QsIGpjbGFzcywKICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICBqbWV0aG9kSUQsIGp2YWx1ZSAqKTsKICB2b2lkICgqQ2FsbE5vbnZp cnR1YWxWb2lkTWV0aG9kKSAoSk5JRW52ICosIGpvYmplY3QsIGpjbGFzcywKICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqbWV0aG9kSUQsIC4uLik7CiAgdm9pZCAo KkNhbGxOb252aXJ0dWFsVm9pZE1ldGhvZFYpIChKTklFbnYgKiwgam9iamVjdCwgamNsYXNzLAog ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGptZXRob2RJRCwgdmFf bGlzdCk7CiAgdm9pZCAoKkNhbGxOb252aXJ0dWFsVm9pZE1ldGhvZEEpIChKTklFbnYgKiwgam9i amVjdCwgamNsYXNzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg IGptZXRob2RJRCwganZhbHVlICopOwoKICBqZmllbGRJRCAoKkdldEZpZWxkSUQpIChKTklFbnYg KiwgamNsYXNzLCBjb25zdCBjaGFyICosCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgY29uc3QgY2hhciAqKTsKCiAgam9iamVjdCAoKkdldE9iamVjdEZpZWxkKSAo Sk5JRW52ICosIGpvYmplY3QsIGpmaWVsZElEKTsKICBqYm9vbGVhbiAoKkdldEJvb2xlYW5GaWVs ZCkgKEpOSUVudiAqLCBqb2JqZWN0LCBqZmllbGRJRCk7CiAgamJ5dGUgKCpHZXRCeXRlRmllbGQp IChKTklFbnYgKiwgam9iamVjdCwgamZpZWxkSUQpOwogIGpjaGFyICgqR2V0Q2hhckZpZWxkKSAo Sk5JRW52ICosIGpvYmplY3QsIGpmaWVsZElEKTsKICBqc2hvcnQgKCpHZXRTaG9ydEZpZWxkKSAo Sk5JRW52ICosIGpvYmplY3QsIGpmaWVsZElEKTsKICBqaW50ICgqR2V0SW50RmllbGQpIChKTklF bnYgKiwgam9iamVjdCwgamZpZWxkSUQpOwogIGpsb25nICgqR2V0TG9uZ0ZpZWxkKSAoSk5JRW52 ICosIGpvYmplY3QsIGpmaWVsZElEKTsKICBqZmxvYXQgKCpHZXRGbG9hdEZpZWxkKSAoSk5JRW52 ICosIGpvYmplY3QsIGpmaWVsZElEKTsKICBqZG91YmxlICgqR2V0RG91YmxlRmllbGQpIChKTklF bnYgKiwgam9iamVjdCwgamZpZWxkSUQpOwoKICB2b2lkICgqU2V0T2JqZWN0RmllbGQpIChKTklF bnYgKiwgam9iamVjdCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICBqZmllbGRJRCwgam9iamVjdCk7CiAgdm9pZCAoKlNldEJvb2xlYW5GaWVsZCkgKEpOSUVudiAq LCBqb2JqZWN0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGpm aWVsZElELCBqYm9vbGVhbik7CiAgdm9pZCAoKlNldEJ5dGVGaWVsZCkgKEpOSUVudiAqLCBqb2Jq ZWN0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGpmaWVsZElE LCBqYnl0ZSk7CiAgdm9pZCAoKlNldENoYXJGaWVsZCkgKEpOSUVudiAqLCBqb2JqZWN0LAogICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGpmaWVsZElELCBqY2hhcik7 CiAgdm9pZCAoKlNldFNob3J0RmllbGQpIChKTklFbnYgKiwgam9iamVjdCwKICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqZmllbGRJRCwganNob3J0KTsKICB2b2lk ICgqU2V0SW50RmllbGQpIChKTklFbnYgKiwgam9iamVjdCwKICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICBqZmllbGRJRCwgamludCk7CiAgdm9pZCAoKlNldExvbmdG aWVsZCkgKEpOSUVudiAqLCBqb2JqZWN0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgIGpmaWVsZElELCBqbG9uZyk7CiAgdm9pZCAoKlNldEZsb2F0RmllbGQpIChK TklFbnYgKiwgam9iamVjdCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICBqZmllbGRJRCwgamZsb2F0KTsKICB2b2lkICgqU2V0RG91YmxlRmllbGQpIChKTklFbnYg Kiwgam9iamVjdCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBq ZmllbGRJRCwgamRvdWJsZSk7CgogIGptZXRob2RJRCAoKkdldFN0YXRpY01ldGhvZElEKSAoSk5J RW52ICosIGpjbGFzcywgY29uc3QgY2hhciAqLAogICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKik7CgogIGpvYmplY3QgKCpDYWxsU3RhdGljT2Jq ZWN0TWV0aG9kKSAoSk5JRW52ICosIGpjbGFzcywgam1ldGhvZElELAogICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgIC4uLik7CiAgam9iamVjdCAoKkNhbGxTdGF0aWNP YmplY3RNZXRob2RWKSAoSk5JRW52ICosIGpjbGFzcywgam1ldGhvZElELAogICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhX2xpc3QpOwogIGpvYmplY3QgKCpDYWxs U3RhdGljT2JqZWN0TWV0aG9kQSkgKEpOSUVudiAqLCBqY2xhc3MsIGptZXRob2RJRCwKICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqdmFsdWUgKik7CiAgamJvb2xl YW4gKCpDYWxsU3RhdGljQm9vbGVhbk1ldGhvZCkgKEpOSUVudiAqLCBqY2xhc3MsIGptZXRob2RJ RCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuLi4pOwogIGpi b29sZWFuICgqQ2FsbFN0YXRpY0Jvb2xlYW5NZXRob2RWKSAoSk5JRW52ICosIGpjbGFzcywgam1l dGhvZElELAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YV9s aXN0KTsKICBqYm9vbGVhbiAoKkNhbGxTdGF0aWNCb29sZWFuTWV0aG9kQSkgKEpOSUVudiAqLCBq Y2xhc3MsIGptZXRob2RJRCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAganZhbHVlICopOwogIGpieXRlICgqQ2FsbFN0YXRpY0J5dGVNZXRob2QpIChKTklFbnYg KiwgamNsYXNzLCBqbWV0aG9kSUQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgLi4uKT