LyoKICogIEludGVyZmFjZXMgTUlCIGdyb3VwIGltcGxlbWVudGF0aW9uIC0gaW50ZXJmYWNlcy5jCiAqCiAqLwoKLyogUG9ydGlvbnMgb2YgdGhpcyBmaWxlIGFyZSBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29weXJpZ2h0KHMpLiAgU2VlCiAqIHRoZSBOZXQtU05NUCdzIENPUFlJTkcgZmlsZSBmb3IgbW9yZSBkZXRhaWxzIGFuZCBvdGhlciBjb3B5cmlnaHRzCiAqIHRoYXQgbWF5IGFwcGx5OgogKi8KLyoKICogUG9ydGlvbnMgb2YgdGhpcyBmaWxlIGFyZSBjb3B5cmlnaHRlZCBieToKICogQ29weXJpZ2h0IKkgMjAwMyBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAqIFVzZSBpcyBzdWJqZWN0IHRvIGxpY2Vuc2UgdGVybXMgc3BlY2lmaWVkIGluIHRoZSBDT1BZSU5HIGZpbGUKICogZGlzdHJpYnV0ZWQgd2l0aCB0aGUgTmV0LVNOTVAgcGFja2FnZS4KICovCgojaW5jbHVkZSA8bmV0LXNubXAvbmV0LXNubXAtY29uZmlnLmg+CgojaWYgZGVmaW5lZChJRk5FVF9ORUVEU19LRVJORUwpICYmICFkZWZpbmVkKF9LRVJORUwpICYmICFkZWZpbmVkKElGTkVUX05FRURTX0tFUk5FTF9MQVRFKQojZGVmaW5lIF9LRVJORUwgMQojZGVmaW5lIF9JX0RFRklORURfS0VSTkVMCiNlbmRpZgoKI2lmIEhBVkVfU1RSSU5HX0gKI2luY2x1ZGUgPHN0cmluZy5oPgojZWxzZQojaW5jbHVkZSA8c3RyaW5ncy5oPgojZW5kaWYKCiNpZiBIQVZFX1NURExJQl9ICiNpbmNsdWRlIDxzdGRsaWIuaD4KI2VuZGlmCiNpZiBIQVZFX1VOSVNURF9ICiNpbmNsdWRlIDx1bmlzdGQuaD4KI2VuZGlmCiNpZiBIQVZFX1NZU19QQVJBTV9ICiNpbmNsdWRlIDxzeXMvcGFyYW0uaD4KI2VuZGlmCiNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KI2lmIEhBVkVfV0lOU09DS19ICiNpbmNsdWRlIDx3aW5zb2NrLmg+CiNlbmRpZgojaWYgZGVmaW5lZChJRk5FVF9ORUVEU19LRVJORUwpICYmICFkZWZpbmVkKF9LRVJORUwpICYmIGRlZmluZWQoSUZORVRfTkVFRFNfS0VSTkVMX0xBVEUpCiNkZWZpbmUgX0tFUk5FTCAxCiNkZWZpbmUgX0lfREVGSU5FRF9LRVJORUwKI2VuZGlmCiNpZiBIQVZFX1NZU19TT0NLRVRfSAojaW5jbHVkZSA8c3lzL3NvY2tldC5oPgojZW5kaWYKI2lmbmRlZiBTVFJFQU1fTkVFRFNfS0VSTkVMX0lTTEFORFMKI2lmIEhBVkVfU1lTX1NUUkVBTV9ICiNpbmNsdWRlIDxzeXMvc3RyZWFtLmg+CiNlbmRpZgojZW5kaWYKI2lmIEhBVkVfU1lTX1NPQ0tFVFZBUl9ICiNpbmNsdWRlIDxzeXMvc29ja2V0dmFyLmg+CiNlbmRpZgoKI2lmIFRJTUVfV0lUSF9TWVNfVElNRQojIGlmIGRlZmluZWQgKFdJTjMyKSB8fCBkZWZpbmVkIChjeWd3aW4pCiMgIGluY2x1ZGUgPHN5cy90aW1lYi5oPgojIGVsc2UKIyBpbmNsdWRlIDxzeXMvdGltZS5oPgojIGVuZGlmCiMgaW5jbHVkZSA8dGltZS5oPgojZWxzZQojIGlmIEhBVkVfU1lTX1RJTUVfSAojICBpbmNsdWRlIDxzeXMvdGltZS5oPgojIGVsc2UKIyAgaW5jbHVkZSA8dGltZS5oPgojIGVuZGlmCiNlbmRpZgojaWYgSEFWRV9TWVNfU09DS0lPX0gKI2luY2x1ZGUgPHN5cy9zb2NraW8uaD4KI2VuZGlmCiNpZiBIQVZFX0ZDTlRMX0gKI2luY2x1ZGUgPGZjbnRsLmg+CiNlbmRpZgojaWYgSEFWRV9TWVNfSU9DVExfSAojaW5jbHVkZSA8c3lzL2lvY3RsLmg+CiNlbmRpZgojaWYgSEFWRV9ORVRJTkVUX0lOX0gKI2luY2x1ZGUgPG5ldGluZXQvaW4uaD4KI2VuZGlmCiNpZiBIQVZFX05FVF9JRl9ICiNpbmNsdWRlIDxuZXQvaWYuaD4KI2VuZGlmCiNpZiBIQVZFX05FVElORVRfSU5fVkFSX0gKI2luY2x1ZGUgPG5ldGluZXQvaW5fdmFyLmg+CiNlbmRpZgojaWYgSEFWRV9ORVRfSUZfVkFSX0gKI2luY2x1ZGUgPG5ldC9pZl92YXIuaD4KI2VuZGlmCiNpZmRlZiBfSV9ERUZJTkVEX0tFUk5FTAojdW5kZWYgX0tFUk5FTAojZW5kaWYKI2lmZGVmIFNUUkVBTV9ORUVEU19LRVJORUxfSVNMQU5EUwojaWYgSEFWRV9TWVNfU1RSRUFNX0gKI2luY2x1ZGUgPHN5cy9zdHJlYW0uaD4KI2VuZGlmCiNlbmRpZgojaWYgSEFWRV9ORVRfUk9VVEVfSAojaW5jbHVkZSA8bmV0L3JvdXRlLmg+CiNlbmRpZgojaWYgSEFWRV9ORVRJTkVUX0lOX1NZU1RNX0gKI2luY2x1ZGUgPG5ldGluZXQvaW5fc3lzdG0uaD4KI2VuZGlmCiNpZiBIQVZFX1NZU19IQVNISU5HX0gKI2luY2x1ZGUgPHN5cy9oYXNoaW5nLmg+CiNlbmRpZgojaWYgSEFWRV9ORVRJTkVUX0lOX1ZBUl9ICiNpbmNsdWRlIDxuZXRpbmV0L2luX3Zhci5oPgojZW5kaWYKI2lmIEhBVkVfTkVUSU5FVF9JUF9ICiNpbmNsdWRlIDxuZXRpbmV0L2lwLmg+CiNlbmRpZgojaWZkZWYgTkVUU05NUF9FTkFCTEVfSVBWNgojaWYgSEFWRV9ORVRJTkVUX0lQNl9ICiNpbmNsdWRlIDxuZXRpbmV0L2lwNi5oPgojZW5kaWYKI2VuZGlmCiNpZiBIQVZFX1NZU19RVUVVRV9ICiNpbmNsdWRlIDxzeXMvcXVldWUuaD4KI2VuZGlmCiNpZiBIQVZFX05FVElORVRfSVBfVkFSX0gKI2luY2x1ZGUgPG5ldGluZXQvaXBfdmFyLmg+CiNlbmRpZgojaWZkZWYgTkVUU05NUF9FTkFCTEVfSVBWNgojaWYgSEFWRV9ORVRORVRTTk1QX0VOQUJMRV9JUFY2X0lQNl9WQVJfSAojaW5jbHVkZSA8bmV0aW5ldDYvaXA2X3Zhci5oPgojZW5kaWYKI2VuZGlmCiNpZiBIQVZFX05FVElORVRfSU5fUENCX0gKI2luY2x1ZGUgPG5ldGluZXQvaW5fcGNiLmg+CiNlbmRpZgojaWYgSEFWRV9ORVRJTkVUX0lGX0VUSEVSX0gKI2luY2x1ZGUgPG5ldGluZXQvaWZfZXRoZXIuaD4KI2VuZGlmCiNpZiBIQVZFX05FVF9JRl9UWVBFU19ICiNpbmNsdWRlIDxuZXQvaWZfdHlwZXMuaD4KI2VuZGlmCiNpZiBIQVZFX05FVF9JRl9ETF9ICiNpZm5kZWYgZHluaXgKI2luY2x1ZGUgPG5ldC9pZl9kbC5oPgojZWxzZQojaW5jbHVkZSA8c3lzL25ldC9pZl9kbC5oPgojZW5kaWYKI2VuZGlmCiNpZiBIQVZFX0lORVRfTUlCMl9ICiNpbmNsdWRlIDxpbmV0L21pYjIuaD4KI2VuZGlmCiNpZiBIQVZFX0lPQ1RMU19ICiNpbmNsdWRlIDxpb2N0bHMuaD4KI2VuZGlmCgojaWZkZWYgc29sYXJpczIKIyBpbmNsdWRlIDxlcnJuby5oPgojaW5jbHVkZSAia2VybmVsX3N1bm9zNS5oIgojZWxzZQojaW5jbHVkZSAia2VybmVsLmgiCiNlbmRpZgoKI2lmZGVmIGhwdXgKI2luY2x1ZGUgPHN5cy9taWIuaD4KI2luY2x1ZGUgPG5ldGluZXQvbWliX2tlcm4uaD4KI2VuZGlmICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBocHV4ICovCgojaWZkZWYgY3lnd2luCiNpbmNsdWRlIDx3aW5kb3dzLmg+CiNlbmRpZgoKI2lmIEhBVkVfU1lTX1NZU0NUTF9ICiNpbmNsdWRlIDxzeXMvc3lzY3RsLmg+CgojaWYgZGVmaW5lZChmcmVlYnNkMykgfHwgZGVmaW5lZChmcmVlYnNkNCkgfHwgZGVmaW5lZChmcmVlYnNkNSkKIyAgICBkZWZpbmUgVVNFX1NZU0NUTF9JRkxJU1QKI2Vsc2UKIyBpZiBkZWZpbmVkKENUTF9ORVQpICYmICFkZWZpbmVkKGZyZWVic2QyKSAmJiAhZGVmaW5lZChuZXRic2QxKQojICBpZmRlZiBQRl9ST1VURQojICAgaWZkZWYgTkVUX1JUX0lGTElTVAojICAgIGlmbmRlZiBuZXRic2QxCiMgICAgIGRlZmluZSBVU0VfU1lTQ1RMX0lGTElTVAojICAgIGVuZGlmCiMgICBlbmRpZgojICBlbmRpZgojIGVuZGlmCiNlbmRpZiAgICAgICAgICAgICAgICAgICAgICAgICAgLyogZGVmaW5lZChmcmVlYnNkMykgKi8KI2VuZGlmICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBIQVZFX1NZU19TWVNDVExfSCAqLwoKI2lmIEhBVkVfT1NSRUxEQVRFX0gKI2luY2x1ZGUgPG9zcmVsZGF0ZS5oPgojZW5kaWYKI2lmZGVmIE5FVFNOTVBfQ0FOX1VTRV9TWVNDVEwKI2luY2x1ZGUgPHN5cy9zeXNjdGwuaD4KI2VuZGlmCgojaW5jbHVkZSA8bmV0LXNubXAvbmV0LXNubXAtaW5jbHVkZXMuaD4KI2luY2x1ZGUgPG5ldC1zbm1wL2FnZW50L25ldC1zbm1wLWFnZW50LWluY2x1ZGVzLmg+CiNpbmNsdWRlIDxuZXQtc25tcC9hZ2VudC9hdXRvX25saXN0Lmg+CiNpbmNsdWRlIDxuZXQtc25tcC9kYXRhX2FjY2Vzcy9pbnRlcmZhY2UuaD4KCiNpbmNsdWRlICJpbnRlcmZhY2VzLmgiCiNpbmNsdWRlICJzdHJ1Y3QuaCIKI2luY2x1ZGUgInV0aWxfZnVuY3MuaCIKI2luY2x1ZGUgInN5c09SVGFibGUuaCIKCi8qIGlmIHlvdSB3YW50IGNhY2hpbmcgZW5hYmxlZCBmb3Igc3BlZWQgcmV0cml2YWwgcHVycG9zZXMsIHNldCB0aGlzIHRvIDU/Ki8KI2RlZmluZSBNSU5MT0FERlJFUSAwICAgICAgICAgICAgICAgICAgICAgLyogbWluIHJlbG9hZCBmcmVxdWVuY3kgaW4gc2Vjb25kcyAqLwojaWZkZWYgbGludXgKc3RhdGljIHVuc2lnbmVkIGxvbmcgTGFzdExvYWQgPSAwOyAgICAgICAgLyogRVQgaW4gc2VjcyBhdCBsYXN0IHRhYmxlIGxvYWQgKi8KI2VuZGlmCgpleHRlcm4gc3RydWN0IHRpbWV2YWwgc3RhcnR0aW1lOwoKc3RydWN0IHZhcmlhYmxlMyBpbnRlcmZhY2VzX3ZhcmlhYmxlc1tdID0gewogICAge0lGTlVNQkVSLCBBU05fSU5URUdFUiwgUk9OTFksIHZhcl9pbnRlcmZhY2VzLCAxLCB7MX19LAogICAge0lGSU5ERVgsIEFTTl9JTlRFR0VSLCBST05MWSwgdmFyX2lmRW50cnksIDMsIHsyLCAxLCAxfX0sCiAgICB7SUZERVNDUiwgQVNOX09DVEVUX1NUUiwgUk9OTFksIHZhcl9pZkVudHJ5LCAzLCB7MiwgMSwgMn19LAogICAge05FVFNOTVBfSUZUWVBFLCBBU05fSU5URUdFUiwgUk9OTFksIHZhcl9pZkVudHJ5LCAzLCB7MiwgMSwgM319LAogICAge0lGTVRVLCBBU05fSU5URUdFUiwgUk9OTFksIHZhcl9pZkVudHJ5LCAzLCB7MiwgMSwgNH19LAogICAge0lGU1BFRUQsIEFTTl9HQVVHRSwgUk9OTFksIHZhcl9pZkVudHJ5LCAzLCB7MiwgMSwgNX19LAogICAge0lGUEhZU0FERFJFU1MsIEFTTl9PQ1RFVF9TVFIsIFJPTkxZLCB2YXJfaWZFbnRyeSwgMywgezIsIDEsIDZ9fSwKI2lmIGRlZmluZWQgKFdJTjMyKSB8fCBkZWZpbmVkIChjeWd3aW4pCiAgICB7SUZBRE1JTlNUQVRVUywgQVNOX0lOVEVHRVIsIFJXUklURSwgdmFyX2lmRW50cnksIDMsIHsyLCAxLCA3fX0sCiNlbHNlCiAgICB7SUZBRE1JTlNUQVRVUywgQVNOX0lOVEVHRVIsIFJPTkxZLCB2YXJfaWZFbnRyeSwgMywgezIsIDEsIDd9fSwKI2VuZGlmCiAgICB7SUZPUEVSU1RBVFVTLCBBU05fSU5URUdFUiwgUk9OTFksIHZhcl9pZkVudHJ5LCAzLCB7MiwgMSwgOH19LAogICAge0lGTEFTVENIQU5HRSwgQVNOX1RJTUVUSUNLUywgUk9OTFksIHZhcl9pZkVudHJ5LCAzLCB7MiwgMSwgOX19LAogICAge0lGSU5PQ1RFVFMsIEFTTl9DT1VOVEVSLCBST05MWSwgdmFyX2lmRW50cnksIDMsIHsyLCAxLCAxMH19LAogICAge0lGSU5VQ0FTVFBLVFMsIEFTTl9DT1VOVEVSLCBST05MWSwgdmFyX2lmRW50cnksIDMsIHsyLCAxLCAxMX19LAogICAge0lGSU5OVUNBU1RQS1RTLCBBU05fQ09VTlRFUiwgUk9OTFksIHZhcl9pZkVudHJ5LCAzLCB7MiwgMSwgMTJ9fSwKICAgIHtJRklORElTQ0FSRFMsIEFTTl9DT1VOVEVSLCBST05MWSwgdmFyX2lmRW50cnksIDMsIHsyLCAxLCAxM319LAogICAge0lGSU5FUlJPUlMsIEFTTl9DT1VOVEVSLCBST05MWSwgdmFyX2lmRW50cnksIDMsIHsyLCAxLCAxNH19LAogICAge0lGSU5VTktOT1dOUFJPVE9TLCBBU05fQ09VTlRFUiwgUk9OTFksIHZhcl9pZkVudHJ5LCAzLCB7MiwgMSwgMTV9fSwKICAgIHtJRk9VVE9DVEVUUywgQVNOX0NPVU5URVIsIFJPTkxZLCB2YXJfaWZFbnRyeSwgMywgezIsIDEsIDE2fX0sCiAgICB7SUZPVVRVQ0FTVFBLVFMsIEFTTl9DT1VOVEVSLCBST05MWSwgdmFyX2lmRW50cnksIDMsIHsyLCAxLCAxN319LAogICAge0lGT1VUTlVDQVNUUEtUUywgQVNOX0NPVU5URVIsIFJPTkxZLCB2YXJfaWZFbnRyeSwgMywgezIsIDEsIDE4fX0sCiAgICB7SUZPVVRESVNDQVJEUywgQVNOX0NPVU5URVIsIFJPTkxZLCB2YXJfaWZFbnRyeSwgMywgezIsIDEsIDE5fX0sCiAgICB7SUZPVVRFUlJPUlMsIEFTTl9DT1VOVEVSLCBST05MWSwgdmFyX2lmRW50cnksIDMsIHsyLCAxLCAyMH19LAogICAge0lGT1VUUUxFTiwgQVNOX0dBVUdFLCBST05MWSwgdmFyX2lmRW50cnksIDMsIHsyLCAxLCAyMX19LAogICAge0lGU1BFQ0lGSUMsIEFTTl9PQkpFQ1RfSUQsIFJPTkxZLCB2YXJfaWZFbnRyeSwgMywgezIsIDEsIDIyfX0KfTsKCi8qCiAqIERlZmluZSB0aGUgT0lEIHBvaW50ZXIgdG8gdGhlIHRvcCBvZiB0aGUgbWliIHRyZWUgdGhhdCB3ZSdyZQogKiByZWdpc3RlcmluZyB1bmRlcm5lYXRoLCBhbmQgdGhlIE9JRCBvZiB0aGUgTUlCIG1vZHVsZSAKICovCm9pZCAgICAgICAgICAgICBpbnRlcmZhY2VzX3ZhcmlhYmxlc19vaWRbXSA9IHsgU05NUF9PSURfTUlCMiwgMiB9OwpvaWQgICAgICAgICAgICAgaW50ZXJmYWNlc19tb2R1bGVfb2lkW10gPSB7IFNOTVBfT0lEX01JQjIsIDMxIH07Cgp2b2lkCmluaXRfaW50ZXJmYWNlcyh2b2lkKQp7CiAgICAvKgogICAgICogcmVnaXN0ZXIgb3Vyc2VsdmVzIHdpdGggdGhlIGFnZW50IHRvIGhhbmRsZSBvdXIgbWliIHRyZWUgCiAgICAgKi8KICAgIFJFR0lTVEVSX01JQigibWliSUkvaW50ZXJmYWNlcyIsIGludGVyZmFjZXNfdmFyaWFibGVzLCB2YXJpYWJsZTMsCiAgICAgICAgICAgICAgICAgaW50ZXJmYWNlc192YXJpYWJsZXNfb2lkKTsKICAgIFJFR0lTVEVSX1NZU09SX0VOVFJZKGludGVyZmFjZXNfbW9kdWxlX29pZCwKICAgICAgICAgICAgICAgICAgICAgICAgICJUaGUgTUlCIG1vZHVsZSB0byBkZXNjcmliZSBnZW5lcmljIG9iamVjdHMgZm9yIG5ldHdvcmsgaW50ZXJmYWNlIHN1Yi1sYXllcnMiKTsKCiNpZm5kZWYgVVNFX1NZU0NUTF9JRkxJU1QKI2lmIEhBVkVfTkVUX0lGX01JQl9ICiAgICBpbml0X2ludGVyZmFjZXNfc2V0dXAoKTsKI2VuZGlmCiNlbmRpZgojaWZkZWYgc29sYXJpczIKICAgIGluaXRfa2VybmVsX3N1bm9zNSgpOwojZW5kaWYKfQoKI2lmZGVmIGxpbnV4Ci8qCiAqIGlmX3R5cGVfZnJvbV9uYW1lCiAqIFJldHVybiBpbnRlcmZhY2UgdHlwZSB1c2luZyB0aGUgaW50ZXJmYWNlIG5hbWUgYXMgYSBjbHVlLgogKiBSZXR1cm5zIDEgdG8gaW1wbHkgIm90aGVyIiB0eXBlIGlmIG5hbWUgbm90IHJlY29nbml6ZWQuIAogKi8Kc3RhdGljIGludAppZl90eXBlX2Zyb21fbmFtZShjb25zdCBjaGFyICpwY2NoKQp7CiAgICB0eXBlZGVmIHN0cnVjdCBfbWF0Y2hfaWYgewogICAgICAgIGludCAgICAgICAgICAgICBtaV90eXBlOwogICAgICAgIGNvbnN0IGNoYXIgICAgICptaV9uYW1lOwogICAgfSAgICAgICAgICAgICAgKnBtYXRjaF9pZiwgbWF0Y2hfaWY7CgogICAgc3RhdGljIG1hdGNoX2lmIGxtYXRjaF9pZltdID0gewogICAgICAgIHsyNCwgImxvIn0sCiAgICAgICAgezYsICJldGgifSwKICAgICAgICB7OSwgInRyIn0sCiAgICAgICAgezIzLCAicHBwIn0sCiAgICAgICAgezI4LCAic2wifSwKICAgICAgICB7MCwgMH0gICAgICAgICAgICAgICAgICAvKiBlbmQgb2YgbGlzdCAqLwogICAgfTsKCiAgICBpbnQgICAgICAgICAgICAgaWksIGxlbjsKICAgIHJlZ2lzdGVyIHBtYXRjaF9pZiBwbTsKCiAgICBmb3IgKGlpID0gMCwgcG0gPSBsbWF0Y2hfaWY7IHBtLT5taV9uYW1lOyBwbSsrKSB7CiAgICAgICAgbGVuID0gc3RybGVuKHBtLT5taV9uYW1lKTsKICAgICAgICBpZiAoMCA9PSBzdHJuY21wKHBjY2gsIHBtLT5taV9uYW1lLCBsZW4pKSB7CiAgICAgICAgICAgIHJldHVybiAocG0tPm1pX3R5cGUpOwogICAgICAgIH0KICAgIH0KICAgIHJldHVybiAoMSk7ICAgICAgICAgICAgICAgICAvKiBpbiBjYXNlIHNlYXJjaCBmYWlscyAqLwp9CiNlbmRpZgoKCiNpZmRlZiBsaW51eApzdGF0aWMgc3RydWN0IGlmbmV0ICppZm5ldGFkZHJfbGlzdDsKI2VuZGlmCgoKLyoKICogaGVhZGVyX2lmRW50cnkoLi4uCiAqIEFyZ3VtZW50czoKICogdnAgICAgIElOICAgICAgLSBwb2ludGVyIHRvIHZhcmlhYmxlIGVudHJ5IHRoYXQgcG9pbnRzIGhlcmUKICogbmFtZSAgICBJTi9PVVQgIC0gSU4vbmFtZSByZXF1ZXN0ZWQsIE9VVC9uYW1lIGZvdW5kCiAqIGxlbmd0aCAgSU4vT1VUICAtIGxlbmd0aCBvZiBJTi9PVVQgb2lkJ3MgCiAqIGV4YWN0ICAgSU4gICAgICAtIFRSVUUgaWYgYW4gZXhhY3QgbWF0Y2ggd2FzIHJlcXVlc3RlZAogKiB2YXJfbGVuIE9VVCAgICAgLSBsZW5ndGggb2YgdmFyaWFibGUgb3IgMCBpZiBmdW5jdGlvbiByZXR1cm5lZAogKiB3cml0ZV9tZXRob2QKICogCiAqLwojaWYgIWRlZmluZWQgKFdJTjMyKSAmJiAhZGVmaW5lZCAoY3lnd2luKQpzdGF0aWMgaW50CmhlYWRlcl9pZkVudHJ5KHN0cnVjdCB2YXJpYWJsZSAqdnAsCiAgICAgICAgICAgICAgIG9pZCAqIG5hbWUsCiAgICAgICAgICAgICAgIHNpemVfdCAqIGxlbmd0aCwKICAgICAgICAgICAgICAgaW50IGV4YWN0LCBzaXplX3QgKiB2YXJfbGVuLCBXcml0ZU1ldGhvZCAqKiB3cml0ZV9tZXRob2QpCnsKI2RlZmluZSBJRkVOVFJZX05BTUVfTEVOR1RICTEwCiAgICBvaWQgICAgICAgICAgICAgbmV3bmFtZVtNQVhfT0lEX0xFTl07CiAgICByZWdpc3RlciBpbnQgICAgaW50ZXJmYWNlOwogICAgaW50ICAgICAgICAgICAgIHJlc3VsdCwgY291bnQ7CgogICAgREVCVUdNU0dUTCgoIm1pYklJL2ludGVyZmFjZXMiLCAidmFyX2lmRW50cnk6ICIpKTsKICAgIERFQlVHTVNHT0lEKCgibWliSUkvaW50ZXJmYWNlcyIsIG5hbWUsICpsZW5ndGgpKTsKICAgIERFQlVHTVNHKCgibWliSUkvaW50ZXJmYWNlcyIsICIgJWRcbiIsIGV4YWN0KSk7CgogICAgbWVtY3B5KChjaGFyICopIG5ld25hbWUsIChjaGFyICopIHZwLT5uYW1lLAogICAgICAgICAgIChpbnQpIHZwLT5uYW1lbGVuICogc2l6ZW9mKG9pZCkpOwogICAgLyoKICAgICAqIGZpbmQgIm5leHQiIGludGVyZmFjZSAKICAgICAqLwogICAgY291bnQgPSBJbnRlcmZhY2VfU2Nhbl9HZXRfQ291bnQoKTsKICAgIGZvciAoaW50ZXJmYWNlID0gMTsgaW50ZXJmYWNlIDw9IGNvdW50OyBpbnRlcmZhY2UrKykgewogICAgICAgIG5ld25hbWVbSUZFTlRSWV9OQU1FX0xFTkdUSF0gPSAob2lkKSBpbnRlcmZhY2U7CiAgICAgICAgcmVzdWx0ID0KICAgICAgICAgICAgc25tcF9vaWRfY29tcGFyZShuYW1lLCAqbGVuZ3RoLCBuZXduYW1lLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIChpbnQpIHZwLT5uYW1lbGVuICsgMSk7CiAgICAgICAgaWYgKChleGFjdCAmJiAocmVzdWx0ID09IDApKSB8fCAoIWV4YWN0ICYmIChyZXN1bHQgPCAwKSkpCiAgICAgICAgICAgIGJyZWFrOwogICAgfQogICAgaWYgKGludGVyZmFjZSA+IGNvdW50KSB7CiAgICAgICAgREVCVUdNU0dUTCgoIm1pYklJL2ludGVyZmFjZXMiLCAiLi4uIGluZGV4IG91dCBvZiByYW5nZVxuIikpOwogICAgICAgIHJldHVybiBNQVRDSF9GQUlMRUQ7CiAgICB9CgoKICAgIG1lbWNweSgoY2hhciAqKSBuYW1lLCAoY2hhciAqKSBuZXduYW1lLAogICAgICAgICAgICgoaW50KSB2cC0+bmFtZWxlbiArIDEpICogc2l6ZW9mKG9pZCkpOwogICAgKmxlbmd0aCA9IHZwLT5uYW1lbGVuICsgMTsKICAgICp3cml0ZV9tZXRob2QgPSAwOwogICAgKnZhcl9sZW4gPSBzaXplb2YobG9uZyk7ICAgIC8qIGRlZmF1bHQgdG8gJ2xvbmcnIHJlc3VsdHMgKi8KCiAgICBERUJVR01TR1RMKCgibWliSUkvaW50ZXJmYWNlcyIsICIuLi4gZ2V0IEkvRiBzdGF0cyAiKSk7CiAgICBERUJVR01TR09JRCgoIm1pYklJL2ludGVyZmFjZXMiLCBuYW1lLCAqbGVuZ3RoKSk7CiAgICBERUJVR01TRygoIm1pYklJL2ludGVyZmFjZXMiLCAiXG4iKSk7CgogICAgcmV0dXJuIGludGVyZmFjZTsKfQoKCgp1X2NoYXIgICAgICAgICAqCnZhcl9pbnRlcmZhY2VzKHN0cnVjdCB2YXJpYWJsZSAqIHZwLAogICAgICAgICAgICAgICBvaWQgKiBuYW1lLAogICAgICAgICAgICAgICBzaXplX3QgKiBsZW5ndGgsCiAgICAgICAgICAgICAgIGludCBleGFjdCwgc2l6ZV90ICogdmFyX2xlbiwgV3JpdGVNZXRob2QgKiogd3JpdGVfbWV0aG9kKQp7CiAgICBpZiAoaGVhZGVyX2dlbmVyaWModnAsIG5hbWUsIGxlbmd0aCwgZXhhY3QsIHZhcl9sZW4sIHdyaXRlX21ldGhvZCkgPT0KICAgICAgICBNQVRDSF9GQUlMRUQpCiAgICAgICAgcmV0dXJuIE5VTEw7CgogICAgc3dpdGNoICh2cC0+bWFnaWMpIHsKICAgIGNhc2UgSUZOVU1CRVI6CiAgICAgICAgbG9uZ19yZXR1cm4gPSBJbnRlcmZhY2VfU2Nhbl9HZXRfQ291bnQoKTsKICAgICAgICByZXR1cm4gKHVfY2hhciAqKSAmIGxvbmdfcmV0dXJuOwogICAgZGVmYXVsdDoKICAgICAgICBERUJVR01TR1RMKCgic25tcGQiLCAidW5rbm93biBzdWItaWQgJWQgaW4gdmFyX2ludGVyZmFjZXNcbiIsCiAgICAgICAgICAgICAgICAgICAgdnAtPm1hZ2ljKSk7CiAgICB9CiAgICByZXR1cm4gTlVMTDsKfQoKI2lmZGVmIFVTRV9TWVNDVExfSUZMSVNUCgpzdGF0aWMgdV9jaGFyICAqaWZfbGlzdCA9IDA7CnN0YXRpYyBjb25zdCB1X2NoYXIgKmlmX2xpc3RfZW5kOwpzdGF0aWMgc2l6ZV90ICAgaWZfbGlzdF9zaXplID0gMDsKCnN0cnVjdCBzbWFsbF9pZmFkZHIgewogICAgc3RydWN0IGluX2FkZHIgIHNpZmFfYWRkcjsKICAgIHN0cnVjdCBpbl9hZGRyICBzaWZhX25ldG1hc2s7CiAgICBzdHJ1Y3QgaW5fYWRkciAgc2lmYV9icm9hZGNhc3Q7Cn07CgpleHRlcm4gY29uc3Qgc3RydWN0IHNvY2thZGRyICpnZXRfYWRkcmVzcyhjb25zdCB2b2lkICosIGludCwgaW50KTsKZXh0ZXJuIGNvbnN0IHN0cnVjdCBpbl9hZGRyICpnZXRfaW5fYWRkcmVzcyhjb25zdCB2b2lkICosIGludCwgaW50KTsKc3RhdGljIGludCAgICAgIEludGVyZmFjZV9TY2FuX0J5X0luZGV4KGludCwgc3RydWN0IGlmX21zZ2hkciAqLCBjaGFyICosCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3Qgc21hbGxfaWZhZGRyICopOwpzdGF0aWMgaW50ICAgICAgSW50ZXJmYWNlX0dldF9FdGhlcl9CeV9JbmRleChpbnQsIHVfY2hhciAqKTsKCnN0YXRpYyBpbnQKSW50ZXJmYWNlX1NjYW5fQnlfSW5kZXgoaW50IGlpbmRleCwKICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IGlmX21zZ2hkciAqaWZfbXNnLAogICAgICAgICAgICAgICAgICAgICAgICBjaGFyICppZl9uYW1lLCBzdHJ1Y3Qgc21hbGxfaWZhZGRyICpzaWZhKQp7CiAgICB1X2NoYXIgICAgICAgICAqY3A7CiAgICBzdHJ1Y3QgaWZfbXNnaGRyICppZnA7CiAgICBpbnQgICAgICAgICAgICAgaGF2ZV9pZmluZm8gPSAwLCBoYXZlX2FkZHIgPSAwOwoKICAgIGlmIChOVUxMICE9IHNpZmEpCiAgICAgICAgbWVtc2V0KHNpZmEsIDAsIHNpemVvZigqc2lmYSkpOwogICAgZm9yIChjcCA9IGlmX2xpc3Q7IGNwIDwgaWZfbGlzdF9lbmQ7IGNwICs9IGlmcC0+aWZtX21zZ2xlbikgewogICAgICAgIGlmcCA9IChzdHJ1Y3QgaWZfbXNnaGRyICopIGNwOwogICAgICAgIERFQlVHTVNHVEwoKCJtaWJJSS9pbnRlcmZhY2VzIiwgImlmbV90eXBlID0gJWQsIGlmbV9pbmRleCA9ICVkXG4iLAogICAgICAgICAgICAgICAgICAgIGlmcC0+aWZtX3R5cGUsIGlmcC0+aWZtX2luZGV4KSk7CgogICAgICAgIHN3aXRjaCAoaWZwLT5pZm1fdHlwZSkgewogICAgICAgIGNhc2UgUlRNX0lGSU5GTzoKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgY29uc3Qgc3RydWN0IHNvY2thZGRyICphOwoKICAgICAgICAgICAgICAgIGlmIChpZnAtPmlmbV9pbmRleCA9PSBpaW5kZXgpIHsKICAgICAgICAgICAgICAgICAgICBhID0gZ2V0X2FkZHJlc3MoaWZwICsgMSwgaWZwLT5pZm1fYWRkcnMsIFJUQV9JRlApOwogICAgICAgICAgICAgICAgICAgIGlmIChhID09IE5VTEwpCiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAwOwogICAgICAgICAgICAgICAgICAgIHNwcmludGYoaWZfbmFtZSwgIiUuKnMiLCAoKGNvbnN0IHVfY2hhciAqKSBhKVs1XSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoY29uc3Qgc3RydWN0IHNvY2thZGRyX2luICopIGEpLT5zaW5femVybyk7CiAgICAgICAgICAgICAgICAgICAgKmlmX21zZyA9ICppZnA7CiAgICAgICAgICAgICAgICAgICAgKytoYXZlX2lmaW5mbzsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICBicmVhazsKICAgICAgICBjYXNlIFJUTV9ORVdBRERSOgogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBzdHJ1Y3QgaWZhX21zZ2hkciAqaWZhcCA9IChzdHJ1Y3QgaWZhX21zZ2hkciAqKSBjcDsKCiAgICAgICAgICAgICAgICBpZiAoKE5VTEwgIT0gc2lmYSkgJiYgKGlmYXAtPmlmYW1faW5kZXggPT0gaWluZGV4KSkgewogICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0cnVjdCBpbl9hZGRyICppYTsKCiAgICAgICAgICAgICAgICAgICAgLyoKICAgICAgICAgICAgICAgICAgICAgKiBJIGRvbid0IGtub3cgd2h5IHRoZSBub3JtYWwgZ2V0X2FkZHJlc3MoKSBkb2Vzbid0CiAgICAgICAgICAgICAgICAgICAgICogd29yayBvbiBJUklYIDYuMi4gIE1heWJlIHRoaXMgaGFzIHRvIGRvIHdpdGggdGhlCiAgICAgICAgICAgICAgICAgICAgICogZXhpc3RlbmNlIG9mIHN0cnVjdCBzb2NrYWRkcl9uZXcuICBIb3BlZnVsbHksIG9uCiAgICAgICAgICAgICAgICAgICAgICogb3RoZXIgc3lzdGVtcyB3ZSBjYW4gc2ltcGx5IHVzZSBnZXRfaW5fYWRkcmVzcwogICAgICAgICAgICAgICAgICAgICAqIHRocmVlIHRpbWVzLCB3aXRoIChpZmFwKzEpIGFzIHRoZSBzdGFydGluZwogICAgICAgICAgICAgICAgICAgICAqIGFkZHJlc3MuIAogICAgICAgICAgICAgICAgICAgICAqLwoKICAgICAgICAgICAgICAgICAgICBzaWZhLT5zaWZhX25ldG1hc2sgPQogICAgICAgICAgICAgICAgICAgICAgICAqKChzdHJ1Y3QgaW5fYWRkciAqKSAoKGNoYXIgKikgKGlmYXAgKyAxKSArIDQpKTsKICAgICAgICAgICAgICAgICAgICBpYSA9IGdldF9pbl9hZGRyZXNzKChjaGFyICopIChpZmFwICsgMSkgKyA4LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWZhcC0+aWZhbV9hZGRycyAmPQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgflJUQV9ORVRNQVNLLCBSVEFfSUZBKTsKICAgICAgICAgICAgICAgICAgICBpZiAoaWEgPT0gTlVMTCkKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDA7CgogICAgICAgICAgICAgICAgICAgIHNpZmEtPnNpZmFfYWRkciA9ICppYTsKICAgICAgICAgICAgICAgICAgICBpYSA9IGdldF9pbl9hZGRyZXNzKChjaGFyICopIChpZmFwICsgMSkgKyA4LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWZhcC0+aWZhbV9hZGRycyAmPSB+UlRBX05FVE1BU0ssCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSVEFfQlJEKTsKICAgICAgICAgICAgICAgICAgICBpZiAoaWEgPT0gTlVMTCkKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDA7CgogICAgICAgICAgICAgICAgICAgIHNpZmEtPnNpZmFfYnJvYWRjYXN0ID0gKmlhOwogICAgICAgICAgICAgICAgICAgICsraGF2ZV9hZGRyOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICAgIERFQlVHTVNHVEwoKCJtaWJJSS9pbnRlcmZhY2VzIiwKICAgICAgICAgICAgICAgICAgICAgICAgInJvdXRpbmcgc29ja2V0OiB1bmtub3duIG1lc3NhZ2UgdHlwZSAlZFxuIiwKICAgICAgICAgICAgICAgICAgICAgICAgaWZwLT5pZm1fdHlwZSkpOwogICAgICAgIH0KICAgIH0KICAgIGlmIChoYXZlX2lmaW5mbyAmJiAoTlVMTCA9PSBzaWZhKSB8fCAoaGF2ZV9hZGRyKSkgewogICAgICAgIHJldHVybiAwOwogICAgfSBlbHNlIGlmIChoYXZlX2lmaW5mbyAmJiAhKGlmX21zZy0+aWZtX2ZsYWdzICYgSUZGX1VQKSkKICAgICAgICByZXR1cm4gMDsKICAgIGVsc2UgewogICAgICAgIHJldHVybiAtMTsKICAgIH0KfQoKaW50CkludGVyZmFjZV9TY2FuX0dldF9Db3VudCh2b2lkKQp7CiAgICB1X2NoYXIgICAgICAgICAqY3A7CiAgICBzdHJ1Y3QgaWZfbXNnaGRyICppZnA7CiAgICBsb25nICAgICAgICAgICAgbiA9IDA7CgogICAgSW50ZXJmYWNlX1NjYW5fSW5pdCgpOwoKICAgIGlmIChpZl9saXN0X3NpemUpIHsKICAgICAgICBmb3IgKGNwID0gaWZfbGlzdCwgbiA9IDA7IGNwIDwgaWZfbGlzdF9lbmQ7IGNwICs9IGlmcC0+aWZtX21zZ2xlbikgewogICAgICAgICAgICBpZnAgPSAoc3RydWN0IGlmX21zZ2hkciAqKSBjcDsKICAgIAogICAgICAgICAgICBpZiAoaWZwLT5pZm1fdHlwZSA9PSBSVE1fSUZJTkZPKSB7CiAgICAgICAgICAgICAgICArK247CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9CiAgICByZXR1cm4gbjsKfQoKdm9pZApJbnRlcmZhY2VfU2Nhbl9Jbml0KHZvaWQpCnsKICAgIGludCAgICAgICAgICAgICBuYW1lW10gPSB7IENUTF9ORVQsIFBGX1JPVVRFLCAwLCAwLCBORVRfUlRfSUZMSVNULCAwIH07CiAgICBzaXplX3QgICAgICAgICAgc2l6ZTsKCiAgICBpZiAoc3lzY3RsKG5hbWUsIHNpemVvZihuYW1lKSAvIHNpemVvZihpbnQpLCAwLCAmc2l6ZSwgMCwgMCkgPT0gLTEpIHsKICAgICAgICBzbm1wX2xvZyhMT0dfRVJSLCAic3lzY3RsIHNpemUgZmFpbFxuIik7CiAgICB9IGVsc2UgewogICAgICAgIGlmIChpZl9saXN0ID09IDAgfHwgaWZfbGlzdF9zaXplIDwgc2l6ZSkgewogICAgICAgICAgICBpZiAoaWZfbGlzdCAhPSAwKSB7CiAgICAgICAgICAgICAgICBmcmVlKGlmX2xpc3QpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmX2xpc3QgICAgICA9IE5VTEw7CiAgICAgICAgICAgIGlmX2xpc3Rfc2l6ZSA9IDA7CiAgICAgICAgICAgIGlmX2xpc3RfZW5kICA9IDA7CiAgICAgICAgICAgIGlmICgoaWZfbGlzdCA9IG1hbGxvYyhzaXplKSkgPT0gTlVMTCkgewogICAgICAgICAgICAgICAgc25tcF9sb2coTE9HX0VSUiwKICAgICAgICAgICAgICAgICAgICAgICAgICJvdXQgb2YgbWVtb3J5IGFsbG9jYXRpbmcgcm91dGUgdGFibGUgKHNpemUgPSAlZClcbiIsIHNpemUpOwogICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmX2xpc3Rfc2l6ZSA9IHNpemU7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgc2l6ZSA9IGlmX2xpc3Rfc2l6ZTsKICAgICAgICB9CiAgICAgICAgaWYgKHN5c2N0bChuYW1lLCBzaXplb2YobmFtZSkgLyBzaXplb2YoaW50KSwKICAgICAgICAgICAgICAgICAgIGlmX2xpc3QsICZzaXplLCAwLCAwKSA9PSAtMSkgewogICAgICAgICAgICBzbm1wX2xvZyhMT0dfRVJSLCAic3lzY3RsIGdldCBmYWlsXG4iKTsKICAgICAgICB9CiAgICAgICAgaWZfbGlzdF9lbmQgPSBpZl9saXN0ICsgc2l6ZTsKICAgIH0KfQoKdV9jaGFyICAgICAgICAgKgp2YXJfaWZFbnRyeShzdHJ1Y3QgdmFyaWFibGUgKnZwLAogICAgICAgICAgICBvaWQgKiBuYW1lLAogICAgICAgICAgICBzaXplX3QgKiBsZW5ndGgsCiAgICAgICAgICAgIGludCBleGFjdCwgc2l6ZV90ICogdmFyX2xlbiwgV3JpdGVNZXRob2QgKiogd3JpdGVfbWV0aG9kKQp7CiAgICBpbnQgICAgICAgICAgICAgaW50ZXJmYWNlOwogICAgc3RydWN0IGlmX21zZ2hkciBpZl9tc2c7CiAgICBzdGF0aWMgY2hhciAgICAgaWZfbmFtZVsxMDBdOwogICAgY29uZl9pZl9saXN0ICAgKmlmX3B0cjsKICAgIGNoYXIgICAgICAgICAgICpjcDsKCiAgICBpbnRlcmZhY2UgPQogICAgICAgIGhlYWRlcl9pZkVudHJ5KHZwLCBuYW1lLCBsZW5ndGgsIGV4YWN0LCB2YXJfbGVuLCB3cml0ZV9tZXRob2QpOwogICAgaWYgKGludGVyZmFjZSA9PSBNQVRDSF9GQUlMRUQpCiAgICAgICAgcmV0dXJuIE5VTEw7CgogICAgaWYgKEludGVyZmFjZV9TY2FuX0J5X0luZGV4KGludGVyZmFjZSwgJmlmX21zZywgaWZfbmFtZSwgTlVMTCkgIT0gMCkKICAgICAgICByZXR1cm4gTlVMTDsKICAgIGlmX3B0ciA9IG5ldHNubXBfYWNjZXNzX2ludGVyZmFjZV9lbnRyeV9vdmVycmlkZXNfZ2V0KGlmX25hbWUpOwoKICAgIHN3aXRjaCAodnAtPm1hZ2ljKSB7CiAgICBjYXNlIElGSU5ERVg6CiAgICAgICAgbG9uZ19yZXR1cm4gPSBpbnRlcmZhY2U7CiAgICAgICAgcmV0dXJuICh1X2NoYXIgKikgJiBsb25nX3JldHVybjsKICAgIGNhc2UgSUZERVNDUjoKICAgICAgICBjcCA9IGlmX25hbWU7CiAgICAgICAgKnZhcl9sZW4gPSBzdHJsZW4oaWZfbmFtZSk7CiAgICAgICAgcmV0dXJuICh1X2NoYXIgKikgY3A7CiAgICBjYXNlIE5FVFNOTVBfSUZUWVBFOgogICAgICAgIGlmIChpZl9wdHIpCiAgICAgICAgICAgIGxvbmdfcmV0dXJuID0gaWZfcHRyLT50eXBlOwogICAgICAgIGVsc2UKICAgICAgICBsb25nX3JldHVybiA9IChsb25nKSBpZl9tc2cuaWZtX2RhdGEuaWZpX3R5cGU7CiAgICAgICAgcmV0dXJuICh1X2NoYXIgKikgJiBsb25nX3JldHVybjsKICAgIGNhc2UgSUZNVFU6CiAgICAgICAgbG9uZ19yZXR1cm4gPSAobG9uZykgaWZfbXNnLmlmbV9kYXRhLmlmaV9tdHU7CiAgICAgICAgcmV0dXJuICh1X2NoYXIgKikgJiBsb25nX3JldHVybjsKICAgIGNhc2UgSUZTUEVFRDoKICAgICAgICBpZiAoaWZfcHRyKQogICAgICAgICAgICBsb25nX3JldHVybiA9IGlmX3B0ci0+c3BlZWQ7CiAgICAgICAgZWxzZSB7CiNpZiBTVFJVQ1RfSUZORVRfSEFTX0lGX0JBVURSQVRFX0lGU19WQUxVRQogICAgICAgIGxvbmdfcmV0dXJuID0gKHVfbG9uZykgaWZfbXNnLmlmbV9kYXRhLmlmaV9iYXVkcmF0ZS5pZnNfdmFsdWUgPDwKICAgICAgICAgICAgaWZfbXNnLmlmbV9kYXRhLmlmaV9iYXVkcmF0ZS5pZnNfbG9nMjsKI2Vsc2UKICAgICAgICBsb25nX3JldHVybiA9ICh1X2xvbmcpIGlmX21zZy5pZm1fZGF0YS5pZmlfYmF1ZHJhdGU7CiNlbmRpZgogICAgICAgIH0KICAgICAgICByZXR1cm4gKHVfY2hhciAqKSAmIGxvbmdfcmV0dXJuOwogICAgY2FzZSBJRlBIWVNBRERSRVNTOgogICAgICAgIC8qCiAgICAgICAgICogWFhYIAogICAgICAgICAqLwogICAgICAgIHJldHVybiBOVUxMOwogICAgY2FzZSBJRkFETUlOU1RBVFVTOgogICAgICAgIGxvbmdfcmV0dXJuID0gaWZfbXNnLmlmbV9mbGFncyAmIElGRl9VUCA/IDEgOiAyOwogICAgICAgIHJldHVybiAodV9jaGFyICopICYgbG9uZ19yZXR1cm47CiAgICBjYXNlIElGT1BFUlNUQVRVUzoKICAgICAgICBsb25nX3JldHVybiA9IGlmX21zZy5pZm1fZmxhZ3MgJiBJRkZfUlVOTklORyA/IDEgOiAyOwogICAgICAgIHJldHVybiAodV9jaGFyICopICYgbG9uZ19yZXR1cm47CiAgICAgICAgLyoKICAgICAgICAgKiBpZkxhc3RDaGFuZ2UgCiAgICAgICAgICovCiAgICBjYXNlIElGSU5PQ1RFVFM6CiAgICAgICAgbG9uZ19yZXR1cm4gPSAodV9sb25nKSBpZl9tc2cuaWZtX2RhdGEuaWZpX2lieXRlczsKICAgICAgICByZXR1cm4gKHVfY2hhciAqKSAmIGxvbmdfcmV0dXJuOwogICAgY2FzZSBJRklOVUNBU1RQS1RTOgogICAgICAgIGxvbmdfcmV0dXJuID0KICAgICAgICAgICAgKHVfbG9uZykgaWZfbXNnLmlmbV9kYXRhLmlmaV9pcGFja2V0cyAtCiAgICAgICAgICAgIGlmX21zZy5pZm1fZGF0YS5pZmlfaW1jYXN0czsKICAgICAgICByZXR1cm4gKHVfY2hhciAqKSAmIGxvbmdfcmV0dXJuOwogICAgY2FzZSBJRklOTlVDQVNUUEtUUzoKICAgICAgICBsb25nX3JldHVybiA9ICh1X2xvbmcpIGlmX21zZy5pZm1fZGF0YS5pZmlfaW1jYXN0czsKICAgICAgICByZXR1cm4gKHVfY2hhciAqKSAmIGxvbmdfcmV0dXJuOwogICAgY2FzZSBJRklORElTQ0FSRFM6CiAgICAgICAgbG9uZ19yZXR1cm4gPSAodV9sb25nKSBpZl9tc2cuaWZtX2RhdGEuaWZpX2lxZHJvcHM7CiAgICAgICAgcmV0dXJuICh1X2NoYXIgKikgJiBsb25nX3JldHVybjsKICAgIGNhc2UgSUZJTkVSUk9SUzoKICAgICAgICBsb25nX3JldHVybiA9ICh1X2xvbmcpIGlmX21zZy5pZm1fZGF0YS5pZmlfaWVycm9yczsKICAgICAgICByZXR1cm4gKHVfY2hhciAqKSAmIGxvbmdfcmV0dXJuOwogICAgY2FzZSBJRklOVU5LTk9XTlBST1RPUzoKICAgICAgICBsb25nX3JldHVybiA9ICh1X2xvbmcpIGlmX21zZy5pZm1fZGF0YS5pZmlfbm9wcm90bzsKICAgICAgICByZXR1cm4gKHVfY2hhciAqKSAmIGxvbmdfcmV0dXJuOwogICAgY2FzZSBJRk9VVE9DVEVUUzoKICAgICAgICBsb25nX3JldHVybiA9ICh1X2xvbmcpIGlmX21zZy5pZm1fZGF0YS5pZmlfb2J5dGVzOwogICAgICAgIHJldHVybiAodV9jaGFyICopICYgbG9uZ19yZXR1cm47CiAgICBjYXNlIElGT1VUVUNBU1RQS1RTOgogICAgICAgIGxvbmdfcmV0dXJuID0KICAgICAgICAgICAgKHVfbG9uZykgaWZfbXNnLmlmbV9kYXRhLmlmaV9vcGFja2V0cyAtCiAgICAgICAgICAgIGlmX21zZy5pZm1fZGF0YS5pZmlfb21jYXN0czsKICAgICAgICByZXR1cm4gKHVfY2hhciAqKSAmIGxvbmdfcmV0dXJuOwogICAgY2FzZSBJRk9VVE5VQ0FTVFBLVFM6CiAgICAgICAgbG9uZ19yZXR1cm4gPSAodV9sb25nKSBpZl9tc2cuaWZtX2RhdGEuaWZpX29tY2FzdHM7CiAgICAgICAgcmV0dXJuICh1X2NoYXIgKikgJiBsb25nX3JldHVybjsKICAgIGNhc2UgSUZPVVRESVNDQVJEUzoKI2lmZGVmIGlmX29kcm9wcwogICAgICAgIGxvbmdfcmV0dXJuID0gKHVfbG9uZykgaWZfbXNnLmlmbV9kYXRhLmlmaV9vZHJvcHM7CiNlbHNlCiNpZiBORVRTTk1QX05PX0RVTU1ZX1ZBTFVFUwogICAgICAgIHJldHVybiBOVUxMOwojZW5kaWYKICAgICAgICBsb25nX3JldHVybiA9IDA7CiNlbmRpZgogICAgICAgIHJldHVybiAodV9jaGFyICopICYgbG9uZ19yZXR1cm47CiAgICBjYXNlIElGT1VURVJST1JTOgogICAgICAgIGxvbmdfcmV0dXJuID0gKHVfbG9uZykgaWZfbXNnLmlmbV9kYXRhLmlmaV9vZXJyb3JzOwogICAgICAgIHJldHVybiAodV9jaGFyICopICYgbG9uZ19yZXR1cm47CiAgICBjYXNlIElGTEFTVENIQU5HRToKI2lmZGVmIGlyaXg2CiAgICAgICAgbG9uZ19yZXR1cm4gPSAwOwojZWxzZQogICAgICAgIGlmIChpZl9tc2cuaWZtX2RhdGEuaWZpX2xhc3RjaGFuZ2UudHZfc2VjID09IDAgJiYKI2lmIFNUUlVDVF9JRk5FVF9IQVNfSUZfTEFTVENIQU5HRV9UVl9OU0VDCiAgICAgICAgICAgIGlmX21zZy5pZm1fZGF0YS5pZmlfbGFzdGNoYW5nZS50dl9uc2VjID09IDAKI2Vsc2UKICAgICAgICAgICAgaWZfbXNnLmlmbV9kYXRhLmlmaV9sYXN0Y2hhbmdlLnR2X3VzZWMgPT0gMAojZW5kaWYKICAgICAgICAgICApCiAgICAgICAgICAgIGxvbmdfcmV0dXJuID0gMDsKICAgICAgICBlbHNlIGlmIChpZl9tc2cuaWZtX2RhdGEuaWZpX2xhc3RjaGFuZ2UudHZfc2VjIDwgc3RhcnR0aW1lLnR2X3NlYykKICAgICAgICAgICAgbG9uZ19yZXR1cm4gPSAwOwogICAgICAgIGVsc2UgewogICAgICAgICAgICBsb25nX3JldHVybiA9ICh1X2xvbmcpCiAgICAgICAgICAgICAgICAoKGlmX21zZy5pZm1fZGF0YS5pZmlfbGFzdGNoYW5nZS50dl9zZWMgLQogICAgICAgICAgICAgICAgICBzdGFydHRpbWUudHZfc2VjKSAqIDEwMCArCiAgICAgICAgICAgICAgICAgKAojaWYgU1RSVUNUX0lGTkVUX0hBU19JRl9MQVNUQ0hBTkdFX1RWX05TRUMKICAgICAgICAgICAgICAgICAgaWZfbXNnLmlmbV9kYXRhLmlmaV9sYXN0Y2hhbmdlLnR2X25zZWMgLyAxMDAwCiNlbHNlCiAgICAgICAgICAgICAgICAgIGlmX21zZy5pZm1fZGF0YS5pZmlfbGFzdGNoYW5nZS50dl91c2VjCiNlbmRpZgogICAgICAgICAgICAgICAgICAtIHN0YXJ0dGltZS50dl91c2VjKSAvIDEwMDAwKTsKICAgICAgICB9CiNlbmRpZgogICAgICAgIHJldHVybiAodV9jaGFyICopICYgbG9uZ19yZXR1cm47CiAgICBkZWZhdWx0OgogICAgICAgIHJldHVybiAwOwogICAgfQp9CgppbnQKSW50ZXJmYWNlX1NjYW5fTmV4dChzaG9ydCAqSW5kZXgsCiAgICAgICAgICAgICAgICAgICAgY2hhciAqTmFtZSwKICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgaWZuZXQgKlJldGlmbmV0LCBzdHJ1Y3QgaW5faWZhZGRyICpSZXRpbl9pZmFkZHIpCnsKICAgIHJldHVybiAwOwp9CgppbnQKSW50ZXJmYWNlX1NjYW5fTmV4dEludChpbnQgKkluZGV4LAogICAgICAgICAgICAgICAgICAgIGNoYXIgKk5hbWUsCiAgICAgICAgICAgICAgICAgICAgc3RydWN0IGlmbmV0ICpSZXRpZm5ldCwgc3RydWN0IGluX2lmYWRkciAqUmV0aW5faWZhZGRyKQp7CiAgICByZXR1cm4gMDsKfQoKI2Vsc2UgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBub3QgVVNFX1NZU0NUTF9JRkxJU1QgKi8KCiAgICAgICAgLyoqKioqKioqKioqKioqKioqKioqKgoJICoKCSAqICBLZXJuZWwgJiBpbnRlcmZhY2UgaW5mb3JtYXRpb24sCgkgKiAgIGFuZCBpbnRlcm5hbCBmb3J3YXJkIGRlY2xhcmF0aW9ucwoJICoKCSAqKioqKioqKioqKioqKioqKioqKiovCgojaWZuZGVmIEhBVkVfTkVUX0lGX01JQl9ICgojaWZuZGVmIHNvbGFyaXMyCiNpZm5kZWYgaHB1eDExCnN0YXRpYyBpbnQgICAgICBJbnRlcmZhY2VfU2Nhbl9CeV9JbmRleChpbnQsIGNoYXIgKiwgc3RydWN0IGlmbmV0ICosCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgaW5faWZhZGRyICopOwpzdGF0aWMgaW50ICAgICAgSW50ZXJmYWNlX0dldF9FdGhlcl9CeV9JbmRleChpbnQsIHVfY2hhciAqKTsKI2Vsc2UKc3RhdGljIGludCAgICAgIEludGVyZmFjZV9TY2FuX0J5X0luZGV4KGludCwgY2hhciAqLCBubWFwaV9waHlzdGF0ICopOwojZW5kaWYKI2VuZGlmCgoKCiAgICAgICAgLyoqKioqKioqKioqKioqKioqKioqKgoJICoKCSAqICBTeXN0ZW0gc3BlY2lmaWMgaW1wbGVtZW50YXRpb24gZnVuY3Rpb25zCgkgKgoJICoqKioqKioqKioqKioqKioqKioqKi8KCgojaWZuZGVmIHNvbGFyaXMyCiNpZm5kZWYgaHB1eAoKdV9jaGFyICAgICAgICAgKgp2YXJfaWZFbnRyeShzdHJ1Y3QgdmFyaWFibGUgKnZwLAogICAgICAgICAgICBvaWQgKiBuYW1lLAogICAgICAgICAgICBzaXplX3QgKiBsZW5ndGgsCiAgICAgICAgICAgIGludCBleGFjdCwgc2l6ZV90ICogdmFyX2xlbiwgV3JpdGVNZXRob2QgKiogd3JpdGVfbWV0aG9kKQp7CiAgICBzdGF0aWMgc3RydWN0IGlmbmV0IGlmbmV0OwogICAgaW50ICAgICAgICAgICAgIGludGVyZmFjZTsKICAgIHN0YXRpYyBzdHJ1Y3QgaW5faWZhZGRyIGluX2lmYWRkcjsKICAgIHN0YXRpYyBjaGFyICAgICBOYW1lWzE2XTsKICAgIGNoYXIgICAgICAgICAgICpjcDsKICAgIGNvbmZfaWZfbGlzdCAgICppZl9wdHI7CiNpZiBTVFJVQ1RfSUZORVRfSEFTX0lGX0xBU1RDSEFOR0VfVFZfU0VDCiAgICBzdHJ1Y3QgdGltZXZhbCAgbm93OwojZW5kaWYKCiAgICBpbnRlcmZhY2UgPQogICAgICAgIGhlYWRlcl9pZkVudHJ5KHZwLCBuYW1lLCBsZW5ndGgsIGV4YWN0LCB2YXJfbGVuLCB3cml0ZV9tZXRob2QpOwogICAgaWYgKGludGVyZmFjZSA9PSBNQVRDSF9GQUlMRUQpCiAgICAgICAgcmV0dXJuIE5VTEw7CgogICAgSW50ZXJmYWNlX1NjYW5fQnlfSW5kZXgoaW50ZXJmYWNlLCBOYW1lLCAmaWZuZXQsICZpbl9pZmFkZHIpOwogICAgaWZfcHRyID0gbmV0c25tcF9hY2Nlc3NfaW50ZXJmYWNlX2VudHJ5X292ZXJyaWRlc19nZXQoTmFtZSk7CgogICAgc3dpdGNoICh2cC0+bWFnaWMpIHsKICAgIGNhc2UgSUZJTkRFWDoKICAgICAgICBsb25nX3JldHVybiA9IGludGVyZmFjZTsKICAgICAgICByZXR1cm4gKHVfY2hhciAqKSAmIGxvbmdfcmV0dXJuOwogICAgY2FzZSBJRkRFU0NSOgogICAgICAgIGNwID0gTmFtZTsKICAgICAgICAqdmFyX2xlbiA9IHN0cmxlbihjcCk7CiAgICAgICAgcmV0dXJuICh1X2NoYXIgKikgY3A7CiAgICBjYXNlIE5FVFNOTVBfSUZUWVBFOgogICAgICAgIGlmIChpZl9wdHIpCiAgICAgICAgICAgIGxvbmdfcmV0dXJuID0gaWZfcHRyLT50eXBlOwogICAgICAgIGVsc2UgewojaWYgU1RSVUNUX0lGTkVUX0hBU19JRl9UWVBFCiAgICAgICAgICAgIGxvbmdfcmV0dXJuID0gaWZuZXQuaWZfdHlwZTsKI2Vsc2UKICAgICAgICAgICAgbG9uZ19yZXR1cm4gPSAxOyAgICAvKiBPVEhFUiAqLwojZW5kaWYKICAgICAgICB9CiAgICAgICAgcmV0dXJuICh1X2NoYXIgKikgJiBsb25nX3JldHVybjsKICAgIGNhc2UgSUZNVFU6ewogICAgICAgICAgICBsb25nX3JldHVybiA9IChsb25nKSBpZm5ldC5pZl9tdHU7CiAgICAgICAgICAgIHJldHVybiAodV9jaGFyICopICYgbG9uZ19yZXR1cm47CiAgICAgICAgfQogICAgY2FzZSBJRlNQRUVEOgogICAgICAgIGlmIChpZl9wdHIpCiAgICAgICAgICAgIGxvbmdfcmV0dXJuID0gaWZfcHRyLT5zcGVlZDsKICAgICAgICBlbHNlIHsKI2lmIFNUUlVDVF9JRk5FVF9IQVNfSUZfQkFVRFJBVEUKICAgICAgICAgICAgbG9uZ19yZXR1cm4gPSBpZm5ldC5pZl9iYXVkcmF0ZTsKI2VsaWYgU1RSVUNUX0lGTkVUX0hBU19JRl9TUEVFRAogICAgICAgICAgICBsb25nX3JldHVybiA9IGlmbmV0LmlmX3NwZWVkOwojZWxpZiBTVFJVQ1RfSUZORVRfSEFTX0lGX1RZUEUgJiYgZGVmaW5lZChJRlRfRVRIRVIpCiAgICAgICAgICAgIGlmIChpZm5ldC5pZl90eXBlID09IElGVF9FVEhFUikKICAgICAgICAgICAgICAgIGxvbmdfcmV0dXJuID0gMTAwMDAwMDA7CiAgICAgICAgICAgIGlmIChpZm5ldC5pZl90eXBlID09IElGVF9QMTApCiAgICAgICAgICAgICAgICBsb25nX3JldHVybiA9IDEwMDAwMDAwOwogICAgICAgICAgICBpZiAoaWZuZXQuaWZfdHlwZSA9PSBJRlRfUDgwKQogICAgICAgICAgICAgICAgbG9uZ19yZXR1cm4gPSA4MDAwMDAwMDsKICAgICAgICAgICAgaWYgKGlmbmV0LmlmX3R5cGUgPT0gSUZUX0lTRE5CQVNJQykKICAgICAgICAgICAgICAgIGxvbmdfcmV0dXJuID0gNjQwMDA7ICAgIC8qIEVEU1MxIG9ubHkgKi8KICAgICAgICAgICAgaWYgKGlmbmV0LmlmX3R5cGUgPT0gSUZUX0lTRE5QUklNQVJZKQogICAgICAgICAgICAgICAgbG9uZ19yZXR1cm4gPSA2NDAwMCAqIDMwOwojZWxzZQojaWYgTkVUU05NUF9OT19EVU1NWV9WQUxVRVMKICAgICAgICAgICAgcmV0dXJuIE5VTEw7CiNlbmRpZgogICAgICAgICAgICBsb25nX3JldHVybiA9ICh1X2xvbmcpIDEwMDAwMDAwOwojZW5kaWYKICAgICAgICB9CiAgICAgICAgcmV0dXJuICh1X2NoYXIgKikgJiBsb25nX3JldHVybjsKICAgIGNhc2UgSUZQSFlTQUREUkVTUzoKICAgICAgICBJbnRlcmZhY2VfR2V0X0V0aGVyX0J5X0luZGV4KGludGVyZmFjZSwgcmV0dXJuX2J1Zik7CiNpZiBkZWZpbmVkKGFpeDQpIHx8IGRlZmluZWQoYWl4NSkgfHwgZGVmaW5lZChhaXg2KQoJKnZhcl9sZW4gPSAwOwojZWxzZQogICAgICAgIGlmICgocmV0dXJuX2J1ZlswXSA9PSAwKSAmJiAocmV0dXJuX2J1ZlsxXSA9PSAwKSAmJgogICAgICAgICAgICAocmV0dXJuX2J1ZlsyXSA9PSAwKSAmJiAocmV0dXJuX2J1ZlszXSA9PSAwKSAmJgogICAgICAgICAgICAocmV0dXJuX2J1Zls0XSA9PSAwKSAmJiAocmV0dXJuX2J1Zls1XSA9PSAwKSkKICAgICAgICAgICAgKnZhcl9sZW4gPSAwOwogICAgICAgIGVsc2UKICAgICAgICAgICAgKnZhcl9sZW4gPSA2OwojZW5kaWYKICAgICAgICByZXR1cm4gKHVfY2hhciAqKSByZXR1cm5fYnVmOwogICAgY2FzZSBJRkFETUlOU1RBVFVTOgogICAgICAgIGxvbmdfcmV0dXJuID0gaWZuZXQuaWZfZmxhZ3MgJiBJRkZfVVAgPyAxIDogMjsKICAgICAgICByZXR1cm4gKHVfY2hhciAqKSAmIGxvbmdfcmV0dXJuOwogICAgY2FzZSBJRk9QRVJTVEFUVVM6CiAgICAgICAgbG9uZ19yZXR1cm4gPSBpZm5ldC5pZl9mbGFncyAmIElGRl9SVU5OSU5HID8gMSA6IDI7CiAgICAgICAgcmV0dXJuICh1X2NoYXIgKikgJiBsb25nX3JldHVybjsKICAgIGNhc2UgSUZMQVNUQ0hBTkdFOgojaWYgZGVmaW5lZChTVFJVQ1RfSUZORVRfSEFTX0lGX0xBU1RDSEFOR0VfVFZfU0VDKSAmJiAhKGRlZmluZWQoZnJlZWJzZDIpICYmIF9fRnJlZUJTRF92ZXJzaW9uIDwgMTk5NjA3KQogICAgICAgIC8qCiAgICAgICAgICogWFhYIC0gU05NUCdzIGlmTGFzdGNoYW5nZSBpcyB0aW1lIHdoZW4gb3AuIHN0YXR1cyBjaGFuZ2VkCiAgICAgICAgICogKiBGcmVlQlNEJ3MgaWZfbGFzdGNoYW5nZSBpcyB0aW1lIHdoZW4gcGFja2V0IHdhcyBpbnB1dCBvciBvdXRwdXQKICAgICAgICAgKiAqIChhdCBsZWFzdCBpbiAyLjEuMC1SRUxFQVNFLiBDaGFuZ2VkIGluIGxhdGVyIHZlcnNpb25zIG9mIHRoZSBrZXJuZWw/KQogICAgICAgICAqLwogICAgICAgIC8qCiAgICAgICAgICogRnJlZUJTRCdzIGlmX2xhc3RjaGFuZ2UgYmVmb3JlIHRoZSAyLjEuNSByZWxlYXNlIGlzIHRoZSB0aW1lIHdoZW4KICAgICAgICAgKiAqIGEgcGFja2V0IHdhcyBsYXN0IGlucHV0IG9yIG91dHB1dC4gIEluIHRoZSAyLjEuNSBhbmQgbGF0ZXIgcmVsZWFzZXMsCiAgICAgICAgICogKiB0aGlzIGlzIGZpeGVkLCB0aHVzIHRoZSAxOTk2MDcgY29tcGFyaXNvbi4KICAgICAgICAgKi8KICAgICAgICBpZiAoaWZuZXQuaWZfbGFzdGNoYW5nZS50dl9zZWMgPT0gMCAmJgogICAgICAgICAgICBpZm5ldC5pZl9sYXN0Y2hhbmdlLnR2X3VzZWMgPT0gMCkKICAgICAgICAgICAgbG9uZ19yZXR1cm4gPSAwOwogICAgICAgIGVsc2UgaWYgKGlmbmV0LmlmX2xhc3RjaGFuZ2UudHZfc2VjIDwgc3RhcnR0aW1lLnR2X3NlYykKICAgICAgICAgICAgbG9uZ19yZXR1cm4gPSAwOwogICAgICAgIGVsc2UgewogICAgICAgICAgICBsb25nX3JldHVybiA9ICh1X2xvbmcpCiAgICAgICAgICAgICAgICAoKGlmbmV0LmlmX2xhc3RjaGFuZ2UudHZfc2VjIC0gc3RhcnR0aW1lLnR2X3NlYykgKiAxMDAKICAgICAgICAgICAgICAgICArIChpZm5ldC5pZl9sYXN0Y2hhbmdlLnR2X3VzZWMgLQogICAgICAgICAgICAgICAgICAgIHN0YXJ0dGltZS50dl91c2VjKSAvIDEwMDAwKTsKICAgICAgICB9CiNlbHNlCiNpZiBORVRTTk1QX05PX0RVTU1ZX1ZBTFVFUwogICAgICAgIHJldHVybiBOVUxMOwojZW5kaWYKICAgICAgICBsb25nX3JldHVybiA9IDA7ICAgICAgICAvKiBYWFggKi8KI2VuZGlmCiAgICAgICAgcmV0dXJuICh1X2NoYXIgKikgJiBsb25nX3JldHVybjsKICAgIGNhc2UgSUZJTk9DVEVUUzoKI2lmZGVmIFNUUlVDVF9JRk5FVF9IQVNfSUZfSUJZVEVTCiNpZiBkZWZpbmVkKGFpeDQpIHx8IGRlZmluZWQoYWl4NSkgfHwgZGVmaW5lZChhaXg2KQogICAgICAgIGxvbmdfcmV0dXJuID0gKHVfbG9uZykgaWZuZXQuaWZfaWJ5dGVzICYgMHhmZmZmZmZmZjsKI2Vsc2UKICAgICAgICBsb25nX3JldHVybiA9ICh1X2xvbmcpIGlmbmV0LmlmX2lieXRlczsKI2VuZGlmCiNlbHNlCiNpZiBORVRTTk1QX05PX0RVTU1ZX1ZBTFVFUwogICAgICAgIHJldHVybiBOVUxMOwojZW5kaWYKICAgICAgICBsb25nX3JldHVybiA9ICh1X2xvbmcpIGlmbmV0LmlmX2lwYWNrZXRzICogMzA4OyAvKiBYWFggKi8KI2VuZGlmCiAgICAgICAgcmV0dXJuICh1X2NoYXIgKikgJiBsb25nX3JldHVybjsKICAgIGNhc2UgSUZJTlVDQVNUUEtUUzoKICAgICAgICB7CiNpZiBkZWZpbmVkKGFpeDQpIHx8IGRlZmluZWQoYWl4NSkgfHwgZGVmaW5lZChhaXg2KQogICAgICAgICAgICBsb25nX3JldHVybiA9ICh1X2xvbmcpIGlmbmV0LmlmX2lwYWNrZXRzICYgMHhmZmZmZmZmZjsKI2Vsc2UKICAgICAgICAgICAgbG9uZ19yZXR1cm4gPSAodV9sb25nKSBpZm5ldC5pZl9pcGFja2V0czsKI2VuZGlmCiNpZiBTVFJVQ1RfSUZORVRfSEFTX0lGX0lNQ0FTVFMKI2lmIGRlZmluZWQoYWl4NCkgfHwgZGVmaW5lZChhaXg1KSB8fCBkZWZpbmVkKGFpeDYpCiAgICAgICAgICAgIGxvbmdfcmV0dXJuIC09ICh1X2xvbmcpIGlmbmV0LmlmX2ltY2FzdHMgJiAweGZmZmZmZmZmOwojZWxzZQogICAgICAgICAgICBsb25nX3JldHVybiAtPSAodV9sb25nKSBpZm5ldC5pZl9pbWNhc3RzOwojZW5kaWYKI2VuZGlmCiAgICAgICAgfQogICAgICAgIHJldHVybiAodV9jaGFyICopICYgbG9uZ19yZXR1cm47CiAgICBjYXNlIElGSU5OVUNBU1RQS1RTOgojaWYgU1RSVUNUX0lGTkVUX0hBU19JRl9JTUNBU1RTCiNpZiBkZWZpbmVkKGFpeDQpIHx8IGRlZmluZWQoYWl4NSkgfHwgZGVmaW5lZChhaXg2KQogICAgICAgIGxvbmdfcmV0dXJuID0gKHVfbG9uZykgaWZuZXQuaWZfaW1jYXN0cyAmIDB4ZmZmZmZmZmY7CiNlbHNlCiAgICAgICAgbG9uZ19yZXR1cm4gPSAodV9sb25nKSBpZm5ldC5pZl9pbWNhc3RzOwojZW5kaWYKI2Vsc2UKI2lmIE5FVFNOTVBfTk9fRFVNTVlfVkFMVUVTCiAgICAgICAgcmV0dXJuIE5VTEw7CiNlbmRpZgogICAgICAgIGxvbmdfcmV0dXJuID0gKHVfbG9uZykgMDsgICAgICAgLyogWFhYICovCiNlbmRpZgogICAgICAgIHJldHVybiAodV9jaGFyICopICYgbG9uZ19yZXR1cm47CiAgICBjYXNlIElGSU5ESVNDQVJEUzoKI2lmIFNUUlVDVF9JRk5FVF9IQVNfSUZfSVFEUk9QUwojaWYgZGVmaW5lZChhaXg0KSB8fCBkZWZpbmVkKGFpeDUpIHx8IGRlZmluZWQoYWl4NikKICAgICAgICBsb25nX3JldHVybiA9ICh1X2xvbmcpIGlmbmV0LmlmX2lxZHJvcHMgJiAweGZmZmZmZmZmOwojZWxzZQogICAgICAgIGxvbmdfcmV0dXJuID0gKHVfbG9uZykgaWZuZXQuaWZfaXFkcm9wczsKI2VuZGlmCiNlbHNlCiNpZiBORVRTTk1QX05PX0RVTU1ZX1ZBTFVFUwogICAgICAgIHJldHVybiBOVUxMOwojZW5kaWYKICAgICAgICBsb25nX3JldHVybiA9ICh1X2xvbmcpIDA7ICAgICAgIC8qIFhYWCAqLwojZW5kaWYKICAgICAgICByZXR1cm4gKHVfY2hhciAqKSAmIGxvbmdfcmV0dXJuOwogICAgY2FzZSBJRklORVJST1JTOgojaWYgZGVmaW5lZChhaXg0KSB8fCBkZWZpbmVkKGFpeDUpIHx8IGRlZmluZWQoYWl4NikKICAgICAgICBsb25nX3JldHVybiA9ICh1X2xvbmcpIGlmbmV0LmlmX2llcnJvcnMgJiAweGZmZmZmZmZmOwojZWxzZQogICAgICAgIGxvbmdfcmV0dXJuID0gKHVfbG9uZykgaWZuZXQuaWZfaWVycm9yczsKI2VuZGlmCiAgICAgICAgcmV0dXJuICh1X2NoYXIgKikgJiBsb25nX3JldHVybjsKICAgIGNhc2UgSUZJTlVOS05PV05QUk9UT1M6CiNpZiBTVFJVQ1RfSUZORVRfSEFTX0lGX05PUFJPVE8KI2lmIGRlZmluZWQoYWl4NCkgfHwgZGVmaW5lZChhaXg1KSB8fCBkZWZpbmVkKGFpeDYpCiAgICAgICAgbG9uZ19yZXR1cm4gPSAodV9sb25nKSBpZm5ldC5pZl9ub3Byb3RvICYgMHhmZmZmZmZmZjsKI2Vsc2UKICAgICAgICBsb25nX3JldHVybiA9ICh1X2xvbmcpIGlmbmV0LmlmX25vcHJvdG87CiNlbmRpZgojZWxzZQojaWYgTkVUU05NUF9OT19EVU1NWV9WQUxVRVMKICAgICAgICByZXR1cm4gTlVMTDsKI2VuZGlmCiAgICAgICAgbG9uZ19yZXR1cm4gPSAodV9sb25nKSAwOyAgICAgICAvKiBYWFggKi8KI2VuZGlmCiAgICAgICAgcmV0dXJuICh1X2NoYXIgKikgJiBsb25nX3JldHVybjsKICAgIGNhc2UgSUZPVVRPQ1RFVFM6CiNpZmRlZiBTVFJVQ1RfSUZORVRfSEFTX0lGX09CWVRFUwojaWYgZGVmaW5lZChhaXg0KSB8fCBkZWZpbmVkKGFpeDUpIHx8IGRlZmluZWQoYWl4NikKICAgICAgICBsb25nX3JldHVybiA9ICh1X2xvbmcpIGlmbmV0LmlmX29ieXRlcyAmIDB4ZmZmZmZmZmY7CiNlbHNlCiAgICAgICAgbG9uZ19yZXR1cm4gPSAodV9sb25nKSBpZm5ldC5pZl9vYnl0ZXM7CiNlbmRpZgojZWxzZQojaWYgTkVUU05NUF9OT19EVU1NWV9WQUxVRVMKICAgICAgICByZXR1cm4gTlVMTDsKI2VuZGlmCiAgICAgICAgbG9uZ19yZXR1cm4gPSAodV9sb25nKSBpZm5ldC5pZl9vcGFja2V0cyAqIDMwODsgLyogWFhYICovCiNlbmRpZgogICAgICAgIHJldHVybiAodV9jaGFyICopICYgbG9uZ19yZXR1cm47CiAgICBjYXNlIElGT1VUVUNBU1RQS1RTOgogICAgICAgIHsKI2lmIGRlZmluZWQoYWl4NCkgfHwgZGVmaW5lZChhaXg1KSB8fCBkZWZpbmVkKGFpeDYpCiAgICAgICAgICAgIGxvbmdfcmV0dXJuID0gKHVfbG9uZykgaWZuZXQuaWZfb3BhY2tldHMgJiAweGZmZmZmZmZmOwojZWxzZQogICAgICAgICAgICBsb25nX3JldHVybiA9ICh1X2xvbmcpIGlmbmV0LmlmX29wYWNrZXRzOwojZW5kaWYKI2lmIFNUUlVDVF9JRk5FVF9IQVNfSUZfT01DQVNUUwojaWYgZGVmaW5lZChhaXg0KSB8fCBkZWZpbmVkKGFpeDUpIHx8IGRlZmluZWQoYWl4NikKICAgICAgICAgICAgbG9uZ19yZXR1cm4gLT0gKHVfbG9uZykgaWZuZXQuaWZfb21jYXN0cyAmIDB4ZmZmZmZmZmY7CiNlbHNlCiAgICAgICAgICAgIGxvbmdfcmV0dXJuIC09ICh1X2xvbmcpIGlmbmV0LmlmX29tY2FzdHM7CiNlbmRpZgojZW5kaWYKICAgICAgICB9CiAgICAgICAgcmV0dXJuICh1X2NoYXIgKikgJiBsb25nX3JldHVybjsKICAgIGNhc2UgSUZPVVROVUNBU1RQS1RTOgojaWYgU1RSVUNUX0lGTkVUX0hBU19JRl9PTUNBU1RTCiNpZiBkZWZpbmVkKGFpeDQpIHx8IGRlZmluZWQoYWl4NSkgfHwgZGVmaW5lZChhaXg2KQogICAgICAgIGxvbmdfcmV0dXJuID0gKHVfbG9uZykgaWZuZXQuaWZfb21jYXN0cyAmIDB4ZmZmZmZmZmY7CiNlbHNlCiAgICAgICAgbG9uZ19yZXR1cm4gPSAodV9sb25nKSBpZm5ldC5pZl9vbWNhc3RzOwojZW5kaWYKI2Vsc2UKI2lmIE5FVFNOTVBfTk9fRFVNTVlfVkFMVUVTCiAgICAgICAgcmV0dXJuIE5VTEw7CiNlbmRpZgogICAgICAgIGxvbmdfcmV0dXJuID0gKHVfbG9uZykgMDsgICAgICAgLyogWFhYICovCiNlbmRpZgogICAgICAgIHJldHVybiAodV9jaGFyICopICYgbG9uZ19yZXR1cm47CiAgICBjYXNlIElGT1VURElTQ0FSRFM6CiNpZiBkZWZpbmVkKGFpeDQpIHx8IGRlZmluZWQoYWl4NSkgfHwgZGVmaW5lZChhaXg2KQogICAgICAgIGxvbmdfcmV0dXJuID0gaWZuZXQuaWZfc25kLmlmcV9kcm9wcyAmIDB4ZmZmZmZmZmY7CiNlbHNlCiAgICAgICAgbG9uZ19yZXR1cm4gPSBpZm5ldC5pZl9zbmQuaWZxX2Ryb3BzOwojZW5kaWYKICAgICAgICByZXR1cm4gKHVfY2hhciAqKSAmIGxvbmdfcmV0dXJuOwogICAgY2FzZSBJRk9VVEVSUk9SUzoKI2lmIGRlZmluZWQoYWl4NCkgfHwgZGVmaW5lZChhaXg1KSB8fCBkZWZpbmVkKGFpeDYpCiAgICAgICAgbG9uZ19yZXR1cm4gPSBpZm5ldC5pZl9vZXJyb3JzICYgMHhmZmZmZmZmZjsKI2Vsc2UKICAgICAgICBsb25nX3JldHVybiA9IGlmbmV0LmlmX29lcnJvcnM7CiNlbmRpZgogICAgICAgIHJldHVybiAodV9jaGFyICopICYgbG9uZ19yZXR1cm47CiAgICBjYXNlIElGT1VUUUxFTjoKI2lmIGRlZmluZWQoYWl4NCkgfHwgZGVmaW5lZChhaXg1KSB8fCBkZWZpbmVkKGFpeDYpCiAgICAgICAgbG9uZ19yZXR1cm4gPSBpZm5ldC5pZl9zbmQuaWZxX2xlbiAmIDB4ZmZmZmZmZmY7CiNlbHNlCiAgICAgICAgbG9uZ19yZXR1cm4gPSBpZm5ldC5pZl9zbmQuaWZxX2xlbjsKI2VuZGlmCiAgICAgICAgcmV0dXJuICh1X2NoYXIgKikgJiBsb25nX3JldHVybjsKICAgIGNhc2UgSUZTUEVDSUZJQzoKICAgICAgICAqdmFyX2xlbiA9IG51bGxPaWRMZW47CiAgICAgICAgcmV0dXJuICh1X2NoYXIgKikgbnVsbE9pZDsKICAgIGRlZmF1bHQ6CiAgICAgICAgREVCVUdNU0dUTCgoInNubXBkIiwgInVua25vd24gc3ViLWlkICVkIGluIHZhcl9pZkVudHJ5XG4iLAogICAgICAgICAgICAgICAgICAgIHZwLT5tYWdpYykpOwogICAgfQogICAgcmV0dXJuIE5VTEw7Cn0KCiNlbHNlICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogaHB1eCAqLwoKdV9jaGFyICAgICAgICAgKgp2YXJfaWZFbnRyeShzdHJ1Y3QgdmFyaWFibGUgKnZwLAogICAgICAgICAgICBvaWQgKiBuYW1lLAogICAgICAgICAgICBzaXplX3QgKiBsZW5ndGgsCiAgICAgICAgICAgIGludCBleGFjdCwgc2l6ZV90ICogdmFyX2xlbiwgV3JpdGVNZXRob2QgKiogd3JpdGVfbWV0aG9kKQp7CiNpZiBkZWZpbmVkKGhwdXgxMSkKICAgIHN0YXRpYyBubWFwaV9waHlzdGF0IGlmbmV0OwojZWxzZQogICAgc3RhdGljIHN0cnVjdCBpZm5ldCBpZm5ldDsKI2VuZGlmCiAgICByZWdpc3RlciBpbnQgICAgaW50ZXJmYWNlOwojaWYgIWRlZmluZWQoaHB1eDExKQogICAgc3RhdGljIHN0cnVjdCBpbl9pZmFkZHIgaW5faWZhZGRyVmFyOwojZW5kaWYKI2lmIGRlZmluZWQoaHB1eDExKQogICAgc3RhdGljIGNoYXIgICAgIE5hbWVbTUFYX1BIWVNBRERSX0xFTl07CiNlbHNlCiAgICBzdGF0aWMgY2hhciAgICAgTmFtZVsxNl07CiNlbmRpZgogICAgcmVnaXN0ZXIgY2hhciAgKmNwOwojaWYgU1RSVUNUX0lGTkVUX0hBU19JRl9MQVNUQ0hBTkdFX1RWX1NFQwogICAgc3RydWN0IHRpbWV2YWwgIG5vdzsKI2VuZGlmCiNpZiAhZGVmaW5lZChocHV4MTEpCiAgICBzdHJ1Y3Qgbm1wYXJtcyAgaHBfbm1wYXJtczsKICAgIHN0YXRpYyBtaWJfaWZFbnRyeSBocF9pZkVudHJ5OwogICAgaW50ICAgICAgICAgICAgIGhwX2ZkOwogICAgaW50ICAgICAgICAgICAgIGhwX2xlbiA9IHNpemVvZihocF9pZkVudHJ5KTsKI2VuZGlmCiAgICBjb25mX2lmX2xpc3QgICAqaWZfcHRyOwoKICAgIGludGVyZmFjZSA9CiAgICAgICAgaGVhZGVyX2lmRW50cnkodnAsIG5hbWUsIGxlbmd0aCwgZXhhY3QsIHZhcl9sZW4sIHdyaXRlX21ldGhvZCk7CiAgICBpZiAoaW50ZXJmYWNlID09IE1BVENIX0ZBSUxFRCkKICAgICAgICByZXR1cm4gTlVMTDsKCiNpZiBkZWZpbmVkKGhwdXgxMSkKICAgIEludGVyZmFjZV9TY2FuX0J5X0luZGV4KGludGVyZmFjZSwgTmFtZSwgJmlmbmV0KTsKI2Vsc2UKICAgIEludGVyZmFjZV9TY2FuX0J5X0luZGV4KGludGVyZmFjZSwgTmFtZSwgJmlmbmV0LCAmaW5faWZhZGRyVmFyKTsKI2VuZGlmCgojaWYgIWRlZmluZWQoaHB1eDExKQogICAgLyoKICAgICAqIEFkZGl0aW9uYWwgaW5mb3JtYXRpb24gYWJvdXQgdGhlIGludGVyZmFjZXMgaXMgYXZhaWxhYmxlIHVuZGVyCiAgICAgKiBIUC1VWCB0aHJvdWdoIHRoZSBuZXR3b3JrIG1hbmFnZW1lbnQgaW50ZXJmYWNlICcvZGV2L25ldG1hbicKICAgICAqLwogICAgaHBfaWZFbnRyeS5pZkluZGV4ID0gaW50ZXJmYWNlOwogICAgaHBfbm1wYXJtcy5vYmppZCA9IElEX2lmRW50cnk7CiAgICBocF9ubXBhcm1zLmJ1ZmZlciA9IChjaGFyICopICZocF9pZkVudHJ5OwogICAgaHBfbm1wYXJtcy5sZW4gPSAmaHBfbGVuOwogICAgaWYgKChocF9mZCA9IG9wZW4oIi9kZXYvbmV0bWFuIiwgT19SRE9OTFkpKSAhPSAtMSkgewogICAgICAgIGlmIChpb2N0bChocF9mZCwgTk1JT0dFVCwgJmhwX25tcGFybXMpICE9IC0xKSB7CiAgICAgICAgICAgIGNsb3NlKGhwX2ZkKTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgICBjbG9zZShocF9mZCk7CiAgICAgICAgICAgIGhwX2ZkID0gLTE7ICAgICAgICAgLyogZmFpbGVkICovCiAgICAgICAgfQogICAgfQojZW5kaWYKICAgIGlmX3B0ciA9IG5ldHNubXBfYWNjZXNzX2ludGVyZmFjZV9lbnRyeV9vdmVycmlkZXNfZ2V0KE5hbWUpOwoKICAgIHN3aXRjaCAodnAtPm1hZ2ljKSB7CiAgICBjYXNlIElGSU5ERVg6CiAgICAgICAgbG9uZ19yZXR1cm4gPSBpbnRlcmZhY2U7CiAgICAgICAgcmV0dXJuICh1X2NoYXIgKikgJiBsb25nX3JldHVybjsKICAgIGNhc2UgSUZERVNDUjoKI2lmIGRlZmluZWQoaHB1eDExKQogICAgICAgIGNwID0gaWZuZXQuaWZfZW50cnkuaWZEZXNjcjsKI2Vsc2UKICAgICAgICBpZiAoaHBfZmQgIT0gLTEpCiAgICAgICAgICAgIGNwID0gaHBfaWZFbnRyeS5pZkRlc2NyOwogICAgICAgIGVsc2UKICAgICAgICAgICAgY3AgPSBOYW1lOwojZW5kaWYKICAgICAgICAqdmFyX2xlbiA9IHN0cmxlbihjcCk7CiAgICAgICAgcmV0dXJuICh1X2NoYXIgKikgY3A7CiAgICBjYXNlIE5FVFNOTVBfSUZUWVBFOgogICAgICAgIGlmIChpZl9wdHIpCiAgICAgICAgICAgIGxvbmdfcmV0dXJuID0gaWZfcHRyLT50eXBlOwogICAgICAgIGVsc2UgewojaWYgZGVmaW5lZChocHV4MTEpCiAgICAgICAgbG9uZ19yZXR1cm4gPSBpZm5ldC5pZl9lbnRyeS5pZlR5cGU7CiNlbHNlCiAgICAgICAgaWYgKGhwX2ZkICE9IC0xKQogICAgICAgICAgICBsb25nX3JldHVybiA9IGhwX2lmRW50cnkuaWZUeXBlOwogICAgICAgIGVsc2UKICAgICAgICAgICAgbG9uZ19yZXR1cm4gPSAxOyAgICAvKiBPVEhFUiAqLwojZW5kaWYKICAgICAgICB9CiAgICAgICAgcmV0dXJuICh1X2NoYXIgKikgJiBsb25nX3JldHVybjsKICAgIGNhc2UgSUZNVFU6ewojaWYgZGVmaW5lZChocHV4MTEpCiAgICAgICAgICAgIGxvbmdfcmV0dXJuID0gKGxvbmcpIGlmbmV0LmlmX2VudHJ5LmlmTXR1OwojZWxzZQogICAgICAgICAgICBsb25nX3JldHVybiA9IChsb25nKSBpZm5ldC5pZl9tdHU7CiNlbmRpZgogICAgICAgICAgICByZXR1cm4gKHVfY2hhciAqKSAmIGxvbmdfcmV0dXJuOwogICAgICAgIH0KICAgIGNhc2UgSUZTUEVFRDoKICAgICAgICBpZiAoaWZfcHRyKQogICAgICAgICAgICBsb25nX3JldHVybiA9IGlmX3B0ci0+c3BlZWQ7CiAgICAgICAgZWxzZSB7CiNpZiBkZWZpbmVkKGhwdXgxMSkKICAgICAgICBsb25nX3JldHVybiA9IGlmbmV0LmlmX2VudHJ5LmlmU3BlZWQ7CiNlbHNlCiAgICAgICAgaWYgKGhwX2ZkICE9IC0xKQogICAgICAgICAgICBsb25nX3JldHVybiA9IGhwX2lmRW50cnkuaWZTcGVlZDsKICAgICAgICBlbHNlCiAgICAgICAgICAgIGxvbmdfcmV0dXJuID0gKHVfbG9uZykgMTsgICAvKiBPVEhFUiAqLwojZW5kaWYKICAgICAgICB9CiAgICAgICAgcmV0dXJuICh1X2NoYXIgKikgJiBsb25nX3JldHVybjsKICAgIGNhc2UgSUZQSFlTQUREUkVTUzoKI2lmIGRlZmluZWQoaHB1eDExKQogICAgICAgICp2YXJfbGVuID0gaWZuZXQuaWZfZW50cnkuaWZQaHlzQWRkcmVzcy5vX2xlbmd0aDsKICAgICAgICByZXR1cm4gKHVfY2hhciAqKSBpZm5ldC5pZl9lbnRyeS5pZlBoeXNBZGRyZXNzLm9fYnl0ZXM7CiNlbHNlCiAgICAgICAgSW50ZXJmYWNlX0dldF9FdGhlcl9CeV9JbmRleChpbnRlcmZhY2UsIHJldHVybl9idWYpOwogICAgICAgIGlmICgocmV0dXJuX2J1ZlswXSA9PSAwKSAmJiAocmV0dXJuX2J1ZlsxXSA9PSAwKSAmJgogICAgICAgICAgICAocmV0dXJuX2J1ZlsyXSA9PSAwKSAmJiAocmV0dXJuX2J1ZlszXSA9PSAwKSAmJgogICAgICAgICAgICAocmV0dXJuX2J1Zls0XSA9PSAwKSAmJiAocmV0dXJuX2J1Zls1XSA9PSAwKSkKICAgICAgICAgICAgKnZhcl9sZW4gPSAwOwogICAgICAgIGVsc2UKICAgICAgICAgICAgKnZhcl9sZW4gPSA2OwogICAgICAgIHJldHVybiAodV9jaGFyICopIHJldHVybl9idWY7CiNlbmRpZgogICAgY2FzZSBJRkFETUlOU1RBVFVTOgojaWYgZGVmaW5lZChocHV4MTEpCiAgICAgICAgbG9uZ19yZXR1cm4gPSBpZm5ldC5pZl9lbnRyeS5pZkFkbWluOwojZWxzZQogICAgICAgIGxvbmdfcmV0dXJuID0gaWZuZXQuaWZfZmxhZ3MgJiBJRkZfVVAgPyAxIDogMjsKI2VuZGlmCiAgICAgICAgcmV0dXJuICh1X2NoYXIgKikgJiBsb25nX3JldHVybjsKICAgIGNhc2UgSUZPUEVSU1RBVFVTOgojaWYgZGVmaW5lZChocHV4MTEpCiAgICAgICAgbG9uZ19yZXR1cm4gPSBpZm5ldC5pZl9lbnRyeS5pZk9wZXI7CiNlbHNlCiAgICAgICAgbG9uZ19yZXR1cm4gPSBpZm5ldC5pZl9mbGFncyAmIElGRl9SVU5OSU5HID8gMSA6IDI7CiNlbmRpZgogICAgICAgIHJldHVybiAodV9jaGFyICopICYgbG9uZ19yZXR1cm47CiAgICBjYXNlIElGTEFTVENIQU5HRToKI2lmIGRlZmluZWQoaHB1eDExKQogICAgICAgIGxvbmdfcmV0dXJuID0gaWZuZXQuaWZfZW50cnkuaWZMYXN0Q2hhbmdlOwojZWxzZQogICAgICAgIGlmIChocF9mZCAhPSAtMSkKICAgICAgICAgICAgbG9uZ19yZXR1cm4gPSBocF9pZkVudHJ5LmlmTGFzdENoYW5nZTsKICAgICAgICBlbHNlCiAgICAgICAgICAgIGxvbmdfcmV0dXJuID0gMDsgICAgLyogWFhYICovCiNlbmRpZgogICAgICAgIHJldHVybiAodV9jaGFyICopICYgbG9uZ19yZXR1cm47CiAgICBjYXNlIElGSU5PQ1RFVFM6CiNpZiBkZWZpbmVkKGhwdXgxMSkKICAgICAgICBsb25nX3JldHVybiA9IGlmbmV0LmlmX2VudHJ5LmlmSW5PY3RldHM7CiNlbHNlCiAgICAgICAgaWYgKGhwX2ZkICE9IC0xKQogICAgICAgICAgICBsb25nX3JldHVybiA9IGhwX2lmRW50cnkuaWZJbk9jdGV0czsKICAgICAgICBlbHNlCiAgICAgICAgICAgIGxvbmdfcmV0dXJuID0gKHVfbG9uZykgaWZuZXQuaWZfaXBhY2tldHMgKiAzMDg7ICAgICAvKiBYWFggKi8KI2VuZGlmCiAgICAgICAgcmV0dXJuICh1X2NoYXIgKikgJiBsb25nX3JldHVybjsKICAgIGNhc2UgSUZJTlVDQVNUUEtUUzoKI2lmIGRlZmluZWQoaHB1eDExKQogICAgICAgIGxvbmdfcmV0dXJuID0gaWZuZXQuaWZfZW50cnkuaWZJblVjYXN0UGt0czsKI2Vsc2UKICAgICAgICBpZiAoaHBfZmQgIT0gLTEpCiAgICAgICAgICAgIGxvbmdfcmV0dXJuID0gaHBfaWZFbnRyeS5pZkluVWNhc3RQa3RzOwogICAgICAgIGVsc2UKICAgICAgICAgICAgbG9uZ19yZXR1cm4gPSAodV9sb25nKSBpZm5ldC5pZl9pcGFja2V0czsKI2VuZGlmCiAgICAgICAgcmV0dXJuICh1X2NoYXIgKikgJiBsb25nX3JldHVybjsKICAgIGNhc2UgSUZJTk5VQ0FTVFBLVFM6CiNpZiBkZWZpbmVkKGhwdXgxMSkKICAgICAgICBsb25nX3JldHVybiA9IGlmbmV0LmlmX2VudHJ5LmlmSW5OVWNhc3RQa3RzOwojZWxzZQogICAgICAgIGlmIChocF9mZCAhPSAtMSkKICAgICAgICAgICAgbG9uZ19yZXR1cm4gPSBocF9pZkVudHJ5LmlmSW5OVWNhc3RQa3RzOwogICAgICAgIGVsc2UKICAgICAgICAgICAgbG9uZ19yZXR1cm4gPSAodV9sb25nKSAwOyAgIC8qIFhYWCAqLwojZW5kaWYKICAgICAgICByZXR1cm4gKHVfY2hhciAqKSAmIGxvbmdfcmV0dXJuOwogICAgY2FzZSBJRklORElTQ0FSRFM6CiNpZiBkZWZpbmVkKGhwdXgxMSkKICAgICAgICBsb25nX3JldHVybiA9IGlmbmV0LmlmX2VudHJ5LmlmSW5EaXNjYXJkczsKI2Vsc2UKICAgICAgICBpZiAoaHBfZmQgIT0gLTEpCiAgICAgICAgICAgIGxvbmdfcmV0dXJuID0gaHBfaWZFbnRyeS5pZkluRGlzY2FyZHM7CiAgICAgICAgZWxzZQogICAgICAgICAgICBsb25nX3JldHVybiA9ICh1X2xvbmcpIDA7ICAgLyogWFhYICovCiNlbmRpZgogICAgICAgIHJldHVybiAodV9jaGFyICopICYgbG9uZ19yZXR1cm47CiAgICBjYXNlIElGSU5FUlJPUlM6CiNpZiBkZWZpbmVkKGhwdXgxMSkKICAgICAgICBsb25nX3JldHVybiA9IGlmbmV0LmlmX2VudHJ5LmlmSW5FcnJvcnM7CiNlbHNlCiAgICAgICAgbG9uZ19yZXR1cm4gPSBpZm5ldC5pZl9pZXJyb3JzOwojZW5kaWYKICAgICAgICByZXR1cm4gKHVfY2hhciAqKSAmIGxvbmdfcmV0dXJuOwogICAgY2FzZSBJRklOVU5LTk9XTlBST1RPUzoKI2lmIGRlZmluZWQoaHB1eDExKQogICAgICAgIGxvbmdfcmV0dXJuID0gaWZuZXQuaWZfZW50cnkuaWZJblVua25vd25Qcm90b3M7CiNlbHNlCiAgICAgICAgaWYgKGhwX2ZkICE9IC0xKQogICAgICAgICAgICBsb25nX3JldHVybiA9IGhwX2lmRW50cnkuaWZJblVua25vd25Qcm90b3M7CiAgICAgICAgZWxzZQogICAgICAgICAgICBsb25nX3JldHVybiA9ICh1X2xvbmcpIDA7ICAgLyogWFhYICovCiNlbmRpZgogICAgICAgIHJldHVybiAodV9jaGFyICopICYgbG9uZ19yZXR1cm47CiAgICBjYXNlIElGT1VUT0NURVRTOgojaWYgZGVmaW5lZChocHV4MTEpCiAgICAgICAgbG9uZ19yZXR1cm4gPSBpZm5ldC5pZl9lbnRyeS5pZk91dE9jdGV0czsKI2Vsc2UKICAgICAgICBpZiAoaHBfZmQgIT0gLTEpCiAgICAgICAgICAgIGxvbmdfcmV0dXJuID0gaHBfaWZFbnRyeS5pZk91dE9jdGV0czsKICAgICAgICBlbHNlCiAgICAgICAgICAgIGxvbmdfcmV0dXJuID0gKHVfbG9uZykgaWZuZXQuaWZfb3BhY2tldHMgKiAzMDg7ICAgICAvKiBYWFggKi8KI2VuZGlmCiAgICAgICAgcmV0dXJuICh1X2NoYXIgKikgJiBsb25nX3JldHVybjsKICAgIGNhc2UgSUZPVVRVQ0FTVFBLVFM6CiNpZiBkZWZpbmVkKGhwdXgxMSkKICAgICAgICBsb25nX3JldHVybiA9IGlmbmV0LmlmX2VudHJ5LmlmT3V0VWNhc3RQa3RzOwojZWxzZQogICAgICAgIGlmIChocF9mZCAhPSAtMSkKICAgICAgICAgICAgbG9uZ19yZXR1cm4gPSBocF9pZkVudHJ5LmlmT3V0VWNhc3RQa3RzOwogICAgICAgIGVsc2UKICAgICAgICAgICAgbG9uZ19yZXR1cm4gPSAodV9sb25nKSBpZm5ldC5pZl9vcGFja2V0czsKI2VuZGlmCiAgICAgICAgcmV0dXJuICh1X2NoYXIgKikgJiBsb25nX3JldHVybjsKICAgIGNhc2UgSUZPVVROVUNBU1RQS1RTOgojaWYgZGVmaW5lZChocHV4MTEpCiAgICAgICAgbG9uZ19yZXR1cm4gPSBpZm5ldC5pZl9lbnRyeS5pZk91dE5VY2FzdFBrdHM7CiNlbHNlCiAgICAgICAgaWYgKGhwX2ZkICE9IC0xKQogICAgICAgICAgICBsb25nX3JldHVybiA9IGhwX2lmRW50cnkuaWZPdXROVWNhc3RQa3RzOwogICAgICAgIGVsc2UKICAgICAgICAgICAgbG9uZ19yZXR1cm4gPSAodV9sb25nKSAwOyAgIC8qIFhYWCAqLwojZW5kaWYKICAgICAgICByZXR1cm4gKHVfY2hhciAqKSAmIGxvbmdfcmV0dXJuOwogICAgY2FzZSBJRk9VVERJU0NBUkRTOgojaWYgZGVmaW5lZChocHV4MTEpCiAgICAgICAgbG9uZ19yZXR1cm4gPSBpZm5ldC5pZl9lbnRyeS5pZk91dERpc2NhcmRzOwojZWxzZQogICAgICAgIGxvbmdfcmV0dXJuID0gaWZuZXQuaWZfc25kLmlmcV9kcm9wczsKI2VuZGlmCiAgICAgICAgcmV0dXJuICh1X2NoYXIgKikgJiBsb25nX3JldHVybjsKICAgIGNhc2UgSUZPVVRFUlJPUlM6CiNpZiBkZWZpbmVkKGhwdXgxMSkKICAgICAgICBsb25nX3JldHVybiA9IGlmbmV0LmlmX2VudHJ5LmlmT3V0RXJyb3JzOwojZWxzZQogICAgICAgIGxvbmdfcmV0dXJuID0gaWZuZXQuaWZfb2Vycm9yczsKI2VuZGlmCiAgICAgICAgcmV0dXJuICh1X2NoYXIgKikgJiBsb25nX3JldHVybjsKICAgIGNhc2UgSUZPVVRRTEVOOgojaWYgZGVmaW5lZChocHV4MTEpCiAgICAgICAgbG9uZ19yZXR1cm4gPSBpZm5ldC5pZl9lbnRyeS5pZk91dFFsZW47CiNlbHNlCiAgICAgICAgbG9uZ19yZXR1cm4gPSBpZm5ldC5pZl9zbmQuaWZxX2xlbjsKI2VuZGlmCiAgICAgICAgcmV0dXJuICh1X2NoYXIgKikgJiBsb25nX3JldHVybjsKICAgIGNhc2UgSUZTUEVDSUZJQzoKICAgICAgICAqdmFyX2xlbiA9IG51bGxPaWRMZW47CiAgICAgICAgcmV0dXJuICh1X2NoYXIgKikgbnVsbE9pZDsKICAgIGRlZmF1bHQ6CiAgICAgICAgREVCVUdNU0dUTCgoInNubXBkIiwgInVua25vd24gc3ViLWlkICVkIGluIHZhcl9pZkVudHJ5XG4iLAogICAgICAgICAgICAgICAgICAgIHZwLT5tYWdpYykpOwogICAgfQogICAgcmV0dXJuIE5VTEw7Cn0KCiNlbmRpZiAgICAgICAgICAgICAgICAgICAgICAgICAgLyogaHB1eCAqLwojZWxzZSAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHNvbGFyaXMyICovCgpzdGF0aWMgaW50CklGX2NtcCh2b2lkICphZGRyLCB2b2lkICplcCkKewogICAgREVCVUdNU0dUTCgoIm1pYklJL2ludGVyZmFjZXMiLCAiLi4uIElGX2NtcCAlZCAlZFxuIiwKICAgICAgICAgICAgICAgICgobWliMl9pZkVudHJ5X3QgKikgZXApLT5pZkluZGV4LAogICAgICAgICAgICAgICAgKChtaWIyX2lmRW50cnlfdCAqKSBhZGRyKS0+aWZJbmRleCkpOwogICAgaWYgKCgobWliMl9pZkVudHJ5X3QgKikgZXApLT5pZkluZGV4ID09CiAgICAgICAgKChtaWIyX2lmRW50cnlfdCAqKSBhZGRyKS0+aWZJbmRleCkKICAgICAgICByZXR1cm4gKDApOwogICAgZWxzZQogICAgICAgIHJldHVybiAoMSk7Cn0KCnVfY2hhciAgICAgICAgICoKdmFyX2lmRW50cnkoc3RydWN0IHZhcmlhYmxlICogdnAsCiAgICAgICAgICAgIG9pZCAqIG5hbWUsCiAgICAgICAgICAgIHNpemVfdCAqIGxlbmd0aCwKICAgICAgICAgICAgaW50IGV4YWN0LCBzaXplX3QgKiB2YXJfbGVuLCBXcml0ZU1ldGhvZCAqKiB3cml0ZV9tZXRob2QpCnsKICAgIGludCAgICAgICAgICAgICBpbnRlcmZhY2U7CiAgICBtaWIyX2lmRW50cnlfdCAgaWZzdGF0OwogICAgY29uZl9pZl9saXN0ICAgKmlmX3B0ciA9IE5VTEw7CgogICAgaW50ZXJmYWNlID0KICAgICAgICBoZWFkZXJfaWZFbnRyeSh2cCwgbmFtZSwgbGVuZ3RoLCBleGFjdCwgdmFyX2xlbiwgd3JpdGVfbWV0aG9kKTsKICAgIGlmIChpbnRlcmZhY2UgPT0gTUFUQ0hfRkFJTEVEKQogICAgICAgIHJldHVybiBOVUxMOwoKICAgIGlmIChnZXRNaWJzdGF0KE1JQl9JTlRFUkZBQ0VTLCAmaWZzdGF0LCBzaXplb2YobWliMl9pZkVudHJ5X3QpLAogICAgICAgICAgICAgICAgICAgR0VUX0VYQUNULCAmSUZfY21wLCAmaW50ZXJmYWNlKSAhPSAwKSB7CiAgICAgICAgREVCVUdNU0dUTCgoIm1pYklJL2ludGVyZmFjZXMiLCAiLi4uIG5vIG1pYiBzdGF0c1xuIikpOwogICAgICAgIHJldHVybiBOVUxMOwogICAgfQogICAgLyoKICAgICAqIGhtbW0uLiB3aGVyZSB0byBnZXQgdGhlIGludGVyZmFjZSBuYW1lIHRvIGNoZWNrIG92ZXJyaWRlcz8KICAgICAqCiAgICAgKiBpZl9wdHIgPSBuZXRzbm1wX2FjY2Vzc19pbnRlcmZhY2VfZW50cnlfb3ZlcnJpZGVzX2dldChOYW1lKTsKICAgICAqLwogICAgc3dpdGNoICh2cC0+bWFnaWMpIHsKICAgIGNhc2UgSUZJTkRFWDoKICAgICAgICBsb25nX3JldHVybiA9IGlmc3RhdC5pZkluZGV4OwogICAgICAgIHJldHVybiAodV9jaGFyICopICYgbG9uZ19yZXR1cm47CiAgICBjYXNlIElGREVTQ1I6CiAgICAgICAgKnZhcl9sZW4gPSBpZnN0YXQuaWZEZXNjci5vX2xlbmd0aDsKICAgICAgICAodm9pZCkgbWVtY3B5KHJldHVybl9idWYsIGlmc3RhdC5pZkRlc2NyLm9fYnl0ZXMsICp2YXJfbGVuKTsKICAgICAgICByZXR1cm4gKHVfY2hhciAqKSByZXR1cm5fYnVmOwogICAgY2FzZSBORVRTTk1QX0lGVFlQRToKICAgICAgICBpZiAoaWZfcHRyKQogICAgICAgICAgICBsb25nX3JldHVybiA9IGlmX3B0ci0+dHlwZTsKICAgICAgICBlbHNlCiAgICAgICAgbG9uZ19yZXR1cm4gPSAodV9sb25nKSBpZnN0YXQuaWZUeXBlOwogICAgICAgIHJldHVybiAodV9jaGFyICopICYgbG9uZ19yZXR1cm47CiAgICBjYXNlIElGTVRVOgogICAgICAgIGxvbmdfcmV0dXJuID0gKHVfbG9uZykgaWZzdGF0LmlmTXR1OwogICAgICAgIHJldHVybiAodV9jaGFyICopICYgbG9uZ19yZXR1cm47CiAgICBjYXNlIElGU1BFRUQ6CiAgICAgICAgaWYgKGlmX3B0cikKICAgICAgICAgICAgbG9uZ19yZXR1cm4gPSBpZl9wdHItPnNwZWVkOwogICAgICAgIGVsc2UKICAgICAgICBsb25nX3JldHVybiA9ICh1X2xvbmcpIGlmc3RhdC5pZlNwZWVkOwogICAgICAgIHJldHVybiAodV9jaGFyICopICYgbG9uZ19yZXR1cm47CiAgICBjYXNlIElGUEhZU0FERFJFU1M6CiAgICAgICAgKnZhcl9sZW4gPSBpZnN0YXQuaWZQaHlzQWRkcmVzcy5vX2xlbmd0aDsKICAgICAgICAodm9pZCkgbWVtY3B5KHJldHVybl9idWYsIGlmc3RhdC5pZlBoeXNBZGRyZXNzLm9fYnl0ZXMsICp2YXJfbGVuKTsKICAgICAgICByZXR1cm4gKHVfY2hhciAqKSByZXR1cm5fYnVmOwogICAgY2FzZSBJRkFETUlOU1RBVFVTOgogICAgICAgIGxvbmdfcmV0dXJuID0gKHVfbG9uZykgaWZzdGF0LmlmQWRtaW5TdGF0dXM7CiAgICAgICAgcmV0dXJuICh1X2NoYXIgKikgJiBsb25nX3JldHVybjsKICAgIGNhc2UgSUZPUEVSU1RBVFVTOgogICAgICAgIGxvbmdfcmV0dXJuID0gKHVfbG9uZykgaWZzdGF0LmlmT3BlclN0YXR1czsKICAgICAgICByZXR1cm4gKHVfY2hhciAqKSAmIGxvbmdfcmV0dXJuOwogICAgY2FzZSBJRkxBU1RDSEFOR0U6CiAgICAgICAgbG9uZ19yZXR1cm4gPSAodV9sb25nKSBpZnN0YXQuaWZMYXN0Q2hhbmdlOwogICAgICAgIHJldHVybiAodV9jaGFyICopICYgbG9uZ19yZXR1cm47CiAgICBjYXNlIElGSU5PQ1RFVFM6CiAgICAgICAgbG9uZ19yZXR1cm4gPSAodV9sb25nKSBpZnN0YXQuaWZJbk9jdGV0czsKICAgICAgICByZXR1cm4gKHVfY2hhciAqKSAmIGxvbmdfcmV0dXJuOwogICAgY2FzZSBJRklOVUNBU1RQS1RTOgogICAgICAgIGxvbmdfcmV0dXJuID0gKHVfbG9uZykgaWZzdGF0LmlmSW5VY2FzdFBrdHM7CiAgICAgICAgcmV0dXJuICh1X2NoYXIgKikgJiBsb25nX3JldHVybjsKICAgIGNhc2UgSUZJTk5VQ0FTVFBLVFM6CiAgICAgICAgbG9uZ19yZXR1cm4gPSAodV9sb25nKSBpZnN0YXQuaWZJbk5VY2FzdFBrdHM7CiAgICAgICAgcmV0dXJuICh1X2NoYXIgKikgJiBsb25nX3JldHVybjsKICAgIGNhc2UgSUZJTkRJU0NBUkRTOgogICAgICAgIGxvbmdfcmV0dXJuID0gKHVfbG9uZykgaWZzdGF0LmlmSW5EaXNjYXJkczsKICAgICAgICByZXR1cm4gKHVfY2hhciAqKSAmIGxvbmdfcmV0dXJuOwogICAgY2FzZSBJRklORVJST1JTOgogICAgICAgIGxvbmdfcmV0dXJuID0gKHVfbG9uZykgaWZzdGF0LmlmSW5FcnJvcnM7CiAgICAgICAgcmV0dXJuICh1X2NoYXIgKikgJiBsb25nX3JldHVybjsKICAgIGNhc2UgSUZJTlVOS05PV05QUk9UT1M6CiAgICAgICAgbG9uZ19yZXR1cm4gPSAodV9sb25nKSBpZnN0YXQuaWZJblVua25vd25Qcm90b3M7CiAgICAgICAgcmV0dXJuICh1X2NoYXIgKikgJiBsb25nX3JldHVybjsKICAgIGNhc2UgSUZPVVRPQ1RFVFM6CiAgICAgICAgbG9uZ19yZXR1cm4gPSAodV9sb25nKSBpZnN0YXQuaWZPdXRPY3RldHM7CiAgICAgICAgcmV0dXJuICh1X2NoYXIgKikgJiBsb25nX3JldHVybjsKICAgIGNhc2UgSUZPVVRVQ0FTVFBLVFM6CiAgICAgICAgbG9uZ19yZXR1cm4gPSAodV9sb25nKSBpZnN0YXQuaWZPdXRVY2FzdFBrdHM7CiAgICAgICAgcmV0dXJuICh1X2NoYXIgKikgJiBsb25nX3JldHVybjsKICAgIGNhc2UgSUZPVVROVUNBU1RQS1RTOgogICAgICAgIGxvbmdfcmV0dXJuID0gKHVfbG9uZykgaWZzdGF0LmlmT3V0TlVjYXN0UGt0czsKICAgICAgICByZXR1cm4gKHVfY2hhciAqKSAmIGxvbmdfcmV0dXJuOwogICAgY2FzZSBJRk9VVERJU0NBUkRTOgogICAgICAgIGxvbmdfcmV0dXJuID0gKHVfbG9uZykgaWZzdGF0LmlmT3V0RGlzY2FyZHM7CiAgICAgICAgcmV0dXJuICh1X2NoYXIgKikgJiBsb25nX3JldHVybjsKICAgIGNhc2UgSUZPVVRFUlJPUlM6CiAgICAgICAgbG9uZ19yZXR1cm4gPSAodV9sb25nKSBpZnN0YXQuaWZPdXRFcnJvcnM7CiAgICAgICAgcmV0dXJuICh1X2NoYXIgKikgJiBsb25nX3JldHVybjsKICAgIGNhc2UgSUZPVVRRTEVOOgogICAgICAgIGxvbmdfcmV0dXJuID0gKHVfbG9uZykgaWZzdGF0LmlmT3V0UUxlbjsKICAgICAgICByZXR1cm4gKHVfY2hhciAqKSAmIGxvbmdfcmV0dXJuOwogICAgY2FzZSBJRlNQRUNJRklDOgoJbG9uZ19yZXR1cm4gPSAodV9sb25nKSBpZnN0YXQuaWZTcGVjaWZpYzsKCXJldHVybiAodV9jaGFyICopICYgbG9uZ19yZXR1cm47CiAgICBkZWZhdWx0OgogICAgICAgIERFQlVHTVNHVEwoKCJzbm1wZCIsICJ1bmtub3duIHN1Yi1pZCAlZCBpbiB2YXJfaWZFbnRyeVxuIiwKICAgICAgICAgICAgICAgICAgICB2cC0+bWFnaWMpKTsKICAgIH0KICAgIHJldHVybiBOVUxMOwp9CgojZW5kaWYgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHNvbGFyaXMyICovCgoKCiAgICAgICAgLyoqKioqKioqKioqKioqKioqKioqKgoJICoKCSAqICBJbnRlcm5hbCBpbXBsZW1lbnRhdGlvbiBmdW5jdGlvbnMKCSAqCgkgKioqKioqKioqKioqKioqKioqKioqLwoKCiNpZm5kZWYgc29sYXJpczIKCiNpZiAhZGVmaW5lZChzdW5WMykgJiYgIWRlZmluZWQobGludXgpICYmICFkZWZpbmVkKGhwdXgxMSkKc3RhdGljIHN0cnVjdCBpbl9pZmFkZHIgc2F2ZWluX2lmYWRkcjsKI2VuZGlmCiNpZiAhZGVmaW5lZChocHV4MTEpCnN0YXRpYyBzdHJ1Y3QgaWZuZXQgKmlmbmV0YWRkciwgc2F2ZWlmbmV0LCAqc2F2ZWlmbmV0YWRkcjsKc3RhdGljIGNoYXIgICAgIHNhdmVOYW1lWzE2XTsKI2VuZGlmCnN0YXRpYyBpbnQgICAgICBzYXZlSW5kZXggPSAwOwoKLyoqCiogRGV0ZXJtaW5lcyBuZXR3b3JrIGludGVyZmFjZSBzcGVlZC4gSXQgaXMgc3lzdGVtIHNwZWNpZmljLiBPbmx5IGxpbnV4CiogcmVhbGl6YXRpb24gaXMgbWFkZS4gCiovCnVuc2lnbmVkIGludCBnZXRJZlNwZWVkKGludCBmZCwgc3RydWN0IGlmcmVxIGlmciwgdW5zaWduZWQgaW50IGRlZmF1bHRzcGVlZCkKewojaWZkZWYgbGludXgKICAgIC8qKiB0ZW1wb3JhcnkgZXhwb3NlIGludGVybmFsIHVudGlsIHRoaXMgbW9kdWxlIGNhbiBiZSByZS13cml0dGVuICovCiAgICBleHRlcm4gdW5zaWduZWQgaW50CiAgICAgICAgbmV0c25tcF9saW51eF9pbnRlcmZhY2VfZ2V0X2lmX3NwZWVkKGludCBmZCwgY29uc3QgY2hhciAqbmFtZSwKICAgICAgICAgICAgICAgIHVuc2lnbmVkIGxvbmcgbG9uZyBkZWZhdWx0c3BlZWQpOwoKICAgIHJldHVybiBuZXRzbm1wX2xpbnV4X2ludGVyZmFjZV9nZXRfaWZfc3BlZWQoZmQsIGlmci5pZnJfbmFtZSwgZGVmYXVsdHNwZWVkKTsKI2Vsc2UgLyohbGludXgqLwkJCSAgIAogICAgcmV0dXJuIGRlZmF1bHRzcGVlZDsKI2VuZGlmIAp9Cgp2b2lkCkludGVyZmFjZV9TY2FuX0luaXQodm9pZCkKewojaWZkZWYgbGludXgKICAgIGNoYXIgICAgICAgICAgICBsaW5lWzI1Nl0sIGlmbmFtZV9idWZbNjRdLCAqaWZuYW1lLCAqcHRyOwogICAgc3RydWN0IGlmcmVxICAgIGlmcnE7CiAgICBzdHJ1Y3QgaWZuZXQgICoqaWZuZXRhZGRyX3B0cjsKICAgIEZJTEUgICAgICAgICAgICpkZXZpbjsKICAgIGludCAgICAgICAgICAgICBpLCBmZDsKICAgIGNvbmZfaWZfbGlzdCAgICppZl9wdHI7CiAgICAvKgogICAgICogc2NhbmxpbmVfMl8yOgogICAgICogIFsgICAgICAgICAgICAgICBJTiAgICAgICAgICAgICAgICAgICAgICAgIF0KICAgICAqICAgYnl0ZSBwa3RzIGVycnMgZHJvcCBmaWZvIGZyYW1lIGNtcHJzIG1jc3QgfAogICAgICogIFsgICAgICAgICAgICAgICBPVVQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXQogICAgICogICBieXRlIHBrdHMgZXJycyBkcm9wIGZpZm8gY29sbHMgY2FycmllciBjb21wcmVzc2VkCiAgICAgKi8KI2lmZGVmIFNDTnVNQVgKICAgIHVpbnRtYXhfdCAgICAgICByZWNfcGt0LCByZWNfb2N0LCByZWNfZXJyLCByZWNfZHJvcDsKICAgIHVpbnRtYXhfdCAgICAgICBzbmRfcGt0LCBzbmRfb2N0LCBzbmRfZXJyLCBzbmRfZHJvcCwgY29sbDsKICAgIGNvbnN0IGNoYXIgICAgICpzY2FuX2xpbmVfMl8yID0KICAgICAgICAiJSIgICBTQ051TUFYICIgJSIgIFNDTnVNQVggIiAlIiAgU0NOdU1BWCAiICUiICBTQ051TUFYCiAgICAgICAgIiAlKiIgU0NOdU1BWCAiICUqIiBTQ051TUFYICIgJSoiIFNDTnVNQVggIiAlKiIgU0NOdU1BWAogICAgICAgICIgJSIgIFNDTnVNQVggIiAlIiAgU0NOdU1BWCAiICUiICBTQ051TUFYICIgJSIgIFNDTnVNQVgKICAgICAgICAiICUqIiBTQ051TUFYICIgJSIgIFNDTnVNQVg7CiAgICBjb25zdCBjaGFyICAgICAqc2Nhbl9saW5lXzJfMCA9CiAgICAgICAgIiUiICAgU0NOdU1BWCAiICUiICBTQ051TUFYICIgJSoiIFNDTnVNQVggIiAlKiIgU0NOdU1BWAogICAgICAgICIgJSoiIFNDTnVNQVggIiAlIiAgU0NOdU1BWCAiICUiICBTQ051TUFYICIgJSoiIFNDTnVNQVgKICAgICAgICAiICUqIiBTQ051TUFYICIgJSIgIFNDTnVNQVg7CiNlbHNlCiAgICB1bnNpZ25lZCBsb25nICAgcmVjX3BrdCwgcmVjX29jdCwgcmVjX2VyciwgcmVjX2Ryb3A7CiAgICB1bnNpZ25lZCBsb25nICAgc25kX3BrdCwgc25kX29jdCwgc25kX2Vyciwgc25kX2Ryb3AsIGNvbGw7CiAgICBjb25zdCBjaGFyICAgICAqc2Nhbl9saW5lXzJfMiA9CiAgICAgICAgIiVsdSAlbHUgJWx1ICVsdSAlKmx1ICUqbHUgJSpsdSAlKmx1ICVsdSAlbHUgJWx1ICVsdSAlKmx1ICVsdSI7CiAgICBjb25zdCBjaGFyICAgICAqc2Nhbl9saW5lXzJfMCA9CiAgICAgICAgIiVsdSAlbHUgJSpsdSAlKmx1ICUqbHUgJWx1ICVsdSAlKmx1ICUqbHUgJWx1IjsKI2VuZGlmCiAgICBjb25zdCBjaGFyICAgICAqc2Nhbl9saW5lX3RvX3VzZTsKICAgIHN0cnVjdCB0aW1ldmFsIGV0OyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGVsYXBzZWQgdGltZSAqLwoKI2VuZGlmCgojaWYgIWRlZmluZWQoaHB1eDExKSAmJiBkZWZpbmVkKElGTkVUX1NZTUJPTCkKICAgIGF1dG9fbmxpc3QoSUZORVRfU1lNQk9MLCAoY2hhciAqKSAmaWZuZXRhZGRyLCBzaXplb2YoaWZuZXRhZGRyKSk7CiNlbmRpZgogICAgc2F2ZUluZGV4ID0gMDsKCgojaWZkZWYgbGludXgKICAgIC8qICBkaXNhbGxvdyByZWxvYWRpbmcgb2Ygc3RydWN0dXJlcyB0b28gb2Z0ZW4gKi8KICAgIGdldHRpbWVvZmRheSAoICZldCwgKCBzdHJ1Y3QgdGltZXpvbmUgKiApIDAgKTsgIC8qICBnZXQgdGltZS1vZi1kYXkgKi8KICAgIGlmICggZXQudHZfc2VjIDwgTGFzdExvYWQgKyBNSU5MT0FERlJFUSApIHsgICAgIC8qICBvbmx5IHJlbG9hZCBzbyBvZnRlbiAqLwogICAgICBpZm5ldGFkZHIgPSBpZm5ldGFkZHJfbGlzdDsgICAgICAgICAgICAgICAgICAgLyogIGluaXRpYWxpemUgcG9pbnRlciAqLwogICAgICByZXR1cm47CiAgICB9CiAgICBMYXN0TG9hZCA9IGV0LnR2X3NlYzsKCiAgICAvKgogICAgICogZnJlZSBvbGQgbGlzdDogCiAgICAgKi8KICAgIHdoaWxlIChpZm5ldGFkZHJfbGlzdCkgewogICAgICAgIHN0cnVjdCBpZm5ldCAgICpvbGQgPSBpZm5ldGFkZHJfbGlzdDsKICAgICAgICBpZm5ldGFkZHJfbGlzdCA9IGlmbmV0YWRkcl9saXN0LT5pZl9uZXh0OwogICAgICAgIGZyZWUob2xkLT5pZl9uYW1lKTsKICAgICAgICBmcmVlKG9sZC0+aWZfdW5pdCk7CiAgICAgICAgZnJlZShvbGQpOwogICAgfQoKICAgIGlmbmV0YWRkciA9IDA7CiAgICBpZm5ldGFkZHJfcHRyID0gJmlmbmV0YWRkcl9saXN0OwoKICAgIGlmICgoZmQgPSBzb2NrZXQoQUZfSU5FVCwgU09DS19ER1JBTSwgMCkpIDwgMCkgewogICAgICAgIERFQlVHTVNHVEwoKCJzbm1wZCIsCiAgICAgICAgICAgICAgICAgICAgInNvY2tldCBvcGVuIGZhaWx1cmUgaW4gSW50ZXJmYWNlX1NjYW5fSW5pdFxuIikpOwogICAgICAgIHJldHVybjsgLyoqIGV4aXQgKDEpOyAqKi8KICAgIH0KCiAgICAvKgogICAgICogYnVpbGQgdXAgaWZuZXRhZGRyIGxpc3QgYnkgaGFuZDogCiAgICAgKi8KCiAgICAvKgogICAgICogYXQgbGVhc3QgbGludXggdjEuMy41MyBzYXlzIEVNRklMRSB3aXRob3V0IHJlYXNvbi4uLiAKICAgICAqLwogICAgaWYgKCEoZGV2aW4gPSBmb3BlbigiL3Byb2MvbmV0L2RldiIsICJyIikpKSB7CiAgICAgICAgY2xvc2UoZmQpOwogICAgICAgIHNubXBfbG9nKExPR19FUlIsICJjYW5ub3Qgb3BlbiAvcHJvYy9uZXQvZGV2IC0gY29udGludWluZy4uLlxuIik7CiAgICAgICAgcmV0dXJuOyAvKiogZXhpdCAoMSk7ICoqLwogICAgfQoKICAgIGkgPSAwOwoKICAgIC8qCiAgICAgKiByZWFkIHRoZSBzZWNvbmQgbGluZSAoYSBoZWFkZXIpIGFuZCBkZXRlcm1pbmUgdGhlIGZpZWxkcyB3ZQogICAgICogc2hvdWxkIHJlYWQgZnJvbS4gIFRoaXMgc2hvdWxkIGJlIGRvbmUgaW4gYSBiZXR0ZXIgd2F5IGJ5CiAgICAgKiBhY3R1YWxseSBsb29raW5nIGZvciB0aGUgZmllbGQgbmFtZXMgd2Ugd2FudC4gIEJ1dCB0aGF0cyB0b28KICAgICAqIG11Y2ggd29yayBmb3IgdG9kYXkuICAtLSBXZXMgCiAgICAgKi8KICAgIGZnZXRzKGxpbmUsIHNpemVvZihsaW5lKSwgZGV2aW4pOwogICAgZmdldHMobGluZSwgc2l6ZW9mKGxpbmUpLCBkZXZpbik7CiAgICBpZiAoc3Ryc3RyKGxpbmUsICJjb21wcmVzc2VkIikpIHsKICAgICAgICBzY2FuX2xpbmVfdG9fdXNlID0gc2Nhbl9saW5lXzJfMjsKICAgICAgICBERUJVR01TR1RMKCgibWliSUkvaW50ZXJmYWNlcyIsCiAgICAgICAgICAgICAgICAgICAgInVzaW5nIGxpbnV4IDIuMiBrZXJuZWwgL3Byb2MvbmV0L2RldlxuIikpOwogICAgfSBlbHNlIHsKICAgICAgICBzY2FuX2xpbmVfdG9fdXNlID0gc2Nhbl9saW5lXzJfMDsKICAgICAgICBERUJVR01TR1RMKCgibWliSUkvaW50ZXJmYWNlcyIsCiAgICAgICAgICAgICAgICAgICAgInVzaW5nIGxpbnV4IDIuMCBrZXJuZWwgL3Byb2MvbmV0L2RldlxuIikpOwogICAgfQoKCiAgICB3aGlsZSAoZmdldHMobGluZSwgc2l6ZW9mKGxpbmUpLCBkZXZpbikpIHsKICAgICAgICBzdHJ1Y3QgaWZuZXQgICAqbm5ldzsKICAgICAgICBjaGFyICAgICAgICAgICAqc3RhdHMsICppZnN0YXJ0ID0gbGluZTsKCiAgICAgICAgaWYgKGxpbmVbc3RybGVuKGxpbmUpIC0gMV0gPT0gJ1xuJykKICAgICAgICAgICAgbGluZVtzdHJsZW4obGluZSkgLSAxXSA9ICdcMCc7CgogICAgICAgIHdoaWxlICgqaWZzdGFydCAmJiAqaWZzdGFydCA9PSAnICcpCiAgICAgICAgICAgIGlmc3RhcnQrKzsKCiAgICAgICAgaWYgKCEqaWZzdGFydCB8fCAoKHN0YXRzID0gc3RycmNocihpZnN0YXJ0LCAnOicpKSA9PSBOVUxMKSkgewogICAgICAgICAgICBzbm1wX2xvZyhMT0dfRVJSLAogICAgICAgICAgICAgICAgICAgICAiL3Byb2MvbmV0L2RldiBkYXRhIGZvcm1hdCBlcnJvciwgbGluZSA9PXwlc3wiLCBsaW5lKTsKICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgfQogICAgICAgIGlmICgoc2Nhbl9saW5lX3RvX3VzZSA9PSBzY2FuX2xpbmVfMl8yKSAmJiAoKHN0YXRzIC0gbGluZSkgPCA2KSkgewogICAgICAgICAgICBzbm1wX2xvZyhMT0dfRVJSLAogICAgICAgICAgICAgICAgICAgICAiL3Byb2MvbmV0L2RldiBkYXRhIGZvcm1hdCBlcnJvciwgbGluZSA9PXwlc3wiLCBsaW5lKTsKICAgICAgICB9CgogICAgICAgICpzdGF0cyAgID0gMDsKICAgICAgICBzdHJsY3B5KGlmbmFtZV9idWYsIGlmc3RhcnQsIHNpemVvZihpZm5hbWVfYnVmKSk7CiAgICAgICAgKnN0YXRzKysgPSAnOic7CiAgICAgICAgd2hpbGUgKCpzdGF0cyA9PSAnICcpCiAgICAgICAgICAgIHN0YXRzKys7CgogICAgICAgIGlmICgoc2Nhbl9saW5lX3RvX3VzZSA9PSBzY2FuX2xpbmVfMl8yICYmCiAgICAgICAgICAgICBzc2NhbmYoc3RhdHMsIHNjYW5fbGluZV90b191c2UsICZyZWNfb2N0LCAmcmVjX3BrdCwgJnJlY19lcnIsCiAgICAgICAgICAgICAgICAgICAgJnJlY19kcm9wLCAmc25kX29jdCwgJnNuZF9wa3QsICZzbmRfZXJyLCAmc25kX2Ryb3AsCiAgICAgICAgICAgICAgICAgICAgJmNvbGwpICE9IDkpIHx8IChzY2FuX2xpbmVfdG9fdXNlID09IHNjYW5fbGluZV8yXzAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICYmIHNzY2FuZihzdGF0cywgc2Nhbl9saW5lX3RvX3VzZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcmVjX3BrdCwgJnJlY19lcnIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnNuZF9wa3QsICZzbmRfZXJyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZjb2xsKSAhPSA1KSkgewogICAgICAgICAgICBpZiAoKHNjYW5fbGluZV90b191c2UgPT0gc2Nhbl9saW5lXzJfMikKICAgICAgICAgICAgICAgICYmICFzdHJzdHIobGluZSwgIk5vIHN0YXRpc3RpY3MgYXZhaWxhYmxlIikpCiAgICAgICAgICAgICAgICBzbm1wX2xvZyhMT0dfRVJSLAogICAgICAgICAgICAgICAgICAgICAgICAgIi9wcm9jL25ldC9kZXYgZGF0YSBmb3JtYXQgZXJyb3IsIGxpbmUgPT18JXN8IiwKICAgICAgICAgICAgICAgICAgICAgICAgIGxpbmUpOwogICAgICAgICAgICBjb250aW51ZTsKICAgICAgICB9CgogICAgICAgIG5uZXcgPSAoc3RydWN0IGlmbmV0ICopIGNhbGxvYygxLCBzaXplb2Yoc3RydWN0IGlmbmV0KSk7CiAgICAgICAgaWYgKG5uZXcgPT0gTlVMTCkKICAgICAgICAgICAgYnJlYWs7ICAgICAgICAgICAgICAvKiBhbGxvYyBlcnJvciAqLwoKICAgICAgICAvKgogICAgICAgICAqIGNoYWluIGluOiAKICAgICAgICAgKi8KICAgICAgICAqaWZuZXRhZGRyX3B0ciA9IG5uZXc7CiAgICAgICAgaWZuZXRhZGRyX3B0ciA9ICZubmV3LT5pZl9uZXh0OwogICAgICAgIGkrKzsKCiAgICAgICAgLyoKICAgICAgICAgKiBsaW51eCBwcmV2aW91cyB0byAxLjMufjEzIG1heSBtaXNzIHRyYW5zbWl0dGVkIGxvb3BiYWNrIHBrdHM6IAogICAgICAgICAqLwogICAgICAgIGlmICghc3RyY21wKGlmbmFtZV9idWYsICJsbyIpICYmIHJlY19wa3QgPiAwICYmICFzbmRfcGt0KQogICAgICAgICAgICBzbmRfcGt0ID0gcmVjX3BrdDsKCiAgICAgICAgbm5ldy0+aWZfaXBhY2tldHMgPSByZWNfcGt0ICYgMHhmZmZmZmZmZjsKICAgICAgICBubmV3LT5pZl9pZXJyb3JzID0gcmVjX2VycjsKICAgICAgICBubmV3LT5pZl9vcGFja2V0cyA9IHNuZF9wa3QgJiAweGZmZmZmZmZmOwogICAgICAgIG5uZXctPmlmX29lcnJvcnMgPSBzbmRfZXJyOwogICAgICAgIG5uZXctPmlmX2NvbGxpc2lvbnMgPSBjb2xsOwogICAgICAgIGlmIChzY2FuX2xpbmVfdG9fdXNlID09IHNjYW5fbGluZV8yXzIpIHsKICAgICAgICAgICAgbm5ldy0+aWZfaWJ5dGVzID0gcmVjX29jdCAmIDB4ZmZmZmZmZmY7CiAgICAgICAgICAgIG5uZXctPmlmX29ieXRlcyA9IHNuZF9vY3QgJiAweGZmZmZmZmZmOwogICAgICAgICAgICBubmV3LT5pZl9pcWRyb3BzID0gcmVjX2Ryb3A7CiAgICAgICAgICAgIG5uZXctPmlmX3NuZC5pZnFfZHJvcHMgPSBzbmRfZHJvcDsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgICBubmV3LT5pZl9pYnl0ZXMgPSAocmVjX3BrdCAqIDMwOCkgJiAweGZmZmZmZmZmOwogICAgICAgICAgICBubmV3LT5pZl9vYnl0ZXMgPSAoc25kX3BrdCAqIDMwOCkgJiAweGZmZmZmZmZmOwogICAgICAgIH0KCiAgICAgICAgLyoKICAgICAgICAgKiBpZm5hbWVzIGFyZSBnaXZlbiBhcyBgYCAgIGV0aDAnJzogc3BsaXQgaW4gYGBldGgnJyBhbmQgYGAwJyc6IAogICAgICAgICAqLwogICAgICAgIGZvciAoaWZuYW1lID0gaWZuYW1lX2J1ZjsgKmlmbmFtZSAmJiAqaWZuYW1lID09ICcgJzsgaWZuYW1lKyspOwoKICAgICAgICAvKgogICAgICAgICAqIHNldCBuYW1lIGFuZCBpbnRlcmZhY2UjIDogCiAgICAgICAgICovCiAgICAgICAgbm5ldy0+aWZfbmFtZSA9IChjaGFyICopIHN0cmR1cChpZm5hbWUpOwogICAgICAgIGZvciAocHRyID0gbm5ldy0+aWZfbmFtZTsgKnB0ciAmJiAoKnB0ciA8ICcwJyB8fCAqcHRyID4gJzknKTsKICAgICAgICAgICAgIHB0cisrKTsKICAgICAgICBubmV3LT5pZl91bml0ID0gc3RyZHVwKCpwdHIgPyBwdHIgOiAiIik7CiAgICAgICAgKnB0ciA9IDA7CgogICAgICAgIHN0cmxjcHkoaWZycS5pZnJfbmFtZSwgaWZuYW1lLCBzaXplb2YoaWZycS5pZnJfbmFtZSkpOwogICAgICAgIGlmIChpb2N0bChmZCwgU0lPQ0dJRkFERFIsICZpZnJxKSA8IDApCiAgICAgICAgICAgIG1lbXNldCgoY2hhciAqKSAmbm5ldy0+aWZfYWRkciwgMCwgc2l6ZW9mKG5uZXctPmlmX2FkZHIpKTsKICAgICAgICBlbHNlCiAgICAgICAgICAgIG5uZXctPmlmX2FkZHIgPSBpZnJxLmlmcl9hZGRyOwoKICAgICAgICBzdHJsY3B5KGlmcnEuaWZyX25hbWUsIGlmbmFtZSwgc2l6ZW9mKGlmcnEuaWZyX25hbWUpKTsKICAgICAgICBpZiAoaW9jdGwoZmQsIFNJT0NHSUZCUkRBRERSLCAmaWZycSkgPCAwKQogICAgICAgICAgICBtZW1zZXQoKGNoYXIgKikgJm5uZXctPmlmdV9icm9hZGFkZHIsIDAsCiAgICAgICAgICAgICAgICAgICBzaXplb2Yobm5ldy0+aWZ1X2Jyb2FkYWRkcikpOwogICAgICAgIGVsc2UKICAgICAgICAgICAgbm5ldy0+aWZ1X2Jyb2FkYWRkciA9IGlmcnEuaWZyX2Jyb2FkYWRkcjsKCiAgICAgICAgc3RybGNweShpZnJxLmlmcl9uYW1lLCBpZm5hbWUsIHNpemVvZihpZnJxLmlmcl9uYW1lKSk7CiAgICAgICAgaWYgKGlvY3RsKGZkLCBTSU9DR0lGTkVUTUFTSywgJmlmcnEpIDwgMCkKICAgICAgICAgICAgbWVtc2V0KChjaGFyICopICZubmV3LT5pYV9zdWJuZXRtYXNrLCAwLAogICAgICAgICAgICAgICAgICAgc2l6ZW9mKG5uZXctPmlhX3N1Ym5ldG1hc2spKTsKICAgICAgICBlbHNlCiAgICAgICAgICAgIG5uZXctPmlhX3N1Ym5ldG1hc2sgPSBpZnJxLmlmcl9uZXRtYXNrOwoKICAgICAgICBzdHJsY3B5KGlmcnEuaWZyX25hbWUsIGlmbmFtZSwgc2l6ZW9mKGlmcnEuaWZyX25hbWUpKTsKICAgICAgICBubmV3LT5pZl9mbGFncyA9IGlvY3RsKGZkLCBTSU9DR0lGRkxBR1MsICZpZnJxKSA8IDAKICAgICAgICAgICAgPyAwIDogaWZycS5pZnJfZmxhZ3M7CgogICAgICAgIG5uZXctPmlmX3R5cGUgPSAwOwoKICAgICAgICAvKgogICAgICAgICAqIE5PVEU6IHRoaXMgaW9jdGwgZG9lcyBub3QgZ3VhcmFudGVlIDYgYnl0ZXMgb2YgYSBwaHlzYWRkci4KICAgICAgICAgKiBJbiBwYXJ0aWN1bGFyLCBhICdzaXQwJyBpbnRlcmZhY2Ugb25seSBhcHBlYXJzIHRvIGdldCBiYWNrCiAgICAgICAgICogNCBieXRlcyBvZiBzYV9kYXRhLgogICAgICAgICAqLwogICAgICAgIG1lbXNldChpZnJxLmlmcl9od2FkZHIuc2FfZGF0YSwgKDApLCBJRkhXQUREUkxFTik7CiAgICAgICAgc3RybGNweShpZnJxLmlmcl9uYW1lLCBpZm5hbWUsIHNpemVvZihpZnJxLmlmcl9uYW1lKSk7CiAgICAgICAgaWYgKGlvY3RsKGZkLCBTSU9DR0lGSFdBRERSLCAmaWZycSkgPCAwKQogICAgICAgICAgICBtZW1zZXQobm5ldy0+aWZfaHdhZGRyLCAoMCksIElGSFdBRERSTEVOKTsKICAgICAgICBlbHNlIHsKICAgICAgICAgICAgbWVtY3B5KG5uZXctPmlmX2h3YWRkciwgaWZycS5pZnJfaHdhZGRyLnNhX2RhdGEsIElGSFdBRERSTEVOKTsKCiNpZmRlZiBBUlBIUkRfTE9PUEJBQ0sKICAgICAgICAgICAgc3dpdGNoIChpZnJxLmlmcl9od2FkZHIuc2FfZmFtaWx5KSB7CiAgICAgICAgICAgIGNhc2UgQVJQSFJEX0VUSEVSOgogICAgICAgICAgICAgICAgbm5ldy0+aWZfdHlwZSA9IDY7CiAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgY2FzZSBBUlBIUkRfVFVOTkVMOgogICAgICAgICAgICBjYXNlIEFSUEhSRF9UVU5ORUw2OgojaWZkZWYgQVJQSFJEX0lQR1JFCiAgICAgICAgICAgIGNhc2UgQVJQSFJEX0lQR1JFOgojZW5kaWYKICAgICAgICAgICAgY2FzZSBBUlBIUkRfU0lUOgogICAgICAgICAgICAgICAgbm5ldy0+aWZfdHlwZSA9IDEzMTsKICAgICAgICAgICAgICAgIGJyZWFrOyAgICAgICAgICAvKiB0dW5uZWwgKi8KICAgICAgICAgICAgY2FzZSBBUlBIUkRfU0xJUDoKICAgICAgICAgICAgY2FzZSBBUlBIUkRfQ1NMSVA6CiAgICAgICAgICAgIGNhc2UgQVJQSFJEX1NMSVA2OgogICAgICAgICAgICBjYXNlIEFSUEhSRF9DU0xJUDY6CiAgICAgICAgICAgICAgICBubmV3LT5pZl90eXBlID0gMjg7CiAgICAgICAgICAgICAgICBicmVhazsgICAgICAgICAgLyogc2xpcCAqLwogICAgICAgICAgICBjYXNlIEFSUEhSRF9QUFA6CiAgICAgICAgICAgICAgICBubmV3LT5pZl90eXBlID0gMjM7CiAgICAgICAgICAgICAgICBicmVhazsgICAgICAgICAgLyogcHBwICovCiAgICAgICAgICAgIGNhc2UgQVJQSFJEX0xPT1BCQUNLOgogICAgICAgICAgICAgICAgbm5ldy0+aWZfdHlwZSA9IDI0OwogICAgICAgICAgICAgICAgYnJlYWs7ICAgICAgICAgIC8qIHNvZnR3YXJlTG9vcGJhY2sgKi8KICAgICAgICAgICAgY2FzZSBBUlBIUkRfRkRESToKICAgICAgICAgICAgICAgIG5uZXctPmlmX3R5cGUgPSAxNTsKICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICBjYXNlIEFSUEhSRF9BUkNORVQ6CiAgICAgICAgICAgICAgICBubmV3LT5pZl90eXBlID0gMzU7CiAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgY2FzZSBBUlBIUkRfTE9DQUxUTEs6CiAgICAgICAgICAgICAgICBubmV3LT5pZl90eXBlID0gNDI7CiAgICAgICAgICAgICAgICBicmVhazsKI2lmZGVmIEFSUEhSRF9ISVBQSQogICAgICAgICAgICBjYXNlIEFSUEhSRF9ISVBQSToKICAgICAgICAgICAgICAgIG5uZXctPmlmX3R5cGUgPSA0NzsKICAgICAgICAgICAgICAgIGJyZWFrOwojZW5kaWYKI2lmZGVmIEFSUEhSRF9BVE0KICAgICAgICAgICAgY2FzZSBBUlBIUkRfQVRNOgogICAgICAgICAgICAgICAgbm5ldy0+aWZfdHlwZSA9IDM3OwogICAgICAgICAgICAgICAgYnJlYWs7CiNlbmRpZgogICAgICAgICAgICAgICAgLyoKICAgICAgICAgICAgICAgICAqIFhYWDogbW9yZSBpZl9hcnAuaDpBUlBIRFJfeHh4IHRvIElBTkFpZlR5cGUgbWFwcGluZ3MuLi4gCiAgICAgICAgICAgICAgICAgKi8KICAgICAgICAgICAgfQojZW5kaWYKICAgICAgICB9CgogICAgICAgIHN0cmxjcHkoaWZycS5pZnJfbmFtZSwgaWZuYW1lLCBzaXplb2YoaWZycS5pZnJfbmFtZSkpOwogICAgICAgIG5uZXctPmlmX21ldHJpYyA9IGlvY3RsKGZkLCBTSU9DR0lGTUVUUklDLCAmaWZycSkgPCAwCiAgICAgICAgICAgID8gMCA6IGlmcnEuaWZyX21ldHJpYzsKCiNpZmRlZiBTSU9DR0lGTVRVCiAgICAgICAgc3RybGNweShpZnJxLmlmcl9uYW1lLCBpZm5hbWUsIHNpemVvZihpZnJxLmlmcl9uYW1lKSk7CiAgICAgICAgbm5ldy0+aWZfbXR1ID0gKGlvY3RsKGZkLCBTSU9DR0lGTVRVLCAmaWZycSkgPCAwKQogICAgICAgICAgICA/IDAgOiBpZnJxLmlmcl9tdHU7CiNlbHNlCiAgICAgICAgbm5ldy0+aWZfbXR1ID0gMDsKI2VuZGlmCgogICAgICAgIGlmX3B0ciA9IG5ldHNubXBfYWNjZXNzX2ludGVyZmFjZV9lbnRyeV9vdmVycmlkZXNfZ2V0KGlmbmFtZSk7CiAgICAgICAgaWYgKGlmX3B0cikgewogICAgICAgICAgICBubmV3LT5pZl90eXBlID0gaWZfcHRyLT50eXBlOwogICAgICAgICAgICBubmV3LT5pZl9zcGVlZCA9IGlmX3B0ci0+c3BlZWQ7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgLyoKICAgICAgICAgICAgICogZG8gb25seSBndWVzcyBpZl90eXBlIGZyb20gbmFtZSwgaWYgd2UgY291bGQgbm90IHJlYWQKICAgICAgICAgICAgICogKiBpdCBiZWZvcmUgZnJvbSBTSU9DR0lGSFdBRERSIAogICAgICAgICAgICAgKi8KICAgICAgICAgICAgdW5zaWduZWQgaW50IGRlZmF1bHRzcGVlZCA9IE5PTUlOQUxfTElOS19TUEVFRDsKICAgICAgICAgICAgICAgIGlmICghKG5uZXctPmlmX2ZsYWdzICYgSUZGX1JVTk5JTkcpKSB7CiAgICAgICAgICAgICAgICAgICAgLyogCiAgICAgICAgICAgICAgICAgICAgICogdXNlIHNwZWVkIDAgaWYgdGhlIGlmIHNwZWVkIGNhbm5vdCBiZSBkZXRlcm1pbmVkICphbmQqIHRoZQogICAgICAgICAgICAgICAgICAgICAqIGludGVyZmFjZSBpcyBkb3duCiAgICAgICAgICAgICAgICAgICAgICovCiAgICAgICAgICAgICAgICAgICAgZGVmYXVsdHNwZWVkID0gMDsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGlmICghbm5ldy0+aWZfdHlwZSkKICAgICAgICAgICAgICAgIG5uZXctPmlmX3R5cGUgPSBpZl90eXBlX2Zyb21fbmFtZShubmV3LT5pZl9uYW1lKTsKICAgICAgICAgICAgc3dpdGNoKG5uZXctPmlmX3R5cGUpIHsKICAgICAgICAgICAgY2FzZSA2OgogICAgICAgICAgICAgICAgbm5ldy0+aWZfc3BlZWQgPSBnZXRJZlNwZWVkKGZkLCBpZnJxLCBkZWZhdWx0c3BlZWQpOwogICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgIGNhc2UgMjQ6CiAgICAgICAgICAgICAgICBubmV3LT5pZl9zcGVlZCA9IDEwMDAwMDAwOwogICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgIGNhc2UgOToKICAgICAgICAgICAgICAgIG5uZXctPmlmX3NwZWVkID0gNDAwMDAwMDsKICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICBkZWZhdWx0OgogICAgICAgICAgICAgICAgbm5ldy0+aWZfc3BlZWQgPSAwOwogICAgICAgICAgICB9CiAgICAgICAgICAgIC8qWmVybyBzcGVlZCBtZWFucyBsaW5rIHByb2JsZW0qLwogICAgICAgICAgICBpZihubmV3LT5pZl9zcGVlZCA9PSAwICYmIG5uZXctPmlmX2ZsYWdzICYgSUZGX1VQKXsKICAgICAgICAgICAgICAgIG5uZXctPmlmX2ZsYWdzICY9IH5JRkZfUlVOTklORzsKICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogd2hpbGUgKGZnZXRzIC4uLiAqLwoKICAgIGlmbmV0YWRkciA9IGlmbmV0YWRkcl9saXN0OwoKICAgIGlmIChzbm1wX2dldF9kb19kZWJ1Z2dpbmcoKSkgewogICAgICAgIHsKICAgICAgICAgICAgc3RydWN0IGlmbmV0ICAgKnggPSBpZm5ldGFkZHI7CiAgICAgICAgICAgIERFQlVHTVNHVEwoKCJtaWJJSS9pbnRlcmZhY2VzIiwgIiogc2VlOiBrbm93biBpbnRlcmZhY2VzOiIpKTsKICAgICAgICAgICAgd2hpbGUgKHgpIHsKICAgICAgICAgICAgICAgIERFQlVHTVNHKCgibWliSUkvaW50ZXJmYWNlcyIsICIgJXMiLCB4LT5pZl9uYW1lKSk7CiAgICAgICAgICAgICAgICB4ID0geC0+aWZfbmV4dDsKICAgICAgICAgICAgfQogICAgICAgICAgICBERUJVR01TRygoIm1pYklJL2ludGVyZmFjZXMiLCAiXG4iKSk7CiAgICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgLyogWFhYICovCiAgICB9CgogICAgZmNsb3NlKGRldmluKTsKICAgIGNsb3NlKGZkKTsKI2VuZGlmICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBsaW51eCAqLwp9CgoKCiNpZiBkZWZpbmVkKHN1blYzKSB8fCBkZWZpbmVkKGxpbnV4KQovKgogKiAqKiAgNC4yIEJTRCBkb2Vzbid0IGhhdmUgaWZhZGRyCiAqICoqICAKICovCmludApJbnRlcmZhY2VfU2Nhbl9OZXh0KHNob3J0ICpJbmRleCwKICAgICAgICAgICAgICAgICAgICBjaGFyICpOYW1lLAogICAgICAgICAgICAgICAgICAgIHN0cnVjdCBpZm5ldCAqUmV0aWZuZXQsIHN0cnVjdCBpbl9pZmFkZHIgKmR1bW15KQp7CiAgICBpbnQgcmV0dXJuSW5kZXggPSAwOwogICAgaW50IHJldDsKICAgIGlmIChJbmRleCkKICAgICAgICByZXR1cm5JbmRleCA9ICpJbmRleDsKCiAgICByZXQgPSBJbnRlcmZhY2VfU2Nhbl9OZXh0SW50KCAmcmV0dXJuSW5kZXgsIE5hbWUsIFJldGlmbmV0LCBkdW1teSApOwogICAgaWYgKEluZGV4KQogICAgICAgICpJbmRleCA9IChyZXR1cm5JbmRleCAmIDB4OGZmZik7CiAgICByZXR1cm4gcmV0Owp9CgppbnQKSW50ZXJmYWNlX1NjYW5fTmV4dEludChpbnQgKkluZGV4LAogICAgICAgICAgICAgICAgICAgIGNoYXIgKk5hbWUsCiAgICAgICAgICAgICAgICAgICAgc3RydWN0IGlmbmV0ICpSZXRpZm5ldCwgc3RydWN0IGluX2lmYWRkciAqZHVtbXkpCnsKICAgIHN0cnVjdCBpZm5ldCAgICBpZm5ldDsKICAgIHJlZ2lzdGVyIGNoYXIgICpjcDsKCiAgICB3aGlsZSAoaWZuZXRhZGRyKSB7CiAgICAgICAgLyoKICAgICAgICAgKiAgICAgIEdldCB0aGUgImlmbmV0IiBzdHJ1Y3R1cmUgYW5kIGV4dHJhY3QgdGhlIGRldmljZSBuYW1lCiAgICAgICAgICovCiNpZm5kZWYgbGludXgKICAgICAgICBpZiAoIU5FVFNOTVBfS0xPT0tVUChpZm5ldGFkZHIsIChjaGFyICopICZpZm5ldCwgc2l6ZW9mIGlmbmV0KSkgewogICAgICAgICAgICBERUJVR01TR1RMKCgibWliSUkvaW50ZXJmYWNlczpJbnRlcmZhY2VfU2Nhbl9OZXh0IiwgImtsb29rdXAgZmFpbGVkXG4iKSk7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgIH0KCiAgICAgICAgaWYgKCFORVRTTk1QX0tMT09LVVAoaWZuZXQuaWZfbmFtZSwgKGNoYXIgKikgc2F2ZU5hbWUsIHNpemVvZiBzYXZlTmFtZSkpIHsKICAgICAgICAgICAgREVCVUdNU0dUTCgoIm1pYklJL2ludGVyZmFjZXM6SW50ZXJmYWNlX1NjYW5fTmV4dCIsICJrbG9va3VwIGZhaWxlZFxuIikpOwogICAgICAgICAgICBicmVhazsKICAgICAgICB9CgogICAgICAgLyoKICAgICAgICAqIFRoZSBwdXJwb3NlIG9mIHRoaXMgY29tcGFyaXNvbiBpcyBsb3N0IGluIHRoZSBtaXN0cyBvZiB0aW1lLgogICAgICAgICogSXQncyBiZWVuIGFyb3VuZCBhdCBsZWFzdCBjbXUtc25tcCAyLjEuMiBmb3IgU1VOdjMgc3lzdGVtcyBhbmQKICAgICAgICAqIHdhcyBhcHBsaWVkIHRvIGxpbnV4IHN5c3RlbXMgZHVyaW5nIHRoZSBjbXUtc25tcC1saW51eCBwcm9qZWN0LgogICAgICAgICogTm8tb25lIG5vdyBrbm93cyB3aGF0IGl0IHdhcyBpbnRlbmRlZCBmb3IsIGFuZCBpdCBicmVha3MgSVB2NgogICAgICAgICogdHVubmVsIGludGVyZmFjZXMsIHNvIGl0J3MgYmVlbiBtb3ZlZCBvdXQgb2YgdGhlIExpbnV4IGNvZGUgYmxvY2suCiAgICAgICAgKi8KICAgICAgICBpZiAoc3RyY21wKHNhdmVOYW1lLCAiaXAiKSA9PSAwKSB7CiAgICAgICAgICAgIGlmbmV0YWRkciA9IGlmbmV0LmlmX25leHQ7CiAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgIH0KI2Vsc2UKICAgICAgICBpZm5ldCA9ICppZm5ldGFkZHI7CiAgICAgICAgc3RybGNweShzYXZlTmFtZSwgaWZuZXQuaWZfbmFtZSwgc2l6ZW9mKHNhdmVOYW1lKSk7CiNlbmRpZgoKICAgICAgICBzYXZlTmFtZVtzaXplb2Yoc2F2ZU5hbWUpIC0gMV0gPSAnXDAnOwogICAgICAgIGNwID0gKGNoYXIgKikgc3RyY2hyKHNhdmVOYW1lLCAnXDAnKTsKI2lmZGVmIGxpbnV4CiAgICAgICAgc3RybGNhdChzYXZlTmFtZSwgaWZuZXQuaWZfdW5pdCwgc2l6ZW9mKHNhdmVOYW1lKSk7CiNlbHNlCiAgICAgICAgc3RyaW5nX2FwcGVuZF9pbnQoY3AsIGlmbmV0LmlmX3VuaXQpOwojZW5kaWYKICAgICAgICBpZiAoMSB8fCBzdHJjbXAoc2F2ZU5hbWUsICJsbzAiKSAhPSAwKSB7ICAgICAgICAvKiBYWFggKi8KCiAgICAgICAgICAgIGlmIChJbmRleCkKICAgICAgICAgICAgICAgICpJbmRleCA9ICsrc2F2ZUluZGV4OwogICAgICAgICAgICBpZiAoUmV0aWZuZXQpCiAgICAgICAgICAgICAgICAqUmV0aWZuZXQgPSBpZm5ldDsKICAgICAgICAgICAgaWYgKE5hbWUpCiAgICAgICAgICAgICAgICBzdHJjcHkoTmFtZSwgc2F2ZU5hbWUpOwogICAgICAgICAgICBzYXZlaWZuZXQgPSBpZm5ldDsKICAgICAgICAgICAgc2F2ZWlmbmV0YWRkciA9IGlmbmV0YWRkcjsKICAgICAgICAgICAgaWZuZXRhZGRyID0gaWZuZXQuaWZfbmV4dDsKCiAgICAgICAgICAgIHJldHVybiAoMSk7ICAgICAgICAgLyogRE9ORSAqLwogICAgICAgIH0KICAgICAgICBpZm5ldGFkZHIgPSBpZm5ldC5pZl9uZXh0OwogICAgfQogICAgcmV0dXJuICgwKTsgICAgICAgICAgICAgICAgIC8qIEVPRiAqLwp9CgojaWZkZWYgbGludXgKaW50CkludGVyZmFjZV9JbmRleF9CeV9OYW1lKGNoYXIgKk5hbWUsIGludCBMZW4pCnsKICAgIGludCAgICAgICAgICAgICBpZkluZGV4ID0gMDsKICAgIGNoYXIgICAgICAgICAgICBpZk5hbWVbMjBdOwoKICAgIEludGVyZmFjZV9TY2FuX0luaXQoKTsKICAgIHdoaWxlIChJbnRlcmZhY2VfU2Nhbl9OZXh0SW50KCZpZkluZGV4LCBpZk5hbWUsIE5VTEwsIE5VTEwpCiAgICAgICAgICAgJiYgc3RyY21wKE5hbWUsIGlmTmFtZSkpOwogICAgcmV0dXJuIGlmSW5kZXg7Cn0KI2VuZGlmCgoKI2Vsc2UgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBzdW5WMyB8fCBsaW51eCAqLwoKI2lmIGRlZmluZWQobmV0YnNkMSkgfHwgZGVmaW5lZChvcGVuYnNkMikKI2RlZmluZSBpYV9uZXh0IGlhX2xpc3QudHFlX25leHQKI2RlZmluZSBpZl9uZXh0IGlmX2xpc3QudHFlX25leHQKI2VuZGlmCgojaWYgZGVmaW5lZChocHV4MTEpCmludApJbnRlcmZhY2VfU2Nhbl9OZXh0KHNob3J0ICpJbmRleCwgY2hhciAqTmFtZSwgbm1hcGlfcGh5c3RhdCAqIFJldGlmbmV0KQp7CiAgICBpbnQgcmV0dXJuSW5kZXggPSAwOwogICAgaW50IHJldDsKICAgIGlmIChJbmRleCkKICAgICAgICByZXR1cm5JbmRleCA9ICpJbmRleDsKCiAgICByZXQgPSBJbnRlcmZhY2VfU2Nhbl9OZXh0SW50KCAmcmV0dXJuSW5kZXgsIE5hbWUsIFJldGlmbmV0ICk7CiAgICBpZiAoSW5kZXgpCiAgICAgICAgKkluZGV4ID0gKHJldHVybkluZGV4ICYgMHg4ZmZmKTsKICAgIHJldHVybiByZXQ7Cn0KCgppbnQKSW50ZXJmYWNlX1NjYW5fTmV4dEludChpbnQgKkluZGV4LCBjaGFyICpOYW1lLCBubWFwaV9waHlzdGF0ICogUmV0aWZuZXQpCnsKICAgIHN0YXRpYyBubWFwaV9waHlzdGF0ICppZl9wdHIgPSAobm1hcGlfcGh5c3RhdCAqKSAwOwogICAgaW50ICAgICAgICAgICAgIGNvdW50ID0gSW50ZXJmYWNlX1NjYW5fR2V0X0NvdW50KCk7CiAgICB1bnNpZ25lZCBpbnQgICAgdWxlbjsKICAgIGludCAgICAgICAgICAgICByZXQ7CgogICAgaWYgKCFpZl9wdHIpIHsKICAgICAgICBpZiAoY291bnQpCiAgICAgICAgICAgIGlmX3B0ciA9CiAgICAgICAgICAgICAgICAobm1hcGlfcGh5c3RhdCAqKSBtYWxsb2Moc2l6ZW9mKG5tYXBpX3BoeXN0YXQpICogY291bnQpOwogICAgICAgIGVsc2UKICAgICAgICAgICAgcmV0dXJuICgwKTsgICAgICAgICAvKiBFT0YgKi8KICAgIH0KCiAgICBpZiAoc2F2ZUluZGV4ID49IGNvdW50KQogICAgICAgIHJldHVybiAoMCk7ICAgICAgICAgICAgIC8qIEVPRiAqLwoKICAgIHVsZW4gPSAodW5zaWduZWQgaW50KSBjb3VudCAqc2l6ZW9mKG5tYXBpX3BoeXN0YXQpOwogICAgaWYgKChyZXQgPSBnZXRfcGh5c2ljYWxfc3RhdChpZl9wdHIsICZ1bGVuKSkgPCAwKQogICAgICAgIHJldHVybiAoMCk7ICAgICAgICAgICAgIC8qIEVPRiAqLwoKICAgIGlmIChSZXRpZm5ldCkKICAgICAgICAqUmV0aWZuZXQgPSBpZl9wdHJbc2F2ZUluZGV4XTsKICAgIGlmIChOYW1lKQogICAgICAgIHN0cmNweShOYW1lLCBpZl9wdHJbc2F2ZUluZGV4XS5ubV9kZXZpY2UpOwogICAgc2F2ZUluZGV4Kys7CiAgICBpZiAoSW5kZXgpCiAgICAgICAgKkluZGV4ID0gc2F2ZUluZGV4OwogICAgcmV0dXJuICgxKTsgICAgICAgICAgICAgICAgIC8qIERPTkUgKi8KfQoKI2Vsc2UgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBocHV4MTEgKi8KaW50CkludGVyZmFjZV9TY2FuX05leHQoc2hvcnQgKkluZGV4LAogICAgICAgICAgICAgICAgICAgIGNoYXIgKk5hbWUsCiAgICAgICAgICAgICAgICAgICAgc3RydWN0IGlmbmV0ICpSZXRpZm5ldCwgc3RydWN0IGluX2lmYWRkciAqUmV0aW5faWZhZGRyKQp7CiAgICBpbnQgcmV0dXJuSW5kZXggPSAwOwogICAgaW50IHJldDsKICAgIGlmIChJbmRleCkKICAgICAgICByZXR1cm5JbmRleCA9ICpJbmRleDsKCiAgICByZXQgPSBJbnRlcmZhY2VfU2Nhbl9OZXh0SW50KCAmcmV0dXJuSW5kZXgsIE5hbWUsIFJldGlmbmV0LCBSZXRpbl9pZmFkZHIgKTsKICAgIGlmIChJbmRleCkKICAgICAgICAqSW5kZXggPSAocmV0dXJuSW5kZXggJiAweDhmZmYpOwogICAgcmV0dXJuIHJldDsKfQoKCmludApJbnRlcmZhY2VfU2Nhbl9OZXh0SW50KGludCAqSW5kZXgsCiAgICAgICAgICAgICAgICAgICAgY2hhciAqTmFtZSwKICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgaWZuZXQgKlJldGlmbmV0LCBzdHJ1Y3QgaW5faWZhZGRyICpSZXRpbl9pZmFkZHIpCnsKICAgIHN0cnVjdCBpZm5ldCAgICBpZm5ldDsKICAgIHN0cnVjdCBpbl9pZmFkZHIgKmlhLCBpbl9pZmFkZHI7CiAgICBzaG9ydCAgICAgICAgICAgaGFzX2lwYWRkciA9IDA7CiNpZiAhU1RSVUNUX0lGTkVUX0hBU19JRl9YTkFNRQogICAgcmVnaXN0ZXIgY2hhciAgKmNwOwojZW5kaWYKCiAgICB3aGlsZSAoaWZuZXRhZGRyKSB7CiAgICAgICAgLyoKICAgICAgICAgKiAgICAgIEdldCB0aGUgImlmbmV0IiBzdHJ1Y3R1cmUgYW5kIGV4dHJhY3QgdGhlIGRldmljZSBuYW1lCiAgICAgICAgICovCiAgICAgICAgaWYgKCFORVRTTk1QX0tMT09LVVAoaWZuZXRhZGRyLCAoY2hhciAqKSAmaWZuZXQsIHNpemVvZiBpZm5ldCkpIHsKICAgICAgICAgICAgREVCVUdNU0dUTCgoIm1pYklJL2ludGVyZmFjZXM6SW50ZXJmYWNlX1NjYW5fTmV4dCIsICJrbG9va3VwIGZhaWxlZFxuIikpOwogICAgICAgICAgICBicmVhazsKICAgICAgICB9CiNpZiBTVFJVQ1RfSUZORVRfSEFTX0lGX1hOQU1FCiNpZiBkZWZpbmVkKG5ldGJzZDEpIHx8IGRlZmluZWQob3BlbmJzZDIpCiAgICAgICAgc3RybGNweShzYXZlTmFtZSwgaWZuZXQuaWZfeG5hbWUsIHNpemVvZihzYXZlTmFtZSkpOwojZWxzZQogICAgICAgIGlmICghTkVUU05NUF9LTE9PS1VQKGlmbmV0LmlmX3huYW1lLCAoY2hhciAqKSBzYXZlTmFtZSwgc2l6ZW9mIHNhdmVOYW1lKSkgewogICAgICAgICAgICBERUJVR01TR1RMKCgibWliSUkvaW50ZXJmYWNlczpJbnRlcmZhY2VfU2Nhbl9OZXh0IiwgImtsb29rdXAgZmFpbGVkXG4iKSk7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgIH0KI2VuZGlmCiAgICAgICAgc2F2ZU5hbWVbc2l6ZW9mKHNhdmVOYW1lKSAtIDFdID0gJ1wwJzsKI2Vsc2UKICAgICAgICBpZiAoIU5FVFNOTVBfS0xPT0tVUChpZm5ldC5pZl9uYW1lLCAoY2hhciAqKSBzYXZlTmFtZSwgc2l6ZW9mIHNhdmVOYW1lKSkgewogICAgICAgICAgICBERUJVR01TR1RMKCgibWliSUkvaW50ZXJmYWNlczpJbnRlcmZhY2VfU2Nhbl9OZXh0IiwgImtsb29rdXAgZmFpbGVkXG4iKSk7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgIH0KCiAgICAgICAgc2F2ZU5hbWVbc2l6ZW9mKHNhdmVOYW1lKSAtIDFdID0gJ1wwJzsKICAgICAgICBjcCA9IHN0cmNocihzYXZlTmFtZSwgJ1wwJyk7CiAgICAgICAgc3RyaW5nX2FwcGVuZF9pbnQoY3AsIGlmbmV0LmlmX3VuaXQpOwojZW5kaWYKICAgICAgICBpZiAoMSB8fCBzdHJjbXAoc2F2ZU5hbWUsICJsbzAiKSAhPSAwKSB7ICAgICAgICAvKiBYWFggKi8KICAgICAgICAgICAgLyoKICAgICAgICAgICAgICogIFRyeSB0byBmaW5kIGFuIGFkZHJlc3MgZm9yIHRoaXMgaW50ZXJmYWNlCiAgICAgICAgICAgICAqLwoKI2lmZGVmIG5ldGJzZDEKICAgICAgICAgICAgaWEgPSAoc3RydWN0IGluX2lmYWRkciAqKSBpZm5ldC5pZl9hZGRybGlzdC50cWhfZmlyc3Q7CiNlbGlmIGRlZmluZWQoSUZBRERSX1NZTUJPTCkKICAgICAgICAgICAgYXV0b19ubGlzdChJRkFERFJfU1lNQk9MLCAoY2hhciAqKSAmaWEsIHNpemVvZihpYSkpOwojZW5kaWYKICAgICAgICAgICAgd2hpbGUgKGlhKSB7CiAgICAgICAgICAgICAgICBpZiAoIU5FVFNOTVBfS0xPT0tVUChpYSwgKGNoYXIgKikgJmluX2lmYWRkciwgc2l6ZW9mKGluX2lmYWRkcikpKSB7CiAgICAgICAgICAgICAgICAgICAgREVCVUdNU0dUTCgoIm1pYklJL2ludGVyZmFjZXM6SW50ZXJmYWNlX1NjYW5fTmV4dCIsICJrbG9va3VwIGZhaWxlZFxuIikpOwogICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgewojaWZkZWYgbmV0YnNkMQojZGVmaW5lIENQKHgpCSgoY2hhciAqKSh4KSkKICAgICAgICAgICAgICAgICAgICBjaGFyICAgICAgICAgICAqY3A7CiAgICAgICAgICAgICAgICAgICAgc3RydWN0IHNvY2thZGRyICpzYTsKICAgICAgICAgICAgICAgICAgICBjcCA9IChDUChpbl9pZmFkZHIuaWFfaWZhLmlmYV9hZGRyKSAtIENQKGlhKSkgKwogICAgICAgICAgICAgICAgICAgICAgICBDUCgmaW5faWZhZGRyKTsKICAgICAgICAgICAgICAgICAgICBzYSA9IChzdHJ1Y3Qgc29ja2FkZHIgKikgY3A7CgogICAgICAgICAgICAgICAgICAgIGlmIChzYS0+c2FfZmFtaWx5ID09IEFGX0lORVQpCiNlbmRpZgogICAgICAgICAgICAgICAgICAgICAgICBpZiAoaW5faWZhZGRyLmlhX2lmcCA9PSBpZm5ldGFkZHIpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhhc19pcGFkZHIgPSAxOyAgICAgLyogdGhpcyBJRiBoYXMgSVAtYWRkcmVzcyAqLwogICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KI2lmZGVmIG5ldGJzZDEKICAgICAgICAgICAgICAgIGlhID0gKHN0cnVjdCBpbl9pZmFkZHIgKikgaW5faWZhZGRyLmlhX2lmYS5pZmFfbGlzdC4KICAgICAgICAgICAgICAgICAgICB0cWVfbmV4dDsKI2Vsc2UKICAgICAgICAgICAgICAgIGlhID0gaW5faWZhZGRyLmlhX25leHQ7CiNlbmRpZgogICAgICAgICAgICB9CgojaWYgIWRlZmluZWQobmV0YnNkMSkgJiYgIWRlZmluZWQoZnJlZWJzZDIpICYmICFkZWZpbmVkKG9wZW5ic2QyKSAmJiAhZGVmaW5lZChTVFJVQ1RfSUZORVRfSEFTX0lGX0FERFJMSVNUKQogICAgICAgICAgICBpZm5ldC5pZl9hZGRybGlzdCA9IChzdHJ1Y3QgaWZhZGRyICopIGlhOyAgIC8qIFdST05HIERBVEEgVFlQRTsgT05MWSBBIEZMQUcgKi8KI2VuZGlmCiAgICAgICAgICAgIC8qCiAgICAgICAgICAgICAqIGlmbmV0LmlmX2FkZHJsaXN0ID0gKHN0cnVjdCBpZmFkZHIgKikmaWEtPmlhX2lmYTsgICAKICAgICAgICAgICAgICoKICAgICAgICAgICAgICogV1JPTkcgREFUQSBUWVBFOyBPTkxZIEEgRkxBRyAKICAgICAgICAgICAgICovCgogICAgICAgICAgICBpZiAoSW5kZXgpCiAgICAgICAgICAgICAgICAqSW5kZXggPSArK3NhdmVJbmRleDsKICAgICAgICAgICAgaWYgKFJldGlmbmV0KQogICAgICAgICAgICAgICAgKlJldGlmbmV0ID0gaWZuZXQ7CiAgICAgICAgICAgIGlmIChSZXRpbl9pZmFkZHIgJiYgaGFzX2lwYWRkcikgICAgIC8qIGFzc2lnbiB0aGUgaW5faWZhZGRyIG9ubHkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogaWYgdGhlIElGIGhhcyBJUC1hZGRyZXNzICovCiAgICAgICAgICAgICAgICAqUmV0aW5faWZhZGRyID0gaW5faWZhZGRyOwogICAgICAgICAgICBpZiAoTmFtZSkKICAgICAgICAgICAgICAgIHN0cmNweShOYW1lLCBzYXZlTmFtZSk7CiAgICAgICAgICAgIHNhdmVpZm5ldCA9IGlmbmV0OwogICAgICAgICAgICBzYXZlaWZuZXRhZGRyID0gaWZuZXRhZGRyOwogICAgICAgICAgICBzYXZlaW5faWZhZGRyID0gaW5faWZhZGRyOwogICAgICAgICAgICBpZm5ldGFkZHIgPSBpZm5ldC5pZl9uZXh0OwoKICAgICAgICAgICAgcmV0dXJuICgxKTsgICAgICAgICAvKiBET05FICovCiAgICAgICAgfQogICAgICAgIGlmbmV0YWRkciA9IGlmbmV0LmlmX25leHQ7CiAgICB9CiAgICByZXR1cm4gKDApOyAgICAgICAgICAgICAgICAgLyogRU9GICovCn0KCiNlbmRpZiAgICAgICAgICAgICAgICAgICAgICAgICAgLyogaHB1eDExICovCgojZW5kaWYgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHN1blYzIHx8IGxpbnV4ICovCgojaWYgZGVmaW5lZChocHV4MTEpCgpzdGF0aWMgaW50CkludGVyZmFjZV9TY2FuX0J5X0luZGV4KGludCBJbmRleCwgY2hhciAqTmFtZSwgbm1hcGlfcGh5c3RhdCAqIFJldGlmbmV0KQp7CiAgICBpbnQgICAgICAgICAgIGk7CgogICAgSW50ZXJmYWNlX1NjYW5fSW5pdCgpOwogICAgd2hpbGUgKEludGVyZmFjZV9TY2FuX05leHRJbnQoJmksIE5hbWUsIFJldGlmbmV0KSkgewogICAgICAgIGlmIChpID09IEluZGV4KQogICAgICAgICAgICBicmVhazsKICAgIH0KICAgIGlmIChpICE9IEluZGV4KQogICAgICAgIHJldHVybiAoLTEpOyAgICAgICAgICAgIC8qIEVycm9yLCBkb2Vzbid0IGV4aXN0ICovCiAgICByZXR1cm4gKDApOyAgICAgICAgICAgICAgICAgLyogRE9ORSAqLwp9CgojZWxzZSAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGhwdXgxMSAqLwoKc3RhdGljIGludApJbnRlcmZhY2VfU2Nhbl9CeV9JbmRleChpbnQgSW5kZXgsCiAgICAgICAgICAgICAgICAgICAgICAgIGNoYXIgKk5hbWUsCiAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBpZm5ldCAqUmV0aWZuZXQsCiAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBpbl9pZmFkZHIgKlJldGluX2lmYWRkcikKewogICAgaW50ICAgICAgICAgICBpOwoKICAgIEludGVyZmFjZV9TY2FuX0luaXQoKTsKICAgIHdoaWxlIChJbnRlcmZhY2VfU2Nhbl9OZXh0SW50KCZpLCBOYW1lLCBSZXRpZm5ldCwgUmV0aW5faWZhZGRyKSkgewogICAgICAgIGlmIChpID09IEluZGV4KQogICAgICAgICAgICBicmVhazsKICAgIH0KICAgIGlmIChpICE9IEluZGV4KQogICAgICAgIHJldHVybiAoLTEpOyAgICAgICAgICAgIC8qIEVycm9yLCBkb2Vzbid0IGV4aXN0ICovCiAgICByZXR1cm4gKDApOyAgICAgICAgICAgICAgICAgLyogRE9ORSAqLwp9CgojZW5kaWYgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGhwdXgxMSAqLwoKc3RhdGljIGludCAgICAgIEludGVyZmFjZV9Db3VudCA9IDA7CgojaWYgZGVmaW5lZChocHV4MTEpCgppbnQKSW50ZXJmYWNlX1NjYW5fR2V0X0NvdW50KHZvaWQpCnsKICAgIGlmICghSW50ZXJmYWNlX0NvdW50KSB7CiAgICAgICAgaW50ICAgICAgICAgICAgIGZkOwogICAgICAgIHN0cnVjdCBubXBhcm1zICBwOwogICAgICAgIGludCAgICAgICAgICAgICB2YWw7CiAgICAgICAgdW5zaWduZWQgaW50ICAgIHVsZW47CiAgICAgICAgaW50ICAgICAgICAgICAgIHJldDsKCiAgICAgICAgaWYgKChmZCA9IG9wZW5fbWliKCIvZGV2L2lwIiwgT19SRE9OTFksIDAsIE5NX0FTWU5DX09GRikpID49IDApIHsKICAgICAgICAgICAgcC5vYmppZCA9IElEX2lmTnVtYmVyOwogICAgICAgICAgICBwLmJ1ZmZlciA9ICh2b2lkICopICZ2YWw7CiAgICAgICAgICAgIHVsZW4gPSBzaXplb2YoaW50KTsKICAgICAgICAgICAgcC5sZW4gPSAmdWxlbjsKICAgICAgICAgICAgaWYgKChyZXQgPSBnZXRfbWliX2luZm8oZmQsICZwKSkgPT0gMCkKICAgICAgICAgICAgICAgIEludGVyZmFjZV9Db3VudCA9IHZhbDsKICAgICAgICAgICAgY2xvc2VfbWliKGZkKTsKICAgICAgICB9CiAgICB9CiAgICByZXR1cm4gKEludGVyZmFjZV9Db3VudCk7Cn0KCiNlbHNlICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogaHB1eDExICovCgppbnQKSW50ZXJmYWNlX1NjYW5fR2V0X0NvdW50KHZvaWQpCnsKICAgIHN0YXRpYyB0aW1lX3QgICBzY2FuX3RpbWUgPSAwOwogICAgdGltZV90ICAgICAgICAgIHRpbWVfbm93ID0gdGltZShOVUxMKTsKCiAgICBpZiAoIUludGVyZmFjZV9Db3VudCB8fCAodGltZV9ub3cgPiBzY2FuX3RpbWUgKyA2MCkpIHsKICAgICAgICBzY2FuX3RpbWUgPSB0aW1lX25vdzsKICAgICAgICBJbnRlcmZhY2VfU2Nhbl9Jbml0KCk7CiAgICAgICAgSW50ZXJmYWNlX0NvdW50ID0gMDsKICAgICAgICB3aGlsZSAoSW50ZXJmYWNlX1NjYW5fTmV4dEludChOVUxMLCBOVUxMLCBOVUxMLCBOVUxMKSAhPSAwKSB7CiAgICAgICAgICAgIEludGVyZmFjZV9Db3VudCsrOwogICAgICAgIH0KICAgIH0KICAgIHJldHVybiAoSW50ZXJmYWNlX0NvdW50KTsKfQoKCnN0YXRpYyBpbnQKSW50ZXJmYWNlX0dldF9FdGhlcl9CeV9JbmRleChpbnQgSW5kZXgsIHVfY2hhciAqIEV0aGVyQWRkcikKewogICAgaW50ICAgICAgICAgICAgIGk7CiNpZiAhKGRlZmluZWQobGludXgpIHx8IGRlZmluZWQobmV0YnNkMSkgfHwgZGVmaW5lZChic2RpMikgfHwgZGVmaW5lZChvcGVuYnNkMikpCiAgICBzdHJ1Y3QgYXJwY29tICAgYXJwY29tOwojZWxzZSAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGlzIGxpbnV4IG9yIG5ldGJzZDEgKi8KICAgIHN0cnVjdCBhcnBjb20gewogICAgICAgIGNoYXIgICAgICAgICAgICBhY19lbmFkZHJbNl07CiAgICB9IGFycGNvbTsKI2lmIGRlZmluZWQobmV0YnNkMSkgfHwgZGVmaW5lZChic2RpMikgfHwgZGVmaW5lZChvcGVuYnNkMikKICAgIHN0cnVjdCBzb2NrYWRkcl9kbCBzYWRsOwogICAgc3RydWN0IGlmYWRkciAgIGlmYWRkcjsKICAgIHVfbG9uZyAgICAgICAgICBpZmFkZHJhZGRyOwojZW5kaWYKI2VuZGlmCgojaWYgZGVmaW5lZChtaXBzKSB8fCBkZWZpbmVkKGhwdXgpIHx8IGRlZmluZWQob3NmNCkgfHwgZGVmaW5lZChvc2YzKSB8fCBkZWZpbmVkKG9zZjUpCiAgICBtZW1zZXQoYXJwY29tLmFjX2VuYWRkciwgMCwgc2l6ZW9mKGFycGNvbS5hY19lbmFkZHIpKTsKI2Vsc2UKICAgIG1lbXNldCgmYXJwY29tLmFjX2VuYWRkciwgMCwgc2l6ZW9mKGFycGNvbS5hY19lbmFkZHIpKTsKI2VuZGlmCiAgICBtZW1zZXQoRXRoZXJBZGRyLCAwLCBzaXplb2YoYXJwY29tLmFjX2VuYWRkcikpOwoKICAgIGlmIChzYXZlSW5kZXggIT0gSW5kZXgpIHsgICAvKiBPcHRpbWl6YXRpb24hICovCgogICAgICAgIEludGVyZmFjZV9TY2FuX0luaXQoKTsKCiAgICAgICAgd2hpbGUgKEludGVyZmFjZV9TY2FuX05leHRJbnQoJmksIE5VTEwsIE5VTEwsIE5VTEwpICE9IDApIHsKICAgICAgICAgICAgaWYgKGkgPT0gSW5kZXgpCiAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICB9CiAgICAgICAgaWYgKGkgIT0gSW5kZXgpCiAgICAgICAgICAgIHJldHVybiAoLTEpOyAgICAgICAgLyogRXJyb3IsIGRvZXNuJ3QgZXhpc3QgKi8KICAgIH0KI2lmZGVmIGZyZWVic2QyCiAgICBpZiAoc2F2ZWlmbmV0LmlmX3R5cGUgIT0gSUZUX0VUSEVSKSB7CiAgICAgICAgcmV0dXJuICgwKTsgICAgICAgICAgICAgLyogTm90IGFuIGV0aGVybmV0IGlmICovCiAgICB9CiNlbmRpZgogICAgLyoKICAgICAqICB0aGUgYXJwY29tIHN0cnVjdHVyZSBpcyBhbiBleHRlbmRlZCBpZm5ldCBzdHJ1Y3R1cmUgd2hpY2gKICAgICAqICBjb250YWlucyB0aGUgZXRoZXJuZXQgYWRkcmVzcy4KICAgICAqLwojaWZuZGVmIGxpbnV4CiNpZiAhKGRlZmluZWQobmV0YnNkMSkgfHwgZGVmaW5lZChic2RpMikgfHwgZGVmaW5lZChvcGVuYnNkMikpCiAgICBpZiAoIU5FVFNOTVBfS0xPT0tVUChzYXZlaWZuZXRhZGRyLCAoY2hhciAqKSAmYXJwY29tLCBzaXplb2YgYXJwY29tKSkgewogICAgICAgIERFQlVHTVNHVEwoKCJtaWJJSS9pbnRlcmZhY2VzOkludGVyZmFjZV9HZXRfRXRoZXJfQnlfSW5kZXgiLCAia2xvb2t1cCBmYWlsZWRcbiIpKTsKICAgICAgICByZXR1cm4gMDsKICAgIH0KI2Vsc2UgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBuZXRic2QxIG9yIGJzZGkyIG9yIG9wZW5ic2QyICovCgojaWYgZGVmaW5lZChuZXRic2QxKSB8fCBkZWZpbmVkKG9wZW5ic2QyKQojZGVmaW5lIGlmX2FkZHJsaXN0IGlmX2FkZHJsaXN0LnRxaF9maXJzdAojZGVmaW5lIGlmYV9uZXh0ICAgIGlmYV9saXN0LnRxZV9uZXh0CiNlbmRpZgoKICAgIGlmYWRkcmFkZHIgPSAodW5zaWduZWQgbG9uZykgc2F2ZWlmbmV0LmlmX2FkZHJsaXN0OwogICAgd2hpbGUgKGlmYWRkcmFkZHIpIHsKICAgICAgICBpZiAoIU5FVFNOTVBfS0xPT0tVUChpZmFkZHJhZGRyLCAoY2hhciAqKSAmaWZhZGRyLCBzaXplb2YgaWZhZGRyKSkgewogICAgICAgICAgICBERUJVR01TR1RMKCgibWliSUkvaW50ZXJmYWNlczpJbnRlcmZhY2VfR2V0X0V0aGVyX0J5X0luZGV4IiwgImtsb29rdXAgZmFpbGVkXG4iKSk7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgIH0KICAgICAgICBpZiAoIU5FVFNOTVBfS0xPT0tVUChpZmFkZHIuaWZhX2FkZHIsIChjaGFyICopICZzYWRsLCBzaXplb2Ygc2FkbCkpIHsKICAgICAgICAgICAgREVCVUdNU0dUTCgoIm1pYklJL2ludGVyZmFjZXM6SW50ZXJmYWNlX0dldF9FdGhlcl9CeV9JbmRleCIsICJrbG9va3VwIGZhaWxlZFxuIikpOwogICAgICAgICAgICBicmVhazsKICAgICAgICB9CiAgICAgICAgaWYgKHNhZGwuc2RsX2ZhbWlseSA9PSBBRl9MSU5LCiAgICAgICAgICAgICYmIChzYXZlaWZuZXQuaWZfdHlwZSA9PSBJRlRfRVRIRVIKICAgICAgICAgICAgICAgIHx8IHNhdmVpZm5ldC5pZl90eXBlID09IElGVF9JU084ODAyNQogICAgICAgICAgICAgICAgfHwgc2F2ZWlmbmV0LmlmX3R5cGUgPT0gSUZUX0ZEREkpKSB7CiAgICAgICAgICAgIG1lbWNweShhcnBjb20uYWNfZW5hZGRyLCBzYWRsLnNkbF9kYXRhICsgc2FkbC5zZGxfbmxlbiwKICAgICAgICAgICAgICAgICAgIHNpemVvZihhcnBjb20uYWNfZW5hZGRyKSk7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgIH0KICAgICAgICBpZmFkZHJhZGRyID0gKHVuc2lnbmVkIGxvbmcpIGlmYWRkci5pZmFfbmV4dDsKICAgIH0KI2VuZGlmICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBuZXRic2QxIG9yIGJzZGkyIG9yIG9wZW5ic2QyICovCgojZWxzZSAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGxpbnV4ICovCiAgICBtZW1jcHkoYXJwY29tLmFjX2VuYWRkciwgc2F2ZWlmbmV0YWRkci0+aWZfaHdhZGRyLCA2KTsKI2VuZGlmCiAgICBpZiAoc3RybmNtcCgibG8iLCBzYXZlTmFtZSwgMikgPT0gMCkgewogICAgICAgIC8qCiAgICAgICAgICogIExvb3BiYWNrIGRvZXNuJ3QgaGF2ZSBhIEhXIGFkZHIsIHNvIHJldHVybiAwMDowMDowMDowMDowMDowMAogICAgICAgICAqLwogICAgICAgIG1lbXNldChFdGhlckFkZHIsIDAsIHNpemVvZihhcnBjb20uYWNfZW5hZGRyKSk7CgogICAgfSBlbHNlIHsKCiNpZiBkZWZpbmVkKG1pcHMpIHx8IGRlZmluZWQoaHB1eCkgfHwgZGVmaW5lZChvc2Y0KSB8fCBkZWZpbmVkKG9zZjMpCiAgICAgICAgbWVtY3B5KEV0aGVyQWRkciwgKGNoYXIgKikgYXJwY29tLmFjX2VuYWRkciwKICAgICAgICAgICAgICAgc2l6ZW9mKGFycGNvbS5hY19lbmFkZHIpKTsKI2Vsc2UKICAgICAgICBtZW1jcHkoRXRoZXJBZGRyLCAoY2hhciAqKSAmYXJwY29tLmFjX2VuYWRkciwKICAgICAgICAgICAgICAgc2l6ZW9mKGFycGNvbS5hY19lbmFkZHIpKTsKI2VuZGlmCgoKICAgIH0KICAgIHJldHVybiAoMCk7ICAgICAgICAgICAgICAgICAvKiBET05FICovCn0KCiNlbmRpZiAgICAgICAgICAgICAgICAgICAgICAgICAgLyogaHB1eDExICovCgojZWxzZSAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHNvbGFyaXMyICovCgppbnQKSW50ZXJmYWNlX1NjYW5fR2V0X0NvdW50KHZvaWQpCnsKICAgIGludCAgICAgICAgICAgICBpLCBzZDsKCiAgICBpZiAoKHNkID0gc29ja2V0KEFGX0lORVQsIFNPQ0tfREdSQU0sIDApKSA8IDApCiAgICAgICAgcmV0dXJuICgwKTsKICAgIGlmIChpb2N0bChzZCwgU0lPQ0dJRk5VTSwgJmkpID09IC0xKSB7CiAgICAgICAgY2xvc2Uoc2QpOwogICAgICAgIHJldHVybiAoMCk7CiAgICB9IGVsc2UgewogICAgICAgIGNsb3NlKHNkKTsKICAgICAgICByZXR1cm4gKGkpOwogICAgfQp9CgppbnQKSW50ZXJmYWNlX0luZGV4X0J5X05hbWUoY2hhciAqTmFtZSwgaW50IExlbikKewogICAgcmV0dXJuIChzb2xhcmlzMl9pZl9uYW1ldG9pbmRleChOYW1lLCBMZW4pKTsKfQoKI2VuZGlmICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBzb2xhcmlzMiAqLwoKI2Vsc2UgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBIQVZFX05FVF9JRl9NSUJfSCAqLwoKLyoKICogVGhpcyBjb2RlIGF0dGVtcHRzIHRvIGRvIHRoZSByaWdodCB0aGluZyBmb3IgRnJlZUJTRC4gIE5vdGUgdGhhdAogKiB0aGUgc3RhdGlzdGljcyBjb3VsZCBiZSBnYXRoZXJlZCB0aHJvdWdoIHVzZSBvZiBvZiB0aGUKICogbmV0LnJvdXRlLjAubGluay5pZmxpc3QuMCBzeXNjdGwgKHdoaWNoIHdlIGFscmVhZHkgdXNlIHRvIGdldCB0aGUKICogaGFyZHdhcmUgYWRkcmVzcyBvZiB0aGUgaW50ZXJmYWNlcyksIHJhdGhlciB0aGFuIHVzaW5nIHRoZSBpZm1pYgogKiBjb2RlLCBidXQgZXZlbnR1YWxseSBJIHdpbGwgaW1wbGVtZW50IGRvdDNTdGF0cyBhbmQgd2Ugd2lsbCBoYXZlIHRvCiAqIHVzZSB0aGUgaWZtaWIgaW50ZXJmYWNlLiAgaWZtaWIgaXMgYWxzbyBhIG11Y2ggbW9yZSBuYXR1cmFsIHdheSBvZgogKiBtYXBwaW5nIHRoZSBTTk1QIE1JQiBvbnRvIHN5c2N0bCgzKS4KICovCgojaW5jbHVkZSA8bmV0L2lmLmg+CiNpbmNsdWRlIDxuZXQvaWZfZGwuaD4KI2luY2x1ZGUgPG5ldC9pZl9taWIuaD4KI2luY2x1ZGUgPG5ldC9yb3V0ZS5oPgoKc3RhdGljIGludCAgICAgIGhlYWRlcl9pbnRlcmZhY2VzKHN0cnVjdCB2YXJpYWJsZSAqLCBvaWQgKiwgc2l6ZV90ICosIGludCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCAqLCBXcml0ZU1ldGhvZCAqKiB3cml0ZSk7CnN0YXRpYyBpbnQgICAgICBoZWFkZXJfaWZFbnRyeShzdHJ1Y3QgdmFyaWFibGUgKiwgb2lkICosIHNpemVfdCAqLCBpbnQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QgKiwgV3JpdGVNZXRob2QgKiogd3JpdGUpOwp1X2NoYXIgICAgICAgICAqdmFyX2lmRW50cnkoc3RydWN0IHZhcmlhYmxlICosIG9pZCAqLCBzaXplX3QgKiwgaW50LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90ICosIFdyaXRlTWV0aG9kICoqIHdyaXRlKTsKCnN0YXRpYyBjaGFyICAgICpwaHlzYWRkcmJ1ZjsKc3RhdGljIGludCAgICAgIG5waHlzYWRkcnM7CnN0cnVjdCBzb2NrYWRkcl9kbCAqKnBoeXNhZGRyczsKCnZvaWQKaW5pdF9pbnRlcmZhY2VzX3NldHVwKHZvaWQpCnsKICAgIGludCAgICAgICAgICAgICBuYWRkcnMsIGlsZW4sIGJpdDsKICAgIHN0YXRpYyBpbnQgICAgICBtaWJbNl0KICAgID0geyBDVExfTkVULCBQRl9ST1VURSwgMCwgQUZfTElOSywgTkVUX1JUX0lGTElTVCwgMCB9OwogICAgY2hhciAgICAgICAgICAgKmNwOwogICAgc2l6ZV90ICAgICAgICAgIGxlbjsKICAgIHN0cnVjdCBydF9tc2doZHIgKnJ0bTsKICAgIHN0cnVjdCBpZl9tc2doZHIgKmlmbTsKICAgIHN0cnVjdCBpZmFfbXNnaGRyICppZmFtOwogICAgc3RydWN0IHNvY2thZGRyICpzYTsKCiAgICBERUJVR01TR1RMKCgibWliSUk6ZnJlZWJzZCIsICJpbml0X2ludGVyZmFjZXNfc2V0dXBcbiIpKTsKCiAgICBuYWRkcnMgPSAwOwogICAgaWYgKHBoeXNhZGRycykKICAgICAgICBmcmVlKHBoeXNhZGRycyk7CiAgICBpZiAocGh5c2FkZHJidWYpCiAgICAgICAgZnJlZShwaHlzYWRkcmJ1Zik7CiAgICBwaHlzYWRkcmJ1ZiA9IDA7CiAgICBwaHlzYWRkcnMgPSAwOwogICAgbnBoeXNhZGRycyA9IDA7CiAgICBsZW4gPSAwOwogICAgaWYgKHN5c2N0bChtaWIsIDYsIDAsICZsZW4sIDAsIDApIDwgMCkgewogICAgICAgIERFQlVHTVNHVEwoKCJtaWJJSTpmcmVlYnNkIiwgInN5c2N0bCAxIDwgMFxuIikpOwogICAgICAgIHJldHVybjsKICAgIH0KCiAgICBjcCA9IHBoeXNhZGRyYnVmID0gbWFsbG9jKGxlbik7CiAgICBpZiAocGh5c2FkZHJidWYgPT0gMCkKICAgICAgICByZXR1cm47CiAgICBpZiAoc3lzY3RsKG1pYiwgNiwgcGh5c2FkZHJidWYsICZsZW4sIDAsIDApIDwgMCkgewogICAgICAgIGZyZWUocGh5c2FkZHJidWYpOwogICAgICAgIHBoeXNhZGRyYnVmID0gMDsKICAgICAgICBERUJVR01TR1RMKCgibWliSUk6ZnJlZWJzZCIsICJzeXNjdGwgMiA8IDBcbiIpKTsKICAgICAgICByZXR1cm47CiAgICB9CgogIGxvb3A6CiAgICBpbGVuID0gbGVuOwogICAgY3AgPSBwaHlzYWRkcmJ1ZjsKICAgIHdoaWxlIChpbGVuID4gMCkgewogICAgICAgIHJ0bSA9IChzdHJ1Y3QgcnRfbXNnaGRyICopIGNwOwogICAgICAgIGlmIChydG0tPnJ0bV92ZXJzaW9uICE9IFJUTV9WRVJTSU9OIHx8IHJ0bS0+cnRtX3R5cGUgIT0gUlRNX0lGSU5GTykgewogICAgICAgICAgICBERUJVR01TR1RMKCgibWliSUk6ZnJlZWJzZCIsICJ2ZXJzaW9uOiVkLyVkIHR5cGU6JWQvJWRcbiIsCiAgICAgICAgICAgICAgICAgICAgICAgIHJ0bS0+cnRtX3ZlcnNpb24sIFJUTV9WRVJTSU9OLCBydG0tPnJ0bV90eXBlLCBSVE1fSUZJTkZPKSk7CiAgICAgICAgICAgIGZyZWUocGh5c2FkZHJzKTsKICAgICAgICAgICAgcGh5c2FkZHJzID0gMDsKICAgICAgICAgICAgZnJlZShwaHlzYWRkcmJ1Zik7CiAgICAgICAgICAgIHBoeXNhZGRyYnVmID0gMDsKICAgICAgICB9CiAgICAgICAgaWZtID0gKHN0cnVjdCBpZl9tc2doZHIgKikgcnRtOwojaWYgZGVmaW5lZChmcmVlYnNkMykgfHwgZGVmaW5lZChmcmVlYnNkNCkgfHwgZGVmaW5lZChmcmVlYnNkNSkKICAgICAgICBpZiAocGh5c2FkZHJzICE9IDApCiAgICAgICAgICAgIHBoeXNhZGRyc1tuYWRkcnNdID0gKHZvaWQgKikgKGlmbSArIDEpOwogICAgICAgIG5hZGRycysrOwojZW5kaWYKICAgICAgICBpbGVuIC09IGlmbS0+aWZtX21zZ2xlbjsKICAgICAgICBjcCArPSBpZm0tPmlmbV9tc2dsZW47CiAgICAgICAgcnRtID0gKHN0cnVjdCBydF9tc2doZHIgKikgY3A7CiAgICAgICAgd2hpbGUgKGlsZW4gPiAwICYmIHJ0bS0+cnRtX3R5cGUgPT0gUlRNX05FV0FERFIpIHsKI2lmIGRlZmluZWQoZnJlZWJzZDMpIHx8IGRlZmluZWQoZnJlZWJzZDQpIHx8IGRlZmluZWQoZnJlZWJzZDUpCiAgICAgICAgICAgIGlsZW4gLT0gcnRtLT5ydG1fbXNnbGVuOwogICAgICAgICAgICBjcCArPSBydG0tPnJ0bV9tc2dsZW47CiNlbHNlCiAgICAgICAgICAgIGludCAgICAgICAgICAgICBpc19hbGlhcyA9IDA7CiAgICAgICAgICAgIGlmYW0gPSAoc3RydWN0IGlmYV9tc2doZHIgKikgcnRtOwogICAgICAgICAgICBpbGVuIC09IHNpemVvZigqaWZhbSk7CiAgICAgICAgICAgIGNwICs9IHNpemVvZigqaWZhbSk7CiAgICAgICAgICAgIHNhID0gKHN0cnVjdCBzb2NrYWRkciAqKSBjcDsKI2RlZmluZSBST1VORCh4KSAoKCh4KSArIHNpemVvZihsb25nKSAtIDEpICYgfnNpemVvZihsb25nKSkKICAgICAgICAgICAgZm9yIChiaXQgPSAxOyBiaXQgJiYgaWxlbiA+IDA7IGJpdCA8PD0gMSkgewogICAgICAgICAgICAgICAgaWYgKCEoaWZhbS0+aWZhbV9hZGRycyAmIGJpdCkpCiAgICAgICAgICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgICAgICAgICBpbGVuIC09IFJPVU5EKHNhLT5zYV9sZW4pOwogICAgICAgICAgICAgICAgY3AgKz0gUk9VTkQoc2EtPnNhX2xlbik7CgogICAgICAgICAgICAgICAgaWYgKGJpdCA9PSBSVEFfSUZBKSB7CiAgICAgICAgICAgICAgICAgICAgaWYgKHBoeXNhZGRycykKI2RlZmluZSBzYXRvc2RsKHNhKSAoKHN0cnVjdCBzb2NrYWRkcl9kbCAqKShzYSkpCiAgICAgICAgICAgICAgICAgICAgICAgIHBoeXNhZGRyc1tuYWRkcnMrK10KICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gc2F0b3NkbChzYSk7CiAgICAgICAgICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgICAgICAgICAgICBuYWRkcnMrKzsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIHNhID0gKHN0cnVjdCBzb2NrYWRkciAqKSBjcDsKICAgICAgICAgICAgfQojZW5kaWYKICAgICAgICAgICAgcnRtID0gKHN0cnVjdCBydF9tc2doZHIgKikgY3A7CiAgICAgICAgfQogICAgfQogICAgREVCVUdNU0dUTCgoIm1pYklJOmZyZWVic2QiLCAiZm91bmQgJWQgYWRkcnNcbiIsIG5hZGRycykpOwogICAgaWYgKHBoeXNhZGRycykgewogICAgICAgIG5waHlzYWRkcnMgPSBuYWRkcnM7CiAgICAgICAgcmV0dXJuOwogICAgfQogICAgcGh5c2FkZHJzID0gbWFsbG9jKG5hZGRycyAqIHNpemVvZigqcGh5c2FkZHJzKSk7CiAgICBpZiAocGh5c2FkZHJzID09IDApCiAgICAgICAgcmV0dXJuOwogICAgbmFkZHJzID0gMDsKICAgIGdvdG8gbG9vcDsKCn0KCnN0YXRpYyBpbnQKZ2V0X3BoeXNfYWRkcmVzcyhpbnQgaWluZGV4LCBjaGFyICoqYXAsIGludCAqbGVuKQp7CiAgICBpbnQgICAgICAgICAgICAgaTsKICAgIGludCAgICAgICAgICAgICBvbmNlID0gMTsKCiAgICBkbyB7CiAgICAgICAgZm9yIChpID0gMDsgaSA8IG5waHlzYWRkcnM7IGkrKykgewogICAgICAgICAgICBpZiAocGh5c2FkZHJzW2ldLT5zZGxfaW5kZXggPT0gaWluZGV4KQogICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgfQogICAgICAgIGlmIChpIDwgbnBoeXNhZGRycykKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgaW5pdF9pbnRlcmZhY2VzX3NldHVwKCk7CiAgICB9IHdoaWxlIChvbmNlLS0pOwoKICAgIERFQlVHTVNHVEwoKCJtaWJJSTpmcmVlYnNkIiwgImdldF9waHlzX2FkZHJlc3MgJWQvJWRcbiIsIGksIG5waHlzYWRkcnMpKTsKICAgIGlmIChpIDwgbnBoeXNhZGRycykgewogICAgICAgICphcCA9IExMQUREUihwaHlzYWRkcnNbaV0pOwogICAgICAgICpsZW4gPSBwaHlzYWRkcnNbaV0tPnNkbF9hbGVuOwogICAgICAgIHJldHVybiAwOwogICAgfQogICAgcmV0dXJuIC0xOwp9CgppbnQKSW50ZXJmYWNlX1NjYW5fR2V0X0NvdW50KHZvaWQpCnsKICAgIHN0YXRpYyBpbnQgICAgICBjb3VudF9vaWRbNV0gPSB7IENUTF9ORVQsIFBGX0xJTkssIE5FVExJTktfR0VORVJJQywKICAgICAgICBJRk1JQl9TWVNURU0sIElGTUlCX0lGQ09VTlQKICAgIH07CiAgICBzaXplX3QgICAgICAgICAgbGVuOwogICAgaW50ICAgICAgICAgICAgIGNvdW50OwoKICAgIGxlbiA9IHNpemVvZiBjb3VudDsKICAgIGlmIChzeXNjdGwoY291bnRfb2lkLCA1LCAmY291bnQsICZsZW4sICh2b2lkICopIDAsIChzaXplX3QpIDApIDwgMCkgewogICAgICAgIERFQlVHTVNHVEwoKCJtaWJJSTpmcmVlYnNkIiwgIkludGVyZmFjZV9TY2FuX0dldF9Db3VudCBlcnJcbiIpKTsKICAgICAgICByZXR1cm4gLTE7CiAgICB9CiAgICBERUJVR01TR1RMKCgibWliSUk6ZnJlZWJzZCIsICJJbnRlcmZhY2VfU2Nhbl9HZXRfQ291bnQgJWRcbiIsIGNvdW50KSk7CiAgICByZXR1cm4gY291bnQ7Cn0KCgp1X2NoYXIgICAgICAgICAqCnZhcl9pZkVudHJ5KHN0cnVjdCB2YXJpYWJsZSAqIHZwLAogICAgICAgICAgICBvaWQgKiBuYW1lLAogICAgICAgICAgICBzaXplX3QgKiBsZW5ndGgsCiAgICAgICAgICAgIGludCBleGFjdCwgc2l6ZV90ICogdmFyX2xlbiwgV3JpdGVNZXRob2QgKiogd3JpdGVfbWV0aG9kKQp7CiAgICBpbnQgICAgICAgICAgICAgaW50ZXJmYWNlOwogICAgc3RhdGljIGludCAgICAgIHNuYW1lWzZdID0geyBDVExfTkVULCBQRl9MSU5LLCBORVRMSU5LX0dFTkVSSUMsCiAgICAgICAgSUZNSUJfSUZEQVRBLCAwLCBJRkRBVEFfR0VORVJBTAogICAgfTsKICAgIHN0YXRpYyBzdHJ1Y3QgaWZtaWJkYXRhIGlmbWQ7CiAgICBzaXplX3QgICAgICAgICAgbGVuOwogICAgY2hhciAgICAgICAgICAgKmNwOwogICAgY29uZl9pZl9saXN0ICAgKmlmX3B0ciA9IE5VTEw7CgogICAgaW50ZXJmYWNlID0gaGVhZGVyX2lmRW50cnkodnAsIG5hbWUsIGxlbmd0aCwgZXhhY3QsIHZhcl9sZW4sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3cml0ZV9tZXRob2QpOwogICAgaWYgKGludGVyZmFjZSA9PSBNQVRDSF9GQUlMRUQpCiAgICAgICAgcmV0dXJuIE5VTEw7CgogICAgc25hbWVbNF0gPSBpbnRlcmZhY2U7CiAgICBsZW4gPSBzaXplb2YgaWZtZDsKICAgIGlmIChzeXNjdGwoc25hbWUsIDYsICZpZm1kLCAmbGVuLCAwLCAwKSA8IDApIHsKICAgICAgICBERUJVR01TR1RMKCgibWliSUk6ZnJlZWJzZCIsICJ2YXJfaWZFbnRyeSBzeXNjdGwgZXJyXG4iKSk7CiAgICAgICAgcmV0dXJuIE5VTEw7CiAgICB9CiAgICAvKgogICAgICogaG1tbS4uIHdoZXJlIHRvIGdldCB0aGUgaW50ZXJmYWNlIG5hbWUgdG8gY2hlY2sgb3ZlcnJpZGVzPwogICAgICoKICAgICAqIGlmX3B0ciA9IG5ldHNubXBfYWNjZXNzX2ludGVyZmFjZV9lbnRyeV9vdmVycmlkZXNfZ2V0KE5hbWUpOwogICAgICovCgogICAgc3dpdGNoICh2cC0+bWFnaWMpIHsKICAgIGNhc2UgSUZJTkRFWDoKICAgICAgICBsb25nX3JldHVybiA9IGludGVyZmFjZTsKICAgICAgICByZXR1cm4gKHVfY2hhciAqKSAmIGxvbmdfcmV0dXJuOwogICAgY2FzZSBJRkRFU0NSOgogICAgICAgIGNwID0gaWZtZC5pZm1kX25hbWU7CiAgICAgICAgKnZhcl9sZW4gPSBzdHJsZW4oY3ApOwogICAgICAgIHJldHVybiAodV9jaGFyICopIGNwOwogICAgY2FzZSBORVRTTk1QX0lGVFlQRToKICAgICAgICBpZiAoaWZfcHRyKQogICAgICAgICAgICBsb25nX3JldHVybiA9IGlmX3B0ci0+dHlwZTsKICAgICAgICBlbHNlCiAgICAgICAgbG9uZ19yZXR1cm4gPSBpZm1kLmlmbWRfZGF0YS5pZmlfdHlwZTsKICAgICAgICByZXR1cm4gKHVfY2hhciAqKSAmIGxvbmdfcmV0dXJuOwogICAgY2FzZSBJRk1UVToKICAgICAgICBsb25nX3JldHVybiA9IChsb25nKSBpZm1kLmlmbWRfZGF0YS5pZmlfbXR1OwogICAgICAgIHJldHVybiAodV9jaGFyICopICYgbG9uZ19yZXR1cm47CiAgICBjYXNlIElGU1BFRUQ6CiAgICAgICAgaWYgKGlmX3B0cikKICAgICAgICAgICAgbG9uZ19yZXR1cm4gPSBpZl9wdHItPnNwZWVkOwogICAgICAgIGVsc2UKICAgICAgICBsb25nX3JldHVybiA9IGlmbWQuaWZtZF9kYXRhLmlmaV9iYXVkcmF0ZTsKICAgICAgICByZXR1cm4gKHVfY2hhciAqKSAmIGxvbmdfcmV0dXJuOwogICAgY2FzZSBJRlBIWVNBRERSRVNTOgogICAgICAgIHsKICAgICAgICAgICAgY2hhciAgICAgICAgICAgKmNwOwogICAgICAgICAgICBpZiAoZ2V0X3BoeXNfYWRkcmVzcyhpbnRlcmZhY2UsICZjcCwgdmFyX2xlbikpCiAgICAgICAgICAgICAgICByZXR1cm4gTlVMTDsKICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgICAgcmV0dXJuIGNwOwogICAgICAgIH0KICAgIGNhc2UgSUZBRE1JTlNUQVRVUzoKICAgICAgICBsb25nX3JldHVybiA9IGlmbWQuaWZtZF9mbGFncyAmIElGRl9VUCA/IDEgOiAyOwogICAgICAgIHJldHVybiAodV9jaGFyICopICYgbG9uZ19yZXR1cm47CiAgICBjYXNlIElGT1BFUlNUQVRVUzoKICAgICAgICBsb25nX3JldHVybiA9IGlmbWQuaWZtZF9mbGFncyAmIElGRl9SVU5OSU5HID8gMSA6IDI7CiAgICAgICAgcmV0dXJuICh1X2NoYXIgKikgJiBsb25nX3JldHVybjsKICAgIGNhc2UgSUZMQVNUQ0hBTkdFOgogICAgICAgIGlmIChpZm1kLmlmbWRfZGF0YS5pZmlfbGFzdGNoYW5nZS50dl9zZWMgPT0gMCAmJgogICAgICAgICAgICBpZm1kLmlmbWRfZGF0YS5pZmlfbGFzdGNoYW5nZS50dl91c2VjID09IDApIHsKICAgICAgICAgICAgbG9uZ19yZXR1cm4gPSAwOwogICAgICAgIH0gZWxzZSBpZiAoaWZtZC5pZm1kX2RhdGEuaWZpX2xhc3RjaGFuZ2UudHZfc2VjIDwgc3RhcnR0aW1lLnR2X3NlYykgewogICAgICAgICAgICBsb25nX3JldHVybiA9IDA7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgbG9uZ19yZXR1cm4gPSAodV9sb25nKQogICAgICAgICAgICAgICAgKChpZm1kLmlmbWRfZGF0YS5pZmlfbGFzdGNoYW5nZS50dl9zZWMgLQogICAgICAgICAgICAgICAgICBzdGFydHRpbWUudHZfc2VjKSAqIDEwMCArCiAgICAgICAgICAgICAgICAgKChpZm1kLmlmbWRfZGF0YS5pZmlfbGFzdGNoYW5nZS50dl91c2VjIC0KICAgICAgICAgICAgICAgICAgIHN0YXJ0dGltZS50dl91c2VjKSAvIDEwMDAwKSk7CiAgICAgICAgfQogICAgICAgIHJldHVybiAodV9jaGFyICopICYgbG9uZ19yZXR1cm47CiAgICBjYXNlIElGSU5PQ1RFVFM6CiAgICAgICAgbG9uZ19yZXR1cm4gPSAodV9sb25nKSBpZm1kLmlmbWRfZGF0YS5pZmlfaWJ5dGVzOwogICAgICAgIHJldHVybiAodV9jaGFyICopICYgbG9uZ19yZXR1cm47CiAgICBjYXNlIElGSU5VQ0FTVFBLVFM6CiAgICAgICAgbG9uZ19yZXR1cm4gPSAodV9sb25nKSBpZm1kLmlmbWRfZGF0YS5pZmlfaXBhY2tldHM7CiAgICAgICAgbG9uZ19yZXR1cm4gLT0gKHVfbG9uZykgaWZtZC5pZm1kX2RhdGEuaWZpX2ltY2FzdHM7CiAgICAgICAgcmV0dXJuICh1X2NoYXIgKikgJiBsb25nX3JldHVybjsKICAgIGNhc2UgSUZJTk5VQ0FTVFBLVFM6CiAgICAgICAgbG9uZ19yZXR1cm4gPSAodV9sb25nKSBpZm1kLmlmbWRfZGF0YS5pZmlfaW1jYXN0czsKICAgICAgICByZXR1cm4gKHVfY2hhciAqKSAmIGxvbmdfcmV0dXJuOwogICAgY2FzZSBJRklORElTQ0FSRFM6CiAgICAgICAgbG9uZ19yZXR1cm4gPSAodV9sb25nKSBpZm1kLmlmbWRfZGF0YS5pZmlfaXFkcm9wczsKICAgICAgICByZXR1cm4gKHVfY2hhciAqKSAmIGxvbmdfcmV0dXJuOwogICAgY2FzZSBJRklORVJST1JTOgogICAgICAgIGxvbmdfcmV0dXJuID0gaWZtZC5pZm1kX2RhdGEuaWZpX2llcnJvcnM7CiAgICAgICAgcmV0dXJuICh1X2NoYXIgKikgJiBsb25nX3JldHVybjsKICAgIGNhc2UgSUZJTlVOS05PV05QUk9UT1M6CiAgICAgICAgbG9uZ19yZXR1cm4gPSAodV9sb25nKSBpZm1kLmlmbWRfZGF0YS5pZmlfbm9wcm90bzsKICAgICAgICByZXR1cm4gKHVfY2hhciAqKSAmIGxvbmdfcmV0dXJuOwogICAgY2FzZSBJRk9VVE9DVEVUUzoKICAgICAgICBsb25nX3JldHVybiA9ICh1X2xvbmcpIGlmbWQuaWZtZF9kYXRhLmlmaV9vYnl0ZXM7CiAgICAgICAgcmV0dXJuICh1X2NoYXIgKikgJiBsb25nX3JldHVybjsKICAgIGNhc2UgSUZPVVRVQ0FTVFBLVFM6CiAgICAgICAgbG9uZ19yZXR1cm4gPSAodV9sb25nKSBpZm1kLmlmbWRfZGF0YS5pZmlfb3BhY2tldHM7CiAgICAgICAgbG9uZ19yZXR1cm4gLT0gKHVfbG9uZykgaWZtZC5pZm1kX2RhdGEuaWZpX29tY2FzdHM7CiAgICAgICAgcmV0dXJuICh1X2NoYXIgKikgJiBsb25nX3JldHVybjsKICAgIGNhc2UgSUZPVVROVUNBU1RQS1RTOgogICAgICAgIGxvbmdfcmV0dXJuID0gKHVfbG9uZykgaWZtZC5pZm1kX2RhdGEuaWZpX29tY2FzdHM7CiAgICAgICAgcmV0dXJuICh1X2NoYXIgKikgJiBsb25nX3JldHVybjsKICAgIGNhc2UgSUZPVVRESVNDQVJEUzoKICAgICAgICBsb25nX3JldHVybiA9IGlmbWQuaWZtZF9zbmRfZHJvcHM7CiAgICAgICAgcmV0dXJuICh1X2NoYXIgKikgJiBsb25nX3JldHVybjsKICAgIGNhc2UgSUZPVVRFUlJPUlM6CiAgICAgICAgbG9uZ19yZXR1cm4gPSBpZm1kLmlmbWRfZGF0YS5pZmlfb2Vycm9yczsKICAgICAgICByZXR1cm4gKHVfY2hhciAqKSAmIGxvbmdfcmV0dXJuOwogICAgY2FzZSBJRk9VVFFMRU46CiAgICAgICAgbG9uZ19yZXR1cm4gPSBpZm1kLmlmbWRfc25kX2xlbjsKICAgICAgICByZXR1cm4gKHVfY2hhciAqKSAmIGxvbmdfcmV0dXJuOwogICAgY2FzZSBJRlNQRUNJRklDOgogICAgICAgICp2YXJfbGVuID0gbnVsbE9pZExlbjsKICAgICAgICByZXR1cm4gKHVfY2hhciAqKSBudWxsT2lkOwogICAgZGVmYXVsdDoKICAgICAgICBERUJVR01TR1RMKCgic25tcGQiLCAidW5rbm93biBzdWItaWQgJWQgaW4gdmFyX2lmRW50cnlcbiIsCiAgICAgICAgICAgICAgICAgICAgdnAtPm1hZ2ljKSk7CiAgICB9CiAgICByZXR1cm4gTlVMTDsKfQoKI2VuZGlmICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBIQVZFX05FVF9JRl9NSUJfSCAqLwojZW5kaWYgICAgICAgICAgICAgICAgICAgICAgICAgIC8qICFVU0VfU1lTQ1RMX0lGTElTVCAqLwoKI2Vsc2UgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBXSU4zMiBjeWd3aW4gKi8KI2luY2x1ZGUgPGlwaGxwYXBpLmg+CgpXcml0ZU1ldGhvZCAgICAgd3JpdGVJZkVudHJ5Owpsb25nICAgICAgICAgICAgYWRtaW5fc3RhdHVzID0gMDsKbG9uZyAgICAgICAgICAgIG9sZGFkbWluX3N0YXR1cyA9IDA7CgpzdGF0aWMgaW50CmhlYWRlcl9pZkVudHJ5KHN0cnVjdCB2YXJpYWJsZSAqdnAsCiAgICAgICAgICAgICAgIG9pZCAqIG5hbWUsCiAgICAgICAgICAgICAgIHNpemVfdCAqIGxlbmd0aCwKICAgICAgICAgICAgICAgaW50IGV4YWN0LCBzaXplX3QgKiB2YXJfbGVuLCBXcml0ZU1ldGhvZCAqKiB3cml0ZV9tZXRob2QpCnsKI2RlZmluZSBJRkVOVFJZX05BTUVfTEVOR1RICTEwCiAgICBvaWQgICAgICAgICAgICAgbmV3bmFtZVtNQVhfT0lEX0xFTl07CiAgICByZWdpc3RlciBpbnQgICAgaWZJbmRleDsKICAgIGludCAgICAgICAgICAgICByZXN1bHQsIGNvdW50OwogICAgRFdPUkQgICAgICAgICAgIHN0YXR1cyA9IE5PX0VSUk9SOwogICAgRFdPUkQgICAgICAgICAgIGR3QWN0dWFsU2l6ZSA9IDA7CiAgICBQTUlCX0lGVEFCTEUgICAgcElmVGFibGUgPSBOVUxMOwoKICAgIERFQlVHTVNHVEwoKCJtaWJJSS9pbnRlcmZhY2VzIiwgInZhcl9pZkVudHJ5OiAiKSk7CiAgICBERUJVR01TR09JRCgoIm1pYklJL2ludGVyZmFjZXMiLCBuYW1lLCAqbGVuZ3RoKSk7CiAgICBERUJVR01TRygoIm1pYklJL2ludGVyZmFjZXMiLCAiICVkXG4iLCBleGFjdCkpOwoKICAgIG1lbWNweSgoY2hhciAqKSBuZXduYW1lLCAoY2hhciAqKSB2cC0+bmFtZSwKICAgICAgICAgICAoaW50KSB2cC0+bmFtZWxlbiAqIHNpemVvZihvaWQpKTsKICAgIC8qCiAgICAgKiBmaW5kICJuZXh0IiBpZkluZGV4IAogICAgICovCgogICAgc3RhdHVzID0gR2V0SWZUYWJsZShwSWZUYWJsZSwgJmR3QWN0dWFsU2l6ZSwgVFJVRSk7CiAgICBpZiAoc3RhdHVzID09IEVSUk9SX0lOU1VGRklDSUVOVF9CVUZGRVIpIHsKICAgICAgICBwSWZUYWJsZSA9IG1hbGxvYyhkd0FjdHVhbFNpemUpOwogICAgICAgIGlmIChwSWZUYWJsZSkKICAgICAgICAgICAgR2V0SWZUYWJsZShwSWZUYWJsZSwgJmR3QWN0dWFsU2l6ZSwgVFJVRSk7CiAgICB9CiAgICBjb3VudCA9IHBJZlRhYmxlLT5kd051bUVudHJpZXM7CiAgICBmb3IgKGlmSW5kZXggPSAwOyBpZkluZGV4IDwgY291bnQ7IGlmSW5kZXgrKykgewogICAgICAgIG5ld25hbWVbSUZFTlRSWV9OQU1FX0xFTkdUSF0gPQogICAgICAgICAgICAob2lkKSBwSWZUYWJsZS0+dGFibGVbaWZJbmRleF0uZHdJbmRleDsKICAgICAgICByZXN1bHQgPQogICAgICAgICAgICBzbm1wX29pZF9jb21wYXJlKG5hbWUsICpsZW5ndGgsIG5ld25hbWUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGludCkgdnAtPm5hbWVsZW4gKyAxKTsKICAgICAgICBpZiAoKGV4YWN0ICYmIChyZXN1bHQgPT0gMCkpIHx8ICghZXhhY3QgJiYgKHJlc3VsdCA8IDApKSkKICAgICAgICAgICAgYnJlYWs7CiAgICB9CiAgICBpZiAoaWZJbmRleCA+PSBjb3VudCkgewogICAgICAgIERFQlVHTVNHVEwoKCJtaWJJSS9pbnRlcmZhY2VzIiwgIi4uLiBpbmRleCBvdXQgb2YgcmFuZ2VcbiIpKTsKICAgICAgICBjb3VudCA9IE1BVENIX0ZBSUxFRDsKICAgICAgICBnb3RvIG91dDsKICAgIH0KCiAgICBtZW1jcHkoKGNoYXIgKikgbmFtZSwgKGNoYXIgKikgbmV3bmFtZSwKICAgICAgICAgICAoKGludCkgdnAtPm5hbWVsZW4gKyAxKSAqIHNpemVvZihvaWQpKTsKICAgICpsZW5ndGggPSB2cC0+bmFtZWxlbiArIDE7CiAgICAqd3JpdGVfbWV0aG9kID0gMDsKICAgICp2YXJfbGVuID0gc2l6ZW9mKGxvbmcpOyAgICAvKiBkZWZhdWx0IHRvICdsb25nJyByZXN1bHRzICovCgogICAgREVCVUdNU0dUTCgoIm1pYklJL2ludGVyZmFjZXMiLCAiLi4uIGdldCBJL0Ygc3RhdHMgIikpOwogICAgREVCVUdNU0dPSUQoKCJtaWJJSS9pbnRlcmZhY2VzIiwgbmFtZSwgKmxlbmd0aCkpOwogICAgREVCVUdNU0coKCJtaWJJSS9pbnRlcmZhY2VzIiwgIlxuIikpOwoKICAgIGNvdW50ID0gcElmVGFibGUtPnRhYmxlW2lmSW5kZXhdLmR3SW5kZXg7Cm91dDoKICAgIGZyZWUocElmVGFibGUpOwogICAgcmV0dXJuIGNvdW50Owp9CgoKCnVfY2hhciAgICAgICAgICoKdmFyX2ludGVyZmFjZXMoc3RydWN0IHZhcmlhYmxlICogdnAsCiAgICAgICAgICAgICAgIG9pZCAqIG5hbWUsCiAgICAgICAgICAgICAgIHNpemVfdCAqIGxlbmd0aCwKICAgICAgICAgICAgICAgaW50IGV4YWN0LCBzaXplX3QgKiB2YXJfbGVuLCBXcml0ZU1ldGhvZCAqKiB3cml0ZV9tZXRob2QpCnsKICAgIGlmIChoZWFkZXJfZ2VuZXJpYyh2cCwgbmFtZSwgbGVuZ3RoLCBleGFjdCwgdmFyX2xlbiwgd3JpdGVfbWV0aG9kKSA9PQogICAgICAgIE1BVENIX0ZBSUxFRCkKICAgICAgICByZXR1cm4gTlVMTDsKCiAgICBzd2l0Y2ggKHZwLT5tYWdpYykgewogICAgY2FzZSBJRk5VTUJFUjoKICAgICAgICBuZXRzbm1wX2Fzc2VydChzaXplb2YoRFdPUkQpID09IHNpemVvZihsb25nX3JldHVybikpOwogICAgICAgIEdldE51bWJlck9mSW50ZXJmYWNlcygoRFdPUkQgKikgJmxvbmdfcmV0dXJuKTsKICAgICAgICByZXR1cm4gKHVfY2hhciAqKSAmIGxvbmdfcmV0dXJuOwogICAgZGVmYXVsdDoKICAgICAgICBERUJVR01TR1RMKCgic25tcGQiLCAidW5rbm93biBzdWItaWQgJWQgaW4gdmFyX2ludGVyZmFjZXNcbiIsCiAgICAgICAgICAgICAgICAgICAgdnAtPm1hZ2ljKSk7CiAgICB9CiAgICByZXR1cm4gTlVMTDsKfQoKdV9jaGFyICAgICAgICAgKgp2YXJfaWZFbnRyeShzdHJ1Y3QgdmFyaWFibGUgKiB2cCwKICAgICAgICAgICAgb2lkICogbmFtZSwKICAgICAgICAgICAgc2l6ZV90ICogbGVuZ3RoLAogICAgICAgICAgICBpbnQgZXhhY3QsIHNpemVfdCAqIHZhcl9sZW4sIFdyaXRlTWV0aG9kICoqIHdyaXRlX21ldGhvZCkKewogICAgaW50ICAgICAgICAgICAgIGlmSW5kZXg7CiAgICBzdGF0aWMgTUlCX0lGUk9XIGlmUm93OwogICAgY29uZl9pZl9saXN0ICAgKmlmX3B0ciA9IE5VTEw7CiAgICAKICAgIGlmSW5kZXggPQogICAgICAgIGhlYWRlcl9pZkVudHJ5KHZwLCBuYW1lLCBsZW5ndGgsIGV4YWN0LCB2YXJfbGVuLCB3cml0ZV9tZXRob2QpOwogICAgaWYgKGlmSW5kZXggPT0gTUFUQ0hfRkFJTEVEKQogICAgICAgIHJldHVybiBOVUxMOwogICAgLyoKICAgICAqIGhtbW0uLiB3aGVyZSB0byBnZXQgdGhlIGludGVyZmFjZSBuYW1lIHRvIGNoZWNrIG92ZXJyaWRlcz8KICAgICAqCiAgICAgKiBpZl9wdHIgPSBuZXRzbm1wX2FjY2Vzc19pbnRlcmZhY2VfZW50cnlfb3ZlcnJpZGVzX2dldChOYW1lKTsKICAgICAqLwoKICAgIC8qCiAgICAgKiBHZXQgdGhlIElmIFRhYmxlIFJvdyBieSBwYXNzaW5nIGluZGV4IGFzIGFyZ3VtZW50IAogICAgICovCiAgICBpZlJvdy5kd0luZGV4ID0gaWZJbmRleDsKICAgIGlmIChHZXRJZkVudHJ5KCZpZlJvdykgIT0gTk9fRVJST1IpCiAgICAgICAgcmV0dXJuIE5VTEw7CiAgICBzd2l0Y2ggKHZwLT5tYWdpYykgewogICAgY2FzZSBJRklOREVYOgogICAgICAgIGxvbmdfcmV0dXJuID0gaWZJbmRleDsKICAgICAgICByZXR1cm4gKHVfY2hhciAqKSAmIGxvbmdfcmV0dXJuOwogICAgY2FzZSBJRkRFU0NSOgogICAgICAgICp2YXJfbGVuID0gaWZSb3cuZHdEZXNjckxlbjsKICAgICAgICByZXR1cm4gKHVfY2hhciAqKSBpZlJvdy5iRGVzY3I7CiAgICBjYXNlIE5FVFNOTVBfSUZUWVBFOgogICAgICAgIGlmIChpZl9wdHIpCiAgICAgICAgICAgIGxvbmdfcmV0dXJuID0gaWZfcHRyLT50eXBlOwogICAgICAgIGVsc2UKICAgICAgICBsb25nX3JldHVybiA9IGlmUm93LmR3VHlwZTsKICAgICAgICByZXR1cm4gKHVfY2hhciAqKSAmIGxvbmdfcmV0dXJuOwogICAgY2FzZSBJRk1UVToKICAgICAgICBsb25nX3JldHVybiA9IChsb25nKSBpZlJvdy5kd010dTsKICAgICAgICByZXR1cm4gKHVfY2hhciAqKSAmIGxvbmdfcmV0dXJuOwogICAgY2FzZSBJRlNQRUVEOgogICAgICAgIGlmIChpZl9wdHIpCiAgICAgICAgICAgIGxvbmdfcmV0dXJuID0gaWZfcHRyLT5zcGVlZDsKICAgICAgICBlbHNlCiAgICAgICAgbG9uZ19yZXR1cm4gPSAobG9uZykgaWZSb3cuZHdTcGVlZDsKICAgICAgICByZXR1cm4gKHVfY2hhciAqKSAmIGxvbmdfcmV0dXJuOwogICAgY2FzZSBJRlBIWVNBRERSRVNTOgogICAgICAgICp2YXJfbGVuID0gaWZSb3cuZHdQaHlzQWRkckxlbjsKICAgICAgICBtZW1jcHkocmV0dXJuX2J1ZiwgaWZSb3cuYlBoeXNBZGRyLCAqdmFyX2xlbik7CiAgICAgICAgcmV0dXJuICh1X2NoYXIgKikgcmV0dXJuX2J1ZjsKICAgIGNhc2UgSUZBRE1JTlNUQVRVUzoKICAgICAgICBsb25nX3JldHVybiA9IGlmUm93LmR3QWRtaW5TdGF0dXM7CiAgICAgICAgYWRtaW5fc3RhdHVzID0gbG9uZ19yZXR1cm47CiAgICAgICAgKndyaXRlX21ldGhvZCA9IHdyaXRlSWZFbnRyeTsKICAgICAgICByZXR1cm4gKHVfY2hhciAqKSAmIGxvbmdfcmV0dXJuOwogICAgY2FzZSBJRk9QRVJTVEFUVVM6CiAgICAgICAgbG9uZ19yZXR1cm4gPQogICAgICAgICAgIChNSUJfSUZfT1BFUl9TVEFUVVNfT1BFUkFUSU9OQUwgPT0gaWZSb3cuZHdPcGVyU3RhdHVzKSA/IDEgOiAyOwogICAgICAgIHJldHVybiAodV9jaGFyICopICYgbG9uZ19yZXR1cm47CiAgICBjYXNlIElGTEFTVENIQU5HRToKICAgICAgICBsb25nX3JldHVybiA9IDAgLyogWFhYIG5vdCBhIFVOSVggZXBvY2hhbCB0aW1lIGlmUm93LmR3TGFzdENoYW5nZSAqLyA7CiAgICAgICAgcmV0dXJuICh1X2NoYXIgKikgJiBsb25nX3JldHVybjsKICAgIGNhc2UgSUZJTk9DVEVUUzoKICAgICAgICBsb25nX3JldHVybiA9IGlmUm93LmR3SW5PY3RldHM7CiAgICAgICAgcmV0dXJuICh1X2NoYXIgKikgJiBsb25nX3JldHVybjsKICAgIGNhc2UgSUZJTlVDQVNUUEtUUzoKICAgICAgICBsb25nX3JldHVybiA9IGlmUm93LmR3SW5VY2FzdFBrdHM7CiAgICAgICAgcmV0dXJuICh1X2NoYXIgKikgJiBsb25nX3JldHVybjsKICAgIGNhc2UgSUZJTk5VQ0FTVFBLVFM6CiAgICAgICAgbG9uZ19yZXR1cm4gPSBpZlJvdy5kd0luTlVjYXN0UGt0czsKICAgICAgICByZXR1cm4gKHVfY2hhciAqKSAmIGxvbmdfcmV0dXJuOwogICAgY2FzZSBJRklORElTQ0FSRFM6CiAgICAgICAgbG9uZ19yZXR1cm4gPSBpZlJvdy5kd0luRGlzY2FyZHM7CiAgICAgICAgcmV0dXJuICh1X2NoYXIgKikgJiBsb25nX3JldHVybjsKICAgIGNhc2UgSUZJTkVSUk9SUzoKICAgICAgICBsb25nX3JldHVybiA9IGlmUm93LmR3SW5FcnJvcnM7CiAgICAgICAgcmV0dXJuICh1X2NoYXIgKikgJiBsb25nX3JldHVybjsKICAgIGNhc2UgSUZJTlVOS05PV05QUk9UT1M6CiAgICAgICAgbG9uZ19yZXR1cm4gPSBpZlJvdy5kd0luVW5rbm93blByb3RvczsKICAgICAgICByZXR1cm4gKHVfY2hhciAqKSAmIGxvbmdfcmV0dXJuOwogICAgY2FzZSBJRk9VVE9DVEVUUzoKICAgICAgICBsb25nX3JldHVybiA9IGlmUm93LmR3T3V0T2N0ZXRzOwogICAgICAgIHJldHVybiAodV9jaGFyICopICYgbG9uZ19yZXR1cm47CiAgICBjYXNlIElGT1VUVUNBU1RQS1RTOgogICAgICAgIGxvbmdfcmV0dXJuID0gaWZSb3cuZHdPdXRVY2FzdFBrdHM7CiAgICAgICAgcmV0dXJuICh1X2NoYXIgKikgJiBsb25nX3JldHVybjsKICAgIGNhc2UgSUZPVVROVUNBU1RQS1RTOgogICAgICAgIGxvbmdfcmV0dXJuID0gaWZSb3cuZHdPdXROVWNhc3RQa3RzOwogICAgICAgIHJldHVybiAodV9jaGFyICopICYgbG9uZ19yZXR1cm47CiAgICBjYXNlIElGT1VURElTQ0FSRFM6CiAgICAgICAgbG9uZ19yZXR1cm4gPSBpZlJvdy5kd091dERpc2NhcmRzOwogICAgICAgIHJldHVybiAodV9jaGFyICopICYgbG9uZ19yZXR1cm47CiAgICBjYXNlIElGT1VURVJST1JTOgogICAgICAgIGxvbmdfcmV0dXJuID0gaWZSb3cuZHdPdXRFcnJvcnM7CiAgICAgICAgcmV0dXJuICh1X2NoYXIgKikgJiBsb25nX3JldHVybjsKICAgIGNhc2UgSUZPVVRRTEVOOgogICAgICAgIGxvbmdfcmV0dXJuID0gaWZSb3cuZHdPdXRRTGVuOwogICAgICAgIHJldHVybiAodV9jaGFyICopICYgbG9uZ19yZXR1cm47CiAgICBjYXNlIElGU1BFQ0lGSUM6CiAgICAgICAgKnZhcl9sZW4gPSBudWxsT2lkTGVuOwogICAgICAgIHJldHVybiAodV9jaGFyICopIG51bGxPaWQ7CiAgICBkZWZhdWx0OgogICAgICAgIERFQlVHTVNHVEwoKCJzbm1wZCIsICJ1bmtub3duIHN1Yi1pZCAlZCBpbiB2YXJfaWZFbnRyeVxuIiwKICAgICAgICAgICAgICAgICAgICB2cC0+bWFnaWMpKTsKICAgIH0KICAgIHJldHVybiBOVUxMOwp9CgoKaW50CndyaXRlSWZFbnRyeShpbnQgYWN0aW9uLAogICAgICAgICAgICAgdV9jaGFyICogdmFyX3ZhbCwKICAgICAgICAgICAgIHVfY2hhciB2YXJfdmFsX3R5cGUsCiAgICAgICAgICAgICBzaXplX3QgdmFyX3ZhbF9sZW4sCiAgICAgICAgICAgICB1X2NoYXIgKiBzdGF0UCwgb2lkICogbmFtZSwgc2l6ZV90IG5hbWVfbGVuKQp7CiAgICBNSUJfSUZST1cgICAgICAgaWZFbnRyeVJvdzsKICAgIGlmICgoY2hhcikgbmFtZVs5XSAhPSBJRkFETUlOU1RBVFVTKSB7CiAgICAgICAgcmV0dXJuIFNOTVBfRVJSX05PVFdSSVRBQkxFOwogICAgfQoKICAgIHN3aXRjaCAoYWN0aW9uKSB7CiAgICBjYXNlIFJFU0VSVkUxOiAgICAgICAgICAgICAvKiBDaGVjayB2YWx1ZXMgZm9yIGFjY2VwdGFiaWxpdHkgKi8KICAgICAgICBpZiAodmFyX3ZhbF90eXBlICE9IEFTTl9JTlRFR0VSKSB7CiAgICAgICAgICAgIHNubXBfbG9nKExPR19FUlIsICJub3QgaW50ZWdlclxuIik7CiAgICAgICAgICAgIHJldHVybiBTTk1QX0VSUl9XUk9OR1RZUEU7CiAgICAgICAgfQogICAgICAgIGlmICh2YXJfdmFsX2xlbiA+IHNpemVvZihpbnQpKSB7CiAgICAgICAgICAgIHNubXBfbG9nKExPR19FUlIsICJiYWQgbGVuZ3RoXG4iKTsKICAgICAgICAgICAgcmV0dXJuIFNOTVBfRVJSX1dST05HTEVOR1RIOwogICAgICAgIH0KCiAgICAgICAgLyoKICAgICAgICAgKiBUaGUgZHdBZG1pblN0YXR1cyBtZW1iZXIgY2FuIGJlIE1JQl9JRl9BRE1JTl9TVEFUVVNfVVAgb3IgTUlCX0lGX0FETUlOX1NUQVRVU19ET1dOIAogICAgICAgICAqLwogICAgICAgIGlmICghKCgoaW50KSAoKnZhcl92YWwpID09IE1JQl9JRl9BRE1JTl9TVEFUVVNfVVApIHx8CiAgICAgICAgICAgICAgKChpbnQpICgqdmFyX3ZhbCkgPT0gTUlCX0lGX0FETUlOX1NUQVRVU19ET1dOKSkpIHsKICAgICAgICAgICAgc25tcF9sb2coTE9HX0VSUiwgIm5vdCBzdXBwb3J0ZWQgYWRtaW4gc3RhdGVcbiIpOwogICAgICAgICAgICByZXR1cm4gU05NUF9FUlJfV1JPTkdWQUxVRTsKICAgICAgICB9CiAgICAgICAgYnJlYWs7CgogICAgY2FzZSBSRVNFUlZFMjogICAgICAgICAgICAgLyogQWxsb2NhdGUgbWVtb3J5IGFuZCBzaW1pbGFyIHJlc291cmNlcyAqLwogICAgICAgIGJyZWFrOwoKICAgIGNhc2UgQUNUSU9OOgogICAgICAgIC8qCiAgICAgICAgICogU2F2ZSB0aGUgb2xkIHZhbHVlLCBpbiBjYXNlIG9mIFVORE8gCiAgICAgICAgICovCgogICAgICAgIG9sZGFkbWluX3N0YXR1cyA9IGFkbWluX3N0YXR1czsKICAgICAgICBhZG1pbl9zdGF0dXMgPSAoaW50KSAqdmFyX3ZhbDsKICAgICAgICBicmVhazsKCiAgICBjYXNlIFVORE86ICAgICAgICAgICAgICAgICAvKiBSZXZlcnNlIHRoZSBTRVQgYWN0aW9uIGFuZCBmcmVlIHJlc291cmNlcyAqLwogICAgICAgIGFkbWluX3N0YXR1cyA9IG9sZGFkbWluX3N0YXR1czsKICAgICAgICBicmVhazsKCiAgICBjYXNlIENPTU1JVDogICAgICAgICAgICAgICAvKiBDb25maXJtIHRoZSBTRVQsIHBlcmZvcm1pbmcgYW55IGlycmV2ZXJzaWJsZSBhY3Rpb25zLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqIGFuZCBmcmVlIHJlc291cmNlcyAqLwogICAgICAgIGlmRW50cnlSb3cuZHdJbmRleCA9IChpbnQpIG5hbWVbMTBdOwogICAgICAgIGlmRW50cnlSb3cuZHdBZG1pblN0YXR1cyA9IGFkbWluX3N0YXR1czsKICAgICAgICAvKgogICAgICAgICAqIE9ubHkgVVAgYW5kIERPV04gc3RhdHVzIGFyZSBzdXBwb3J0ZWQuIFRoYXRzIHdoeSBkb25lIGluIENPTU1JVCAKICAgICAgICAgKi8KICAgICAgICBpZiAoU2V0SWZFbnRyeSgmaWZFbnRyeVJvdykgIT0gTk9fRVJST1IpIHsKICAgICAgICAgICAgc25tcF9sb2coTE9HX0VSUiwKICAgICAgICAgICAgICAgICAgICAgIkVycm9yIGluIHdyaXRlSWZFbnRyeSBjYXNlIENPTU1JVCB3aXRoIGluZGV4OiAlbHUgJiBhZG1pblN0YXR1cyAlbHVcbiIsCiAgICAgICAgICAgICAgICAgICAgIGlmRW50cnlSb3cuZHdJbmRleCwgaWZFbnRyeVJvdy5kd0FkbWluU3RhdHVzKTsKICAgICAgICAgICAgcmV0dXJuIFNOTVBfRVJSX0NPTU1JVEZBSUxFRDsKICAgICAgICB9CgogICAgY2FzZSBGUkVFOiAgICAgICAgICAgICAgICAgLyogRnJlZSBhbnkgcmVzb3VyY2VzIGFsbG9jYXRlZCAqLwogICAgICAgIC8qCiAgICAgICAgICogTm8gcmVzb3VyY2VzIGhhdmUgYmVlbiBhbGxvY2F0ZWQgCiAgICAgICAgICovCiAgICAgICAgYnJlYWs7CiAgICB9CiAgICByZXR1cm4gU05NUF9FUlJfTk9FUlJPUjsKfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBlbmQgb2Ygd3JpdGVJZkVudHJ5ICovCiNlbmRpZiAgICAgICAgICAgICAgICAgICAgICAgICAgLyogV0lOMzIgY3lnd2luICovCg==