From mboxrd@z Thu Jan 1 00:00:00 1970 From: Ben Schmidt Date: Tue, 04 Feb 2014 19:24:12 +0000 Subject: [mlmmj] Mlmmj and footers Message-Id: <52F13E5C.4060800@yahoo.com.au> MIME-Version: 1 Content-Type: multipart/mixed; boundary="------------050404000407040904000901" List-Id: To: mlmmj@mlmmj.org This is a multi-part message in MIME format. --------------050404000407040904000901 Content-Type: text/plain; charset=UTF-8; format=flowed Content-Transfer-Encoding: 7bit As this has come up again recently in a bug report, here is some information about Mlmmj's footer support, along with some resources. Mlmmj's footer support is *very* rudimentary. It will work for plain text emails, and that's about it. It doesn't understand HTML or MIME or anything like that. There are a few solutions to this. They both involve piping incoming mail through a filter before it reaches Mlmmj. A script to do this, called mlmmj-amime-receive, is included in amime-receive in the contrib directory of the Mlmmj distribution. I have also attached it to this mail for easy reference. That script is designed to work with a program called altermime, and the script itself contains links to that software, and instructions. For some reason, I decided altermime didn't meet all my requirements, and I wrote an alternative called foot_filter. I will include this in the next distribution of Mlmmj, however, for now I have simply attached the single source file and a very simple Makefile to this mail, along with the altered version of mlmmj-amime-receive, called mlmmj-recieve-ff. foot_filter will output documentation if you run it without arguments, and again, instructions for the script that handles the piping are found within it. A third option is py-mime. If you search the mailing list archives you may find more details about it. It is also the subject of Request #19 in the bug tracker: . I will endeavour to include this information in a README file in an upcoming release to make it easier for people to find it. One day we also hope to improve the integration of these external filters with Mlmmj, e.g. so only list posts are processed. However, the solution documented here has worked for a number of people over the years quite satisfactorily, so this is not a high priority. I hope this helps. Best regards, Ben. --------------050404000407040904000901 Content-Type: text/plain; charset=UTF-8; x-mac-type="0"; x-mac-creator="0"; name="mlmmj-recieve-ff" Content-Transfer-Encoding: base64 Content-Disposition: inline; filename="mlmmj-recieve-ff" IyEvYmluL2Jhc2gKIyAKIyBtbG1tai1yZWNpZXZlLWZmCiMKIyBUYWtlIG1haWwgZnJvbSBz dGRpbiwgcGlwZSBpdCB0aHJvdWdoIGZvb3RfZmlsdGVyIGFuZCB0aGVuIHRvIG1sbW1qLXJl Y2lldmUuCiMKIyBqdXN0IHJlcGxhY2UgbWxtbWotcmVjaWV2ZSAoc2ljKSB3aXRoIG1sbW1q LXJlY2lldmUtZmYsCiMgZS5nLiBpbiAvZXRjL2FsaWFzZXM6CiMgbXltbDogICAifC91c3Iv bG9jYWwvYmluL21sbW1qLXJlY2lldmUtZmYgLUwgL3Zhci9zcG9vbC9tbG1tai9teW1sLyIK IwojIHB1dCB0aGUgZm9vdGVyLXRleHQgaW4gd2hpY2hldmVyIG9yIGEgbnVtYmVyIG9mCiMg ICAgY29udHJvbC9mb290ZXItcGxhaW4KIyAgICBjb250cm9sL2Zvb3Rlci1odG1sCiMgICAg Y29udHJvbC9mb290ZXItbWltZS1wbGFpbgojICAgIGNvbnRyb2wvZm9vdGVyLW1pbWUtaHRt bAojIGFuZCBpZiBkZXNpcmVkLCBjcmVhdGUKIyAgICBjb250cm9sL2Zvb3Rlci1zbWFydAoj CiMgQ29weXJpZ2h0IDIwMDggYnkgR2VyZCB2LiBFZ2lkeSwgPGdlcmRAZWdpZHkuZGU+CiMg TW9kaWZpZWQgMjAxMCBieSBCZW4gU2NobWlkdAojCiMgTGljZW5zZWQgdW5kZXIgTUlUIExp Y2Vuc2UsIHNlZSBMSUNFTlNFIGZpbGUgY29taW5nIHdpdGggbWxtbWoKCk1MTU1KUkVDSUVW RT0vdXNyL2Jpbi9tbG1tai1yZWNpZXZlCkZPT1RGSUxURVI9L3Vzci9sb2NhbC9iaW4vZm9v dF9maWx0ZXIKCiMgY2hlY2sgZXhlY3V0YWJsZXMKaWYgISBbIC14ICRNTE1NSlJFQ0lFVkUg XTsgdGhlbgogICAgZWNobyAiY2FuJ3QgZmluZCAkTUxNTUpSRUNJRVZFIGV4ZWN1dGFibGUs IGFib3J0aW5nIgogICAgZXhpdCAxCmZpCgppZiAhIFsgLXggJEFMVEVSTUlNRSBdOyB0aGVu CiAgICBlY2hvICJjYW4ndCBmaW5kICRBTFRFUk1JTUUgZXhlY3V0YWJsZSwgYWJvcnRpbmci CiAgICBleGl0IDEKZmkKCiMgcmVhZCBwYXJhbWV0ZXJzCkk9MQpQQVJBTV9MPTAKd2hpbGUg WyAkSSAtbGUgJCMgXSAmJiBbICRQQVJBTV9MID09IDAgXTsgZG8KICAgIGlmIFsgIiR7IUl9 IiA9PSAiLUwiIF07IHRoZW4KICAgICAgICBQQVJBTV9MPTEKICAgIGZpCiAgICBJPSRbJEkr MV0KZG9uZQoKaWYgWyAkUEFSQU1fTCA9PSAxIF0gJiYgWyAkSSAtbGUgJCMgXTsgdGhlbgog ICAgTUxQQVRIPSIkeyFJfSIKZWxzZQogICAgZWNobyAicGFyYW1ldGVyIC1MIC9wYXRoL3Rv L2xpc3RkaXIgbWlzc2luZywgYWJvcnRpbmciCiAgICBleGl0IDEKZmkKCmlmICEgWyAtZCAi JHtNTFBBVEh9IiBdOyB0aGVuCiAgICBlY2hvICIke01MUEFUSH0gaXMgbm90IGV4aXN0aW5n IG9yIG5vIGRpcmVjdG9yeSwgYWJvcnRpbmciCiAgICBleGl0IDEKZmkKCkNPTlRST0xEPSIk e01MUEFUSH0vY29udHJvbCIKCmlmICEgWyAtZCAiJHtDT05UUk9MRH0iIF07IHRoZW4KICAg IGVjaG8gIiR7Q09OVFJPTER9IGlzIG5vdCBleGlzdGluZyBvciBubyBkaXJlY3RvcnksIGFi b3J0aW5nIgogICAgZXhpdCAxCmZpCgojIGxvb2sgZm9yIGZvb3Rlci1maWxlcyBhbmQgYnVp bGQgcGFyYW1ldGVycwoKUEFSQU09IiIKCmlmIFsgLWYgIiR7Q09OVFJPTER9L2Zvb3Rlci1w bGFpbiIgXTsgdGhlbgogICAgUEFSQU09IiR7UEFSQU19IC1wICR7Q09OVFJPTER9L2Zvb3Rl ci1wbGFpbiIKZmkKCmlmIFsgLWYgIiR7Q09OVFJPTER9L2Zvb3Rlci1odG1sIiBdOyB0aGVu CiAgICBQQVJBTT0iJHtQQVJBTX0gLWggJHtDT05UUk9MRH0vZm9vdGVyLWh0bWwiCmZpCgpp ZiBbIC1mICIke0NPTlRST0xEfS9mb290ZXItbWltZS1wbGFpbiIgXTsgdGhlbgogICAgUEFS QU09IiR7UEFSQU19IC1QICR7Q09OVFJPTER9L2Zvb3Rlci1taW1lLXBsYWluIgpmaQoKaWYg WyAtZiAiJHtDT05UUk9MRH0vZm9vdGVyLW1pbWUtaHRtbCIgXTsgdGhlbgogICAgUEFSQU09 IiR7UEFSQU19IC1IICR7Q09OVFJPTER9L2Zvb3Rlci1taW1lLWh0bWwiCmZpCgppZiBbIC1m ICIke0NPTlRST0xEfS9mb290ZXItc21hcnQiIF07IHRoZW4KICAgIFBBUkFNPSIke1BBUkFN fSAtcyIKZmkKCiMgZ28gdG8gYSBkaXIgd2hlcmUgZm9vdF9maWx0ZXIgY2FuIHdyaXRlIGl0 J3MgdG1wLWZpbGVzIHNhZmVseQpjZCAkTUxQQVRICgojIHBpcGUgdGhlIGNhbGxzCiRGT09U RklMVEVSICR7UEFSQU19IC0tIHwgJE1MTU1KUkVDSUVWRSAiJEAiCgo= --------------050404000407040904000901 Content-Type: text/plain; charset=UTF-8; x-mac-type="0"; x-mac-creator="0"; name="foot_filter.c" Content-Transfer-Encoding: base64 Content-Disposition: inline; filename="foot_filter.c" LyoKCmZvb3RfZmlsdGVyLmMKCihDKSAyMDEwIEJlbiBTY2htaWR0CgpUaGlzIFNvdXJjZSBD b2RlIEZvcm0gaXMgc3ViamVjdCB0byB0aGUgdGVybXMgb2YgdGhlIE1vemlsbGEgUHVibGlj IExpY2Vuc2UKVmVyc2lvbiAyLjAuIElmIGEgY29weSBvZiB0aGUgTVBMIHdhcyBub3QgZGlz dHJpYnV0ZWQgd2l0aCB0aGlzIGZpbGUsIFlvdSBjYW4Kb2J0YWluIG9uZSBhdCBodHRwOi8v bW96aWxsYS5vcmcvTVBMLzIuMC8uCgoqLwoKLy8gQ2hlY2sgb3V0IHRoZSAtViBvcHRpb247 IGl0IG91dHB1dHMgdGhpcyBhbmQgbW9yZQojZGVmaW5lIEZPT1RfRklMVEVSX1ZFUlNJT04g ImZvb3RfZmlsdGVyIHZlcnNpb24gMS4yLCAoQykgMjAxMCBCZW4gU2NobWlkdCIKCnN0YXRp YyBjb25zdCBjaGFyICogVVNBR0U9IlxuXAp1c2FnZTogZm9vdF9maWx0ZXIgWy1wIHBsYWlu X2Zvb3Rlcl9maWxlXSBbLWggaHRtbF9mb290ZXJfZmlsZV1cblwKICAgICAgICAgICAgICAg ICAgIFt7LVB8LUh9IG1pbWVfZm9vdGVyX2ZpbGVdIFstc11cblwKICAgICAgIGZvb3RfZmls dGVyIC1WXG5cClxuXApwbGFpbl9mb290ZXJfZmlsZSwgaWYgcHJlc2VudCwgd2lsbCBiZSBh cHBlbmRlZCB0byBtYWlscyB3aXRoIHBsYWluIHRleHRcblwKc2VjdGlvbnMgb25seS4gU2lt aWxhcmx5LCBodG1sX2Zvb3Rlcl9maWxlLiBJZiBtaW1lX2Zvb3Rlcl9maWxlIChlaXRoZXJc blwKcGxhaW4sIC1QLCBvciBIVE1MLCAtSCkgaXMgZ2l2ZW4sIGl0IHdpbGwgYmUgdXNlZCB3 aGVuIGEgbWFpbCB3aXRoXG5cCmFsdGVybmF0aXZlIGZvcm1hdHMgaXMgZW5jb3VudGVyZWQs IG9yIGlmIHRoZSBmb290ZXIgZm9yIHRoZSByZWxldmFudFxuXAp0eXBlIG9mIG1haWwgaXMg bm90IHByZXNlbnQ7IGEgbmV3IE1JTUUgc2VjdGlvbiB3aWxsIGJlIGFkZGVkLlxuXApcblwK LXMgdHVybnMgb24gc21hcnQgbW9kZSB3aGljaCBlbmRlYXZvdXJzIHRvIHJlbW92ZSBpbmNs dWRlZC9xdW90ZWQgY29waWVzIG9mXG5cCnRoZSAob3IgYSBzaW1pbGFyKSBmb290ZXIgYnkg c3Vycm91bmRpbmcgdGhlIGZvb3RlciB3aXRoIHBhdHRlcm5zIGl0IGxhdGVyXG5cCnJlY29n bmlzZXMuIEl0IGFsc28gZW5kZWF2b3VycyB0byBzdHJpcCAncGFkZGluZycgc3Vycm91bmRp bmcgdGhlIG9sZFxuXApmb290ZXJzIHRvIG1ha2UgdGhpbmdzIGFzIGNsZWFuIGFzIHBvc3Np YmxlLiBUaGlzIGluY2x1ZGVzIHdoaXRlc3BhY2VcblwKKGluY2x1ZGluZyAnJm5ic3A7JyBh bmQgJzxicj4nKSwgJz4nIHF1b3RpbmcgY2hhcmFjdGVycywgdmFyaW91cyBwYWlycyBvZlxu XApIVE1MIHRhZ3MgKHAsIGJsb2NrcXVvdGUsIGRpdiwgc3BhbiwgZm9udDsgaXQncyBuYWl2 ZSwgaXQgZG9lc24ndCBjaGVja1xuXAp0YWdzIGluIGJldHdlZW4gYXJlIGJhbGFuY2VkIGF0 IGFsbCwgc28gaW4gJzxwPnByZWZpeDwvcD48cD5zdWZmaXg8L3A+JyB0aGVcblwKZmlyc3Qg YW5kIGxhc3QgdGFncyBhcmUgcGFpcmVkKSwgYW5kIGV2ZW4gaG9yaXpvbnRhbCBydWxlcyB3 aGVuIGluc2lkZVxuXApwYWlyZWQgdGFncyAoZS5nLiB1c2UgJzxkaXY+PGhyLz5mb290ZXI8 L2Rpdj4nKS4gSWYgdGhlIHNtYXJ0IHN0cmluZ3MgYXJlXG5cCmZvdW5kIGluIHRoZSBmb290 ZXIsIHRoZXkgd29uJ3QgYmUgYWRkZWQgYnkgdGhlIHByb2dyYW0sIHNvIHlvdSBoYXZlIHRo ZVxuXApuZWNlc3NhcnkgY29udHJvbCB0byBkbyB0aGlzLlxuXApcblwKTmV3IGZvb3RlcnMg YXJlIGFkZGVkIHByaW9yIHRvIHRyYWlsaW5nIHdoaXRlc3BhY2UgYW5kIGEgZmV3IGNsb3Np bmcgaHRtbFxuXAp0YWdzIChib2R5LCBodG1sKSBhcyB3ZWxsLiBZb3UgYWxtb3N0IGNlcnRh aW5seSB3YW50IHRvIGJlZ2luIHlvdXIgZm9vdGVyXG5cCndpdGggYW4gZW1wdHkgbGluZSBi ZWNhdXNlIG9mIHRoaXMuXG5cClxuXApTaW5jZSB0aGVzZSBhbHRlcmF0aW9ucywgYnkgdGhl aXIgdmVyeSBuYXR1cmUsIGJyZWFrIHNpZ25lZCBtYWlsLFxuXApzaWduYXR1cmVzIGFyZSBy ZW1vdmVkIHdoaWxlIHByb2Nlc3NpbmcuIFRvIGtlZXAgc29tZSB2YWx1ZSBmcm9tIHNpZ25h dHVyZXMsXG5cCmhhdmUgdGhlIE1UQSB2ZXJpZnkgdGhlbSBhbmQgYWRkIGEgaGVhZGVyIChv ciBldmVuIHN1cHBseSBhbiBhbHRlcm5hdGl2ZVxuXApmb290ZXIgdG8gdGhpcyBwcm9ncmFt KSwgYW5kIHJlc2lnbiB0aGVtIHRvIGF1dGhlbnRpY2F0ZSB0aGV5IGNhbWUgZnJvbSB0aGVc blwKbWFpbGluZyBsaXN0IGRpcmVjdGx5IGFmdGVyIHRoZSBzaWduYXR1cmUgdmVyaWZpY2F0 aW9uIHdhcyBkb25lIGFuZCByZWNvcmRlZC5cblwKT3IgZG9uJ3QgdXNlIHRoZXNlIGtpbmRz IG9mIHRyYW5zZm9ybWF0aW9ucyBhdCBhbGwuXG5cClxuXAotViBzaG93cyB0aGUgdmVyc2lv biBhbmQgZXhpdHMuXG5cClxuXApQcm9ncmFtIGlzIHJ1bm5pbmcgbm93LiBTZW5kIEVPRiBv ciBpbnRlcnJ1cHQgdG8gc3RvcCBpdC4gVG8gYXZvaWQgdGhpcyB1c2FnZVxuXAptZXNzYWdl IGlmIHdhbnRpbmcgdG8gcnVuIHdpdGhvdXQgYXJndW1lbnRzLCB1c2UgJy0tJyBhcyBhbiBh cmd1bWVudC5cblwKXG4iOwoKLyoKClRoaXMgaXMgYSBmYWlybHkgc2ltcGxlIHByb2dyYW0g bm90IGV4cGVjdGluZyBtdWNoIGV4dGVuc2lvbi4gQXMgc3VjaCwgc29tZQpsaWJlcnRpZXMg aGF2ZSBiZWVuIHRha2VuIGFuZCBzb21lIGZ1biBoYXMgYmVlbiBoYWQgYnkgdGhlIGF1dGhv ci4gQ29ycmVjdG5lc3MKaGFzIGJlZW4gcHJpb3JpdGlzZWQgaW4gZGVzaWduLCBidXQgc3Bl ZWQgYW5kIGVmZmljaWVuY3kgaGF2ZSBiZWVuIHRha2VuIGludG8KY29uc2lkZXJhdGlvbiBh bmQgcHJpb3JpdGlzZWQgYWJvdmUgcmVhZGFiaWxpdHkgYW5kIG1vZHVsYXJpdHkgYW5kIG90 aGVyIHN1Y2gKZ2VuZXJhbGx5IHJlY29tbWVuZGVkIHByb2dyYW1taW5nIHByYWN0aWNlcy4g SWYgbWFraW5nIGNoYW5nZXMsIGdyZWF0IGNhcmUKc2hvdWxkIGJlIHRha2VuIHRvIHVuZGVy c3RhbmQgaG93IGFuZCB3aGVyZSAoZXZlcnl3aGVyZSkgZ2xvYmFscyBhcmUgdXNlZApiZWZv cmUgbWFraW5nIHRoZW0uIERvbid0IHRyeSB0byBtb2RpZnkgdGhlIHByb2dyYW0gd2l0aG91 dCB1bmRlcnN0YW5kaW5nIGhvdwp0aGUgd2hvbGUgdGhpbmcgd29ya3MgdG9nZXRoZXIgb3Ig eW91IHdpbGwgZ2V0IGJ1cm50LiBZb3UgaGF2ZSBiZWVuIHdhcm5lZC4KClJlbGV2YW50IFJG Q3M6Cmh0dHA6Ly93d3cuaWV0Zi5vcmcvcmZjL3JmYzIwMTUudHh0Cmh0dHA6Ly93d3cuaWV0 Zi5vcmcvcmZjL3JmYzM4NTEudHh0Cmh0dHA6Ly93d3cuaWV0Zi5vcmcvcmZjL3JmYzIwNDUu dHh0Cmh0dHA6Ly93d3cuaWV0Zi5vcmcvcmZjL3JmYzIwNDYudHh0Cmh0dHA6Ly93d3cuaWV0 Zi5vcmcvcmZjL3JmYzgyMi50eHQKaHR0cDovL3d3dy5pZXRmLm9yZy9yZmMvcmZjMjE4My50 eHQKCkZvciBwcm9ncmFtIGNvbmZpZ3VyYXRpb24sIHNlZSB0aGUgJ2NvbnN0YW50cycgc2Vj dGlvbiBiZWxvdy4KCkFsc28gc2VlIGNvZGUgY29tbWVudHMgdGhyb3VnaG91dC4KCkZ1dHVy ZSBwb3NzaWJpbGl0aWVzOgoKLSBTYXZpbmcgY29waWVzIG9mIG9yaWdpbmFsIG1haWwgaW4g J3NlbWktdGVtcCcgZmlsZXMgZm9yIGRlYnVnZ2luZy4KCi0gU3RyaXBwaW5nIGF0dGFjaG1l bnRzIGFuZCBzYXZlIHRoZW0gKGUuZy4gaW4gYSBsb2NhdGlvbiB0aGF0IGNhbiBiZWNvbWUg YQogICdmaWxlcyB1cGxvYWRlZCcgc2VjdGlvbiBvbiBhIHdlYnNpdGUpLiBSZXBsYWNlIHRo ZW0gd2l0aCBsaW5rcyB0byB0aGUKICB3ZWJzaXRlLCBldmVuLgoKLSBNYWtpbmcgdGhlIHBy ZWZpeGVzLCBzdWZmaXhlcywgcmVwbGFjZW1lbnRzLCBwYWRkaW5nLCBndXRzLCBwYWlycywK ICBjb25maWd1cmFibGUgYXQgcnVudGltZS4KCi0gQXR0YWNoaW5nIHNpZ25lZCBtYWlsLCBv ciB3cmFwcGluZyBpbiBhIG11bHRpcGFydCByYXRoZXIgdGhhbiByZW1vdmluZwogIHNpZ25h dHVyZXM7IHdvdWxkbid0IGJlIGhhcmQgaWYgYWx3YXlzIHVzaW5nIE1JTUUgZm9vdGVycy4K Ci0gRm9sbG93aW5nIGEgc2NyaXB0IHRvIGFsbG93IHZhcmlvdXMgb3RoZXIgaGVhZGVyIHRy YW5zZm9ybWF0aW9ucyAoYWRkaXRpb24sCiAgcmVtb3ZhbCwgZXRjLiksIG9yIG90aGVyIHRy YW5zZm9ybWF0aW9ucy4KCi0gUHJvbG9ndWVzIGFzIHdlbGwgYXMgb3IgaW5zdGVhZCBvZiBm b290ZXJzLgoKKi8KCi8qIHRhZzogaW5jbHVkZXMgKi8KCiNpbmNsdWRlIDxzdGRpby5oPgoj aW5jbHVkZSA8c3RkbGliLmg+CiNpbmNsdWRlIDx1bmlzdGQuaD4KI2luY2x1ZGUgPHRpbWUu aD4KI2luY2x1ZGUgPHN5c2xvZy5oPgojaW5jbHVkZSA8ZXJybm8uaD4KI2luY2x1ZGUgPHN0 cmluZy5oPgojaW5jbHVkZSA8c3lzZXhpdHMuaD4KCi8qIHRhZzogdHlwZWRlZnMgKi8KCi8v IHNwbGludCBoYXMgYm9vbHMsIGJ1dCBDIGRvZXNuJ3QhCiNpZm5kZWYgU19TUExJTlRfUwp0 eXBlZGVmIGludCBib29sOwojZGVmaW5lIGZhbHNlICgwKQojZGVmaW5lIHRydWUgKDEpCiNl bmRpZgoKLy8gVGhpcyBpcyBtb3N0bHkgdG8gYmUgYWJsZSB0byBpbmNsdWRlIHNwbGludCBh bm5vdGF0aW9ucwp0eXBlZGVmIC8qQG51bGxAKi8vKkBvYnNlcnZlckAqLyBjb25zdCBjaGFy ICogY29uc3RfbnVsbF9zdHJpbmc7CnR5cGVkZWYgLypAbnVsbEAqLyBjaGFyICogbnVsbF9z dHJpbmc7CnR5cGVkZWYgLypAbnVsbEAqLy8qQG93bmVkQCovIGNoYXIgKiBvd25lZF9udWxs X3N0cmluZzsKdHlwZWRlZiAvKkBudWxsQCovLypAZGVwZW5kZW50QCovIGNoYXIgKiBkZXBl bmRlbnRfbnVsbF9zdHJpbmc7CgovLyAnQ2FsbGJhY2tzJzsgdGhleSBjb21tdW5pY2F0ZSBw cmltYXJpbHkgdXNpbmcgZ2xvYmFscywgc2VlIGJlbG93CnR5cGVkZWYgYm9vbCAoKmNhbGxi YWNrX3QpKCk7CnR5cGVkZWYgdm9pZCAoKmZ1bmN0aW9uX3QpKCk7CgovLyBGb3IgZmlsbCgp CnR5cGVkZWYgZW51bSB7CgllY2hvLAoJZW5jb2RlLAoJc2h1bnQsCglkaXNjYXJkLAoJc3Rv cCwKCWZhaWwKfSB3aGVuX2Z1bGxfdDsKCi8vIFZhcmlvdXMgcGxhY2VzCnR5cGVkZWYgZW51 bSB7Cgl1bmVuY29kZWQsCglxdW90ZWRfcHJpbnRhYmxlLAoJYmFzZTY0Cn0gZW5jb2Rpbmdf dDsKCi8vIEZvciByZXR1cm5pbmcgbXVsdGlwbGUgY2hhcmFjdGVycywgYW5kIGEgcmVxdWVz dCB0byBkZWxldGUgYmFja2xvZwovLyB3aGVuIGRlY29kaW5nCnR5cGVkZWYgc3RydWN0IHsK CWludCByOwoJaW50IGMxOwoJaW50IGMyOwoJaW50IGMzOwp9IGRlY29kZV90OwoKLyogdGFn OiBjb25zdGFudHMgKi8KCi8qIHRhZzogaGVhZGVyX2NvbnN0YW50cyAqLwoKLy8gSG93IG1h bnkgTUlNRSBDb250ZW50LSBoZWFkZXJzIHdlIGV4cGVjdCwgbWF4aW11bSwgaW4gYSBtYWls LiBJZiB3ZSBoYXZlCi8vIG1vcmUgdGhhbiB0aGF0LCB3ZSB3b24ndCBiZSBhYmxlIHRvIHBy b2Nlc3MgTUlNRSBzbyB3ZWxsLCBidXQgd2Ugd29uJ3QgZmFpbAovLyBjYXRhc3Ryb3BoaWNh bGx5LgojZGVmaW5lIG1pbWVfaGVhZGVyc19tYXggMTYKCi8qIHRhZzogZm9vdGVyX2NvbnN0 YW50cyAqLwoKLy8gU3R1ZmYgZm9yIHByb2Nlc3NpbmcgdGhlIGZvb3RlcidzIHNtYXJ0IHJl bW92YWwgYW5kIChzbWFydCBvciBub3QpCi8vIGluc2VydGlvbgoKc3RhdGljIGNvbnN0IGNo YXIgKiBwbGFpbl9wcmVmaXggPSAiLS0tLS0tfi0tLS0tLS0tLS0iOwpzdGF0aWMgY29uc3Qg Y2hhciAqIHBsYWluX3N1ZmZpeCA9ICItLS0tLS1+fi0tLS0tLS0tLSI7CnN0YXRpYyBjb25z dCBjaGFyICogcGxhaW5fcmVwbGFjZW1lbnQgPSAiXHJcblxyXG4iOwpzdGF0aWMgY29uc3Rf bnVsbF9zdHJpbmcgcGxhaW5fdGFpbHNbXSA9IHsKCSIgIiwiXHQiLCJcciIsIlxuIiwKCU5V TEwKfTsKc3RhdGljIGNvbnN0X251bGxfc3RyaW5nIHBsYWluX3BhZGRpbmdbXSA9IHsKCSI+ IiwiICIsIlx0IiwiXHIiLCJcbiIsCglOVUxMCn07CnN0YXRpYyBjb25zdF9udWxsX3N0cmlu ZyBwbGFpbl9ndXRzW10gPSB7CglOVUxMCn07CnN0YXRpYyBjb25zdF9udWxsX3N0cmluZyBw bGFpbl9wYWlyc1tdID0gewoJTlVMTAp9OwoKc3RhdGljIGNvbnN0IGNoYXIgKiBodG1sX3By ZWZpeCA9ICItLS0tLS1+LS0tLS0tLS0tLSI7CnN0YXRpYyBjb25zdCBjaGFyICogaHRtbF9z dWZmaXggPSAiLS0tLS0tfn4tLS0tLS0tLS0iOwpzdGF0aWMgY29uc3QgY2hhciAqIGh0bWxf cmVwbGFjZW1lbnQgPSAiXHJcbjxici8+PGJyLz5cclxuIjsKc3RhdGljIGNvbnN0X251bGxf c3RyaW5nIGh0bWxfdGFpbHNbXSA9IHsKCSI8L2h0bWw+IiwiPC9IVE1MPiIsIjwvYm9keT4i LCI8L0JPRFk+IiwKCSIgIiwiJm5ic3A7IiwiJk5CU1A7IiwiXHQiLCJcciIsIlxuIiwKCSI8 YnI+IiwiPEJSPiIsIjxici8+IiwiPEJSLz4iLCI8YnIgLz4iLCI8QlIgLz4iLAoJTlVMTAp9 OwpzdGF0aWMgY29uc3RfbnVsbF9zdHJpbmcgaHRtbF9wYWRkaW5nW10gPSB7CgkiJmd0OyIs IiZHVDsiLAoJIiAiLCImbmJzcDsiLCImTkJTUDsiLCJcdCIsIlxyIiwiXG4iLAoJIjxicj4i LCI8QlI+IiwiPGJyLz4iLCI8QlIvPiIsIjxiciAvPiIsIjxCUiAvPiIsCglOVUxMCn07CnN0 YXRpYyBjb25zdF9udWxsX3N0cmluZyBodG1sX2d1dHNbXSA9IHsKCS8vIFRoZXNlIGFyZSBy ZW1vdmVkIGluIGFuIGF0dGVtcHQgdG8gbWFrZSBhIHBhaXIKCSI8aHI+IiwiPEhSPiIsIjxo ci8+IiwiPEhSLz4iLCI8aHIgLz4iLCI8SFIgLz4iLAoJIiAiLCImbmJzcDsiLCImTkJTUDsi LCJcdCIsIlxyIiwiXG4iLAoJIjxicj4iLCI8QlI+IiwiPGJyLz4iLCI8QlIvPiIsIjxiciAv PiIsIjxCUiAvPiIsCglOVUxMCn07CnN0YXRpYyBjb25zdF9udWxsX3N0cmluZyBodG1sX3Bh aXJzW10gPSB7CgkvLyBDbG9zaW5nIHBhcnQgKG9yIE5VTEwgdG8gbWFyayBubyBtb3JlKSwg ZW5kIG9mIG9wZW5pbmcgcGFydCwKCS8vIHN0YXJ0IG9mIG9wZW5pbmcgcGFydCwgTlVMTAoJ Ly8gVGhlIHNlYXJjaCBzdHJhdGVneSBpcyBmYWlybHkgbmFpdmU7IGlmIGl0IGZpbmRzIHRo ZSBjbG9zaW5nIHBhcnQsCgkvLyBpdCBjaGVja3MgZm9yIHRoZSBlbmQgb2YgdGhlIG9wZW5p bmcgcGFydDsgaWYgaXQgZmluZHMgdGhhdCwgaXQKCS8vIHNlYXJjaGVzIGJhY2sgZm9yIHRo ZSBmaXJzdCBjaGFyYWN0ZXIgb2YgZWFjaCBvZiB0aGUgb3BlbmluZyBwYXJ0CgkvLyB2YXJp YW50cywgYW5kIGlmIHRoYXQgY2hhcmFjdGVyIGlzIGZvdW5kIGFuZCBpcyB0aGUgYmVnaW5u aW5nIG9mIHRoZQoJLy8gd2hvbGUgdmFyaWFudCwgaXQgcmVtb3ZlcyB0aGUgcGFpci4KCSI8 L3A+IiwiPiIsIjxwPiIsIjxwICIsTlVMTCwKCSI8L1A+IiwiPiIsIjxQPiIsIjxQICIsTlVM TCwKCSI8L2Jsb2NrcXVvdGU+IiwiPiIsIjxibG9ja3F1b3RlPiIsIjxibG9ja3F1b3RlICIs TlVMTCwKCSI8L0JMT0NLUVVPVEU+IiwiPiIsIjxCTE9DS1FVT1RFPiIsIjxCTE9DS1FVT1RF ICIsTlVMTCwKCSI8L2Rpdj4iLCI+IiwiPGRpdj4iLCI8ZGl2ICIsTlVMTCwKCSI8L0RJVj4i LCI+IiwiPERJVj4iLCI8RElWICIsTlVMTCwKCSI8L3NwYW4+IiwiPiIsIjxzcGFuPiIsIjxz cGFuICIsTlVMTCwKCSI8L1NQQU4+IiwiPiIsIjxTUEFOPiIsIjxTUEFOICIsTlVMTCwKCSI8 L2ZvbnQ+IiwiPiIsIjxmb250PiIsIjxmb250ICIsTlVMTCwKCSI8L0ZPTlQ+IiwiPiIsIjxG T05UPiIsIjxGT05UICIsTlVMTCwKCU5VTEwKfTsKCi8qIHRhZzogYnVmZmVyX2NvbnN0YW50 cyAqLwoKLy8gQWxzbyBzZWUgY29tbWVudCBhdCBidWZmZXJfZ2xvYmFscyBhYm91dCBob3cg dGhlIGJ1ZmZlciB3b3Jrcy4KCi8vIFRoZSBidWZmZXIgc2l6ZSBsaW1pdHMgaG93IGZhciBi YWNrIGZvb3RlcnMgY2FuIGJlIGRlbGV0ZWQ7IHRoZQovLyBzZWN0aW9uIG9mIG1haWwgZnJv bSB0aGUgY2xvc2luZyBib3VuZGFyeSBiYWNrIHRoaXMgZmFyIHdpbGwgYmUKLy8gc2VhcmNo ZWQgZm9yIGZvb3RlcnMgdG8gcmVtb3ZlLgojZGVmaW5lIG1lbV9idWZmZXJfc2l6ZSA2NTUz NgovLyBtZW1fYnVmZmVyX2tlZXAgaXMgaG93IG11Y2ggd2Uga2VlcCBpbiBtZW1vcnkgd2hl biBzaHVudGluZwovLyBvZmYgdG8gZGlzazsgYXMgd2UgbXVzdCBiZSBhYmxlIHRvIHNodW50 IG9mZiBhdCBsZWFzdCBzb21ldGhpbmcKLy8gdG8gZGlzayBlYWNoIHRpbWUgd2UgbmVlZCB0 bywgdGhpcyBtdXN0IGJlIGF0IGxlYXN0IDIgYnl0ZXMKLy8gbGVzcyB0aGFuIG1lbV9idWZm ZXJfc2l6ZS4gVGhpcyBpcyBob3cgbXVjaCB3ZSB3aWxsIGJlIGFibGUgdG8KLy8gYmFja3Ry YWNrIGluIG1lbW9yeSwgZS5nLiB0byBzdHJpcCB3aGl0ZXNwYWNlLiBTb21ldGhpbmcgYSBs aXR0bGUKLy8gbGFyZ2VyIHRoYW4gdGhlIFNNVFAgbGluZSBsZW5ndGggbGltaXQgb2YgOTk4 IHNob3VsZCBrZWVwIGl0IHNhZmUuCiNkZWZpbmUgbWVtX2J1ZmZlcl9rZWVwIDEwMjQKLy8g bWVtX2J1ZmZlcl9tYXJnaW4gaXMgaG93IG11Y2ggc3BhY2Ugd2Uga2VlcCBpbiBtZW1vcnkg aW4gY2FzZQovLyBhIGNhbGxiYWNrIChkZWNvZGluZyEpIG5lZWRzIHRvIHVzZSBpdC4gTXVz dCBiZSBhdCBsZWFzdCA0IGZvcgovLyBkZWNvZGluZyBub3QgdG8gY2F1c2UgbmFzdHkgY29y cnVwdGlvbi4KI2RlZmluZSBtZW1fYnVmZmVyX21hcmdpbiA4Ci8vIFRoZSBudW1iZXIgb2Yg cmVwbGFjZW1lbnRzIHdlIG1heSB3aXNoIHRvIG1ha2U7IHVzdWFsbHkgcmVtb3ZpbmcKLy8g dGhlIE1JTUUgaGVhZGVycyBpcyB0aGUgbW9zdCBjb21wbGljYXRlZCB0aGluZyB0byBiZSBk b25lLCBwbHVzCi8vIHJlbW92aW5nIHRoZSBNSU1FIHZlcnNpb24gaGVhZGVyIGFuZCB0aGUg bmV3bGluZSB0aGF0IGVuZHMgdGhlCi8vIGhlYWRlcnMuCiNkZWZpbmUgcmVwbGFjZW1lbnRz X21heCAobWltZV9oZWFkZXJzX21heCs0KQoKLyogdGFnOiBlcnJvcl9jb25zdGFudHMgKi8K Ci8vIEVuYWJsZSBvbmUgb3IgYm90aCBvZiB0aGVzZQojZGVmaW5lIFVTRV9TWVNMT0cKLy8j ZGVmaW5lIFVTRV9TVERFUlIKCi8qIHRhZzogaGVscGVyX2NvbnN0YW50cyAqLwoKLy8gRGlz YWJsZSB0aGlzIHRvIHVzZSBzdGRpbi9zdGRvdXQgd2l0aCBDUkxGIGxpbmUgZW5kaW5ncyBh cyB0aGUgc3BlYwovLyBhbmQgdHJhbnNwb3J0cyBkbzsgZm9vdGVyIGZpbGVzIGFyZSBhbHdh eXMgZXhwZWN0ZWQgdG8gaGF2ZSBVTklYIGxpbmUKLy8gZW5kaW5ncwojZGVmaW5lIFVOSVhf RU9MCgovKiB0YWc6IGdsb2JhbHMgKi8KCi8qIHRhZzogaGVhZGVyX2dsb2JhbHMgKi8KCi8v IE9mZnNldHMgaW50byB0aGUgYnVmZmVyOyBvbmx5IHZhbGlkIHdoaWxlIGl0J3Mgc3RpbGwg aW4gdGhlcmUhCnN0YXRpYyBpbnQgbWltZV9oZWFkZXJfc3RhcnRzW21pbWVfaGVhZGVyc19t YXhdPXswfTsKc3RhdGljIGludCBtaW1lX2hlYWRlcl9lbmRzW21pbWVfaGVhZGVyc19tYXhd PXswfTsKLy8gU3RyaW5nIGNvcGllcyAodW50aWwgZnJlZWQpCnN0YXRpYyBvd25lZF9udWxs X3N0cmluZyBzYXZlZF9taW1lX2hlYWRlcnNbbWltZV9oZWFkZXJzX21heF09e05VTEx9Owov LyBDb3VudCBhcHBsaWVzIHRvIGFsbCBoZWFkZXIgZ2xvYmFscyBhYm92ZQpzdGF0aWMgaW50 IG1pbWVfaGVhZGVyc19jb3VudCA9IDA7CgovLyBJbmRpdmlkdWFsIGhlYWRlciBzdHJpbmdz IHdoaWNoIGFyZSBwcm9jZXNzZWQgdG8gaGF2ZSBjb21tZW50cwovLyByZW1vdmVkIGFuZCBo YXZlIG5vcm1hbGlzZWQgc3ludGF4IGZvciBlYXN5IGRlZHVjdGlvbiBvZiB0eXBlcywKLy8g ZXRjLi4gX2hlYWRlcl9ib2R5IHBvaW50ZXJzIHBvaW50IGludG8gdGhlIF9oZWFkZXIgc3Ry aW5ncy4KLy8gSW5kZXhlcyBhcmUgaW50byB0aGUgaGVhZGVyIGFycmF5cyBhYm92ZS4KLy8g V2Ugc3RvcmUgdGhlIHZlcnNpb24gc3RhcnQgYW5kIGVuZCBzZXBhcmF0ZWx5IGFzIHdlIHdh bnQgdG8gZGVsZXRlIGl0LAovLyBidXQgbm90IHJlb3V0cHV0IGl0LgpzdGF0aWMgLypAb3du ZWRAKi8gbnVsbF9zdHJpbmcgdmVyc2lvbl9oZWFkZXI9TlVMTDsKc3RhdGljIC8qQGRlcGVu ZGVudEAqLyBudWxsX3N0cmluZyB2ZXJzaW9uX2hlYWRlcl9ib2R5PU5VTEw7CnN0YXRpYyBp bnQgdmVyc2lvbl9oZWFkZXJfc3RhcnQ9MDsKc3RhdGljIGludCB2ZXJzaW9uX2hlYWRlcl9l bmQ9MDsKc3RhdGljIC8qQG93bmVkQCovIG51bGxfc3RyaW5nIHR5cGVfaGVhZGVyPU5VTEw7 CnN0YXRpYyAvKkBkZXBlbmRlbnRAKi8gbnVsbF9zdHJpbmcgdHlwZV9oZWFkZXJfYm9keT1O VUxMOwpzdGF0aWMgaW50IHR5cGVfaGVhZGVyX2luZGV4PTA7CnN0YXRpYyAvKkBvd25lZEAq LyBudWxsX3N0cmluZyB0cmFuc2Zlcl9oZWFkZXI9TlVMTDsKc3RhdGljIC8qQGRlcGVuZGVu dEAqLyBudWxsX3N0cmluZyB0cmFuc2Zlcl9oZWFkZXJfYm9keT1OVUxMOwpzdGF0aWMgaW50 IHRyYW5zZmVyX2hlYWRlcl9pbmRleD0wOwpzdGF0aWMgLypAb3duZWRAKi8gbnVsbF9zdHJp bmcgZGlzcG9zaXRpb25faGVhZGVyPU5VTEw7CnN0YXRpYyAvKkBkZXBlbmRlbnRAKi8gbnVs bF9zdHJpbmcgZGlzcG9zaXRpb25faGVhZGVyX2JvZHk9TlVMTDsKc3RhdGljIGludCBkaXNw b3NpdGlvbl9oZWFkZXJfaW5kZXg9MDsKCi8vIEZsYWcgdGhhdCB3ZSBoYWQgZXJyb3JzIHJl YWRpbmcgaGVhZGVycyBzbyBub3QgdG8gZG8gYW55dGhpbmcgZmFuY3kKc3RhdGljIGJvb2wg bWltZV9iYWQgPSBmYWxzZTsKCi8qIHRhZzogZm9vdGVyX2dsb2JhbHMgKi8KCi8vIEZvb3Rl ciB0ZXh0OyB3ZSBqdXN0IHN0b3JlIFxuIGJ1dCBpdCBpcyB0cmFuc2xhdGVkIHRvIENSTEYK Ly8gVGhlIGFjdHVhbCBidWZmZXJzCnN0YXRpYyAvKkBvd25lZEAqLyBudWxsX3N0cmluZyBw bGFpbl9mb290ZXJfYnVmZmVyID0gTlVMTDsKc3RhdGljIC8qQG93bmVkQCovIG51bGxfc3Ry aW5nIGh0bWxfZm9vdGVyX2J1ZmZlciA9IE5VTEw7CnN0YXRpYyAvKkBvd25lZEAqLyBudWxs X3N0cmluZyBtaW1lX2Zvb3Rlcl9idWZmZXIgPSBOVUxMOwovLyBQb2ludGVyIHRvIHRoZSBz dHJpbmcgd2UncmUgYWN0dWFsbHkgdXNpbmcKc3RhdGljIC8qQGRlcGVuZGVudEAqLyBudWxs X3N0cmluZyBwbGFpbl9mb290ZXIgPSBOVUxMOwpzdGF0aWMgLypAZGVwZW5kZW50QCovIG51 bGxfc3RyaW5nIGh0bWxfZm9vdGVyID0gTlVMTDsKc3RhdGljIC8qQGRlcGVuZGVudEAqLyBu dWxsX3N0cmluZyBtaW1lX2Zvb3RlciA9IE5VTEw7CnN0YXRpYyBib29sIGh0bWxfbWltZV9m b290ZXIgPSBmYWxzZTsKLy8gV2hldGhlciB0byBhdHRlbXB0IGRlbGV0aW9uIGJ5IHN1cnJv dW5kaW5nIHRoZSBmb290ZXIgd2l0aCBzcGVjaWFsIHN0cmluZ3MKc3RhdGljIGJvb2wgc21h cnRfZm9vdGVyID0gZmFsc2U7CgovKiB0YWc6IGJ1ZmZlcl9nbG9iYWxzICovCgovLyBXZSBo YXZlIGEgYnVmZmVyIHRoYXQgbWF5IGJlIHBhcnRseSBvbiBkaXNrIChkaXNrX2J1ZmZlciks IHRoZW4KLy8gaW4gbWVtb3J5IChtZW1fYnVmZmVyKS4gVGhlIG1lbW9yeSBidWZmZXIgd3Jh cHMgYXJvdW5kIGFzIG5lY2Vzc2FyeS4KLy8gVGhlIGRpc2sgYnVmZmVyIGJlZ2lucyBhdCBk aXNrX2J1ZmZlcl9zdGFydCBpbiB0aGUgZmlsZS4gVGhlIF9maWxsZWQKLy8gdmFyaWFibGVz IHNheSBob3cgbXVjaCBpcyBpbiBlYWNoIHBhcnQgb2YgdGhlIGJ1ZmZlciwgYW5kIHRoZSB0 b3RhbAovLyBpcyBpbiBidWZmZXJfZmlsbGVkLiBBIHBvcnRpb24gb2YgdGhlIGJ1ZmZlciBp cyBjb25zaWRlcmVkIHRvIGhhdmUKLy8gYmVlbiAncmVhZCc7IGJlZm9yZSB0aGlzIGlzIHRo ZSBsb29rYmVoaW5kLCBhbmQgYWZ0ZXIgdGhpcyBpcyB0aGUKLy8gbG9va2FoZWFkLiBUaGUg YnVmZmVyIG1heSBhbHNvIGJlIG1hcmtlZCBhdCBhIGNlcnRhaW4gbG9jYXRpb24sCi8vIHdo aWNoIGlzIGFuZCBzaG91bGQgYmUgYWxtb3N0IGFsd2F5cyBpbiB0aGUgbG9va2JlaGluZCAo aWYgaW4gdGhlCi8vIGxvb2thaGVhZCB0aGlzIHNob3VsZCBvbmx5IGJlIHZlcnkgdGVtcG9y YXJ5KS4KCnN0YXRpYyBjaGFyIG1lbV9idWZmZXJfc3RhcnRbbWVtX2J1ZmZlcl9zaXplXTsK c3RhdGljIGNoYXIgKiBtZW1fYnVmZmVyX2VuZCA9IG1lbV9idWZmZXJfc3RhcnQrbWVtX2J1 ZmZlcl9zaXplOwpzdGF0aWMgY2hhciAqIG1lbV9idWZmZXJfbmV4dF9lbXB0eSA9IG1lbV9i dWZmZXJfc3RhcnQ7IC8vIGxvZ2ljYWwgc3RhcnQKc3RhdGljIGNoYXIgKiBtZW1fYnVmZmVy X25leHRfZmlsbCA9IG1lbV9idWZmZXJfc3RhcnQ7IC8vIGxvZ2ljYWwgZW5kICsgMQpzdGF0 aWMgaW50IG1lbV9idWZmZXJfZmlsbGVkPTA7CgpzdGF0aWMgLypAbnVsbEAqLyBGSUxFICog ZGlza19idWZmZXIgPSBOVUxMOwovLyBDYW5ub3QgcGFzcyBta3N0ZW1wIGFuIHVud3JpdGFi bGUgc3RyaW5nLCBzbyBjYXJlZnVsIHRvIGRlY2xhcmUgdGhpcwovLyBhcyBhbiBhcnJheSwg bm90IGEgcG9pbnRlciB3aGljaCB3b3VsZCBvYnNlcnZlIHRoZSBzdHJpbmcgY29uc3RhbnQu CnN0YXRpYyBjaGFyIGRpc2tfYnVmZmVyX3RlbXBsYXRlW10gPSAiZm9vdF9maWx0ZXIuWFhY WFhYIjsKc3RhdGljIGludCBkaXNrX2J1ZmZlcl9zdGFydD0wOyAvLyBvZmZzZXQgaW50byB0 ZW1wIGZpbGUgZm9yIGJ1ZmZlcgpzdGF0aWMgaW50IGRpc2tfYnVmZmVyX2ZpbGxlZD0wOwov LyBkaXNrX2J1ZmZlcl9zb3VnaHQ6IGxvY2F0aW9uIHdlIGFyZSBhdCBpbiB0aGUgdGVtcCBm aWxlCnN0YXRpYyBpbnQgZGlza19idWZmZXJfc291Z2h0PTA7CgovLyBhdCBhbGwgdGltZXMs IGJ1ZmZlcl9maWxsZWQgPT0gbWVtX2J1ZmZlcl9maWxsZWQgKyBkaXNrX2J1ZmZlcl9maWxs ZWQKc3RhdGljIGludCBidWZmZXJfZmlsbGVkPTA7CgpzdGF0aWMgaW50IGJ1ZmZlcl9yZWFk PTA7IC8vIG9mZnNldCBpbnRvIGJ1ZmZlcgpzdGF0aWMgaW50IGJ1ZmZlcl9tYXJrPTA7IC8v IG9mZnNldCBpbnRvIGJ1ZmZlcjsgc2hvdWxkIGJlIGluIGxvb2tiZWhpbmQKc3RhdGljIGJv b2wgYnVmZmVyX21hcmtlZD1mYWxzZTsKCi8vIFRoZSBmaXJzdCBhbmQgJ2FmdGVyIGxhc3Qn IGNoYXJhY3RlcnMgdG8gcmVwbGFjZSBhcmUgc3RvcmVkCnN0YXRpYyBpbnQgcmVwbGFjZW1l bnRfc3RhcnRzW3JlcGxhY2VtZW50c19tYXhdID0gezB9OwpzdGF0aWMgaW50IHJlcGxhY2Vt ZW50X2VuZHNbcmVwbGFjZW1lbnRzX21heF0gPSB7MH07CnN0YXRpYyBjb25zdF9udWxsX3N0 cmluZyByZXBsYWNlbWVudF9zdHJpbmdzW3JlcGxhY2VtZW50c19tYXhdID0ge05VTEx9Owpz dGF0aWMgaW50IHJlcGxhY2VtZW50c19jb3VudD0wOwoKLyogdGFnOiBjYWxsYmFja19nbG9i YWxzICovCgovLyBVc2VkIHRvIGNvbW11bmljYXRlIGEgY2hhcmFjdGVyIGZyb20gdGhlIGJ1 ZmZlciB0byBjYWxsYmFja3MgYnkgdGhlCi8vIGZ1bmN0aW9ucyB0aGUgY2FsbGJhY2sgaXMg ZGlyZWN0bHkgY2FsbGVkIGJ5CnN0YXRpYyBpbnQgYnVmZmVyX2NoYXI7CgovLyBVc2VkIHRv IGNvbW11bmljYXRlIGluZm9ybWF0aW9uIGJldHdlZW4gY2FsbGJhY2sgZnVuY3Rpb25zIGFu ZCB0aGUKLy8gZnVuY3Rpb25zIHRoYXQgc2V0IHVwIHRoZSBjYWxsYmFjayAobm90IHRoZSBm dW5jdGlvbiB0aGF0IGFjdHVhbGx5Ci8vIGNhbGxzIHRoZSBjYWxsYmFjayksIGFuZCBwb3Nz aWJseSBmb3IgaW50ZXJuYWwgY2FsbGJhY2sgc3RhdGUuIFRoZQovLyBjYWxsYmFja3MgZG9j dW1lbnQgaG93IHRoZXNlIHNob3VsZCBiZSB1c2VkLiBUYWtlIHNwZWNpYWwgY2FyZSB0bwov LyBmb2xsb3cgdGhlIGluc3RydWN0aW9ucywgb3IgdGhpbmdzIHdpbGwgZ28gYmFkIGFuZCBi ZSBoYXJkIHRvIHRyYWNrCi8vIGRvd24hCnN0YXRpYyAvKkBkZXBlbmRlbnRAKi8gbnVsbF9z dHJpbmcgY2FsbGJhY2tfc2F2ZTsKc3RhdGljIGNvbnN0X251bGxfc3RyaW5nIGNhbGxiYWNr X2NvbXBhcmU7CnN0YXRpYyBpbnQgY2FsbGJhY2tfbWF0Y2g7CnN0YXRpYyBpbnQgY2FsbGJh Y2tfaW50OwpzdGF0aWMgYm9vbCBjYWxsYmFja19ib29sOwoKLyogdGFnOiBlbmNvZGluZ19n bG9iYWxzICovCgovLyBDdXJyZW50IG1vZGVzCnN0YXRpYyBlbmNvZGluZ190IGVuY29kaW5n OwpzdGF0aWMgZW5jb2RpbmdfdCBkZWNvZGluZzsKCi8vIFN0YXRlIGZvciB0aGUgcm91dGlu ZXMKc3RhdGljIGNoYXIgZW5jb2RpbmdfYnVmZmVyWzRdOwpzdGF0aWMgaW50IGVuY29kaW5n X2ZpbGxlZD0wOwpzdGF0aWMgaW50IGVuY29kaW5nX2VjaG9lZD0wOwpzdGF0aWMgY2hhciBk ZWNvZGluZ19idWZmZXJbNF07CnN0YXRpYyBpbnQgZGVjb2RpbmdfZmlsbGVkPTA7CnN0YXRp YyBpbnQgZGVjb2Rpbmdfd2hpdGU9MDsKCi8qIHRhZzogcHJvdG90eXBlcyAqLwoKLy8gQ29t bWVudHMgYXJlIG1hZGUgYXQgZnVuY3Rpb24gZGVmaW5pdGlvbnMgd2hlcmUgd2FycmFudGVk LgoKLyogdGFnOiBtYWluX3Byb3RvdHlwZXMgKi8KCmludCBtYWluKGludCBhcmdjLGNoYXIg KiBhcmd2W10pOwoKc3RhdGljIHZvaWQgbG9hZF9mb290ZXIoLypAb3V0QCovLypAc2hhcmVk QCovIGNoYXIgKiogZm9vdGVyLAoJCS8qQHJlbGRlZkAqLyBjaGFyICoqIGZvb3Rlcl9idWZm ZXIsCgkJY2hhciAqIGZpbGUsCgkJLypAdW5pcXVlQCovIGNvbnN0X251bGxfc3RyaW5nIHBy ZWZpeCwKCQkvKkB1bmlxdWVAKi8gY29uc3RfbnVsbF9zdHJpbmcgc3VmZml4KTsKCnN0YXRp YyB2b2lkIHByb2Nlc3Nfc2VjdGlvbihib29sIGFkZF9mb290ZXIsCgkJYm9vbCBjYW5fcmVl bnZlbG9wZSwgLypAbnVsbEAqLyBib29sICogcGFyZW50X25lZWRzX2Zvb3Rlcik7CgovKiB0 YWc6IGhlYWRlcl9wcm90b3R5cGVzICovCgpzdGF0aWMgaW5saW5lIHZvaWQgcmVhZF9hbmRf c2F2ZV9taW1lX2hlYWRlcnMoKTsKc3RhdGljIGNoYXIgKiByZW1vdmVfY29tbWVudHMoLypA cmV0dXJuZWRAKi8gY2hhciAqIGhlYWRlcixib29sIGV4dCk7CnN0YXRpYyBpbmxpbmUgYm9v bCBkZWxpbWl0aW5nKGNoYXIgYyxib29sIGV4dCk7CnN0YXRpYyBpbmxpbmUgdm9pZCByZW1v dmVfbWltZV9oZWFkZXJzKCk7CnN0YXRpYyBpbmxpbmUgdm9pZCBvdXRwdXRfc2F2ZWRfbWlt ZV9oZWFkZXJzKCk7CnN0YXRpYyB2b2lkIGZyZWVfc2F2ZWRfbWltZV9oZWFkZXJzKCk7CnN0 YXRpYyBib29sIC8qQGZhbHNld2hlbm51bGxAKi8gaXNfbXVsdGlwYXJ0KC8qQG51bGxAKi8v KkBvdXRAKi8gY2hhciAqKiBib3VuZGFyeSk7CnN0YXRpYyBpbmxpbmUgYm9vbCBpc19zaWdu ZWQoKTsKc3RhdGljIGlubGluZSBib29sIGlzX2FsdGVybmF0aXZlKCk7CnN0YXRpYyBpbmxp bmUgYm9vbCBpc19taXhlZCgpOwpzdGF0aWMgaW5saW5lIGJvb2wgaXNfaHRtbCgpOwpzdGF0 aWMgaW5saW5lIGJvb2wgaXNfcGxhaW4oKTsKc3RhdGljIGlubGluZSBib29sIGlzX3NpZ25h dHVyZSgpOwpzdGF0aWMgaW5saW5lIGJvb2wgaXNfYXR0YWNobWVudCgpOwpzdGF0aWMgaW5s aW5lIHZvaWQgc2V0X2RlY29kaW5nX3R5cGUoKTsKc3RhdGljIGlubGluZSB2b2lkIGNoYW5n ZV90b19taXhlZCgpOwpzdGF0aWMgaW5saW5lIHZvaWQgZ2VuZXJhdGVfYm91bmRhcnkoLypA b3V0QCovIGNoYXIgKiogYm91bmRhcnkpOwpzdGF0aWMgaW5saW5lIHZvaWQgb3V0cHV0X21p bWVfbWl4ZWRfaGVhZGVycyhjb25zdCBjaGFyICogYm91bmRhcnkpOwpzdGF0aWMgaW5saW5l IHZvaWQgb3V0cHV0X3Byb2xvZygpOwpzdGF0aWMgdm9pZCBvdXRwdXRfbWltZV9mb290ZXIo Y29uc3QgY2hhciAqIGJvdW5kYXJ5KTsKc3RhdGljIGlubGluZSB2b2lkIG91dHB1dF9ib3Vu ZGFyeShjb25zdCBjaGFyICogYm91bmRhcnkpOwpzdGF0aWMgaW5saW5lIHZvaWQgb3V0cHV0 X2ZpbmFsX2JvdW5kYXJ5KGNvbnN0IGNoYXIgKiBib3VuZGFyeSk7CnN0YXRpYyBib29sIGF0 X2ZpbmFsX2JvdW5kYXJ5KGNoYXIgKiBib3VuZGFyeSk7CgovKiB0YWc6IGZvb3Rlcl9wcm90 b3R5cGVzICovCgpzdGF0aWMgaW5saW5lIHZvaWQgcHJvY2Vzc190ZXh0X3NlY3Rpb24oYm9v bCBhZGRfZm9vdGVyLAoJCS8qQG51bGxAKi8gY29uc3QgY2hhciAqIGZvb3RlciwKCQljb25z dCBjaGFyICogcHJlZml4LCBjb25zdCBjaGFyICogc3VmZml4LCBjb25zdCBjaGFyICogcmVw bGFjZW1lbnQsCgkJY29uc3RfbnVsbF9zdHJpbmcgKiB0YWlscywgY29uc3RfbnVsbF9zdHJp bmcgKiBwYWRkaW5nLAoJCWNvbnN0X251bGxfc3RyaW5nICogZ3V0cywgY29uc3RfbnVsbF9z dHJpbmcgKiBwYWlycywKCQljaGFyICogYm91bmRhcnkpOwpzdGF0aWMgaW5saW5lIHZvaWQg cGFkKGNvbnN0X251bGxfc3RyaW5nICogcGFkZGluZywKCQljb25zdF9udWxsX3N0cmluZyAq IGd1dHMsIGNvbnN0X251bGxfc3RyaW5nICogcGFpcnMsCgkJaW50ICogcHJlZml4X3Bvcywg aW50ICogc3VmZml4X3Bvcyk7CnN0YXRpYyBpbmxpbmUgdm9pZCBtYXJrX3RhaWwoY29uc3Rf bnVsbF9zdHJpbmcgKiBwYWRkaW5nKTsKc3RhdGljIGlubGluZSB2b2lkIGVuY29kZV9mb290 ZXIoY29uc3QgY2hhciAqIGZvb3Rlcik7CgovKiB0YWc6IGJ1ZmZlcl9wcm90b3R5cGVzICov CgpzdGF0aWMgaW5saW5lIHZvaWQgcmVhZF9idWZmZXIoKTsKc3RhdGljIGlubGluZSB2b2lk IGVjaG9fYnVmZmVyKCk7CnN0YXRpYyBpbmxpbmUgdm9pZCBza2lwX2J1ZmZlcigpOwpzdGF0 aWMgaW5saW5lIHZvaWQgZWNob19sb29rYmVoaW5kKCk7CnN0YXRpYyBpbmxpbmUgdm9pZCBl bmNvZGVfbG9va2JlaGluZCgpOwpzdGF0aWMgaW5saW5lIHZvaWQgZW5jb2RlX3JlcGxhY2Vt ZW50cygpOwpzdGF0aWMgaW5saW5lIHZvaWQgbWFrZV9yZXBsYWNlbWVudHMoY2FsbGJhY2tf dCBvbmVfY2hhciwKCQljYWxsYmFja190IHN0YXJ0X21hcmtlZCk7CnN0YXRpYyBpbmxpbmUg dm9pZCBlbmNvZGVfdG9fbWFyaygpOwpzdGF0aWMgaW5saW5lIHZvaWQgZWNob19kaXNrX2J1 ZmZlcigpOwpzdGF0aWMgaW5saW5lIHZvaWQgc2tpcF9kaXNrX2J1ZmZlcigpOwpzdGF0aWMg aW5saW5lIHZvaWQgcmVhZF9ib3VuZGFyeSgvKkBvdXRAKi8gY2hhciAqKiBib3VuZGFyeSk7 CnN0YXRpYyBpbmxpbmUgdm9pZCBlY2hvX3RvX2JvdW5kYXJ5KGNvbnN0IGNoYXIgKiBib3Vu ZGFyeSk7CnN0YXRpYyBpbmxpbmUgdm9pZCBza2lwX3RvX2JvdW5kYXJ5KGNvbnN0IGNoYXIg KiBib3VuZGFyeSk7CnN0YXRpYyBpbmxpbmUgdm9pZCBkZWNvZGVfYW5kX3JlYWRfdG9fYm91 bmRhcnlfZW5jb2Rpbmdfd2hlbl9mdWxsKAoJCWNvbnN0IGNoYXIgKiBib3VuZGFyeSk7CnN0 YXRpYyBpbmxpbmUgYm9vbCBwcm9jZXNzX29uZV9saW5lX2NoZWNraW5nX2JvdW5kYXJ5KGNh bGxiYWNrX3Qgbl9jaGFycywKCQkvKkBudWxsQCovIGZ1bmN0aW9uX3QgcHJvY2VzcywgY2Fs bGJhY2tfdCBwcm9jZXNzaW5nLAoJCXdoZW5fZnVsbF90IHdoZW5fZnVsbCwgY29uc3QgY2hh ciAqIGJvdW5kYXJ5KTsKCnN0YXRpYyBpbnQgcG9zX29mKGNvbnN0IGNoYXIgKiB0ZXh0LGlu dCBmcm9tLGludCB0byk7CgpzdGF0aWMgYm9vbCBsb29rKGNhbGxiYWNrX3QgY2FsbGJhY2ss aW50IGZyb20sYm9vbCByZWFkKTsKc3RhdGljIGJvb2wgbG9va2JhY2soY2FsbGJhY2tfdCBj YWxsYmFjayxpbnQgZnJvbSxib29sIG1hcmspOwpzdGF0aWMgYm9vbCBlbXB0eShjYWxsYmFj a190IGNhbGxiYWNrKTsKc3RhdGljIGJvb2wgZmlsbChjYWxsYmFja190IGNhbGxiYWNrLCB3 aGVuX2Z1bGxfdCB3aGVuX2Z1bGwpOwoKc3RhdGljIGlubGluZSB2b2lkIGNyZWF0ZV9kaXNr X2J1ZmZlcigpOwpzdGF0aWMgdm9pZCByZW1vdmVfZGlza19idWZmZXIoKTsKc3RhdGljIGlu bGluZSB2b2lkIHNodW50X3RvX2Rpc2soaW50IG4pOwoKLyogdGFnOiBjYWxsYmFja19wcm90 b3R5cGVzICovCgpzdGF0aWMgYm9vbCBvbmVfY2hhcigpOwpzdGF0aWMgYm9vbCBlY2hvaW5n X29uZV9jaGFyKCk7CnN0YXRpYyBib29sIGVuY29kaW5nX29uZV9jaGFyKCk7CnN0YXRpYyBi b29sIG5fY2hhcnMoKTsKc3RhdGljIGJvb2wgZWNob2luZ19uX2NoYXJzKCk7CnN0YXRpYyBi b29sIGVuY29kaW5nX25fY2hhcnMoKTsKc3RhdGljIGJvb2wgc2F2aW5nX25fY2hhcnMoKTsK c3RhdGljIGJvb2wgbl9jaGFyc191bnRpbF9tYXRjaCgpOwpzdGF0aWMgYm9vbCB1bnRpbF9l b2woKTsKLy8gc3RhdGljIGJvb2wgZWNob2luZ191bnRpbF9lb2woKTsKc3RhdGljIGJvb2wg Y291bnRpbmdfdW50aWxfZW9sKCk7CnN0YXRpYyBib29sIHNhdmluZ191bnRpbF9lb2woKTsK c3RhdGljIGJvb2wgZGVjb2RpbmdfdW50aWxfZW9sKCk7Ci8vIHN0YXRpYyBib29sIHVudGls X25vX2xvb2tiZWhpbmQoKTsKc3RhdGljIGJvb2wgZWNob2luZ191bnRpbF9ub19sb29rYmVo aW5kKCk7CnN0YXRpYyBib29sIGVuY29kaW5nX3VudGlsX25vX2xvb2tiZWhpbmQoKTsKc3Rh dGljIGJvb2wgdW50aWxfbm9fZGlza19idWZmZXIoKTsKc3RhdGljIGJvb2wgZWNob2luZ191 bnRpbF9ub19kaXNrX2J1ZmZlcigpOwpzdGF0aWMgYm9vbCBlbmNvZGluZ191bnRpbF9ub19k aXNrX2J1ZmZlcigpOwpzdGF0aWMgYm9vbCB1bnRpbF9ub19idWZmZXIoKTsKLy8gc3RhdGlj IGJvb2wgZWNob2luZ191bnRpbF9ub19idWZmZXIoKTsKc3RhdGljIGJvb2wgdW50aWxfc3Rh cnRfbWFya2VkKCk7CnN0YXRpYyBib29sIGVjaG9pbmdfdW50aWxfc3RhcnRfbWFya2VkKCk7 CnN0YXRpYyBib29sIGVuY29kaW5nX3VudGlsX3N0YXJ0X21hcmtlZCgpOwpzdGF0aWMgYm9v bCB1bnRpbF9tYXRjaCgpOwpzdGF0aWMgYm9vbCBjb21wYXJpbmdfaGVhZCgpOwpzdGF0aWMg Ym9vbCBjYXNlX2luc2Vuc2l0aXZlbHlfY29tcGFyaW5nX2hlYWQoKTsKCi8qIHRhZzogZW5j b2RpbmdfcHJvdG90eXBlcyAqLwoKc3RhdGljIGlubGluZSB2b2lkIGVuY29kZV9zdHJpbmco Y29uc3QgY2hhciAqIHMpOwpzdGF0aWMgdm9pZCBlbmNvZGVjaGFyKGludCBjKTsKc3RhdGlj IGlubGluZSB2b2lkIGZpbmlzaF9lbmNvZGluZygpOwpzdGF0aWMgLypAcmVsZGVmQCovIGRl Y29kZV90IGRlY29kZWNoYXIoaW50IGMpOwpzdGF0aWMgdm9pZCBkZWNvZGVfbG9va2FoZWFk KCk7CnN0YXRpYyBpbmxpbmUgdm9pZCBmaW5pc2hfZGVjb2RpbmcoKTsKCnN0YXRpYyBpbmxp bmUgaW50IGRlY29kZV9oZXgoaW50IGMpOwpzdGF0aWMgaW5saW5lIGludCBkZWNvZGVfNjQo aW50IGMpOwpzdGF0aWMgaW5saW5lIHZvaWQgZW5jb2RlX2hleF9ieXRlKHVuc2lnbmVkIGlu dCBoKTsKc3RhdGljIGlubGluZSB2b2lkIGVuY29kZV82NCh1bnNpZ25lZCBpbnQgYik7Cgov KiB0YWc6IGVycm9yX3Byb3RvdHlwZXMgKi8KCnN0YXRpYyBpbmxpbmUgdm9pZCAqIGFsbG9j X29yX2V4aXQoc2l6ZV90IHMpIC8qQGFsbG9jYXRlcyByZXN1bHRAKi87CnN0YXRpYyBpbmxp bmUgdm9pZCAvKkBub3JldHVybndoZW50cnVlQCovCgkJcmVzb3J0X3RvX2V4aXQoYm9vbCB3 aGVuLGNvbnN0IGNoYXIgKiBtZXNzYWdlLGludCBzdGF0dXMpOwpzdGF0aWMgaW5saW5lIHZv aWQgLypAbm9yZXR1cm53aGVudHJ1ZUAqLwoJCXJlc29ydF90b19lcnJubyhib29sIHdoZW4s Y29uc3QgY2hhciAqIG1lc3NhZ2UsaW50IHN0YXR1cyk7CnN0YXRpYyBpbmxpbmUgdm9pZCBy ZXNvcnRfdG9fd2FybmluZyhib29sIHdoZW4sY29uc3QgY2hhciAqIG1lc3NhZ2UpOwpzdGF0 aWMgaW5saW5lIHZvaWQgd2FybmluZyhjb25zdCBjaGFyICogbWVzc2FnZSk7CgovKiB0YWc6 IGhlbHBlcl9wcm90b3R5cGVzICovCgpzdGF0aWMgaW5saW5lIGludCBnZXQoKTsKc3RhdGlj IGlubGluZSBpbnQgcHV0KGludCBjKTsKc3RhdGljIGlubGluZSBpbnQgcHV0c3RyKGNvbnN0 IGNoYXIgKiBzKTsKCnN0YXRpYyBpbmxpbmUgYm9vbCBjYXNlX2luc2Vuc2l0aXZlbHlfaGVh ZHMoY29uc3QgY2hhciAqIGhlYWQsY29uc3QgY2hhciAqIGJ1ZmZlcik7CgovKiB0YWc6IGZ1 bmN0aW9ucyAqLwoKLyogdGFnOiBtYWluX2Z1bmN0aW9ucyAqLwoKaW50IG1haW4oaW50IGFy Z2MsIGNoYXIgKiBhcmd2W10pIHsKCWludCBvcHQ7Cglib29sIHNob3dfdmVyc2lvbj1mYWxz ZTsKCW51bGxfc3RyaW5nIHBsYWluX2Zvb3Rlcl9maWxlPU5VTEw7CgludWxsX3N0cmluZyBo dG1sX2Zvb3Rlcl9maWxlPU5VTEw7CgludWxsX3N0cmluZyBtaW1lX2Zvb3Rlcl9maWxlPU5V TEw7CgkvLyBJbml0aWFsaXNlCglyZXNvcnRfdG9fZXJybm8oYXRleGl0KHJlbW92ZV9kaXNr X2J1ZmZlcikhPTAsCgkJCSJjYW5ub3QgcmVnaXN0ZXIgZXhpdCBmdW5jdGlvbiIsRVhfT1NF UlIpOwoJc3JhbmRvbSgodW5zaWduZWQgaW50KShnZXRwaWQoKSp0aW1lKE5VTEwpKSk7Cgkv LyBQYXJzZSBhcmdzCgl3aGlsZSAoKG9wdD1nZXRvcHQoYXJnYyxhcmd2LCJwOmg6UDpIOnNW IikpIT0tMSkgewoJCXN3aXRjaCAoKGNoYXIpb3B0KSB7CgkJY2FzZSAncCc6IHBsYWluX2Zv b3Rlcl9maWxlPW9wdGFyZzsgYnJlYWs7CgkJY2FzZSAnaCc6IGh0bWxfZm9vdGVyX2ZpbGU9 b3B0YXJnOyBicmVhazsKCQljYXNlICdQJzogbWltZV9mb290ZXJfZmlsZT1vcHRhcmc7IGh0 bWxfbWltZV9mb290ZXI9ZmFsc2U7IGJyZWFrOwoJCWNhc2UgJ0gnOiBtaW1lX2Zvb3Rlcl9m aWxlPW9wdGFyZzsgaHRtbF9taW1lX2Zvb3Rlcj10cnVlOyBicmVhazsKCQljYXNlICdzJzog c21hcnRfZm9vdGVyPXRydWU7IGJyZWFrOwoJCWNhc2UgJ1YnOiBzaG93X3ZlcnNpb249dHJ1 ZTsgYnJlYWs7CgkJZGVmYXVsdDogd2FybmluZygidW5yZWNvZ25pc2VkIGNvbW1hbmRsaW5l IG9wdGlvbiIpOwoJCX0KCX0KCWlmIChzaG93X3ZlcnNpb258fGFyZ2M8MikgewoJCXByaW50 ZigiJXNcbiIsRk9PVF9GSUxURVJfVkVSU0lPTik7CiNpZmRlZiBVTklYX0VPTAoJCXByaW50 ZigiICAgd2l0aCBVTklYIGxpbmUgZW5kaW5nc1xuIik7CiNlbHNlCgkJcHJpbnRmKCIgICB3 aXRoIERPUyBsaW5lIGVuZGluZ3NcbiIpOwojZW5kaWYKCQlwcmludGYoIiAgIHJlcG9ydGlu ZyBlcnJvcnMgdG86ICIpOwojaWZkZWYgVVNFX1NZU0xPRwoJCXByaW50Zigic3lzbG9nICIp OwojZW5kaWYKI2lmZGVmIFVTRV9TVERFUlIKCQlwcmludGYoInN0ZGVyciAiKTsKI2VuZGlm CgkJcHJpbnRmKCJcbiIpOwoJCWlmIChhcmdjPDIpIGZwcmludGYoc3RkZXJyLCIlcyIsVVNB R0UpOwoJCWlmIChzaG93X3ZlcnNpb24pIGV4aXQoRVhfT0spOwoJfQoJYXJnYy09b3B0aW5k OwoJYXJndis9b3B0aW5kOwoJcmVzb3J0X3RvX3dhcm5pbmcoYXJnYz4wLCJ1bmV4cGVjdGVk IGNvbW1hbmRsaW5lIGFyZ3VtZW50Iik7CgkvLyBMb2FkIGZvb3RlcnMKCWlmIChwbGFpbl9m b290ZXJfZmlsZSE9TlVMTCkKCQkJbG9hZF9mb290ZXIoJnBsYWluX2Zvb3RlciwmcGxhaW5f Zm9vdGVyX2J1ZmZlciwKCQkJcGxhaW5fZm9vdGVyX2ZpbGUsCgkJCXNtYXJ0X2Zvb3Rlcj9w bGFpbl9wcmVmaXg6TlVMTCxzbWFydF9mb290ZXI/cGxhaW5fc3VmZml4Ok5VTEwpOwoJaWYg KGh0bWxfZm9vdGVyX2ZpbGUhPU5VTEwpCgkJCWxvYWRfZm9vdGVyKCZodG1sX2Zvb3Rlciwm aHRtbF9mb290ZXJfYnVmZmVyLAoJCQlodG1sX2Zvb3Rlcl9maWxlLAoJCQlzbWFydF9mb290 ZXI/aHRtbF9wcmVmaXg6TlVMTCxzbWFydF9mb290ZXI/aHRtbF9zdWZmaXg6TlVMTCk7Cglp ZiAobWltZV9mb290ZXJfZmlsZSE9TlVMTCkKCQkJbG9hZF9mb290ZXIoJm1pbWVfZm9vdGVy LCZtaW1lX2Zvb3Rlcl9idWZmZXIsCgkJCW1pbWVfZm9vdGVyX2ZpbGUsTlVMTCxOVUxMKTsK CS8vIERvIHRoZSBqb2IKCXByb2Nlc3Nfc2VjdGlvbih0cnVlLHRydWUsTlVMTCk7CgkvLyBG aW5pc2gKCWlmIChwbGFpbl9mb290ZXJfYnVmZmVyIT1OVUxMKSBmcmVlKHBsYWluX2Zvb3Rl cl9idWZmZXIpOwoJaWYgKGh0bWxfZm9vdGVyX2J1ZmZlciE9TlVMTCkgZnJlZShodG1sX2Zv b3Rlcl9idWZmZXIpOwoJaWYgKG1pbWVfZm9vdGVyX2J1ZmZlciE9TlVMTCkgZnJlZShtaW1l X2Zvb3Rlcl9idWZmZXIpOwoJZXhpdChFWF9PSyk7Cn0KCnN0YXRpYyB2b2lkIGxvYWRfZm9v dGVyKC8qQG91dEAqLy8qQHNoYXJlZEAqLyBjaGFyICoqIGZvb3RlciwKCQkvKkByZWxkZWZA Ki8gY2hhciAqKiBmb290ZXJfYnVmZmVyLAoJCWNoYXIgKiBmaWxlLAoJCS8qQHVuaXF1ZUAq LyBjb25zdF9udWxsX3N0cmluZyBwcmVmaXgsCgkJLypAdW5pcXVlQCovIGNvbnN0X251bGxf c3RyaW5nIHN1ZmZpeCkgewoJRklMRSAqIGY7CglpbnQgcHJlZml4bD0wLCBmb290ZXJsPTAs IHN1ZmZpeGw9MDsKCWNoYXIgKiBmZjsKCWlmIChwcmVmaXghPU5VTEwmJnN1ZmZpeCE9TlVM TCkgewoJCXByZWZpeGw9KGludClzdHJsZW4ocHJlZml4KTsKCQlzdWZmaXhsPShpbnQpc3Ry bGVuKHN1ZmZpeCk7Cgl9CglmPWZvcGVuKGZpbGUsInIiKTsKCXJlc29ydF90b19lcnJubyhm PT1OVUxMLCJlcnJvciBvcGVuaW5nIGZvb3RlciBmaWxlIixFWF9OT0lOUFVUKTsKCXJlc29y dF90b19lcnJubyhmc2VlayhmLDAsU0VFS19FTkQpIT0wLAoJCQkiZXJyb3Igc2Vla2luZyBl bmQgb2YgZm9vdGVyIGZpbGUiLEVYX0lPRVJSKTsKCXJlc29ydF90b19lcnJubygoZm9vdGVy bD0oaW50KWZ0ZWxsKGYpKT09LTEsCgkJCSJlcnJvciBmaW5kaW5nIGZvb3RlciBsZW5ndGgi LEVYX0lPRVJSKTsKCXJlc29ydF90b19lcnJubyhmc2VlayhmLDAsU0VFS19TRVQpIT0wLAoJ CQkiZXJyb3Igc2Vla2luZyBpbiBmb290ZXIgZmlsZSIsRVhfSU9FUlIpOwoJLy8gcHJlZml4 LCBcbiwgZm9vdGVyLCBcbiwgc3VmZml4LCBcMAoJKmZvb3Rlcl9idWZmZXI9YWxsb2Nfb3Jf ZXhpdChzaXplb2YoY2hhcikqKHByZWZpeGwrZm9vdGVybCtzdWZmaXhsKzMpKTsKCSpmb290 ZXI9KmZvb3Rlcl9idWZmZXI7CgkqZm9vdGVyKz1wcmVmaXhsKzE7CglyZXNvcnRfdG9fZXJy bm8oZnJlYWQoKmZvb3RlciwxLChzaXplX3QpZm9vdGVybCxmKTwoc2l6ZV90KWZvb3Rlcmws CgkJCSJlcnJvciByZWFkaW5nIGZvb3RlciIsRVhfSU9FUlIpOwoJLy8gV2Ugc3RyaXAgb2Zm IGEgc2luZ2xlIHRyYWlsaW5nIG5ld2xpbmUgdG8ga2VlcCB0aGVtIGZyb20gYWNjdW11bGF0 aW5nCgkvLyBidXQgdG8gYWxsb3cgdGhlIHVzZXIgdGhlIG9wdGlvbiBvZiBhZGRpbmcgdGhl bSBpZiBkZXNpcmVkCglpZiAoKCpmb290ZXIpW2Zvb3RlcmwtMV09PSdcbicpIC0tZm9vdGVy bDsKCSgqZm9vdGVyKVtmb290ZXJsXT0nXDAnOwoJaWYgKHByZWZpeD09TlVMTHx8c3VmZml4 PT1OVUxMKSByZXR1cm47CgkvLyBQdXQgaW4gdGhlIHByZWZpeCBhbmQgc3VmZml4IGFzIG5l Y2Vzc2FyeQoJZmY9c3Ryc3RyKCpmb290ZXIscHJlZml4KTsKCWlmIChmZiE9TlVMTCkgewoJ CWZmPXN0cnN0cihmZixzdWZmaXgpOwoJCWlmIChmZiE9TlVMTCkgcmV0dXJuOwoJCSgqZm9v dGVyKVtmb290ZXJsXT0nXG4nOwoJCSsrZm9vdGVybDsKCQlzdHJjcHkoKmZvb3Rlcitmb290 ZXJsLHN1ZmZpeCk7CgkJKCpmb290ZXIpW2Zvb3Rlcmwrc3VmZml4bF09J1wwJzsKCX0gZWxz ZSB7CgkJZmY9c3Ryc3RyKCpmb290ZXIsc3VmZml4KTsKCQlpZiAoZmY9PU5VTEwpIHsKCQkJ KCpmb290ZXIpW2Zvb3RlcmxdPSdcbic7CgkJCSsrZm9vdGVybDsKCQkJc3RyY3B5KCpmb290 ZXIrZm9vdGVybCxzdWZmaXgpOwoJCQkoKmZvb3RlcilbZm9vdGVybCtzdWZmaXhsXT0nXDAn OwoJCX0KCQkqZm9vdGVyLT1wcmVmaXhsKzE7CgkJc3RyY3B5KCpmb290ZXIscHJlZml4KTsK CQkoKmZvb3RlcilbcHJlZml4bF09J1xuJzsKCX0KfQoKLy8gU2hvdWxkIGJlIGNhbGxlZCB3 aXRoIHRoZSBib3VuZGFyeSBmb3IgdGhlIHNlY3Rpb24gYXMgbG9va2FoZWFkCi8vIGluIHRo ZSBidWZmZXIsIGJ1dCBub3RoaW5nIG1vcmUsIGFuZCBubyBsb29rYmVoaW5kLgpzdGF0aWMg dm9pZCBwcm9jZXNzX3NlY3Rpb24oYm9vbCBhZGRfZm9vdGVyLAoJCWJvb2wgY2FuX3JlZW52 ZWxvcGUsIC8qQG51bGxAKi8gYm9vbCAqIHBhcmVudF9uZWVkc19mb290ZXIpIHsKCWNoYXIg KiBleHRlcm5hbD1OVUxMOwoJY2hhciAqIGludGVybmFsPU5VTEw7CgljaGFyICogZ2VuZXJh dGVkPU5VTEw7Cglib29sIHJlZW52ZWxvcGluZz1mYWxzZTsKCWJvb2wgY2hpbGRfbmVlZGVk X2Zvb3Rlcj1mYWxzZTsKCWJvb2wgbmVlZHNfZm9vdGVyPWZhbHNlOwoJYm9vbCB1bnNpZ25p bmc9ZmFsc2U7CglpZiAocGFyZW50X25lZWRzX2Zvb3RlciE9TlVMTCkgKnBhcmVudF9uZWVk c19mb290ZXI9ZmFsc2U7CgkvLyBUaGUgaGVhZGVycyBtdXN0IGJlIHJlYWQsIHNhdmVkIGFu ZCBlY2hvZWQgYmVmb3JlIG1ha2luZyBhbnkKCS8vIHJlY3Vyc2l2ZSBjYWxscywgYXMgSSdt IG5hdWdodHkgYW5kIHVzaW5nIGdsb2JhbHMuCglyZWFkX2JvdW5kYXJ5KCZleHRlcm5hbCk7 CglyZWFkX2FuZF9zYXZlX21pbWVfaGVhZGVycygpOwoJaWYgKG1pbWVfYmFkKSB7CgkJLy8g SWYgYW4gZXJyb3IsIGp1c3QgcmVzb3J0IHRvIGVjaG9pbmcKCQllY2hvX2J1ZmZlcigpOyAv LyBCb3VuZGFyeSBhbmQgaGVhZGVycwoJCS8vIEVuZCBoZWFkZXJzIHdpdGggdGhlIGV4dHJh IGxpbmUgYnJlYWsKCQlyZXNvcnRfdG9fZXJybm8ocHV0c3RyKCJcclxuIik9PUVPRiwKCQkJ CSJlcnJvciBlY2hvaW5nIHN0cmluZyIsRVhfSU9FUlIpOwoJCWZyZWVfc2F2ZWRfbWltZV9o ZWFkZXJzKCk7CgkJLy8gQm9keQoJCWVjaG9fdG9fYm91bmRhcnkoZXh0ZXJuYWwpOwoJCWZy ZWUoZXh0ZXJuYWwpOwoJCXJldHVybjsKCX0KCS8vIEhlYWRlcnMgZGV0ZXJtaW5pbmcgd2Ug c2tpcCB0aGlzIHNlY3Rpb24KCWlmIChpc19zaWduYXR1cmUoKSkgewoJCXNraXBfYnVmZmVy KCk7IC8vIEJvdW5kYXJ5IGFuZCBoZWFkZXJzCgkJc2tpcF90b19ib3VuZGFyeShleHRlcm5h bCk7CgkJcmV0dXJuOwoJfQoJLy8gSGVhZGVyIHByb2Nlc3NpbmcKCWlmIChpc19zaWduZWQo KSkgdW5zaWduaW5nPXRydWU7CglpZiAodW5zaWduaW5nKSBjaGFuZ2VfdG9fbWl4ZWQoKTsK CWlmIChhZGRfZm9vdGVyJiZtaW1lX2Zvb3RlciE9TlVMTCYmKAoJCQlpc19hbHRlcm5hdGl2 ZSgpfHwoaXNfbXVsdGlwYXJ0KE5VTEwpJiYhaXNfbWl4ZWQoKSl8fAoJCQkoaXNfcGxhaW4o KSYmcGxhaW5fZm9vdGVyPT1OVUxMKXx8CgkJCShpc19odG1sKCkmJmh0bWxfZm9vdGVyPT1O VUxMKQoJCQkpKSB7CgkJYWRkX2Zvb3Rlcj1mYWxzZTsKCQlpZiAoY2FuX3JlZW52ZWxvcGUp IHsKCQkJcmVlbnZlbG9waW5nPXRydWU7CgkJCXJlbW92ZV9taW1lX2hlYWRlcnMoKTsKCQl9 IGVsc2UgaWYgKHBhcmVudF9uZWVkc19mb290ZXIhPU5VTEwpICpwYXJlbnRfbmVlZHNfZm9v dGVyPXRydWU7Cgl9CgkvLyBIZWFkZXJzCgllY2hvX2J1ZmZlcigpOyAvLyBCb3VuZGFyeSBh bmQgcG9zc2libHkgbW9kaWZpZWQgaGVhZGVycwoJaWYgKHJlZW52ZWxvcGluZykgewoJCWdl bmVyYXRlX2JvdW5kYXJ5KCZnZW5lcmF0ZWQpOwoJCW91dHB1dF9taW1lX21peGVkX2hlYWRl cnMoZ2VuZXJhdGVkKTsKCQlvdXRwdXRfcHJvbG9nKCk7CgkJb3V0cHV0X2JvdW5kYXJ5KGdl bmVyYXRlZCk7CgkJb3V0cHV0X3NhdmVkX21pbWVfaGVhZGVycygpOwoJfQoJLy8gRW5kIHRo ZSBoZWFkZXJzIHdpdGggdGhlIGV4dHJhIGxpbmUgYnJlYWsKCXJlc29ydF90b19lcnJubyhw dXRzdHIoIlxyXG4iKT09RU9GLAoJCQkiZXJyb3IgZWNob2luZyBzdHJpbmciLEVYX0lPRVJS KTsKCS8vIEJvZHkgcHJvY2Vzc2luZwoJaWYgKGlzX211bHRpcGFydCgmaW50ZXJuYWwpKSB7 CgkJLy8gVGhpcyBicmFuY2ggZnJlZXMgdGhlIE1JTUUgaGVhZGVycyBiZWZvcmUgcmVjdXJz aW5nLgoJCS8vIERvbid0IGluY2x1ZGUgdGhlIHByb2xvZyBpZiBpdCB1c2VkIHRvIGJlIHNp Z25lZDsKCQkvLyBpdCB1c3VhbGx5IHNheXMgc29tZXRoaW5nIGxpa2UgJ3RoaXMgbWVzc2Fn ZSBpcyBzaWduZWQnCgkJaWYgKHVuc2lnbmluZykgewoJCQlza2lwX3RvX2JvdW5kYXJ5KGlu dGVybmFsKTsKCQkJcmVzb3J0X3RvX2Vycm5vKHB1dHN0cigiXHJcbiIpPT1FT0YsCgkJCQkJ ImVycm9yIGVjaG9pbmcgc3RyaW5nIixFWF9JT0VSUik7CgkJfSBlbHNlIHsKCQkJZWNob190 b19ib3VuZGFyeShpbnRlcm5hbCk7CgkJfQoJCS8vIFRoZSByZWN1cnNpdmUgY2FsbCBuZWVk cyB0aGVzZSBnbG9iYWxzCgkJZnJlZV9zYXZlZF9taW1lX2hlYWRlcnMoKTsKCQl3aGlsZSAo IWF0X2ZpbmFsX2JvdW5kYXJ5KGludGVybmFsKSkgewoJCQlwcm9jZXNzX3NlY3Rpb24oYWRk X2Zvb3RlcixmYWxzZSwmY2hpbGRfbmVlZGVkX2Zvb3Rlcik7CgkJCWlmIChjaGlsZF9uZWVk ZWRfZm9vdGVyKSBuZWVkc19mb290ZXI9dHJ1ZTsKCQl9CgkJaWYgKG5lZWRzX2Zvb3Rlcikg b3V0cHV0X21pbWVfZm9vdGVyKGludGVybmFsKTsKCQlmcmVlKGludGVybmFsKTsKCQllY2hv X3RvX2JvdW5kYXJ5KGV4dGVybmFsKTsKCX0gZWxzZSB7CgkJLy8gVGhpcyBicmFuY2ggZnJl ZXMgdGhlIE1JTUUgaGVhZGVycyBhdCB0aGUgZW5kCgkJaWYgKCFpc19hdHRhY2htZW50KCkm JigKCQkJCShpc19wbGFpbigpJiZwbGFpbl9mb290ZXIhPU5VTEwpfHwKCQkJCShpc19odG1s KCkmJmh0bWxfZm9vdGVyIT1OVUxMKSkpIHsKCQkvLyBhbHRlcm5hdGl2ZWx5CgkJLy8gaWYg KCFpc19hdHRhY2htZW50KCkmJigKCQkvLwkJKGlzX3BsYWluKCkmJigoYWRkX2Zvb3RlciYm cGxhaW5fZm9vdGVyIT1OVUxMKXx8c21hcnRfZm9vdGVyKSl8fAoJCS8vCQkoaXNfaHRtbCgp JiYoKGFkZF9mb290ZXImJmh0bWxfZm9vdGVyIT1OVUxMKXx8c21hcnRfZm9vdGVyKSkpKSB7 CgkJCWlmIChpc19wbGFpbigpKSB7CgkJCQlwcm9jZXNzX3RleHRfc2VjdGlvbihhZGRfZm9v dGVyLHBsYWluX2Zvb3RlciwKCQkJCQkJcGxhaW5fcHJlZml4LHBsYWluX3N1ZmZpeCxwbGFp bl9yZXBsYWNlbWVudCwKCQkJCQkJcGxhaW5fdGFpbHMscGxhaW5fcGFkZGluZyxwbGFpbl9n dXRzLHBsYWluX3BhaXJzLGV4dGVybmFsKTsKCQkJfSBlbHNlIHsKCQkJCXByb2Nlc3NfdGV4 dF9zZWN0aW9uKGFkZF9mb290ZXIsaHRtbF9mb290ZXIsCgkJCQkJCWh0bWxfcHJlZml4LGh0 bWxfc3VmZml4LGh0bWxfcmVwbGFjZW1lbnQsCgkJCQkJCWh0bWxfdGFpbHMsaHRtbF9wYWRk aW5nLGh0bWxfZ3V0cyxodG1sX3BhaXJzLGV4dGVybmFsKTsKCQkJfQoJCX0gZWxzZSB7CgkJ CWVjaG9fdG9fYm91bmRhcnkoZXh0ZXJuYWwpOwoJCX0KCQlmcmVlX3NhdmVkX21pbWVfaGVh ZGVycygpOwoJfQoJLy8gTUlNRSBzdHVmZiBpcyBmcmVlZCBub3c7IHRha2UgY2FyZSBub3Qg dG8gdXNlIGl0LgoJLypALWJyYW5jaHN0YXRlQCovCglpZiAocmVlbnZlbG9waW5nKSB7CgkJ Ly8gV2UgZW5zdXJlIGdlbmVyYXRlZCBpcyBub3QgbnVsbCBpbiBhbm90aGVyIGlmKHJlZW52 ZWxvcGluZykKCQkvLyBjb25kaXRpb25hbCBhYm92ZQoJCS8qQC1udWxscGFzc0AqLwoJCW91 dHB1dF9taW1lX2Zvb3RlcihnZW5lcmF0ZWQpOwoJCW91dHB1dF9maW5hbF9ib3VuZGFyeShn ZW5lcmF0ZWQpOwoJCWZyZWUoZ2VuZXJhdGVkKTsKCQkvKkA9bnVsbHBhc3NAKi8KCX0KCS8q QD1icmFuY2hzdGF0ZUAqLwoJZnJlZShleHRlcm5hbCk7Cn0KCi8qIHRhZzogaGVhZGVyX2Z1 bmN0aW9ucyAqLwoKc3RhdGljIGlubGluZSB2b2lkIHJlYWRfYW5kX3NhdmVfbWltZV9oZWFk ZXJzKCkgewoJLypALW11c3RmcmVlb25seUAqLwoJbWltZV9iYWQ9ZmFsc2U7CgkvLyBNYXJr IGN1cnJlbnQgZW5kIG9mIGJ1ZmZlcgoJYnVmZmVyX21hcms9YnVmZmVyX3JlYWQ7CglidWZm ZXJfbWFya2VkPXRydWU7Cglmb3IgKDs7KSB7CgkJZG8gewoJCQkvLyBFeHRlbmQgY3VycmVu dCBoZWFkZXIgdW50aWwgYmVnaW5uaW5nIG9mIG5leHQKCQkJY2FsbGJhY2tfYm9vbD1mYWxz ZTsKCQkJKHZvaWQpZmlsbCh1bnRpbF9lb2wsc2h1bnQpOwoJCQlpZiAoYnVmZmVyX2ZpbGxl ZD09YnVmZmVyX3JlYWQpIHsKCQkJCS8vIFdlIHByb2JhYmx5IGhpdCBFT0Y7IGp1c3QgZ2V0 IG91dCwgYW5kIHRoZSB3aG9sZQoJCQkJLy8gbWFpbCB3aWxsIGVuZCB1cCBlY2hvZWQgb3V0 CgkJCQl3YXJuaW5nKCJ1bmV4cGVjdGVkIGVuZCBvZiBpbnB1dCIpOwoJCQkJYnJlYWs7CgkJ CX0KCQkJKHZvaWQpbG9vayhvbmVfY2hhcixidWZmZXJfcmVhZCxmYWxzZSk7CgkJCWlmIChj YWxsYmFja19pbnQ9PShpbnQpJyAnfHxjYWxsYmFja19pbnQ9PShpbnQpJ1x0JykgewoJCQkJ Ly8gQ29udGludWF0aW9uIG9mIHByZXZpb3VzIGhlYWRlcjsgcmVhZCBpdAoJCQkJcmVhZF9i dWZmZXIoKTsKCQkJCWNvbnRpbnVlOwoJCQl9CgkJCS8vIFN0YXJ0IG9mIG5ldyBoZWFkZXI7 IGRvbid0IHJlYWQgaXQ7IHByb2Nlc3MgdGhlIG9sZCBvbmUKCQkJLy8gKGZyb20gdGhlIG1h cmsgdG8gdGhlIGVuZCBvZiB0aGUgbG9va2JlaGluZCkKCQkJYnJlYWs7CgkJfSB3aGlsZSAo dHJ1ZSk7CgkJLy8gUHJvY2VzcyB0aGUgb2xkIGhlYWRlciwgaWYgdGhlcmUgaXMgb25lCgkJ aWYgKGJ1ZmZlcl9tYXJrPGJ1ZmZlcl9yZWFkKSB7CgkJCWRvIHsKCQkJCWNhbGxiYWNrX2Nv bXBhcmU9Ik1JTUUtVmVyc2lvbjoiOwoJCQkJKHZvaWQpbG9vayhjYXNlX2luc2Vuc2l0aXZl bHlfY29tcGFyaW5nX2hlYWQsYnVmZmVyX21hcmssZmFsc2UpOwoJCQkJaWYgKGNhbGxiYWNr X2Jvb2wpIHsKCQkJCQkvLyBNSU1FIHZlcnNpb24gaGVhZGVyCgkJCQkJdmVyc2lvbl9oZWFk ZXJfc3RhcnQ9YnVmZmVyX21hcms7CgkJCQkJdmVyc2lvbl9oZWFkZXJfZW5kPWJ1ZmZlcl9y ZWFkOwoJCQkJCXZlcnNpb25faGVhZGVyPWFsbG9jX29yX2V4aXQoc2l6ZW9mKGNoYXIpKihi dWZmZXJfcmVhZC1idWZmZXJfbWFyaysxKSk7CgkJCQkJY2FsbGJhY2tfc2F2ZT12ZXJzaW9u X2hlYWRlcjsKCQkJCQljYWxsYmFja19pbnQ9YnVmZmVyX3JlYWQtYnVmZmVyX21hcms7CgkJ CQkJY2FsbGJhY2tfc2F2ZVtjYWxsYmFja19pbnRdPSdcMCc7CgkJCQkJKHZvaWQpbG9vayhz YXZpbmdfbl9jaGFycyxidWZmZXJfbWFyayxmYWxzZSk7CgkJCQkJY2FsbGJhY2tfc2F2ZT1O VUxMOwoJCQkJCXZlcnNpb25faGVhZGVyX2JvZHk9cmVtb3ZlX2NvbW1lbnRzKHZlcnNpb25f aGVhZGVyLHRydWUpOwoJCQkJCWlmICghY2FzZV9pbnNlbnNpdGl2ZWx5X2hlYWRzKCIxLjAi LHZlcnNpb25faGVhZGVyX2JvZHkpKSB7CgkJCQkJCW1pbWVfYmFkPXRydWU7CgkJCQkJfQoJ CQkJCWJyZWFrOwoJCQkJfQoJCQkJY2FsbGJhY2tfY29tcGFyZT0iQ29udGVudC0iOwoJCQkJ KHZvaWQpbG9vayhjYXNlX2luc2Vuc2l0aXZlbHlfY29tcGFyaW5nX2hlYWQsYnVmZmVyX21h cmssZmFsc2UpOwoJCQkJaWYgKCFjYWxsYmFja19ib29sKSBicmVhazsKCQkJCS8vIEFub3Ro ZXIgTUlNRSBoZWFkZXIKCQkJCWlmIChtaW1lX2hlYWRlcnNfY291bnQ9PW1pbWVfaGVhZGVy c19tYXgpIHsKCQkJCQl3YXJuaW5nKCJ0b28gbWFueSBNSU1FIGhlYWRlcnMiKTsKCQkJCQlt aW1lX2JhZD10cnVlOwoJCQkJCWJyZWFrOwoJCQkJfQoJCQkJbWltZV9oZWFkZXJfc3RhcnRz W21pbWVfaGVhZGVyc19jb3VudF09YnVmZmVyX21hcms7CgkJCQltaW1lX2hlYWRlcl9lbmRz W21pbWVfaGVhZGVyc19jb3VudF09YnVmZmVyX3JlYWQ7CgkJCQlzYXZlZF9taW1lX2hlYWRl cnNbbWltZV9oZWFkZXJzX2NvdW50XT0KCQkJCQkJYWxsb2Nfb3JfZXhpdChzaXplb2YoY2hh cikqKGJ1ZmZlcl9yZWFkLWJ1ZmZlcl9tYXJrKSsxKTsKCQkJCXNhdmVkX21pbWVfaGVhZGVy c1ttaW1lX2hlYWRlcnNfY291bnRdWzBdPSdcMCc7CgkJCQljYWxsYmFja19zYXZlPXNhdmVk X21pbWVfaGVhZGVyc1ttaW1lX2hlYWRlcnNfY291bnRdOwoJCQkJY2FsbGJhY2tfaW50PWJ1 ZmZlcl9yZWFkLWJ1ZmZlcl9tYXJrOwoJCQkJY2FsbGJhY2tfc2F2ZVtjYWxsYmFja19pbnRd PSdcMCc7CgkJCQkodm9pZClsb29rKHNhdmluZ19uX2NoYXJzLGJ1ZmZlcl9tYXJrLGZhbHNl KTsKCQkJCWNhbGxiYWNrX2NvbXBhcmU9IkNvbnRlbnQtVHlwZToiOwoJCQkJKHZvaWQpbG9v ayhjYXNlX2luc2Vuc2l0aXZlbHlfY29tcGFyaW5nX2hlYWQsYnVmZmVyX21hcmssZmFsc2Up OwoJCQkJaWYgKGNhbGxiYWNrX2Jvb2wpIHsKCQkJCQl0eXBlX2hlYWRlcj1hbGxvY19vcl9l eGl0KHNpemVvZihjaGFyKSooYnVmZmVyX3JlYWQtYnVmZmVyX21hcmsrMSkpOwoJCQkJCXN0 cmNweSh0eXBlX2hlYWRlcixzYXZlZF9taW1lX2hlYWRlcnNbbWltZV9oZWFkZXJzX2NvdW50 XSk7CgkJCQkJdHlwZV9oZWFkZXJfYm9keT1yZW1vdmVfY29tbWVudHModHlwZV9oZWFkZXIs dHJ1ZSk7CgkJCQkJdHlwZV9oZWFkZXJfaW5kZXg9bWltZV9oZWFkZXJzX2NvdW50OwoJCQkJ CSsrbWltZV9oZWFkZXJzX2NvdW50OwoJCQkJCWJyZWFrOwoJCQkJfQoJCQkJY2FsbGJhY2tf Y29tcGFyZT0iQ29udGVudC1UcmFuc2Zlci1FbmNvZGluZzoiOwoJCQkJKHZvaWQpbG9vayhj YXNlX2luc2Vuc2l0aXZlbHlfY29tcGFyaW5nX2hlYWQsYnVmZmVyX21hcmssZmFsc2UpOwoJ CQkJaWYgKGNhbGxiYWNrX2Jvb2wpIHsKCQkJCQl0cmFuc2Zlcl9oZWFkZXI9YWxsb2Nfb3Jf ZXhpdChzaXplb2YoY2hhcikqKGJ1ZmZlcl9yZWFkLWJ1ZmZlcl9tYXJrKzEpKTsKCQkJCQlz dHJjcHkodHJhbnNmZXJfaGVhZGVyLHNhdmVkX21pbWVfaGVhZGVyc1ttaW1lX2hlYWRlcnNf Y291bnRdKTsKCQkJCQl0cmFuc2Zlcl9oZWFkZXJfYm9keT1yZW1vdmVfY29tbWVudHModHJh bnNmZXJfaGVhZGVyLHRydWUpOwoJCQkJCXRyYW5zZmVyX2hlYWRlcl9pbmRleD1taW1lX2hl YWRlcnNfY291bnQ7CgkJCQkJKyttaW1lX2hlYWRlcnNfY291bnQ7CgkJCQkJYnJlYWs7CgkJ CQl9CgkJCQljYWxsYmFja19jb21wYXJlPSJDb250ZW50LURpc3Bvc2l0aW9uOiI7CgkJCQko dm9pZClsb29rKGNhc2VfaW5zZW5zaXRpdmVseV9jb21wYXJpbmdfaGVhZCxidWZmZXJfbWFy ayxmYWxzZSk7CgkJCQlpZiAoY2FsbGJhY2tfYm9vbCkgewoJCQkJCWRpc3Bvc2l0aW9uX2hl YWRlcj1hbGxvY19vcl9leGl0KHNpemVvZihjaGFyKSooYnVmZmVyX3JlYWQtYnVmZmVyX21h cmsrMSkpOwoJCQkJCXN0cmNweShkaXNwb3NpdGlvbl9oZWFkZXIsc2F2ZWRfbWltZV9oZWFk ZXJzW21pbWVfaGVhZGVyc19jb3VudF0pOwoJCQkJCWRpc3Bvc2l0aW9uX2hlYWRlcl9ib2R5 PXJlbW92ZV9jb21tZW50cyhkaXNwb3NpdGlvbl9oZWFkZXIsdHJ1ZSk7CgkJCQkJZGlzcG9z aXRpb25faGVhZGVyX2luZGV4PW1pbWVfaGVhZGVyc19jb3VudDsKCQkJCQkrK21pbWVfaGVh ZGVyc19jb3VudDsKCQkJCQlicmVhazsKCQkJCX0KCQkJCSsrbWltZV9oZWFkZXJzX2NvdW50 OwoJCQl9IHdoaWxlIChmYWxzZSk7CgkJfQoJCS8vIE1hcmsgdGhlIG5ldyBoZWFkZXIKCQli dWZmZXJfbWFyaz1idWZmZXJfcmVhZDsKCQlpZiAoYnVmZmVyX3JlYWQ9PWJ1ZmZlcl9maWxs ZWQpIHsKCQkJLy8gRU9GOyByZXR1cm4KCQkJcmV0dXJuOwoJCX0KCQkvLyBSZWFkIHRoZSBm aXJzdCBwYXJ0IG9mIHRoZSBuZXcgaGVhZGVyOyBsb29wIHRvIHJlYWQgcmVzdAoJCXJlYWRf YnVmZmVyKCk7CgkJY2FsbGJhY2tfY29tcGFyZT0iXHJcbiI7CgkJKHZvaWQpbG9vayhjb21w YXJpbmdfaGVhZCxidWZmZXJfbWFyayxmYWxzZSk7CgkJaWYgKGNhbGxiYWNrX2Jvb2wpIHsK CQkJLy8gRW5kIG9mIGhlYWRlcnM7IHN0cmlwIHRoZSBleHRyYSBsaW5lOyByZXR1cm4KCQkJ cmVzb3J0X3RvX2V4aXQocmVwbGFjZW1lbnRzX2NvdW50PT1yZXBsYWNlbWVudHNfbWF4LAoJ CQkJCSJpbnRlcm5hbCBlcnJvcjogdG9vIG1hbnkgcmVwbGFjZW1lbnRzIixFWF9TT0ZUV0FS RSk7CgkJCXJlcGxhY2VtZW50X3N0YXJ0c1tyZXBsYWNlbWVudHNfY291bnRdPWJ1ZmZlcl9y ZWFkLTI7CgkJCXJlcGxhY2VtZW50X2VuZHNbcmVwbGFjZW1lbnRzX2NvdW50XT1idWZmZXJf cmVhZDsKCQkJcmVwbGFjZW1lbnRfc3RyaW5nc1tyZXBsYWNlbWVudHNfY291bnRdPU5VTEw7 CgkJCSsrcmVwbGFjZW1lbnRzX2NvdW50OwoJCQlyZXR1cm47CgkJfQoJfQoJLypAPW11c3Rm cmVlb25seUAqLwp9Ci8vIFJldHVybnMgYSBwb2ludGVyIHRvIHRoZSBib2R5IHBhcnQgb2Yg dGhlIGhlYWRlciBmaWVsZApzdGF0aWMgY2hhciAqIHJlbW92ZV9jb21tZW50cygvKkByZXR1 cm5lZEAqLyBjaGFyICogaGVhZGVyLGJvb2wgZXh0KSB7CgkvLyBUaGlzIHJlbW92ZXMgY29t bWVudHMgYW5kIGFueSBzdXBlcmZsdW91cyB3aGl0ZXNwYWNlIGluIHRoZQoJLy8gaGVhZGVy IChhIHN0cnVjdHVyZWQgaGVhZGVyLCB0aGF0IGlzLCBSRkM4MjIpOyBpdCBmaWRkbGVzIHdp dGgKCS8vIHRoZSBxdW90ZWQgc3RyaW5ncyBpbiBzdWNoIGEgd2F5IHRoYXQgYmFja3NsYXNo IGVzY2FwaW5nIG1lYW5zCgkvLyBzaW1wbHkgdGFrZSB0aGUgbmV4dCBjaGFyYWN0ZXIgbGl0 ZXJhbGx5LCByYXRoZXIgdGhhbiBuZWVkaW5nCgkvLyB0byBkbyBmdW5ueSB0aGluZ3Mgd2l0 aCBmb2xkZWQgc3RyaW5ncy4gVGhlIHJlc3VsdCBpcyBub3Qgc3VpdGFibGUKCS8vIGZvciBv dXRwdXQuCgljaGFyICogaD1oZWFkZXI7CgljaGFyICogaGg7CgljaGFyICogaGhoOwoJY2hh ciAqIGJvZHk9TlVMTDsKCWNoYXIgY2xvc2U7CglpbnQgbGV2ZWxzPTA7Cgl3aGlsZSAoKmgh PSc6JykgKytoOwoJKytoOwoJaWYgKCpoPT0nICd8fCpoPT0nXHQnKSArK2g7Cglib2R5PWg7 CgloaD1oOwoJd2hpbGUgKCpoIT0nXDAnKSB7CgkJaWYgKCpoPT0nXHInJiYqKGgrMSk9PSdc bicpIHsKCQkJaCs9MjsKCQkJY29udGludWU7CgkJfSBlbHNlIGlmICgoKmg9PScgJ3x8Kmg9 PSdcdCcpJiZkZWxpbWl0aW5nKCooaGgtMSksZXh0KSkgewoJCQkrK2g7CgkJCWNvbnRpbnVl OwoJCX0gZWxzZSBpZiAoZGVsaW1pdGluZygqaCxleHQpJiYoKihoaC0xKT09JyAnfHwqKGho LTEpPT0nXHQnKSkgewoJCQlpZiAoaGghPWJvZHkpIC0taGg7CgkJfQoJCWlmICgqaD09Jygn KSB7CgkJCSsraDsKCQkJbGV2ZWxzPTE7CgkJCXdoaWxlIChsZXZlbHM+MCkgewoJCQkJaWYg KCpoPT0nXDAnKSBicmVhazsKCQkJCWlmICgqaD09J1xcJykgewoJCQkJCSsraDsKCQkJCQlp ZiAoKmg9PSdcMCcpIGJyZWFrOwoJCQkJfQoJCQkJZWxzZSBpZiAoKmg9PScoJykgKytsZXZl bHM7CgkJCQllbHNlIGlmICgqaD09JyknKSAtLWxldmVsczsKCQkJCSsraDsKCQkJfQoJCQlp ZiAoIWRlbGltaXRpbmcoKmgsZXh0KSYmIWRlbGltaXRpbmcoKihoaC0xKSxleHQpKSB7CgkJ CQkvLyBQdXQgaW4gc29tZSB3aGl0ZXNwYWNlIGlmIHNvbWV0aGluZyBkZWxpbWl0aW5nIGlz bid0CgkJCQkvLyBjb21pbmcgYW5kIGhhc24ndCBqdXN0IGJlZW4KCQkJCSpoaD0nICc7CgkJ CQkrK2hoOwoJCQl9CgkJCWNvbnRpbnVlOwoJCX0gZWxzZSBpZiAoKmg9PSciJ3x8Kmg9PSdb JykgewoJCQlpZiAoKmg9PSdbJykgY2xvc2U9J10nOwoJCQllbHNlIGNsb3NlPSciJzsKCQkJ KmhoPSpoOwoJCQkrK2g7ICsraGg7CgkJCWhoaD1oaDsKCQkJd2hpbGUgKCpoIT0nXDAnJiYq aCE9Y2xvc2UpIHsKCQkJCWlmICgqaD09J1xcJykgewoJCQkJCSpoaD0qaDsKCQkJCQkrK2ho OyArK2g7CgkJCQkJaWYgKCpoPT0nXDAnKSBicmVhazsKCQkJCQlpZiAoKmg9PSdccicmJioo aCsxKT09J1xuJykgewoJCQkJCQkqaGg9Kmg7ICsraGg7ICsraDsKCQkJCQkJKmhoPSpoOyAr K2hoOyArK2g7CgkJCQkJCWlmICgqaD09J1wwJykgYnJlYWs7CgkJCQkJCSsraGg7ICsraDsK CQkJCQkJY29udGludWU7CgkJCQkJfQoJCQkJfSBlbHNlIGlmICgqaD09KGNoYXIpOCkgewoJ CQkJCS0taGg7ICsraDsKCQkJCQlpZiAoaGg8aGhoKSBoaD1oaGg7CgkJCQkJY29udGludWU7 CgkJCQl9IGVsc2UgaWYgKCpoPT0nXHInJiYqKGgrMSk9PSdcbicpIHsKCQkJCQloKz0yOwoJ CQkJCWNvbnRpbnVlOwoJCQkJCS8vIGFsdGVybmF0aXZlbHkKCQkJCQkvLyAqaGg9Kmg7ICsr aGg7ICsraDsKCQkJCQkvLyAqaGg9Kmg7ICsraGg7ICsraDsKCQkJCQkvLyBpZiAoKmg9PSdc MCcpIGJyZWFrOwoJCQkJCS8vICsraDsKCQkJCQkvLyBjb250aW51ZTsKCQkJCQkvLyBvciBw ZXJoYXBzIGV2ZW4gKHRoZSBzcGVjIGlzIGEgYml0IGFtYmlndW91cykKCQkJCQkvLyBoKz0y OwoJCQkJCS8vIGlmICgqaD09J1wwJykgYnJlYWs7CgkJCQkJLy8gKytoOwoJCQkJCS8vIGNv bnRpbnVlOwoJCQkJfQoJCQkJKmhoPSpoOwoJCQkJKytoOyArK2hoOwoJCQl9CgkJCWlmICgq aD09J1wwJykgYnJlYWs7CgkJfQoJCSpoaD0qaDsKCQkrK2g7ICsraGg7Cgl9CglpZiAoKiho aC0xKT09JyAnKSAqKGhoLTEpPSdcMCc7CgllbHNlICpoaD0nXDAnOwoJcmV0dXJuIGJvZHk7 Cn0Kc3RhdGljIGlubGluZSBib29sIGRlbGltaXRpbmcoY2hhciBjLGJvb2wgZXh0KSB7Cgkv LyAnZXh0JyAoZXh0ZW5kZWQpIGRlbGltaXRlcnMgaW5jbHVkZSAnLycsICc/JyBhbmQgJz0n IGFuZCBhc3Npc3QKCS8vIGJ5IHJlbW92aW5nIHdoaXRlc3BhY2Ugc3Vycm91bmRpbmcgdGhv c2UsIGFzIHRoZXNlIGFyZQoJLy8gZGVsaW1pdGVycyBpbiB0aGUgTUlNRSBoZWFkZXIgZmll bGRzLCBldmVuIHRob3VnaCBub3QgUkZDODIyOwoJLy8gbm90ZSB0aGF0IE1JTUUgZG9lc24n dCB1c2UgJy4nIGJ1dCB3ZSBzdGlsbCBkby4KCXJldHVybiAoYz09JyAnfHxjPT0nXHQnfHxj PT0nPCd8fGM9PSc+J3x8Yz09J0AnfHwKCQkJYz09JywnfHxjPT0nOyd8fGM9PSc6J3x8Yz09 J1xcJ3x8Yz09JyInfHwKCQkJYz09Jy4nfHxjPT0nWyd8fGM9PSddJ3x8CgkJCShleHQmJihj PT0nLyd8fGM9PSc9J3x8Yz09Jz8nKSkpOwp9CnN0YXRpYyBpbmxpbmUgdm9pZCByZW1vdmVf bWltZV9oZWFkZXJzKCkgewoJaW50IGg7Cglmb3IgKGg9MDtoPG1pbWVfaGVhZGVyc19jb3Vu dDsrK2gpIHsKCQlyZXNvcnRfdG9fZXhpdChyZXBsYWNlbWVudHNfY291bnQ9PXJlcGxhY2Vt ZW50c19tYXgsCgkJCQkiaW50ZXJuYWwgZXJyb3I6IHRvbyBtYW55IHJlcGxhY2VtZW50cyIs RVhfU09GVFdBUkUpOwoJCXJlcGxhY2VtZW50X3N0YXJ0c1tyZXBsYWNlbWVudHNfY291bnRd PW1pbWVfaGVhZGVyX3N0YXJ0c1toXTsKCQlyZXBsYWNlbWVudF9lbmRzW3JlcGxhY2VtZW50 c19jb3VudF09bWltZV9oZWFkZXJfZW5kc1toXTsKCQlyZXBsYWNlbWVudF9zdHJpbmdzW3Jl cGxhY2VtZW50c19jb3VudF09TlVMTDsKCQkrK3JlcGxhY2VtZW50c19jb3VudDsKCX0KCWlm ICh2ZXJzaW9uX2hlYWRlciE9TlVMTCkgewoJCXJlc29ydF90b19leGl0KHJlcGxhY2VtZW50 c19jb3VudD09cmVwbGFjZW1lbnRzX21heCwKCQkJCSJpbnRlcm5hbCBlcnJvcjogdG9vIG1h bnkgcmVwbGFjZW1lbnRzIixFWF9TT0ZUV0FSRSk7CgkJcmVwbGFjZW1lbnRfc3RhcnRzW3Jl cGxhY2VtZW50c19jb3VudF09dmVyc2lvbl9oZWFkZXJfc3RhcnQ7CgkJcmVwbGFjZW1lbnRf ZW5kc1tyZXBsYWNlbWVudHNfY291bnRdPXZlcnNpb25faGVhZGVyX2VuZDsKCQlyZXBsYWNl bWVudF9zdHJpbmdzW3JlcGxhY2VtZW50c19jb3VudF09TlVMTDsKCQkrK3JlcGxhY2VtZW50 c19jb3VudDsKCX0KfQpzdGF0aWMgaW5saW5lIHZvaWQgb3V0cHV0X3NhdmVkX21pbWVfaGVh ZGVycygpIHsKCWludCBoOwoJZm9yIChoPTA7aDxtaW1lX2hlYWRlcnNfY291bnQ7KytoKSB7 CgkJLy8gVGhlIGhlYWRlciBpbmNsdWRlcyBpdHMgdGVybWluYXRpbmcgQ1JMRgoJCS8qQC1u dWxscGFzc0AqLwoJCXJlc29ydF90b19lcnJubyhwdXRzdHIoc2F2ZWRfbWltZV9oZWFkZXJz W2hdKT09RU9GLAoJCQkJImVycm9yIGVjaG9pbmcgc3RyaW5nIixFWF9JT0VSUik7CgkJLypA PW51bGxwYXNzQCovCgl9Cn0Kc3RhdGljIHZvaWQgZnJlZV9zYXZlZF9taW1lX2hlYWRlcnMo KSB7CglpbnQgaDsKCWZvciAoaD0wO2g8bWltZV9oZWFkZXJzX2NvdW50OysraCkgewoJCS8q QC1udWxscGFzc0AqLwoJCWZyZWUoc2F2ZWRfbWltZV9oZWFkZXJzW2hdKTsKCQkvKkA9bnVs bHBhc3NAKi8KCX0KCW1pbWVfaGVhZGVyc19jb3VudD0wOwoJaWYgKHZlcnNpb25faGVhZGVy IT1OVUxMKSBmcmVlKHZlcnNpb25faGVhZGVyKTsKCXZlcnNpb25faGVhZGVyPU5VTEw7Cgl2 ZXJzaW9uX2hlYWRlcl9ib2R5PU5VTEw7CglpZiAodHlwZV9oZWFkZXIhPU5VTEwpIGZyZWUo dHlwZV9oZWFkZXIpOwoJdHlwZV9oZWFkZXI9TlVMTDsKCXR5cGVfaGVhZGVyX2JvZHk9TlVM TDsKCWlmICh0cmFuc2Zlcl9oZWFkZXIhPU5VTEwpIGZyZWUodHJhbnNmZXJfaGVhZGVyKTsK CXRyYW5zZmVyX2hlYWRlcj1OVUxMOwoJdHJhbnNmZXJfaGVhZGVyX2JvZHk9TlVMTDsKCWlm IChkaXNwb3NpdGlvbl9oZWFkZXIhPU5VTEwpIGZyZWUoZGlzcG9zaXRpb25faGVhZGVyKTsK CWRpc3Bvc2l0aW9uX2hlYWRlcj1OVUxMOwoJZGlzcG9zaXRpb25faGVhZGVyX2JvZHk9TlVM TDsKfQpzdGF0aWMgYm9vbCAvKkBmYWxzZXdoZW5udWxsQCovIGlzX211bHRpcGFydCgvKkBu dWxsQCovLypAb3V0QCovIGNoYXIgKiogYm91bmRhcnkpIHsKCWNoYXIgKiBiOwoJLypAZGVw ZW5kZW50QCovIGNoYXIgKiBiYjsKCWludCBsPTA7CglpZiAodHlwZV9oZWFkZXJfYm9keT09 TlVMTHx8CgkJCSFjYXNlX2luc2Vuc2l0aXZlbHlfaGVhZHMoIm11bHRpcGFydC8iLHR5cGVf aGVhZGVyX2JvZHkpKSB7CgkJaWYgKGJvdW5kYXJ5IT1OVUxMKSAqYm91bmRhcnk9TlVMTDsK CQlyZXR1cm4gZmFsc2U7Cgl9CgliPXR5cGVfaGVhZGVyX2JvZHkrMTA7Cglmb3IgKDs7KSB7 CgkJd2hpbGUgKCpiIT0nXDAnJiYqYiE9JzsnKSArK2I7CgkJaWYgKCpiPT0nXDAnKSB7CgkJ CXdhcm5pbmcoIm5vIGJvdW5kYXJ5IGdpdmVuIik7CgkJCWlmIChib3VuZGFyeSE9TlVMTCkg KmJvdW5kYXJ5PU5VTEw7CgkJCXJldHVybiBmYWxzZTsKCQl9CgkJKytiOwoJCWlmIChjYXNl X2luc2Vuc2l0aXZlbHlfaGVhZHMoImJvdW5kYXJ5PSIsYikpIGJyZWFrOwoJfQoJYis9OTsK CWlmICgqYj09JyInKSB7CgkJZm9yIChiYj1iKzE7KmJiIT0nXDAnJiYqYmIhPSciJzsrK2Ji KSB7CgkJCWlmICgqYmI9PSdcXCcpIHsKCQkJCSsrYmI7CgkJCQlpZiAoKmJiPT0nXDAnKSBi cmVhazsKCQkJfQoJCQkrK2w7CgkJfQoJCWlmICgqYmI9PSdcMCcpIHsKCQkJd2FybmluZygi ZXJyb3IgaW4gYm91bmRhcnkgc3ludGF4Iik7CgkJCWlmIChib3VuZGFyeSE9TlVMTCkgKmJv dW5kYXJ5PU5VTEw7CgkJCXJldHVybiBmYWxzZTsKCQl9Cgl9IGVsc2UgewoJCS8vIE1JTUUg dG9rZW5zIGNhbiBpbmNsdWRlICcuJwoJCWZvciAoYmI9YjsqYmIhPSdcMCcmJighZGVsaW1p dGluZygqYmIsdHJ1ZSl8fCpiYj09Jy4nKTsrK2JiKSArK2w7Cgl9CgkvKkAtbXVzdGRlZmlu ZUAqLwoJaWYgKGJvdW5kYXJ5PT1OVUxMKSByZXR1cm4gdHJ1ZTsKCS8qQD1tdXN0ZGVmaW5l QCovCgkvLyBSb29tIGZvciBsZWFkaW5nIGFuZCB0cmFpbGluZyAnLS0nLCBhbmQgdGVybWlu YXRvcgoJKmJvdW5kYXJ5PWFsbG9jX29yX2V4aXQoc2l6ZW9mKGNoYXIpKihsKzUpKTsKCWJi PSpib3VuZGFyeTsKCSpiYisrPSctJzsKCSpiYisrPSctJzsKCWlmICgqYj09JyInKSB7CgkJ KytiOwoJCXdoaWxlICgqYiE9J1wwJyYmKmIhPSciJykgewoJCQlpZiAoKmI9PSdcXCcpICsr YjsKCQkJKmJiKys9KmIrKzsKCQl9Cgl9IGVsc2UgewoJCS8vIE1JTUUgdG9rZW5zIGNhbiBp bmNsdWRlICcuJwoJCXdoaWxlICgqYiE9J1wwJyYmKCFkZWxpbWl0aW5nKCpiLHRydWUpfHwq Yj09Jy4nKSkgKmJiKys9KmIrKzsKCX0KCSpiYj0nXDAnOwoJcmV0dXJuIHRydWU7Cn0Kc3Rh dGljIGlubGluZSBib29sIGlzX3NpZ25lZCgpIHsKCXJldHVybiB0eXBlX2hlYWRlcl9ib2R5 IT1OVUxMJiYKCQkJY2FzZV9pbnNlbnNpdGl2ZWx5X2hlYWRzKCJtdWx0aXBhcnQvc2lnbmVk Iix0eXBlX2hlYWRlcl9ib2R5KTsKfQpzdGF0aWMgaW5saW5lIGJvb2wgaXNfYWx0ZXJuYXRp dmUoKSB7CglyZXR1cm4gdHlwZV9oZWFkZXJfYm9keSE9TlVMTCYmCgkJCWNhc2VfaW5zZW5z aXRpdmVseV9oZWFkcygibXVsdGlwYXJ0L2FsdGVybmF0aXZlIix0eXBlX2hlYWRlcl9ib2R5 KTsKfQpzdGF0aWMgaW5saW5lIGJvb2wgaXNfbWl4ZWQoKSB7CglyZXR1cm4gdHlwZV9oZWFk ZXJfYm9keSE9TlVMTCYmCgkJCWNhc2VfaW5zZW5zaXRpdmVseV9oZWFkcygibXVsdGlwYXJ0 L21peGVkIix0eXBlX2hlYWRlcl9ib2R5KTsKfQpzdGF0aWMgaW5saW5lIGJvb2wgaXNfaHRt bCgpIHsKCXJldHVybiB0eXBlX2hlYWRlcl9ib2R5IT1OVUxMJiYKCQkJY2FzZV9pbnNlbnNp dGl2ZWx5X2hlYWRzKCJ0ZXh0L2h0bWwiLHR5cGVfaGVhZGVyX2JvZHkpOwp9CnN0YXRpYyBp bmxpbmUgYm9vbCBpc19wbGFpbigpIHsKCXJldHVybiB0eXBlX2hlYWRlcl9ib2R5PT1OVUxM fHwKCQkJY2FzZV9pbnNlbnNpdGl2ZWx5X2hlYWRzKCJ0ZXh0L3BsYWluIix0eXBlX2hlYWRl cl9ib2R5KTsKfQpzdGF0aWMgaW5saW5lIGJvb2wgaXNfc2lnbmF0dXJlKCkgewoJcmV0dXJu IHR5cGVfaGVhZGVyX2JvZHkhPU5VTEwmJigKCQkJY2FzZV9pbnNlbnNpdGl2ZWx5X2hlYWRz KCJhcHBsaWNhdGlvbi94LXBrY3M3LXNpZ25hdHVyZSIsCgkJCXR5cGVfaGVhZGVyX2JvZHkp fHwKCQkJY2FzZV9pbnNlbnNpdGl2ZWx5X2hlYWRzKCJhcHBsaWNhdGlvbi9wZ3Atc2lnbmF0 dXJlIiwKCQkJdHlwZV9oZWFkZXJfYm9keSkpOwp9CnN0YXRpYyBpbmxpbmUgYm9vbCBpc19h dHRhY2htZW50KCkgewoJcmV0dXJuIGRpc3Bvc2l0aW9uX2hlYWRlcl9ib2R5IT1OVUxMJiYK CQkJY2FzZV9pbnNlbnNpdGl2ZWx5X2hlYWRzKCJhdHRhY2htZW50IixkaXNwb3NpdGlvbl9o ZWFkZXJfYm9keSk7Cn0Kc3RhdGljIGlubGluZSB2b2lkIHNldF9kZWNvZGluZ190eXBlKCkg ewoJaWYgKHRyYW5zZmVyX2hlYWRlcl9ib2R5PT1OVUxMKSB7CgkJZGVjb2Rpbmc9dW5lbmNv ZGVkOwoJCXJldHVybjsKCX0KCWlmIChjYXNlX2luc2Vuc2l0aXZlbHlfaGVhZHMoInF1b3Rl ZC1wcmludGFibGUiLHRyYW5zZmVyX2hlYWRlcl9ib2R5KSkgewoJCWRlY29kaW5nPXF1b3Rl ZF9wcmludGFibGU7CgkJcmV0dXJuOwoJfQoJaWYgKGNhc2VfaW5zZW5zaXRpdmVseV9oZWFk cygiYmFzZTY0Iix0cmFuc2Zlcl9oZWFkZXJfYm9keSkpIHsKCQlkZWNvZGluZz1iYXNlNjQ7 CgkJcmV0dXJuOwoJfQoJZGVjb2Rpbmc9dW5lbmNvZGVkOwoJaWYgKGNhc2VfaW5zZW5zaXRp dmVseV9oZWFkcygiN2JpdCIsdHJhbnNmZXJfaGVhZGVyX2JvZHkpKSByZXR1cm47CglpZiAo Y2FzZV9pbnNlbnNpdGl2ZWx5X2hlYWRzKCI4Yml0Iix0cmFuc2Zlcl9oZWFkZXJfYm9keSkp IHJldHVybjsKCWlmIChjYXNlX2luc2Vuc2l0aXZlbHlfaGVhZHMoImJpbmFyeSIsdHJhbnNm ZXJfaGVhZGVyX2JvZHkpKSByZXR1cm47Cgl3YXJuaW5nKCJ1bnJlY29nbmlzZWQgdHJhbnNm ZXIgZW5jb2RpbmciKTsKfQpzdGF0aWMgaW5saW5lIHZvaWQgY2hhbmdlX3RvX21peGVkKCkg ewoJY2hhciAqIGJvdW5kYXJ5PU5VTEw7CgljaGFyICogaGVhZGVyOwoJY2hhciAqIGIsICog aDsKCWludCBsPTA7CglpZiAoIWlzX211bHRpcGFydCgmYm91bmRhcnkpKSB7CgkJd2Fybmlu ZygiaW50ZXJuYWwgZXJyb3I6IGNoYW5naW5nIG5vbi1tdWx0aXBhcnQgdG8gbWl4ZWQiKTsK CQlyZXR1cm47Cgl9Cglib3VuZGFyeSs9MjsKCS8vIFRoZSBzcGVjaWFsIGNhc2VzIHNob3Vs ZCBuZXZlciBoYXBwZW4sIGFzICdcJywgJyInLCAnXHInIGFuZCAnXG4nCgkvLyBhcmVuJ3Qg YWxsb3dlZCBpbiBib3VuZGFyaWVzLi4uYnV0Li4uanVzdCBpbiBjYXNlLi4uCglmb3IgKGI9 Ym91bmRhcnk7KmIhPSdcMCc7KytiKSB7CgkJaWYgKCpiPT0nXHInfHwqYj09J1xuJykgewoJ CQl3YXJuaW5nKCJib3VuZGFyeSB3aXRoIG5ld2xpbmUiKTsKCQkJcmV0dXJuOwoJCX0KCQlp ZiAoKmI9PSciJ3x8KmI9PSdcXCcpICsrbDsKCQkrK2w7Cgl9CgloZWFkZXI9YWxsb2Nfb3Jf ZXhpdChzaXplb2YoY2hhcikqKDUwK2wpKTsgLy8gUGxheSBpdCBzYWZlCglzdHJjcHkoaGVh ZGVyLCJDb250ZW50LVR5cGU6IG11bHRpcGFydC9taXhlZDtcclxuIGJvdW5kYXJ5PVwiIik7 Cglmb3IgKGg9aGVhZGVyKzQzLGI9Ym91bmRhcnk7KmIhPSdcMCc7KytoLCsrYikgewoJCWlm ICgqYj09JyInfHwqYj09J1xcJykgeyAqaD0nXFwnOyArK2g7IH0KCQkqaD0qYjsKCX0KCSpo Kys9JyInOyAqaCsrPSdccic7ICpoKys9J1xuJzsgKmgrKz0nXDAnOwoJZnJlZShib3VuZGFy eS0yKTsKCS8qQC1udWxscGFzc0AqLwoJZnJlZShzYXZlZF9taW1lX2hlYWRlcnNbdHlwZV9o ZWFkZXJfaW5kZXhdKTsKCS8qQD1udWxscGFzc0AqLwoJc2F2ZWRfbWltZV9oZWFkZXJzW3R5 cGVfaGVhZGVyX2luZGV4XT1oZWFkZXI7CglyZXNvcnRfdG9fZXhpdChyZXBsYWNlbWVudHNf Y291bnQ9PXJlcGxhY2VtZW50c19tYXgsCgkJCSJpbnRlcm5hbCBlcnJvcjogdG9vIG1hbnkg cmVwbGFjZW1lbnRzIixFWF9TT0ZUV0FSRSk7CglyZXBsYWNlbWVudF9zdGFydHNbcmVwbGFj ZW1lbnRzX2NvdW50XT0KCQkJbWltZV9oZWFkZXJfc3RhcnRzW3R5cGVfaGVhZGVyX2luZGV4 XTsKCXJlcGxhY2VtZW50X2VuZHNbcmVwbGFjZW1lbnRzX2NvdW50XT0KCQkJbWltZV9oZWFk ZXJfZW5kc1t0eXBlX2hlYWRlcl9pbmRleF07CglyZXBsYWNlbWVudF9zdHJpbmdzW3JlcGxh Y2VtZW50c19jb3VudF09CgkJCXNhdmVkX21pbWVfaGVhZGVyc1t0eXBlX2hlYWRlcl9pbmRl eF07CgkrK3JlcGxhY2VtZW50c19jb3VudDsKfQpzdGF0aWMgaW5saW5lIHZvaWQgZ2VuZXJh dGVfYm91bmRhcnkoLypAb3V0QCovIGNoYXIgKiogYm91bmRhcnkpIHsKCWludCByOwoJKmJv dW5kYXJ5PWFsbG9jX29yX2V4aXQoc2l6ZW9mKGNoYXIpKjQyKTsgLy8gTGlmZSwgdGhlIHVu aXZlcnNlIGFuZCBldmVyeXRoaW5nCglzdHJjcHkoKmJvdW5kYXJ5LCItLT1fZm9vdF9maWx0 ZXJfYm91bmRhcnlfMDEyMzQ1Njc4OTAxMl89Iik7Cglmb3IgKHI9MjU7cjwzODsrK3IpIHsK CQkoKmJvdW5kYXJ5KVtyXT0oY2hhcikoKGludCknQScrKHJhbmRvbSgpJTE2KSk7Cgl9Cn0K c3RhdGljIGlubGluZSB2b2lkIG91dHB1dF9taW1lX21peGVkX2hlYWRlcnMoY29uc3QgY2hh ciAqIGJvdW5kYXJ5KSB7CglyZXNvcnRfdG9fZXJybm8oCgkJCXB1dHN0cigiTUlNRS1WZXJz aW9uOiAxLjBcclxuIik9PUVPRiwKCQkJImVycm9yIGVjaG9pbmcgc3RyaW5nIixFWF9JT0VS Uik7CglyZXNvcnRfdG9fZXJybm8oCgkJCXB1dHN0cigiQ29udGVudC1UeXBlOiBtdWx0aXBh cnQvbWl4ZWQ7XHJcbiBib3VuZGFyeT1cIiIpPT1FT0YsCgkJCSJlcnJvciBlY2hvaW5nIHN0 cmluZyIsRVhfSU9FUlIpOwoJcmVzb3J0X3RvX2Vycm5vKHB1dHN0cihib3VuZGFyeSsyKT09 RU9GLAoJCQkiZXJyb3IgZWNob2luZyBzdHJpbmciLEVYX0lPRVJSKTsKCS8vIEkgcHV0IGFu IGV4dHJhIENSTEYganVzdCBpbiBjYXNlIHNvbWUgbWFpbCByZWFkZXIgZXhwZWN0cyB0aGUK CS8vIGluaXRpYWwgYm91bmRhcnkgdG8gaW5jbHVkZSBvbmUgdGhhdCBpcyBzZXBhcmF0ZSBm cm9tIHRoZSBvbmUgdGhhdAoJLy8gZW5kcyB0aGUgaGVhZGVycy4KCXJlc29ydF90b19lcnJu bygKCQkJcHV0c3RyKCJcIlxyXG5cclxuXHJcbiIpPT1FT0YsCgkJCSJlcnJvciBlY2hvaW5n IHN0cmluZyIsRVhfSU9FUlIpOwp9CnN0YXRpYyBpbmxpbmUgdm9pZCBvdXRwdXRfcHJvbG9n KCkgewoJLy8gRGVsaWJlcmF0ZWx5IGVtcHR5OyB3ZSBkb24ndCBuZWVkIGFueSBwcm9sb2cK fQpzdGF0aWMgdm9pZCBvdXRwdXRfbWltZV9mb290ZXIoY29uc3QgY2hhciAqIGJvdW5kYXJ5 KSB7CglvdXRwdXRfYm91bmRhcnkoYm91bmRhcnkpOwoJaWYgKGh0bWxfbWltZV9mb290ZXIp IHsKCQlyZXNvcnRfdG9fZXJybm8oCgkJCQlwdXRzdHIoIkNvbnRlbnQtVHlwZTogdGV4dC9o dG1sOyBjaGFyc2V0PVVURi04XHJcbiIpPT1FT0YsCgkJCQkiZXJyb3IgZWNob2luZyBzdHJp bmciLEVYX0lPRVJSKTsKCX0gZWxzZSB7CgkJcmVzb3J0X3RvX2Vycm5vKAoJCQkJcHV0c3Ry KCJDb250ZW50LVR5cGU6IHRleHQvcGxhaW47IGNoYXJzZXQ9VVRGLThcclxuIik9PUVPRiwK CQkJCSJlcnJvciBlY2hvaW5nIHN0cmluZyIsRVhfSU9FUlIpOwoJfQoJcmVzb3J0X3RvX2Vy cm5vKAoJCQlwdXRzdHIoIkNvbnRlbnQtVHJhbnNmZXItRW5jb2Rpbmc6IHF1b3RlZC1wcmlu dGFibGVcclxuIik9PUVPRiwKCQkJImVycm9yIGVjaG9pbmcgc3RyaW5nIixFWF9JT0VSUik7 CgllbmNvZGluZz1xdW90ZWRfcHJpbnRhYmxlOwoJcmVzb3J0X3RvX2Vycm5vKHB1dHN0cigi XHJcbiIpPT1FT0YsCgkJCSJlcnJvciBlY2hvaW5nIHN0cmluZyIsRVhfSU9FUlIpOwoJLypA LW51bGxwYXNzQCovCgllbmNvZGVfZm9vdGVyKG1pbWVfZm9vdGVyKTsKCS8qQD1udWxscGFz c0AqLwoJZW5jb2RlY2hhcigoaW50KSdccicpOwoJZW5jb2RlY2hhcigoaW50KSdcbicpOwoJ ZmluaXNoX2VuY29kaW5nKCk7CgkvLyBUaGlzIGlzIGxvZ2ljYWxseSBwYXJ0IG9mIHRoZSBi b3VuZGFyeSB0aGF0IGlzIGFib3V0IHRvIGNvbWUKCXJlc29ydF90b19lcnJubyhwdXRzdHIo IlxyXG4iKT09RU9GLAoJCQkiZXJyb3IgZWNob2luZyBzdHJpbmciLEVYX0lPRVJSKTsKfQpz dGF0aWMgaW5saW5lIHZvaWQgb3V0cHV0X2JvdW5kYXJ5KGNvbnN0IGNoYXIgKiBib3VuZGFy eSkgewoJcmVzb3J0X3RvX2Vycm5vKHB1dHN0cihib3VuZGFyeSk9PUVPRiwiZXJyb3IgZWNo b2luZyBzdHJpbmciLEVYX0lPRVJSKTsKCXJlc29ydF90b19lcnJubyhwdXRzdHIoIlxyXG4i KT09RU9GLCJlcnJvciBlY2hvaW5nIHN0cmluZyIsRVhfSU9FUlIpOwp9CnN0YXRpYyBpbmxp bmUgdm9pZCBvdXRwdXRfZmluYWxfYm91bmRhcnkoY29uc3QgY2hhciAqIGJvdW5kYXJ5KSB7 CglyZXNvcnRfdG9fZXJybm8ocHV0c3RyKGJvdW5kYXJ5KT09RU9GLCJlcnJvciBlY2hvaW5n IHN0cmluZyIsRVhfSU9FUlIpOwoJcmVzb3J0X3RvX2Vycm5vKHB1dHN0cigiLS1cclxuIik9 PUVPRiwiZXJyb3IgZWNob2luZyBzdHJpbmciLEVYX0lPRVJSKTsKfQpzdGF0aWMgYm9vbCBh dF9maW5hbF9ib3VuZGFyeShjaGFyICogYm91bmRhcnkpIHsKCWludCBsOwoJLy8gSWYgbm8g bG9va2FoZWFkLCB3ZSBwcm9iYWJseSBoaXQgRU9GLCBzbyB3ZSBwcmltYXJpbHkganVzdCBu ZWVkIHRvIGdldAoJLy8gb3V0IG9mIGxvb3BzIGFuZCBleGl0CglpZiAoYnVmZmVyX2ZpbGxl ZC1idWZmZXJfcmVhZD09MCkgewoJCXdhcm5pbmcoInByb2JhYmx5IHVuZXhwZWN0ZWQgZW5k IG9mIGlucHV0Iik7CgkJcmV0dXJuIHRydWU7Cgl9CglsPShpbnQpc3RybGVuKGJvdW5kYXJ5 KTsKCWJvdW5kYXJ5W2xdPSctJzsKCWJvdW5kYXJ5W2wrMV09Jy0nOwoJYm91bmRhcnlbbCsy XT0nXDAnOwoJLypALXRlbXB0cmFuc0AqLwoJY2FsbGJhY2tfY29tcGFyZT1ib3VuZGFyeTsK CS8qQD10ZW1wdHJhbnNAKi8KCSh2b2lkKWxvb2soY29tcGFyaW5nX2hlYWQsYnVmZmVyX3Jl YWQsZmFsc2UpOwoJY2FsbGJhY2tfY29tcGFyZT1OVUxMOwoJYm91bmRhcnlbbF09J1wwJzsK CXJldHVybiBjYWxsYmFja19ib29sOwp9CgovKiB0YWc6IGZvb3Rlcl9mdW5jdGlvbnMgKi8K CnN0YXRpYyBpbmxpbmUgdm9pZCBwcm9jZXNzX3RleHRfc2VjdGlvbihib29sIGFkZF9mb290 ZXIsCgkJLypAbnVsbEAqLyBjb25zdCBjaGFyICogZm9vdGVyLAoJCWNvbnN0IGNoYXIgKiBw cmVmaXgsIGNvbnN0IGNoYXIgKiBzdWZmaXgsIGNvbnN0IGNoYXIgKiByZXBsYWNlbWVudCwK CQljb25zdF9udWxsX3N0cmluZyAqIHRhaWxzLCBjb25zdF9udWxsX3N0cmluZyAqIHBhZGRp bmcsCgkJY29uc3RfbnVsbF9zdHJpbmcgKiBndXRzLCBjb25zdF9udWxsX3N0cmluZyAqIHBh aXJzLAoJCWNoYXIgKiBib3VuZGFyeSkgewoJaW50IHByZWZpeF9wb3M7CglpbnQgbGF0ZXJf cHJlZml4X3BvczsKCWludCBzdWZmaXhfcG9zOwoJYm9vbCByZW1vdmVkX2Zvb3RlcnM9ZmFs c2U7Cglib29sIHJlbW92ZWRfbmV3bGluZT1mYWxzZTsKCWJvb2wgYm91bmRhcnlfbmV3bGlu ZT1mYWxzZTsKCWludCBwcmVmaXhsPShpbnQpc3RybGVuKHByZWZpeCk7CglpbnQgc3VmZml4 bD0oaW50KXN0cmxlbihzdWZmaXgpOwoJcmVzb3J0X3RvX2V4aXQoYnVmZmVyX2ZpbGxlZD4w LAoJCQkiaW50ZXJuYWwgZXJyb3I6IHVuZXhwZWN0ZWQgZGF0YSBpbiBidWZmZXIiLEVYX1NP RlRXQVJFKTsKCXNldF9kZWNvZGluZ190eXBlKCk7CgllbmNvZGluZz1kZWNvZGluZzsKCWRl Y29kZV9hbmRfcmVhZF90b19ib3VuZGFyeV9lbmNvZGluZ193aGVuX2Z1bGwoYm91bmRhcnkp OwoJaWYgKHNtYXJ0X2Zvb3RlciYmZm9vdGVyIT1OVUxMKSB7CgkvLyBhbHRlcm5hdGl2ZWx5 CgkvLyBpZiAoc21hcnRfZm9vdGVyKSB7CgkJZm9yICg7OykgewoJCQlwcmVmaXhfcG9zPXBv c19vZihwcmVmaXgsMCxidWZmZXJfcmVhZCk7CgkJCWlmIChwcmVmaXhfcG9zPT1FT0YpIGJy ZWFrOwoJCQlzdWZmaXhfcG9zPXBvc19vZihzdWZmaXgscHJlZml4X3BvcyxidWZmZXJfcmVh ZCk7CgkJCWlmIChzdWZmaXhfcG9zPT1FT0YpIGJyZWFrOwoJCQlmb3IgKDs7KSB7CgkJCQls YXRlcl9wcmVmaXhfcG9zPQoJCQkJCQlwb3Nfb2YocHJlZml4LHByZWZpeF9wb3MrcHJlZml4 bCxzdWZmaXhfcG9zLXByZWZpeGwpOwoJCQkJaWYgKGxhdGVyX3ByZWZpeF9wb3MhPUVPRikg cHJlZml4X3Bvcz1sYXRlcl9wcmVmaXhfcG9zOwoJCQkJZWxzZSBicmVhazsKCQkJfQoJCQlz dWZmaXhfcG9zKz1zdWZmaXhsOwoJCQlwYWQocGFkZGluZyxndXRzLHBhaXJzLCZwcmVmaXhf cG9zLCZzdWZmaXhfcG9zKTsKCQkJcmVwbGFjZW1lbnRfc3RhcnRzW3JlcGxhY2VtZW50c19j b3VudF09cHJlZml4X3BvczsKCQkJcmVwbGFjZW1lbnRfZW5kc1tyZXBsYWNlbWVudHNfY291 bnRdPXN1ZmZpeF9wb3M7CgkJCS8vIFdlIG1heSBub3Qgd2FudCB0aGUgbGFzdCByZXBsYWNl bWVudCBzbyByZXBsYWNlCgkJCS8vIHdpdGggbm90aGluZyBmaXJzdAoJCQlyZXBsYWNlbWVu dF9zdHJpbmdzW3JlcGxhY2VtZW50c19jb3VudF09TlVMTDsKCQkJKytyZXBsYWNlbWVudHNf Y291bnQ7CgkJCS8vIFdlIHdhbnQgdGhlIGxhc3QgcmVwbGFjZW1lbnQ7IGVuY29kZSBpdCBu b3cgYmVmb3JlCgkJCS8vIGRvaW5nIGFueSBtb3JlIGVuY29kaW5nCgkJCWlmIChyZW1vdmVk X2Zvb3RlcnMpIGVuY29kZV9zdHJpbmcocmVwbGFjZW1lbnQpOwoJCQllbmNvZGVfcmVwbGFj ZW1lbnRzKCk7CgkJCXJlbW92ZWRfZm9vdGVycz10cnVlOwoJCX0KCX0KCWlmICgqYm91bmRh cnkhPSdcMCcmJihkZWNvZGluZz09cXVvdGVkX3ByaW50YWJsZXx8ZGVjb2Rpbmc9PXVuZW5j b2RlZCkpIHsKCQkvLyBJZiB3ZSdyZSBub3QgdXNpbmcgYmFzZTY0IGVuY29kaW5nLCBhbmQg d2UncmUgaW4gbXVsdGlwYXJ0LCB0aGVyZQoJCS8vIHdpbGwgYmUgYSBmaW5hbCBDUkxGIHRo YXQgaXMgcGFydCBvZiB0aGUgaW5wdXQgYnV0IGxvZ2ljYWxseSBwYXJ0IG9mCgkJLy8gdGhl IGJvdW5kYXJ5LCBub3QgdGhlIHRleHQuIFJlbW92aW5nIHRoZSBmb290ZXIgbWF5IGhhdmUg YWxyZWFkeQoJCS8vIHJlbW92ZWQgaXQsIHNvIHdlIG5lZWQgdG8gY2hlY2sgaWYgaXQncyBo ZXJlIG9yIG5vdC4KCQlpZiAoYnVmZmVyX3JlYWQ+MSkgewoJCQljYWxsYmFja19jb21wYXJl PSJcclxuIjsKCQkJKHZvaWQpbG9vayhjb21wYXJpbmdfaGVhZCxidWZmZXJfcmVhZC0yLGZh bHNlKTsKCQkJY2FsbGJhY2tfY29tcGFyZT1OVUxMOwoJCQlpZiAoY2FsbGJhY2tfYm9vbCkg Ym91bmRhcnlfbmV3bGluZT10cnVlOwoJCX0KCX0KCWlmIChhZGRfZm9vdGVyJiZmb290ZXIh PU5VTEwpIHsKCQkvLyBUaGlzIHdpbGwgc2tpcCBwYXN0IHRoZSBib3VuZGFyeSBuZXdsaW5l CgkJbWFya190YWlsKHRhaWxzKTsKCQlpZiAocmVtb3ZlZF9mb290ZXJzJiZidWZmZXJfbWFy az09MCkgewoJCQkvLyBUaGUgbGFzdCByZXBsYWNlbWVudCBjb2luY2lkZXMgd2l0aCB3aGVy ZSB0aGUgZm9vdGVyCgkJCS8vIGlzIGdvaW5nIHRvIGdvOyBkb24ndCB1c2UgdGhlIHJlcGxh Y2VtZW50IHRleHQuCgkJCXJlbW92ZWRfZm9vdGVycz1mYWxzZTsKCQl9Cgl9CglpZiAocmVt b3ZlZF9mb290ZXJzKSBlbmNvZGVfc3RyaW5nKHJlcGxhY2VtZW50KTsKCWlmIChhZGRfZm9v dGVyJiZmb290ZXIhPU5VTEwpIHsKCQlpZiAoYnVmZmVyX21hcms8YnVmZmVyX3JlYWQtMnx8 CgkJCQkoYnVmZmVyX21hcms9PWJ1ZmZlcl9yZWFkLTImJiFib3VuZGFyeV9uZXdsaW5lKSkg ewoJCQkvLyBJZiB3ZSB0YWlsZWQgYmFjayBwYXN0IGEgbmV3bGluZSAodGhhdCB3YXNuJ3Qg dGhlIGJvdW5kYXJ5CgkJCS8vIG5ld2xpbmUgd2hpY2ggaXNuJ3QgcmVhbGx5IHRoZXJlKSB3 ZSBkb24ndCBib3RoZXIgYXBwZW5kaW5nCgkJCS8vIGEgbmV3IG9uZSB0byB0aGUgZm9vdGVy CgkJCWNhbGxiYWNrX2NvbXBhcmU9IlxyXG4iOwoJCQkodm9pZClsb29rKGNvbXBhcmluZ19o ZWFkLGJ1ZmZlcl9tYXJrLGZhbHNlKTsKCQkJaWYgKGNhbGxiYWNrX2Jvb2wpIHJlbW92ZWRf bmV3bGluZT10cnVlOwoJCX0KCQllbmNvZGVfdG9fbWFyaygpOwoJCWVuY29kZWNoYXIoKGlu dCknXHInKTsKCQllbmNvZGVjaGFyKChpbnQpJ1xuJyk7CgkJZW5jb2RlX2Zvb3Rlcihmb290 ZXIpOwoJCWlmICghcmVtb3ZlZF9uZXdsaW5lKSB7CgkJCWVuY29kZWNoYXIoKGludCknXHIn KTsKCQkJZW5jb2RlY2hhcigoaW50KSdcbicpOwoJCX0KCX0KCWlmIChib3VuZGFyeV9uZXds aW5lKSB7CgkJLy8gQWN0dWFsbHkgcmVtb3ZlIHRoZSBib3VuZGFyeSBuZXdsaW5lIG5vdwoJ CWlmIChyZXBsYWNlbWVudHNfY291bnQ9PXJlcGxhY2VtZW50c19tYXgpIHsKCQkJd2Fybmlu ZygiaW50ZXJuYWwgZXJyb3I6IHRvbyBtYW55IHJlcGxhY2VtZW50cyIpOwoJCX0gZWxzZSB7 CgkJCXJlcGxhY2VtZW50X3N0YXJ0c1tyZXBsYWNlbWVudHNfY291bnRdPWJ1ZmZlcl9yZWFk LTI7CgkJCXJlcGxhY2VtZW50X2VuZHNbcmVwbGFjZW1lbnRzX2NvdW50XT1idWZmZXJfcmVh ZDsKCQkJcmVwbGFjZW1lbnRfc3RyaW5nc1tyZXBsYWNlbWVudHNfY291bnRdPU5VTEw7CgkJ CSsrcmVwbGFjZW1lbnRzX2NvdW50OwoJCX0KCX0KCWVuY29kZV9sb29rYmVoaW5kKCk7Cglm aW5pc2hfZW5jb2RpbmcoKTsKCWlmICgqYm91bmRhcnkhPSdcMCcpIHsKCQkvLyBUaGlzIGlz IGxvZ2ljYWxseSBwYXJ0IG9mIHRoZSBib3VuZGFyeQoJCXJlc29ydF90b19lcnJubyhwdXRz dHIoIlxyXG4iKT09RU9GLCJlcnJvciBlY2hvaW5nIHN0cmluZyIsRVhfSU9FUlIpOwoJfQp9 CnN0YXRpYyBpbmxpbmUgdm9pZCBwYWQoY29uc3RfbnVsbF9zdHJpbmcgKiBwYWRkaW5nLAoJ CWNvbnN0X251bGxfc3RyaW5nICogZ3V0cywgY29uc3RfbnVsbF9zdHJpbmcgKiBwYWlycywK CQlpbnQgKiBwcmVmaXhfcG9zLCBpbnQgKiBzdWZmaXhfcG9zKSB7Cgljb25zdCBjaGFyICoq IHJ1bjsKCWNvbnN0IGNoYXIgKiogdGVzdDsKCWNvbnN0IGNoYXIgKiogb3BlbmluZzsKCWNv bnN0IGNoYXIgKiogY2xvc2luZzsKCWludCBzYXZlZF9wcmVmaXhfcG9zOwoJaW50IGRlZmlu aXRlX3ByZWZpeF9wb3M7CglpbnQgZGVmaW5pdGVfc3VmZml4X3BvczsKCWJvb2wgcGFpcl9z dWNjZWVkZWQ7Cglib29sIHBhZF9zdWNjZWVkZWQ7CgkvLyBDb3VsZCBnZW5lcmF0ZSBsZW5n dGhzIGF0IGluaXQgdGltZSBmb3Igc3BlZWQKCWludCBsOwoJaW50IGxsOwoJLy8gSWYgd2Ug c3VjY2VlZCBmb3Igb25lIHRoaW5nLCB3ZSB0cnkgaXQgYWdhaW4gc3RyYWlnaHQgYXdheSwK CS8vIGFzIGEgbnVtYmVyIG9mIHR5cGVzIG9mIHBhZGRpbmcgYXJlIGxpa2VseSB0byBvY2N1 ciBpbiBtdWx0aXBsZXMuCgkvLyBUaGVuIHdlIGtlZXAgdHJ5aW5nIHRoZSB3aG9sZSBsb3Qg dW50aWwgbm90aGluZyBpcyBsZWZ0IHRvIGRvLgoJZG8gewoJCS8vIFRyeSBlYWNoIHBpZWNl IG9mIHBhZGRpbmcgKG9yIGd1dHMpCgkJZGVmaW5pdGVfcHJlZml4X3Bvcz1FT0Y7CgkJZGVm aW5pdGVfc3VmZml4X3Bvcz1FT0Y7CgkJcnVuPXBhZGRpbmc7CgkJZG8gewoJCQlkbyB7CgkJ CQlwYWRfc3VjY2VlZGVkPWZhbHNlOwoJCQkJdGVzdD1ydW47CgkJCQl3aGlsZSAoKnRlc3Qh PU5VTEwpIHsKCQkJCQlsPShpbnQpc3RybGVuKCp0ZXN0KTsKCQkJCQlmb3IgKDs7KSB7CgkJ CQkJCS8vIENoZWNrIGZvciBwYWRkaW5nIGF0IHRhaWwKCQkJCQkJaWYgKGJ1ZmZlcl9maWxs ZWQtKnN1ZmZpeF9wb3M8bCkgYnJlYWs7CgkJCQkJCWNhbGxiYWNrX2NvbXBhcmU9KnRlc3Q7 CgkJCQkJCSh2b2lkKWxvb2soY29tcGFyaW5nX2hlYWQsKnN1ZmZpeF9wb3MsZmFsc2UpOwoJ CQkJCQlpZiAoIWNhbGxiYWNrX2Jvb2wpIGJyZWFrOwoJCQkJCQkqc3VmZml4X3Bvcys9bDsK CQkJCQkJcGFkX3N1Y2NlZWRlZD10cnVlOwoJCQkJCX0KCQkJCQlmb3IgKDs7KSB7CgkJCQkJ CS8vIENoZWNrIGZvciBwYWRkaW5nIGF0IGhlYWQKCQkJCQkJaWYgKCpwcmVmaXhfcG9zLWw8 MCkgYnJlYWs7CgkJCQkJCWNhbGxiYWNrX2NvbXBhcmU9KnRlc3Q7CgkJCQkJCSh2b2lkKWxv b2soY29tcGFyaW5nX2hlYWQsKnByZWZpeF9wb3MtbCxmYWxzZSk7CgkJCQkJCWlmICghY2Fs bGJhY2tfYm9vbCkgYnJlYWs7CgkJCQkJCSpwcmVmaXhfcG9zLT1sOwoJCQkJCQlwYWRfc3Vj Y2VlZGVkPXRydWU7CgkJCQkJfQoJCQkJCSsrdGVzdDsKCQkJCX0KCQkJfSB3aGlsZSAocGFk X3N1Y2NlZWRlZCk7CgkJCWlmIChkZWZpbml0ZV9wcmVmaXhfcG9zPT1FT0YpIHsKCQkJCS8v IERvIGEgc2Vjb25kIHJ1biB0byBkZWFsIHdpdGggZ3V0cyBpbiBhIG1vcmUgdGVudGF0aXZl IHdheQoJCQkJZGVmaW5pdGVfcHJlZml4X3Bvcz0qcHJlZml4X3BvczsKCQkJCWRlZmluaXRl X3N1ZmZpeF9wb3M9KnN1ZmZpeF9wb3M7CgkJCQlydW49Z3V0czsKCQkJfSBlbHNlIGJyZWFr OwoJCX0gd2hpbGUgKHRydWUpOwoJCS8vIFRyeSBlYWNoIHBhaXIKCQlwYWlyX3N1Y2NlZWRl ZD1mYWxzZTsKCQljbG9zaW5nPXBhaXJzOwoJCXdoaWxlICgqY2xvc2luZyE9TlVMTCkgewoJ CQlsPShpbnQpc3RybGVuKCpjbG9zaW5nKTsKCQkJb3BlbmluZz1jbG9zaW5nKzE7CgkJCS8v IFRoaXMgbG9vcCBpcyBqdXN0IHRvIGJlIGJyb2tlbiBvdXQgb2Y7IHdlIGRvbid0IHRyeQoJ CQkvLyBwYWlycyB0d2ljZSB3aGVuIHRoZXkgc3VjY2VlZCBhcyB0aGV5IGFyZW4ndCB0b28g bGlrZWx5CgkJCS8vIHRvIG5lc3QuCgkJCWRvIHsKCQkJCS8vIENoZWNrIGZvciBjbG9zaW5n IHBhcnQKCQkJCWlmIChidWZmZXJfZmlsbGVkLSpzdWZmaXhfcG9zPGwpIGJyZWFrOwoJCQkJ Y2FsbGJhY2tfY29tcGFyZT0qY2xvc2luZzsKCQkJCSh2b2lkKWxvb2soY29tcGFyaW5nX2hl YWQsKnN1ZmZpeF9wb3MsZmFsc2UpOwoJCQkJaWYgKCFjYWxsYmFja19ib29sKSBicmVhazsK CQkJCS8vIENoZWNrIGZvciBlbmQgb2Ygb3BlbmluZyBwYXJ0CgkJCQlsbD0oaW50KXN0cmxl bigqb3BlbmluZyk7CgkJCQlpZiAoKnByZWZpeF9wb3MtbGw8MCkgYnJlYWs7CgkJCQljYWxs YmFja19jb21wYXJlPSpvcGVuaW5nOwoJCQkJKHZvaWQpbG9vayhjb21wYXJpbmdfaGVhZCwq cHJlZml4X3Bvcy1sbCxmYWxzZSk7CgkJCQlpZiAoIWNhbGxiYWNrX2Jvb2wpIGJyZWFrOwoJ CQkJc2F2ZWRfcHJlZml4X3Bvcz0qcHJlZml4X3BvczsKCQkJCS8vIFRyeSBlYWNoIHZhcmlh bnQKCQkJCWZvciAoKytvcGVuaW5nOypvcGVuaW5nIT1OVUxMOwoJCQkJCQkqcHJlZml4X3Bv cz1zYXZlZF9wcmVmaXhfcG9zLCsrb3BlbmluZykgewoJCQkJCS8vIFNlYXJjaCBiYWNrIGZv ciBmaXJzdCBjaGFyYWN0ZXIKCQkJCQlsbD0oaW50KXN0cmxlbigqb3BlbmluZyk7CgkJCQkJ aWYgKCpwcmVmaXhfcG9zLWxsPDApIGNvbnRpbnVlOwoJCQkJCSpwcmVmaXhfcG9zLT1sbDsK CQkJCQljYWxsYmFja19tYXRjaD0oaW50KSoqb3BlbmluZzsKCQkJCQlpZiAobG9va2JhY2so dW50aWxfbWF0Y2gsKnByZWZpeF9wb3MsdHJ1ZSkpIHsKCQkJCQkJLy8gQ2hlY2sgaWYgdGhp cyBpcyB0aGUgdmFyaWFudAoJCQkJCQljYWxsYmFja19jb21wYXJlPSpvcGVuaW5nOwoJCQkJ CQkodm9pZClsb29rKGNvbXBhcmluZ19oZWFkLCpwcmVmaXhfcG9zLGZhbHNlKTsKCQkJCQkJ aWYgKCFjYWxsYmFja19ib29sKSBjb250aW51ZTsKCQkJCQkJKnN1ZmZpeF9wb3MrPWw7CgkJ CQkJCXBhaXJfc3VjY2VlZGVkPXRydWU7CgkJCQkJCWJyZWFrOwoJCQkJCX0KCQkJCX0KCQkJ fSB3aGlsZSAoZmFsc2UpOwoJCQkvLyBTa2lwIGFsbCB0aGUgdmFyaWFudHMgaWYgbm90IHNr aXBwZWQgYWxyZWFkeQoJCQl3aGlsZSAoKm9wZW5pbmchPU5VTEwpICsrb3BlbmluZzsKCQkJ Y2xvc2luZz1vcGVuaW5nKzE7CgkJfQoJCWlmICghcGFpcl9zdWNjZWVkZWQpIHsKCQkJLy8g SWYgdGhlIHBhaXIgZGlkbid0IHN1Y2NlZWQsIHdlIGRvbid0IHJlbW92ZSB0aGUgZ3V0cwoJ CQkqcHJlZml4X3Bvcz1kZWZpbml0ZV9wcmVmaXhfcG9zOwoJCQkqc3VmZml4X3Bvcz1kZWZp bml0ZV9zdWZmaXhfcG9zOwoJCX0KCX0gd2hpbGUgKHBhaXJfc3VjY2VlZGVkKTsKfQpzdGF0 aWMgaW5saW5lIHZvaWQgbWFya190YWlsKGNvbnN0X251bGxfc3RyaW5nICogcGFkZGluZykg ewoJLy8gVGhpcyBpcyBiYXNpY2FsbHkgcGFkKCkgd2l0aCBkZWxldGlvbnMsIGJ1dCBhZGRp bmcgdGhlIHR3byBsaW5lcwoJLy8gYXQgdGhlIHN0YXJ0IHRvIGluaXRpYWxseSBwbGFjZSB0 aGUgbWFyay4gQ29tbWVudHMgYXQgcGFkKCkgYXBwbHkuCglib29sIHNvbWV0aGluZ19jaGFu Z2VkOwoJY29uc3QgY2hhciAqKiB0ZXN0OwoJaW50IGw7CglidWZmZXJfbWFyaz1idWZmZXJf cmVhZDsKCWJ1ZmZlcl9tYXJrZWQ9dHJ1ZTsKCWRvIHsKCQlzb21ldGhpbmdfY2hhbmdlZD1m YWxzZTsKCQkvLyBUcnkgZWFjaCBwaWVjZSBvZiBwYWRkaW5nCgkJdGVzdD1wYWRkaW5nOwoJ CXdoaWxlICgqdGVzdCE9TlVMTCkgewoJCQlsPShpbnQpc3RybGVuKCp0ZXN0KTsKCQkJZm9y ICg7OykgewoJCQkJLy8gQ2hlY2sgZm9yIHBhZGRpbmcgYXQgaGVhZAoJCQkJaWYgKGJ1ZmZl cl9tYXJrLWw8MCkgYnJlYWs7CgkJCQljYWxsYmFja19jb21wYXJlPSp0ZXN0OwoJCQkJKHZv aWQpbG9vayhjb21wYXJpbmdfaGVhZCxidWZmZXJfbWFyay1sLGZhbHNlKTsKCQkJCWlmICgh Y2FsbGJhY2tfYm9vbCkgYnJlYWs7CgkJCQlidWZmZXJfbWFyay09bDsKCQkJCXNvbWV0aGlu Z19jaGFuZ2VkPXRydWU7CgkJCX0KCQkJKyt0ZXN0OwoJCX0KCX0gd2hpbGUgKHNvbWV0aGlu Z19jaGFuZ2VkKTsKfQpzdGF0aWMgaW5saW5lIHZvaWQgZW5jb2RlX2Zvb3Rlcihjb25zdCBj aGFyICogZm9vdGVyKSB7Cgl3aGlsZSAoKmZvb3RlciE9J1wwJykgewoJCWlmICgqZm9vdGVy PT0nXG4nKSBlbmNvZGVjaGFyKChpbnQpJ1xyJyk7CgkJZW5jb2RlY2hhcigoaW50KSh1bnNp Z25lZCBpbnQpKmZvb3Rlcik7CgkJZm9vdGVyKys7Cgl9Cn0KCi8qIHRhZzogYnVmZmVyX2Z1 bmN0aW9ucyAqLwoKLy8gVGhlIGZpcnN0IGZldyBvZiB0aGVzZSBoYW5kbGUgcmVwbGFjZW1l bnRzLCB0aGUgcmVzdCBub3QuCnN0YXRpYyBpbmxpbmUgdm9pZCByZWFkX2J1ZmZlcigpIHsK CWJ1ZmZlcl9yZWFkPWJ1ZmZlcl9maWxsZWQ7Cn0Kc3RhdGljIGlubGluZSB2b2lkIGVjaG9f YnVmZmVyKCkgewoJcmVhZF9idWZmZXIoKTsKCWVjaG9fbG9va2JlaGluZCgpOwp9CnN0YXRp YyBpbmxpbmUgdm9pZCBza2lwX2J1ZmZlcigpIHsKCWlmIChidWZmZXJfZmlsbGVkPjApICh2 b2lkKWVtcHR5KHVudGlsX25vX2J1ZmZlcik7Cn0Kc3RhdGljIGlubGluZSB2b2lkIGVjaG9f bG9va2JlaGluZCgpIHsKCW1ha2VfcmVwbGFjZW1lbnRzKGVjaG9pbmdfb25lX2NoYXIsZWNo b2luZ191bnRpbF9zdGFydF9tYXJrZWQpOwoJaWYgKGJ1ZmZlcl9yZWFkPjApICh2b2lkKWVt cHR5KGVjaG9pbmdfdW50aWxfbm9fbG9va2JlaGluZCk7Cn0Kc3RhdGljIGlubGluZSB2b2lk IGVuY29kZV9sb29rYmVoaW5kKCkgewoJbWFrZV9yZXBsYWNlbWVudHMoZW5jb2Rpbmdfb25l X2NoYXIsZW5jb2RpbmdfdW50aWxfc3RhcnRfbWFya2VkKTsKCWlmIChidWZmZXJfcmVhZD4w KSAodm9pZCllbXB0eShlbmNvZGluZ191bnRpbF9ub19sb29rYmVoaW5kKTsKfQpzdGF0aWMg aW5saW5lIHZvaWQgZW5jb2RlX3JlcGxhY2VtZW50cygpIHsKCW1ha2VfcmVwbGFjZW1lbnRz KGVuY29kaW5nX29uZV9jaGFyLGVuY29kaW5nX3VudGlsX3N0YXJ0X21hcmtlZCk7Cn0Kc3Rh dGljIGlubGluZSB2b2lkIG1ha2VfcmVwbGFjZW1lbnRzKGNhbGxiYWNrX3Qgb25lX2NoYXIs CgkJY2FsbGJhY2tfdCBzdGFydF9tYXJrZWQpIHsKCWludCByLCBtaW5yPTA7Cgljb25zdCBj aGFyICogYzsKCWlmIChidWZmZXJfcmVhZD09MCkgcmV0dXJuOwoJYnVmZmVyX21hcmtlZD1m YWxzZTsKCXdoaWxlIChyZXBsYWNlbWVudHNfY291bnQ+MCkgewoJCWZvciAocj0wO3I8cmVw bGFjZW1lbnRzX2NvdW50OysrcikgewoJCQlpZiAoIWJ1ZmZlcl9tYXJrZWR8fHJlcGxhY2Vt ZW50X3N0YXJ0c1tyXTxidWZmZXJfbWFyaykgewoJCQkJYnVmZmVyX21hcmtlZD10cnVlOwoJ CQkJbWlucj1yOwoJCQkJYnVmZmVyX21hcms9cmVwbGFjZW1lbnRfc3RhcnRzW3JdOwoJCQl9 CgkJfQoJCWZvciAocj0wO3I8cmVwbGFjZW1lbnRzX2NvdW50OysrcikgewoJCQlyZXBsYWNl bWVudF9zdGFydHNbcl0tPWJ1ZmZlcl9tYXJrOwoJCQlyZXBsYWNlbWVudF9lbmRzW3JdLT1i dWZmZXJfbWFyazsKCQl9CgkJaWYgKGJ1ZmZlcl9tYXJrPjApICh2b2lkKWVtcHR5KHN0YXJ0 X21hcmtlZCk7CgkJYyA9IHJlcGxhY2VtZW50X3N0cmluZ3NbbWlucl07CgkJaWYgKGMhPU5V TEwpIHsKCQkJd2hpbGUgKCpjIT0nXDAnKSB7CgkJCQlidWZmZXJfY2hhcj0oaW50KSh1bnNp Z25lZCBpbnQpKmM7CgkJCQkodm9pZCkoKm9uZV9jaGFyKSgpOwoJCQkJKytjOwoJCQl9CgkJ fQoJCWJ1ZmZlcl9tYXJrZWQ9dHJ1ZTsKCQlidWZmZXJfbWFyaz1yZXBsYWNlbWVudF9lbmRz W21pbnJdOwoJCWZvciAocj0wO3I8cmVwbGFjZW1lbnRzX2NvdW50OysrcikgewoJCQlyZXBs YWNlbWVudF9zdGFydHNbcl0tPWJ1ZmZlcl9tYXJrOwoJCQlyZXBsYWNlbWVudF9lbmRzW3Jd LT1idWZmZXJfbWFyazsKCQl9CgkJaWYgKGJ1ZmZlcl9tYXJrPjApICh2b2lkKWVtcHR5KHVu dGlsX3N0YXJ0X21hcmtlZCk7CgkJZm9yIChyPW1pbnI7cjxyZXBsYWNlbWVudHNfY291bnQt MTsrK3IpIHsKCQkJcmVwbGFjZW1lbnRfc3RhcnRzW3JdPXJlcGxhY2VtZW50X3N0YXJ0c1ty KzFdOwoJCQlyZXBsYWNlbWVudF9lbmRzW3JdPXJlcGxhY2VtZW50X2VuZHNbcisxXTsKCQkJ cmVwbGFjZW1lbnRfc3RyaW5nc1tyXT1yZXBsYWNlbWVudF9zdHJpbmdzW3IrMV07CgkJfQoJ CS0tcmVwbGFjZW1lbnRzX2NvdW50OwoJCWJ1ZmZlcl9tYXJrZWQ9ZmFsc2U7Cgl9Cn0Kc3Rh dGljIGlubGluZSB2b2lkIGVuY29kZV90b19tYXJrKCkgewoJaWYgKGJ1ZmZlcl9tYXJrPjAp ICh2b2lkKWVtcHR5KGVuY29kaW5nX3VudGlsX3N0YXJ0X21hcmtlZCk7Cn0Kc3RhdGljIGlu bGluZSB2b2lkIGVjaG9fZGlza19idWZmZXIoKSB7CglpZiAoZGlza19idWZmZXJfZmlsbGVk PjApICh2b2lkKWVtcHR5KGVjaG9pbmdfdW50aWxfbm9fZGlza19idWZmZXIpOwp9CnN0YXRp YyBpbmxpbmUgdm9pZCBlbmNvZGVfZGlza19idWZmZXIoKSB7CglpZiAoZGlza19idWZmZXJf ZmlsbGVkPjApICh2b2lkKWVtcHR5KGVuY29kaW5nX3VudGlsX25vX2Rpc2tfYnVmZmVyKTsK fQpzdGF0aWMgaW5saW5lIHZvaWQgc2tpcF9kaXNrX2J1ZmZlcigpIHsKCWlmIChkaXNrX2J1 ZmZlcl9maWxsZWQ+MCkgKHZvaWQpZW1wdHkodW50aWxfbm9fZGlza19idWZmZXIpOwp9CnN0 YXRpYyBpbmxpbmUgdm9pZCByZWFkX2JvdW5kYXJ5KC8qQG91dEAqLyBjaGFyICoqIGJvdW5k YXJ5KSB7CglpbnQgbD0wOwoJaWYgKGJ1ZmZlcl9maWxsZWQ+YnVmZmVyX3JlYWQpIHsKCQlj YWxsYmFja19ib29sPWZhbHNlOwoJCWNhbGxiYWNrX2ludD0wOwoJCXJlc29ydF90b19leGl0 KCFsb29rKGNvdW50aW5nX3VudGlsX2VvbCxidWZmZXJfcmVhZCxmYWxzZSksCgkJCQkiaW50 ZXJuYWwgZXJyb3I6IG1pc3NpbmcgZW9sIGF0IHNlY3Rpb24gYm91bmRhcnkiLEVYX1NPRlRX QVJFKTsKCQlsPWNhbGxiYWNrX2ludC0yOyAvLyByZW1vdmUgdGhlIENSTEYsIGJ1dCBrZWVw IHRoZSBsZWFkaW5nICctLScKCX0KCS8vIExlYXZlIHJvb20gdG8gYXBwZW5kIGEgdHJhaWxp bmcgJy0tJyBmb3IgdGVzdGluZyBmaW5hbCBib3VuZGFyeTsKCS8vIHRoZSBDUkxGIHdpbGwg YmUgd3JpdHRlbiBpbiB0aGlzIHNwYWNlIGJ5IHNhdmluZ191bnRpbF9lb2wgdG9vLgoJKmJv dW5kYXJ5ID0gYWxsb2Nfb3JfZXhpdChzaXplb2YoY2hhcikqKGwrMykpOwoJaWYgKGJ1ZmZl cl9maWxsZWQ+YnVmZmVyX3JlYWQpIHsKCQljYWxsYmFja19ib29sPWZhbHNlOwoJCWNhbGxi YWNrX3NhdmU9KmJvdW5kYXJ5OwoJCSh2b2lkKWxvb2soc2F2aW5nX3VudGlsX2VvbCxidWZm ZXJfcmVhZCxmYWxzZSk7CgkJY2FsbGJhY2tfc2F2ZT1OVUxMOwoJfQoJKCpib3VuZGFyeSlb bF09J1wwJzsKCWlmIChidWZmZXJfZmlsbGVkPmJ1ZmZlcl9yZWFkKSB7CgkJY2FsbGJhY2tf Ym9vbD1mYWxzZTsKCQkodm9pZClsb29rKHVudGlsX2VvbCxidWZmZXJfcmVhZCx0cnVlKTsK CX0KfQpzdGF0aWMgaW5saW5lIHZvaWQgZWNob190b19ib3VuZGFyeShjb25zdCBjaGFyICog Ym91bmRhcnkpIHsKCWRvIHsKCQllY2hvX2J1ZmZlcigpOwoJfSB3aGlsZSAoIXByb2Nlc3Nf b25lX2xpbmVfY2hlY2tpbmdfYm91bmRhcnkoCgkJCWVjaG9pbmdfbl9jaGFycyxOVUxMLHVu dGlsX2VvbCxlY2hvLGJvdW5kYXJ5KSk7Cn0Kc3RhdGljIGlubGluZSB2b2lkIHNraXBfdG9f Ym91bmRhcnkoY29uc3QgY2hhciAqIGJvdW5kYXJ5KSB7CglkbyB7CgkJc2tpcF9idWZmZXIo KTsKCX0gd2hpbGUgKCFwcm9jZXNzX29uZV9saW5lX2NoZWNraW5nX2JvdW5kYXJ5KAoJCQlu X2NoYXJzLE5VTEwsdW50aWxfZW9sLGRpc2NhcmQsYm91bmRhcnkpKTsKfQpzdGF0aWMgaW5s aW5lIHZvaWQgZGVjb2RlX2FuZF9yZWFkX3RvX2JvdW5kYXJ5X2VuY29kaW5nX3doZW5fZnVs bCgKCQljb25zdCBjaGFyICogYm91bmRhcnkpIHsKCWRvIHsKCQlyZWFkX2J1ZmZlcigpOwoJ fSB3aGlsZSAoIXByb2Nlc3Nfb25lX2xpbmVfY2hlY2tpbmdfYm91bmRhcnkoCgkJCWVuY29k aW5nX25fY2hhcnMsZGVjb2RlX2xvb2thaGVhZCwKCQkJZGVjb2RpbmdfdW50aWxfZW9sLGVu Y29kZSxib3VuZGFyeSkpOwoJZmluaXNoX2RlY29kaW5nKCk7IC8vIFRoaXMganVzdCBzZXRz IHN0YXRlLCBkb2Vzbid0IGNoYW5nZSBkYXRhCn0Kc3RhdGljIGlubGluZSBib29sIHByb2Nl c3Nfb25lX2xpbmVfY2hlY2tpbmdfYm91bmRhcnkoY2FsbGJhY2tfdCBuX2NoYXJzLAoJCS8q QG51bGxAKi8gZnVuY3Rpb25fdCBwcm9jZXNzLCBjYWxsYmFja190IHByb2Nlc3NpbmcsCgkJ d2hlbl9mdWxsX3Qgd2hlbl9mdWxsLCBjb25zdCBjaGFyICogYm91bmRhcnkpIHsKCWJvb2wg c3RvcHBlZF9ieV9kZXNpZ247CglpZiAoZmVvZihzdGRpbikhPTApIHsKCQkvLyBXZSdyZSBk b25lISBDYWxsIGl0IGEgYm91bmRhcnkgKGV2ZW4gaWYgaXQgaXNuJ3QtLXdlIG5lZWQgdG8K CQkvLyBnZXQgb3V0IG9mIGxvb3BzIGNsZWFubHkgYW5kIHRpZHkgdXAgYXMgYmVzdCB3ZSBj YW4pLgoJCXJldHVybiB0cnVlOwoJfQoJLy8gRW1wdHkgdW50aWwgZW5vdWdoIHNwYWNlIGZv ciBib3VuZGFyeQoJaWYgKG1lbV9idWZmZXJfc2l6ZS1tZW1fYnVmZmVyX2ZpbGxlZDw4MCkg ewoJCWNhbGxiYWNrX2ludD04MC0obWVtX2J1ZmZlcl9zaXplLW1lbV9idWZmZXJfZmlsbGVk KTsKCQkodm9pZCllbXB0eShuX2NoYXJzKTsKCX0KCWNhbGxiYWNrX2Jvb2w9ZmFsc2U7Cglz dG9wcGVkX2J5X2Rlc2lnbj1maWxsKHVudGlsX2VvbCxzdG9wKTsKCWlmIChzdG9wcGVkX2J5 X2Rlc2lnbnx8ZmVvZihzdGRpbikhPTApIHsKCQlpZiAoYnVmZmVyX2ZpbGxlZC1idWZmZXJf cmVhZD09MCkgewoJCQlyZXR1cm4gKmJvdW5kYXJ5PT0nXDAnOwoJCX0KCQljYWxsYmFja19i b29sPWZhbHNlOwoJCWlmICgqYm91bmRhcnkhPSdcMCcpIHsKCQkJLy8gQ2FuIG9ubHkgYmUg YXQgYSBib3VuZGFyeSB3aXRob3V0IGJlaW5nIGF0IEVPRiBpZiB0aGVyZQoJCQkvLyByZWFs bHkgaXMgYSBib3VuZGFyeQoJCQkvKkAtdGVtcHRyYW5zQCovCgkJCWNhbGxiYWNrX2NvbXBh cmU9Ym91bmRhcnk7CgkJCS8qQD10ZW1wdHJhbnNAKi8KCQkJKHZvaWQpbG9vayhjb21wYXJp bmdfaGVhZCxidWZmZXJfcmVhZCxmYWxzZSk7CgkJCWNhbGxiYWNrX2NvbXBhcmU9TlVMTDsK CQl9CgkJaWYgKCFjYWxsYmFja19ib29sJiZwcm9jZXNzIT1OVUxMKSAoKnByb2Nlc3MpKCk7 CgkJcmV0dXJuIGNhbGxiYWNrX2Jvb2w7Cgl9IGVsc2UgewoJCS8vIExpbmUgaXMgdG9vIGxv bmcgdG8gYmUgYSBib3VuZGFyeSwgc28gbXVzdCBiZSBkZWNvZGVkCgkJaWYgKHByb2Nlc3Mh PU5VTEwpICgqcHJvY2VzcykoKTsKCQljYWxsYmFja19ib29sPWZhbHNlOwoJCSh2b2lkKWZp bGwocHJvY2Vzc2luZyx3aGVuX2Z1bGwpOwoJCXJldHVybiBmYWxzZTsKCX0KfQoKLy8gUmV0 dXJuIHRoZSBwb3NpdGlvbiBvZiB0ZXh0IHdob3NlIHN0YXJ0IG1heSBvY2N1ciBpbiB0aGUg YnVmZmVyCi8vIGFueXdoZXJlIGJldHdlZW4gZnJvbSBhbmQgKGp1c3QgYmVmb3JlKSB0by4g VXNlIEVPRiBmb3IgZnJvbSB0bwovLyBnbyBmcm9tIGN1cnJlbnQgbG9jYXRpb247IHVzZSBF T0YgZm9yIHRvIHRvIHJlYWQgaW5kZWZpbml0ZWx5OwovLyBFT0YgaXMgcmV0dXJuZWQgaWYg dGV4dCBpcyBub3QgZm91bmQuCnN0YXRpYyBpbnQgcG9zX29mKGNvbnN0IGNoYXIgKiB0ZXh0 LGludCBmcm9tLGludCB0bykgewoJaW50IHNhdmVkX2J1ZmZlcl9yZWFkOwoJaW50IHBvcz1F T0Y7CglpZiAoKnRleHQ9PSdcMCcpIHJldHVybiBmcm9tOwoJc2F2ZWRfYnVmZmVyX3JlYWQ9 YnVmZmVyX3JlYWQ7CglpZiAoZnJvbSE9RU9GKSBidWZmZXJfcmVhZD1mcm9tOwoJY2FsbGJh Y2tfbWF0Y2g9KGludCkodW5zaWduZWQgaW50KSp0ZXh0OwoJZm9yICg7OykgewoJCWlmICh0 byE9RU9GKSB7CgkJCWNhbGxiYWNrX2ludD10by1idWZmZXJfcmVhZDsKCQkJaWYgKCFsb29r KG5fY2hhcnNfdW50aWxfbWF0Y2gsYnVmZmVyX3JlYWQsdHJ1ZSkpIGJyZWFrOwoJCX0gZWxz ZSB7CgkJCWlmICghbG9vayh1bnRpbF9tYXRjaCxidWZmZXJfcmVhZCx0cnVlKSkgYnJlYWs7 CgkJfQoJCWlmICghY2FsbGJhY2tfYm9vbCkgYnJlYWs7CgkJLypALXRlbXB0cmFuc0AqLwoJ CWNhbGxiYWNrX2NvbXBhcmU9dGV4dCsxOwoJCS8qQD10ZW1wdHJhbnNAKi8KCQkodm9pZCls b29rKGNvbXBhcmluZ19oZWFkLGJ1ZmZlcl9yZWFkLGZhbHNlKTsKCQljYWxsYmFja19jb21w YXJlPU5VTEw7CgkJaWYgKGNhbGxiYWNrX2Jvb2wpIHsKCQkJLy8gSW5jbHVkZSB0aGUgZmly c3QgY2hhcmFjdGVyCgkJCXBvcz1idWZmZXJfcmVhZC0xOwoJCQlicmVhazsKCQl9Cgl9Cgli dWZmZXJfcmVhZD1zYXZlZF9idWZmZXJfcmVhZDsKCXJldHVybiBwb3M7Cn0KCi8vIExvb2sg YXQgY2hhcmFjdGVycyBpbiB0aGUgYnVmZmVyLCBzdGFydGluZyBhdCBvZmZzZXQgZnJvbSwK Ly8gJ3JlYWRpbmcnIGlmIHNvIGluZGljYXRlZCAoYW5kIGxvb2tpbmcgYXQgdGhhdCBsb2Nh dGlvbikuCi8vIFRoZSBjYWxsYmFjayBpcyBjYWxsZWQgYWZ0ZXIgdXBkYXRpbmcgdGhlIHJl YWRpbmcgcG9pbnRlcgovLyBhbmQgcGxhY2luZyB0aGUgY2hhcmFjdGVyIGluIHRoZSBidWZm ZXIuIFRoZSBjaGFyYWN0ZXIgaXMKLy8gYWxzbyBwYXNzZWQgYnkgbWVhbnMgb2YgdGhlIGJ1 ZmZlcl9jaGFyIGdsb2JhbC4KLy8gRU9GIGlzIHNlbnQgdG8gdGhlIGNhbGxiYWNrIHdoZW4g d2UgcnVuIG91dCBvZiBkYXRhLgovLyBUaGVyZSBpcyBubyBhdXRvbWF0aWMgYXR0ZW1wdCB0 byBmaWxsIHRoZSBidWZmZXIuCi8vIFRoZSBjYWxsYmFjayBzaG91bGQgcmV0dXJuIGEgYm9v bGVhbiBpbmRpY2F0aW5nIHdoZXRoZXIKLy8gdG8gY29udGludWUuIFRoaXMgZnVuY3Rpb24g d2lsbCByZXR1cm4gdHJ1ZSBpZiB0aGUgY2FsbGJhY2sKLy8gaW5kaWNhdGVkIHRvIHN0b3Ag KGluY2x1ZGluZyBpZiBpdCBzbyBpbmRpY2F0ZWQgb24gRU9GKSwgb3IKLy8gZmFsc2UgaWYg aXQgc3RvcHBlZCBmb3IgRU9GLgovLyBXZSBhbHdheXMgY2FsbCB0aGUgY2FsbGJhY2sgYXQg bGVhc3Qgb25jZSwgc28gZG9uJ3QgY2FsbAovLyB0aGlzIGZ1bmN0aW9uIGF0IGFsbCB1bmxl c3MgeW91IGRlZmluaXRlbHkgd2FudCB0byBsb29rCi8vIGF0IHNvbWV0aGluZy4Kc3RhdGlj IGJvb2wgbG9vayhjYWxsYmFja190IGNhbGxiYWNrLGludCBmcm9tLGJvb2wgcmVhZCkgewoJ aW50IHBvcz1mcm9tOwoJaW50IGRpc2tfYnVmZmVyX3BvczsKCWNoYXIgKiBtZW1fYnVmZmVy X3BvczsKCWlmIChwb3M8ZGlza19idWZmZXJfZmlsbGVkKSB7CgkJZGlza19idWZmZXJfcG9z PWRpc2tfYnVmZmVyX3N0YXJ0K3BvczsKCQlpZiAoZGlza19idWZmZXJfc291Z2h0IT1kaXNr X2J1ZmZlcl9wb3MpIHsKCQkJLypALW51bGxwYXNzQCovCgkJCXJlc29ydF90b19lcnJubyhm c2VlayhkaXNrX2J1ZmZlcixkaXNrX2J1ZmZlcl9wb3MsU0VFS19TRVQpIT0wLAoJCQkJCSJl cnJvciBzZWVraW5nIGluIHRlbXBvcmFyeSBmaWxlIixFWF9JT0VSUik7CgkJCS8qQD1udWxs cGFzc0AqLwoJCQlkaXNrX2J1ZmZlcl9zb3VnaHQ9ZGlza19idWZmZXJfcG9zOwoJCX0KCQl3 aGlsZSAocG9zPGRpc2tfYnVmZmVyX2ZpbGxlZCkgewoJCQkvKkAtbnVsbHBhc3NAKi8KCQkJ YnVmZmVyX2NoYXI9Z2V0YyhkaXNrX2J1ZmZlcik7CgkJCS8qQD1udWxscGFzc0AqLwoJCQly ZXNvcnRfdG9fZXJybm8oYnVmZmVyX2NoYXI9PUVPRiwKCQkJCQkiZXJyb3IgcmVhZGluZyB0 ZW1wb3JhcnkgZmlsZSIsRVhfSU9FUlIpOwoJCQkvLyArK2Rpc2tfYnVmZmVyX3BvczsgbG9n aWNhbGx5IHRoaXMgaGFwcGVucywgYnV0IGl0IGlzIHVubmVjZXNzYXJ5CgkJCSsrZGlza19i dWZmZXJfc291Z2h0OwoJCQlpZiAocmVhZCYmcG9zPT1idWZmZXJfcmVhZCkgKytidWZmZXJf cmVhZDsKCQkJKytwb3M7CgkJCWlmICghKCpjYWxsYmFjaykoKSkgcmV0dXJuIHRydWU7CgkJ fQoJfQoJaWYgKHBvczxidWZmZXJfZmlsbGVkKSB7CgkJbWVtX2J1ZmZlcl9wb3M9bWVtX2J1 ZmZlcl9uZXh0X2VtcHR5Kyhwb3MtZGlza19idWZmZXJfZmlsbGVkKTsKCQlpZiAobWVtX2J1 ZmZlcl9wb3M+PW1lbV9idWZmZXJfZW5kKSBtZW1fYnVmZmVyX3Bvcy09bWVtX2J1ZmZlcl9z aXplOwoJCXdoaWxlIChwb3M8YnVmZmVyX2ZpbGxlZCkgewoJCQlidWZmZXJfY2hhcj0oaW50 KSh1bnNpZ25lZCBpbnQpKm1lbV9idWZmZXJfcG9zOwoJCQkrK21lbV9idWZmZXJfcG9zOwoJ CQlpZiAobWVtX2J1ZmZlcl9wb3M9PW1lbV9idWZmZXJfZW5kKSBtZW1fYnVmZmVyX3Bvcz1t ZW1fYnVmZmVyX3N0YXJ0OwoJCQlpZiAocmVhZCYmcG9zPT1idWZmZXJfcmVhZCkgKytidWZm ZXJfcmVhZDsKCQkJKytwb3M7CgkJCWlmICghKCpjYWxsYmFjaykoKSkgcmV0dXJuIHRydWU7 CgkJfQoJfQoJYnVmZmVyX2NoYXI9RU9GOwoJaWYgKCEoKmNhbGxiYWNrKSgpKSByZXR1cm4g dHJ1ZTsKCXJldHVybiBmYWxzZTsKfQovLyBEb2VzIHRoZSBzYW1lIGJhY2t3YXJkcywgbW92 aW5nIHRoZSBtYXJrIGlmIHNvIGluZGljYXRlZCAoYW5kCi8vIGxvb2tpbmcgYXQgdGhhdCBs b2NhdGlvbikuIFRoZSBjYWxsYmFjayBpcyBjYWxsZWQgYmVmb3JlIHRoZQovLyBtYXJrIGlz IG1vdmVkLCB0aG91Z2gsIGFuZCBpZiBpdCByZXR1cm5zIGZhbHNlLCB0aGUgbWFyayBpcwov LyBub3QgbW92ZWQsIGJ1dCB0aGUgZnVuY3Rpb24gcmV0dXJucyB0cnVlIGltbWVkaWF0ZWx5 LgovLyBUaGVyZSBpcyBubyBjYWxsIHRvIHRoZSBjYWxsYmFjayB3aXRoIEVPRiB3aGVuIHdl IGdldCB0byB0aGUKLy8gc3RhcnQgb2YgdGhlIGJ1ZmZlciwgc28gdGhlIGZ1bmN0aW9uIGFs d2F5cyByZXR1cm5zIGZhbHNlIGluCi8vIHRoYXQgY2FzZSwgYW5kIHVubWFya3MgdGhlIGJ1 ZmZlci4gQWdhaW4sIHRoZSBjYWxsYmFjayBpcwovLyBhbHdheXMgY2FsbGVkIGF0IGxlYXN0 IG9uY2UuCnN0YXRpYyBib29sIGxvb2tiYWNrKGNhbGxiYWNrX3QgY2FsbGJhY2ssaW50IGZy b20sYm9vbCBtYXJrKSB7CglpbnQgcG9zPWZyb207CglpbnQgZGlza19idWZmZXJfcG9zOwoJ Y2hhciAqIG1lbV9idWZmZXJfcG9zOwoJaWYgKHBvcz49ZGlza19idWZmZXJfZmlsbGVkKSB7 CgkJbWVtX2J1ZmZlcl9wb3M9bWVtX2J1ZmZlcl9uZXh0X2VtcHR5Kyhwb3MtZGlza19idWZm ZXJfZmlsbGVkKTsKCQlpZiAobWVtX2J1ZmZlcl9wb3M+PW1lbV9idWZmZXJfZW5kKSBtZW1f YnVmZmVyX3Bvcy09bWVtX2J1ZmZlcl9zaXplOwoJCXdoaWxlIChwb3M+PWRpc2tfYnVmZmVy X2ZpbGxlZCkgewoJCQlidWZmZXJfY2hhcj0oaW50KSh1bnNpZ25lZCBpbnQpKm1lbV9idWZm ZXJfcG9zOwoJCQlpZiAoISgqY2FsbGJhY2spKCkpIHJldHVybiB0cnVlOwoJCQktLW1lbV9i dWZmZXJfcG9zOwoJCQlpZiAobWVtX2J1ZmZlcl9wb3M9PW1lbV9idWZmZXJfc3RhcnQtMSkK CQkJCQltZW1fYnVmZmVyX3Bvcz1tZW1fYnVmZmVyX2VuZC0xOwoJCQlpZiAobWFyayYmcG9z PT1idWZmZXJfbWFyaykgLS1idWZmZXJfbWFyazsKCQkJLS1wb3M7CgkJfQoJfQoJaWYgKHBv cz49MCYmZGlza19idWZmZXJfZmlsbGVkPjApIHsKCQlkaXNrX2J1ZmZlcl9wb3M9ZGlza19i dWZmZXJfc3RhcnQrcG9zOwoJCS8vIFJlYWRpbmcgYmFja3dhcmRzIGluIHRoZSBkaXNrIGJ1 ZmZlciBpcyBwb3RlbnRpYWxseSB2ZXJ5IG5hc3R5OwoJCS8vIGhvcGVmdWxseSBpdCBuZXZl ciBhY3R1YWxseSBoYXBwZW5zCgkJd2hpbGUgKHBvcz49MCkgewoJCQkvKkAtbnVsbHBhc3NA Ki8KCQkJcmVzb3J0X3RvX2Vycm5vKGZzZWVrKGRpc2tfYnVmZmVyLGRpc2tfYnVmZmVyX3Bv cyxTRUVLX1NFVCkhPTAsCgkJCQkJImVycm9yIHNlZWtpbmcgaW4gdGVtcG9yYXJ5IGZpbGUi LEVYX0lPRVJSKTsKCQkJZGlza19idWZmZXJfc291Z2h0PWRpc2tfYnVmZmVyX3BvczsKCQkJ YnVmZmVyX2NoYXI9Z2V0YyhkaXNrX2J1ZmZlcik7CgkJCS8qQD1udWxscGFzc0AqLwoJCQly ZXNvcnRfdG9fZXJybm8oYnVmZmVyX2NoYXI9PUVPRiwKCQkJCQkiZXJyb3IgcmVhZGluZyB0 ZW1wb3JhcnkgZmlsZSIsRVhfSU9FUlIpOwoJCQkrK2Rpc2tfYnVmZmVyX3NvdWdodDsKCQkJ aWYgKCEoKmNhbGxiYWNrKSgpKSByZXR1cm4gdHJ1ZTsKCQkJLS1kaXNrX2J1ZmZlcl9wb3M7 CgkJCWlmIChtYXJrJiZwb3M9PWJ1ZmZlcl9tYXJrKSAtLWJ1ZmZlcl9tYXJrOwoJCQktLXBv czsKCQl9Cgl9CglpZiAobWFyayYmYnVmZmVyX21hcms9PS0xKSB7CgkJYnVmZmVyX21hcms9 MDsKCQlidWZmZXJfbWFya2VkPWZhbHNlOwoJfQoJLy8gV2UgZG9uJ3QgY2FsbCB0aGUgY2Fs bGJhY2sgb24gRU9GIHdoZW4gZ29pbmcgYmFja3dhcmRzCgkvLyBidWZmZXJfY2hhcj1FT0Y7 CgkvLyAodm9pZCkoKmNhbGxiYWNrKSgpOwoJcmV0dXJuIGZhbHNlOwp9Ci8vIFJlbW92ZSBj aGFyYWN0ZXJzIGZyb20gdGhlIChiZWdpbm5pbmcgb2YgdGhlKSBidWZmZXIuIFRoZSBzYW1l Ci8vIGdlbmVyYWwgcHJpbmNpcGxlcyBhcyBmb3IgbG9vaygpIGFwcGx5LiBUaGUgY2FsbGJh Y2sgaXMgY2FsbGVkCi8vIGFmdGVyIHRoZSBjaGFyYWN0ZXIgaXMgcmVtb3ZlZCBhbmQgYWxs IGFjY291bnRpbmcgaGFzIGJlZW4gZG9uZSwgc28KLy8gcGVyaGFwcyB0aGUgb25seSBwbGFj ZSB5b3UgY2FuIHJlbGlhYmx5IGZpbmQgdGhlIGNoYXJhY3RlciBpcyBpbgovLyB0aGUgYnVm ZmVyX2NoYXIgZ2xvYmFsLiBBZ2FpbiB0aGUgY2FsbGJhY2sgZ2V0cyBhbiBFT0YgY2FsbCBp ZgovLyB0aGVyZSdzIG5vdGhpbmcgbW9yZSB0byBlbXB0eSwgYW5kIG5vIGF1dG9tYXRpYyBm aWxsaW5nIGlzIGRvbmUuCi8vIFRoZSBjYWxsYmFjayBhbmQgZnVuY3Rpb24gcmV0dXJuIHZh bHVlcyBhcmUgYXMgZm9yIGxvb2soKSBhbmQKLy8gYWdhaW4sIHRoZSBjYWxsYmFjayBpcyBh bHdheXMgY2FsbGVkIGF0IGxlYXN0IG9uY2U7IHRoaXMgbWVhbnMgYXQKLy8gbGVhc3Qgb25l IGNoYXJhY3RlciBpcyBhbHdheXMgcmVtb3ZlZCBmcm9tIHRoZSBidWZmZXIsIHNvIG9ubHkg Y2FsbAovLyB0aGUgZnVuY3Rpb24gaWYgc29tZXRoaW5nIGRlZmluaXRlbHkgc2hvdWxkIGJl IHJlbW92ZWQuCnN0YXRpYyBib29sIGVtcHR5KGNhbGxiYWNrX3QgY2FsbGJhY2spIHsKCWlm IChkaXNrX2J1ZmZlcl9maWxsZWQ+MCkgewoJCWlmIChkaXNrX2J1ZmZlcl9zb3VnaHQhPWRp c2tfYnVmZmVyX3N0YXJ0KSB7CgkJCS8qQC1udWxscGFzc0AqLwoJCQlyZXNvcnRfdG9fZXJy bm8oZnNlZWsoZGlza19idWZmZXIsZGlza19idWZmZXJfc3RhcnQsU0VFS19TRVQpIT0wLAoJ CQkJCSJlcnJvciBzZWVraW5nIGluIHRlbXBvcmFyeSBmaWxlIixFWF9JT0VSUik7CgkJCS8q QD1udWxscGFzc0AqLwoJCQlkaXNrX2J1ZmZlcl9zb3VnaHQ9ZGlza19idWZmZXJfc3RhcnQ7 CgkJfQoJCXdoaWxlIChkaXNrX2J1ZmZlcl9maWxsZWQ+MCkgewoJCQkvKkAtbnVsbHBhc3NA Ki8KCQkJYnVmZmVyX2NoYXI9Z2V0YyhkaXNrX2J1ZmZlcik7CgkJCS8qQD1udWxscGFzc0Aq LwoJCQlyZXNvcnRfdG9fZXJybm8oYnVmZmVyX2NoYXI9PUVPRiwKCQkJCQkiZXJyb3IgcmVh ZGluZyB0ZW1wb3JhcnkgZmlsZSIsRVhfSU9FUlIpOwoJCQkrK2Rpc2tfYnVmZmVyX3NvdWdo dDsKCQkJKytkaXNrX2J1ZmZlcl9zdGFydDsKCQkJLS1kaXNrX2J1ZmZlcl9maWxsZWQ7CgkJ CS0tYnVmZmVyX2ZpbGxlZDsKCQkJaWYgKGJ1ZmZlcl9yZWFkPjApIC0tYnVmZmVyX3JlYWQ7 CgkJCWlmIChidWZmZXJfbWFya2VkKSB7CgkJCQlpZiAoYnVmZmVyX21hcms+MCkgLS1idWZm ZXJfbWFyazsKCQkJCWVsc2UgYnVmZmVyX21hcmtlZD1mYWxzZTsKCQkJfQoJCQlpZiAoISgq Y2FsbGJhY2spKCkpIHJldHVybiB0cnVlOwoJCX0KCX0KCXdoaWxlIChtZW1fYnVmZmVyX2Zp bGxlZD4wKSB7CgkJYnVmZmVyX2NoYXI9KGludCkodW5zaWduZWQgaW50KSptZW1fYnVmZmVy X25leHRfZW1wdHk7CgkJKyttZW1fYnVmZmVyX25leHRfZW1wdHk7CgkJaWYgKG1lbV9idWZm ZXJfbmV4dF9lbXB0eT09bWVtX2J1ZmZlcl9lbmQpIG1lbV9idWZmZXJfbmV4dF9lbXB0eT1t ZW1fYnVmZmVyX3N0YXJ0OwoJCS0tbWVtX2J1ZmZlcl9maWxsZWQ7CgkJLS1idWZmZXJfZmls bGVkOwoJCWlmIChidWZmZXJfcmVhZD4wKSAtLWJ1ZmZlcl9yZWFkOwoJCWlmIChidWZmZXJf bWFya2VkKSB7CgkJCWlmIChidWZmZXJfbWFyaz4wKSAtLWJ1ZmZlcl9tYXJrOwoJCQllbHNl IGJ1ZmZlcl9tYXJrZWQ9ZmFsc2U7CgkJfQoJCWlmICghKCpjYWxsYmFjaykoKSkgcmV0dXJu IHRydWU7Cgl9CglidWZmZXJfY2hhcj1FT0Y7CglpZiAoISgqY2FsbGJhY2spKCkpIHJldHVy biB0cnVlOwoJcmV0dXJuIGZhbHNlOwp9Ci8vIEdldCBtb3JlIGNoYXJhY3RlcnMgaW50byB0 aGUgKGVuZCBvZiB0aGUpIGJ1ZmZlci4gVGhlIHNhbWUKLy8gZ2VuZXJhbCBwcmluY2lwbGVz IGFzIGZvciBsb29rKCkgYXBwbHkuIFRoZSBjYWxsYmFjayBpcyBjYWxsZWQKLy8gYWZ0ZXIg dGhlIGNoYXJhY3RlciBpcyBhZGRlZCBhbmQgYWxsIGFjY291bnRpbmcgaGFzIGJlZW4gZG9u ZSwKLy8gZ2V0cyB0aGUgY2hhcmFjdGVyIHZpYSBidWZmZXJfY2hhciwgaW5jbHVkaW5nIGFu IEVPRiB3aGVuIG5vIG1vcmUKLy8gaW5wdXQgaXMgYXZhaWxhYmxlIChFT0Ygb24gc3RkaW4p LiBJdCBzaG91bGQgcmV0dXJuIHdoZXRoZXIgdG8gZ2V0Ci8vIG1vcmUgY2hhcmFjdGVycywg YW5kIHRoaXMgZnVuY3Rpb24gd2lsbCByZXR1cm4gd2hldGhlciBpdHMgZXhpdCB3YXMKLy8g cmVxdWVzdGVkIGJ5IHRoZSBjYWxsYmFjayBvciBub3QgKHRoZSBjYWxsYmFjayBtYXkgc2ln bmFsIEVPRiBpcwovLyBhbiBhcHByb3ByaWF0ZSBwbGFjZSB0byBzdG9wIGFuZCB3ZSBzdGls bCByZXR1cm4gdHJ1ZSkuCi8vIFdoZW4gdGhlIGJ1ZmZlciBpcyBmdWxsIHRoZXJlIGFyZSBh IG51bWJlciBvZiBhdXRvbWF0aWMgb3B0aW9ucwovLyBlY2hvIG9sZCB0aGUgZGF0YSB0byBz dGRvdXQgb3IgY2FsbCBlbmNvZGVjaGFyIGZvciBpdCBvbmUgY2hhcmFjdGVyCi8vIGF0IGEg dGltZTsgc2h1bnQgYSBibG9jayBvZmYgdG8gZGlzaywga2VlcGluZyBtZW1fYnVmZmVyX2tl ZXAgaW4KLy8gbWVtb3J5LCBkaXNjYXJkIGl0IGEgY2hhcmFjdGVyIGF0IGEgdGltZSwgc3Rv cCAoYW5kIHJldHVybiBmYWxzZTsKLy8gbm8gRU9GIGNhbGwgaXMgbWFkZSksIG9yIGZhaWwg KGV4aXQpLiBIZXJlICdmdWxsJyBpcyBkZWZpbmVkIGFzCi8vIGxlc3MgdGhhbiBtZW1fYnVm ZmVyX21hcmdpbiBvZiBzcGFjZSBhZnRlciBhZGRpbmcgdGhlIG1vc3QgcmVjZW50Ci8vIGNo YXJhY3Rlciwgc28gdGhlcmUgaXMgYWx3YXlzIGEgYml0IG9mIHNwYWNlIGZvciBjYWxsYmFj a3MgdG8gZG8KLy8gaW5wdXQgdHJhbnNmb3JtYXRpb25zLiBBZ2FpbiwgYXQgbGVhc3Qgb25l IGNoYXJhY3RlciBpcyBhbHdheXMKLy8gYWRkZWQgKGlmIHBvc3NpYmxlKSwgYW5kIHRodXMg Y29uc3VtZWQgZnJvbSBzdGRpbiwgc28gb25seSBjYWxsIHRoaXMKLy8gaWYgeW91IHJlYWxs eSB3YW50IHRvIGRvIHRoYXQuCnN0YXRpYyBib29sIGZpbGwoY2FsbGJhY2tfdCBjYWxsYmFj aywgd2hlbl9mdWxsX3Qgd2hlbl9mdWxsKSB7CglpZiAoZmVvZihzdGRpbikhPTApIHsKCQli dWZmZXJfY2hhcj1FT0Y7CgkJaWYgKCEoKmNhbGxiYWNrKSgpKSByZXR1cm4gdHJ1ZTsKCQly ZXR1cm4gZmFsc2U7Cgl9Cglmb3IgKDs7KSB7CgkJLypALWluZmxvb3BzQCovCgkJd2hpbGUg KG1lbV9idWZmZXJfZmlsbGVkPj1tZW1fYnVmZmVyX3NpemUtbWVtX2J1ZmZlcl9tYXJnaW4p IHsKCQkJc3dpdGNoICh3aGVuX2Z1bGwpIHsKCQkJY2FzZSBlY2hvOgoJCQkJaWYgKGRpc2tf YnVmZmVyX2ZpbGxlZD4wKSBlY2hvX2Rpc2tfYnVmZmVyKCk7CgkJCQkodm9pZCllbXB0eShl Y2hvaW5nX29uZV9jaGFyKTsKCQkJCWJyZWFrOwoJCQljYXNlIGVuY29kZToKCQkJCWlmIChk aXNrX2J1ZmZlcl9maWxsZWQ+MCkgZW5jb2RlX2Rpc2tfYnVmZmVyKCk7CgkJCQkodm9pZCll bXB0eShlbmNvZGluZ19vbmVfY2hhcik7CgkJCQlicmVhazsKCQkJY2FzZSBkaXNjYXJkOgoJ CQkJaWYgKGRpc2tfYnVmZmVyX2ZpbGxlZD4wKSBza2lwX2Rpc2tfYnVmZmVyKCk7CgkJCQko dm9pZCllbXB0eShvbmVfY2hhcik7CgkJCQlicmVhazsKCQkJY2FzZSBzaHVudDoKCQkJCXNo dW50X3RvX2Rpc2sobWVtX2J1ZmZlcl9maWxsZWQtbWVtX2J1ZmZlcl9rZWVwKTsKCQkJCWJy ZWFrOwoJCQljYXNlIHN0b3A6CgkJCQlyZXR1cm4gZmFsc2U7CgkJCWNhc2UgZmFpbDogZGVm YXVsdDoKCQkJCXJlc29ydF90b19leGl0KHRydWUsImJ1ZmZlciBmdWxsIixFWF9TT0ZUV0FS RSk7CgkJCX0KCQl9CgkJLypAPWluZmxvb3BzQCovCgkJYnVmZmVyX2NoYXI9Z2V0KCk7CgkJ aWYgKGJ1ZmZlcl9jaGFyPT1FT0YpIHsKCQkJcmVzb3J0X3RvX2Vycm5vKGZlcnJvcihzdGRp bikhPTAsImVycm9yIHJlYWRpbmcgaW5wdXQiLEVYX0lPRVJSKTsKCQkJaWYgKCEoKmNhbGxi YWNrKSgpKSByZXR1cm4gdHJ1ZTsKCQkJcmV0dXJuIGZhbHNlOwoJCX0KCQkqbWVtX2J1ZmZl cl9uZXh0X2ZpbGw9KGNoYXIpYnVmZmVyX2NoYXI7CgkJKyttZW1fYnVmZmVyX25leHRfZmls bDsKCQlpZiAobWVtX2J1ZmZlcl9uZXh0X2ZpbGw9PW1lbV9idWZmZXJfZW5kKSBtZW1fYnVm ZmVyX25leHRfZmlsbD1tZW1fYnVmZmVyX3N0YXJ0OwoJCSsrbWVtX2J1ZmZlcl9maWxsZWQ7 CgkJKytidWZmZXJfZmlsbGVkOwoJCWlmICghKCpjYWxsYmFjaykoKSkgcmV0dXJuIHRydWU7 Cgl9Cn0KCnN0YXRpYyBpbmxpbmUgdm9pZCBjcmVhdGVfZGlza19idWZmZXIoKSB7CglpbnQg ZmlsZGVzOwoJZmlsZGVzPW1rc3RlbXAoZGlza19idWZmZXJfdGVtcGxhdGUpOwoJcmVzb3J0 X3RvX2Vycm5vKGZpbGRlcz09LTEsCgkJCSJjYW5ub3QgY3JlYXRlIHRlbXBvcmFyeSBmaWxl IixFWF9DQU5UQ1JFQVQpOwoJZGlza19idWZmZXI9ZmRvcGVuKGZpbGRlcywicnciKTsKCXJl c29ydF90b19lcnJubyhkaXNrX2J1ZmZlcj09TlVMTCwKCQkJImNhbm5vdCBjcmVhdGUgdGVt cG9yYXJ5IHN0cmVhbSIsRVhfQ0FOVENSRUFUKTsKfQpzdGF0aWMgdm9pZCByZW1vdmVfZGlz a19idWZmZXIoKSB7CglpZiAoZGlza19idWZmZXIhPU5VTEwpIHsKCQlyZXNvcnRfdG9fd2Fy bmluZyhmY2xvc2UoZGlza19idWZmZXIpIT0wLAoJCQkJImVycm9yIGNsb3NpbmcgdGVtcG9y YXJ5IGZpbGUiKTsKCQlkaXNrX2J1ZmZlcj1OVUxMOwoJCXJlc29ydF90b193YXJuaW5nKHVu bGluayhkaXNrX2J1ZmZlcl90ZW1wbGF0ZSkhPTAsCgkJCQkiZXJyb3IgcmVtb3ZpbmcgdGVt cG9yYXJ5IGZpbGUiKTsKCX0KfQpzdGF0aWMgaW5saW5lIHZvaWQgc2h1bnRfdG9fZGlzayhp bnQgbikgewoJaWYgKGRpc2tfYnVmZmVyPT1OVUxMKSBjcmVhdGVfZGlza19idWZmZXIoKTsK CWlmIChkaXNrX2J1ZmZlcl9zb3VnaHQhPWRpc2tfYnVmZmVyX3N0YXJ0K2Rpc2tfYnVmZmVy X2ZpbGxlZCkgewoJCWRpc2tfYnVmZmVyX3NvdWdodD1kaXNrX2J1ZmZlcl9zdGFydCtkaXNr X2J1ZmZlcl9maWxsZWQ7CgkJLypALW51bGxwYXNzQCovCgkJcmVzb3J0X3RvX2Vycm5vKGZz ZWVrKGRpc2tfYnVmZmVyLAoJCQkJZGlza19idWZmZXJfc3RhcnQrZGlza19idWZmZXJfZmls bGVkLFNFRUtfU0VUKSE9MCwKCQkJCSJjYW5ub3Qgc2VlayB0byBlbmQgb2YgdGVtcG9yYXJ5 IGZpbGUiLEVYX0lPRVJSKTsKCQkvKkA9bnVsbHBhc3NAKi8KCX0KCXdoaWxlIChuPjApIHsK CQlyZXNvcnRfdG9fZXhpdChtZW1fYnVmZmVyX2ZpbGxlZD09MCwKCQkJCSJpbnRlcm5hbCBl cnJvcjogc2h1bnRpbmcgdG9vIG11Y2ggdG8gZGlzayIsRVhfU09GVFdBUkUpOwoJCS8qQC1u dWxscGFzc0AqLwoJCXJlc29ydF90b19lcnJubyhwdXRjKCptZW1fYnVmZmVyX25leHRfZW1w dHksZGlza19idWZmZXIpPT1FT0YsCgkJCQkiZXJyb3Igd3JpdGluZyB0byB0ZW1wb3Jhcnkg ZmlsZSIsRVhfSU9FUlIpOwoJCS8qQD1udWxscGFzc0AqLwoJCSsrZGlza19idWZmZXJfc291 Z2h0OwoJCSsrZGlza19idWZmZXJfZmlsbGVkOwoJCSsrbWVtX2J1ZmZlcl9uZXh0X2VtcHR5 OwoJCWlmIChtZW1fYnVmZmVyX25leHRfZW1wdHk9PW1lbV9idWZmZXJfZW5kKSBtZW1fYnVm ZmVyX25leHRfZW1wdHk9bWVtX2J1ZmZlcl9zdGFydDsKCQktLW1lbV9idWZmZXJfZmlsbGVk OwoJCS0tbjsKCX0KfQoKLyogdGFnOiBjYWxsYmFja19mdW5jdGlvbnMgKi8KCnN0YXRpYyBi b29sIG9uZV9jaGFyKCkgewoJY2FsbGJhY2tfaW50PWJ1ZmZlcl9jaGFyOwoJcmV0dXJuIGZh bHNlOwp9CnN0YXRpYyBib29sIGVjaG9pbmdfb25lX2NoYXIoKSB7CglpZiAoYnVmZmVyX2No YXIhPUVPRikgewoJCXJlc29ydF90b19lcnJubyhwdXQoYnVmZmVyX2NoYXIpPT1FT0YsImVy cm9yIGVjaG9pbmciLEVYX0lPRVJSKTsKCX0KCWNhbGxiYWNrX2ludD1idWZmZXJfY2hhcjsK CXJldHVybiBmYWxzZTsKfQpzdGF0aWMgYm9vbCBlbmNvZGluZ19vbmVfY2hhcigpIHsKCWlm IChidWZmZXJfY2hhciE9RU9GKSBlbmNvZGVjaGFyKGJ1ZmZlcl9jaGFyKTsKCWNhbGxiYWNr X2ludD1idWZmZXJfY2hhcjsKCXJldHVybiBmYWxzZTsKfQovLyBTZXQgdXAgY2FsbGJhY2tf aW50IGJlZm9yZSB1c2luZyB0aGlzLgpzdGF0aWMgYm9vbCBuX2NoYXJzKCkgewoJcmV0dXJu IC0tY2FsbGJhY2tfaW50PjA7Cn0KLy8gU2V0IHVwIGNhbGxiYWNrX2ludCBiZWZvcmUgdXNp bmcgdGhpcy4Kc3RhdGljIGJvb2wgZWNob2luZ19uX2NoYXJzKCkgewoJaWYgKGJ1ZmZlcl9j aGFyIT1FT0YpIHsKCQlyZXNvcnRfdG9fZXJybm8ocHV0KGJ1ZmZlcl9jaGFyKT09RU9GLCJl cnJvciBlY2hvaW5nIixFWF9JT0VSUik7Cgl9CglyZXR1cm4gLS1jYWxsYmFja19pbnQ+MDsK fQovLyBTZXQgdXAgY2FsbGJhY2tfaW50IGJlZm9yZSB1c2luZyB0aGlzLgpzdGF0aWMgYm9v bCBlbmNvZGluZ19uX2NoYXJzKCkgewoJaWYgKGJ1ZmZlcl9jaGFyIT1FT0YpIGVuY29kZWNo YXIoYnVmZmVyX2NoYXIpOwoJcmV0dXJuIC0tY2FsbGJhY2tfaW50PjA7Cn0KLy8gU2V0IHVw IGNhbGxiYWNrX2ludCBhbmQgY2FsbGJhY2tfc2F2ZSBiZWZvcmUgdXNpbmcgdGhpcy4Kc3Rh dGljIGJvb2wgc2F2aW5nX25fY2hhcnMoKSB7CglpZiAoYnVmZmVyX2NoYXIhPUVPRikgKmNh bGxiYWNrX3NhdmUrKz0oY2hhcilidWZmZXJfY2hhcjsKCS8vIFdlIGRvbid0IGFjdHVhbGx5 IG5lZWQgdGhpcywgdGhvdWdoIGl0J3MgYSBnb29kIGlkZWEsIHJlYWxseSEKCS8vICpjYWxs YmFja19zYXZlPSdcMCc7CglyZXR1cm4gLS1jYWxsYmFja19pbnQ+MDsKfQovLyBTZXQgdXAg Y2FsbGJhY2tfaW50IGFuZCBjYWxsYmFja19tYXRjaCBiZWZvcmUgdXNpbmcgdGhpcy4Kc3Rh dGljIGJvb2wgbl9jaGFyc191bnRpbF9tYXRjaCgpIHsKCWNhbGxiYWNrX2Jvb2w9YnVmZmVy X2NoYXI9PWNhbGxiYWNrX21hdGNoOwoJcmV0dXJuIC0tY2FsbGJhY2tfaW50PjAmJmJ1ZmZl cl9jaGFyIT1jYWxsYmFja19tYXRjaDsKfQovLyBEbyBjYWxsYmFja19ib29sPWZhbHNlIGJl Zm9yZSB1c2luZyB0aGlzLgpzdGF0aWMgYm9vbCB1bnRpbF9lb2woKSB7CglpZiAoYnVmZmVy X2NoYXI9PShpbnQpJ1xuJykgcmV0dXJuICFjYWxsYmFja19ib29sOwoJY2FsbGJhY2tfYm9v bD1idWZmZXJfY2hhcj09KGludCknXHInOwoJcmV0dXJuIHRydWU7Cn0KLy8gRG8gY2FsbGJh Y2tfYm9vbD1mYWxzZSBiZWZvcmUgdXNpbmcgdGhpcy4KLypzdGF0aWMgYm9vbCBlY2hvaW5n X3VudGlsX2VvbCgpIHsKCWlmIChidWZmZXJfY2hhciE9RU9GKSB7CgkJcmVzb3J0X3RvX2Vy cm5vKHB1dChidWZmZXJfY2hhcik9PUVPRiwiZXJyb3IgZWNob2luZyIsRVhfSU9FUlIpOwoJ fQoJaWYgKGJ1ZmZlcl9jaGFyPT0oaW50KSdcbicpIHJldHVybiAhY2FsbGJhY2tfYm9vbDsK CWNhbGxiYWNrX2Jvb2w9YnVmZmVyX2NoYXI9PShpbnQpJ1xyJzsKCXJldHVybiB0cnVlOwp9 Ki8KLy8gRG8gY2FsbGJhY2tfYm9vbD1mYWxzZSwgY2FsbGJhY2tfaW50PTAgYmVmb3JlIHVz aW5nIHRoaXMuCnN0YXRpYyBib29sIGNvdW50aW5nX3VudGlsX2VvbCgpIHsKCWlmIChidWZm ZXJfY2hhciE9RU9GKSArK2NhbGxiYWNrX2ludDsKCWlmIChidWZmZXJfY2hhcj09KGludCkn XG4nKSByZXR1cm4gIWNhbGxiYWNrX2Jvb2w7CgljYWxsYmFja19ib29sPWJ1ZmZlcl9jaGFy PT0oaW50KSdccic7CglyZXR1cm4gdHJ1ZTsKfQovLyBEbyBjYWxsYmFja19ib29sPWZhbHNl IGFuZCBzZXQgdXAgY2FsbGJhY2tfc2F2ZSBiZWZvcmUgdXNpbmcgdGhpcy4Kc3RhdGljIGJv b2wgc2F2aW5nX3VudGlsX2VvbCgpIHsKCWlmIChidWZmZXJfY2hhciE9RU9GKSAqY2FsbGJh Y2tfc2F2ZSsrPShjaGFyKWJ1ZmZlcl9jaGFyOwoJLy8gV2UgZG9uJ3QgYWN0dWFsbHkgbmVl ZCB0aGlzLCB0aG91Z2ggaXQncyBhIGdvb2QgaWRlYSwgcmVhbGx5IQoJLy8gKmNhbGxiYWNr X3NhdmU9J1wwJzsKCWlmIChidWZmZXJfY2hhcj09KGludCknXG4nKSByZXR1cm4gIWNhbGxi YWNrX2Jvb2w7CgljYWxsYmFja19ib29sPWJ1ZmZlcl9jaGFyPT0oaW50KSdccic7CglyZXR1 cm4gdHJ1ZTsKfQovLyBEbyBjYWxsYmFja19ib29sPWZhbHNlIGJlZm9yZSB1c2luZyB0aGlz LgpzdGF0aWMgYm9vbCBkZWNvZGluZ191bnRpbF9lb2woKSB7CgkvLyBXZSBkZWNvZGUgYXMg d2UgZmlsbCBhbmQgd29yayBkaXJlY3RseSBpbiB0aGUgYnVmZmVyIHRvIG1ha2UKCS8vIHRo ZSB0cmFuc2Zvcm1hdGlvbi4gV2UgYXJlIGd1YXJhbnRlZWQgZW5vdWdoIHNwYWNlIHRvIGRv IHRoaXMgYnkKCS8vIG1lbV9idWZmZXJfbWFyZ2luLgoJZGVjb2RlX3QgZGVjb2RlZDsKCWRl Y29kZWQ9ZGVjb2RlY2hhcihidWZmZXJfY2hhcik7CgkvLyBXZSBhbHdheXMgcmVtb3ZlIHRo ZSBsYXRlc3QgdW5kZWNvZGVkIGNoYXJhY3RlciBmcm9tIHRoZQoJLy8gYnVmZmVyLgoJKytk ZWNvZGVkLnI7CglpZiAoZGVjb2RlZC5yPm1lbV9idWZmZXJfZmlsbGVkKSB7CgkJLy8gVGhp cyB3aWxsIG9ubHkgaGFwcGVuIGZvciBxdW90ZWQtcHJpbnRhYmxlIGRlY29kaW5nCgkJLy8g d2hpdGVzcGFjZSBzdHJpcHBpbmcsIGFuZCB3ZSBjYW4ganVzdCBsaXZlIHdpdGggaXQKCQkv LyBpZiB3ZSBjYW4ndCBnZXQgcmlkIG9mIGl0IGFsbDsgd2l0aCBzZW5zaWJsZSBjb25zdGFu dHMKCQkvLyBzb21ldGhpbmcgcmVhbGx5IGlzIGRpc29iZXlpbmcgTUlNRSBhbmQgcHJvYmFi bHkgU01UUAoJCS8vIGFib3V0IGxpbmUgbGVuZ3RoIGFueXdheSBpZiB0aGlzIGhhcHBlbnMu CgkJd2FybmluZygidW5hYmxlIHRvIHN0cmlwIGFsbCB3aGl0ZXNwYWNlOyBub3QgZW5vdWdo IGluIG1lbW9yeSIpOwoJCWRlY29kZWQucj1tZW1fYnVmZmVyX2ZpbGxlZDsKCX0KCWlmIChi dWZmZXJfZmlsbGVkLWRlY29kZWQucjxidWZmZXJfcmVhZCkgewoJCS8vIFdlIHNob3VsZCBh bHdheXMgYmUgd29ya2luZyBpbiBsb29rYWhlYWQgd2hlbiB0aGlzIGhhcHBlbnMsCgkJLy8g YnV0IGJldHRlciBzYWZlIHRoYW4gc29ycnkhCgkJd2FybmluZygidW5hYmxlIHRvIHN0cmlw IGFsbCB3aGl0ZXNwYWNlOyBub3QgZW5vdWdoIHVucmVhZCIpOwoJCWRlY29kZWQucj1idWZm ZXJfZmlsbGVkLWJ1ZmZlcl9yZWFkOwoJfQoJaWYgKGJ1ZmZlcl9tYXJrZWQmJmJ1ZmZlcl9m aWxsZWQtZGVjb2RlZC5yPGJ1ZmZlcl9tYXJrKSB7CgkJLy8gTWFya3Mgc2hvdWxkIGJlIGlu IGxvb2tiZWhpbmQgdG9vLCBidXQgYWdhaW4sCgkJLy8gYmV0dGVyIHNhZmUgdGhhbiBzb3Jy eSEgV2UgdW5tYXJrLiBGaWxsaW5nIG9mdGVuCgkJLy8gZG9lcyB0aGF0IGFueXdheS4KCQli dWZmZXJfbWFya2VkPWZhbHNlOwoJCWJ1ZmZlcl9tYXJrPTA7Cgl9CgltZW1fYnVmZmVyX25l eHRfZmlsbC09ZGVjb2RlZC5yOwoJaWYgKG1lbV9idWZmZXJfbmV4dF9maWxsPG1lbV9idWZm ZXJfc3RhcnQpCgkJCW1lbV9idWZmZXJfbmV4dF9maWxsKz1tZW1fYnVmZmVyX3NpemU7Cglt ZW1fYnVmZmVyX2ZpbGxlZC09ZGVjb2RlZC5yOwoJYnVmZmVyX2ZpbGxlZC09ZGVjb2RlZC5y OwoJaWYgKGRlY29kZWQuYzEhPUVPRikgewoJCSptZW1fYnVmZmVyX25leHRfZmlsbD0oY2hh cilkZWNvZGVkLmMxOwoJCSsrbWVtX2J1ZmZlcl9uZXh0X2ZpbGw7CgkJaWYgKG1lbV9idWZm ZXJfbmV4dF9maWxsPT1tZW1fYnVmZmVyX2VuZCkgbWVtX2J1ZmZlcl9uZXh0X2ZpbGw9bWVt X2J1ZmZlcl9zdGFydDsKCQkrK21lbV9idWZmZXJfZmlsbGVkOwoJCSsrYnVmZmVyX2ZpbGxl ZDsKCQlpZiAoZGVjb2RlZC5jMiE9RU9GKSB7CgkJCSptZW1fYnVmZmVyX25leHRfZmlsbD0o Y2hhcilkZWNvZGVkLmMyOwoJCQkrK21lbV9idWZmZXJfbmV4dF9maWxsOwoJCQlpZiAobWVt X2J1ZmZlcl9uZXh0X2ZpbGw9PW1lbV9idWZmZXJfZW5kKSBtZW1fYnVmZmVyX25leHRfZmls bD1tZW1fYnVmZmVyX3N0YXJ0OwoJCQkrK21lbV9idWZmZXJfZmlsbGVkOwoJCQkrK2J1ZmZl cl9maWxsZWQ7CgkJCWlmIChkZWNvZGVkLmMzIT1FT0YpIHsKCQkJCSptZW1fYnVmZmVyX25l eHRfZmlsbD0oY2hhcilkZWNvZGVkLmMzOwoJCQkJKyttZW1fYnVmZmVyX25leHRfZmlsbDsK CQkJCWlmIChtZW1fYnVmZmVyX25leHRfZmlsbD09bWVtX2J1ZmZlcl9lbmQpIG1lbV9idWZm ZXJfbmV4dF9maWxsPW1lbV9idWZmZXJfc3RhcnQ7CgkJCQkrK21lbV9idWZmZXJfZmlsbGVk OwoJCQkJKytidWZmZXJfZmlsbGVkOwoJCQl9CgkJfQoJfQoJLy8gV2UgY2hlY2sgZm9yIGVv bCB1c2luZyB0aGUgaW5wdXQgc3RyZWFtLCBub3QgdGhlIGRlY29kZWQKCS8vIHN0cmVhbSwg YXMgaXQncyBhbGwgYWJvdXQgdGhlIHVwY29taW5nIGJvdW5kYXJ5CglpZiAoYnVmZmVyX2No YXI9PShpbnQpJ1xuJykgcmV0dXJuICFjYWxsYmFja19ib29sOwoJY2FsbGJhY2tfYm9vbD1i dWZmZXJfY2hhcj09KGludCknXHInOwoJcmV0dXJuIHRydWU7Cn0KLypzdGF0aWMgYm9vbCB1 bnRpbF9ub19sb29rYmVoaW5kKCkgewoJcmV0dXJuIGJ1ZmZlcl9yZWFkIT0wOwp9Ki8Kc3Rh dGljIGJvb2wgZWNob2luZ191bnRpbF9ub19sb29rYmVoaW5kKCkgewoJaWYgKGJ1ZmZlcl9j aGFyIT1FT0YpIHsKCQlyZXNvcnRfdG9fZXJybm8ocHV0KGJ1ZmZlcl9jaGFyKT09RU9GLCJl cnJvciBlY2hvaW5nIixFWF9JT0VSUik7Cgl9CglyZXR1cm4gYnVmZmVyX3JlYWQhPTA7Cn0K c3RhdGljIGJvb2wgZW5jb2RpbmdfdW50aWxfbm9fbG9va2JlaGluZCgpIHsKCWlmIChidWZm ZXJfY2hhciE9RU9GKSBlbmNvZGVjaGFyKGJ1ZmZlcl9jaGFyKTsKCXJldHVybiBidWZmZXJf cmVhZCE9MDsKfQpzdGF0aWMgYm9vbCB1bnRpbF9ub19kaXNrX2J1ZmZlcigpIHsKCXJldHVy biBkaXNrX2J1ZmZlcl9maWxsZWQhPTA7Cn0Kc3RhdGljIGJvb2wgZWNob2luZ191bnRpbF9u b19kaXNrX2J1ZmZlcigpIHsKCWlmIChidWZmZXJfY2hhciE9RU9GKSB7CgkJcmVzb3J0X3Rv X2Vycm5vKHB1dChidWZmZXJfY2hhcik9PUVPRiwiZXJyb3IgZWNob2luZyIsRVhfSU9FUlIp OwoJfQoJcmV0dXJuIGRpc2tfYnVmZmVyX2ZpbGxlZCE9MDsKfQpzdGF0aWMgYm9vbCBlbmNv ZGluZ191bnRpbF9ub19kaXNrX2J1ZmZlcigpIHsKCWlmIChidWZmZXJfY2hhciE9RU9GKSBl bmNvZGVjaGFyKGJ1ZmZlcl9jaGFyKTsKCXJldHVybiBkaXNrX2J1ZmZlcl9maWxsZWQhPTA7 Cn0Kc3RhdGljIGJvb2wgdW50aWxfbm9fYnVmZmVyKCkgewoJcmV0dXJuIGJ1ZmZlcl9maWxs ZWQhPTA7Cn0KLypzdGF0aWMgYm9vbCBlY2hvaW5nX3VudGlsX25vX2J1ZmZlcigpIHsKCWlm IChidWZmZXJfY2hhciE9RU9GKSB7CgkJcmVzb3J0X3RvX2Vycm5vKHB1dChidWZmZXJfY2hh cik9PUVPRiwiZXJyb3IgZWNob2luZyIsRVhfSU9FUlIpOwoJfQoJcmV0dXJuIGJ1ZmZlcl9m aWxsZWQhPTA7Cn0qLwpzdGF0aWMgYm9vbCB1bnRpbF9zdGFydF9tYXJrZWQoKSB7CglyZXR1 cm4gIShidWZmZXJfbWFya2VkP2J1ZmZlcl9tYXJrPT0wOmJ1ZmZlcl9yZWFkPT0wKTsKfQpz dGF0aWMgYm9vbCBlY2hvaW5nX3VudGlsX3N0YXJ0X21hcmtlZCgpIHsKCWlmIChidWZmZXJf Y2hhciE9RU9GKSB7CgkJcmVzb3J0X3RvX2Vycm5vKHB1dChidWZmZXJfY2hhcik9PUVPRiwi ZXJyb3IgZWNob2luZyIsRVhfSU9FUlIpOwoJfQoJcmV0dXJuICEoYnVmZmVyX21hcmtlZD9i dWZmZXJfbWFyaz09MDpidWZmZXJfcmVhZD09MCk7Cn0Kc3RhdGljIGJvb2wgZW5jb2Rpbmdf dW50aWxfc3RhcnRfbWFya2VkKCkgewoJaWYgKGJ1ZmZlcl9jaGFyIT1FT0YpIGVuY29kZWNo YXIoYnVmZmVyX2NoYXIpOwoJcmV0dXJuICEoYnVmZmVyX21hcmtlZD9idWZmZXJfbWFyaz09 MDpidWZmZXJfcmVhZD09MCk7Cn0KLy8gU2V0IHVwIGNhbGxiYWNrX21hdGNoIGJlZm9yZSB1 c2luZyB0aGlzLgpzdGF0aWMgYm9vbCB1bnRpbF9tYXRjaCgpIHsKCXJldHVybiBidWZmZXJf Y2hhciE9Y2FsbGJhY2tfbWF0Y2g7Cn0KLy8gU2V0IHVwIGNhbGxiYWNrX2NvbXBhcmUgYmVm b3JlIHVzaW5nIHRoaXMuCnN0YXRpYyBib29sIGNvbXBhcmluZ19oZWFkKCkgewoJLypALW51 bGxkZXJlZkAqLwoJaWYgKGJ1ZmZlcl9jaGFyIT0oaW50KSh1bnNpZ25lZCBpbnQpKmNhbGxi YWNrX2NvbXBhcmUpIHsKCQljYWxsYmFja19ib29sPWZhbHNlOwoJCXJldHVybiBmYWxzZTsK CX0KCS8qQC1tb2RvYnNlcnZlckAqLwoJKytjYWxsYmFja19jb21wYXJlOwoJLypAPW1vZG9i c2VydmVyQCovCglpZiAoKmNhbGxiYWNrX2NvbXBhcmU9PSdcMCcpIHsKCQljYWxsYmFja19i b29sPXRydWU7CgkJcmV0dXJuIGZhbHNlOwoJfQoJcmV0dXJuIHRydWU7CgkvKkA9bnVsbGRl cmVmQCovCn0KLy8gU2V0IHVwIGNhbGxiYWNrX2NvbXBhcmUgYmVmb3JlIHVzaW5nIHRoaXMu CnN0YXRpYyBib29sIGNhc2VfaW5zZW5zaXRpdmVseV9jb21wYXJpbmdfaGVhZCgpIHsKCS8q QC1udWxsZGVyZWZAKi8KCWludCBjMT0oaW50KSh1bnNpZ25lZCBpbnQpKmNhbGxiYWNrX2Nv bXBhcmU7CglpbnQgYzI9YnVmZmVyX2NoYXI7CglpZiAoYzEhPWMyJiYKCQkJKGMxPChpbnQp J0EnfHxjMT4oaW50KSdaJ3x8YzIhPWMxLShpbnQpJ0EnKyhpbnQpJ2EnKSYmCgkJCShjMjwo aW50KSdBJ3x8YzI+KGludCknWid8fGMxIT1jMi0oaW50KSdBJysoaW50KSdhJykpIHsKCQlj YWxsYmFja19ib29sPWZhbHNlOwoJCXJldHVybiBmYWxzZTsKCX0KCS8qQC1tb2RvYnNlcnZl ckAqLwoJKytjYWxsYmFja19jb21wYXJlOwoJLypAPW1vZG9ic2VydmVyQCovCglpZiAoKmNh bGxiYWNrX2NvbXBhcmU9PSdcMCcpIHsKCQljYWxsYmFja19ib29sPXRydWU7CgkJcmV0dXJu IGZhbHNlOwoJfQoJcmV0dXJuIHRydWU7CgkvKkA9bnVsbGRlcmVmQCovCn0KCi8qIHRhZzog ZW5jb2RpbmdfZnVuY3Rpb25zICovCgpzdGF0aWMgaW5saW5lIHZvaWQgZW5jb2RlX3N0cmlu Zyhjb25zdCBjaGFyICogcykgewoJd2hpbGUgKCpzIT0nXDAnKSB7CgkJZW5jb2RlY2hhcigo aW50KSh1bnNpZ25lZCBpbnQpKnMpOwoJCXMrKzsKCX0KfQpzdGF0aWMgdm9pZCBlbmNvZGVj aGFyKGludCBjKSB7CglpZiAoZW5jb2Rpbmc9PXVuZW5jb2RlZCkgewoJCWlmIChjIT1FT0Yp IHJlc29ydF90b19lcnJubyhwdXQoYyk9PUVPRiwiZXJyb3IgZW5jb2RpbmciLEVYX0lPRVJS KTsKCQlyZXR1cm47Cgl9IGVsc2UgaWYgKGVuY29kaW5nPT1xdW90ZWRfcHJpbnRhYmxlKSB7 CgkJaWYgKGVuY29kaW5nX2VjaG9lZD49NjgpIHsKCQkJLy8gV2UgbmVlZCBhIHNvZnQgbGlu ZSBicmVhaywgb3IgYXJlIGNsb3NlIGVub3VnaCB0byBuZWVkaW5nCgkJCS8vIG9uZSAoNzYg Y2hhcnMgbWF4OyB1bmNsZWFyIHdoZXRoZXIgdGhhdCBjb3VudHMgdGhlIENSTEY7IGFuZAoJ CQkvLyB3ZSBtYXkgb3V0cHV0IHR3byAzIGNoYXJhY3RlciBzZXF1ZW5jZXMgd2hpY2ggd2Ug ZG9uJ3Qgd2FudAoJCQkvLyB0byBmb2xsb3cgd2l0aCBhbiB1bmVzY2FwZWQgQ1JMRikuIFRo aXMgc2NoZW1lIHdpbGwgcHJvYmFibHkKCQkJLy8gbWFrZSBtYWlsIGxvb2sgYSBiaXQgYXdm dWwsIGJ1dCB0aGF0J3MgZmFpcmx5IHN0YW5kYXJkIGFueXdheSwKCQkJLy8gYW5kIGl0IHNo b3VsZG4ndCBkZWdyYWRlLgoJCQlyZXNvcnRfdG9fZXJybm8ocHV0c3RyKCI9XHJcbiIpPT1F T0YsCgkJCQkJImVycm9yIGVuY29kaW5nIHN0cmluZyIsRVhfSU9FUlIpOwoJCQllbmNvZGlu Z19lY2hvZWQ9MDsKCQl9CgkJaWYgKGVuY29kaW5nX2ZpbGxlZD09MSkgewoJCQkvLyBXaGF0 ZXZlciBoYXBwZW5zLCB3ZSdsbCBkZWFsIHdpdGggdGhpcyBub3cKCQkJZW5jb2RpbmdfZmls bGVkPTA7CgkJCWlmIChlbmNvZGluZ19idWZmZXJbMF09PSdccicpIHsKCQkJCWlmIChjPT0o aW50KSdcbicpIHsKCQkJCQkvLyBPdXRwdXQgdGhlbSBhcyBpcyBhbmQgd2UncmUgZG9uZSBm b3Igbm93CgkJCQkJcmVzb3J0X3RvX2Vycm5vKHB1dHN0cigiXHJcbiIpPT1FT0YsCgkJCQkJ CQkiZXJyb3IgZW5jb2Rpbmcgc3RyaW5nIixFWF9JT0VSUik7CgkJCQkJZW5jb2RpbmdfZWNo b2VkPTA7CgkJCQkJcmV0dXJuOwoJCQkJfSBlbHNlIHsKCQkJCQkvLyBNdXN0IGVuY29kZSB0 aGUgYmFyZSBDUiBhbmQgY29udGludWUgYXMgbm9ybWFsCgkJCQkJcmVzb3J0X3RvX2Vycm5v KHB1dCgoaW50KSc9Jyk9PUVPRiwiZXJyb3IgZW5jb2RpbmciLEVYX0lPRVJSKTsKCQkJCQll bmNvZGVfaGV4X2J5dGUoKHVuc2lnbmVkIGludCknXHInKTsKCQkJCQllbmNvZGluZ19lY2hv ZWQrPTM7CgkJCQl9CgkJCX0gZWxzZSB7CgkJCQkvLyBlbmNvZGluZ19idWZmZXJbMF0gbXVz dCBiZSB3aGl0ZXNwYWNlCgkJCQlpZiAoYz09RU9GfHxjPT0oaW50KSdccicpIHsKCQkJCQkv LyBNdXN0IGVuY29kZSBpdAoJCQkJCXJlc29ydF90b19lcnJubyhwdXQoKGludCknPScpPT1F T0YsImVycm9yIGVuY29kaW5nIixFWF9JT0VSUik7CgkJCQkJZW5jb2RlX2hleF9ieXRlKCh1 bnNpZ25lZCBpbnQpZW5jb2RpbmdfYnVmZmVyWzBdKTsKCQkJCQllbmNvZGluZ19lY2hvZWQr PTM7CgkJCQl9IGVsc2UgewoJCQkJCS8vIEl0IGlzIGZpbmUgdG8gb3V0cHV0IGl0IG5vdyBh cyBzb21ldGhpbmcgZWxzZSBpcyBjb21pbmcKCQkJCQlyZXNvcnRfdG9fZXJybm8ocHV0KAoJ CQkJCQkJKGludCkodW5zaWduZWQgaW50KWVuY29kaW5nX2J1ZmZlclswXSk9PUVPRiwKCQkJ CQkJCSJlcnJvciBlbmNvZGluZyIsRVhfSU9FUlIpOwoJCQkJCWVuY29kaW5nX2VjaG9lZCs9 MTsKCQkJCX0KCQkJfQoJCX0KCQlpZiAoKGM+PTMzJiZjPD02MCl8fChjPj02MiYmYzw9MTI2 KSkgewoJCQlyZXNvcnRfdG9fZXJybm8ocHV0KGMpPT1FT0YsImVycm9yIGVuY29kaW5nIixF WF9JT0VSUik7CgkJCSsrZW5jb2RpbmdfZWNob2VkOwoJCX0gZWxzZSBpZiAoYz09KGludCkn ICd8fGM9PShpbnQpJ1x0JykgewoJCQlpZiAoZW5jb2RpbmdfZWNob2VkPj01NSkgewoJCQkJ Ly8gTXkgY29uY2Vzc2lvbiB0byByZWFkYWJpbGl0eTsgc2luY2UgaXQncyBsaWtlbHkgdG8g YmUKCQkJCS8vIGEgYmlnIG1lc3Mgd2l0aCBhIDY4IGNoYXJhY3RlciB3aWR0aCwgd2UgbWln aHQgYXMgd2VsbAoJCQkJLy8gYnJlYWsgYSBiaXQgZWFybGllciBvbiBhIG5pY2Ugd29yZCBi b3VuZGFyeS4gQW5kIGl0J2xsCgkJCQkvLyBpbiBmYWN0IGxvb2sgYmV0dGVyIGlmIHdlIGJy ZWFrIHdpdGggcm91Z2hseSBlcXVhbCBzaXplCgkJCQkvLyBsaW5lcywgYXNzdW1pbmcgdGhl eSBjb21lIGluIGF0IGNsb3NlIHRvIDc2IGNoYXJhY3RlcnMKCQkJCS8vIHdpZGUsIHNvIHdl IG1pZ2h0IGFzIHdlbGwgbWFrZSBhIG5pY2Ugc2tpbm55IGNvbHVtbi4KCQkJCS8vIHJhdGhl ciB0aGFuIGEgcmFnZ2VkIG9uZSB0aGF0IHVzZXMgdGhlIHNhbWUgYW1vdW50IG9mCgkJCQkv LyBzcGFjZS4gQ29tcHJvbWlzaW5nIGJldHdlZW4gdGhlIHR3bywgdGhlbiwgYXMgc29tZQoJ CQkJLy8gZm9ybWF0cywgbGlrZSBIVE1MLCBkb24ndCBoYXZlIG1hbnkgaGFyZCBsaW5lIGJy ZWFrcwoJCQkJLy8gYW55d2F5LCBpcyB3aGF0IHdlIGdldC4KCQkJCXJlc29ydF90b19lcnJu byhwdXQoYyk9PUVPRiwiZXJyb3IgZW5jb2RpbmciLEVYX0lPRVJSKTsKCQkJCXJlc29ydF90 b19lcnJubyhwdXRzdHIoIj1cclxuIik9PUVPRiwKCQkJCQkJImVycm9yIGVuY29kaW5nIHN0 cmluZyIsRVhfSU9FUlIpOwoJCQkJZW5jb2RpbmdfZWNob2VkPTA7CgkJCX0gZWxzZSB7CgkJ CQkvLyBTdG9yZSBpdDsgd2UgbWF5IG5lZWQgdG8gZW5jb2RlIGl0IGlmIGl0J3MgYXQgZW5k IG9mIGxpbmUKCQkJCWVuY29kaW5nX2ZpbGxlZD0xOwoJCQkJZW5jb2RpbmdfYnVmZmVyWzBd PShjaGFyKWM7CgkJCX0KCQl9IGVsc2UgaWYgKGM9PShpbnQpJ1xyJykgewoJCQkvLyBTdG9y ZSBpdDsgJ1xuJyBtYXkgYmUgY29taW5nIHVwCgkJCWVuY29kaW5nX2ZpbGxlZD0xOwoJCQll bmNvZGluZ19idWZmZXJbMF09J1xyJzsKCQl9IGVsc2UgaWYgKGM9PUVPRikgewoJCQkvLyBO byBidWZmZXIsIGFuZCB3ZSdyZSBkb25lISBSZXNldCBmb3IgYW5vdGhlciBydW4uCgkJCWVu Y29kaW5nX2VjaG9lZD0wOwoJCX0gZWxzZSB7CgkJCS8vIEFueXRoaW5nIGVsc2UgbXVzdCBi ZSBlbmNvZGVkIGFzIGEgc2VxdWVuY2UuCgkJCXJlc29ydF90b19lcnJubyhwdXQoKGludCkn PScpPT1FT0YsImVycm9yIGVuY29kaW5nIixFWF9JT0VSUik7CgkJCWVuY29kZV9oZXhfYnl0 ZSgodW5zaWduZWQgaW50KWMpOwoJCQllbmNvZGluZ19lY2hvZWQrPTM7CgkJfQoJfSBlbHNl IGlmIChlbmNvZGluZz09YmFzZTY0KSB7CgkJaWYgKGM9PUVPRikgewoJCQkvLyBSZXNldCBm b3IgbmV4dCBydW47IHdlIHdvbid0IG5lZWQgaXQgaGVyZQoJCQllbmNvZGluZ19lY2hvZWQ9 MDsKCQkJaWYgKGVuY29kaW5nX2ZpbGxlZD09MCkgcmV0dXJuOwoJCQllbmNvZGluZ19idWZm ZXJbZW5jb2RpbmdfZmlsbGVkXT0nXDAnOwoJCX0gZWxzZSB7CgkJCWVuY29kaW5nX2J1ZmZl cltlbmNvZGluZ19maWxsZWQrK109KGNoYXIpYzsKCQl9CgkJaWYgKGVuY29kaW5nX2ZpbGxl ZD09M3x8Yz09RU9GKSB7CgkJCWVuY29kZV82NCgoKCh1bnNpZ25lZCBpbnQpZW5jb2Rpbmdf YnVmZmVyWzBdPj4yKSYweDNmKSk7CgkJCWVuY29kZV82NCgoKCh1bnNpZ25lZCBpbnQpZW5j b2RpbmdfYnVmZmVyWzBdJjB4MDMpPDw0KXwKCQkJCQkoKCh1bnNpZ25lZCBpbnQpZW5jb2Rp bmdfYnVmZmVyWzFdPj40KSYweDBmKSk7CgkJCWlmIChlbmNvZGluZ19maWxsZWQ9PTEpIHsK CQkJCXJlc29ydF90b19lcnJubyhwdXQoKGludCknPScpPT1FT0YsImVycm9yIGVuY29kaW5n IixFWF9JT0VSUik7CgkJCQlyZXNvcnRfdG9fZXJybm8ocHV0KChpbnQpJz0nKT09RU9GLCJl cnJvciBlbmNvZGluZyIsRVhfSU9FUlIpOwoJCQkJLy8gUmVzZXQgZm9yIG5leHQgcnVuCgkJ CQllbmNvZGluZ19maWxsZWQ9MDsKCQkJCXJldHVybjsKCQkJfQoJCQllbmNvZGVfNjQoKCgo dW5zaWduZWQgaW50KWVuY29kaW5nX2J1ZmZlclsxXSYweDBmKTw8Mil8CgkJCQkJKCgodW5z aWduZWQgaW50KWVuY29kaW5nX2J1ZmZlclsyXT4+NikmMHgwMykpOwoJCQlpZiAoZW5jb2Rp bmdfZmlsbGVkPT0yKSB7CgkJCQlyZXNvcnRfdG9fZXJybm8ocHV0KChpbnQpJz0nKT09RU9G LCJlcnJvciBlbmNvZGluZyIsRVhfSU9FUlIpOwoJCQkJLy8gUmVzZXQgZm9yIG5leHQgcnVu CgkJCQllbmNvZGluZ19maWxsZWQ9MDsKCQkJCXJldHVybjsKCQkJfQoJCQllbmNvZGVfNjQo KCgodW5zaWduZWQgaW50KWVuY29kaW5nX2J1ZmZlclsyXSYweDNmKSkpOwoJCQllbmNvZGlu Z19lY2hvZWQrPTQ7CgkJCWlmIChlbmNvZGluZ19lY2hvZWQ+PTcyKSB7CgkJCQlyZXNvcnRf dG9fZXJybm8ocHV0c3RyKCJcclxuIik9PUVPRiwKCQkJCQkJImVycm9yIGVuY29kaW5nIHN0 cmluZyIsRVhfSU9FUlIpOwoJCQkJZW5jb2RpbmdfZWNob2VkPTA7CgkJCX0KCQkJZW5jb2Rp bmdfZmlsbGVkPTA7CgkJfQoJfSBlbHNlIHsKCQlyZXNvcnRfdG9fZXhpdCh0cnVlLCJpbnRl cm5hbCBlcnJvcjogdW5rbm93biBlbmNvZGluZyIsRVhfU09GVFdBUkUpOwoJfQp9CnN0YXRp YyBpbmxpbmUgdm9pZCBmaW5pc2hfZW5jb2RpbmcoKSB7CgllbmNvZGVjaGFyKEVPRik7Cn0K Ly8gVGhlIGZ1bmN0aW9uIHRha2VzIGFuIGlucHV0IGNoYXJhY3RlciBjIGFuZCByZXR1cm5z IHVwIHRvIGZvdXIgb3V0cHV0Ci8vIGNoYXJhY3RlcnMgKGEgY2hhcmFjdGVyIHdpbGwgYmUg RU9GIHRvIGluZGljYXRlIG5vIGZ1cnRoZXIgY2hhcmFjdGVycwovLyB0byBzdG9yZTsgbm90 ZSB0aGF0IHRoaXMgZG9lc24ndCBtZWFuIHRoZXJlIHdpbGwgYmUgbm8gbW9yZSBldmVyOyBv bmx5Ci8vIGlmIEVPRiBpcyByZXR1cm5lZCB3aGVuIEVPRiB3YXMgaW5wdXQgZG9lcyBpdCBt ZWFudCB0aGlzKSwgYW5kIGEgbnVtYmVyCi8vIG9mIGNoYXJhY3RlcnMgdG8gcmVtb3ZlIGJl Zm9yZSBhZGRpbmcgdGhlIGFmb3JlbWVudGlvbmVkIGNoYXJhY3RlcnMuCnN0YXRpYyBkZWNv ZGVfdCBkZWNvZGVjaGFyKGludCBjKSB7CglpbnQgaDsKCXVuc2lnbmVkIGludCBiMSwgYjIs IGIzLCBiNDsKCWRlY29kZV90IG87CglvLnI9MDsgby5jMT1FT0Y7IG8uYzI9RU9GOyBvLmMz PUVPRjsKCWlmIChkZWNvZGluZz09dW5lbmNvZGVkKSB7CgkJby5jMT1jOwoJCXJldHVybiBv OwoJfSBlbHNlIGlmIChkZWNvZGluZz09cXVvdGVkX3ByaW50YWJsZSkgewoJCS8vIGRlY29k aW5nX2J1ZmZlciBtYXkgaG9sZCAnPScgYW5kIG1heWJlIGEgaGV4IGRpZ2l0IG9yIGEgQ1Iu CgkJaWYgKGRlY29kaW5nX2ZpbGxlZD09MikgewoJCQkvLyBXaGF0ZXZlciBoYXBwZW5zLCBp dCdzIGFsbCBzZXR0bGVkIG5vdy4KCQkJZGVjb2RpbmdfZmlsbGVkPTA7CgkJCWlmIChkZWNv ZGluZ19idWZmZXJbMV09PSdccicpIHsKCQkJCWlmIChjPT0oaW50KSdcbicpIHsgcmV0dXJu IG87IH0KCQkJCS8vIEludmFsaWQ7IGxlYXZlIGFzIGlzLS13aWxsIGJlIGVuY29kZWQgbGF0 ZXIuCgkJCQlvLmMxPShpbnQpJz0nOyBvLmMyPShpbnQpJ1xyJzsgby5jMz1jOwoJCQkJcmV0 dXJuIG87CgkJCX0KCQkJaD1kZWNvZGVfaGV4KGMpOwoJCQlpZiAoaD09RU9GKSB7CgkJCQkv LyBJbnZhbGlkOyBsZWF2ZSBhcyBpcy0td2lsbCBiZSBlbmNvZGVkIGxhdGVyLgoJCQkJby5j MT0oaW50KSc9Jzsgby5jMj0oaW50KSh1bnNpZ25lZCBpbnQpZGVjb2RpbmdfYnVmZmVyWzFd OyBvLmMzPWM7CgkJCQlyZXR1cm4gbzsKCQkJfQoJCQkvLyBXZSBoYXZlIGEgZnVsbCBzZXF1 ZW5jZSByZXByZXNlbnRpbmcgYSBzaW5nbGUgY2hhcmFjdGVyLgoJCQlvLmMxPWRlY29kZV9o ZXgoKGludCkodW5zaWduZWQgaW50KWRlY29kaW5nX2J1ZmZlclsxXSkqMTYraDsKCQkJcmV0 dXJuIG87CgkJfSBlbHNlIGlmIChkZWNvZGluZ19maWxsZWQ9PTEpIHsKCQkJaWYgKGM9PShp bnQpJ1xyJ3x8ZGVjb2RlX2hleChjKSE9RU9GKSB7CgkJCQkvLyBWYWxpZCBjaGFyYWN0ZXIg YWZ0ZXIgPQoJCQkJZGVjb2RpbmdfZmlsbGVkPTI7CgkJCQlkZWNvZGluZ19idWZmZXJbMV09 KGNoYXIpYzsKCQkJCXJldHVybiBvOwoJCQl9CgkJCS8vIEludmFsaWQ7IGxlYXZlIGFzIGlz LS13aWxsIGJlIGVuY29kZWQgbGF0ZXIuCgkJCWRlY29kaW5nX2ZpbGxlZD0wOwoJCQlvLmMx PShpbnQpJz0nOyBvLmMyPWM7CgkJCXJldHVybiBvOwoJCX0gZWxzZSBpZiAoZGVjb2Rpbmdf ZmlsbGVkPT0wKSB7CgkJCWlmIChjPT0oaW50KSc9JykgewoJCQkJLy8gVGhlIGZpcnN0IGNo YXJhY3RlciBjYW4gb25seSBldmVyIGJlICc9JyBzbyB3ZQoJCQkJLy8gZG9uJ3QgYWN0dWFs bHkgYm90aGVyIHRvIHN0b3JlIGl0OyBqdXN0IHNheSBpdCdzIHRoZXJlLgoJCQkJZGVjb2Rp bmdfd2hpdGU9MDsKCQkJCWRlY29kaW5nX2ZpbGxlZD0xOwoJCQkJcmV0dXJuIG87CgkJCX0K CQkJLy8gS2VlcCB0cmFjayBvZiB3aGl0ZXNwYWNlLgoJCQlpZiAoYz09KGludCknICd8fGM9 PShpbnQpJ1x0JykgKytkZWNvZGluZ193aGl0ZTsKCQkJZWxzZSBkZWNvZGluZ193aGl0ZT0w OwoJCQkvLyBSZW1vdmUgdHJhaWxpbmcgd2hpdGVzcGFjZS4KCQkJaWYgKGM9PUVPRnx8Yz09 KGludCknXHInKSB7IG8ucj1kZWNvZGluZ193aGl0ZTsgZGVjb2Rpbmdfd2hpdGU9MDsgfQoJ CQkvLyBPdGhlcndpc2Ugd2UganVzdCBrZWVwIGl0LiBJZiBpdCdzIEVPRiwgd2UncmUgZG9u ZS4KCQkJby5jMT1jOwoJCQlyZXR1cm4gbzsKCQl9IGVsc2UgewoJCQl3YXJuaW5nKCJpbnRl cm5hbCBlcnJvcjogZGVjb2RpbmcgYnVmZmVyIHRvbyBmdWxsIik7CgkJCXJldHVybiBvOwoJ CX0KCX0gZWxzZSBpZiAoZGVjb2Rpbmc9PWJhc2U2NCkgewoJCWlmIChjPT1FT0YpIHsKCQkJ Ly8gSnVzdCBpbiBjYXNlIGl0IHdhcyBjb3JydXB0ZWQsIG1ha2Ugc3VyZSB3ZSdyZSByZXNl dAoJCQlkZWNvZGluZ19maWxsZWQ9MDsKCQkJcmV0dXJuIG87CgkJfQoJCWlmIChjPT0oaW50 KSc9J3x8ZGVjb2RlXzY0KGMpIT1FT0YpCgkJCWRlY29kaW5nX2J1ZmZlcltkZWNvZGluZ19m aWxsZWQrK109KGNoYXIpYzsKCQlpZiAoZGVjb2RpbmdfZmlsbGVkPT00KSB7CgkJCS8vIFdl IGVtcHR5IGl0IHdoYXRldmVyIGhhcHBlbnMgaGVyZQoJCQlkZWNvZGluZ19maWxsZWQ9MDsK CQkJYjE9KHVuc2lnbmVkIGludClkZWNvZGVfNjQoKGludClkZWNvZGluZ19idWZmZXJbMF0p OwoJCQliMj0odW5zaWduZWQgaW50KWRlY29kZV82NCgoaW50KWRlY29kaW5nX2J1ZmZlclsx XSk7CgkJCW8uYzE9KGludCkoKChiMSYweDNmKTw8Mil8KChiMj4+NCkmMHgwMykpOwoJCQlp ZiAoZGVjb2RpbmdfYnVmZmVyWzJdPT0nPScpIHJldHVybiBvOwoJCQliMz0odW5zaWduZWQg aW50KWRlY29kZV82NCgoaW50KWRlY29kaW5nX2J1ZmZlclsyXSk7CgkJCW8uYzI9KGludCko KChiMiYweDBmKTw8NCl8KChiMz4+MikmMHgwZikpOwoJCQlpZiAoZGVjb2RpbmdfYnVmZmVy WzNdPT0nPScpIHJldHVybiBvOwoJCQliND0odW5zaWduZWQgaW50KWRlY29kZV82NCgoaW50 KWRlY29kaW5nX2J1ZmZlclszXSk7CgkJCW8uYzM9KGludCkoKChiMyYweDAzKTw8Nil8KGI0 JjB4M2YpKTsKCQl9CgkJcmV0dXJuIG87Cgl9IGVsc2UgewoJCXJlc29ydF90b19leGl0KHRy dWUsImludGVybmFsIGVycm9yOiB1bmtub3duIGVuY29kaW5nIixFWF9TT0ZUV0FSRSk7CgkJ Ly8gTmV2ZXIgcmVhY2hlZAoJCXJldHVybiBvOwoJfQp9CnN0YXRpYyB2b2lkIGRlY29kZV9s b29rYWhlYWQoKSB7CgkvLyBEZWNvZGluZyB3aWxsIGFsd2F5cyBzaHJpbmssIHNvIHRoaXMg aXMgcXVpdGUgZWFzeQoJY2hhciAqIGM7CgljaGFyICogY2M7CglkZWNvZGVfdCBkZWNvZGVk OwoJaW50IHBvcz1idWZmZXJfcmVhZDsKCWludCBkZWNwb3M9YnVmZmVyX3JlYWQ7CglyZXNv cnRfdG9fZXhpdChidWZmZXJfcmVhZDxkaXNrX2J1ZmZlcl9maWxsZWQsCgkJCSJpbnRlcm5h bCBlcnJvcjogZGVjb2RpbmcgZnJvbSBkaXNrIixFWF9TT0ZUV0FSRSk7CgljPW1lbV9idWZm ZXJfbmV4dF9lbXB0eStwb3MtZGlza19idWZmZXJfZmlsbGVkOwoJaWYgKGM+PW1lbV9idWZm ZXJfZW5kKSBjLT1tZW1fYnVmZmVyX3NpemU7CgljYz1jOwoJd2hpbGUgKHBvczxidWZmZXJf ZmlsbGVkKSB7CgkJZGVjb2RlZD1kZWNvZGVjaGFyKChpbnQpKHVuc2lnbmVkIGludCkqYyk7 CgkJaWYgKGRlY29kZWQucj4wKSB7CgkJCXJlc29ydF90b19leGl0KGRlY3Bvcy1kZWNvZGVk LnI8YnVmZmVyX3JlYWQsCgkJCQkJImludGVybmFsIGVycm9yOiByZW1vdmluZyBtb3JlIHRo YW4gd2FzIGRlY29kZWQiLEVYX1NPRlRXQVJFKTsKCQkJZGVjcG9zLT1kZWNvZGVkLnI7CgkJ CWNjLT1kZWNvZGVkLnI7CgkJCWlmIChjYzxtZW1fYnVmZmVyX3N0YXJ0KSBjYys9bWVtX2J1 ZmZlcl9zaXplOwoJCX0KCQlpZiAoZGVjb2RlZC5jMSE9RU9GKSB7CgkJCSpjYz0oY2hhcilk ZWNvZGVkLmMxOwoJCQkrK2RlY3BvczsgKytjYzsKCQkJaWYgKGNjPT1tZW1fYnVmZmVyX2Vu ZCkgY2M9bWVtX2J1ZmZlcl9zdGFydDsKCQkJaWYgKGRlY29kZWQuYzIhPUVPRikgewoJCQkJ KmNjPShjaGFyKWRlY29kZWQuYzI7CgkJCQkrK2RlY3BvczsgKytjYzsKCQkJCWlmIChjYz09 bWVtX2J1ZmZlcl9lbmQpIGNjPW1lbV9idWZmZXJfc3RhcnQ7CgkJCQlpZiAoZGVjb2RlZC5j MyE9RU9GKSB7CgkJCQkJKmNjPShjaGFyKWRlY29kZWQuYzM7CgkJCQkJKytkZWNwb3M7ICsr Y2M7CgkJCQkJaWYgKGNjPT1tZW1fYnVmZmVyX2VuZCkgY2M9bWVtX2J1ZmZlcl9zdGFydDsK CQkJCX0KCQkJfQoJCX0KCQkrK3BvczsgKytjOwoJCWlmIChjPT1tZW1fYnVmZmVyX2VuZCkg Yz1tZW1fYnVmZmVyX3N0YXJ0OwoJfQoJYnVmZmVyX2ZpbGxlZCs9ZGVjcG9zLXBvczsKCW1l bV9idWZmZXJfZmlsbGVkKz1kZWNwb3MtcG9zOwoJbWVtX2J1ZmZlcl9uZXh0X2ZpbGwrPWRl Y3Bvcy1wb3M7CglpZiAobWVtX2J1ZmZlcl9uZXh0X2ZpbGw8bWVtX2J1ZmZlcl9zdGFydCkK CQkJbWVtX2J1ZmZlcl9uZXh0X2ZpbGwrPW1lbV9idWZmZXJfc2l6ZTsKfQpzdGF0aWMgaW5s aW5lIHZvaWQgZmluaXNoX2RlY29kaW5nKCkgewoJLy8gQXMgaXQgd2lsbCBoYXZlIGp1c3Qg ZXhwZXJpZW5jZWQgYSBDUkxGIG9yIGFuIEVPRiwgdGhlIG9ubHkgdGhpbmcKCS8vIHRoaXMg Y2FuIGRvIGlzIHJlc2V0IHRoZSBzdGF0ZSBpZiBiYXNlNjQgd2FzIHRydW5jYXRlZC4KCS8v IFdlIHdvbid0IGdhaW4gYW55IG1vcmUgY2hhcmFjdGVycyBvciBuZWVkIHRvIHJlbW92ZSBh bnl0aGluZy4KCS8vIEl0IGlzIGltcG9ydGFudCB0aGF0IHRoaXMgaXMgYWx3YXlzIHRoZSBj YXNlIGFzIG90aGVyIHJvdXRpbmVzCgkvLyByZWx5IG9uIGl0LgoJKHZvaWQpZGVjb2RlY2hh cihFT0YpOwp9CgovLyBUaGVzZSBhcmUgc2xvdyBidXQgZWFzeSB0byB3cml0ZSEgTG9va3Vw IHRhYmxlcyB3b3VsZCBiZSBxdWlja2VyLgovLyBTdGlsbCwgSSB0aGluayBpdCdsbCBwcm9i YWJseSBiZSBmYXN0IGVub3VnaC4Kc3RhdGljIGlubGluZSBpbnQgZGVjb2RlX2hleChpbnQg YykgewoJaWYgKGM+PShpbnQpJzAnJiZjPD0oaW50KSc5JykgcmV0dXJuIGMtKGludCknMCc7 CglpZiAoYz49KGludCknQScmJmM8PShpbnQpJ0YnKSByZXR1cm4gYy0oaW50KSdBJysxMDsK CXJldHVybiBFT0Y7Cn0Kc3RhdGljIGlubGluZSBpbnQgZGVjb2RlXzY0KGludCBjKSB7Cglp ZiAoYz49KGludCknQScmJmM8PShpbnQpJ1onKSByZXR1cm4gYy0oaW50KSdBJzsKCWlmIChj Pj0oaW50KSdhJyYmYzw9KGludCkneicpIHJldHVybiBjLShpbnQpJ2EnKzI2OwoJaWYgKGM+ PShpbnQpJzAnJiZjPD0oaW50KSc5JykgcmV0dXJuIGMtKGludCknMCcrNTI7CglpZiAoYz09 KGludCknKycpIHJldHVybiA2MjsKCWlmIChjPT0oaW50KScvJykgcmV0dXJuIDYzOwoJLy8g aWYgKGM9PShpbnQpJz0nKSByZXR1cm4gRU9GOwoJcmV0dXJuIEVPRjsKfQpzdGF0aWMgaW5s aW5lIHZvaWQgZW5jb2RlX2hleF9ieXRlKHVuc2lnbmVkIGludCBoKSB7CglpbnQgaDE9KGlu dCkoKGg+PjQpJjB4MGYpOwoJaW50IGgyPShpbnQpKGgmMHgwZik7CglpZiAoaDE8MTApIHJl c29ydF90b19lcnJubyhwdXQoKGludCknMCcraDEpPT1FT0YsImVycm9yIGVuY29kaW5nIixF WF9JT0VSUik7CgllbHNlIGlmIChoMTwxNikKCQkJcmVzb3J0X3RvX2Vycm5vKHB1dCgoaW50 KSdBJytoMS0xMCk9PUVPRiwiZXJyb3IgZW5jb2RpbmciLEVYX0lPRVJSKTsKCWVsc2UgcmVz b3J0X3RvX2V4aXQodHJ1ZSwiaW50ZXJuYWwgZXJyb3I6IGJ5dGUgdG9vIGxhcmdlIixFWF9T T0ZUV0FSRSk7CglpZiAoaDI8MTApIHJlc29ydF90b19lcnJubyhwdXQoKGludCknMCcraDIp PT1FT0YsImVycm9yIGVuY29kaW5nIixFWF9JT0VSUik7CgllbHNlIGlmIChoMjwxNikKCQkJ cmVzb3J0X3RvX2Vycm5vKHB1dCgoaW50KSdBJytoMi0xMCk9PUVPRiwiZXJyb3IgZW5jb2Rp bmciLEVYX0lPRVJSKTsKCWVsc2UgcmVzb3J0X3RvX2V4aXQodHJ1ZSwiaW50ZXJuYWwgZXJy b3I6IGJ5dGUgdG9vIGxhcmdlIixFWF9TT0ZUV0FSRSk7Cn0Kc3RhdGljIGlubGluZSB2b2lk IGVuY29kZV82NCh1bnNpZ25lZCBpbnQgYikgewoJaWYgKGI8MjYpCgkJCXJlc29ydF90b19l cnJubyhwdXQoKGludCknQScrYik9PUVPRiwiZXJyb3IgZW5jb2RpbmciLEVYX0lPRVJSKTsK CWVsc2UgaWYgKGI8NTIpCgkJCXJlc29ydF90b19lcnJubyhwdXQoKGludCknYScrYi0yNik9 PUVPRiwiZXJyb3IgZW5jb2RpbmciLEVYX0lPRVJSKTsKCWVsc2UgaWYgKGI8NjIpCgkJCXJl c29ydF90b19lcnJubyhwdXQoKGludCknMCcrYi01Mik9PUVPRiwiZXJyb3IgZW5jb2Rpbmci LEVYX0lPRVJSKTsKCWVsc2UgaWYgKGI9PTYyKQoJCQlyZXNvcnRfdG9fZXJybm8ocHV0KChp bnQpJysnKT09RU9GLCJlcnJvciBlbmNvZGluZyIsRVhfSU9FUlIpOwoJZWxzZSBpZiAoYj09 NjMpCgkJCXJlc29ydF90b19lcnJubyhwdXQoKGludCknLycpPT1FT0YsImVycm9yIGVuY29k aW5nIixFWF9JT0VSUik7CgllbHNlIHJlc29ydF90b19leGl0KHRydWUsCgkJCSJpbnRlcm5h bCBlcnJvcjogYmFzZTY0IHZhbHVlIHRvbyBsYXJnZSIsRVhfU09GVFdBUkUpOwp9CgovKiB0 YWc6IGVycm9yX2Z1bmN0aW9ucyAqLwoKLy8gU3lzbG9nIGNvbnN0YW50czoKLy8gbGV2ZWw6 IExPR19FUlIsIExPR19XQVJOSU5HLCBMT0dfTk9USUNFLCBMT0dfSU5GTywgTE9HX0RFQlVH Ci8vIGZhY2lsaXR5OiBMT0dfTUFJTCwgTE9HX0RBRU1PTiwgTE9HX1VTRVIsIExPR19MT0NB TG4oMC03KQoKc3RhdGljIGlubGluZSB2b2lkICogYWxsb2Nfb3JfZXhpdChzaXplX3Qgcykg LypAYWxsb2NhdGVzIHJlc3VsdEAqLyB7Cgl2b2lkICogbTsKCW09bWFsbG9jKHMpOwoJaWYg KG09PU5VTEwpIHsKI2lmZGVmIFVTRV9TVERFUlIKCQlmcHJpbnRmKHN0ZGVyciwiZm9vdF9m aWx0ZXI6ICVzXG4iLCJvdXQgb2YgbWVtb3J5Iik7CiNlbmRpZgojaWZkZWYgVVNFX1NZU0xP RwoJCXN5c2xvZyhMT0dfRVJSfExPR19NQUlMLCIlc1xuIiwib3V0IG9mIG1lbW9yeSIpOwoj ZW5kaWYKCQlleGl0KEVYX09TRVJSKTsKCX0KCXJldHVybiBtOwp9CnN0YXRpYyBpbmxpbmUg dm9pZCAvKm5vcmV0dXJud2hlbnRydWUqLwoJCXJlc29ydF90b19leGl0KGJvb2wgd2hlbixj b25zdCBjaGFyICogbWVzc2FnZSxpbnQgc3RhdHVzKSB7CglpZiAod2hlbikgewojaWZkZWYg VVNFX1NUREVSUgoJCWZwcmludGYoc3RkZXJyLCJmb290X2ZpbHRlcjogJXNcbiIsbWVzc2Fn ZSk7CiNlbmRpZgojaWZkZWYgVVNFX1NZU0xPRwoJCXN5c2xvZyhMT0dfRVJSfExPR19NQUlM LCIlc1xuIixtZXNzYWdlKTsKI2VuZGlmCgkJZXhpdChzdGF0dXMpOwoJfQp9CnN0YXRpYyBp bmxpbmUgdm9pZCAvKm5vcmV0dXJud2hlbnRydWUqLwoJCXJlc29ydF90b19lcnJubyhib29s IHdoZW4sY29uc3QgY2hhciAqIG1lc3NhZ2UsaW50IHN0YXR1cykgewoJaWYgKHdoZW4pIHsK I2lmZGVmIFVTRV9TVERFUlIKCQlmcHJpbnRmKHN0ZGVyciwiZm9vdF9maWx0ZXI6ICVzICgl cylcbiIsbWVzc2FnZSxzdHJlcnJvcihlcnJubykpOwojZW5kaWYKI2lmZGVmIFVTRV9TWVNM T0cKCQlzeXNsb2coTE9HX0VSUnxMT0dfTUFJTCwiJXMgKCVtKVxuIixtZXNzYWdlKTsKI2Vu ZGlmCgkJZXhpdChzdGF0dXMpOwoJfQp9CnN0YXRpYyBpbmxpbmUgdm9pZCByZXNvcnRfdG9f d2FybmluZyhib29sIHdoZW4sY29uc3QgY2hhciAqIG1lc3NhZ2UpIHsKCWlmICh3aGVuKSB3 YXJuaW5nKG1lc3NhZ2UpOwp9CnN0YXRpYyBpbmxpbmUgdm9pZCB3YXJuaW5nKGNvbnN0IGNo YXIgKiBtZXNzYWdlKSB7CiNpZmRlZiBVU0VfU1RERVJSCglmcHJpbnRmKHN0ZGVyciwiZm9v dF9maWx0ZXI6ICVzXG4iLG1lc3NhZ2UpOwojZW5kaWYKI2lmZGVmIFVTRV9TWVNMT0cKCXN5 c2xvZyhMT0dfV0FSTklOR3xMT0dfTUFJTCwiJXNcbiIsbWVzc2FnZSk7CiNlbmRpZgp9Cgov KiB0YWc6IGhlbHBlcl9mdW5jdGlvbnMgKi8KCi8vIFRoZSBwcm9ncmFtIHdhcyB3cml0dGVu IGZvbGxvd2luZyBhbGwgdGhlIHNwZWNzIHVzaW5nIENSTEYgZm9yIG5ld2xpbmVzLAovLyBi dXQgd2UgZ2V0IHRoZW0gZnJvbSBQb3N0Zml4IHdpdGggTEYgb25seSwgc28gdGhlc2Ugd3Jh cHBlciBmdW5jdGlvbnMKLy8gZG8gdGhlIHRyYW5zbGF0aW9uIGluIHN1Y2ggYSB3YXkgdGhh dCBpdCBjYW4gZWFzaWx5IGJlIGRpc2FibGVkIGlmIGRlc2lyZWQuCnN0YXRpYyBpbmxpbmUg aW50IGdldCgpIHsKCWludCBjOwojaWZkZWYgVU5JWF9FT0wKCXN0YXRpYyBib29sIGdvdF9u bD1mYWxzZTsKCWlmIChnb3RfbmwpIHsKCQlnb3Rfbmw9ZmFsc2U7CgkJcmV0dXJuIDEwOwoJ fQojZW5kaWYKCWM9Z2V0Y2hhcigpOwojaWZkZWYgVU5JWF9FT0wKCWlmIChjPT0xMCkgewoJ CWdvdF9ubD10cnVlOwoJCXJldHVybiAxMzsKCX0KI2VuZGlmCglyZXR1cm4gYzsKfQpzdGF0 aWMgaW5saW5lIGludCBwdXQoaW50IGMpIHsKI2lmZGVmIFVOSVhfRU9MCglpZiAoYz09MTMp IHJldHVybiBjOwojZW5kaWYKCXJldHVybiBwdXRjaGFyKGMpOwp9CnN0YXRpYyBpbmxpbmUg aW50IHB1dHN0cihjb25zdCBjaGFyICogcykgewoJd2hpbGUgKCpzIT0nXDAnKSBpZiAocHV0 KChpbnQpKHVuc2lnbmVkIGludCkqcysrKT09RU9GKSByZXR1cm4gRU9GOwoJcmV0dXJuIDA7 Cn0KCnN0YXRpYyBpbmxpbmUgYm9vbCBjYXNlX2luc2Vuc2l0aXZlbHlfaGVhZHMoY29uc3Qg Y2hhciAqIGhlYWQsY29uc3QgY2hhciAqIGJ1ZmZlcikgewoJY29uc3QgY2hhciAqIHMxPWhl YWQ7Cgljb25zdCBjaGFyICogczI9YnVmZmVyOwoJZm9yICg7OykgewoJCWlmICgqczE9PSdc MCcpIHJldHVybiB0cnVlOyAvKiBmb3IgZXF1YWxpdHkgcmV0dXJuICpzMj09J1wwJzsgKi8K CQllbHNlIGlmICgqczI9PSdcMCcpIHJldHVybiBmYWxzZTsKCQlpZiAoKnMxIT0qczImJgoJ CQkJKCpzMTwnQSd8fCpzMT4nWid8fCpzMiE9KnMxLSdBJysnYScpJiYKCQkJCSgqczI8J0En fHwqczI+J1onfHwqczEhPSpzMi0nQScrJ2EnKSkgcmV0dXJuIGZhbHNlOwoJCSsrczE7ICsr czI7Cgl9Cn0KCg== --------------050404000407040904000901 Content-Type: text/plain; charset=UTF-8; x-mac-type="0"; x-mac-creator="0"; name="Makefile" Content-Transfer-Encoding: base64 Content-Disposition: inline; filename="Makefile" YWxsOiBmb290X2ZpbHRlcgpkZXY6IHRhZ3Mgc3BsaW50IGZvb3RfZmlsdGVyCi5QSE9OWTog c3BsaW50IGNsZWFuIGNsb2JiZXIKdGFnczogZm9vdF9maWx0ZXIuYwoJY3RhZ3MgLS1leGNt ZD1udW1iZXIgJy0tcmVnZXgtYz0tL1wqW1s6Ymxhbms6XV0qdGFnOltbOmJsYW5rOl1dKihb WzphbG51bTpdX10rKS1cMS0nIGZvb3RfZmlsdGVyLmMKc3BsaW50OgoJc3BsaW50ICt1bml4 bGliIC1leGl0YXJnIC1pbml0YWxsZWxlbWVudHMgZm9vdF9maWx0ZXIuYwpmb290X2ZpbHRl cjogZm9vdF9maWx0ZXIuYwoJZ2NjIC1XYWxsIC1nIC1vIGZvb3RfZmlsdGVyIGZvb3RfZmls dGVyLmMgLU8zCmNsZWFuOgoJLXJtIHRhZ3MKY2xvYmJlcjogY2xlYW4KCS1ybSBmb290X2Zp bHRlcgoJLXJtIHRlc3QK --------------050404000407040904000901 Content-Type: text/plain; charset=UTF-8; x-mac-type="0"; x-mac-creator="0"; name="mlmmj-amime-receive" Content-Transfer-Encoding: base64 Content-Disposition: inline; filename="mlmmj-amime-receive" IyEvYmluL2Jhc2gKIyAKIyBtbG1tai1hbWltZS1yZWNlaXZlCiMKIyBUYWtlIG1haWwgZnJv bSBzdGRpbiwgcGlwZSBpdCB0aHJvdWdoIGFsdGVybWltZSBhbmQgdGhlbiB0byBtbG1tai1y ZWNlaXZlCiMgbmVlZGVkIHRvIGFkZCBmb290ZXJzIGluIGEgTUlNRS1hd2FyZSB3YXkKIwoj IHJlcXVpcmVzIGFsdGVybWltZSwgc2VlIGh0dHA6Ly93d3cucGxkYW5pZWxzLmNvbS9hbHRl cm1pbWUvCiMKIyBqdXN0IHJlcGxhY2UgbWxtbWotcmVjZWl2ZSB3aXRoIG1sbW1qLWFtaW1l LXJlY2VpdmUsIGUuZy4gaW4gL2V0Yy9hbGlhc2VzOgojIG15bWw6ICAgInwvdXNyL2Jpbi9t bG1tai1hbWltZS1yZWNlaXZlIC1MIC92YXIvc3Bvb2wvbWxtbWovbXltbC8iCiMKIyBwdXQg dGhlIGZvb3Rlci10ZXh0IGZvciB0aGUgZGlmZmVyZW50IE1JTUUtdHlwZXMgaW50byAKIyBj b250cm9sL2FtaW1lLWZvb3Rlci10ZXh0CiMgY29udHJvbC9hbWltZS1mb290ZXItaHRtbAoj IGNvbnRyb2wvYW1pbWUtZm9vdGVyLWJhc2U2NAojCiMgQ29weXJpZ2h0IDIwMDggYnkgR2Vy ZCB2LiBFZ2lkeSwgPGdlcmRAZWdpZHkuZGU+CiMKIyBMaWNlbnNlZCB1bmRlciBNSVQgTGlj ZW5zZSwgc2VlIExJQ0VOU0UgZmlsZSBjb21pbmcgd2l0aCBtbG1tagojCgpNTE1NSlJFQ0VJ VkU9L3Vzci9iaW4vbWxtbWotcmVjZWl2ZQpBTFRFUk1JTUU9L3Vzci9iaW4vYWx0ZXJtaW1l CgojIGNoZWNrIGV4ZWN1dGFibGVzCmlmICEgWyAteCAkTUxNTUpSRUNFSVZFIF07IHRoZW4K ICAgIGVjaG8gImNhbid0IGZpbmQgJE1MTU1KUkVDRUlWRSBleGVjdXRhYmxlLCBhYm9ydGlu ZyIKICAgIGV4aXQgMQpmaQoKaWYgISBbIC14ICRBTFRFUk1JTUUgXTsgdGhlbgogICAgZWNo byAiY2FuJ3QgZmluZCAkQUxURVJNSU1FIGV4ZWN1dGFibGUsIGFib3J0aW5nIgogICAgZXhp dCAxCmZpCgojIHJlYWQgcGFyYW1ldGVycwpJPTEKUEFSQU1fTD0wCndoaWxlIFsgJEkgLWxl ICQjIF0gJiYgWyAkUEFSQU1fTCA9PSAwIF07IGRvCiAgICBpZiBbICIkeyFJfSIgPT0gIi1M IiBdOyB0aGVuCiAgICAgICAgUEFSQU1fTD0xCiAgICBmaQogICAgST0kWyRJKzFdCmRvbmUK CmlmIFsgJFBBUkFNX0wgPT0gMSBdICYmIFsgJEkgLWxlICQjIF07IHRoZW4KICAgIE1MUEFU SD0iJHshSX0iCmVsc2UKICAgIGVjaG8gInBhcmFtZXRlciAtTCAvcGF0aC90by9saXN0ZGly IG1pc3NpbmcsIGFib3J0aW5nIgogICAgZXhpdCAxCmZpCgppZiAhIFsgLWQgIiR7TUxQQVRI fSIgXTsgdGhlbgogICAgZWNobyAiJHtNTFBBVEh9IGlzIG5vdCBleGlzdGluZyBvciBubyBk aXJlY3RvcnksIGFib3J0aW5nIgogICAgZXhpdCAxCmZpCgpDT05UUk9MRD0iJHtNTFBBVEh9 L2NvbnRyb2wiCgppZiAhIFsgLWQgIiR7Q09OVFJPTER9IiBdOyB0aGVuCiAgICBlY2hvICIk e0NPTlRST0xEfSBpcyBub3QgZXhpc3Rpbmcgb3Igbm8gZGlyZWN0b3J5LCBhYm9ydGluZyIK ICAgIGV4aXQgMQpmaQoKIyBsb29rIGZvciBmb290ZXItZmlsZXMgYW5kIGJ1aWxkIHBhcmFt ZXRlcnMKCmlmICEgWyAtZiAiJHtDT05UUk9MRH0vYW1pbWUtZm9vdGVyLXRleHQiIF07IHRo ZW4KICAgIGVjaG8gIiR7Q09OVFJPTER9L2FtaW1lLWZvb3Rlci10ZXh0IGlzIG5vdCBleGlz dGluZyBvciBubyByZWd1bGFyIGZpbGUsIGFib3J0aW5nIgogICAgZXhpdCAxCmZpCgpQQVJB TT0iLS1kaXNjbGFpbWVyPSR7Q09OVFJPTER9L2FtaW1lLWZvb3Rlci10ZXh0IgoKaWYgWyAt ZiAiJHtDT05UUk9MRH0vYW1pbWUtZm9vdGVyLWh0bWwiIF07IHRoZW4KICAgIFBBUkFNPSIk e1BBUkFNfSAtLWRpc2NsYWltZXItaHRtbD0ke0NPTlRST0xEfS9hbWltZS1mb290ZXItaHRt bCAtLWh0bWx0b28gLS1mb3JjZS1mb3ItYmFkLWh0bWwiCmZpCgppZiBbIC1mICIke0NPTlRS T0xEfS9hbWltZS1mb290ZXItYmFzZTY0IiBdOyB0aGVuCiAgICBQQVJBTT0iJHtQQVJBTX0g LS1kaXNjbGFpbWVyLWI2ND0ke0NPTlRST0xEfS9hbWltZS1mb290ZXItYmFzZTY0IgpmaQoK UEFSQU09IiR7UEFSQU19IC0tYWx0ZXJzaWduZWQgLS1sb2ctc3lzbG9nIgoKIyBnbyB0byBh IGRpciB3aGVyZSBhbHRlcm1pbWUgY2FuIHdyaXRlIGl0J3MgdG1wLWZpbGVzIHNhZmVseQpj ZCAkTUxQQVRICgojIHBpcGUgdGhlIGNhbGxzCiRBTFRFUk1JTUUgLS1pbnB1dD0tICR7UEFS QU19IHwgJE1MTU1KUkVDRUlWRSAiJEAiCg== --------------050404000407040904000901--