LyoKICpDb3B5cmlnaHQoYykyMDA0LENpc2NvIFVSUCBpbWJ1cnNlcyBhbmQgTmV0d29yayBJbmZvcm1hdGlvbiBDZW50ZXIgaW4gQmVpamluZyBVbml2ZXJzaXR5IG9mIFBvc3RzIGFuZCBUZWxlY29tbXVuaWNhdGlvbnMgcmVzZWFyY2hlcy4KICoKICpBbGwgcmlnaHQgcmVzZXJ2ZWQKICoKICpGaWxlIE5hbWU6cGluZ0N0bFRhYmxlLmMKICpGaWxlIERlc2NyaXB0aW9uOlJvd3Mgb2YgdGhlIHBpbmdDdGxUYWJsZSBNSUIgYWRkICwgZGVsZXRlIGFuZCByZWFkLlJvd3Mgb2YgbG9va3VwUmVzdWx0c1RhYmxlCiAqICAgICAgICAgICAgICBNSUIgYWRkIGFuZCBkZWxldGUuUm93cyBvZiBwaW5nUHJvYmVIaXN0b3J5VGFibGUgTUlCIGFkZCBhbmQgZGVsZXRlLiAKICogICAgICAgICAgICAgIFRoZSBtYWluIGZ1bmN0aW9uIGlzIGFsc28gaGVyZS4KICoKICpDdXJyZW50IFZlcnNpb246MS4wCiAqQXV0aG9yOkNoZW5KaW5nCiAqRGF0ZToyMDA0LjguMjAKICovCgovKgogKiBUaGlzIHNob3VsZCBhbHdheXMgYmUgaW5jbHVkZWQgZmlyc3QgYmVmb3JlIGFueXRoaW5nIGVsc2UgCiAqLwoKI2luY2x1ZGUgPG5ldC1zbm1wL25ldC1zbm1wLWNvbmZpZy5oPgojaW5jbHVkZSA8bmV0LXNubXAvbmV0LXNubXAtaW5jbHVkZXMuaD4KI2luY2x1ZGUgPG5ldC1zbm1wL2FnZW50L25ldC1zbm1wLWFnZW50LWluY2x1ZGVzLmg+CgojaWYgSEFWRV9TVERMSUJfSAojaW5jbHVkZSA8c3RkbGliLmg+CiNlbmRpZgojaWYgSEFWRV9TVFJJTkdfSAojaW5jbHVkZSA8c3RyaW5nLmg+CiNlbHNlCiNpbmNsdWRlIDxzdHJpbmdzLmg+CiNlbmRpZgojaWZkZWYgSEFWRV9MSU1JVFNfSAojaW5jbHVkZSA8bGltaXRzLmg+CiNlbmRpZgoKI2luY2x1ZGUgPG5ldGRiLmg+CiNpbmNsdWRlIDxuZXRpbmV0L2luLmg+CgojaW5jbHVkZSA8c3lzL3R5cGVzLmg+CiNpbmNsdWRlIDxzeXMvc29ja2V0Lmg+CiNpbmNsdWRlIDxhcnBhL2luZXQuaD4KCiNpbmNsdWRlICJwaW5nQ3RsVGFibGUuaCIKI2luY2x1ZGUgInBpbmdSZXN1bHRzVGFibGUuaCIKI2luY2x1ZGUgInBpbmdQcm9iZUhpc3RvcnlUYWJsZS5oIgojaW5jbHVkZSAiaGVhZGVyX2NvbXBsZXguaCIKCnN0YXRpYyBpbmxpbmUgdm9pZCB0dnN1YihzdHJ1Y3QgdGltZXZhbCAqLCBzdHJ1Y3QgdGltZXZhbCAqKTsKc3RhdGljIGlubGluZSBpbnQgc2NoZWR1bGVfZXhpdChpbnQsIGludCAqLCBsb25nICosIGxvbmcgKiwgbG9uZyAqLCBsb25nICopOwpzdGF0aWMgaW5saW5lIGludCBpbl9mbGlnaHQoX191MTYgKiwgbG9uZyAqLCBsb25nICosIGxvbmcgKik7CnN0YXRpYyBpbmxpbmUgdm9pZCBhY2tub3dsZWRnZShfX3UxNiwgX191MTYgKiwgbG9uZyAqLCBpbnQgKik7CnN0YXRpYyBpbmxpbmUgdm9pZCBhZHZhbmNlX250cmFuc21pdHRlZChfX3UxNiAqLCBsb25nICopOwpzdGF0aWMgaW5saW5lIHZvaWQgdXBkYXRlX2ludGVydmFsKGludCwgaW50LCBpbnQgKiwgaW50ICopOwpzdGF0aWMgbG9uZyAgICAgbGxzcXJ0KGxvbmcgbG9uZyk7CnN0YXRpYyBfX2lubGluZV9fIGludCBpcHY2X2FkZHJfYW55KHN0cnVjdCBpbjZfYWRkciAqKTsKc3RhdGljIGNoYXIgICAgKnByX2FkZHIoc3RydWN0IGluNl9hZGRyICosIGludCk7CnN0YXRpYyBjaGFyICAgICpwcl9hZGRyX24oc3RydWN0IGluNl9hZGRyICopOwp2b2lkIHBpbmdDdGxUYWJsZV9jbGVhbmVyKHN0cnVjdCBoZWFkZXJfY29tcGxleF9pbmRleCAqdGhlc3R1ZmYpOwoKLyoKICpwaW5nQ3RsVGFibGVfdmFyaWFibGVzX29pZDoKICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICovCgoKb2lkICAgICAgICAgICAgIHBpbmdDdGxUYWJsZV92YXJpYWJsZXNfb2lkW10gPQogICAgeyAxLCAzLCA2LCAxLCAyLCAxLCA4MCwgMSwgMiB9OwpzdGF0aWMgY29uc3QgaW50IHBpbmdDdGxUYWJsZV92YXJpYWJsZXNfb2lkX2xlbiA9IHNpemVvZihwaW5nQ3RsVGFibGVfdmFyaWFibGVzX29pZCkvc2l6ZW9mKHBpbmdDdGxUYWJsZV92YXJpYWJsZXNfb2lkWzBdKTsKCi8qIHRyYXAgKi8Kb2lkICAgICAgICAgICAgIHBpbmdQcm9iZUZhaWxlZFtdID0geyAxLCAzLCA2LCAxLCAyLCAxLCA4MCwgMCwgMSB9OwpvaWQgICAgICAgICAgICAgcGluZ1Rlc3RGYWlsZWRbXSA9IHsgMSwgMywgNiwgMSwgMiwgMSwgODAsIDAsIDIgfTsKb2lkICAgICAgICAgICAgIHBpbmdUZXN0Q29tcGxldGVkW10gPSB7IDEsIDMsIDYsIDEsIDIsIDEsIDgwLCAwLCAzIH07CgoKc3RydWN0IHZhcmlhYmxlMiBwaW5nQ3RsVGFibGVfdmFyaWFibGVzW10gPSB7CiAgICAvKgogICAgICogbWFnaWMgbnVtYmVyICAgICAgICAsIHZhcmlhYmxlIHR5cGUgLCByby9ydyAsIGNhbGxiYWNrIGZuICAsIEwsIG9pZHN1ZmZpeCAKICAgICAqLwogICAge0NPTFVNTl9QSU5HQ1RMVEFSR0VUQUREUkVTU1RZUEUsIEFTTl9JTlRFR0VSLCBORVRTTk1QX09MREFQSV9SV1JJVEUsCiAgICAgdmFyX3BpbmdDdGxUYWJsZSwgMiwgezEsIDN9fSwKICAgIHtDT0xVTU5fUElOR0NUTFRBUkdFVEFERFJFU1MsICAgQVNOX09DVEVUX1NUUiwgTkVUU05NUF9PTERBUElfUldSSVRFLAogICAgIHZhcl9waW5nQ3RsVGFibGUsIDIsIHsxLCA0fX0sCiAgICB7Q09MVU1OX1BJTkdDVExEQVRBU0laRSwgICAgICAgICBBU05fVU5TSUdORUQsIE5FVFNOTVBfT0xEQVBJX1JPTkxZLAogICAgIHZhcl9waW5nQ3RsVGFibGUsIDIsIHsxLCA1fX0sCiAgICB7Q09MVU1OX1BJTkdDVExUSU1FT1VULCAgICAgICAgICBBU05fVU5TSUdORUQsIE5FVFNOTVBfT0xEQVBJX1JPTkxZLAogICAgIHZhcl9waW5nQ3RsVGFibGUsIDIsIHsxLCA2fX0sCiAgICB7Q09MVU1OX1BJTkdDVExQUk9CRUNPVU5ULCAgICAgICBBU05fVU5TSUdORUQsIE5FVFNOTVBfT0xEQVBJX1JPTkxZLAogICAgIHZhcl9waW5nQ3RsVGFibGUsIDIsIHsxLCA3fX0sCiAgICB7Q09MVU1OX1BJTkdDVExBRE1JTlNUQVRVUywgICAgICAgQVNOX0lOVEVHRVIsIE5FVFNOTVBfT0xEQVBJX1JXUklURSwKICAgICB2YXJfcGluZ0N0bFRhYmxlLCAyLCB7MSwgOH19LAogICAge0NPTFVNTl9QSU5HQ1RMREFUQUZJTEwsICAgICAgICBBU05fT0NURVRfU1RSLCBORVRTTk1QX09MREFQSV9SV1JJVEUsCiAgICAgdmFyX3BpbmdDdGxUYWJsZSwgMiwgezEsIDl9fSwKICAgIHtDT0xVTU5fUElOR0NUTEZSRVFVRU5DWSwgICAgICAgIEFTTl9VTlNJR05FRCwgTkVUU05NUF9PTERBUElfUldSSVRFLAogICAgIHZhcl9waW5nQ3RsVGFibGUsIDIsIHsxLCAxMH19LAogICAge0NPTFVNTl9QSU5HQ1RMTUFYUk9XUywgICAgICAgICAgQVNOX1VOU0lHTkVELCBORVRTTk1QX09MREFQSV9SV1JJVEUsCiAgICAgdmFyX3BpbmdDdGxUYWJsZSwgMiwgezEsIDExfX0sCiAgICB7Q09MVU1OX1BJTkdDVExTVE9SQUdFVFlQRSwgICAgICAgQVNOX0lOVEVHRVIsIE5FVFNOTVBfT0xEQVBJX1JXUklURSwKICAgICB2YXJfcGluZ0N0bFRhYmxlLCAyLCB7MSwgMTJ9fSwKICAgIHtDT0xVTU5fUElOR0NUTFRSQVBHRU5FUkFUSU9OLCAgQVNOX09DVEVUX1NUUiwgTkVUU05NUF9PTERBUElfUldSSVRFLAogICAgIHZhcl9waW5nQ3RsVGFibGUsIDIsIHsxLCAxM319LAogICAge0NPTFVNTl9QSU5HQ1RMVFJBUFBST0JFRkFJTFVSRUZJTFRFUiwgQVNOX1VOU0lHTkVELCBORVRTTk1QX09MREFQSV9SV1JJVEUsCiAgICAgdmFyX3BpbmdDdGxUYWJsZSwgMiwgezEsIDE0fX0sCiAgICB7Q09MVU1OX1BJTkdDVExUUkFQVEVTVEZBSUxVUkVGSUxURVIsICBBU05fVU5TSUdORUQsIE5FVFNOTVBfT0xEQVBJX1JXUklURSwKICAgICB2YXJfcGluZ0N0bFRhYmxlLCAyLCB7MSwgMTV9fSwKICAgIHtDT0xVTU5fUElOR0NUTFRZUEUsICAgICAgICAgICAgQVNOX09CSkVDVF9JRCwgTkVUU05NUF9PTERBUElfUldSSVRFLAogICAgIHZhcl9waW5nQ3RsVGFibGUsIDIsIHsxLCAxNn19LAogICAge0NPTFVNTl9QSU5HQ1RMREVTQ1IsICAgICAgICAgICBBU05fT0NURVRfU1RSLCBORVRTTk1QX09MREFQSV9SV1JJVEUsCiAgICAgdmFyX3BpbmdDdGxUYWJsZSwgMiwgezEsIDE3fX0sCiAgICB7Q09MVU1OX1BJTkdDVExTT1VSQ0VBRERSRVNTVFlQRSwgQVNOX0lOVEVHRVIsIE5FVFNOTVBfT0xEQVBJX1JXUklURSwKICAgICB2YXJfcGluZ0N0bFRhYmxlLCAyLCB7MSwgMTh9fSwKICAgIHtDT0xVTU5fUElOR0NUTFNPVVJDRUFERFJFU1MsICAgQVNOX09DVEVUX1NUUiwgTkVUU05NUF9PTERBUElfUldSSVRFLAogICAgIHZhcl9waW5nQ3RsVGFibGUsIDIsIHsxLCAxOX19LAogICAge0NPTFVNTl9QSU5HQ1RMSUZJTkRFWCwgICAgICAgICAgIEFTTl9JTlRFR0VSLCBORVRTTk1QX09MREFQSV9SV1JJVEUsCiAgICAgdmFyX3BpbmdDdGxUYWJsZSwgMiwgezEsIDIwfX0sCiAgICB7Q09MVU1OX1BJTkdDVExCWVBBU1NST1VURVRBQkxFLCAgQVNOX0lOVEVHRVIsIE5FVFNOTVBfT0xEQVBJX1JXUklURSwKICAgICB2YXJfcGluZ0N0bFRhYmxlLCAyLCB7MSwgMjF9fSwKICAgIHtDT0xVTU5fUElOR0NUTERTRklFTEQsICAgICAgICAgIEFTTl9VTlNJR05FRCwgTkVUU05NUF9PTERBUElfUldSSVRFLAogICAgIHZhcl9waW5nQ3RsVGFibGUsIDIsIHsxLCAyMn19LAogICAge0NPTFVNTl9QSU5HQ1RMUk9XU1RBVFVTLCAgICAgICAgIEFTTl9JTlRFR0VSLCBORVRTTk1QX09MREFQSV9SV1JJVEUsCiAgICAgdmFyX3BpbmdDdGxUYWJsZSwgMiwgezEsIDIzfX0KfTsKCgoKCi8qCiAqIGdsb2JhbCBzdG9yYWdlIG9mIG91ciBkYXRhLCBzYXZlZCBpbiBhbmQgY29uZmlndXJlZCBieSBoZWFkZXJfY29tcGxleCgpIAogKi8KCgpzdHJ1Y3QgaGVhZGVyX2NvbXBsZXhfaW5kZXggKnBpbmdDdGxUYWJsZVN0b3JhZ2UgPSBOVUxMOwpzdHJ1Y3QgaGVhZGVyX2NvbXBsZXhfaW5kZXggKnBpbmdSZXN1bHRzVGFibGVTdG9yYWdlID0gTlVMTDsKc3RydWN0IGhlYWRlcl9jb21wbGV4X2luZGV4ICpwaW5nUHJvYmVIaXN0b3J5VGFibGVTdG9yYWdlID0gTlVMTDsKCnZvaWQKaW5pdF9waW5nQ3RsVGFibGUodm9pZCkKewogICAgREVCVUdNU0dUTCgoInBpbmdDdGxUYWJsZSIsICJpbml0aWFsaXppbmcuLi4gICIpKTsKICAgIC8qCiAgICAgKiByZWdpc3RlciBvdXJzZWx2ZXMgd2l0aCB0aGUgYWdlbnQgdG8gaGFuZGxlIG91ciBtaWIgdHJlZSAKICAgICAqLwogICAgUkVHSVNURVJfTUlCKCJwaW5nQ3RsVGFibGUiLCBwaW5nQ3RsVGFibGVfdmFyaWFibGVzLCB2YXJpYWJsZTIsCiAgICAgICAgICAgICAgICAgcGluZ0N0bFRhYmxlX3ZhcmlhYmxlc19vaWQpOwoKCiAgICAvKgogICAgICogcmVnaXN0ZXIgb3VyIGNvbmZpZyBoYW5kbGVyKHMpIHRvIGRlYWwgd2l0aCByZWdpc3RyYXRpb25zIAogICAgICovCiAgICBzbm1wZF9yZWdpc3Rlcl9jb25maWdfaGFuZGxlcigicGluZ0N0bFRhYmxlIiwgcGFyc2VfcGluZ0N0bFRhYmxlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCwgTlVMTCk7CgogICAgLyoKICAgICAqIHdlIG5lZWQgdG8gYmUgY2FsbGVkIGJhY2sgbGF0ZXIgdG8gc3RvcmUgb3VyIGRhdGEgCiAgICAgKi8KICAgIHNubXBfcmVnaXN0ZXJfY2FsbGJhY2soU05NUF9DQUxMQkFDS19MSUJSQVJZLCBTTk1QX0NBTExCQUNLX1NUT1JFX0RBVEEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0b3JlX3BpbmdDdGxUYWJsZSwgTlVMTCk7CgogICAgREVCVUdNU0dUTCgoInBpbmdDdGxUYWJsZSIsICJkb25lLlxuIikpOwp9Cgp2b2lkIHNodXRkb3duX3BpbmdDdGxUYWJsZSh2b2lkKQp7CiAgICBzbm1wX3VucmVnaXN0ZXJfY2FsbGJhY2soU05NUF9DQUxMQkFDS19MSUJSQVJZLCBTTk1QX0NBTExCQUNLX1NUT1JFX0RBVEEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RvcmVfcGluZ0N0bFRhYmxlLCBOVUxMLCAxKTsKICAgIHNubXBkX3VucmVnaXN0ZXJfY29uZmlnX2hhbmRsZXIoInBpbmdDdGxUYWJsZSIpOwogICAgdW5yZWdpc3Rlcl9taWIocGluZ0N0bFRhYmxlX3ZhcmlhYmxlc19vaWQsIHBpbmdDdGxUYWJsZV92YXJpYWJsZXNfb2lkX2xlbik7CiAgICBwaW5nQ3RsVGFibGVfY2xlYW5lcihwaW5nQ3RsVGFibGVTdG9yYWdlKTsKICAgIHBpbmdDdGxUYWJsZVN0b3JhZ2UgPSBOVUxMOwp9CgpzdHJ1Y3QgcGluZ0N0bFRhYmxlX2RhdGEgKgpjcmVhdGVfcGluZ0N0bFRhYmxlX2RhdGEodm9pZCkKewogICAgc3RydWN0IHBpbmdDdGxUYWJsZV9kYXRhICpTdG9yYWdlTmV3ID0gTlVMTDsKCiAgICBTdG9yYWdlTmV3ID0gU05NUF9NQUxMT0NfU1RSVUNUKHBpbmdDdGxUYWJsZV9kYXRhKTsKICAgIGlmIChTdG9yYWdlTmV3ID09IE5VTEwpCiAgICAgICAgcmV0dXJuIE5VTEw7CiAgICBTdG9yYWdlTmV3LT5waW5nQ3RsVGFyZ2V0QWRkcmVzc1R5cGUgPSAxOwogICAgU3RvcmFnZU5ldy0+cGluZ0N0bFRhcmdldEFkZHJlc3MgPSBzdHJkdXAoIiIpOwogICAgU3RvcmFnZU5ldy0+cGluZ0N0bFRhcmdldEFkZHJlc3NMZW4gPSAwOwogICAgU3RvcmFnZU5ldy0+cGluZ0N0bERhdGFTaXplID0gMDsKICAgIFN0b3JhZ2VOZXctPnBpbmdDdGxUaW1lT3V0ID0gMzsKICAgIFN0b3JhZ2VOZXctPnBpbmdDdGxQcm9iZUNvdW50ID0gMTsKICAgIFN0b3JhZ2VOZXctPnBpbmdDdGxBZG1pblN0YXR1cyA9IDI7CiAgICBTdG9yYWdlTmV3LT5waW5nQ3RsRGF0YUZpbGwgPSBzdHJkdXAoIjAwIik7CiAgICBpZiAoU3RvcmFnZU5ldy0+cGluZ0N0bERhdGFGaWxsID09IE5VTEwpIHsKICAgICAgICBmcmVlKFN0b3JhZ2VOZXcpOwogICAgICAgIHJldHVybiBOVUxMOwogICAgfQogICAgU3RvcmFnZU5ldy0+cGluZ0N0bERhdGFGaWxsTGVuID0gc3RybGVuKFN0b3JhZ2VOZXctPnBpbmdDdGxEYXRhRmlsbCk7CiAgICBTdG9yYWdlTmV3LT5waW5nQ3RsRnJlcXVlbmN5ID0gMDsKICAgIFN0b3JhZ2VOZXctPnBpbmdDdGxNYXhSb3dzID0gNTA7CiAgICBTdG9yYWdlTmV3LT5waW5nQ3RsU3RvcmFnZVR5cGUgPSAxOwogICAgU3RvcmFnZU5ldy0+cGluZ0N0bFRyYXBHZW5lcmF0aW9uID0gc3RyZHVwKCIiKTsKICAgIFN0b3JhZ2VOZXctPnBpbmdDdGxUcmFwR2VuZXJhdGlvbkxlbiA9IDA7CiAgICBTdG9yYWdlTmV3LT5waW5nQ3RsVHJhcFByb2JlRmFpbHVyZUZpbHRlciA9IDE7CiAgICBTdG9yYWdlTmV3LT5waW5nQ3RsVHJhcFRlc3RGYWlsdXJlRmlsdGVyID0gMTsKICAgIFN0b3JhZ2VOZXctPnBpbmdDdGxUeXBlID0gY2FsbG9jKDEsIHNpemVvZihvaWQpICogc2l6ZW9mKDIpKTsgICAgICAgLyogMC4wICovCiAgICBTdG9yYWdlTmV3LT5waW5nQ3RsVHlwZUxlbiA9IDI7CiAgICBTdG9yYWdlTmV3LT5waW5nQ3RsRGVzY3IgPSBzdHJkdXAoIiIpOwogICAgU3RvcmFnZU5ldy0+cGluZ0N0bERlc2NyTGVuID0gMDsKICAgIFN0b3JhZ2VOZXctPnBpbmdDdGxTb3VyY2VBZGRyZXNzVHlwZSA9IDE7CiAgICBTdG9yYWdlTmV3LT5waW5nQ3RsU291cmNlQWRkcmVzcyA9IHN0cmR1cCgiIik7CiAgICBTdG9yYWdlTmV3LT5waW5nQ3RsU291cmNlQWRkcmVzc0xlbiA9IDA7CiAgICBTdG9yYWdlTmV3LT5waW5nQ3RsSWZJbmRleCA9IDA7CiAgICBTdG9yYWdlTmV3LT5waW5nQ3RsQnlQYXNzUm91dGVUYWJsZSA9IDI7CiAgICBTdG9yYWdlTmV3LT5waW5nQ3RsRFNGaWVsZCA9IDA7CiAgICBTdG9yYWdlTmV3LT5waW5nUmVzdWx0cyA9IE5VTEw7CiAgICBTdG9yYWdlTmV3LT5waW5nUHJvYmVIaXMgPSBOVUxMOwoKICAgIFN0b3JhZ2VOZXctPnN0b3JhZ2VUeXBlID0gU1RfTk9OVk9MQVRJTEU7CiAgICBTdG9yYWdlTmV3LT5waW5nUHJvYmVIaXN0b3J5TWF4SW5kZXggPSAwOwogICAgcmV0dXJuIFN0b3JhZ2VOZXc7Cn0KCnN0YXRpYyB2b2lkIGZyZWVfcGluZ0N0bFRhYmxlX2RhdGEoc3RydWN0IHBpbmdDdGxUYWJsZV9kYXRhICpTdG9yYWdlRGVsKQp7CiAgICBuZXRzbm1wX2Fzc2VydChTdG9yYWdlRGVsKTsKICAgIGZyZWUoU3RvcmFnZURlbC0+cGluZ0N0bE93bmVySW5kZXgpOwogICAgZnJlZShTdG9yYWdlRGVsLT5waW5nQ3RsVGVzdE5hbWUpOwogICAgZnJlZShTdG9yYWdlRGVsLT5waW5nQ3RsVGFyZ2V0QWRkcmVzcyk7CiAgICBmcmVlKFN0b3JhZ2VEZWwtPnBpbmdDdGxEYXRhRmlsbCk7CiAgICBmcmVlKFN0b3JhZ2VEZWwtPnBpbmdDdGxUcmFwR2VuZXJhdGlvbik7CiAgICBmcmVlKFN0b3JhZ2VEZWwtPnBpbmdDdGxUeXBlKTsKICAgIGZyZWUoU3RvcmFnZURlbC0+cGluZ0N0bERlc2NyKTsKICAgIGZyZWUoU3RvcmFnZURlbC0+cGluZ0N0bFNvdXJjZUFkZHJlc3MpOwogICAgZnJlZShTdG9yYWdlRGVsKTsKfQoKLyoKICogcGluZ0N0bFRhYmxlX2FkZCgpOiBhZGRzIGEgc3RydWN0dXJlIG5vZGUgdG8gb3VyIGRhdGEgc2V0IAogKi8KaW50CnBpbmdDdGxUYWJsZV9hZGQoc3RydWN0IHBpbmdDdGxUYWJsZV9kYXRhICp0aGVkYXRhKQp7CiAgICBuZXRzbm1wX3ZhcmlhYmxlX2xpc3QgKnZhcnMgPSBOVUxMOwoKCiAgICBERUJVR01TR1RMKCgicGluZ0N0bFRhYmxlIiwgImFkZGluZyBkYXRhLi4uICAiKSk7CiAgICAvKgogICAgICogYWRkIHRoZSBpbmRleCB2YXJpYWJsZXMgdG8gdGhlIHZhcmJpbmQgbGlzdCwgd2hpY2ggaXMgCiAgICAgKiB1c2VkIGJ5IGhlYWRlcl9jb21wbGV4IHRvIGluZGV4IHRoZSBkYXRhIAogICAgICovCgoKICAgIHNubXBfdmFybGlzdF9hZGRfdmFyaWFibGUoJnZhcnMsIE5VTEwsIDAsIEFTTl9PQ1RFVF9TVFIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoZWRhdGEtPnBpbmdDdGxPd25lckluZGV4LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGVkYXRhLT5waW5nQ3RsT3duZXJJbmRleExlbik7CiAgICBzbm1wX3Zhcmxpc3RfYWRkX3ZhcmlhYmxlKCZ2YXJzLCBOVUxMLCAwLCBBU05fT0NURVRfU1RSLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGVkYXRhLT5waW5nQ3RsVGVzdE5hbWUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoZWRhdGEtPnBpbmdDdGxUZXN0TmFtZUxlbik7CiAgICBoZWFkZXJfY29tcGxleF9hZGRfZGF0YSgmcGluZ0N0bFRhYmxlU3RvcmFnZSwgdmFycywgdGhlZGF0YSk7CgogICAgREVCVUdNU0dUTCgoInBpbmdDdGxUYWJsZSIsICJyZWdpc3RlcmVkIGFuIGVudHJ5XG4iKSk7CgogICAgcmV0dXJuIFNOTVBFUlJfU1VDQ0VTUzsKfQoKaW50CnBpbmdSZXN1bHRzVGFibGVfYWRkKHN0cnVjdCBwaW5nQ3RsVGFibGVfZGF0YSAqdGhlZGF0YSkKewogICAgbmV0c25tcF92YXJpYWJsZV9saXN0ICp2YXJzX2xpc3QgPSBOVUxMOwogICAgc3RydWN0IHBpbmdSZXN1bHRzVGFibGVfZGF0YSAqcDsKCiAgICBwID0gdGhlZGF0YS0+cGluZ1Jlc3VsdHM7CiAgICBpZiAodGhlZGF0YS0+cGluZ1Jlc3VsdHMgIT0gTlVMTCkgewoKICAgICAgICBzbm1wX3Zhcmxpc3RfYWRkX3ZhcmlhYmxlKCZ2YXJzX2xpc3QsIE5VTEwsIDAsIEFTTl9PQ1RFVF9TVFIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwLT5waW5nQ3RsT3duZXJJbmRleCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHAtPnBpbmdDdGxPd25lckluZGV4TGVuKTsKICAgICAgICBzbm1wX3Zhcmxpc3RfYWRkX3ZhcmlhYmxlKCZ2YXJzX2xpc3QsIE5VTEwsIDAsIEFTTl9PQ1RFVF9TVFIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwLT5waW5nQ3RsVGVzdE5hbWUsIHAtPnBpbmdDdGxUZXN0TmFtZUxlbik7CgogICAgICAgIC8qCiAgICAgICAgICogWFhYOiBmaWxsIGluIGRlZmF1bHQgcm93IHZhbHVlcyBoZXJlIGludG8gU3RvcmFnZU5ldyAKICAgICAgICAgKiAKICAgICAgICAgKi8KCgogICAgICAgIERFQlVHTVNHVEwoKCJwaW5nUmVzdWx0c1RhYmxlIiwgImFkZGluZyBkYXRhLi4uICAiKSk7CiAgICAgICAgLyoKICAgICAgICAgKiBhZGQgdGhlIGluZGV4IHZhcmlhYmxlcyB0byB0aGUgdmFyYmluZCBsaXN0LCB3aGljaCBpcyAKICAgICAgICAgKiB1c2VkIGJ5IGhlYWRlcl9jb21wbGV4IHRvIGluZGV4IHRoZSBkYXRhIAogICAgICAgICAqLwoKICAgICAgICBoZWFkZXJfY29tcGxleF9hZGRfZGF0YSgmcGluZ1Jlc3VsdHNUYWJsZVN0b3JhZ2UsIHZhcnNfbGlzdCwgcCk7CgogICAgICAgIERFQlVHTVNHVEwoKCJwaW5nUmVzdWx0c1RhYmxlIiwgIm91dCBmaW5pc2hlZFxuIikpOwoKICAgIH0KCiAgICByZXR1cm4gU05NUEVSUl9TVUNDRVNTOwp9CgoKaW50CnBpbmdQcm9iZUhpc3RvcnlUYWJsZV9hZGQoc3RydWN0IHBpbmdQcm9iZUhpc3RvcnlUYWJsZV9kYXRhICp0aGVkYXRhKQp7CiAgICBuZXRzbm1wX3ZhcmlhYmxlX2xpc3QgKnZhcnNfbGlzdDsKCiAgICB2YXJzX2xpc3QgPSBOVUxMOwogICAgaWYgKHRoZWRhdGEgIT0gTlVMTCkgewogICAgICAgIHNubXBfdmFybGlzdF9hZGRfdmFyaWFibGUoJnZhcnNfbGlzdCwgTlVMTCwgMCwgQVNOX09DVEVUX1NUUiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoZWRhdGEtPnBpbmdDdGxPd25lckluZGV4LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhlZGF0YS0+cGluZ0N0bE93bmVySW5kZXhMZW4pOwogICAgICAgIHNubXBfdmFybGlzdF9hZGRfdmFyaWFibGUoJnZhcnNfbGlzdCwgTlVMTCwgMCwgQVNOX09DVEVUX1NUUiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoZWRhdGEtPnBpbmdDdGxUZXN0TmFtZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoZWRhdGEtPnBpbmdDdGxUZXN0TmFtZUxlbik7CiAgICAgICAgc25tcF92YXJsaXN0X2FkZF92YXJpYWJsZSgmdmFyc19saXN0LCBOVUxMLCAwLCBBU05fVU5TSUdORUQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmdGhlZGF0YS0+cGluZ1Byb2JlSGlzdG9yeUluZGV4LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKHRoZWRhdGEtPnBpbmdQcm9iZUhpc3RvcnlJbmRleCkpOwoKICAgICAgICAvKgogICAgICAgICAqIFhYWDogZmlsbCBpbiBkZWZhdWx0IHJvdyB2YWx1ZXMgaGVyZSBpbnRvIFN0b3JhZ2VOZXcgCiAgICAgICAgICogCiAgICAgICAgICovCgoKICAgICAgICBERUJVR01TR1RMKCgicGluZ1Byb2JlSGlzdG9yeVRhYmxlIiwgImFkZGluZyBkYXRhLi4uICAiKSk7CiAgICAgICAgLyoKICAgICAgICAgKiBhZGQgdGhlIGluZGV4IHZhcmlhYmxlcyB0byB0aGUgdmFyYmluZCBsaXN0LCB3aGljaCBpcyAKICAgICAgICAgKiB1c2VkIGJ5IGhlYWRlcl9jb21wbGV4IHRvIGluZGV4IHRoZSBkYXRhIAogICAgICAgICAqLwoKICAgICAgICBoZWFkZXJfY29tcGxleF9hZGRfZGF0YSgmcGluZ1Byb2JlSGlzdG9yeVRhYmxlU3RvcmFnZSwgdmFyc19saXN0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoZWRhdGEpOwogICAgICAgIERFQlVHTVNHVEwoKCJwaW5nUHJvYmVIaXN0b3J5VGFibGUiLCAib3V0IGZpbmlzaGVkXG4iKSk7CiAgICB9CiAgICAKICAgIHJldHVybiBTTk1QRVJSX1NVQ0NFU1M7Cn0KCmludApwaW5nUHJvYmVIaXN0b3J5VGFibGVfYWRkYWxsKHN0cnVjdCBwaW5nQ3RsVGFibGVfZGF0YSAqdGhlZGF0YSkKewogICAgbmV0c25tcF92YXJpYWJsZV9saXN0ICp2YXJzX2xpc3Q7CiAgICBzdHJ1Y3QgcGluZ1Byb2JlSGlzdG9yeVRhYmxlX2RhdGEgKnA7CgogICAgZm9yIChwID0gdGhlZGF0YS0+cGluZ1Byb2JlSGlzOyBwOyBwID0gcC0+bmV4dCkgewogICAgICAgIHZhcnNfbGlzdCA9IE5VTEw7CiAgICAgICAgc25tcF92YXJsaXN0X2FkZF92YXJpYWJsZSgmdmFyc19saXN0LCBOVUxMLCAwLCBBU05fT0NURVRfU1RSLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcC0+cGluZ0N0bE93bmVySW5kZXgsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwLT5waW5nQ3RsT3duZXJJbmRleExlbik7CiAgICAgICAgc25tcF92YXJsaXN0X2FkZF92YXJpYWJsZSgmdmFyc19saXN0LCBOVUxMLCAwLCBBU05fT0NURVRfU1RSLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcC0+cGluZ0N0bFRlc3ROYW1lLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcC0+cGluZ0N0bFRlc3ROYW1lTGVuKTsKICAgICAgICBzbm1wX3Zhcmxpc3RfYWRkX3ZhcmlhYmxlKCZ2YXJzX2xpc3QsIE5VTEwsIDAsIEFTTl9VTlNJR05FRCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZwLT5waW5nUHJvYmVIaXN0b3J5SW5kZXgsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2YocC0+cGluZ1Byb2JlSGlzdG9yeUluZGV4KSk7CiAgICAgICAgaGVhZGVyX2NvbXBsZXhfYWRkX2RhdGEoJnBpbmdQcm9iZUhpc3RvcnlUYWJsZVN0b3JhZ2UsIHZhcnNfbGlzdCwgcCk7CiAgICB9CgogICAgcmV0dXJuIFNOTVBFUlJfU1VDQ0VTUzsKfQoKdm9pZApwaW5nQ3RsVGFibGVfY2xlYW5lcihzdHJ1Y3QgaGVhZGVyX2NvbXBsZXhfaW5kZXggKnRoZXN0dWZmKQp7CiAgICBzdHJ1Y3QgaGVhZGVyX2NvbXBsZXhfaW5kZXggKmhjaXB0ciwgKm5leHQ7CiAgICBzdHJ1Y3QgcGluZ0N0bFRhYmxlX2RhdGEgKlN0b3JhZ2VEZWw7CgogICAgREVCVUdNU0dUTCgoInBpbmdQcm9iZUhpc3RvcnlUYWJsZSIsICJjbGVhbmVyb3V0ICAiKSk7CiAgICBmb3IgKGhjaXB0ciA9IHRoZXN0dWZmOyBoY2lwdHI7IGhjaXB0ciA9IG5leHQpIHsKICAgICAgICBuZXh0ID0gaGNpcHRyLT5uZXh0OwogICAgICAgIFN0b3JhZ2VEZWwgPSBoZWFkZXJfY29tcGxleF9leHRyYWN0X2VudHJ5KCZwaW5nQ3RsVGFibGVTdG9yYWdlLCBoY2lwdHIpOwogICAgICAgIGZyZWVfcGluZ0N0bFRhYmxlX2RhdGEoU3RvcmFnZURlbCk7CiAgICAgICAgREVCVUdNU0dUTCgoInBpbmdQcm9iZUhpc3RvcnlUYWJsZSIsICJjbGVhbmVyICAiKSk7CiAgICB9Cn0KCi8qCiAqIHBhcnNlX210ZU9iamVjdHNUYWJsZSgpOgogKiAgIHBhcnNlcyAuY29uZiBmaWxlIGVudHJpZXMgbmVlZGVkIHRvIGNvbmZpZ3VyZSB0aGUgbWliLgogKi8Kdm9pZApwYXJzZV9waW5nQ3RsVGFibGUoY29uc3QgY2hhciAqdG9rZW4sIGNoYXIgKmxpbmUpCnsKICAgIHNpemVfdCAgICAgICAgICB0bXBpbnQ7CiAgICBzdHJ1Y3QgcGluZ0N0bFRhYmxlX2RhdGEgKlN0b3JhZ2VUbXAgPQogICAgICAgIFNOTVBfTUFMTE9DX1NUUlVDVChwaW5nQ3RsVGFibGVfZGF0YSk7CgogICAgREVCVUdNU0dUTCgoInBpbmdDdGxUYWJsZSIsICJwYXJzaW5nIGNvbmZpZy4uLiAgIikpOwoKCiAgICBpZiAoU3RvcmFnZVRtcCA9PSBOVUxMKSB7CiAgICAgICAgY29uZmlnX3BlcnJvcigibWFsbG9jIGZhaWx1cmUiKTsKICAgICAgICByZXR1cm47CiAgICB9CgoKICAgIGxpbmUgPQogICAgICAgIHJlYWRfY29uZmlnX3JlYWRfZGF0YShBU05fT0NURVRfU1RSLCBsaW5lLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmU3RvcmFnZVRtcC0+cGluZ0N0bE93bmVySW5kZXgsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZTdG9yYWdlVG1wLT5waW5nQ3RsT3duZXJJbmRleExlbik7CiAgICBpZiAoU3RvcmFnZVRtcC0+cGluZ0N0bE93bmVySW5kZXggPT0gTlVMTCkgewogICAgICAgIGNvbmZpZ19wZXJyb3IoImludmFsaWQgc3BlY2lmaWNhdGlvbiBmb3IgcGluZ0N0bE93bmVySW5kZXgiKTsKICAgICAgICByZXR1cm47CiAgICB9CgogICAgbGluZSA9CiAgICAgICAgcmVhZF9jb25maWdfcmVhZF9kYXRhKEFTTl9PQ1RFVF9TVFIsIGxpbmUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZTdG9yYWdlVG1wLT5waW5nQ3RsVGVzdE5hbWUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZTdG9yYWdlVG1wLT5waW5nQ3RsVGVzdE5hbWVMZW4pOwogICAgaWYgKFN0b3JhZ2VUbXAtPnBpbmdDdGxUZXN0TmFtZSA9PSBOVUxMKSB7CiAgICAgICAgY29uZmlnX3BlcnJvcigiaW52YWxpZCBzcGVjaWZpY2F0aW9uIGZvciBwaW5nQ3RsVGVzdE5hbWUiKTsKICAgICAgICByZXR1cm47CiAgICB9CgogICAgbGluZSA9CiAgICAgICAgcmVhZF9jb25maWdfcmVhZF9kYXRhKEFTTl9JTlRFR0VSLCBsaW5lLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmU3RvcmFnZVRtcC0+cGluZ0N0bFRhcmdldEFkZHJlc3NUeXBlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmdG1waW50KTsKCiAgICBsaW5lID0KICAgICAgICByZWFkX2NvbmZpZ19yZWFkX2RhdGEoQVNOX09DVEVUX1NUUiwgbGluZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJlN0b3JhZ2VUbXAtPnBpbmdDdGxUYXJnZXRBZGRyZXNzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmU3RvcmFnZVRtcC0+cGluZ0N0bFRhcmdldEFkZHJlc3NMZW4pOwogICAgaWYgKFN0b3JhZ2VUbXAtPnBpbmdDdGxUYXJnZXRBZGRyZXNzID09IE5VTEwpIHsKICAgICAgICBjb25maWdfcGVycm9yKCJpbnZhbGlkIHNwZWNpZmljYXRpb24gZm9yIHBpbmdDdGxUYXJnZXRBZGRyZXNzIik7CiAgICAgICAgcmV0dXJuOwogICAgfQoKICAgIGxpbmUgPQogICAgICAgIHJlYWRfY29uZmlnX3JlYWRfZGF0YShBU05fVU5TSUdORUQsIGxpbmUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZTdG9yYWdlVG1wLT5waW5nQ3RsRGF0YVNpemUsICZ0bXBpbnQpOwoKICAgIGxpbmUgPQogICAgICAgIHJlYWRfY29uZmlnX3JlYWRfZGF0YShBU05fVU5TSUdORUQsIGxpbmUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZTdG9yYWdlVG1wLT5waW5nQ3RsVGltZU91dCwgJnRtcGludCk7CgogICAgbGluZSA9CiAgICAgICAgcmVhZF9jb25maWdfcmVhZF9kYXRhKEFTTl9VTlNJR05FRCwgbGluZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJlN0b3JhZ2VUbXAtPnBpbmdDdGxQcm9iZUNvdW50LCAmdG1waW50KTsKCiAgICBsaW5lID0KICAgICAgICByZWFkX2NvbmZpZ19yZWFkX2RhdGEoQVNOX0lOVEVHRVIsIGxpbmUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZTdG9yYWdlVG1wLT5waW5nQ3RsQWRtaW5TdGF0dXMsICZ0bXBpbnQpOwoKICAgIGxpbmUgPQogICAgICAgIHJlYWRfY29uZmlnX3JlYWRfZGF0YShBU05fT0NURVRfU1RSLCBsaW5lLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmU3RvcmFnZVRtcC0+cGluZ0N0bERhdGFGaWxsLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmU3RvcmFnZVRtcC0+cGluZ0N0bERhdGFGaWxsTGVuKTsKICAgIGlmIChTdG9yYWdlVG1wLT5waW5nQ3RsRGF0YUZpbGwgPT0gTlVMTCkgewogICAgICAgIGNvbmZpZ19wZXJyb3IoImludmFsaWQgc3BlY2lmaWNhdGlvbiBmb3IgcGluZ0N0bERhdGFGaWxsIik7CiAgICAgICAgcmV0dXJuOwogICAgfQoKICAgIGxpbmUgPQogICAgICAgIHJlYWRfY29uZmlnX3JlYWRfZGF0YShBU05fVU5TSUdORUQsIGxpbmUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZTdG9yYWdlVG1wLT5waW5nQ3RsRnJlcXVlbmN5LCAmdG1waW50KTsKCiAgICBsaW5lID0KICAgICAgICByZWFkX2NvbmZpZ19yZWFkX2RhdGEoQVNOX1VOU0lHTkVELCBsaW5lLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmU3RvcmFnZVRtcC0+cGluZ0N0bE1heFJvd3MsICZ0bXBpbnQpOwoKICAgIGxpbmUgPQogICAgICAgIHJlYWRfY29uZmlnX3JlYWRfZGF0YShBU05fSU5URUdFUiwgbGluZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJlN0b3JhZ2VUbXAtPnBpbmdDdGxTdG9yYWdlVHlwZSwgJnRtcGludCk7CgogICAgbGluZSA9CiAgICAgICAgcmVhZF9jb25maWdfcmVhZF9kYXRhKEFTTl9PQ1RFVF9TVFIsIGxpbmUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZTdG9yYWdlVG1wLT5waW5nQ3RsVHJhcEdlbmVyYXRpb24sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZTdG9yYWdlVG1wLT5waW5nQ3RsVHJhcEdlbmVyYXRpb25MZW4pOwogICAgaWYgKFN0b3JhZ2VUbXAtPnBpbmdDdGxUcmFwR2VuZXJhdGlvbiA9PSBOVUxMKSB7CiAgICAgICAgY29uZmlnX3BlcnJvcigiaW52YWxpZCBzcGVjaWZpY2F0aW9uIGZvciBwaW5nQ3RsVHJhcEdlbmVyYXRpb24iKTsKICAgICAgICByZXR1cm47CiAgICB9CgogICAgbGluZSA9CiAgICAgICAgcmVhZF9jb25maWdfcmVhZF9kYXRhKEFTTl9VTlNJR05FRCwgbGluZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJlN0b3JhZ2VUbXAtPnBpbmdDdGxUcmFwUHJvYmVGYWlsdXJlRmlsdGVyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmdG1waW50KTsKCiAgICBsaW5lID0KICAgICAgICByZWFkX2NvbmZpZ19yZWFkX2RhdGEoQVNOX1VOU0lHTkVELCBsaW5lLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmU3RvcmFnZVRtcC0+cGluZ0N0bFRyYXBUZXN0RmFpbHVyZUZpbHRlciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnRtcGludCk7CgogICAgbGluZSA9CiAgICAgICAgcmVhZF9jb25maWdfcmVhZF9kYXRhKEFTTl9PQkpFQ1RfSUQsIGxpbmUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZTdG9yYWdlVG1wLT5waW5nQ3RsVHlwZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJlN0b3JhZ2VUbXAtPnBpbmdDdGxUeXBlTGVuKTsKICAgIGlmIChTdG9yYWdlVG1wLT5waW5nQ3RsVHlwZSA9PSBOVUxMKSB7CiAgICAgICAgY29uZmlnX3BlcnJvcigiaW52YWxpZCBzcGVjaWZpY2F0aW9uIGZvciBwaW5nQ3RsVHlwZSIpOwogICAgICAgIHJldHVybjsKICAgIH0KCiAgICBsaW5lID0KICAgICAgICByZWFkX2NvbmZpZ19yZWFkX2RhdGEoQVNOX09DVEVUX1NUUiwgbGluZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJlN0b3JhZ2VUbXAtPnBpbmdDdGxEZXNjciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJlN0b3JhZ2VUbXAtPnBpbmdDdGxEZXNjckxlbik7CiAgICBpZiAoU3RvcmFnZVRtcC0+cGluZ0N0bERlc2NyID09IE5VTEwpIHsKICAgICAgICBjb25maWdfcGVycm9yKCJpbnZhbGlkIHNwZWNpZmljYXRpb24gZm9yIHBpbmdDdGxUcmFwRGVzY3IiKTsKICAgICAgICByZXR1cm47CiAgICB9CgogICAgbGluZSA9CiAgICAgICAgcmVhZF9jb25maWdfcmVhZF9kYXRhKEFTTl9JTlRFR0VSLCBsaW5lLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmU3RvcmFnZVRtcC0+cGluZ0N0bFNvdXJjZUFkZHJlc3NUeXBlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmdG1waW50KTsKCiAgICBsaW5lID0KICAgICAgICByZWFkX2NvbmZpZ19yZWFkX2RhdGEoQVNOX09DVEVUX1NUUiwgbGluZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJlN0b3JhZ2VUbXAtPnBpbmdDdGxTb3VyY2VBZGRyZXNzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmU3RvcmFnZVRtcC0+cGluZ0N0bFNvdXJjZUFkZHJlc3NMZW4pOwogICAgaWYgKFN0b3JhZ2VUbXAtPnBpbmdDdGxTb3VyY2VBZGRyZXNzID09IE5VTEwpIHsKICAgICAgICBjb25maWdfcGVycm9yKCJpbnZhbGlkIHNwZWNpZmljYXRpb24gZm9yIHBpbmdDdGxTb3VyY2VBZGRyZXNzIik7CiAgICAgICAgcmV0dXJuOwogICAgfQoKICAgIGxpbmUgPQogICAgICAgIHJlYWRfY29uZmlnX3JlYWRfZGF0YShBU05fSU5URUdFUiwgbGluZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJlN0b3JhZ2VUbXAtPnBpbmdDdGxJZkluZGV4LCAmdG1waW50KTsKCiAgICBsaW5lID0KICAgICAgICByZWFkX2NvbmZpZ19yZWFkX2RhdGEoQVNOX0lOVEVHRVIsIGxpbmUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZTdG9yYWdlVG1wLT5waW5nQ3RsQnlQYXNzUm91dGVUYWJsZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnRtcGludCk7CgogICAgbGluZSA9CiAgICAgICAgcmVhZF9jb25maWdfcmVhZF9kYXRhKEFTTl9VTlNJR05FRCwgbGluZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJlN0b3JhZ2VUbXAtPnBpbmdDdGxEU0ZpZWxkLCAmdG1waW50KTsKCiAgICBsaW5lID0KICAgICAgICByZWFkX2NvbmZpZ19yZWFkX2RhdGEoQVNOX0lOVEVHRVIsIGxpbmUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZTdG9yYWdlVG1wLT5waW5nQ3RsUm93U3RhdHVzLCAmdG1waW50KTsKCiAgICBsaW5lID0KICAgICAgICByZWFkX2NvbmZpZ19yZWFkX2RhdGEoQVNOX1VOU0lHTkVELCBsaW5lLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmU3RvcmFnZVRtcC0+cGluZ1Byb2JlSGlzdG9yeU1heEluZGV4LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmdG1waW50KTsKCiAgICBTdG9yYWdlVG1wLT5zdG9yYWdlVHlwZSA9IFNUX05PTlZPTEFUSUxFOwogICAgcGluZ0N0bFRhYmxlX2FkZChTdG9yYWdlVG1wKTsKICAgIC8qIHBpbmdDdGxUYWJsZV9jbGVhbmVyKHBpbmdDdGxUYWJsZVN0b3JhZ2UpOyAqLwoKICAgIERFQlVHTVNHVEwoKCJwaW5nQ3RsVGFibGUiLCAiZG9uZS5cbiIpKTsKfQoKCgovKgogKiBzdG9yZV9waW5nQ3RsVGFibGUoKToKICogICBzdG9yZXMgLmNvbmYgZmlsZSBlbnRyaWVzIG5lZWRlZCB0byBjb25maWd1cmUgdGhlIG1pYi4KICovCmludApzdG9yZV9waW5nQ3RsVGFibGUoaW50IG1ham9ySUQsIGludCBtaW5vcklELCB2b2lkICpzZXJ2ZXJhcmcsCiAgICAgICAgICAgICAgICAgICB2b2lkICpjbGllbnRhcmcpCnsKICAgIGNoYXIgICAgICAgICAgICBsaW5lW1NOTVBfTUFYQlVGXTsKICAgIGNoYXIgICAgICAgICAgICpjcHRyID0gTlVMTDsKICAgIHNpemVfdCAgICAgICAgICB0bXBpbnQ7CiAgICBzdHJ1Y3QgcGluZ0N0bFRhYmxlX2RhdGEgKlN0b3JhZ2VUbXAgPSBOVUxMOwogICAgc3RydWN0IGhlYWRlcl9jb21wbGV4X2luZGV4ICpoY2luZGV4ID0gTlVMTDsKCgogICAgREVCVUdNU0dUTCgoInBpbmdDdGxUYWJsZSIsICJzdG9yaW5nIGRhdGEuLi4gICIpKTsKCgogICAgZm9yIChoY2luZGV4ID0gcGluZ0N0bFRhYmxlU3RvcmFnZTsgaGNpbmRleCAhPSBOVUxMOwogICAgICAgICBoY2luZGV4ID0gaGNpbmRleC0+bmV4dCkgewogICAgICAgIFN0b3JhZ2VUbXAgPSAoc3RydWN0IHBpbmdDdGxUYWJsZV9kYXRhICopIGhjaW5kZXgtPmRhdGE7CgogICAgICAgIGlmIChTdG9yYWdlVG1wLT5zdG9yYWdlVHlwZSAhPSBTVF9SRUFET05MWSkgewogICAgICAgICAgICBtZW1zZXQobGluZSwgMCwgc2l6ZW9mKGxpbmUpKTsKICAgICAgICAgICAgc3RyY2F0KGxpbmUsICJwaW5nQ3RsVGFibGUgIik7CiAgICAgICAgICAgIGNwdHIgPSBsaW5lICsgc3RybGVuKGxpbmUpOwoKCiAgICAgICAgICAgIGNwdHIgPQogICAgICAgICAgICAgICAgcmVhZF9jb25maWdfc3RvcmVfZGF0YShBU05fT0NURVRfU1RSLCBjcHRyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmU3RvcmFnZVRtcC0+cGluZ0N0bE93bmVySW5kZXgsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZTdG9yYWdlVG1wLT5waW5nQ3RsT3duZXJJbmRleExlbik7CiAgICAgICAgICAgIGNwdHIgPQogICAgICAgICAgICAgICAgcmVhZF9jb25maWdfc3RvcmVfZGF0YShBU05fT0NURVRfU1RSLCBjcHRyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmU3RvcmFnZVRtcC0+cGluZ0N0bFRlc3ROYW1lLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmU3RvcmFnZVRtcC0+cGluZ0N0bFRlc3ROYW1lTGVuKTsKICAgICAgICAgICAgY3B0ciA9CiAgICAgICAgICAgICAgICByZWFkX2NvbmZpZ19zdG9yZV9kYXRhKEFTTl9JTlRFR0VSLCBjcHRyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmU3RvcmFnZVRtcC0+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBpbmdDdGxUYXJnZXRBZGRyZXNzVHlwZSwgJnRtcGludCk7CiAgICAgICAgICAgIGNwdHIgPQogICAgICAgICAgICAgICAgcmVhZF9jb25maWdfc3RvcmVfZGF0YShBU05fT0NURVRfU1RSLCBjcHRyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmU3RvcmFnZVRtcC0+cGluZ0N0bFRhcmdldEFkZHJlc3MsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZTdG9yYWdlVG1wLT4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGluZ0N0bFRhcmdldEFkZHJlc3NMZW4pOwogICAgICAgICAgICBjcHRyID0KICAgICAgICAgICAgICAgIHJlYWRfY29uZmlnX3N0b3JlX2RhdGEoQVNOX1VOU0lHTkVELCBjcHRyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmU3RvcmFnZVRtcC0+cGluZ0N0bERhdGFTaXplLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmdG1waW50KTsKICAgICAgICAgICAgY3B0ciA9CiAgICAgICAgICAgICAgICByZWFkX2NvbmZpZ19zdG9yZV9kYXRhKEFTTl9VTlNJR05FRCwgY3B0ciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJlN0b3JhZ2VUbXAtPnBpbmdDdGxUaW1lT3V0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmdG1waW50KTsKICAgICAgICAgICAgY3B0ciA9CiAgICAgICAgICAgICAgICByZWFkX2NvbmZpZ19zdG9yZV9kYXRhKEFTTl9VTlNJR05FRCwgY3B0ciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJlN0b3JhZ2VUbXAtPnBpbmdDdGxQcm9iZUNvdW50LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmdG1waW50KTsKCiAgICAgICAgICAgIGNwdHIgPQogICAgICAgICAgICAgICAgcmVhZF9jb25maWdfc3RvcmVfZGF0YShBU05fSU5URUdFUiwgY3B0ciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJlN0b3JhZ2VUbXAtPnBpbmdDdGxBZG1pblN0YXR1cywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnRtcGludCk7CiAgICAgICAgICAgIGNwdHIgPQogICAgICAgICAgICAgICAgcmVhZF9jb25maWdfc3RvcmVfZGF0YShBU05fT0NURVRfU1RSLCBjcHRyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmU3RvcmFnZVRtcC0+cGluZ0N0bERhdGFGaWxsLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmU3RvcmFnZVRtcC0+cGluZ0N0bERhdGFGaWxsTGVuKTsKCiAgICAgICAgICAgIGNwdHIgPQogICAgICAgICAgICAgICAgcmVhZF9jb25maWdfc3RvcmVfZGF0YShBU05fVU5TSUdORUQsIGNwdHIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZTdG9yYWdlVG1wLT5waW5nQ3RsRnJlcXVlbmN5LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmdG1waW50KTsKICAgICAgICAgICAgY3B0ciA9CiAgICAgICAgICAgICAgICByZWFkX2NvbmZpZ19zdG9yZV9kYXRhKEFTTl9VTlNJR05FRCwgY3B0ciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJlN0b3JhZ2VUbXAtPnBpbmdDdGxNYXhSb3dzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmdG1waW50KTsKCiAgICAgICAgICAgIGNwdHIgPQogICAgICAgICAgICAgICAgcmVhZF9jb25maWdfc3RvcmVfZGF0YShBU05fSU5URUdFUiwgY3B0ciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJlN0b3JhZ2VUbXAtPnBpbmdDdGxTdG9yYWdlVHlwZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnRtcGludCk7CiAgICAgICAgICAgIGNwdHIgPQogICAgICAgICAgICAgICAgcmVhZF9jb25maWdfc3RvcmVfZGF0YShBU05fT0NURVRfU1RSLCBjcHRyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmU3RvcmFnZVRtcC0+cGluZ0N0bFRyYXBHZW5lcmF0aW9uLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmU3RvcmFnZVRtcC0+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBpbmdDdGxUcmFwR2VuZXJhdGlvbkxlbik7CiAgICAgICAgICAgIGNwdHIgPQogICAgICAgICAgICAgICAgcmVhZF9jb25maWdfc3RvcmVfZGF0YShBU05fVU5TSUdORUQsIGNwdHIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZTdG9yYWdlVG1wLT4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGluZ0N0bFRyYXBQcm9iZUZhaWx1cmVGaWx0ZXIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZ0bXBpbnQpOwogICAgICAgICAgICBjcHRyID0KICAgICAgICAgICAgICAgIHJlYWRfY29uZmlnX3N0b3JlX2RhdGEoQVNOX1VOU0lHTkVELCBjcHRyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmU3RvcmFnZVRtcC0+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBpbmdDdGxUcmFwVGVzdEZhaWx1cmVGaWx0ZXIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZ0bXBpbnQpOwogICAgICAgICAgICBjcHRyID0KICAgICAgICAgICAgICAgIHJlYWRfY29uZmlnX3N0b3JlX2RhdGEoQVNOX09CSkVDVF9JRCwgY3B0ciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJlN0b3JhZ2VUbXAtPnBpbmdDdGxUeXBlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmU3RvcmFnZVRtcC0+cGluZ0N0bFR5cGVMZW4pOwogICAgICAgICAgICBjcHRyID0KICAgICAgICAgICAgICAgIHJlYWRfY29uZmlnX3N0b3JlX2RhdGEoQVNOX09DVEVUX1NUUiwgY3B0ciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJlN0b3JhZ2VUbXAtPnBpbmdDdGxEZXNjciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJlN0b3JhZ2VUbXAtPnBpbmdDdGxEZXNjckxlbik7CiAgICAgICAgICAgIGNwdHIgPQogICAgICAgICAgICAgICAgcmVhZF9jb25maWdfc3RvcmVfZGF0YShBU05fSU5URUdFUiwgY3B0ciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJlN0b3JhZ2VUbXAtPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwaW5nQ3RsU291cmNlQWRkcmVzc1R5cGUsICZ0bXBpbnQpOwogICAgICAgICAgICBjcHRyID0KICAgICAgICAgICAgICAgIHJlYWRfY29uZmlnX3N0b3JlX2RhdGEoQVNOX09DVEVUX1NUUiwgY3B0ciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJlN0b3JhZ2VUbXAtPnBpbmdDdGxTb3VyY2VBZGRyZXNzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmU3RvcmFnZVRtcC0+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBpbmdDdGxTb3VyY2VBZGRyZXNzTGVuKTsKICAgICAgICAgICAgY3B0ciA9CiAgICAgICAgICAgICAgICByZWFkX2NvbmZpZ19zdG9yZV9kYXRhKEFTTl9JTlRFR0VSLCBjcHRyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmU3RvcmFnZVRtcC0+cGluZ0N0bElmSW5kZXgsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZ0bXBpbnQpOwogICAgICAgICAgICBjcHRyID0KICAgICAgICAgICAgICAgIHJlYWRfY29uZmlnX3N0b3JlX2RhdGEoQVNOX0lOVEVHRVIsIGNwdHIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZTdG9yYWdlVG1wLT4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGluZ0N0bEJ5UGFzc1JvdXRlVGFibGUsICZ0bXBpbnQpOwogICAgICAgICAgICBjcHRyID0KICAgICAgICAgICAgICAgIHJlYWRfY29uZmlnX3N0b3JlX2RhdGEoQVNOX1VOU0lHTkVELCBjcHRyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmU3RvcmFnZVRtcC0+cGluZ0N0bERTRmllbGQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZ0bXBpbnQpOwoKICAgICAgICAgICAgaWYgKFN0b3JhZ2VUbXAtPnBpbmdDdGxSb3dTdGF0dXMgPT0gUlNfQUNUSVZFKQogICAgICAgICAgICAgICAgU3RvcmFnZVRtcC0+cGluZ0N0bFJvd1N0YXR1cyA9IFJTX05PVElOU0VSVklDRTsKCiAgICAgICAgICAgIGNwdHIgPQogICAgICAgICAgICAgICAgcmVhZF9jb25maWdfc3RvcmVfZGF0YShBU05fSU5URUdFUiwgY3B0ciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJlN0b3JhZ2VUbXAtPnBpbmdDdGxSb3dTdGF0dXMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZ0bXBpbnQpOwogICAgICAgICAgICBjcHRyID0KICAgICAgICAgICAgICAgIHJlYWRfY29uZmlnX3N0b3JlX2RhdGEoQVNOX1VOU0lHTkVELCBjcHRyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmU3RvcmFnZVRtcC0+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBpbmdQcm9iZUhpc3RvcnlNYXhJbmRleCwgJnRtcGludCk7CgoKCiAgICAgICAgICAgIHNubXBkX3N0b3JlX2NvbmZpZyhsaW5lKTsKICAgICAgICB9CiAgICB9CiAgICBERUJVR01TR1RMKCgicGluZ0N0bFRhYmxlIiwgImRvbmUuXG4iKSk7CiAgICByZXR1cm4gU05NUEVSUl9TVUNDRVNTOwp9CgoKLyoKICogdmFyX3BpbmdDdGxUYWJsZSgpOgogKiAgIEhhbmRsZSB0aGlzIHRhYmxlIHNlcGFyYXRlbHkgZnJvbSB0aGUgc2NhbGFyIHZhbHVlIGNhc2UuCiAqICAgVGhlIHdvcmtpbmdzIG9mIHRoaXMgYXJlIGJhc2ljYWxseSB0aGUgc2FtZSBhcyBmb3IgdmFyX210ZU9iamVjdHNUYWJsZSBhYm92ZS4KICovCnVuc2lnbmVkIGNoYXIgICoKdmFyX3BpbmdDdGxUYWJsZShzdHJ1Y3QgdmFyaWFibGUgKnZwLAogICAgICAgICAgICAgICAgIG9pZCAqIG5hbWUsCiAgICAgICAgICAgICAgICAgc2l6ZV90ICpsZW5ndGgsCiAgICAgICAgICAgICAgICAgaW50IGV4YWN0LCBzaXplX3QgKnZhcl9sZW4sIFdyaXRlTWV0aG9kICoqIHdyaXRlX21ldGhvZCkKewoKCiAgICBzdHJ1Y3QgcGluZ0N0bFRhYmxlX2RhdGEgKlN0b3JhZ2VUbXAgPSBOVUxMOwoKICAgIC8qCiAgICAgKiB0aGlzIGFzc3VtZXMgeW91IGhhdmUgcmVnaXN0ZXJlZCBhbGwgeW91ciBkYXRhIHByb3Blcmx5CiAgICAgKi8KICAgIGlmICgoU3RvcmFnZVRtcCA9CiAgICAgICAgIGhlYWRlcl9jb21wbGV4KHBpbmdDdGxUYWJsZVN0b3JhZ2UsIHZwLCBuYW1lLCBsZW5ndGgsIGV4YWN0LAogICAgICAgICAgICAgICAgICAgICAgICB2YXJfbGVuLCB3cml0ZV9tZXRob2QpKSA9PSBOVUxMKSB7CiAgICAgICAgaWYgKHZwLT5tYWdpYyA9PSBDT0xVTU5fUElOR0NUTFJPV1NUQVRVUykKICAgICAgICAgICAgKndyaXRlX21ldGhvZCA9IHdyaXRlX3BpbmdDdGxSb3dTdGF0dXM7CiAgICAgICAgcmV0dXJuIE5VTEw7CiAgICB9CgogICAgLyoKICAgICAqIHRoaXMgaXMgd2hlcmUgd2UgZG8gdGhlIHZhbHVlIGFzc2lnbm1lbnRzIGZvciB0aGUgbWliIHJlc3VsdHMuCiAgICAgKi8KICAgIHN3aXRjaCAodnAtPm1hZ2ljKSB7CgoKICAgIGNhc2UgQ09MVU1OX1BJTkdDVExUQVJHRVRBRERSRVNTVFlQRToKICAgICAgICAqd3JpdGVfbWV0aG9kID0gd3JpdGVfcGluZ0N0bFRhcmdldEFkZHJlc3NUeXBlOwogICAgICAgICp2YXJfbGVuID0gc2l6ZW9mKFN0b3JhZ2VUbXAtPnBpbmdDdGxUYXJnZXRBZGRyZXNzVHlwZSk7CiAgICAgICAgcmV0dXJuICh1X2NoYXIgKikgJiBTdG9yYWdlVG1wLT5waW5nQ3RsVGFyZ2V0QWRkcmVzc1R5cGU7CgogICAgY2FzZSBDT0xVTU5fUElOR0NUTFRBUkdFVEFERFJFU1M6CiAgICAgICAgKndyaXRlX21ldGhvZCA9IHdyaXRlX3BpbmdDdGxUYXJnZXRBZGRyZXNzOwogICAgICAgICp2YXJfbGVuID0gKFN0b3JhZ2VUbXAtPnBpbmdDdGxUYXJnZXRBZGRyZXNzTGVuKTsKCiAgICAgICAgcmV0dXJuICh1X2NoYXIgKikgU3RvcmFnZVRtcC0+cGluZ0N0bFRhcmdldEFkZHJlc3M7CgogICAgY2FzZSBDT0xVTU5fUElOR0NUTERBVEFTSVpFOgogICAgICAgICp3cml0ZV9tZXRob2QgPSB3cml0ZV9waW5nQ3RsRGF0YVNpemU7CiAgICAgICAgKnZhcl9sZW4gPSBzaXplb2YoU3RvcmFnZVRtcC0+cGluZ0N0bERhdGFTaXplKTsKCiAgICAgICAgcmV0dXJuICh1X2NoYXIgKikgJiBTdG9yYWdlVG1wLT5waW5nQ3RsRGF0YVNpemU7CgogICAgY2FzZSBDT0xVTU5fUElOR0NUTFRJTUVPVVQ6CiAgICAgICAgKndyaXRlX21ldGhvZCA9IHdyaXRlX3BpbmdDdGxUaW1lT3V0OwogICAgICAgICp2YXJfbGVuID0gc2l6ZW9mKFN0b3JhZ2VUbXAtPnBpbmdDdGxUaW1lT3V0KTsKCiAgICAgICAgcmV0dXJuICh1X2NoYXIgKikgJiBTdG9yYWdlVG1wLT5waW5nQ3RsVGltZU91dDsKCiAgICBjYXNlIENPTFVNTl9QSU5HQ1RMUFJPQkVDT1VOVDoKICAgICAgICAqd3JpdGVfbWV0aG9kID0gd3JpdGVfcGluZ0N0bFByb2JlQ291bnQ7CiAgICAgICAgKnZhcl9sZW4gPSBzaXplb2YoU3RvcmFnZVRtcC0+cGluZ0N0bFByb2JlQ291bnQpOwoKICAgICAgICByZXR1cm4gKHVfY2hhciAqKSAmIFN0b3JhZ2VUbXAtPnBpbmdDdGxQcm9iZUNvdW50OwoKICAgIGNhc2UgQ09MVU1OX1BJTkdDVExBRE1JTlNUQVRVUzoKICAgICAgICAqd3JpdGVfbWV0aG9kID0gd3JpdGVfcGluZ0N0bEFkbWluU3RhdHVzOwogICAgICAgICp2YXJfbGVuID0gc2l6ZW9mKFN0b3JhZ2VUbXAtPnBpbmdDdGxBZG1pblN0YXR1cyk7CgogICAgICAgIHJldHVybiAodV9jaGFyICopICYgU3RvcmFnZVRtcC0+cGluZ0N0bEFkbWluU3RhdHVzOwoKICAgIGNhc2UgQ09MVU1OX1BJTkdDVExEQVRBRklMTDoKICAgICAgICAqd3JpdGVfbWV0aG9kID0gd3JpdGVfcGluZ0N0bERhdGFGaWxsOwogICAgICAgICp2YXJfbGVuID0gKFN0b3JhZ2VUbXAtPnBpbmdDdGxEYXRhRmlsbExlbik7CgogICAgICAgIHJldHVybiAodV9jaGFyICopIFN0b3JhZ2VUbXAtPnBpbmdDdGxEYXRhRmlsbDsKCiAgICBjYXNlIENPTFVNTl9QSU5HQ1RMRlJFUVVFTkNZOgogICAgICAgICp3cml0ZV9tZXRob2QgPSB3cml0ZV9waW5nQ3RsRnJlcXVlbmN5OwogICAgICAgICp2YXJfbGVuID0gc2l6ZW9mKFN0b3JhZ2VUbXAtPnBpbmdDdGxGcmVxdWVuY3kpOwoKICAgICAgICByZXR1cm4gKHVfY2hhciAqKSAmIFN0b3JhZ2VUbXAtPnBpbmdDdGxGcmVxdWVuY3k7CgogICAgY2FzZSBDT0xVTU5fUElOR0NUTE1BWFJPV1M6CiAgICAgICAgKndyaXRlX21ldGhvZCA9IHdyaXRlX3BpbmdDdGxNYXhSb3dzOwogICAgICAgICp2YXJfbGVuID0gc2l6ZW9mKFN0b3JhZ2VUbXAtPnBpbmdDdGxNYXhSb3dzKTsKCiAgICAgICAgcmV0dXJuICh1X2NoYXIgKikgJiBTdG9yYWdlVG1wLT5waW5nQ3RsTWF4Um93czsKCiAgICBjYXNlIENPTFVNTl9QSU5HQ1RMU1RPUkFHRVRZUEU6CiAgICAgICAgKndyaXRlX21ldGhvZCA9IHdyaXRlX3BpbmdDdGxTdG9yYWdlVHlwZTsKICAgICAgICAqdmFyX2xlbiA9IHNpemVvZihTdG9yYWdlVG1wLT5waW5nQ3RsU3RvcmFnZVR5cGUpOwoKICAgICAgICByZXR1cm4gKHVfY2hhciAqKSAmIFN0b3JhZ2VUbXAtPnBpbmdDdGxTdG9yYWdlVHlwZTsKCiAgICBjYXNlIENPTFVNTl9QSU5HQ1RMVFJBUEdFTkVSQVRJT046CiAgICAgICAgKndyaXRlX21ldGhvZCA9IHdyaXRlX3BpbmdDdGxUcmFwR2VuZXJhdGlvbjsKICAgICAgICAqdmFyX2xlbiA9IChTdG9yYWdlVG1wLT5waW5nQ3RsVHJhcEdlbmVyYXRpb25MZW4pOwoKICAgICAgICByZXR1cm4gKHVfY2hhciAqKSBTdG9yYWdlVG1wLT5waW5nQ3RsVHJhcEdlbmVyYXRpb247CgogICAgY2FzZSBDT0xVTU5fUElOR0NUTFRSQVBQUk9CRUZBSUxVUkVGSUxURVI6CiAgICAgICAgKndyaXRlX21ldGhvZCA9IHdyaXRlX3BpbmdDdGxUcmFwUHJvYmVGYWlsdXJlRmlsdGVyOwogICAgICAgICp2YXJfbGVuID0gc2l6ZW9mKFN0b3JhZ2VUbXAtPnBpbmdDdGxUcmFwUHJvYmVGYWlsdXJlRmlsdGVyKTsKCiAgICAgICAgcmV0dXJuICh1X2NoYXIgKikgJiBTdG9yYWdlVG1wLT5waW5nQ3RsVHJhcFByb2JlRmFpbHVyZUZpbHRlcjsKCiAgICBjYXNlIENPTFVNTl9QSU5HQ1RMVFJBUFRFU1RGQUlMVVJFRklMVEVSOgogICAgICAgICp3cml0ZV9tZXRob2QgPSB3cml0ZV9waW5nQ3RsVHJhcFRlc3RGYWlsdXJlRmlsdGVyOwogICAgICAgICp2YXJfbGVuID0gc2l6ZW9mKFN0b3JhZ2VUbXAtPnBpbmdDdGxUcmFwVGVzdEZhaWx1cmVGaWx0ZXIpOwoKICAgICAgICByZXR1cm4gKHVfY2hhciAqKSAmIFN0b3JhZ2VUbXAtPnBpbmdDdGxUcmFwVGVzdEZhaWx1cmVGaWx0ZXI7CgogICAgY2FzZSBDT0xVTU5fUElOR0NUTFRZUEU6CiAgICAgICAgKndyaXRlX21ldGhvZCA9IHdyaXRlX3BpbmdDdGxUeXBlOwogICAgICAgICp2YXJfbGVuID0gKFN0b3JhZ2VUbXAtPnBpbmdDdGxUeXBlTGVuKSAqIHNpemVvZihvaWQpOwoKICAgICAgICByZXR1cm4gKHVfY2hhciAqKSBTdG9yYWdlVG1wLT5waW5nQ3RsVHlwZTsKCiAgICBjYXNlIENPTFVNTl9QSU5HQ1RMREVTQ1I6CiAgICAgICAgKndyaXRlX21ldGhvZCA9IHdyaXRlX3BpbmdDdGxEZXNjcjsKICAgICAgICAqdmFyX2xlbiA9IChTdG9yYWdlVG1wLT5waW5nQ3RsRGVzY3JMZW4pOwoKICAgICAgICByZXR1cm4gKHVfY2hhciAqKSBTdG9yYWdlVG1wLT5waW5nQ3RsRGVzY3I7CgogICAgY2FzZSBDT0xVTU5fUElOR0NUTFNPVVJDRUFERFJFU1NUWVBFOgogICAgICAgICp3cml0ZV9tZXRob2QgPSB3cml0ZV9waW5nQ3RsU291cmNlQWRkcmVzc1R5cGU7CiAgICAgICAgKnZhcl9sZW4gPSBzaXplb2YoU3RvcmFnZVRtcC0+cGluZ0N0bFNvdXJjZUFkZHJlc3NUeXBlKTsKCiAgICAgICAgcmV0dXJuICh1X2NoYXIgKikgJiBTdG9yYWdlVG1wLT5waW5nQ3RsU291cmNlQWRkcmVzc1R5cGU7CgogICAgY2FzZSBDT0xVTU5fUElOR0NUTFNPVVJDRUFERFJFU1M6CiAgICAgICAgKndyaXRlX21ldGhvZCA9IHdyaXRlX3BpbmdDdGxTb3VyY2VBZGRyZXNzOwogICAgICAgICp2YXJfbGVuID0gKFN0b3JhZ2VUbXAtPnBpbmdDdGxTb3VyY2VBZGRyZXNzTGVuKTsKCiAgICAgICAgcmV0dXJuICh1X2NoYXIgKikgU3RvcmFnZVRtcC0+cGluZ0N0bFNvdXJjZUFkZHJlc3M7CgogICAgY2FzZSBDT0xVTU5fUElOR0NUTElGSU5ERVg6CiAgICAgICAgKndyaXRlX21ldGhvZCA9IHdyaXRlX3BpbmdDdGxJZkluZGV4OwogICAgICAgICp2YXJfbGVuID0gc2l6ZW9mKFN0b3JhZ2VUbXAtPnBpbmdDdGxJZkluZGV4KTsKCiAgICAgICAgcmV0dXJuICh1X2NoYXIgKikgJiBTdG9yYWdlVG1wLT5waW5nQ3RsSWZJbmRleDsKCiAgICBjYXNlIENPTFVNTl9QSU5HQ1RMQllQQVNTUk9VVEVUQUJMRToKICAgICAgICAqd3JpdGVfbWV0aG9kID0gd3JpdGVfcGluZ0N0bEJ5UGFzc1JvdXRlVGFibGU7CiAgICAgICAgKnZhcl9sZW4gPSBzaXplb2YoU3RvcmFnZVRtcC0+cGluZ0N0bEJ5UGFzc1JvdXRlVGFibGUpOwoKICAgICAgICByZXR1cm4gKHVfY2hhciAqKSAmIFN0b3JhZ2VUbXAtPnBpbmdDdGxCeVBhc3NSb3V0ZVRhYmxlOwoKICAgIGNhc2UgQ09MVU1OX1BJTkdDVExEU0ZJRUxEOgogICAgICAgICp3cml0ZV9tZXRob2QgPSB3cml0ZV9waW5nQ3RsRFNGaWVsZDsKICAgICAgICAqdmFyX2xlbiA9IHNpemVvZihTdG9yYWdlVG1wLT5waW5nQ3RsRFNGaWVsZCk7CgogICAgICAgIHJldHVybiAodV9jaGFyICopICYgU3RvcmFnZVRtcC0+cGluZ0N0bERTRmllbGQ7CgoKCiAgICBjYXNlIENPTFVNTl9QSU5HQ1RMUk9XU1RBVFVTOgogICAgICAgICp3cml0ZV9tZXRob2QgPSB3cml0ZV9waW5nQ3RsUm93U3RhdHVzOwogICAgICAgICp2YXJfbGVuID0gc2l6ZW9mKFN0b3JhZ2VUbXAtPnBpbmdDdGxSb3dTdGF0dXMpOwoKICAgICAgICByZXR1cm4gKHVfY2hhciAqKSAmIFN0b3JhZ2VUbXAtPnBpbmdDdGxSb3dTdGF0dXM7CgogICAgZGVmYXVsdDoKICAgICAgICBFUlJPUl9NU0coIiIpOwogICAgfQogICAgcmV0dXJuIE5VTEw7Cn0KCgp1bnNpZ25lZCBsb25nCnBpbmdQcm9iZUhpc3RvcnlUYWJsZV9jb3VudChzdHJ1Y3QgcGluZ0N0bFRhYmxlX2RhdGEgKnRoZWRhdGEpCnsKICAgIHN0cnVjdCBoZWFkZXJfY29tcGxleF9pbmRleCAqaGNpcHRyMiA9IE5VTEw7CiAgICBuZXRzbm1wX3ZhcmlhYmxlX2xpc3QgKnZhcnMgPSBOVUxMOwogICAgb2lkICAgICAgICAgICAgIG5ld29pZFtNQVhfT0lEX0xFTl07CiAgICBzaXplX3QgICAgICAgICAgbmV3b2lkX2xlbjsKICAgIHVuc2lnbmVkIGxvbmcgICBjb3VudCA9IDA7CgogICAgc25tcF92YXJsaXN0X2FkZF92YXJpYWJsZSgmdmFycywgTlVMTCwgMCwgQVNOX09DVEVUX1NUUiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhlZGF0YS0+cGluZ0N0bE93bmVySW5kZXgsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoZWRhdGEtPnBpbmdDdGxPd25lckluZGV4TGVuKTsKICAgIHNubXBfdmFybGlzdF9hZGRfdmFyaWFibGUoJnZhcnMsIE5VTEwsIDAsIEFTTl9PQ1RFVF9TVFIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoZWRhdGEtPnBpbmdDdGxUZXN0TmFtZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhlZGF0YS0+cGluZ0N0bFRlc3ROYW1lTGVuKTsKCiAgICBoZWFkZXJfY29tcGxleF9nZW5lcmF0ZV9vaWQobmV3b2lkLCAmbmV3b2lkX2xlbiwgTlVMTCwgMCwgdmFycyk7CiAgICBzbm1wX2ZyZWVfdmFyYmluZCh2YXJzKTsKCiAgICBmb3IgKGhjaXB0cjIgPSBwaW5nUHJvYmVIaXN0b3J5VGFibGVTdG9yYWdlOyBoY2lwdHIyICE9IE5VTEw7CiAgICAgICAgIGhjaXB0cjIgPSBoY2lwdHIyLT5uZXh0KSB7CiAgICAgICAgaWYgKHNubXBfb2lkX2NvbXBhcmUobmV3b2lkLCBuZXdvaWRfbGVuLCBoY2lwdHIyLT5uYW1lLCBuZXdvaWRfbGVuKQogICAgICAgICAgICA9PSAwKSB7CiAgICAgICAgICAgIGNvdW50ID0gY291bnQgKyAxOwogICAgICAgIH0KICAgIH0KICAgIHJldHVybiBjb3VudDsKfQoKCnZvaWQKcGluZ1Byb2JlSGlzdG9yeVRhYmxlX2RlbExhc3Qoc3RydWN0IHBpbmdDdGxUYWJsZV9kYXRhICp0aGVkYXRhKQp7CiAgICBzdHJ1Y3QgaGVhZGVyX2NvbXBsZXhfaW5kZXggKmhjaXB0cjIgPSBOVUxMOwogICAgc3RydWN0IGhlYWRlcl9jb21wbGV4X2luZGV4ICpoY2lsYXN0ID0gTlVMTDsKICAgIHN0cnVjdCBwaW5nUHJvYmVIaXN0b3J5VGFibGVfZGF0YSAqU3RvcmFnZVRtcCwgKlN0b3JhZ2VEZWw7CiAgICBuZXRzbm1wX3ZhcmlhYmxlX2xpc3QgKnZhcnMgPSBOVUxMOwogICAgb2lkICAgICAgICAgICAgIG5ld29pZFtNQVhfT0lEX0xFTl07CiAgICBzaXplX3QgICAgICAgICAgbmV3b2lkX2xlbjsKICAgIHRpbWVfdCAgICAgICAgICBsYXN0X3RpbWUgPSAyMTQ3NDgzNjQ3OwogICAgdGltZV90ICAgICAgICAgIHRwOwoKICAgIHNubXBfdmFybGlzdF9hZGRfdmFyaWFibGUoJnZhcnMsIE5VTEwsIDAsIEFTTl9PQ1RFVF9TVFIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoZWRhdGEtPnBpbmdDdGxPd25lckluZGV4LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGVkYXRhLT5waW5nQ3RsT3duZXJJbmRleExlbik7CiAgICBzbm1wX3Zhcmxpc3RfYWRkX3ZhcmlhYmxlKCZ2YXJzLCBOVUxMLCAwLCBBU05fT0NURVRfU1RSLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGVkYXRhLT5waW5nQ3RsVGVzdE5hbWUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoZWRhdGEtPnBpbmdDdGxUZXN0TmFtZUxlbik7CiAgICBoZWFkZXJfY29tcGxleF9nZW5lcmF0ZV9vaWQobmV3b2lkLCAmbmV3b2lkX2xlbiwgTlVMTCwgMCwgdmFycyk7CiAgICBzbm1wX2ZyZWVfdmFyYmluZCh2YXJzKTsKCiAgICBmb3IgKGhjaWxhc3QgPSBoY2lwdHIyID0gcGluZ1Byb2JlSGlzdG9yeVRhYmxlU3RvcmFnZTsgaGNpcHRyMiAhPSBOVUxMOwogICAgICAgICBoY2lwdHIyID0gaGNpcHRyMi0+bmV4dCkgewogICAgICAgIGlmIChzbm1wX29pZF9jb21wYXJlKG5ld29pZCwgbmV3b2lkX2xlbiwgaGNpcHRyMi0+bmFtZSwgbmV3b2lkX2xlbikKICAgICAgICAgICAgPT0gMCkgewoKICAgICAgICAgICAgU3RvcmFnZVRtcCA9CiAgICAgICAgICAgICAgICBoZWFkZXJfY29tcGxleF9nZXRfZnJvbV9vaWQocGluZ1Byb2JlSGlzdG9yeVRhYmxlU3RvcmFnZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoY2lwdHIyLT5uYW1lLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhjaXB0cjItPm5hbWVsZW4pOwogICAgICAgICAgICB0cCA9IFN0b3JhZ2VUbXAtPnBpbmdQcm9iZUhpc3RvcnlUaW1lX3RpbWU7CgogICAgICAgICAgICBpZiAobGFzdF90aW1lID4gdHApIHsKICAgICAgICAgICAgICAgIGxhc3RfdGltZSA9IHRwOwogICAgICAgICAgICAgICAgaGNpbGFzdCA9IGhjaXB0cjI7CiAgICAgICAgICAgIH0KCiAgICAgICAgfQogICAgfQogICAgU3RvcmFnZURlbCA9CiAgICAgICAgaGVhZGVyX2NvbXBsZXhfZXh0cmFjdF9lbnRyeSgmcGluZ1Byb2JlSGlzdG9yeVRhYmxlU3RvcmFnZSwgaGNpbGFzdCk7CiAgICBmb3IgKGhjaXB0cjIgPSBwaW5nQ3RsVGFibGVTdG9yYWdlOyBoY2lwdHIyOyBoY2lwdHIyID0gaGNpcHRyMi0+bmV4dCkgewogICAgICAgIHN0cnVjdCBwaW5nQ3RsVGFibGVfZGF0YSAqdG1wOwoKICAgICAgICB0bXAgPSBoY2lwdHIyLT5kYXRhOwogICAgICAgIGlmICh0bXAtPnBpbmdQcm9iZUhpcyA9PSBTdG9yYWdlRGVsKSB7CiAgICAgICAgICAgIHRtcC0+cGluZ1Byb2JlSGlzID0gdG1wLT5waW5nUHJvYmVIaXMtPm5leHQ7CiAgICAgICAgICAgIERFQlVHTVNHVEwoKCJwaW5nUHJvYmVIaXN0b3J5VGFibGUiLAogICAgICAgICAgICAgICAgICAgICAgICAiZGVsZXRpbmcgdGhlIGxhc3Qgb25lIHN1Y2NlZWRlZCFcbiIpKTsKICAgICAgICAgICAgYnJlYWs7CiAgICAJfQogICAgfQogICAgaWYgKFN0b3JhZ2VEZWwpIHsKICAgICAgICBmcmVlKFN0b3JhZ2VEZWwtPnBpbmdQcm9iZUhpc3RvcnlUaW1lKTsKICAgICAgICBmcmVlKFN0b3JhZ2VEZWwtPnBpbmdDdGxUZXN0TmFtZSk7CiAgICAgICAgZnJlZShTdG9yYWdlRGVsLT5waW5nQ3RsT3duZXJJbmRleCk7CiAgICAgICAgZnJlZShTdG9yYWdlRGVsKTsKICAgIH0KICAgIERFQlVHTVNHVEwoKCJwaW5nUHJvYmVIaXN0b3J5VGFibGUiLAogICAgICAgICAgICAgICAgImRlbGV0ZSB0aGUgbGFzdCBvbmUgc3VjY2VzcyFcbiIpKTsKfQoKCmNoYXIgICAgICAgICAgICoKc29ja19udG9wX2hvc3QoY29uc3Qgc3RydWN0IHNvY2thZGRyICpzYSwgc29ja2xlbl90IHNhbGVuKQp7CiAgICBzdGF0aWMgY2hhciAgICAgc3RyWzEyOF07ICAgLyogVW5peCBkb21haW4gaXMgbGFyZ2VzdCAqLwoKICAgIHN3aXRjaCAoc2EtPnNhX2ZhbWlseSkgewogICAgY2FzZSBBRl9JTkVUOnsKICAgICAgICAgICAgY29uc3Qgc3RydWN0IHNvY2thZGRyX2luICpzaW4gPSAoY29uc3Qgc3RydWN0IHNvY2thZGRyX2luICopIHNhOwoKICAgICAgICAgICAgaWYgKGluZXRfbnRvcChBRl9JTkVULCAmc2luLT5zaW5fYWRkciwgc3RyLCBzaXplb2Yoc3RyKSkgPT0KICAgICAgICAgICAgICAgIE5VTEwpCiAgICAgICAgICAgICAgICByZXR1cm4gKE5VTEwpOwogICAgICAgICAgICByZXR1cm4gKHN0cik7CiAgICAgICAgfQoKI2lmZGVmCUlQVjYKICAgIGNhc2UgQUZfSU5FVDY6ewogICAgICAgICAgICBjb25zdCBzdHJ1Y3Qgc29ja2FkZHJfaW42ICpzaW42ID0gKGNvbnN0IHN0cnVjdCBzb2NrYWRkcl9pbjYgKikgc2E7CgogICAgICAgICAgICBpZiAoaW5ldF9udG9wKEFGX0lORVQ2LCAmc2luNi0+c2luNl9hZGRyLCBzdHIsIHNpemVvZihzdHIpKSA9PQogICAgICAgICAgICAgICAgTlVMTCkKICAgICAgICAgICAgICAgIHJldHVybiAoTlVMTCk7CiAgICAgICAgICAgIHJldHVybiAoc3RyKTsKICAgICAgICB9CiNlbmRpZgoKI2lmZGVmCUFGX1VOSVgKICAgIGNhc2UgQUZfVU5JWDp7CiAgICAgICAgICAgIGNvbnN0IHN0cnVjdCBzb2NrYWRkcl91biAqdW5wID0gKGNvbnN0IHN0cnVjdCBzb2NrYWRkcl91biAqKSBzYTsKCiAgICAgICAgICAgIC8qCiAgICAgICAgICAgICAqIE9LIHRvIGhhdmUgbm8gcGF0aG5hbWUgYm91bmQgdG8gdGhlIHNvY2tldDogaGFwcGVucyBvbgogICAgICAgICAgICAgKiBldmVyeSBjb25uZWN0KCkgdW5sZXNzIGNsaWVudCBjYWxscyBiaW5kKCkgZmlyc3QuIAogICAgICAgICAgICAgKi8KICAgICAgICAgICAgaWYgKHVucC0+c3VuX3BhdGhbMF0gPT0gMCkKICAgICAgICAgICAgICAgIHN0cmNweShzdHIsICIobm8gcGF0aG5hbWUgYm91bmQpIik7CiAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgICAgIHNucHJpbnRmKHN0ciwgc2l6ZW9mKHN0ciksICIlcyIsIHVucC0+c3VuX3BhdGgpOwogICAgICAgICAgICByZXR1cm4gKHN0cik7CiAgICAgICAgfQojZW5kaWYKCiNpZmRlZglIQVZFX1NPQ0tBRERSX0RMX1NUUlVDVAogICAgY2FzZSBBRl9MSU5LOnsKICAgICAgICAgICAgc3RydWN0IHNvY2thZGRyX2RsICpzZGwgPSAoc3RydWN0IHNvY2thZGRyX2RsICopIHNhOwoKICAgICAgICAgICAgaWYgKHNkbC0+c2RsX25sZW4gPiAwKQogICAgICAgICAgICAgICAgc25wcmludGYoc3RyLCBzaXplb2Yoc3RyKSwgIiUqcyIsCiAgICAgICAgICAgICAgICAgICAgICAgICBzZGwtPnNkbF9ubGVuLCAmc2RsLT5zZGxfZGF0YVswXSk7CiAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgICAgIHNucHJpbnRmKHN0ciwgc2l6ZW9mKHN0ciksICJBRl9MSU5LLCBpbmRleD0lZCIsCiAgICAgICAgICAgICAgICAgICAgICAgICBzZGwtPnNkbF9pbmRleCk7CiAgICAgICAgICAgIHJldHVybiAoc3RyKTsKICAgICAgICB9CiNlbmRpZgogICAgZGVmYXVsdDoKICAgICAgICBzbnByaW50ZihzdHIsIHNpemVvZihzdHIpLAogICAgICAgICAgICAgICAgICJzb2NrX250b3BfaG9zdDogdW5rbm93biBBRl94eHg6ICVkLCBsZW4gJWQiLAogICAgICAgICAgICAgICAgIHNhLT5zYV9mYW1pbHksIHNhbGVuKTsKICAgICAgICByZXR1cm4gKHN0cik7CiAgICB9CiAgICByZXR1cm4gKE5VTEwpOwp9CgoKY2hhciAgICAgICAgICAgKgpTb2NrX250b3BfaG9zdChjb25zdCBzdHJ1Y3Qgc29ja2FkZHIgKnNhLCBzb2NrbGVuX3Qgc2FsZW4pCnsKICAgIGNoYXIgICAgICAgICAgICpwdHI7CgogICAgaWYgKChwdHIgPSBzb2NrX250b3BfaG9zdChzYSwgc2FsZW4pKSA9PSBOVUxMKSB7CiAgICAgICAgLyogaW5ldF9udG9wKCkgc2V0cyBlcnJubyAqLwogICAgICAgIHNubXBfbG9nX3BlcnJvcigicGluZ0N0bFRhYmxlOiBzb2NrX250b3BfaG9zdCgpIik7CiAgICB9CiAgICByZXR1cm4gKHB0cik7Cn0KCgoKdW5zaWduZWQgc2hvcnQKaW5fY2tzdW0odW5zaWduZWQgc2hvcnQgKmFkZHIsIGludCBsZW4pCnsKICAgIGludCAgICAgICAgICAgICBubGVmdCA9IGxlbjsKICAgIGludCAgICAgICAgICAgICBzdW0gPSAwOwogICAgdW5zaWduZWQgc2hvcnQgKncgPSBhZGRyOwogICAgdW5zaWduZWQgc2hvcnQgIGFuc3dlciA9IDA7CgogICAgLyoKICAgICAqIE91ciBhbGdvcml0aG0gaXMgc2ltcGxlLCB1c2luZyBhIDMyIGJpdCBhY2N1bXVsYXRvciAoc3VtKSwgd2UgYWRkCiAgICAgKiBzZXF1ZW50aWFsIDE2IGJpdCB3b3JkcyB0byBpdCwgYW5kIGF0IHRoZSBlbmQsIGZvbGQgYmFjayBhbGwgdGhlCiAgICAgKiBjYXJyeSBiaXRzIGZyb20gdGhlIHRvcCAxNiBiaXRzIGludG8gdGhlIGxvd2VyIDE2IGJpdHMuCiAgICAgKi8KICAgIHdoaWxlIChubGVmdCA+IDEpIHsKICAgICAgICBzdW0gKz0gKncrKzsKICAgICAgICBubGVmdCAtPSAyOwogICAgfQoKICAgIC8qCiAgICAgKiA0bW9wIHVwIGFuIG9kZCBieXRlLCBpZiBuZWNlc3NhcnkgCiAgICAgKi8KICAgIGlmIChubGVmdCA9PSAxKSB7CiAgICAgICAgKih1bnNpZ25lZCBjaGFyICopICgmYW5zd2VyKSA9ICoodW5zaWduZWQgY2hhciAqKSB3OwogICAgICAgIHN1bSArPSBhbnN3ZXI7CiAgICB9CgogICAgLyoKICAgICAqIDRhZGQgYmFjayBjYXJyeSBvdXRzIGZyb20gdG9wIDE2IGJpdHMgdG8gbG93IDE2IGJpdHMgCiAgICAgKi8KICAgIHN1bSA9IChzdW0gPj4gMTYpICsgKHN1bSAmIDB4ZmZmZik7IC8qIGFkZCBoaSAxNiB0byBsb3cgMTYgKi8KICAgIHN1bSArPSAoc3VtID4+IDE2KTsgICAgICAgICAvKiBhZGQgY2FycnkgKi8KICAgIGFuc3dlciA9IH5zdW07ICAgICAgICAgICAgICAvKiB0cnVuY2F0ZSB0byAxNiBiaXRzICovCiAgICByZXR1cm4gKGFuc3dlcik7Cn0KCgpzdHJ1Y3QgYWRkcmluZm8gKgpob3N0X3NlcnYoY29uc3QgY2hhciAqaG9zdCwgY29uc3QgY2hhciAqc2VydiwgaW50IGZhbWlseSwgaW50IHNvY2t0eXBlKQp7CiAgICBpbnQgICAgICAgICAgICAgbjsKICAgIHN0cnVjdCBhZGRyaW5mbyBoaW50cywgKnJlczsKCiAgICBtZW1zZXQoJmhpbnRzLCAnXDAnLCBzaXplb2Yoc3RydWN0IGFkZHJpbmZvKSk7CiAgICBoaW50cy5haV9mbGFncyA9IEFJX0NBTk9OTkFNRTsgICAgICAvKiBhbHdheXMgcmV0dXJuIGNhbm9uaWNhbCBuYW1lICovCiAgICBoaW50cy5haV9mYW1pbHkgPSBmYW1pbHk7ICAgLyogQUZfVU5TUEVDLCBBRl9JTkVULCBBRl9JTkVUNiwgZXRjLiAqLwogICAgaGludHMuYWlfc29ja3R5cGUgPSBzb2NrdHlwZTsgICAgICAgLyogMCwgU09DS19TVFJFQU0sIFNPQ0tfREdSQU0sIGV0Yy4gKi8KCiAgICBpZiAoKG4gPSBuZXRzbm1wX2dldGFkZHJpbmZvKGhvc3QsIHNlcnYsICZoaW50cywgJnJlcykpICE9IDApCiAgICAgICAgcmV0dXJuIChOVUxMKTsKCiAgICByZXR1cm4gKHJlcyk7ICAgICAgICAgICAgICAgLyogcmV0dXJuIHBvaW50ZXIgdG8gZmlyc3Qgb24gbGlua2VkIGxpc3QgKi8KfQoKLyoKICogZW5kIGhvc3Rfc2VydiAKICovCgovKgogKiBUaGVyZSBpcyBubyBlYXN5IHdheSB0byBwYXNzIGJhY2sgdGhlIGludGVnZXIgcmV0dXJuIGNvZGUgZnJvbQogKiBnZXRhZGRyaW5mbygpIGluIHRoZSBmdW5jdGlvbiBhYm92ZSwgc2hvcnQgb2YgYWRkaW5nIGFub3RoZXIgYXJndW1lbnQKICogdGhhdCBpcyBhIHBvaW50ZXIsIHNvIHRoZSBlYXNpZXN0IHdheSB0byBwcm92aWRlIHRoZSB3cmFwcGVyIGZ1bmN0aW9uCiAqIGlzIGp1c3QgdG8gZHVwbGljYXRlIHRoZSBzaW1wbGUgZnVuY3Rpb24gYXMgd2UgZG8gaGVyZS4KICovCgpzdHJ1Y3QgYWRkcmluZm8gKgpIb3N0X3NlcnYoY29uc3QgY2hhciAqaG9zdCwgY29uc3QgY2hhciAqc2VydiwgaW50IGZhbWlseSwgaW50IHNvY2t0eXBlKQp7CiAgICBpbnQgICAgICAgICAgICAgbjsKICAgIHN0cnVjdCBhZGRyaW5mbyBoaW50cywgKnJlczsKCiAgICBtZW1zZXQoJmhpbnRzLCAnXDAnLCBzaXplb2Yoc3RydWN0IGFkZHJpbmZvKSk7CiAgICBoaW50cy5haV9mbGFncyA9IEFJX0NBTk9OTkFNRTsgICAgICAvKiBhbHdheXMgcmV0dXJuIGNhbm9uaWNhbCBuYW1lICovCiAgICBoaW50cy5haV9mYW1pbHkgPSBmYW1pbHk7ICAgLyogMCwgQUZfSU5FVCwgQUZfSU5FVDYsIGV0Yy4gKi8KICAgIGhpbnRzLmFpX3NvY2t0eXBlID0gc29ja3R5cGU7ICAgICAgIC8qIDAsIFNPQ0tfU1RSRUFNLCBTT0NLX0RHUkFNLCBldGMuICovCgogICAgaWYgKChuID0gbmV0c25tcF9nZXRhZGRyaW5mbyhob3N0LCBzZXJ2LCAmaGludHMsICZyZXMpKSAhPSAwKSB7CiNpZiBIQVZFX0dBSV9TVFJFUlJPUgogICAgICAgIHNubXBfbG9nKExPR19FUlIsICJob3N0X3NlcnYgZXJyb3IgZm9yICVzLCAlczogJXMiLAogICAgICAgICAgICAgICAgIChob3N0ID09IE5VTEwpID8gIihubyBob3N0bmFtZSkiIDogaG9zdCwKICAgICAgICAgICAgICAgICAoc2VydiA9PSBOVUxMKSA/ICIobm8gc2VydmljZSBuYW1lKSIgOiBzZXJ2LAogICAgICAgICAgICAgICAgIGdhaV9zdHJlcnJvcihuKSk7CiNlbHNlCiAgICAgICAgc25tcF9sb2coTE9HX0VSUiwgImhvc3Rfc2VydiBlcnJvciBmb3IgJXMsICVzIiwKICAgICAgICAgICAgICAgICAoaG9zdCA9PSBOVUxMKSA/ICIobm8gaG9zdG5hbWUpIiA6IGhvc3QsCiAgICAgICAgICAgICAgICAgKHNlcnYgPT0gTlVMTCkgPyAiKG5vIHNlcnZpY2UgbmFtZSkiIDogc2Vydik7CiNlbmRpZgogICAgfQoKICAgIHJldHVybiAocmVzKTsgICAgICAgICAgICAgICAvKiByZXR1cm4gcG9pbnRlciB0byBmaXJzdCBvbiBsaW5rZWQgbGlzdCAqLwp9CgppbnQKcmVhZGFibGVfdGltZW8oaW50IGZkLCBpbnQgc2VjKQp7CiAgICBmZF9zZXQgICAgICAgICAgcnNldDsKICAgIHN0cnVjdCB0aW1ldmFsICB0djsKICAgIEZEX1pFUk8oJnJzZXQpOwogICAgRkRfU0VUKGZkLCAmcnNldCk7CiAgICB0di50dl9zZWMgPSBzZWM7CiAgICB0di50dl91c2VjID0gMDsKICAgIHJldHVybiAoc2VsZWN0KGZkICsgMSwgJnJzZXQsIE5VTEwsIE5VTEwsICZ0dikpOwoKfQoKLyoKICogc2VuZCB0cmFwIAogKi8Kdm9pZApzZW5kX3BpbmdfdHJhcChzdHJ1Y3QgcGluZ0N0bFRhYmxlX2RhdGEgKml0ZW0sCiAgICAgICAgICAgICAgIG9pZCAqIHRyYXBfb2lkLCBzaXplX3QgdHJhcF9vaWRfbGVuKQp7CiAgICBzdGF0aWMgb2lkICAgICAgb2JqaWRfc25tcHRyYXBbXSA9IHsgMSwgMywgNiwgMSwgNiwgMywgMSwgMSwgNCwgMSwgMCB9OyAgICAgLyogc25tcFRyYXBJT0QuMCAqLwogICAgc3RydWN0IHBpbmdSZXN1bHRzVGFibGVfZGF0YSAqU3RvcmFnZVRtcCA9IE5VTEw7CiAgICBuZXRzbm1wX3ZhcmlhYmxlX2xpc3QgKnZhcl9saXN0ID0gTlVMTCwgKnZhcnMgPSBOVUxMOwogICAgb2lkICAgICAgICAgICAgIG5ld29pZFtNQVhfT0lEX0xFTl07CiAgICBzaXplX3QgICAgICAgICAgbmV3b2lkX2xlbjsKCiAgICBvaWQgICAgICAgICAgICAgcGluZ0N0bFRhcmdldEFkZHJlc3NbXSA9CiAgICAgICAgeyAxLCAzLCA2LCAxLCAyLCAxLCA4MCwgMSwgMiwgMSwgNCB9OwogICAgb2lkICAgICAgICAgICAgIHBpbmdSZXN1bHRzTWluUnR0W10gPQogICAgICAgIHsgMSwgMywgNiwgMSwgMiwgMSwgODAsIDEsIDMsIDEsIDQgfTsKICAgIG9pZCAgICAgICAgICAgICBwaW5nUmVzdWx0c01heFJ0dFtdID0KICAgICAgICB7IDEsIDMsIDYsIDEsIDIsIDEsIDgwLCAxLCAzLCAxLCA1IH07CiAgICBvaWQgICAgICAgICAgICAgcGluZ1Jlc3VsdHNBdmVyYWdlUnR0W10gPQogICAgICAgIHsgMSwgMywgNiwgMSwgMiwgMSwgODAsIDEsIDMsIDEsIDYgfTsKICAgIG9pZCAgICAgICAgICAgICBwaW5nUmVzdWx0c1Byb2JlUmVzcG9uc2VzW10gPQogICAgICAgIHsgMSwgMywgNiwgMSwgMiwgMSwgODAsIDEsIDMsIDEsIDcgfTsKICAgIG9pZCAgICAgICAgICAgICBwaW5nUmVzdWx0c1NlbmRQcm9iZXNbXSA9CiAgICAgICAgeyAxLCAzLCA2LCAxLCAyLCAxLCA4MCwgMSwgMywgMSwgOCB9OwoKICAgIHNubXBfdmFybGlzdF9hZGRfdmFyaWFibGUoJnZhcnMsIE5VTEwsIDAsIEFTTl9PQ1RFVF9TVFIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGl0ZW0tPnBpbmdDdGxPd25lckluZGV4LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpdGVtLT5waW5nQ3RsT3duZXJJbmRleExlbik7CiAgICBzbm1wX3Zhcmxpc3RfYWRkX3ZhcmlhYmxlKCZ2YXJzLCBOVUxMLCAwLCBBU05fT0NURVRfU1RSLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpdGVtLT5waW5nQ3RsVGVzdE5hbWUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGl0ZW0tPnBpbmdDdGxUZXN0TmFtZUxlbik7CiAgICBTdG9yYWdlVG1wID0gaGVhZGVyX2NvbXBsZXhfZ2V0KHBpbmdSZXN1bHRzVGFibGVTdG9yYWdlLCB2YXJzKTsKICAgIHNubXBfZnJlZV92YXJiaW5kKHZhcnMpOwogICAgaWYgKCFTdG9yYWdlVG1wKQogICAgICAgIHJldHVybjsKCiAgICAvKgogICAgICogc25tcFRyYXAgb2lkIAogICAgICovCiAgICBzbm1wX3Zhcmxpc3RfYWRkX3ZhcmlhYmxlKCZ2YXJfbGlzdCwgb2JqaWRfc25tcHRyYXAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZihvYmppZF9zbm1wdHJhcCkgLyBzaXplb2Yob2lkKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVNOX09CSkVDVF9JRCwgKHVfY2hhciAqKSB0cmFwX29pZCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJhcF9vaWRfbGVuICogc2l6ZW9mKG9pZCkpOwogICAgLyoKICAgICAqIHBpbmdDdGxUYXJnZXRBZGRyZXNzIAogICAgICovCiAgICBtZW1zZXQobmV3b2lkLCAnXDAnLCBNQVhfT0lEX0xFTiAqIHNpemVvZihvaWQpKTsKICAgIGhlYWRlcl9jb21wbGV4X2dlbmVyYXRlX29pZChuZXdvaWQsICZuZXdvaWRfbGVuLCBwaW5nQ3RsVGFyZ2V0QWRkcmVzcywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2YocGluZ0N0bFRhcmdldEFkZHJlc3MpIC8gc2l6ZW9mKG9pZCksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFycyk7CgogICAgc25tcF92YXJsaXN0X2FkZF92YXJpYWJsZSgmdmFyX2xpc3QsIG5ld29pZCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3b2lkX2xlbiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVNOX09DVEVUX1NUUiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHVfY2hhciAqKSBpdGVtLT5waW5nQ3RsVGFyZ2V0QWRkcmVzcywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXRlbS0+cGluZ0N0bFRhcmdldEFkZHJlc3NMZW4pOwoKICAgIC8qCiAgICAgKiBwaW5nUmVzdWx0c01pblJ0dAogICAgICovCiAgICBtZW1zZXQobmV3b2lkLCAnXDAnLCBuZXdvaWRfbGVuKTsKICAgIGhlYWRlcl9jb21wbGV4X2dlbmVyYXRlX29pZChuZXdvaWQsICZuZXdvaWRfbGVuLCBwaW5nUmVzdWx0c01pblJ0dCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2YocGluZ1Jlc3VsdHNNaW5SdHQpIC8gc2l6ZW9mKG9pZCksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFycyk7CgogICAgc25tcF92YXJsaXN0X2FkZF92YXJpYWJsZSgmdmFyX2xpc3QsIG5ld29pZCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3b2lkX2xlbiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVNOX1VOU0lHTkVELAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodV9jaGFyICopICYgKFN0b3JhZ2VUbXAtPnBpbmdSZXN1bHRzTWluUnR0KSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKFN0b3JhZ2VUbXAtPnBpbmdSZXN1bHRzTWluUnR0KSk7CiAgICAvKgogICAgICogcGluZ1Jlc3VsdHNNYXhSdHQgCiAgICAgKi8KICAgIG1lbXNldChuZXdvaWQsICdcMCcsIG5ld29pZF9sZW4pOwogICAgaGVhZGVyX2NvbXBsZXhfZ2VuZXJhdGVfb2lkKG5ld29pZCwgJm5ld29pZF9sZW4sIHBpbmdSZXN1bHRzTWF4UnR0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZihwaW5nUmVzdWx0c01heFJ0dCkgLyBzaXplb2Yob2lkKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXJzKTsKCiAgICBzbm1wX3Zhcmxpc3RfYWRkX3ZhcmlhYmxlKCZ2YXJfbGlzdCwgbmV3b2lkLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXdvaWRfbGVuLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBU05fVU5TSUdORUQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh1X2NoYXIgKikgJiAoU3RvcmFnZVRtcC0+cGluZ1Jlc3VsdHNNYXhSdHQpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2YoU3RvcmFnZVRtcC0+cGluZ1Jlc3VsdHNNYXhSdHQpKTsKCiAgICAvKgogICAgICogcGluZ1Jlc3VsdHNBdmVyYWdlUnR0IAogICAgICovCiAgICBtZW1zZXQobmV3b2lkLCAnXDAnLCBuZXdvaWRfbGVuKTsKICAgIGhlYWRlcl9jb21wbGV4X2dlbmVyYXRlX29pZChuZXdvaWQsICZuZXdvaWRfbGVuLCBwaW5nUmVzdWx0c0F2ZXJhZ2VSdHQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKHBpbmdSZXN1bHRzQXZlcmFnZVJ0dCkgLwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZihvaWQpLCB2YXJzKTsKCiAgICBzbm1wX3Zhcmxpc3RfYWRkX3ZhcmlhYmxlKCZ2YXJfbGlzdCwgbmV3b2lkLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXdvaWRfbGVuLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBU05fVU5TSUdORUQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh1X2NoYXIgKikgJiAoU3RvcmFnZVRtcC0+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGluZ1Jlc3VsdHNBdmVyYWdlUnR0KSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKFN0b3JhZ2VUbXAtPnBpbmdSZXN1bHRzQXZlcmFnZVJ0dCkpOwoKICAgIC8qCiAgICAgKiBwaW5nUmVzdWx0c1Byb2JlUmVzcG9uc2VzIAogICAgICovCiAgICBtZW1zZXQobmV3b2lkLCAnXDAnLCBuZXdvaWRfbGVuKTsKICAgIGhlYWRlcl9jb21wbGV4X2dlbmVyYXRlX29pZChuZXdvaWQsICZuZXdvaWRfbGVuLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBpbmdSZXN1bHRzUHJvYmVSZXNwb25zZXMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKHBpbmdSZXN1bHRzUHJvYmVSZXNwb25zZXMpIC8KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2Yob2lkKSwgdmFycyk7CgogICAgc25tcF92YXJsaXN0X2FkZF92YXJpYWJsZSgmdmFyX2xpc3QsIG5ld29pZCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3b2lkX2xlbiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVNOX1VOU0lHTkVELAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodV9jaGFyICopICYgKFN0b3JhZ2VUbXAtPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBpbmdSZXN1bHRzUHJvYmVSZXNwb25zZXMpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2YoU3RvcmFnZVRtcC0+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwaW5nUmVzdWx0c1Byb2JlUmVzcG9uc2VzKSk7CiAgICAvKgogICAgICogcGluZ1Jlc3VsdHNTZW5kUHJvYmVzIAogICAgICovCiAgICBtZW1zZXQobmV3b2lkLCAnXDAnLCBuZXdvaWRfbGVuKTsKICAgIGhlYWRlcl9jb21wbGV4X2dlbmVyYXRlX29pZChuZXdvaWQsICZuZXdvaWRfbGVuLCBwaW5nUmVzdWx0c1NlbmRQcm9iZXMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKHBpbmdSZXN1bHRzU2VuZFByb2JlcykgLwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZihvaWQpLCB2YXJzKTsKCiAgICBzbm1wX3Zhcmxpc3RfYWRkX3ZhcmlhYmxlKCZ2YXJfbGlzdCwgbmV3b2lkLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXdvaWRfbGVuLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBU05fVU5TSUdORUQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh1X2NoYXIgKikgJiAoU3RvcmFnZVRtcC0+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGluZ1Jlc3VsdHNTZW5kUHJvYmVzKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKFN0b3JhZ2VUbXAtPnBpbmdSZXN1bHRzU2VuZFByb2JlcykpOwoKICAgIC8qCiAgICAgKiBYWFg6IHN0dWZmIGJhc2VkIG9uIGV2ZW50IHRhYmxlIAogICAgICovCgogICAgREVCVUdNU0coKCJwaW5nVGVzdDpzZW5kX3BpbmdfdHJhcCIsICJzdWNjZXNzIVxuIikpOwoKICAgIHNlbmRfdjJ0cmFwKHZhcl9saXN0KTsKICAgIHNubXBfZnJlZV92YXJiaW5kKHZhcnMpOwogICAgdmFycyA9IE5VTEw7CiAgICBzbm1wX2ZyZWVfdmFyYmluZCh2YXJfbGlzdCk7CiAgICB2YXJzID0gTlVMTDsKfQoKCgp2b2lkCnJlYWRsb29wKHN0cnVjdCBwaW5nQ3RsVGFibGVfZGF0YSAqaXRlbSwgc3RydWN0IGFkZHJpbmZvICphaSwgaW50IGRhdGFsZW4sCiAgICAgICAgIHVuc2lnbmVkIGxvbmcgKm1pbnJ0dCwgdW5zaWduZWQgbG9uZyAqbWF4cnR0LAogICAgICAgICB1bnNpZ25lZCBsb25nICphdmVyYWdlcnR0LCBwaWRfdCBwaWQpCnsKICAgIGNoYXIgICAgICAgICAgICByZWN2YnVmW0JVRlNJWkVdOwogICAgY2hhciAgICAgICAgICAgIHNlbmRidWZbQlVGU0laRV07CiAgICBpbnQgICAgICAgICAgICAgbnNlbnQgPSAxOwogICAgc29ja2xlbl90ICAgICAgIGxlbjsKICAgIHNzaXplX3QgICAgICAgICBuOwogICAgc3RydWN0IHRpbWV2YWwgIHR2YWw7CiAgICAvKiBzdGF0aWMgaW50ICAgICAgICAgICAgICAgICAgICBsb29wX251bTsgKi8KICAgIC8qIHN0cnVjdCBwaW5nUHJvYmVIaXN0b3J5VGFibGVfZGF0YSAqIGN1cnJlbnQ9TlVMTDsgKi8KICAgIHN0cnVjdCBwaW5nUHJvYmVIaXN0b3J5VGFibGVfZGF0YSBjdXJyZW50X3ZhcjsKICAgIGludCAgICAgICAgICAgICBzb2NrZmQ7CiAgICBpbnQgICAgICAgICAgICAgc2VsZWN0X3Jlc3VsdDsKICAgIGludCAgICAgICAgICAgICBjdXJyZW50X3Byb2JlX3RlbXA7CiAgICBpbnQgICAgICAgICAgICAgc3VjY2Vzc19wcm9iZSA9IDA7CiAgICBpbnQgICAgICAgICAgICAgZmFpbF9wcm9iZSA9IDA7CiAgICBpbnQgICAgICAgICAgICAgZmxhZzsKICAgIHVuc2lnbmVkIGxvbmcgICBzdW1ydHQ7CiAgICBzdHJ1Y3QgdGltZXZhbCAgdHY7CgogICAgbWVtc2V0KHNlbmRidWYsIDAsIHNpemVvZihzZW5kYnVmKSk7CgogICAgc29ja2ZkID0gc29ja2V0KHByLT5zYXNlbmQtPnNhX2ZhbWlseSwgU09DS19SQVcsIHByLT5pY21wcHJvdG8pOwogICAgaWYgKHNvY2tmZCA8IDApIHsKCXNubXBfbG9nX3BlcnJvcigicGluZ0N0bFRhYmxlOiBmYWlsZWQgdG8gY3JlYXRlIHNvY2tldCIpOwoJcmV0dXJuOwogICAgfQogICAgc2V0dWlkKGdldHVpZCgpKTsgICAgICAgICAgIC8qIGRvbid0IG5lZWQgc3BlY2lhbCBwZXJtaXNzaW9ucyBhbnkgbW9yZSAqLwoKICAgIHR2LnR2X3NlYyA9IDU7CiAgICB0di50dl91c2VjID0gMDsKICAgIHNldHNvY2tvcHQoc29ja2ZkLCBTT0xfU09DS0VULCBTT19SQ1ZUSU1FTywgJnR2LCBzaXplb2YodHYpKTsKCiAgICBmb3IgKGN1cnJlbnRfcHJvYmVfdGVtcCA9IDE7CiAgICAgICAgIGN1cnJlbnRfcHJvYmVfdGVtcCA8PSBpdGVtLT5waW5nQ3RsUHJvYmVDb3VudDsKICAgICAgICAgY3VycmVudF9wcm9iZV90ZW1wKyspIHsKICAgICAgICB0aW1lX3QgICAgICAgICAgdGltZXA7CiAgICAgICAgKCpwci0+ZnNlbmQpIChkYXRhbGVuLCBwaWQsIG5zZW50LCBzb2NrZmQsIHNlbmRidWYpOwogICAgICAgIG5zZW50Kys7CiAgICAgICAgbGVuID0gcHItPnNhbGVuOwogICAgICAgIHNlbGVjdF9yZXN1bHQgPSByZWFkYWJsZV90aW1lbyhzb2NrZmQsIGl0ZW0tPnBpbmdDdGxUaW1lT3V0KTsKICAgICAgICBkbyB7CiAgICAgICAgICAgIGlmIChzZWxlY3RfcmVzdWx0ID09IDApIHsKICAgICAgICAgICAgICAgIERFQlVHTVNHVEwoKCJwaW5nQ3RsVGFibGUiLCAic29ja2V0IHRpbWVvdXRcbiIpKTsKICAgICAgICAgICAgICAgIG4gPSAtMTsKICAgICAgICAgICAgICAgIGZhaWxfcHJvYmUgPSBmYWlsX3Byb2JlICsgMTsKICAgICAgICAgICAgICAgIGZsYWcgPSAxOwogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgbiA9IHJlY3Zmcm9tKHNvY2tmZCwgcmVjdmJ1Ziwgc2l6ZW9mKHJlY3ZidWYpLCAwLCBwci0+c2FyZWN2LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICZsZW4pOwogICAgICAgICAgICAgICAgc3VjY2Vzc19wcm9iZSA9IHN1Y2Nlc3NfcHJvYmUgKyAxOwogICAgICAgICAgICAgICAgZmxhZyA9IDA7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIG5ldHNubXBfZ2V0X21vbm90b25pY19jbG9jaygmdHZhbCk7CgogICAgICAgICAgICB0aW1lKCZ0aW1lcCk7CgogICAgICAgICAgICAoKnByLT5mcHJvYykgKHJlY3ZidWYsIG4sICZ0dmFsLCB0aW1lcCwgaXRlbSwgYWksIGRhdGFsZW4sIG1pbnJ0dCwKICAgICAgICAgICAgICAgICAgICAgICAgICBtYXhydHQsICZzdW1ydHQsIGF2ZXJhZ2VydHQsIGN1cnJlbnRfcHJvYmVfdGVtcCwKICAgICAgICAgICAgICAgICAgICAgICAgICBzdWNjZXNzX3Byb2JlLCBmYWlsX3Byb2JlLCBmbGFnLCAmY3VycmVudF92YXIsIHBpZCk7CiAgICAgICAgICAgIHNlbGVjdF9yZXN1bHQgPSByZWFkYWJsZV90aW1lbyhzb2NrZmQsIDApOwogICAgICAgIH0gd2hpbGUgKHNlbGVjdF9yZXN1bHQgPiAwKTsKICAgIH0KICAgIGNsb3NlKHNvY2tmZCk7Cn0KCnVuc2lnbmVkIGxvbmcKcm91bmRfZG91YmxlKGRvdWJsZSBudW1iZXIpCnsKICAgIHVuc2lnbmVkIGxvbmcgICByZXRfbnVtID0gMDsKICAgIGlmIChudW1iZXIgLSAodW5zaWduZWQgbG9uZykgbnVtYmVyIDwgMC41KQogICAgICAgIHJldF9udW0gPSAodW5zaWduZWQgbG9uZykgbnVtYmVyOwogICAgZWxzZQogICAgICAgIHJldF9udW0gPSAodW5zaWduZWQgbG9uZykgbnVtYmVyICsgMTsKICAgIHJldHVybiByZXRfbnVtOwp9CgppbnQKcHJvY192NChjaGFyICpwdHIsIHNzaXplX3QgbGVuLCBzdHJ1Y3QgdGltZXZhbCAqdHZyZWN2LCB0aW1lX3QgdGltZXAsCiAgICAgICAgc3RydWN0IHBpbmdDdGxUYWJsZV9kYXRhICppdGVtLCBzdHJ1Y3QgYWRkcmluZm8gKmFpLCBpbnQgZGF0YWxlbiwKICAgICAgICB1bnNpZ25lZCBsb25nICptaW5ydHQsIHVuc2lnbmVkIGxvbmcgKm1heHJ0dCwKICAgICAgICB1bnNpZ25lZCBsb25nICpzdW1ydHQsIHVuc2lnbmVkIGxvbmcgKmF2ZXJhZ2VydHQsCiAgICAgICAgdW5zaWduZWQgbG9uZyBjdXJyZW50X3Byb2JlLCBpbnQgc3VjY2Vzc19wcm9iZSwgaW50IGZhaWxfcHJvYmUsCiAgICAgICAgaW50IGZsYWcsIHN0cnVjdCBwaW5nUHJvYmVIaXN0b3J5VGFibGVfZGF0YSAqY3VycmVudF90ZW1wLAogICAgICAgIHBpZF90IHBpZCkKewogICAgaW50ICAgICAgICAgICAgIGhsZW4xID0gMCwgaWNtcGxlbiA9IDA7CiAgICB1bnNpZ25lZCBsb25nICAgcnR0ID0gMDsKCiAgICBzdHJ1Y3QgaXAgICAgICAqaXAgPSBOVUxMOwogICAgc3RydWN0IGljbXAgICAgKmljbXAgPSBOVUxMOwogICAgc3RydWN0IHRpbWV2YWwgKnR2c2VuZCA9IE5VTEw7CiAgICBzdHJ1Y3QgcGluZ1Byb2JlSGlzdG9yeVRhYmxlX2RhdGEgKnRlbXAgPSBOVUxMOwogICAgc3RhdGljIGludCAgICAgIHByb2JlRmFpbGVkID0gMDsKICAgIHN0YXRpYyBpbnQgICAgICB0ZXN0RmFpbGVkID0gMDsKICAgIHN0YXRpYyBpbnQgICAgICBzZXJpZXMgPSAwOwogICAgbmV0c25tcF92YXJpYWJsZV9saXN0ICp2YXJzID0gTlVMTDsKICAgIHN0cnVjdCBwaW5nUmVzdWx0c1RhYmxlX2RhdGEgKlN0b3JhZ2VOZXcgPSBOVUxMOwoKICAgIERFQlVHTVNHVEwoKCJwaW5nQ3RsVGFibGUiLCAicHJvY192NChmbGFnID0gJWQpXG4iLCBmbGFnKSk7CgogICAgaWYgKGZsYWcgPT0gMCkgewogICAgICAgIHNlcmllcyA9IDA7CiAgICAgICAgaXAgPSAoc3RydWN0IGlwICopIHB0cjsgLyogc3RhcnQgb2YgSVAgaGVhZGVyICovCiAgICAgICAgaGxlbjEgPSBpcC0+aXBfaGwgPDwgMjsgLyogbGVuZ3RoIG9mIElQIGhlYWRlciAqLwoKICAgICAgICBpY21wID0gKHN0cnVjdCBpY21wICopIChwdHIgKyBobGVuMSk7ICAgLyogc3RhcnQgb2YgSUNNUCBoZWFkZXIgKi8KICAgICAgICBpZiAoKGljbXBsZW4gPSBsZW4gLSBobGVuMSkgPCA4KQogICAgICAgICAgICBERUJVR01TR1RMKCgicGluZ0N0bFRhYmxlIiwgImljbXBsZW4gKCVkKSA8IDgiLCBpY21wbGVuKSk7CgogICAgICAgIERFQlVHTVNHVEwoKCJwaW5nQ3RsVGFibGUiLCAiSUNNUCB0eXBlID0gJWQgKCVzYSByZXBseSlcbiIsCiAgICAgICAgICAgICAgICAgICAgaWNtcC0+aWNtcF90eXBlLAogICAgICAgICAgICAgICAgICAgIGljbXAtPmljbXBfdHlwZSA9PSBJQ01QX0VDSE9SRVBMWSA/ICIiIDogIm5vdCBhICIpKTsKCiAgICAgICAgaWYgKGljbXAtPmljbXBfdHlwZSA9PSBJQ01QX0VDSE9SRVBMWSkgewogICAgICAgICAgICBpZiAoaWNtcC0+aWNtcF9pZCAhPSBwaWQpIHsKICAgICAgICAgICAgICAgIERFQlVHTVNHVEwoKCJwaW5nQ3RsVGFibGUiLCAibm90IGEgcmVzcG9uc2UgdG8gb3VyIEVDSE9fUkVRVUVTVFxuIikpOwogICAgICAgICAgICAgICAgcmV0dXJuIFNOTVBfRVJSX05PRVJST1I7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGlmIChpY21wbGVuIDwgMTYpCiAgICAgICAgICAgICAgICBERUJVR01TR1RMKCgicGluZ0N0bFRhYmxlIiwgImljbXBsZW4gKCVkKSA8IDE2IiwgaWNtcGxlbikpOwoKICAgICAgICAgICAgdHZzZW5kID0gKHN0cnVjdCB0aW1ldmFsICopIGljbXAtPmljbXBfZGF0YTsKCiAgICAgICAgICAgIHJ0dCA9CiAgICAgICAgICAgICAgICByb3VuZF9kb3VibGUoKDEwMDAwMDAgKiAodHZyZWN2LT50dl9zZWMgLSB0dnNlbmQtPnR2X3NlYykgKwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0dnJlY3YtPnR2X3VzZWMgLSB0dnNlbmQtPnR2X3VzZWMpIC8gMTAwMCk7CgogICAgICAgICAgICBzbm1wX3Zhcmxpc3RfYWRkX3ZhcmlhYmxlKCZ2YXJzLCBOVUxMLCAwLCBBU05fT0NURVRfU1RSLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGl0ZW0tPnBpbmdDdGxPd25lckluZGV4LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGl0ZW0tPnBpbmdDdGxPd25lckluZGV4TGVuKTsKICAgICAgICAgICAgc25tcF92YXJsaXN0X2FkZF92YXJpYWJsZSgmdmFycywgTlVMTCwgMCwgQVNOX09DVEVUX1NUUiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpdGVtLT5waW5nQ3RsVGVzdE5hbWUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXRlbS0+cGluZ0N0bFRlc3ROYW1lTGVuKTsKCiAgICAgICAgICAgIFN0b3JhZ2VOZXcgPSBoZWFkZXJfY29tcGxleF9nZXQocGluZ1Jlc3VsdHNUYWJsZVN0b3JhZ2UsIHZhcnMpOwogICAgICAgICAgICBzbm1wX2ZyZWVfdmFyYmluZCh2YXJzKTsKICAgICAgICAgICAgaWYgKCFTdG9yYWdlTmV3KSB7CiAgICAgICAgICAgICAgICBERUJVR01TR1RMKCgicGluZ0N0bFRhYmxlIiwgIlN0b3JhZ2VOZXcgPT0gTlVMTFxuIikpOwogICAgICAgICAgICAgICAgcmV0dXJuIFNOTVBfRVJSX05PU1VDSE5BTUU7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGlmIChjdXJyZW50X3Byb2JlID09IDEpIHsKICAgICAgICAgICAgICAgICphdmVyYWdlcnR0ID0gcnR0OwogICAgICAgICAgICAgICAgKm1pbnJ0dCA9IHJ0dDsKICAgICAgICAgICAgICAgICptYXhydHQgPSBydHQ7CiAgICAgICAgICAgICAgICAqc3VtcnR0ID0gcnR0OwogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgaWYgKHJ0dCA8ICptaW5ydHQpCiAgICAgICAgICAgICAgICAgICAgKm1pbnJ0dCA9IHJ0dDsKICAgICAgICAgICAgICAgIGlmIChydHQgPiAqbWF4cnR0KQogICAgICAgICAgICAgICAgICAgICptYXhydHQgPSBydHQ7CiAgICAgICAgICAgICAgICAqc3VtcnR0ID0gKCpzdW1ydHQpICsgcnR0OwogICAgICAgICAgICAgICAgKmF2ZXJhZ2VydHQgPQogICAgICAgICAgICAgICAgICAgIHJvdW5kX2RvdWJsZSgoKnN1bXJ0dCkgLwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoU3RvcmFnZU5ldy0+cGluZ1Jlc3VsdHNQcm9iZVJlc3BvbnNlcyArCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxKSk7CiAgICAgICAgICAgIH0KCgogICAgICAgICAgICBTdG9yYWdlTmV3LT5waW5nUmVzdWx0c01pblJ0dCA9ICptaW5ydHQ7CiAgICAgICAgICAgIFN0b3JhZ2VOZXctPnBpbmdSZXN1bHRzTWF4UnR0ID0gKm1heHJ0dDsKICAgICAgICAgICAgU3RvcmFnZU5ldy0+cGluZ1Jlc3VsdHNBdmVyYWdlUnR0ID0gKmF2ZXJhZ2VydHQ7CiAgICAgICAgICAgIFN0b3JhZ2VOZXctPnBpbmdSZXN1bHRzUHJvYmVSZXNwb25zZXMgPQogICAgICAgICAgICAgICAgU3RvcmFnZU5ldy0+cGluZ1Jlc3VsdHNQcm9iZVJlc3BvbnNlcyArIDE7CiAgICAgICAgICAgIFN0b3JhZ2VOZXctPnBpbmdSZXN1bHRzU2VuZFByb2JlcyA9CiAgICAgICAgICAgICAgICBTdG9yYWdlTmV3LT5waW5nUmVzdWx0c1NlbmRQcm9iZXMgKyAxOwogICAgICAgICAgICBTdG9yYWdlTmV3LT5waW5nUmVzdWx0c1J0dFN1bU9mU3F1YXJlcyA9CiAgICAgICAgICAgICAgICBTdG9yYWdlTmV3LT5waW5nUmVzdWx0c1J0dFN1bU9mU3F1YXJlcyArIHJ0dCAqIHJ0dDsKCgkgICAgU3RvcmFnZU5ldy0+cGluZ1Jlc3VsdHNMYXN0R29vZFByb2JlX3RpbWUgPSB0aW1lcDsKICAgICAgICAgICAgZnJlZShTdG9yYWdlTmV3LT5waW5nUmVzdWx0c0xhc3RHb29kUHJvYmUpOwogICAgICAgICAgICBTdG9yYWdlTmV3LT5waW5nUmVzdWx0c0xhc3RHb29kUHJvYmUgPQogICAgICAgICAgICAgICAgbmV0c25tcF9tZW1kdXAoZGF0ZV9uX3RpbWUoJnRpbWVwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZTdG9yYWdlTmV3LT5waW5nUmVzdWx0c0xhc3RHb29kUHJvYmVMZW4pLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMTEpOwoKICAgICAgICAgICAgdGVtcCA9IFNOTVBfTUFMTE9DX1NUUlVDVChwaW5nUHJvYmVIaXN0b3J5VGFibGVfZGF0YSk7CgogICAgICAgICAgICB0ZW1wLT5waW5nQ3RsT3duZXJJbmRleCA9CiAgICAgICAgICAgICAgICAoY2hhciAqKSBtYWxsb2MoaXRlbS0+cGluZ0N0bE93bmVySW5kZXhMZW4gKyAxKTsKICAgICAgICAgICAgbWVtY3B5KHRlbXAtPnBpbmdDdGxPd25lckluZGV4LCBpdGVtLT5waW5nQ3RsT3duZXJJbmRleCwKICAgICAgICAgICAgICAgICAgIGl0ZW0tPnBpbmdDdGxPd25lckluZGV4TGVuICsgMSk7CiAgICAgICAgICAgIHRlbXAtPnBpbmdDdGxPd25lckluZGV4W2l0ZW0tPnBpbmdDdGxPd25lckluZGV4TGVuXSA9ICdcMCc7CiAgICAgICAgICAgIHRlbXAtPnBpbmdDdGxPd25lckluZGV4TGVuID0gaXRlbS0+cGluZ0N0bE93bmVySW5kZXhMZW47CgogICAgICAgICAgICB0ZW1wLT5waW5nQ3RsVGVzdE5hbWUgPQogICAgICAgICAgICAgICAgKGNoYXIgKikgbWFsbG9jKGl0ZW0tPnBpbmdDdGxUZXN0TmFtZUxlbiArIDEpOwogICAgICAgICAgICBtZW1jcHkodGVtcC0+cGluZ0N0bFRlc3ROYW1lLCBpdGVtLT5waW5nQ3RsVGVzdE5hbWUsCiAgICAgICAgICAgICAgICAgICBpdGVtLT5waW5nQ3RsVGVzdE5hbWVMZW4gKyAxKTsKICAgICAgICAgICAgdGVtcC0+cGluZ0N0bFRlc3ROYW1lW2l0ZW0tPnBpbmdDdGxUZXN0TmFtZUxlbl0gPSAnXDAnOwogICAgICAgICAgICB0ZW1wLT5waW5nQ3RsVGVzdE5hbWVMZW4gPSBpdGVtLT5waW5nQ3RsVGVzdE5hbWVMZW47CgogICAgICAgICAgICAvKiBhZGQgbG9jayB0byBwcm90ZWN0ICovCiAgICAgICAgICAgIHB0aHJlYWRfbXV0ZXhfdCBjb3VudGVyX211dGV4ID0gUFRIUkVBRF9NVVRFWF9JTklUSUFMSVpFUjsKICAgICAgICAgICAgcHRocmVhZF9tdXRleF9sb2NrKCZjb3VudGVyX211dGV4KTsKICAgICAgICAgICAgaWYgKGl0ZW0tPnBpbmdQcm9iZUhpc3RvcnlNYXhJbmRleCA+PQogICAgICAgICAgICAgICAgKHVuc2lnbmVkIGxvbmcpICgyMTQ3NDgzNjQ3KSkKICAgICAgICAgICAgICAgIGl0ZW0tPnBpbmdQcm9iZUhpc3RvcnlNYXhJbmRleCA9IDA7CiAgICAgICAgICAgIHRlbXAtPnBpbmdQcm9iZUhpc3RvcnlJbmRleCA9CiAgICAgICAgICAgICAgICArKyhpdGVtLT5waW5nUHJvYmVIaXN0b3J5TWF4SW5kZXgpOwogICAgICAgICAgICBwdGhyZWFkX211dGV4X3VubG9jaygmY291bnRlcl9tdXRleCk7CgoKICAgICAgICAgICAgdGVtcC0+cGluZ1Byb2JlSGlzdG9yeVJlc3BvbnNlID0gcnR0OwogICAgICAgICAgICB0ZW1wLT5waW5nUHJvYmVIaXN0b3J5U3RhdHVzID0gMTsKICAgICAgICAgICAgdGVtcC0+cGluZ1Byb2JlSGlzdG9yeUxhc3RSQyA9IDA7CgoJICAgIHRlbXAtPnBpbmdQcm9iZUhpc3RvcnlUaW1lX3RpbWUgPSB0aW1lcDsKICAgICAgICAgICAgdGVtcC0+cGluZ1Byb2JlSGlzdG9yeVRpbWUgPSAKICAgICAgICAgICAgICAgIG5ldHNubXBfbWVtZHVwKGRhdGVfbl90aW1lKCZ0aW1lcCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZ0ZW1wLT5waW5nUHJvYmVIaXN0b3J5VGltZUxlbiksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxMSk7CgogICAgICAgICAgICBpZiAoU3RvcmFnZU5ldy0+cGluZ1Jlc3VsdHNTZW5kUHJvYmVzID09IDEpCiAgICAgICAgICAgICAgICBpdGVtLT5waW5nUHJvYmVIaXMgPSB0ZW1wOwogICAgICAgICAgICBlbHNlCiAgICAgICAgICAgICAgICAoY3VycmVudF90ZW1wKS0+bmV4dCA9IHRlbXA7CgogICAgICAgICAgICBjdXJyZW50X3RlbXAgPSB0ZW1wOwoKICAgICAgICAgICAgaWYgKFN0b3JhZ2VOZXctPnBpbmdSZXN1bHRzU2VuZFByb2JlcyA+PSBpdGVtLT5waW5nQ3RsUHJvYmVDb3VudCkKICAgICAgICAgICAgICAgIGN1cnJlbnRfdGVtcC0+bmV4dCA9IE5VTEw7CgogICAgICAgICAgICBpZiAoaXRlbS0+cGluZ1Byb2JlSGlzICE9IE5VTEwpIHsKICAgICAgICAgICAgICAgIGlmIChwaW5nUHJvYmVIaXN0b3J5VGFibGVfY291bnQoaXRlbSkgPj0gaXRlbS0+cGluZ0N0bE1heFJvd3MpCiAgICAgICAgICAgICAgICAgICAgcGluZ1Byb2JlSGlzdG9yeVRhYmxlX2RlbExhc3QoaXRlbSk7CiAgICAgICAgICAgICAgICBpZiAocGluZ1Byb2JlSGlzdG9yeVRhYmxlX2FkZChjdXJyZW50X3RlbXApICE9IFNOTVBFUlJfU1VDQ0VTUykKICAgICAgICAgICAgICAgICAgICBERUJVR01TR1RMKCgicGluZ1Byb2JlSGlzdG9yeVRhYmxlIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZmFpbGVkIHRvIGFkZCBhIHJvd1xuIikpOwoJICAgIH0KICAgICAgICB9CiAgICB9IGVsc2UgaWYgKGZsYWcgPT0gMSkgewogICAgICAgIGlmIChzZXJpZXMgPT0gMCkKICAgICAgICAgICAgcHJvYmVGYWlsZWQgPSAxOwogICAgICAgIGVsc2UKICAgICAgICAgICAgcHJvYmVGYWlsZWQgPSBwcm9iZUZhaWxlZCArIDE7CiAgICAgICAgc2VyaWVzID0gMTsKICAgICAgICB0ZXN0RmFpbGVkID0gdGVzdEZhaWxlZCArIDE7CiAgICAgICAgc25tcF92YXJsaXN0X2FkZF92YXJpYWJsZSgmdmFycywgTlVMTCwgMCwgQVNOX09DVEVUX1NUUiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGl0ZW0tPnBpbmdDdGxPd25lckluZGV4LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXRlbS0+cGluZ0N0bE93bmVySW5kZXhMZW4pOwogICAgICAgIHNubXBfdmFybGlzdF9hZGRfdmFyaWFibGUoJnZhcnMsIE5VTEwsIDAsIEFTTl9PQ1RFVF9TVFIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpdGVtLT5waW5nQ3RsVGVzdE5hbWUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpdGVtLT5waW5nQ3RsVGVzdE5hbWVMZW4pOwoKICAgICAgICBTdG9yYWdlTmV3ID0gaGVhZGVyX2NvbXBsZXhfZ2V0KHBpbmdSZXN1bHRzVGFibGVTdG9yYWdlLCB2YXJzKTsKICAgICAgICBzbm1wX2ZyZWVfdmFyYmluZCh2YXJzKTsKICAgICAgICBpZiAoIVN0b3JhZ2VOZXcpCiAgICAgICAgICAgIHJldHVybiBTTk1QX0VSUl9OT1NVQ0hOQU1FOwoKICAgICAgICBpZiAoY3VycmVudF9wcm9iZSA9PSAxKSB7CiAgICAgICAgICAgICphdmVyYWdlcnR0ID0gcnR0OwogICAgICAgICAgICAqbWlucnR0ID0gcnR0OwogICAgICAgICAgICAqbWF4cnR0ID0gcnR0OwogICAgICAgICAgICAqc3VtcnR0ID0gcnR0OwogICAgICAgIH0KICAgICAgICBTdG9yYWdlTmV3LT5waW5nUmVzdWx0c1NlbmRQcm9iZXMgPQogICAgICAgICAgICBTdG9yYWdlTmV3LT5waW5nUmVzdWx0c1NlbmRQcm9iZXMgKyAxOwoKCgogICAgICAgIHRlbXAgPSBTTk1QX01BTExPQ19TVFJVQ1QocGluZ1Byb2JlSGlzdG9yeVRhYmxlX2RhdGEpOwoKICAgICAgICB0ZW1wLT5waW5nQ3RsT3duZXJJbmRleCA9CiAgICAgICAgICAgIChjaGFyICopIG1hbGxvYyhpdGVtLT5waW5nQ3RsT3duZXJJbmRleExlbiArIDEpOwogICAgICAgIG1lbWNweSh0ZW1wLT5waW5nQ3RsT3duZXJJbmRleCwgaXRlbS0+cGluZ0N0bE93bmVySW5kZXgsCiAgICAgICAgICAgICAgIGl0ZW0tPnBpbmdDdGxPd25lckluZGV4TGVuICsgMSk7CiAgICAgICAgdGVtcC0+cGluZ0N0bE93bmVySW5kZXhbaXRlbS0+cGluZ0N0bE93bmVySW5kZXhMZW5dID0gJ1wwJzsKICAgICAgICB0ZW1wLT5waW5nQ3RsT3duZXJJbmRleExlbiA9IGl0ZW0tPnBpbmdDdGxPd25lckluZGV4TGVuOwoKICAgICAgICB0ZW1wLT5waW5nQ3RsVGVzdE5hbWUgPQogICAgICAgICAgICAoY2hhciAqKSBtYWxsb2MoaXRlbS0+cGluZ0N0bFRlc3ROYW1lTGVuICsgMSk7CiAgICAgICAgbWVtY3B5KHRlbXAtPnBpbmdDdGxUZXN0TmFtZSwgaXRlbS0+cGluZ0N0bFRlc3ROYW1lLAogICAgICAgICAgICAgICBpdGVtLT5waW5nQ3RsVGVzdE5hbWVMZW4gKyAxKTsKICAgICAgICB0ZW1wLT5waW5nQ3RsVGVzdE5hbWVbaXRlbS0+cGluZ0N0bFRlc3ROYW1lTGVuXSA9ICdcMCc7CiAgICAgICAgdGVtcC0+cGluZ0N0bFRlc3ROYW1lTGVuID0gaXRlbS0+cGluZ0N0bFRlc3ROYW1lTGVuOwoKICAgICAgICAvKiBhZGQgbG9jayB0byBwcm90ZWN0ICovCiAgICAgICAgcHRocmVhZF9tdXRleF90IGNvdW50ZXJfbXV0ZXggPSBQVEhSRUFEX01VVEVYX0lOSVRJQUxJWkVSOwogICAgICAgIHB0aHJlYWRfbXV0ZXhfbG9jaygmY291bnRlcl9tdXRleCk7CiAgICAgICAgdGVtcC0+cGluZ1Byb2JlSGlzdG9yeUluZGV4ID0gKysoaXRlbS0+cGluZ1Byb2JlSGlzdG9yeU1heEluZGV4KTsKICAgICAgICBwdGhyZWFkX211dGV4X3VubG9jaygmY291bnRlcl9tdXRleCk7CiAgICAgICAgLyogZW5kICovCgogICAgICAgIHRlbXAtPnBpbmdQcm9iZUhpc3RvcnlSZXNwb25zZSA9IGl0ZW0tPnBpbmdDdGxUaW1lT3V0ICogMTAwMDsKICAgICAgICB0ZW1wLT5waW5nUHJvYmVIaXN0b3J5U3RhdHVzID0gNDsKICAgICAgICB0ZW1wLT5waW5nUHJvYmVIaXN0b3J5TGFzdFJDID0gMTsKCgl0ZW1wLT5waW5nUHJvYmVIaXN0b3J5VGltZV90aW1lID0gdGltZXA7Cgl0ZW1wLT5waW5nUHJvYmVIaXN0b3J5VGltZSA9CiAgICAgICAgICAgIG5ldHNubXBfbWVtZHVwKGRhdGVfbl90aW1lKCZ0aW1lcCwgJnRlbXAtPnBpbmdQcm9iZUhpc3RvcnlUaW1lTGVuKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgMTEpOwoKICAgICAgICBpZiAoU3RvcmFnZU5ldy0+cGluZ1Jlc3VsdHNTZW5kUHJvYmVzID09IDEpCiAgICAgICAgICAgIGl0ZW0tPnBpbmdQcm9iZUhpcyA9IHRlbXA7CiAgICAgICAgZWxzZSB7CiAgICAgICAgICAgIChjdXJyZW50X3RlbXApLT5uZXh0ID0gdGVtcDsKICAgICAgICB9CgogICAgICAgIGN1cnJlbnRfdGVtcCA9IHRlbXA7CgogICAgICAgIGlmIChTdG9yYWdlTmV3LT5waW5nUmVzdWx0c1NlbmRQcm9iZXMgPj0gaXRlbS0+cGluZ0N0bFByb2JlQ291bnQpIHsKICAgICAgICAgICAgY3VycmVudF90ZW1wLT5uZXh0ID0gTlVMTDsKICAgICAgICB9CgogICAgICAgIGlmIChpdGVtLT5waW5nUHJvYmVIaXMgIT0gTlVMTCkgewogICAgICAgICAgICBpZiAocGluZ1Byb2JlSGlzdG9yeVRhYmxlX2NvdW50KGl0ZW0pIDwgaXRlbS0+cGluZ0N0bE1heFJvd3MpIHsKICAgICAgICAgICAgICAgIGlmIChwaW5nUHJvYmVIaXN0b3J5VGFibGVfYWRkKGN1cnJlbnRfdGVtcCkgIT0KICAgICAgICAgICAgICAgICAgICBTTk1QRVJSX1NVQ0NFU1MpCiAgICAgICAgICAgICAgICAgICAgREVCVUdNU0dUTCgoInBpbmdQcm9iZUhpc3RvcnlUYWJsZSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInJlZ2lzdGVyZWQgYW4gZW50cnkgZXJyb3JcbiIpKTsKICAgICAgICAgICAgfSBlbHNlIHsKCiAgICAgICAgICAgICAgICBwaW5nUHJvYmVIaXN0b3J5VGFibGVfZGVsTGFzdChpdGVtKTsKICAgICAgICAgICAgICAgIGlmIChwaW5nUHJvYmVIaXN0b3J5VGFibGVfYWRkKGN1cnJlbnRfdGVtcCkgIT0KICAgICAgICAgICAgICAgICAgICBTTk1QRVJSX1NVQ0NFU1MpCiAgICAgICAgICAgICAgICAgICAgREVCVUdNU0dUTCgoInBpbmdQcm9iZUhpc3RvcnlUYWJsZSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInJlZ2lzdGVyZWQgYW4gZW50cnkgZXJyb3JcbiIpKTsKCiAgICAgICAgICAgIH0KCX0KCiAgICAgICAgaWYgKChpdGVtLT4KICAgICAgICAgICAgIHBpbmdDdGxUcmFwR2VuZXJhdGlvblswXSAmIFBJTkdUUkFQR0VORVJBVElPTl9QUk9CRUZBSUxFRCkgIT0KICAgICAgICAgICAgMCkgewogICAgICAgICAgICBpZiAocHJvYmVGYWlsZWQgPj0gaXRlbS0+cGluZ0N0bFRyYXBQcm9iZUZhaWx1cmVGaWx0ZXIpCiAgICAgICAgICAgICAgICBzZW5kX3BpbmdfdHJhcChpdGVtLCBwaW5nUHJvYmVGYWlsZWQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2YocGluZ1Byb2JlRmFpbGVkKSAvIHNpemVvZihvaWQpKTsKICAgICAgICB9CgoKICAgIH0KCiAgICBpZiAoY3VycmVudF9wcm9iZSA9PSBpdGVtLT5waW5nQ3RsUHJvYmVDb3VudCkgewogICAgICAgIGlmICgoaXRlbS0+CiAgICAgICAgICAgICBwaW5nQ3RsVHJhcEdlbmVyYXRpb25bMF0gJiBQSU5HVFJBUEdFTkVSQVRJT05fVEVTVENPTVBMRVRFRCkKICAgICAgICAgICAgIT0gMCkgewogICAgICAgICAgICBzZW5kX3BpbmdfdHJhcChpdGVtLCBwaW5nVGVzdENvbXBsZXRlZCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKHBpbmdUZXN0Q29tcGxldGVkKSAvIHNpemVvZihvaWQpKTsKICAgICAgICB9IGVsc2UKICAgICAgICAgICAgaWYgKChpdGVtLT4KICAgICAgICAgICAgICAgICBwaW5nQ3RsVHJhcEdlbmVyYXRpb25bMF0gJiBQSU5HVFJBUEdFTkVSQVRJT05fVEVTVEZBSUxFRCkKICAgICAgICAgICAgICAgICE9IDApIHsKCiAgICAgICAgICAgIGlmICh0ZXN0RmFpbGVkID49IGl0ZW0tPnBpbmdDdGxUcmFwVGVzdEZhaWx1cmVGaWx0ZXIpCiAgICAgICAgICAgICAgICBzZW5kX3BpbmdfdHJhcChpdGVtLCBwaW5nVGVzdEZhaWxlZCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZihwaW5nVGVzdEZhaWxlZCkgLyBzaXplb2Yob2lkKSk7CiAgICAgICAgfQoKICAgICAgICBlbHNlIGlmICgoaXRlbS0+CiAgICAgICAgICAgICAgICAgIHBpbmdDdGxUcmFwR2VuZXJhdGlvblswXSAmCiAgICAgICAgICAgICAgICAgIFBJTkdUUkFQR0VORVJBVElPTl9QUk9CRUZBSUxFRCkgIT0gMCkgezsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgICA7CiAgICAgICAgfQoKICAgICAgICBzZXJpZXMgPSAwOwogICAgICAgIHByb2JlRmFpbGVkID0gMDsKICAgICAgICB0ZXN0RmFpbGVkID0gMDsKCiAgICB9CiAgICByZXR1cm4gU05NUF9FUlJfTk9FUlJPUjsKfQoKCgp2b2lkCnNlbmRfdjQoaW50IGRhdGFsZW4sIHBpZF90IHBpZCwgaW50IG5zZW50LCBpbnQgc29ja2ZkLCBjaGFyICpzZW5kYnVmKQp7CiAgICBpbnQgICAgICAgICAgICAgbGVuOwogICAgc3RydWN0IGljbXAgICAgKmljbXAgPSBOVUxMOwoKICAgIGljbXAgPSAoc3RydWN0IGljbXAgKikgc2VuZGJ1ZjsKICAgIGljbXAtPmljbXBfdHlwZSA9IElDTVBfRUNITzsKICAgIGljbXAtPmljbXBfY29kZSA9IDA7CiAgICBpY21wLT5pY21wX2lkID0gcGlkOwogICAgaWNtcC0+aWNtcF9zZXEgPSBuc2VudDsKICAgIG5ldHNubXBfZ2V0X21vbm90b25pY19jbG9jaygoc3RydWN0IHRpbWV2YWwgKikgaWNtcC0+aWNtcF9kYXRhKTsKCiAgICBsZW4gPSA4ICsgZGF0YWxlbjsgICAgICAgICAgLyogY2hlY2tzdW0gSUNNUCBoZWFkZXIgYW5kIGRhdGEgKi8KICAgIGljbXAtPmljbXBfY2tzdW0gPSAwOwogICAgaWNtcC0+aWNtcF9ja3N1bSA9IGluX2Nrc3VtKCh1X3Nob3J0ICopIGljbXAsIGxlbik7CgogICAgc2VuZHRvKHNvY2tmZCwgc2VuZGJ1ZiwgbGVuLCAwLCBwci0+c2FzZW5kLCBwci0+c2FsZW4pOwp9CgoKdm9pZApydW5fcGluZyh1bnNpZ25lZCBpbnQgY2xpZW50cmVnLCB2b2lkICpjbGllbnRhcmcpCi8qIHJ1bl9waW5nKHN0cnVjdCBwaW5nQ3RsVGFibGVfZGF0YSAqaXRlbSkgKi8KewogICAgc3RydWN0IHBpbmdDdGxUYWJsZV9kYXRhICppdGVtID0gY2xpZW50YXJnOwogICAgbmV0c25tcF92YXJpYWJsZV9saXN0ICp2YXJzID0gTlVMTDsKICAgIHN0cnVjdCBwaW5nUmVzdWx0c1RhYmxlX2RhdGEgKlN0b3JhZ2VOZXcgPSBOVUxMOwoKICAgIHNubXBfdmFybGlzdF9hZGRfdmFyaWFibGUoJnZhcnMsIE5VTEwsIDAsIEFTTl9PQ1RFVF9TVFIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGl0ZW0tPnBpbmdDdGxPd25lckluZGV4LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpdGVtLT5waW5nQ3RsT3duZXJJbmRleExlbik7CiAgICBzbm1wX3Zhcmxpc3RfYWRkX3ZhcmlhYmxlKCZ2YXJzLCBOVUxMLCAwLCBBU05fT0NURVRfU1RSLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpdGVtLT5waW5nQ3RsVGVzdE5hbWUsIGl0ZW0tPnBpbmdDdGxUZXN0TmFtZUxlbik7CgogICAgU3RvcmFnZU5ldyA9IGhlYWRlcl9jb21wbGV4X2dldChwaW5nUmVzdWx0c1RhYmxlU3RvcmFnZSwgdmFycyk7CiAgICBzbm1wX2ZyZWVfdmFyYmluZCh2YXJzKTsKICAgIGlmICghU3RvcmFnZU5ldykKICAgICAgICByZXR1cm47CgogICAgU3RvcmFnZU5ldy0+cGluZ1Jlc3VsdHNTZW5kUHJvYmVzID0gMDsKICAgIFN0b3JhZ2VOZXctPnBpbmdSZXN1bHRzUHJvYmVSZXNwb25zZXMgPSAwOwoKICAgIGlmIChpdGVtLT5waW5nQ3RsVGFyZ2V0QWRkcmVzc1R5cGUgPT0gMQogICAgICAgIHx8IGl0ZW0tPnBpbmdDdGxUYXJnZXRBZGRyZXNzVHlwZSA9PSAxNikgewogICAgICAgIHN0cnVjdCBwcm90byAgICBwcm90b192NCA9CiAgICAgICAgICAgIHsgcHJvY192NCwgc2VuZF92NCwgTlVMTCwgTlVMTCwgMCwgSVBQUk9UT19JQ01QIH07CiAgICAgICAgY2hhciAgICAgICAgICAgKmhvc3QgPSBOVUxMOwogICAgICAgIHBpZF90ICAgICAgICAgICBwaWQ7ICAgIC8qIG91ciBQSUQgKi8KCiAgICAgICAgaW50ICAgICAgICAgICAgIGRhdGFsZW47CiAgICAgICAgdW5zaWduZWQgbG9uZyAgKm1pbnJ0dCA9IE5VTEw7CiAgICAgICAgdW5zaWduZWQgbG9uZyAgKm1heHJ0dCA9IE5VTEw7CiAgICAgICAgdW5zaWduZWQgbG9uZyAgKmF2ZXJhZ2VydHQgPSBOVUxMOwoKICAgICAgICBkYXRhbGVuID0gNTY7ICAgICAgICAgICAvKiBkYXRhIHRoYXQgZ29lcyB3aXRoIElDTVAgZWNobyByZXF1ZXN0ICovCiAgICAgICAgc3RydWN0IGFkZHJpbmZvICphaSA9IE5VTEw7CiAgICAgICAgbWlucnR0ID0gbWFsbG9jKHNpemVvZih1bnNpZ25lZCBsb25nKSk7CiAgICAgICAgbWF4cnR0ID0gbWFsbG9jKHNpemVvZih1bnNpZ25lZCBsb25nKSk7CiAgICAgICAgYXZlcmFnZXJ0dCA9IG1hbGxvYyhzaXplb2YodW5zaWduZWQgbG9uZykpOwogICAgICAgIGhvc3QgPSBpdGVtLT5waW5nQ3RsVGFyZ2V0QWRkcmVzczsKICAgICAgICBwaWQgPSBnZXRwaWQoKTsKCiAgICAgICAgYWkgPSBob3N0X3NlcnYoaG9zdCwgTlVMTCwgMCwgMCk7CgogICAgICAgIGlmIChhaSkgewogICAgICAgICAgICBERUJVR01TR1RMKCgicGluZ0N0bFRhYmxlIiwgIlBJTkcgJXMgKCVzKTogJWQgZGF0YSBieXRlc1xuIiwKICAgICAgICAgICAgICAgICAgICAgICAgYWktPmFpX2Nhbm9ubmFtZSwKICAgICAgICAgICAgICAgICAgICAgICAgc29ja19udG9wX2hvc3QoYWktPmFpX2FkZHIsIGFpLT5haV9hZGRybGVuKSwgZGF0YWxlbikpOwoKICAgICAgICAgICAgLyoKICAgICAgICAgICAgICogNGluaXRpYWxpemUgYWNjb3JkaW5nIHRvIHByb3RvY29sIAogICAgICAgICAgICAgKi8KICAgICAgICAgICAgaWYgKGFpLT5haV9mYW1pbHkgPT0gQUZfSU5FVCkgewogICAgICAgICAgICAgICAgcHIgPSAmcHJvdG9fdjQ7CiNpZmRlZglJUFY2CiAgICAgICAgICAgIH0gZWxzZSBpZiAoYWktPmFpX2ZhbWlseSA9PSBBRl9JTkVUNikgewogICAgICAgICAgICAgICAgcHIgPSAmcHJvdG9fdjY7CgogICAgICAgICAgICAgICAgaWYgKElONl9JU19BRERSX1Y0TUFQUEVEKCYoKChzdHJ1Y3Qgc29ja2FkZHJfaW42ICopCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWktPmFpX2FkZHIpLT5zaW42X2FkZHIpKSkKICAgICAgICAgICAgICAgICAgICBzbm1wX2xvZyhMT0dfRVJSLCAiY2Fubm90IHBpbmcgSVB2NC1tYXBwZWQgSVB2NiBhZGRyZXNzIik7CiNlbmRpZgogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgc25tcF9sb2coTE9HX0VSUiwgInVua25vd24gYWRkcmVzcyBmYW1pbHkgJWQiLCBhaS0+YWlfZmFtaWx5KTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgcHItPnNhc2VuZCA9IGFpLT5haV9hZGRyOwogICAgICAgICAgICBwci0+c2FyZWN2ID0gY2FsbG9jKDEsIGFpLT5haV9hZGRybGVuKTsKICAgICAgICAgICAgcHItPnNhbGVuID0gYWktPmFpX2FkZHJsZW47CiAgICAgICAgICAgIHJlYWRsb29wKGl0ZW0sIGFpLCBkYXRhbGVuLCBtaW5ydHQsIG1heHJ0dCwgYXZlcmFnZXJ0dCwgcGlkKTsKICAgICAgICAgICAgZnJlZShwci0+c2FyZWN2KTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgICBzbm1wX2xvZyhMT0dfRVJSLCAiUElORzogbmFtZSByZXNvbHV0aW9uIGZvciAlcyBmYWlsZWQuXG4iLCBob3N0KTsKICAgICAgICB9CgogICAgICAgIFNOTVBfRlJFRShtaW5ydHQpOwogICAgICAgIFNOTVBfRlJFRShtYXhydHQpOwogICAgICAgIFNOTVBfRlJFRShhdmVyYWdlcnR0KTsKICAgICAgICBmcmVlYWRkcmluZm8oYWkpOwogICAgfQoKICAgIGVsc2UgaWYgKGl0ZW0tPnBpbmdDdGxUYXJnZXRBZGRyZXNzVHlwZSA9PSAyKSB7CgogICAgICAgIGludCAgICAgICAgICAgICBob2xkID0gMCwgcGFja2xlbiA9IDA7CiAgICAgICAgdV9jaGFyICAgICAgICAgKnBhY2tldCA9IE5VTEw7CiAgICAgICAgY2hhciAgICAgICAgICAgKnRhcmdldCA9IE5VTEw7CiAgICAgICAgc3RydWN0IHNvY2thZGRyX2luNiBmaXJzdGhvcDsKICAgICAgICBpbnQgICAgICAgICAgICAgc29ja2V0X2Vycm5vID0gMDsKICAgICAgICBzdHJ1Y3QgaWNtcDZfZmlsdGVyIGZpbHRlcjsKICAgICAgICBpbnQgICAgICAgICAgICAgZXJyID0gMCwgY3N1bV9vZmZzZXQgPSAwLCBzel9vcHQgPSAwOwoKICAgICAgICBzdGF0aWMgaW50ICAgICAgaWNtcF9zb2NrID0gMDsKICAgICAgICBpbnQgICAgICAgICAgICAgdWlkID0gMDsKICAgICAgICBzdHJ1Y3Qgc29ja2FkZHJfaW42IHNvdXJjZTsKICAgICAgICBpbnQgICAgICAgICAgICAgcHJlbG9hZCA9IDA7CiAgICAgICAgc3RhdGljIHVuc2lnbmVkIGNoYXIgY21zZ2J1Zls0MDk2XTsKICAgICAgICBzdGF0aWMgaW50ICAgICAgY21zZ2xlbiA9IDA7CiAgICAgICAgc3RydWN0IHNvY2thZGRyX2luNiB3aGVyZXRvOyAgICAvKiB3aG8gdG8gcGluZyAqLwogICAgICAgIGludCAgICAgICAgICAgICBvcHRpb25zID0gMDsKICAgICAgICBjaGFyICAgICAgICAgICAqaG9zdG5hbWUgPSBOVUxMOwogICAgICAgIGNoYXIgICAgICAgICAgICpkZXZpY2UgPSBOVUxMOwogICAgICAgIGludCAgICAgICAgICAgICBpbnRlcnZhbCA9IDEwMDA7ICAgICAgICAvKiBpbnRlcnZhbCBiZXR3ZWVuIHBhY2tldHMgKG1zZWMpICovCiAgICAgICAgaW50ICAgICAgICAgICAgIHBtdHVkaXNjID0gLTE7CiAgICAgICAgaW50ICAgICAgICAgICAgIGRhdGFsZW4gPSBERUZEQVRBTEVOOwogICAgICAgIGludCAgICAgICAgICAgICB0aW1pbmcgPSAwOyAgICAgLyogZmxhZyB0byBkbyB0aW1pbmcgKi8KICAgICAgICBpbnQgICAgICAgICAgICAgd29ya2luZ19yZWN2ZXJyID0gMDsKICAgICAgICBfX3UzMiAgICAgICAgICAgZmxvd2xhYmVsID0gMDsKCiAgICAgICAgaW50ICAgICAgICAgICAgIGlkZW50ID0gMDsgICAgICAvKiBwcm9jZXNzIGlkIHRvIGlkZW50aWZ5IG91ciBwYWNrZXRzICovCiAgICAgICAgdV9jaGFyICAgICAgICAgIG91dHBhY2tbTUFYX1BBQ0tFVF07CiAgICAgICAgc3RydWN0IHRpbWV2YWwgIHN0YXJ0X3RpbWU7CiAgICAgICAgc3RhdGljIGludCAgICAgIHNjcmVlbl93aWR0aCA9IElOVF9NQVg7CiAgICAgICAgaW50ICAgICAgICAgICAgIGRlYWRsaW5lID0gMDsgICAvKiB0aW1lIHRvIGRpZSAqLwogICAgICAgIGludCAgICAgICAgICAgICB0aW1lb3V0ID0gMDsKCiAgICAgICAgdGltZW91dCA9IGl0ZW0tPnBpbmdDdGxUaW1lT3V0OwogICAgICAgIG1lbXNldCgmc291cmNlLCAwLCBzaXplb2Yoc291cmNlKSk7CiAgICAgICAgaWNtcF9zb2NrID0gc29ja2V0KEFGX0lORVQ2LCBTT0NLX1JBVywgSVBQUk9UT19JQ01QVjYpOwogICAgICAgIHNvY2tldF9lcnJubyA9IGVycm5vOwoKICAgICAgICB1aWQgPSBnZXR1aWQoKTsKICAgICAgICBzZXR1aWQodWlkKTsKCiAgICAgICAgc291cmNlLnNpbjZfZmFtaWx5ID0gQUZfSU5FVDY7CiAgICAgICAgbWVtc2V0KCZmaXJzdGhvcCwgMCwgc2l6ZW9mKGZpcnN0aG9wKSk7CiAgICAgICAgZmlyc3Rob3Auc2luNl9mYW1pbHkgPSBBRl9JTkVUNjsKICAgICAgICBwcmVsb2FkID0gMTsKCiAgICAgICAgdGFyZ2V0ID0gaXRlbS0+cGluZ0N0bFRhcmdldEFkZHJlc3M7CgogICAgICAgIG1lbXNldCgmd2hlcmV0bywgMCwgc2l6ZW9mKHN0cnVjdCBzb2NrYWRkcl9pbjYpKTsKICAgICAgICB3aGVyZXRvLnNpbjZfZmFtaWx5ID0gQUZfSU5FVDY7CiAgICAgICAgd2hlcmV0by5zaW42X3BvcnQgPSBodG9ucyhJUFBST1RPX0lDTVBWNik7CgogICAgICAgIGlmIChpbmV0X3B0b24oQUZfSU5FVDYsIHRhcmdldCwgJndoZXJldG8uc2luNl9hZGRyKSA8PSAwKSB7CiAgICAgICAgICAgIHN0cnVjdCBob3N0ZW50ICpocCA9IE5VTEw7CgogICAgICAgICAgICBocCA9IGdldGhvc3RieW5hbWUyKHRhcmdldCwgQUZfSU5FVDYpOwoKICAgICAgICAgICAgaWYgKGhwID09IE5VTEwpIHsKICAgICAgICAgICAgICAgIGZwcmludGYoc3RkZXJyLCAidW5rbm93biBob3N0XG4iKTsKICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgbWVtY3B5KCZ3aGVyZXRvLnNpbjZfYWRkciwgaHAtPmhfYWRkcl9saXN0WzBdLCAxNik7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgb3B0aW9ucyB8PSBGX05VTUVSSUM7CiAgICAgICAgfQogICAgICAgIGlmIChpcHY2X2FkZHJfYW55KCZmaXJzdGhvcC5zaW42X2FkZHIpKQogICAgICAgICAgICBtZW1jcHkoJmZpcnN0aG9wLnNpbjZfYWRkciwgJndoZXJldG8uc2luNl9hZGRyLCAxNik7CgogICAgICAgIGhvc3RuYW1lID0gdGFyZ2V0OwoKICAgICAgICBpZiAoaXB2Nl9hZGRyX2FueSgmc291cmNlLnNpbjZfYWRkcikpIHsKICAgICAgICAgICAgc29ja2xlbl90ICAgICAgIGFsZW47CiAgICAgICAgICAgIGludCAgICAgICAgICAgICBwcm9iZV9mZCA9IHNvY2tldChBRl9JTkVUNiwgU09DS19ER1JBTSwgMCk7CgogICAgICAgICAgICBpZiAocHJvYmVfZmQgPCAwKSB7CiAgICAgICAgICAgICAgICBzbm1wX2xvZ19wZXJyb3IoInBpbmdDdGxUYWJsZTogSVB2NiBkYXRhZ3JhbSBzb2NrZXQgY3JlYXRpb24iKTsKICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAoZGV2aWNlKSB7CiAgICAgICAgICAgICAgICBzdHJ1Y3QgaWZyZXEgICAgaWZyOwogICAgICAgICAgICAgICAgbWVtc2V0KCZpZnIsIDAsIHNpemVvZihpZnIpKTsKICAgICAgICAgICAgICAgIHN0cmxjcHkoaWZyLmlmcl9uYW1lLCBkZXZpY2UsIElGTkFNU0laKTsKICAgICAgICAgICAgICAgIGlmIChzZXRzb2Nrb3B0CiAgICAgICAgICAgICAgICAgICAgKHByb2JlX2ZkLCBTT0xfU09DS0VULCBTT19CSU5EVE9ERVZJQ0UsIGRldmljZSwKICAgICAgICAgICAgICAgICAgICAgc3RybGVuKGRldmljZSkgKyAxKSA9PSAtMSkgewojaWZkZWYgSEFWRV9TSU42X1NDT1BFSUQKICAgICAgICAgICAgICAgICAgICBpZiAoKGZpcnN0aG9wLnNpbjZfYWRkci4KICAgICAgICAgICAgICAgICAgICAgICAgIHM2X2FkZHIxNlswXSAmIGh0b25zKDB4ZmZjMCkpID09IGh0b25zKDB4ZmU4MCkKICAgICAgICAgICAgICAgICAgICAgICAgfHwgKGZpcnN0aG9wLnNpbjZfYWRkci4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIHM2X2FkZHIxNlswXSAmIGh0b25zKDB4ZmZmZikpID09CiAgICAgICAgICAgICAgICAgICAgICAgIGh0b25zKDB4ZmYwMikpIHsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGlvY3RsKHByb2JlX2ZkLCBTSU9DR0lGSU5ERVgsICZpZnIpIDwgMCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgZnByaW50ZihzdGRlcnIsICJwaW5nOiB1bmtub3duIGlmYWNlICVzXG4iLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2UpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xvc2UocHJvYmVfZmQpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIGZpcnN0aG9wLnNpbjZfc2NvcGVfaWQgPSBpZnIuaWZyX2lmaW5kZXg7CiAgICAgICAgICAgICAgICAgICAgfQojZW5kaWYKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICBmaXJzdGhvcC5zaW42X3BvcnQgPSBodG9ucygxMDI1KTsKICAgICAgICAgICAgaWYgKGNvbm5lY3QKICAgICAgICAgICAgICAgIChwcm9iZV9mZCwgKHN0cnVjdCBzb2NrYWRkciAqKSAmZmlyc3Rob3AsCiAgICAgICAgICAgICAgICAgc2l6ZW9mKGZpcnN0aG9wKSkgPT0gLTEpIHsKICAgICAgICAgICAgICAgIHBlcnJvcigiY29ubmVjdCIpOwogICAgICAgICAgICAgICAgY2xvc2UocHJvYmVfZmQpOwogICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGFsZW4gPSBzaXplb2Yoc291cmNlKTsKICAgICAgICAgICAgaWYgKGdldHNvY2tuYW1lKHByb2JlX2ZkLCAoc3RydWN0IHNvY2thZGRyICopICZzb3VyY2UsICZhbGVuKQogICAgICAgICAgICAgICAgPT0gLTEpIHsKICAgICAgICAgICAgICAgIHBlcnJvcigiZ2V0c29ja25hbWUiKTsKICAgICAgICAgICAgICAgIGNsb3NlKHByb2JlX2ZkKTsKICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgfQogICAgICAgICAgICBzb3VyY2Uuc2luNl9wb3J0ID0gMDsKICAgICAgICAgICAgY2xvc2UocHJvYmVfZmQpOwogICAgICAgIH0KCiAgICAgICAgaWYgKGljbXBfc29jayA8IDApIHsKICAgICAgICAgICAgZXJybm8gPSBzb2NrZXRfZXJybm87CiAgICAgICAgICAgIHBlcnJvcigicGluZzogaWNtcCBvcGVuIHNvY2tldCIpOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQoKICAgICAgICBpZiAoKHdoZXJldG8uc2luNl9hZGRyLnM2X2FkZHIxNlswXSAmIGh0b25zKDB4ZmYwMCkpID09CiAgICAgICAgICAgIGh0b25zKDB4ZmYwMCkpIHsKICAgICAgICAgICAgaWYgKHVpZCkgewogICAgICAgICAgICAgICAgaWYgKGludGVydmFsIDwgMTAwMCkgewogICAgICAgICAgICAgICAgICAgIGZwcmludGYoc3RkZXJyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgInBpbmc6IG11bHRpY2FzdCBwaW5nIHdpdGggdG9vIHNob3J0IGludGVydmFsLlxuIik7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgaWYgKHBtdHVkaXNjID49IDAgJiYgcG10dWRpc2MgIT0gSVBWNl9QTVRVRElTQ19ETykgewogICAgICAgICAgICAgICAgICAgIGZwcmludGYoc3RkZXJyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgInBpbmc6IG11bHRpY2FzdCBwaW5nIGRvZXMgbm90IGZyYWdtZW50LlxuIik7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmIChwbXR1ZGlzYyA8IDApCiAgICAgICAgICAgICAgICBwbXR1ZGlzYyA9IElQVjZfUE1UVURJU0NfRE87CiAgICAgICAgfQoKICAgICAgICBpZiAocG10dWRpc2MgPj0gMCkgewogICAgICAgICAgICBpZiAoc2V0c29ja29wdAogICAgICAgICAgICAgICAgKGljbXBfc29jaywgU09MX0lQVjYsIElQVjZfTVRVX0RJU0NPVkVSLCAmcG10dWRpc2MsCiAgICAgICAgICAgICAgICAgc2l6ZW9mKHBtdHVkaXNjKSkgPT0gLTEpIHsKICAgICAgICAgICAgICAgIHBlcnJvcigicGluZzogSVBWNl9NVFVfRElTQ09WRVIiKTsKICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBpZiAoYmluZChpY21wX3NvY2ssIChzdHJ1Y3Qgc29ja2FkZHIgKikgJnNvdXJjZSwgc2l6ZW9mKHNvdXJjZSkpID09CiAgICAgICAgICAgIC0xKSB7CiAgICAgICAgICAgIHBlcnJvcigicGluZzogYmluZCBpY21wIHNvY2tldCIpOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgICAgIGlmIChkYXRhbGVuID49IHNpemVvZihzdHJ1Y3QgdGltZXZhbCkpICAvKiBjYW4gd2UgdGltZSB0cmFuc2ZlciAqLwogICAgICAgICAgICB0aW1pbmcgPSAxOwogICAgICAgIHBhY2tsZW4gPSBkYXRhbGVuICsgOCArIDQwOTYgKyA0MCArIDg7ICAvKiA0MDk2IGZvciBydGhkciAqLwogICAgICAgIGlmICghKHBhY2tldCA9ICh1X2NoYXIgKikgbWFsbG9jKCh1X2ludCkgcGFja2xlbikpKSB7CiAgICAgICAgICAgIGZwcmludGYoc3RkZXJyLCAicGluZzogb3V0IG9mIG1lbW9yeS5cbiIpOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQoKICAgICAgICB3b3JraW5nX3JlY3ZlcnIgPSAxOwogICAgICAgIGhvbGQgPSAxOwogICAgICAgIGlmIChzZXRzb2Nrb3B0CiAgICAgICAgICAgIChpY21wX3NvY2ssIFNPTF9JUFY2LCBJUFY2X1JFQ1ZFUlIsIChjaGFyICopICZob2xkLAogICAgICAgICAgICAgc2l6ZW9mKGhvbGQpKSkgewogICAgICAgICAgICBmcHJpbnRmKHN0ZGVyciwKICAgICAgICAgICAgICAgICAgICAiV0FSTklORzogeW91ciBrZXJuZWwgaXMgdmVlZXJ5IG9sZC4gTm8gcHJvYmxlbXMuXG4iKTsKICAgICAgICAgICAgd29ya2luZ19yZWN2ZXJyID0gMDsKICAgICAgICB9CgogICAgICAgIC8qCiAgICAgICAgICogRXN0aW1hdGUgbWVtb3J5IGVhdGVuIGJ5IHNpbmdsZSBwYWNrZXQuIEl0IGlzIHJvdWdoIGVzdGltYXRlLgogICAgICAgICAqICogQWN0dWFsbHksIGZvciBzbWFsbCBkYXRhbGVuJ3MgaXQgZGVwZW5kcyBvbiBrZXJuZWwgc2lkZSBhIGxvdC4gCiAgICAgICAgICovCiAgICAgICAgaG9sZCA9IGRhdGFsZW4gKyA4OwogICAgICAgIGhvbGQgKz0gKChob2xkICsgNTExKSAvIDUxMikgKiAoNDAgKyAxNiArIDY0ICsgMTYwKTsKICAgICAgICBzb2NrX3NldGJ1ZnMoaWNtcF9zb2NrLCBob2xkLCBwcmVsb2FkKTsKCiAgICAgICAgY3N1bV9vZmZzZXQgPSAyOwogICAgICAgIHN6X29wdCA9IHNpemVvZihpbnQpOwoKICAgICAgICBlcnIgPQogICAgICAgICAgICBzZXRzb2Nrb3B0KGljbXBfc29jaywgU09MX1JBVywgSVBWNl9DSEVDS1NVTSwgJmNzdW1fb2Zmc2V0LAogICAgICAgICAgICAgICAgICAgICAgIHN6X29wdCk7CiAgICAgICAgaWYgKGVyciA8IDApIHsKICAgICAgICAgICAgcGVycm9yKCJzZXRzb2Nrb3B0KFJBV19DSEVDS1NVTSkiKTsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KCiAgICAgICAgLyoKICAgICAgICAgKiAgICAgIHNlbGVjdCBpY21wIGVjaG8gcmVwbHkgYXMgaWNtcCB0eXBlIHRvIHJlY2VpdmUKICAgICAgICAgKi8KCiAgICAgICAgSUNNUFY2X0ZJTFRFUl9TRVRCTE9DS0FMTCgmZmlsdGVyKTsKCiAgICAgICAgaWYgKCF3b3JraW5nX3JlY3ZlcnIpIHsKICAgICAgICAgICAgSUNNUFY2X0ZJTFRFUl9TRVRQQVNTKElDTVA2X0RTVF9VTlJFQUNILCAmZmlsdGVyKTsKICAgICAgICAgICAgSUNNUFY2X0ZJTFRFUl9TRVRQQVNTKElDTVA2X1BBQ0tFVF9UT09fQklHLCAmZmlsdGVyKTsKICAgICAgICAgICAgSUNNUFY2X0ZJTFRFUl9TRVRQQVNTKElDTVA2X1RJTUVfRVhDRUVERUQsICZmaWx0ZXIpOwogICAgICAgICAgICBJQ01QVjZfRklMVEVSX1NFVFBBU1MoSUNNUDZfUEFSQU1fUFJPQiwgJmZpbHRlcik7CiAgICAgICAgfQoKICAgICAgICBJQ01QVjZfRklMVEVSX1NFVFBBU1MoSUNNUDZfRUNIT19SRVBMWSwgJmZpbHRlcik7CgogICAgICAgIGVyciA9IHNldHNvY2tvcHQoaWNtcF9zb2NrLCBTT0xfSUNNUFY2LCBJQ01QNl9GSUxURVIsICZmaWx0ZXIsCiAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2Yoc3RydWN0IGljbXA2X2ZpbHRlcikpOwoKICAgICAgICBpZiAoZXJyIDwgMCkgewogICAgICAgICAgICBwZXJyb3IoInNldHNvY2tvcHQoSUNNUDZfRklMVEVSKSIpOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQoKICAgICAgICBpZiAoMSkgewogICAgICAgICAgICBpbnQgICAgICAgICAgICAgb24gPSAxOwogICAgICAgICAgICBpZiAoc2V0c29ja29wdChpY21wX3NvY2ssIElQUFJPVE9fSVBWNiwgSVBWNl9IT1BMSU1JVCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgJm9uLCBzaXplb2Yob24pKSA9PSAtMSkgewogICAgICAgICAgICAgICAgcGVycm9yKCJjYW4ndCByZWNlaXZlIGhvcCBsaW1pdCIpOwogICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICBERUJVR01TR1RMKCgicGluZ0N0bFRhYmxlIiwgIlBJTkcgJXMoJXMpICIsIGhvc3RuYW1lLAogICAgICAgICAgICAgICAgICAgIHByX2FkZHIoJndoZXJldG8uc2luNl9hZGRyLCBvcHRpb25zKSkpOwogICAgICAgIGlmIChmbG93bGFiZWwpCiAgICAgICAgICAgIERFQlVHTVNHVEwoKCJwaW5nQ3RsVGFibGUiLCAiLCBmbG93IDB4JTA1eCwgIiwKICAgICAgICAgICAgICAgICAgICAgICAgKHVuc2lnbmVkKSBudG9obChmbG93bGFiZWwpKSk7CiAgICAgICAgaWYgKGRldmljZSB8fCAob3B0aW9ucyAmIEZfTlVNRVJJQykpIHsKICAgICAgICAgICAgREVCVUdNU0dUTCgoInBpbmdDdGxUYWJsZSIsICJmcm9tICVzICVzOiAiLAogICAgICAgICAgICAgICAgICAgICAgICBwcl9hZGRyX24oJnNvdXJjZS5zaW42X2FkZHIpLCBkZXZpY2UgPyA6ICIiKSk7CiAgICAgICAgfQogICAgICAgIERFQlVHTVNHVEwoKCJwaW5nQ3RsVGFibGUiLCAiJWQgZGF0YSBieXRlc1xuIiwgZGF0YWxlbikpOwoKICAgICAgICBzZXR1cChpY21wX3NvY2ssIG9wdGlvbnMsIHVpZCwgdGltZW91dCwgcHJlbG9hZCwgaW50ZXJ2YWwsIGRhdGFsZW4sCiAgICAgICAgICAgICAgKGNoYXIgKikgb3V0cGFjaywgJmlkZW50LCAmc3RhcnRfdGltZSwgJnNjcmVlbl93aWR0aCwKICAgICAgICAgICAgICAmZGVhZGxpbmUpOwoKICAgICAgICBtYWluX2xvb3AoaXRlbSwgaWNtcF9zb2NrLCBwcmVsb2FkLCBwYWNrZXQsIHBhY2tsZW4sIGNtc2dsZW4sCiAgICAgICAgICAgICAgICAgIChjaGFyICopIGNtc2didWYsICZ3aGVyZXRvLCBvcHRpb25zLCB1aWQsIGhvc3RuYW1lLAogICAgICAgICAgICAgICAgICBpbnRlcnZhbCwgZGF0YWxlbiwgdGltaW5nLCB3b3JraW5nX3JlY3ZlcnIsCiAgICAgICAgICAgICAgICAgIChjaGFyICopIG91dHBhY2ssICZpZGVudCwgJnN0YXJ0X3RpbWUsICZzY3JlZW5fd2lkdGgsCiAgICAgICAgICAgICAgICAgICZkZWFkbGluZSk7CgogICAgICAgIGNsb3NlKGljbXBfc29jayk7CiAgICB9CiAgICByZXR1cm47Cn0KCnZvaWQKaW5pdF9yZXN1bHRzVGFibGUoc3RydWN0IHBpbmdDdGxUYWJsZV9kYXRhICppdGVtKQp7CiAgICBzdHJ1Y3QgcGluZ1Jlc3VsdHNUYWJsZV9kYXRhICpTdG9yYWdlVG1wID0gTlVMTDsKICAgIHN0cnVjdCBwaW5nUmVzdWx0c1RhYmxlX2RhdGEgKlN0b3JhZ2VOZXcgPSBOVUxMOwogICAgc3RydWN0IGFkZHJpbmZvICphaSA9IE5VTEw7CiAgICBjaGFyICAgICAgICAgICAqaG9zdCA9IE5VTEw7CiAgICBuZXRzbm1wX3ZhcmlhYmxlX2xpc3QgKnZhcnMgPSBOVUxMOwoKICAgIHNubXBfdmFybGlzdF9hZGRfdmFyaWFibGUoJnZhcnMsIE5VTEwsIDAsIEFTTl9PQ1RFVF9TVFIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGl0ZW0tPnBpbmdDdGxPd25lckluZGV4LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpdGVtLT5waW5nQ3RsT3duZXJJbmRleExlbik7CiAgICBzbm1wX3Zhcmxpc3RfYWRkX3ZhcmlhYmxlKCZ2YXJzLCBOVUxMLCAwLCBBU05fT0NURVRfU1RSLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpdGVtLT5waW5nQ3RsVGVzdE5hbWUsIGl0ZW0tPnBpbmdDdGxUZXN0TmFtZUxlbik7CgogICAgU3RvcmFnZU5ldyA9IGhlYWRlcl9jb21wbGV4X2dldChwaW5nUmVzdWx0c1RhYmxlU3RvcmFnZSwgdmFycyk7CiAgICBzbm1wX2ZyZWVfdmFyYmluZCh2YXJzKTsKICAgIGlmIChTdG9yYWdlTmV3KSB7CiAgICAgICAgU3RvcmFnZU5ldy0+cGluZ1Jlc3VsdHNTZW5kUHJvYmVzID0gMDsKICAgICAgICBTdG9yYWdlTmV3LT5waW5nUmVzdWx0c1Byb2JlUmVzcG9uc2VzID0gMDsKICAgICAgICByZXR1cm47CiAgICB9CgogICAgaG9zdCA9IGl0ZW0tPnBpbmdDdGxUYXJnZXRBZGRyZXNzOwogICAgYWkgPSBob3N0X3NlcnYoaG9zdCwgTlVMTCwgMCwgMCk7CiAgICBTdG9yYWdlVG1wID0gU05NUF9NQUxMT0NfU1RSVUNUKHBpbmdSZXN1bHRzVGFibGVfZGF0YSk7CgogICAgU3RvcmFnZVRtcC0+cGluZ0N0bE93bmVySW5kZXggPQogICAgICAgIChjaGFyICopIG1hbGxvYyhpdGVtLT5waW5nQ3RsT3duZXJJbmRleExlbiArIDEpOwogICAgbWVtY3B5KFN0b3JhZ2VUbXAtPnBpbmdDdGxPd25lckluZGV4LCBpdGVtLT5waW5nQ3RsT3duZXJJbmRleCwKICAgICAgICAgICBpdGVtLT5waW5nQ3RsT3duZXJJbmRleExlbiArIDEpOwogICAgU3RvcmFnZVRtcC0+cGluZ0N0bE93bmVySW5kZXhbaXRlbS0+cGluZ0N0bE93bmVySW5kZXhMZW5dID0gJ1wwJzsKICAgIFN0b3JhZ2VUbXAtPnBpbmdDdGxPd25lckluZGV4TGVuID0gaXRlbS0+cGluZ0N0bE93bmVySW5kZXhMZW47CgogICAgU3RvcmFnZVRtcC0+cGluZ0N0bFRlc3ROYW1lID0KICAgICAgICAoY2hhciAqKSBtYWxsb2MoaXRlbS0+cGluZ0N0bFRlc3ROYW1lTGVuICsgMSk7CiAgICBtZW1jcHkoU3RvcmFnZVRtcC0+cGluZ0N0bFRlc3ROYW1lLCBpdGVtLT5waW5nQ3RsVGVzdE5hbWUsCiAgICAgICAgICAgaXRlbS0+cGluZ0N0bFRlc3ROYW1lTGVuICsgMSk7CiAgICBTdG9yYWdlVG1wLT5waW5nQ3RsVGVzdE5hbWVbaXRlbS0+cGluZ0N0bFRlc3ROYW1lTGVuXSA9ICdcMCc7CiAgICBTdG9yYWdlVG1wLT5waW5nQ3RsVGVzdE5hbWVMZW4gPSBpdGVtLT5waW5nQ3RsVGVzdE5hbWVMZW47CgogICAgU3RvcmFnZVRtcC0+cGluZ1Jlc3VsdHNPcGVyU3RhdHVzID0gMTsKCiAgICBpZiAoaXRlbS0+cGluZ0N0bFRhcmdldEFkZHJlc3NUeXBlID09IDEKICAgICAgICB8fCBpdGVtLT5waW5nQ3RsVGFyZ2V0QWRkcmVzc1R5cGUgPT0gMTYpIHsKICAgICAgICBjb25zdCBjaGFyKiBzdHI7CgogICAgICAgIFN0b3JhZ2VUbXAtPnBpbmdSZXN1bHRzSXBUYXJnZXRBZGRyZXNzVHlwZSA9IGFpID8gMSA6IDA7CiAgICAgICAgc3RyID0gYWkgPyBzb2NrX250b3BfaG9zdChhaS0+YWlfYWRkciwgYWktPmFpX2FkZHJsZW4pIDogTlVMTDsKICAgICAgICBpZiAoIXN0cikKICAgICAgICAgICAgc3RyID0gIiI7CiAgICAgICAgU3RvcmFnZVRtcC0+cGluZ1Jlc3VsdHNJcFRhcmdldEFkZHJlc3MgPSBzdHJkdXAoc3RyKTsKICAgICAgICBTdG9yYWdlVG1wLT5waW5nUmVzdWx0c0lwVGFyZ2V0QWRkcmVzc0xlbiA9IHN0cmxlbihzdHIpOwogICAgfQogICAgaWYgKGl0ZW0tPnBpbmdDdGxUYXJnZXRBZGRyZXNzVHlwZSA9PSAyKSB7CgogICAgICAgIHN0cnVjdCBzb2NrYWRkcl9pbjYgd2hlcmV0bzsgICAgLyogV2hvIHRvIHRyeSB0byByZWFjaCAqLwogICAgICAgIHJlZ2lzdGVyIHN0cnVjdCBzb2NrYWRkcl9pbjYgKnRvID0KICAgICAgICAgICAgKHN0cnVjdCBzb2NrYWRkcl9pbjYgKikgJndoZXJldG87CiAgICAgICAgc3RydWN0IGhvc3RlbnQgKmhwID0gTlVMTDsKICAgICAgICBjaGFyICAgICAgICAgICAgcGFbNjRdOwoKICAgICAgICB0by0+c2luNl9mYW1pbHkgPSBBRl9JTkVUNjsKICAgICAgICB0by0+c2luNl9wb3J0ID0gaHRvbnMoMzM0MzQpOwoKICAgICAgICBpZiAoaW5ldF9wdG9uKEFGX0lORVQ2LCBob3N0LCAmdG8tPnNpbjZfYWRkcikgPiAwKSB7CiAgICAgICAgICAgIFN0b3JhZ2VUbXAtPnBpbmdSZXN1bHRzSXBUYXJnZXRBZGRyZXNzVHlwZSA9IDI7CiAgICAgICAgICAgIFN0b3JhZ2VUbXAtPnBpbmdSZXN1bHRzSXBUYXJnZXRBZGRyZXNzID0gc3RyZHVwKGhvc3QpOwogICAgICAgICAgICBTdG9yYWdlVG1wLT5waW5nUmVzdWx0c0lwVGFyZ2V0QWRkcmVzc0xlbiA9IHN0cmxlbihob3N0KTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgICBocCA9IGdldGhvc3RieW5hbWUyKGhvc3QsIEFGX0lORVQ2KTsKICAgICAgICAgICAgaWYgKGhwICE9IE5VTEwpIHsKICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgICAgICpob3N0bmFtZSA9IE5VTEw7CiAgICAgICAgICAgICAgICBtZW1tb3ZlKChjYWRkcl90KSAmIHRvLT5zaW42X2FkZHIsIGhwLT5oX2FkZHIsIDE2KTsKICAgICAgICAgICAgICAgIGhvc3RuYW1lID0gaW5ldF9udG9wKEFGX0lORVQ2LCAmdG8tPnNpbjZfYWRkciwgcGEsIDY0KTsKICAgICAgICAgICAgICAgIFN0b3JhZ2VUbXAtPnBpbmdSZXN1bHRzSXBUYXJnZXRBZGRyZXNzVHlwZSA9IDI7CiAgICAgICAgICAgICAgICBTdG9yYWdlVG1wLT5waW5nUmVzdWx0c0lwVGFyZ2V0QWRkcmVzcyA9IHN0cmR1cChob3N0bmFtZSk7CiAgICAgICAgICAgICAgICBTdG9yYWdlVG1wLT5waW5nUmVzdWx0c0lwVGFyZ2V0QWRkcmVzc0xlbiA9IHN0cmxlbihob3N0bmFtZSk7CiAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAodm9pZCkgZnByaW50ZihzdGRlcnIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidHJhY2Vyb3V0ZTogdW5rbm93biBob3N0ICVzXG4iLCBob3N0KTsKICAgICAgICAgICAgICAgIFN0b3JhZ2VUbXAtPnBpbmdSZXN1bHRzSXBUYXJnZXRBZGRyZXNzVHlwZSA9IDA7CiAgICAgICAgICAgICAgICBTdG9yYWdlVG1wLT5waW5nUmVzdWx0c0lwVGFyZ2V0QWRkcmVzcyA9IHN0cmR1cCgiIik7CiAgICAgICAgICAgICAgICBTdG9yYWdlVG1wLT5waW5nUmVzdWx0c0lwVGFyZ2V0QWRkcmVzc0xlbiA9IDA7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9CgoKICAgIFN0b3JhZ2VUbXAtPnBpbmdSZXN1bHRzTWluUnR0ID0gMDsKICAgIFN0b3JhZ2VUbXAtPnBpbmdSZXN1bHRzTWF4UnR0ID0gMDsKICAgIFN0b3JhZ2VUbXAtPnBpbmdSZXN1bHRzQXZlcmFnZVJ0dCA9IDA7CiAgICBTdG9yYWdlVG1wLT5waW5nUmVzdWx0c1Byb2JlUmVzcG9uc2VzID0gMDsKICAgIFN0b3JhZ2VUbXAtPnBpbmdSZXN1bHRzU2VuZFByb2JlcyA9IDA7CiAgICBTdG9yYWdlVG1wLT5waW5nUmVzdWx0c1J0dFN1bU9mU3F1YXJlcyA9IDA7CgogICAgU3RvcmFnZVRtcC0+cGluZ1Jlc3VsdHNMYXN0R29vZFByb2JlTGVuID0gMDsKCiAgICBpdGVtLT5waW5nUmVzdWx0cyA9IFN0b3JhZ2VUbXA7CiAgICBpZiAoaXRlbS0+cGluZ1Byb2JlSGlzdG9yeU1heEluZGV4ID09IDApIHsKICAgICAgICBpZiAoaXRlbS0+cGluZ1Jlc3VsdHMgIT0gTlVMTCkgewogICAgICAgICAgICBpZiAocGluZ1Jlc3VsdHNUYWJsZV9hZGQoaXRlbSkgIT0gU05NUEVSUl9TVUNDRVNTKSB7CiAgICAgICAgICAgICAgICBERUJVR01TR1RMKCgicGluZ1Jlc3VsdHNUYWJsZSIsICJpbml0IGFuIGVudHJ5IGVycm9yXG4iKSk7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9CiAgICBmcmVlYWRkcmluZm8oYWkpOwp9CgoKaW50Cm1vZGlmeV9SZXN1bHRzT3BlcihzdHJ1Y3QgcGluZ0N0bFRhYmxlX2RhdGEgKnRoZWRhdGEsIGxvbmcgdmFsKQp7CiAgICBuZXRzbm1wX3ZhcmlhYmxlX2xpc3QgKnZhcnMgPSBOVUxMOwogICAgc3RydWN0IHBpbmdSZXN1bHRzVGFibGVfZGF0YSAqU3RvcmFnZVRtcCA9IE5VTEw7CgogICAgc25tcF92YXJsaXN0X2FkZF92YXJpYWJsZSgmdmFycywgTlVMTCwgMCwgQVNOX09DVEVUX1NUUiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhlZGF0YS0+cGluZ0N0bE93bmVySW5kZXgsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoZWRhdGEtPnBpbmdDdGxPd25lckluZGV4TGVuKTsKICAgIHNubXBfdmFybGlzdF9hZGRfdmFyaWFibGUoJnZhcnMsIE5VTEwsIDAsIEFTTl9PQ1RFVF9TVFIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoZWRhdGEtPnBpbmdDdGxUZXN0TmFtZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhlZGF0YS0+cGluZ0N0bFRlc3ROYW1lTGVuKTsKCiAgICBTdG9yYWdlVG1wID0gaGVhZGVyX2NvbXBsZXhfZ2V0KHBpbmdSZXN1bHRzVGFibGVTdG9yYWdlLCB2YXJzKTsKICAgIHNubXBfZnJlZV92YXJiaW5kKHZhcnMpOwogICAgaWYgKCFTdG9yYWdlVG1wKQogICAgICAgIHJldHVybiBTTk1QX0VSUl9OT1NVQ0hOQU1FOwogICAgU3RvcmFnZVRtcC0+cGluZ1Jlc3VsdHNPcGVyU3RhdHVzID0gdmFsOwoKICAgIERFQlVHTVNHVEwoKCJwaW5nUmVzdWx0c09wZXJTdGF0dXMiLCAiZG9uZS5cbiIpKTsKICAgIHJldHVybiBTTk1QRVJSX1NVQ0NFU1M7Cn0KCgppbnQKcGluZ1Jlc3VsdHNUYWJsZV9kZWwoc3RydWN0IHBpbmdDdGxUYWJsZV9kYXRhICp0aGVkYXRhKQp7CiAgICBzdHJ1Y3QgaGVhZGVyX2NvbXBsZXhfaW5kZXggKmhjaXB0cjIsICpuZXh0OwogICAgc3RydWN0IHBpbmdSZXN1bHRzVGFibGVfZGF0YSAqU3RvcmFnZURlbCA9IE5VTEw7CiAgICBuZXRzbm1wX3ZhcmlhYmxlX2xpc3QgKnZhcnMgPSBOVUxMOwogICAgb2lkICAgICAgICAgICAgIG5ld29pZFtNQVhfT0lEX0xFTl07CiAgICBzaXplX3QgICAgICAgICAgbmV3b2lkX2xlbjsKCiAgICBzbm1wX3Zhcmxpc3RfYWRkX3ZhcmlhYmxlKCZ2YXJzLCBOVUxMLCAwLCBBU05fT0NURVRfU1RSLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGVkYXRhLT5waW5nQ3RsT3duZXJJbmRleCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhlZGF0YS0+cGluZ0N0bE93bmVySW5kZXhMZW4pOwogICAgc25tcF92YXJsaXN0X2FkZF92YXJpYWJsZSgmdmFycywgTlVMTCwgMCwgQVNOX09DVEVUX1NUUiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhlZGF0YS0+cGluZ0N0bFRlc3ROYW1lLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGVkYXRhLT5waW5nQ3RsVGVzdE5hbWVMZW4pOwogICAgaGVhZGVyX2NvbXBsZXhfZ2VuZXJhdGVfb2lkKG5ld29pZCwgJm5ld29pZF9sZW4sIE5VTEwsIDAsIHZhcnMpOwogICAgc25tcF9mcmVlX3ZhcmJpbmQodmFycyk7CgogICAgZm9yIChoY2lwdHIyID0gcGluZ1Jlc3VsdHNUYWJsZVN0b3JhZ2U7IGhjaXB0cjI7IGhjaXB0cjIgPSBuZXh0KSB7CiAgICAgICAgbmV4dCA9IGhjaXB0cjItPm5leHQ7CiAgICAgICAgaWYgKHNubXBfb2lkX2NvbXBhcmUobmV3b2lkLCBuZXdvaWRfbGVuLCBoY2lwdHIyLT5uYW1lLCBuZXdvaWRfbGVuKQogICAgICAgICAgICA9PSAwKSB7CiAgICAgICAgICAgIFN0b3JhZ2VEZWwgPQogICAgICAgICAgICAgICAgaGVhZGVyX2NvbXBsZXhfZXh0cmFjdF9lbnRyeSgmcGluZ1Jlc3VsdHNUYWJsZVN0b3JhZ2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhjaXB0cjIpOwogICAgICAgICAgICBpZiAoU3RvcmFnZURlbCAhPSBOVUxMKSB7CiAgICAgICAgICAgICAgICBTTk1QX0ZSRUUoU3RvcmFnZURlbC0+cGluZ0N0bE93bmVySW5kZXgpOwogICAgICAgICAgICAgICAgU05NUF9GUkVFKFN0b3JhZ2VEZWwtPnBpbmdDdGxUZXN0TmFtZSk7CiAgICAgICAgICAgICAgICBTTk1QX0ZSRUUoU3RvcmFnZURlbC0+cGluZ1Jlc3VsdHNJcFRhcmdldEFkZHJlc3MpOwogICAgICAgICAgICAgICAgU05NUF9GUkVFKFN0b3JhZ2VEZWwtPnBpbmdSZXN1bHRzTGFzdEdvb2RQcm9iZSk7CiAgICAgICAgICAgICAgICBTTk1QX0ZSRUUoU3RvcmFnZURlbCk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgREVCVUdNU0dUTCgoInBpbmdSZXN1bHRzVGFibGUiLCAiZGVsZXRlICBzdWNjZXNzIVxuIikpOwoKICAgICAgICB9CiAgICB9CiAgICByZXR1cm4gU05NUEVSUl9TVUNDRVNTOwp9CgoKaW50CnBpbmdQcm9iZUhpc3RvcnlUYWJsZV9kZWwoc3RydWN0IHBpbmdDdGxUYWJsZV9kYXRhICp0aGVkYXRhKQp7CiAgICBzdHJ1Y3QgaGVhZGVyX2NvbXBsZXhfaW5kZXggKmhjaXB0cjIsICpuZXh0OwogICAgc3RydWN0IHBpbmdQcm9iZUhpc3RvcnlUYWJsZV9kYXRhICpTdG9yYWdlRGVsID0gTlVMTDsKICAgIG5ldHNubXBfdmFyaWFibGVfbGlzdCAqdmFycyA9IE5VTEw7CiAgICBvaWQgICAgICAgICAgICAgbmV3b2lkW01BWF9PSURfTEVOXTsKICAgIHNpemVfdCAgICAgICAgICBuZXdvaWRfbGVuOwoKICAgIHNubXBfdmFybGlzdF9hZGRfdmFyaWFibGUoJnZhcnMsIE5VTEwsIDAsIEFTTl9PQ1RFVF9TVFIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoZWRhdGEtPnBpbmdDdGxPd25lckluZGV4LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGVkYXRhLT5waW5nQ3RsT3duZXJJbmRleExlbik7CiAgICBzbm1wX3Zhcmxpc3RfYWRkX3ZhcmlhYmxlKCZ2YXJzLCBOVUxMLCAwLCBBU05fT0NURVRfU1RSLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGVkYXRhLT5waW5nQ3RsVGVzdE5hbWUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoZWRhdGEtPnBpbmdDdGxUZXN0TmFtZUxlbik7CiAgICBoZWFkZXJfY29tcGxleF9nZW5lcmF0ZV9vaWQobmV3b2lkLCAmbmV3b2lkX2xlbiwgTlVMTCwgMCwgdmFycyk7CiAgICBzbm1wX2ZyZWVfdmFyYmluZCh2YXJzKTsKCiAgICBmb3IgKGhjaXB0cjIgPSBwaW5nUHJvYmVIaXN0b3J5VGFibGVTdG9yYWdlOyBoY2lwdHIyOyBoY2lwdHIyID0gbmV4dCkgewogICAgICAgIG5leHQgPSBoY2lwdHIyLT5uZXh0OwogICAgICAgIGlmIChzbm1wX29pZF9jb21wYXJlKG5ld29pZCwgbmV3b2lkX2xlbiwgaGNpcHRyMi0+bmFtZSwgbmV3b2lkX2xlbikKICAgICAgICAgICAgPT0gMCkgewogICAgICAgICAgICBTdG9yYWdlRGVsID0KICAgICAgICAgICAgICAgIGhlYWRlcl9jb21wbGV4X2V4dHJhY3RfZW50cnkoJnBpbmdQcm9iZUhpc3RvcnlUYWJsZVN0b3JhZ2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhjaXB0cjIpOwogICAgICAgICAgICBpZiAoU3RvcmFnZURlbCAhPSBOVUxMKSB7CiAgICAgICAgICAgICAgICBTTk1QX0ZSRUUoU3RvcmFnZURlbC0+cGluZ0N0bE93bmVySW5kZXgpOwogICAgICAgICAgICAgICAgU05NUF9GUkVFKFN0b3JhZ2VEZWwtPnBpbmdDdGxUZXN0TmFtZSk7CiAgICAgICAgICAgICAgICBTTk1QX0ZSRUUoU3RvcmFnZURlbC0+cGluZ1Byb2JlSGlzdG9yeVRpbWUpOwogICAgICAgICAgICAgICAgU05NUF9GUkVFKFN0b3JhZ2VEZWwpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIERFQlVHTVNHVEwoKCJwaW5nUHJvYmVIaXN0b3J5VGFibGUiLCAiZGVsZXRlICBzdWNjZXNzIVxuIikpOwoKICAgICAgICB9CiAgICB9CiAgICByZXR1cm4gU05NUEVSUl9TVUNDRVNTOwp9CgoKaW50CndyaXRlX3BpbmdDdGxUYXJnZXRBZGRyZXNzVHlwZShpbnQgYWN0aW9uLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdV9jaGFyICogdmFyX3ZhbCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVfY2hhciB2YXJfdmFsX3R5cGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QgdmFyX3ZhbF9sZW4sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1X2NoYXIgKiBzdGF0UCwgb2lkICogbmFtZSwgc2l6ZV90IG5hbWVfbGVuKQp7CiAgICBzdGF0aWMgc2l6ZV90ICAgdG1wdmFyOwogICAgc3RydWN0IHBpbmdDdGxUYWJsZV9kYXRhICpTdG9yYWdlVG1wID0gTlVMTDsKICAgIHNpemVfdCAgICAgICAgICBuZXdsZW4gPQogICAgICAgIG5hbWVfbGVuIC0gKHNpemVvZihwaW5nQ3RsVGFibGVfdmFyaWFibGVzX29pZCkgLyBzaXplb2Yob2lkKSArCiAgICAgICAgICAgICAgICAgICAgMyAtIDEpOwoKCiAgICBERUJVR01TR1RMKCgicGluZ0N0bFRhYmxlIiwKICAgICAgICAgICAgICAgICJ3cml0ZV9waW5nQ3RsVGFyZ2V0QWRkcmVzc1R5cGUgZW50ZXJpbmcgYWN0aW9uPSVkLi4uICBcbiIsCiAgICAgICAgICAgICAgICBhY3Rpb24pKTsKCiAgICBpZiAoKFN0b3JhZ2VUbXAgPQogICAgICAgICBoZWFkZXJfY29tcGxleChwaW5nQ3RsVGFibGVTdG9yYWdlLCBOVUxMLAogICAgICAgICAgICAgICAgICAgICAgICAmbmFtZVtzaXplb2YocGluZ0N0bFRhYmxlX3ZhcmlhYmxlc19vaWQpIC8KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKG9pZCkgKyAzIC0gMV0sICZuZXdsZW4sIDEsIE5VTEwsCiAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwpKSA9PSBOVUxMKQogICAgICAgIHJldHVybiBTTk1QX0VSUl9OT1NVQ0hOQU1FOyAgICAgLyogcmVtb3ZlIGlmIHlvdSBzdXBwb3J0IGNyZWF0aW9uIGhlcmUgKi8KCiAgICBpZiAoU3RvcmFnZVRtcCAmJiBTdG9yYWdlVG1wLT5zdG9yYWdlVHlwZSA9PSBTVF9SRUFET05MWSkgewogICAgICAgIHJldHVybiBTTk1QX0VSUl9OT1RXUklUQUJMRTsKICAgIH0KCiAgICBpZiAoU3RvcmFnZVRtcCAmJiBTdG9yYWdlVG1wLT5waW5nQ3RsUm93U3RhdHVzID09IFJTX0FDVElWRSkgewogICAgICAgIHJldHVybiBTTk1QX0VSUl9OT1RXUklUQUJMRTsKICAgIH0KICAgIHN3aXRjaCAoYWN0aW9uKSB7CiAgICBjYXNlIFJFU0VSVkUxOgogICAgICAgIGlmICh2YXJfdmFsX3R5cGUgIT0gQVNOX0lOVEVHRVIpIHsKICAgICAgICAgICAgc25tcF9sb2coTE9HX0VSUiwKICAgICAgICAgICAgICAgICAgICAgIndyaXRlIHRvIHBpbmdDdGxUYXJnZXRBZGRyZXNzVHlwZSBub3QgQVNOX0lOVEVHRVJcbiIpOwogICAgICAgICAgICByZXR1cm4gU05NUF9FUlJfV1JPTkdUWVBFOwogICAgICAgIH0KICAgICAgICBicmVhazsKCgogICAgY2FzZSBSRVNFUlZFMjoKICAgICAgICAvKgogICAgICAgICAqIG1lbW9yeSByZXNldmVyYXRpb24sIGZpbmFsIHByZXBhcmF0aW9uLi4uIAogICAgICAgICAqLwogICAgICAgIGJyZWFrOwoKCiAgICBjYXNlIEZSRUU6CiAgICAgICAgLyoKICAgICAgICAgKiBSZWxlYXNlIGFueSByZXNvdXJjZXMgdGhhdCBoYXZlIGJlZW4gYWxsb2NhdGVkIAogICAgICAgICAqLwogICAgICAgIGJyZWFrOwoKCiAgICBjYXNlIEFDVElPTjoKICAgICAgICAvKgogICAgICAgICAqIFRoZSB2YXJpYWJsZSBoYXMgYmVlbiBzdG9yZWQgaW4gb2JqaWQgZm9yCiAgICAgICAgICogeW91IHRvIHVzZSwgYW5kIHlvdSBoYXZlIGp1c3QgYmVlbiBhc2tlZCB0byBkbyBzb21ldGhpbmcgd2l0aAogICAgICAgICAqIGl0LiAgTm90ZSB0aGF0IGFueXRoaW5nIGRvbmUgaGVyZSBtdXN0IGJlIHJldmVyc2FibGUgaW4gdGhlIFVORE8gY2FzZSAKICAgICAgICAgKi8KICAgICAgICB0bXB2YXIgPSBTdG9yYWdlVG1wLT5waW5nQ3RsVGFyZ2V0QWRkcmVzc1R5cGU7CiAgICAgICAgU3RvcmFnZVRtcC0+cGluZ0N0bFRhcmdldEFkZHJlc3NUeXBlID0gKigobG9uZyAqKSB2YXJfdmFsKTsKICAgICAgICBicmVhazsKCgogICAgY2FzZSBVTkRPOgogICAgICAgIC8qCiAgICAgICAgICogQmFjayBvdXQgYW55IGNoYW5nZXMgbWFkZSBpbiB0aGUgQUNUSU9OIGNhc2UgCiAgICAgICAgICovCiAgICAgICAgU3RvcmFnZVRtcC0+cGluZ0N0bFRhcmdldEFkZHJlc3NUeXBlID0gdG1wdmFyOwogICAgICAgIGJyZWFrOwoKCiAgICBjYXNlIENPTU1JVDoKICAgICAgICAvKgogICAgICAgICAqIFRoaW5ncyBhcmUgd29ya2luZyB3ZWxsLCBzbyBpdCdzIG5vdyBzYWZlIHRvIG1ha2UgdGhlIGNoYW5nZQogICAgICAgICAqIHBlcm1hbmVudGx5LiAgTWFrZSBzdXJlIHRoYXQgYW55dGhpbmcgZG9uZSBoZXJlIGNhbid0IGZhaWwhIAogICAgICAgICAqLwogICAgICAgIHNubXBfc3RvcmVfbmVlZGVkKE5VTEwpOwogICAgICAgIGJyZWFrOwogICAgfQogICAgcmV0dXJuIFNOTVBfRVJSX05PRVJST1I7Cn0KCgoKaW50CndyaXRlX3BpbmdDdGxUYXJnZXRBZGRyZXNzKGludCBhY3Rpb24sCiAgICAgICAgICAgICAgICAgICAgICAgICAgIHVfY2hhciAqIHZhcl92YWwsCiAgICAgICAgICAgICAgICAgICAgICAgICAgIHVfY2hhciB2YXJfdmFsX3R5cGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCB2YXJfdmFsX2xlbiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgdV9jaGFyICogc3RhdFAsIG9pZCAqIG5hbWUsIHNpemVfdCBuYW1lX2xlbikKewogICAgc3RhdGljIGNoYXIgICAgKnRtcHZhcjsKICAgIHN0YXRpYyBzaXplX3QgICB0bXBsZW47CiAgICBzdHJ1Y3QgcGluZ0N0bFRhYmxlX2RhdGEgKlN0b3JhZ2VUbXAgPSBOVUxMOwogICAgc2l6ZV90ICAgICAgICAgIG5ld2xlbiA9CiAgICAgICAgbmFtZV9sZW4gLSAoc2l6ZW9mKHBpbmdDdGxUYWJsZV92YXJpYWJsZXNfb2lkKSAvIHNpemVvZihvaWQpICsKICAgICAgICAgICAgICAgICAgICAzIC0gMSk7CgogICAgaWYgKChTdG9yYWdlVG1wID0KICAgICAgICAgaGVhZGVyX2NvbXBsZXgocGluZ0N0bFRhYmxlU3RvcmFnZSwgTlVMTCwKICAgICAgICAgICAgICAgICAgICAgICAgJm5hbWVbc2l6ZW9mKHBpbmdDdGxUYWJsZV92YXJpYWJsZXNfb2lkKSAvCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZihvaWQpICsgMyAtIDFdLCAmbmV3bGVuLCAxLCBOVUxMLAogICAgICAgICAgICAgICAgICAgICAgICBOVUxMKSkgPT0gTlVMTCkKICAgICAgICByZXR1cm4gU05NUF9FUlJfTk9TVUNITkFNRTsgICAgIC8qIHJlbW92ZSBpZiB5b3Ugc3VwcG9ydCBjcmVhdGlvbiBoZXJlICovCgogICAgaWYgKFN0b3JhZ2VUbXAgJiYgU3RvcmFnZVRtcC0+c3RvcmFnZVR5cGUgPT0gU1RfUkVBRE9OTFkpIHsKICAgICAgICByZXR1cm4gU05NUF9FUlJfTk9UV1JJVEFCTEU7CiAgICB9CgogICAgaWYgKFN0b3JhZ2VUbXAgJiYgU3RvcmFnZVRtcC0+cGluZ0N0bFJvd1N0YXR1cyA9PSBSU19BQ1RJVkUpIHsKICAgICAgICByZXR1cm4gU05NUF9FUlJfTk9UV1JJVEFCTEU7CiAgICB9CgogICAgc3dpdGNoIChhY3Rpb24pIHsKICAgIGNhc2UgUkVTRVJWRTE6CiAgICAgICAgaWYgKHZhcl92YWxfdHlwZSAhPSBBU05fT0NURVRfU1RSKSB7CiAgICAgICAgICAgIHNubXBfbG9nKExPR19FUlIsCiAgICAgICAgICAgICAgICAgICAgICJ3cml0ZSB0byBwaW5nQ3RsVGFyZ2V0QWRkcmVzcyBub3QgQVNOX09DVEVUX1NUUlxuIik7CiAgICAgICAgICAgIHJldHVybiBTTk1QX0VSUl9XUk9OR1RZUEU7CiAgICAgICAgfQogICAgICAgIGJyZWFrOwoKCiAgICBjYXNlIFJFU0VSVkUyOgogICAgICAgIC8qCiAgICAgICAgICogbWVtb3J5IHJlc2V2ZXJhdGlvbiwgZmluYWwgcHJlcGFyYXRpb24uLi4gCiAgICAgICAgICovCiAgICAgICAgYnJlYWs7CgoKICAgIGNhc2UgRlJFRToKICAgICAgICAvKgogICAgICAgICAqIFJlbGVhc2UgYW55IHJlc291cmNlcyB0aGF0IGhhdmUgYmVlbiBhbGxvY2F0ZWQgCiAgICAgICAgICovCiAgICAgICAgYnJlYWs7CgoKICAgIGNhc2UgQUNUSU9OOgogICAgICAgIC8qCiAgICAgICAgICogVGhlIHZhcmlhYmxlIGhhcyBiZWVuIHN0b3JlZCBpbiBsb25nX3JldCBmb3IKICAgICAgICAgKiB5b3UgdG8gdXNlLCBhbmQgeW91IGhhdmUganVzdCBiZWVuIGFza2VkIHRvIGRvIHNvbWV0aGluZyB3aXRoCiAgICAgICAgICogaXQuICBOb3RlIHRoYXQgYW55dGhpbmcgZG9uZSBoZXJlIG11c3QgYmUgcmV2ZXJzYWJsZSBpbiB0aGUgVU5ETyBjYXNlIAogICAgICAgICAqLwogICAgICAgIHRtcHZhciA9IFN0b3JhZ2VUbXAtPnBpbmdDdGxUYXJnZXRBZGRyZXNzOwogICAgICAgIHRtcGxlbiA9IFN0b3JhZ2VUbXAtPnBpbmdDdGxUYXJnZXRBZGRyZXNzTGVuOwoKICAgICAgICBTdG9yYWdlVG1wLT5waW5nQ3RsVGFyZ2V0QWRkcmVzcyA9CiAgICAgICAgICAgIChjaGFyICopIG1hbGxvYyh2YXJfdmFsX2xlbiArIDEpOwogICAgICAgIGlmIChTdG9yYWdlVG1wLT5waW5nQ3RsVGFyZ2V0QWRkcmVzcyA9PSBOVUxMKSB7CiAgICAgICAgICAgIGV4aXQoMSk7CiAgICAgICAgfQogICAgICAgIG1lbWNweShTdG9yYWdlVG1wLT5waW5nQ3RsVGFyZ2V0QWRkcmVzcywgdmFyX3ZhbCwgdmFyX3ZhbF9sZW4pOwogICAgICAgIFN0b3JhZ2VUbXAtPnBpbmdDdGxUYXJnZXRBZGRyZXNzW3Zhcl92YWxfbGVuXSA9ICdcMCc7CiAgICAgICAgU3RvcmFnZVRtcC0+cGluZ0N0bFRhcmdldEFkZHJlc3NMZW4gPSB2YXJfdmFsX2xlbjsKCiAgICAgICAgYnJlYWs7CgoKICAgIGNhc2UgVU5ETzoKICAgICAgICAvKgogICAgICAgICAqIEJhY2sgb3V0IGFueSBjaGFuZ2VzIG1hZGUgaW4gdGhlIEFDVElPTiBjYXNlIAogICAgICAgICAqLwogICAgICAgIFNOTVBfRlJFRShTdG9yYWdlVG1wLT5waW5nQ3RsVGFyZ2V0QWRkcmVzcyk7CiAgICAgICAgU3RvcmFnZVRtcC0+cGluZ0N0bFRhcmdldEFkZHJlc3MgPSB0bXB2YXI7CiAgICAgICAgU3RvcmFnZVRtcC0+cGluZ0N0bFRhcmdldEFkZHJlc3NMZW4gPSB0bXBsZW47CiAgICAgICAgYnJlYWs7CgoKICAgIGNhc2UgQ09NTUlUOgogICAgICAgIC8qCiAgICAgICAgICogVGhpbmdzIGFyZSB3b3JraW5nIHdlbGwsIHNvIGl0J3Mgbm93IHNhZmUgdG8gbWFrZSB0aGUgY2hhbmdlCiAgICAgICAgICogcGVybWFuZW50bHkuICBNYWtlIHN1cmUgdGhhdCBhbnl0aGluZyBkb25lIGhlcmUgY2FuJ3QgZmFpbCEgCiAgICAgICAgICovCiAgICAgICAgU05NUF9GUkVFKHRtcHZhcik7CiAgICAgICAgc25tcF9zdG9yZV9uZWVkZWQoTlVMTCk7CiAgICAgICAgYnJlYWs7CiAgICB9CiAgICByZXR1cm4gU05NUF9FUlJfTk9FUlJPUjsKfQoKCgppbnQKd3JpdGVfcGluZ0N0bERhdGFTaXplKGludCBhY3Rpb24sCiAgICAgICAgICAgICAgICAgICAgICB1X2NoYXIgKiB2YXJfdmFsLAogICAgICAgICAgICAgICAgICAgICAgdV9jaGFyIHZhcl92YWxfdHlwZSwKICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCB2YXJfdmFsX2xlbiwKICAgICAgICAgICAgICAgICAgICAgIHVfY2hhciAqIHN0YXRQLCBvaWQgKiBuYW1lLCBzaXplX3QgbmFtZV9sZW4pCnsKICAgIHN0YXRpYyBzaXplX3QgICB0bXB2YXI7CiAgICBzdHJ1Y3QgcGluZ0N0bFRhYmxlX2RhdGEgKlN0b3JhZ2VUbXAgPSBOVUxMOwogICAgc2l6ZV90ICAgICAgICAgIG5ld2xlbiA9CiAgICAgICAgbmFtZV9sZW4gLSAoc2l6ZW9mKHBpbmdDdGxUYWJsZV92YXJpYWJsZXNfb2lkKSAvIHNpemVvZihvaWQpICsKICAgICAgICAgICAgICAgICAgICAzIC0gMSk7CgoKICAgIERFQlVHTVNHVEwoKCJwaW5nQ3RsVGFibGUiLAogICAgICAgICAgICAgICAgInBpbmdDdGxEYXRhU2l6ZSBlbnRlcmluZyBhY3Rpb249JWQuLi4gIFxuIiwgYWN0aW9uKSk7CgogICAgaWYgKChTdG9yYWdlVG1wID0KICAgICAgICAgaGVhZGVyX2NvbXBsZXgocGluZ0N0bFRhYmxlU3RvcmFnZSwgTlVMTCwKICAgICAgICAgICAgICAgICAgICAgICAgJm5hbWVbc2l6ZW9mKHBpbmdDdGxUYWJsZV92YXJpYWJsZXNfb2lkKSAvCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZihvaWQpICsgMyAtIDFdLCAmbmV3bGVuLCAxLCBOVUxMLAogICAgICAgICAgICAgICAgICAgICAgICBOVUxMKSkgPT0gTlVMTCkKICAgICAgICByZXR1cm4gU05NUF9FUlJfTk9TVUNITkFNRTsgICAgIC8qIHJlbW92ZSBpZiB5b3Ugc3VwcG9ydCBjcmVhdGlvbiBoZXJlICovCgogICAgaWYgKFN0b3JhZ2VUbXAgJiYgU3RvcmFnZVRtcC0+c3RvcmFnZVR5cGUgPT0gU1RfUkVBRE9OTFkpIHsKICAgICAgICByZXR1cm4gU05NUF9FUlJfTk9UV1JJVEFCTEU7CiAgICB9CgogICAgaWYgKFN0b3JhZ2VUbXAgJiYgU3RvcmFnZVRtcC0+cGluZ0N0bFJvd1N0YXR1cyA9PSBSU19BQ1RJVkUpIHsKICAgICAgICByZXR1cm4gU05NUF9FUlJfTk9UV1JJVEFCTEU7CiAgICB9CiAgICBzd2l0Y2ggKGFjdGlvbikgewogICAgY2FzZSBSRVNFUlZFMToKICAgICAgICBpZiAodmFyX3ZhbF90eXBlICE9IEFTTl9VTlNJR05FRCkgewogICAgICAgICAgICBzbm1wX2xvZyhMT0dfRVJSLAogICAgICAgICAgICAgICAgICAgICAid3JpdGUgdG8gcGluZ0N0bERhdGFTaXplIG5vdCBBU05fVU5TSUdORURcbiIpOwogICAgICAgICAgICByZXR1cm4gU05NUF9FUlJfV1JPTkdUWVBFOwogICAgICAgIH0KICAgICAgICBicmVhazsKCgogICAgY2FzZSBSRVNFUlZFMjoKICAgICAgICAvKgogICAgICAgICAqIG1lbW9yeSByZXNldmVyYXRpb24sIGZpbmFsIHByZXBhcmF0aW9uLi4uIAogICAgICAgICAqLwogICAgICAgIGJyZWFrOwoKCiAgICBjYXNlIEZSRUU6CiAgICAgICAgLyoKICAgICAgICAgKiBSZWxlYXNlIGFueSByZXNvdXJjZXMgdGhhdCBoYXZlIGJlZW4gYWxsb2NhdGVkIAogICAgICAgICAqLwogICAgICAgIGJyZWFrOwoKCiAgICBjYXNlIEFDVElPTjoKICAgICAgICAvKgogICAgICAgICAqIFRoZSB2YXJpYWJsZSBoYXMgYmVlbiBzdG9yZWQgaW4gb2JqaWQgZm9yCiAgICAgICAgICogeW91IHRvIHVzZSwgYW5kIHlvdSBoYXZlIGp1c3QgYmVlbiBhc2tlZCB0byBkbyBzb21ldGhpbmcgd2l0aAogICAgICAgICAqIGl0LiAgTm90ZSB0aGF0IGFueXRoaW5nIGRvbmUgaGVyZSBtdXN0IGJlIHJldmVyc2FibGUgaW4gdGhlIFVORE8gY2FzZSAKICAgICAgICAgKi8KICAgICAgICB0bXB2YXIgPSBTdG9yYWdlVG1wLT5waW5nQ3RsRGF0YVNpemU7CiAgICAgICAgaWYgKCgqKChsb25nICopIHZhcl92YWwpKSA+PSAwICYmICgqKChsb25nICopIHZhcl92YWwpKSA8PSA2NTUwNykKICAgICAgICAgICAgU3RvcmFnZVRtcC0+cGluZ0N0bERhdGFTaXplID0gKigobG9uZyAqKSB2YXJfdmFsKTsKICAgICAgICBlbHNlCiAgICAgICAgICAgIFN0b3JhZ2VUbXAtPnBpbmdDdGxEYXRhU2l6ZSA9IDU2OwogICAgICAgIGJyZWFrOwoKCiAgICBjYXNlIFVORE86CiAgICAgICAgLyoKICAgICAgICAgKiBCYWNrIG91dCBhbnkgY2hhbmdlcyBtYWRlIGluIHRoZSBBQ1RJT04gY2FzZSAKICAgICAgICAgKi8KICAgICAgICBTdG9yYWdlVG1wLT5waW5nQ3RsRGF0YVNpemUgPSB0bXB2YXI7CiAgICAgICAgYnJlYWs7CgoKICAgIGNhc2UgQ09NTUlUOgogICAgICAgIC8qCiAgICAgICAgICogVGhpbmdzIGFyZSB3b3JraW5nIHdlbGwsIHNvIGl0J3Mgbm93IHNhZmUgdG8gbWFrZSB0aGUgY2hhbmdlCiAgICAgICAgICogcGVybWFuZW50bHkuICBNYWtlIHN1cmUgdGhhdCBhbnl0aGluZyBkb25lIGhlcmUgY2FuJ3QgZmFpbCEgCiAgICAgICAgICovCiAgICAgICAgc25tcF9zdG9yZV9uZWVkZWQoTlVMTCk7CiAgICAgICAgYnJlYWs7CiAgICB9CiAgICByZXR1cm4gU05NUF9FUlJfTk9FUlJPUjsKfQoKCgoKaW50CndyaXRlX3BpbmdDdGxUaW1lT3V0KGludCBhY3Rpb24sCiAgICAgICAgICAgICAgICAgICAgIHVfY2hhciAqIHZhcl92YWwsCiAgICAgICAgICAgICAgICAgICAgIHVfY2hhciB2YXJfdmFsX3R5cGUsCiAgICAgICAgICAgICAgICAgICAgIHNpemVfdCB2YXJfdmFsX2xlbiwKICAgICAgICAgICAgICAgICAgICAgdV9jaGFyICogc3RhdFAsIG9pZCAqIG5hbWUsIHNpemVfdCBuYW1lX2xlbikKewogICAgc3RhdGljIHNpemVfdCAgIHRtcHZhcjsKICAgIHN0cnVjdCBwaW5nQ3RsVGFibGVfZGF0YSAqU3RvcmFnZVRtcCA9IE5VTEw7CiAgICBzaXplX3QgICAgICAgICAgbmV3bGVuID0KICAgICAgICBuYW1lX2xlbiAtIChzaXplb2YocGluZ0N0bFRhYmxlX3ZhcmlhYmxlc19vaWQpIC8gc2l6ZW9mKG9pZCkgKwogICAgICAgICAgICAgICAgICAgIDMgLSAxKTsKCgogICAgREVCVUdNU0dUTCgoInBpbmdDdGxUYWJsZSIsCiAgICAgICAgICAgICAgICAicGluZ0N0bFRpbWVPdXQgZW50ZXJpbmcgYWN0aW9uPSVkLi4uICBcbiIsIGFjdGlvbikpOwoKICAgIGlmICgoU3RvcmFnZVRtcCA9CiAgICAgICAgIGhlYWRlcl9jb21wbGV4KHBpbmdDdGxUYWJsZVN0b3JhZ2UsIE5VTEwsCiAgICAgICAgICAgICAgICAgICAgICAgICZuYW1lW3NpemVvZihwaW5nQ3RsVGFibGVfdmFyaWFibGVzX29pZCkgLwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2Yob2lkKSArIDMgLSAxXSwgJm5ld2xlbiwgMSwgTlVMTCwKICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCkpID09IE5VTEwpCiAgICAgICAgcmV0dXJuIFNOTVBfRVJSX05PU1VDSE5BTUU7ICAgICAvKiByZW1vdmUgaWYgeW91IHN1cHBvcnQgY3JlYXRpb24gaGVyZSAqLwoKICAgIGlmIChTdG9yYWdlVG1wICYmIFN0b3JhZ2VUbXAtPnN0b3JhZ2VUeXBlID09IFNUX1JFQURPTkxZKSB7CiAgICAgICAgcmV0dXJuIFNOTVBfRVJSX05PVFdSSVRBQkxFOwogICAgfQoKICAgIGlmIChTdG9yYWdlVG1wICYmIFN0b3JhZ2VUbXAtPnBpbmdDdGxSb3dTdGF0dXMgPT0gUlNfQUNUSVZFKSB7CiAgICAgICAgcmV0dXJuIFNOTVBfRVJSX05PVFdSSVRBQkxFOwogICAgfQogICAgc3dpdGNoIChhY3Rpb24pIHsKICAgIGNhc2UgUkVTRVJWRTE6CiAgICAgICAgaWYgKHZhcl92YWxfdHlwZSAhPSBBU05fVU5TSUdORUQpIHsKICAgICAgICAgICAgc25tcF9sb2coTE9HX0VSUiwKICAgICAgICAgICAgICAgICAgICAgIndyaXRlIHRvIHBpbmdDdGxEYXRhU2l6ZSBub3QgQVNOX1VOU0lHTkVEXG4iKTsKICAgICAgICAgICAgcmV0dXJuIFNOTVBfRVJSX1dST05HVFlQRTsKICAgICAgICB9CiAgICAgICAgYnJlYWs7CgoKICAgIGNhc2UgUkVTRVJWRTI6CiAgICAgICAgLyoKICAgICAgICAgKiBtZW1vcnkgcmVzZXZlcmF0aW9uLCBmaW5hbCBwcmVwYXJhdGlvbi4uLiAKICAgICAgICAgKi8KICAgICAgICBicmVhazsKCgogICAgY2FzZSBGUkVFOgogICAgICAgIC8qCiAgICAgICAgICogUmVsZWFzZSBhbnkgcmVzb3VyY2VzIHRoYXQgaGF2ZSBiZWVuIGFsbG9jYXRlZCAKICAgICAgICAgKi8KICAgICAgICBicmVhazsKCgogICAgY2FzZSBBQ1RJT046CiAgICAgICAgLyoKICAgICAgICAgKiBUaGUgdmFyaWFibGUgaGFzIGJlZW4gc3RvcmVkIGluIG9iamlkIGZvcgogICAgICAgICAqIHlvdSB0byB1c2UsIGFuZCB5b3UgaGF2ZSBqdXN0IGJlZW4gYXNrZWQgdG8gZG8gc29tZXRoaW5nIHdpdGgKICAgICAgICAgKiBpdC4gIE5vdGUgdGhhdCBhbnl0aGluZyBkb25lIGhlcmUgbXVzdCBiZSByZXZlcnNhYmxlIGluIHRoZSBVTkRPIGNhc2UgCiAgICAgICAgICovCiAgICAgICAgdG1wdmFyID0gU3RvcmFnZVRtcC0+cGluZ0N0bFRpbWVPdXQ7CiAgICAgICAgaWYgKCgqKChsb25nICopIHZhcl92YWwpKSA+PSAxICYmICgqKChsb25nICopIHZhcl92YWwpKSA8PSA2MCkKICAgICAgICAgICAgU3RvcmFnZVRtcC0+cGluZ0N0bFRpbWVPdXQgPSAqKChsb25nICopIHZhcl92YWwpOwogICAgICAgIGVsc2UKICAgICAgICAgICAgU3RvcmFnZVRtcC0+cGluZ0N0bFRpbWVPdXQgPSAzOwogICAgICAgIGJyZWFrOwoKCiAgICBjYXNlIFVORE86CiAgICAgICAgLyoKICAgICAgICAgKiBCYWNrIG91dCBhbnkgY2hhbmdlcyBtYWRlIGluIHRoZSBBQ1RJT04gY2FzZSAKICAgICAgICAgKi8KICAgICAgICBTdG9yYWdlVG1wLT5waW5nQ3RsVGltZU91dCA9IHRtcHZhcjsKICAgICAgICBicmVhazsKCgogICAgY2FzZSBDT01NSVQ6CiAgICAgICAgLyoKICAgICAgICAgKiBUaGluZ3MgYXJlIHdvcmtpbmcgd2VsbCwgc28gaXQncyBub3cgc2FmZSB0byBtYWtlIHRoZSBjaGFuZ2UKICAgICAgICAgKiBwZXJtYW5lbnRseS4gIE1ha2Ugc3VyZSB0aGF0IGFueXRoaW5nIGRvbmUgaGVyZSBjYW4ndCBmYWlsISAKICAgICAgICAgKi8KICAgICAgICBzbm1wX3N0b3JlX25lZWRlZChOVUxMKTsKICAgICAgICBicmVhazsKICAgIH0KICAgIHJldHVybiBTTk1QX0VSUl9OT0VSUk9SOwp9CgoKCgoKaW50CndyaXRlX3BpbmdDdGxQcm9iZUNvdW50KGludCBhY3Rpb24sCiAgICAgICAgICAgICAgICAgICAgICAgIHVfY2hhciAqIHZhcl92YWwsCiAgICAgICAgICAgICAgICAgICAgICAgIHVfY2hhciB2YXJfdmFsX3R5cGUsCiAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCB2YXJfdmFsX2xlbiwKICAgICAgICAgICAgICAgICAgICAgICAgdV9jaGFyICogc3RhdFAsIG9pZCAqIG5hbWUsIHNpemVfdCBuYW1lX2xlbikKewogICAgc3RhdGljIHNpemVfdCAgIHRtcHZhcjsKICAgIHN0cnVjdCBwaW5nQ3RsVGFibGVfZGF0YSAqU3RvcmFnZVRtcCA9IE5VTEw7CiAgICBzaXplX3QgICAgICAgICAgbmV3bGVuID0KICAgICAgICBuYW1lX2xlbiAtIChzaXplb2YocGluZ0N0bFRhYmxlX3ZhcmlhYmxlc19vaWQpIC8gc2l6ZW9mKG9pZCkgKwogICAgICAgICAgICAgICAgICAgIDMgLSAxKTsKCgogICAgREVCVUdNU0dUTCgoInBpbmdDdGxUYWJsZSIsCiAgICAgICAgICAgICAgICAicGluZ0N0bFByb2JlQ291bnQgZW50ZXJpbmcgYWN0aW9uPSVkLi4uICBcbiIsIGFjdGlvbikpOwoKICAgIGlmICgoU3RvcmFnZVRtcCA9CiAgICAgICAgIGhlYWRlcl9jb21wbGV4KHBpbmdDdGxUYWJsZVN0b3JhZ2UsIE5VTEwsCiAgICAgICAgICAgICAgICAgICAgICAgICZuYW1lW3NpemVvZihwaW5nQ3RsVGFibGVfdmFyaWFibGVzX29pZCkgLwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2Yob2lkKSArIDMgLSAxXSwgJm5ld2xlbiwgMSwgTlVMTCwKICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCkpID09IE5VTEwpCiAgICAgICAgcmV0dXJuIFNOTVBfRVJSX05PU1VDSE5BTUU7ICAgICAvKiByZW1vdmUgaWYgeW91IHN1cHBvcnQgY3JlYXRpb24gaGVyZSAqLwoKICAgIGlmIChTdG9yYWdlVG1wICYmIFN0b3JhZ2VUbXAtPnN0b3JhZ2VUeXBlID09IFNUX1JFQURPTkxZKSB7CiAgICAgICAgcmV0dXJuIFNOTVBfRVJSX05PVFdSSVRBQkxFOwogICAgfQoKICAgIGlmIChTdG9yYWdlVG1wICYmIFN0b3JhZ2VUbXAtPnBpbmdDdGxSb3dTdGF0dXMgPT0gUlNfQUNUSVZFKSB7CiAgICAgICAgcmV0dXJuIFNOTVBfRVJSX05PVFdSSVRBQkxFOwogICAgfQogICAgc3dpdGNoIChhY3Rpb24pIHsKICAgIGNhc2UgUkVTRVJWRTE6CiAgICAgICAgaWYgKHZhcl92YWxfdHlwZSAhPSBBU05fVU5TSUdORUQpIHsKICAgICAgICAgICAgc25tcF9sb2coTE9HX0VSUiwKICAgICAgICAgICAgICAgICAgICAgIndyaXRlIHRvIHBpbmdDdGxEYXRhU2l6ZSBub3QgQVNOX1VOU0lHTkVEXG4iKTsKICAgICAgICAgICAgcmV0dXJuIFNOTVBfRVJSX1dST05HVFlQRTsKICAgICAgICB9CiAgICAgICAgYnJlYWs7CgoKICAgIGNhc2UgUkVTRVJWRTI6CiAgICAgICAgLyoKICAgICAgICAgKiBtZW1vcnkgcmVzZXZlcmF0aW9uLCBmaW5hbCBwcmVwYXJhdGlvbi4uLiAKICAgICAgICAgKi8KICAgICAgICBicmVhazsKCgogICAgY2FzZSBGUkVFOgogICAgICAgIC8qCiAgICAgICAgICogUmVsZWFzZSBhbnkgcmVzb3VyY2VzIHRoYXQgaGF2ZSBiZWVuIGFsbG9jYXRlZCAKICAgICAgICAgKi8KICAgICAgICBicmVhazsKCgogICAgY2FzZSBBQ1RJT046CiAgICAgICAgLyoKICAgICAgICAgKiBUaGUgdmFyaWFibGUgaGFzIGJlZW4gc3RvcmVkIGluIG9iamlkIGZvcgogICAgICAgICAqIHlvdSB0byB1c2UsIGFuZCB5b3UgaGF2ZSBqdXN0IGJlZW4gYXNrZWQgdG8gZG8gc29tZXRoaW5nIHdpdGgKICAgICAgICAgKiBpdC4gIE5vdGUgdGhhdCBhbnl0aGluZyBkb25lIGhlcmUgbXVzdCBiZSByZXZlcnNhYmxlIGluIHRoZSBVTkRPIGNhc2UgCiAgICAgICAgICovCiAgICAgICAgdG1wdmFyID0gU3RvcmFnZVRtcC0+cGluZ0N0bFByb2JlQ291bnQ7CgogICAgICAgIGlmICgoKigobG9uZyAqKSB2YXJfdmFsKSkgPj0gMSAmJiAoKigobG9uZyAqKSB2YXJfdmFsKSkgPD0gMTUpCiAgICAgICAgICAgIFN0b3JhZ2VUbXAtPnBpbmdDdGxQcm9iZUNvdW50ID0gKigobG9uZyAqKSB2YXJfdmFsKTsKICAgICAgICBlbHNlCiAgICAgICAgICAgIFN0b3JhZ2VUbXAtPnBpbmdDdGxQcm9iZUNvdW50ID0gMTU7CiAgICAgICAgYnJlYWs7CgoKICAgIGNhc2UgVU5ETzoKICAgICAgICAvKgogICAgICAgICAqIEJhY2sgb3V0IGFueSBjaGFuZ2VzIG1hZGUgaW4gdGhlIEFDVElPTiBjYXNlIAogICAgICAgICAqLwogICAgICAgIFN0b3JhZ2VUbXAtPnBpbmdDdGxQcm9iZUNvdW50ID0gdG1wdmFyOwogICAgICAgIGJyZWFrOwoKCiAgICBjYXNlIENPTU1JVDoKICAgICAgICAvKgogICAgICAgICAqIFRoaW5ncyBhcmUgd29ya2luZyB3ZWxsLCBzbyBpdCdzIG5vdyBzYWZlIHRvIG1ha2UgdGhlIGNoYW5nZQogICAgICAgICAqIHBlcm1hbmVudGx5LiAgTWFrZSBzdXJlIHRoYXQgYW55dGhpbmcgZG9uZSBoZXJlIGNhbid0IGZhaWwhIAogICAgICAgICAqLwogICAgICAgIHNubXBfc3RvcmVfbmVlZGVkKE5VTEwpOwogICAgICAgIGJyZWFrOwogICAgfQogICAgcmV0dXJuIFNOTVBfRVJSX05PRVJST1I7Cn0KCgoKaW50CndyaXRlX3BpbmdDdGxBZG1pblN0YXR1cyhpbnQgYWN0aW9uLAogICAgICAgICAgICAgICAgICAgICAgICAgdV9jaGFyICogdmFyX3ZhbCwKICAgICAgICAgICAgICAgICAgICAgICAgIHVfY2hhciB2YXJfdmFsX3R5cGUsCiAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QgdmFyX3ZhbF9sZW4sCiAgICAgICAgICAgICAgICAgICAgICAgICB1X2NoYXIgKiBzdGF0UCwgb2lkICogbmFtZSwgc2l6ZV90IG5hbWVfbGVuKQp7CiAgICBzdGF0aWMgc2l6ZV90ICAgdG1wdmFyOwogICAgc3RydWN0IHBpbmdDdGxUYWJsZV9kYXRhICpTdG9yYWdlVG1wID0gTlVMTDsKICAgIHNpemVfdCAgICAgICAgICBuZXdsZW4gPQogICAgICAgIG5hbWVfbGVuIC0gKHNpemVvZihwaW5nQ3RsVGFibGVfdmFyaWFibGVzX29pZCkgLyBzaXplb2Yob2lkKSArCiAgICAgICAgICAgICAgICAgICAgMyAtIDEpOwoKCiAgICBERUJVR01TR1RMKCgicGluZ0N0bFRhYmxlIiwKICAgICAgICAgICAgICAgICJwaW5nQ3RsQWRtaW5TdGF0dXMgZW50ZXJpbmcgYWN0aW9uPSVkLi4uICBcbiIsIGFjdGlvbikpOwoKICAgIGlmICgoU3RvcmFnZVRtcCA9CiAgICAgICAgIGhlYWRlcl9jb21wbGV4KHBpbmdDdGxUYWJsZVN0b3JhZ2UsIE5VTEwsCiAgICAgICAgICAgICAgICAgICAgICAgICZuYW1lW3NpemVvZihwaW5nQ3RsVGFibGVfdmFyaWFibGVzX29pZCkgLwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2Yob2lkKSArIDMgLSAxXSwgJm5ld2xlbiwgMSwgTlVMTCwKICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCkpID09IE5VTEwpCiAgICAgICAgcmV0dXJuIFNOTVBfRVJSX05PU1VDSE5BTUU7ICAgICAvKiByZW1vdmUgaWYgeW91IHN1cHBvcnQgY3JlYXRpb24gaGVyZSAqLwoKICAgIGlmIChTdG9yYWdlVG1wICYmIFN0b3JhZ2VUbXAtPnN0b3JhZ2VUeXBlID09IFNUX1JFQURPTkxZKSB7CiAgICAgICAgcmV0dXJuIFNOTVBfRVJSX05PVFdSSVRBQkxFOwogICAgfQoKICAgIHN3aXRjaCAoYWN0aW9uKSB7CiAgICBjYXNlIFJFU0VSVkUxOgogICAgICAgIGlmICh2YXJfdmFsX3R5cGUgIT0gQVNOX0lOVEVHRVIpIHsKICAgICAgICAgICAgc25tcF9sb2coTE9HX0VSUiwKICAgICAgICAgICAgICAgICAgICAgIndyaXRlIHRvIHBpbmdDdGxUYXJnZXRBZGRyZXNzVHlwZSBub3QgQVNOX0lOVEVHRVJcbiIpOwogICAgICAgICAgICByZXR1cm4gU05NUF9FUlJfV1JPTkdUWVBFOwogICAgICAgIH0KICAgICAgICBicmVhazsKCgogICAgY2FzZSBSRVNFUlZFMjoKICAgICAgICAvKgogICAgICAgICAqIG1lbW9yeSByZXNldmVyYXRpb24sIGZpbmFsIHByZXBhcmF0aW9uLi4uIAogICAgICAgICAqLwogICAgICAgIGJyZWFrOwoKCiAgICBjYXNlIEZSRUU6CiAgICAgICAgLyoKICAgICAgICAgKiBSZWxlYXNlIGFueSByZXNvdXJjZXMgdGhhdCBoYXZlIGJlZW4gYWxsb2NhdGVkIAogICAgICAgICAqLwogICAgICAgIGJyZWFrOwoKCiAgICBjYXNlIEFDVElPTjoKICAgICAgICAvKgogICAgICAgICAqIFRoZSB2YXJpYWJsZSBoYXMgYmVlbiBzdG9yZWQgaW4gb2JqaWQgZm9yCiAgICAgICAgICogeW91IHRvIHVzZSwgYW5kIHlvdSBoYXZlIGp1c3QgYmVlbiBhc2tlZCB0byBkbyBzb21ldGhpbmcgd2l0aAogICAgICAgICAqIGl0LiAgTm90ZSB0aGF0IGFueXRoaW5nIGRvbmUgaGVyZSBtdXN0IGJlIHJldmVyc2FibGUgaW4gdGhlIFVORE8gY2FzZSAKICAgICAgICAgKi8KICAgICAgICB0bXB2YXIgPSBTdG9yYWdlVG1wLT5waW5nQ3RsQWRtaW5TdGF0dXM7CiAgICAgICAgU3RvcmFnZVRtcC0+cGluZ0N0bEFkbWluU3RhdHVzID0gKigobG9uZyAqKSB2YXJfdmFsKTsKICAgICAgICBicmVhazsKCgogICAgY2FzZSBVTkRPOgogICAgICAgIC8qCiAgICAgICAgICogQmFjayBvdXQgYW55IGNoYW5nZXMgbWFkZSBpbiB0aGUgQUNUSU9OIGNhc2UgCiAgICAgICAgICovCiAgICAgICAgU3RvcmFnZVRtcC0+cGluZ0N0bEFkbWluU3RhdHVzID0gdG1wdmFyOwogICAgICAgIGJyZWFrOwoKCiAgICBjYXNlIENPTU1JVDoKICAgICAgICAvKgogICAgICAgICAqIFRoaW5ncyBhcmUgd29ya2luZyB3ZWxsLCBzbyBpdCdzIG5vdyBzYWZlIHRvIG1ha2UgdGhlIGNoYW5nZQogICAgICAgICAqIHBlcm1hbmVudGx5LiAgTWFrZSBzdXJlIHRoYXQgYW55dGhpbmcgZG9uZSBoZXJlIGNhbid0IGZhaWwhIAogICAgICAgICAqLwogICAgICAgIGlmIChTdG9yYWdlVG1wLT5waW5nQ3RsQWRtaW5TdGF0dXMgPT0gMQogICAgICAgICAgICAmJiBTdG9yYWdlVG1wLT5waW5nQ3RsUm93U3RhdHVzID09IFJTX0FDVElWRSkgewogICAgICAgICAgICBTdG9yYWdlVG1wLT5waW5nUmVzdWx0cy0+cGluZ1Jlc3VsdHNPcGVyU3RhdHVzID0gMTsKICAgICAgICAgICAgbW9kaWZ5X1Jlc3VsdHNPcGVyKFN0b3JhZ2VUbXAsIDEpOwogICAgICAgICAgICBpZiAoU3RvcmFnZVRtcC0+cGluZ0N0bEZyZXF1ZW5jeSAhPSAwKQogICAgICAgICAgICAgICAgU3RvcmFnZVRtcC0+dGltZXJfaWQgPQogICAgICAgICAgICAgICAgICAgIHNubXBfYWxhcm1fcmVnaXN0ZXIoU3RvcmFnZVRtcC0+cGluZ0N0bEZyZXF1ZW5jeSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNBX1JFUEVBVCwgcnVuX3BpbmcsIFN0b3JhZ2VUbXApOwogICAgICAgICAgICBlbHNlCiAgICAgICAgICAgICAgICBTdG9yYWdlVG1wLT50aW1lcl9pZCA9IHNubXBfYWxhcm1fcmVnaXN0ZXIoMSwgMCwgcnVuX3BpbmcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RvcmFnZVRtcCk7CgogICAgICAgIH0gZWxzZSBpZiAoU3RvcmFnZVRtcC0+cGluZ0N0bEFkbWluU3RhdHVzID09IDIKICAgICAgICAgICAgICAgICAgICYmIFN0b3JhZ2VUbXAtPnBpbmdDdGxSb3dTdGF0dXMgPT0gUlNfQUNUSVZFKSB7CiAgICAgICAgICAgIHNubXBfYWxhcm1fdW5yZWdpc3RlcihTdG9yYWdlVG1wLT50aW1lcl9pZCk7CiAgICAgICAgICAgIFN0b3JhZ2VUbXAtPnBpbmdSZXN1bHRzLT5waW5nUmVzdWx0c09wZXJTdGF0dXMgPSAyOwogICAgICAgICAgICBtb2RpZnlfUmVzdWx0c09wZXIoU3RvcmFnZVRtcCwgMik7CiAgICAgICAgfQoKICAgICAgICBzbm1wX3N0b3JlX25lZWRlZChOVUxMKTsKICAgICAgICBicmVhazsKICAgIH0KICAgIHJldHVybiBTTk1QX0VSUl9OT0VSUk9SOwp9CgoKCgppbnQKd3JpdGVfcGluZ0N0bERhdGFGaWxsKGludCBhY3Rpb24sCiAgICAgICAgICAgICAgICAgICAgICB1X2NoYXIgKiB2YXJfdmFsLAogICAgICAgICAgICAgICAgICAgICAgdV9jaGFyIHZhcl92YWxfdHlwZSwKICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCB2YXJfdmFsX2xlbiwKICAgICAgICAgICAgICAgICAgICAgIHVfY2hhciAqIHN0YXRQLCBvaWQgKiBuYW1lLCBzaXplX3QgbmFtZV9sZW4pCnsKICAgIHN0YXRpYyBjaGFyICAgICp0bXB2YXI7CiAgICBzdGF0aWMgc2l6ZV90ICAgdG1wbGVuOwogICAgc3RydWN0IHBpbmdDdGxUYWJsZV9kYXRhICpTdG9yYWdlVG1wID0gTlVMTDsKICAgIHNpemVfdCAgICAgICAgICBuZXdsZW4gPQogICAgICAgIG5hbWVfbGVuIC0gKHNpemVvZihwaW5nQ3RsVGFibGVfdmFyaWFibGVzX29pZCkgLyBzaXplb2Yob2lkKSArCiAgICAgICAgICAgICAgICAgICAgMyAtIDEpOwoKICAgIGlmICgoU3RvcmFnZVRtcCA9CiAgICAgICAgIGhlYWRlcl9jb21wbGV4KHBpbmdDdGxUYWJsZVN0b3JhZ2UsIE5VTEwsCiAgICAgICAgICAgICAgICAgICAgICAgICZuYW1lW3NpemVvZihwaW5nQ3RsVGFibGVfdmFyaWFibGVzX29pZCkgLwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2Yob2lkKSArIDMgLSAxXSwgJm5ld2xlbiwgMSwgTlVMTCwKICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCkpID09IE5VTEwpCiAgICAgICAgcmV0dXJuIFNOTVBfRVJSX05PU1VDSE5BTUU7ICAgICAvKiByZW1vdmUgaWYgeW91IHN1cHBvcnQgY3JlYXRpb24gaGVyZSAqLwoKICAgIGlmIChTdG9yYWdlVG1wICYmIFN0b3JhZ2VUbXAtPnN0b3JhZ2VUeXBlID09IFNUX1JFQURPTkxZKSB7CiAgICAgICAgcmV0dXJuIFNOTVBfRVJSX05PVFdSSVRBQkxFOwogICAgfQoKICAgIGlmIChTdG9yYWdlVG1wICYmIFN0b3JhZ2VUbXAtPnBpbmdDdGxSb3dTdGF0dXMgPT0gUlNfQUNUSVZFKSB7CiAgICAgICAgcmV0dXJuIFNOTVBfRVJSX05PVFdSSVRBQkxFOwogICAgfQoKICAgIHN3aXRjaCAoYWN0aW9uKSB7CiAgICBjYXNlIFJFU0VSVkUxOgogICAgICAgIGlmICh2YXJfdmFsX3R5cGUgIT0gQVNOX09DVEVUX1NUUikgewogICAgICAgICAgICBzbm1wX2xvZyhMT0dfRVJSLAogICAgICAgICAgICAgICAgICAgICAid3JpdGUgdG8gcGluZ0N0bFRhcmdldEFkZHJlc3Mgbm90IEFTTl9PQ1RFVF9TVFJcbiIpOwogICAgICAgICAgICByZXR1cm4gU05NUF9FUlJfV1JPTkdUWVBFOwogICAgICAgIH0KICAgICAgICBicmVhazsKCgogICAgY2FzZSBSRVNFUlZFMjoKICAgICAgICAvKgogICAgICAgICAqIG1lbW9yeSByZXNldmVyYXRpb24sIGZpbmFsIHByZXBhcmF0aW9uLi4uIAogICAgICAgICAqLwogICAgICAgIGJyZWFrOwoKCiAgICBjYXNlIEZSRUU6CiAgICAgICAgLyoKICAgICAgICAgKiBSZWxlYXNlIGFueSByZXNvdXJjZXMgdGhhdCBoYXZlIGJlZW4gYWxsb2NhdGVkIAogICAgICAgICAqLwogICAgICAgIGJyZWFrOwoKCiAgICBjYXNlIEFDVElPTjoKICAgICAgICAvKgogICAgICAgICAqIFRoZSB2YXJpYWJsZSBoYXMgYmVlbiBzdG9yZWQgaW4gbG9uZ19yZXQgZm9yCiAgICAgICAgICogeW91IHRvIHVzZSwgYW5kIHlvdSBoYXZlIGp1c3QgYmVlbiBhc2tlZCB0byBkbyBzb21ldGhpbmcgd2l0aAogICAgICAgICAqIGl0LiAgTm90ZSB0aGF0IGFueXRoaW5nIGRvbmUgaGVyZSBtdXN0IGJlIHJldmVyc2FibGUgaW4gdGhlIFVORE8gY2FzZSAKICAgICAgICAgKi8KICAgICAgICB0bXB2YXIgPSBTdG9yYWdlVG1wLT5waW5nQ3RsRGF0YUZpbGw7CiAgICAgICAgdG1wbGVuID0gU3RvcmFnZVRtcC0+cGluZ0N0bERhdGFGaWxsTGVuOwogICAgICAgIFN0b3JhZ2VUbXAtPnBpbmdDdGxEYXRhRmlsbCA9IChjaGFyICopIG1hbGxvYyh2YXJfdmFsX2xlbiArIDEpOwogICAgICAgIGlmIChTdG9yYWdlVG1wLT5waW5nQ3RsRGF0YUZpbGwgPT0gTlVMTCkgewogICAgICAgICAgICBleGl0KDEpOwogICAgICAgIH0KICAgICAgICBtZW1jcHkoU3RvcmFnZVRtcC0+cGluZ0N0bERhdGFGaWxsLCB2YXJfdmFsLCB2YXJfdmFsX2xlbik7CiAgICAgICAgU3RvcmFnZVRtcC0+cGluZ0N0bERhdGFGaWxsW3Zhcl92YWxfbGVuXSA9ICdcMCc7CiAgICAgICAgU3RvcmFnZVRtcC0+cGluZ0N0bERhdGFGaWxsTGVuID0gdmFyX3ZhbF9sZW47CgogICAgICAgIGJyZWFrOwoKCiAgICBjYXNlIFVORE86CiAgICAgICAgLyoKICAgICAgICAgKiBCYWNrIG91dCBhbnkgY2hhbmdlcyBtYWRlIGluIHRoZSBBQ1RJT04gY2FzZSAKICAgICAgICAgKi8KICAgICAgICBTTk1QX0ZSRUUoU3RvcmFnZVRtcC0+cGluZ0N0bERhdGFGaWxsKTsKICAgICAgICBTdG9yYWdlVG1wLT5waW5nQ3RsRGF0YUZpbGwgPSB0bXB2YXI7CiAgICAgICAgU3RvcmFnZVRtcC0+cGluZ0N0bERhdGFGaWxsTGVuID0gdG1wbGVuOwogICAgICAgIGJyZWFrOwoKCiAgICBjYXNlIENPTU1JVDoKICAgICAgICAvKgogICAgICAgICAqIFRoaW5ncyBhcmUgd29ya2luZyB3ZWxsLCBzbyBpdCdzIG5vdyBzYWZlIHRvIG1ha2UgdGhlIGNoYW5nZQogICAgICAgICAqIHBlcm1hbmVudGx5LiAgTWFrZSBzdXJlIHRoYXQgYW55dGhpbmcgZG9uZSBoZXJlIGNhbid0IGZhaWwhIAogICAgICAgICAqLwogICAgICAgIFNOTVBfRlJFRSh0bXB2YXIpOwogICAgICAgIHNubXBfc3RvcmVfbmVlZGVkKE5VTEwpOwogICAgICAgIGJyZWFrOwogICAgfQogICAgcmV0dXJuIFNOTVBfRVJSX05PRVJST1I7Cn0KCgppbnQKd3JpdGVfcGluZ0N0bEZyZXF1ZW5jeShpbnQgYWN0aW9uLAogICAgICAgICAgICAgICAgICAgICAgIHVfY2hhciAqIHZhcl92YWwsCiAgICAgICAgICAgICAgICAgICAgICAgdV9jaGFyIHZhcl92YWxfdHlwZSwKICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QgdmFyX3ZhbF9sZW4sCiAgICAgICAgICAgICAgICAgICAgICAgdV9jaGFyICogc3RhdFAsIG9pZCAqIG5hbWUsIHNpemVfdCBuYW1lX2xlbikKewogICAgc3RhdGljIHNpemVfdCAgIHRtcHZhcjsKICAgIHN0cnVjdCBwaW5nQ3RsVGFibGVfZGF0YSAqU3RvcmFnZVRtcCA9IE5VTEw7CiAgICBzaXplX3QgICAgICAgICAgbmV3bGVuID0KICAgICAgICBuYW1lX2xlbiAtIChzaXplb2YocGluZ0N0bFRhYmxlX3ZhcmlhYmxlc19vaWQpIC8gc2l6ZW9mKG9pZCkgKwogICAgICAgICAgICAgICAgICAgIDMgLSAxKTsKCgogICAgREVCVUdNU0dUTCgoInBpbmdDdGxUYWJsZSIsCiAgICAgICAgICAgICAgICAicGluZ0N0bEZyZXF1ZW5jeSBlbnRlcmluZyBhY3Rpb249JWQuLi4gIFxuIiwgYWN0aW9uKSk7CgogICAgaWYgKChTdG9yYWdlVG1wID0KICAgICAgICAgaGVhZGVyX2NvbXBsZXgocGluZ0N0bFRhYmxlU3RvcmFnZSwgTlVMTCwKICAgICAgICAgICAgICAgICAgICAgICAgJm5hbWVbc2l6ZW9mKHBpbmdDdGxUYWJsZV92YXJpYWJsZXNfb2lkKSAvCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZihvaWQpICsgMyAtIDFdLCAmbmV3bGVuLCAxLCBOVUxMLAogICAgICAgICAgICAgICAgICAgICAgICBOVUxMKSkgPT0gTlVMTCkKICAgICAgICByZXR1cm4gU05NUF9FUlJfTk9TVUNITkFNRTsgICAgIC8qIHJlbW92ZSBpZiB5b3Ugc3VwcG9ydCBjcmVhdGlvbiBoZXJlICovCgogICAgaWYgKFN0b3JhZ2VUbXAgJiYgU3RvcmFnZVRtcC0+c3RvcmFnZVR5cGUgPT0gU1RfUkVBRE9OTFkpIHsKICAgICAgICByZXR1cm4gU05NUF9FUlJfTk9UV1JJVEFCTEU7CiAgICB9CgogICAgaWYgKFN0b3JhZ2VUbXAgJiYgU3RvcmFnZVRtcC0+cGluZ0N0bFJvd1N0YXR1cyA9PSBSU19BQ1RJVkUpIHsKICAgICAgICByZXR1cm4gU05NUF9FUlJfTk9UV1JJVEFCTEU7CiAgICB9CiAgICBzd2l0Y2ggKGFjdGlvbikgewogICAgY2FzZSBSRVNFUlZFMToKICAgICAgICBpZiAodmFyX3ZhbF90eXBlICE9IEFTTl9VTlNJR05FRCkgewogICAgICAgICAgICBzbm1wX2xvZyhMT0dfRVJSLAogICAgICAgICAgICAgICAgICAgICAid3JpdGUgdG8gcGluZ0N0bERhdGFTaXplIG5vdCBBU05fVU5TSUdORURcbiIpOwogICAgICAgICAgICByZXR1cm4gU05NUF9FUlJfV1JPTkdUWVBFOwogICAgICAgIH0KICAgICAgICBicmVhazsKCgogICAgY2FzZSBSRVNFUlZFMjoKICAgICAgICAvKgogICAgICAgICAqIG1lbW9yeSByZXNldmVyYXRpb24sIGZpbmFsIHByZXBhcmF0aW9uLi4uIAogICAgICAgICAqLwogICAgICAgIGJyZWFrOwoKCiAgICBjYXNlIEZSRUU6CiAgICAgICAgLyoKICAgICAgICAgKiBSZWxlYXNlIGFueSByZXNvdXJjZXMgdGhhdCBoYXZlIGJlZW4gYWxsb2NhdGVkIAogICAgICAgICAqLwogICAgICAgIGJyZWFrOwoKCiAgICBjYXNlIEFDVElPTjoKICAgICAgICAvKgogICAgICAgICAqIFRoZSB2YXJpYWJsZSBoYXMgYmVlbiBzdG9yZWQgaW4gb2JqaWQgZm9yCiAgICAgICAgICogeW91IHRvIHVzZSwgYW5kIHlvdSBoYXZlIGp1c3QgYmVlbiBhc2tlZCB0byBkbyBzb21ldGhpbmcgd2l0aAogICAgICAgICAqIGl0LiAgTm90ZSB0aGF0IGFueXRoaW5nIGRvbmUgaGVyZSBtdXN0IGJlIHJldmVyc2FibGUgaW4gdGhlIFVORE8gY2FzZSAKICAgICAgICAgKi8KICAgICAgICB0bXB2YXIgPSBTdG9yYWdlVG1wLT5waW5nQ3RsRnJlcXVlbmN5OwogICAgICAgIFN0b3JhZ2VUbXAtPnBpbmdDdGxGcmVxdWVuY3kgPSAqKChsb25nICopIHZhcl92YWwpOwogICAgICAgIGJyZWFrOwoKCiAgICBjYXNlIFVORE86CiAgICAgICAgLyoKICAgICAgICAgKiBCYWNrIG91dCBhbnkgY2hhbmdlcyBtYWRlIGluIHRoZSBBQ1RJT04gY2FzZSAKICAgICAgICAgKi8KICAgICAgICBTdG9yYWdlVG1wLT5waW5nQ3RsRnJlcXVlbmN5ID0gdG1wdmFyOwogICAgICAgIGJyZWFrOwoKCiAgICBjYXNlIENPTU1JVDoKICAgICAgICAvKgogICAgICAgICAqIFRoaW5ncyBhcmUgd29ya2luZyB3ZWxsLCBzbyBpdCdzIG5vdyBzYWZlIHRvIG1ha2UgdGhlIGNoYW5nZQogICAgICAgICAqIHBlcm1hbmVudGx5LiAgTWFrZSBzdXJlIHRoYXQgYW55dGhpbmcgZG9uZSBoZXJlIGNhbid0IGZhaWwhIAogICAgICAgICAqLwogICAgICAgIHNubXBfc3RvcmVfbmVlZGVkKE5VTEwpOwogICAgICAgIGJyZWFrOwogICAgfQogICAgcmV0dXJuIFNOTVBfRVJSX05PRVJST1I7Cn0KCgppbnQKd3JpdGVfcGluZ0N0bE1heFJvd3MoaW50IGFjdGlvbiwKICAgICAgICAgICAgICAgICAgICAgdV9jaGFyICogdmFyX3ZhbCwKICAgICAgICAgICAgICAgICAgICAgdV9jaGFyIHZhcl92YWxfdHlwZSwKICAgICAgICAgICAgICAgICAgICAgc2l6ZV90IHZhcl92YWxfbGVuLAogICAgICAgICAgICAgICAgICAgICB1X2NoYXIgKiBzdGF0UCwgb2lkICogbmFtZSwgc2l6ZV90IG5hbWVfbGVuKQp7CiAgICBzdGF0aWMgc2l6ZV90ICAgdG1wdmFyOwogICAgc3RydWN0IHBpbmdDdGxUYWJsZV9kYXRhICpTdG9yYWdlVG1wID0gTlVMTDsKICAgIHNpemVfdCAgICAgICAgICBuZXdsZW4gPQogICAgICAgIG5hbWVfbGVuIC0gKHNpemVvZihwaW5nQ3RsVGFibGVfdmFyaWFibGVzX29pZCkgLyBzaXplb2Yob2lkKSArCiAgICAgICAgICAgICAgICAgICAgMyAtIDEpOwoKCiAgICBERUJVR01TR1RMKCgicGluZ0N0bFRhYmxlIiwKICAgICAgICAgICAgICAgICJwaW5nQ3RsTWF4Um93cyBlbnRlcmluZyBhY3Rpb249JWQuLi4gIFxuIiwgYWN0aW9uKSk7CgogICAgaWYgKChTdG9yYWdlVG1wID0KICAgICAgICAgaGVhZGVyX2NvbXBsZXgocGluZ0N0bFRhYmxlU3RvcmFnZSwgTlVMTCwKICAgICAgICAgICAgICAgICAgICAgICAgJm5hbWVbc2l6ZW9mKHBpbmdDdGxUYWJsZV92YXJpYWJsZXNfb2lkKSAvCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZihvaWQpICsgMyAtIDFdLCAmbmV3bGVuLCAxLCBOVUxMLAogICAgICAgICAgICAgICAgICAgICAgICBOVUxMKSkgPT0gTlVMTCkKICAgICAgICByZXR1cm4gU05NUF9FUlJfTk9TVUNITkFNRTsgICAgIC8qIHJlbW92ZSBpZiB5b3Ugc3VwcG9ydCBjcmVhdGlvbiBoZXJlICovCgogICAgaWYgKFN0b3JhZ2VUbXAgJiYgU3RvcmFnZVRtcC0+c3RvcmFnZVR5cGUgPT0gU1RfUkVBRE9OTFkpIHsKICAgICAgICByZXR1cm4gU05NUF9FUlJfTk9UV1JJVEFCTEU7CiAgICB9CgogICAgaWYgKFN0b3JhZ2VUbXAgJiYgU3RvcmFnZVRtcC0+cGluZ0N0bFJvd1N0YXR1cyA9PSBSU19BQ1RJVkUpIHsKICAgICAgICByZXR1cm4gU05NUF9FUlJfTk9UV1JJVEFCTEU7CiAgICB9CiAgICBzd2l0Y2ggKGFjdGlvbikgewogICAgY2FzZSBSRVNFUlZFMToKICAgICAgICBpZiAodmFyX3ZhbF90eXBlICE9IEFTTl9VTlNJR05FRCkgewogICAgICAgICAgICBzbm1wX2xvZyhMT0dfRVJSLAogICAgICAgICAgICAgICAgICAgICAid3JpdGUgdG8gcGluZ0N0bE1heFJvd3Mgbm90IEFTTl9VTlNJR05FRFxuIik7CiAgICAgICAgICAgIHJldHVybiBTTk1QX0VSUl9XUk9OR1RZUEU7CiAgICAgICAgfQogICAgICAgIGJyZWFrOwoKCiAgICBjYXNlIFJFU0VSVkUyOgogICAgICAgIC8qCiAgICAgICAgICogbWVtb3J5IHJlc2V2ZXJhdGlvbiwgZmluYWwgcHJlcGFyYXRpb24uLi4gCiAgICAgICAgICovCiAgICAgICAgYnJlYWs7CgoKICAgIGNhc2UgRlJFRToKICAgICAgICAvKgogICAgICAgICAqIFJlbGVhc2UgYW55IHJlc291cmNlcyB0aGF0IGhhdmUgYmVlbiBhbGxvY2F0ZWQgCiAgICAgICAgICovCiAgICAgICAgYnJlYWs7CgoKICAgIGNhc2UgQUNUSU9OOgogICAgICAgIC8qCiAgICAgICAgICogVGhlIHZhcmlhYmxlIGhhcyBiZWVuIHN0b3JlZCBpbiBvYmppZCBmb3IKICAgICAgICAgKiB5b3UgdG8gdXNlLCBhbmQgeW91IGhhdmUganVzdCBiZWVuIGFza2VkIHRvIGRvIHNvbWV0aGluZyB3aXRoCiAgICAgICAgICogaXQuICBOb3RlIHRoYXQgYW55dGhpbmcgZG9uZSBoZXJlIG11c3QgYmUgcmV2ZXJzYWJsZSBpbiB0aGUgVU5ETyBjYXNlIAogICAgICAgICAqLwogICAgICAgIHRtcHZhciA9IFN0b3JhZ2VUbXAtPnBpbmdDdGxNYXhSb3dzOwogICAgICAgIFN0b3JhZ2VUbXAtPnBpbmdDdGxNYXhSb3dzID0gKigobG9uZyAqKSB2YXJfdmFsKTsKICAgICAgICBicmVhazsKCgogICAgY2FzZSBVTkRPOgogICAgICAgIC8qCiAgICAgICAgICogQmFjayBvdXQgYW55IGNoYW5nZXMgbWFkZSBpbiB0aGUgQUNUSU9OIGNhc2UgCiAgICAgICAgICovCiAgICAgICAgU3RvcmFnZVRtcC0+cGluZ0N0bE1heFJvd3MgPSB0bXB2YXI7CiAgICAgICAgYnJlYWs7CgoKICAgIGNhc2UgQ09NTUlUOgogICAgICAgIC8qCiAgICAgICAgICogVGhpbmdzIGFyZSB3b3JraW5nIHdlbGwsIHNvIGl0J3Mgbm93IHNhZmUgdG8gbWFrZSB0aGUgY2hhbmdlCiAgICAgICAgICogcGVybWFuZW50bHkuICBNYWtlIHN1cmUgdGhhdCBhbnl0aGluZyBkb25lIGhlcmUgY2FuJ3QgZmFpbCEgCiAgICAgICAgICovCiAgICAgICAgc25tcF9zdG9yZV9uZWVkZWQoTlVMTCk7CiAgICAgICAgYnJlYWs7CiAgICB9CiAgICByZXR1cm4gU05NUF9FUlJfTk9FUlJPUjsKfQoKCgoKaW50CndyaXRlX3BpbmdDdGxTdG9yYWdlVHlwZShpbnQgYWN0aW9uLAogICAgICAgICAgICAgICAgICAgICAgICAgdV9jaGFyICogdmFyX3ZhbCwKICAgICAgICAgICAgICAgICAgICAgICAgIHVfY2hhciB2YXJfdmFsX3R5cGUsCiAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QgdmFyX3ZhbF9sZW4sCiAgICAgICAgICAgICAgICAgICAgICAgICB1X2NoYXIgKiBzdGF0UCwgb2lkICogbmFtZSwgc2l6ZV90IG5hbWVfbGVuKQp7CiAgICBzdGF0aWMgc2l6ZV90ICAgdG1wdmFyOwogICAgc3RydWN0IHBpbmdDdGxUYWJsZV9kYXRhICpTdG9yYWdlVG1wID0gTlVMTDsKICAgIHNpemVfdCAgICAgICAgICBuZXdsZW4gPQogICAgICAgIG5hbWVfbGVuIC0gKHNpemVvZihwaW5nQ3RsVGFibGVfdmFyaWFibGVzX29pZCkgLyBzaXplb2Yob2lkKSArCiAgICAgICAgICAgICAgICAgICAgMyAtIDEpOwoKCiAgICBERUJVR01TR1RMKCgicGluZ0N0bFRhYmxlIiwKICAgICAgICAgICAgICAgICJwaW5nQ3RsU3RvcmFnZVR5cGUgZW50ZXJpbmcgYWN0aW9uPSVkLi4uICBcbiIsIGFjdGlvbikpOwoKICAgIGlmICgoU3RvcmFnZVRtcCA9CiAgICAgICAgIGhlYWRlcl9jb21wbGV4KHBpbmdDdGxUYWJsZVN0b3JhZ2UsIE5VTEwsCiAgICAgICAgICAgICAgICAgICAgICAgICZuYW1lW3NpemVvZihwaW5nQ3RsVGFibGVfdmFyaWFibGVzX29pZCkgLwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2Yob2lkKSArIDMgLSAxXSwgJm5ld2xlbiwgMSwgTlVMTCwKICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCkpID09IE5VTEwpCiAgICAgICAgcmV0dXJuIFNOTVBfRVJSX05PU1VDSE5BTUU7ICAgICAvKiByZW1vdmUgaWYgeW91IHN1cHBvcnQgY3JlYXRpb24gaGVyZSAqLwoKICAgIGlmIChTdG9yYWdlVG1wICYmIFN0b3JhZ2VUbXAtPnN0b3JhZ2VUeXBlID09IFNUX1JFQURPTkxZKSB7CiAgICAgICAgcmV0dXJuIFNOTVBfRVJSX05PVFdSSVRBQkxFOwogICAgfQoKICAgIGlmIChTdG9yYWdlVG1wICYmIFN0b3JhZ2VUbXAtPnBpbmdDdGxSb3dTdGF0dXMgPT0gUlNfQUNUSVZFKSB7CiAgICAgICAgcmV0dXJuIFNOTVBfRVJSX05PVFdSSVRBQkxFOwogICAgfQogICAgc3dpdGNoIChhY3Rpb24pIHsKICAgIGNhc2UgUkVTRVJWRTE6CiAgICAgICAgaWYgKHZhcl92YWxfdHlwZSAhPSBBU05fSU5URUdFUikgewogICAgICAgICAgICBzbm1wX2xvZyhMT0dfRVJSLAogICAgICAgICAgICAgICAgICAgICAid3JpdGUgdG8gcGluZ0N0bFN0b3JhZ2VUeXBlIG5vdCBBU05fSU5URUdFUlxuIik7CiAgICAgICAgICAgIHJldHVybiBTTk1QX0VSUl9XUk9OR1RZUEU7CiAgICAgICAgfQogICAgICAgIGJyZWFrOwoKCiAgICBjYXNlIFJFU0VSVkUyOgogICAgICAgIC8qCiAgICAgICAgICogbWVtb3J5IHJlc2V2ZXJhdGlvbiwgZmluYWwgcHJlcGFyYXRpb24uLi4gCiAgICAgICAgICovCiAgICAgICAgYnJlYWs7CgoKICAgIGNhc2UgRlJFRToKICAgICAgICAvKgogICAgICAgICAqIFJlbGVhc2UgYW55IHJlc291cmNlcyB0aGF0IGhhdmUgYmVlbiBhbGxvY2F0ZWQgCiAgICAgICAgICovCiAgICAgICAgYnJlYWs7CgoKICAgIGNhc2UgQUNUSU9OOgogICAgICAgIC8qCiAgICAgICAgICogVGhlIHZhcmlhYmxlIGhhcyBiZWVuIHN0b3JlZCBpbiBvYmppZCBmb3IKICAgICAgICAgKiB5b3UgdG8gdXNlLCBhbmQgeW91IGhhdmUganVzdCBiZWVuIGFza2VkIHRvIGRvIHNvbWV0aGluZyB3aXRoCiAgICAgICAgICogaXQuICBOb3RlIHRoYXQgYW55dGhpbmcgZG9uZSBoZXJlIG11c3QgYmUgcmV2ZXJzYWJsZSBpbiB0aGUgVU5ETyBjYXNlIAogICAgICAgICAqLwogICAgICAgIHRtcHZhciA9IFN0b3JhZ2VUbXAtPnBpbmdDdGxTdG9yYWdlVHlwZTsKICAgICAgICBTdG9yYWdlVG1wLT5waW5nQ3RsU3RvcmFnZVR5cGUgPSAqKChsb25nICopIHZhcl92YWwpOwogICAgICAgIGJyZWFrOwoKCiAgICBjYXNlIFVORE86CiAgICAgICAgLyoKICAgICAgICAgKiBCYWNrIG91dCBhbnkgY2hhbmdlcyBtYWRlIGluIHRoZSBBQ1RJT04gY2FzZSAKICAgICAgICAgKi8KICAgICAgICBTdG9yYWdlVG1wLT5waW5nQ3RsU3RvcmFnZVR5cGUgPSB0bXB2YXI7CiAgICAgICAgYnJlYWs7CgoKICAgIGNhc2UgQ09NTUlUOgogICAgICAgIC8qCiAgICAgICAgICogVGhpbmdzIGFyZSB3b3JraW5nIHdlbGwsIHNvIGl0J3Mgbm93IHNhZmUgdG8gbWFrZSB0aGUgY2hhbmdlCiAgICAgICAgICogcGVybWFuZW50bHkuICBNYWtlIHN1cmUgdGhhdCBhbnl0aGluZyBkb25lIGhlcmUgY2FuJ3QgZmFpbCEgCiAgICAgICAgICovCiAgICAgICAgc25tcF9zdG9yZV9uZWVkZWQoTlVMTCk7CiAgICAgICAgYnJlYWs7CiAgICB9CiAgICByZXR1cm4gU05NUF9FUlJfTk9FUlJPUjsKfQoKCgoKaW50CndyaXRlX3BpbmdDdGxUcmFwR2VuZXJhdGlvbihpbnQgYWN0aW9uLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgdV9jaGFyICogdmFyX3ZhbCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVfY2hhciB2YXJfdmFsX3R5cGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QgdmFyX3ZhbF9sZW4sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB1X2NoYXIgKiBzdGF0UCwgb2lkICogbmFtZSwgc2l6ZV90IG5hbWVfbGVuKQp7CiAgICBzdGF0aWMgY2hhciAgICAqdG1wdmFyOwogICAgc3RhdGljIHNpemVfdCAgIHRtcGxlbjsKICAgIHN0cnVjdCBwaW5nQ3RsVGFibGVfZGF0YSAqU3RvcmFnZVRtcCA9IE5VTEw7CiAgICBzaXplX3QgICAgICAgICAgbmV3bGVuID0KICAgICAgICBuYW1lX2xlbiAtIChzaXplb2YocGluZ0N0bFRhYmxlX3ZhcmlhYmxlc19vaWQpIC8gc2l6ZW9mKG9pZCkgKwogICAgICAgICAgICAgICAgICAgIDMgLSAxKTsKCiAgICBpZiAoKFN0b3JhZ2VUbXAgPQogICAgICAgICBoZWFkZXJfY29tcGxleChwaW5nQ3RsVGFibGVTdG9yYWdlLCBOVUxMLAogICAgICAgICAgICAgICAgICAgICAgICAmbmFtZVtzaXplb2YocGluZ0N0bFRhYmxlX3ZhcmlhYmxlc19vaWQpIC8KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKG9pZCkgKyAzIC0gMV0sICZuZXdsZW4sIDEsIE5VTEwsCiAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwpKSA9PSBOVUxMKQogICAgICAgIHJldHVybiBTTk1QX0VSUl9OT1NVQ0hOQU1FOyAgICAgLyogcmVtb3ZlIGlmIHlvdSBzdXBwb3J0IGNyZWF0aW9uIGhlcmUgKi8KCiAgICBpZiAoU3RvcmFnZVRtcCAmJiBTdG9yYWdlVG1wLT5zdG9yYWdlVHlwZSA9PSBTVF9SRUFET05MWSkgewogICAgICAgIHJldHVybiBTTk1QX0VSUl9OT1RXUklUQUJMRTsKICAgIH0KCiAgICBpZiAoU3RvcmFnZVRtcCAmJiBTdG9yYWdlVG1wLT5waW5nQ3RsUm93U3RhdHVzID09IFJTX0FDVElWRSkgewogICAgICAgIHJldHVybiBTTk1QX0VSUl9OT1RXUklUQUJMRTsKICAgIH0KCiAgICBzd2l0Y2ggKGFjdGlvbikgewogICAgY2FzZSBSRVNFUlZFMToKICAgICAgICBpZiAodmFyX3ZhbF90eXBlICE9IEFTTl9PQ1RFVF9TVFIpIHsKICAgICAgICAgICAgc25tcF9sb2coTE9HX0VSUiwKICAgICAgICAgICAgICAgICAgICAgIndyaXRlIHRvIHBpbmdDdGxUYXJnZXRBZGRyZXNzIG5vdCBBU05fT0NURVRfU1RSXG4iKTsKICAgICAgICAgICAgcmV0dXJuIFNOTVBfRVJSX1dST05HVFlQRTsKICAgICAgICB9CiAgICAgICAgYnJlYWs7CgoKICAgIGNhc2UgUkVTRVJWRTI6CiAgICAgICAgLyoKICAgICAgICAgKiBtZW1vcnkgcmVzZXZlcmF0aW9uLCBmaW5hbCBwcmVwYXJhdGlvbi4uLiAKICAgICAgICAgKi8KICAgICAgICBicmVhazsKCgogICAgY2FzZSBGUkVFOgogICAgICAgIC8qCiAgICAgICAgICogUmVsZWFzZSBhbnkgcmVzb3VyY2VzIHRoYXQgaGF2ZSBiZWVuIGFsbG9jYXRlZCAKICAgICAgICAgKi8KICAgICAgICBicmVhazsKCgogICAgY2FzZSBBQ1RJT046CiAgICAgICAgLyoKICAgICAgICAgKiBUaGUgdmFyaWFibGUgaGFzIGJlZW4gc3RvcmVkIGluIGxvbmdfcmV0IGZvcgogICAgICAgICAqIHlvdSB0byB1c2UsIGFuZCB5b3UgaGF2ZSBqdXN0IGJlZW4gYXNrZWQgdG8gZG8gc29tZXRoaW5nIHdpdGgKICAgICAgICAgKiBpdC4gIE5vdGUgdGhhdCBhbnl0aGluZyBkb25lIGhlcmUgbXVzdCBiZSByZXZlcnNhYmxlIGluIHRoZSBVTkRPIGNhc2UgCiAgICAgICAgICovCiAgICAgICAgdG1wdmFyID0gU3RvcmFnZVRtcC0+cGluZ0N0bFRyYXBHZW5lcmF0aW9uOwogICAgICAgIHRtcGxlbiA9IFN0b3JhZ2VUbXAtPnBpbmdDdGxUcmFwR2VuZXJhdGlvbkxlbjsKCiAgICAgICAgU3RvcmFnZVRtcC0+cGluZ0N0bFRyYXBHZW5lcmF0aW9uID0KICAgICAgICAgICAgKGNoYXIgKikgbWFsbG9jKHZhcl92YWxfbGVuICsgMSk7CiAgICAgICAgaWYgKFN0b3JhZ2VUbXAtPnBpbmdDdGxUcmFwR2VuZXJhdGlvbiA9PSBOVUxMKSB7CiAgICAgICAgICAgIGV4aXQoMSk7CiAgICAgICAgfQogICAgICAgIG1lbWNweShTdG9yYWdlVG1wLT5waW5nQ3RsVHJhcEdlbmVyYXRpb24sIHZhcl92YWwsIHZhcl92YWxfbGVuKTsKICAgICAgICBTdG9yYWdlVG1wLT5waW5nQ3RsVHJhcEdlbmVyYXRpb25bdmFyX3ZhbF9sZW5dID0gJ1wwJzsKICAgICAgICBTdG9yYWdlVG1wLT5waW5nQ3RsVHJhcEdlbmVyYXRpb25MZW4gPSB2YXJfdmFsX2xlbjsKCiAgICAgICAgYnJlYWs7CgoKICAgIGNhc2UgVU5ETzoKICAgICAgICAvKgogICAgICAgICAqIEJhY2sgb3V0IGFueSBjaGFuZ2VzIG1hZGUgaW4gdGhlIEFDVElPTiBjYXNlIAogICAgICAgICAqLwogICAgICAgIFNOTVBfRlJFRShTdG9yYWdlVG1wLT5waW5nQ3RsVHJhcEdlbmVyYXRpb24pOwogICAgICAgIFN0b3JhZ2VUbXAtPnBpbmdDdGxUcmFwR2VuZXJhdGlvbiA9IHRtcHZhcjsKICAgICAgICBTdG9yYWdlVG1wLT5waW5nQ3RsVHJhcEdlbmVyYXRpb25MZW4gPSB0bXBsZW47CiAgICAgICAgYnJlYWs7CgoKICAgIGNhc2UgQ09NTUlUOgogICAgICAgIC8qCiAgICAgICAgICogVGhpbmdzIGFyZSB3b3JraW5nIHdlbGwsIHNvIGl0J3Mgbm93IHNhZmUgdG8gbWFrZSB0aGUgY2hhbmdlCiAgICAgICAgICogcGVybWFuZW50bHkuICBNYWtlIHN1cmUgdGhhdCBhbnl0aGluZyBkb25lIGhlcmUgY2FuJ3QgZmFpbCEgCiAgICAgICAgICovCiAgICAgICAgU05NUF9GUkVFKHRtcHZhcik7CiAgICAgICAgc25tcF9zdG9yZV9uZWVkZWQoTlVMTCk7CiAgICAgICAgYnJlYWs7CiAgICB9CiAgICByZXR1cm4gU05NUF9FUlJfTk9FUlJPUjsKfQoKaW50CndyaXRlX3BpbmdDdGxUcmFwUHJvYmVGYWlsdXJlRmlsdGVyKGludCBhY3Rpb24sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVfY2hhciAqIHZhcl92YWwsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVfY2hhciB2YXJfdmFsX3R5cGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCB2YXJfdmFsX2xlbiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdV9jaGFyICogc3RhdFAsIG9pZCAqIG5hbWUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCBuYW1lX2xlbikKewogICAgc3RhdGljIHNpemVfdCAgIHRtcHZhcjsKICAgIHN0cnVjdCBwaW5nQ3RsVGFibGVfZGF0YSAqU3RvcmFnZVRtcCA9IE5VTEw7CiAgICBzaXplX3QgICAgICAgICAgbmV3bGVuID0KICAgICAgICBuYW1lX2xlbiAtIChzaXplb2YocGluZ0N0bFRhYmxlX3ZhcmlhYmxlc19vaWQpIC8gc2l6ZW9mKG9pZCkgKwogICAgICAgICAgICAgICAgICAgIDMgLSAxKTsKCgogICAgREVCVUdNU0dUTCgoInBpbmdDdGxUYWJsZSIsCiAgICAgICAgICAgICAgICAicGluZ0N0bFRyYXBQcm9iZUZhaWx1cmVGaWx0ZXIgZW50ZXJpbmcgYWN0aW9uPSVkLi4uICBcbiIsCiAgICAgICAgICAgICAgICBhY3Rpb24pKTsKCiAgICBpZiAoKFN0b3JhZ2VUbXAgPQogICAgICAgICBoZWFkZXJfY29tcGxleChwaW5nQ3RsVGFibGVTdG9yYWdlLCBOVUxMLAogICAgICAgICAgICAgICAgICAgICAgICAmbmFtZVtzaXplb2YocGluZ0N0bFRhYmxlX3ZhcmlhYmxlc19vaWQpIC8KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKG9pZCkgKyAzIC0gMV0sICZuZXdsZW4sIDEsIE5VTEwsCiAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwpKSA9PSBOVUxMKQogICAgICAgIHJldHVybiBTTk1QX0VSUl9OT1NVQ0hOQU1FOyAgICAgLyogcmVtb3ZlIGlmIHlvdSBzdXBwb3J0IGNyZWF0aW9uIGhlcmUgKi8KCiAgICBpZiAoU3RvcmFnZVRtcCAmJiBTdG9yYWdlVG1wLT5zdG9yYWdlVHlwZSA9PSBTVF9SRUFET05MWSkgewogICAgICAgIHJldHVybiBTTk1QX0VSUl9OT1RXUklUQUJMRTsKICAgIH0KCiAgICBpZiAoU3RvcmFnZVRtcCAmJiBTdG9yYWdlVG1wLT5waW5nQ3RsUm93U3RhdHVzID09IFJTX0FDVElWRSkgewogICAgICAgIHJldHVybiBTTk1QX0VSUl9OT1RXUklUQUJMRTsKICAgIH0KICAgIHN3aXRjaCAoYWN0aW9uKSB7CiAgICBjYXNlIFJFU0VSVkUxOgogICAgICAgIGlmICh2YXJfdmFsX3R5cGUgIT0gQVNOX1VOU0lHTkVEKSB7CiAgICAgICAgICAgIHNubXBfbG9nKExPR19FUlIsCiAgICAgICAgICAgICAgICAgICAgICJ3cml0ZSB0byBwaW5nQ3RsVHJhcFByb2JlRmFpbHVyZUZpbHRlciBub3QgQVNOX1VOU0lHTkVEXG4iKTsKICAgICAgICAgICAgcmV0dXJuIFNOTVBfRVJSX1dST05HVFlQRTsKICAgICAgICB9CiAgICAgICAgYnJlYWs7CgoKICAgIGNhc2UgUkVTRVJWRTI6CiAgICAgICAgLyoKICAgICAgICAgKiBtZW1vcnkgcmVzZXZlcmF0aW9uLCBmaW5hbCBwcmVwYXJhdGlvbi4uLiAKICAgICAgICAgKi8KICAgICAgICBicmVhazsKCgogICAgY2FzZSBGUkVFOgogICAgICAgIC8qCiAgICAgICAgICogUmVsZWFzZSBhbnkgcmVzb3VyY2VzIHRoYXQgaGF2ZSBiZWVuIGFsbG9jYXRlZCAKICAgICAgICAgKi8KICAgICAgICBicmVhazsKCgogICAgY2FzZSBBQ1RJT046CiAgICAgICAgLyoKICAgICAgICAgKiBUaGUgdmFyaWFibGUgaGFzIGJlZW4gc3RvcmVkIGluIG9iamlkIGZvcgogICAgICAgICAqIHlvdSB0byB1c2UsIGFuZCB5b3UgaGF2ZSBqdXN0IGJlZW4gYXNrZWQgdG8gZG8gc29tZXRoaW5nIHdpdGgKICAgICAgICAgKiBpdC4gIE5vdGUgdGhhdCBhbnl0aGluZyBkb25lIGhlcmUgbXVzdCBiZSByZXZlcnNhYmxlIGluIHRoZSBVTkRPIGNhc2UgCiAgICAgICAgICovCiAgICAgICAgdG1wdmFyID0gU3RvcmFnZVRtcC0+cGluZ0N0bFRyYXBQcm9iZUZhaWx1cmVGaWx0ZXI7CgogICAgICAgIGlmICgoKigobG9uZyAqKSB2YXJfdmFsKSkgPj0gMCAmJiAoKigobG9uZyAqKSB2YXJfdmFsKSkgPD0gMTUpCiAgICAgICAgICAgIFN0b3JhZ2VUbXAtPnBpbmdDdGxUcmFwUHJvYmVGYWlsdXJlRmlsdGVyID0KICAgICAgICAgICAgICAgICooKGxvbmcgKikgdmFyX3ZhbCk7CiAgICAgICAgZWxzZQogICAgICAgICAgICBTdG9yYWdlVG1wLT5waW5nQ3RsVHJhcFByb2JlRmFpbHVyZUZpbHRlciA9IDE7CiAgICAgICAgYnJlYWs7CgoKICAgIGNhc2UgVU5ETzoKICAgICAgICAvKgogICAgICAgICAqIEJhY2sgb3V0IGFueSBjaGFuZ2VzIG1hZGUgaW4gdGhlIEFDVElPTiBjYXNlIAogICAgICAgICAqLwogICAgICAgIFN0b3JhZ2VUbXAtPnBpbmdDdGxUcmFwUHJvYmVGYWlsdXJlRmlsdGVyID0gdG1wdmFyOwogICAgICAgIGJyZWFrOwoKCiAgICBjYXNlIENPTU1JVDoKICAgICAgICAvKgogICAgICAgICAqIFRoaW5ncyBhcmUgd29ya2luZyB3ZWxsLCBzbyBpdCdzIG5vdyBzYWZlIHRvIG1ha2UgdGhlIGNoYW5nZQogICAgICAgICAqIHBlcm1hbmVudGx5LiAgTWFrZSBzdXJlIHRoYXQgYW55dGhpbmcgZG9uZSBoZXJlIGNhbid0IGZhaWwhIAogICAgICAgICAqLwogICAgICAgIHNubXBfc3RvcmVfbmVlZGVkKE5VTEwpOwogICAgICAgIGJyZWFrOwogICAgfQogICAgcmV0dXJuIFNOTVBfRVJSX05PRVJST1I7Cn0KCgppbnQKd3JpdGVfcGluZ0N0bFRyYXBUZXN0RmFpbHVyZUZpbHRlcihpbnQgYWN0aW9uLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVfY2hhciAqIHZhcl92YWwsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdV9jaGFyIHZhcl92YWxfdHlwZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QgdmFyX3ZhbF9sZW4sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdV9jaGFyICogc3RhdFAsIG9pZCAqIG5hbWUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90IG5hbWVfbGVuKQp7CiAgICBzdGF0aWMgc2l6ZV90ICAgdG1wdmFyOwogICAgc3RydWN0IHBpbmdDdGxUYWJsZV9kYXRhICpTdG9yYWdlVG1wID0gTlVMTDsKICAgIHNpemVfdCAgICAgICAgICBuZXdsZW4gPQogICAgICAgIG5hbWVfbGVuIC0gKHNpemVvZihwaW5nQ3RsVGFibGVfdmFyaWFibGVzX29pZCkgLyBzaXplb2Yob2lkKSArCiAgICAgICAgICAgICAgICAgICAgMyAtIDEpOwoKCiAgICBERUJVR01TR1RMKCgicGluZ0N0bFRhYmxlIiwKICAgICAgICAgICAgICAgICJwaW5nQ3RsVHJhcFRlc3RGYWlsdXJlRmlsdGVyIGVudGVyaW5nIGFjdGlvbj0lZC4uLiAgXG4iLAogICAgICAgICAgICAgICAgYWN0aW9uKSk7CgogICAgaWYgKChTdG9yYWdlVG1wID0KICAgICAgICAgaGVhZGVyX2NvbXBsZXgocGluZ0N0bFRhYmxlU3RvcmFnZSwgTlVMTCwKICAgICAgICAgICAgICAgICAgICAgICAgJm5hbWVbc2l6ZW9mKHBpbmdDdGxUYWJsZV92YXJpYWJsZXNfb2lkKSAvCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZihvaWQpICsgMyAtIDFdLCAmbmV3bGVuLCAxLCBOVUxMLAogICAgICAgICAgICAgICAgICAgICAgICBOVUxMKSkgPT0gTlVMTCkKICAgICAgICByZXR1cm4gU05NUF9FUlJfTk9TVUNITkFNRTsgICAgIC8qIHJlbW92ZSBpZiB5b3Ugc3VwcG9ydCBjcmVhdGlvbiBoZXJlICovCgogICAgaWYgKFN0b3JhZ2VUbXAgJiYgU3RvcmFnZVRtcC0+c3RvcmFnZVR5cGUgPT0gU1RfUkVBRE9OTFkpIHsKICAgICAgICByZXR1cm4gU05NUF9FUlJfTk9UV1JJVEFCTEU7CiAgICB9CgogICAgaWYgKFN0b3JhZ2VUbXAgJiYgU3RvcmFnZVRtcC0+cGluZ0N0bFJvd1N0YXR1cyA9PSBSU19BQ1RJVkUpIHsKICAgICAgICByZXR1cm4gU05NUF9FUlJfTk9UV1JJVEFCTEU7CiAgICB9CiAgICBzd2l0Y2ggKGFjdGlvbikgewogICAgY2FzZSBSRVNFUlZFMToKICAgICAgICBpZiAodmFyX3ZhbF90eXBlICE9IEFTTl9VTlNJR05FRCkgewogICAgICAgICAgICBzbm1wX2xvZyhMT0dfRVJSLAogICAgICAgICAgICAgICAgICAgICAid3JpdGUgdG8gcGluZ0N0bFRyYXBUZXN0RmFpbHVyZUZpbHRlciBub3QgQVNOX1VOU0lHTkVEXG4iKTsKICAgICAgICAgICAgcmV0dXJuIFNOTVBfRVJSX1dST05HVFlQRTsKICAgICAgICB9CiAgICAgICAgYnJlYWs7CgoKICAgIGNhc2UgUkVTRVJWRTI6CiAgICAgICAgLyoKICAgICAgICAgKiBtZW1vcnkgcmVzZXZlcmF0aW9uLCBmaW5hbCBwcmVwYXJhdGlvbi4uLiAKICAgICAgICAgKi8KICAgICAgICBicmVhazsKCgogICAgY2FzZSBGUkVFOgogICAgICAgIC8qCiAgICAgICAgICogUmVsZWFzZSBhbnkgcmVzb3VyY2VzIHRoYXQgaGF2ZSBiZWVuIGFsbG9jYXRlZCAKICAgICAgICAgKi8KICAgICAgICBicmVhazsKCgogICAgY2FzZSBBQ1RJT046CiAgICAgICAgLyoKICAgICAgICAgKiBUaGUgdmFyaWFibGUgaGFzIGJlZW4gc3RvcmVkIGluIG9iamlkIGZvcgogICAgICAgICAqIHlvdSB0byB1c2UsIGFuZCB5b3UgaGF2ZSBqdXN0IGJlZW4gYXNrZWQgdG8gZG8gc29tZXRoaW5nIHdpdGgKICAgICAgICAgKiBpdC4gIE5vdGUgdGhhdCBhbnl0aGluZyBkb25lIGhlcmUgbXVzdCBiZSByZXZlcnNhYmxlIGluIHRoZSBVTkRPIGNhc2UgCiAgICAgICAgICovCiAgICAgICAgdG1wdmFyID0gU3RvcmFnZVRtcC0+cGluZ0N0bFRyYXBUZXN0RmFpbHVyZUZpbHRlcjsKCiAgICAgICAgaWYgKCgqKChsb25nICopIHZhcl92YWwpKSA+PSAwICYmICgqKChsb25nICopIHZhcl92YWwpKSA8PSAxNSkKICAgICAgICAgICAgU3RvcmFnZVRtcC0+cGluZ0N0bFRyYXBUZXN0RmFpbHVyZUZpbHRlciA9ICooKGxvbmcgKikgdmFyX3ZhbCk7CiAgICAgICAgZWxzZQogICAgICAgICAgICBTdG9yYWdlVG1wLT5waW5nQ3RsVHJhcFRlc3RGYWlsdXJlRmlsdGVyID0gMTsKICAgICAgICBicmVhazsKCgogICAgY2FzZSBVTkRPOgogICAgICAgIC8qCiAgICAgICAgICogQmFjayBvdXQgYW55IGNoYW5nZXMgbWFkZSBpbiB0aGUgQUNUSU9OIGNhc2UgCiAgICAgICAgICovCiAgICAgICAgU3RvcmFnZVRtcC0+cGluZ0N0bFRyYXBUZXN0RmFpbHVyZUZpbHRlciA9IHRtcHZhcjsKICAgICAgICBicmVhazsKCgogICAgY2FzZSBDT01NSVQ6CiAgICAgICAgLyoKICAgICAgICAgKiBUaGluZ3MgYXJlIHdvcmtpbmcgd2VsbCwgc28gaXQncyBub3cgc2FmZSB0byBtYWtlIHRoZSBjaGFuZ2UKICAgICAgICAgKiBwZXJtYW5lbnRseS4gIE1ha2Ugc3VyZSB0aGF0IGFueXRoaW5nIGRvbmUgaGVyZSBjYW4ndCBmYWlsISAKICAgICAgICAgKi8KICAgICAgICBzbm1wX3N0b3JlX25lZWRlZChOVUxMKTsKICAgICAgICBicmVhazsKICAgIH0KICAgIHJldHVybiBTTk1QX0VSUl9OT0VSUk9SOwp9CgoKCgoKaW50CndyaXRlX3BpbmdDdGxUeXBlKGludCBhY3Rpb24sCiAgICAgICAgICAgICAgICAgIHVfY2hhciAqIHZhcl92YWwsCiAgICAgICAgICAgICAgICAgIHVfY2hhciB2YXJfdmFsX3R5cGUsCiAgICAgICAgICAgICAgICAgIHNpemVfdCB2YXJfdmFsX2xlbiwKICAgICAgICAgICAgICAgICAgdV9jaGFyICogc3RhdFAsIG9pZCAqIG5hbWUsIHNpemVfdCBuYW1lX2xlbikKewogICAgc3RhdGljIG9pZCAgICAgKnRtcHZhcjsKICAgIHN0YXRpYyBzaXplX3QgICB0bXBsZW47CiAgICBzdHJ1Y3QgcGluZ0N0bFRhYmxlX2RhdGEgKlN0b3JhZ2VUbXAgPSBOVUxMOwogICAgc2l6ZV90ICAgICAgICAgIG5ld2xlbiA9CiAgICAgICAgbmFtZV9sZW4gLSAoc2l6ZW9mKHBpbmdDdGxUYWJsZV92YXJpYWJsZXNfb2lkKSAvIHNpemVvZihvaWQpICsKICAgICAgICAgICAgICAgICAgICAzIC0gMSk7CgogICAgaWYgKChTdG9yYWdlVG1wID0KICAgICAgICAgaGVhZGVyX2NvbXBsZXgocGluZ0N0bFRhYmxlU3RvcmFnZSwgTlVMTCwKICAgICAgICAgICAgICAgICAgICAgICAgJm5hbWVbc2l6ZW9mKHBpbmdDdGxUYWJsZV92YXJpYWJsZXNfb2lkKSAvCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZihvaWQpICsgMyAtIDFdLCAmbmV3bGVuLCAxLCBOVUxMLAogICAgICAgICAgICAgICAgICAgICAgICBOVUxMKSkgPT0gTlVMTCkKICAgICAgICByZXR1cm4gU05NUF9FUlJfTk9TVUNITkFNRTsgICAgIC8qIHJlbW92ZSBpZiB5b3Ugc3VwcG9ydCBjcmVhdGlvbiBoZXJlICovCgogICAgaWYgKFN0b3JhZ2VUbXAgJiYgU3RvcmFnZVRtcC0+c3RvcmFnZVR5cGUgPT0gU1RfUkVBRE9OTFkpIHsKICAgICAgICByZXR1cm4gU05NUF9FUlJfTk9UV1JJVEFCTEU7CiAgICB9CgogICAgaWYgKFN0b3JhZ2VUbXAgJiYgU3RvcmFnZVRtcC0+cGluZ0N0bFJvd1N0YXR1cyA9PSBSU19BQ1RJVkUpIHsKICAgICAgICByZXR1cm4gU05NUF9FUlJfTk9UV1JJVEFCTEU7CiAgICB9CgogICAgc3dpdGNoIChhY3Rpb24pIHsKICAgIGNhc2UgUkVTRVJWRTE6CiAgICAgICAgaWYgKHZhcl92YWxfdHlwZSAhPSBBU05fT0JKRUNUX0lEKSB7CiAgICAgICAgICAgIHNubXBfbG9nKExPR19FUlIsICJ3cml0ZSB0byBwaW5nQ3RsVHlwZSBub3QgQVNOX09CSkVDVF9JRFxuIik7CiAgICAgICAgICAgIHJldHVybiBTTk1QX0VSUl9XUk9OR1RZUEU7CiAgICAgICAgfQogICAgICAgIGJyZWFrOwoKCiAgICBjYXNlIFJFU0VSVkUyOgogICAgICAgIC8qCiAgICAgICAgICogbWVtb3J5IHJlc2V2ZXJhdGlvbiwgZmluYWwgcHJlcGFyYXRpb24uLi4gCiAgICAgICAgICovCiAgICAgICAgYnJlYWs7CgoKICAgIGNhc2UgRlJFRToKICAgICAgICAvKgogICAgICAgICAqIFJlbGVhc2UgYW55IHJlc291cmNlcyB0aGF0IGhhdmUgYmVlbiBhbGxvY2F0ZWQgCiAgICAgICAgICovCiAgICAgICAgYnJlYWs7CgoKICAgIGNhc2UgQUNUSU9OOgogICAgICAgIC8qCiAgICAgICAgICogVGhlIHZhcmlhYmxlIGhhcyBiZWVuIHN0b3JlZCBpbiBsb25nX3JldCBmb3IKICAgICAgICAgKiB5b3UgdG8gdXNlLCBhbmQgeW91IGhhdmUganVzdCBiZWVuIGFza2VkIHRvIGRvIHNvbWV0aGluZyB3aXRoCiAgICAgICAgICogaXQuICBOb3RlIHRoYXQgYW55dGhpbmcgZG9uZSBoZXJlIG11c3QgYmUgcmV2ZXJzYWJsZSBpbiB0aGUgVU5ETyBjYXNlIAogICAgICAgICAqLwogICAgICAgIHRtcHZhciA9IFN0b3JhZ2VUbXAtPnBpbmdDdGxUeXBlOwogICAgICAgIHRtcGxlbiA9IFN0b3JhZ2VUbXAtPnBpbmdDdGxUeXBlTGVuOwoKICAgICAgICBTdG9yYWdlVG1wLT5waW5nQ3RsVHlwZSA9IChvaWQgKikgbWFsbG9jKHZhcl92YWxfbGVuKTsKICAgICAgICBpZiAoU3RvcmFnZVRtcC0+cGluZ0N0bFR5cGUgPT0gTlVMTCkgewogICAgICAgICAgICBleGl0KDEpOwogICAgICAgIH0KICAgICAgICBtZW1jcHkoU3RvcmFnZVRtcC0+cGluZ0N0bFR5cGUsIHZhcl92YWwsIHZhcl92YWxfbGVuKTsKCiAgICAgICAgU3RvcmFnZVRtcC0+cGluZ0N0bFR5cGVMZW4gPSB2YXJfdmFsX2xlbiAvIHNpemVvZihvaWQpOwoKICAgICAgICBicmVhazsKCgogICAgY2FzZSBVTkRPOgogICAgICAgIC8qCiAgICAgICAgICogQmFjayBvdXQgYW55IGNoYW5nZXMgbWFkZSBpbiB0aGUgQUNUSU9OIGNhc2UgCiAgICAgICAgICovCiAgICAgICAgU05NUF9GUkVFKFN0b3JhZ2VUbXAtPnBpbmdDdGxUeXBlKTsKICAgICAgICBTdG9yYWdlVG1wLT5waW5nQ3RsVHlwZSA9IHRtcHZhcjsKICAgICAgICBTdG9yYWdlVG1wLT5waW5nQ3RsVHlwZUxlbiA9IHRtcGxlbjsKICAgICAgICBicmVhazsKCgogICAgY2FzZSBDT01NSVQ6CiAgICAgICAgLyoKICAgICAgICAgKiBUaGluZ3MgYXJlIHdvcmtpbmcgd2VsbCwgc28gaXQncyBub3cgc2FmZSB0byBtYWtlIHRoZSBjaGFuZ2UKICAgICAgICAgKiBwZXJtYW5lbnRseS4gIE1ha2Ugc3VyZSB0aGF0IGFueXRoaW5nIGRvbmUgaGVyZSBjYW4ndCBmYWlsISAKICAgICAgICAgKi8KICAgICAgICBTTk1QX0ZSRUUodG1wdmFyKTsKICAgICAgICBzbm1wX3N0b3JlX25lZWRlZChOVUxMKTsKICAgICAgICBicmVhazsKICAgIH0KICAgIHJldHVybiBTTk1QX0VSUl9OT0VSUk9SOwp9CgoKCgppbnQKd3JpdGVfcGluZ0N0bERlc2NyKGludCBhY3Rpb24sCiAgICAgICAgICAgICAgICAgICB1X2NoYXIgKiB2YXJfdmFsLAogICAgICAgICAgICAgICAgICAgdV9jaGFyIHZhcl92YWxfdHlwZSwKICAgICAgICAgICAgICAgICAgIHNpemVfdCB2YXJfdmFsX2xlbiwKICAgICAgICAgICAgICAgICAgIHVfY2hhciAqIHN0YXRQLCBvaWQgKiBuYW1lLCBzaXplX3QgbmFtZV9sZW4pCnsKICAgIHN0YXRpYyBjaGFyICAgICp0bXB2YXI7CiAgICBzdGF0aWMgc2l6ZV90ICAgdG1wbGVuOwogICAgc3RydWN0IHBpbmdDdGxUYWJsZV9kYXRhICpTdG9yYWdlVG1wID0gTlVMTDsKICAgIHNpemVfdCAgICAgICAgICBuZXdsZW4gPQogICAgICAgIG5hbWVfbGVuIC0gKHNpemVvZihwaW5nQ3RsVGFibGVfdmFyaWFibGVzX29pZCkgLyBzaXplb2Yob2lkKSArCiAgICAgICAgICAgICAgICAgICAgMyAtIDEpOwoKICAgIGlmICgoU3RvcmFnZVRtcCA9CiAgICAgICAgIGhlYWRlcl9jb21wbGV4KHBpbmdDdGxUYWJsZVN0b3JhZ2UsIE5VTEwsCiAgICAgICAgICAgICAgICAgICAgICAgICZuYW1lW3NpemVvZihwaW5nQ3RsVGFibGVfdmFyaWFibGVzX29pZCkgLwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2Yob2lkKSArIDMgLSAxXSwgJm5ld2xlbiwgMSwgTlVMTCwKICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCkpID09IE5VTEwpCiAgICAgICAgcmV0dXJuIFNOTVBfRVJSX05PU1VDSE5BTUU7ICAgICAvKiByZW1vdmUgaWYgeW91IHN1cHBvcnQgY3JlYXRpb24gaGVyZSAqLwoKICAgIGlmIChTdG9yYWdlVG1wICYmIFN0b3JhZ2VUbXAtPnN0b3JhZ2VUeXBlID09IFNUX1JFQURPTkxZKSB7CiAgICAgICAgcmV0dXJuIFNOTVBfRVJSX05PVFdSSVRBQkxFOwogICAgfQoKICAgIGlmIChTdG9yYWdlVG1wICYmIFN0b3JhZ2VUbXAtPnBpbmdDdGxSb3dTdGF0dXMgPT0gUlNfQUNUSVZFKSB7CiAgICAgICAgcmV0dXJuIFNOTVBfRVJSX05PVFdSSVRBQkxFOwogICAgfQoKICAgIHN3aXRjaCAoYWN0aW9uKSB7CiAgICBjYXNlIFJFU0VSVkUxOgogICAgICAgIGlmICh2YXJfdmFsX3R5cGUgIT0gQVNOX09DVEVUX1NUUikgewogICAgICAgICAgICBzbm1wX2xvZyhMT0dfRVJSLCAid3JpdGUgdG8gcGluZ0N0bERlc2NyIG5vdCBBU05fT0NURVRfU1RSXG4iKTsKICAgICAgICAgICAgcmV0dXJuIFNOTVBfRVJSX1dST05HVFlQRTsKICAgICAgICB9CiAgICAgICAgYnJlYWs7CgoKICAgIGNhc2UgUkVTRVJWRTI6CiAgICAgICAgLyoKICAgICAgICAgKiBtZW1vcnkgcmVzZXZlcmF0aW9uLCBmaW5hbCBwcmVwYXJhdGlvbi4uLiAKICAgICAgICAgKi8KICAgICAgICBicmVhazsKCgogICAgY2FzZSBGUkVFOgogICAgICAgIC8qCiAgICAgICAgICogUmVsZWFzZSBhbnkgcmVzb3VyY2VzIHRoYXQgaGF2ZSBiZWVuIGFsbG9jYXRlZCAKICAgICAgICAgKi8KICAgICAgICBicmVhazsKCgogICAgY2FzZSBBQ1RJT046CiAgICAgICAgLyoKICAgICAgICAgKiBUaGUgdmFyaWFibGUgaGFzIGJlZW4gc3RvcmVkIGluIGxvbmdfcmV0IGZvcgogICAgICAgICAqIHlvdSB0byB1c2UsIGFuZCB5b3UgaGF2ZSBqdXN0IGJlZW4gYXNrZWQgdG8gZG8gc29tZXRoaW5nIHdpdGgKICAgICAgICAgKiBpdC4gIE5vdGUgdGhhdCBhbnl0aGluZyBkb25lIGhlcmUgbXVzdCBiZSByZXZlcnNhYmxlIGluIHRoZSBVTkRPIGNhc2UgCiAgICAgICAgICovCiAgICAgICAgdG1wdmFyID0gU3RvcmFnZVRtcC0+cGluZ0N0bERlc2NyOwogICAgICAgIHRtcGxlbiA9IFN0b3JhZ2VUbXAtPnBpbmdDdGxEZXNjckxlbjsKCiAgICAgICAgU3RvcmFnZVRtcC0+cGluZ0N0bERlc2NyID0gKGNoYXIgKikgbWFsbG9jKHZhcl92YWxfbGVuICsgMSk7CiAgICAgICAgaWYgKFN0b3JhZ2VUbXAtPnBpbmdDdGxEZXNjciA9PSBOVUxMKSB7CiAgICAgICAgICAgIGV4aXQoMSk7CiAgICAgICAgfQogICAgICAgIG1lbWNweShTdG9yYWdlVG1wLT5waW5nQ3RsRGVzY3IsIHZhcl92YWwsIHZhcl92YWxfbGVuKTsKICAgICAgICBTdG9yYWdlVG1wLT5waW5nQ3RsRGVzY3JbdmFyX3ZhbF9sZW5dID0gJ1wwJzsKICAgICAgICBTdG9yYWdlVG1wLT5waW5nQ3RsRGVzY3JMZW4gPSB2YXJfdmFsX2xlbjsKCiAgICAgICAgYnJlYWs7CgoKICAgIGNhc2UgVU5ETzoKICAgICAgICAvKgogICAgICAgICAqIEJhY2sgb3V0IGFueSBjaGFuZ2VzIG1hZGUgaW4gdGhlIEFDVElPTiBjYXNlIAogICAgICAgICAqLwogICAgICAgIFNOTVBfRlJFRShTdG9yYWdlVG1wLT5waW5nQ3RsRGVzY3IpOwogICAgICAgIFN0b3JhZ2VUbXAtPnBpbmdDdGxEZXNjciA9IHRtcHZhcjsKICAgICAgICBTdG9yYWdlVG1wLT5waW5nQ3RsRGVzY3JMZW4gPSB0bXBsZW47CiAgICAgICAgYnJlYWs7CgoKICAgIGNhc2UgQ09NTUlUOgogICAgICAgIC8qCiAgICAgICAgICogVGhpbmdzIGFyZSB3b3JraW5nIHdlbGwsIHNvIGl0J3Mgbm93IHNhZmUgdG8gbWFrZSB0aGUgY2hhbmdlCiAgICAgICAgICogcGVybWFuZW50bHkuICBNYWtlIHN1cmUgdGhhdCBhbnl0aGluZyBkb25lIGhlcmUgY2FuJ3QgZmFpbCEgCiAgICAgICAgICovCiAgICAgICAgU05NUF9GUkVFKHRtcHZhcik7CiAgICAgICAgc25tcF9zdG9yZV9uZWVkZWQoTlVMTCk7CiAgICAgICAgYnJlYWs7CiAgICB9CiAgICByZXR1cm4gU05NUF9FUlJfTk9FUlJPUjsKfQoKCmludAp3cml0ZV9waW5nQ3RsU291cmNlQWRkcmVzc1R5cGUoaW50IGFjdGlvbiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVfY2hhciAqIHZhcl92YWwsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1X2NoYXIgdmFyX3ZhbF90eXBlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90IHZhcl92YWxfbGVuLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdV9jaGFyICogc3RhdFAsIG9pZCAqIG5hbWUsIHNpemVfdCBuYW1lX2xlbikKewogICAgc3RhdGljIHNpemVfdCAgIHRtcHZhcjsKICAgIHN0cnVjdCBwaW5nQ3RsVGFibGVfZGF0YSAqU3RvcmFnZVRtcCA9IE5VTEw7CiAgICBzaXplX3QgICAgICAgICAgbmV3bGVuID0KICAgICAgICBuYW1lX2xlbiAtIChzaXplb2YocGluZ0N0bFRhYmxlX3ZhcmlhYmxlc19vaWQpIC8gc2l6ZW9mKG9pZCkgKwogICAgICAgICAgICAgICAgICAgIDMgLSAxKTsKCgogICAgREVCVUdNU0dUTCgoInBpbmdDdGxUYWJsZSIsCiAgICAgICAgICAgICAgICAicGluZ0N0bFNvdXJjZUFkZHJlc3NUeXBlIGVudGVyaW5nIGFjdGlvbj0lZC4uLiAgXG4iLAogICAgICAgICAgICAgICAgYWN0aW9uKSk7CgogICAgaWYgKChTdG9yYWdlVG1wID0KICAgICAgICAgaGVhZGVyX2NvbXBsZXgocGluZ0N0bFRhYmxlU3RvcmFnZSwgTlVMTCwKICAgICAgICAgICAgICAgICAgICAgICAgJm5hbWVbc2l6ZW9mKHBpbmdDdGxUYWJsZV92YXJpYWJsZXNfb2lkKSAvCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZihvaWQpICsgMyAtIDFdLCAmbmV3bGVuLCAxLCBOVUxMLAogICAgICAgICAgICAgICAgICAgICAgICBOVUxMKSkgPT0gTlVMTCkKICAgICAgICByZXR1cm4gU05NUF9FUlJfTk9TVUNITkFNRTsgICAgIC8qIHJlbW92ZSBpZiB5b3Ugc3VwcG9ydCBjcmVhdGlvbiBoZXJlICovCgogICAgaWYgKFN0b3JhZ2VUbXAgJiYgU3RvcmFnZVRtcC0+c3RvcmFnZVR5cGUgPT0gU1RfUkVBRE9OTFkpIHsKICAgICAgICByZXR1cm4gU05NUF9FUlJfTk9UV1JJVEFCTEU7CiAgICB9CgogICAgaWYgKFN0b3JhZ2VUbXAgJiYgU3RvcmFnZVRtcC0+cGluZ0N0bFJvd1N0YXR1cyA9PSBSU19BQ1RJVkUpIHsKICAgICAgICByZXR1cm4gU05NUF9FUlJfTk9UV1JJVEFCTEU7CiAgICB9CiAgICBzd2l0Y2ggKGFjdGlvbikgewogICAgY2FzZSBSRVNFUlZFMToKICAgICAgICBpZiAodmFyX3ZhbF90eXBlICE9IEFTTl9JTlRFR0VSKSB7CiAgICAgICAgICAgIHNubXBfbG9nKExPR19FUlIsCiAgICAgICAgICAgICAgICAgICAgICJ3cml0ZSB0byBwaW5nQ3RsU291cmNlQWRkcmVzc1R5cGUgbm90IEFTTl9JTlRFR0VSXG4iKTsKICAgICAgICAgICAgcmV0dXJuIFNOTVBfRVJSX1dST05HVFlQRTsKICAgICAgICB9CiAgICAgICAgYnJlYWs7CgoKICAgIGNhc2UgUkVTRVJWRTI6CiAgICAgICAgLyoKICAgICAgICAgKiBtZW1vcnkgcmVzZXZlcmF0aW9uLCBmaW5hbCBwcmVwYXJhdGlvbi4uLiAKICAgICAgICAgKi8KICAgICAgICBicmVhazsKCgogICAgY2FzZSBGUkVFOgogICAgICAgIC8qCiAgICAgICAgICogUmVsZWFzZSBhbnkgcmVzb3VyY2VzIHRoYXQgaGF2ZSBiZWVuIGFsbG9jYXRlZCAKICAgICAgICAgKi8KICAgICAgICBicmVhazsKCgogICAgY2FzZSBBQ1RJT046CiAgICAgICAgLyoKICAgICAgICAgKiBUaGUgdmFyaWFibGUgaGFzIGJlZW4gc3RvcmVkIGluIG9iamlkIGZvcgogICAgICAgICAqIHlvdSB0byB1c2UsIGFuZCB5b3UgaGF2ZSBqdXN0IGJlZW4gYXNrZWQgdG8gZG8gc29tZXRoaW5nIHdpdGgKICAgICAgICAgKiBpdC4gIE5vdGUgdGhhdCBhbnl0aGluZyBkb25lIGhlcmUgbXVzdCBiZSByZXZlcnNhYmxlIGluIHRoZSBVTkRPIGNhc2UgCiAgICAgICAgICovCiAgICAgICAgdG1wdmFyID0gU3RvcmFnZVRtcC0+cGluZ0N0bFNvdXJjZUFkZHJlc3NUeXBlOwogICAgICAgIFN0b3JhZ2VUbXAtPnBpbmdDdGxTb3VyY2VBZGRyZXNzVHlwZSA9ICooKGxvbmcgKikgdmFyX3ZhbCk7CiAgICAgICAgYnJlYWs7CgoKICAgIGNhc2UgVU5ETzoKICAgICAgICAvKgogICAgICAgICAqIEJhY2sgb3V0IGFueSBjaGFuZ2VzIG1hZGUgaW4gdGhlIEFDVElPTiBjYXNlIAogICAgICAgICAqLwogICAgICAgIFN0b3JhZ2VUbXAtPnBpbmdDdGxTb3VyY2VBZGRyZXNzVHlwZSA9IHRtcHZhcjsKICAgICAgICBicmVhazsKCgogICAgY2FzZSBDT01NSVQ6CiAgICAgICAgLyoKICAgICAgICAgKiBUaGluZ3MgYXJlIHdvcmtpbmcgd2VsbCwgc28gaXQncyBub3cgc2FmZSB0byBtYWtlIHRoZSBjaGFuZ2UKICAgICAgICAgKiBwZXJtYW5lbnRseS4gIE1ha2Ugc3VyZSB0aGF0IGFueXRoaW5nIGRvbmUgaGVyZSBjYW4ndCBmYWlsISAKICAgICAgICAgKi8KICAgICAgICBzbm1wX3N0b3JlX25lZWRlZChOVUxMKTsKICAgICAgICBicmVhazsKICAgIH0KICAgIHJldHVybiBTTk1QX0VSUl9OT0VSUk9SOwp9CgoKCgppbnQKd3JpdGVfcGluZ0N0bFNvdXJjZUFkZHJlc3MoaW50IGFjdGlvbiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgdV9jaGFyICogdmFyX3ZhbCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgdV9jaGFyIHZhcl92YWxfdHlwZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90IHZhcl92YWxfbGVuLAogICAgICAgICAgICAgICAgICAgICAgICAgICB1X2NoYXIgKiBzdGF0UCwgb2lkICogbmFtZSwgc2l6ZV90IG5hbWVfbGVuKQp7CiAgICBzdGF0aWMgY2hhciAgICAqdG1wdmFyOwogICAgc3RhdGljIHNpemVfdCAgIHRtcGxlbjsKICAgIHN0cnVjdCBwaW5nQ3RsVGFibGVfZGF0YSAqU3RvcmFnZVRtcCA9IE5VTEw7CiAgICBzaXplX3QgICAgICAgICAgbmV3bGVuID0KICAgICAgICBuYW1lX2xlbiAtIChzaXplb2YocGluZ0N0bFRhYmxlX3ZhcmlhYmxlc19vaWQpIC8gc2l6ZW9mKG9pZCkgKwogICAgICAgICAgICAgICAgICAgIDMgLSAxKTsKCiAgICBpZiAoKFN0b3JhZ2VUbXAgPQogICAgICAgICBoZWFkZXJfY29tcGxleChwaW5nQ3RsVGFibGVTdG9yYWdlLCBOVUxMLAogICAgICAgICAgICAgICAgICAgICAgICAmbmFtZVtzaXplb2YocGluZ0N0bFRhYmxlX3ZhcmlhYmxlc19vaWQpIC8KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKG9pZCkgKyAzIC0gMV0sICZuZXdsZW4sIDEsIE5VTEwsCiAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwpKSA9PSBOVUxMKQogICAgICAgIHJldHVybiBTTk1QX0VSUl9OT1NVQ0hOQU1FOyAgICAgLyogcmVtb3ZlIGlmIHlvdSBzdXBwb3J0IGNyZWF0aW9uIGhlcmUgKi8KCiAgICBpZiAoU3RvcmFnZVRtcCAmJiBTdG9yYWdlVG1wLT5zdG9yYWdlVHlwZSA9PSBTVF9SRUFET05MWSkgewogICAgICAgIHJldHVybiBTTk1QX0VSUl9OT1RXUklUQUJMRTsKICAgIH0KCiAgICBpZiAoU3RvcmFnZVRtcCAmJiBTdG9yYWdlVG1wLT5waW5nQ3RsUm93U3RhdHVzID09IFJTX0FDVElWRSkgewogICAgICAgIHJldHVybiBTTk1QX0VSUl9OT1RXUklUQUJMRTsKICAgIH0KCiAgICBzd2l0Y2ggKGFjdGlvbikgewogICAgY2FzZSBSRVNFUlZFMToKICAgICAgICBpZiAodmFyX3ZhbF90eXBlICE9IEFTTl9PQ1RFVF9TVFIpIHsKICAgICAgICAgICAgc25tcF9sb2coTE9HX0VSUiwKICAgICAgICAgICAgICAgICAgICAgIndyaXRlIHRvIHBpbmdDdGxTb3VyY2VBZGRyZXNzIG5vdCBBU05fT0NURVRfU1RSXG4iKTsKICAgICAgICAgICAgcmV0dXJuIFNOTVBfRVJSX1dST05HVFlQRTsKICAgICAgICB9CiAgICAgICAgYnJlYWs7CgoKICAgIGNhc2UgUkVTRVJWRTI6CiAgICAgICAgLyoKICAgICAgICAgKiBtZW1vcnkgcmVzZXZlcmF0aW9uLCBmaW5hbCBwcmVwYXJhdGlvbi4uLiAKICAgICAgICAgKi8KICAgICAgICBicmVhazsKCgogICAgY2FzZSBGUkVFOgogICAgICAgIC8qCiAgICAgICAgICogUmVsZWFzZSBhbnkgcmVzb3VyY2VzIHRoYXQgaGF2ZSBiZWVuIGFsbG9jYXRlZCAKICAgICAgICAgKi8KICAgICAgICBicmVhazsKCgogICAgY2FzZSBBQ1RJT046CiAgICAgICAgLyoKICAgICAgICAgKiBUaGUgdmFyaWFibGUgaGFzIGJlZW4gc3RvcmVkIGluIGxvbmdfcmV0IGZvcgogICAgICAgICAqIHlvdSB0byB1c2UsIGFuZCB5b3UgaGF2ZSBqdXN0IGJlZW4gYXNrZWQgdG8gZG8gc29tZXRoaW5nIHdpdGgKICAgICAgICAgKiBpdC4gIE5vdGUgdGhhdCBhbnl0aGluZyBkb25lIGhlcmUgbXVzdCBiZSByZXZlcnNhYmxlIGluIHRoZSBVTkRPIGNhc2UgCiAgICAgICAgICovCiAgICAgICAgdG1wdmFyID0gU3RvcmFnZVRtcC0+cGluZ0N0bFNvdXJjZUFkZHJlc3M7CiAgICAgICAgdG1wbGVuID0gU3RvcmFnZVRtcC0+cGluZ0N0bFNvdXJjZUFkZHJlc3NMZW47CgogICAgICAgIFN0b3JhZ2VUbXAtPnBpbmdDdGxTb3VyY2VBZGRyZXNzID0KICAgICAgICAgICAgKGNoYXIgKikgbWFsbG9jKHZhcl92YWxfbGVuICsgMSk7CiAgICAgICAgaWYgKFN0b3JhZ2VUbXAtPnBpbmdDdGxTb3VyY2VBZGRyZXNzID09IE5VTEwpIHsKICAgICAgICAgICAgZXhpdCgxKTsKICAgICAgICB9CiAgICAgICAgbWVtY3B5KFN0b3JhZ2VUbXAtPnBpbmdDdGxTb3VyY2VBZGRyZXNzLCB2YXJfdmFsLCB2YXJfdmFsX2xlbik7CiAgICAgICAgU3RvcmFnZVRtcC0+cGluZ0N0bFNvdXJjZUFkZHJlc3NbdmFyX3ZhbF9sZW5dID0gJ1wwJzsKICAgICAgICBTdG9yYWdlVG1wLT5waW5nQ3RsU291cmNlQWRkcmVzc0xlbiA9IHZhcl92YWxfbGVuOwoKICAgICAgICBicmVhazsKCgogICAgY2FzZSBVTkRPOgogICAgICAgIC8qCiAgICAgICAgICogQmFjayBvdXQgYW55IGNoYW5nZXMgbWFkZSBpbiB0aGUgQUNUSU9OIGNhc2UgCiAgICAgICAgICovCiAgICAgICAgU05NUF9GUkVFKFN0b3JhZ2VUbXAtPnBpbmdDdGxTb3VyY2VBZGRyZXNzKTsKICAgICAgICBTdG9yYWdlVG1wLT5waW5nQ3RsU291cmNlQWRkcmVzcyA9IHRtcHZhcjsKICAgICAgICBTdG9yYWdlVG1wLT5waW5nQ3RsU291cmNlQWRkcmVzc0xlbiA9IHRtcGxlbjsKICAgICAgICBicmVhazsKCgogICAgY2FzZSBDT01NSVQ6CiAgICAgICAgLyoKICAgICAgICAgKiBUaGluZ3MgYXJlIHdvcmtpbmcgd2VsbCwgc28gaXQncyBub3cgc2FmZSB0byBtYWtlIHRoZSBjaGFuZ2UKICAgICAgICAgKiBwZXJtYW5lbnRseS4gIE1ha2Ugc3VyZSB0aGF0IGFueXRoaW5nIGRvbmUgaGVyZSBjYW4ndCBmYWlsISAKICAgICAgICAgKi8KICAgICAgICBTTk1QX0ZSRUUodG1wdmFyKTsKICAgICAgICBzbm1wX3N0b3JlX25lZWRlZChOVUxMKTsKICAgICAgICBicmVhazsKICAgIH0KICAgIHJldHVybiBTTk1QX0VSUl9OT0VSUk9SOwp9CgoKCmludAp3cml0ZV9waW5nQ3RsSWZJbmRleChpbnQgYWN0aW9uLAogICAgICAgICAgICAgICAgICAgICB1X2NoYXIgKiB2YXJfdmFsLAogICAgICAgICAgICAgICAgICAgICB1X2NoYXIgdmFyX3ZhbF90eXBlLAogICAgICAgICAgICAgICAgICAgICBzaXplX3QgdmFyX3ZhbF9sZW4sCiAgICAgICAgICAgICAgICAgICAgIHVfY2hhciAqIHN0YXRQLCBvaWQgKiBuYW1lLCBzaXplX3QgbmFtZV9sZW4pCnsKICAgIHN0YXRpYyBzaXplX3QgICB0bXB2YXI7CiAgICBzdHJ1Y3QgcGluZ0N0bFRhYmxlX2RhdGEgKlN0b3JhZ2VUbXAgPSBOVUxMOwogICAgc2l6ZV90ICAgICAgICAgIG5ld2xlbiA9CiAgICAgICAgbmFtZV9sZW4gLSAoc2l6ZW9mKHBpbmdDdGxUYWJsZV92YXJpYWJsZXNfb2lkKSAvIHNpemVvZihvaWQpICsKICAgICAgICAgICAgICAgICAgICAzIC0gMSk7CgoKICAgIERFQlVHTVNHVEwoKCJwaW5nQ3RsVGFibGUiLAogICAgICAgICAgICAgICAgInBpbmdDdGxJZkluZGV4IGVudGVyaW5nIGFjdGlvbj0lZC4uLiAgXG4iLCBhY3Rpb24pKTsKCiAgICBpZiAoKFN0b3JhZ2VUbXAgPQogICAgICAgICBoZWFkZXJfY29tcGxleChwaW5nQ3RsVGFibGVTdG9yYWdlLCBOVUxMLAogICAgICAgICAgICAgICAgICAgICAgICAmbmFtZVtzaXplb2YocGluZ0N0bFRhYmxlX3ZhcmlhYmxlc19vaWQpIC8KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKG9pZCkgKyAzIC0gMV0sICZuZXdsZW4sIDEsIE5VTEwsCiAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwpKSA9PSBOVUxMKQogICAgICAgIHJldHVybiBTTk1QX0VSUl9OT1NVQ0hOQU1FOyAgICAgLyogcmVtb3ZlIGlmIHlvdSBzdXBwb3J0IGNyZWF0aW9uIGhlcmUgKi8KCiAgICBpZiAoU3RvcmFnZVRtcCAmJiBTdG9yYWdlVG1wLT5zdG9yYWdlVHlwZSA9PSBTVF9SRUFET05MWSkgewogICAgICAgIHJldHVybiBTTk1QX0VSUl9OT1RXUklUQUJMRTsKICAgIH0KCiAgICBpZiAoU3RvcmFnZVRtcCAmJiBTdG9yYWdlVG1wLT5waW5nQ3RsUm93U3RhdHVzID09IFJTX0FDVElWRSkgewogICAgICAgIHJldHVybiBTTk1QX0VSUl9OT1RXUklUQUJMRTsKICAgIH0KICAgIHN3aXRjaCAoYWN0aW9uKSB7CiAgICBjYXNlIFJFU0VSVkUxOgogICAgICAgIGlmICh2YXJfdmFsX3R5cGUgIT0gQVNOX0lOVEVHRVIpIHsKICAgICAgICAgICAgc25tcF9sb2coTE9HX0VSUiwgIndyaXRlIHRvIHBpbmdDdGxJZkluZGV4IG5vdCBBU05fSU5URUdFUlxuIik7CiAgICAgICAgICAgIHJldHVybiBTTk1QX0VSUl9XUk9OR1RZUEU7CiAgICAgICAgfQogICAgICAgIGJyZWFrOwoKCiAgICBjYXNlIFJFU0VSVkUyOgogICAgICAgIC8qCiAgICAgICAgICogbWVtb3J5IHJlc2V2ZXJhdGlvbiwgZmluYWwgcHJlcGFyYXRpb24uLi4gCiAgICAgICAgICovCiAgICAgICAgYnJlYWs7CgoKICAgIGNhc2UgRlJFRToKICAgICAgICAvKgogICAgICAgICAqIFJlbGVhc2UgYW55IHJlc291cmNlcyB0aGF0IGhhdmUgYmVlbiBhbGxvY2F0ZWQgCiAgICAgICAgICovCiAgICAgICAgYnJlYWs7CgoKICAgIGNhc2UgQUNUSU9OOgogICAgICAgIC8qCiAgICAgICAgICogVGhlIHZhcmlhYmxlIGhhcyBiZWVuIHN0b3JlZCBpbiBvYmppZCBmb3IKICAgICAgICAgKiB5b3UgdG8gdXNlLCBhbmQgeW91IGhhdmUganVzdCBiZWVuIGFza2VkIHRvIGRvIHNvbWV0aGluZyB3aXRoCiAgICAgICAgICogaXQuICBOb3RlIHRoYXQgYW55dGhpbmcgZG9uZSBoZXJlIG11c3QgYmUgcmV2ZXJzYWJsZSBpbiB0aGUgVU5ETyBjYXNlIAogICAgICAgICAqLwogICAgICAgIHRtcHZhciA9IFN0b3JhZ2VUbXAtPnBpbmdDdGxJZkluZGV4OwogICAgICAgIFN0b3JhZ2VUbXAtPnBpbmdDdGxJZkluZGV4ID0gKigobG9uZyAqKSB2YXJfdmFsKTsKICAgICAgICBicmVhazsKCgogICAgY2FzZSBVTkRPOgogICAgICAgIC8qCiAgICAgICAgICogQmFjayBvdXQgYW55IGNoYW5nZXMgbWFkZSBpbiB0aGUgQUNUSU9OIGNhc2UgCiAgICAgICAgICovCiAgICAgICAgU3RvcmFnZVRtcC0+cGluZ0N0bElmSW5kZXggPSB0bXB2YXI7CiAgICAgICAgYnJlYWs7CgoKICAgIGNhc2UgQ09NTUlUOgogICAgICAgIC8qCiAgICAgICAgICogVGhpbmdzIGFyZSB3b3JraW5nIHdlbGwsIHNvIGl0J3Mgbm93IHNhZmUgdG8gbWFrZSB0aGUgY2hhbmdlCiAgICAgICAgICogcGVybWFuZW50bHkuICBNYWtlIHN1cmUgdGhhdCBhbnl0aGluZyBkb25lIGhlcmUgY2FuJ3QgZmFpbCEgCiAgICAgICAgICovCiAgICAgICAgc25tcF9zdG9yZV9uZWVkZWQoTlVMTCk7CiAgICAgICAgYnJlYWs7CiAgICB9CiAgICByZXR1cm4gU05NUF9FUlJfTk9FUlJPUjsKfQoKCgoKaW50CndyaXRlX3BpbmdDdGxCeVBhc3NSb3V0ZVRhYmxlKGludCBhY3Rpb24sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVfY2hhciAqIHZhcl92YWwsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVfY2hhciB2YXJfdmFsX3R5cGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCB2YXJfdmFsX2xlbiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdV9jaGFyICogc3RhdFAsIG9pZCAqIG5hbWUsIHNpemVfdCBuYW1lX2xlbikKewogICAgc3RhdGljIHNpemVfdCAgIHRtcHZhcjsKICAgIHN0cnVjdCBwaW5nQ3RsVGFibGVfZGF0YSAqU3RvcmFnZVRtcCA9IE5VTEw7CiAgICBzaXplX3QgICAgICAgICAgbmV3bGVuID0KICAgICAgICBuYW1lX2xlbiAtIChzaXplb2YocGluZ0N0bFRhYmxlX3ZhcmlhYmxlc19vaWQpIC8gc2l6ZW9mKG9pZCkgKwogICAgICAgICAgICAgICAgICAgIDMgLSAxKTsKCgogICAgREVCVUdNU0dUTCgoInBpbmdDdGxUYWJsZSIsCiAgICAgICAgICAgICAgICAicGluZ0N0bEJ5UGFzc1JvdXRlVGFibGUgZW50ZXJpbmcgYWN0aW9uPSVkLi4uICBcbiIsCiAgICAgICAgICAgICAgICBhY3Rpb24pKTsKCiAgICBpZiAoKFN0b3JhZ2VUbXAgPQogICAgICAgICBoZWFkZXJfY29tcGxleChwaW5nQ3RsVGFibGVTdG9yYWdlLCBOVUxMLAogICAgICAgICAgICAgICAgICAgICAgICAmbmFtZVtzaXplb2YocGluZ0N0bFRhYmxlX3ZhcmlhYmxlc19vaWQpIC8KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKG9pZCkgKyAzIC0gMV0sICZuZXdsZW4sIDEsIE5VTEwsCiAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwpKSA9PSBOVUxMKQogICAgICAgIHJldHVybiBTTk1QX0VSUl9OT1NVQ0hOQU1FOyAgICAgLyogcmVtb3ZlIGlmIHlvdSBzdXBwb3J0IGNyZWF0aW9uIGhlcmUgKi8KCiAgICBpZiAoU3RvcmFnZVRtcCAmJiBTdG9yYWdlVG1wLT5zdG9yYWdlVHlwZSA9PSBTVF9SRUFET05MWSkgewogICAgICAgIHJldHVybiBTTk1QX0VSUl9OT1RXUklUQUJMRTsKICAgIH0KCiAgICBpZiAoU3RvcmFnZVRtcCAmJiBTdG9yYWdlVG1wLT5waW5nQ3RsUm93U3RhdHVzID09IFJTX0FDVElWRSkgewogICAgICAgIHJldHVybiBTTk1QX0VSUl9OT1RXUklUQUJMRTsKICAgIH0KICAgIHN3aXRjaCAoYWN0aW9uKSB7CiAgICBjYXNlIFJFU0VSVkUxOgogICAgICAgIGlmICh2YXJfdmFsX3R5cGUgIT0gQVNOX0lOVEVHRVIpIHsKICAgICAgICAgICAgc25tcF9sb2coTE9HX0VSUiwKICAgICAgICAgICAgICAgICAgICAgIndyaXRlIHRvIHBpbmdDdGxCeVBhc3NSb3V0ZVRhYmxlIG5vdCBBU05fSU5URUdFUlxuIik7CiAgICAgICAgICAgIHJldHVybiBTTk1QX0VSUl9XUk9OR1RZUEU7CiAgICAgICAgfQogICAgICAgIGJyZWFrOwoKCiAgICBjYXNlIFJFU0VSVkUyOgogICAgICAgIC8qCiAgICAgICAgICogbWVtb3J5IHJlc2V2ZXJhdGlvbiwgZmluYWwgcHJlcGFyYXRpb24uLi4gCiAgICAgICAgICovCiAgICAgICAgYnJlYWs7CgoKICAgIGNhc2UgRlJFRToKICAgICAgICAvKgogICAgICAgICAqIFJlbGVhc2UgYW55IHJlc291cmNlcyB0aGF0IGhhdmUgYmVlbiBhbGxvY2F0ZWQgCiAgICAgICAgICovCiAgICAgICAgYnJlYWs7CgoKICAgIGNhc2UgQUNUSU9OOgogICAgICAgIC8qCiAgICAgICAgICogVGhlIHZhcmlhYmxlIGhhcyBiZWVuIHN0b3JlZCBpbiBvYmppZCBmb3IKICAgICAgICAgKiB5b3UgdG8gdXNlLCBhbmQgeW91IGhhdmUganVzdCBiZWVuIGFza2VkIHRvIGRvIHNvbWV0aGluZyB3aXRoCiAgICAgICAgICogaXQuICBOb3RlIHRoYXQgYW55dGhpbmcgZG9uZSBoZXJlIG11c3QgYmUgcmV2ZXJzYWJsZSBpbiB0aGUgVU5ETyBjYXNlIAogICAgICAgICAqLwogICAgICAgIHRtcHZhciA9IFN0b3JhZ2VUbXAtPnBpbmdDdGxCeVBhc3NSb3V0ZVRhYmxlOwogICAgICAgIFN0b3JhZ2VUbXAtPnBpbmdDdGxCeVBhc3NSb3V0ZVRhYmxlID0gKigobG9uZyAqKSB2YXJfdmFsKTsKICAgICAgICBicmVhazsKCgogICAgY2FzZSBVTkRPOgogICAgICAgIC8qCiAgICAgICAgICogQmFjayBvdXQgYW55IGNoYW5nZXMgbWFkZSBpbiB0aGUgQUNUSU9OIGNhc2UgCiAgICAgICAgICovCiAgICAgICAgU3RvcmFnZVRtcC0+cGluZ0N0bEJ5UGFzc1JvdXRlVGFibGUgPSB0bXB2YXI7CiAgICAgICAgYnJlYWs7CgoKICAgIGNhc2UgQ09NTUlUOgogICAgICAgIC8qCiAgICAgICAgICogVGhpbmdzIGFyZSB3b3JraW5nIHdlbGwsIHNvIGl0J3Mgbm93IHNhZmUgdG8gbWFrZSB0aGUgY2hhbmdlCiAgICAgICAgICogcGVybWFuZW50bHkuICBNYWtlIHN1cmUgdGhhdCBhbnl0aGluZyBkb25lIGhlcmUgY2FuJ3QgZmFpbCEgCiAgICAgICAgICovCiAgICAgICAgc25tcF9zdG9yZV9uZWVkZWQoTlVMTCk7CiAgICAgICAgYnJlYWs7CiAgICB9CiAgICByZXR1cm4gU05NUF9FUlJfTk9FUlJPUjsKfQoKCgoKCmludAp3cml0ZV9waW5nQ3RsRFNGaWVsZChpbnQgYWN0aW9uLAogICAgICAgICAgICAgICAgICAgICB1X2NoYXIgKiB2YXJfdmFsLAogICAgICAgICAgICAgICAgICAgICB1X2NoYXIgdmFyX3ZhbF90eXBlLAogICAgICAgICAgICAgICAgICAgICBzaXplX3QgdmFyX3ZhbF9sZW4sCiAgICAgICAgICAgICAgICAgICAgIHVfY2hhciAqIHN0YXRQLCBvaWQgKiBuYW1lLCBzaXplX3QgbmFtZV9sZW4pCnsKICAgIHN0YXRpYyBzaXplX3QgICB0bXB2YXI7CiAgICBzdHJ1Y3QgcGluZ0N0bFRhYmxlX2RhdGEgKlN0b3JhZ2VUbXAgPSBOVUxMOwogICAgc2l6ZV90ICAgICAgICAgIG5ld2xlbiA9CiAgICAgICAgbmFtZV9sZW4gLSAoc2l6ZW9mKHBpbmdDdGxUYWJsZV92YXJpYWJsZXNfb2lkKSAvIHNpemVvZihvaWQpICsKICAgICAgICAgICAgICAgICAgICAzIC0gMSk7CgoKICAgIERFQlVHTVNHVEwoKCJwaW5nQ3RsVGFibGUiLAogICAgICAgICAgICAgICAgInBpbmdDdGxEU0ZpZWxkIGVudGVyaW5nIGFjdGlvbj0lZC4uLiAgXG4iLCBhY3Rpb24pKTsKCiAgICBpZiAoKFN0b3JhZ2VUbXAgPQogICAgICAgICBoZWFkZXJfY29tcGxleChwaW5nQ3RsVGFibGVTdG9yYWdlLCBOVUxMLAogICAgICAgICAgICAgICAgICAgICAgICAmbmFtZVtzaXplb2YocGluZ0N0bFRhYmxlX3ZhcmlhYmxlc19vaWQpIC8KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKG9pZCkgKyAzIC0gMV0sICZuZXdsZW4sIDEsIE5VTEwsCiAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwpKSA9PSBOVUxMKQogICAgICAgIHJldHVybiBTTk1QX0VSUl9OT1NVQ0hOQU1FOyAgICAgLyogcmVtb3ZlIGlmIHlvdSBzdXBwb3J0IGNyZWF0aW9uIGhlcmUgKi8KCiAgICBpZiAoU3RvcmFnZVRtcCAmJiBTdG9yYWdlVG1wLT5zdG9yYWdlVHlwZSA9PSBTVF9SRUFET05MWSkgewogICAgICAgIHJldHVybiBTTk1QX0VSUl9OT1RXUklUQUJMRTsKICAgIH0KCiAgICBpZiAoU3RvcmFnZVRtcCAmJiBTdG9yYWdlVG1wLT5waW5nQ3RsUm93U3RhdHVzID09IFJTX0FDVElWRSkgewogICAgICAgIHJldHVybiBTTk1QX0VSUl9OT1RXUklUQUJMRTsKICAgIH0KICAgIHN3aXRjaCAoYWN0aW9uKSB7CiAgICBjYXNlIFJFU0VSVkUxOgogICAgICAgIGlmICh2YXJfdmFsX3R5cGUgIT0gQVNOX1VOU0lHTkVEKSB7CiAgICAgICAgICAgIHNubXBfbG9nKExPR19FUlIsCiAgICAgICAgICAgICAgICAgICAgICJ3cml0ZSB0byBwaW5nQ3RsRFNGaWVsZCBub3QgQVNOX1VOU0lHTkVEXG4iKTsKICAgICAgICAgICAgcmV0dXJuIFNOTVBfRVJSX1dST05HVFlQRTsKICAgICAgICB9CiAgICAgICAgYnJlYWs7CgoKICAgIGNhc2UgUkVTRVJWRTI6CiAgICAgICAgLyoKICAgICAgICAgKiBtZW1vcnkgcmVzZXZlcmF0aW9uLCBmaW5hbCBwcmVwYXJhdGlvbi4uLiAKICAgICAgICAgKi8KICAgICAgICBicmVhazsKCgogICAgY2FzZSBGUkVFOgogICAgICAgIC8qCiAgICAgICAgICogUmVsZWFzZSBhbnkgcmVzb3VyY2VzIHRoYXQgaGF2ZSBiZWVuIGFsbG9jYXRlZCAKICAgICAgICAgKi8KICAgICAgICBicmVhazsKCgogICAgY2FzZSBBQ1RJT046CiAgICAgICAgLyoKICAgICAgICAgKiBUaGUgdmFyaWFibGUgaGFzIGJlZW4gc3RvcmVkIGluIG9iamlkIGZvcgogICAgICAgICAqIHlvdSB0byB1c2UsIGFuZCB5b3UgaGF2ZSBqdXN0IGJlZW4gYXNrZWQgdG8gZG8gc29tZXRoaW5nIHdpdGgKICAgICAgICAgKiBpdC4gIE5vdGUgdGhhdCBhbnl0aGluZyBkb25lIGhlcmUgbXVzdCBiZSByZXZlcnNhYmxlIGluIHRoZSBVTkRPIGNhc2UgCiAgICAgICAgICovCiAgICAgICAgdG1wdmFyID0gU3RvcmFnZVRtcC0+cGluZ0N0bERTRmllbGQ7CiAgICAgICAgU3RvcmFnZVRtcC0+cGluZ0N0bERTRmllbGQgPSAqKChsb25nICopIHZhcl92YWwpOwogICAgICAgIGJyZWFrOwoKCiAgICBjYXNlIFVORE86CiAgICAgICAgLyoKICAgICAgICAgKiBCYWNrIG91dCBhbnkgY2hhbmdlcyBtYWRlIGluIHRoZSBBQ1RJT04gY2FzZSAKICAgICAgICAgKi8KICAgICAgICBTdG9yYWdlVG1wLT5waW5nQ3RsRFNGaWVsZCA9IHRtcHZhcjsKICAgICAgICBicmVhazsKCgogICAgY2FzZSBDT01NSVQ6CiAgICAgICAgLyoKICAgICAgICAgKiBUaGluZ3MgYXJlIHdvcmtpbmcgd2VsbCwgc28gaXQncyBub3cgc2FmZSB0byBtYWtlIHRoZSBjaGFuZ2UKICAgICAgICAgKiBwZXJtYW5lbnRseS4gIE1ha2Ugc3VyZSB0aGF0IGFueXRoaW5nIGRvbmUgaGVyZSBjYW4ndCBmYWlsISAKICAgICAgICAgKi8KICAgICAgICBzbm1wX3N0b3JlX25lZWRlZChOVUxMKTsKICAgICAgICBicmVhazsKICAgIH0KICAgIHJldHVybiBTTk1QX0VSUl9OT0VSUk9SOwp9CgoKaW50CndyaXRlX3BpbmdDdGxSb3dTdGF0dXMoaW50IGFjdGlvbiwKICAgICAgICAgICAgICAgICAgICAgICB1X2NoYXIgKiB2YXJfdmFsLAogICAgICAgICAgICAgICAgICAgICAgIHVfY2hhciB2YXJfdmFsX3R5cGUsCiAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90IHZhcl92YWxfbGVuLAogICAgICAgICAgICAgICAgICAgICAgIHVfY2hhciAqIHN0YXRQLCBvaWQgKiBuYW1lLCBzaXplX3QgbmFtZV9sZW4pCnsKICAgIHN0cnVjdCBwaW5nQ3RsVGFibGVfZGF0YSAqU3RvcmFnZVRtcDsKICAgIHN0YXRpYyBzdHJ1Y3QgcGluZ0N0bFRhYmxlX2RhdGEgKlN0b3JhZ2VOZXcsICpTdG9yYWdlRGVsOwogICAgc2l6ZV90ICAgICAgICAgIG5ld2xlbiA9CiAgICAgICAgbmFtZV9sZW4gLSAoc2l6ZW9mKHBpbmdDdGxUYWJsZV92YXJpYWJsZXNfb2lkKSAvIHNpemVvZihvaWQpICsKICAgICAgICAgICAgICAgICAgICAzIC0gMSk7CiAgICBzdGF0aWMgaW50ICAgICAgb2xkX3ZhbHVlOwogICAgaW50ICAgICAgICAgICAgIHNldF92YWx1ZTsKICAgIHN0cnVjdCBoZWFkZXJfY29tcGxleF9pbmRleCAqaGNpcHRyID0gTlVMTDsKCiAgICBERUJVR01TR1RMKCgicGluZ0N0bFRhYmxlIiwKICAgICAgICAgICAgICAgICJ2YXJfcGluZ0N0bFRhYmxlOiBFbnRlcmluZy4uLiAgYWN0aW9uPSV1bFxuIiwgYWN0aW9uKSk7CiAgICBTdG9yYWdlVG1wID0KICAgICAgICBoZWFkZXJfY29tcGxleChwaW5nQ3RsVGFibGVTdG9yYWdlLCBOVUxMLAogICAgICAgICAgICAgICAgICAgICAgICZuYW1lW3NpemVvZihwaW5nQ3RsVGFibGVfdmFyaWFibGVzX29pZCkgLwogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZihvaWQpICsgMyAtIDFdLCAmbmV3bGVuLCAxLCBOVUxMLCBOVUxMKTsKCiAgICBpZiAodmFyX3ZhbF90eXBlICE9IEFTTl9JTlRFR0VSIHx8IHZhcl92YWwgPT0gTlVMTCkgewogICAgICAgIHNubXBfbG9nKExPR19FUlIsICJ3cml0ZSB0byBwaW5nQ3RsUm93U3RhdHVzIG5vdCBBU05fSU5URUdFUlxuIik7CiAgICAgICAgcmV0dXJuIFNOTVBfRVJSX1dST05HVFlQRTsKICAgIH0KICAgIGlmIChTdG9yYWdlVG1wICYmIFN0b3JhZ2VUbXAtPnN0b3JhZ2VUeXBlID09IFNUX1JFQURPTkxZKSB7CiAgICAgICAgcmV0dXJuIFNOTVBfRVJSX05PVFdSSVRBQkxFOwogICAgfQoKICAgIHNldF92YWx1ZSA9ICooKGxvbmcgKikgdmFyX3ZhbCk7CgoKICAgIC8qCiAgICAgKiBjaGVjayBsZWdhbCByYW5nZSwgYW5kIG5vdFJlYWR5IGlzIHJlc2VydmVkIGZvciB1cywgbm90IGEgdXNlciAKICAgICAqLwogICAgaWYgKHNldF92YWx1ZSA8IDEgfHwgc2V0X3ZhbHVlID4gNiB8fCBzZXRfdmFsdWUgPT0gUlNfTk9UUkVBRFkpCiAgICAgICAgcmV0dXJuIFNOTVBfRVJSX0lOQ09OU0lTVEVOVFZBTFVFOwoKCiAgICBzd2l0Y2ggKGFjdGlvbikgewogICAgY2FzZSBSRVNFUlZFMToKICAgICAgICAvKgogICAgICAgICAqIHN0YWdlIG9uZTogdGVzdCB2YWxpZGl0eSAKICAgICAgICAgKi8KICAgICAgICBpZiAoU3RvcmFnZVRtcCA9PSBOVUxMKSB7CiAgICAgICAgICAgIC8qCiAgICAgICAgICAgICAqIGNyZWF0ZSB0aGUgcm93IG5vdz8gCiAgICAgICAgICAgICAqLwoKCiAgICAgICAgICAgIC8qCiAgICAgICAgICAgICAqIGRpdGNoIGlsbGVnYWwgdmFsdWVzIG5vdyAKICAgICAgICAgICAgICovCiAgICAgICAgICAgIGlmIChzZXRfdmFsdWUgPT0gUlNfQUNUSVZFIHx8IHNldF92YWx1ZSA9PSBSU19OT1RJTlNFUlZJQ0UpIHsKCiAgICAgICAgICAgICAgICByZXR1cm4gU05NUF9FUlJfSU5DT05TSVNURU5UVkFMVUU7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIC8qCiAgICAgICAgICAgICAqIGRlc3Ryb3lpbmcgYSBub24tZXhpc3RlbnQgcm93IGlzIGFjdHVhbGx5IGxlZ2FsIAogICAgICAgICAgICAgKi8KICAgICAgICAgICAgaWYgKHNldF92YWx1ZSA9PSBSU19ERVNUUk9ZKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gU05NUF9FUlJfTk9FUlJPUjsKICAgICAgICAgICAgfQoKCiAgICAgICAgICAgIC8qCiAgICAgICAgICAgICAqIGlsbGVnYWwgY3JlYXRpb24gdmFsdWVzIAogICAgICAgICAgICAgKi8KICAgICAgICAgICAgaWYgKHNldF92YWx1ZSA9PSBSU19BQ1RJVkUgfHwgc2V0X3ZhbHVlID09IFJTX05PVElOU0VSVklDRSkgewogICAgICAgICAgICAgICAgcmV0dXJuIFNOTVBfRVJSX0lOQ09OU0lTVEVOVFZBTFVFOwogICAgICAgICAgICB9CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgLyoKICAgICAgICAgICAgICogcm93IGV4aXN0cy4gIENoZWNrIGZvciBhIHZhbGlkIHN0YXRlIGNoYW5nZSAKICAgICAgICAgICAgICovCiAgICAgICAgICAgIGlmIChzZXRfdmFsdWUgPT0gUlNfQ1JFQVRFQU5ER08KICAgICAgICAgICAgICAgIHx8IHNldF92YWx1ZSA9PSBSU19DUkVBVEVBTkRXQUlUKSB7CiAgICAgICAgICAgICAgICAvKgogICAgICAgICAgICAgICAgICogY2FuJ3QgY3JlYXRlIGEgcm93IHRoYXQgZXhpc3RzIAogICAgICAgICAgICAgICAgICovCiAgICAgICAgICAgICAgICByZXR1cm4gU05NUF9FUlJfSU5DT05TSVNURU5UVkFMVUU7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIC8qCiAgICAgICAgICAgICAqIFhYWDogaW50ZXJhY3Rpb24gd2l0aCByb3cgc3RvcmFnZSB0eXBlIG5lZWRlZCAKICAgICAgICAgICAgICovCgogICAgICAgICAgICBpZiAoU3RvcmFnZVRtcC0+cGluZ0N0bFJvd1N0YXR1cyA9PSBSU19BQ1RJVkUgJiYKICAgICAgICAgICAgICAgIHNldF92YWx1ZSAhPSBSU19ERVNUUk9ZKSB7CiAgICAgICAgICAgICAgICAvKgogICAgICAgICAgICAgICAgICogIk9uY2UgbWFkZSBhY3RpdmUgYW4gZW50cnkgbWF5IG5vdCBiZSBtb2RpZmllZCBleGNlcHQgdG8gCiAgICAgICAgICAgICAgICAgKiBkZWxldGUgaXQuIiAgWFhYOiBkb2Vzbid0IHRoaXMgaW4gZmFjdCBhcHBseSB0byBBTEwKICAgICAgICAgICAgICAgICAqIGNvbHVtbnMgb2YgdGhlIHRhYmxlIGFuZCBub3QganVzdCB0aGlzIG9uZT8gIAogICAgICAgICAgICAgICAgICovCiAgICAgICAgICAgICAgICByZXR1cm4gU05NUF9FUlJfSU5DT05TSVNURU5UVkFMVUU7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKFN0b3JhZ2VUbXAtPnN0b3JhZ2VUeXBlICE9IFNUX05PTlZPTEFUSUxFKQogICAgICAgICAgICAgICAgcmV0dXJuIFNOTVBfRVJSX05PVFdSSVRBQkxFOwogICAgICAgIH0KICAgICAgICBicmVhazsKCgoKCiAgICBjYXNlIFJFU0VSVkUyOgogICAgICAgIC8qCiAgICAgICAgICogbWVtb3J5IHJlc2V2ZXJhdGlvbiwgZmluYWwgcHJlcGFyYXRpb24uLi4gCiAgICAgICAgICovCiAgICAgICAgaWYgKFN0b3JhZ2VUbXAgPT0gTlVMTCkgewogICAgICAgICAgICBuZXRzbm1wX3ZhcmlhYmxlX2xpc3QgKnZhcnMsICp2cDsKCiAgICAgICAgICAgIGlmIChzZXRfdmFsdWUgPT0gUlNfREVTVFJPWSkgewogICAgICAgICAgICAgICAgcmV0dXJuIFNOTVBfRVJSX05PRVJST1I7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgLyoKICAgICAgICAgICAgICogY3JlYXRpb24gCiAgICAgICAgICAgICAqLwogICAgICAgICAgICB2YXJzID0gTlVMTDsKCiAgICAgICAgICAgIC8qCiAgICAgICAgICAgICAqIL2rbmFtZc6qv9W1xMj9uPbL99L919a2zrzTtb12YXKx5MG/wdCx7bXExKnOsiAKICAgICAgICAgICAgICovCiAgICAgICAgICAgIHNubXBfdmFybGlzdF9hZGRfdmFyaWFibGUoJnZhcnMsIE5VTEwsIDAsIEFTTl9PQ1RFVF9TVFIsIE5VTEwsIDApOyAgLyogcGluZ0N0bE93bmVySW5kZXggKi8KICAgICAgICAgICAgc25tcF92YXJsaXN0X2FkZF92YXJpYWJsZSgmdmFycywgTlVMTCwgMCwgQVNOX09DVEVUX1NUUiwgTlVMTCwgMCk7ICAvKiBwaW5nQ3RsVGVzdE5hbWUgKi8KCiAgICAgICAgICAgIGlmIChoZWFkZXJfY29tcGxleF9wYXJzZV9vaWQKICAgICAgICAgICAgICAgICgmCiAgICAgICAgICAgICAgICAgKG5hbWUKICAgICAgICAgICAgICAgICAgW3NpemVvZihwaW5nQ3RsVGFibGVfdmFyaWFibGVzX29pZCkgLyBzaXplb2Yob2lkKSArCiAgICAgICAgICAgICAgICAgICAyXSksIG5ld2xlbiwgdmFycykgIT0gU05NUEVSUl9TVUNDRVNTKSB7CiAgICAgICAgICAgICAgICBzbm1wX2ZyZWVfdmFyYmluZCh2YXJzKTsKICAgICAgICAgICAgICAgIHJldHVybiBTTk1QX0VSUl9JTkNPTlNJU1RFTlROQU1FOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHZwID0gdmFyczsKCiAgICAgICAgICAgIFN0b3JhZ2VOZXcgPSBjcmVhdGVfcGluZ0N0bFRhYmxlX2RhdGEoKTsKICAgICAgICAgICAgaWYgKCFTdG9yYWdlTmV3KQogICAgICAgICAgICAgICAgcmV0dXJuIFNOTVBfRVJSX0dFTkVSUjsKICAgICAgICAgICAgaWYgKHZwLT52YWxfbGVuIDw9IDMyKSB7CiAgICAgICAgICAgICAgICBTdG9yYWdlTmV3LT5waW5nQ3RsT3duZXJJbmRleCA9IG1hbGxvYyh2cC0+dmFsX2xlbiArIDEpOwogICAgICAgICAgICAgICAgbWVtY3B5KFN0b3JhZ2VOZXctPnBpbmdDdGxPd25lckluZGV4LCB2cC0+dmFsLnN0cmluZywKICAgICAgICAgICAgICAgICAgICAgICB2cC0+dmFsX2xlbik7CiAgICAgICAgICAgICAgICBTdG9yYWdlTmV3LT5waW5nQ3RsT3duZXJJbmRleFt2cC0+dmFsX2xlbl0gPSAnXDAnOwogICAgICAgICAgICAgICAgU3RvcmFnZU5ldy0+cGluZ0N0bE93bmVySW5kZXhMZW4gPSB2cC0+dmFsX2xlbjsKICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgIFN0b3JhZ2VOZXctPnBpbmdDdGxPd25lckluZGV4ID0gbWFsbG9jKDMzKTsKICAgICAgICAgICAgICAgIG1lbWNweShTdG9yYWdlTmV3LT5waW5nQ3RsT3duZXJJbmRleCwgdnAtPnZhbC5zdHJpbmcsIDMyKTsKICAgICAgICAgICAgICAgIFN0b3JhZ2VOZXctPnBpbmdDdGxPd25lckluZGV4WzMyXSA9ICdcMCc7CiAgICAgICAgICAgICAgICBTdG9yYWdlTmV3LT5waW5nQ3RsT3duZXJJbmRleExlbiA9IDMyOwogICAgICAgICAgICB9CgogICAgICAgICAgICB2cCA9IHZwLT5uZXh0X3ZhcmlhYmxlOwoKICAgICAgICAgICAgaWYgKHZwLT52YWxfbGVuIDw9IDMyKSB7CiAgICAgICAgICAgICAgICBTdG9yYWdlTmV3LT5waW5nQ3RsVGVzdE5hbWUgPSBtYWxsb2ModnAtPnZhbF9sZW4gKyAxKTsKICAgICAgICAgICAgICAgIG1lbWNweShTdG9yYWdlTmV3LT5waW5nQ3RsVGVzdE5hbWUsIHZwLT52YWwuc3RyaW5nLAogICAgICAgICAgICAgICAgICAgICAgIHZwLT52YWxfbGVuKTsKICAgICAgICAgICAgICAgIFN0b3JhZ2VOZXctPnBpbmdDdGxUZXN0TmFtZVt2cC0+dmFsX2xlbl0gPSAnXDAnOwogICAgICAgICAgICAgICAgU3RvcmFnZU5ldy0+cGluZ0N0bFRlc3ROYW1lTGVuID0gdnAtPnZhbF9sZW47CiAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICBTdG9yYWdlTmV3LT5waW5nQ3RsVGVzdE5hbWUgPSBtYWxsb2MoMzMpOwogICAgICAgICAgICAgICAgbWVtY3B5KFN0b3JhZ2VOZXctPnBpbmdDdGxUZXN0TmFtZSwgdnAtPnZhbC5zdHJpbmcsIDMyKTsKICAgICAgICAgICAgICAgIFN0b3JhZ2VOZXctPnBpbmdDdGxUZXN0TmFtZVszMl0gPSAnXDAnOwogICAgICAgICAgICAgICAgU3RvcmFnZU5ldy0+cGluZ0N0bFRlc3ROYW1lTGVuID0gMzI7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgdnAgPSB2cC0+bmV4dF92YXJpYWJsZTsKCiAgICAgICAgICAgIC8qCiAgICAgICAgICAgICAqIFhYWDogZmlsbCBpbiBkZWZhdWx0IHJvdyB2YWx1ZXMgaGVyZSBpbnRvIFN0b3JhZ2VOZXcgCiAgICAgICAgICAgICAqLwoKICAgICAgICAgICAgU3RvcmFnZU5ldy0+cGluZ0N0bFJvd1N0YXR1cyA9IHNldF92YWx1ZTsKCgogICAgICAgICAgICBzbm1wX2ZyZWVfdmFyYmluZCh2YXJzKTsKICAgICAgICB9CgoKICAgICAgICBicmVhazsKCgoKCiAgICBjYXNlIEZSRUU6CiAgICAgICAgLyoKICAgICAgICAgKiBSZWxlYXNlIGFueSByZXNvdXJjZXMgdGhhdCBoYXZlIGJlZW4gYWxsb2NhdGVkIAogICAgICAgICAqLwoKICAgICAgICBpZiAoc2V0X3ZhbHVlID09IFJTX0RFU1RST1kgJiYgU3RvcmFnZU5ldykKICAgICAgICAgICAgZnJlZV9waW5nQ3RsVGFibGVfZGF0YShTdG9yYWdlTmV3KTsKICAgICAgICBTdG9yYWdlTmV3ID0gTlVMTDsKCiAgICAgICAgaWYgKFN0b3JhZ2VEZWwpIHsKICAgICAgICAgICAgZnJlZV9waW5nQ3RsVGFibGVfZGF0YShTdG9yYWdlRGVsKTsKICAgICAgICAgICAgU3RvcmFnZURlbCA9IE5VTEw7CiAgICAgICAgfQogICAgICAgIGJyZWFrOwoKCgoKICAgIGNhc2UgQUNUSU9OOgogICAgICAgIC8qCiAgICAgICAgICogVGhlIHZhcmlhYmxlIGhhcyBiZWVuIHN0b3JlZCBpbiBzZXRfdmFsdWUgZm9yIHlvdSB0bwogICAgICAgICAqIHVzZSwgYW5kIHlvdSBoYXZlIGp1c3QgYmVlbiBhc2tlZCB0byBkbyBzb21ldGhpbmcgd2l0aAogICAgICAgICAqIGl0LiAgTm90ZSB0aGF0IGFueXRoaW5nIGRvbmUgaGVyZSBtdXN0IGJlIHJldmVyc2FibGUgaW4KICAgICAgICAgKiB0aGUgVU5ETyBjYXNlIAogICAgICAgICAqLwoKICAgICAgICBpZiAoU3RvcmFnZVRtcCA9PSBOVUxMKSB7CiAgICAgICAgICAgIGlmIChzZXRfdmFsdWUgPT0gUlNfREVTVFJPWSkgewogICAgICAgICAgICAgICAgcmV0dXJuIFNOTVBfRVJSX05PRVJST1I7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgLyoKICAgICAgICAgICAgICogcm93IGNyZWF0aW9uLCBzbyBhZGQgaXQgCiAgICAgICAgICAgICAqLwogICAgICAgICAgICBpZiAoU3RvcmFnZU5ldyAhPSBOVUxMKQojaWYgMQogICAgICAgICAgICAgICAgREVCVUdNU0dUTCgoInBpbmdDdGxUYWJsZSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAid3JpdGVfcGluZ0N0bFJvd1N0YXR1cyBlbnRlcmluZyBuZXc9JWQuLi4gIFxuIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFjdGlvbikpOwojZW5kaWYKICAgICAgICAgICAgcGluZ0N0bFRhYmxlX2FkZChTdG9yYWdlTmV3KTsKICAgICAgICAgICAgLyoKICAgICAgICAgICAgICogWFhYOiBhY2ssIGFuZCBpZiBpdCBpcyBOVUxMPyAKICAgICAgICAgICAgICovCiAgICAgICAgfSBlbHNlIGlmIChzZXRfdmFsdWUgIT0gUlNfREVTVFJPWSkgewogICAgICAgICAgICAvKgogICAgICAgICAgICAgKiBzZXQgdGhlIGZsYWc/IAogICAgICAgICAgICAgKi8KICAgICAgICAgICAgb2xkX3ZhbHVlID0gU3RvcmFnZVRtcC0+cGluZ0N0bFJvd1N0YXR1czsKICAgICAgICAgICAgU3RvcmFnZVRtcC0+cGluZ0N0bFJvd1N0YXR1cyA9ICooKGxvbmcgKikgdmFyX3ZhbCk7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgLyoKICAgICAgICAgICAgICogZGVzdHJveS4uLiAgZXh0cmFjdCBpdCBmb3Igbm93IAogICAgICAgICAgICAgKi8KCiAgICAgICAgICAgIGhjaXB0ciA9CiAgICAgICAgICAgICAgICBoZWFkZXJfY29tcGxleF9maW5kX2VudHJ5KHBpbmdDdGxUYWJsZVN0b3JhZ2UsIFN0b3JhZ2VUbXApOwogICAgICAgICAgICBTdG9yYWdlRGVsID0KICAgICAgICAgICAgICAgIGhlYWRlcl9jb21wbGV4X2V4dHJhY3RfZW50cnkoJnBpbmdDdGxUYWJsZVN0b3JhZ2UsIGhjaXB0cik7CiAgICAgICAgICAgIHNubXBfYWxhcm1fdW5yZWdpc3RlcihTdG9yYWdlRGVsLT50aW1lcl9pZCk7CgogICAgICAgICAgICBwaW5nUmVzdWx0c1RhYmxlX2RlbChTdG9yYWdlVG1wKTsKICAgICAgICAgICAgcGluZ1Byb2JlSGlzdG9yeVRhYmxlX2RlbChTdG9yYWdlVG1wKTsKICAgICAgICB9CiAgICAgICAgYnJlYWs7CgoKCgogICAgY2FzZSBVTkRPOgogICAgICAgIC8qCiAgICAgICAgICogQmFjayBvdXQgYW55IGNoYW5nZXMgbWFkZSBpbiB0aGUgQUNUSU9OIGNhc2UgCiAgICAgICAgICovCiAgICAgICAgaWYgKFN0b3JhZ2VUbXAgPT0gTlVMTCkgewogICAgICAgICAgICBpZiAoc2V0X3ZhbHVlID09IFJTX0RFU1RST1kpIHsKICAgICAgICAgICAgICAgIHJldHVybiBTTk1QX0VSUl9OT0VSUk9SOwogICAgICAgICAgICB9CiAgICAgICAgICAgIC8qCiAgICAgICAgICAgICAqIHJvdyBjcmVhdGlvbiwgc28gcmVtb3ZlIGl0IGFnYWluIAogICAgICAgICAgICAgKi8KICAgICAgICAgICAgaGNpcHRyID0KICAgICAgICAgICAgICAgIGhlYWRlcl9jb21wbGV4X2ZpbmRfZW50cnkocGluZ0N0bFRhYmxlU3RvcmFnZSwgU3RvcmFnZU5ldyk7CiAgICAgICAgICAgIFN0b3JhZ2VEZWwgPQogICAgICAgICAgICAgICAgaGVhZGVyX2NvbXBsZXhfZXh0cmFjdF9lbnRyeSgmcGluZ0N0bFRhYmxlU3RvcmFnZSwgaGNpcHRyKTsKICAgICAgICAgICAgZnJlZV9waW5nQ3RsVGFibGVfZGF0YShTdG9yYWdlRGVsKTsKICAgICAgICAgICAgU3RvcmFnZURlbCA9IE5VTEw7CiAgICAgICAgfSBlbHNlIGlmIChTdG9yYWdlRGVsICE9IE5VTEwpIHsKICAgICAgICAgICAgLyoKICAgICAgICAgICAgICogcm93IGRlbGV0aW9uLCBzbyBhZGQgaXQgYWdhaW4gCiAgICAgICAgICAgICAqLwogICAgICAgICAgICBwaW5nQ3RsVGFibGVfYWRkKFN0b3JhZ2VEZWwpOwogICAgICAgICAgICBwaW5nUmVzdWx0c1RhYmxlX2FkZChTdG9yYWdlRGVsKTsKICAgICAgICAgICAgcGluZ1Byb2JlSGlzdG9yeVRhYmxlX2FkZGFsbChTdG9yYWdlRGVsKTsKICAgICAgICAgICAgU3RvcmFnZURlbCA9IE5VTEw7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgU3RvcmFnZVRtcC0+cGluZ0N0bFJvd1N0YXR1cyA9IG9sZF92YWx1ZTsKICAgICAgICB9CiAgICAgICAgYnJlYWs7CgoKCgogICAgY2FzZSBDT01NSVQ6CiAgICAgICAgLyoKICAgICAgICAgKiBUaGluZ3MgYXJlIHdvcmtpbmcgd2VsbCwgc28gaXQncyBub3cgc2FmZSB0byBtYWtlIHRoZSBjaGFuZ2UKICAgICAgICAgKiBwZXJtYW5lbnRseS4gIE1ha2Ugc3VyZSB0aGF0IGFueXRoaW5nIGRvbmUgaGVyZSBjYW4ndCBmYWlsISAKICAgICAgICAgKi8KCiAgICAgICAgaWYgKFN0b3JhZ2VUbXAgPT0gTlVMTCkgewogICAgICAgICAgICBpZiAoc2V0X3ZhbHVlID09IFJTX0RFU1RST1kpIHsKICAgICAgICAgICAgICAgIHJldHVybiBTTk1QX0VSUl9OT0VSUk9SOwogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICBpZiAoU3RvcmFnZURlbCAhPSBOVUxMKSB7CiAgICAgICAgICAgIGZyZWVfcGluZ0N0bFRhYmxlX2RhdGEoU3RvcmFnZURlbCk7CiAgICAgICAgICAgIFN0b3JhZ2VEZWwgPSBOVUxMOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIGlmIChTdG9yYWdlVG1wCiAgICAgICAgICAgICAgICAmJiBTdG9yYWdlVG1wLT5waW5nQ3RsUm93U3RhdHVzID09IFJTX0NSRUFURUFOREdPKSB7CiAgICAgICAgICAgICAgICBTdG9yYWdlVG1wLT5waW5nQ3RsUm93U3RhdHVzID0gUlNfQUNUSVZFOwogICAgICAgICAgICB9IGVsc2UgaWYgKFN0b3JhZ2VUbXAgJiYKICAgICAgICAgICAgICAgICAgICAgICBTdG9yYWdlVG1wLT5waW5nQ3RsUm93U3RhdHVzID09IFJTX0NSRUFURUFORFdBSVQpIHsKICAgICAgICAgICAgICAgIERFQlVHTVNHVEwoKCJwaW5nQ3RsVGFibGUiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIndyaXRlX3BpbmdDdGxSb3dTdGF0dXMgZW50ZXJpbmcgcGluZ0N0bFJvd1N0YXR1cz0lbGQuLi4gIFxuIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0b3JhZ2VUbXAtPnBpbmdDdGxSb3dTdGF0dXMpKTsKCiAgICAgICAgICAgICAgICBTdG9yYWdlVG1wLT5waW5nQ3RsUm93U3RhdHVzID0gUlNfTk9USU5TRVJWSUNFOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIGlmIChTdG9yYWdlVG1wICYmIFN0b3JhZ2VUbXAtPnBpbmdDdGxSb3dTdGF0dXMgPT0gUlNfQUNUSVZFKSB7CiNpZiAxCiAgICAgICAgICAgIERFQlVHTVNHVEwoKCJwaW5nQ3RsVGFibGUiLAogICAgICAgICAgICAgICAgICAgICAgICAid3JpdGVfcGluZ0N0bFJvd1N0YXR1cyBlbnRlcmluZyBydW5iZWZvcmUgXG4iKSk7CgojZW5kaWYKCiAgICAgICAgICAgIGlmIChTdG9yYWdlVG1wLT5waW5nQ3RsQWRtaW5TdGF0dXMgPT0gMSkgewogICAgICAgICAgICAgICAgaW5pdF9yZXN1bHRzVGFibGUoU3RvcmFnZVRtcCk7CiAgICAgICAgICAgICAgICBpZiAoU3RvcmFnZVRtcC0+cGluZ0N0bEZyZXF1ZW5jeSAhPSAwKQogICAgICAgICAgICAgICAgICAgIFN0b3JhZ2VUbXAtPnRpbWVyX2lkID0KICAgICAgICAgICAgICAgICAgICAgICAgc25tcF9hbGFybV9yZWdpc3RlcihTdG9yYWdlVG1wLT5waW5nQ3RsRnJlcXVlbmN5LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNBX1JFUEVBVCwgcnVuX3BpbmcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RvcmFnZVRtcCk7CiAgICAgICAgICAgICAgICBlbHNlCiAgICAgICAgICAgICAgICAgICAgU3RvcmFnZVRtcC0+dGltZXJfaWQgPQogICAgICAgICAgICAgICAgICAgICAgICBzbm1wX2FsYXJtX3JlZ2lzdGVyKDEsIDAsIHJ1bl9waW5nLCBTdG9yYWdlVG1wKTsKCiAgICAgICAgICAgIH0KCiAgICAgICAgfQogICAgICAgIHNubXBfc3RvcmVfbmVlZGVkKE5VTEwpOwoKICAgICAgICBicmVhazsKICAgIH0KICAgIHJldHVybiBTTk1QX0VSUl9OT0VSUk9SOwp9CgoKc3RhdGljIGlubGluZSB2b2lkCnR2c3ViKHN0cnVjdCB0aW1ldmFsICpvdXQsIHN0cnVjdCB0aW1ldmFsICppbikKewogICAgaWYgKChvdXQtPnR2X3VzZWMgLT0gaW4tPnR2X3VzZWMpIDwgMCkgewogICAgICAgIC0tb3V0LT50dl9zZWM7CiAgICAgICAgb3V0LT50dl91c2VjICs9IDEwMDAwMDA7CiAgICB9CiAgICBvdXQtPnR2X3NlYyAtPSBpbi0+dHZfc2VjOwp9CgoKc3RhdGljIGlubGluZSBpbnQKc2NoZWR1bGVfZXhpdChpbnQgbmV4dCwgaW50ICpkZWFkbGluZSwgbG9uZyAqbnBhY2tldHMsIGxvbmcgKm5yZWNlaXZlZCwKICAgICAgICAgICAgICBsb25nICpudHJhbnNtaXR0ZWQsIGxvbmcgKnRtYXgpCnsKICAgIGlmICgoKm5wYWNrZXRzKSAmJiAoKm50cmFuc21pdHRlZCkgPj0gKCpucGFja2V0cykgJiYgISgqZGVhZGxpbmUpKQogICAgICAgIG5leHQgPSBfX3NjaGVkdWxlX2V4aXQobmV4dCwgbnJlY2VpdmVkLCB0bWF4KTsKICAgIHJldHVybiBuZXh0Owp9CgpzdGF0aWMgaW5saW5lIGludAppbl9mbGlnaHQoX191MTYgKiBhY2tlZCwgbG9uZyAqbnJlY2VpdmVkLCBsb25nICpudHJhbnNtaXR0ZWQsCiAgICAgICAgICBsb25nICpuZXJyb3JzKQp7CiAgICBfX3UxNiAgICAgICAgICAgZGlmZiA9IChfX3UxNikgKCpudHJhbnNtaXR0ZWQpIC0gKCphY2tlZCk7CiAgICByZXR1cm4gKGRpZmYgPD0KICAgICAgICAgICAgMHg3RkZGKSA/IGRpZmYgOiAoKm50cmFuc21pdHRlZCkgLSAoKm5yZWNlaXZlZCkgLSAoKm5lcnJvcnMpOwp9CgpzdGF0aWMgaW5saW5lIHZvaWQKYWNrbm93bGVkZ2UoX191MTYgc2VxLCBfX3UxNiAqIGFja2VkLCBsb25nICpudHJhbnNtaXR0ZWQsIGludCAqcGlwZXNpemUpCnsKICAgIF9fdTE2ICAgICAgICAgICBkaWZmID0gKF9fdTE2KSAoKm50cmFuc21pdHRlZCkgLSBzZXE7CiAgICBpZiAoZGlmZiA8PSAweDdGRkYpIHsKICAgICAgICBpZiAoKGludCkgZGlmZiArIDEgPiAoKnBpcGVzaXplKSkKICAgICAgICAgICAgKCpwaXBlc2l6ZSkgPSAoaW50KSBkaWZmICsgMTsKICAgICAgICBpZiAoKF9fczE2KSAoc2VxIC0gKCphY2tlZCkpID4gMCB8fAogICAgICAgICAgICAoX191MTYpICgqbnRyYW5zbWl0dGVkKSAtICgqYWNrZWQpID4gMHg3RkZGKQogICAgICAgICAgICAqYWNrZWQgPSBzZXE7CiAgICB9Cn0KCnN0YXRpYyBpbmxpbmUgdm9pZAphZHZhbmNlX250cmFuc21pdHRlZChfX3UxNiAqIGFja2VkLCBsb25nICpudHJhbnNtaXR0ZWQpCnsKICAgICgqbnRyYW5zbWl0dGVkKSsrOwogICAgLyoKICAgICAqIEludmFsaWRhdGUgYWNrZWQsIGlmIDE2IGJpdCBzZXEgb3ZlcmZsb3dzLiAKICAgICAqLwogICAgaWYgKChfX3UxNikgKCpudHJhbnNtaXR0ZWQpIC0gKCphY2tlZCkgPiAweDdGRkYpCiAgICAgICAgKmFja2VkID0gKF9fdTE2KSAoKm50cmFuc21pdHRlZCkgKyAxOwp9CgoKc3RhdGljIGlubGluZSB2b2lkCnVwZGF0ZV9pbnRlcnZhbChpbnQgdWlkLCBpbnQgaW50ZXJ2YWwsIGludCAqcnR0X2FkZGVuZCwgaW50ICpydHQpCnsKICAgIGludCAgICAgICAgICAgICBlc3QgPSAoKnJ0dCkgPyAoKnJ0dCkgLyA4IDogaW50ZXJ2YWwgKiAxMDAwOwoKICAgIGludGVydmFsID0gKGVzdCArICgqcnR0X2FkZGVuZCkgKyA1MDApIC8gMTAwMDsKICAgIGlmICh1aWQgJiYgaW50ZXJ2YWwgPCBNSU5VU0VSSU5URVJWQUwpCiAgICAgICAgaW50ZXJ2YWwgPSBNSU5VU0VSSU5URVJWQUw7Cn0KCgoKaW50Cl9fc2NoZWR1bGVfZXhpdChpbnQgbmV4dCwgbG9uZyAqbnJlY2VpdmVkLCBsb25nICp0bWF4KQp7CiAgICB1bnNpZ25lZCBsb25nICAgd2FpdHRpbWU7CiNpZiAwCiAgICBzdHJ1Y3QgaXRpbWVydmFsIGl0OwojZW5kaWYKCiAgICBpZiAoKm5yZWNlaXZlZCkgewogICAgICAgIHdhaXR0aW1lID0gMiAqICgqdG1heCk7CiAgICAgICAgaWYgKHdhaXR0aW1lIDwgMTAwMDAwMCkKICAgICAgICAgICAgd2FpdHRpbWUgPSAxMDAwMDAwOwogICAgfSBlbHNlCiAgICAgICAgd2FpdHRpbWUgPSBNQVhXQUlUICogMTAwMDAwMDsKCiAgICBpZiAobmV4dCA8IDAgfHwgbmV4dCA8IHdhaXR0aW1lIC8gMTAwMCkKICAgICAgICBuZXh0ID0gd2FpdHRpbWUgLyAxMDAwOwoKI2lmIDAKICAgIGl0Lml0X2ludGVydmFsLnR2X3NlYyA9IDA7CiAgICBpdC5pdF9pbnRlcnZhbC50dl91c2VjID0gMDsKICAgIGl0Lml0X3ZhbHVlLnR2X3NlYyA9IHdhaXR0aW1lIC8gMTAwMDAwMDsKICAgIGl0Lml0X3ZhbHVlLnR2X3VzZWMgPSB3YWl0dGltZSAlIDEwMDAwMDA7CiAgICBzZXRpdGltZXIoSVRJTUVSX1JFQUwsICZpdCwgTlVMTCk7CiNlbmRpZgogICAgcmV0dXJuIG5leHQ7Cn0KCgovKgogKiBwaW5nZXIgLS0KICogICAgICBDb21wb3NlIGFuZCB0cmFuc21pdCBhbiBJQ01QIEVDSE8gUkVRVUVTVCBwYWNrZXQuICBUaGUgSVAgcGFja2V0CiAqIHdpbGwgYmUgYWRkZWQgb24gYnkgdGhlIGtlcm5lbC4gIFRoZSBJRCBmaWVsZCBpcyBvdXIgVU5JWCBwcm9jZXNzIElELAogKiBhbmQgdGhlIHNlcXVlbmNlIG51bWJlciBpcyBhbiBhc2NlbmRpbmcgaW50ZWdlci4gIFRoZSBmaXJzdCA4IGJ5dGVzCiAqIG9mIHRoZSBkYXRhIHBvcnRpb24gYXJlIHVzZWQgdG8gaG9sZCBhIFVOSVggInRpbWV2YWwiIHN0cnVjdCBpbiBWQVgKICogYnl0ZS1vcmRlciwgdG8gY29tcHV0ZSB0aGUgcm91bmQtdHJpcCB0aW1lLgogKi8KCmludApwaW5nZXIoaW50IGljbXBfc29jaywgaW50IHByZWxvYWQsIGludCBjbXNnbGVuLCBjaGFyICpjbXNnYnVmLAogICAgICAgc3RydWN0IHNvY2thZGRyX2luNiAqd2hlcmV0bywgaW50ICpydHRfYWRkZW5kLCBpbnQgb3B0aW9ucywgaW50IHVpZCwKICAgICAgIGludCBpbnRlcnZhbCwgaW50IGRhdGFsZW4sIGludCB0aW1pbmcsIGNoYXIgKm91dHBhY2ssIGludCAqcnR0LAogICAgICAgaW50ICppZGVudCwgaW50ICpzY3JlZW5fd2lkdGgsIGludCAqZGVhZGxpbmUsIF9fdTE2ICogYWNrZWQsCiAgICAgICBsb25nICpucGFja2V0cywgbG9uZyAqbnJlY2VpdmVkLCBsb25nICpudHJhbnNtaXR0ZWQsIGxvbmcgKm5lcnJvcnMsCiAgICAgICBpbnQgKmNvbmZpcm1fZmxhZywgaW50ICpjb25maXJtLCBpbnQgKnBpcGVzaXplLAogICAgICAgc3RydWN0IHRpbWV2YWwgKmN1cl90aW1lKQp7CiAgICBzdGF0aWMgaW50ICAgICAgdG9rZW5zOwogICAgaW50ICAgICAgICAgICAgIGk7CgogICAgLyoKICAgICAqIEhhdmUgd2UgYWxyZWFkeSBzZW50IGVub3VnaD8gSWYgd2UgaGF2ZSwgcmV0dXJuIGFuIGFyYml0cmFyeSBwb3NpdGl2ZSB2YWx1ZS4gCiAgICAgKi8KCiAgICBpZiAoZXhpdGluZwogICAgICAgIHx8ICgoKm5wYWNrZXRzKSAmJiAoKm50cmFuc21pdHRlZCkgPj0gKCpucGFja2V0cykKICAgICAgICAgICAgJiYgISgqZGVhZGxpbmUpKSkgewoKICAgICAgICByZXR1cm4gMTAwMDsKICAgIH0KICAgIC8qCiAgICAgKiBDaGVjayB0aGF0IHBhY2tldHMgPCByYXRlKnRpbWUgKyBwcmVsb2FkIAogICAgICovCiAgICBpZiAoKCpjdXJfdGltZSkudHZfc2VjID09IDApIHsKICAgICAgICBuZXRzbm1wX2dldF9tb25vdG9uaWNfY2xvY2soY3VyX3RpbWUpOwogICAgICAgIHRva2VucyA9IGludGVydmFsICogKHByZWxvYWQgLSAxKTsKICAgIH0gZWxzZSB7CiAgICAgICAgbG9uZyAgICAgICAgICAgIG50b2tlbnM7CiAgICAgICAgc3RydWN0IHRpbWV2YWwgIHR2OwoKICAgICAgICBuZXRzbm1wX2dldF9tb25vdG9uaWNfY2xvY2soJnR2KTsKICAgICAgICBudG9rZW5zID0gKHR2LnR2X3NlYyAtICgqY3VyX3RpbWUpLnR2X3NlYykgKiAxMDAwICsKICAgICAgICAgICAgKHR2LnR2X3VzZWMgLSAoKmN1cl90aW1lKS50dl91c2VjKSAvIDEwMDA7CiAgICAgICAgaWYgKCFpbnRlcnZhbCkgewogICAgICAgICAgICAvKgogICAgICAgICAgICAgKiBDYXNlIG9mIHVubGltaXRlZCBmbG9vZCBpcyBzcGVjaWFsOwogICAgICAgICAgICAgKiAqIGlmIHdlIHNlZSBubyByZXBseSwgdGhleSBhcmUgbGltaXRlZCB0byAxMDBwcHMgCiAgICAgICAgICAgICAqLwogICAgICAgICAgICBpZiAobnRva2VucyA8IE1JTklOVEVSVkFMCiAgICAgICAgICAgICAgICAmJiBpbl9mbGlnaHQoYWNrZWQsIG5yZWNlaXZlZCwgbnRyYW5zbWl0dGVkLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5lcnJvcnMpID49IHByZWxvYWQpCiAgICAgICAgICAgICAgICByZXR1cm4gTUlOSU5URVJWQUwgLSBudG9rZW5zOwogICAgICAgIH0KICAgICAgICBudG9rZW5zICs9IHRva2VuczsKCiAgICAgICAgaWYgKG50b2tlbnMgPiBpbnRlcnZhbCAqIHByZWxvYWQpCiAgICAgICAgICAgIG50b2tlbnMgPSBpbnRlcnZhbCAqIHByZWxvYWQ7CgogICAgICAgIGlmIChudG9rZW5zIDwgaW50ZXJ2YWwpIHsKICAgICAgICAgICAgcmV0dXJuIGludGVydmFsIC0gbnRva2VuczsKICAgICAgICB9CiAgICAgICAgKmN1cl90aW1lID0gdHY7CiAgICAgICAgdG9rZW5zID0gbnRva2VucyAtIGludGVydmFsOwogICAgfQoKICByZXNlbmQ6CiAgICBpID0gc2VuZF92NihpY21wX3NvY2ssIGNtc2dsZW4sIGNtc2didWYsIHdoZXJldG8sIGRhdGFsZW4sIHRpbWluZywKICAgICAgICAgICAgICAgIG91dHBhY2ssIGlkZW50LCBudHJhbnNtaXR0ZWQsIGNvbmZpcm0pOwoKICAgIGlmIChpID09IDApIHsKICAgICAgICBhZHZhbmNlX250cmFuc21pdHRlZChhY2tlZCwgbnRyYW5zbWl0dGVkKTsKICAgICAgICBpZiAoIShvcHRpb25zICYgRl9RVUlFVCkgJiYgKG9wdGlvbnMgJiBGX0ZMT09EKSkgewogICAgICAgICAgICAvKgogICAgICAgICAgICAgKiBWZXJ5IHNpbGx5LCBidXQgd2l0aG91dCB0aGlzIG91dHB1dCB3aXRoCiAgICAgICAgICAgICAqICogaGlnaCBwcmVsb2FkIG9yIHBpcGUgc2l6ZSBpcyB2ZXJ5IGNvbmZ1c2luZy4gCiAgICAgICAgICAgICAqLwogICAgICAgICAgICBpZiAoKHByZWxvYWQgPCAoKnNjcmVlbl93aWR0aCkKICAgICAgICAgICAgICAgICAmJiAoKnBpcGVzaXplKSA8ICgqc2NyZWVuX3dpZHRoKSkKICAgICAgICAgICAgICAgIHx8IGluX2ZsaWdodChhY2tlZCwgbnJlY2VpdmVkLCBudHJhbnNtaXR0ZWQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmVycm9ycykgPCAoKnNjcmVlbl93aWR0aCkpCiAgICAgICAgICAgICAgICB3cml0ZShTVERPVVRfRklMRU5PLCAiLiIsIDEpOwogICAgICAgIH0KCiAgICAgICAgcmV0dXJuIGludGVydmFsIC0gdG9rZW5zOwogICAgfQoKICAgIC8qCiAgICAgKiBBbmQgaGFuZGxlIHZhcmlvdXMgZXJyb3JzLi4uIAogICAgICovCiAgICBpZiAoaSA+IDApIHsKICAgICAgICAvKgogICAgICAgICAqIEFwcGFyZW50bHksIGl0IGlzIHNvbWUgZmF0YWwgYnVnLiAKICAgICAgICAgKi8KICAgICAgICBhYm9ydCgpOwogICAgfSBlbHNlIGlmIChlcnJubyA9PSBFTk9CVUZTIHx8IGVycm5vID09IEVOT01FTSkgewogICAgICAgIC8qCiAgICAgICAgICogRGV2aWNlIHF1ZXVlIG92ZXJmbG93IG9yIE9PTS4gUGFja2V0IGlzIG5vdCBzZW50LiAKICAgICAgICAgKi8KICAgICAgICB0b2tlbnMgPSAwOwogICAgICAgIC8qCiAgICAgICAgICogU2xvd2Rvd24uIFRoaXMgd29ya3Mgb25seSBpbiBhZGFwdGl2ZSBtb2RlIChvcHRpb24gLUEpIAogICAgICAgICAqLwogICAgICAgICgqcnR0X2FkZGVuZCkgKz0gKCgqcnR0KSA8IDggKiA1MDAwMCA/ICgqcnR0KSAvIDggOiA1MDAwMCk7CiAgICAgICAgaWYgKG9wdGlvbnMgJiBGX0FEQVBUSVZFKQogICAgICAgICAgICB1cGRhdGVfaW50ZXJ2YWwodWlkLCBpbnRlcnZhbCwgcnR0X2FkZGVuZCwgcnR0KTsKCiAgICAgICAgcmV0dXJuIFNDSElOVChpbnRlcnZhbCk7CiAgICB9IGVsc2UgaWYgKGVycm5vID09IEVBR0FJTikgewogICAgICAgIC8qCiAgICAgICAgICogU29ja2V0IGJ1ZmZlciBpcyBmdWxsLiAKICAgICAgICAgKi8KICAgICAgICB0b2tlbnMgKz0gaW50ZXJ2YWw7CgogICAgICAgIHJldHVybiBNSU5JTlRFUlZBTDsKICAgIH0gZWxzZSB7CiAgICAgICAgaWYgKChpID0KICAgICAgICAgICAgIHJlY2VpdmVfZXJyb3JfbXNnKGljbXBfc29jaywgd2hlcmV0bywgb3B0aW9ucywgaWRlbnQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXJyb3JzKSkgPiAwKSB7CiAgICAgICAgICAgIC8qCiAgICAgICAgICAgICAqIEFuIElDTVAgZXJyb3IgYXJyaXZlZC4gCiAgICAgICAgICAgICAqLwogICAgICAgICAgICB0b2tlbnMgKz0gaW50ZXJ2YWw7CgogICAgICAgICAgICByZXR1cm4gTUlOSU5URVJWQUw7CiAgICAgICAgfQogICAgICAgIC8qCiAgICAgICAgICogQ29tcGF0aWJpbGl0eSB3aXRoIG9sZCBsaW51Y2VzLiAKICAgICAgICAgKi8KICAgICAgICBpZiAoaSA9PSAwICYmICgqY29uZmlybV9mbGFnKSAmJiBlcnJubyA9PSBFSU5WQUwpIHsKICAgICAgICAgICAgKmNvbmZpcm1fZmxhZyA9IDA7CiAgICAgICAgICAgIGVycm5vID0gMDsKICAgICAgICB9CiAgICAgICAgaWYgKCFlcnJubykKICAgICAgICAgICAgZ290byByZXNlbmQ7CgogICAgICAgIC8qCiAgICAgICAgICogSGFyZCBsb2NhbCBlcnJvci4gUHJldGVuZCB3ZSBzZW50IHBhY2tldC4gCiAgICAgICAgICovCiAgICAgICAgYWR2YW5jZV9udHJhbnNtaXR0ZWQoYWNrZWQsIG50cmFuc21pdHRlZCk7CgogICAgICAgIGlmIChpID09IDAgJiYgIShvcHRpb25zICYgRl9RVUlFVCkpIHsKICAgICAgICAgICAgaWYgKG9wdGlvbnMgJiBGX0ZMT09EKQogICAgICAgICAgICAgICAgd3JpdGUoU1RET1VUX0ZJTEVOTywgIkUiLCAxKTsKICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgICAgcGVycm9yKCJwaW5nOiBzZW5kbXNnIik7CiAgICAgICAgfQogICAgICAgIHRva2VucyA9IDA7CgogICAgICAgIHJldHVybiBTQ0hJTlQoaW50ZXJ2YWwpOwogICAgfQp9CgovKgogKiBTZXQgc29ja2V0IGJ1ZmZlcnMsICJhbGxvYyIgaXMgYW4gZXNpbWF0ZSBvZiBtZW1vcnkgdGFrZW4gYnkgc2luZ2xlIHBhY2tldC4gCiAqLwoKdm9pZApzb2NrX3NldGJ1ZnMoaW50IGljbXBfc29jaywgaW50IGFsbG9jLCBpbnQgcHJlbG9hZCkKewogICAgaW50ICAgICAgICAgICAgIHJjdmJ1ZiwgaG9sZDsKICAgIHNvY2tsZW5fdCAgICAgICB0bXBsZW4gPSBzaXplb2YoaG9sZCk7CiAgICBpbnQgICAgICAgICAgICAgc25kYnVmOwoKICAgIGlmICghc25kYnVmKQogICAgICAgIHNuZGJ1ZiA9IGFsbG9jOwogICAgc2V0c29ja29wdChpY21wX3NvY2ssIFNPTF9TT0NLRVQsIFNPX1NOREJVRiwgKGNoYXIgKikgJnNuZGJ1ZiwKICAgICAgICAgICAgICAgc2l6ZW9mKHNuZGJ1ZikpOwoKICAgIHJjdmJ1ZiA9IGhvbGQgPSBhbGxvYyAqIHByZWxvYWQ7CiAgICBpZiAoaG9sZCA8IDY1NTM2KQogICAgICAgIGhvbGQgPSA2NTUzNjsKICAgIHNldHNvY2tvcHQoaWNtcF9zb2NrLCBTT0xfU09DS0VULCBTT19SQ1ZCVUYsIChjaGFyICopICZob2xkLAogICAgICAgICAgICAgICBzaXplb2YoaG9sZCkpOwogICAgaWYgKGdldHNvY2tvcHQKICAgICAgICAoaWNtcF9zb2NrLCBTT0xfU09DS0VULCBTT19SQ1ZCVUYsIChjaGFyICopICZob2xkLCAmdG1wbGVuKSA9PSAwKSB7CiAgICAgICAgaWYgKGhvbGQgPCByY3ZidWYpCiAgICAgICAgICAgIGZwcmludGYoc3RkZXJyLAogICAgICAgICAgICAgICAgICAgICJXQVJOSU5HOiBwcm9iYWJseSwgcmN2YnVmIGlzIG5vdCBlbm91Z2ggdG8gaG9sZCBwcmVsb2FkLlxuIik7CiAgICB9Cn0KCi8qCiAqIFByb3RvY29sIGluZGVwZW5kZW50IHNldHVwIGFuZCBwYXJhbWV0ZXIgY2hlY2tzLiAKICovCgp2b2lkCnNldHVwKGludCBpY21wX3NvY2ssIGludCBvcHRpb25zLCBpbnQgdWlkLCBpbnQgdGltZW91dCwgaW50IHByZWxvYWQsCiAgICAgIGludCBpbnRlcnZhbCwgaW50IGRhdGFsZW4sIGNoYXIgKm91dHBhY2ssIGludCAqaWRlbnQsCiAgICAgIHN0cnVjdCB0aW1ldmFsICpzdGFydF90aW1lLCBpbnQgKnNjcmVlbl93aWR0aCwgaW50ICpkZWFkbGluZSkKewogICAgaW50ICAgICAgICAgICAgIGhvbGQ7CiAgICBzdHJ1Y3QgdGltZXZhbCAgdHY7CgogICAgaWYgKChvcHRpb25zICYgRl9GTE9PRCkgJiYgIShvcHRpb25zICYgRl9JTlRFUlZBTCkpCiAgICAgICAgaW50ZXJ2YWwgPSAwOwoKICAgIGlmICh1aWQgJiYgaW50ZXJ2YWwgPCBNSU5VU0VSSU5URVJWQUwpIHsKICAgICAgICBmcHJpbnRmKHN0ZGVyciwKICAgICAgICAgICAgICAgICJwaW5nOiBjYW5ub3QgZmxvb2Q7IG1pbmltYWwgaW50ZXJ2YWwsIGFsbG93ZWQgZm9yIHVzZXIsIGlzICVkbXNcbiIsCiAgICAgICAgICAgICAgICBNSU5VU0VSSU5URVJWQUwpOwogICAgICAgIHJldHVybjsKICAgIH0KCiAgICBpZiAoaW50ZXJ2YWwgPj0gSU5UX01BWCAvIHByZWxvYWQpIHsKICAgICAgICBmcHJpbnRmKHN0ZGVyciwgInBpbmc6IGlsbGVnYWwgcHJlbG9hZCBhbmQvb3IgaW50ZXJ2YWxcbiIpOwogICAgICAgIHJldHVybjsKICAgIH0KCiAgICBob2xkID0gMTsKICAgIGlmIChvcHRpb25zICYgRl9TT19ERUJVRykKICAgICAgICBzZXRzb2Nrb3B0KGljbXBfc29jaywgU09MX1NPQ0tFVCwgU09fREVCVUcsIChjaGFyICopICZob2xkLAogICAgICAgICAgICAgICAgICAgc2l6ZW9mKGhvbGQpKTsKICAgIGlmIChvcHRpb25zICYgRl9TT19ET05UUk9VVEUpCiAgICAgICAgc2V0c29ja29wdChpY21wX3NvY2ssIFNPTF9TT0NLRVQsIFNPX0RPTlRST1VURSwgKGNoYXIgKikgJmhvbGQsCiAgICAgICAgICAgICAgICAgICBzaXplb2YoaG9sZCkpOwoKI2lmZGVmIFNPX1RJTUVTVEFNUAogICAgaWYgKCEob3B0aW9ucyAmIEZfTEFURU5DWSkpIHsKICAgICAgICBpbnQgICAgICAgICAgICAgb24gPSAxOwogICAgICAgIGlmIChzZXRzb2Nrb3B0CiAgICAgICAgICAgIChpY21wX3NvY2ssIFNPTF9TT0NLRVQsIFNPX1RJTUVTVEFNUCwgJm9uLCBzaXplb2Yob24pKSkKICAgICAgICAgICAgZnByaW50ZihzdGRlcnIsCiAgICAgICAgICAgICAgICAgICAgIldhcm5pbmc6IG5vIFNPX1RJTUVTVEFNUCBzdXBwb3J0LCBmYWxsaW5nIGJhY2sgdG8gU0lPQ0dTVEFNUFxuIik7CiAgICB9CiNlbmRpZgoKICAgIC8qCiAgICAgKiBTZXQgc29tZSBTTkRUSU1FTyB0byBwcmV2ZW50IGJsb2NraW5nIGZvcmV2ZXIKICAgICAqICogb24gc2VuZHMsIHdoZW4gZGV2aWNlIGlzIHRvbyBzbG93IG9yIHN0YWxscy4gSnVzdCBwdXQgbGltaXQKICAgICAqICogb2Ygb25lIHNlY29uZCwgb3IgImludGVydmFsIiwgaWYgaXQgaXMgbGVzcy4KICAgICAqLwogICAgdHYudHZfc2VjID0gMTsKICAgIHR2LnR2X3VzZWMgPSAwOwogICAgaWYgKGludGVydmFsIDwgMTAwMCkgewogICAgICAgIHR2LnR2X3NlYyA9IDA7CiAgICAgICAgdHYudHZfdXNlYyA9IDEwMDAgKiBTQ0hJTlQoaW50ZXJ2YWwpOwogICAgfQogICAgc2V0c29ja29wdChpY21wX3NvY2ssIFNPTF9TT0NLRVQsIFNPX1NORFRJTUVPLCAoY2hhciAqKSAmdHYsCiAgICAgICAgICAgICAgIHNpemVvZih0dikpOwoKICAgIC8qCiAgICAgKiBTZXQgUkNWVElNRU8gdG8gImludGVydmFsIi4gTm90ZSwgaXQgaXMganVzdCBhbiBvcHRpbWl6YXRpb24KICAgICAqICogYWxsb3dpbmcgdG8gYXZvaWQgcmVkdW5kYW50IHBvbGwoKS4gCiAgICAgKi8KCiAgICB0di50dl9zZWMgPSB0aW1lb3V0OwogICAgdHYudHZfdXNlYyA9IDA7CiAgICBpZiAoc2V0c29ja29wdAogICAgICAgIChpY21wX3NvY2ssIFNPTF9TT0NLRVQsIFNPX1JDVlRJTUVPLCAoY2hhciAqKSAmdHYsIHNpemVvZih0dikpKQogICAgICAgIG9wdGlvbnMgfD0gRl9GTE9PRF9QT0xMOwoKICAgIGlmICghKG9wdGlvbnMgJiBGX1BJTkdGSUxMRUQpKSB7CiAgICAgICAgaW50ICAgICAgICAgICAgIGk7CiAgICAgICAgY2hhciAgICAgICAgICAgKnAgPSBvdXRwYWNrICsgODsKCiAgICAgICAgLyoKICAgICAgICAgKiBEbyBub3QgZm9yZ2V0IGFib3V0IGNhc2Ugb2Ygc21hbGwgZGF0YWxlbiwKICAgICAgICAgKiAqIGZpbGwgdGltZXN0YW1wIGFyZWEgdG9vIQogICAgICAgICAqLwogICAgICAgIGZvciAoaSA9IDA7IGkgPCBkYXRhbGVuOyArK2kpCiAgICAgICAgICAgICpwKysgPSBpOwogICAgfQoKICAgICppZGVudCA9IGdldHBpZCgpICYgMHhGRkZGOwoKICAgIG5ldHNubXBfZ2V0X21vbm90b25pY19jbG9jayhzdGFydF90aW1lKTsKCiNpZiAwCiAgICBpZiAoKmRlYWRsaW5lKSB7CiAgICAgICAgc3RydWN0IGl0aW1lcnZhbCBpdDsKCiAgICAgICAgaXQuaXRfaW50ZXJ2YWwudHZfc2VjID0gMDsKICAgICAgICBpdC5pdF9pbnRlcnZhbC50dl91c2VjID0gMDsKICAgICAgICBpdC5pdF92YWx1ZS50dl9zZWMgPSAoKmRlYWRsaW5lKTsKICAgICAgICBpdC5pdF92YWx1ZS50dl91c2VjID0gMDsKICAgIH0KI2VuZGlmCgogICAgaWYgKGlzYXR0eShTVERPVVRfRklMRU5PKSkgewogICAgICAgIHN0cnVjdCB3aW5zaXplICB3OwoKICAgICAgICBpZiAoaW9jdGwoU1RET1VUX0ZJTEVOTywgVElPQ0dXSU5TWiwgJncpICE9IC0xKSB7CiAgICAgICAgICAgIGlmICh3LndzX2NvbCA+IDApCiAgICAgICAgICAgICAgICAqc2NyZWVuX3dpZHRoID0gdy53c19jb2w7CiAgICAgICAgfQogICAgfQp9Cgp2b2lkCm1haW5fbG9vcChzdHJ1Y3QgcGluZ0N0bFRhYmxlX2RhdGEgKml0ZW0sIGludCBpY21wX3NvY2ssIGludCBwcmVsb2FkLAogICAgICAgICAgX191OCAqIHBhY2tldCwgaW50IHBhY2tsZW4sIGludCBjbXNnbGVuLCBjaGFyICpjbXNnYnVmLAogICAgICAgICAgc3RydWN0IHNvY2thZGRyX2luNiAqd2hlcmV0bywgaW50IG9wdGlvbnMsIGludCB1aWQsCiAgICAgICAgICBjaGFyICpob3N0bmFtZSwgaW50IGludGVydmFsLCBpbnQgZGF0YWxlbiwgaW50IHRpbWluZywKICAgICAgICAgIGludCB3b3JraW5nX3JlY3ZlcnIsIGNoYXIgKm91dHBhY2ssIGludCAqaWRlbnQsCiAgICAgICAgICBzdHJ1Y3QgdGltZXZhbCAqc3RhcnRfdGltZSwgaW50ICpzY3JlZW5fd2lkdGgsIGludCAqZGVhZGxpbmUpCnsKICAgIGNoYXIgICAgICAgICAgICBhZGRyYnVmWzEyOF07CiAgICBjaGFyICAgICAgICAgICAgYW5zX2RhdGFbNDA5Nl07CiAgICBzdHJ1Y3QgaW92ZWMgICAgaW92OwogICAgc3RydWN0IG1zZ2hkciAgIG1zZzsKICAgIHN0cnVjdCBjbXNnaGRyICpjOwogICAgaW50ICAgICAgICAgICAgIGNjID0gMDsKICAgIGludCAgICAgICAgICAgICBuZXh0ID0gMDsKICAgIGludCAgICAgICAgICAgICBwb2xsaW5nID0gMDsKICAgIGludCAgICAgICAgICAgICBydHQgPSAwOwogICAgaW50ICAgICAgICAgICAgIHJ0dF9hZGRlbmQgPSAwOwoKICAgIF9fdTE2ICAgICAgICAgICBhY2tlZCA9IDA7CiAgICAvKgogICAgICogY291bnRlcnMgCiAgICAgKi8KICAgIGxvbmcgICAgICAgICAgICBucGFja2V0cyA9IDA7ICAgICAgIC8qIG1heCBwYWNrZXRzIHRvIHRyYW5zbWl0ICovCiAgICBsb25nICAgICAgICAgICAgbnJlY2VpdmVkID0gMDsgICAgICAvKiAjIG9mIHBhY2tldHMgd2UgZ290IGJhY2sgKi8KICAgIGxvbmcgICAgICAgICAgICBucmVwZWF0cyA9IDA7ICAgICAgIC8qIG51bWJlciBvZiBkdXBsaWNhdGVzICovCiAgICBsb25nICAgICAgICAgICAgbnRyYW5zbWl0dGVkID0gMDsgICAvKiBzZXF1ZW5jZSAjIGZvciBvdXRib3VuZCBwYWNrZXRzID0gI3NlbnQgKi8KICAgIGxvbmcgICAgICAgICAgICBuY2hlY2tzdW0gPSAwOyAgICAgIC8qIHJlcGxpZXMgd2l0aCBiYWQgY2hlY2tzdW0gKi8KICAgIGxvbmcgICAgICAgICAgICBuZXJyb3JzID0gMDsgICAgICAgIC8qIGljbXAgZXJyb3JzICovCgogICAgLyoKICAgICAqIHRpbWluZyAKICAgICAqLwogICAgbG9uZyAgICAgICAgICAgIHRtaW4gPSBMT05HX01BWDsgICAgLyogbWluaW11bSByb3VuZCB0cmlwIHRpbWUgKi8KICAgIGxvbmcgICAgICAgICAgICB0bWF4ID0gMDsgICAvKiBtYXhpbXVtIHJvdW5kIHRyaXAgdGltZSAqLwogICAgbG9uZyBsb25nICAgICAgIHRzdW0gPSAwOyAgIC8qIHN1bSBvZiBhbGwgdGltZXMsIGZvciBkb2luZyBhdmVyYWdlICovCiAgICBsb25nIGxvbmcgICAgICAgdHN1bTIgPSAwOwoKICAgIGludCAgICAgICAgICAgICBjb25maXJtX2ZsYWcgPSBNU0dfQ09ORklSTTsKICAgIGludCAgICAgICAgICAgICBjb25maXJtID0gMDsKCiAgICBpbnQgICAgICAgICAgICAgcGlwZXNpemUgPSAtMTsKICAgIHN0cnVjdCB0aW1ldmFsICBjdXJfdGltZTsKICAgIGN1cl90aW1lLnR2X3NlYyA9IDA7CiAgICBjdXJfdGltZS50dl91c2VjID0gMDsKCiAgICBzdHJ1Y3QgcGluZ1Byb2JlSGlzdG9yeVRhYmxlX2RhdGEgY3VycmVudF90ZW1wOwogICAgc3RhdGljIGludCAgICAgIHByb2JlRmFpbGVkID0gMDsKICAgIHN0YXRpYyBpbnQgICAgICB0ZXN0RmFpbGVkID0gMDsKICAgIHN0YXRpYyBpbnQgICAgICBzZXJpZXMgPSAwOwoKICAgIGlvdi5pb3ZfYmFzZSA9IChjaGFyICopIHBhY2tldDsKICAgIG5wYWNrZXRzID0gaXRlbS0+cGluZ0N0bFByb2JlQ291bnQ7CiAgICBmb3IgKDs7KSB7CiAgICAgICAgLyoKICAgICAgICAgKiBDaGVjayBleGl0IGNvbmRpdGlvbnMuIAogICAgICAgICAqLwogICAgICAgIGlmIChleGl0aW5nKSB7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgIH0KICAgICAgICBpZiAobnBhY2tldHMgJiYgbnJlY2VpdmVkID49IG5wYWNrZXRzKSB7CiAgICAgICAgICAgIERFQlVHTVNHVEwoKCJwaW5nQ3RsVGFibGUiLCAibnBhY2tldHMsbnJlY2VpdmVkPSVsZFxuIiwgbnJlY2VpdmVkKSk7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgIH0KICAgICAgICBpZiAoZGVhZGxpbmUgJiYgbmVycm9ycykgewogICAgICAgICAgICBERUJVR01TR1RMKCgicGluZ0N0bFRhYmxlIiwgImRlYWRsaW5lXG4iKSk7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgIH0KCiAgICAgICAgLyoKICAgICAgICAgKiBDaGVjayBmb3IgYW5kIGRvIHNwZWNpYWwgYWN0aW9ucy4gCiAgICAgICAgICovCiAgICAgICAgaWYgKHN0YXR1c19zbmFwc2hvdCkKICAgICAgICAgICAgc3RhdHVzKHRpbWluZywgJnJ0dCwgJm5yZWNlaXZlZCwgJm5yZXBlYXRzLCAmbnRyYW5zbWl0dGVkLAogICAgICAgICAgICAgICAgICAgJnRtaW4sICZ0bWF4LCAmdHN1bSwgJnRzdW0yKTsKCiAgICAgICAgLyoKICAgICAgICAgKiBTZW5kIHByb2JlcyBzY2hlZHVsZWQgdG8gdGhpcyB0aW1lLiAKICAgICAgICAgKi8KICAgICAgICBkbyB7CiAgICAgICAgICAgIERFQlVHTVNHVEwoKCJwaW5nQ3RsVGFibGUiLCAicGluZ2VyXG4iKSk7CiAgICAgICAgICAgIG5leHQgPQogICAgICAgICAgICAgICAgcGluZ2VyKGljbXBfc29jaywgcHJlbG9hZCwgY21zZ2xlbiwgY21zZ2J1Ziwgd2hlcmV0bywKICAgICAgICAgICAgICAgICAgICAgICAmcnR0X2FkZGVuZCwgdWlkLCBvcHRpb25zLCBpbnRlcnZhbCwgZGF0YWxlbiwKICAgICAgICAgICAgICAgICAgICAgICB0aW1pbmcsIG91dHBhY2ssICZydHQsIGlkZW50LCBzY3JlZW5fd2lkdGgsCiAgICAgICAgICAgICAgICAgICAgICAgZGVhZGxpbmUsICZhY2tlZCwgJm5wYWNrZXRzLCAmbnJlY2VpdmVkLAogICAgICAgICAgICAgICAgICAgICAgICZudHJhbnNtaXR0ZWQsICZuZXJyb3JzLCAmY29uZmlybV9mbGFnLCAmY29uZmlybSwKICAgICAgICAgICAgICAgICAgICAgICAmcGlwZXNpemUsICZjdXJfdGltZSk7CiAgICAgICAgICAgIERFQlVHTVNHVEwoKCJwaW5nQ3RsVGFibGUiLCAiMTpuZXh0PSVkXG4iLCBuZXh0KSk7CiAgICAgICAgICAgIG5leHQgPQogICAgICAgICAgICAgICAgc2NoZWR1bGVfZXhpdChuZXh0LCBkZWFkbGluZSwgJm5wYWNrZXRzLCAmbnJlY2VpdmVkLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmbnRyYW5zbWl0dGVkLCAmdG1heCk7CiAgICAgICAgICAgIERFQlVHTVNHVEwoKCJwaW5nQ3RsVGFibGUiLCAiMjpuZXh0PSVkXG4iLCBuZXh0KSk7CiAgICAgICAgfSB3aGlsZSAobmV4dCA8PSAwKTsKCiAgICAgICAgLyoKICAgICAgICAgKiAibmV4dCIgaXMgdGltZSB0byBzZW5kIG5leHQgcHJvYmUsIGlmIHBvc2l0aXZlLgogICAgICAgICAqICogSWYgbmV4dDw9MCBzZW5kIG5vdyBvciBhcyBzb29uIGFzIHBvc3NpYmxlLiAKICAgICAgICAgKi8KCiAgICAgICAgLyoKICAgICAgICAgKiBUZWNobmljYWwgcGFydC4gTG9va3Mgd2lja2VkLiBDb3VsZCBiZSBkcm9wcGVkLAogICAgICAgICAqICogaWYgZXZlcnlvbmUgdXNlZCB0aGUgbmV3ZXN0IGtlcm5lbC4gOi0pIAogICAgICAgICAqICogSXRzIHB1cnBvc2UgaXM6CiAgICAgICAgICogKiAxLiBQcm92aWRlIGludGVydmFscyBsZXNzIHRoYW4gcmVzb2x1dGlvbiBvZiBzY2hlZHVsZXIuCiAgICAgICAgICogKiAgICBTb2x1dGlvbjogc3Bpbm5pbmcuCiAgICAgICAgICogKiAyLiBBdm9pZCB1c2Ugb2YgcG9sbCgpLCB3aGVuIHJlY3Ztc2coKSBjYW4gcHJvdmlkZQogICAgICAgICAqICogICAgdGltZWQgd2FpdGluZyAoU09fUkNWVElNRU8pLiAKICAgICAgICAgKi8KICAgICAgICBwb2xsaW5nID0gMDsKICAgICAgICBpZiAoKG9wdGlvbnMgJiAoRl9BREFQVElWRSB8IEZfRkxPT0RfUE9MTCkpCiAgICAgICAgICAgIHx8IG5leHQgPCBTQ0hJTlQoaW50ZXJ2YWwpKSB7CiAgICAgICAgICAgIGludCAgICAgICAgICAgICByZWN2X2V4cGVjdGVkID0KICAgICAgICAgICAgICAgIGluX2ZsaWdodCgmYWNrZWQsICZucmVjZWl2ZWQsICZudHJhbnNtaXR0ZWQsICZuZXJyb3JzKTsKCiAgICAgICAgICAgIC8qCiAgICAgICAgICAgICAqIElmIHdlIGFyZSBoZXJlLCByZWN2bXNnKCkgaXMgdW5hYmxlIHRvIHdhaXQgZm9yCiAgICAgICAgICAgICAqICogcmVxdWlyZWQgdGltZW91dC4gCiAgICAgICAgICAgICAqLwogICAgICAgICAgICBpZiAoMTAwMCAqIG5leHQgPD0gMTAwMDAwMCAvIChpbnQpIEhaKSB7CiAgICAgICAgICAgICAgICAvKgogICAgICAgICAgICAgICAgICogVmVyeSBzaG9ydCB0aW1lb3V0Li4uIFNvLCBpZiB3ZSB3YWl0IGZvcgogICAgICAgICAgICAgICAgICogKiBzb21ldGhpbmcsIHdlIHNsZWVwIGZvciBNSU5JTlRFUlZBTC4KICAgICAgICAgICAgICAgICAqICogT3RoZXJ3aXNlLCBzcGluISAKICAgICAgICAgICAgICAgICAqLwogICAgICAgICAgICAgICAgaWYgKHJlY3ZfZXhwZWN0ZWQpIHsKICAgICAgICAgICAgICAgICAgICBuZXh0ID0gTUlOSU5URVJWQUw7CiAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgIG5leHQgPSAwOwogICAgICAgICAgICAgICAgICAgIC8qCiAgICAgICAgICAgICAgICAgICAgICogV2hlbiBzcGlubmluZywgbm8gcmVhc29ucyB0byBwb2xsLgogICAgICAgICAgICAgICAgICAgICAqICogVXNlIG5vbmJsb2NraW5nIHJlY3Ztc2coKSBpbnN0ZWFkLiAKICAgICAgICAgICAgICAgICAgICAgKi8KICAgICAgICAgICAgICAgICAgICBwb2xsaW5nID0gTVNHX0RPTlRXQUlUOwogICAgICAgICAgICAgICAgICAgIC8qCiAgICAgICAgICAgICAgICAgICAgICogQnV0IHlpZWxkIHlldC4gCiAgICAgICAgICAgICAgICAgICAgICovCiAgICAgICAgICAgICAgICAgICAgc2NoZWRfeWllbGQoKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQoKICAgICAgICAgICAgaWYgKCFwb2xsaW5nICYmCiAgICAgICAgICAgICAgICAoKG9wdGlvbnMgJiAoRl9BREFQVElWRSB8IEZfRkxPT0RfUE9MTCkpIHx8IGludGVydmFsKSkgewogICAgICAgICAgICAgICAgc3RydWN0IHBvbGxmZCAgIHBzZXQ7CiAgICAgICAgICAgICAgICBwc2V0LmZkID0gaWNtcF9zb2NrOwogICAgICAgICAgICAgICAgcHNldC5ldmVudHMgPSBQT0xMSU4gfCBQT0xMRVJSOwogICAgICAgICAgICAgICAgcHNldC5yZXZlbnRzID0gMDsKICAgICAgICAgICAgICAgIGlmIChwb2xsKCZwc2V0LCAxLCBuZXh0KSA8IDEgfHwKICAgICAgICAgICAgICAgICAgICAhKHBzZXQucmV2ZW50cyAmIChQT0xMSU4gfCBQT0xMRVJSKSkpCiAgICAgICAgICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgICAgICAgICBwb2xsaW5nID0gTVNHX0RPTlRXQUlUOwogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICBmb3IgKDs7KSB7CiAgICAgICAgICAgIHN0cnVjdCB0aW1ldmFsICpyZWN2X3RpbWVwID0gTlVMTDsKICAgICAgICAgICAgc3RydWN0IHRpbWV2YWwgIHJlY3ZfdGltZTsKICAgICAgICAgICAgaW50ICAgICAgICAgICAgIG5vdF9vdXJzID0gMDsgICAgICAgLyogUmF3IHNvY2tldCBjYW4gcmVjZWl2ZSBtZXNzYWdlcwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiBkZXN0aW5lZCB0byBvdGhlciBydW5uaW5nIHBpbmdzLiAqLwoKICAgICAgICAgICAgaW92Lmlvdl9sZW4gPSBwYWNrbGVuOwogICAgICAgICAgICBtc2cubXNnX25hbWUgPSBhZGRyYnVmOwogICAgICAgICAgICBtc2cubXNnX25hbWVsZW4gPSBzaXplb2YoYWRkcmJ1Zik7CiAgICAgICAgICAgIG1zZy5tc2dfaW92ID0gJmlvdjsKICAgICAgICAgICAgbXNnLm1zZ19pb3ZsZW4gPSAxOwogICAgICAgICAgICBtc2cubXNnX2NvbnRyb2wgPSBhbnNfZGF0YTsKICAgICAgICAgICAgbXNnLm1zZ19jb250cm9sbGVuID0gc2l6ZW9mKGFuc19kYXRhKTsKCiAgICAgICAgICAgIGNjID0gcmVjdm1zZyhpY21wX3NvY2ssICZtc2csIHBvbGxpbmcpOwogICAgICAgICAgICB0aW1lX3QgICAgICAgICAgdGltZXA7CiAgICAgICAgICAgIHRpbWUoJnRpbWVwKTsKICAgICAgICAgICAgcG9sbGluZyA9IE1TR19ET05UV0FJVDsKCiAgICAgICAgICAgIGlmIChjYyA8IDApIHsKICAgICAgICAgICAgICAgIGlmIChlcnJubyA9PSBFQUdBSU4gfHwgZXJybm8gPT0gRUlOVFIpCiAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICBpZiAoZXJybm8gPT0gRVdPVUxEQkxPQ0spIHsKICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgcGluZ1Jlc3VsdHNUYWJsZV9kYXRhICpTdG9yYWdlTmV3ID0gTlVMTDsKICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgcGluZ1Byb2JlSGlzdG9yeVRhYmxlX2RhdGEgKnRlbXAgPSBOVUxMOwogICAgICAgICAgICAgICAgICAgIG5ldHNubXBfdmFyaWFibGVfbGlzdCAqdmFycyA9IE5VTEw7CgogICAgICAgICAgICAgICAgICAgIGlmIChzZXJpZXMgPT0gMCkKICAgICAgICAgICAgICAgICAgICAgICAgcHJvYmVGYWlsZWQgPSAxOwogICAgICAgICAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgICAgICAgICAgICAgcHJvYmVGYWlsZWQgPSBwcm9iZUZhaWxlZCArIDE7CiAgICAgICAgICAgICAgICAgICAgc2VyaWVzID0gMTsKICAgICAgICAgICAgICAgICAgICB0ZXN0RmFpbGVkID0gdGVzdEZhaWxlZCArIDE7CgogICAgICAgICAgICAgICAgICAgIHNubXBfdmFybGlzdF9hZGRfdmFyaWFibGUoJnZhcnMsIE5VTEwsIDAsIEFTTl9PQ1RFVF9TVFIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpdGVtLT5waW5nQ3RsT3duZXJJbmRleCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGl0ZW0tPnBpbmdDdGxPd25lckluZGV4TGVuKTsKICAgICAgICAgICAgICAgICAgICBzbm1wX3Zhcmxpc3RfYWRkX3ZhcmlhYmxlKCZ2YXJzLCBOVUxMLCAwLCBBU05fT0NURVRfU1RSLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXRlbS0+cGluZ0N0bFRlc3ROYW1lLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXRlbS0+cGluZ0N0bFRlc3ROYW1lTGVuKTsKCiAgICAgICAgICAgICAgICAgICAgU3RvcmFnZU5ldyA9IGhlYWRlcl9jb21wbGV4X2dldChwaW5nUmVzdWx0c1RhYmxlU3RvcmFnZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhcnMpOwogICAgICAgICAgICAgICAgICAgIHNubXBfZnJlZV92YXJiaW5kKHZhcnMpOwogICAgICAgICAgICAgICAgICAgIGlmICghU3RvcmFnZU5ldykKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwoKICAgICAgICAgICAgICAgICAgICBTdG9yYWdlTmV3LT5waW5nUmVzdWx0c1NlbmRQcm9iZXMgPQogICAgICAgICAgICAgICAgICAgICAgICBTdG9yYWdlTmV3LT5waW5nUmVzdWx0c1NlbmRQcm9iZXMgKyAxOwoKICAgICAgICAgICAgICAgICAgICB0ZW1wID0gU05NUF9NQUxMT0NfU1RSVUNUKHBpbmdQcm9iZUhpc3RvcnlUYWJsZV9kYXRhKTsKCiAgICAgICAgICAgICAgICAgICAgdGVtcC0+cGluZ0N0bE93bmVySW5kZXggPQogICAgICAgICAgICAgICAgICAgICAgICAoY2hhciAqKSBtYWxsb2MoaXRlbS0+cGluZ0N0bE93bmVySW5kZXhMZW4gKyAxKTsKICAgICAgICAgICAgICAgICAgICBtZW1jcHkodGVtcC0+cGluZ0N0bE93bmVySW5kZXgsCiAgICAgICAgICAgICAgICAgICAgICAgICAgIGl0ZW0tPnBpbmdDdGxPd25lckluZGV4LAogICAgICAgICAgICAgICAgICAgICAgICAgICBpdGVtLT5waW5nQ3RsT3duZXJJbmRleExlbiArIDEpOwogICAgICAgICAgICAgICAgICAgIHRlbXAtPnBpbmdDdGxPd25lckluZGV4W2l0ZW0tPnBpbmdDdGxPd25lckluZGV4TGVuXSA9CiAgICAgICAgICAgICAgICAgICAgICAgICdcMCc7CiAgICAgICAgICAgICAgICAgICAgdGVtcC0+cGluZ0N0bE93bmVySW5kZXhMZW4gPQogICAgICAgICAgICAgICAgICAgICAgICBpdGVtLT5waW5nQ3RsT3duZXJJbmRleExlbjsKCiAgICAgICAgICAgICAgICAgICAgdGVtcC0+cGluZ0N0bFRlc3ROYW1lID0KICAgICAgICAgICAgICAgICAgICAgICAgKGNoYXIgKikgbWFsbG9jKGl0ZW0tPnBpbmdDdGxUZXN0TmFtZUxlbiArIDEpOwogICAgICAgICAgICAgICAgICAgIG1lbWNweSh0ZW1wLT5waW5nQ3RsVGVzdE5hbWUsIGl0ZW0tPnBpbmdDdGxUZXN0TmFtZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgaXRlbS0+cGluZ0N0bFRlc3ROYW1lTGVuICsgMSk7CiAgICAgICAgICAgICAgICAgICAgdGVtcC0+cGluZ0N0bFRlc3ROYW1lW2l0ZW0tPnBpbmdDdGxUZXN0TmFtZUxlbl0gPSAnXDAnOwogICAgICAgICAgICAgICAgICAgIHRlbXAtPnBpbmdDdGxUZXN0TmFtZUxlbiA9IGl0ZW0tPnBpbmdDdGxUZXN0TmFtZUxlbjsKCiAgICAgICAgICAgICAgICAgICAgLyogYWRkIGxvY2sgdG8gcHJvdGVjdCAqLwogICAgICAgICAgICAgICAgICAgIHB0aHJlYWRfbXV0ZXhfdCBjb3VudGVyX211dGV4ID0KICAgICAgICAgICAgICAgICAgICAgICAgUFRIUkVBRF9NVVRFWF9JTklUSUFMSVpFUjsKICAgICAgICAgICAgICAgICAgICBwdGhyZWFkX211dGV4X2xvY2soJmNvdW50ZXJfbXV0ZXgpOwogICAgICAgICAgICAgICAgICAgIHRlbXAtPnBpbmdQcm9iZUhpc3RvcnlJbmRleCA9CiAgICAgICAgICAgICAgICAgICAgICAgICsrKGl0ZW0tPnBpbmdQcm9iZUhpc3RvcnlNYXhJbmRleCk7CiAgICAgICAgICAgICAgICAgICAgcHRocmVhZF9tdXRleF91bmxvY2soJmNvdW50ZXJfbXV0ZXgpOwogICAgICAgICAgICAgICAgICAgIC8qIGVuZCAqLwoKICAgICAgICAgICAgICAgICAgICB0ZW1wLT5waW5nUHJvYmVIaXN0b3J5UmVzcG9uc2UgPQogICAgICAgICAgICAgICAgICAgICAgICBpdGVtLT5waW5nQ3RsVGltZU91dCAqIDEwMDA7CiAgICAgICAgICAgICAgICAgICAgdGVtcC0+cGluZ1Byb2JlSGlzdG9yeVN0YXR1cyA9IDQ7CiAgICAgICAgICAgICAgICAgICAgdGVtcC0+cGluZ1Byb2JlSGlzdG9yeUxhc3RSQyA9IDE7CgoJCSAgICB0ZW1wLT5waW5nUHJvYmVIaXN0b3J5VGltZV90aW1lID0gdGltZXA7CiAgICAgICAgICAgICAgICAgICAgdGVtcC0+cGluZ1Byb2JlSGlzdG9yeVRpbWUgPQogICAgICAgICAgICAgICAgICAgICAgICBuZXRzbm1wX21lbWR1cChkYXRlX25fdGltZSgmdGltZXAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnRlbXAtPnBpbmdQcm9iZUhpc3RvcnlUaW1lTGVuKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMTEpOwoKICAgICAgICAgICAgICAgICAgICBpZiAoU3RvcmFnZU5ldy0+cGluZ1Jlc3VsdHNTZW5kUHJvYmVzID09IDEpCiAgICAgICAgICAgICAgICAgICAgICAgIGl0ZW0tPnBpbmdQcm9iZUhpcyA9IHRlbXA7CiAgICAgICAgICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgIChjdXJyZW50X3RlbXApLm5leHQgPSB0ZW1wOwogICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgY3VycmVudF90ZW1wID0gKCp0ZW1wKTsKCiAgICAgICAgICAgICAgICAgICAgaWYgKFN0b3JhZ2VOZXctPnBpbmdSZXN1bHRzU2VuZFByb2JlcyA+PQogICAgICAgICAgICAgICAgICAgICAgICBpdGVtLT5waW5nQ3RsUHJvYmVDb3VudCkgewogICAgICAgICAgICAgICAgICAgICAgICBjdXJyZW50X3RlbXAubmV4dCA9IE5VTEw7CiAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICBpZiAoaXRlbS0+cGluZ1Byb2JlSGlzICE9IE5VTEwpIHsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHBpbmdQcm9iZUhpc3RvcnlUYWJsZV9jb3VudChpdGVtKSA8CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpdGVtLT5waW5nQ3RsTWF4Um93cykgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHBpbmdQcm9iZUhpc3RvcnlUYWJsZV9hZGQoJmN1cnJlbnRfdGVtcCkgIT0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTTk1QRVJSX1NVQ0NFU1MpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREVCVUdNU0dUTCgoInBpbmdQcm9iZUhpc3RvcnlUYWJsZSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInJlZ2lzdGVyZWQgYW4gZW50cnkgZXJyb3JcbiIpKTsKICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBpbmdQcm9iZUhpc3RvcnlUYWJsZV9kZWxMYXN0KGl0ZW0pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHBpbmdQcm9iZUhpc3RvcnlUYWJsZV9hZGQoJmN1cnJlbnRfdGVtcCkgIT0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTTk1QRVJSX1NVQ0NFU1MpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREVCVUdNU0dUTCgoInBpbmdQcm9iZUhpc3RvcnlUYWJsZSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInJlZ2lzdGVyZWQgYW4gZW50cnkgZXJyb3JcbiIpKTsKCiAgICAgICAgICAgICAgICAgICAgICAgIH0KCQkgICAgfQogICAgICAgICAgICAgICAgICAgIGlmICgoaXRlbS0+CiAgICAgICAgICAgICAgICAgICAgICAgICBwaW5nQ3RsVHJhcEdlbmVyYXRpb25bMF0gJgogICAgICAgICAgICAgICAgICAgICAgICAgUElOR1RSQVBHRU5FUkFUSU9OX1BST0JFRkFJTEVEKSAhPSAwKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwcm9iZUZhaWxlZCA+PQogICAgICAgICAgICAgICAgICAgICAgICAgICAgaXRlbS0+cGluZ0N0bFRyYXBQcm9iZUZhaWx1cmVGaWx0ZXIpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZW5kX3BpbmdfdHJhcChpdGVtLCBwaW5nUHJvYmVGYWlsZWQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2YocGluZ1Byb2JlRmFpbGVkKSAvCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2Yob2lkKSk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgLyogdGltZW91dCBmaW5pc2ggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogICAgICAgICAgICAgICAgaWYgKCFyZWNlaXZlX2Vycm9yX21zZwogICAgICAgICAgICAgICAgICAgIChpY21wX3NvY2ssIHdoZXJldG8sIG9wdGlvbnMsIGlkZW50LCAmbmVycm9ycykpIHsKICAgICAgICAgICAgICAgICAgICBpZiAoZXJybm8pIHsKICAgICAgICAgICAgICAgICAgICAgICAgcGVycm9yKCJwaW5nOiByZWN2bXNnIik7CiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBub3Rfb3VycyA9IDE7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICBERUJVR01TR1RMKCgicGluZ0N0bFRhYmxlIiwgImNjPj0wLGVsc2VcbiIpKTsKI2lmZGVmIFNPX1RJTUVTVEFNUAogICAgICAgICAgICAgICAgZm9yIChjID0gQ01TR19GSVJTVEhEUigmbXNnKTsgYzsgYyA9IENNU0dfTlhUSERSKCZtc2csIGMpKSB7CiAgICAgICAgICAgICAgICAgICAgaWYgKGMtPmNtc2dfbGV2ZWwgIT0gU09MX1NPQ0tFVCB8fAogICAgICAgICAgICAgICAgICAgICAgICBjLT5jbXNnX3R5cGUgIT0gU09fVElNRVNUQU1QKQogICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgICAgICAgICAgICBpZiAoYy0+Y21zZ19sZW4gPCBDTVNHX0xFTihzaXplb2Yoc3RydWN0IHRpbWV2YWwpKSkKICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgICAgICAgICAgICAgcmVjdl90aW1lcCA9IChzdHJ1Y3QgdGltZXZhbCAqKSBDTVNHX0RBVEEoYyk7CiAgICAgICAgICAgICAgICB9CiNlbmRpZgoKICAgICAgICAgICAgICAgIGlmICgob3B0aW9ucyAmIEZfTEFURU5DWSkgfHwgcmVjdl90aW1lcCA9PSBOVUxMKSB7CiAgICAgICAgICAgICAgICAgICAgaWYgKChvcHRpb25zICYgRl9MQVRFTkNZKSB8fAogICAgICAgICAgICAgICAgICAgICAgICBpb2N0bChpY21wX3NvY2ssIFNJT0NHU1RBTVAsICZyZWN2X3RpbWUpKQogICAgICAgICAgICAgICAgICAgICAgICBuZXRzbm1wX2dldF9tb25vdG9uaWNfY2xvY2soJnJlY3ZfdGltZSk7CiAgICAgICAgICAgICAgICAgICAgcmVjdl90aW1lcCA9ICZyZWN2X3RpbWU7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgbm90X291cnMgPQogICAgICAgICAgICAgICAgICAgIHBhcnNlX3JlcGx5KCZzZXJpZXMsIGl0ZW0sICZtc2csIGNjLCBhZGRyYnVmLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlY3ZfdGltZXAsIHRpbWVwLCB1aWQsIHdoZXJldG8sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnJ0dF9hZGRlbmQsIG9wdGlvbnMsIGludGVydmFsLCBkYXRhbGVuLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRpbWluZywgd29ya2luZ19yZWN2ZXJyLCBvdXRwYWNrLCAmcnR0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlkZW50LCAmYWNrZWQsICZucmVjZWl2ZWQsICZucmVwZWF0cywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmbnRyYW5zbWl0dGVkLCAmbmNoZWNrc3VtLCAmbmVycm9ycywgJnRtaW4sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnRtYXgsICZ0c3VtLCAmdHN1bTIsICZjb25maXJtX2ZsYWcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmNvbmZpcm0sICZwaXBlc2l6ZSwgJmN1cnJlbnRfdGVtcCk7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIC8qCiAgICAgICAgICAgICAqIFNlZT8gLi4uIHNvbWVvbmUgcnVucyBhbm90aGVyIHBpbmcgb24gdGhpcyBob3N0LiAKICAgICAgICAgICAgICovCiAgICAgICAgICAgIGlmIChub3Rfb3VycykKICAgICAgICAgICAgICAgIGluc3RhbGxfZmlsdGVyKGljbXBfc29jaywgaWRlbnQpOwoKICAgICAgICAgICAgLyoKICAgICAgICAgICAgICogSWYgbm90aGluZyBpcyBpbiBmbGlnaHQsICJicmVhayIgcmV0dXJucyB1cyB0byBwaW5nZXIuIAogICAgICAgICAgICAgKi8KICAgICAgICAgICAgaWYgKGluX2ZsaWdodCgmYWNrZWQsICZucmVjZWl2ZWQsICZudHJhbnNtaXR0ZWQsICZuZXJyb3JzKSA9PQogICAgICAgICAgICAgICAgMCkKICAgICAgICAgICAgICAgIGJyZWFrOwoKICAgICAgICAgICAgLyoKICAgICAgICAgICAgICogT3RoZXJ3aXNlLCB0cnkgdG8gcmVjdm1zZygpIGFnYWluLiByZWN2bXNnKCkKICAgICAgICAgICAgICogKiBpcyBub25ibG9ja2luZyBhZnRlciB0aGUgZmlyc3QgaXRlcmF0aW9uLCBzbyB0aGF0CiAgICAgICAgICAgICAqICogaWYgbm90aGluZyBpcyBxdWV1ZWQsIGl0IHdpbGwgcmVjZWl2ZSBFQUdBSU4KICAgICAgICAgICAgICogKiBhbmQgcmV0dXJuIHRvIHBpbmdlci4gCiAgICAgICAgICAgICAqLwogICAgICAgIH0KICAgIH0KCiAgICBpZiAobnRyYW5zbWl0dGVkID09IGl0ZW0tPnBpbmdDdGxQcm9iZUNvdW50KSB7CgogICAgICAgIGlmICgoaXRlbS0+CiAgICAgICAgICAgICBwaW5nQ3RsVHJhcEdlbmVyYXRpb25bMF0gJiBQSU5HVFJBUEdFTkVSQVRJT05fVEVTVENPTVBMRVRFRCkKICAgICAgICAgICAgIT0gMCkgewogICAgICAgICAgICBzZW5kX3BpbmdfdHJhcChpdGVtLCBwaW5nVGVzdENvbXBsZXRlZCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKHBpbmdUZXN0Q29tcGxldGVkKSAvIHNpemVvZihvaWQpKTsKICAgICAgICB9IGVsc2UKICAgICAgICAgICAgaWYgKChpdGVtLT4KICAgICAgICAgICAgICAgICBwaW5nQ3RsVHJhcEdlbmVyYXRpb25bMF0gJiBQSU5HVFJBUEdFTkVSQVRJT05fVEVTVEZBSUxFRCkKICAgICAgICAgICAgICAgICE9IDApIHsKCiAgICAgICAgICAgIGlmICh0ZXN0RmFpbGVkID49IGl0ZW0tPnBpbmdDdGxUcmFwVGVzdEZhaWx1cmVGaWx0ZXIpCiAgICAgICAgICAgICAgICBzZW5kX3BpbmdfdHJhcChpdGVtLCBwaW5nVGVzdEZhaWxlZCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZihwaW5nVGVzdEZhaWxlZCkgLyBzaXplb2Yob2lkKSk7CiAgICAgICAgfQoKICAgICAgICBlbHNlIGlmICgoaXRlbS0+CiAgICAgICAgICAgICAgICAgIHBpbmdDdGxUcmFwR2VuZXJhdGlvblswXSAmCiAgICAgICAgICAgICAgICAgIFBJTkdUUkFQR0VORVJBVElPTl9QUk9CRUZBSUxFRCkgIT0gMCkgezsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgICA7CiAgICAgICAgfQoKICAgICAgICBzZXJpZXMgPSAwOwogICAgICAgIHByb2JlRmFpbGVkID0gMDsKICAgICAgICB0ZXN0RmFpbGVkID0gMDsKCiAgICB9CgogICAgZmluaXNoKG9wdGlvbnMsIGhvc3RuYW1lLCBpbnRlcnZhbCwgdGltaW5nLCAmcnR0LCBzdGFydF90aW1lLCBkZWFkbGluZSwKICAgICAgICAgICAmbnBhY2tldHMsICZucmVjZWl2ZWQsICZucmVwZWF0cywgJm50cmFuc21pdHRlZCwgJm5jaGVja3N1bSwKICAgICAgICAgICAmbmVycm9ycywgJnRtaW4sICZ0bWF4LCAmdHN1bSwgJnRzdW0yLCAmcGlwZXNpemUsICZjdXJfdGltZSk7Cn0KCmludApnYXRoZXJfc3RhdGlzdGljcyhpbnQgKnNlcmllcywgc3RydWN0IHBpbmdDdGxUYWJsZV9kYXRhICppdGVtLCBfX3U4ICogcHRyLAogICAgICAgICAgICAgICAgICBpbnQgY2MsIF9fdTE2IHNlcSwgaW50IGhvcHMsIGludCBjc2ZhaWxlZCwKICAgICAgICAgICAgICAgICAgc3RydWN0IHRpbWV2YWwgKnR2LCB0aW1lX3QgdGltZXAsIGludCAqcnR0X2FkZGVuZCwKICAgICAgICAgICAgICAgICAgaW50IHVpZCwgaW50IG9wdGlvbnMsIGNoYXIgKmZyb20sIGludCBpbnRlcnZhbCwKICAgICAgICAgICAgICAgICAgaW50IGRhdGFsZW4sIGludCB0aW1pbmcsIGNoYXIgKm91dHBhY2ssIGludCAqcnR0LAogICAgICAgICAgICAgICAgICBfX3UxNiAqIGFja2VkLCBsb25nICpucmVjZWl2ZWQsIGxvbmcgKm5yZXBlYXRzLAogICAgICAgICAgICAgICAgICBsb25nICpudHJhbnNtaXR0ZWQsIGxvbmcgKm5jaGVja3N1bSwgbG9uZyAqdG1pbiwKICAgICAgICAgICAgICAgICAgbG9uZyAqdG1heCwgbG9uZyBsb25nICp0c3VtLCBsb25nIGxvbmcgKnRzdW0yLAogICAgICAgICAgICAgICAgICBpbnQgKmNvbmZpcm1fZmxhZywgaW50ICpjb25maXJtLCBpbnQgKnBpcGVzaXplLAogICAgICAgICAgICAgICAgICBzdHJ1Y3QgcGluZ1Byb2JlSGlzdG9yeVRhYmxlX2RhdGEgKmN1cnJlbnRfdGVtcCkKewogICAgaW50ICAgICAgICAgICAgIGR1cGZsYWcgPSAwOwogICAgbG9uZyAgICAgICAgICAgIHRyaXB0aW1lID0gMDsKICAgIGludCAgICAgICAgICAgICBteF9kdXBfY2sgPSBNQVhfRFVQX0NISzsKCiAgICBuZXRzbm1wX3ZhcmlhYmxlX2xpc3QgKnZhcnMgPSBOVUxMOwogICAgc3RydWN0IHBpbmdSZXN1bHRzVGFibGVfZGF0YSAqU3RvcmFnZU5ldyA9IE5VTEw7CiAgICBzdHJ1Y3QgcGluZ1Byb2JlSGlzdG9yeVRhYmxlX2RhdGEgKnRlbXAgPSBOVUxMOwogICAgKysoKm5yZWNlaXZlZCk7CiAgICAqc2VyaWVzID0gMDsKICAgIGlmICghY3NmYWlsZWQpCiAgICAgICAgYWNrbm93bGVkZ2Uoc2VxLCBhY2tlZCwgbnRyYW5zbWl0dGVkLCBwaXBlc2l6ZSk7CgogICAgaWYgKHRpbWluZyAmJiBjYyA+PSA4ICsgc2l6ZW9mKHN0cnVjdCB0aW1ldmFsKSkgewogICAgICAgIHN0cnVjdCB0aW1ldmFsICB0bXBfdHY7CiAgICAgICAgbWVtY3B5KCZ0bXBfdHYsIHB0ciwgc2l6ZW9mKHRtcF90dikpOwoKICAgICAgICB0dnN1Yih0diwgJnRtcF90dik7CiAgICAgICAgdHJpcHRpbWUgPSB0di0+dHZfc2VjICogMTAwMDAwMCArIHR2LT50dl91c2VjOwogICAgICAgIGlmICh0cmlwdGltZSA8IDApIHsKICAgICAgICAgICAgc25tcF9sb2coTE9HX0lORk8sCiAgICAgICAgICAgICAgICAgICAgICJXYXJuaW5nOiBpbnZhbGlkIHRpbWVzdGFtcCBpbiBJQ01QIHJlc3BvbnNlLlxuIik7CiAgICAgICAgICAgIHRyaXB0aW1lID0gMDsKICAgICAgICAgICAgaWYgKCEob3B0aW9ucyAmIEZfTEFURU5DWSkpCiAgICAgICAgICAgICAgICBvcHRpb25zIHw9IEZfTEFURU5DWTsKICAgICAgICB9CiAgICAgICAgaWYgKCFjc2ZhaWxlZCkgewogICAgICAgICAgICAoKnRzdW0pICs9IHRyaXB0aW1lOwogICAgICAgICAgICAoKnRzdW0yKSArPSAobG9uZyBsb25nKSB0cmlwdGltZSAqKGxvbmcgbG9uZykgdHJpcHRpbWU7CiAgICAgICAgICAgIGlmICh0cmlwdGltZSA8ICgqdG1pbikpCiAgICAgICAgICAgICAgICAoKnRtaW4pID0gdHJpcHRpbWU7CiAgICAgICAgICAgIGlmICh0cmlwdGltZSA+ICgqdG1heCkpCiAgICAgICAgICAgICAgICAoKnRtYXgpID0gdHJpcHRpbWU7CiAgICAgICAgICAgIGlmICghKCpydHQpKQogICAgICAgICAgICAgICAgKnJ0dCA9IHRyaXB0aW1lICogODsKICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgICAgKnJ0dCArPSB0cmlwdGltZSAtICgqcnR0KSAvIDg7CiAgICAgICAgICAgIGlmIChvcHRpb25zICYgRl9BREFQVElWRSkKICAgICAgICAgICAgICAgIHVwZGF0ZV9pbnRlcnZhbCh1aWQsIGludGVydmFsLCBydHRfYWRkZW5kLCBydHQpOwogICAgICAgIH0KICAgIH0KCiAgICBpZiAoY3NmYWlsZWQpIHsKICAgICAgICArKygqbmNoZWNrc3VtKTsKICAgICAgICAtLSgqbnJlY2VpdmVkKTsKICAgIH0gZWxzZSBpZiAoVFNUKHNlcSAlIG14X2R1cF9jaykpIHsKICAgICAgICArKygqbnJlcGVhdHMpOwogICAgICAgIC0tKCpucmVjZWl2ZWQpOwogICAgICAgIGR1cGZsYWcgPSAxOwogICAgfSBlbHNlIHsKICAgICAgICBTRVQoc2VxICUgbXhfZHVwX2NrKTsKICAgICAgICBkdXBmbGFnID0gMDsKICAgIH0KICAgICpjb25maXJtID0gKmNvbmZpcm1fZmxhZzsKCiAgICBpZiAob3B0aW9ucyAmIEZfUVVJRVQpCiAgICAgICAgcmV0dXJuIDE7CgogICAgaWYgKG9wdGlvbnMgJiBGX0ZMT09EKSB7CiAgICAgICAgaWYgKCFjc2ZhaWxlZCkKICAgICAgICAgICAgd3JpdGUoU1RET1VUX0ZJTEVOTywgIlxiIFxiIiwgMyk7CiAgICAgICAgZWxzZQogICAgICAgICAgICB3cml0ZShTVERPVVRfRklMRU5PLCAiXGJDIiwgMSk7CiAgICB9IGVsc2UgewogICAgICAgIGludCAgICAgICAgICAgICBpOwogICAgICAgIF9fdTggICAgICAgICAgICpjcCwgKmRwOwoKICAgICAgICBERUJVR01TR1RMKCgicGluZ0N0bFRhYmxlIiwgIiVkIGJ5dGVzIGZyb20gJXM6IGljbXBfc2VxPSV1IiwgY2MsIGZyb20sCiAgICAgICAgICAgICAgICAgICAgc2VxKSk7CgogICAgICAgIGlmIChob3BzID49IDApCiAgICAgICAgICAgIERFQlVHTVNHVEwoKCJwaW5nQ3RsVGFibGUiLCAiIHR0bD0lZCIsIGhvcHMpKTsKCiAgICAgICAgaWYgKGNjIDwgZGF0YWxlbiArIDgpIHsKICAgICAgICAgICAgREVCVUdNU0dUTCgoInBpbmdDdGxUYWJsZSIsICIgKHRydW5jYXRlZClcbiIpKTsKICAgICAgICAgICAgcmV0dXJuIDE7CiAgICAgICAgfQogICAgICAgIGlmICh0aW1pbmcpIHsKICAgICAgICAgICAgaWYgKHRyaXB0aW1lID49IDEwMDAwMCkKICAgICAgICAgICAgICAgIERFQlVHTVNHVEwoKCJwaW5nQ3RsVGFibGUiLCAiIHRpbWU9JWxkIG1zIiwgdHJpcHRpbWUgLyAxMDAwKSk7CiAgICAgICAgICAgIGVsc2UgaWYgKHRyaXB0aW1lID49IDEwMDAwKQogICAgICAgICAgICAgICAgREVCVUdNU0dUTCgoInBpbmdDdGxUYWJsZSIsICIgdGltZT0lbGQuJTAxbGQgbXMiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJpcHRpbWUgLyAxMDAwLCAodHJpcHRpbWUgJSAxMDAwKSAvIDEwMCkpOwogICAgICAgICAgICBlbHNlIGlmICh0cmlwdGltZSA+PSAxMDAwKQogICAgICAgICAgICAgICAgREVCVUdNU0dUTCgoInBpbmdDdGxUYWJsZSIsICIgdGltZT0lbGQuJTAybGQgbXMiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJpcHRpbWUgLyAxMDAwLCAodHJpcHRpbWUgJSAxMDAwKSAvIDEwKSk7CiAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgICAgIERFQlVHTVNHVEwoKCJwaW5nQ3RsVGFibGUiLCAiIHRpbWU9JWxkLiUwM2xkIG1zIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyaXB0aW1lIC8gMTAwMCwgdHJpcHRpbWUgJSAxMDAwKSk7CiAgICAgICAgfQogICAgICAgIGlmIChkdXBmbGFnKQogICAgICAgICAgICBERUJVR01TR1RMKCgicGluZ0N0bFRhYmxlIiwgIiAoRFVQISkiKSk7CiAgICAgICAgaWYgKGNzZmFpbGVkKQogICAgICAgICAgICBERUJVR01TR1RMKCgicGluZ0N0bFRhYmxlIiwgIiAoQkFEIENIRUNLU1VNISkiKSk7CgogICAgICAgIC8qCiAgICAgICAgICogY2hlY2sgdGhlIGRhdGEgCiAgICAgICAgICovCiAgICAgICAgY3AgPSAoKHVfY2hhciAqKSBwdHIpICsgc2l6ZW9mKHN0cnVjdCB0aW1ldmFsKTsKICAgICAgICBkcCA9ICh1X2NoYXIgKikmb3V0cGFja1s4ICsgc2l6ZW9mKHN0cnVjdCB0aW1ldmFsKV07CiAgICAgICAgZm9yIChpID0gc2l6ZW9mKHN0cnVjdCB0aW1ldmFsKTsgaSA8IGRhdGFsZW47ICsraSwgKytjcCwgKytkcCkgewogICAgICAgICAgICBpZiAoKmNwICE9ICpkcCkgewogICAgICAgICAgICAgICAgREVCVUdNU0dUTCgoInBpbmdDdGxUYWJsZSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAiXG53cm9uZyBkYXRhIGJ5dGUgIyVkIHNob3VsZCBiZSAweCV4IGJ1dCB3YXMgMHgleCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpLCAqZHAsICpjcCkpOwogICAgICAgICAgICAgICAgY3AgPSAodV9jaGFyICopIHB0ciArIHNpemVvZihzdHJ1Y3QgdGltZXZhbCk7CiAgICAgICAgICAgICAgICBmb3IgKGkgPSBzaXplb2Yoc3RydWN0IHRpbWV2YWwpOyBpIDwgZGF0YWxlbjsgKytpLCArK2NwKSB7CiAgICAgICAgICAgICAgICAgICAgaWYgKChpICUgMzIpID09IHNpemVvZihzdHJ1Y3QgdGltZXZhbCkpCiAgICAgICAgICAgICAgICAgICAgICAgIERFQlVHTVNHVEwoKCJwaW5nQ3RsVGFibGUiLCAiXG4jJWRcdCIsIGkpKTsKICAgICAgICAgICAgICAgICAgICBERUJVR01TR1RMKCgicGluZ0N0bFRhYmxlIiwgIiV4ICIsICpjcCkpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9CgoKICAgIHNubXBfdmFybGlzdF9hZGRfdmFyaWFibGUoJnZhcnMsIE5VTEwsIDAsIEFTTl9PQ1RFVF9TVFIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGl0ZW0tPnBpbmdDdGxPd25lckluZGV4LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpdGVtLT5waW5nQ3RsT3duZXJJbmRleExlbik7CiAgICBzbm1wX3Zhcmxpc3RfYWRkX3ZhcmlhYmxlKCZ2YXJzLCBOVUxMLCAwLCBBU05fT0NURVRfU1RSLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpdGVtLT5waW5nQ3RsVGVzdE5hbWUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGl0ZW0tPnBpbmdDdGxUZXN0TmFtZUxlbik7CgogICAgU3RvcmFnZU5ldyA9IGhlYWRlcl9jb21wbGV4X2dldChwaW5nUmVzdWx0c1RhYmxlU3RvcmFnZSwgdmFycyk7CiAgICBzbm1wX2ZyZWVfdmFyYmluZCh2YXJzKTsKICAgIGlmICghU3RvcmFnZU5ldykKICAgICAgICByZXR1cm4gU05NUF9FUlJfTk9TVUNITkFNRTsKCgogICAgU3RvcmFnZU5ldy0+cGluZ1Jlc3VsdHNNaW5SdHQgPSAqdG1pbjsKICAgIFN0b3JhZ2VOZXctPnBpbmdSZXN1bHRzTWF4UnR0ID0gKnRtYXg7CiAgICBTdG9yYWdlTmV3LT5waW5nUmVzdWx0c0F2ZXJhZ2VSdHQgPQogICAgICAgICgqdHN1bSkgLyAoU3RvcmFnZU5ldy0+cGluZ1Jlc3VsdHNQcm9iZVJlc3BvbnNlcyArIDEpOwogICAgU3RvcmFnZU5ldy0+cGluZ1Jlc3VsdHNQcm9iZVJlc3BvbnNlcyA9CiAgICAgICAgU3RvcmFnZU5ldy0+cGluZ1Jlc3VsdHNQcm9iZVJlc3BvbnNlcyArIDE7CiAgICBTdG9yYWdlTmV3LT5waW5nUmVzdWx0c1NlbmRQcm9iZXMgPQogICAgICAgIFN0b3JhZ2VOZXctPnBpbmdSZXN1bHRzU2VuZFByb2JlcyArIDE7CiAgICBTdG9yYWdlTmV3LT5waW5nUmVzdWx0c1J0dFN1bU9mU3F1YXJlcyA9ICp0c3VtMjsKCiAgICBTdG9yYWdlTmV3LT5waW5nUmVzdWx0c0xhc3RHb29kUHJvYmVfdGltZSA9IHRpbWVwOwogICAgZnJlZShTdG9yYWdlTmV3LT5waW5nUmVzdWx0c0xhc3RHb29kUHJvYmUpOwogICAgU3RvcmFnZU5ldy0+cGluZ1Jlc3VsdHNMYXN0R29vZFByb2JlID0KICAgICAgICBuZXRzbm1wX21lbWR1cChkYXRlX25fdGltZSgmdGltZXAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJlN0b3JhZ2VOZXctPnBpbmdSZXN1bHRzTGFzdEdvb2RQcm9iZUxlbiksCiAgICAgICAgICAgICAgICAgICAgICAgMTEpOwoKICAgIC8qIFByb2JlSGlzdG9yeSAgICAgICAgICAgICAgICovCiAgICBpZiAoaXRlbS0+cGluZ0N0bE1heFJvd3MgIT0gMCkgewogICAgICAgIHRlbXAgPSBTTk1QX01BTExPQ19TVFJVQ1QocGluZ1Byb2JlSGlzdG9yeVRhYmxlX2RhdGEpOwoKICAgICAgICB0ZW1wLT5waW5nQ3RsT3duZXJJbmRleCA9CiAgICAgICAgICAgIChjaGFyICopIG1hbGxvYyhpdGVtLT5waW5nQ3RsT3duZXJJbmRleExlbiArIDEpOwogICAgICAgIG1lbWNweSh0ZW1wLT5waW5nQ3RsT3duZXJJbmRleCwgaXRlbS0+cGluZ0N0bE93bmVySW5kZXgsCiAgICAgICAgICAgICAgIGl0ZW0tPnBpbmdDdGxPd25lckluZGV4TGVuICsgMSk7CiAgICAgICAgdGVtcC0+cGluZ0N0bE93bmVySW5kZXhbaXRlbS0+cGluZ0N0bE93bmVySW5kZXhMZW5dID0gJ1wwJzsKICAgICAgICB0ZW1wLT5waW5nQ3RsT3duZXJJbmRleExlbiA9IGl0ZW0tPnBpbmdDdGxPd25lckluZGV4TGVuOwoKICAgICAgICB0ZW1wLT5waW5nQ3RsVGVzdE5hbWUgPQogICAgICAgICAgICAoY2hhciAqKSBtYWxsb2MoaXRlbS0+cGluZ0N0bFRlc3ROYW1lTGVuICsgMSk7CiAgICAgICAgbWVtY3B5KHRlbXAtPnBpbmdDdGxUZXN0TmFtZSwgaXRlbS0+cGluZ0N0bFRlc3ROYW1lLAogICAgICAgICAgICAgICBpdGVtLT5waW5nQ3RsVGVzdE5hbWVMZW4gKyAxKTsKICAgICAgICB0ZW1wLT5waW5nQ3RsVGVzdE5hbWVbaXRlbS0+cGluZ0N0bFRlc3ROYW1lTGVuXSA9ICdcMCc7CiAgICAgICAgdGVtcC0+cGluZ0N0bFRlc3ROYW1lTGVuID0gaXRlbS0+cGluZ0N0bFRlc3ROYW1lTGVuOwoKICAgICAgICAvKiBhZGQgbG9jayB0byBwcm90ZWN0ICovCiAgICAgICAgcHRocmVhZF9tdXRleF90IGNvdW50ZXJfbXV0ZXggPSBQVEhSRUFEX01VVEVYX0lOSVRJQUxJWkVSOwogICAgICAgIHB0aHJlYWRfbXV0ZXhfbG9jaygmY291bnRlcl9tdXRleCk7CiAgICAgICAgaWYgKGl0ZW0tPnBpbmdQcm9iZUhpc3RvcnlNYXhJbmRleCA+PSAodW5zaWduZWQgbG9uZykgKDIxNDc0ODM2NDcpKQogICAgICAgICAgICBpdGVtLT5waW5nUHJvYmVIaXN0b3J5TWF4SW5kZXggPSAwOwogICAgICAgIHRlbXAtPnBpbmdQcm9iZUhpc3RvcnlJbmRleCA9ICsrKGl0ZW0tPnBpbmdQcm9iZUhpc3RvcnlNYXhJbmRleCk7CiAgICAgICAgcHRocmVhZF9tdXRleF91bmxvY2soJmNvdW50ZXJfbXV0ZXgpOwogICAgICAgIC8qIGVuZCAqLwoKCiAgICAgICAgdGVtcC0+cGluZ1Byb2JlSGlzdG9yeVJlc3BvbnNlID0gdHJpcHRpbWU7CiAgICAgICAgdGVtcC0+cGluZ1Byb2JlSGlzdG9yeVN0YXR1cyA9IDE7CiAgICAgICAgdGVtcC0+cGluZ1Byb2JlSGlzdG9yeUxhc3RSQyA9IDA7CgoJdGVtcC0+cGluZ1Byb2JlSGlzdG9yeVRpbWVfdGltZSA9IHRpbWVwOwoJdGVtcC0+cGluZ1Byb2JlSGlzdG9yeVRpbWUgPQogICAgICAgICAgICBuZXRzbm1wX21lbWR1cChkYXRlX25fdGltZSgmdGltZXAsICZ0ZW1wLT5waW5nUHJvYmVIaXN0b3J5VGltZUxlbiksCiAgICAgICAgICAgICAgICAgICAgICAgICAgIDExKTsKCiAgICAgICAgaWYgKFN0b3JhZ2VOZXctPnBpbmdSZXN1bHRzU2VuZFByb2JlcyA9PSAxKQogICAgICAgICAgICBpdGVtLT5waW5nUHJvYmVIaXMgPSB0ZW1wOwogICAgICAgIGVsc2UgewogICAgICAgICAgICAoY3VycmVudF90ZW1wKS0+bmV4dCA9IHRlbXA7CiAgICAgICAgfQoKICAgICAgICBjdXJyZW50X3RlbXAgPSB0ZW1wOwoKICAgICAgICBpZiAoU3RvcmFnZU5ldy0+cGluZ1Jlc3VsdHNTZW5kUHJvYmVzID49IGl0ZW0tPnBpbmdDdGxQcm9iZUNvdW50KSB7CiAgICAgICAgICAgIGN1cnJlbnRfdGVtcC0+bmV4dCA9IE5VTEw7CiAgICAgICAgfQoKICAgICAgICBpZiAoaXRlbS0+cGluZ1Byb2JlSGlzICE9IE5VTEwpIHsKCiAgICAgICAgICAgIGlmIChwaW5nUHJvYmVIaXN0b3J5VGFibGVfY291bnQoaXRlbSkgPCBpdGVtLT5waW5nQ3RsTWF4Um93cykgewogICAgICAgICAgICAgICAgaWYgKHBpbmdQcm9iZUhpc3RvcnlUYWJsZV9hZGQoY3VycmVudF90ZW1wKSAhPQogICAgICAgICAgICAgICAgICAgIFNOTVBFUlJfU1VDQ0VTUykKICAgICAgICAgICAgICAgICAgICBERUJVR01TR1RMKCgicGluZ1Byb2JlSGlzdG9yeVRhYmxlIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAicmVnaXN0ZXJlZCBhbiBlbnRyeSBlcnJvclxuIikpOwogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgcGluZ1Byb2JlSGlzdG9yeVRhYmxlX2RlbExhc3QoaXRlbSk7CgogICAgICAgICAgICAgICAgaWYgKHBpbmdQcm9iZUhpc3RvcnlUYWJsZV9hZGQoY3VycmVudF90ZW1wKSAhPQogICAgICAgICAgICAgICAgICAgIFNOTVBFUlJfU1VDQ0VTUykKICAgICAgICAgICAgICAgICAgICBERUJVR01TR1RMKCgicGluZ1Byb2JlSGlzdG9yeVRhYmxlIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAicmVnaXN0ZXJlZCBhbiBlbnRyeSBlcnJvclxuIikpOwoKICAgICAgICAgICAgfQoKICAgICAgICB9CiAgICB9CiAgICByZXR1cm4gMDsKfQoKc3RhdGljIGxvbmcKbGxzcXJ0KGxvbmcgbG9uZyBhKQp7CiAgICBsb25nIGxvbmcgICAgICAgcHJldiA9IH4oKGxvbmcgbG9uZykgMSA8PCA2Myk7CiAgICBsb25nIGxvbmcgICAgICAgeCA9IGE7CgogICAgaWYgKHggPiAwKSB7CiAgICAgICAgd2hpbGUgKHggPCBwcmV2KSB7CiAgICAgICAgICAgIHByZXYgPSB4OwogICAgICAgICAgICB4ID0gKHggKyAoYSAvIHgpKSAvIDI7CiAgICAgICAgfQogICAgfQoKICAgIHJldHVybiAobG9uZykgeDsKfQoKLyoKICogZmluaXNoIC0tCiAqICAgICAgUHJpbnQgb3V0IHN0YXRpc3RpY3MsIGFuZCBnaXZlIHVwLgogKi8Kdm9pZApmaW5pc2goaW50IG9wdGlvbnMsIGNoYXIgKmhvc3RuYW1lLCBpbnQgaW50ZXJ2YWwsIGludCB0aW1pbmcsIGludCAqcnR0LAogICAgICAgc3RydWN0IHRpbWV2YWwgKnN0YXJ0X3RpbWUsIGludCAqZGVhZGxpbmUsIGxvbmcgKm5wYWNrZXRzLAogICAgICAgbG9uZyAqbnJlY2VpdmVkLCBsb25nICpucmVwZWF0cywgbG9uZyAqbnRyYW5zbWl0dGVkLAogICAgICAgbG9uZyAqbmNoZWNrc3VtLCBsb25nICpuZXJyb3JzLCBsb25nICp0bWluLCBsb25nICp0bWF4LAogICAgICAgbG9uZyBsb25nICp0c3VtLCBsb25nIGxvbmcgKnRzdW0yLCBpbnQgKnBpcGVzaXplLAogICAgICAgc3RydWN0IHRpbWV2YWwgKmN1cl90aW1lKQp7CiAgICBzdHJ1Y3QgdGltZXZhbCAgdHYgPSAqY3VyX3RpbWU7CgogICAgdHZzdWIoJnR2LCBzdGFydF90aW1lKTsKCiAgICBwdXRjaGFyKCdcbicpOwogICAgZmZsdXNoKHN0ZG91dCk7CiAgICBERUJVR01TR1RMKCgicGluZ0N0bFRhYmxlIiwgIi0tLSAlcyBwaW5nIHN0YXRpc3RpY3MgLS0tXG4iLCBob3N0bmFtZSkpOwoKICAgIGlmICgqbnJlcGVhdHMpCiAgICAgICAgREVCVUdNU0dUTCgoInBpbmdDdGxUYWJsZSIsICIsICslbGQgZHVwbGljYXRlcyIsICpucmVwZWF0cykpOwogICAgaWYgKCpuY2hlY2tzdW0pCiAgICAgICAgREVCVUdNU0dUTCgoInBpbmdDdGxUYWJsZSIsICIsICslbGQgY29ycnVwdGVkIiwgKm5jaGVja3N1bSkpOwogICAgaWYgKCpuZXJyb3JzKQogICAgICAgIERFQlVHTVNHVEwoKCJwaW5nQ3RsVGFibGUiLCAiLCArJWxkIGVycm9ycyIsICpuZXJyb3JzKSk7CiAgICBpZiAoKm50cmFuc21pdHRlZCkgewogICAgICAgIERFQlVHTVNHVEwoKCJwaW5nQ3RsVGFibGUiLCAiLCAlZCUlIGxvc3MiLAogICAgICAgICAgICAgICAgICAgIChpbnQpICgoKChsb25nIGxvbmcpICgoKm50cmFuc21pdHRlZCkgLQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKm5yZWNlaXZlZCkpKSAqIDEwMCkgLwogICAgICAgICAgICAgICAgICAgICAgICAgICAoKm50cmFuc21pdHRlZCkpKSk7CiAgICAgICAgREVCVUdNU0dUTCgoInBpbmdDdGxUYWJsZSIsICIsIHRpbWUgJWxkbXMiLAogICAgICAgICAgICAgICAgICAgIDEwMDAgKiB0di50dl9zZWMgKyB0di50dl91c2VjIC8gMTAwMCkpOwogICAgfQogICAgcHV0Y2hhcignXG4nKTsKCiAgICBpZiAoKCpucmVjZWl2ZWQpICYmIHRpbWluZykgewogICAgICAgIGxvbmcgICAgICAgICAgICB0bWRldjsKCiAgICAgICAgKCp0c3VtKSAvPSAoKm5yZWNlaXZlZCkgKyAoKm5yZXBlYXRzKTsKICAgICAgICAoKnRzdW0yKSAvPSAoKm5yZWNlaXZlZCkgKyAoKm5yZXBlYXRzKTsKICAgICAgICB0bWRldiA9IGxsc3FydCgoKnRzdW0yKSAtICgqdHN1bSkgKiAoKnRzdW0pKTsKCiAgICAgICAgREVCVUdNU0dUTCgoInBpbmdDdGxUYWJsZSIsICJydHQgbWluL2F2Zy9tYXgvbWRldiA9ICVsZC4lMDNsZC8lbHUuJTAzbGQiCiAgICAgICAgICAgICAgICAgICAgIi8lbGQuJTAzbGQvJWxkLiUwM2xkIG1zIiwKICAgICAgICAgICAgICAgICAgICAoKnRtaW4pIC8gMTAwMCwgKCp0bWluKSAlIDEwMDAsCiAgICAgICAgICAgICAgICAgICAgKHVuc2lnbmVkIGxvbmcpICgoKnRzdW0pIC8gMTAwMCksIChsb25nKSAoKCp0c3VtKSAlIDEwMDApLAogICAgICAgICAgICAgICAgICAgICgqdG1heCkgLyAxMDAwLCAoKnRtYXgpICUgMTAwMCwgdG1kZXYgLyAxMDAwLAogICAgICAgICAgICAgICAgICAgIHRtZGV2ICUgMTAwMCkpOwogICAgfQogICAgaWYgKCgqcGlwZXNpemUpID4gMSkKICAgICAgICBERUJVR01TR1RMKCgicGluZ0N0bFRhYmxlIiwgIiwgcGlwZSAlZCIsICpwaXBlc2l6ZSkpOwogICAgaWYgKCgqbnRyYW5zbWl0dGVkKSA+IDEKICAgICAgICAmJiAoIWludGVydmFsIHx8IChvcHRpb25zICYgKEZfRkxPT0QgfCBGX0FEQVBUSVZFKSkpKSB7CiAgICAgICAgaW50ICAgICAgICAgICAgIGlwZyA9CiAgICAgICAgICAgICgxMDAwMDAwICogKGxvbmcgbG9uZykgdHYudHZfc2VjICsKICAgICAgICAgICAgIHR2LnR2X3VzZWMpIC8gKCgqbnRyYW5zbWl0dGVkKSAtIDEpOwogICAgICAgIERFQlVHTVNHVEwoKCJwaW5nQ3RsVGFibGUiLCAiLCBpcGcvZXdtYSAlZC4lMDNkLyVkLiUwM2QgbXMiLAogICAgICAgICAgICAgICAgICAgIGlwZyAvIDEwMDAsIGlwZyAlIDEwMDAsCiAgICAgICAgICAgICAgICAgICAgKCpydHQpIC8gODAwMCwgKCgqcnR0KSAvIDgpICUgMTAwMCkpOwogICAgfQogICAgcHV0Y2hhcignXG4nKTsKICAgIHJldHVybjsKICAgIC8qIHJldHVybihkZWFkbGluZSA/ICgqbnJlY2VpdmVkKTwoKm5wYWNrZXRzKSA6ICgqbnJlY2VpdmVkKT09MCk7ICovCn0KCgp2b2lkCnN0YXR1cyhpbnQgdGltaW5nLCBpbnQgKnJ0dCwgbG9uZyAqbnJlY2VpdmVkLCBsb25nICpucmVwZWF0cywKICAgICAgIGxvbmcgKm50cmFuc21pdHRlZCwgbG9uZyAqdG1pbiwgbG9uZyAqdG1heCwgbG9uZyBsb25nICp0c3VtLAogICAgICAgbG9uZyBsb25nICp0c3VtMikKewogICAgaW50ICAgICAgICAgICAgIGxvc3MgPSAwOwogICAgbG9uZyAgICAgICAgICAgIHRhdmcgPSAwOwoKICAgIHN0YXR1c19zbmFwc2hvdCA9IDA7CgogICAgaWYgKCpudHJhbnNtaXR0ZWQpCiAgICAgICAgbG9zcyA9CiAgICAgICAgICAgICgoKGxvbmcgbG9uZykgKCgqbnRyYW5zbWl0dGVkKSAtCiAgICAgICAgICAgICAgICAgICAgICAgICAgICgqbnJlY2VpdmVkKSkpICogMTAwKSAvICgqbnRyYW5zbWl0dGVkKTsKCiAgICBERUJVR01TR1RMKCgicGluZ0N0bFRhYmxlIiwgIlxuJWxkLyVsZCBwYWNrZXRzLCAlZCUlIGxvc3MiLCAqbnRyYW5zbWl0dGVkLAogICAgICAgICAgICAgICAgKm5yZWNlaXZlZCwgbG9zcykpOwoKICAgIGlmICgoKm5yZWNlaXZlZCkgJiYgdGltaW5nKSB7CiAgICAgICAgdGF2ZyA9ICgqdHN1bSkgLyAoKCpucmVjZWl2ZWQpICsgKCpucmVwZWF0cykpOwoKICAgICAgICBERUJVR01TR1RMKCgicGluZ0N0bFRhYmxlIiwgIiwgbWluL2F2Zy9ld21hL21heCA9ICVsZC4lMDNsZC8lbHUuJTAzbGQiCiAgICAgICAgICAgICAgICAgICAgIi8lZC4lMDNkLyVsZC4lMDNsZCBtcyIsCiAgICAgICAgICAgICAgICAgICAgKCp0bWluKSAvIDEwMDAsICgqdG1pbikgJSAxMDAwLCB0YXZnIC8gMTAwMCwgdGF2ZyAlIDEwMDAsCiAgICAgICAgICAgICAgICAgICAgKCpydHQpIC8gODAwMCwgKCgqcnR0KSAvIDgpICUgMTAwMCwgKCp0bWF4KSAvIDEwMDAsCiAgICAgICAgICAgICAgICAgICAgKCp0bWF4KSAlIDEwMDApKTsKICAgIH0KICAgIERFQlVHTVNHVEwoKCJwaW5nQ3RsVGFibGUiLCAiXG4iKSk7Cn0KCgpzdGF0aWMgX19pbmxpbmVfXyBpbnQKaXB2Nl9hZGRyX2FueShzdHJ1Y3QgaW42X2FkZHIgKmFkZHIpCnsKICAgIHN0YXRpYyBzdHJ1Y3QgaW42X2FkZHIgaW42X2FueWFkZHI7CiAgICByZXR1cm4gKG1lbWNtcChhZGRyLCAmaW42X2FueWFkZHIsIDE2KSA9PSAwKTsKfQoKaW50CnJlY2VpdmVfZXJyb3JfbXNnKGludCBpY21wX3NvY2ssIHN0cnVjdCBzb2NrYWRkcl9pbjYgKndoZXJldG8sIGludCBvcHRpb25zLAogICAgICAgICAgICAgICAgICBpbnQgKmlkZW50LCBsb25nICpuZXJyb3JzKQp7CiAgICBpbnQgICAgICAgICAgICAgcmVzOwogICAgY2hhciAgICAgICAgICAgIGNidWZbNTEyXTsKICAgIHN0cnVjdCBpb3ZlYyAgICBpb3Y7CiAgICBzdHJ1Y3QgbXNnaGRyICAgbXNnOwogICAgc3RydWN0IGNtc2doZHIgKmNtc2c7CiAgICBzdHJ1Y3Qgc29ja19leHRlbmRlZF9lcnIgKmU7CiAgICBzdHJ1Y3QgaWNtcDZfaGRyIGljbXBoOwogICAgc3RydWN0IHNvY2thZGRyX2luNiB0YXJnZXQ7CiAgICBpbnQgICAgICAgICAgICAgbmV0X2Vycm9ycyA9IDA7CiAgICBpbnQgICAgICAgICAgICAgbG9jYWxfZXJyb3JzID0gMDsKICAgIGludCAgICAgICAgICAgICBzYXZlZF9lcnJubyA9IGVycm5vOwoKICAgIGlvdi5pb3ZfYmFzZSA9ICZpY21waDsKICAgIGlvdi5pb3ZfbGVuID0gc2l6ZW9mKGljbXBoKTsKICAgIG1zZy5tc2dfbmFtZSA9ICh2b2lkICopICZ0YXJnZXQ7CiAgICBtc2cubXNnX25hbWVsZW4gPSBzaXplb2YodGFyZ2V0KTsKICAgIG1zZy5tc2dfaW92ID0gJmlvdjsKICAgIG1zZy5tc2dfaW92bGVuID0gMTsKICAgIG1zZy5tc2dfZmxhZ3MgPSAwOwogICAgbXNnLm1zZ19jb250cm9sID0gY2J1ZjsKICAgIG1zZy5tc2dfY29udHJvbGxlbiA9IHNpemVvZihjYnVmKTsKCiAgICByZXMgPSByZWN2bXNnKGljbXBfc29jaywgJm1zZywgTVNHX0VSUlFVRVVFIHwgTVNHX0RPTlRXQUlUKTsKICAgIGlmIChyZXMgPCAwKQogICAgICAgIGdvdG8gb3V0OwoKICAgIGUgPSBOVUxMOwogICAgZm9yIChjbXNnID0gQ01TR19GSVJTVEhEUigmbXNnKTsgY21zZzsgY21zZyA9IENNU0dfTlhUSERSKCZtc2csIGNtc2cpKSB7CiAgICAgICAgaWYgKGNtc2ctPmNtc2dfbGV2ZWwgPT0gU09MX0lQVjYpIHsKICAgICAgICAgICAgaWYgKGNtc2ctPmNtc2dfdHlwZSA9PSBJUFY2X1JFQ1ZFUlIpCiAgICAgICAgICAgICAgICBlID0gKHN0cnVjdCBzb2NrX2V4dGVuZGVkX2VyciAqKSBDTVNHX0RBVEEoY21zZyk7CiAgICAgICAgfQogICAgfQogICAgaWYgKGUgPT0gTlVMTCkKICAgICAgICBhYm9ydCgpOwoKICAgIGlmIChlLT5lZV9vcmlnaW4gPT0gU09fRUVfT1JJR0lOX0xPQ0FMKSB7CiAgICAgICAgbG9jYWxfZXJyb3JzKys7CiAgICAgICAgaWYgKG9wdGlvbnMgJiBGX1FVSUVUKQogICAgICAgICAgICBnb3RvIG91dDsKICAgICAgICBpZiAob3B0aW9ucyAmIEZfRkxPT0QpCiAgICAgICAgICAgIHdyaXRlKFNURE9VVF9GSUxFTk8sICJFIiwgMSk7CiAgICAgICAgZWxzZSBpZiAoZS0+ZWVfZXJybm8gIT0gRU1TR1NJWkUpCiAgICAgICAgICAgIHNubXBfbG9nKExPR19FUlIsICJwaW5nOiBsb2NhbCBlcnJvcjogJXNcbiIsIHN0cmVycm9yKGUtPmVlX2Vycm5vKSk7CiAgICAgICAgZWxzZQogICAgICAgICAgICBzbm1wX2xvZyhMT0dfRVJSLCAicGluZzogbG9jYWwgZXJyb3I6IE1lc3NhZ2UgdG9vIGxvbmcsIG10dT0ldVxuIiwKICAgICAgICAgICAgICAgICAgICAgZS0+ZWVfaW5mbyk7CiAgICAgICAgKCpuZXJyb3JzKSsrOwogICAgfSBlbHNlIGlmIChlLT5lZV9vcmlnaW4gPT0gU09fRUVfT1JJR0lOX0lDTVA2KSB7CiAgICAgICAgaWYgKHJlcyA8IHNpemVvZihpY21waCkgfHwKICAgICAgICAgICAgbWVtY21wKCZ0YXJnZXQuc2luNl9hZGRyLCAmKHdoZXJldG8tPnNpbjZfYWRkciksIDE2KSB8fAogICAgICAgICAgICBpY21waC5pY21wNl90eXBlICE9IElDTVA2X0VDSE9fUkVRVUVTVCB8fAogICAgICAgICAgICBpY21waC5pY21wNl9pZCAhPSAqaWRlbnQpIHsKICAgICAgICAgICAgLyoKICAgICAgICAgICAgICogTm90IG91ciBlcnJvciwgbm90IGFuIGVycm9yIGF0IGFsbC4gQ2xlYXIuIAogICAgICAgICAgICAgKi8KICAgICAgICAgICAgc2F2ZWRfZXJybm8gPSAwOwogICAgICAgICAgICBnb3RvIG91dDsKICAgICAgICB9CgogICAgICAgIG5ldF9lcnJvcnMrKzsKICAgICAgICAoKm5lcnJvcnMpKys7CiAgICAgICAgaWYgKG9wdGlvbnMgJiBGX1FVSUVUKQogICAgICAgICAgICBnb3RvIG91dDsKICAgICAgICBpZiAob3B0aW9ucyAmIEZfRkxPT0QpIHsKICAgICAgICAgICAgd3JpdGUoU1RET1VUX0ZJTEVOTywgIlxiRSIsIDIpOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIGZmbHVzaChzdGRvdXQpOwogICAgICAgIH0KICAgIH0KCiAgb3V0OgogICAgZXJybm8gPSBzYXZlZF9lcnJubzsKICAgIHJldHVybiBuZXRfZXJyb3JzID8gOiAtbG9jYWxfZXJyb3JzOwp9CgppbnQKc2VuZF92NihpbnQgaWNtcF9zb2NrLCBpbnQgY21zZ2xlbiwgY2hhciAqY21zZ2J1ZiwKICAgICAgICBzdHJ1Y3Qgc29ja2FkZHJfaW42ICp3aGVyZXRvLCBpbnQgZGF0YWxlbiwgaW50IHRpbWluZywKICAgICAgICBjaGFyICpvdXRwYWNrLCBpbnQgKmlkZW50LCBsb25nICpudHJhbnNtaXR0ZWQsIGludCAqY29uZmlybSkKewogICAgc3RydWN0IGljbXA2X2hkciAqaWNtcGg7CiAgICBpbnQgICAgICAgICAgICAgY2M7CiAgICBpbnQgICAgICAgICAgICAgaTsKICAgIGludCAgICAgICAgICAgICBteF9kdXBfY2sgPSBNQVhfRFVQX0NISzsKCiAgICBpY21waCA9IChzdHJ1Y3QgaWNtcDZfaGRyICopIG91dHBhY2s7CiAgICBpY21waC0+aWNtcDZfdHlwZSA9IElDTVA2X0VDSE9fUkVRVUVTVDsKICAgIGljbXBoLT5pY21wNl9jb2RlID0gMDsKICAgIGljbXBoLT5pY21wNl9ja3N1bSA9IDA7CiAgICBpY21waC0+aWNtcDZfc2VxID0gKCpudHJhbnNtaXR0ZWQpICsgMTsKICAgIGljbXBoLT5pY21wNl9pZCA9ICppZGVudDsKCiAgICBDTFIoaWNtcGgtPmljbXA2X3NlcSAlIG14X2R1cF9jayk7CgogICAgaWYgKHRpbWluZykKICAgICAgICBnZXR0aW1lb2ZkYXkoKHN0cnVjdCB0aW1ldmFsICopICZvdXRwYWNrWzhdLAogICAgICAgICAgICAgICAgICAgICAoc3RydWN0IHRpbWV6b25lICopIE5VTEwpOwoKICAgIGNjID0gZGF0YWxlbiArIDg7ICAgICAgICAgICAvKiBza2lwcyBJQ01QIHBvcnRpb24gKi8KCiAgICBpZiAoY21zZ2xlbiA9PSAwKSB7CiAgICAgICAgaSA9IHNlbmR0byhpY21wX3NvY2ssIChjaGFyICopIG91dHBhY2ssIGNjLCAqY29uZmlybSwKICAgICAgICAgICAgICAgICAgIChzdHJ1Y3Qgc29ja2FkZHIgKikgd2hlcmV0bywKICAgICAgICAgICAgICAgICAgIHNpemVvZihzdHJ1Y3Qgc29ja2FkZHJfaW42KSk7CiAgICB9IGVsc2UgewogICAgICAgIHN0cnVjdCBtc2doZHIgICBtaGRyOwogICAgICAgIHN0cnVjdCBpb3ZlYyAgICBpb3Y7CgogICAgICAgIGlvdi5pb3ZfbGVuID0gY2M7CiAgICAgICAgaW92Lmlvdl9iYXNlID0gb3V0cGFjazsKCiAgICAgICAgbWhkci5tc2dfbmFtZSA9IHdoZXJldG87CiAgICAgICAgbWhkci5tc2dfbmFtZWxlbiA9IHNpemVvZihzdHJ1Y3Qgc29ja2FkZHJfaW42KTsKICAgICAgICBtaGRyLm1zZ19pb3YgPSAmaW92OwogICAgICAgIG1oZHIubXNnX2lvdmxlbiA9IDE7CiAgICAgICAgbWhkci5tc2dfY29udHJvbCA9IGNtc2didWY7CiAgICAgICAgbWhkci5tc2dfY29udHJvbGxlbiA9IGNtc2dsZW47CgogICAgICAgIGkgPSBzZW5kbXNnKGljbXBfc29jaywgJm1oZHIsICpjb25maXJtKTsKICAgIH0KICAgICpjb25maXJtID0gMDsKCiAgICByZXR1cm4gKGNjID09IGkgPyAwIDogaSk7Cn0KCi8qCiAqIHBhcnNlX3JlcGx5IC0tCiAqICAgICAgUHJpbnQgb3V0IHRoZSBwYWNrZXQsIGlmIGl0IGNhbWUgZnJvbSB1cy4gIFRoaXMgbG9naWMgaXMgbmVjZXNzYXJ5CiAqIGJlY2F1c2UgQUxMIHJlYWRlcnMgb2YgdGhlIElDTVAgc29ja2V0IGdldCBhIGNvcHkgb2YgQUxMIElDTVAgcGFja2V0cwogKiB3aGljaCBhcnJpdmUgKCd0aXMgb25seSBmYWlyKS4gIFRoaXMgcGVybWl0cyBtdWx0aXBsZSBjb3BpZXMgb2YgdGhpcwogKiBwcm9ncmFtIHRvIGJlIHJ1biB3aXRob3V0IGhhdmluZyBpbnRlcm1pbmdsZWQgb3V0cHV0IChvciBzdGF0aXN0aWNzISkuCiAqLwppbnQKcGFyc2VfcmVwbHkoaW50ICpzZXJpZXMsIHN0cnVjdCBwaW5nQ3RsVGFibGVfZGF0YSAqaXRlbSwKICAgICAgICAgICAgc3RydWN0IG1zZ2hkciAqbXNnLCBpbnQgY2MsIHZvaWQgKmFkZHIsIHN0cnVjdCB0aW1ldmFsICp0diwKICAgICAgICAgICAgdGltZV90IHRpbWVwLCBpbnQgdWlkLCBzdHJ1Y3Qgc29ja2FkZHJfaW42ICp3aGVyZXRvLAogICAgICAgICAgICBpbnQgKnJ0dF9hZGRlbmQsIGludCBvcHRpb25zLCBpbnQgaW50ZXJ2YWwsIGludCBkYXRhbGVuLAogICAgICAgICAgICBpbnQgdGltaW5nLCBpbnQgd29ya2luZ19yZWN2ZXJyLCBjaGFyICpvdXRwYWNrLCBpbnQgKnJ0dCwKICAgICAgICAgICAgaW50ICppZGVudCwgX191MTYgKiBhY2tlZCwgbG9uZyAqbnJlY2VpdmVkLCBsb25nICpucmVwZWF0cywKICAgICAgICAgICAgbG9uZyAqbnRyYW5zbWl0dGVkLCBsb25nICpuY2hlY2tzdW0sIGxvbmcgKm5lcnJvcnMsIGxvbmcgKnRtaW4sCiAgICAgICAgICAgIGxvbmcgKnRtYXgsIGxvbmcgbG9uZyAqdHN1bSwgbG9uZyBsb25nICp0c3VtMiwKICAgICAgICAgICAgaW50ICpjb25maXJtX2ZsYWcsIGludCAqY29uZmlybSwgaW50ICpwaXBlc2l6ZSwKICAgICAgICAgICAgc3RydWN0IHBpbmdQcm9iZUhpc3RvcnlUYWJsZV9kYXRhICpjdXJyZW50X3RlbXApCnsKICAgIHN0cnVjdCBzb2NrYWRkcl9pbjYgKmZyb20gPSBhZGRyOwogICAgX191OCAgICAgICAgICAgKmJ1ZiA9IG1zZy0+bXNnX2lvdi0+aW92X2Jhc2U7CiAgICBzdHJ1Y3QgY21zZ2hkciAqYzsKICAgIHN0cnVjdCBpY21wNl9oZHIgKmljbXBoOwogICAgaW50ICAgICAgICAgICAgIGhvcHMgPSAtMTsKCgogICAgZm9yIChjID0gQ01TR19GSVJTVEhEUihtc2cpOyBjOyBjID0gQ01TR19OWFRIRFIobXNnLCBjKSkgewogICAgICAgIGlmIChjLT5jbXNnX2xldmVsICE9IFNPTF9JUFY2IHx8IGMtPmNtc2dfdHlwZSAhPSBJUFY2X0hPUExJTUlUKQogICAgICAgICAgICBjb250aW51ZTsKICAgICAgICBpZiAoYy0+Y21zZ19sZW4gPCBDTVNHX0xFTihzaXplb2YoaW50KSkpCiAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgIGhvcHMgPSAqKGludCAqKSBDTVNHX0RBVEEoYyk7CiAgICB9CgoKICAgIC8qCiAgICAgKiBOb3cgdGhlIElDTVAgcGFydCAKICAgICAqLwoKICAgIGljbXBoID0gKHN0cnVjdCBpY21wNl9oZHIgKikgYnVmOwogICAgaWYgKGNjIDwgOCkgewogICAgICAgIGlmIChvcHRpb25zICYgRl9WRVJCT1NFKQogICAgICAgICAgICBzbm1wX2xvZyhMT0dfRVJSLCAicGluZzogcGFja2V0IHRvbyBzaG9ydCAoJWQgYnl0ZXMpXG4iLCBjYyk7CiAgICAgICAgcmV0dXJuIDE7CiAgICB9CiAgICBpZiAoaWNtcGgtPmljbXA2X3R5cGUgPT0gSUNNUDZfRUNIT19SRVBMWSkgewogICAgICAgIGlmIChpY21waC0+aWNtcDZfaWQgIT0gKmlkZW50KQogICAgICAgICAgICByZXR1cm4gMTsKICAgICAgICBpZiAoZ2F0aGVyX3N0YXRpc3RpY3Moc2VyaWVzLCBpdGVtLCAoX191OCAqKSAoaWNtcGggKyAxKSwgY2MsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGljbXBoLT5pY21wNl9zZXEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhvcHMsIDAsIHR2LCB0aW1lcCwgcnR0X2FkZGVuZCwgdWlkLCBvcHRpb25zLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcl9hZGRyKCZmcm9tLT5zaW42X2FkZHIsIG9wdGlvbnMpLCBpbnRlcnZhbCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YWxlbiwgdGltaW5nLCBvdXRwYWNrLCBydHQsIGFja2VkLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBucmVjZWl2ZWQsIG5yZXBlYXRzLCBudHJhbnNtaXR0ZWQsIG5jaGVja3N1bSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdG1pbiwgdG1heCwgdHN1bSwgdHN1bTIsIGNvbmZpcm1fZmxhZywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uZmlybSwgcGlwZXNpemUsIGN1cnJlbnRfdGVtcCkpCiAgICAgICAgICAgIHJldHVybiAwOwogICAgfSBlbHNlIHsKICAgICAgICBpbnQgICAgICAgICAgICAgbmV4dGhkcjsKICAgICAgICBzdHJ1Y3QgaXA2X2hkciAqaXBoMSA9IChzdHJ1Y3QgaXA2X2hkciAqKSAoaWNtcGggKyAxKTsKICAgICAgICBzdHJ1Y3QgaWNtcDZfaGRyICppY21waDEgPSAoc3RydWN0IGljbXA2X2hkciAqKSAoaXBoMSArIDEpOwoKICAgICAgICAvKgogICAgICAgICAqIFdlIG11c3Qgbm90IGV2ZXIgZmFsbCBoZXJlLiBBbGwgdGhlIG1lc3NhZ2VzIGJ1dAogICAgICAgICAqICogZWNobyByZXBseSBhcmUgYmxvY2tlZCBieSBmaWx0ZXIgYW5kIGVycm9yIGFyZQogICAgICAgICAqICogcmVjZWl2ZWQgd2l0aCBJUFY2X1JFQ1ZFUlIuIFVnbHkgY29kZSBpcyBwcmVzZXJ2ZWQKICAgICAgICAgKiAqIGhvd2V2ZXIsIGp1c3QgdG8gcmVtZW1iZXIgd2hhdCBjcmFwIHdlIGF2b2lkZWQKICAgICAgICAgKiAqIHVzaW5nIFJFQ1ZSRVJSLiA6LSkKICAgICAgICAgKi8KCiAgICAgICAgaWYgKGNjIDwgOCArIHNpemVvZihzdHJ1Y3QgaXA2X2hkcikgKyA4KQogICAgICAgICAgICByZXR1cm4gMTsKCiAgICAgICAgaWYgKG1lbWNtcCgmaXBoMS0+aXA2X2RzdCwgJih3aGVyZXRvLT5zaW42X2FkZHIpLCAxNikpCiAgICAgICAgICAgIHJldHVybiAxOwoKICAgICAgICBuZXh0aGRyID0gaXBoMS0+aXA2X254dDsKCiAgICAgICAgaWYgKG5leHRoZHIgPT0gNDQpIHsKICAgICAgICAgICAgbmV4dGhkciA9ICooX191OCAqKSBpY21waDE7CiAgICAgICAgICAgIGljbXBoMSsrOwogICAgICAgIH0KICAgICAgICBpZiAobmV4dGhkciA9PSBJUFBST1RPX0lDTVBWNikgewogICAgICAgICAgICBpZiAoaWNtcGgxLT5pY21wNl90eXBlICE9IElDTVA2X0VDSE9fUkVRVUVTVCB8fAogICAgICAgICAgICAgICAgaWNtcGgxLT5pY21wNl9pZCAhPSAqaWRlbnQpCiAgICAgICAgICAgICAgICByZXR1cm4gMTsKICAgICAgICAgICAgYWNrbm93bGVkZ2UoaWNtcGgxLT5pY21wNl9zZXEsIGFja2VkLCBudHJhbnNtaXR0ZWQsCiAgICAgICAgICAgICAgICAgICAgICAgIHBpcGVzaXplKTsKICAgICAgICAgICAgaWYgKHdvcmtpbmdfcmVjdmVycikKICAgICAgICAgICAgICAgIHJldHVybiAwOwogICAgICAgICAgICAoKm5lcnJvcnMpKys7CiAgICAgICAgICAgIGlmIChvcHRpb25zICYgRl9GTE9PRCkgewogICAgICAgICAgICAgICAgd3JpdGUoU1RET1VUX0ZJTEVOTywgIlxiRSIsIDIpOwogICAgICAgICAgICAgICAgcmV0dXJuIDA7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgREVCVUdNU0dUTCgoInBpbmdDdGxUYWJsZSIsICJGcm9tICVzOiBpY21wX3NlcT0ldSAiLAogICAgICAgICAgICAgICAgICAgICAgICBwcl9hZGRyKCZmcm9tLT5zaW42X2FkZHIsIG9wdGlvbnMpLAogICAgICAgICAgICAgICAgICAgICAgICBpY21waDEtPmljbXA2X3NlcSkpOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIC8qCiAgICAgICAgICAgICAqIFdlJ3ZlIGdvdCBzb21ldGhpbmcgb3RoZXIgdGhhbiBhbiBFQ0hPUkVQTFkgCiAgICAgICAgICAgICAqLwogICAgICAgICAgICBpZiAoIShvcHRpb25zICYgRl9WRVJCT1NFKSB8fCB1aWQpCiAgICAgICAgICAgICAgICByZXR1cm4gMTsKICAgICAgICAgICAgREVCVUdNU0dUTCgoInBpbmdDdGxUYWJsZSIsICJGcm9tICVzOiAiLAogICAgICAgICAgICAgICAgICAgICAgICBwcl9hZGRyKCZmcm9tLT5zaW42X2FkZHIsIG9wdGlvbnMpKSk7CiAgICAgICAgfQogICAgICAgIC8qIHByX2ljbXBoKGljbXBoLT5pY21wNl90eXBlLCBpY21waC0+aWNtcDZfY29kZSwgbnRvaGwoaWNtcGgtPmljbXA2X210dSkpOyAqLwogICAgfQoKICAgIGlmICghKG9wdGlvbnMgJiBGX0ZMT09EKSkgewogICAgICAgIGlmIChvcHRpb25zICYgRl9BVURJQkxFKQogICAgICAgICAgICBwdXRjaGFyKCdcYScpOwogICAgICAgIHB1dGNoYXIoJ1xuJyk7CiAgICAgICAgZmZsdXNoKHN0ZG91dCk7CiAgICB9CiAgICByZXR1cm4gMDsKfQoKCgojaW5jbHVkZSA8bGludXgvZmlsdGVyLmg+CnZvaWQKaW5zdGFsbF9maWx0ZXIoaW50IGljbXBfc29jaywgaW50ICppZGVudCkKewogICAgc3RhdGljIGludCAgICAgIG9uY2U7CiAgICBzdGF0aWMgc3RydWN0IHNvY2tfZmlsdGVyIGluc25zW10gPSB7CiAgICAgICAgQlBGX1NUTVQoQlBGX0xEIHwgQlBGX0ggfCBCUEZfQUJTLCA0KSwgIC8qIExvYWQgaWNtcCBlY2hvIGlkZW50ICovCiAgICAgICAgQlBGX0pVTVAoQlBGX0pNUCB8IEJQRl9KRVEgfCBCUEZfSywgMHhBQUFBLCAwLCAxKSwgICAgICAvKiBPdXJzPyAqLwogICAgICAgIEJQRl9TVE1UKEJQRl9SRVQgfCBCUEZfSywgfjBVKSwgLyogWWVzLCBpdCBwYXNzZXMuICovCiAgICAgICAgQlBGX1NUTVQoQlBGX0xEIHwgQlBGX0IgfCBCUEZfQUJTLCAwKSwgIC8qIExvYWQgaWNtcCB0eXBlICovCiAgICAgICAgQlBGX0pVTVAoQlBGX0pNUCB8IEJQRl9KRVEgfCBCUEZfSywgSUNNUDZfRUNIT19SRVBMWSwgMSwgMCksICAgLyogRWNobz8gKi8KICAgICAgICBCUEZfU1RNVChCUEZfUkVUIHwgQlBGX0ssIH4wVSksIC8qIE5vLiBJdCBwYXNzZXMuIFRoaXMgbXVzdCBub3QgaGFwcGVuLiAqLwogICAgICAgIEJQRl9TVE1UKEJQRl9SRVQgfCBCUEZfSywgMCksICAgLyogRWNobyB3aXRoIHdyb25nIGlkZW50LiBSZWplY3QuICovCiAgICB9OwogICAgc3RhdGljIHN0cnVjdCBzb2NrX2Zwcm9nIGZpbHRlciA9IHsKICAgICAgICBzaXplb2YgaW5zbnMgLyBzaXplb2YoaW5zbnNbMF0pLAogICAgICAgIGluc25zCiAgICB9OwogICAgaW50IGlkOwoKICAgIGlmIChvbmNlKQogICAgICAgIHJldHVybjsKICAgIG9uY2UgPSAxOwoKICAgIC8qCiAgICAgKiBQYXRjaCBicGZsZXQgZm9yIGN1cnJlbnQgaWRlbnRpZmllci4gCiAgICAgKi8KICAgIGlkID0gaHRvbnMoICppZGVudCApOwogICAgaW5zbnNbMV0gPQogICAgICAgIChzdHJ1Y3Qgc29ja19maWx0ZXIpIEJQRl9KVU1QKEJQRl9KTVAgfCBCUEZfSkVRIHwgQlBGX0ssCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWQsIDAsIDEpOwoKICAgIGlmIChzZXRzb2Nrb3B0CiAgICAgICAgKGljbXBfc29jaywgU09MX1NPQ0tFVCwgU09fQVRUQUNIX0ZJTFRFUiwgJmZpbHRlciwgc2l6ZW9mKGZpbHRlcikpKQogICAgICAgIHBlcnJvcigiV0FSTklORzogZmFpbGVkIHRvIGluc3RhbGwgc29ja2V0IGZpbHRlclxuIik7Cn0KCgovKgogKiBwcl9hZGRyIC0tCiAqICAgICAgUmV0dXJuIGFuIGFzY2lpIGhvc3QgYWRkcmVzcyBhcyBhIGRvdHRlZCBxdWFkIGFuZCBvcHRpb25hbGx5IHdpdGgKICogYSBob3N0bmFtZS4KICovCnN0YXRpYyBjaGFyICAgICoKcHJfYWRkcihzdHJ1Y3QgaW42X2FkZHIgKmFkZHIsIGludCBvcHRpb25zKQp7CiAgICBzdHJ1Y3QgaG9zdGVudCAqaHAgPSBOVUxMOwoKICAgIGlmICghKG9wdGlvbnMgJiBGX05VTUVSSUMpKQogICAgICAgIGhwID0gbmV0c25tcF9nZXRob3N0YnlhZGRyKChfX3U4ICopIGFkZHIsIHNpemVvZihzdHJ1Y3QgaW42X2FkZHIpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFGX0lORVQ2KTsKCiAgICByZXR1cm4gaHAgPyBocC0+aF9uYW1lIDogcHJfYWRkcl9uKGFkZHIpOwp9CgpzdGF0aWMgY2hhciAgICAqCnByX2FkZHJfbihzdHJ1Y3QgaW42X2FkZHIgKmFkZHIpCnsKICAgIHN0YXRpYyBjaGFyICAgICBzdHJbNjRdOwogICAgaW5ldF9udG9wKEFGX0lORVQ2LCBhZGRyLCBzdHIsIHNpemVvZihzdHIpKTsKICAgIHJldHVybiBzdHI7Cn0K