LyogUG9ydGlvbnMgb2YgdGhpcyBmaWxlIGFyZSBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29weXJpZ2h0KHMpLiAgU2VlCiAqIHRoZSBOZXQtU05NUCdzIENPUFlJTkcgZmlsZSBmb3IgbW9yZSBkZXRhaWxzIGFuZCBvdGhlciBjb3B5cmlnaHRzCiAqIHRoYXQgbWF5IGFwcGx5OgogKi8KLyoKICogUG9ydGlvbnMgb2YgdGhpcyBmaWxlIGFyZSBjb3B5cmlnaHRlZCBieToKICogQ29weXJpZ2h0IKkgMjAwMyBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAqIFVzZSBpcyBzdWJqZWN0IHRvIGxpY2Vuc2UgdGVybXMgc3BlY2lmaWVkIGluIHRoZSBDT1BZSU5HIGZpbGUKICogZGlzdHJpYnV0ZWQgd2l0aCB0aGUgTmV0LVNOTVAgcGFja2FnZS4KICovCgovKi0gVGhpcyBpcyBhIC0qLSBDIC0qLSBjb21wYXRpYmxlIGNvZGUgZmlsZQogKgogKiBDb2RlIGZvciBTVU5PUzVfSU5TVFJVTUVOVEFUSU9OCiAqCiAqIFRoaXMgZmlsZSBjb250YWlucyBpbmNsdWRlcyBvZiBzdGFuZGFyZCBhbmQgbG9jYWwgc3lzdGVtIGhlYWRlciBmaWxlcywKICogaW5jbHVkZXMgb2Ygb3RoZXIgYXBwbGljYXRpb24gaGVhZGVyIGZpbGVzLCBnbG9iYWwgdmFyaWFibGUgZGVmaW5pdGlvbnMsCiAqIHN0YXRpYyB2YXJpYWJsZSBkZWZpbml0aW9ucywgc3RhdGljIGZ1bmN0aW9uIHByb3RvdHlwZXMsIGFuZCBmdW5jdGlvbgogKiBkZWZpbml0aW9ucy4KICoKICogVGhpcyBmaWxlIGNvbnRhaW5zIGZ1bmN0aW9uIHRvIG9idGFpbiBzdGF0aXN0aWNzIGZyb20gU3VuT1MgNS54IGtlcm5lbAogKgogKi8KCiNpbmNsdWRlIDxuZXQtc25tcC9uZXQtc25tcC1jb25maWcuaD4KI2lmZGVmIHNvbGFyaXMyCi8qLQogKiBJbmNsdWRlcyBvZiBzdGFuZGFyZCBBTlNJIEMgaGVhZGVyIGZpbGVzIAogKi8KCiNpbmNsdWRlIDxzdGRpby5oPgojaW5jbHVkZSA8c3RkbGliLmg+CiNpbmNsdWRlIDx1bmlzdGQuaD4KI2luY2x1ZGUgPHN0cmluZy5oPgoKLyotCiAqIEluY2x1ZGVzIG9mIHN5c3RlbSBoZWFkZXIgZmlsZXMgKHdyYXBwZWQgaW4gZHVwbGljYXRlIGluY2x1ZGUgcHJldmVudGlvbikKICovCgojaW5jbHVkZSA8ZmNudGwuaD4KI2luY2x1ZGUgPHN0cm9wdHMuaD4KI2luY2x1ZGUgPHN5cy90eXBlcy5oPgojaW5jbHVkZSA8a3ZtLmg+CiNpbmNsdWRlIDxzeXMvZmNudGwuaD4KI2luY2x1ZGUgPGtzdGF0Lmg+CiNpbmNsdWRlIDxlcnJuby5oPgojaW5jbHVkZSA8dGltZS5oPgojaW5jbHVkZSA8Y3R5cGUuaD4KCiNpbmNsdWRlIDxzeXMvc29ja2lvLmg+CiNpbmNsdWRlIDxzeXMvc29ja2V0Lmg+CiNpbmNsdWRlIDxzeXMvc3RyZWFtLmg+CiNpbmNsdWRlIDxzeXMvc3Ryb3B0cy5oPgojaW5jbHVkZSA8c3lzL3RpaGRyLmg+CiNpbmNsdWRlIDxzeXMvdGl1c2VyLmg+CiNpbmNsdWRlIDxzeXMvZGxwaS5oPgojaW5jbHVkZSA8aW5ldC9jb21tb24uaD4KI2luY2x1ZGUgPGluZXQvbWliMi5oPgojaW5jbHVkZSA8aW5ldC9pcC5oPgojaW5jbHVkZSA8bmV0L2lmLmg+CiNpbmNsdWRlIDxuZXRpbmV0L2luLmg+CgovKi0KICogSW5jbHVkZXMgb2YgbG9jYWwgYXBwbGljYXRpb24gaGVhZGVyIGZpbGVzIAogKi8KCiNpbmNsdWRlIDxuZXQtc25tcC9uZXQtc25tcC1pbmNsdWRlcy5oPgojaW5jbHVkZSA8bmV0LXNubXAvYWdlbnQvbmV0LXNubXAtYWdlbnQtaW5jbHVkZXMuaD4KCiNpbmNsdWRlICJrZXJuZWxfc3Vub3M1LmgiCgprc3RhdF9jdGxfdCAgICAqa3N0YXRfZmQgPSAwOwoKLyotCiAqIEdsb2JhbCB2YXJpYWJsZSBkZWZpbml0aW9ucyAod2l0aCBpbml0aWFsaXphdGlvbikKICovCgovKi0KICogU3RhdGljIHZhcmlhYmxlIGRlZmluaXRpb25zICh3aXRoIGluaXRpYWxpemF0aW9uKQogKi8KCnN0YXRpYwptaWJjYWNoZSAgICAgICAgTWliY2FjaGVbTUlCQ0FDSEVfU0laRSsxXSA9IHsKICAgIHtNSUJfU1lTVEVNLCAwLCAodm9pZCAqKSAtMSwgMCwgMCwgMCwgMH0sCiAgICB7TUlCX0lOVEVSRkFDRVMsIDUwICogc2l6ZW9mKG1pYjJfaWZFbnRyeV90KSwgKHZvaWQgKikgLTEsIDAsIDMwLCAwLAogICAgIDB9LAogICAge01JQl9BVCwgMCwgKHZvaWQgKikgLTEsIDAsIDAsIDAsIDB9LAogICAge01JQl9JUCwgc2l6ZW9mKG1pYjJfaXBfdCksICh2b2lkICopIC0xLCAwLCA2MCwgMCwgMH0sCiAgICB7TUlCX0lQX0FERFIsIDIwICogc2l6ZW9mKG1pYjJfaXBBZGRyRW50cnlfdCksICh2b2lkICopIC0xLCAwLCA2MCwgMCwKICAgICAwfSwKICAgIHtNSUJfSVBfUk9VVEUsIDIwMCAqIHNpemVvZihtaWIyX2lwUm91dGVFbnRyeV90KSwgKHZvaWQgKikgLTEsIDAsIDMwLAogICAgIDAsIDB9LAogICAge01JQl9JUF9ORVQsIDEwMCAqIHNpemVvZihtaWIyX2lwTmV0VG9NZWRpYUVudHJ5X3QpLCAodm9pZCAqKSAtMSwgMCwKICAgICAzMDAsIDAsIDB9LAogICAge01JQl9JQ01QLCBzaXplb2YobWliMl9pY21wX3QpLCAodm9pZCAqKSAtMSwgMCwgNjAsIDAsIDB9LAogICAge01JQl9UQ1AsIHNpemVvZihtaWIyX3RjcF90KSwgKHZvaWQgKikgLTEsIDAsIDYwLCAwLCAwfSwKICAgIHtNSUJfVENQX0NPTk4sIDEwMDAgKiBzaXplb2YobWliMl90Y3BDb25uRW50cnlfdCksICh2b2lkICopIC0xLCAwLCAzMCwKICAgICAwLCAwfSwKICAgIHtNSUJfVURQLCBzaXplb2YobWliMl91ZHBfdCksICh2b2lkICopIC0xLCAwLCAzMCwgMCwgMH0sCiAgICB7TUlCX1VEUF9MSVNURU4sIDEwMDAgKiBzaXplb2YobWliMl91ZHBFbnRyeV90KSwgKHZvaWQgKikgLTEsIDAsIDMwLCAwLAogICAgIDB9LAogICAge01JQl9FR1AsIDAsICh2b2lkICopIC0xLCAwLCAwLCAwLCAwfSwKICAgIHtNSUJfQ01PVCwgMCwgKHZvaWQgKikgLTEsIDAsIDAsIDAsIDB9LAogICAge01JQl9UUkFOU01JU1NJT04sIDAsICh2b2lkICopIC0xLCAwLCAwLCAwLCAwfSwKICAgIHtNSUJfU05NUCwgMCwgKHZvaWQgKikgLTEsIDAsIDAsIDAsIDB9LAojaWZkZWYgU09MQVJJU19IQVZFX0lQVjZfTUlCX1NVUFBPUlQKI2lmZGVmIFNPTEFSSVNfSEFWRV9SRkM0MjkzX1NVUFBPUlQKICAgIHtNSUJfSVBfVFJBRkZJQ19TVEFUUywgMjAgKiBzaXplb2YobWliMl9pcElmU3RhdHNFbnRyeV90KSwgKHZvaWQgKiktMSwgMCwKICAgICAzMCwgMCwgMH0sCiAgICB7TUlCX0lQNiwgMjAgKiBzaXplb2YobWliMl9pcElmU3RhdHNFbnRyeV90KSwgKHZvaWQgKiktMSwgMCwgMzAsIDAsIDB9LAojZWxzZQogICAge01JQl9JUDYsIDIwICogc2l6ZW9mKG1pYjJfaXB2NklmU3RhdHNFbnRyeV90KSwgKHZvaWQgKiktMSwgMCwgMzAsIDAsIDB9LAojZW5kaWYKICAgIHtNSUJfSVA2X0FERFIsIDIwICogc2l6ZW9mKG1pYjJfaXB2NkFkZHJFbnRyeV90KSwgKHZvaWQgKiktMSwgMCwgMzAsIDAsIDB9LAogICAge01JQl9JUDZfUk9VVEUsIDIwMCAqIHNpemVvZihtaWIyX2lwdjZBZGRyRW50cnlfdCksICh2b2lkICopLTEsIDAsIDMwLCAwLCAwfSwKICAgIHtNSUJfSUNNUDYsIDIwICogc2l6ZW9mKG1pYjJfaXB2NklmSWNtcEVudHJ5X3QpLCAodm9pZCAqKS0xLCAwLCAzMCwgMCwgMH0sCiAgICB7TUlCX1RDUDZfQ09OTiwgMTAwMCAqIHNpemVvZihtaWIyX3RjcDZDb25uRW50cnlfdCksICh2b2lkICopIC0xLCAwLCAzMCwKICAgICAwLCAwfSwKICAgIHtNSUJfVURQNl9FTkRQT0lOVCwgMTAwMCAqIHNpemVvZihtaWIyX3VkcDZFbnRyeV90KSwgKHZvaWQgKikgLTEsIDAsIDMwLAogICAgIDAsIDB9LAojZW5kaWYKI2lmZGVmIE1JQjJfU0NUUAogICAge01JQl9TQ1RQLCBzaXplb2YobWliMl9zY3RwX3QpLCAodm9pZCAqKS0xLCAwLCA2MCwgMCwgMH0sCiAgICB7TUlCX1NDVFBfQ09OTiwgc2l6ZW9mKG1pYjJfc2N0cENvbm5FbnRyeV90KSwgKHZvaWQgKiktMSwgMCwgNjAsIDAsIDB9LAogICAge01JQl9TQ1RQX0NPTk5fTE9DQUwsIHNpemVvZihtaWIyX3NjdHBDb25uTG9jYWxFbnRyeV90KSwgKHZvaWQgKiktMSwgMCwKICAgICA2MCwgMCwgMH0sCiAgICB7TUlCX1NDVFBfQ09OTl9SRU1PVEUsIHNpemVvZihtaWIyX3NjdHBDb25uUmVtb3RlRW50cnlfdCksICh2b2lkICopLTEsIDAsCiAgICAgNjAsIDAsIDB9LAojZW5kaWYKICAgIHswfSwKfTsKCnN0YXRpYwptaWJtYXAgICAgICAgICAgTWlibWFwW01JQkNBQ0hFX1NJWkUrMV0gPSB7CiAgICB7TUlCMl9TWVNURU0sIDAsfSwKICAgIHtNSUIyX0lOVEVSRkFDRVMsIDAsfSwKICAgIHtNSUIyX0FULCAwLH0sCiAgICB7TUlCMl9JUCwgMCx9LAogICAge01JQjJfSVAsIE1JQjJfSVBfMjAsfSwKICAgIHtNSUIyX0lQLCBNSUIyX0lQXzIxLH0sCiAgICB7TUlCMl9JUCwgTUlCMl9JUF8yMix9LAogICAge01JQjJfSUNNUCwgMCx9LAogICAge01JQjJfVENQLCAwLH0sCiAgICB7TUlCMl9UQ1AsIE1JQjJfVENQXzEzLH0sCiAgICB7TUlCMl9VRFAsIDAsfSwKICAgIHtNSUIyX1VEUCwgTUlCMl9VRFBfNX0sCiAgICB7TUlCMl9FR1AsIDAsfSwKICAgIHtNSUIyX0NNT1QsIDAsfSwKICAgIHtNSUIyX1RSQU5TTUlTU0lPTiwgMCx9LAogICAge01JQjJfU05NUCwgMCx9LAojaWZkZWYgU09MQVJJU19IQVZFX0lQVjZfTUlCX1NVUFBPUlQKI2lmZGVmIFNPTEFSSVNfSEFWRV9SRkM0MjkzX1NVUFBPUlQKICAgIHtNSUIyX0lQLCBNSUIyX0lQX1RSQUZGSUNfU1RBVFN9LAojZW5kaWYKICAgIHtNSUIyX0lQNiwgMH0sCiAgICB7TUlCMl9JUDYsIE1JQjJfSVA2X0FERFJ9LAogICAge01JQjJfSVA2LCBNSUIyX0lQNl9ST1VURX0sCiAgICB7TUlCMl9JQ01QNiwgMH0sCiAgICB7TUlCMl9UQ1A2LCBNSUIyX1RDUDZfQ09OTn0sCiAgICB7TUlCMl9VRFA2LCBNSUIyX1VEUDZfRU5UUll9LAojZW5kaWYKI2lmZGVmIE1JQjJfU0NUUAogICAge01JQjJfU0NUUCwgMH0sCiAgICB7TUlCMl9TQ1RQLCBNSUIyX1NDVFBfQ09OTn0sCiAgICB7TUlCMl9TQ1RQLCBNSUIyX1NDVFBfQ09OTl9MT0NBTH0sCiAgICB7TUlCMl9TQ1RQLCBNSUIyX1NDVFBfQ09OTl9SRU1PVEV9LAojZW5kaWYKICAgIHswfSwKfTsKCnN0YXRpYyBpbnQgICAgICBzZCA9IC0yOyAgICAgICAgLyogL2Rldi9hcnAgc3RyZWFtIGRlc2NyaXB0b3IuICovCgovKi0KICogU3RhdGljIGZ1bmN0aW9uIHByb3RvdHlwZXMgKHVzZSB2b2lkIGFzIGFyZ3VtZW50IHR5cGUgaWYgdGhlcmUgYXJlIG5vbmUpCiAqLwoKc3RhdGljIGZvdW5kX2UKZ2V0ZW50cnkocmVxX2UgcmVxX3R5cGUsIHZvaWQgKmJ1ZmFkZHIsIHNpemVfdCBsZW4sIHNpemVfdCBlbnRyeXNpemUsCiAgICAgICAgIHZvaWQgKnJlc3AsIGludCAoKmNvbXApKHZvaWQgKiwgdm9pZCAqKSwgdm9pZCAqYXJnKTsKCnN0YXRpYyBpbnQKZ2V0bWliKGludCBncm91cG5hbWUsIGludCBzdWJncm91cG5hbWUsIHZvaWQgKipzdGF0YnVmLCBzaXplX3QgKnNpemUsCiAgICAgICBzaXplX3QgZW50cnlzaXplLCByZXFfZSByZXFfdHlwZSwgdm9pZCAqcmVzcCwgc2l6ZV90ICpsZW5ndGgsCiAgICAgICBpbnQgKCpjb21wKSh2b2lkICosIHZvaWQgKiksIHZvaWQgKmFyZyk7CgpzdGF0aWMgaW50CmdldGlmKG1pYjJfaWZFbnRyeV90ICppZmJ1Ziwgc2l6ZV90IHNpemUsIHJlcV9lIHJlcV90eXBlLCBtaWIyX2lmRW50cnlfdCAqcmVzcCwKICAgICAgc2l6ZV90ICpsZW5ndGgsIGludCAoKmNvbXApKHZvaWQgKiwgdm9pZCAqKSwgdm9pZCAqYXJnKTsKc3RhdGljIHZvaWQgCnNldF9pZl9pbmZvKG1pYjJfaWZFbnRyeV90ICppZnAsIHVuc2lnbmVkIGluZGV4LCBjaGFyICpuYW1lLCB1aW50NjRfdCBmbGFncywKICAgICAgICAgICAgaW50IG10dSk7CnN0YXRpYyBpbnQgZ2V0X2lmX3N0YXRzKG1pYjJfaWZFbnRyeV90ICppZnApOwoKI2lmIGRlZmluZWQoSEFWRV9JRl9OQU1FSU5ERVgpICYmIGRlZmluZWQoTkVUU05NUF9JTkNMVURFX0lGVEFCTEVfUkVXUklURVMpCnN0YXRpYyBpbnQgX2RscGlfb3Blbihjb25zdCBjaGFyICpkZXZuYW1lKTsKc3RhdGljIGludCBfZGxwaV9nZXRfcGh5c19hZGRyZXNzKGludCBmZCwgY2hhciAqcGFkZHIsIGludCBtYXhsZW4sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgKnBhZGRybGVuKTsKc3RhdGljIGludCBfZGxwaV9nZXRfaWZ0eXBlKGludCBmZCwgdW5zaWduZWQgaW50ICppZnR5cGUpOwpzdGF0aWMgaW50IF9kbHBpX2F0dGFjaChpbnQgZmQsIGludCBwcGEpOwpzdGF0aWMgaW50IF9kbHBpX3BhcnNlX2Rldm5hbWUoY2hhciAqZGV2bmFtZSwgaW50ICpwcGFwKTsKI2VuZGlmCgoKCnN0YXRpYyBpbnQKTmFtZV9jbXAodm9pZCAqLCB2b2lkICopOwoKc3RhdGljIHZvaWQKaW5pdF9taWJjYWNoZV9lbGVtZW50KG1pYmNhY2hlICogY3ApOwoKI2RlZmluZQlTVFJFQU1fREVWCSIvZGV2L2FycCIKI2RlZmluZQlCVUZTSVpFCQk0MDk2MCAgIC8qIEJ1ZmZlciBmb3IgIG1lc3NhZ2VzIChzaG91bGQgYmUgbW9kdWxvKHBhZ2VzaXplKSAqLwoKLyotCiAqIEZ1bmN0aW9uIGRlZmluaXRpb25zCiAqLwoKI2lmZGVmIF9TVERDX0NPTVBBVAojaWZkZWYgX19jcGx1c3BsdXMKZXh0ZXJuICAgICAgICAgICJDIiB7CiNlbmRpZgojZW5kaWYKCi8qCiAqIEkgcHJvZmlsZWQgc25tcGQgdXNpbmcgUXVhbnRpZnkgb24gYSBTb2xhcmlzIDcgYm94LCBhbmQgaXQgdHVybmVkIG91dCB0aGF0CiAqIHRoZSBjYWxscyB0byB0aW1lKCkgaW4gZ2V0TWlic3RhdCgpIHdlcmUgdGFraW5nIDE4JSBvZiB0aGUgdG90YWwgZXhlY3V0aW9uCiAqIHRpbWUgb2Ygc25tcGQgd2hlbiBkb2luZyBzaW1wbGUgd2Fsa3Mgb3ZlciB0aGUgd2hvbGUgdHJlZS4gIEkgZ3Vlc3MgaXQgbXVzdAogKiBiZSBkaWZmaWN1bHQgZm9yIFN1biBoYXJkd2FyZSB0byB0ZWxsIHRoZSB0aW1lIG9yIHNvbWV0aGluZyA7LSkuICBBbnl3YXksCiAqIHRoaXMgc2VlbWVkIGxpa2UgaXQgd2FzIG5lZ2F0aW5nIHRoZSBwb2ludCBvZiBoYXZpbmcgdGhlIGNhY2hlLCBzbyBJIGhhdmUKICogY2hhbmdlZCB0aGUgY29kZSBzbyB0aGF0IGl0IHJ1bnMgYSBwZXJpb2RpYyBhbGFybSB0byBhZ2UgdGhlIGNhY2hlIGVudHJpZXMKICogaW5zdGVhZC4gIFRoZSBtZWFuaW5nIG9mIHRoZSBjYWNoZV90dGwgYW5kIGNhY2hlX3RpbWUgbWVtYmVycyBoYXMgY2hhbmdlZCB0bwogKiBzdXBwb3J0IHRoaXMuICBjYWNoZV90dGwgaXMgbm93IHRoZSB2YWx1ZSB0aGF0IGNhY2hlX3RpbWUgZ2V0cyByZXNldCB0byB3aGVuCiAqIHdlIGZldGNoIGEgdmFsdWUgZnJvbSB0aGUga2VybmVsOyBjYWNoZV90aW1lIHRoZW4gdGlja3MgZG93biB0byB6ZXJvIGluCiAqIHN0ZXBzIG9mIHBlcmlvZCAoc2VlIGJlbG93KS4gIFdoZW4gaXQgcmVhY2hlcyB6ZXJvLCB0aGUgY2FjaGUgZW50cnkgaXMgbm8KICogbG9uZ2VyIHZhbGlkIGFuZCB3ZSBmZXRjaCBhIG5ldyBvbmUuICBUaGUgZWZmZWN0IG9mIHRoaXMgaXMgdGhlIHNhbWUgYXMgdGhlCiAqIHByZXZpb3VzIGNvZGUsIGJ1dCBtb3JlIGVmZmljaWVudCAoYmVjYXVzZSBpdCdzIG5vdCBjYWxsaW5nIHRpbWUoKSBmb3IgZXZlcnkKICogdmFyaWFibGUgZmV0Y2hlZCkgd2hlbiB5b3UgYXJlIHdhbGtpbmcgdGhlIHRhYmxlcy4gIGpicG4sIDIwMDIwMjI2LgogKi8KCnN0YXRpYyB2b2lkCmtlcm5lbF9zdW5vczVfY2FjaGVfYWdlKHVuc2lnbmVkIGludCByZWdudW1iZXIsIHZvaWQgKmRhdGEpCnsKICAgIGludCBpID0gMCwgcGVyaW9kID0gKGludClkYXRhOwoKICAgIGZvciAoaSA9IDA7IGkgPCBNSUJDQUNIRV9TSVpFOyBpKyspIHsKCURFQlVHTVNHVEwoKCJrZXJuZWxfc3Vub3M1IiwgImNhY2hlWyVkXSB0aW1lICVsZCB0dGwgJWRcbiIsIGksCgkJICAgIE1pYmNhY2hlW2ldLmNhY2hlX3RpbWUsIChpbnQpTWliY2FjaGVbaV0uY2FjaGVfdHRsKSk7CglpZiAoTWliY2FjaGVbaV0uY2FjaGVfdGltZSA8IHBlcmlvZCkgewoJICAgIE1pYmNhY2hlW2ldLmNhY2hlX3RpbWUgPSAwOwoJfSBlbHNlIHsKCSAgICBNaWJjYWNoZVtpXS5jYWNoZV90aW1lIC09IHBlcmlvZDsKCX0KICAgIH0KfQoKdm9pZAppbml0X2tlcm5lbF9zdW5vczUodm9pZCkKewogICAgc3RhdGljIGludCBjcmVnICAgPSAwOwogICAgY29uc3QgIGludCBwZXJpb2QgPSAzMDsKICAgIGludCAgICBhbGFybV9pZCAgID0gMDsKCiAgICBpZiAoY3JlZyA9PSAwKSB7CglhbGFybV9pZCA9IHNubXBfYWxhcm1fcmVnaXN0ZXIoNSwgTlVMTCwga2VybmVsX3N1bm9zNV9jYWNoZV9hZ2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwpOwoJREVCVUdNU0dUTCgoImtlcm5lbF9zdW5vczUiLCAicmVnaXN0ZXJlZCBhbGFybSAlZCB3aXRoIHBlcmlvZCA1c1xuIiwgCgkJICAgIGFsYXJtX2lkKSk7CglhbGFybV9pZCA9IHNubXBfYWxhcm1fcmVnaXN0ZXIocGVyaW9kLCBTQV9SRVBFQVQsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrZXJuZWxfc3Vub3M1X2NhY2hlX2FnZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHZvaWQgKilwZXJpb2QpOwoJREVCVUdNU0dUTCgoImtlcm5lbF9zdW5vczUiLCAicmVnaXN0ZXJlZCBhbGFybSAlZCB3aXRoIHBlcmlvZCAlZHNcbiIsIAoJCSAgICBhbGFybV9pZCwgcGVyaW9kKSk7CiAgICAgICAgKytjcmVnOwogICAgfQp9CgovKgogKiBHZXQgdmFyaW91cyBrZXJuZWwgc3RhdGlzdGljcyB1c2luZyB1bmRvY3VtZW50ZWQgU29sYXJpcyBrc3RhdCBpbnRlcmZhY2UuCiAqIFdlIG5lZWQgaXQgbWFpbmx5IGZvciBnZXR0aW5nIG5ldHdvcmsgaW50ZXJmYWNlIHN0YXRpc3RpY3MsIGFsdGhvdWdoIGl0IGlzCiAqIGdlbmVyaWMgZW5vdWdoIHRvIGJlIHVzZWQgZm9yIGFueSBwdXJwb3NlLiAgSXQga25vd3MgYWJvdXQga3N0YXRfaGVhZGVycwogKiBtb2R1bGUgbmFtZXMgYW5kIGJ5IHRoZSBuYW1lIG9mIHRoZSBzdGF0aXN0aWNzIGl0IHRyaWVzIHRvIGZpZ3VyZSBvdXQgdGhlCiAqIHJlc3Qgb2YgbmVjZXNzYXJ5IGluZm9ybWF0aW9uLiAgUmV0dXJucyAwIGluIGNhc2Ugb2Ygc3VjY2VzcyBhbmQgPCAwIGlmCiAqIHRoZXJlIHdlcmUgYW55IGVycm9ycy4KIAogKiAKICogTk9URTogVG8gdXNlIHRoaXMgZnVuY3Rpb24gY29ycmVjdGx5IHlvdSBoYXZlIHRvIGtub3cgdGhlIGFjdHVhbCB0eXBlIG9mIHRoZQogKiB2YWx1ZSB0byBiZSByZXR1cm5lZCwgc28geW91IG1heSBidWlsZCB0aGUgdGVzdCBwcm9ncmFtLCBmaWd1cmUgb3V0IHRoZSB0eXBlCiAqIGFuZCB1c2UgaXQuIEV4cG9zaW5nIGtzdGF0IGRhdGEgdHlwZXMgdG8gdXBwZXIgbGF5ZXJzIGRvZXNuJ3Qgc2VlbSB0byBiZQogKiByZWFzb25hYmxlLiBJbiBhbnkgY2FzZSBJJ2QgZXhwZWN0IG1vcmUgcmVhc29uYWJsZSBrc3RhdCBpbnRlcmZhY2UuIDotKAogKi8KCgppbnQKZ2V0S3N0YXRJbnQoY29uc3QgY2hhciAqY2xhc3NuYW1lLCBjb25zdCBjaGFyICpzdGF0bmFtZSwgCgkgICAgY29uc3QgY2hhciAqdmFybmFtZSwgaW50ICp2YWx1ZSkKewogICAga3N0YXRfY3RsX3QgICAgKmtzYzsKICAgIGtzdGF0X3QgICAgICAgICprczsKICAgIGtpZF90ICAgICAgICAgICBraWQ7CiAgICBrc3RhdF9uYW1lZF90ICAqbmFtZWQ7CiAgICBpbnQgICAgICAgICAgICAgcmV0ID0gLTE7ICAgICAgICAvKiBmYWlsIHVubGVzcyAuLi4gKi8KCiAgICBpZiAoa3N0YXRfZmQgPT0gMCkgewoJa3N0YXRfZmQgPSBrc3RhdF9vcGVuKCk7CglpZiAoa3N0YXRfZmQgPT0gMCkgewoJICAgIHNubXBfbG9nX3BlcnJvcigia3N0YXRfb3BlbiIpOwoJfQogICAgfQogICAgaWYgKChrc2MgPSBrc3RhdF9mZCkgPT0gTlVMTCkgewoJZ290byBSZXR1cm47CiAgICB9CiAgICBrcyA9IGtzdGF0X2xvb2t1cChrc2MsIGNsYXNzbmFtZSwgLTEsIHN0YXRuYW1lKTsKICAgIGlmIChrcyA9PSBOVUxMKSB7CglERUJVR01TR1RMKCgia2VybmVsX3N1bm9zNSIsICJjbGFzcyAlcywgc3RhdCAlcyBub3QgZm91bmRcbiIsCgkJY2xhc3NuYW1lID8gY2xhc3NuYW1lIDogIk5VTEwiLAoJCXN0YXRuYW1lID8gc3RhdG5hbWUgOiAiTlVMTCIpKTsKCWdvdG8gUmV0dXJuOwogICAgfQogICAga2lkID0ga3N0YXRfcmVhZChrc2MsIGtzLCBOVUxMKTsKICAgIGlmIChraWQgPT0gLTEpIHsKCURFQlVHTVNHVEwoKCJrZXJuZWxfc3Vub3M1IiwgImNhbm5vdCByZWFkIGNsYXNzICVzIHN0YXRzICVzXG4iLAoJCWNsYXNzbmFtZSA/IGNsYXNzbmFtZSA6ICJOVUxMIiwgc3RhdG5hbWUgPyBzdGF0bmFtZSA6ICJOVUxMIikpOwoJZ290byBSZXR1cm47CiAgICB9CiAgICBuYW1lZCA9IGtzdGF0X2RhdGFfbG9va3VwKGtzLCB2YXJuYW1lKTsKICAgIGlmIChuYW1lZCA9PSBOVUxMKSB7CglERUJVR01TR1RMKCgia2VybmVsX3N1bm9zNSIsICJubyB2YXIgJXMgZm9yIGNsYXNzICVzIHN0YXQgJXNcbiIsCgkJdmFybmFtZSwgY2xhc3NuYW1lID8gY2xhc3NuYW1lIDogIk5VTEwiLAoJCXN0YXRuYW1lID8gc3RhdG5hbWUgOiAiTlVMTCIpKTsKCWdvdG8gUmV0dXJuOwogICAgfQoKICAgIHJldCA9IDA7ICAgICAgICAgICAgICAgIC8qIG1heWJlIHN1Y2Nlc3NmdWwgKi8KICAgIHN3aXRjaCAobmFtZWQtPmRhdGFfdHlwZSkgewojaWZkZWYgS1NUQVRfREFUQV9JTlQzMiAgICAgICAgIC8qIFNvbGFyaXMgMi42IGFuZCB1cCAqLwogICAgY2FzZSBLU1RBVF9EQVRBX0lOVDMyOgoJKnZhbHVlID0gbmFtZWQtPnZhbHVlLmkzMjsKCWJyZWFrOwogICAgY2FzZSBLU1RBVF9EQVRBX1VJTlQzMjoKCSp2YWx1ZSA9IG5hbWVkLT52YWx1ZS51aTMyOwoJYnJlYWs7CiAgICBjYXNlIEtTVEFUX0RBVEFfSU5UNjQ6CgkqdmFsdWUgPSBuYW1lZC0+dmFsdWUuaTY0OwoJYnJlYWs7CiAgICBjYXNlIEtTVEFUX0RBVEFfVUlOVDY0OgoJKnZhbHVlID0gbmFtZWQtPnZhbHVlLnVpNjQ7CglicmVhazsKI2Vsc2UKICAgIGNhc2UgS1NUQVRfREFUQV9MT05HOgoJKnZhbHVlID0gbmFtZWQtPnZhbHVlLmw7CglicmVhazsKICAgIGNhc2UgS1NUQVRfREFUQV9VTE9ORzoKCSp2YWx1ZSA9IG5hbWVkLT52YWx1ZS51bDsKCWJyZWFrOwogICAgY2FzZSBLU1RBVF9EQVRBX0xPTkdMT05HOgoJKnZhbHVlID0gbmFtZWQtPnZhbHVlLmxsOwoJYnJlYWs7CiAgICBjYXNlIEtTVEFUX0RBVEFfVUxPTkdMT05HOgoJKnZhbHVlID0gbmFtZWQtPnZhbHVlLnVsbDsKCWJyZWFrOwojZW5kaWYKICAgIGRlZmF1bHQ6Cglzbm1wX2xvZyhMT0dfRVJSLAoJCSJub24taW50IHR5cGUgaW4ga3N0YXQgZGF0YTogXCIlc1wiIFwiJXNcIiBcIiVzXCIgJWRcbiIsCgkJY2xhc3NuYW1lID8gY2xhc3NuYW1lIDogIk5VTEwiLAoJCXN0YXRuYW1lID8gc3RhdG5hbWUgOiAiTlVMTCIsCgkJdmFybmFtZSA/IHZhcm5hbWUgOiAiTlVMTCIsIG5hbWVkLT5kYXRhX3R5cGUpOwoJcmV0ID0gLTE7ICAgICAgICAgICAgLyogZmFpbCAqLwoJYnJlYWs7CiAgICB9CiBSZXR1cm46CiAgICByZXR1cm4gcmV0Owp9CgppbnQKZ2V0S3N0YXQoY29uc3QgY2hhciAqc3RhdG5hbWUsIGNvbnN0IGNoYXIgKnZhcm5hbWUsIHZvaWQgKnZhbHVlKQp7CiAgICBrc3RhdF9jdGxfdCAgICAqa3NjOwogICAga3N0YXRfdCAgICAgICAgKmtzLCAqa3N0YXRfZGF0YTsKICAgIGtzdGF0X25hbWVkX3QgICpkOwogICAgdWludF90ICAgICAgICAgIGk7CiAgICBpbnQgICAgICAgICAgICAgaW5zdGFuY2UgPSAwOwogICAgY2hhciAgICAgICAgICAgIG1vZHVsZV9uYW1lWzY0XTsKICAgIGludCAgICAgICAgICAgICByZXQ7CiAgICB1X2xvbmdsb25nX3QgICAgdmFsOyAgICAvKiBUaGUgbGFyZ2VzdCB2YWx1ZSAqLwogICAgdm9pZCAgICAgICAgICAgKnY7CiAgICBzdGF0aWMgY2hhciAgICBidWZbMTI4XTsKCiAgICBpZiAodmFsdWUgPT0gTlVMTCkgeyAgICAgIC8qIFByZXR0eSB1c2VsZXNzIGJ1dCAuLi4gKi8KCXYgPSAodm9pZCAqKSAmdmFsOwogICAgfSBlbHNlIHsKCXYgPSB2YWx1ZTsKICAgIH0KCiAgICBpZiAoa3N0YXRfZmQgPT0gMCkgewoJa3N0YXRfZmQgPSBrc3RhdF9vcGVuKCk7CglpZiAoa3N0YXRfZmQgPT0gMCkgewoJICAgIHNubXBfbG9nX3BlcnJvcigia3N0YXRfb3BlbiIpOwoJfQogICAgfQogICAgaWYgKChrc2MgPSBrc3RhdF9mZCkgPT0gTlVMTCkgewoJcmV0ID0gLTEwOwoJZ290byBSZXR1cm47ICAgICAgICAvKiBrc3RhdCBlcnJvcnMgKi8KICAgIH0KICAgIGlmIChzdGF0bmFtZSA9PSBOVUxMIHx8IHZhcm5hbWUgPT0gTlVMTCkgewoJcmV0ID0gLTIwOwoJZ290byBSZXR1cm47CiAgICB9CgogICAgLyoKICAgICAqIEZpcnN0LCBnZXQgImtzdGF0X2hlYWRlcnMiIHN0YXRpc3RpY3MuIEl0IHNob3VsZAogICAgICogY29udGFpbiBhbGwgYXZhaWxhYmxlIG1vZHVsZXMuIAogICAgICovCgogICAgaWYgKChrcyA9IGtzdGF0X2xvb2t1cChrc2MsICJ1bml4IiwgMCwgImtzdGF0X2hlYWRlcnMiKSkgPT0gTlVMTCkgewoJcmV0ID0gLTEwOwoJZ290byBSZXR1cm47ICAgICAgICAvKiBrc3RhdCBlcnJvcnMgKi8KICAgIH0KICAgIGlmIChrc3RhdF9yZWFkKGtzYywga3MsIE5VTEwpIDw9IDApIHsKCXJldCA9IC0xMDsKCWdvdG8gUmV0dXJuOyAgICAgICAgLyoga3N0YXQgZXJyb3JzICovCiAgICB9CiAgICBrc3RhdF9kYXRhID0ga3MtPmtzX2RhdGE7CiAgICAKICAgIC8qCiAgICAgKiBOb3csIGxvb2sgZm9yIHRoZSBuYW1lIG9mIG91ciBzdGF0IGluIHRoZSBoZWFkZXJzIGJ1ZiAKICAgICAqLwogICAgZm9yIChpID0gMDsgaSA8IGtzLT5rc19uZGF0YTsgaSsrKSB7CglERUJVR01TR1RMKCgia2VybmVsX3N1bm9zNSIsCgkJICAgICJtb2R1bGU6ICVzIGluc3RhbmNlOiAlZCBuYW1lOiAlcyBjbGFzczogJXMgdHlwZTogJWQgZmxhZ3M6ICV4XG4iLAoJCSAgICBrc3RhdF9kYXRhW2ldLmtzX21vZHVsZSwga3N0YXRfZGF0YVtpXS5rc19pbnN0YW5jZSwKCQkgICAga3N0YXRfZGF0YVtpXS5rc19uYW1lLCBrc3RhdF9kYXRhW2ldLmtzX2NsYXNzLAoJCSAgICBrc3RhdF9kYXRhW2ldLmtzX3R5cGUsIGtzdGF0X2RhdGFbaV0ua3NfZmxhZ3MpKTsKCWlmIChzdHJjbXAoc3RhdG5hbWUsIGtzdGF0X2RhdGFbaV0ua3NfbmFtZSkgPT0gMCkgewoJICAgIHN0cmNweShtb2R1bGVfbmFtZSwga3N0YXRfZGF0YVtpXS5rc19tb2R1bGUpOwoJICAgIGluc3RhbmNlID0ga3N0YXRfZGF0YVtpXS5rc19pbnN0YW5jZTsKCSAgICBicmVhazsKCX0KICAgIH0KICAgIAogICAgaWYgKGkgPT0ga3MtPmtzX25kYXRhKSB7CglyZXQgPSAtMTsKCWdvdG8gUmV0dXJuOyAgICAgICAgLyogTm90IGZvdW5kICovCiAgICB9CiAgICAKICAgIC8qCiAgICAgKiBHZXQgdGhlIG5hbWVkIHN0YXRpc3RpY3MgCiAgICAgKi8KICAgIGlmICgoa3MgPSBrc3RhdF9sb29rdXAoa3NjLCBtb2R1bGVfbmFtZSwgaW5zdGFuY2UsIHN0YXRuYW1lKSkgPT0gTlVMTCkgewoJcmV0ID0gLTEwOwoJZ290byBSZXR1cm47ICAgICAgICAvKiBrc3RhdCBlcnJvcnMgKi8KICAgIH0KCiAgICBpZiAoa3N0YXRfcmVhZChrc2MsIGtzLCBOVUxMKSA8PSAwKSB7CglyZXQgPSAtMTA7Cglnb3RvIFJldHVybjsgICAgICAgIC8qIGtzdGF0IGVycm9ycyAqLwogICAgfQogICAgLyoKICAgICAqIFRoaXMgZnVuY3Rpb24gZXhwZWN0cyBvbmx5IG5hbWUvdmFsdWUgdHlwZSBvZiBzdGF0aXN0aWNzLCBzbyBpZiBpdCBpcwogICAgICogbm90IHRoZSBjYXNlIHJldHVybiBhbiBlcnJvcgogICAgICovCiAgICBpZiAoa3MtPmtzX3R5cGUgIT0gS1NUQVRfVFlQRV9OQU1FRCkgewoJcmV0ID0gLTI7Cglnb3RvIFJldHVybjsgICAgICAgIC8qIEludmFsaWQgc3RhdCB0eXBlICovCiAgICB9CiAgICAKICAgIGZvciAoaSA9IDAsIGQgPSBLU1RBVF9OQU1FRF9QVFIoa3MpOyBpIDwga3MtPmtzX25kYXRhOyBpKyssIGQrKykgewoJREVCVUdNU0dUTCgoImtlcm5lbF9zdW5vczUiLCAidmFyaWFibGU6IFwiJXNcIiAodHlwZSAlZClcbiIsIAoJCSAgICBkLT5uYW1lLCBkLT5kYXRhX3R5cGUpKTsKCglpZiAoc3RyY21wKGQtPm5hbWUsIHZhcm5hbWUpID09IDApIHsKCSAgICBzd2l0Y2ggKGQtPmRhdGFfdHlwZSkgewoJICAgIGNhc2UgS1NUQVRfREFUQV9DSEFSOgoJCURFQlVHTVNHVEwoKCJrZXJuZWxfc3Vub3M1IiwgInZhbHVlOiAlc1xuIiwgZC0+dmFsdWUuYykpOwoJCSooY2hhciAqKil2ID0gYnVmOwoJCXN0cmxjcHkoYnVmLCBkLT52YWx1ZS5jLCBzaXplb2YoYnVmKSk7CgkJYnJlYWs7CiNpZmRlZiBLU1RBVF9EQVRBX0lOVDMyICAgICAgICAgLyogU29sYXJpcyAyLjYgYW5kIHVwICovCgkgICAgY2FzZSBLU1RBVF9EQVRBX0lOVDMyOgoJCSooQ291bnRlciAqKXYgPSBkLT52YWx1ZS5pMzI7CgkJREVCVUdNU0dUTCgoImtlcm5lbF9zdW5vczUiLCAidmFsdWU6ICVkXG4iLCBkLT52YWx1ZS5pMzIpKTsKCQlicmVhazsKCSAgICBjYXNlIEtTVEFUX0RBVEFfVUlOVDMyOgoJCSooQ291bnRlciAqKXYgPSBkLT52YWx1ZS51aTMyOwoJCURFQlVHTVNHVEwoKCJrZXJuZWxfc3Vub3M1IiwgInZhbHVlOiAldVxuIiwgZC0+dmFsdWUudWkzMikpOwoJCWJyZWFrOwoJICAgIGNhc2UgS1NUQVRfREFUQV9JTlQ2NDoKCQkqKGludDY0X3QgKil2ID0gZC0+dmFsdWUuaTY0OwoJCURFQlVHTVNHVEwoKCJrZXJuZWxfc3Vub3M1IiwgInZhbHVlOiAlbGRcbiIsIChsb25nKWQtPnZhbHVlLmk2NCkpOwoJCWJyZWFrOwoJICAgIGNhc2UgS1NUQVRfREFUQV9VSU5UNjQ6CgkJKih1aW50NjRfdCAqKXYgPSBkLT52YWx1ZS51aTY0OwoJCURFQlVHTVNHVEwoKCJrZXJuZWxfc3Vub3M1IiwgInZhbHVlOiAlbHVcbiIsICh1bnNpZ25lZCBsb25nKWQtPnZhbHVlLnVpNjQpKTsKCQlicmVhazsKI2Vsc2UKCSAgICBjYXNlIEtTVEFUX0RBVEFfTE9ORzoKCQkqKENvdW50ZXIgKil2ID0gZC0+dmFsdWUubDsKCQlERUJVR01TR1RMKCgia2VybmVsX3N1bm9zNSIsICJ2YWx1ZTogJWxkXG4iLCBkLT52YWx1ZS5sKSk7CgkJYnJlYWs7CgkgICAgY2FzZSBLU1RBVF9EQVRBX1VMT05HOgoJCSooQ291bnRlciAqKXYgPSBkLT52YWx1ZS51bDsKCQlERUJVR01TR1RMKCgia2VybmVsX3N1bm9zNSIsICJ2YWx1ZTogJWx1XG4iLCBkLT52YWx1ZS51bCkpOwoJCWJyZWFrOwoJICAgIGNhc2UgS1NUQVRfREFUQV9MT05HTE9ORzoKCQkqKENvdW50ZXIgKil2ID0gZC0+dmFsdWUubGw7CgkJREVCVUdNU0dUTCgoImtlcm5lbF9zdW5vczUiLCAidmFsdWU6ICVsbGRcbiIsCgkJCSAgICAobG9uZylkLT52YWx1ZS5sbCkpOwoJCWJyZWFrOwoJICAgIGNhc2UgS1NUQVRfREFUQV9VTE9OR0xPTkc6CgkJKihDb3VudGVyICopdiA9IGQtPnZhbHVlLnVsbDsKCQlERUJVR01TR1RMKCgia2VybmVsX3N1bm9zNSIsICJ2YWx1ZTogJWxsdVxuIiwKCQkJICAgICh1bnNpZ25lZCBsb25nKWQtPnZhbHVlLnVsbCkpOwoJCWJyZWFrOwojZW5kaWYKCSAgICBjYXNlIEtTVEFUX0RBVEFfRkxPQVQ6CgkJKihmbG9hdCAqKXYgPSBkLT52YWx1ZS5mOwoJCURFQlVHTVNHVEwoKCJrZXJuZWxfc3Vub3M1IiwgInZhbHVlOiAlZlxuIiwgZC0+dmFsdWUuZikpOwoJCWJyZWFrOwoJICAgIGNhc2UgS1NUQVRfREFUQV9ET1VCTEU6CgkJKihkb3VibGUgKil2ID0gZC0+dmFsdWUuZDsKCQlERUJVR01TR1RMKCgia2VybmVsX3N1bm9zNSIsICJ2YWx1ZTogJWZcbiIsIGQtPnZhbHVlLmQpKTsKCQlicmVhazsKCSAgICBkZWZhdWx0OgoJCURFQlVHTVNHVEwoKCJrZXJuZWxfc3Vub3M1IiwKCQkJICAgICJVTktOT1dOIFRZUEUgJWQgKHN0YXQgXCIlc1wiIHZhciBcIiVzXCIpXG4iLAoJCQkgICAgZC0+ZGF0YV90eXBlLCBzdGF0bmFtZSwgdmFybmFtZSkpOwoJCXJldCA9IC0zOwoJCWdvdG8gUmV0dXJuOyAgICAgICAgLyogSW52YWxpZCBkYXRhIHR5cGUgKi8KCSAgICB9CgkgICAgcmV0ID0gMDsgICAgICAgIC8qIFN1Y2Nlc3MgICovCgkgICAgZ290byBSZXR1cm47Cgl9CiAgICB9CiAgICByZXQgPSAtNDsgICAgICAgICAgICAgICAvKiBOYW1lIG5vdCBmb3VuZCAqLwogUmV0dXJuOgogICAgcmV0dXJuIHJldDsKfQoKaW50CmdldEtzdGF0U3RyaW5nKGNvbnN0IGNoYXIgKnN0YXRuYW1lLCBjb25zdCBjaGFyICp2YXJuYW1lLAogICAgICAgICAgICAgICBjaGFyICp2YWx1ZSwgc2l6ZV90IHZhbHVlX2xlbikKewogICAga3N0YXRfY3RsX3QgICAgKmtzYzsKICAgIGtzdGF0X3QgICAgICAgICprcywgKmtzdGF0X2RhdGE7CiAgICBrc3RhdF9uYW1lZF90ICAqZDsKICAgIHNpemVfdCAgICAgICAgICBpLCBpbnN0YW5jZSA9IDA7CiAgICBjaGFyICAgICAgICAgICAgbW9kdWxlX25hbWVbNjRdOwogICAgaW50ICAgICAgICAgICAgIHJldDsKCiAgICBpZiAoa3N0YXRfZmQgPT0gMCkgewogICAgICAgIGtzdGF0X2ZkID0ga3N0YXRfb3BlbigpOwogICAgICAgIGlmIChrc3RhdF9mZCA9PSAwKSB7CiAgICAgICAgICAgIHNubXBfbG9nX3BlcnJvcigia3N0YXRfb3BlbiIpOwogICAgICAgIH0KICAgIH0KICAgIGlmICgoa3NjID0ga3N0YXRfZmQpID09IE5VTEwpIHsKICAgICAgICByZXQgPSAtMTA7CiAgICAgICAgZ290byBSZXR1cm47ICAgICAgICAvKiBrc3RhdCBlcnJvcnMgKi8KICAgIH0KICAgIGlmIChzdGF0bmFtZSA9PSBOVUxMIHx8IHZhcm5hbWUgPT0gTlVMTCkgewogICAgICAgIHJldCA9IC0yMDsKICAgICAgICBnb3RvIFJldHVybjsKICAgIH0KCiAgICAvKgogICAgICogRmlyc3QsIGdldCAia3N0YXRfaGVhZGVycyIgc3RhdGlzdGljcy4gSXQgc2hvdWxkCiAgICAgKiBjb250YWluIGFsbCBhdmFpbGFibGUgbW9kdWxlcy4KICAgICAqLwoKICAgIGlmICgoa3MgPSBrc3RhdF9sb29rdXAoa3NjLCAidW5peCIsIDAsICJrc3RhdF9oZWFkZXJzIikpID09IE5VTEwpIHsKICAgICAgICByZXQgPSAtMTA7CiAgICAgICAgZ290byBSZXR1cm47ICAgICAgICAvKiBrc3RhdCBlcnJvcnMgKi8KICAgIH0KICAgIGlmIChrc3RhdF9yZWFkKGtzYywga3MsIE5VTEwpIDw9IDApIHsKICAgICAgICByZXQgPSAtMTA7CiAgICAgICAgZ290byBSZXR1cm47ICAgICAgICAvKiBrc3RhdCBlcnJvcnMgKi8KICAgIH0KICAgIGtzdGF0X2RhdGEgPSBrcy0+a3NfZGF0YTsKCiAgICAvKgogICAgICogTm93LCBsb29rIGZvciB0aGUgbmFtZSBvZiBvdXIgc3RhdCBpbiB0aGUgaGVhZGVycyBidWYKICAgICAqLwogICAgZm9yIChpID0gMDsgaSA8IGtzLT5rc19uZGF0YTsgaSsrKSB7CiAgICAgICAgREVCVUdNU0dUTCgoImtlcm5lbF9zdW5vczUiLAogICAgICAgICAgICAgICAgICAgICJtb2R1bGU6ICVzIGluc3RhbmNlOiAlZCBuYW1lOiAlcyBjbGFzczogJXMgdHlwZTogJWQgZmxhZ3M6ICV4XG4iLAogICAgICAgICAgICAgICAgICAgIGtzdGF0X2RhdGFbaV0ua3NfbW9kdWxlLCBrc3RhdF9kYXRhW2ldLmtzX2luc3RhbmNlLAogICAgICAgICAgICAgICAgICAgIGtzdGF0X2RhdGFbaV0ua3NfbmFtZSwga3N0YXRfZGF0YVtpXS5rc19jbGFzcywKICAgICAgICAgICAgICAgICAgICBrc3RhdF9kYXRhW2ldLmtzX3R5cGUsIGtzdGF0X2RhdGFbaV0ua3NfZmxhZ3MpKTsKICAgICAgICBpZiAoc3RyY21wKHN0YXRuYW1lLCBrc3RhdF9kYXRhW2ldLmtzX25hbWUpID09IDApIHsKICAgICAgICAgICAgc3RyY3B5KG1vZHVsZV9uYW1lLCBrc3RhdF9kYXRhW2ldLmtzX21vZHVsZSk7CiAgICAgICAgICAgIGluc3RhbmNlID0ga3N0YXRfZGF0YVtpXS5rc19pbnN0YW5jZTsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgfQogICAgfQoKICAgIGlmIChpID09IGtzLT5rc19uZGF0YSkgewogICAgICAgIHJldCA9IC0xOwogICAgICAgIGdvdG8gUmV0dXJuOyAgICAgICAgLyogTm90IGZvdW5kICovCiAgICB9CgogICAgLyoKICAgICAqIEdldCB0aGUgbmFtZWQgc3RhdGlzdGljcwogICAgICovCiAgICBpZiAoKGtzID0ga3N0YXRfbG9va3VwKGtzYywgbW9kdWxlX25hbWUsIGluc3RhbmNlLCBzdGF0bmFtZSkpID09IE5VTEwpIHsKICAgICAgICByZXQgPSAtMTA7CiAgICAgICAgZ290byBSZXR1cm47ICAgICAgICAvKiBrc3RhdCBlcnJvcnMgKi8KICAgIH0KCiAgICBpZiAoa3N0YXRfcmVhZChrc2MsIGtzLCBOVUxMKSA8PSAwKSB7CiAgICAgICAgcmV0ID0gLTEwOwogICAgICAgIGdvdG8gUmV0dXJuOyAgICAgICAgLyoga3N0YXQgZXJyb3JzICovCiAgICB9CiAgICAvKgogICAgICogVGhpcyBmdW5jdGlvbiBleHBlY3RzIG9ubHkgbmFtZS92YWx1ZSB0eXBlIG9mIHN0YXRpc3RpY3MsIHNvIGlmIGl0IGlzCiAgICAgKiBub3QgdGhlIGNhc2UgcmV0dXJuIGFuIGVycm9yCiAgICAgKi8KICAgIGlmIChrcy0+a3NfdHlwZSAhPSBLU1RBVF9UWVBFX05BTUVEKSB7CiAgICAgICAgcmV0ID0gLTI7CiAgICAgICAgZ290byBSZXR1cm47ICAgICAgICAvKiBJbnZhbGlkIHN0YXQgdHlwZSAqLwogICAgfQoKICAgIGZvciAoaSA9IDAsIGQgPSBLU1RBVF9OQU1FRF9QVFIoa3MpOyBpIDwga3MtPmtzX25kYXRhOyBpKyssIGQrKykgewogICAgICAgIERFQlVHTVNHVEwoKCJrZXJuZWxfc3Vub3M1IiwgInZhcmlhYmxlOiBcIiVzXCIgKHR5cGUgJWQpXG4iLAogICAgICAgICAgICAgICAgICAgIGQtPm5hbWUsIGQtPmRhdGFfdHlwZSkpOwoKICAgICAgICBpZiAoc3RyY21wKGQtPm5hbWUsIHZhcm5hbWUpID09IDApIHsKICAgICAgICAgICAgc3dpdGNoIChkLT5kYXRhX3R5cGUpIHsKICAgICAgICAgICAgY2FzZSBLU1RBVF9EQVRBX0NIQVI6CiAgICAgICAgICAgICAgICBzdHJsY3B5KHZhbHVlLCBkLT52YWx1ZS5jLCB2YWx1ZV9sZW4pOwogICAgICAgICAgICAgICAgREVCVUdNU0dUTCgoImtlcm5lbF9zdW5vczUiLCAidmFsdWU6ICVzXG4iLCBkLT52YWx1ZS5jKSk7CiAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgZGVmYXVsdDoKICAgICAgICAgICAgICAgIERFQlVHTVNHVEwoKCJrZXJuZWxfc3Vub3M1IiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICJOT05TVFJJTkcgVFlQRSAlZCAoc3RhdCBcIiVzXCIgdmFyIFwiJXNcIilcbiIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkLT5kYXRhX3R5cGUsIHN0YXRuYW1lLCB2YXJuYW1lKSk7CiAgICAgICAgICAgICAgICByZXQgPSAtMzsKICAgICAgICAgICAgICAgIGdvdG8gUmV0dXJuOyAgICAgICAgLyogSW52YWxpZCBkYXRhIHR5cGUgKi8KICAgICAgICAgICAgfQogICAgICAgICAgICByZXQgPSAwOyAgICAgICAgLyogU3VjY2VzcyAgKi8KICAgICAgICAgICAgZ290byBSZXR1cm47CiAgICAgICAgfQogICAgfQogICAgcmV0ID0gLTQ7ICAgICAgICAgICAgICAgLyogTmFtZSBub3QgZm91bmQgKi8KIFJldHVybjoKICAgIHJldHVybiByZXQ7Cn0KCi8qCiAqIGdldCBNSUItSUkgc3RhdGlzdGljcy4gSXQgbWFpbnRhaW5lcyBhIHNpbXBsZSBjYWNoZSB3aGljaCBidWZmZXJzIHRoZSBsYXN0CiAqIHJlYWQgYmxvY2sgb2YgTUlCIHN0YXRpc3RpY3MgKHdoaWNoIG1heSBjb250YWluIHRoZSB3aG9sZSB0YWJsZSkuIEl0IGNhbGxzCiAqICpjb21wIHRvIGNvbXBhcmUgZXZlcnkgZW50cnkgd2l0aCBhbiBlbnRyeSBwb2ludGVkIGJ5IGFyZy4gKmNvbXAgc2hvdWxkCiAqIHJldHVybiAwIGlmIGNvbXBhcmlzb24gaXMgc3VjY2Vzc2Z1bC4gIFJlcV90eXBlIG1heSBiZSBHRVRfRklSU1QsIEdFVF9FWEFDVCwKICogR0VUX05FWFQuICBJZiBzZWFyY2ggaXMgc3VjY2Vzc2Z1bCBnZXRNaWJzdGF0IHJldHVybnMgMCwgb3RoZXJ3aXNlIDEuCiAqLwppbnQKZ2V0TWlic3RhdChtaWJncm91cF9lIGdyaWQsIHZvaWQgKnJlc3AsIHNpemVfdCBlbnRyeXNpemUsCgkgICByZXFfZSByZXFfdHlwZSwgaW50ICgqY29tcCkgKHZvaWQgKiwgdm9pZCAqKSwgdm9pZCAqYXJnKQp7CiAgICBpbnQgICAgICAgICAgICAgcmV0LCByYyA9IC0xLCBtaWJnciwgbWlidGIsIGNhY2hlX3ZhbGlkOwogICAgc2l6ZV90ICAgICAgICAgIGxlbmd0aDsKICAgIG1pYmNhY2hlICAgICAgICpjYWNoZXA7CiAgICBmb3VuZF9lICAgICAgICAgcmVzdWx0ID0gTk9UX0ZPVU5EOwogICAgdm9pZCAgICAgICAgICAgKmVwOwoKICAgIC8qCiAgICAgKiBXZSBhc3N1bWUgdGhhdCBNaWJjYWNoZSBpcyBpbml0aWFsaXplZCBpbiBtaWJncm91cF9lIGVudW0gb3JkZXIgc28gd2UKICAgICAqIGRvbid0IGNoZWNrIHRoZSB2YWxpZGl0eSBvZiBpbmRleCBoZXJlLgogICAgICovCgogICAgREVCVUdNU0dUTCgoImtlcm5lbF9zdW5vczUiLCAiZ2V0TWlic3RhdCAoJWQsICosICVkLCAlZCwgKiwgKilcbiIsCgkJZ3JpZCwgKGludCllbnRyeXNpemUsIHJlcV90eXBlKSk7CiAgICBjYWNoZXAgPSAmTWliY2FjaGVbZ3JpZF07CiAgICBtaWJnciA9IE1pYm1hcFtncmlkXS5ncm91cDsKICAgIG1pYnRiID0gTWlibWFwW2dyaWRdLnRhYmxlOwoKICAgIGlmIChjYWNoZXAtPmNhY2hlX2FkZHIgPT0gKHZvaWQgKikgLTEpICAvKiBIYXNuJ3QgYmVlbiBpbml0aWFsaXplZCB5ZXQgKi8KCWluaXRfbWliY2FjaGVfZWxlbWVudChjYWNoZXApOwogICAgaWYgKGNhY2hlcC0+Y2FjaGVfc2l6ZSA9PSAwKSB7ICAvKiBNZW1vcnkgYWxsb2NhdGlvbiBwcm9ibGVtcyAqLwoJY2FjaGVwLT5jYWNoZV9hZGRyID0gcmVzcDsgIC8qIFNvIHVzZSBjYWxsZXIgc3VwcGxpZWQgYWRkcmVzcyBpbnN0ZWFkIG9mIGNhY2hlICovCgljYWNoZXAtPmNhY2hlX3NpemUgPSBlbnRyeXNpemU7CgljYWNoZXAtPmNhY2hlX2xhc3RfZm91bmQgPSAwOwogICAgfQogICAgaWYgKHJlcV90eXBlICE9IEdFVF9ORVhUKQoJY2FjaGVwLT5jYWNoZV9sYXN0X2ZvdW5kID0gMDsKCiAgICBjYWNoZV92YWxpZCA9IChjYWNoZXAtPmNhY2hlX3RpbWUgPiAwKTsKCiAgICBERUJVR01TR1RMKCgia2VybmVsX3N1bm9zNSIsIi4uLiBjYWNoZV92YWxpZCAlZCB0aW1lICVsZCB0dGwgJWQgbm93ICVsZFxuIiwKCQljYWNoZV92YWxpZCwgY2FjaGVwLT5jYWNoZV90aW1lLCAoaW50KWNhY2hlcC0+Y2FjaGVfdHRsLAoJCXRpbWUoTlVMTCkpKTsKICAgIGlmIChjYWNoZV92YWxpZCkgewoJLyoKCSAqIElzIGl0IHJlYWxseT8gCgkgKi8KCWlmIChjYWNoZXAtPmNhY2hlX2NvbXAgIT0gKHZvaWQgKiljb21wIHx8IGNhY2hlcC0+Y2FjaGVfYXJnICE9IGFyZykgewoJICAgIGNhY2hlX3ZhbGlkID0gMDsgICAgICAgIC8qIE5vcGUuICovCgl9CiAgICB9CgogICAgaWYgKGNhY2hlX3ZhbGlkKSB7CgkvKgoJICogRW50cnkgaXMgdmFsaWQsIGxldCdzIHRyeSB0byBmaW5kIGEgbWF0Y2ggCgkgKi8KCglpZiAocmVxX3R5cGUgPT0gR0VUX05FWFQpIHsKCSAgICByZXN1bHQgPSBnZXRlbnRyeShyZXFfdHlwZSwKCQkJICAgICAgKHZvaWQgKikoKGNoYXIgKiljYWNoZXAtPmNhY2hlX2FkZHIgKwoJCQkJICAgICAgIChjYWNoZXAtPmNhY2hlX2xhc3RfZm91bmQgKiBlbnRyeXNpemUpKSwKCQkJICAgICAgY2FjaGVwLT5jYWNoZV9sZW5ndGggLQoJCQkgICAgICAoY2FjaGVwLT5jYWNoZV9sYXN0X2ZvdW5kICogZW50cnlzaXplKSwKCQkJICAgICAgZW50cnlzaXplLCAmZXAsIGNvbXAsIGFyZyk7CiAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICByZXN1bHQgPSBnZXRlbnRyeShyZXFfdHlwZSwgY2FjaGVwLT5jYWNoZV9hZGRyLAoJCQkJICBjYWNoZXAtPmNhY2hlX2xlbmd0aCwgZW50cnlzaXplLCAmZXAsIGNvbXAsCgkJCQkgIGFyZyk7CiAgICAgICAgICAgIH0KICAgIH0KCiAgICBpZiAoKGNhY2hlX3ZhbGlkID09IDApIHx8IChyZXN1bHQgPT0gTk9UX0ZPVU5EKSB8fAoJKHJlc3VsdCA9PSBORUVEX05FWFQgJiYgY2FjaGVwLT5jYWNoZV9mbGFncyAmIENBQ0hFX01PUkVEQVRBKSkgewoJLyoKCSAqIEVpdGhlciB0aGUgY2FjaGUgaXMgb2xkLCBvciB3ZSBoYXZlbid0IGZvdW5kIGFueXRoaW5nLCBvciBuZWVkIHRoZQoJICogbmV4dCBpdGVtIHdoaWNoIGhhc24ndCBiZWVuIHJlYWQgeWV0LiAgSW4gYW55IGNhc2UsIGZpbGwgdGhlIGNhY2hlCgkgKiB1cCBhbmQgdHJ5IHRvIGZpbmQgb3VyIGVudHJ5LgoJICovCgoJaWYgKGdyaWQgPT0gTUlCX0lOVEVSRkFDRVMpIHsKCSAgICByYyA9IGdldGlmKChtaWIyX2lmRW50cnlfdCAqKSBjYWNoZXAtPmNhY2hlX2FkZHIsCgkJICAgICAgIGNhY2hlcC0+Y2FjaGVfc2l6ZSwgcmVxX3R5cGUsCgkJICAgICAgIChtaWIyX2lmRW50cnlfdCAqKSAmIGVwLCAmbGVuZ3RoLCBjb21wLCBhcmcpOwoJfSBlbHNlIHsKCSAgICByYyA9IGdldG1pYihtaWJnciwgbWlidGIsICYoY2FjaGVwLT5jYWNoZV9hZGRyKSwKCQkJJihjYWNoZXAtPmNhY2hlX3NpemUpLCBlbnRyeXNpemUsIHJlcV90eXBlLCAmZXAsCgkJCSZsZW5ndGgsIGNvbXAsIGFyZyk7Cgl9CgoJaWYgKHJjID49IDApIHsgICAgICAvKiBDYWNoZSBoYXMgYmVlbiBmaWxsZWQgdXAgKi8KCSAgICBjYWNoZXAtPmNhY2hlX3RpbWUgPSBjYWNoZXAtPmNhY2hlX3R0bDsKCSAgICBjYWNoZXAtPmNhY2hlX2xlbmd0aCA9IGxlbmd0aDsKCSAgICBpZiAocmMgPT0gMSkgICAgLyogRm91bmQgYnV0IHRoZXJlIGFyZSBtb3JlIHVucmVhZCBkYXRhICovCgkJY2FjaGVwLT5jYWNoZV9mbGFncyB8PSBDQUNIRV9NT1JFREFUQTsKCSAgICBlbHNlIHsKCQljYWNoZXAtPmNhY2hlX2ZsYWdzICY9IH5DQUNIRV9NT1JFREFUQTsKICAgICAgICAgICAgICAgIGlmIChyYyA+IDEpICB7CiAgICAgICAgICAgICAgICAgICAgY2FjaGVwLT5jYWNoZV90aW1lID0gMDsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgfQoJICAgIGNhY2hlcC0+Y2FjaGVfY29tcCA9ICh2b2lkICopIGNvbXA7CgkgICAgY2FjaGVwLT5jYWNoZV9hcmcgPSBhcmc7Cgl9IGVsc2UgewoJICAgIGNhY2hlcC0+Y2FjaGVfY29tcCA9IE5VTEw7CgkgICAgY2FjaGVwLT5jYWNoZV9hcmcgPSBOVUxMOwoJfQogICAgfQogICAgREVCVUdNU0dUTCgoImtlcm5lbF9zdW5vczUiLCAiLi4uIHJlc3VsdCAlZCByYyAlZFxuIiwgcmVzdWx0LCByYykpOwogICAgCiAgICBpZiAocmVzdWx0ID09IEZPVU5EIHx8IHJjID09IDAgfHwgcmMgPT0gMSkgewoJLyoKCSAqIEVudHJ5IGhhcyBiZWVuIGZvdW5kLCBkZWxpdmVyIGl0IAoJICovCglpZiAocmVzcCAhPSBOVUxMKSB7CgkgICAgbWVtY3B5KHJlc3AsIGVwLCBlbnRyeXNpemUpOwoJfQoJcmV0ID0gMDsKCWNhY2hlcC0+Y2FjaGVfbGFzdF9mb3VuZCA9CgkgICAgKChjaGFyICopZXAgLSAoY2hhciAqKWNhY2hlcC0+Y2FjaGVfYWRkcikgLyBlbnRyeXNpemU7CiAgICB9IGVsc2UgewoJcmV0ID0gMTsgICAgICAgICAgICAvKiBOb3QgZm91bmQgKi8KICAgIH0KICAgIERFQlVHTVNHVEwoKCJrZXJuZWxfc3Vub3M1IiwgIi4uLiBnZXRNaWJzdGF0IHJldHVybnMgJWRcbiIsIHJldCkpOwogICAgcmV0dXJuIHJldDsKfQoKLyoKICogR2V0IGEgTUlCLUlJIGVudHJ5IGZyb20gdGhlIGJ1ZmZlciBidWZmYWRkciwgd2hpY2ggc2F0aXNmaWVzIHRoZSBjcml0ZXJpb24sCiAqIGNvbXB1dGVkIGJ5ICgqY29tcCksIHdoaWNoIGdldHMgYXJnIGFzIHRoZSBmaXJzdCBhcmd1bWVudCBhbmQgcG9pbnRlciB0byB0aGUKICogY3VycmVudCBwb3NpdGlvbiBpbiB0aGUgYnVmZmVyIGFzIHRoZSBzZWNvbmQuIElmIGZvdW5kIGVudHJ5IGlzIHBvaW50ZWQgYnkKICogcmVzcC4KICovCgpzdGF0aWMgZm91bmRfZQpnZXRlbnRyeShyZXFfZSByZXFfdHlwZSwgdm9pZCAqYnVmYWRkciwgc2l6ZV90IGxlbiwKCSBzaXplX3QgZW50cnlzaXplLCB2b2lkICpyZXNwLCBpbnQgKCpjb21wKSh2b2lkICosIHZvaWQgKiksCgkgdm9pZCAqYXJnKQp7CiAgICB2b2lkICpicCA9IGJ1ZmFkZHIsICoqcnAgPSByZXNwOwogICAgaW50IHByZXZpb3VzX2ZvdW5kID0gMDsKICAgIAogICAgaWYgKChsZW4gPiAwKSAmJiAobGVuICUgZW50cnlzaXplICE9IDApKSB7CiAgICAgICAgLyogCiAgICAgICAgICogVGhlIGRhdGEgaW4gdGhlIGNhY2hlIGRvZXMgbm90IG1ha2Ugc2Vuc2UsIHRoZSBzaXplIG11c3QgYmUgYSAKICAgICAgICAgKiBtdWx0aXBsZSBvZiB0aGUgZW50cnkuIENvdWxkIGJlIGNhdXNlZCBieSBhbGlnbm1lbnQgaXNzdWVzIGV0Yy4gCiAgICAgICAgICovCiAgICAgICAgREVCVUdNU0dUTCgoImtlcm5lbF9zdW5vczUiLCAKICAgICAgICAgICAgImJhZCBjYWNoZSBsZW5ndGggJWQgLSBub3QgbXVsdGlwbGUgb2YgZW50cnkgc2l6ZSAlZFxuIiwgCiAgICAgICAgICAgIChpbnQpbGVuLCAoaW50KWVudHJ5c2l6ZSkpOwogICAgICAgIHJldHVybiBOT1RfRk9VTkQ7CiAgICB9CgogICAgLyoKICAgICAqIEhlcmUgd2UgaGF2ZSB0byBwZXJmb3JtIGFkZHJlc3MgYXJpdGhtZXRpYyB3aXRoIHBvaW50ZXIgdG8gdm9pZC4gVWdseS4uLgogICAgICovCgogICAgZm9yICg7IGxlbiA+IDA7IGxlbiAtPSBlbnRyeXNpemUsIGJwID0gKGNoYXIgKikgYnAgKyBlbnRyeXNpemUpIHsKCWlmIChycCAhPSAodm9pZCAqKSBOVUxMKSB7CgkgICAgKnJwID0gYnA7Cgl9CgoJaWYgKHJlcV90eXBlID09IEdFVF9GSVJTVCB8fCAocmVxX3R5cGUgPT0gR0VUX05FWFQgJiYgcHJldmlvdXNfZm91bmQpKXsKCSAgICByZXR1cm4gRk9VTkQ7Cgl9CgoJaWYgKCgqY29tcCkoYXJnLCBicCkgPT0gMCkgewoJICAgIGlmIChyZXFfdHlwZSA9PSBHRVRfRVhBQ1QpIHsKCQlyZXR1cm4gRk9VTkQ7CgkgICAgfSBlbHNlIHsgICAgICAgIC8qIEdFVF9ORVhUICovCgkJcHJldmlvdXNfZm91bmQrKzsKCQljb250aW51ZTsKCSAgICB9Cgl9CiAgICB9CgogICAgaWYgKHByZXZpb3VzX2ZvdW5kKSB7CglyZXR1cm4gTkVFRF9ORVhUOwogICAgfSBlbHNlIHsKCXJldHVybiBOT1RfRk9VTkQ7CiAgICB9Cn0KCi8qCiAqIEluaXRpYWxpemUgYSBjYWNoZSBlbGVtZW50LiBJdCBhbGxvY2F0ZXMgdGhlIG1lbW9yeSBhbmQgc2V0cyB0aGUgdGltZSBzdGFtcAogKiB0byBpbnZhbGlkYXRlIHRoZSBlbGVtZW50LgogKi8Kc3RhdGljIHZvaWQKaW5pdF9taWJjYWNoZV9lbGVtZW50KG1pYmNhY2hlICogY3ApCnsKICAgIGlmIChjcCA9PSAobWliY2FjaGUgKilOVUxMKSB7CglyZXR1cm47CiAgICB9CiAgICBpZiAoY3AtPmNhY2hlX3NpemUpIHsKCWNwLT5jYWNoZV9hZGRyID0gbWFsbG9jKGNwLT5jYWNoZV9zaXplKTsKICAgIH0KICAgIGNwLT5jYWNoZV90aW1lID0gMDsKICAgIGNwLT5jYWNoZV9jb21wID0gTlVMTDsKICAgIGNwLT5jYWNoZV9hcmcgPSBOVUxMOwp9CgovKgogKiBHZXQgTUlCLUlJIHN0YXRpc3RpY3MgZnJvbSB0aGUgU29sYXJpcyBrZXJuZWwuICBJdCB1c2VzIHVuZG9jdW1lbnRlZAogKiBpbnRlcmZhY2UgdG8gVENQL0lQIHN0cmVhbXMgbW9kdWxlcywgd2hpY2ggcHJvdmlkZXMgZXh0ZW5kZWQgTUlCLUlJIGZvciB0aGUKICogZm9sbG93aW5nIGdyb3VwczogaXAsIGljbXAsIHRjcCwgdWRwLCBlZ3AuCiAKICogCiAqIFVzYWdlOiBncm91cG5hbWUsIHN1Ymdyb3VwbmFtZSBhcmUgZnJvbSA8aW5ldC9taWIyLmg+LCAKICogICAgICAgIHNpemUlc2l6ZW9mKHN0YXRidWYpID09IDAsCiAqICAgICAgICBlbnRyeXNpemUgc2hvdWxkIGJlIGV4YWN0IHNpemUgb2YgTUlCLUlJIGVudHJ5LAogKiAgICAgICAgcmVxX3R5cGU6CiAqICAgICAgICAgICAgICAgICAgIEdFVF9GSVJTVCAtIGdldCB0aGUgZmlyc3QgZW50cnkgaW4gdGhlIGJ1ZmZlcgogKiAgICAgICAgICAgICAgICAgICBHRVRfRVhBQ1QgLSBnZXQgZXhhY3QgbWF0Y2gKICogICAgICAgICAgICAgICAgICAgR0VUX05FWFQgIC0gZ2V0IG5leHQgZW50cnkgYWZ0ZXIgdGhlIGV4YWN0IG1hdGNoCiAqIAogKiAoKmNvbXApIGlzIGEgY29tcGFyZSBmdW5jdGlvbiwgcHJvdmlkZWQgYnkgdGhlIGNhbGxlciwgd2hpY2ggZ2V0cyBhcmcgYXMgdGhlCiAqIGZpcnN0IGFyZ3VtZW50IGFuZCBwb2ludGVyIHRvIHRoZSBjdXJyZW50IGVudHJ5IGFzIHRoIHNlY29uZC4gSWYgY29tcGFyZWQsCiAqIHNob3VsZCByZXR1cm4gMCBhbmQgZm91bmQgZW50cnkgd2lsbCBiZSBwb2ludGVkIGJ5IHJlc3AuCiAqIAogKiBJZiBzZWFyY2ggaXMgc3VjY2Vzc2Z1bCBhbmQgbm8gbW9yZSBkYXRhIHRvIHJlYWQsIGl0IHJldHVybnMgMCwKICogaWYgc3VjY2Vzc2Z1bCBhbmQgdGhlcmUgaXMgbW9yZSBkYXRhIC0tIDEsCiAqIGlmIG5vdCBmb3VuZCBhbmQgZW5kIG9mIGRhdGEgLS0gMiwgYW55IG90aGVyIGVycm9ycyAtLSA8IDAKICogKG5lZ2F0aXZlIGVycm9yIG51bWJlcnMgYXJlIHByZXR0eSByYW5kb20pLgogKiAKICogTk9URTogbmVlZHMgdG8gYmUgcHJvdGVjdGVkIGJ5IGEgbXV0ZXggaW4gcmVlbnRyYW50IGVudmlyb25tZW50IAogKi8KCnN0YXRpYyBpbnQKZ2V0bWliKGludCBncm91cG5hbWUsIGludCBzdWJncm91cG5hbWUsIHZvaWQgKipzdGF0YnVmLCBzaXplX3QgKnNpemUsCiAgICAgICBzaXplX3QgZW50cnlzaXplLCByZXFfZSByZXFfdHlwZSwgdm9pZCAqcmVzcCwKICAgICAgIHNpemVfdCAqbGVuZ3RoLCBpbnQgKCpjb21wKSh2b2lkICosIHZvaWQgKiksIHZvaWQgKmFyZykKewogICAgaW50ICAgICAgICAgICAgIHJjLCByZXQgPSAwLCBmbGFnczsKICAgIGNoYXIgICAgICAgICAgICBidWZbQlVGU0laRV07CiAgICBzdHJ1Y3Qgc3RyYnVmICAgc3RyYnVmOwogICAgc3RydWN0IFRfb3B0bWdtdF9yZXEgKnRvciA9IChzdHJ1Y3QgVF9vcHRtZ210X3JlcSAqKSBidWY7CiAgICBzdHJ1Y3QgVF9vcHRtZ210X2FjayAqdG9hID0gKHN0cnVjdCBUX29wdG1nbXRfYWNrICopIGJ1ZjsKICAgIHN0cnVjdCBUX2Vycm9yX2FjayAqdGVhID0gKHN0cnVjdCBUX2Vycm9yX2FjayAqKSBidWY7CiAgICBzdHJ1Y3Qgb3B0aGRyICAqcmVxOwogICAgZm91bmRfZSAgICAgICAgIHJlc3VsdCA9IEZPVU5EOwogICAgc2l6ZV90IG9sZHNpemU7CgogICAgREVCVUdNU0dUTCgoImtlcm5lbF9zdW5vczUiLCAiLi4uLi4uIGdldG1pYiAoJWQsICVkLCAuLi4pXG4iLAoJCWdyb3VwbmFtZSwgc3ViZ3JvdXBuYW1lKSk7CgogICAgLyoKICAgICAqIE9wZW4gdGhlIHN0cmVhbSBkcml2ZXIgYW5kIHB1c2ggYWxsIE1JQi1yZWxhdGVkIG1vZHVsZXMgCiAgICAgKi8KCiAgICBpZiAoc2QgPT0gLTIpIHsgICAgICAgICAvKiBGaXJzdCB0aW1lICovCglpZiAoKHNkID0gb3BlbihTVFJFQU1fREVWLCBPX1JEV1IpKSA9PSAtMSkgewoJICAgIHNubXBfbG9nX3BlcnJvcihTVFJFQU1fREVWKTsKCSAgICByZXQgPSAtMTsKCSAgICBnb3RvIFJldHVybjsKCX0KCWlmIChpb2N0bChzZCwgSV9QVVNILCAidGNwIikgPT0gLTEpIHsKCSAgICBzbm1wX2xvZ19wZXJyb3IoIklfUFVTSCB0Y3AiKTsKCSAgICByZXQgPSAtMTsKCSAgICBnb3RvIFJldHVybjsKCX0KCWlmIChpb2N0bChzZCwgSV9QVVNILCAidWRwIikgPT0gLTEpIHsKCSAgICBzbm1wX2xvZ19wZXJyb3IoIklfUFVTSCB1ZHAiKTsKCSAgICByZXQgPSAtMTsKCSAgICBnb3RvIFJldHVybjsKCX0KCURFQlVHTVNHVEwoKCJrZXJuZWxfc3Vub3M1IiwgIi4uLi4uLiBtb2R1bGVzIHB1c2hlZCBPS1xuIikpOwogICAgfQogICAgaWYgKHNkID09IC0xKSB7CglyZXQgPSAtMTsKCWdvdG8gUmV0dXJuOwogICAgfQoKICAgIC8qCiAgICAgKiBGaXJzdCwgdXNlIGJpZ2dlciBidWZmZXIsIHRvIGFjY2VsZXJhdGUgc2tpcHBpbmcgdW53YW50ZWQgbWVzc2FnZXMKICAgICAqLwoKICAgIHN0cmJ1Zi5idWYgPSBidWY7CiAgICBzdHJidWYubWF4bGVuID0gQlVGU0laRTsKICAgIAogICAgdG9yLT5QUklNX3R5cGUgPSBUX09QVE1HTVRfUkVROwogICAgdG9yLT5PUFRfb2Zmc2V0ID0gc2l6ZW9mKHN0cnVjdCBUX29wdG1nbXRfcmVxKTsKICAgIHRvci0+T1BUX2xlbmd0aCA9IHNpemVvZihzdHJ1Y3Qgb3B0aGRyKTsKI2lmZGVmIE1JX1RfQ1VSUkVOVAogICAgdG9yLT5NR01UX2ZsYWdzID0gTUlfVF9DVVJSRU5UOyAvKiBTb2xhcmlzIDwgMi42ICovCiNlbHNlCiAgICB0b3ItPk1HTVRfZmxhZ3MgPSBUX0NVUlJFTlQ7ICAgIC8qIFNvbGFyaXMgMi42ICovCiNlbmRpZgogICAgcmVxID0gKHN0cnVjdCBvcHRoZHIgKikodG9yICsgMSk7CiAgICByZXEtPmxldmVsID0gZ3JvdXBuYW1lOwogICAgcmVxLT5uYW1lID0gc3ViZ3JvdXBuYW1lOwogICAgLyoKICAgICAqIG5vbi16ZXJvIGxlbiBmaWVsZCBpcyB1c2VkIHRvIHJlcXVlc3QgZXh0ZW5kZWQgTUlCIHN0YXRpc3RpY3MKICAgICAqIG9uIFNvbGFyaXMgMTAgVXBkYXRlIDQgYW5kIGxhdGVyLiBUaGUgTEVHQUNZX01JQl9TSVpFIG1hY3JvIGlzIG9ubHkKICAgICAqIGF2YWlsYWJsZSBmb3IgUzEwVTQrLCBzbyB3ZSB1c2UgdGhhdCB0byBzZWUgd2hhdCBhY3Rpb24gdG8gdGFrZS4KICAgICAqLwojaWZkZWYgTEVHQUNZX01JQl9TSVpFCiAgICByZXEtPmxlbiA9IDE7CS8qIGFzayBmb3IgZXh0ZW5kZWQgTUlCcyAqLwojZWxzZQogICAgcmVxLT5sZW4gPSAwOwojZW5kaWYKICAgIHN0cmJ1Zi5sZW4gPSB0b3ItPk9QVF9sZW5ndGggKyB0b3ItPk9QVF9vZmZzZXQ7CiAgICBmbGFncyA9IDA7CiAgICBpZiAoKHJjID0gcHV0bXNnKHNkLCAmc3RyYnVmLCBOVUxMLCBmbGFncykpKSB7CglyZXQgPSAtMjsKCWdvdG8gUmV0dXJuOwogICAgfQoKICAgIHJlcSA9IChzdHJ1Y3Qgb3B0aGRyICopICh0b2EgKyAxKTsKICAgIGZvciAoOzspIHsKCWZsYWdzID0gMDsKCWlmICgocmMgPSBnZXRtc2coc2QsICZzdHJidWYsIE5VTEwsICZmbGFncykpID09IC0xKSB7CgkgICAgcmV0ID0gLUVJTzsKCSAgICBicmVhazsKCX0KCWlmIChyYyA9PSAwICYmIHN0cmJ1Zi5sZW4gPj0gc2l6ZW9mKHN0cnVjdCBUX29wdG1nbXRfYWNrKSAmJgoJICAgIHRvYS0+UFJJTV90eXBlICA9PSBUX09QVE1HTVRfQUNLICYmCgkgICAgdG9hLT5NR01UX2ZsYWdzID09IFRfU1VDQ0VTUyAmJiByZXEtPmxlbiA9PSAwKSB7CgkgICAgcmV0ID0gMjsKCSAgICBicmVhazsKCX0KCWlmIChzdHJidWYubGVuID49IHNpemVvZihzdHJ1Y3QgVF9lcnJvcl9hY2spICYmCgkgICAgdGVhLT5QUklNX3R5cGUgPT0gVF9FUlJPUl9BQ0spIHsKCSAgICAvKiBQcm90b2NvbCBlcnJvciAqLwoJICAgIHJldCA9IC0oKHRlYS0+VExJX2Vycm9yID09IFRTWVNFUlIpID8gdGVhLT5VTklYX2Vycm9yIDogRVBST1RPKTsKCSAgICBicmVhazsKCX0KCWlmIChyYyAhPSBNT1JFREFUQSB8fCBzdHJidWYubGVuIDwgc2l6ZW9mKHN0cnVjdCBUX29wdG1nbXRfYWNrKSB8fAoJICAgIHRvYS0+UFJJTV90eXBlICE9IFRfT1BUTUdNVF9BQ0sgfHwKCSAgICB0b2EtPk1HTVRfZmxhZ3MgIT0gVF9TVUNDRVNTKSB7CgkgICAgcmV0ID0gLUVOT01TRzsgIC8qIE5vIG1vcmUgbWVzc2FnZXMgKi8KCSAgICBicmVhazsKCX0KCgkvKgoJICogVGhlIG9yZGVyIGluIHdoaWNoIHdlIGdldCB0aGUgc3RhdGlzdGljcyBpcyBkZXRlcm1pbmVkIGJ5IHRoZSBrZXJuZWwKCSAqIGFuZCBub3QgYnkgdGhlIGdyb3VwIG5hbWUsIHNvIHdlIGhhdmUgdG8gbG9vcCB1bnRpbCB3ZSBnZXQgdGhlCgkgKiByZXF1aXJlZCBzdGF0aXN0aWNzLgoJICovCgoJaWYgKHJlcS0+bGV2ZWwgIT0gZ3JvdXBuYW1lIHx8IHJlcS0+bmFtZSAhPSBzdWJncm91cG5hbWUpIHsKCSAgICBzdHJidWYubWF4bGVuID0gQlVGU0laRTsKCSAgICBzdHJidWYuYnVmID0gYnVmOwoJICAgIGRvIHsKCQlyYyA9IGdldG1zZyhzZCwgTlVMTCwgJnN0cmJ1ZiwgJmZsYWdzKTsKCSAgICB9IHdoaWxlIChyYyA9PSBNT1JFREFUQSk7CgkgICAgY29udGludWU7Cgl9CiAgICAgICAgCgkvKgoJICogTm93IHdoZW4gd2UgZm91bmQgb3VyIHN0YXQsIHN3aXRjaCBidWZmZXIgdG8gYSBjYWxsZXItcHJvdmlkZWQKCSAqIG9uZS4gTWFuaXB1bGF0aW5nIHRoZSBzaXplIG9mIGl0IG9uZSBjYW4gY29udHJvbCBwZXJmb3JtYW5jZSwKCSAqIHJlZHVjaW5nIHRoZSBudW1iZXIgb2YgZ2V0bXNnIGNhbGxzCgkgKi8KCglzdHJidWYuYnVmID0gKnN0YXRidWY7CglzdHJidWYubWF4bGVuID0gKnNpemU7CglzdHJidWYubGVuID0gMDsKCWZsYWdzID0gMDsKCWRvIHsKCSAgICByYyA9IGdldG1zZyhzZCwgTlVMTCwgJnN0cmJ1ZiwgJmZsYWdzKTsKCSAgICBzd2l0Y2ggKHJjKSB7CgkgICAgY2FzZSAtMToKCQlyZXQgPSAtRU5PU1I7CgkJc25tcF9wZXJyb3IoImdldG1zZyIpOwoJCWdvdG8gUmV0dXJuOwoKCSAgICBkZWZhdWx0OgoJCXNubXBfbG9nKExPR19FUlIsICJrZXJuZWxfc3Vub3M1L2dldG1pYjogZ2V0bXNnIHJldHVybmVkICVkXG4iLCByYyk7CgkJcmV0ID0gLUVOT0RBVEE7CgkJZ290byBSZXR1cm47CgoJICAgIGNhc2UgTU9SRURBVEE6CgkJREVCVUdNU0dUTCgoImtlcm5lbF9zdW5vczUiLCAiLi4uLi4uIGdldG1pYiBpbmNyZWFzZWQgYnVmZmVyIHNpemVcbiIpKTsKCQlvbGRzaXplID0gKCBzdHJidWYuYnVmIC0gKGNoYXIgKikqc3RhdGJ1ZikgKyBzdHJidWYubGVuOwoJCXN0cmJ1Zi5idWYgPSAoY2hhciAqKXJlYWxsb2MoKnN0YXRidWYsIG9sZHNpemUrNDA5Nik7CgkJaWYoc3RyYnVmLmJ1ZiAhPSBOVUxMKSB7CgkJICAgICpzdGF0YnVmID0gc3RyYnVmLmJ1ZjsKCQkgICAgKnNpemUgPSBvbGRzaXplICsgNDA5NjsKCQkgICAgc3RyYnVmLmJ1ZiA9IChjaGFyICopKnN0YXRidWYgKyBvbGRzaXplOwoJCSAgICBzdHJidWYubWF4bGVuID0gNDA5NjsKCQkgICAgcmVzdWx0ID0gTk9UX0ZPVU5EOwoJCSAgICBicmVhazsKCQl9CgkJc3RyYnVmLmJ1ZiA9IChjaGFyICopKnN0YXRidWYgKyAob2xkc2l6ZSAtIHN0cmJ1Zi5sZW4pOwoJICAgIGNhc2UgMDoKCQkvKiBmaXggYnVmZmVyIHRvIHJlYWwgc2l6ZSAmIHBvc2l0aW9uICovCgkJc3RyYnVmLmxlbiArPSBzdHJidWYuYnVmIC0gKGNoYXIqKSpzdGF0YnVmOwoJCXN0cmJ1Zi5idWYgPSAqc3RhdGJ1ZjsKCQlzdHJidWYubWF4bGVuID0gKnNpemU7CgoJCWlmIChyZXFfdHlwZSA9PSBHRVRfTkVYVCAmJiByZXN1bHQgPT0gTkVFRF9ORVhUKQoJCSAgICAvKgoJCSAgICAgKiBFbmQgb2YgYnVmZmVyLCBzbyAibmV4dCIgaXMgdGhlIGZpcnN0IGl0ZW0gaW4gdGhlIG5leHQKCQkgICAgICogYnVmZmVyICAKCQkgICAgICovCgkJICAgIHJlcV90eXBlID0gR0VUX0ZJUlNUOwoJCXJlc3VsdCA9IGdldGVudHJ5KHJlcV90eXBlLCAodm9pZCAqKSBzdHJidWYuYnVmLCBzdHJidWYubGVuLAoJCQkJICBlbnRyeXNpemUsIHJlc3AsIGNvbXAsIGFyZyk7CgkJKmxlbmd0aCA9IHN0cmJ1Zi5sZW47ICAgICAgIC8qIFRvIHVzZSBpbiBjYWxsZXIgZm9yIGNhY2hlaW5nICovCgkJYnJlYWs7CgkgICAgfQoJfSB3aGlsZSAocmMgPT0gTU9SRURBVEEgJiYgcmVzdWx0ICE9IEZPVU5EKTsKCglERUJVR01TR1RMKCgia2VybmVsX3N1bm9zNSIsICIuLi4uLi4gZ2V0bWliIGJ1ZmZlciBzaXplIGlzICVkXG4iLCAoaW50KSpzaXplKSk7CgoJaWYgKHJlc3VsdCA9PSBGT1VORCkgeyAgICAgIC8qIFNlYXJjaCBpcyBzdWNjZXNzZnVsICovCgkgICAgaWYgKHJjICE9IE1PUkVEQVRBKSB7CgkJcmV0ID0gMDsgICAgLyogRm91bmQgYW5kIG5vIG1vcmUgZGF0YSAqLwoJICAgIH0gZWxzZSB7CgkJcmV0ID0gMTsgICAgLyogRm91bmQgYW5kIHRoZXJlIGlzIGFub3RoZXIgdW5yZWFkIGRhdGEgYmxvY2sgKi8KCSAgICB9CgkgICAgYnJlYWs7Cgl9IGVsc2UgeyAgICAgICAgICAgIC8qIFJlc3RvcmUgYnVmZmVycywgY29udGludWUgc2VhcmNoICovCgkgICAgc3RyYnVmLmJ1ZiA9IGJ1ZjsKCSAgICBzdHJidWYubWF4bGVuID0gQlVGU0laRTsKCX0KICAgIH0KIFJldHVybjoKICAgIGlmIChzZCA+PSAwKSBpb2N0bChzZCwgSV9GTFVTSCwgRkxVU0hSVyk7CiAgICBERUJVR01TR1RMKCgia2VybmVsX3N1bm9zNSIsICIuLi4uLi4gZ2V0bWliIHJldHVybnMgJWRcbiIsIHJldCkpOwogICAgcmV0dXJuIHJldDsKfQogIAovKgogKiBHZXQgaW5mbyBmb3IgaW50ZXJmYWNlcyBncm91cC4gTWltaWNzIGdldG1pYiBpbnRlcmZhY2UgYXMgbXVjaCBhcyBwb3NzaWJsZQogKiB0byBiZSBzdWJzdGl0dXRlZCBsYXRlciBpZiBTdW5Tb2Z0IGRlY2lkZXMgdG8gZXh0ZW5kIGl0cyBtaWIyIGludGVyZmFjZS4KICovCgojaWYgZGVmaW5lZChIQVZFX0lGX05BTUVJTkRFWCkgJiYgZGVmaW5lZChORVRTTk1QX0lOQ0xVREVfSUZUQUJMRV9SRVdSSVRFUykKCi8qCiAqIElmIElGVEFCTEVfUkVXUklURVMgaXMgZW5hYmxlZCwgdGhlbiB3ZSB3aWxsIGFsc28gcmVseSBvbiBETFBJIHRvIG9idGFpbgogKiBpbmZvcm1hdGlvbiBmcm9tIHRoZSBOSUMuCiAqLwoKLyoKICogT3BlbiBhIERMUEkgZGV2aWNlLgogKgogKiBPbiBzdWNjZXNzIHRoZSBmaWxlIGRlc2NyaXB0b3IgaXMgcmV0dXJuZWQuCiAqIE9uIGVycm9yIC0xIGlzIHJldHVybmVkLgogKi8Kc3RhdGljIGludApfZGxwaV9vcGVuKGNvbnN0IGNoYXIgKmRldm5hbWUpCnsKICAgIGNoYXIgKmRldnN0cjsKICAgIGludCBmZCA9IC0xOwogICAgaW50IHBwYSA9IC0xOwoKICAgIERFQlVHTVNHVEwoKCJrZXJuZWxfc3Vub3M1IiwgIl9kbHBpX29wZW4gY2FsbGVkXG4iKSk7CgogICAgaWYgKGRldm5hbWUgPT0gTlVMTCkKICAgICAgICByZXR1cm4gKC0xKTsKCiAgICBpZiAoKGRldnN0ciA9IG1hbGxvYyg1ICsgc3RybGVuKGRldm5hbWUpICsgMSkpID09IE5VTEwpCiAgICAgICAgcmV0dXJuICgtMSk7CiAgICAodm9pZCkgc3ByaW50ZihkZXZzdHIsICIvZGV2LyVzIiwgZGV2bmFtZSk7CiAgICBERUJVR01TR1RMKCgia2VybmVsX3N1bm9zNTpkbHBpIiwgImRldnN0ciglcylcbiIsIGRldnN0cikpOwogICAgLyoKICAgICAqIEZpcnN0IHRyeSBvcGVuaW5nIHRoZSBkZXZpY2UgdXNpbmcgc3R5bGUgMSwgaWYgdGhlIGRldmljZSBkb2VzIG5vdAogICAgICogZXhpc3Qgd2UgdHJ5IHN0eWxlIDIuIE1vZHVsZXMgd2lsbCBub3QgYmUgcHVzaGVkLCBzbyBzb21ldGhpbmcgbGlrZQogICAgICogaXAgdHVubmVscyB3aWxsIG5vdCB3b3JrLiAKICAgICAqLwogICAKICAgIERFQlVHTVNHVEwoKCJrZXJuZWxfc3Vub3M1OmRscGkiLCAic3R5bGUxIG9wZW4oJXMpXG4iLCBkZXZzdHIpKTsKICAgIGlmICgoZmQgPSBvcGVuKGRldnN0ciwgT19SRFdSIHwgT19OT05CTE9DSykpIDwgMCkgewogICAgICAgIERFQlVHTVNHVEwoKCJrZXJuZWxfc3Vub3M1OmRscGkiLCAic3R5bGUxIG9wZW4gZmFpbGVkXG4iKSk7CiAgICAgICAgaWYgKF9kbHBpX3BhcnNlX2Rldm5hbWUoZGV2c3RyLCAmcHBhKSA9PSAwKSB7CiAgICAgICAgICAgIERFQlVHTVNHVEwoKCJrZXJuZWxfc3Vub3M1OmRscGkiLCAic3R5bGUyIHBhcnNlOiAlcywgJWRcbiIsIAogICAgICAgICAgICAgICAgICAgICAgIGRldnN0ciwgcHBhKSk7CiAgICAgICAgICAgIC8qIHRyeSBzdHlsZSAyICovCiAgICAgICAgICAgIERFQlVHTVNHVEwoKCJrZXJuZWxfc3Vub3M1OmRscGkiLCAic3R5bGUyIG9wZW4oJXMpXG4iLCBkZXZzdHIpKTsKCiAgICAgICAgICAgIGlmICgoZmQgPSBvcGVuKGRldnN0ciwgT19SRFdSIHwgT19OT05CTE9DSykpICE9IC0xKSB7CiAgICAgICAgICAgICAgICBpZiAoX2RscGlfYXR0YWNoKGZkLCBwcGEpID09IDApIHsKICAgICAgICAgICAgICAgICAgICBERUJVR01TR1RMKCgia2VybmVsX3N1bm9zNTpkbHBpIiwgImF0dGFjaGVkXG4iKSk7CiAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgIERFQlVHTVNHVEwoKCJrZXJuZWxfc3Vub3M1OmRscGkiLCAiYXR0YWNoZWQgZmFpbGVkXG4iKSk7CiAgICAgICAgICAgICAgICAgICAgY2xvc2UoZmQpOwogICAgICAgICAgICAgICAgICAgIGZkID0gLTE7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICBERUJVR01TR1RMKCgia2VybmVsX3N1bm9zNTpkbHBpIiwgInN0eWxlMiBvcGVuIGZhaWxlZFxuIikpOwogICAgICAgICAgICB9CiAgICAgICAgfSAKICAgIH0gZWxzZSB7CiAgICAgICAgREVCVUdNU0dUTCgoImtlcm5lbF9zdW5vczU6ZGxwaSIsICJzdHlsZTEgb3BlbiBzdWNjZWVkZWRcbiIpKTsKICAgIH0KCiAgICAvKiBjbGVhbiB1cCAqLwogICAgZnJlZShkZXZzdHIpOwoKICAgIHJldHVybiAoZmQpOwp9CgovKgogKiBPYnRhaW4gdGhlIHBoeXNpY2FsIGFkZHJlc3Mgb2YgdGhlIGludGVyZmFjZSB1c2luZyBETFBJCiAqLwpzdGF0aWMgaW50Cl9kbHBpX2dldF9waHlzX2FkZHJlc3MoaW50IGZkLCBjaGFyICphZGRyLCBpbnQgbWF4bGVuLCBpbnQgKmFkZHJsZW4pCnsKICAgIGRsX3BoeXNfYWRkcl9yZXFfdCAgcGFkZHJfcmVxOwogICAgdW5pb24gRExfcHJpbWl0aXZlcyAqZGxwOwogICAgc3RydWN0IHN0cmJ1ZiAgICAgICBjdGxidWY7CiAgICBjaGFyICAgICAgICAgICAgICAgIGJ1ZltNQVgoRExfUEhZU19BRERSX0FDS19TSVpFKzY0LCBETF9FUlJPUl9BQ0tfU0laRSldOwogICAgaW50ICAgICAgICAgICAgICAgICBmbGFnID0gMDsKCiAgICBERUJVR01TR1RMKCgia2VybmVsX3N1bm9zNTpkbHBpIiwgIl9kbHBpX2dldF9waHlzX2FkZHJlc3NcbiIpKTsKCiAgICBwYWRkcl9yZXEuZGxfcHJpbWl0aXZlID0gRExfUEhZU19BRERSX1JFUTsKICAgIHBhZGRyX3JlcS5kbF9hZGRyX3R5cGUgPSBETF9DVVJSX1BIWVNfQUREUjsKICAgIGN0bGJ1Zi5idWYgPSAoY2hhciAqKSZwYWRkcl9yZXE7CiAgICBjdGxidWYubGVuID0gRExfUEhZU19BRERSX1JFUV9TSVpFOwogICAgaWYgKHB1dG1zZyhmZCwgJmN0bGJ1ZiwgTlVMTCwgMCkgPCAwKQogICAgICAgIHJldHVybiAoLTEpOwogICAgCiAgICBjdGxidWYubWF4bGVuID0gc2l6ZW9mKGJ1Zik7CiAgICBjdGxidWYubGVuID0gMDsKICAgIGN0bGJ1Zi5idWYgPSBidWY7CiAgICBpZiAoZ2V0bXNnKGZkLCAmY3RsYnVmLCBOVUxMLCAmZmxhZykgPCAwKQogICAgICAgIHJldHVybiAoLTEpOwoKICAgIGlmIChjdGxidWYubGVuIDwgc2l6ZW9mKHVpbnQzMl90KSkKICAgICAgICByZXR1cm4gKC0xKTsKICAgIGRscCA9ICh1bmlvbiBETF9wcmltaXRpdmVzICopYnVmOwogICAgc3dpdGNoIChkbHAtPmRsX3ByaW1pdGl2ZSkgewogICAgY2FzZSBETF9QSFlTX0FERFJfQUNLOiB7CiAgICAgICAgZGxfcGh5c19hZGRyX2Fja190ICpwaHlwID0gKGRsX3BoeXNfYWRkcl9hY2tfdCAqKWJ1ZjsKCiAgICAgICAgREVCVUdNU0dUTCgoImtlcm5lbF9zdW5vczU6ZGxwaSIsICJnb3QgQUNLXG4iKSk7CiAgICAgICAgaWYgKGN0bGJ1Zi5sZW4gPCBETF9QSFlTX0FERFJfQUNLX1NJWkUgfHwgcGh5cC0+ZGxfYWRkcl9sZW5ndGggPiBtYXhsZW4pCiAgICAgICAgICAgIHJldHVybiAoLTEpOyAKICAgICAgICAodm9pZCkgbWVtY3B5KGFkZHIsIGJ1ZitwaHlwLT5kbF9hZGRyX29mZnNldCwgcGh5cC0+ZGxfYWRkcl9sZW5ndGgpOwogICAgICAgICphZGRybGVuID0gcGh5cC0+ZGxfYWRkcl9sZW5ndGg7CiAgICAgICAgcmV0dXJuICgwKTsKICAgIH0KICAgIGNhc2UgRExfRVJST1JfQUNLOiB7CiAgICAgICAgZGxfZXJyb3JfYWNrX3QgKmVycnAgPSAoZGxfZXJyb3JfYWNrX3QgKilidWY7CgogICAgICAgIERFQlVHTVNHVEwoKCJrZXJuZWxfc3Vub3M1OmRscGkiLCAiZ290IEVSUk9SIEFDS1xuIikpOwogICAgICAgIGlmIChjdGxidWYubGVuIDwgRExfRVJST1JfQUNLX1NJWkUpCiAgICAgICAgICAgIHJldHVybiAoLTEpOwogICAgICAgIHJldHVybiAoZXJycC0+ZGxfZXJybm8pOwogICAgfQogICAgZGVmYXVsdDoKICAgICAgICBERUJVR01TR1RMKCgia2VybmVsX3N1bm9zNTpkbHBpIiwgImdvdCB0eXBlOiAleFxuIiwgKHVuc2lnbmVkKWRscC0+ZGxfcHJpbWl0aXZlKSk7CiAgICAgICAgcmV0dXJuICgtMSk7CiAgICB9Cn0KCi8qCiAqIFF1ZXJ5IHRoZSBpbnRlcmZhY2UgYWJvdXQgaXQncyB0eXBlLgogKi8Kc3RhdGljIGludApfZGxwaV9nZXRfaWZ0eXBlKGludCBmZCwgdW5zaWduZWQgaW50ICppZnR5cGUpCnsKICAgIGRsX2luZm9fcmVxX3QgaW5mb19yZXE7CiAgICB1bmlvbiBETF9wcmltaXRpdmVzICpkbHA7CiAgICBzdHJ1Y3Qgc3RyYnVmICAgICAgIGN0bGJ1ZjsKICAgIGNoYXIgICAgICAgICAgICAgICAgYnVmW01BWChETF9JTkZPX0FDS19TSVpFLCBETF9FUlJPUl9BQ0tfU0laRSldOwogICAgaW50ICAgICAgICAgICAgICAgICBmbGFnID0gMDsKCiAgICBERUJVR01TR1RMKCgia2VybmVsX3N1bm9zNTpkbHBpIiwgIl9kbHBpX2dldF9pZnR5cGVcbiIpKTsKCiAgICBpbmZvX3JlcS5kbF9wcmltaXRpdmUgPSBETF9JTkZPX1JFUTsKICAgIGN0bGJ1Zi5idWYgPSAoY2hhciAqKSZpbmZvX3JlcTsKICAgIGN0bGJ1Zi5sZW4gPSBETF9JTkZPX1JFUV9TSVpFOwogICAgaWYgKHB1dG1zZyhmZCwgJmN0bGJ1ZiwgTlVMTCwgMCkgPCAwKSB7CiAgICAgICAgREVCVUdNU0dUTCgoImtlcm5lbF9zdW5vczU6ZGxwaSIsICJwdXRtc2cgZmFpbGVkOiAlZFxubiIsIGVycm5vKSk7CiAgICAgICAgcmV0dXJuICgtMSk7CiAgICB9CiAgICAKICAgIGN0bGJ1Zi5tYXhsZW4gPSBzaXplb2YoYnVmKTsKICAgIGN0bGJ1Zi5sZW4gPSAwOwogICAgY3RsYnVmLmJ1ZiA9IGJ1ZjsKICAgIGlmIChnZXRtc2coZmQsICZjdGxidWYsIE5VTEwsICZmbGFnKSA8IDApIHsKICAgICAgICBERUJVR01TR1RMKCgia2VybmVsX3N1bm9zNTpkbHBpIiwgImdldG1zZyBmYWlsZWQ6ICVkXG4iLCBlcnJubykpOwogICAgICAgIHJldHVybiAoLTEpOwogICAgfQoKICAgIGlmIChjdGxidWYubGVuIDwgc2l6ZW9mKHVpbnQzMl90KSkKICAgICAgICByZXR1cm4gKC0xKTsKICAgIGRscCA9ICh1bmlvbiBETF9wcmltaXRpdmVzICopYnVmOwogICAgc3dpdGNoIChkbHAtPmRsX3ByaW1pdGl2ZSkgewogICAgY2FzZSBETF9JTkZPX0FDSzogewogICAgICAgIGRsX2luZm9fYWNrX3QgKmluZm8gPSAoZGxfaW5mb19hY2tfdCAqKWJ1ZjsKCiAgICAgICAgaWYgKGN0bGJ1Zi5sZW4gPCBETF9JTkZPX0FDS19TSVpFKQogICAgICAgICAgICByZXR1cm4gKC0xKTsgCgogICAgICAgIERFQlVHTVNHVEwoKCJrZXJuZWxfc3Vub3M1OmRscGkiLCAiZGxfbWFjX3R5cGU6ICV4XG4iLAoJICAgICAgICAgICAodW5zaWduZWQpaW5mby0+ZGxfbWFjX3R5cGUpKTsKCXN3aXRjaCAoaW5mby0+ZGxfbWFjX3R5cGUpIHsKCWNhc2UgRExfQ1NNQUNEOgoJY2FzZSBETF9FVEhFUjoKCWNhc2UgRExfRVRIX0NTTUE6CgkJKmlmdHlwZSA9IDY7CgkJYnJlYWs7CgljYXNlIERMX1RQQjoJLyogVG9rZW4gUGFzc2luZyBCdXMgKi8KCQkqaWZ0eXBlID0gODsKCQlicmVhazsKCWNhc2UgRExfVFBSOgkvKiBUb2tlbiBQYXNzaW5nIFJpbmcgKi8KCQkqaWZ0eXBlID0gOTsKCQlicmVhazsKCWNhc2UgRExfSERMQzoKCQkqaWZ0eXBlID0gMTE4OwoJCWJyZWFrOwoJY2FzZSBETF9GRERJOgoJCSppZnR5cGUgPSAxNTsKCQlicmVhazsKCWNhc2UgRExfRkM6CS8qIEZpYnJlIGNoYW5uZWwgKi8KCQkqaWZ0eXBlID0gNTY7CgkJYnJlYWs7CgljYXNlIERMX0FUTToKCQkqaWZ0eXBlID0gMzc7CgkJYnJlYWs7CgljYXNlIERMX1gyNToKCWNhc2UgRExfSVNETjoKCQkqaWZ0eXBlID0gNjM7CgkJYnJlYWs7CgljYXNlIERMX0hJUFBJOgoJCSppZnR5cGUgPSA0NzsKCQlicmVhazsKI2lmZGVmIERMX0lCCgljYXNlIERMX0lCOgoJCSppZnR5cGUgPSAxOTk7CgkJYnJlYWs7CiNlbmRpZgoJY2FzZSBETF9GUkFNRToJLyogRnJhbWUgUmVsYXkgKi8KCQkqaWZ0eXBlID0gMzI7CgkJYnJlYWs7CgljYXNlIERMX0xPT1A6CgkJKmlmdHlwZSA9IDI0OwoJCWJyZWFrOwojaWZkZWYgRExfV0lGSQoJY2FzZSBETF9XSUZJOgoJCSppZnR5cGUgPSA3MTsKCQlicmVhazsKI2VuZGlmCiNpZmRlZiBETF9JUFY0CS8qIHRoZW4gSVB2NiBpcyBhbHNvIGRlZmluZWQgKi8KCWNhc2UgRExfSVBWNDoJLyogSVB2NCBUdW5uZWwgKi8KCWNhc2UgRExfSVBWNjoJLyogSVB2NiBUdW5uZWwgKi8KCQkqaWZ0eXBlID0gMTMxOwoJCWJyZWFrOwojZW5kaWYKCWRlZmF1bHQ6CgkJKmlmdHlwZSA9IDE7CS8qIE90aGVyICovCgkJYnJlYWs7Cgl9CgkKICAgICAgICByZXR1cm4gKDApOwogICAgfQogICAgY2FzZSBETF9FUlJPUl9BQ0s6IHsKICAgICAgICBkbF9lcnJvcl9hY2tfdCAqZXJycCA9IChkbF9lcnJvcl9hY2tfdCAqKWJ1ZjsKCiAgICAgICAgREVCVUdNU0dUTCgoImtlcm5lbF9zdW5vczU6ZGxwaSIsCiAgICAgICAgICAgICAgICAgICAgImdvdCBETF9FUlJPUl9BQ0s6IGRscGkgJWxkLCBlcnJvciAlbGRcbiIsCgkJICAgIChsb25nKWVycnAtPmRsX2Vycm5vLCAobG9uZyllcnJwLT5kbF91bml4X2Vycm5vKSk7CgogICAgICAgIGlmIChjdGxidWYubGVuIDwgRExfRVJST1JfQUNLX1NJWkUpCiAgICAgICAgICAgIHJldHVybiAoLTEpOwogICAgICAgIHJldHVybiAoZXJycC0+ZGxfZXJybm8pOwogICAgfQogICAgZGVmYXVsdDoKICAgICAgICBERUJVR01TR1RMKCgia2VybmVsX3N1bm9zNTpkbHBpIiwgImdvdCB0eXBlICV4XG4iLCAodW5zaWduZWQpZGxwLT5kbF9wcmltaXRpdmUpKTsKICAgICAgICByZXR1cm4gKC0xKTsKICAgIH0KfQoKc3RhdGljIGludApfZGxwaV9hdHRhY2goaW50IGZkLCBpbnQgcHBhKQp7CiAgICBkbF9hdHRhY2hfcmVxX3QgICAgIGF0dGFjaF9yZXE7CiAgICBzdHJ1Y3Qgc3RyYnVmICAgICAgIGN0bGJ1ZjsKICAgIHVuaW9uIERMX3ByaW1pdGl2ZXMgKmRscDsKICAgIGNoYXIgICAgICAgICAgICAgICAgYnVmW01BWChETF9PS19BQ0tfU0laRSwgRExfRVJST1JfQUNLX1NJWkUpXTsKICAgIGludCAgICAgICAgICAgICAgICAgZmxhZyA9IDA7CiAgIAogICAgYXR0YWNoX3JlcS5kbF9wcmltaXRpdmUgPSBETF9BVFRBQ0hfUkVROwogICAgYXR0YWNoX3JlcS5kbF9wcGEgPSBwcGE7CiAgICBjdGxidWYuYnVmID0gKGNoYXIgKikmYXR0YWNoX3JlcTsKICAgIGN0bGJ1Zi5sZW4gPSBETF9BVFRBQ0hfUkVRX1NJWkU7CiAgICBpZiAocHV0bXNnKGZkLCAmY3RsYnVmLCBOVUxMLCAwKSAhPSAwKQogICAgICAgIHJldHVybiAoLTEpOwoKICAgIGN0bGJ1Zi5idWYgPSBidWY7CiAgICBjdGxidWYubGVuID0gMDsKICAgIGN0bGJ1Zi5tYXhsZW4gPSBzaXplb2YoYnVmKTsKICAgIGlmIChnZXRtc2coZmQsICZjdGxidWYsIE5VTEwsICZmbGFnKSAhPSAwKQogICAgICAgIHJldHVybiAoLTEpOwoKICAgIGlmIChjdGxidWYubGVuIDwgc2l6ZW9mKHVpbnQzMl90KSkKICAgICAgICByZXR1cm4gKC0xKTsgCgogICAgZGxwID0gKHVuaW9uIERMX3ByaW1pdGl2ZXMgKilidWY7CiAgICBpZiAoZGxwLT5kbF9wcmltaXRpdmUgPT0gRExfT0tfQUNLICYmIGN0bGJ1Zi5sZW4gPj0gRExfT0tfQUNLX1NJWkUpCiAgICAgICAgcmV0dXJuICgwKTsgCiAgICByZXR1cm4gKC0xKTsKfQoKc3RhdGljIGludApfZGxwaV9wYXJzZV9kZXZuYW1lKGNoYXIgKmRldm5hbWUsIGludCAqcHBhcCkKewogICAgaW50IHBwYSA9IDA7CiAgICBpbnQgbSA9IDE7CiAgICBpbnQgaSA9IHN0cmxlbihkZXZuYW1lKSAtIDE7CgogICAgd2hpbGUgKGkgPj0gMCAmJiBpc2RpZ2l0KGRldm5hbWVbaV0gJiAweEZGKSkgewogICAgICAgIHBwYSArPSBtICogKGRldm5hbWVbaV0gLSAnMCcpOyAKICAgICAgICBtICo9IDEwOwogICAgICAgIGktLTsKICAgIH0KCiAgICBpZiAobSA9PSAxKSB7CiAgICAgICAgcmV0dXJuICgtMSk7CiAgICB9CiAgICAqcHBhcCA9IHBwYTsKICAgIGRldm5hbWVbaSArIDFdID0gJ1wwJzsKCiAgICByZXR1cm4gKDApOwp9CnN0YXRpYyBpbnQKZ2V0aWYobWliMl9pZkVudHJ5X3QgKmlmYnVmLCBzaXplX3Qgc2l6ZSwgcmVxX2UgcmVxX3R5cGUsCiAgICAgIG1pYjJfaWZFbnRyeV90ICpyZXNwLCAgc2l6ZV90ICpsZW5ndGgsIGludCAoKmNvbXApKHZvaWQgKiwgdm9pZCAqKSwKICAgICAgdm9pZCAqYXJnKQp7CiAgICBpbnQgICAgICAgICAgICAgZmQsIGksIHJldDsKICAgIGludCAgICAgICAgICAgICBpZnNkLCBpZnNkNiA9IC0xOwogICAgc3RydWN0IGxpZnJlcSAgIGxpZnJlcSwgKmxpZnJwOwogICAgbWliMl9pZkVudHJ5X3QgKmlmcDsKICAgIGludCAgICAgICAgICAgICBuZW50cmllcyA9IHNpemUgLyBzaXplb2YobWliMl9pZkVudHJ5X3QpOwogICAgZm91bmRfZSAgICAgICAgIHJlc3VsdCA9IE5PVF9GT1VORDsKICAgIGJvb2xlYW5fdCAgICAgICBpZl9pc3Y2OwogICAgdWludDY0X3QgICAgICAgIGlmX2ZsYWdzOyAgICAKICAgIHN0cnVjdCBpZl9uYW1laW5kZXggKmlmbmFtZSwgKmlmbnA7CgogICAgbGlmcnAgPSAmbGlmcmVxOyAKCiAgICBpZiAoKGlmc2QgPSBzb2NrZXQoQUZfSU5FVCwgU09DS19ER1JBTSwgMCkpIDwgMCkgewogICAgICAgIHJldHVybiAtMTsKICAgIH0KCiAgICBERUJVR01TR1RMKCgia2VybmVsX3N1bm9zNSIsICIuLi4uLi4gdXNpbmcgaWZfbmFtZWluZGV4XG4iKSk7CiAgICBpZiAoKGlmbmFtZSA9IGlmX25hbWVpbmRleCgpKSA9PSBOVUxMKSB7CiAgICAgICAgcmV0ID0gLTE7CiAgICAgICAgZ290byBSZXR1cm47CiAgICB9CiAgICAKICAgIC8qCiAgICAgKiBHYXRoZXIgaW5mb3JtYXRpb24gYWJvdXQgZWFjaCBpbnRlcmZhY2UgZm91bmQuIFdlIHRyeSB0byBoYW5kbGUgZXJyb3JzCiAgICAgKiBncmFjZWZ1bGx5OiBpZiBhbiBlcnJvciBvY2N1cnMgd2hpbGUgcHJvY2Vzc2luZyBhbiBpbnRlcmZhY2Ugd2Ugc2ltcGx5CiAgICAgKiBtb3ZlIGFsb25nIHRvIHRoZSBuZXh0IG9uZS4gUHJldmlvdXNseSwgdGhlIGZ1bmN0aW9uIHJldHVybmVkIHdpdGggYW4KICAgICAqIGVycm9yIHJpZ2h0IGF3YXkuIAogICAgICoKICAgICAqIGlmX25hbWVpbmRleCgpIGFscmVhZHkgZWxpbWluYXRlcyBkdXBsaWNhdGUgaW50ZXJmYWNlcywgc28gbm8gZXh0cmEKICAgICAqIGNoZWNrcyBhcmUgbmVlZGVkIGZvciBpbnRlcmZhY2VzIHRoYXQgaGF2ZSBib3RoIElQdjQgYW5kIElQdjYgcGx1bWJlZAogICAgICovCiBBZ2FpbjoKICAgIGZvciAoaSA9IDAsIGlmbnAgPSBpZm5hbWUsIGlmcCA9IChtaWIyX2lmRW50cnlfdCAqKSBpZmJ1ZjsgCiAgICAgaWZucC0+aWZfaW5kZXggIT0gMCAmJiAoaSA8IG5lbnRyaWVzKTsgaWZucCsrKSB7CgogICAgICAgIERFQlVHTVNHVEwoKCJrZXJuZWxfc3Vub3M1IiwgIi4uLi4uLiBnZXRpZiAlc1xuIiwgaWZucC0+aWZfbmFtZSkpOwogICAgICAgIG1lbWNweShsaWZycC0+bGlmcl9uYW1lLCBpZm5wLT5pZl9uYW1lLCBMSUZOQU1TSVopOwogICAgICAgIGlmX2lzdjYgPSBCX0ZBTFNFOwoKICAgICAgICBpZiAoaW9jdGwoaWZzZCwgU0lPQ0dMSUZGTEFHUywgbGlmcnApIDwgMCkgewogICAgICAgICAgICBpZiAoaWZzZDYgPT0gLTEpIHsKICAgICAgICAgICAgICAgIGlmICgoaWZzZDYgPSBzb2NrZXQoQUZfSU5FVDYsIFNPQ0tfREdSQU0sIDApKSA8IDApIHsKICAgICAgICAgICAgICAgICAgICByZXQgPSAtMTsKICAgICAgICAgICAgICAgICAgICBnb3RvIFJldHVybjsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAoaW9jdGwoaWZzZDYsIFNJT0NHTElGRkxBR1MsIGxpZnJwKSA8IDApIHsKICAgICAgICAgICAgICAgIHNubXBfbG9nKExPR19FUlIsICJTSU9DR0xJRkZMQUdTICVzOiAlc1xuIiwgCiAgICAgICAgICAgICAgICAgICAgICAgICBsaWZycC0+bGlmcl9uYW1lLCBzdHJlcnJvcihlcnJubykpOwogICAgICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWZfaXN2NiA9IEJfVFJVRTsKICAgICAgICB9IAogICAgICAgIGlmX2ZsYWdzID0gbGlmcnAtPmxpZnJfZmxhZ3M7CiAgICAgICAgICAgIAogICAgICAgIGlmIChpb2N0bChpZl9pc3Y2P2lmc2Q2Omlmc2QsIFNJT0NHTElGTVRVLCBsaWZycCkgPCAwKSB7CiAgICAgICAgICAgIERFQlVHTVNHVEwoKCJrZXJuZWxfc3Vub3M1IiwgIi4uLi4uLiBTSU9DR0xJRk1UVSBmYWlsZWRcbiIpKTsKICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgfQoKICAgICAgICBtZW1zZXQoaWZwLCAwLCBzaXplb2YobWliMl9pZkVudHJ5X3QpKTsKCiAgICAgICAgaWYgKChmZCA9IF9kbHBpX29wZW4oaWZucC0+aWZfbmFtZSkpICE9IC0xKSB7CiAgICAgICAgICAgIC8qIENvdWxkIG9wZW4gRExQSS4uLiBub3cgdHJ5IHRvIGdyYWIgc29tZSBpbmZvICovCiAgICAgICAgICAgICh2b2lkKSBfZGxwaV9nZXRfcGh5c19hZGRyZXNzKGZkLCBpZnAtPmlmUGh5c0FkZHJlc3Mub19ieXRlcywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2YoaWZwLT5pZlBoeXNBZGRyZXNzLm9fYnl0ZXMpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZpZnAtPmlmUGh5c0FkZHJlc3Mub19sZW5ndGgpOwogICAgICAgICAgICAodm9pZCkgX2RscGlfZ2V0X2lmdHlwZShmZCwgJmlmcC0+aWZUeXBlKTsKICAgICAgICAgICAgY2xvc2UoZmQpOwogICAgICAgIH0KCiAgICAgICAgc2V0X2lmX2luZm8oaWZwLCBpZm5wLT5pZl9pbmRleCwgaWZucC0+aWZfbmFtZSwgaWZfZmxhZ3MsIAogICAgICAgICAgICAgICAgICAgIGxpZnJwLT5saWZyX21ldHJpYyk7CgogICAgICAgIGlmIChnZXRfaWZfc3RhdHMoaWZwKSA8IDApIHsKICAgICAgICAgICAgREVCVUdNU0dUTCgoImtlcm5lbF9zdW5vczUiLCAiLi4uLi4uIGdldF9pZl9zdGF0cyBmYWlsZWRcbiIpKTsKICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgfQoKICAgICAgICAvKgogICAgICAgICAqIE9uY2Ugd2UgcmVhY2ggaGVyZSB3ZSBrbm93IHRoYXQgYWxsIHdlbnQgd2VsbCwgc28gbW92ZSB0bwogICAgICAgICAqIHRoZSBuZXh0IGlmRW50cnkuIAogICAgICAgICAqLwogICAgICAgIGkrKzsKICAgICAgICBpZnArKzsKICAgIH0KCiAgICBpZiAoKHJlcV90eXBlID09IEdFVF9ORVhUKSAmJiAocmVzdWx0ID09IE5FRURfTkVYVCkpIHsKICAgICAgICAgICAgLyoKICAgICAgICAgICAgICogRW5kIG9mIGJ1ZmZlciwgc28gIm5leHQiIGlzIHRoZSBmaXJzdCBpdGVtIGluIHRoZSBuZXh0IGJ1ZmZlciAKICAgICAgICAgICAgICovCiAgICAgICAgcmVxX3R5cGUgPSBHRVRfRklSU1Q7CiAgICB9CgogICAgcmVzdWx0ID0gZ2V0ZW50cnkocmVxX3R5cGUsICh2b2lkICopIGlmYnVmLCBzaXplLCBzaXplb2YobWliMl9pZkVudHJ5X3QpLAogICAgICAgICAgICAgICh2b2lkICopcmVzcCwgY29tcCwgYXJnKTsKCiAgICBpZiAoKHJlc3VsdCAhPSBGT1VORCkgJiYgKGkgPT0gbmVudHJpZXMpICYmIGlmbnAtPmlmX2luZGV4ICE9IDApIHsgCiAgICAvKgogICAgICogV2UgcmVhY2hlZCB0aGUgZW5kIG9mIHN1cHBsaWVkIGJ1ZmZlciwgYnV0IHRoZXJlIGlzCiAgICAgKiBzb21lIG1vcmUgc3R1ZmYgdG8gcmVhZCwgc28gY29udGludWUuCiAgICAgKi8KICAgICAgICBnb3RvIEFnYWluOwogICAgfQoKICAgIGlmIChyZXN1bHQgIT0gRk9VTkQpIHsKICAgICAgICByZXQgPSAyOwogICAgfSBlbHNlIHsKICAgICAgICBpZiAoaWZucC0+aWZfaW5kZXggIT0gMCkgewogICAgICAgICAgICByZXQgPSAxOyAgICAgICAgLyogRm91bmQgYW5kIG1vcmUgZGF0YSB0byBmZXRjaCAqLwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIHJldCA9IDA7ICAgICAgICAvKiBGb3VuZCBhbmQgbm8gbW9yZSBkYXRhICovCiAgICAgICAgfQogICAgICAgICpsZW5ndGggPSBpICogc2l6ZW9mKG1pYjJfaWZFbnRyeV90KTsgICAgICAgLyogQWN0dWFsIGNhY2hlIGxlbmd0aCAqLwogICAgfQoKIFJldHVybjoKICAgIGlmIChpZm5hbWUpCiAgICAgICAgaWZfZnJlZW5hbWVpbmRleChpZm5hbWUpOwogICAgY2xvc2UoaWZzZCk7CiAgICBpZiAoaWZzZDYgIT0gLTEpCiAgICAgICAgY2xvc2UoaWZzZDYpOwogICAgcmV0dXJuIHJldDsKfQojZWxzZSAvKiBvbmx5IHJlbHkgb24gU0lPQ0dJRkNPTkYgdG8gZ2V0IGludGVyZmFjZSBpbmZvcm1hdGlvbiAqLyAKCnN0YXRpYyBpbnQKZ2V0aWYobWliMl9pZkVudHJ5X3QgKmlmYnVmLCBzaXplX3Qgc2l6ZSwgcmVxX2UgcmVxX3R5cGUsCiAgICAgIG1pYjJfaWZFbnRyeV90ICpyZXNwLCAgc2l6ZV90ICpsZW5ndGgsIGludCAoKmNvbXApKHZvaWQgKiwgdm9pZCAqKSwKICAgICAgdm9pZCAqYXJnKQp7CiAgICBpbnQgICAgICAgICAgICAgaSwgcmV0LCBpZHggPSAxOwogICAgaW50ICAgICAgICAgICAgIGlmc2Q7CiAgICBzdGF0aWMgY2hhciAgICAqYnVmID0gTlVMTDsKICAgIHN0YXRpYyBpbnQgICAgICBidWZzaXplID0gMDsKICAgIHN0cnVjdCBpZmNvbmYgICBpZmNvbmY7CiAgICBzdHJ1Y3QgaWZyZXEgICAqaWZycDsKICAgIG1pYjJfaWZFbnRyeV90ICppZnA7CiAgICBtaWIyX2lwTmV0VG9NZWRpYUVudHJ5X3QgTWVkaWE7CiAgICBpbnQgICAgICAgICAgICAgbmVudHJpZXMgPSBzaXplIC8gc2l6ZW9mKG1pYjJfaWZFbnRyeV90KTsKICAgIGludCAgICAgICAgICAgICBpZl9mbGFncyA9IDA7CiAgICBmb3VuZF9lICAgICAgICAgcmVzdWx0ID0gTk9UX0ZPVU5EOwoKICAgIGlmICgoaWZzZCA9IHNvY2tldChBRl9JTkVULCBTT0NLX0RHUkFNLCAwKSkgPCAwKSB7CglyZXR1cm4gLTE7CiAgICB9CgogICAgaWYgKCFidWYpIHsKCWJ1ZnNpemUgPSAxMDI0MDsKCWJ1ZiA9IG1hbGxvYyhidWZzaXplKTsKCWlmICghYnVmKSB7CgkgICAgcmV0ID0gLTE7CgkgICAgZ290byBSZXR1cm47Cgl9CiAgICB9CgogICAgaWZjb25mLmlmY19idWYgPSBidWY7CiAgICBpZmNvbmYuaWZjX2xlbiA9IGJ1ZnNpemU7CiAgICB3aGlsZSAoaW9jdGwoaWZzZCwgU0lPQ0dJRkNPTkYsICZpZmNvbmYpID09IC0xKSB7CglidWZzaXplICs9IDEwMjQwOwoJZnJlZShidWYpOwoJYnVmID0gbWFsbG9jKGJ1ZnNpemUpOwoJaWYgKCFidWYpIHsKCSAgICByZXQgPSAtMTsKCSAgICBnb3RvIFJldHVybjsKCX0KCWlmY29uZi5pZmNfYnVmID0gYnVmOwoJaWZjb25mLmlmY19sZW4gPSBidWZzaXplOwogICAgfQoKIEFnYWluOgogICAgZm9yIChpID0gMCwgaWZwID0gKG1pYjJfaWZFbnRyeV90ICopIGlmYnVmLCBpZnJwID0gaWZjb25mLmlmY19yZXE7CgkgKChjaGFyICopIGlmcnAgPCAoKGNoYXIgKikgaWZjb25mLmlmY19idWYgKyBpZmNvbmYuaWZjX2xlbikpCiAgICAgICAgICAgICAmJiAoaSA8IG5lbnRyaWVzKTsgaSsrLCBpZnArKywgaWZycCsrLCBpZHgrKykgewoKCURFQlVHTVNHVEwoKCJrZXJuZWxfc3Vub3M1IiwgIi4uLi4uLiBnZXRpZiAlc1xuIiwgaWZycC0+aWZyX25hbWUpKTsKCglpZiAoaW9jdGwoaWZzZCwgU0lPQ0dJRkZMQUdTLCBpZnJwKSA8IDApIHsKCSAgICByZXQgPSAtMTsKCSAgICBzbm1wX2xvZyhMT0dfRVJSLCAiU0lPQ0dJRkZMQUdTICVzOiAlc1xuIiwgaWZycC0+aWZyX25hbWUsCiAgICAgICAgICAgICAgICAgICAgIHN0cmVycm9yKGVycm5vKSk7CgkgICAgZ290byBSZXR1cm47Cgl9CiAgICAgICAgaWZfZmxhZ3MgPSBpZnJwLT5pZnJfZmxhZ3M7CgoJaWYgKGlvY3RsKGlmc2QsIFNJT0NHSUZNVFUsIGlmcnApIDwgMCkgewoJICAgIHJldCA9IC0xOwoJICAgIERFQlVHTVNHVEwoKCJrZXJuZWxfc3Vub3M1IiwgIi4uLi4uLiBTSU9DR0lGTVRVIGZhaWxlZFxuIikpOwoJICAgIGdvdG8gUmV0dXJuOwoJfQoKCW1lbXNldChpZnAsIDAsIHNpemVvZihtaWIyX2lmRW50cnlfdCkpOwoJc2V0X2lmX2luZm8oaWZwLCBpZHgsIGlmcnAtPmlmcl9uYW1lLCBpZl9mbGFncywgaWZycC0+aWZyX21ldHJpYyk7CgkKICAgICAgICBpZiAoZ2V0X2lmX3N0YXRzKGlmcCkgPCAwKSB7CiAgICAgICAgICAgIHJldCA9IC0xOwogICAgICAgICAgICBnb3RvIFJldHVybjsKICAgICAgICB9CgkvKgoJICogQW4gYXR0ZW1wdCB0byBkZXRlcm1pbmUgdGhlIHBoeXNpY2FsIGFkZHJlc3Mgb2YgdGhlIGludGVyZmFjZS4KCSAqIFRoZXJlIHNob3VsZCBiZSBhIG1vcmUgZWxlZ2FudCBzb2x1dGlvbiB1c2luZyBETFBJLCBidXQgInRoZSBtYXJnaW4KCSAqIGlzIHRvbyBzbWFsbCB0byBwdXQgaXQgaGVyZSAuLi4iCgkgKi8KCglpZiAoaW9jdGwoaWZzZCwgU0lPQ0dJRkFERFIsIGlmcnApIDwgMCkgewoJICAgIHJldCA9IC0xOwoJICAgIGdvdG8gUmV0dXJuOwoJfQoKCWlmIChnZXRNaWJzdGF0KE1JQl9JUF9ORVQsICZNZWRpYSwgc2l6ZW9mKG1pYjJfaXBOZXRUb01lZGlhRW50cnlfdCksCgkJICAgICAgIEdFVF9FWEFDVCwgJk5hbWVfY21wLCBpZnJwKSA9PSAwKSB7CgkgICAgaWZwLT5pZlBoeXNBZGRyZXNzID0gTWVkaWEuaXBOZXRUb01lZGlhUGh5c0FkZHJlc3M7Cgl9CiAgICB9CgogICAgaWYgKChyZXFfdHlwZSA9PSBHRVRfTkVYVCkgJiYgKHJlc3VsdCA9PSBORUVEX05FWFQpKSB7CiAgICAgICAgICAgIC8qCiAgICAgICAgICAgICAqIEVuZCBvZiBidWZmZXIsIHNvICJuZXh0IiBpcyB0aGUgZmlyc3QgaXRlbSBpbiB0aGUgbmV4dCBidWZmZXIgCiAgICAgICAgICAgICAqLwogICAgICAgICAgICByZXFfdHlwZSA9IEdFVF9GSVJTVDsKICAgIH0KCiAgICByZXN1bHQgPSBnZXRlbnRyeShyZXFfdHlwZSwgKHZvaWQgKikgaWZidWYsIHNpemUsIHNpemVvZihtaWIyX2lmRW50cnlfdCksCgkJICAgICAgKHZvaWQgKilyZXNwLCBjb21wLCBhcmcpOwoKICAgIGlmICgocmVzdWx0ICE9IEZPVU5EKSAmJiAoaSA9PSBuZW50cmllcykgJiYgCgkoKGNoYXIgKilpZnJwIDwgKGNoYXIgKilpZmNvbmYuaWZjX2J1ZiArIGlmY29uZi5pZmNfbGVuKSkgewoJLyoKCSAqIFdlIHJlYWNoZWQgdGhlIGVuZCBvZiBzdXBwbGllZCBidWZmZXIsIGJ1dCB0aGVyZSBpcwoJICogc29tZSBtb3JlIHN0dWZmIHRvIHJlYWQsIHNvIGNvbnRpbnVlLgoJICovCglpZmNvbmYuaWZjX2xlbiAtPSBpICogc2l6ZW9mKHN0cnVjdCBpZnJlcSk7CglpZmNvbmYuaWZjX3JlcSA9IGlmcnA7Cglnb3RvIEFnYWluOwogICAgfQoKICAgIGlmIChyZXN1bHQgIT0gRk9VTkQpIHsKICAgICAgICAgICAgcmV0ID0gMjsKICAgIH0gZWxzZSB7CglpZiAoKGNoYXIgKilpZnJwIDwgKGNoYXIgKilpZmNvbmYuaWZjX2J1ZiArIGlmY29uZi5pZmNfbGVuKSB7CgkgICAgcmV0ID0gMTsgICAgICAgIC8qIEZvdW5kIGFuZCBtb3JlIGRhdGEgdG8gZmV0Y2ggKi8KCX0gZWxzZSB7CgkgICAgcmV0ID0gMDsgICAgICAgIC8qIEZvdW5kIGFuZCBubyBtb3JlIGRhdGEgKi8KCX0KCSpsZW5ndGggPSBpICogc2l6ZW9mKG1pYjJfaWZFbnRyeV90KTsgICAgICAgLyogQWN0dWFsIGNhY2hlIGxlbmd0aCAqLwogICAgfQoKIFJldHVybjoKICAgIGNsb3NlKGlmc2QpOwogICAgcmV0dXJuIHJldDsKfQojZW5kaWYgLypkZWZpbmVkKEhBVkVfSUZfTkFNRUlOREVYKSYmZGVmaW5lZChORVRTTk1QX0lOQ0xVREVfSUZUQUJMRV9SRVdSSVRFUykqLwoKc3RhdGljIHZvaWQKc2V0X2lmX2luZm8obWliMl9pZkVudHJ5X3QgKmlmcCwgdW5zaWduZWQgaW5kZXgsIGNoYXIgKm5hbWUsIHVpbnQ2NF90IGZsYWdzLAogICAgICAgICAgICBpbnQgbXR1KQp7IAogICAgYm9vbGVhbl90IGhhdmVzcGVlZCA9IEJfRkFMU0U7CgogICAgLyoKICAgICAqIFNldCBiYXNpYyBpbmZvcm1hdGlvbiAKICAgICAqLwogICAgaWZwLT5pZkluZGV4ID0gaW5kZXg7CiAgICBpZnAtPmlmRGVzY3Iub19sZW5ndGggPSBzdHJsZW4obmFtZSk7CiAgICBzdHJjcHkoaWZwLT5pZkRlc2NyLm9fYnl0ZXMsIG5hbWUpOwogICAgaWZwLT5pZkFkbWluU3RhdHVzID0gKGZsYWdzICYgSUZGX1VQKSA/IDEgOiAyOwogICAgaWZwLT5pZk9wZXJTdGF0dXMgPSAoKGZsYWdzICYgSUZGX1VQKSAmJiAoZmxhZ3MgJiBJRkZfUlVOTklORykpID8gMSA6IDI7CiAgICBpZnAtPmlmTGFzdENoYW5nZSA9IDA7ICAgICAgLyogV2hvIGtub3dzIC4uLiAgKi8KICAgIGlmcC0+ZmxhZ3MgPSBmbGFnczsKICAgIGlmcC0+aWZNdHUgPSBtdHU7CiAgICBpZnAtPmlmU3BlZWQgPSAwOwoKICAgIC8qCiAgICAgKiBHZXQgbGluayBzcGVlZAogICAgICovCiAgICBpZiAoKGdldEtzdGF0SW50KE5VTEwsIG5hbWUsICJpZnNwZWVkIiwgJmlmcC0+aWZTcGVlZCkgPT0gMCkpIHsKICAgICAgICAvKgogICAgICAgICAqIGNoZWNrIGZvciBTdW5PUyBwYXRjaCB3aXRoIGhhbGYgaW1wbGVtZW50ZWQgaWZTcGVlZCAKICAgICAgICAgKi8KICAgICAgICBpZiAoaWZwLT5pZlNwZWVkID4gMCAmJiBpZnAtPmlmU3BlZWQgPCAxMDAwMCkgewogICAgICAgICAgICBpZnAtPmlmU3BlZWQgKj0gMTAwMDAwMDsKICAgICAgICB9CgloYXZlc3BlZWQgPSBCX1RSVUU7CiAgICB9IGVsc2UgaWYgKGdldEtzdGF0SW50KE5VTEwsIG5hbWUsICJpZlNwZWVkIiwgJmlmcC0+aWZTcGVlZCkgPT0gMCkgewogICAgICAgIC8qCiAgICAgICAgICogdGhpcyBpcyBnb29kIAogICAgICAgICAqLwoJaGF2ZXNwZWVkID0gQl9UUlVFOwogICAgfSBlbHNlIGlmIChnZXRLc3RhdEludCgibGluayIsIG5hbWUsICJpZnNwZWVkIiwgJmlmcC0+aWZTcGVlZCkgPT0gMCkgewoJaGF2ZXNwZWVkID0gQl9UUlVFOwogICAgfQoKICAgIC8qIG1ha2UgaWZPcGVyU3RhdHVzIGRlcGVuZCBvbiBsaW5rIHN0YXR1cyBpZiBhdmFpbGFibGUgKi8KICAgIGlmIChpZnAtPmlmQWRtaW5TdGF0dXMgPT0gMSkgewogICAgICAgIGludCBpX3RtcDsKICAgICAgICAvKiBvbmx5IFVQZWQgaW50ZXJmYWNlcyBnZXQgY29ycmVjdCBsaW5rIHN0YXR1cyAtIGlmIGFueSAqLwogICAgICAgIGlmIChnZXRLc3RhdEludChOVUxMLCBuYW1lLCJsaW5rX3VwIiwmaV90bXApID09IDApIHsKICAgICAgICAgICAgaWZwLT5pZk9wZXJTdGF0dXMgPSBpX3RtcCA/IDEgOiAyOwojaWZkZWYgSUZGX0ZBSUxFRAogICAgICAgIH0gZWxzZSBpZiAoZmxhZ3MgJiBJRkZfRkFJTEVEKSB7CiAgICAgICAgICAgIC8qCgkgICAgICogSWYgSVBNUCBpcyB1c2VkLCBhbmQgaWYgdGhlIGRhZW1vbiBtYXJrcyB0aGUgaW50ZXJmYWNlCgkgICAgICogYXMgJ2ZhaWxlZCcsIHRoZW4gd2Uga25vdyBmb3Igc3VyZSBzb21ldGhpbmcgaXMgYW1pc3MuCiAgICAgICAgICAgICAqLwogICAgICAgICAgICBpZnAtPmlmT3BlclN0YXR1cyA9IDI7CiNlbmRpZgoJfSBlbHNlIGlmIChoYXZlc3BlZWQgPT0gQl9UUlVFICYmIGlmcC0+aWZTcGVlZCA9PSAwKSB7CgkgICAgLyogSGV1cmlzdGljICovCgkgICAgaWZwLT5pZk9wZXJTdGF0dXMgPSAyOwoJfQogICAgfQoKICAgIC8qCiAgICAgKiBTZXQgbGluayBUeXBlIGFuZCBTcGVlZCAoaWYgaXQgY291bGQgbm90IGJlIGRldGVybWluZWQgZnJvbSBrc3RhdCkKICAgICAqLwogICAgaWYgKGlmcC0+aWZUeXBlID09IDI0KSB7CiAgICAgICAgaWZwLT5pZlNwZWVkID0gMTI3MDAwMDAwOwogICAgfSBlbHNlIGlmIChpZnAtPmlmVHlwZSA9PSAxIHx8IGlmcC0+aWZUeXBlID09IDApIHsKICAgICAgICAvKgoJICogQ291bGQgbm90IGdldCB0aGUgdHlwZSBmcm9tIERMUEksIHNvIGxldHMgZmFsbCBiYWNrIHRvIHRoZSBoYXJkY29kZWQKCSAqIHZhbHVlcy4KCSAqLwogICAgICAgIHN3aXRjaCAobmFtZVswXSkgewogICAgICAgIGNhc2UgJ2EnOiAgICAgICAgICAvKiBhdGggKDgwMi4xMSkgKi8KICAgICAgICAgICAgaWYgKG5hbWVbMV0gPT0gJ3QnICYmIG5hbWVbMl0gPT0gJ2gnKQogICAgICAgICAgICAgICAgaWZwLT5pZlR5cGUgPSA3MTsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgY2FzZSAnbCc6ICAgICAgICAgIC8qIGxlIC8gbG8gLyBsYW5lIChBVE0gTEFOIEVtdWxhdGlvbikgKi8KICAgICAgICAgICAgaWYgKG5hbWVbMV0gPT0gJ28nKSB7CiAgICAgICAgICAgIGlmICghaWZwLT5pZlNwZWVkKQogICAgICAgICAgICAgICAgaWZwLT5pZlNwZWVkID0gMTI3MDAwMDAwOwogICAgICAgICAgICBpZnAtPmlmVHlwZSA9IDI0OwogICAgICAgICAgICB9IGVsc2UgaWYgKG5hbWVbMV0gPT0gJ2UnKSB7CiAgICAgICAgICAgIGlmICghaWZwLT5pZlNwZWVkKQogICAgICAgICAgICAgICAgaWZwLT5pZlNwZWVkID0gMTAwMDAwMDA7CiAgICAgICAgICAgIGlmcC0+aWZUeXBlID0gNjsKICAgICAgICAgICAgfSBlbHNlIGlmIChuYW1lWzFdID09ICdhJykgewogICAgICAgICAgICBpZiAoIWlmcC0+aWZTcGVlZCkKICAgICAgICAgICAgICAgIGlmcC0+aWZTcGVlZCA9IDE1NTAwMDAwMDsKICAgICAgICAgICAgaWZwLT5pZlR5cGUgPSAzNzsKICAgICAgICAgICAgfQogICAgICAgICAgICBicmVhazsKICAgIAogICAgICAgIGNhc2UgJ2cnOiAgICAgICAgICAvKiBnZSAoZ2lnYWJpdCBldGhlcm5ldCBjYXJkKSAgKi8KICAgICAgICBjYXNlICdjJzogICAgICAgICAgLyogY2UgKENhc3NpbmkgR2lnYWJpdC1FdGhlcm5ldCAoUENJKSAqLwogICAgICAgICAgICBpZiAoIWlmcC0+aWZTcGVlZCkKICAgICAgICAgICAgaWZwLT5pZlNwZWVkID0gMTAwMDAwMDAwMDsKICAgICAgICAgICAgaWZwLT5pZlR5cGUgPSA2OwogICAgICAgICAgICBicmVhazsKICAgIAogICAgICAgIGNhc2UgJ2gnOiAgICAgICAgICAvKiBobWUgKFNCdXMgY2FyZCkgKi8KICAgICAgICBjYXNlICdlJzogICAgICAgICAgLyogZXJpIChQQ0kgY2FyZCkgKi8KICAgICAgICBjYXNlICdiJzogICAgICAgICAgLyogYmUgKi8KICAgICAgICBjYXNlICdkJzogICAgICAgICAgLyogZG1mZSAtLSBmb3VuZCBvbiBuZXRyYSBYMSAqLwogICAgICAgICAgICBpZiAoIWlmcC0+aWZTcGVlZCkKICAgICAgICAgICAgaWZwLT5pZlNwZWVkID0gMTAwMDAwMDAwOwogICAgICAgICAgICBpZnAtPmlmVHlwZSA9IDY7CiAgICAgICAgICAgIGJyZWFrOwogICAgCiAgICAgICAgY2FzZSAnZic6ICAgICAgICAgIC8qIGZhIChGb3JlIEFUTSkgKi8KICAgICAgICAgICAgaWYgKCFpZnAtPmlmU3BlZWQpCiAgICAgICAgICAgIGlmcC0+aWZTcGVlZCA9IDE1NTAwMDAwMDsKICAgICAgICAgICAgaWZwLT5pZlR5cGUgPSAzNzsKICAgICAgICAgICAgYnJlYWs7CiAgICAKICAgICAgICBjYXNlICdxJzogICAgICAgICAvKiBxZSAoUXVhZEV0aGVyKS9xYSAoRm9yZSBBVE0pL3FmZSAoUXVhZEZhc3RFdGhlcikgKi8KICAgICAgICAgICAgaWYgKG5hbWVbMV0gPT0gJ2EnKSB7CiAgICAgICAgICAgIGlmICghaWZwLT5pZlNwZWVkKQogICAgICAgICAgICAgICAgaWZwLT5pZlNwZWVkID0gMTU1MDAwMDAwOwogICAgICAgICAgICBpZnAtPmlmVHlwZSA9IDM3OwogICAgICAgICAgICB9IGVsc2UgaWYgKG5hbWVbMV0gPT0gJ2UnKSB7CiAgICAgICAgICAgICAgICBpZiAoIWlmcC0+aWZTcGVlZCkKICAgICAgICAgICAgICAgICAgICBpZnAtPmlmU3BlZWQgPSAxMDAwMDAwMDsKICAgICAgICAgICAgICAgIGlmcC0+aWZUeXBlID0gNjsKICAgICAgICAgICAgfSBlbHNlIGlmIChuYW1lWzFdID09ICdmJykgewogICAgICAgICAgICAgICAgaWYgKCFpZnAtPmlmU3BlZWQpCiAgICAgICAgICAgICAgICAgICAgaWZwLT5pZlNwZWVkID0gMTAwMDAwMDAwOwogICAgICAgICAgICAgICAgaWZwLT5pZlR5cGUgPSA2OwogICAgICAgICAgICB9CiAgICAgICAgICAgIGJyZWFrOwogICAgCiAgICAgICAgY2FzZSAnaSc6ICAgICAgICAgIC8qIGliZCAoSW5maW5pYmFuZCkvaXAudHVuIChJUCB0dW5uZWwpICovCiAgICAgICAgICAgIGlmIChuYW1lWzFdID09ICdiJykKICAgICAgICAgICAgICAgIGlmcC0+aWZUeXBlID0gMTk5OwogICAgICAgICAgICBlbHNlIGlmIChuYW1lWzFdID09ICdwJykKICAgICAgICAgICAgICAgIGlmcC0+aWZUeXBlID0gMTMxOwogICAgICAgICAgICBicmVhazsKICAgICAgICB9CiAgICB9Cn0KCnN0YXRpYyBpbnQgCmdldF9pZl9zdGF0cyhtaWIyX2lmRW50cnlfdCAqaWZwKQp7CiAgICBDb3VudGVyIGxfdG1wOwogICAgY2hhciAqbmFtZSA9IGlmcC0+aWZEZXNjci5vX2J5dGVzOwoKICAgIGlmIChzdHJjaHIobmFtZSwgJzonKSkKICAgICAgICByZXR1cm4gKDApOyAKCiAgICAvKgogICAgICogRmlyc3QgdHJ5IHRvIGdyYWIgNjQtYml0IGNvdW50ZXJzOyBpZiB0aGV5IGFyZSBub3QgYXZhaWxhYmxlLAogICAgICogZmFsbCBiYWNrIHRvIDMyLWJpdC4KICAgICAqLwogICAgaWYgKGdldEtzdGF0KG5hbWUsICJpcGFja2V0czY0IiwgJmlmcC0+aWZIQ0luVWNhc3RQa3RzKSAhPSAwKSB7CiAgICAgICAgaWYgKGdldEtzdGF0SW50KE5VTEwsIG5hbWUsICJpcGFja2V0cyIsICZpZnAtPmlmSW5VY2FzdFBrdHMpICE9IDApIHsKICAgICAgICAgICAgcmV0dXJuICgtMSk7CiAgICAgICAgfQogICAgfSBlbHNlIHsgCiAgICAgICAgICAgIGlmcC0+aWZJblVjYXN0UGt0cyA9ICh1aW50MzJfdCkoaWZwLT5pZkhDSW5VY2FzdFBrdHMgJiAweGZmZmZmZmZmKTsgCiAgICB9CiAgICAKICAgIGlmIChnZXRLc3RhdChuYW1lLCAicmJ5dGVzNjQiLCAmaWZwLT5pZkhDSW5PY3RldHMpICE9IDApIHsKICAgICAgICBpZiAoZ2V0S3N0YXRJbnQoTlVMTCwgbmFtZSwgInJieXRlcyIsICZpZnAtPmlmSW5PY3RldHMpICE9IDApIHsKICAgICAgICAgICAgaWZwLT5pZkluT2N0ZXRzID0gaWZwLT5pZkluVWNhc3RQa3RzICogMzA4OyAKICAgICAgICB9CiAgICB9IGVsc2UgewogICAgICAgICAgICBpZnAtPmlmSW5PY3RldHMgPSAodWludDMyX3QpKGlmcC0+aWZIQ0luT2N0ZXRzICYgMHhmZmZmZmZmZik7CiAgICB9CiAgIAogICAgaWYgKGdldEtzdGF0KG5hbWUsICJvcGFja2V0czY0IiwgJmlmcC0+aWZIQ091dFVjYXN0UGt0cykgIT0gMCkgewogICAgICAgIGlmIChnZXRLc3RhdEludChOVUxMLCBuYW1lLCAib3BhY2tldHMiLCAmaWZwLT5pZk91dFVjYXN0UGt0cykgIT0gMCkgewogICAgICAgICAgICByZXR1cm4gKC0xKTsKICAgICAgICB9CiAgICB9IGVsc2UgewogICAgICAgICBpZnAtPmlmT3V0VWNhc3RQa3RzID0gKHVpbnQzMl90KShpZnAtPmlmSENPdXRVY2FzdFBrdHMgJiAweGZmZmZmZmZmKTsKICAgIH0KICAgIAogICAgaWYgKGdldEtzdGF0KG5hbWUsICJvYnl0ZXM2NCIsICZpZnAtPmlmSENPdXRPY3RldHMpICE9IDApIHsKICAgICAgICBpZiAoZ2V0S3N0YXRJbnQoTlVMTCwgbmFtZSwgIm9ieXRlcyIsICZpZnAtPmlmT3V0T2N0ZXRzKSAhPSAwKSB7IAogICAgICAgICAgICBpZnAtPmlmT3V0T2N0ZXRzID0gaWZwLT5pZk91dFVjYXN0UGt0cyAqIDMwODsgICAgLyogWFhYICovCiAgICAgICAgfQogICAgfSBlbHNlIHsKICAgICAgICBpZnAtPmlmT3V0T2N0ZXRzID0gKHVpbnQzMl90KShpZnAtPmlmSENPdXRPY3RldHMgJiAweGZmZmZmZmZmKTsKICAgIH0KCiAgICBpZiAoaWZwLT5pZlR5cGUgPT0gMjQpICAvKiBMb29wYmFjayAqLwogICAgICAgIHJldHVybiAoMCk7CgogICAgLyogc29tZT8gVkxBTiBpbnRlcmZhY2VzIGRvbid0IGhhdmUgZXJyb3IgY291bnRlcnMsIHNvIGlnbm9yZSBmYWlsdXJlICovCiAgICBnZXRLc3RhdEludChOVUxMLCBuYW1lLCAiaWVycm9ycyIsICZpZnAtPmlmSW5FcnJvcnMpOwogICAgZ2V0S3N0YXRJbnQoTlVMTCwgbmFtZSwgIm9lcnJvcnMiLCAmaWZwLT5pZk91dEVycm9ycyk7CgogICAgLyogVHJ5IHRvIGdyYWIgc29tZSBhZGRpdGlvbmFsIGluZm9ybWF0aW9uICovCiAgICBnZXRLc3RhdEludChOVUxMLCBuYW1lLCAiY29sbGlzaW9ucyIsICZpZnAtPmlmQ29sbGlzaW9ucyk7IAogICAgZ2V0S3N0YXRJbnQoTlVMTCwgbmFtZSwgInVua25vd25zIiwgJmlmcC0+aWZJblVua25vd25Qcm90b3MpOyAKICAgICAgICAgICAgICAgIAoKICAgIC8qCiAgICAgKiBUT0RPIHNvbWUgTklDcyBtYWludGFpbiA2NC1iaXQgY291bnRlcnMgZm9yIG11bHRpL2Jyb2FkY2FzdAogICAgICogcGFja2V0czsgc2hvdWxkIHRyeSB0byBnZXQgdGhhdCBpbmZvcm1hdGlvbi4KICAgICAqLwogICAgaWYgKGdldEtzdGF0SW50KE5VTEwsIG5hbWUsICJicmRjc3RyY3YiLCAmbF90bXApID09IDApIAogICAgICAgIGlmcC0+aWZIQ0luQnJvYWRjYXN0UGt0cyA9IGxfdG1wOwoKICAgIGlmIChnZXRLc3RhdEludChOVUxMLCBuYW1lLCAibXVsdGlyY3YiLCAmbF90bXApID09IDApCiAgICAgICAgaWZwLT5pZkhDSW5NdWx0aWNhc3RQa3RzID0gbF90bXA7CgogICAgaWZwLT5pZkluTlVjYXN0UGt0cyA9ICh1aW50MzJfdCkoaWZwLT5pZkhDSW5Ccm9hZGNhc3RQa3RzICsgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZnAtPmlmSENJbk11bHRpY2FzdFBrdHMpOwoKICAgIGlmIChnZXRLc3RhdEludChOVUxMLCBuYW1lLCAiYnJkY3N0eG10IiwgJmxfdG1wKSA9PSAwKQogICAgICAgIGlmcC0+aWZIQ091dEJyb2FkY2FzdFBrdHMgPSBsX3RtcDsKCiAgICBpZiAoZ2V0S3N0YXRJbnQoTlVMTCwgbmFtZSwgIm11bHRpeG10IiwgJmxfdG1wKSA9PSAwKQogICAgICAgIGlmcC0+aWZIQ091dE11bHRpY2FzdFBrdHMgPSBsX3RtcDsKCiAgICBpZnAtPmlmT3V0TlVjYXN0UGt0cyA9ICh1aW50MzJfdCkoaWZwLT5pZkhDT3V0QnJvYWRjYXN0UGt0cyArIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmcC0+aWZIQ091dE11bHRpY2FzdFBrdHMpOwogICAgcmV0dXJuKDApOwp9Ci8qCiAqIEFsd2F5cyBUUlVFLiBNYXkgYmUgdXNlZCBhcyBhIGNvbXBhcmlzb24gZnVuY3Rpb24gaW4gZ2V0TWlic3RhdAogKiB0byBvYnRhaW4gdGhlIHdob2xlIHRhYmxlIChHRVRfRklSU1Qgc2hvdWxkIGJlIHVzZWQpIAogKi8KaW50CkdldF9ldmVyeXRoaW5nKHZvaWQgKngsIHZvaWQgKnkpCnsKICAgIHJldHVybiAwOyAgICAgICAgICAgICAvKiBBbHdheXMgVFJVRSAqLwp9CgovKgogKiBDb21wYXJlIG5hbWUgYW5kIElQIGFkZHJlc3Mgb2YgdGhlIGludGVyZmFjZSB0byBBUlAgdGFibGUgZW50cnkuCiAqIE5lZWRlZCB0byBvYnRhaW4gdGhlIHBoeXNpY2FsIGFkZHJlc3Mgb2YgdGhlIGludGVyZmFjZSBpbiBnZXRpZi4KICovCnN0YXRpYyBpbnQKTmFtZV9jbXAodm9pZCAqaWZycCwgdm9pZCAqZXApCnsKICAgIHN0cnVjdCBzb2NrYWRkcl9pbiAqcyA9IChzdHJ1Y3Qgc29ja2FkZHJfaW4gKikKCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJigoKHN0cnVjdCBpZnJlcSAqKWlmcnApLT5pZnJfYWRkcik7CiAgICBtaWIyX2lwTmV0VG9NZWRpYUVudHJ5X3QgKkVwID0gKG1pYjJfaXBOZXRUb01lZGlhRW50cnlfdCAqKWVwOwoKICAgIGlmICgoc3RybmNtcChFcC0+aXBOZXRUb01lZGlhSWZJbmRleC5vX2J5dGVzLAoJCSAoKHN0cnVjdCBpZnJlcSAqKWlmcnApLT5pZnJfbmFtZSwKCQkgRXAtPmlwTmV0VG9NZWRpYUlmSW5kZXgub19sZW5ndGgpID09IDApICYmCgkocy0+c2luX2FkZHIuc19hZGRyID09IEVwLT5pcE5ldFRvTWVkaWFOZXRBZGRyZXNzKSkgewoJcmV0dXJuIDA7CiAgICB9IGVsc2UgewoJcmV0dXJuIDE7CiAgICB9Cn0KCi8qCiAqIFRyeSB0byBkZXRlcm1pbmUgdGhlIGluZGV4IG9mIGEgcGFydGljdWxhciBpbnRlcmZhY2UuIElmIG1mZC1yZXdyaXRlcyBpcwogKiBzcGVjaWZpZWQsIHRoZW4gdGhpcyBmdW5jdGlvbiB3b3VsZCBvbmx5IGJlIHVzZWQgd2hlbiB0aGUgc3lzdGVtIGRvZXMgbm90CiAqIGhhdmUgaWZfbmFtZXRvaW5kZXgoM1NPQ0tFVCkuCiAqLwppbnQKc29sYXJpczJfaWZfbmFtZXRvaW5kZXgoY29uc3QgY2hhciAqTmFtZSwgaW50IExlbikKewogICAgaW50ICAgICAgICAgICAgIGksIHNkLCBsYXN0bGVuID0gMCwgaW50ZXJmYWNlcyA9IDA7CiAgICBzdHJ1Y3QgaWZjb25mICAgaWZjOwogICAgc3RydWN0IGlmcmVxICAgKmlmcnAgPSBOVUxMOwogICAgY2hhciAgICAgICAgICAgKmJ1ZiA9IE5VTEw7CgogICAgaWYgKE5hbWUgPT0gMCkgewogICAgICAgIHJldHVybiAwOwogICAgfQogICAgaWYgKChzZCA9IHNvY2tldChBRl9JTkVULCBTT0NLX0RHUkFNLCAwKSkgPCAwKSB7CiAgICAgICAgcmV0dXJuIDA7CiAgICB9CgogICAgLyoKICAgICAqIENvcGUgd2l0aCBsb3RzIG9mIGludGVyZmFjZXMgYW5kIGJyb2tlbm5lc3Mgb2YgaW9jdGwgU0lPQ0dJRkNPTkYKICAgICAqIG9uIHNvbWUgcGxhdGZvcm1zOyBzZWUgVy4gUi4gU3RldmVucywgYGBVbml4IE5ldHdvcmsgUHJvZ3JhbW1pbmcKICAgICAqIFZvbHVtZSBJJycsIHAuNDM1LiAgCiAgICAgKi8KCiAgICBmb3IgKGkgPSA4OzsgaSArPSA4KSB7CiAgICAgICAgYnVmID0gY2FsbG9jKGksIHNpemVvZihzdHJ1Y3QgaWZyZXEpKTsKICAgICAgICBpZiAoYnVmID09IE5VTEwpIHsKICAgICAgICAgICAgY2xvc2Uoc2QpOwogICAgICAgICAgICByZXR1cm4gMDsKICAgICAgICB9CiAgICAgICAgaWZjLmlmY19sZW4gPSBpICogc2l6ZW9mKHN0cnVjdCBpZnJlcSk7CiAgICAgICAgaWZjLmlmY19idWYgPSAoY2FkZHJfdCkgYnVmOwoKICAgICAgICBpZiAoaW9jdGwoc2QsIFNJT0NHSUZDT05GLCAoY2hhciAqKSAmaWZjKSA8IDApIHsKICAgICAgICAgICAgaWYgKGVycm5vICE9IEVJTlZBTCB8fCBsYXN0bGVuICE9IDApIHsKICAgICAgICAgICAgICAgIC8qCiAgICAgICAgICAgICAgICAgKiBTb21ldGhpbmcgaGFzIGdvbmUgZ2VudWluZWx5IHdyb25nLiAgCiAgICAgICAgICAgICAgICAgKi8KICAgICAgICAgICAgICAgIGZyZWUoYnVmKTsKICAgICAgICAgICAgICAgIGNsb3NlKHNkKTsKICAgICAgICAgICAgICAgIHJldHVybiAwOwogICAgICAgICAgICB9CiAgICAgICAgICAgIC8qCiAgICAgICAgICAgICAqIE90aGVyd2lzZSwgaXQgY291bGQganVzdCBiZSB0aGF0IHRoZSBidWZmZXIgaXMgdG9vIHNtYWxsLiAgCiAgICAgICAgICAgICAqLwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIGlmIChpZmMuaWZjX2xlbiA9PSBsYXN0bGVuKSB7CiAgICAgICAgICAgICAgICAvKgogICAgICAgICAgICAgICAgICogVGhlIGxlbmd0aCBpcyB0aGUgc2FtZSBhcyB0aGUgbGFzdCB0aW1lOyB3ZSdyZSBkb25lLiAgCiAgICAgICAgICAgICAgICAgKi8KICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGxhc3RsZW4gPSBpZmMuaWZjX2xlbjsKICAgICAgICB9CiAgICAgICAgZnJlZShidWYpOwogICAgfQoKICAgIGlmcnAgPSBpZmMuaWZjX3JlcTsKICAgIGludGVyZmFjZXMgPSAoaWZjLmlmY19sZW4gLyBzaXplb2Yoc3RydWN0IGlmcmVxKSkgKyAxOwoKICAgIGZvciAoaSA9IDE7IGkgPCBpbnRlcmZhY2VzOyBpKyssIGlmcnArKykgewogICAgICAgIGlmIChzdHJuY21wKGlmcnAtPmlmcl9uYW1lLCBOYW1lLCBMZW4pID09IDApIHsKICAgICAgICAgICAgZnJlZShidWYpOwogICAgICAgICAgICBjbG9zZShzZCk7CiAgICAgICAgICAgIHJldHVybiBpOwogICAgICAgIH0KICAgIH0KCiAgICBmcmVlKGJ1Zik7CiAgICBjbG9zZShzZCk7CiAgICByZXR1cm4gMDsKfQoKI2lmZGVmIF9TVERDX0NPTVBBVAojaWZkZWYgX19jcGx1c3BsdXMKfQojZW5kaWYKI2VuZGlmCgojaWZkZWYgX0dFVEtTVEFUX1RFU1QKCmludAptYWluKGludCBhcmdjLCBjaGFyICoqYXJndikKewogICAgaW50ICAgICAgICAgICAgIHJjID0gMDsKICAgIHVfbG9uZyAgICAgICAgICB2YWwgPSAwOwoKICAgIGlmIChhcmdjICE9IDMpIHsKICAgICAgICBzbm1wX2xvZyhMT0dfRVJSLCAiVXNhZ2U6ICVzIHN0YXRfbmFtZSB2YXJfbmFtZVxuIiwgYXJndlswXSk7CiAgICAgICAgZXhpdCgxKTsKICAgIH0KCiAgICBzbm1wX3NldF9kb19kZWJ1Z2dpbmcoMSk7CiAgICByYyA9IGdldEtzdGF0KGFyZ3ZbMV0sIGFyZ3ZbMl0sICZ2YWwpOwoKICAgIGlmIChyYyA9PSAwKQogICAgICAgIHNubXBfbG9nKExPR19FUlIsICIlcyA9ICVsdVxuIiwgYXJndlsyXSwgdmFsKTsKICAgIGVsc2UKICAgICAgICBzbm1wX2xvZyhMT0dfRVJSLCAicmMgPSVkXG4iLCByYyk7CiAgICByZXR1cm4gMDsKfQojZW5kaWYgLypfR0VUS1NUQVRfVEVTVCAqLwoKI2lmZGVmIF9HRVRNSUJTVEFUX1RFU1QKCmludAppcDIwY29tcCh2b2lkICppZm5hbWUsIHZvaWQgKmlwcCkKewogICAgcmV0dXJuIChzdHJuY21wKChjaGFyICopIGlmbmFtZSwKICAgICAgICAgICAgICAgICAgICAoKG1pYjJfaXBBZGRyRW50cnlfdCAqKSBpcHApLT5pcEFkRW50SWZJbmRleC5vX2J5dGVzLAogICAgICAgICAgICAgICAgICAgICgobWliMl9pcEFkZHJFbnRyeV90ICopIGlwcCktPmlwQWRFbnRJZkluZGV4LgogICAgICAgICAgICAgICAgICAgIG9fbGVuZ3RoKSk7Cn0KCmludApBUlBfQ21wX0FkZHIodm9pZCAqYWRkciwgdm9pZCAqZXApCnsKICAgIERFQlVHTVNHVEwoKCJrZXJuZWxfc3Vub3M1IiwgIkFSUDogJWx4IDw+ICVseFxuIiwKICAgICAgICAgICAgICAgICgobWliMl9pcE5ldFRvTWVkaWFFbnRyeV90ICopIGVwKS0+aXBOZXRUb01lZGlhTmV0QWRkcmVzcywKICAgICAgICAgICAgICAgICooSXBBZGRyZXNzICopIGFkZHIpKTsKICAgIGlmICgoKG1pYjJfaXBOZXRUb01lZGlhRW50cnlfdCAqKSBlcCktPmlwTmV0VG9NZWRpYU5ldEFkZHJlc3MgPT0KICAgICAgICAqKElwQWRkcmVzcyAqKWFkZHIpIHsKICAgICAgICByZXR1cm4gMDsKICAgIH0gZWxzZSB7CiAgICAgICAgcmV0dXJuIDE7CiAgICB9Cn0KCmludApJRl9jbXAodm9pZCAqYWRkciwgdm9pZCAqZXApCnsKICAgIGlmICgoKG1pYjJfaWZFbnRyeV90ICopZXApLT5pZkluZGV4ID09KChtaWIyX2lmRW50cnlfdCAqKWFkZHIpLT5pZkluZGV4KSB7CiAgICAgICAgcmV0dXJuIDA7CiAgICB9IGVsc2UgewogICAgICAgIHJldHVybiAxOwogICAgfQp9CgppbnQKbWFpbihpbnQgYXJnYywgY2hhciAqKmFyZ3YpCnsKICAgIGludCAgICAgICAgICAgICByYyA9IDAsIGksIGlkeDsKICAgIG1pYjJfaXBBZGRyRW50cnlfdCBpcGJ1ZiwgKmlwcCA9ICZpcGJ1ZjsKICAgIG1pYjJfaXBOZXRUb01lZGlhRW50cnlfdCBlbnRyeSwgKmVwID0gJmVudHJ5OwogICAgbWliMl9pZkVudHJ5X3QgIGlmc3RhdDsKICAgIHJlcV9lICAgICAgICAgICByZXFfdHlwZTsKICAgIElwQWRkcmVzcyAgICAgICBMYXN0QWRkciA9IDA7CgogICAgaWYgKGFyZ2MgIT0gMykgewogICAgICAgIHNubXBfbG9nKExPR19FUlIsCiAgICAgICAgICAgICAgICAgIlVzYWdlOiAlcyBpZl9uYW1lIHJlcV90eXBlICgwIGZpcnN0LCAxIGV4YWN0LCAyIG5leHQpIFxuIiwKICAgICAgICAgICAgICAgICBhcmd2WzBdKTsKICAgICAgICBleGl0KDEpOwogICAgfQoKICAgIHN3aXRjaCAoYXRvaShhcmd2WzJdKSkgewogICAgY2FzZSAwOgogICAgICAgIHJlcV90eXBlID0gR0VUX0ZJUlNUOwogICAgICAgIGJyZWFrOwogICAgY2FzZSAxOgogICAgICAgIHJlcV90eXBlID0gR0VUX0VYQUNUOwogICAgICAgIGJyZWFrOwogICAgY2FzZSAyOgogICAgICAgIHJlcV90eXBlID0gR0VUX05FWFQ7CiAgICAgICAgYnJlYWs7CiAgICB9OwoKICAgIHNubXBfc2V0X2RvX2RlYnVnZ2luZygwKTsKICAgIHdoaWxlICgocmMgPQogICAgICAgICAgICBnZXRNaWJzdGF0KE1JQl9JTlRFUkZBQ0VTLCAmaWZzdGF0LCBzaXplb2YobWliMl9pZkVudHJ5X3QpLAogICAgICAgICAgICAgICAgICAgICAgIHJlcV90eXBlLCAmSUZfY21wLCAmaWR4KSkgPT0gMCkgewogICAgICAgIGlkeCA9IGlmc3RhdC5pZkluZGV4OwogICAgICAgIERFQlVHTVNHVEwoKCJrZXJuZWxfc3Vub3M1IiwgIklmbmFtZSA9ICVzXG4iLAogICAgICAgICAgICAgICAgICAgIGlmc3RhdC5pZkRlc2NyLm9fYnl0ZXMpKTsKICAgICAgICByZXFfdHlwZSA9IEdFVF9ORVhUOwogICAgfQogICAgcmMgPSBnZXRNaWJzdGF0KE1JQl9JUF9BRERSLCAmaXBidWYsIHNpemVvZihtaWIyX2lwQWRkckVudHJ5X3QpLAogICAgICAgICAgICAgICAgICAgIHJlcV90eXBlLCBpcDIwY29tcCwgYXJndlsxXSk7CgogICAgaWYgKHJjID09IDApCiAgICAgICAgREVCVUdNU0dUTCgoImtlcm5lbF9zdW5vczUiLCAibXR1ID0gJWxkXG4iLAogICAgICAgICAgICAgICAgICAgIGlwcC0+aXBBZEVudEluZm8uYWVfbXR1KSk7CiAgICBlbHNlCiAgICAgICAgREVCVUdNU0dUTCgoImtlcm5lbF9zdW5vczUiLCAicmMgPSVkXG4iLCByYykpOwoKICAgIHdoaWxlICgocmMgPQogICAgICAgICAgICBnZXRNaWJzdGF0KE1JQl9JUF9ORVQsICZlbnRyeSwKICAgICAgICAgICAgICAgICAgICAgICBzaXplb2YobWliMl9pcE5ldFRvTWVkaWFFbnRyeV90KSwgcmVxX3R5cGUsCiAgICAgICAgICAgICAgICAgICAgICAgJkFSUF9DbXBfQWRkciwgJkxhc3RBZGRyKSkgPT0gMCkgewogICAgICAgIExhc3RBZGRyID0gZXAtPmlwTmV0VG9NZWRpYU5ldEFkZHJlc3M7CiAgICAgICAgREVCVUdNU0dUTCgoImtlcm5lbF9zdW5vczUiLCAiSXBhZGRyID0gJWxYXG4iLCAodV9sb25nKSBMYXN0QWRkcikpOwogICAgICAgIHJlcV90eXBlID0gR0VUX05FWFQ7CiAgICB9CiAgICByZXR1cm4gMDsKfQojZW5kaWYgLypfR0VUTUlCU1RBVF9URVNUICovCiNlbmRpZiAgICAgICAgICAgICAgICAgICAgICAgICAgLyogU1VOT1M1ICovCgoKLyotCiAqIFRoZXNlIHZhcmlhYmxlcyBkZXNjcmliZSB0aGUgZm9ybWF0dGluZyBvZiB0aGlzIGZpbGUuICBJZiB5b3UgZG9uJ3QgbGlrZSB0aGUKICogdGVtcGxhdGUgZGVmYXVsdHMsIGZlZWwgZnJlZSB0byBjaGFuZ2UgdGhlbSBoZXJlIChub3QgaW4geW91ciAuZW1hY3MgZmlsZSkuCiAqCiAqIExvY2FsIFZhcmlhYmxlczoKICogY29tbWVudC1jb2x1bW46IDMyCiAqIGMtaW5kZW50LWxldmVsOiA0CiAqIGMtY29udGludWVkLXN0YXRlbWVudC1vZmZzZXQ6IDQKICogYy1icmFjZS1vZmZzZXQ6IC00CiAqIGMtYXJnZGVjbC1pbmRlbnQ6IDAKICogYy1sYWJlbC1vZmZzZXQ6IC00CiAqIGZpbGwtY29sdW1uOiA3OQogKiBmaWxsLXByZWZpeDogIiAqICIKICogRW5kOgogKi8K