LyoKICogYWdlbnRfcmVnaXN0cnkuYwogKi8KLyogUG9ydGlvbnMgb2YgdGhpcyBmaWxlIGFyZSBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29weXJpZ2h0KHMpLiAgU2VlCiAqIHRoZSBOZXQtU05NUCdzIENPUFlJTkcgZmlsZSBmb3IgbW9yZSBkZXRhaWxzIGFuZCBvdGhlciBjb3B5cmlnaHRzCiAqIHRoYXQgbWF5IGFwcGx5OgogKi8KLyoKICogUG9ydGlvbnMgb2YgdGhpcyBmaWxlIGFyZSBjb3B5cmlnaHRlZCBieToKICogQ29weXJpZ2h0IKkgMjAwMyBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAqIFVzZSBpcyBzdWJqZWN0IHRvIGxpY2Vuc2UgdGVybXMgc3BlY2lmaWVkIGluIHRoZSBDT1BZSU5HIGZpbGUKICogZGlzdHJpYnV0ZWQgd2l0aCB0aGUgTmV0LVNOTVAgcGFja2FnZS4KICovCi8qKiBAZGVmZ3JvdXAgYWdlbnRfcmVnaXN0cnkgUmVnaXN0cnkgb2YgTUlCIHN1YnRyZWVzLCBtb2R1bGVzLCBzZXNzaW9ucywgZXRjCiAqICAgICBNYWludGFpbiBhIHJlZ2lzdHJ5IG9mIE1JQiBzdWJ0cmVlcywgdG9nZXRoZXIgd2l0aCByZWxhdGVkIGluZm9ybWF0aW9uCiAqICAgICByZWdhcmRpbmcgTUlCIG1vZHVsZXMsIHNlc3Npb25zLCBldGMKICogICBAaW5ncm91cCBhZ2VudAogKgogKiBAewogKi8KCiNkZWZpbmUgSU5fU05NUF9WQVJTX0MKCiNpbmNsdWRlIDxuZXQtc25tcC9uZXQtc25tcC1jb25maWcuaD4KI2luY2x1ZGUgPG5ldC1zbm1wL25ldC1zbm1wLWZlYXR1cmVzLmg+CgojaW5jbHVkZSA8c2lnbmFsLmg+CiNpZiBIQVZFX1NUUklOR19ICiNpbmNsdWRlIDxzdHJpbmcuaD4KI2VuZGlmCiNpZiBIQVZFX1NURExJQl9ICiNpbmNsdWRlIDxzdGRsaWIuaD4KI2VuZGlmCiNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KI2luY2x1ZGUgPHN0ZGlvLmg+CiNpbmNsdWRlIDxmY250bC5oPgojaWYgVElNRV9XSVRIX1NZU19USU1FCiMgaW5jbHVkZSA8c3lzL3RpbWUuaD4KIyBpbmNsdWRlIDx0aW1lLmg+CiNlbHNlCiMgaWYgSEFWRV9TWVNfVElNRV9ICiMgIGluY2x1ZGUgPHN5cy90aW1lLmg+CiMgZWxzZQojICBpbmNsdWRlIDx0aW1lLmg+CiMgZW5kaWYKI2VuZGlmCiNpZiBIQVZFX05FVElORVRfSU5fSAojaW5jbHVkZSA8bmV0aW5ldC9pbi5oPgojZW5kaWYKCiNpbmNsdWRlIDxuZXQtc25tcC9uZXQtc25tcC1pbmNsdWRlcy5oPgojaW5jbHVkZSA8bmV0LXNubXAvbGlicmFyeS9zbm1wX2Fzc2VydC5oPgojaW5jbHVkZSA8bmV0LXNubXAvYWdlbnQvbmV0LXNubXAtYWdlbnQtaW5jbHVkZXMuaD4KI2luY2x1ZGUgPG5ldC1zbm1wL2FnZW50L2FnZW50X2NhbGxiYWNrcy5oPgoKI2luY2x1ZGUgInNubXBkLmgiCiNpbmNsdWRlICJtaWJncm91cC9zdHJ1Y3QuaCIKI2luY2x1ZGUgPG5ldC1zbm1wL2FnZW50L29sZF9hcGkuaD4KI2luY2x1ZGUgPG5ldC1zbm1wL2FnZW50L251bGwuaD4KI2luY2x1ZGUgPG5ldC1zbm1wL2FnZW50L3RhYmxlLmg+CiNpbmNsdWRlIDxuZXQtc25tcC9hZ2VudC90YWJsZV9pdGVyYXRvci5oPgojaW5jbHVkZSA8bmV0LXNubXAvYWdlbnQvYWdlbnRfcmVnaXN0cnkuaD4KCiNpZmRlZiBVU0lOR19BR0VOVFhfU1VCQUdFTlRfTU9EVUxFCiNpbmNsdWRlICJhZ2VudHgvc3ViYWdlbnQuaCIKI2luY2x1ZGUgImFnZW50eC9jbGllbnQuaCIKI2VuZGlmCgpuZXRzbm1wX2ZlYXR1cmVfY2hpbGRfb2YoYWdlbnRfcmVnaXN0cnlfYWxsLCBsaWJuZXRzbm1wYWdlbnQpCgpuZXRzbm1wX2ZlYXR1cmVfY2hpbGRfb2YodW5yZWdpc3Rlcl9taWJfdGFibGVfcm93LCBhZ2VudF9yZWdpc3RyeV9hbGwpCgovKiogQGRlZmdyb3VwIGFnZW50X2xvb2t1cF9jYWNoZSBMb29rdXAgY2FjaGUsIHN0b3JpbmcgdGhlIHJlZ2lzdGVyZWQgT0lEcy4KICogICAgIE1haW50YWluIHRoZSBjYWNoZSB1c2VkIGZvciBsb2NhdGluZyBzdWItdHJlZXMgYW5kIE9JRHMuCiAqICAgQGluZ3JvdXAgYWdlbnRfcmVnaXN0cnkKICoKICogQHsKICovCgovKiogIExvb2t1cCBjYWNoZSAtIGRlZmF1bHQgc2l6ZS4qLwojZGVmaW5lIFNVQlRSRUVfREVGQVVMVF9DQUNIRV9TSVpFIDgKLyoqICBMb29rdXAgY2FjaGUgLSBtYXggYWNjZXB0YWJsZSBzaXplLiovCiNkZWZpbmUgU1VCVFJFRV9NQVhfQ0FDSEVfU0laRSAgICAgMzIKaW50IGxvb2t1cF9jYWNoZV9zaXplID0gMDsgLyplbmFibGVkIGxhdGVyIGFmdGVyIHJlZ2lzdHJhdGlvbnMgYXJlIGxvYWRlZCAqLwoKdHlwZWRlZiBzdHJ1Y3QgbG9va3VwX2NhY2hlX3MgewogICBuZXRzbm1wX3N1YnRyZWUgKm5leHQ7CiAgIG5ldHNubXBfc3VidHJlZSAqcHJldmlvdXM7Cn0gbG9va3VwX2NhY2hlOwoKdHlwZWRlZiBzdHJ1Y3QgbG9va3VwX2NhY2hlX2NvbnRleHRfcyB7CiAgIGNoYXIgKmNvbnRleHQ7CiAgIHN0cnVjdCBsb29rdXBfY2FjaGVfY29udGV4dF9zICpuZXh0OwogICBpbnQgdGhlY2FjaGVjb3VudDsKICAgaW50IGN1cnJlbnRwb3M7CiAgIGxvb2t1cF9jYWNoZSBjYWNoZVtTVUJUUkVFX01BWF9DQUNIRV9TSVpFXTsKfSBsb29rdXBfY2FjaGVfY29udGV4dDsKCnN0YXRpYyBsb29rdXBfY2FjaGVfY29udGV4dCAqdGhlY29udGV4dGNhY2hlID0gTlVMTDsKCi8qKiBTZXQgdGhlIGxvb2t1cCBjYWNoZSBzaXplIGZvciBvcHRpbWl6ZWQgYWdlbnQgcmVnaXN0cmF0aW9uIHBlcmZvcm1hbmNlLgogKiBOb3RlIHRoYXQgaXQgaXMgb25seSB1c2VkIGJ5IG1hc3RlciBhZ2VudCAtIHN1Yi1hZ2VudCBkb2Vzbid0IG5lZWQgdGhlIGNhY2hlLgogKiBUaGUgcm91Z2ggZ3VpZGUgaXMgdGhhdCB0aGUgY2FjaGUgc2l6ZSBzaG91bGQgYmUgZXF1YWwgdG8gdGhlIG1heGltdW0KICogbnVtYmVyIG9mIHNpbXVsdGFuZW91cyBtYW5hZ2VycyB5b3UgZXhwZWN0IHRvIHRhbGsgdG8gdGhlIGFnZW50IChNKSB0aW1lcyA4MCUKICogKG9yIHNvLCBoZSBzYXlzIHJhbmRvbWx5KSB0aGUgYXZlcmFnZSBudW1iZXIgKE4pIG9mIHZhcmJpbmRzIHlvdQogKiBleHBlY3QgdG8gcmVjZWl2ZSBpbiBhIGdpdmVuIHJlcXVlc3QgZm9yIGEgbWFuYWdlci4gIGllLCBNIHRpbWVzIE4uCiAqIEJpZ2dlciBkb2VzIE5PVCBuZWNlc3NhcmlseSBtZWFuIGJldHRlci4gIENlcnRhaW5seSAxNiBzaG91bGQgYmUgYW4KICogdXBwZXIgbGltaXQuICAzMiBpcyB0aGUgaGFyZCBjb2RlZCBsaW1pdC4KICoKICogQHBhcmFtIG5ld3NpemUgc2V0IHRvIHRoZSBtYXhpbXVtIHNpemUgb2YgYSBjYWNoZSBmb3IgYSBnaXZlbgogKiBjb250ZXh0LiAgU2V0IHRvIDAgdG8gY29tcGxldGVseSBkaXNhYmxlIGNhY2hpbmcsIG9yIHRvIC0xIHRvIHNldAogKiB0byB0aGUgZGVmYXVsdCBjYWNoZSBzaXplICg4KSwgb3IgdG8gYSBudW1iZXIgb2YgeW91ciBjaG9zaW5nLiAgVGhlCiAqLwp2b2lkCm5ldHNubXBfc2V0X2xvb2t1cF9jYWNoZV9zaXplKGludCBuZXdzaXplKSB7CiAgICBpZiAobmV3c2l6ZSA8IDApCiAgICAgICAgbG9va3VwX2NhY2hlX3NpemUgPSBTVUJUUkVFX0RFRkFVTFRfQ0FDSEVfU0laRTsKICAgIGVsc2UgaWYgKG5ld3NpemUgPCBTVUJUUkVFX01BWF9DQUNIRV9TSVpFKQogICAgICAgIGxvb2t1cF9jYWNoZV9zaXplID0gbmV3c2l6ZTsKICAgIGVsc2UKICAgICAgICBsb29rdXBfY2FjaGVfc2l6ZSA9IFNVQlRSRUVfTUFYX0NBQ0hFX1NJWkU7Cn0KCi8qKiBSZXRyaWV2ZXMgdGhlIGN1cnJlbnQgdmFsdWUgb2YgdGhlIGxvb2t1cCBjYWNoZSBzaXplCiAqICBTaG91bGQgYmUgY2FsbGVkIGZyb20gbWFzdGVyIGFnZW50IG9ubHkgLSBzdWItYWdlbnQgZG9lc24ndCBuZWVkIHRoZSBjYWNoZS4KICoKICogIEByZXR1cm4gdGhlIGN1cnJlbnQgbG9va3VwIGNhY2hlIHNpemUKICovCmludApuZXRzbm1wX2dldF9sb29rdXBfY2FjaGVfc2l6ZSh2b2lkKSB7CiAgICByZXR1cm4gbG9va3VwX2NhY2hlX3NpemU7Cn0KCi8qKiBSZXR1cm5zIGxvb2t1cCBjYWNoZSBlbnRyeSBmb3IgdGhlIGNvbnRleHQgb2YgZ2l2ZW4gbmFtZS4KICoKICogIEBwYXJhbSBjb250ZXh0IE5hbWUgb2YgdGhlIGNvbnRleHQuIE5hbWUgaXMgY2FzZSBzZW5zaXRpdmUuCiAqCiAqICBAcmV0dXJuIHRoZSBsb29rdXAgY2FjaGUgY29udGV4dAogKi8KTkVUU05NUF9TVEFUSUNfSU5MSU5FIGxvb2t1cF9jYWNoZV9jb250ZXh0ICoKZ2V0X2NvbnRleHRfbG9va3VwX2NhY2hlKGNvbnN0IGNoYXIgKmNvbnRleHQpIHsKICAgIGxvb2t1cF9jYWNoZV9jb250ZXh0ICpwdHI7CiAgICBpZiAoIWNvbnRleHQpCiAgICAgICAgY29udGV4dCA9ICIiOwoKICAgIGZvcihwdHIgPSB0aGVjb250ZXh0Y2FjaGU7IHB0cjsgcHRyID0gcHRyLT5uZXh0KSB7CiAgICAgICAgaWYgKHN0cmNtcChwdHItPmNvbnRleHQsIGNvbnRleHQpID09IDApCiAgICAgICAgICAgIGJyZWFrOwogICAgfQogICAgaWYgKCFwdHIpIHsKICAgICAgICBpZiAobmV0c25tcF9zdWJ0cmVlX2ZpbmRfZmlyc3QoY29udGV4dCkpIHsKICAgICAgICAgICAgcHRyID0gU05NUF9NQUxMT0NfVFlQRURFRihsb29rdXBfY2FjaGVfY29udGV4dCk7CiAgICAgICAgICAgIHB0ci0+bmV4dCA9IHRoZWNvbnRleHRjYWNoZTsKICAgICAgICAgICAgcHRyLT5jb250ZXh0ID0gc3RyZHVwKGNvbnRleHQpOwogICAgICAgICAgICB0aGVjb250ZXh0Y2FjaGUgPSBwdHI7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgcmV0dXJuIE5VTEw7CiAgICAgICAgfQogICAgfQogICAgcmV0dXJuIHB0cjsKfQoKLyoqIEFkZHMgYW4gZW50cnkgdG8gdGhlIExvb2t1cCBDYWNoZSB1bmRlciBzcGVjaWZpZWQgY29udGV4dCBuYW1lLgogKgogKiAgQHBhcmFtIGNvbnRleHQgIE5hbWUgb2YgdGhlIGNvbnRleHQuIE5hbWUgaXMgY2FzZSBzZW5zaXRpdmUuCiAqCiAqICBAcGFyYW0gbmV4dCAgICAgTmV4dCBzdWJ0cmVlIGl0ZW0uCiAqCiAqICBAcGFyYW0gcHJldmlvdXMgUHJldmlvdXMgc3VidHJlZSBpdGVtLgogKi8KTkVUU05NUF9TVEFUSUNfSU5MSU5FIHZvaWQKbG9va3VwX2NhY2hlX2FkZChjb25zdCBjaGFyICpjb250ZXh0LAogICAgICAgICAgICAgICAgIG5ldHNubXBfc3VidHJlZSAqbmV4dCwgbmV0c25tcF9zdWJ0cmVlICpwcmV2aW91cykgewogICAgbG9va3VwX2NhY2hlX2NvbnRleHQgKmNwdHI7CgogICAgaWYgKChjcHRyID0gZ2V0X2NvbnRleHRfbG9va3VwX2NhY2hlKGNvbnRleHQpKSA9PSBOVUxMKQogICAgICAgIHJldHVybjsKCiAgICBpZiAoY3B0ci0+dGhlY2FjaGVjb3VudCA8IGxvb2t1cF9jYWNoZV9zaXplKQogICAgICAgIGNwdHItPnRoZWNhY2hlY291bnQrKzsKCiAgICBjcHRyLT5jYWNoZVtjcHRyLT5jdXJyZW50cG9zXS5uZXh0ID0gbmV4dDsKICAgIGNwdHItPmNhY2hlW2NwdHItPmN1cnJlbnRwb3NdLnByZXZpb3VzID0gcHJldmlvdXM7CgogICAgaWYgKCsrY3B0ci0+Y3VycmVudHBvcyA+PSBsb29rdXBfY2FjaGVfc2l6ZSkKICAgICAgICBjcHRyLT5jdXJyZW50cG9zID0gMDsKfQoKLyoqIEBwcml2YXRlCiAqICBSZXBsYWNlcyBuZXh0IGFuZCBwcmV2aW91cyBwb2ludGVyIGluIGdpdmVuIExvb2t1cCBDYWNoZS4KICoKICogIEBwYXJhbSBwdHIgICAgICBMb29rdXAgQ2FjaGUgcG9pbnRlci4KICoKICogIEBwYXJhbSBuZXh0ICAgICBOZXh0IHN1YnRyZWUgaXRlbS4KICoKICogIEBwYXJhbSBwcmV2aW91cyBQcmV2aW91cyBzdWJ0cmVlIGl0ZW0uCiAqLwpORVRTTk1QX1NUQVRJQ19JTkxJTkUgdm9pZApsb29rdXBfY2FjaGVfcmVwbGFjZShsb29rdXBfY2FjaGUgKnB0ciwKICAgICAgICAgICAgICAgICAgICAgbmV0c25tcF9zdWJ0cmVlICpuZXh0LCBuZXRzbm1wX3N1YnRyZWUgKnByZXZpb3VzKSB7CgogICAgcHRyLT5uZXh0ID0gbmV4dDsKICAgIHB0ci0+cHJldmlvdXMgPSBwcmV2aW91czsKfQoKLyoqIEZpbmRzIGFuIGVudHJ5IGluIHRoZSBMb29rdXAgQ2FjaGUuCiAqCiAqICBAcGFyYW0gY29udGV4dCAgQ2FzZSBzZW5zaXRpdmUgbmFtZSBvZiB0aGUgY29udGV4dC4KICoKICogIEBwYXJhbSBuYW1lICAgICBUaGUgT0lEIHdlJ3JlIHNlYXJjaGluZyBmb3IuCiAqCiAqICBAcGFyYW0gbmFtZV9sZW4gTnVtYmVyIG9mIHN1Yi1pZHMgKHNpbmdsZSBpbnRlZ2VycykgaW4gdGhlIE9JRC4KICoKICogIEBwYXJhbSByZXRjbXAgICBWYWx1ZSBzZXQgdG8gc25tcF9vaWRfY29tcGFyZSgpIGNhbGwgcmVzdWx0LgogKiAgICAgICAgICAgICAgICAgIFRoZSB2YWx1ZSwgaWYgc2V0LCBpcyBhbHdheXMgbm9ubmVnYXRpdmUuCiAqCiAqICBAcmV0dXJuIGdpdmVzIExvb2t1cCBDYWNoZSBlbnRyeSwgb3IgTlVMTCBpZiBub3QgZm91bmQuCiAqCiAqICBAc2VlIHNubXBfb2lkX2NvbXBhcmUoKQogKi8KTkVUU05NUF9TVEFUSUNfSU5MSU5FIGxvb2t1cF9jYWNoZSAqCmxvb2t1cF9jYWNoZV9maW5kKGNvbnN0IGNoYXIgKmNvbnRleHQsIGNvbnN0IG9pZCAqbmFtZSwgc2l6ZV90IG5hbWVfbGVuLAogICAgICAgICAgICAgICAgICBpbnQgKnJldGNtcCkgewogICAgbG9va3VwX2NhY2hlX2NvbnRleHQgKmNwdHI7CiAgICBsb29rdXBfY2FjaGUgKnJldCA9IE5VTEw7CiAgICBpbnQgY21wOwogICAgaW50IGk7CgogICAgaWYgKChjcHRyID0gZ2V0X2NvbnRleHRfbG9va3VwX2NhY2hlKGNvbnRleHQpKSA9PSBOVUxMKQogICAgICAgIHJldHVybiBOVUxMOwoKICAgIGZvcihpID0gMDsgaSA8IGNwdHItPnRoZWNhY2hlY291bnQgJiYgaSA8IGxvb2t1cF9jYWNoZV9zaXplOyBpKyspIHsKICAgICAgICBpZiAoY3B0ci0+Y2FjaGVbaV0ucHJldmlvdXMtPnN0YXJ0X2EpCiAgICAgICAgICAgIGNtcCA9IHNubXBfb2lkX2NvbXBhcmUobmFtZSwgbmFtZV9sZW4sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3B0ci0+Y2FjaGVbaV0ucHJldmlvdXMtPnN0YXJ0X2EsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3B0ci0+Y2FjaGVbaV0ucHJldmlvdXMtPnN0YXJ0X2xlbik7CiAgICAgICAgZWxzZQogICAgICAgICAgICBjbXAgPSAxOwogICAgICAgIGlmIChjbXAgPj0gMCkgewogICAgICAgICAgICAqcmV0Y21wID0gY21wOwogICAgICAgICAgICByZXQgPSAmKGNwdHItPmNhY2hlW2ldKTsKICAgICAgICB9CiAgICB9CiAgICByZXR1cm4gcmV0Owp9CgovKiogQHByaXZhdGUKICogIENsZWFycyBjYWNoZSBjb3VudCBhbmQgcG9zaXRpb24gaW4gTG9va3VwIENhY2hlLgogKi8KTkVUU05NUF9TVEFUSUNfSU5MSU5FIHZvaWQKaW52YWxpZGF0ZV9sb29rdXBfY2FjaGUoY29uc3QgY2hhciAqY29udGV4dCkgewogICAgbG9va3VwX2NhY2hlX2NvbnRleHQgKmNwdHI7CiAgICBpZiAoKGNwdHIgPSBnZXRfY29udGV4dF9sb29rdXBfY2FjaGUoY29udGV4dCkpICE9IE5VTEwpIHsKICAgICAgICBjcHRyLT50aGVjYWNoZWNvdW50ID0gMDsKICAgICAgICBjcHRyLT5jdXJyZW50cG9zID0gMDsKICAgIH0KfQoKdm9pZApjbGVhcl9sb29rdXBfY2FjaGUodm9pZCkgewoKICAgIGxvb2t1cF9jYWNoZV9jb250ZXh0ICpwdHIgPSBOVUxMLCAqbmV4dCA9IE5VTEw7CgogICAgcHRyID0gdGhlY29udGV4dGNhY2hlOwogICAgd2hpbGUgKHB0cikgewoJbmV4dCA9IHB0ci0+bmV4dDsKCVNOTVBfRlJFRShwdHItPmNvbnRleHQpOwoJU05NUF9GUkVFKHB0cik7CglwdHIgPSBuZXh0OwogICAgfQogICAgdGhlY29udGV4dGNhY2hlID0gTlVMTDsgLyogISEhICovCn0KCi8qKiAgQH0gKi8KLyogRW5kIG9mIExvb2t1cCBjYWNoZSBjb2RlICovCgovKiogQGRlZmdyb3VwIGFnZW50X2NvbnRleHRfY2FjaGUgQ29udGV4dCBjYWNoZSwgc3RvcmluZyB0aGUgT0lEcyB1bmRlciB0aGVpciBjb250ZXh0cy4KICogICAgIE1haW50YWluIHRoZSBjYWNoZSB1c2VkIGZvciBsb2NhdGluZyBzdWItdHJlZXMgcmVnaXN0ZXJlZCB1bmRlciBkaWZmZXJlbnQgY29udGV4dHMuCiAqICAgQGluZ3JvdXAgYWdlbnRfcmVnaXN0cnkKICoKICogQHsKICovCnN1YnRyZWVfY29udGV4dF9jYWNoZSAqY29udGV4dF9zdWJ0cmVlcyA9IE5VTEw7CgovKiogUmV0dXJucyB0aGUgdG9wIGVsZW1lbnQgb2YgY29udGV4dCBzdWJ0cmVlcyBjYWNoZS4KICogIFVzZSBpdCBpZiB5b3Ugd2lzaCB0byBzd2VlcCB0aHJvdWdoIHRoZSBjYWNoZSBlbGVtZW50cy4KICogIE5vdGUgdGhhdCB0aGUgcmV0dXJuIG1heSBiZSBOVUxMIChjYWNoZSBtYXkgYmUgZW1wdHkpLgogKgogKiAgQHJldHVybiBwb2ludGVyIHRvIHRvcG1vc3QgY29udGV4dCBzdWJ0cmVlIGNhY2hlIGVsZW1lbnQuCiAqLwpzdWJ0cmVlX2NvbnRleHRfY2FjaGUgKgpnZXRfdG9wX2NvbnRleHRfY2FjaGUodm9pZCkKewogICAgcmV0dXJuIGNvbnRleHRfc3VidHJlZXM7Cn0KCi8qKiBGaW5kcyB0aGUgZmlyc3Qgc3VidHJlZSByZWdpc3RlcmVkIHVuZGVyIGdpdmVuIGNvbnRleHQuCiAqCiAqICBAcGFyYW0gY29udGV4dF9uYW1lIFRleHQgbmFtZSBvZiB0aGUgY29udGV4dCB3ZSdyZSBzZWFyY2hpbmcgZm9yLgogKgogKiAgQHJldHVybiBwb2ludGVyIHRvIHRoZSBmaXJzdCBzdWJ0cmVlIGVsZW1lbnQsIG9yIE5VTEwgaWYgbm90IGZvdW5kLgogKi8KbmV0c25tcF9zdWJ0cmVlICoKbmV0c25tcF9zdWJ0cmVlX2ZpbmRfZmlyc3QoY29uc3QgY2hhciAqY29udGV4dF9uYW1lKQp7CiAgICBzdWJ0cmVlX2NvbnRleHRfY2FjaGUgKnB0cjsKCiAgICBpZiAoIWNvbnRleHRfbmFtZSkgewogICAgICAgIGNvbnRleHRfbmFtZSA9ICIiOwogICAgfQoKICAgIERFQlVHTVNHVEwoKCJzdWJ0cmVlIiwgImxvb2tpbmcgZm9yIHN1YnRyZWUgZm9yIGNvbnRleHQ6IFwiJXNcIlxuIiwgCgkJY29udGV4dF9uYW1lKSk7CiAgICBmb3IgKHB0ciA9IGNvbnRleHRfc3VidHJlZXM7IHB0ciAhPSBOVUxMOyBwdHIgPSBwdHItPm5leHQpIHsKICAgICAgICBpZiAocHRyLT5jb250ZXh0X25hbWUgIT0gTlVMTCAmJiAKCSAgICBzdHJjbXAocHRyLT5jb250ZXh0X25hbWUsIGNvbnRleHRfbmFtZSkgPT0gMCkgewogICAgICAgICAgICBERUJVR01TR1RMKCgic3VidHJlZSIsICJmb3VuZCBvbmUgZm9yOiBcIiVzXCJcbiIsIGNvbnRleHRfbmFtZSkpOwogICAgICAgICAgICByZXR1cm4gcHRyLT5maXJzdF9zdWJ0cmVlOwogICAgICAgIH0KICAgIH0KICAgIERFQlVHTVNHVEwoKCJzdWJ0cmVlIiwgImRpZG4ndCBmaW5kIGEgc3VidHJlZSBmb3IgY29udGV4dDogXCIlc1wiXG4iLCAKCQljb250ZXh0X25hbWUpKTsKICAgIHJldHVybiBOVUxMOwp9CgovKiogQWRkcyB0aGUgc3VidHJlZSB0byBDb250ZXh0IENhY2hlIHVuZGVyIGdpdmVuIGNvbnRleHQgbmFtZS4KICoKICogIEBwYXJhbSBjb250ZXh0X25hbWUgVGV4dCBuYW1lIG9mIHRoZSBjb250ZXh0IHdlJ3JlIGFkZGluZy4KICoKICogIEBwYXJhbSBuZXdfdHJlZSBUaGUgc3VidHJlZSB0byBiZSBhZGRlZC4KICoKICogIEByZXR1cm4gY29weSBvZiB0aGUgbmV3X3RyZWUgcG9pbnRlciwgb3IgTlVMTCBpZiBjYW5ub3QgYWRkLgogKi8KbmV0c25tcF9zdWJ0cmVlICoKYWRkX3N1YnRyZWUobmV0c25tcF9zdWJ0cmVlICpuZXdfdHJlZSwgY29uc3QgY2hhciAqY29udGV4dF9uYW1lKQp7CiAgICBzdWJ0cmVlX2NvbnRleHRfY2FjaGUgKnB0ciA9IFNOTVBfTUFMTE9DX1RZUEVERUYoc3VidHJlZV9jb250ZXh0X2NhY2hlKTsKICAgIAogICAgaWYgKCFjb250ZXh0X25hbWUpIHsKICAgICAgICBjb250ZXh0X25hbWUgPSAiIjsKICAgIH0KCiAgICBpZiAoIXB0cikgewogICAgICAgIHJldHVybiBOVUxMOwogICAgfQogICAgCiAgICBERUJVR01TR1RMKCgic3VidHJlZSIsICJhZGRpbmcgc3VidHJlZSBmb3IgY29udGV4dDogXCIlc1wiXG4iLAkKCQljb250ZXh0X25hbWUpKTsKCiAgICBwdHItPm5leHQgPSBjb250ZXh0X3N1YnRyZWVzOwogICAgcHRyLT5maXJzdF9zdWJ0cmVlID0gbmV3X3RyZWU7CiAgICBwdHItPmNvbnRleHRfbmFtZSA9IHN0cmR1cChjb250ZXh0X25hbWUpOwogICAgY29udGV4dF9zdWJ0cmVlcyA9IHB0cjsKCiAgICByZXR1cm4gcHRyLT5maXJzdF9zdWJ0cmVlOwp9Cgp2b2lkCm5ldHNubXBfcmVtb3ZlX3N1YnRyZWUobmV0c25tcF9zdWJ0cmVlICp0cmVlKQp7CiAgICBzdWJ0cmVlX2NvbnRleHRfY2FjaGUgKnB0cjsKCiAgICBpZiAoIXRyZWUtPnByZXYpIHsKICAgICAgICBmb3IgKHB0ciA9IGNvbnRleHRfc3VidHJlZXM7IHB0cjsgcHRyID0gcHRyLT5uZXh0KQogICAgICAgICAgICBpZiAocHRyLT5maXJzdF9zdWJ0cmVlID09IHRyZWUpCiAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICBuZXRzbm1wX2Fzc2VydChwdHIpOwogICAgICAgIGlmIChwdHIpCiAgICAgICAgICAgIHB0ci0+Zmlyc3Rfc3VidHJlZSA9IHRyZWUtPm5leHQ7CiAgICB9IGVsc2UKICAgICAgICB0cmVlLT5wcmV2LT5uZXh0ID0gdHJlZS0+bmV4dDsKCiAgICBpZiAodHJlZS0+bmV4dCkKICAgICAgICB0cmVlLT5uZXh0LT5wcmV2ID0gdHJlZS0+cHJldjsKfQoKLyoqIFJlcGxhY2VzIGZpcnN0IHN1YnRyZWUgcmVnaXN0ZXJlZCB1bmRlciBnaXZlbiBjb250ZXh0IG5hbWUuCiAqICBPdmVyd3JpdGVzIGEgc3VidHJlZSBwb2ludGVyIGluIENvbnRleHQgQ2FjaGUgZm9yIHRoZSBjb250ZXh0IG5hbWUuCiAqICBUaGUgcHJldmlvdXMgc3VidHJlZSBwb2ludGVyIGlzIGxvc3QuIElmIHRoZXJlJ3Mgbm8gc3VidHJlZQogKiAgdW5kZXIgdGhlIHN1cHBsaWVkIG5hbWUsIHRoZW4gYSBuZXcgY2FjaGUgaXRlbSBpcyBjcmVhdGVkLgogKgogKiAgQHBhcmFtIG5ld190cmVlICAgICBUaGUgbmV3IHN1YnRyZWUgdG8gYmUgc2V0LgogKgogKiAgQHBhcmFtIGNvbnRleHRfbmFtZSBUZXh0IG5hbWUgb2YgdGhlIGNvbnRleHQgd2UncmUgcmVwbGFjaW5nLgogKiAgICAgICAgICAgICAgICAgICAgICBJdCBpcyBjYXNlIHNlbnNpdGl2ZS4KICoKICogQHJldHVybiBjb3B5IG9mIHRoZSBuZXdfdHJlZSBwb2ludGVyLCBvciBOVUxMIG9uIGVycm9yLgogKi8KbmV0c25tcF9zdWJ0cmVlICoKbmV0c25tcF9zdWJ0cmVlX3JlcGxhY2VfZmlyc3QobmV0c25tcF9zdWJ0cmVlICpuZXdfdHJlZSwgCgkJCSAgICAgIGNvbnN0IGNoYXIgKmNvbnRleHRfbmFtZSkKewogICAgc3VidHJlZV9jb250ZXh0X2NhY2hlICpwdHI7CiAgICBpZiAoIWNvbnRleHRfbmFtZSkgewogICAgICAgIGNvbnRleHRfbmFtZSA9ICIiOwogICAgfQogICAgZm9yIChwdHIgPSBjb250ZXh0X3N1YnRyZWVzOyBwdHIgIT0gTlVMTDsgcHRyID0gcHRyLT5uZXh0KSB7CiAgICAgICAgaWYgKHB0ci0+Y29udGV4dF9uYW1lICE9IE5VTEwgJiYKCSAgICBzdHJjbXAocHRyLT5jb250ZXh0X25hbWUsIGNvbnRleHRfbmFtZSkgPT0gMCkgewogICAgICAgICAgICBwdHItPmZpcnN0X3N1YnRyZWUgPSBuZXdfdHJlZTsKICAgICAgICAgICAgcmV0dXJuIHB0ci0+Zmlyc3Rfc3VidHJlZTsKICAgICAgICB9CiAgICB9CiAgICByZXR1cm4gYWRkX3N1YnRyZWUobmV3X3RyZWUsIGNvbnRleHRfbmFtZSk7Cn0KCgp2b2lkIGNsZWFyX3N1YnRyZWUgKG5ldHNubXBfc3VidHJlZSAqc3ViKTsKCi8qKiBDb21wbGV0ZWx5IGNsZWFycyBib3RoIHRoZSBDb250ZXh0IGNhY2hlIGFuZCB0aGUgTG9va3VwIGNhY2hlLgogKi8Kdm9pZApjbGVhcl9jb250ZXh0KHZvaWQpIHsKCiAgICBzdWJ0cmVlX2NvbnRleHRfY2FjaGUgKnB0ciA9IE5VTEwsICpuZXh0ID0gTlVMTDsKICAgIG5ldHNubXBfc3VidHJlZSAqdCwgKnU7CgogICAgREVCVUdNU0dUTCgoImFnZW50X3JlZ2lzdHJ5IiwgImNsZWFyIGNvbnRleHRcbiIpKTsKCiAgICBwdHIgPSBnZXRfdG9wX2NvbnRleHRfY2FjaGUoKTsgCiAgICB3aGlsZSAocHRyKSB7CgluZXh0ID0gcHRyLT5uZXh0OwoKCWZvciAodCA9IHB0ci0+Zmlyc3Rfc3VidHJlZTsgdDsgdCA9IHUpIHsKICAgICAgICAgICAgdSA9IHQtPm5leHQ7CgkgICAgY2xlYXJfc3VidHJlZSh0KTsKCX0KCiAgICAgICAgZnJlZShORVRTTk1QX1JFTU9WRV9DT05TVChjaGFyKiwgcHRyLT5jb250ZXh0X25hbWUpKTsKICAgICAgICBTTk1QX0ZSRUUocHRyKTsKCglwdHIgPSBuZXh0OwogICAgfQogICAgY29udGV4dF9zdWJ0cmVlcyA9IE5VTEw7IC8qICEhISAqLwogICAgY2xlYXJfbG9va3VwX2NhY2hlKCk7Cn0KCi8qKiAgQH0gKi8KLyogRW5kIG9mIENvbnRleHQgY2FjaGUgY29kZSAqLwoKLyoqIEBkZWZncm91cCBhZ2VudF9taWJfc3VidHJlZSBNYWludGFpbmluZyBNSUIgc3VidHJlZXMuCiAqICAgICBNYWludGFpbmluZyBNSUIgbm9kZXMgYW5kIHN1YnRyZWVzLgogKiAgIEBpbmdyb3VwIGFnZW50X3JlZ2lzdHJ5CiAqCiAqIEB7CiAqLwoKc3RhdGljIHZvaWQgcmVnaXN0ZXJfbWliX2RldGFjaF9ub2RlKG5ldHNubXBfc3VidHJlZSAqcyk7CgovKiogRnJlZXMgc2luZ2xlIHN1YnRyZWUgaXRlbS4KICogIERlYWxsb2NhdGVkIG1lbW9yeSBmb3IgZ2l2ZW4gbmV0c25tcF9zdWJ0cmVlIGl0ZW0sIGluY2x1ZGluZwogKiAgSGFuZGxlIFJlZ2lzdHJhdGlvbiBzdHJ1Y3R1cmUgc3RvcmVkIGluc2lkZSB0aGlzIGl0ZW0uCiAqICBBZnRlciBjYWxsaW5nIHRoaXMgZnVuY3Rpb24sIHRoZSBwb2ludGVyIGlzIGludmFsaWQKICogIGFuZCBzaG91bGQgYmUgc2V0IHRvIE5VTEwuCiAqCiAqICBAcGFyYW0gYSBUaGUgc3VidHJlZSBpdGVtIHRvIGRpc3Bvc2UuCiAqLwp2b2lkCm5ldHNubXBfc3VidHJlZV9mcmVlKG5ldHNubXBfc3VidHJlZSAqYSkKewogIGlmIChhICE9IE5VTEwpIHsKICAgIGlmIChhLT52YXJpYWJsZXMgIT0gTlVMTCAmJiBuZXRzbm1wX29pZF9lcXVhbHMoYS0+bmFtZV9hLCBhLT5uYW1lbGVuLCAKCQkJCQkgICAgIGEtPnN0YXJ0X2EsIGEtPnN0YXJ0X2xlbikgPT0gMCkgewogICAgICBTTk1QX0ZSRUUoYS0+dmFyaWFibGVzKTsKICAgIH0KICAgIFNOTVBfRlJFRShhLT5uYW1lX2EpOwogICAgYS0+bmFtZWxlbiA9IDA7CiAgICBTTk1QX0ZSRUUoYS0+c3RhcnRfYSk7CiAgICBhLT5zdGFydF9sZW4gPSAwOwogICAgU05NUF9GUkVFKGEtPmVuZF9hKTsKICAgIGEtPmVuZF9sZW4gPSAwOwogICAgU05NUF9GUkVFKGEtPmxhYmVsX2EpOwogICAgbmV0c25tcF9oYW5kbGVyX3JlZ2lzdHJhdGlvbl9mcmVlKGEtPnJlZ2luZm8pOwogICAgYS0+cmVnaW5mbyA9IE5VTEw7CiAgICBTTk1QX0ZSRUUoYSk7CiAgfQp9CgovKiogQ3JlYXRlcyBkZWVwIGNvcHkgb2YgYSBzdWJ0cmVlIGl0ZW0uCiAqICBEdXBsaWNhdGVzIGFsbCBwcm9wZXJ0aWVzIHN0b3JlZCBpbiB0aGUgc3RydWN0dXJlLCBpbmNsdWRpbmcKICogIEhhbmRsZSBSZWdpc3RyYXRpb24gc3RydWN0dXJlIHN0b3JlZCBpbnNpZGUgdGhlIGl0ZW0uCiAqCiAqICBAcGFyYW0gYSBUaGUgc3VidHJlZSBpdGVtIHRvIGNvcHkuCiAqCiAqICBAcmV0dXJuIGRlZXAgY29weSBvZiB0aGUgc3VidHJlZSBpdGVtLCBvciBOVUxMIG9uIGVycm9yLgogKi8KbmV0c25tcF9zdWJ0cmVlICoKbmV0c25tcF9zdWJ0cmVlX2RlZXBjb3B5KG5ldHNubXBfc3VidHJlZSAqYSkKewogIG5ldHNubXBfc3VidHJlZSAqYiA9IChuZXRzbm1wX3N1YnRyZWUgKiljYWxsb2MoMSwgc2l6ZW9mKG5ldHNubXBfc3VidHJlZSkpOwoKICBpZiAoYiAhPSBOVUxMKSB7CiAgICBtZW1jcHkoYiwgYSwgc2l6ZW9mKG5ldHNubXBfc3VidHJlZSkpOwogICAgYi0+bmFtZV9hICA9IHNubXBfZHVwbGljYXRlX29iamlkKGEtPm5hbWVfYSwgIGEtPm5hbWVsZW4pOwogICAgYi0+c3RhcnRfYSA9IHNubXBfZHVwbGljYXRlX29iamlkKGEtPnN0YXJ0X2EsIGEtPnN0YXJ0X2xlbik7CiAgICBiLT5lbmRfYSAgID0gc25tcF9kdXBsaWNhdGVfb2JqaWQoYS0+ZW5kX2EsICAgYS0+ZW5kX2xlbik7CiAgICBiLT5sYWJlbF9hID0gc3RyZHVwKGEtPmxhYmVsX2EpOwogICAgCiAgICBpZiAoYi0+bmFtZV9hID09IE5VTEwgfHwgYi0+c3RhcnRfYSA9PSBOVUxMIHx8IAoJYi0+ZW5kX2EgID09IE5VTEwgfHwgYi0+bGFiZWxfYSA9PSBOVUxMKSB7CiAgICAgIG5ldHNubXBfc3VidHJlZV9mcmVlKGIpOwogICAgICByZXR1cm4gTlVMTDsKICAgIH0KCiAgICBpZiAoYS0+dmFyaWFibGVzICE9IE5VTEwpIHsKICAgICAgYi0+dmFyaWFibGVzID0gKHN0cnVjdCB2YXJpYWJsZSAqKW1hbGxvYyhhLT52YXJpYWJsZXNfbGVuICogCgkJCQkJICAgICAgIGEtPnZhcmlhYmxlc193aWR0aCk7CiAgICAgIGlmIChiLT52YXJpYWJsZXMgIT0gTlVMTCkgewoJbWVtY3B5KGItPnZhcmlhYmxlcywgYS0+dmFyaWFibGVzLGEtPnZhcmlhYmxlc19sZW4qYS0+dmFyaWFibGVzX3dpZHRoKTsKICAgICAgfSBlbHNlIHsKCW5ldHNubXBfc3VidHJlZV9mcmVlKGIpOwoJcmV0dXJuIE5VTEw7CiAgICAgIH0KICAgIH0KCiAgICBpZiAoYS0+cmVnaW5mbyAhPSBOVUxMKSB7CiAgICAgIGItPnJlZ2luZm8gPSBuZXRzbm1wX2hhbmRsZXJfcmVnaXN0cmF0aW9uX2R1cChhLT5yZWdpbmZvKTsKICAgICAgaWYgKGItPnJlZ2luZm8gPT0gTlVMTCkgewoJbmV0c25tcF9zdWJ0cmVlX2ZyZWUoYik7CglyZXR1cm4gTlVMTDsKICAgICAgfQogICAgfQogIH0KICByZXR1cm4gYjsKfQoKLyoqIEBwcml2YXRlCiAqICBSZXBsYWNlcyBuZXh0IHN1YnRyZWUgcG9pbnRlciBpbiBnaXZlbiBzdWJ0cmVlLgogKi8KTkVUU05NUF9TVEFUSUNfSU5MSU5FIHZvaWQKbmV0c25tcF9zdWJ0cmVlX2NoYW5nZV9uZXh0KG5ldHNubXBfc3VidHJlZSAqcHRyLCBuZXRzbm1wX3N1YnRyZWUgKnRoZW5leHQpCnsKICAgIHB0ci0+bmV4dCA9IHRoZW5leHQ7CiAgICBpZiAodGhlbmV4dCkKICAgICAgICBuZXRzbm1wX29pZF9jb21wYXJlX2xsKHB0ci0+c3RhcnRfYSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB0ci0+c3RhcnRfbGVuLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhlbmV4dC0+c3RhcnRfYSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoZW5leHQtPnN0YXJ0X2xlbiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZ0aGVuZXh0LT5vaWRfb2ZmKTsKfQoKLyoqIEBwcml2YXRlCiAqICBSZXBsYWNlcyBwcmV2aW91cyBzdWJ0cmVlIHBvaW50ZXIgaW4gZ2l2ZW4gc3VidHJlZS4KICovCk5FVFNOTVBfU1RBVElDX0lOTElORSB2b2lkCm5ldHNubXBfc3VidHJlZV9jaGFuZ2VfcHJldihuZXRzbm1wX3N1YnRyZWUgKnB0ciwgbmV0c25tcF9zdWJ0cmVlICp0aGVwcmV2KQp7CiAgICBwdHItPnByZXYgPSB0aGVwcmV2OwogICAgaWYgKHRoZXByZXYpCiAgICAgICAgbmV0c25tcF9vaWRfY29tcGFyZV9sbCh0aGVwcmV2LT5zdGFydF9hLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhlcHJldi0+c3RhcnRfbGVuLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHRyLT5zdGFydF9hLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHRyLT5zdGFydF9sZW4sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcHRyLT5vaWRfb2ZmKTsKfQoKbmV0c25tcF9mZWF0dXJlX2NoaWxkX29mKG5ldHNubXBfc3VidHJlZV9jb21wYXJlLG5ldHNubXBfdW51c2VkKQojaWZuZGVmIE5FVFNOTVBfRkVBVFVSRV9SRU1PVkVfTkVUU05NUF9TVUJUUkVFX0NPTVBBUkUKLyoqIENvbXBhcmVzIE9JRHMgb2YgZ2l2ZW4gc3VidHJlZXMuCiAqCiAqICBAcGFyYW0gYXAsYnAgUG9pbnRlcnMgdG8gdGhlIHN1YnRyZWVzIHRvIGJlIGNvbXBhcmVkLgogKgogKiAgQHJldHVybiBPSURzIGxleGljb2dyYXBoaWNhbCBjb21wYXJpc29uIHJlc3VsdC4KICoKICogIEBzZWUgc25tcF9vaWRfY29tcGFyZSgpCiAqLwppbnQKbmV0c25tcF9zdWJ0cmVlX2NvbXBhcmUoY29uc3QgbmV0c25tcF9zdWJ0cmVlICphcCwgY29uc3QgbmV0c25tcF9zdWJ0cmVlICpicCkKewogICAgcmV0dXJuIHNubXBfb2lkX2NvbXBhcmUoYXAtPm5hbWVfYSwgYXAtPm5hbWVsZW4sIGJwLT5uYW1lX2EsIGJwLT5uYW1lbGVuKTsKfQojZW5kaWYgLyogTkVUU05NUF9GRUFUVVJFX1JFTU9WRV9ORVRTTk1QX1NVQlRSRUVfQ09NUEFSRSAqLwoKLyoqIEpvaW5zIHRoZSBnaXZlbiBzdWJ0cmVlIHdpdGggdGhlIGN1cnJlbnQgdHJlZS4KICogIFRyZWVzIGFyZSBqb2luZWQgYW5kIHRoZSBvbmUgc3VwcGxpZWQgYXMgcGFyYW1ldGVyIGlzIGZyZWVkLgogKgogKiAgQHBhcmFtIHJvb3QgVGhlIHN1YnRyZWUgdG8gYmUgbWVyZ2VkIHdpdGggY3VycmVudCBzdWJ0cmVlLgogKiAgICAgICAgICAgICAgRG8gbm90IHVzZSB0aGUgcG9pbnRlciBhZnRlciBqb2luaW5nIC0gaXQgbWF5IGJlIGludmFsaWQuCiAqLwp2b2lkCm5ldHNubXBfc3VidHJlZV9qb2luKG5ldHNubXBfc3VidHJlZSAqcm9vdCkKewogICAgbmV0c25tcF9zdWJ0cmVlICpzLCAqdG1wLCAqYywgKmQ7CgogICAgd2hpbGUgKHJvb3QgIT0gTlVMTCkgewogICAgICAgIHMgPSByb290LT5uZXh0OwogICAgICAgIHdoaWxlIChzICE9IE5VTEwgJiYgcm9vdC0+cmVnaW5mbyA9PSBzLT5yZWdpbmZvKSB7CiAgICAgICAgICAgIHRtcCA9IHMtPm5leHQ7CiAgICAgICAgICAgIERFQlVHTVNHVEwoKCJzdWJ0cmVlIiwgInJvb3Qgc3RhcnQgIikpOwogICAgICAgICAgICBERUJVR01TR09JRCgoInN1YnRyZWUiLCByb290LT5zdGFydF9hLCByb290LT5zdGFydF9sZW4pKTsKICAgICAgICAgICAgREVCVUdNU0coKCJzdWJ0cmVlIiwgIiAob3JpZ2luYWwgZW5kICIpKTsKICAgICAgICAgICAgREVCVUdNU0dPSUQoKCJzdWJ0cmVlIiwgcm9vdC0+ZW5kX2EsIHJvb3QtPmVuZF9sZW4pKTsKICAgICAgICAgICAgREVCVUdNU0coKCJzdWJ0cmVlIiwgIilcbiIpKTsKICAgICAgICAgICAgREVCVUdNU0dUTCgoInN1YnRyZWUiLCAiICBKT0lOSU5HIHRvICIpKTsKICAgICAgICAgICAgREVCVUdNU0dPSUQoKCJzdWJ0cmVlIiwgcy0+c3RhcnRfYSwgcy0+c3RhcnRfbGVuKSk7CgoJICAgIFNOTVBfRlJFRShyb290LT5lbmRfYSk7CgkgICAgcm9vdC0+ZW5kX2EgICA9IHMtPmVuZF9hOwogICAgICAgICAgICByb290LT5lbmRfbGVuID0gcy0+ZW5kX2xlbjsKCSAgICBzLT5lbmRfYSAgICAgID0gTlVMTDsKCiAgICAgICAgICAgIGZvciAoYyA9IHJvb3Q7IGMgIT0gTlVMTDsgYyA9IGMtPmNoaWxkcmVuKSB7CiAgICAgICAgICAgICAgICBuZXRzbm1wX3N1YnRyZWVfY2hhbmdlX25leHQoYywgcy0+bmV4dCk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZm9yIChjID0gczsgYyAhPSBOVUxMOyBjID0gYy0+Y2hpbGRyZW4pIHsKICAgICAgICAgICAgICAgIG5ldHNubXBfc3VidHJlZV9jaGFuZ2VfcHJldihjLCByb290KTsKICAgICAgICAgICAgfQogICAgICAgICAgICBERUJVR01TRygoInN1YnRyZWUiLCAiIHNvIG5ldyBlbmQgIikpOwogICAgICAgICAgICBERUJVR01TR09JRCgoInN1YnRyZWUiLCByb290LT5lbmRfYSwgcm9vdC0+ZW5kX2xlbikpOwogICAgICAgICAgICBERUJVR01TRygoInN1YnRyZWUiLCAiXG4iKSk7CiAgICAgICAgICAgIC8qCiAgICAgICAgICAgICAqIFByb2JhYmx5IG5lZWQgdG8gZnJlZSBjaGlsZHJlbiB0b28/ICAKICAgICAgICAgICAgICovCiAgICAgICAgICAgIGZvciAoYyA9IHMtPmNoaWxkcmVuOyBjICE9IE5VTEw7IGMgPSBkKSB7CiAgICAgICAgICAgICAgICBkID0gYy0+Y2hpbGRyZW47CiAgICAgICAgICAgICAgICBuZXRzbm1wX3N1YnRyZWVfZnJlZShjKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBuZXRzbm1wX3N1YnRyZWVfZnJlZShzKTsKICAgICAgICAgICAgcyA9IHRtcDsKICAgICAgICB9CiAgICAgICAgcm9vdCA9IHJvb3QtPm5leHQ7CiAgICB9Cn0KCgovKiogU3BsaXQgdGhlIHN1YnRyZWUgaW50byB0d28gYXQgdGhlIHNwZWNpZmllZCBwb2ludC4KICogIFN1YnRyZWVzIG9mIHRoZSBnaXZlbiBPSUQgYW5kIHNlcGFyYXRlZCBhbmQgZm9ybWVkIGludG8gdGhlCiAqICByZXR1cm5lZCBzdWJ0cmVlLgogKgogKiAgQHBhcmFtIGN1cnJlbnQgVGhlIGVsZW1lbnQgYXQgd2hpY2ggc3BsaXR0aW5nIGlzIHN0YXJ0ZWQuCiAqCiAqICBAcGFyYW0gbmFtZSBUaGUgT0lEIHdlJ2QgbGlrZSB0byBzcGxpdC4KICoKICogIEBwYXJhbSBuYW1lX2xlbiBMZW5ndGggb2YgdGhlIE9JRC4KICoKICogIEByZXR1cm4gaGVhZCBvZiB0aGUgbmV3IChzZWNvbmQpIHN1YnRyZWUuCiAqLwpuZXRzbm1wX3N1YnRyZWUgKgpuZXRzbm1wX3N1YnRyZWVfc3BsaXQobmV0c25tcF9zdWJ0cmVlICpjdXJyZW50LCBvaWQgbmFtZVtdLCBpbnQgbmFtZV9sZW4pCnsKICAgIHN0cnVjdCB2YXJpYWJsZSAqdnAgPSBOVUxMOwogICAgbmV0c25tcF9zdWJ0cmVlICpuZXdfc3ViLCAqcHRyOwogICAgaW50IGkgPSAwLCByYyA9IDAsIHJjMiA9IDA7CiAgICBzaXplX3QgY29tbW9uX2xlbiA9IDA7CiAgICBjaGFyICpjcDsKICAgIG9pZCAqdG1wX2EsICp0bXBfYjsKCiAgICBpZiAoc25tcF9vaWRfY29tcGFyZShuYW1lLCBuYW1lX2xlbiwgY3VycmVudC0+ZW5kX2EsIGN1cnJlbnQtPmVuZF9sZW4pPjApIHsKCS8qIFNwbGl0IGNvbWVzIGFmdGVyIHRoZSBlbmQgb2YgdGhpcyBzdWJ0cmVlICovCiAgICAgICAgcmV0dXJuIE5VTEw7CiAgICB9CgogICAgbmV3X3N1YiA9IG5ldHNubXBfc3VidHJlZV9kZWVwY29weShjdXJyZW50KTsKICAgIGlmIChuZXdfc3ViID09IE5VTEwpIHsKICAgICAgICByZXR1cm4gTlVMTDsKICAgIH0KCiAgICAvKiAgU2V0IHVwIHRoZSBwb2ludCBvZiBkaXZpc2lvbi4gICovCiAgICB0bXBfYSA9IHNubXBfZHVwbGljYXRlX29iamlkKG5hbWUsIG5hbWVfbGVuKTsKICAgIGlmICh0bXBfYSA9PSBOVUxMKSB7CgluZXRzbm1wX3N1YnRyZWVfZnJlZShuZXdfc3ViKTsKCXJldHVybiBOVUxMOwogICAgfQogICAgdG1wX2IgPSBzbm1wX2R1cGxpY2F0ZV9vYmppZChuYW1lLCBuYW1lX2xlbik7CiAgICBpZiAodG1wX2IgPT0gTlVMTCkgewoJbmV0c25tcF9zdWJ0cmVlX2ZyZWUobmV3X3N1Yik7CglTTk1QX0ZSRUUodG1wX2EpOwoJcmV0dXJuIE5VTEw7CiAgICB9CgogICAgU05NUF9GUkVFKGN1cnJlbnQtPmVuZF9hKTsKICAgIGN1cnJlbnQtPmVuZF9hID0gdG1wX2E7CiAgICBjdXJyZW50LT5lbmRfbGVuID0gbmFtZV9sZW47CiAgICBpZiAobmV3X3N1Yi0+c3RhcnRfYSAhPSBOVUxMKSB7CglTTk1QX0ZSRUUobmV3X3N1Yi0+c3RhcnRfYSk7CiAgICB9CiAgICBuZXdfc3ViLT5zdGFydF9hID0gdG1wX2I7CiAgICBuZXdfc3ViLT5zdGFydF9sZW4gPSBuYW1lX2xlbjsKCiAgICAvKiAgU3BsaXQgdGhlIHZhcmlhYmxlcyBiZXR3ZWVuIHRoZSB0d28gbmV3IHN1YnRyZWVzLiAgKi8KICAgIGkgPSBjdXJyZW50LT52YXJpYWJsZXNfbGVuOwogICAgY3VycmVudC0+dmFyaWFibGVzX2xlbiA9IDA7CgogICAgZm9yICh2cCA9IGN1cnJlbnQtPnZhcmlhYmxlczsgaSA+IDA7IGktLSkgewoJLyogIE5vdGUgdGhhdCB0aGUgdmFyaWFibGUgIm5hbWUiIGZpZWxkIG9taXRzIHRoZSBwcmVmaXggY29tbW9uIHRvIHRoZQoJICAgIHdob2xlIHJlZ2lzdHJhdGlvbiwgaGVuY2UgdGhlIHN0cmFuZ2UgY29tcGFyaXNvbiBoZXJlLiAgKi8KCglyYyA9IHNubXBfb2lkX2NvbXBhcmUodnAtPm5hbWUsIHZwLT5uYW1lbGVuLAoJCQkgICAgICBuYW1lICAgICArIGN1cnJlbnQtPm5hbWVsZW4sIAoJCQkgICAgICBuYW1lX2xlbiAtIGN1cnJlbnQtPm5hbWVsZW4pOwoKICAgICAgICBpZiAobmFtZV9sZW4gLSBjdXJyZW50LT5uYW1lbGVuID4gdnAtPm5hbWVsZW4pIHsKICAgICAgICAgICAgY29tbW9uX2xlbiA9IHZwLT5uYW1lbGVuOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIGNvbW1vbl9sZW4gPSBuYW1lX2xlbiAtIGN1cnJlbnQtPm5hbWVsZW47CiAgICAgICAgfQoKICAgICAgICByYzIgPSBzbm1wX29pZF9jb21wYXJlKHZwLT5uYW1lLCBjb21tb25fbGVuLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZSArIGN1cnJlbnQtPm5hbWVsZW4sIGNvbW1vbl9sZW4pOwoKICAgICAgICBpZiAocmMgPj0gMCkgewogICAgICAgICAgICBicmVhazsgIC8qIEFsbCBmb2xsb3dpbmcgdmFyaWFibGVzIGJlbG9uZyB0byB0aGUgc2Vjb25kIHN1YnRyZWUgKi8KCX0KCiAgICAgICAgY3VycmVudC0+dmFyaWFibGVzX2xlbisrOwogICAgICAgIGlmIChyYzIgPCAwKSB7CiAgICAgICAgICAgIG5ld19zdWItPnZhcmlhYmxlc19sZW4tLTsKICAgICAgICAgICAgY3AgPSAoY2hhciAqKSBuZXdfc3ViLT52YXJpYWJsZXM7CiAgICAgICAgICAgIG5ld19zdWItPnZhcmlhYmxlcyA9IChzdHJ1Y3QgdmFyaWFibGUgKikoY3AgKyAKCQkJCQkJICAgICBuZXdfc3ViLT52YXJpYWJsZXNfd2lkdGgpOwogICAgICAgIH0KICAgICAgICB2cCA9IChzdHJ1Y3QgdmFyaWFibGUgKikgKChjaGFyICopIHZwICsgY3VycmVudC0+dmFyaWFibGVzX3dpZHRoKTsKICAgIH0KCiAgICAvKiBEZWxlZ2F0ZWQgdHJlZXMgc2hvdWxkIHJldGFpbiB0aGVpciB2YXJpYWJsZXMgcmVnYXJkbGVzcyAqLwogICAgaWYgKGN1cnJlbnQtPnZhcmlhYmxlc19sZW4gPiAwICYmCiAgICAgICAgSVNfREVMRUdBVEVEKCh1X2NoYXIpIGN1cnJlbnQtPnZhcmlhYmxlc1swXS50eXBlKSkgewogICAgICAgIG5ld19zdWItPnZhcmlhYmxlc19sZW4gPSAxOwogICAgICAgIG5ld19zdWItPnZhcmlhYmxlcyA9IGN1cnJlbnQtPnZhcmlhYmxlczsKICAgIH0KCiAgICAvKiBQcm9wb2dhdGUgdGhpcyBzcGxpdCBkb3duIHRocm91Z2ggYW55IGNoaWxkcmVuICovCiAgICBpZiAoY3VycmVudC0+Y2hpbGRyZW4pIHsKICAgICAgICBuZXdfc3ViLT5jaGlsZHJlbiA9IG5ldHNubXBfc3VidHJlZV9zcGxpdChjdXJyZW50LT5jaGlsZHJlbiwgCgkJCQkJCSAgbmFtZSwgbmFtZV9sZW4pOwogICAgfQoKICAgIC8qIFJldGFpbiB0aGUgY29ycmVjdCBsaW5raW5nIG9mIHRoZSBsaXN0ICovCiAgICBmb3IgKHB0ciA9IGN1cnJlbnQ7IHB0ciAhPSBOVUxMOyBwdHIgPSBwdHItPmNoaWxkcmVuKSB7CiAgICAgICAgbmV0c25tcF9zdWJ0cmVlX2NoYW5nZV9uZXh0KHB0ciwgbmV3X3N1Yik7CiAgICB9CiAgICBmb3IgKHB0ciA9IG5ld19zdWI7IHB0ciAhPSBOVUxMOyBwdHIgPSBwdHItPmNoaWxkcmVuKSB7CiAgICAgICAgbmV0c25tcF9zdWJ0cmVlX2NoYW5nZV9wcmV2KHB0ciwgY3VycmVudCk7CiAgICB9CiAgICBmb3IgKHB0ciA9IG5ld19zdWItPm5leHQ7IHB0ciAhPSBOVUxMOyBwdHI9cHRyLT5jaGlsZHJlbikgewogICAgICAgIG5ldHNubXBfc3VidHJlZV9jaGFuZ2VfcHJldihwdHIsIG5ld19zdWIpOwogICAgfQoKICAgIHJldHVybiBuZXdfc3ViOwp9CgovKiogTG9hZHMgdGhlIHN1YnRyZWUgdW5kZXIgZ2l2ZW4gY29udGV4dCBuYW1lLgogKgogKiAgQHBhcmFtIG5ld19zdWIgVGhlIHN1YnRyZWUgdG8gYmUgbG9hZGVkIGludG8gY3VycmVudCBzdWJ0cmVlLgogKgogKiAgQHBhcmFtIGNvbnRleHRfbmFtZSBUZXh0IG5hbWUgb2YgdGhlIGNvbnRleHQgd2UncmUgc2VhcmNoaW5nIGZvci4KICoKICogIEByZXR1cm4gZ2l2ZXMgTUlCX1JFR0lTVEVSRURfT0sgb24gc3VjY2VzcywgZXJyb3IgY29kZSBvdGhlcndpc2UuCiAqLwppbnQKbmV0c25tcF9zdWJ0cmVlX2xvYWQobmV0c25tcF9zdWJ0cmVlICpuZXdfc3ViLCBjb25zdCBjaGFyICpjb250ZXh0X25hbWUpCnsKICAgIG5ldHNubXBfc3VidHJlZSAqdHJlZTEsICp0cmVlMjsKICAgIG5ldHNubXBfc3VidHJlZSAqcHJldiwgKm5leHQ7CgogICAgaWYgKG5ld19zdWIgPT0gTlVMTCkgewogICAgICAgIHJldHVybiBNSUJfUkVHSVNURVJFRF9PSzsgICAgICAgLyogRGVnZW5lcmF0ZSBjYXNlICovCiAgICB9CgogICAgaWYgKCFuZXRzbm1wX3N1YnRyZWVfZmluZF9maXJzdChjb250ZXh0X25hbWUpKSB7CiAgICAgICAgc3RhdGljIGludCBpbmxvb3AgPSAwOwogICAgICAgIGlmICghaW5sb29wKSB7CiAgICAgICAgICAgIG9pZCBjY2l0dFsxXSAgICAgICAgICAgPSB7IDAgfTsKICAgICAgICAgICAgb2lkIGlzb1sxXSAgICAgICAgICAgICA9IHsgMSB9OwogICAgICAgICAgICBvaWQgam9pbnRfY2NpdHRfaXNvWzFdID0geyAyIH07CiAgICAgICAgICAgIGlubG9vcCA9IDE7CiAgICAgICAgICAgIG5ldHNubXBfcmVnaXN0ZXJfbnVsbF9jb250ZXh0KHNubXBfZHVwbGljYXRlX29iamlkKGNjaXR0LCAxKSwgMSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGV4dF9uYW1lKTsKICAgICAgICAgICAgbmV0c25tcF9yZWdpc3Rlcl9udWxsX2NvbnRleHQoc25tcF9kdXBsaWNhdGVfb2JqaWQoaXNvLCAxKSwgMSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGV4dF9uYW1lKTsKICAgICAgICAgICAgbmV0c25tcF9yZWdpc3Rlcl9udWxsX2NvbnRleHQoc25tcF9kdXBsaWNhdGVfb2JqaWQoam9pbnRfY2NpdHRfaXNvLCAxKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMSwgY29udGV4dF9uYW1lKTsKICAgICAgICAgICAgaW5sb29wID0gMDsKICAgICAgICB9CiAgICB9CgogICAgLyogIEZpbmQgdGhlIHN1YnRyZWUgdGhhdCBjb250YWlucyB0aGUgc3RhcnQgb2YgdGhlIG5ldyBzdWJ0cmVlIChpZgoJYW55KS4uLiovCgogICAgdHJlZTEgPSBuZXRzbm1wX3N1YnRyZWVfZmluZChuZXdfc3ViLT5zdGFydF9hLCBuZXdfc3ViLT5zdGFydF9sZW4sIAoJCQkJIE5VTEwsIGNvbnRleHRfbmFtZSk7CgogICAgLyogIC4uLiBhbmQgdGhlIHN1YnRyZWUgdGhhdCBmb2xsb3dzIHRoZSBuZXcgb25lIChOVUxMIGltcGxpZXMgdGhpcyBpcyB0aGUKCWZpbmFsIHJlZ2lvbiBjb3ZlcmVkKS4gICovCgogICAgaWYgKHRyZWUxID09IE5VTEwpIHsKCXRyZWUyID0gbmV0c25tcF9zdWJ0cmVlX2ZpbmRfbmV4dChuZXdfc3ViLT5zdGFydF9hLCBuZXdfc3ViLT5zdGFydF9sZW4sCgkJCQkJICBOVUxMLCBjb250ZXh0X25hbWUpOwogICAgfSBlbHNlIHsKCXRyZWUyID0gdHJlZTEtPm5leHQ7CiAgICB9CgogICAgLyogIEhhbmRsZSBuZXcgc3VidHJlZXMgdGhhdCBzdGFydCBpbiB2aXJnaW4gdGVycml0b3J5LiAgKi8KCiAgICBpZiAodHJlZTEgPT0gTlVMTCkgewogICAgICAgIG5ldHNubXBfc3VidHJlZSAqbmV3MiA9IE5VTEw7CgkvKiAgSXMgdGhlcmUgYW55IG92ZXJsYXAgd2l0aCBsYXRlciBzdWJ0cmVlcz8gICovCglpZiAodHJlZTIgJiYgc25tcF9vaWRfY29tcGFyZShuZXdfc3ViLT5lbmRfYSwgbmV3X3N1Yi0+ZW5kX2xlbiwKCQkJCSAgICAgIHRyZWUyLT5zdGFydF9hLCB0cmVlMi0+c3RhcnRfbGVuKSA+IDApIHsKCSAgICBuZXcyID0gbmV0c25tcF9zdWJ0cmVlX3NwbGl0KG5ld19zdWIsIAoJCQkJCSB0cmVlMi0+c3RhcnRfYSwgdHJlZTItPnN0YXJ0X2xlbik7Cgl9CgoJLyogIExpbmsgdGhlIG5ldyBzdWJ0cmVlIChsZXNzIGFueSBvdmVybGFwcGluZyByZWdpb24pIHdpdGggdGhlIGxpc3Qgb2YKCSAgICBleGlzdGluZyByZWdpc3RyYXRpb25zLiAgKi8KCglpZiAodHJlZTIpIHsKICAgICAgICAgICAgbmV0c25tcF9zdWJ0cmVlX2NoYW5nZV9wcmV2KG5ld19zdWIsIHRyZWUyLT5wcmV2KTsKICAgICAgICAgICAgbmV0c25tcF9zdWJ0cmVlX2NoYW5nZV9wcmV2KHRyZWUyLCBuZXdfc3ViKTsKCX0gZWxzZSB7CiAgICAgICAgICAgIG5ldHNubXBfc3VidHJlZV9jaGFuZ2VfcHJldihuZXdfc3ViLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV0c25tcF9zdWJ0cmVlX2ZpbmRfcHJldihuZXdfc3ViLT5zdGFydF9hLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXdfc3ViLT5zdGFydF9sZW4sIE5VTEwsIGNvbnRleHRfbmFtZSkpOwoKCSAgICBpZiAobmV3X3N1Yi0+cHJldikgewogICAgICAgICAgICAgICAgbmV0c25tcF9zdWJ0cmVlX2NoYW5nZV9uZXh0KG5ld19zdWItPnByZXYsIG5ld19zdWIpOwoJICAgIH0gZWxzZSB7CgkJbmV0c25tcF9zdWJ0cmVlX3JlcGxhY2VfZmlyc3QobmV3X3N1YiwgY29udGV4dF9uYW1lKTsKCSAgICB9CgogICAgICAgICAgICBuZXRzbm1wX3N1YnRyZWVfY2hhbmdlX25leHQobmV3X3N1YiwgdHJlZTIpOwoKCSAgICAvKiBJZiB0aGVyZSB3YXMgYW55IG92ZXJsYXAsIHJlY3Vyc2UgdG8gbWVyZ2UgaW4gdGhlIG92ZXJsYXBwaW5nCgkgICAgICAgcmVnaW9uIChpbmNsdWRpbmcgYW55dGhpbmcgdGhhdCBtYXkgZm9sbG93IHRoZSBvdmVybGFwKS4gICovCgkgICAgaWYgKG5ldzIpIHsKCQlyZXR1cm4gbmV0c25tcF9zdWJ0cmVlX2xvYWQobmV3MiwgY29udGV4dF9uYW1lKTsKCSAgICB9Cgl9CiAgICB9IGVsc2UgewoJLyogIElmIHRoZSBuZXcgc3VidHJlZSBzdGFydHMgKndpdGhpbiogYW4gZXhpc3RpbmcgcmVnaXN0cmF0aW9uCgkgICAgKHJhdGhlciB0aGFuIGF0IHRoZSBzYW1lIHBvaW50IGFzIGl0KSwgdGhlbiBzcGxpdCB0aGUgZXhpc3RpbmcKCSAgICBzdWJ0cmVlIGF0IHRoaXMgcG9pbnQuICAqLwoKCWlmIChuZXRzbm1wX29pZF9lcXVhbHMobmV3X3N1Yi0+c3RhcnRfYSwgbmV3X3N1Yi0+c3RhcnRfbGVuLCAKCQkJICAgICB0cmVlMS0+c3RhcnRfYSwgICB0cmVlMS0+c3RhcnRfbGVuKSAhPSAwKSB7CgkgICAgdHJlZTEgPSBuZXRzbm1wX3N1YnRyZWVfc3BsaXQodHJlZTEsIG5ld19zdWItPnN0YXJ0X2EsIAoJCQkJCSAgbmV3X3N1Yi0+c3RhcnRfbGVuKTsKCX0KCiAgICAgICAgaWYgKHRyZWUxID09IE5VTEwpIHsKICAgICAgICAgICAgcmV0dXJuIE1JQl9SRUdJU1RSQVRJT05fRkFJTEVEOwoJfQoKCS8qICBOb3cgY29uc2lkZXIgdGhlIGVuZCBvZiB0aGlzIGV4aXN0aW5nIHN1YnRyZWU6CgkgICAgCgkgICAgSWYgaXQgbWF0Y2hlcyB0aGUgbmV3IHN1YnRyZWUgcHJlY2lzZWx5LAoJICAgICAgICAgICAgc2ltcGx5IG1lcmdlIHRoZSBuZXcgb25lIGludG8gdGhlIGxpc3Qgb2YgY2hpbGRyZW4KCgkgICAgSWYgaXQgaW5jbHVkZXMgdGhlIHdob2xlIG9mIHRoZSBuZXcgc3VidHJlZSwKCQkgICAgc3BsaXQgaXQgYXQgdGhlIGFwcHJvcHJpYXRlIHBvaW50LCBhbmQgbWVyZ2UgYWdhaW4KICAgICAKCSAgICBJZiB0aGUgbmV3IHN1YnRyZWUgZXh0ZW5kcyBiZXlvbmQgdGhpcyBleGlzdGluZyByZWdpb24sCgkgICAgICAgICAgICBzcGxpdCBpdCwgYW5kIHJlY3Vyc2UgdG8gbWVyZ2UgdGhlIHR3byBwYXJ0cy4gICovCgoJc3dpdGNoIChzbm1wX29pZF9jb21wYXJlKG5ld19zdWItPmVuZF9hLCBuZXdfc3ViLT5lbmRfbGVuLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cmVlMS0+ZW5kX2EsIHRyZWUxLT5lbmRfbGVuKSkgewoKCWNhc2UgLTE6CgkgICAgLyogIEV4aXN0aW5nIHN1YnRyZWUgY29udGFpbnMgbmV3IG9uZS4gICovCgkgICAgbmV0c25tcF9zdWJ0cmVlX3NwbGl0KHRyZWUxLCBuZXdfc3ViLT5lbmRfYSwgbmV3X3N1Yi0+ZW5kX2xlbik7CgkgICAgLyogRmFsbCBUaHJvdWdoICovCgoJY2FzZSAgMDoKCSAgICAvKiAgVGhlIHR3byB0cmVlcyBtYXRjaCBwcmVjaXNlbHkuICAqLwoKCSAgICAvKiAgTm90ZTogVGhpcyBpcyB0aGUgb25seSBwb2ludCB3aGVyZSB0aGUgb3JpZ2luYWwgcmVnaXN0cmF0aW9uCgkgICAgICAgIE9JRCAoIm5hbWUiKSBpcyB1c2VkLiAgKi8KCgkgICAgcHJldiA9IE5VTEw7CgkgICAgbmV4dCA9IHRyZWUxOwoJCgkgICAgd2hpbGUgKG5leHQgJiYgbmV4dC0+bmFtZWxlbiA+IG5ld19zdWItPm5hbWVsZW4pIHsKCQlwcmV2ID0gbmV4dDsKCQluZXh0ID0gbmV4dC0+Y2hpbGRyZW47CgkgICAgfQoKCSAgICB3aGlsZSAobmV4dCAmJiBuZXh0LT5uYW1lbGVuID09IG5ld19zdWItPm5hbWVsZW4gJiYKCQkgICBuZXh0LT5wcmlvcml0eSA8IG5ld19zdWItPnByaW9yaXR5ICkgewoJCXByZXYgPSBuZXh0OwoJCW5leHQgPSBuZXh0LT5jaGlsZHJlbjsKCSAgICB9CgkKCSAgICBpZiAobmV4dCAmJiAobmV4dC0+bmFtZWxlbiAgPT0gbmV3X3N1Yi0+bmFtZWxlbikgJiYKCQkobmV4dC0+cHJpb3JpdHkgPT0gbmV3X3N1Yi0+cHJpb3JpdHkpKSB7CiAgICAgICAgICAgICAgICBpZiAobmV3X3N1Yi0+bmFtZWxlbiAhPSAxKSB7ICAgIC8qIGlnbm9yZSByb290IE9JRCBkdXBzICovCiAgICAgICAgICAgICAgICAgICAgc2l6ZV90ICAgICAgICAgIG91dF9sZW4gPSAwOwogICAgICAgICAgICAgICAgICAgIHNpemVfdCAgICAgICAgICBidWZfbGVuID0gMDsKICAgICAgICAgICAgICAgICAgICBjaGFyICAgICAgICAgICAqYnVmID0gTlVMTDsKICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgICAgYnVmX292ZXJmbG93ID0gMDsKCiAgICAgICAgICAgICAgICAgICAgbmV0c25tcF9zcHJpbnRfcmVhbGxvY19vYmppZCgodV9jaGFyICoqKSAmYnVmLCAmYnVmX2xlbiwgJm91dF9sZW4sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxLCAmYnVmX292ZXJmbG93LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3X3N1Yi0+c3RhcnRfYSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ld19zdWItPnN0YXJ0X2xlbik7CiAgICAgICAgICAgICAgICAgICAgc25tcF9sb2coTE9HX0VSUiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZHVwbGljYXRlIHJlZ2lzdHJhdGlvbjogTUlCIG1vZHVsZXMgJXMgYW5kICVzIChvaWQgJXMlcykuXG4iLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5leHQtPmxhYmVsX2EsIG5ld19zdWItPmxhYmVsX2EsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnVmID8gYnVmIDogIiIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnVmX292ZXJmbG93ID8gIiBbVFJVTkNBVEVEXSIgOiAiIik7CiAgICAgICAgICAgICAgICAgICAgZnJlZShidWYpOwogICAgICAgICAgICAgICAgfQoJCXJldHVybiBNSUJfRFVQTElDQVRFX1JFR0lTVFJBVElPTjsKCSAgICB9CgoJICAgIGlmIChwcmV2KSB7CgkJcHJldi0+Y2hpbGRyZW4gICAgPSBuZXdfc3ViOwoJCW5ld19zdWItPmNoaWxkcmVuID0gbmV4dDsKICAgICAgICAgICAgICAgIG5ldHNubXBfc3VidHJlZV9jaGFuZ2VfcHJldihuZXdfc3ViLCBwcmV2LT5wcmV2KTsKICAgICAgICAgICAgICAgIG5ldHNubXBfc3VidHJlZV9jaGFuZ2VfbmV4dChuZXdfc3ViLCBwcmV2LT5uZXh0KTsKCSAgICB9IGVsc2UgewoJCW5ld19zdWItPmNoaWxkcmVuID0gbmV4dDsKICAgICAgICAgICAgICAgIG5ldHNubXBfc3VidHJlZV9jaGFuZ2VfcHJldihuZXdfc3ViLCBuZXh0LT5wcmV2KTsKICAgICAgICAgICAgICAgIG5ldHNubXBfc3VidHJlZV9jaGFuZ2VfbmV4dChuZXdfc3ViLCBuZXh0LT5uZXh0KTsKCQoJCWZvciAobmV4dCA9IG5ld19zdWItPm5leHQ7IG5leHQgIT0gTlVMTDtuZXh0ID0gbmV4dC0+Y2hpbGRyZW4pewogICAgICAgICAgICAgICAgICAgIG5ldHNubXBfc3VidHJlZV9jaGFuZ2VfcHJldihuZXh0LCBuZXdfc3ViKTsKCQl9CgoJCWZvciAocHJldiA9IG5ld19zdWItPnByZXY7IHByZXYgIT0gTlVMTDtwcmV2ID0gcHJldi0+Y2hpbGRyZW4pewogICAgICAgICAgICAgICAgICAgIG5ldHNubXBfc3VidHJlZV9jaGFuZ2VfbmV4dChwcmV2LCBuZXdfc3ViKTsKCQl9CgkgICAgfQoJICAgIGJyZWFrOwoKCWNhc2UgIDE6CgkgICAgLyogIE5ldyBzdWJ0cmVlIGNvbnRhaW5zIHRoZSBleGlzdGluZyBvbmUuICAqLwogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBuZXRzbm1wX3N1YnRyZWUgKm5ldzIgPQogICAgICAgICAgICAgICAgICAgIG5ldHNubXBfc3VidHJlZV9zcGxpdChuZXdfc3ViLCB0cmVlMS0+ZW5kX2EsdHJlZTEtPmVuZF9sZW4pOwogICAgICAgICAgICAgICAgaW50IHJlcyA9IG5ldHNubXBfc3VidHJlZV9sb2FkKG5ld19zdWIsIGNvbnRleHRfbmFtZSk7CiAgICAgICAgICAgICAgICBpZiAocmVzICE9IE1JQl9SRUdJU1RFUkVEX09LKSB7CiAgICAgICAgICAgICAgICAgICAgbmV0c25tcF9yZW1vdmVfc3VidHJlZShuZXcyKTsKICAgICAgICAgICAgICAgICAgICBuZXRzbm1wX3N1YnRyZWVfZnJlZShuZXcyKTsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gcmVzOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgcmV0dXJuIG5ldHNubXBfc3VidHJlZV9sb2FkKG5ldzIsIGNvbnRleHRfbmFtZSk7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9CiAgICByZXR1cm4gMDsKfQoKLyoqIEZyZWUgdGhlIGdpdmVuIHN1YnRyZWUgYW5kIGFsbCBpdHMgY2hpbGRyZW4uCiAqCiAqICBAcGFyYW0gc3ViIFN1YnRyZWUgYnJhbmNoIHRvIGJlIGNsZWFyZWQgYW5kIGZyZWVkLgogKiAgICAgICAgICAgICBBZnRlciB0aGUgY2FsbCwgdGhpcyBwb2ludGVyIGlzIGludmFsaWQKICogICAgICAgICAgICAgYW5kIHNob3VsZCBiZSBzZXQgdG8gTlVMTC4KICovCnZvaWQKY2xlYXJfc3VidHJlZSAobmV0c25tcF9zdWJ0cmVlICpzdWIpIHsKCiAgICBuZXRzbm1wX3N1YnRyZWUgKmM7CiAgICAKICAgIGlmIChzdWIgPT0gTlVMTCkKCXJldHVybjsKCiAgICBmb3IoYyA9IHN1YjsgYzspIHsKICAgICAgICBzdWIgPSBjOwogICAgICAgIGMgPSBjLT5jaGlsZHJlbjsKICAgICAgICBuZXRzbm1wX3N1YnRyZWVfZnJlZShzdWIpOwogICAgfQoKfQoKbmV0c25tcF9zdWJ0cmVlICoKbmV0c25tcF9zdWJ0cmVlX2ZpbmRfcHJldihjb25zdCBvaWQgKm5hbWUsIHNpemVfdCBsZW4sIG5ldHNubXBfc3VidHJlZSAqc3VidHJlZSwKCQkJICBjb25zdCBjaGFyICpjb250ZXh0X25hbWUpCnsKICAgIGxvb2t1cF9jYWNoZSAqbG9va3VwX2NhY2hlID0gTlVMTDsKICAgIG5ldHNubXBfc3VidHJlZSAqbXlwdHIgPSBOVUxMLCAqcHJldmlvdXMgPSBOVUxMOwogICAgaW50IGNtcCA9IDE7CiAgICBzaXplX3QgbGxfb2ZmID0gMDsKCiAgICBpZiAoc3VidHJlZSkgewogICAgICAgIG15cHRyID0gc3VidHJlZTsKICAgIH0gZWxzZSB7CgkvKiBsb29rIHRocm91Z2ggZXZlcnl0aGluZyAqLwogICAgICAgIGlmIChsb29rdXBfY2FjaGVfc2l6ZSkgewogICAgICAgICAgICBsb29rdXBfY2FjaGUgPSBsb29rdXBfY2FjaGVfZmluZChjb250ZXh0X25hbWUsIG5hbWUsIGxlbiwgJmNtcCk7CiAgICAgICAgICAgIGlmIChsb29rdXBfY2FjaGUpIHsKICAgICAgICAgICAgICAgIG15cHRyID0gbG9va3VwX2NhY2hlLT5uZXh0OwogICAgICAgICAgICAgICAgcHJldmlvdXMgPSBsb29rdXBfY2FjaGUtPnByZXZpb3VzOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmICghbXlwdHIpCiAgICAgICAgICAgICAgICBteXB0ciA9IG5ldHNubXBfc3VidHJlZV9maW5kX2ZpcnN0KGNvbnRleHRfbmFtZSk7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgbXlwdHIgPSBuZXRzbm1wX3N1YnRyZWVfZmluZF9maXJzdChjb250ZXh0X25hbWUpOwogICAgICAgIH0KICAgIH0KCiAgICAvKgogICAgICogdGhpcyBvcHRpbWl6YXRpb24gY2F1c2VzIGEgc2VnZmF1bHQgb24gc2YgY2YgYWxwaGEtbGludXgxLgogICAgICogaWZkZWYgb3V0IHVudGlsIHNvbWVvbmUgZmlndXJlcyBvdXQgd2h5IGFuZCBmaXhlcyBpdC4geHh4LXJrcyAyMDA1MTExNwogICAgICovCiNpZm5kZWYgX19hbHBoYQojZGVmaW5lIFdURVNUX09QVElNSVpBVElPTiAxCiNlbmRpZgojaWZkZWYgV1RFU1RfT1BUSU1JWkFUSU9OCiAgICBERUJVR01TR1RMKCgid3Rlc3QiLCJvaWQgaW46ICIpKTsKICAgIERFQlVHTVNHT0lEKCgid3Rlc3QiLCBuYW1lLCBsZW4pKTsKICAgIERFQlVHTVNHKCgid3Rlc3QiLCJcbiIpKTsKI2VuZGlmCiAgICBmb3IgKDsgbXlwdHIgIT0gTlVMTDsgcHJldmlvdXMgPSBteXB0ciwgbXlwdHIgPSBteXB0ci0+bmV4dCkgewojaWZkZWYgV1RFU1RfT1BUSU1JWkFUSU9OCiAgICAgICAgLyogQ29tcGFyZSB0aGUgaW5jb21pbmcgb2lkIHdpdGggdGhlIGxpbmtlZCBsaXN0LiAgSWYgd2UgaGF2ZQogICAgICAgICAgIHJlc3VsdHMgb2YgcHJldmlvdXMgY29tcGFyZXMsIGl0cyBmYXN0ZXIgdG8gbWFrZSBzdXJlIHRoZQogICAgICAgICAgIGxlbmd0aCB3ZSBkaWZmZXJlZCBpbiB0aGUgbGFzdCBjaGVjayBpcyBncmVhdGVyIHRoYW4gdGhlCiAgICAgICAgICAgbGVuZ3RoIGJldHdlZW4gdGhpcyBwb2ludGVyIGFuZCB0aGUgbGFzdCB0aGVuIHdlIGRvbid0IG5lZWQKICAgICAgICAgICB0byBhY3R1YWxseSBwZXJmb3JtIGEgY29tcGFyaXNvbiAqLwogICAgICAgIERFQlVHTVNHVEwoKCJ3dGVzdCIsIm9pZCBjbXA6ICIpKTsKICAgICAgICBERUJVR01TR09JRCgoInd0ZXN0IiwgbXlwdHItPnN0YXJ0X2EsIG15cHRyLT5zdGFydF9sZW4pKTsKICAgICAgICBERUJVR01TRygoInd0ZXN0IiwiICAtLS0gb2ZmID0gJWx1LCBpbiBvZmYgPSAlbHUgdGVzdCA9ICVkXG4iLAogICAgICAgICAgICAgICAgICAodW5zaWduZWQgbG9uZylteXB0ci0+b2lkX29mZiwgKHVuc2lnbmVkIGxvbmcpbGxfb2ZmLAogICAgICAgICAgICAgICAgICAhKGxsX29mZiAmJiBteXB0ci0+b2lkX29mZiAmJgogICAgICAgICAgICAgICAgICAgIG15cHRyLT5vaWRfb2ZmID4gbGxfb2ZmKSkpOwogICAgICAgIGlmICghKGxsX29mZiAmJiBteXB0ci0+b2lkX29mZiAmJiBteXB0ci0+b2lkX29mZiA+IGxsX29mZikgJiYKICAgICAgICAgICAgbmV0c25tcF9vaWRfY29tcGFyZV9sbChuYW1lLCBsZW4sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbXlwdHItPnN0YXJ0X2EsIG15cHRyLT5zdGFydF9sZW4sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmxsX29mZikgPCAwKSB7CiNlbHNlCiAgICAgICAgaWYgKHNubXBfb2lkX2NvbXBhcmUobmFtZSwgbGVuLCBteXB0ci0+c3RhcnRfYSwgbXlwdHItPnN0YXJ0X2xlbikgPCAwKSB7CiNlbmRpZgogICAgICAgICAgICBpZiAobG9va3VwX2NhY2hlX3NpemUgJiYgcHJldmlvdXMgJiYgY21wKSB7CiAgICAgICAgICAgICAgICBpZiAobG9va3VwX2NhY2hlKSB7CiAgICAgICAgICAgICAgICAgICAgbG9va3VwX2NhY2hlX3JlcGxhY2UobG9va3VwX2NhY2hlLCBteXB0ciwgcHJldmlvdXMpOwogICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICBsb29rdXBfY2FjaGVfYWRkKGNvbnRleHRfbmFtZSwgbXlwdHIsIHByZXZpb3VzKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICByZXR1cm4gcHJldmlvdXM7CiAgICAgICAgfQogICAgfQogICAgcmV0dXJuIHByZXZpb3VzOwp9CgpuZXRzbm1wX3N1YnRyZWUgKgpuZXRzbm1wX3N1YnRyZWVfZmluZF9uZXh0KGNvbnN0IG9pZCAqbmFtZSwgc2l6ZV90IGxlbiwKCQkJICBuZXRzbm1wX3N1YnRyZWUgKnN1YnRyZWUsIGNvbnN0IGNoYXIgKmNvbnRleHRfbmFtZSkKewogICAgbmV0c25tcF9zdWJ0cmVlICpteXB0ciA9IE5VTEw7CgogICAgbXlwdHIgPSBuZXRzbm1wX3N1YnRyZWVfZmluZF9wcmV2KG5hbWUsIGxlbiwgc3VidHJlZSwgY29udGV4dF9uYW1lKTsKCiAgICBpZiAobXlwdHIgIT0gTlVMTCkgewogICAgICAgIG15cHRyID0gbXlwdHItPm5leHQ7CiAgICAgICAgd2hpbGUgKG15cHRyICE9IE5VTEwgJiYgKG15cHRyLT52YXJpYWJsZXMgPT0gTlVMTCB8fCAKCQkJCSBteXB0ci0+dmFyaWFibGVzX2xlbiA9PSAwKSkgewogICAgICAgICAgICBteXB0ciA9IG15cHRyLT5uZXh0OwogICAgICAgIH0KICAgICAgICByZXR1cm4gbXlwdHI7CiAgICB9IGVsc2UgaWYgKHN1YnRyZWUgIT0gTlVMTCAmJiBzbm1wX29pZF9jb21wYXJlKG5hbWUsIGxlbiwgCgkJCQkgICBzdWJ0cmVlLT5zdGFydF9hLCBzdWJ0cmVlLT5zdGFydF9sZW4pIDwgMCkgewogICAgICAgIHJldHVybiBzdWJ0cmVlOwogICAgfSBlbHNlIHsKICAgICAgICByZXR1cm4gTlVMTDsKICAgIH0KfQoKbmV0c25tcF9zdWJ0cmVlICoKbmV0c25tcF9zdWJ0cmVlX2ZpbmQoY29uc3Qgb2lkICpuYW1lLCBzaXplX3QgbGVuLCBuZXRzbm1wX3N1YnRyZWUgKnN1YnRyZWUsIAoJCSAgICAgY29uc3QgY2hhciAqY29udGV4dF9uYW1lKQp7CiAgICBuZXRzbm1wX3N1YnRyZWUgKm15cHRyOwoKICAgIG15cHRyID0gbmV0c25tcF9zdWJ0cmVlX2ZpbmRfcHJldihuYW1lLCBsZW4sIHN1YnRyZWUsIGNvbnRleHRfbmFtZSk7CiAgICBpZiAobXlwdHIgJiYgbXlwdHItPmVuZF9hICYmCiAgICAgICAgc25tcF9vaWRfY29tcGFyZShuYW1lLCBsZW4sIG15cHRyLT5lbmRfYSwgbXlwdHItPmVuZF9sZW4pPDApIHsKICAgICAgICByZXR1cm4gbXlwdHI7CiAgICB9CgogICAgcmV0dXJuIE5VTEw7Cn0KCi8qKiAgQH0gKi8KLyogRW5kIG9mIFN1YnRyZWVzIG1haW50YWluaW5nIGNvZGUgKi8KCi8qKiBAZGVmZ3JvdXAgYWdlbnRfbWliX3JlZ2lzdGVyaW5nIFJlZ2lzdGVyaW5nIGFuZCB1bnJlZ2lzdGVyaW5nIE1JQiBzdWJ0cmVlcy4KICogICAgIEFkZGluZyBhbmQgcmVtb3ZpbmcgTUlCIG5vZGVzIHRvIHRoZSBkYXRhYmFzZSB1bmRlciB0aGVpciBjb250ZXh0cy4KICogICBAaW5ncm91cCBhZ2VudF9yZWdpc3RyeQogKgogKiBAewogKi8KCgovKiogUmVnaXN0ZXJzIGEgTUlCIGhhbmRsZXIuCiAqCiAqICBAcGFyYW0gbW9kdWxlTmFtZQogKiAgQHBhcmFtIHZhcgogKiAgQHBhcmFtIHZhcnNpemUKICogIEBwYXJhbSBudW12YXJzCiAqICBAcGFyYW0gIG1pYmxvYwogKiAgQHBhcmFtIG1pYmxvY2xlbgogKiAgQHBhcmFtIHByaW9yaXR5CiAqICBAcGFyYW0gcmFuZ2Vfc3ViaWQKICogIEBwYXJhbSByYW5nZV91Ym91bmQKICogIEBwYXJhbSAgc3MKICogIEBwYXJhbSBjb250ZXh0CiAqICBAcGFyYW0gdGltZW91dAogKiAgQHBhcmFtIGZsYWdzCiAqICBAcGFyYW0gcmVnaW5mbyBSZWdpc3RyYXRpb24gaGFuZGxlciBzdHJ1Y3R1cmUuCiAqICAgICAgICAgICAgICAgICBJbiBhIGNhc2Ugb2YgZmFpbHVyZSwgaXQgd2lsbCBiZSBmcmVlZC4KICogIEBwYXJhbSBwZXJmb3JtX2NhbGxiYWNrCiAqCiAqICBAcmV0dXJuIGdpdmVzIE1JQl9SRUdJU1RFUkVEX09LIG9yIE1JQl8qIGVycm9yIGNvZGUuCiAqCiAqICBAc2VlIG5ldHNubXBfcmVnaXN0ZXJfaGFuZGxlcigpCiAqICBAc2VlIHJlZ2lzdGVyX2FnZW50eF9saXN0KCkKICogIEBzZWUgbmV0c25tcF9oYW5kbGVyX3JlZ2lzdHJhdGlvbl9mcmVlKCkKICovCmludApuZXRzbm1wX3JlZ2lzdGVyX21pYihjb25zdCBjaGFyICptb2R1bGVOYW1lLAogICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgdmFyaWFibGUgKnZhciwKICAgICAgICAgICAgICAgICAgICAgc2l6ZV90IHZhcnNpemUsCiAgICAgICAgICAgICAgICAgICAgIHNpemVfdCBudW12YXJzLAogICAgICAgICAgICAgICAgICAgICBvaWQgKiBtaWJsb2MsCiAgICAgICAgICAgICAgICAgICAgIHNpemVfdCBtaWJsb2NsZW4sCiAgICAgICAgICAgICAgICAgICAgIGludCBwcmlvcml0eSwKICAgICAgICAgICAgICAgICAgICAgaW50IHJhbmdlX3N1YmlkLAogICAgICAgICAgICAgICAgICAgICBvaWQgcmFuZ2VfdWJvdW5kLAogICAgICAgICAgICAgICAgICAgICBuZXRzbm1wX3Nlc3Npb24gKiBzcywKICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqY29udGV4dCwKICAgICAgICAgICAgICAgICAgICAgaW50IHRpbWVvdXQsCiAgICAgICAgICAgICAgICAgICAgIGludCBmbGFncywKICAgICAgICAgICAgICAgICAgICAgbmV0c25tcF9oYW5kbGVyX3JlZ2lzdHJhdGlvbiAqcmVnaW5mbywKICAgICAgICAgICAgICAgICAgICAgaW50IHBlcmZvcm1fY2FsbGJhY2spCnsKICAgIG5ldHNubXBfc3VidHJlZSAqc3VidHJlZSwgKnN1YjI7CiAgICBpbnQgICAgICAgICAgICAgcmVzOwogICAgc3RydWN0IHJlZ2lzdGVyX3BhcmFtZXRlcnMgcmVnX3Bhcm1zOwogICAgaW50IG9sZF9sb29rdXBfY2FjaGVfdmFsID0gbmV0c25tcF9nZXRfbG9va3VwX2NhY2hlX3NpemUoKTsKCiAgICBpZiAobW9kdWxlTmFtZSA9PSBOVUxMIHx8CiAgICAgICAgbWlibG9jICAgICA9PSBOVUxMKSB7CiAgICAgICAgLyogU2hvdWxkbid0IGhhcHBlbiA/Pz8gKi8KICAgICAgICBuZXRzbm1wX2hhbmRsZXJfcmVnaXN0cmF0aW9uX2ZyZWUocmVnaW5mbyk7CiAgICAgICAgcmV0dXJuIE1JQl9SRUdJU1RSQVRJT05fRkFJTEVEOwogICAgfQogICAgc3VidHJlZSA9IChuZXRzbm1wX3N1YnRyZWUgKiljYWxsb2MoMSwgc2l6ZW9mKG5ldHNubXBfc3VidHJlZSkpOwogICAgaWYgKHN1YnRyZWUgPT0gTlVMTCkgewogICAgICAgIG5ldHNubXBfaGFuZGxlcl9yZWdpc3RyYXRpb25fZnJlZShyZWdpbmZvKTsKICAgICAgICByZXR1cm4gTUlCX1JFR0lTVFJBVElPTl9GQUlMRUQ7CiAgICB9CgogICAgREVCVUdNU0dUTCgoInJlZ2lzdGVyX21pYiIsICJyZWdpc3RlcmluZyBcIiVzXCIgYXQgIiwgbW9kdWxlTmFtZSkpOwogICAgREVCVUdNU0dPSURSQU5HRSgoInJlZ2lzdGVyX21pYiIsIG1pYmxvYywgbWlibG9jbGVuLCByYW5nZV9zdWJpZCwKICAgICAgICAgICAgICAgICAgICAgIHJhbmdlX3Vib3VuZCkpOwogICAgREVCVUdNU0coKCJyZWdpc3Rlcl9taWIiLCAiIHdpdGggY29udGV4dCBcIiVzXCJcbiIsCiAgICAgICAgICAgICAgU05NUF9TVFJPUk5VTEwoY29udGV4dCkpKTsKCiAgICAvKgogICAgICogdmVyaWZ5IHRoYXQgdGhlIHBhc3NlZCBjb250ZXh0IGlzIGVxdWFsIHRvIHRoZSBjb250ZXh0CiAgICAgKiBpbiB0aGUgcmVnaW5mby4KICAgICAqICh3aGljaCBiZWdzIHRoZSBxdWVzdGlvbiwgd2h5IGRvIHdlIGhhdmUgYm90aD8gSXQgYXBwZWFycyB0aGF0IHRoZQogICAgICogIHJlZ2luZm8gaXRlbSBkaWRuJ3QgYXBwZWFyIHRpbCA1LjIpCiAgICAgKi8KICAgIGlmKCAoKE5VTEwgPT0gY29udGV4dCkgJiYgKE5VTEwgIT0gcmVnaW5mby0+Y29udGV4dE5hbWUpKSB8fAogICAgICAgICgoTlVMTCAhPSBjb250ZXh0KSAmJiAoTlVMTCA9PSByZWdpbmZvLT5jb250ZXh0TmFtZSkpIHx8CiAgICAgICAgKCAoKE5VTEwgIT0gY29udGV4dCkgJiYgKE5VTEwgIT0gcmVnaW5mby0+Y29udGV4dE5hbWUpKSAmJgogICAgICAgICAgKDAgIT0gc3RyY21wKGNvbnRleHQsIHJlZ2luZm8tPmNvbnRleHROYW1lKSkpICkgewogICAgICAgIHNubXBfbG9nKExPR19XQVJOSU5HLCJjb250ZXh0IHBhc3NlZCBkdXJpbmcgcmVnaXN0cmF0aW9uIGRvZXMgbm90ICIKICAgICAgICAgICAgICAgICAiZXF1YWwgdGhlIHJlZ2luZm8gY29udGV4dE5hbWUhICgnJXMnICE9ICclcycpXG4iLAogICAgICAgICAgICAgICAgIGNvbnRleHQsIHJlZ2luZm8tPmNvbnRleHROYW1lKTsKICAgICAgICBuZXRzbm1wX2Fzc2VydCghInJlZ2lzdGVyIGNvbnRleHQgPT0gcmVnaW5mby0+Y29udGV4dE5hbWUiKTsgLyogYWx3YXlzIGZhbHNlICovCiAgICB9CgogICAgLyogIENyZWF0ZSB0aGUgbmV3IHN1YnRyZWUgbm9kZSBiZWluZyByZWdpc3RlcmVkLiAgKi8KCiAgICBzdWJ0cmVlLT5yZWdpbmZvID0gcmVnaW5mbzsKICAgIHN1YnRyZWUtPm5hbWVfYSAgPSBzbm1wX2R1cGxpY2F0ZV9vYmppZChtaWJsb2MsIG1pYmxvY2xlbik7CiAgICBzdWJ0cmVlLT5zdGFydF9hID0gc25tcF9kdXBsaWNhdGVfb2JqaWQobWlibG9jLCBtaWJsb2NsZW4pOwogICAgc3VidHJlZS0+ZW5kX2EgICA9IHNubXBfZHVwbGljYXRlX29iamlkKG1pYmxvYywgbWlibG9jbGVuKTsKICAgIHN1YnRyZWUtPmxhYmVsX2EgPSBzdHJkdXAobW9kdWxlTmFtZSk7CiAgICBpZiAoc3VidHJlZS0+bmFtZV9hID09IE5VTEwgfHwgc3VidHJlZS0+c3RhcnRfYSA9PSBOVUxMIHx8IAoJc3VidHJlZS0+ZW5kX2EgID09IE5VTEwgfHwgc3VidHJlZS0+bGFiZWxfYSA9PSBOVUxMKSB7CgluZXRzbm1wX3N1YnRyZWVfZnJlZShzdWJ0cmVlKTsgLyogYWxzbyBmcmVlcyByZWdpbmZvICovCglyZXR1cm4gTUlCX1JFR0lTVFJBVElPTl9GQUlMRUQ7CiAgICB9CiAgICBzdWJ0cmVlLT5uYW1lbGVuICAgPSAodV9jaGFyKW1pYmxvY2xlbjsKICAgIHN1YnRyZWUtPnN0YXJ0X2xlbiA9ICh1X2NoYXIpbWlibG9jbGVuOwogICAgc3VidHJlZS0+ZW5kX2xlbiAgID0gKHVfY2hhciltaWJsb2NsZW47CiAgICBzdWJ0cmVlLT5lbmRfYVttaWJsb2NsZW4gLSAxXSsrOwoKICAgIGlmICh2YXIgIT0gTlVMTCkgewoJc3VidHJlZS0+dmFyaWFibGVzID0gKHN0cnVjdCB2YXJpYWJsZSAqKW1hbGxvYyh2YXJzaXplKm51bXZhcnMpOwoJaWYgKHN1YnRyZWUtPnZhcmlhYmxlcyA9PSBOVUxMKSB7CgkgICAgbmV0c25tcF9zdWJ0cmVlX2ZyZWUoc3VidHJlZSk7IC8qIGFsc28gZnJlZXMgcmVnaW5mbyAqLwoJICAgIHJldHVybiBNSUJfUkVHSVNUUkFUSU9OX0ZBSUxFRDsKCX0KCW1lbWNweShzdWJ0cmVlLT52YXJpYWJsZXMsIHZhciwgbnVtdmFycyp2YXJzaXplKTsKCXN1YnRyZWUtPnZhcmlhYmxlc19sZW4gPSBudW12YXJzOwoJc3VidHJlZS0+dmFyaWFibGVzX3dpZHRoID0gdmFyc2l6ZTsKICAgIH0KICAgIHN1YnRyZWUtPnByaW9yaXR5ID0gcHJpb3JpdHk7CiAgICBzdWJ0cmVlLT50aW1lb3V0ID0gdGltZW91dDsKICAgIHN1YnRyZWUtPnJhbmdlX3N1YmlkID0gcmFuZ2Vfc3ViaWQ7CiAgICBzdWJ0cmVlLT5yYW5nZV91Ym91bmQgPSByYW5nZV91Ym91bmQ7CiAgICBzdWJ0cmVlLT5zZXNzaW9uID0gc3M7CiAgICBzdWJ0cmVlLT5mbGFncyA9ICh1X2NoYXIpZmxhZ3M7ICAgIC8qICB1c2VkIHRvIGlkZW50aWZ5IGluc3RhbmNlIG9pZHMgICovCiAgICBzdWJ0cmVlLT5mbGFncyB8PSBTVUJUUkVFX0FUVEFDSEVEOwogICAgc3VidHJlZS0+Z2xvYmFsX2NhY2hlaWQgPSByZWdpbmZvLT5nbG9iYWxfY2FjaGVpZDsKCiAgICBuZXRzbm1wX3NldF9sb29rdXBfY2FjaGVfc2l6ZSgwKTsKICAgIHJlcyA9IG5ldHNubXBfc3VidHJlZV9sb2FkKHN1YnRyZWUsIGNvbnRleHQpOwoKICAgIC8qICBJZiByZWdpc3RlcmluZyBhIHJhbmdlLCB1c2UgdGhlIGZpcnN0IHN1YnRyZWUgYXMgYSB0ZW1wbGF0ZSBmb3IgdGhlCglyZXN0IG9mIHRoZSByYW5nZS4gICovCgogICAgaWYgKHJlcyA9PSBNSUJfUkVHSVNURVJFRF9PSyAmJiByYW5nZV9zdWJpZCAhPSAwKSB7CiAgICAgICAgaW50IGk7Cglmb3IgKGkgPSBtaWJsb2NbcmFuZ2Vfc3ViaWQgLSAxXSArIDE7IGkgPD0gKGludClyYW5nZV91Ym91bmQ7IGkrKykgewoJICAgIHN1YjIgPSBuZXRzbm1wX3N1YnRyZWVfZGVlcGNvcHkoc3VidHJlZSk7CgoJICAgIGlmIChzdWIyID09IE5VTEwpIHsKICAgICAgICAgICAgICAgIHVucmVnaXN0ZXJfbWliX2NvbnRleHQobWlibG9jLCBtaWJsb2NsZW4sIHByaW9yaXR5LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByYW5nZV9zdWJpZCwgcmFuZ2VfdWJvdW5kLCBjb250ZXh0KTsKICAgICAgICAgICAgICAgIG5ldHNubXBfc2V0X2xvb2t1cF9jYWNoZV9zaXplKG9sZF9sb29rdXBfY2FjaGVfdmFsKTsKICAgICAgICAgICAgICAgIGludmFsaWRhdGVfbG9va3VwX2NhY2hlKGNvbnRleHQpOwogICAgICAgICAgICAgICAgcmV0dXJuIE1JQl9SRUdJU1RSQVRJT05fRkFJTEVEOwogICAgICAgICAgICB9CgogICAgICAgICAgICBzdWIyLT5uYW1lX2FbcmFuZ2Vfc3ViaWQgLSAxXSAgPSBpOwogICAgICAgICAgICBzdWIyLT5zdGFydF9hW3JhbmdlX3N1YmlkIC0gMV0gPSBpOwogICAgICAgICAgICBzdWIyLT5lbmRfYVtyYW5nZV9zdWJpZCAtIDFdICAgPSBpOyAgICAgLyogWFhYIC0gPz8/PyAqLwogICAgICAgICAgICBpZiAocmFuZ2Vfc3ViaWQgPT0gKGludCltaWJsb2NsZW4pIHsKICAgICAgICAgICAgICAgICsrc3ViMi0+ZW5kX2FbcmFuZ2Vfc3ViaWQgLSAxXTsKICAgICAgICAgICAgfQogICAgICAgICAgICBzdWIyLT5mbGFncyB8PSBTVUJUUkVFX0FUVEFDSEVEOwogICAgICAgICAgICBzdWIyLT5nbG9iYWxfY2FjaGVpZCA9IHJlZ2luZm8tPmdsb2JhbF9jYWNoZWlkOwogICAgICAgICAgICAvKiBGUlEgVGhpcyBpcyBlc3NlbnRpYWwgZm9yIHJlcXVlc3RzIHRvIHN1Y2NlZWQhICovCiAgICAgICAgICAgIHN1YjItPnJlZ2luZm8tPnJvb3RvaWRbcmFuZ2Vfc3ViaWQgLSAxXSAgPSBpOwoKICAgICAgICAgICAgcmVzID0gbmV0c25tcF9zdWJ0cmVlX2xvYWQoc3ViMiwgY29udGV4dCk7CiAgICAgICAgICAgIGlmIChyZXMgIT0gTUlCX1JFR0lTVEVSRURfT0spIHsKICAgICAgICAgICAgICAgIHVucmVnaXN0ZXJfbWliX2NvbnRleHQobWlibG9jLCBtaWJsb2NsZW4sIHByaW9yaXR5LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByYW5nZV9zdWJpZCwgcmFuZ2VfdWJvdW5kLCBjb250ZXh0KTsKICAgICAgICAgICAgICAgIG5ldHNubXBfcmVtb3ZlX3N1YnRyZWUoc3ViMik7CgkJbmV0c25tcF9zdWJ0cmVlX2ZyZWUoc3ViMik7CiAgICAgICAgICAgICAgICBuZXRzbm1wX3NldF9sb29rdXBfY2FjaGVfc2l6ZShvbGRfbG9va3VwX2NhY2hlX3ZhbCk7CiAgICAgICAgICAgICAgICBpbnZhbGlkYXRlX2xvb2t1cF9jYWNoZShjb250ZXh0KTsKICAgICAgICAgICAgICAgIHJldHVybiByZXM7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9IGVsc2UgaWYgKHJlcyA9PSBNSUJfRFVQTElDQVRFX1JFR0lTVFJBVElPTiB8fAogICAgICAgICAgICAgICByZXMgPT0gTUlCX1JFR0lTVFJBVElPTl9GQUlMRUQpIHsKICAgICAgICBuZXRzbm1wX3NldF9sb29rdXBfY2FjaGVfc2l6ZShvbGRfbG9va3VwX2NhY2hlX3ZhbCk7CiAgICAgICAgaW52YWxpZGF0ZV9sb29rdXBfY2FjaGUoY29udGV4dCk7CiAgICAgICAgbmV0c25tcF9zdWJ0cmVlX2ZyZWUoc3VidHJlZSk7CiAgICAgICAgcmV0dXJuIHJlczsKICAgIH0KCiAgICAvKgogICAgICogbWFyayB0aGUgTUlCIGFzIGRldGFjaGVkLCBpZiB0aGVyZSdzIG5vIG1hc3RlciBhZ2VudCBwcmVzZW50IGFzIG9mIG5vdyAKICAgICAqLwogICAgaWYgKG5ldHNubXBfZHNfZ2V0X2Jvb2xlYW4oTkVUU05NUF9EU19BUFBMSUNBVElPTl9JRCwgCgkJCSAgICAgICBORVRTTk1QX0RTX0FHRU5UX1JPTEUpICE9IE1BU1RFUl9BR0VOVCkgewogICAgICAgIGV4dGVybiBzdHJ1Y3Qgc25tcF9zZXNzaW9uICptYWluX3Nlc3Npb247CiAgICAgICAgaWYgKG1haW5fc2Vzc2lvbiA9PSBOVUxMKSB7CiAgICAgICAgICAgIHJlZ2lzdGVyX21pYl9kZXRhY2hfbm9kZShzdWJ0cmVlKTsKCX0KICAgIH0KCiAgICBpZiAocmVzID09IE1JQl9SRUdJU1RFUkVEX09LICYmIHBlcmZvcm1fY2FsbGJhY2spIHsKICAgICAgICBtZW1zZXQoJnJlZ19wYXJtcywgMHgwLCBzaXplb2YocmVnX3Bhcm1zKSk7CiAgICAgICAgcmVnX3Bhcm1zLm5hbWUgPSBtaWJsb2M7CiAgICAgICAgcmVnX3Bhcm1zLm5hbWVsZW4gPSBtaWJsb2NsZW47CiAgICAgICAgcmVnX3Bhcm1zLnByaW9yaXR5ID0gcHJpb3JpdHk7CiAgICAgICAgcmVnX3Bhcm1zLnJhbmdlX3N1YmlkID0gcmFuZ2Vfc3ViaWQ7CiAgICAgICAgcmVnX3Bhcm1zLnJhbmdlX3Vib3VuZCA9IHJhbmdlX3Vib3VuZDsKICAgICAgICByZWdfcGFybXMudGltZW91dCA9IHRpbWVvdXQ7CiAgICAgICAgcmVnX3Bhcm1zLmZsYWdzID0gKHVfY2hhcikgZmxhZ3M7CiAgICAgICAgcmVnX3Bhcm1zLmNvbnRleHROYW1lID0gY29udGV4dDsKICAgICAgICByZWdfcGFybXMuc2Vzc2lvbiA9IHNzOwogICAgICAgIHJlZ19wYXJtcy5yZWdpbmZvID0gcmVnaW5mbzsKICAgICAgICByZWdfcGFybXMuY29udGV4dE5hbWUgPSBjb250ZXh0OwogICAgICAgIHNubXBfY2FsbF9jYWxsYmFja3MoU05NUF9DQUxMQkFDS19BUFBMSUNBVElPTiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNOTVBEX0NBTExCQUNLX1JFR0lTVEVSX09JRCwgJnJlZ19wYXJtcyk7CiAgICB9CgogICAgbmV0c25tcF9zZXRfbG9va3VwX2NhY2hlX3NpemUob2xkX2xvb2t1cF9jYWNoZV92YWwpOwogICAgaW52YWxpZGF0ZV9sb29rdXBfY2FjaGUoY29udGV4dCk7CiAgICByZXR1cm4gcmVzOwp9CgovKiogQHByaXZhdGUKICogIFJlYXR0YWNoIGEgcGFydGljdWxhciBub2RlLiAgCiAqLwpzdGF0aWMgdm9pZApyZWdpc3Rlcl9taWJfcmVhdHRhY2hfbm9kZShuZXRzbm1wX3N1YnRyZWUgKnMpCnsKICAgIGlmICgocyAhPSBOVUxMKSAmJiAocy0+bmFtZWxlbiA+IDEpICYmICEocy0+ZmxhZ3MgJiBTVUJUUkVFX0FUVEFDSEVEKSkgewogICAgICAgIHN0cnVjdCByZWdpc3Rlcl9wYXJhbWV0ZXJzIHJlZ19wYXJtczsKICAgICAgICAvKgogICAgICAgICAqIG9ubHkgZG8gcmVnaXN0cmF0aW9ucyB0aGF0IGFyZSBub3QgdGhlIHRvcCBsZXZlbCBub2RlcyAKICAgICAgICAgKi8KICAgICAgICBtZW1zZXQoJnJlZ19wYXJtcywgMHgwLCBzaXplb2YocmVnX3Bhcm1zKSk7CgogICAgICAgIC8qCiAgICAgICAgICogWFhYOiBkbyB0aGlzIGJldHRlciAKICAgICAgICAgKi8KICAgICAgICByZWdfcGFybXMubmFtZSA9IHMtPm5hbWVfYTsKICAgICAgICByZWdfcGFybXMubmFtZWxlbiA9IHMtPm5hbWVsZW47CiAgICAgICAgcmVnX3Bhcm1zLnByaW9yaXR5ID0gcy0+cHJpb3JpdHk7CiAgICAgICAgcmVnX3Bhcm1zLnJhbmdlX3N1YmlkID0gcy0+cmFuZ2Vfc3ViaWQ7CiAgICAgICAgcmVnX3Bhcm1zLnJhbmdlX3Vib3VuZCA9IHMtPnJhbmdlX3Vib3VuZDsKICAgICAgICByZWdfcGFybXMudGltZW91dCA9IHMtPnRpbWVvdXQ7CiAgICAgICAgcmVnX3Bhcm1zLmZsYWdzID0gcy0+ZmxhZ3M7CiAgICAgICAgcmVnX3Bhcm1zLnNlc3Npb24gPSBzLT5zZXNzaW9uOwogICAgICAgIHJlZ19wYXJtcy5yZWdpbmZvID0gcy0+cmVnaW5mbzsKICAgICAgICAvKiBYWFg6IG1pc3NpbmcgaW4gc3VidHJlZTogcmVnX3Bhcm1zLmNvbnRleHROYW1lID0gcy0+Y29udGV4dDsgKi8KICAgICAgICBpZiAoKE5VTEwgIT0gcy0+cmVnaW5mbykgJiYgKE5VTEwgIT0gcy0+cmVnaW5mby0+Y29udGV4dE5hbWUpKQogICAgICAgICAgICByZWdfcGFybXMuY29udGV4dE5hbWUgPSBzLT5yZWdpbmZvLT5jb250ZXh0TmFtZTsKICAgICAgICBzbm1wX2NhbGxfY2FsbGJhY2tzKFNOTVBfQ0FMTEJBQ0tfQVBQTElDQVRJT04sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBTTk1QRF9DQUxMQkFDS19SRUdJU1RFUl9PSUQsICZyZWdfcGFybXMpOwogICAgICAgIHMtPmZsYWdzIHw9IFNVQlRSRUVfQVRUQUNIRUQ7CiAgICB9Cn0KCi8qKiBDYWxsIGNhbGxiYWNrcyB0byByZWF0dGFjaCBhbGwgb3VyIG5vZGVzLiAgCiAqLwp2b2lkCnJlZ2lzdGVyX21pYl9yZWF0dGFjaCh2b2lkKQp7CiAgICBuZXRzbm1wX3N1YnRyZWUgKnMsICp0OwogICAgc3VidHJlZV9jb250ZXh0X2NhY2hlICpwdHI7CgogICAgZm9yIChwdHIgPSBjb250ZXh0X3N1YnRyZWVzOyBwdHI7IHB0ciA9IHB0ci0+bmV4dCkgewogICAgICAgIGZvciAocyA9IHB0ci0+Zmlyc3Rfc3VidHJlZTsgcyAhPSBOVUxMOyBzID0gcy0+bmV4dCkgewogICAgICAgICAgICByZWdpc3Rlcl9taWJfcmVhdHRhY2hfbm9kZShzKTsKICAgICAgICAgICAgZm9yICh0ID0gcy0+Y2hpbGRyZW47IHQgIT0gTlVMTDsgdCA9IHQtPmNoaWxkcmVuKSB7CiAgICAgICAgICAgICAgICByZWdpc3Rlcl9taWJfcmVhdHRhY2hfbm9kZSh0KTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0KfQoKLyoqIEBwcml2YXRlCiAqICBNYXJrIGEgbm9kZSBhcyBkZXRhY2hlZC4KICoKICogIEBwYXJhbSBzIFRoZSBub3RlIHRvIGJlIG1hcmtlZAogKi8Kc3RhdGljIHZvaWQKcmVnaXN0ZXJfbWliX2RldGFjaF9ub2RlKG5ldHNubXBfc3VidHJlZSAqcykKewogICAgaWYgKHMgIT0gTlVMTCkgewogICAgICAgIHMtPmZsYWdzID0gcy0+ZmxhZ3MgJiB+U1VCVFJFRV9BVFRBQ0hFRDsKICAgIH0KfQoKLyoqIE1hcmsgYWxsIG91ciByZWdpc3RlcmVkIE9JRHMgYXMgZGV0YWNoZWQuCiAqICBUaGlzIGlzIG9ubHkgcmVhbGx5IHVzZWZ1bCBmb3Igc3ViYWdlbnQgcHJvdG9jb2xzLCB3aGVuCiAqICBhIGNvbm5lY3Rpb24gaXMgbG9zdCBvciB0aGUgc3ViYWdlbnQgaXMgYmVpbmcgc2h1dCBkb3duLiAgCiAqLwp2b2lkCnJlZ2lzdGVyX21pYl9kZXRhY2godm9pZCkKewogICAgbmV0c25tcF9zdWJ0cmVlICpzLCAqdDsKICAgIHN1YnRyZWVfY29udGV4dF9jYWNoZSAqcHRyOwogICAgZm9yIChwdHIgPSBjb250ZXh0X3N1YnRyZWVzOyBwdHI7IHB0ciA9IHB0ci0+bmV4dCkgewogICAgICAgIGZvciAocyA9IHB0ci0+Zmlyc3Rfc3VidHJlZTsgcyAhPSBOVUxMOyBzID0gcy0+bmV4dCkgewogICAgICAgICAgICByZWdpc3Rlcl9taWJfZGV0YWNoX25vZGUocyk7CiAgICAgICAgICAgIGZvciAodCA9IHMtPmNoaWxkcmVuOyB0ICE9IE5VTEw7IHQgPSB0LT5jaGlsZHJlbikgewogICAgICAgICAgICAgICAgcmVnaXN0ZXJfbWliX2RldGFjaF9ub2RlKHQpOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfQp9CgovKiogUmVnaXN0ZXIgYSBuZXcgbW9kdWxlIGludG8gdGhlIE1JQiBkYXRhYmFzZSwgd2l0aCBhbGwgcG9zc2libGUgY3VzdG9tIG9wdGlvbnMKICoKICogIEBwYXJhbSAgbW9kdWxlTmFtZSBUZXh0IG5hbWUgb2YgdGhlIG1vZHVsZS4KICogICAgICAgICAgICAgICAgICAgICBUaGUgZ2l2ZW4gbmFtZSB3aWxsIGJlIHVzZWQgdG8gaWRlbnRpZnkgdGhlIG1vZHVsZQogKiAgICAgICAgICAgICAgICAgICAgIGluc2lkZSB0aGUgYWdlbnQuCiAqCiAqICBAcGFyYW0gIHZhciAgICAgICAgQXJyYXkgb2YgdmFyaWFibGVzIHRvIGJlIHJlZ2lzdGVyZWQgaW4gdGhlIG1vZHVsZS4KICoKICogIEBwYXJhbSAgdmFyc2l6ZSAgICBTaXplIG9mIGEgc2luZ2xlIHZhcmlhYmxlIGluIHZhciBhcnJheS4KICogICAgICAgICAgICAgICAgICAgICBUaGUgc2l6ZSBpcyBub3JtYWxseSBlcXVhbCB0byBzaXplb2Yoc3RydWN0IHZhcmlhYmxlKSwKICogICAgICAgICAgICAgICAgICAgICBidXQgaWYgd2Ugd2lzaCB0byB1c2Ugc2hvcnRlciAob3IgbG9uZ2VyKSBPSURzLCB0aGVuIHdlCiAqICAgICAgICAgICAgICAgICAgICAgY291bGQgdXNlIGRpZmZlcmVudCB2YXJpYW50IG9mIHRoZSB2YXJpYWJsZSBzdHJ1Y3R1cmUuCiAqCiAqICBAcGFyYW0gIG51bXZhcnMgICAgTnVtYmVyIG9mIHZhcmlhYmxlcyBpbiB0aGUgdmFyIGFycmF5LgogKiAgICAgICAgICAgICAgICAgICAgIFRoaXMgaXMgaG93IG1hbnkgdmFyaWFibGVzIHRoZSBmdW5jdGlvbiB3aWxsIHRyeSB0byByZWdpc3Rlci4KICoKICogIEBwYXJhbSAgbWlibG9jICAgICBCYXNlIE9JRCBvZiB0aGUgbW9kdWxlLgogKiAgICAgICAgICAgICAgICAgICAgIEFsbCBPSURzIGluIHZhciBhcnJheSBzaG91bGQgYmUgc3ViLW9pZHMgb2YgdGhlIGJhc2UgT0lELgogKgogKiAgQHBhcmFtICBtaWJsb2NsZW4gIExlbmd0aCBvZiB0aGUgYmFzZSBPSUQuCiAqICAgICAgICAgICAgICAgICAgICAgTnVtYmVyIG9mIGludGVnZXJzIG1ha2luZyB1cCB0aGUgYmFzZSBPSUQuCiAqCiAqICBAcGFyYW0gIHByaW9yaXR5ICAgUmVnaXN0cmF0aW9uIHByaW9yaXR5LgogKiAgICAgICAgICAgICAgICAgICAgIFVzZWQgdG8gYWNoaWV2ZSBhIGRlc2lyZWQgY29uZmlndXJhdGlvbiB3aGVuIGRpZmZlcmVudAogKiAgICAgICAgICAgICAgICAgICAgIHNlc3Npb25zIHJlZ2lzdGVyIGlkZW50aWNhbCBvciBvdmVybGFwcGluZyByZWdpb25zLgogKiAgICAgICAgICAgICAgICAgICAgIFByaW1hcmlseSB1c2VkIHdpdGggQWdlbnRYIHN1YmFnZW50IHJlZ2lzdHJhdGlvbnMuCiAqCiAqICBAcGFyYW0gcmFuZ2Vfc3ViaWQgSWYgbm9uLXplcm8sIHRoZSBtb2R1bGUgaXMgcmVnaXN0ZXJlZCBhZ2FpbnN0IGEgcmFuZ2UKICogICAgICAgICAgICAgICAgICAgICBvZiBPSURzLCB3aXRoIHRoaXMgcGFyYW1ldGVyIGlkZW50aWZ5aW5nIHRoZSByZWxldmFudAogKiAgICAgICAgICAgICAgICAgICAgIHN1YmlkZW50aWZpZXIgLSBzZWUgUkZDIDI3NDEgZm9yIGRldGFpbHMuCiAqICAgICAgICAgICAgICAgICAgICAgVHlwaWNhbGx5IHVzZWQgdG8gcmVnaXN0ZXIgYSBzaW5nbGUgcm93IG9mIGEgdGFibGUuCiAqICAgICAgICAgICAgICAgICAgICAgSWYgemVybywgdGhlbiByZWdpc3RlciB0aGUgbW9kdWxlIGFnYWluc3QgdGhlIGZ1bGwgT0lEIHN1YnRyZWUuCiAqCiAqICBAcGFyYW0gcmFuZ2VfdWJvdW5kIFRoZSBlbmQgb2YgdGhlIHJhbmdlIGJlaW5nIHJlZ2lzdGVyZWQgKHNlZSBSRkMgMjc0MSkKICogICAgICAgICAgICAgICAgICAgICBJZiByYW5nZV9zdWJpZCBpcyB6ZXJvLCB0aGVuIHRoaXMgcGFyYW1ldGVyIGlzIGlnbm9yZWQuCiAqCiAqICBAcGFyYW0gc3MgCiAqICBAcGFyYW0gY29udGV4dAogKiAgQHBhcmFtIHRpbWVvdXQgCiAqICBAcGFyYW0gZmxhZ3MgCiAqCiAqICBAcmV0dXJuIGdpdmVzIFNOTVBFUlJfU1VDQ0VTUyBvciBTTk1QRVJSXyogZXJyb3IgY29kZS4KICoKICogIEBzZWUgcmVnaXN0ZXJfbWliKCkKICogIEBzZWUgcmVnaXN0ZXJfbWliX3ByaW9yaXR5KCkKICogIEBzZWUgcmVnaXN0ZXJfbWliX3JhbmdlKCkKICogIEBzZWUgdW5yZWdpc3Rlcl9taWIoKQogKi8KaW50CnJlZ2lzdGVyX21pYl9jb250ZXh0KGNvbnN0IGNoYXIgKm1vZHVsZU5hbWUsCiAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0cnVjdCB2YXJpYWJsZSAqdmFyLAogICAgICAgICAgICAgICAgICAgICBzaXplX3QgdmFyc2l6ZSwKICAgICAgICAgICAgICAgICAgICAgc2l6ZV90IG51bXZhcnMsCiAgICAgICAgICAgICAgICAgICAgIGNvbnN0IG9pZCAqIG1pYmxvYywKICAgICAgICAgICAgICAgICAgICAgc2l6ZV90IG1pYmxvY2xlbiwKICAgICAgICAgICAgICAgICAgICAgaW50IHByaW9yaXR5LAogICAgICAgICAgICAgICAgICAgICBpbnQgcmFuZ2Vfc3ViaWQsCiAgICAgICAgICAgICAgICAgICAgIG9pZCByYW5nZV91Ym91bmQsCiAgICAgICAgICAgICAgICAgICAgIG5ldHNubXBfc2Vzc2lvbiAqIHNzLAogICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpjb250ZXh0LCBpbnQgdGltZW91dCwgaW50IGZsYWdzKQp7CiAgICByZXR1cm4gbmV0c25tcF9yZWdpc3Rlcl9vbGRfYXBpKG1vZHVsZU5hbWUsIHZhciwgdmFyc2l6ZSwgbnVtdmFycywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWlibG9jLCBtaWJsb2NsZW4sIHByaW9yaXR5LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByYW5nZV9zdWJpZCwgcmFuZ2VfdWJvdW5kLCBzcywgY29udGV4dCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGltZW91dCwgZmxhZ3MpOwp9CgovKiogUmVnaXN0ZXIgYSBuZXcgbW9kdWxlIGludG8gdGhlIE1JQiBkYXRhYmFzZSwgYXMgYmVpbmcgcmVzcG9uc2libGUKICogICBmb3IgYSByYW5nZSBvZiBPSURzICh0eXBpY2FsbHkgYSBzaW5nbGUgcm93IG9mIGEgdGFibGUpLgogKgogKiAgQHBhcmFtICBtb2R1bGVOYW1lIFRleHQgbmFtZSBvZiB0aGUgbW9kdWxlLgogKiAgICAgICAgICAgICAgICAgICAgIFRoZSBnaXZlbiBuYW1lIHdpbGwgYmUgdXNlZCB0byBpZGVudGlmeSB0aGUgbW9kdWxlCiAqICAgICAgICAgICAgICAgICAgICAgaW5zaWRlIHRoZSBhZ2VudC4KICoKICogIEBwYXJhbSAgdmFyICAgICAgICBBcnJheSBvZiB2YXJpYWJsZXMgdG8gYmUgcmVnaXN0ZXJlZCBpbiB0aGUgbW9kdWxlLgogKgogKiAgQHBhcmFtICB2YXJzaXplICAgIFNpemUgb2YgYSBzaW5nbGUgdmFyaWFibGUgaW4gdmFyIGFycmF5LgogKiAgICAgICAgICAgICAgICAgICAgIFRoZSBzaXplIGlzIG5vcm1hbGx5IGVxdWFsIHRvIHNpemVvZihzdHJ1Y3QgdmFyaWFibGUpLAogKiAgICAgICAgICAgICAgICAgICAgIGJ1dCBpZiB3ZSB3aXNoIHRvIHVzZSBzaG9ydGVyIChvciBsb25nZXIpIE9JRHMsIHRoZW4gd2UKICogICAgICAgICAgICAgICAgICAgICBjb3VsZCB1c2UgZGlmZmVyZW50IHZhcmlhbnQgb2YgdGhlIHZhcmlhYmxlIHN0cnVjdHVyZS4KICoKICogIEBwYXJhbSAgbnVtdmFycyAgICBOdW1iZXIgb2YgdmFyaWFibGVzIGluIHRoZSB2YXIgYXJyYXkuCiAqICAgICAgICAgICAgICAgICAgICAgVGhpcyBpcyBob3cgbWFueSB2YXJpYWJsZXMgdGhlIGZ1bmN0aW9uIHdpbGwgdHJ5IHRvIHJlZ2lzdGVyLgogKgogKiAgQHBhcmFtICBtaWJsb2MgICAgIEJhc2UgT0lEIG9mIHRoZSBtb2R1bGUuCiAqICAgICAgICAgICAgICAgICAgICAgQWxsIE9JRHMgaW4gdmFyIGFycmF5IHNob3VsZCBiZSBzdWItb2lkcyBvZiB0aGUgYmFzZSBPSUQuCiAqCiAqICBAcGFyYW0gIG1pYmxvY2xlbiAgTGVuZ3RoIG9mIHRoZSBiYXNlIE9JRC4KICogICAgICAgICAgICAgICAgICAgICBOdW1iZXIgb2YgaW50ZWdlcnMgbWFraW5nIHVwIHRoZSBiYXNlIE9JRC4KICoKICogIEBwYXJhbSAgcHJpb3JpdHkgICBSZWdpc3RyYXRpb24gcHJpb3JpdHkuCiAqICAgICAgICAgICAgICAgICAgICAgVXNlZCB0byBhY2hpZXZlIGEgZGVzaXJlZCBjb25maWd1cmF0aW9uIHdoZW4gZGlmZmVyZW50CiAqICAgICAgICAgICAgICAgICAgICAgc2Vzc2lvbnMgcmVnaXN0ZXIgaWRlbnRpY2FsIG9yIG92ZXJsYXBwaW5nIHJlZ2lvbnMuCiAqICAgICAgICAgICAgICAgICAgICAgUHJpbWFyaWx5IHVzZWQgd2l0aCBBZ2VudFggc3ViYWdlbnQgcmVnaXN0cmF0aW9ucy4KICoKICogIEBwYXJhbSByYW5nZV9zdWJpZCBJZiBub24temVybywgdGhlIG1vZHVsZSBpcyByZWdpc3RlcmVkIGFnYWluc3QgYSByYW5nZQogKiAgICAgICAgICAgICAgICAgICAgIG9mIE9JRHMsIHdpdGggdGhpcyBwYXJhbWV0ZXIgaWRlbnRpZnlpbmcgdGhlIHJlbGV2YW50CiAqICAgICAgICAgICAgICAgICAgICAgc3ViaWRlbnRpZmllciAtIHNlZSBSRkMgMjc0MSBmb3IgZGV0YWlscy4KICogICAgICAgICAgICAgICAgICAgICBUeXBpY2FsbHkgdXNlZCB0byByZWdpc3RlciBhIHNpbmdsZSByb3cgb2YgYSB0YWJsZS4KICogICAgICAgICAgICAgICAgICAgICBJZiB6ZXJvLCB0aGVuIHJlZ2lzdGVyIHRoZSBtb2R1bGUgYWdhaW5zdCB0aGUgZnVsbCBPSUQgc3VidHJlZS4KICoKICogIEBwYXJhbSByYW5nZV91Ym91bmQgVGhlIGVuZCBvZiB0aGUgcmFuZ2UgYmVpbmcgcmVnaXN0ZXJlZCAoc2VlIFJGQyAyNzQxKQogKiAgICAgICAgICAgICAgICAgICAgIElmIHJhbmdlX3N1YmlkIGlzIHplcm8sIHRoZW4gdGhpcyBwYXJhbWV0ZXIgaXMgaWdub3JlZC4KICoKICogIEBwYXJhbSBzcyAKICoKICogIEByZXR1cm4gZ2l2ZXMgU05NUEVSUl9TVUNDRVNTIG9yIFNOTVBFUlJfKiBlcnJvciBjb2RlLgogKgogKiAgQHNlZSByZWdpc3Rlcl9taWIoKQogKiAgQHNlZSByZWdpc3Rlcl9taWJfcHJpb3JpdHkoKQogKiAgQHNlZSByZWdpc3Rlcl9taWJfY29udGV4dCgpCiAqICBAc2VlIHVucmVnaXN0ZXJfbWliKCkKICovCmludApyZWdpc3Rlcl9taWJfcmFuZ2UoY29uc3QgY2hhciAqbW9kdWxlTmFtZSwKICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0cnVjdCB2YXJpYWJsZSAqdmFyLAogICAgICAgICAgICAgICAgICAgc2l6ZV90IHZhcnNpemUsCiAgICAgICAgICAgICAgICAgICBzaXplX3QgbnVtdmFycywKICAgICAgICAgICAgICAgICAgIGNvbnN0IG9pZCAqIG1pYmxvYywKICAgICAgICAgICAgICAgICAgIHNpemVfdCBtaWJsb2NsZW4sCiAgICAgICAgICAgICAgICAgICBpbnQgcHJpb3JpdHksCiAgICAgICAgICAgICAgICAgICBpbnQgcmFuZ2Vfc3ViaWQsIG9pZCByYW5nZV91Ym91bmQsIG5ldHNubXBfc2Vzc2lvbiAqIHNzKQp7CiAgICByZXR1cm4gcmVnaXN0ZXJfbWliX2NvbnRleHQobW9kdWxlTmFtZSwgdmFyLCB2YXJzaXplLCBudW12YXJzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1pYmxvYywgbWlibG9jbGVuLCBwcmlvcml0eSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByYW5nZV9zdWJpZCwgcmFuZ2VfdWJvdW5kLCBzcywgIiIsIC0xLCAwKTsKfQoKLyoqIFJlZ2lzdGVyIGEgbmV3IG1vZHVsZSBpbnRvIHRoZSBNSUIgZGF0YWJhc2UsIHdpdGggYSBub24tZGVmYXVsdCBwcmlvcml0eQogKgogKiAgQHBhcmFtICBtb2R1bGVOYW1lIFRleHQgbmFtZSBvZiB0aGUgbW9kdWxlLgogKiAgICAgICAgICAgICAgICAgICAgIFRoZSBnaXZlbiBuYW1lIHdpbGwgYmUgdXNlZCB0byBpZGVudGlmeSB0aGUgbW9kdWxlCiAqICAgICAgICAgICAgICAgICAgICAgaW5zaWRlIHRoZSBhZ2VudC4KICoKICogIEBwYXJhbSAgdmFyICAgICAgICBBcnJheSBvZiB2YXJpYWJsZXMgdG8gYmUgcmVnaXN0ZXJlZCBpbiB0aGUgbW9kdWxlLgogKgogKiAgQHBhcmFtICB2YXJzaXplICAgIFNpemUgb2YgYSBzaW5nbGUgdmFyaWFibGUgaW4gdmFyIGFycmF5LgogKiAgICAgICAgICAgICAgICAgICAgIFRoZSBzaXplIGlzIG5vcm1hbGx5IGVxdWFsIHRvIHNpemVvZihzdHJ1Y3QgdmFyaWFibGUpLAogKiAgICAgICAgICAgICAgICAgICAgIGJ1dCBpZiB3ZSB3aXNoIHRvIHVzZSBzaG9ydGVyIChvciBsb25nZXIpIE9JRHMsIHRoZW4gd2UKICogICAgICAgICAgICAgICAgICAgICBjb3VsZCB1c2UgZGlmZmVyZW50IHZhcmlhbnQgb2YgdGhlIHZhcmlhYmxlIHN0cnVjdHVyZS4KICoKICogIEBwYXJhbSAgbnVtdmFycyAgICBOdW1iZXIgb2YgdmFyaWFibGVzIGluIHRoZSB2YXIgYXJyYXkuCiAqICAgICAgICAgICAgICAgICAgICAgVGhpcyBpcyBob3cgbWFueSB2YXJpYWJsZXMgdGhlIGZ1bmN0aW9uIHdpbGwgdHJ5IHRvIHJlZ2lzdGVyLgogKgogKiAgQHBhcmFtICBtaWJsb2MgICAgIEJhc2UgT0lEIG9mIHRoZSBtb2R1bGUuCiAqICAgICAgICAgICAgICAgICAgICAgQWxsIE9JRHMgaW4gdmFyIGFycmF5IHNob3VsZCBiZSBzdWItb2lkcyBvZiB0aGUgYmFzZSBPSUQuCiAqCiAqICBAcGFyYW0gIG1pYmxvY2xlbiAgTGVuZ3RoIG9mIHRoZSBiYXNlIE9JRC4KICogICAgICAgICAgICAgICAgICAgICBOdW1iZXIgb2YgaW50ZWdlcnMgbWFraW5nIHVwIHRoZSBiYXNlIE9JRC4KICoKICogIEBwYXJhbSAgcHJpb3JpdHkgICBSZWdpc3RyYXRpb24gcHJpb3JpdHkuCiAqICAgICAgICAgICAgICAgICAgICAgVXNlZCB0byBhY2hpZXZlIGEgZGVzaXJlZCBjb25maWd1cmF0aW9uIHdoZW4gZGlmZmVyZW50CiAqICAgICAgICAgICAgICAgICAgICAgc2Vzc2lvbnMgcmVnaXN0ZXIgaWRlbnRpY2FsIG9yIG92ZXJsYXBwaW5nIHJlZ2lvbnMuCiAqICAgICAgICAgICAgICAgICAgICAgUHJpbWFyaWx5IHVzZWQgd2l0aCBBZ2VudFggc3ViYWdlbnQgcmVnaXN0cmF0aW9ucy4KICoKICogIEByZXR1cm4gZ2l2ZXMgU05NUEVSUl9TVUNDRVNTIG9yIFNOTVBFUlJfKiBlcnJvciBjb2RlLgogKgogKiAgQHNlZSByZWdpc3Rlcl9taWIoKQogKiAgQHNlZSByZWdpc3Rlcl9taWJfcmFuZ2UoKQogKiAgQHNlZSByZWdpc3Rlcl9taWJfY29udGV4dCgpCiAqICBAc2VlIHVucmVnaXN0ZXJfbWliKCkKICovCmludApyZWdpc3Rlcl9taWJfcHJpb3JpdHkoY29uc3QgY2hhciAqbW9kdWxlTmFtZSwKICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0cnVjdCB2YXJpYWJsZSAqdmFyLAogICAgICAgICAgICAgICAgICAgICAgc2l6ZV90IHZhcnNpemUsCiAgICAgICAgICAgICAgICAgICAgICBzaXplX3QgbnVtdmFycywKICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IG9pZCAqIG1pYmxvYywgc2l6ZV90IG1pYmxvY2xlbiwgaW50IHByaW9yaXR5KQp7CiAgICByZXR1cm4gcmVnaXN0ZXJfbWliX3JhbmdlKG1vZHVsZU5hbWUsIHZhciwgdmFyc2l6ZSwgbnVtdmFycywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWlibG9jLCBtaWJsb2NsZW4sIHByaW9yaXR5LCAwLCAwLCBOVUxMKTsKfQoKLyoqIFJlZ2lzdGVyIGEgbmV3IG1vZHVsZSBpbnRvIHRoZSBNSUIgZGF0YWJhc2UsIHVzaW5nIGRlZmF1bHQgcHJpb3JpdHkgYW5kIGNvbnRleHQKICoKICogIEBwYXJhbSAgbW9kdWxlTmFtZSBUZXh0IG5hbWUgb2YgdGhlIG1vZHVsZS4KICogICAgICAgICAgICAgICAgICAgICBUaGUgZ2l2ZW4gbmFtZSB3aWxsIGJlIHVzZWQgdG8gaWRlbnRpZnkgdGhlIG1vZHVsZQogKiAgICAgICAgICAgICAgICAgICAgIGluc2lkZSB0aGUgYWdlbnQuCiAqCiAqICBAcGFyYW0gIHZhciAgICAgICAgQXJyYXkgb2YgdmFyaWFibGVzIHRvIGJlIHJlZ2lzdGVyZWQgaW4gdGhlIG1vZHVsZS4KICoKICogIEBwYXJhbSAgdmFyc2l6ZSAgICBTaXplIG9mIGEgc2luZ2xlIHZhcmlhYmxlIGluIHZhciBhcnJheS4KICogICAgICAgICAgICAgICAgICAgICBUaGUgc2l6ZSBpcyBub3JtYWxseSBlcXVhbCB0byBzaXplb2Yoc3RydWN0IHZhcmlhYmxlKSwKICogICAgICAgICAgICAgICAgICAgICBidXQgaWYgd2Ugd2lzaCB0byB1c2Ugc2hvcnRlciAob3IgbG9uZ2VyKSBPSURzLCB0aGVuIHdlCiAqICAgICAgICAgICAgICAgICAgICAgY291bGQgdXNlIGRpZmZlcmVudCB2YXJpYW50IG9mIHRoZSB2YXJpYWJsZSBzdHJ1Y3R1cmUuCiAqCiAqICBAcGFyYW0gIG51bXZhcnMgICAgTnVtYmVyIG9mIHZhcmlhYmxlcyBpbiB0aGUgdmFyIGFycmF5LgogKiAgICAgICAgICAgICAgICAgICAgIFRoaXMgaXMgaG93IG1hbnkgdmFyaWFibGVzIHRoZSBmdW5jdGlvbiB3aWxsIHRyeSB0byByZWdpc3Rlci4KICoKICogIEBwYXJhbSAgbWlibG9jICAgICBCYXNlIE9JRCBvZiB0aGUgbW9kdWxlLgogKiAgICAgICAgICAgICAgICAgICAgIEFsbCBPSURzIGluIHZhciBhcnJheSBzaG91bGQgYmUgc3ViLW9pZHMgb2YgdGhlIGJhc2UgT0lELgogKgogKiAgQHBhcmFtICBtaWJsb2NsZW4gIExlbmd0aCBvZiB0aGUgYmFzZSBPSUQuCiAqICAgICAgICAgICAgICAgICAgICAgTnVtYmVyIG9mIGludGVnZXJzIG1ha2luZyB1cCB0aGUgYmFzZSBPSUQuCiAqCiAqICBAcmV0dXJuIGdpdmVzIFNOTVBFUlJfU1VDQ0VTUyBvciBTTk1QRVJSXyogZXJyb3IgY29kZS4KICoKICogIEBzZWUgcmVnaXN0ZXJfbWliX3ByaW9yaXR5KCkKICogIEBzZWUgcmVnaXN0ZXJfbWliX3JhbmdlKCkKICogIEBzZWUgcmVnaXN0ZXJfbWliX2NvbnRleHQoKQogKiAgQHNlZSB1bnJlZ2lzdGVyX21pYigpCiAqLwppbnQKcmVnaXN0ZXJfbWliKGNvbnN0IGNoYXIgKm1vZHVsZU5hbWUsCiAgICAgICAgICAgICBjb25zdCBzdHJ1Y3QgdmFyaWFibGUgKnZhciwKICAgICAgICAgICAgIHNpemVfdCB2YXJzaXplLAogICAgICAgICAgICAgc2l6ZV90IG51bXZhcnMsIGNvbnN0IG9pZCAqIG1pYmxvYywgc2l6ZV90IG1pYmxvY2xlbikKewogICAgcmV0dXJuIHJlZ2lzdGVyX21pYl9wcmlvcml0eShtb2R1bGVOYW1lLCB2YXIsIHZhcnNpemUsIG51bXZhcnMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1pYmxvYywgbWlibG9jbGVuLCBERUZBVUxUX01JQl9QUklPUklUWSk7Cn0KCi8qKiBAcHJpdmF0ZQogKiAgVW5sb2FkcyBhIHN1YnRyZWUgZnJvbSBNSUIgdHJlZS4KICoKICogIEBwYXJhbSAgc3ViICAgICBUaGUgc3ViLXRyZWUgd2hpY2ggaXMgYmVpbmcgcmVtb3ZlZC4KICoKICogIEBwYXJhbSAgcHJldiAgICBQcmV2aW91cyBlbnRyeSwgYmVmb3JlIHRoZSB1bmxvYWRlZCBvbmUuCiAqCiAqICBAcGFyYW0gIGNvbnRleHQgTmFtZSBvZiB0aGUgY29udGV4dCB3aGljaCBpcyBiZWluZyByZW1vdmVkLgogKgogKiAgQHNlZSB1bnJlZ2lzdGVyX21pYl9jb250ZXh0KCkKICovCnZvaWQKbmV0c25tcF9zdWJ0cmVlX3VubG9hZChuZXRzbm1wX3N1YnRyZWUgKnN1YiwgbmV0c25tcF9zdWJ0cmVlICpwcmV2LCBjb25zdCBjaGFyICpjb250ZXh0KQp7CiAgICBuZXRzbm1wX3N1YnRyZWUgKnB0cjsKCiAgICBERUJVR01TR1RMKCgicmVnaXN0ZXJfbWliIiwgInVubG9hZCgiKSk7CiAgICBpZiAoc3ViICE9IE5VTEwpIHsKICAgICAgICBERUJVR01TR09JRCgoInJlZ2lzdGVyX21pYiIsIHN1Yi0+c3RhcnRfYSwgc3ViLT5zdGFydF9sZW4pKTsKICAgIH0gZWxzZSB7CiAgICAgICAgREVCVUdNU0coKCJyZWdpc3Rlcl9taWIiLCAiW05JTF0iKSk7CiAgICAgICAgcmV0dXJuOwogICAgfQogICAgREVCVUdNU0coKCJyZWdpc3Rlcl9taWIiLCAiLCAiKSk7CiAgICBpZiAocHJldiAhPSBOVUxMKSB7CiAgICAgICAgREVCVUdNU0dPSUQoKCJyZWdpc3Rlcl9taWIiLCBwcmV2LT5zdGFydF9hLCBwcmV2LT5zdGFydF9sZW4pKTsKICAgIH0gZWxzZSB7CiAgICAgICAgREVCVUdNU0coKCJyZWdpc3Rlcl9taWIiLCAiW05JTF0iKSk7CiAgICB9CiAgICBERUJVR01TRygoInJlZ2lzdGVyX21pYiIsICIpXG4iKSk7CgogICAgaWYgKHByZXYgIT0gTlVMTCkgeyAgICAgICAgIC8qIG5vbi1sZWFkaW5nIGVudHJpZXMgYXJlIGVhc3kgKi8KICAgICAgICBwcmV2LT5jaGlsZHJlbiA9IHN1Yi0+Y2hpbGRyZW47CiAgICAgICAgaW52YWxpZGF0ZV9sb29rdXBfY2FjaGUoY29udGV4dCk7CiAgICAgICAgcmV0dXJuOwogICAgfQogICAgLyoKICAgICAqIG90aGVyd2lzZSwgd2UgbmVlZCB0byBhbWVuZCBvdXIgbmVpZ2hib3VycyBhcyB3ZWxsIAogICAgICovCgogICAgaWYgKHN1Yi0+Y2hpbGRyZW4gPT0gTlVMTCkgeyAgICAgICAgLyoganVzdCByZW1vdmUgdGhpcyBub2RlIGNvbXBsZXRlbHkgKi8KICAgICAgICBmb3IgKHB0ciA9IHN1Yi0+cHJldjsgcHRyOyBwdHIgPSBwdHItPmNoaWxkcmVuKSB7CiAgICAgICAgICAgIG5ldHNubXBfc3VidHJlZV9jaGFuZ2VfbmV4dChwdHIsIHN1Yi0+bmV4dCk7CiAgICAgICAgfQogICAgICAgIGZvciAocHRyID0gc3ViLT5uZXh0OyBwdHI7IHB0ciA9IHB0ci0+Y2hpbGRyZW4pIHsKICAgICAgICAgICAgbmV0c25tcF9zdWJ0cmVlX2NoYW5nZV9wcmV2KHB0ciwgc3ViLT5wcmV2KTsKICAgICAgICB9CgoJaWYgKHN1Yi0+cHJldiA9PSBOVUxMKSB7CgkgICAgbmV0c25tcF9zdWJ0cmVlX3JlcGxhY2VfZmlyc3Qoc3ViLT5uZXh0LCBjb250ZXh0KTsKCX0KCiAgICB9IGVsc2UgewogICAgICAgIGZvciAocHRyID0gc3ViLT5wcmV2OyBwdHI7IHB0ciA9IHB0ci0+Y2hpbGRyZW4pCiAgICAgICAgICAgIG5ldHNubXBfc3VidHJlZV9jaGFuZ2VfbmV4dChwdHIsIHN1Yi0+Y2hpbGRyZW4pOwogICAgICAgIGZvciAocHRyID0gc3ViLT5uZXh0OyBwdHI7IHB0ciA9IHB0ci0+Y2hpbGRyZW4pCiAgICAgICAgICAgIG5ldHNubXBfc3VidHJlZV9jaGFuZ2VfcHJldihwdHIsIHN1Yi0+Y2hpbGRyZW4pOwoKCWlmIChzdWItPnByZXYgPT0gTlVMTCkgewoJICAgIG5ldHNubXBfc3VidHJlZV9yZXBsYWNlX2ZpcnN0KHN1Yi0+Y2hpbGRyZW4sIGNvbnRleHQpOwoJfQogICAgfQogICAgaW52YWxpZGF0ZV9sb29rdXBfY2FjaGUoY29udGV4dCk7Cn0KCi8qKgogKiBVbnJlZ2lzdGVycyBhIG1vZHVsZSByZWdpc3RlcmVkIGFnYWluc3QgYSBnaXZlbiBPSUQgKG9yIHJhbmdlKSBpbiBhIHNwZWNpZmllZCBjb250ZXh0LiAKICogVHlwaWNhbGx5IHVzZWQgd2hlbiBhIG1vZHVsZSBoYXMgbXVsdGlwbGUgY29udGV4dHMgZGVmaW5lZC4KICogVGhlIHBhcmFtZXRlcnMgcHJpb3JpdHksIHJhbmdlX3N1YmlkLCByYW5nZV91Ym91bmQgYW5kIGNvbnRleHQKICogc2hvdWxkIG1hdGNoIHRob3NlIHVzZWQgdG8gcmVnaXN0ZXIgdGhlIG1vZHVsZSBvcmlnaW5hbGx5LgogKgogKiBAcGFyYW0gbmFtZSAgdGhlIHNwZWNpZmljIE9JRCB0byB1bnJlZ2lzdGVyIGlmIGl0IGNvbmF0aW5zIHRoZSBhc3NvY2lhdGVkCiAqICAgICAgICAgICAgICBjb250ZXh0LgogKgogKiBAcGFyYW0gbGVuICAgdGhlIGxlbmd0aCBvZiB0aGUgT0lELCB1c2UgIE9JRF9MRU5HVEggbWFjcm8uCiAqCiAqIEBwYXJhbSBwcmlvcml0eSAgYSB2YWx1ZSBiZXR3ZWVuIDEgYW5kIDI1NSwgdXNlZCB0byBhY2hpZXZlIGEgZGVzaXJlZAogKiAgICAgICAgICAgICAgICAgIGNvbmZpZ3VyYXRpb24gd2hlbiBkaWZmZXJlbnQgc2Vzc2lvbnMgcmVnaXN0ZXIgaWRlbnRpY2FsIG9yCiAqICAgICAgICAgICAgICAgICAgb3ZlcmxhcHBpbmcgcmVnaW9ucy4gIFN1YmFnZW50cyB3aXRoIG5vIHBhcnRpY3VsYXIKICogICAgICAgICAgICAgICAgICBrbm93bGVkZ2Ugb2YgcHJpb3JpdHkgc2hvdWxkIHJlZ2lzdGVyIHdpdGggdGhlIGRlZmF1bHQKICogICAgICAgICAgICAgICAgICB2YWx1ZSBvZiAxMjcuCiAqCiAqIEBwYXJhbSByYW5nZV9zdWJpZCAgcGVybWl0cyBzcGVjaWZ5aW5nIGEgcmFuZ2UgaW4gcGxhY2Ugb2Ygb25lIG9mIGEgc3VidHJlZQogKiAgICAgICAgICAgICAgICAgICAgIHN1Yi1pZGVudGlmaWVycy4gIFdoZW4gdGhpcyB2YWx1ZSBpcyB6ZXJvLCBubyByYW5nZSBpcwogKiAgICAgICAgICAgICAgICAgICAgIGJlaW5nIHNwZWNpZmllZC4KICoKICogQHBhcmFtIHJhbmdlX3Vib3VuZCAgdGhlIHVwcGVyIGJvdW5kIG9mIGEgc3ViLWlkZW50aWZpZXIncyByYW5nZS4KICogICAgICAgICAgICAgICAgICAgICAgVGhpcyBmaWVsZCBpcyBwcmVzZW50IG9ubHkgaWYgcmFuZ2Vfc3ViaWQgaXMgbm90IDAuCiAqCiAqIEBwYXJhbSBjb250ZXh0ICBhIGNvbnRleHQgbmFtZSB0aGF0IGhhcyBiZWVuIGNyZWF0ZWQKICoKICogQHJldHVybiBnaXZlcyBNSUJfVU5SRUdJU1RFUkVEX09LIG9yIE1JQl8qIGVycm9yIGNvZGUuCiAqIAogKiBAc2VlIHVucmVnaXN0ZXJfbWliKCkKICogQHNlZSB1bnJlZ2lzdGVyX21pYl9wcmlvcml0eSgpCiAqIEBzZWUgdW5yZWdpc3Rlcl9taWJfcmFuZ2UoKQogKi8KaW50CnVucmVnaXN0ZXJfbWliX2NvbnRleHQob2lkICogbmFtZSwgc2l6ZV90IGxlbiwgaW50IHByaW9yaXR5LAogICAgICAgICAgICAgICAgICAgICAgIGludCByYW5nZV9zdWJpZCwgb2lkIHJhbmdlX3Vib3VuZCwKICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpjb250ZXh0KQp7CiAgICBuZXRzbm1wX3N1YnRyZWUgKmxpc3QsICpteXB0ciA9IE5VTEw7CiAgICBuZXRzbm1wX3N1YnRyZWUgKnByZXYsICpjaGlsZCwgKm5leHQ7IC8qIGxvb3AgdGhyb3VnaCBjaGlsZHJlbiAqLwogICAgc3RydWN0IHJlZ2lzdGVyX3BhcmFtZXRlcnMgcmVnX3Bhcm1zOwogICAgaW50IG9sZF9sb29rdXBfY2FjaGVfdmFsID0gbmV0c25tcF9nZXRfbG9va3VwX2NhY2hlX3NpemUoKTsKICAgIGludCB1bnJlZ2lzdGVyaW5nID0gMTsKICAgIGludCBvcmlnX3N1YmlkX3ZhbCA9IC0xOwoKICAgIG5ldHNubXBfc2V0X2xvb2t1cF9jYWNoZV9zaXplKDApOwoKICAgIGlmICgocmFuZ2Vfc3ViaWQgPiAwKSAmJiAgKChzaXplX3QpcmFuZ2Vfc3ViaWQgPD0gbGVuKSkKICAgICAgICBvcmlnX3N1YmlkX3ZhbCA9IG5hbWVbcmFuZ2Vfc3ViaWQtMV07CgogICAgd2hpbGUodW5yZWdpc3RlcmluZyl7CiAgICAgICAgREVCVUdNU0dUTCgoInJlZ2lzdGVyX21pYiIsICJ1bnJlZ2lzdGVyaW5nICIpKTsKICAgICAgICBERUJVR01TR09JRFJBTkdFKCgicmVnaXN0ZXJfbWliIiwgbmFtZSwgbGVuLCByYW5nZV9zdWJpZCwgcmFuZ2VfdWJvdW5kKSk7CiAgICAgICAgREVCVUdNU0coKCJyZWdpc3Rlcl9taWIiLCAiXG4iKSk7CgogICAgICAgIGxpc3QgPSBuZXRzbm1wX3N1YnRyZWVfZmluZChuYW1lLCBsZW4sIG5ldHNubXBfc3VidHJlZV9maW5kX2ZpcnN0KGNvbnRleHQpLAogICAgICAgICAgICAgICAgICAgIGNvbnRleHQpOwogICAgICAgIGlmIChsaXN0ID09IE5VTEwpIHsKICAgICAgICAgICAgcmV0dXJuIE1JQl9OT19TVUNIX1JFR0lTVFJBVElPTjsKICAgICAgICB9CgogICAgICAgIGZvciAoY2hpbGQgPSBsaXN0LCBwcmV2ID0gTlVMTDsgY2hpbGQgIT0gTlVMTDsKICAgICAgICAgICAgcHJldiA9IGNoaWxkLCBjaGlsZCA9IGNoaWxkLT5jaGlsZHJlbikgewogICAgICAgICAgICBpZiAobmV0c25tcF9vaWRfZXF1YWxzKGNoaWxkLT5uYW1lX2EsIGNoaWxkLT5uYW1lbGVuLCBuYW1lLCBsZW4pID09IDAgJiYKICAgICAgICAgICAgICAgIGNoaWxkLT5wcmlvcml0eSA9PSBwcmlvcml0eSkgewogICAgICAgICAgICAgICAgYnJlYWs7ICAgICAgICAgICAgICAvKiBmb3VuZCBpdCAqLwogICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgaWYgKGNoaWxkID09IE5VTEwpIHsKICAgICAgICAgICAgcmV0dXJuIE1JQl9OT19TVUNIX1JFR0lTVFJBVElPTjsKICAgICAgICB9CgogICAgICAgIG5ldHNubXBfc3VidHJlZV91bmxvYWQoY2hpbGQsIHByZXYsIGNvbnRleHQpOwogICAgICAgIG15cHRyID0gY2hpbGQ7ICAgICAgICAgICAgICAvKiByZW1lbWJlciB0aGlzIGZvciBsYXRlciAqLwoKICAgICAgICAvKgogICAgICAgICogIE5vdyBoYW5kbGUgYW55IG9jY3VyYW5jZXMgaW4gdGhlIGZvbGxvd2luZyBzdWJ0cmVlcywKICAgICAgICAqICAgICAgYXMgYSByZXN1bHQgb2Ygc3BsaXR0aW5nIHRoaXMgcmFuZ2UuICBEdWUgdG8gdGhlCiAgICAgICAgKiAgICAgIG5hdHVyZSBvZiB0aGUgd2F5IHN1Y2ggc3BsaXRzIHdvcmssIHRoZSBmaXJzdAogICAgICAgICogICAgICBzdWJ0cmVlICdzbGljZScgdGhhdCBkb2Vzbid0IHJlZmVyIHRvIHRoZSBnaXZlbgogICAgICAgICogICAgICBuYW1lIG1hcmtzIHRoZSBlbmQgb2YgdGhlIG9yaWdpbmFsIHJlZ2lvbi4KICAgICAgICAqCiAgICAgICAgKiAgVGhpcyBzaG91bGQgYWxzbyBzZXJ2ZSB0byByZWdpc3RlciByYW5nZXMuCiAgICAgICAgKi8KCiAgICAgICAgZm9yIChsaXN0ID0gbXlwdHItPm5leHQ7IGxpc3QgIT0gTlVMTDsgbGlzdCA9IG5leHQpIHsKICAgICAgICAgICAgbmV4dCA9IGxpc3QtPm5leHQ7IC8qIGxpc3QgZ2V0cyBmcmVlZCBzb21ldGltZXM7IGNhY2hlIG5leHQgKi8KICAgICAgICAgICAgZm9yIChjaGlsZCA9IGxpc3QsIHByZXYgPSBOVUxMOyBjaGlsZCAhPSBOVUxMOwogICAgICAgICAgICAgICAgcHJldiA9IGNoaWxkLCBjaGlsZCA9IGNoaWxkLT5jaGlsZHJlbikgewogICAgICAgICAgICAgICAgaWYgKChuZXRzbm1wX29pZF9lcXVhbHMoY2hpbGQtPm5hbWVfYSwgY2hpbGQtPm5hbWVsZW4sCiAgICAgICAgICAgICAgICAgICAgbmFtZSwgbGVuKSA9PSAwKSAmJgogICAgICAgICAgICAoY2hpbGQtPnByaW9yaXR5ID09IHByaW9yaXR5KSkgewogICAgICAgICAgICAgICAgICAgIG5ldHNubXBfc3VidHJlZV91bmxvYWQoY2hpbGQsIHByZXYsIGNvbnRleHQpOwogICAgICAgICAgICAgICAgICAgIG5ldHNubXBfc3VidHJlZV9mcmVlKGNoaWxkKTsKICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAoY2hpbGQgPT0gTlVMTCkgICAgICAvKiBEaWRuJ3QgZmluZCB0aGUgZ2l2ZW4gbmFtZSAqLwogICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgfQoKICAgICAgICAvKiBNYXliZSB3ZSBhcmUgaW4gYSByYW5nZS4uLiAqLwogICAgICAgIGlmIChvcmlnX3N1YmlkX3ZhbCAhPSAtMSl7CiAgICAgICAgICAgIGlmICgrK25hbWVbcmFuZ2Vfc3ViaWQtMV0gPj0gb3JpZ19zdWJpZF92YWwrcmFuZ2VfdWJvdW5kKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdW5yZWdpc3RlcmluZz0wOwogICAgICAgICAgICAgICAgbmFtZVtyYW5nZV9zdWJpZC0xXSA9IG9yaWdfc3ViaWRfdmFsOwogICAgICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBlbHNlIHsKICAgICAgICAgICAgdW5yZWdpc3RlcmluZz0wOwogICAgICAgIH0KICAgIH0KCiAgICBtZW1zZXQoJnJlZ19wYXJtcywgMHgwLCBzaXplb2YocmVnX3Bhcm1zKSk7CiAgICByZWdfcGFybXMubmFtZSA9IG5hbWU7CiAgICByZWdfcGFybXMubmFtZWxlbiA9IGxlbjsKICAgIHJlZ19wYXJtcy5wcmlvcml0eSA9IHByaW9yaXR5OwogICAgcmVnX3Bhcm1zLnJhbmdlX3N1YmlkID0gcmFuZ2Vfc3ViaWQ7CiAgICByZWdfcGFybXMucmFuZ2VfdWJvdW5kID0gcmFuZ2VfdWJvdW5kOwogICAgcmVnX3Bhcm1zLmZsYWdzID0gMHgwMDsgICAgIC8qICB0aGlzIGlzIG9rYXkgSSB0aGluayAgKi8KICAgIHJlZ19wYXJtcy5jb250ZXh0TmFtZSA9IGNvbnRleHQ7CiAgICBzbm1wX2NhbGxfY2FsbGJhY2tzKFNOTVBfQ0FMTEJBQ0tfQVBQTElDQVRJT04sCiAgICAgICAgICAgICAgICAgICAgICAgIFNOTVBEX0NBTExCQUNLX1VOUkVHSVNURVJfT0lELCAmcmVnX3Bhcm1zKTsKCiAgICBuZXRzbm1wX3N1YnRyZWVfZnJlZShteXB0cik7CiAgICBuZXRzbm1wX3NldF9sb29rdXBfY2FjaGVfc2l6ZShvbGRfbG9va3VwX2NhY2hlX3ZhbCk7CiAgICBpbnZhbGlkYXRlX2xvb2t1cF9jYWNoZShjb250ZXh0KTsKICAgIHJldHVybiBNSUJfVU5SRUdJU1RFUkVEX09LOwp9CgojaWZuZGVmIE5FVFNOTVBfRkVBVFVSRV9SRU1PVkVfVU5SRUdJU1RFUl9NSUJfVEFCTEVfUk9XCmludApuZXRzbm1wX3VucmVnaXN0ZXJfbWliX3RhYmxlX3JvdyhvaWQgKiBuYW1lLCBzaXplX3QgbGVuLCBpbnQgcHJpb3JpdHksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCB2YXJfc3ViaWQsIG9pZCByYW5nZV91Ym91bmQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKmNvbnRleHQpCnsKICAgIG5ldHNubXBfc3VidHJlZSAqbGlzdCwgKm15cHRyLCAqZnV0dXJlcHRyOwogICAgbmV0c25tcF9zdWJ0cmVlICpwcmV2LCAqY2hpbGQ7ICAgICAgIC8qIGxvb3AgdGhyb3VnaCBjaGlsZHJlbiAqLwogICAgc3RydWN0IHJlZ2lzdGVyX3BhcmFtZXRlcnMgcmVnX3Bhcm1zOwogICAgb2lkICAgICAgICAgICAgIHJhbmdlX2xib3VuZCA9IG5hbWVbdmFyX3N1YmlkIC0gMV07CgogICAgREVCVUdNU0dUTCgoInJlZ2lzdGVyX21pYiIsICJ1bnJlZ2lzdGVyaW5nICIpKTsKICAgIERFQlVHTVNHT0lEUkFOR0UoKCJyZWdpc3Rlcl9taWIiLCBuYW1lLCBsZW4sIHZhcl9zdWJpZCwgcmFuZ2VfdWJvdW5kKSk7CiAgICBERUJVR01TRygoInJlZ2lzdGVyX21pYiIsICJcbiIpKTsKCiAgICBmb3IgKDsgbmFtZVt2YXJfc3ViaWQgLSAxXSA8PSByYW5nZV91Ym91bmQ7IG5hbWVbdmFyX3N1YmlkIC0gMV0rKykgewogICAgICAgIGxpc3QgPSBuZXRzbm1wX3N1YnRyZWVfZmluZChuYW1lLCBsZW4sIAoJCQkJbmV0c25tcF9zdWJ0cmVlX2ZpbmRfZmlyc3QoY29udGV4dCksIGNvbnRleHQpOwoKICAgICAgICBpZiAobGlzdCA9PSBOVUxMKSB7CiAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgIH0KCiAgICAgICAgZm9yIChjaGlsZCA9IGxpc3QsIHByZXYgPSBOVUxMOyBjaGlsZCAhPSBOVUxMOwogICAgICAgICAgICAgcHJldiA9IGNoaWxkLCBjaGlsZCA9IGNoaWxkLT5jaGlsZHJlbikgewoKICAgICAgICAgICAgaWYgKG5ldHNubXBfb2lkX2VxdWFscyhjaGlsZC0+bmFtZV9hLCBjaGlsZC0+bmFtZWxlbiwgCgkJCQkgbmFtZSwgbGVuKSA9PSAwICYmIAoJCShjaGlsZC0+cHJpb3JpdHkgPT0gcHJpb3JpdHkpKSB7CiAgICAgICAgICAgICAgICBicmVhazsgICAgICAgICAgLyogZm91bmQgaXQgKi8KICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgaWYgKGNoaWxkID09IE5VTEwpIHsKICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgfQoKICAgICAgICBuZXRzbm1wX3N1YnRyZWVfdW5sb2FkKGNoaWxkLCBwcmV2LCBjb250ZXh0KTsKICAgICAgICBteXB0ciA9IGNoaWxkOyAgICAgICAgICAvKiByZW1lbWJlciB0aGlzIGZvciBsYXRlciAqLwoKICAgICAgICBmb3IgKGxpc3QgPSBteXB0ci0+bmV4dDsgbGlzdCAhPSBOVUxMOyBsaXN0ID0gZnV0dXJlcHRyKSB7CiAgICAgICAgICAgIC8qIHJlbWVtYmVyIHRoZSBuZXh0IHNwb3QgaW4gdGhlIGxpc3QgaW4gY2FzZSB3ZSBmcmVlIHRoaXMgbm9kZSAqLwogICAgICAgICAgICBmdXR1cmVwdHIgPSBsaXN0LT5uZXh0OwoKICAgICAgICAgICAgLyogY2hlY2sgZWFjaCBjaGlsZCAqLwogICAgICAgICAgICBmb3IgKGNoaWxkID0gbGlzdCwgcHJldiA9IE5VTEw7IGNoaWxkICE9IE5VTEw7CiAgICAgICAgICAgICAgICAgcHJldiA9IGNoaWxkLCBjaGlsZCA9IGNoaWxkLT5jaGlsZHJlbikgewoKICAgICAgICAgICAgICAgIGlmIChuZXRzbm1wX29pZF9lcXVhbHMoY2hpbGQtPm5hbWVfYSwgY2hpbGQtPm5hbWVsZW4sIAoJCQkJICAgICAgbmFtZSwgbGVuKSA9PSAwICYmCiAgICAgICAgICAgICAgICAgICAgKGNoaWxkLT5wcmlvcml0eSA9PSBwcmlvcml0eSkpIHsKICAgICAgICAgICAgICAgICAgICBuZXRzbm1wX3N1YnRyZWVfdW5sb2FkKGNoaWxkLCBwcmV2LCBjb250ZXh0KTsKICAgICAgICAgICAgICAgICAgICBuZXRzbm1wX3N1YnRyZWVfZnJlZShjaGlsZCk7CiAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIC8qIFhYWDogd2poOiBub3Qgc3VyZSB3aHkgd2UncmUgYmFpbGluZyBoZXJlICovCiAgICAgICAgICAgIGlmIChjaGlsZCA9PSBOVUxMKSB7ICAgICAgICAvKiBEaWRuJ3QgZmluZCB0aGUgZ2l2ZW4gbmFtZSAqLwogICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgbmV0c25tcF9zdWJ0cmVlX2ZyZWUobXlwdHIpOwogICAgfQoKICAgIG5hbWVbdmFyX3N1YmlkIC0gMV0gPSByYW5nZV9sYm91bmQ7CiAgICBtZW1zZXQoJnJlZ19wYXJtcywgMHgwLCBzaXplb2YocmVnX3Bhcm1zKSk7CiAgICByZWdfcGFybXMubmFtZSA9IG5hbWU7CiAgICByZWdfcGFybXMubmFtZWxlbiA9IGxlbjsKICAgIHJlZ19wYXJtcy5wcmlvcml0eSA9IHByaW9yaXR5OwogICAgcmVnX3Bhcm1zLnJhbmdlX3N1YmlkID0gdmFyX3N1YmlkOwogICAgcmVnX3Bhcm1zLnJhbmdlX3Vib3VuZCA9IHJhbmdlX3Vib3VuZDsKICAgIHJlZ19wYXJtcy5mbGFncyA9IDB4MDA7ICAgICAvKiAgdGhpcyBpcyBva2F5IEkgdGhpbmsgICovCiAgICByZWdfcGFybXMuY29udGV4dE5hbWUgPSBjb250ZXh0OwogICAgc25tcF9jYWxsX2NhbGxiYWNrcyhTTk1QX0NBTExCQUNLX0FQUExJQ0FUSU9OLAogICAgICAgICAgICAgICAgICAgICAgICBTTk1QRF9DQUxMQkFDS19VTlJFR0lTVEVSX09JRCwgJnJlZ19wYXJtcyk7CgogICAgcmV0dXJuIDA7Cn0KI2VuZGlmIC8qIE5FVFNOTVBfRkVBVFVSRV9SRU1PVkVfVU5SRUdJU1RFUl9NSUJfVEFCTEVfUk9XICovCgovKioKICogVW5yZWdpc3RlcnMgYSBtb2R1bGUgcmVnaXN0ZXJlZCBhZ2FpbnN0IGEgZ2l2ZW4gT0lEIChvciByYW5nZSkgaW4gdGhlIGRlZmF1bHQgY29udGV4dC4gCiAqIFR5cGljYWxseSB1c2VkIHdoZW4gYSBtb2R1bGUgaGFzIG11bHRpcGxlIGNvbnRleHRzIGRlZmluZWQuCiAqIFRoZSBwYXJhbWV0ZXJzIHByaW9yaXR5LCByYW5nZV9zdWJpZCwgYW5kIHJhbmdlX3Vib3VuZCBzaG91bGQKICogbWF0Y2ggdGhvc2UgdXNlZCB0byByZWdpc3RlciB0aGUgbW9kdWxlIG9yaWdpbmFsbHkuCiAqCiAqIEBwYXJhbSBuYW1lICB0aGUgc3BlY2lmaWMgT0lEIHRvIHVucmVnaXN0ZXIgaWYgaXQgY29uYXRpbnMgdGhlIGFzc29jaWF0ZWQKICogICAgICAgICAgICAgIGNvbnRleHQuCiAqCiAqIEBwYXJhbSBsZW4gICB0aGUgbGVuZ3RoIG9mIHRoZSBPSUQsIHVzZSAgT0lEX0xFTkdUSCBtYWNyby4KICoKICogQHBhcmFtIHByaW9yaXR5ICBhIHZhbHVlIGJldHdlZW4gMSBhbmQgMjU1LCB1c2VkIHRvIGFjaGlldmUgYSBkZXNpcmVkCiAqICAgICAgICAgICAgICAgICAgY29uZmlndXJhdGlvbiB3aGVuIGRpZmZlcmVudCBzZXNzaW9ucyByZWdpc3RlciBpZGVudGljYWwgb3IKICogICAgICAgICAgICAgICAgICBvdmVybGFwcGluZyByZWdpb25zLiAgU3ViYWdlbnRzIHdpdGggbm8gcGFydGljdWxhcgogKiAgICAgICAgICAgICAgICAgIGtub3dsZWRnZSBvZiBwcmlvcml0eSBzaG91bGQgcmVnaXN0ZXIgd2l0aCB0aGUgZGVmYXVsdAogKiAgICAgICAgICAgICAgICAgIHZhbHVlIG9mIDEyNy4KICoKICogQHBhcmFtIHJhbmdlX3N1YmlkICBwZXJtaXRzIHNwZWNpZnlpbmcgYSByYW5nZSBpbiBwbGFjZSBvZiBvbmUgb2YgYSBzdWJ0cmVlCiAqICAgICAgICAgICAgICAgICAgICAgc3ViLWlkZW50aWZpZXJzLiAgV2hlbiB0aGlzIHZhbHVlIGlzIHplcm8sIG5vIHJhbmdlIGlzCiAqICAgICAgICAgICAgICAgICAgICAgYmVpbmcgc3BlY2lmaWVkLgogKgogKiBAcGFyYW0gcmFuZ2VfdWJvdW5kICB0aGUgdXBwZXIgYm91bmQgb2YgYSBzdWItaWRlbnRpZmllcidzIHJhbmdlLgogKiAgICAgICAgICAgICAgICAgICAgICBUaGlzIGZpZWxkIGlzIHByZXNlbnQgb25seSBpZiByYW5nZV9zdWJpZCBpcyBub3QgMC4KICoKICogQHJldHVybiBnaXZlcyBNSUJfVU5SRUdJU1RFUkVEX09LIG9yIE1JQl8qIGVycm9yIGNvZGUuCiAqIAogKiBAc2VlIHVucmVnaXN0ZXJfbWliKCkKICogQHNlZSB1bnJlZ2lzdGVyX21pYl9wcmlvcml0eSgpCiAqIEBzZWUgdW5yZWdpc3Rlcl9taWJfY29udGV4dCgpCiAqLwppbnQKdW5yZWdpc3Rlcl9taWJfcmFuZ2Uob2lkICogbmFtZSwgc2l6ZV90IGxlbiwgaW50IHByaW9yaXR5LAogICAgICAgICAgICAgICAgICAgICBpbnQgcmFuZ2Vfc3ViaWQsIG9pZCByYW5nZV91Ym91bmQpCnsKICAgIHJldHVybiB1bnJlZ2lzdGVyX21pYl9jb250ZXh0KG5hbWUsIGxlbiwgcHJpb3JpdHksIHJhbmdlX3N1YmlkLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmFuZ2VfdWJvdW5kLCAiIik7Cn0KCi8qKgogKiBVbnJlZ2lzdGVycyBhIG1vZHVsZSByZWdpc3RlcmVkIGFnYWluc3QgYSBnaXZlbiBPSUQgYXQgdGhlIHNwZWNpZmllZCBwcmlvcml0eS4KICogVGhlIHByaW9yaXR5IHBhcmFtZXRlciBzaG91bGQgbWF0Y2ggdGhhdCB1c2VkIHRvIHJlZ2lzdGVyIHRoZSBtb2R1bGUgb3JpZ2luYWxseS4KICoKICogQHBhcmFtIG5hbWUgIHRoZSBzcGVjaWZpYyBPSUQgdG8gdW5yZWdpc3RlciBpZiBpdCBjb25hdGlucyB0aGUgYXNzb2NpYXRlZAogKiAgICAgICAgICAgICAgY29udGV4dC4KICoKICogQHBhcmFtIGxlbiAgIHRoZSBsZW5ndGggb2YgdGhlIE9JRCwgdXNlICBPSURfTEVOR1RIIG1hY3JvLgogKgogKiBAcGFyYW0gcHJpb3JpdHkgIGEgdmFsdWUgYmV0d2VlbiAxIGFuZCAyNTUsIHVzZWQgdG8gYWNoaWV2ZSBhIGRlc2lyZWQKICogICAgICAgICAgICAgICAgICBjb25maWd1cmF0aW9uIHdoZW4gZGlmZmVyZW50IHNlc3Npb25zIHJlZ2lzdGVyIGlkZW50aWNhbCBvcgogKiAgICAgICAgICAgICAgICAgIG92ZXJsYXBwaW5nIHJlZ2lvbnMuICBTdWJhZ2VudHMgd2l0aCBubyBwYXJ0aWN1bGFyCiAqICAgICAgICAgICAgICAgICAga25vd2xlZGdlIG9mIHByaW9yaXR5IHNob3VsZCByZWdpc3RlciB3aXRoIHRoZSBkZWZhdWx0CiAqICAgICAgICAgICAgICAgICAgdmFsdWUgb2YgMTI3LgogKgogKiBAcmV0dXJuIGdpdmVzIE1JQl9VTlJFR0lTVEVSRURfT0sgb3IgTUlCXyogZXJyb3IgY29kZS4KICogCiAqIEBzZWUgdW5yZWdpc3Rlcl9taWIoKQogKiBAc2VlIHVucmVnaXN0ZXJfbWliX3JhbmdlKCkKICogQHNlZSB1bnJlZ2lzdGVyX21pYl9jb250ZXh0KCkKICovCmludAp1bnJlZ2lzdGVyX21pYl9wcmlvcml0eShvaWQgKiBuYW1lLCBzaXplX3QgbGVuLCBpbnQgcHJpb3JpdHkpCnsKICAgIHJldHVybiB1bnJlZ2lzdGVyX21pYl9yYW5nZShuYW1lLCBsZW4sIHByaW9yaXR5LCAwLCAwKTsKfQoKLyoqCiAqIFVucmVnaXN0ZXJzIGEgbW9kdWxlIHJlZ2lzdGVyZWQgYWdhaW5zdCBhIGdpdmVuIE9JRCBhdCB0aGUgZGVmYXVsdCBwcmlvcml0eS4KICoKICogQHBhcmFtIG5hbWUgIHRoZSBzcGVjaWZpYyBPSUQgdG8gdW5yZWdpc3RlciBpZiBpdCBjb25hdGlucyB0aGUgYXNzb2NpYXRlZAogKiAgICAgICAgICAgICAgY29udGV4dC4KICoKICogQHBhcmFtIGxlbiAgIHRoZSBsZW5ndGggb2YgdGhlIE9JRCwgdXNlICBPSURfTEVOR1RIIG1hY3JvLgogKgogKiBAcmV0dXJuIGdpdmVzIE1JQl9VTlJFR0lTVEVSRURfT0sgb3IgTUlCXyogZXJyb3IgY29kZS4KICogCiAqIEBzZWUgdW5yZWdpc3Rlcl9taWJfcHJpb3JpdHkoKQogKiBAc2VlIHVucmVnaXN0ZXJfbWliX2NvbnRleHQoKQogKiBAc2VlIHVucmVnaXN0ZXJfbWliX3JhbmdlKCkKICogQHNlZSB1bnJlZ2lzdGVyX2FnZW50eF9saXN0KCkKICovCmludAp1bnJlZ2lzdGVyX21pYihvaWQgKiBuYW1lLCBzaXplX3QgbGVuKQp7CiAgICByZXR1cm4gdW5yZWdpc3Rlcl9taWJfcHJpb3JpdHkobmFtZSwgbGVuLCBERUZBVUxUX01JQl9QUklPUklUWSk7Cn0KCi8qKiBVbnJlZ2lzdGVycyBzdWJ0cmVlIG9mIE9JRHMgYm91bmRlZCB0byBnaXZlbiBzZXNzaW9uLgogKgogKiAgQHBhcmFtIHNzIFNlc3Npb24gd2hpY2ggT0lEcyB3aWxsIGJlIHJlbW92ZWQgZnJvbSB0cmVlLgogKgogKiAgQHNlZSB1bnJlZ2lzdGVyX21pYigpCiAqICBAc2VlIHVucmVnaXN0ZXJfYWdlbnR4X2xpc3QoKQogKi8Kdm9pZAp1bnJlZ2lzdGVyX21pYnNfYnlfc2Vzc2lvbihuZXRzbm1wX3Nlc3Npb24gKiBzcykKewogICAgbmV0c25tcF9zdWJ0cmVlICpsaXN0LCAqbGlzdDI7CiAgICBuZXRzbm1wX3N1YnRyZWUgKmNoaWxkLCAqcHJldiwgKm5leHRfY2hpbGQ7CiAgICBzdHJ1Y3QgcmVnaXN0ZXJfcGFyYW1ldGVycyBycDsKICAgIHN1YnRyZWVfY29udGV4dF9jYWNoZSAqY29udGV4dHB0cjsKCiAgICBERUJVR01TR1RMKCgicmVnaXN0ZXJfbWliIiwgInVucmVnaXN0ZXJfbWlic19ieV9zZXNzaW9uKCVwKSBjdHh0IFwiJXNcIlxuIiwKCQlzcywgKHNzICYmIHNzLT5jb250ZXh0TmFtZSkgPyBzcy0+Y29udGV4dE5hbWUgOiAiW05JTF0iKSk7CgogICAgZm9yIChjb250ZXh0cHRyID0gZ2V0X3RvcF9jb250ZXh0X2NhY2hlKCk7IGNvbnRleHRwdHIgIT0gTlVMTDsKICAgICAgICAgY29udGV4dHB0ciA9IGNvbnRleHRwdHItPm5leHQpIHsKICAgICAgICBmb3IgKGxpc3QgPSBjb250ZXh0cHRyLT5maXJzdF9zdWJ0cmVlOyBsaXN0ICE9IE5VTEw7IGxpc3QgPSBsaXN0MikgewogICAgICAgICAgICBsaXN0MiA9IGxpc3QtPm5leHQ7CgogICAgICAgICAgICBmb3IgKGNoaWxkID0gbGlzdCwgcHJldiA9IE5VTEw7IGNoaWxkICE9IE5VTEw7IGNoaWxkID0gbmV4dF9jaGlsZCl7CiAgICAgICAgICAgICAgICBuZXh0X2NoaWxkID0gY2hpbGQtPmNoaWxkcmVuOwoKICAgICAgICAgICAgICAgIGlmICgoKCFzcyB8fCBzcy0+ZmxhZ3MgJiBTTk1QX0ZMQUdTX1NVQlNFU1NJT04pICYmCgkJICAgICBjaGlsZC0+c2Vzc2lvbiA9PSBzcykgfHwKICAgICAgICAgICAgICAgICAgICAoISghc3MgfHwgc3MtPmZsYWdzICYgU05NUF9GTEFHU19TVUJTRVNTSU9OKSAmJiBjaGlsZC0+c2Vzc2lvbiAmJgogICAgICAgICAgICAgICAgICAgICBjaGlsZC0+c2Vzc2lvbi0+c3Vic2Vzc2lvbiA9PSBzcykpIHsKCiAgICAgICAgICAgICAgICAgICAgbWVtc2V0KCZycCwweDAsc2l6ZW9mKHJwKSk7CiAgICAgICAgICAgICAgICAgICAgcnAubmFtZSA9IGNoaWxkLT5uYW1lX2E7CgkJICAgIGNoaWxkLT5uYW1lX2EgPSBOVUxMOwogICAgICAgICAgICAgICAgICAgIHJwLm5hbWVsZW4gPSBjaGlsZC0+bmFtZWxlbjsKICAgICAgICAgICAgICAgICAgICBycC5wcmlvcml0eSA9IGNoaWxkLT5wcmlvcml0eTsKICAgICAgICAgICAgICAgICAgICBycC5yYW5nZV9zdWJpZCA9IGNoaWxkLT5yYW5nZV9zdWJpZDsKICAgICAgICAgICAgICAgICAgICBycC5yYW5nZV91Ym91bmQgPSBjaGlsZC0+cmFuZ2VfdWJvdW5kOwogICAgICAgICAgICAgICAgICAgIHJwLnRpbWVvdXQgPSBjaGlsZC0+dGltZW91dDsKICAgICAgICAgICAgICAgICAgICBycC5mbGFncyA9IGNoaWxkLT5mbGFnczsKICAgICAgICAgICAgICAgICAgICBpZiAoKE5VTEwgIT0gY2hpbGQtPnJlZ2luZm8pICYmCiAgICAgICAgICAgICAgICAgICAgICAgIChOVUxMICE9IGNoaWxkLT5yZWdpbmZvLT5jb250ZXh0TmFtZSkpCiAgICAgICAgICAgICAgICAgICAgICAgIHJwLmNvbnRleHROYW1lID0gY2hpbGQtPnJlZ2luZm8tPmNvbnRleHROYW1lOwoKICAgICAgICAgICAgICAgICAgICBpZiAoY2hpbGQtPnJlZ2luZm8gIT0gTlVMTCkgewogICAgICAgICAgICAgICAgICAgICAgICAvKgogICAgICAgICAgICAgICAgICAgICAgICAgKiBEb24ndCBsZXQncyBmcmVlIHRoZSBzZXNzaW9uIHBvaW50ZXIganVzdCB5ZXQhICAKICAgICAgICAgICAgICAgICAgICAgICAgICovCiAgICAgICAgICAgICAgICAgICAgICAgIGNoaWxkLT5yZWdpbmZvLT5oYW5kbGVyLT5teXZvaWQgPSBOVUxMOwogICAgICAgICAgICAgICAgICAgICAgICBuZXRzbm1wX2hhbmRsZXJfcmVnaXN0cmF0aW9uX2ZyZWUoY2hpbGQtPnJlZ2luZm8pOwoJCQljaGlsZC0+cmVnaW5mbyA9IE5VTEw7CiAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICBuZXRzbm1wX3N1YnRyZWVfdW5sb2FkKGNoaWxkLCBwcmV2LCBjb250ZXh0cHRyLT5jb250ZXh0X25hbWUpOwogICAgICAgICAgICAgICAgICAgIG5ldHNubXBfc3VidHJlZV9mcmVlKGNoaWxkKTsKCiAgICAgICAgICAgICAgICAgICAgc25tcF9jYWxsX2NhbGxiYWNrcyhTTk1QX0NBTExCQUNLX0FQUExJQ0FUSU9OLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU05NUERfQ0FMTEJBQ0tfVU5SRUdJU1RFUl9PSUQsICZycCk7CgkJICAgIFNOTVBfRlJFRShycC5uYW1lKTsKICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgcHJldiA9IGNoaWxkOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIG5ldHNubXBfc3VidHJlZV9qb2luKGNvbnRleHRwdHItPmZpcnN0X3N1YnRyZWUpOwogICAgfQp9CgovKiogRGV0ZXJtaW5lcyBpZiBnaXZlbiBQRFUgaXMgYWxsb3dlZCB0byBzZWUgKG9yIHVwZGF0ZSkgYSBnaXZlbiBPSUQuCiAqCiAqIEBwYXJhbSBuYW1lICAgIFRoZSBPSUQgdG8gY2hlY2sgYWNjZXNzIGZvci4KICogICAgICAgICAgICAgICAgT24gcmV0dXJuLCB0aGlzIHBhcmFtZXRlciBob2xkcyB0aGUgT0lEIGFjdHVhbGx5IG1hdGNoZWQKICoKICogQHBhcmFtIG5hbWVsZW4gTnVtYmVyIG9mIHN1Yi1pZGVudGlmaWVycyBpbiB0aGUgT0lELgogKiAgICAgICAgICAgICAgICBPbiByZXR1cm4sIHRoaXMgcGFyYW1ldGVyIGhvbGRzIHRoZSBsZW5ndGggb2YgdGhlIG1hdGNoZWQgT0lECiAqCiAqIEBwYXJhbSBwZHUgICAgIFBEVSByZXF1ZXN0aW5nIGFjY2VzcyB0byB0aGUgT0lELgogKgogKiBAcGFyYW0gdHlwZSAgICBBTlMuMSB0eXBlIG9mIHRoZSB2YWx1ZSBhdCBnaXZlbiBPSUQuCiAqICAgICAgICAgICAgICAgIChVc2VkIGZvciBjYXRjaGluZyBTTk1QdjEgcmVxdWVzdHMgZm9yIFNNSXYyLW9ubHkgb2JqZWN0cykKICoKICogQHJldHVybiBnaXZlcyBWQUNNX1NVQ0NFU1MgaWYgdGhlIE9JRCBpcyBpbiB0aGUgUERVLCBvdGhlcndpc2UgZXJyb3IgY29kZS4KICovCmludAppbl9hX3ZpZXcob2lkICpuYW1lLCBzaXplX3QgKm5hbWVsZW4sIG5ldHNubXBfcGR1ICpwZHUsIGludCB0eXBlKQp7CiAgICBzdHJ1Y3Qgdmlld19wYXJhbWV0ZXJzIHZpZXdfcGFybXM7CgogICAgaWYgKHBkdS0+ZmxhZ3MgJiBVQ0RfTVNHX0ZMQUdfQUxXQVlTX0lOX1ZJRVcpIHsKCS8qIEVuYWJsZSBieXBhc3Npbmcgb2Ygdmlldy1iYXNlZCBhY2Nlc3MgY29udHJvbCAqLwogICAgICAgIHJldHVybiBWQUNNX1NVQ0NFU1M7CiAgICB9CgogICAgLyoKICAgICAqIGNoZWNrIGZvciB2MSBhbmQgY291bnRlcjY0cywgc2luY2Ugc25tcHYxIGRvZXNuJ3Qgc3VwcG9ydCBpdCAKICAgICAqLwojaWZuZGVmIE5FVFNOTVBfRElTQUJMRV9TTk1QVjEKICAgIGlmIChwZHUtPnZlcnNpb24gPT0gU05NUF9WRVJTSU9OXzEgJiYgdHlwZSA9PSBBU05fQ09VTlRFUjY0KSB7CiAgICAgICAgcmV0dXJuIFZBQ01fTk9USU5WSUVXOwogICAgfQojZW5kaWYKCiAgICB2aWV3X3Bhcm1zLnBkdSA9IHBkdTsKICAgIHZpZXdfcGFybXMubmFtZSA9IG5hbWU7CiAgICBpZiAobmFtZWxlbiAhPSBOVUxMKSB7CiAgICAgICAgdmlld19wYXJtcy5uYW1lbGVuID0gKm5hbWVsZW47CiAgICB9IGVsc2UgewogICAgICAgIHZpZXdfcGFybXMubmFtZWxlbiA9IDA7CiAgICB9CiAgICB2aWV3X3Bhcm1zLmVycm9yY29kZSA9IDA7CiAgICB2aWV3X3Bhcm1zLmNoZWNrX3N1YnRyZWUgPSAwOwoKICAgIHN3aXRjaCAocGR1LT52ZXJzaW9uKSB7CiNpZm5kZWYgTkVUU05NUF9ESVNBQkxFX1NOTVBWMQogICAgY2FzZSBTTk1QX1ZFUlNJT05fMToKI2VuZGlmCiNpZm5kZWYgTkVUU05NUF9ESVNBQkxFX1NOTVBWMkMKICAgIGNhc2UgU05NUF9WRVJTSU9OXzJjOgojZW5kaWYKICAgIGNhc2UgU05NUF9WRVJTSU9OXzM6CiAgICAgICAgc25tcF9jYWxsX2NhbGxiYWNrcyhTTk1QX0NBTExCQUNLX0FQUExJQ0FUSU9OLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgU05NUERfQ0FMTEJBQ0tfQUNNX0NIRUNLLCAmdmlld19wYXJtcyk7CiAgICAgICAgcmV0dXJuIHZpZXdfcGFybXMuZXJyb3Jjb2RlOwogICAgfQogICAgcmV0dXJuIFZBQ01fTk9TRUNOQU1FOwp9CgovKiogRGV0ZXJtaW5lcyBpZiB0aGUgZ2l2ZW4gUERVIHJlcXVlc3QgY291bGQgcG90ZW50aWFsbHkgc3VjY2VlZC4KICogIChQcmVsaW1pbmFyeSwgT0lELWluZGVwZW5kZW50IHZhbGlkYXRpb24pCiAqCiAqIEBwYXJhbSBwZHUgICAgIFBEVSByZXF1ZXN0aW5nIGFjY2VzcwogKgogKiBAcmV0dXJuIGdpdmVzIFZBQ01fU1VDQ0VTUyAgIGlmIHRoZSBlbnRpcmUgTUlCIHRyZWUgaXMgYWNjZXNzaWJsZQogKiAgICAgICAgICAgICAgIFZBQ01fTk9USU5WSUVXIGlmIHRoZSBlbnRpcmUgTUlCIHRyZWUgaXMgaW5hY2Nlc3NpYmxlCiAqICAgICAgICAgICAgICAgVkFDTV9TVUJUUkVFX1VOS05PV04gaWYgc29tZSBwb3J0aW9ucyBhcmUgYWNjZXNzaWJsZQogKiAgICAgICAgICAgICAgIG90aGVyIGNvZGVzIG1heSByZXR1cm5lZCBvbiBlcnJvcgogKi8KaW50CmNoZWNrX2FjY2VzcyhuZXRzbm1wX3BkdSAqcGR1KQp7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIElOIC0gcGR1IGJlaW5nIGNoZWNrZWQgKi8KICAgIHN0cnVjdCB2aWV3X3BhcmFtZXRlcnMgdmlld19wYXJtczsKICAgIHZpZXdfcGFybXMucGR1ID0gcGR1OwogICAgdmlld19wYXJtcy5uYW1lID0gTlVMTDsKICAgIHZpZXdfcGFybXMubmFtZWxlbiA9IDA7CiAgICB2aWV3X3Bhcm1zLmVycm9yY29kZSA9IDA7CiAgICB2aWV3X3Bhcm1zLmNoZWNrX3N1YnRyZWUgPSAwOwoKICAgIGlmIChwZHUtPmZsYWdzICYgVUNEX01TR19GTEFHX0FMV0FZU19JTl9WSUVXKSB7CgkvKiBFbmFibGUgYnlwYXNzaW5nIG9mIHZpZXctYmFzZWQgYWNjZXNzIGNvbnRyb2wgKi8KICAgICAgICByZXR1cm4gMDsKICAgIH0KCiAgICBzd2l0Y2ggKHBkdS0+dmVyc2lvbikgewojaWZuZGVmIE5FVFNOTVBfRElTQUJMRV9TTk1QVjEKICAgIGNhc2UgU05NUF9WRVJTSU9OXzE6CiNlbmRpZgojaWZuZGVmIE5FVFNOTVBfRElTQUJMRV9TTk1QVjJDCiAgICBjYXNlIFNOTVBfVkVSU0lPTl8yYzoKI2VuZGlmCiAgICBjYXNlIFNOTVBfVkVSU0lPTl8zOgogICAgICAgIHNubXBfY2FsbF9jYWxsYmFja3MoU05NUF9DQUxMQkFDS19BUFBMSUNBVElPTiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNOTVBEX0NBTExCQUNLX0FDTV9DSEVDS19JTklUSUFMLCAmdmlld19wYXJtcyk7CiAgICAgICAgcmV0dXJuIHZpZXdfcGFybXMuZXJyb3Jjb2RlOwogICAgfQogICAgcmV0dXJuIDE7Cn0KCi8qKiBEZXRlcm1pbmVzIGlmIHRoZSBnaXZlbiBQRFUgcmVxdWVzdCBjb3VsZCBwb3RlbnRpYWxseSBhY2Nlc3MKICogICB0aGUgc3BlY2lmaWVkIE1JQiBzdWJ0cmVlCiAqCiAqIEBwYXJhbSBwZHUgICAgIFBEVSByZXF1ZXN0aW5nIGFjY2VzcwogKgogKiBAcGFyYW0gbmFtZSAgICBUaGUgT0lEIHRvIGNoZWNrIGFjY2VzcyBmb3IuCiAqCiAqIEBwYXJhbSBuYW1lbGVuIE51bWJlciBvZiBzdWItaWRlbnRpZmllcnMgaW4gdGhlIE9JRC4KICoKICogQHJldHVybiBnaXZlcyBWQUNNX1NVQ0NFU1MgICBpZiB0aGUgZW50aXJlIE1JQiB0cmVlIGlzIGFjY2Vzc2libGUKICogICAgICAgICAgICAgICBWQUNNX05PVElOVklFVyBpZiB0aGUgZW50aXJlIE1JQiB0cmVlIGlzIGluYWNjZXNzaWJsZQogKiAgICAgICAgICAgICAgIFZBQ01fU1VCVFJFRV9VTktOT1dOIGlmIHNvbWUgcG9ydGlvbnMgYXJlIGFjY2Vzc2libGUKICogICAgICAgICAgICAgICBvdGhlciBjb2RlcyBtYXkgcmV0dXJuZWQgb24gZXJyb3IKICovCmludApuZXRzbm1wX2FjbV9jaGVja19zdWJ0cmVlKG5ldHNubXBfcGR1ICpwZHUsIG9pZCAqbmFtZSwgc2l6ZV90IG5hbWVsZW4pCnsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogSU4gLSBwZHUgYmVpbmcgY2hlY2tlZCAqLwogICAgc3RydWN0IHZpZXdfcGFyYW1ldGVycyB2aWV3X3Bhcm1zOwogICAgdmlld19wYXJtcy5wZHUgPSBwZHU7CiAgICB2aWV3X3Bhcm1zLm5hbWUgPSBuYW1lOwogICAgdmlld19wYXJtcy5uYW1lbGVuID0gbmFtZWxlbjsKICAgIHZpZXdfcGFybXMuZXJyb3Jjb2RlID0gMDsKICAgIHZpZXdfcGFybXMuY2hlY2tfc3VidHJlZSA9IDE7CgogICAgaWYgKHBkdS0+ZmxhZ3MgJiBVQ0RfTVNHX0ZMQUdfQUxXQVlTX0lOX1ZJRVcpIHsKCS8qIEVuYWJsZSBieXBhc3Npbmcgb2Ygdmlldy1iYXNlZCBhY2Nlc3MgY29udHJvbCAqLwogICAgICAgIHJldHVybiAwOwogICAgfQoKICAgIHN3aXRjaCAocGR1LT52ZXJzaW9uKSB7CiNpZm5kZWYgTkVUU05NUF9ESVNBQkxFX1NOTVBWMQogICAgY2FzZSBTTk1QX1ZFUlNJT05fMToKI2VuZGlmCiNpZm5kZWYgTkVUU05NUF9ESVNBQkxFX1NOTVBWMkMKICAgIGNhc2UgU05NUF9WRVJTSU9OXzJjOgojZW5kaWYKICAgIGNhc2UgU05NUF9WRVJTSU9OXzM6CiAgICAgICAgc25tcF9jYWxsX2NhbGxiYWNrcyhTTk1QX0NBTExCQUNLX0FQUExJQ0FUSU9OLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgU05NUERfQ0FMTEJBQ0tfQUNNX0NIRUNLX1NVQlRSRUUsICZ2aWV3X3Bhcm1zKTsKICAgICAgICByZXR1cm4gdmlld19wYXJtcy5lcnJvcmNvZGU7CiAgICB9CiAgICByZXR1cm4gMTsKfQoKbmV0c25tcF9mZWF0dXJlX2NoaWxkX29mKGdldF9zZXNzaW9uX2Zvcl9vaWQsbmV0c25tcF91bnVzZWQpCiNpZm5kZWYgTkVUU05NUF9GRUFUVVJFX1JFTU9WRV9HRVRfU0VTU0lPTl9GT1JfT0lECm5ldHNubXBfc2Vzc2lvbiAqCmdldF9zZXNzaW9uX2Zvcl9vaWQoY29uc3Qgb2lkICpuYW1lLCBzaXplX3QgbGVuLCBjb25zdCBjaGFyICpjb250ZXh0X25hbWUpCnsKICAgIG5ldHNubXBfc3VidHJlZSAqbXlwdHI7CgogICAgbXlwdHIgPSBuZXRzbm1wX3N1YnRyZWVfZmluZF9wcmV2KG5hbWUsIGxlbiwgCgkJCQkgICAgICBuZXRzbm1wX3N1YnRyZWVfZmluZF9maXJzdChjb250ZXh0X25hbWUpLAoJCQkJICAgICAgY29udGV4dF9uYW1lKTsKCiAgICB3aGlsZSAobXlwdHIgJiYgbXlwdHItPnZhcmlhYmxlcyA9PSBOVUxMKSB7CiAgICAgICAgbXlwdHIgPSBteXB0ci0+bmV4dDsKICAgIH0KCiAgICBpZiAobXlwdHIgPT0gTlVMTCkgewogICAgICAgIHJldHVybiBOVUxMOwogICAgfSBlbHNlIHsKICAgICAgICByZXR1cm4gbXlwdHItPnNlc3Npb247CiAgICB9Cn0KI2VuZGlmIC8qIE5FVFNOTVBfRkVBVFVSRV9SRU1PVkVfR0VUX1NFU1NJT05fRk9SX09JRCAqLwoKdm9pZApzZXR1cF90cmVlKHZvaWQpCnsKICAgIG9pZCBjY2l0dFsxXSAgICAgICAgICAgPSB7IDAgfTsKICAgIG9pZCBpc29bMV0gICAgICAgICAgICAgPSB7IDEgfTsKICAgIG9pZCBqb2ludF9jY2l0dF9pc29bMV0gPSB7IDIgfTsKCiNpZmRlZiBVU0lOR19BR0VOVFhfU1VCQUdFTlRfTU9EVUxFCiAgICBpbnQgcm9sZSA9ICBuZXRzbm1wX2RzX2dldF9ib29sZWFuKE5FVFNOTVBfRFNfQVBQTElDQVRJT05fSUQsIAoJCQkJICAgICAgIE5FVFNOTVBfRFNfQUdFTlRfUk9MRSk7CgogICAgbmV0c25tcF9kc19zZXRfYm9vbGVhbihORVRTTk1QX0RTX0FQUExJQ0FUSU9OX0lELCBORVRTTk1QX0RTX0FHRU5UX1JPTEUsIAoJCQkgICBNQVNURVJfQUdFTlQpOwojZW5kaWYKCiAgICAvKiAKICAgICAqIHdlIG5lZWQgdG8gaGF2ZSB0aGUgb2lkJ3MgaW4gdGhlIGhlYXAsIHRoYXQgd2UgY2FuICpmcmVlKiBpdCBmb3IgZXZlcnkgY2FzZSwgCiAgICAgKiB0aGF0cyB0aGUgcHVycG9zZSBvZiB0aGUgZHVwbGljYXRlX29iamlkJ3MKICAgICAqLwogICAgbmV0c25tcF9yZWdpc3Rlcl9udWxsKHNubXBfZHVwbGljYXRlX29iamlkKGNjaXR0LCAxKSwgMSk7CiAgICBuZXRzbm1wX3JlZ2lzdGVyX251bGwoc25tcF9kdXBsaWNhdGVfb2JqaWQoaXNvLCAxKSwgMSk7CiAgICBuZXRzbm1wX3JlZ2lzdGVyX251bGwoc25tcF9kdXBsaWNhdGVfb2JqaWQoam9pbnRfY2NpdHRfaXNvLCAxKSwgMSk7CgojaWZkZWYgVVNJTkdfQUdFTlRYX1NVQkFHRU5UX01PRFVMRQogICAgbmV0c25tcF9kc19zZXRfYm9vbGVhbihORVRTTk1QX0RTX0FQUExJQ0FUSU9OX0lELCBORVRTTk1QX0RTX0FHRU5UX1JPTEUsIAoJCQkgICByb2xlKTsKI2VuZGlmCn0KCmludCAKcmVtb3ZlX3RyZWVfZW50cnkgKG9pZCAqbmFtZSwgc2l6ZV90IGxlbikgewoKICAgIG5ldHNubXBfc3VidHJlZSAqc3ViID0gTlVMTDsKCiAgICBpZiAoKHN1YiA9IG5ldHNubXBfc3VidHJlZV9maW5kKG5hbWUsIGxlbiwgTlVMTCwgIiIpKSA9PSBOVUxMKSB7CglyZXR1cm4gTUlCX05PX1NVQ0hfUkVHSVNUUkFUSU9OOwogICAgfQoKICAgIHJldHVybiB1bnJlZ2lzdGVyX21pYl9jb250ZXh0KG5hbWUsIGxlbiwgc3ViLT5wcmlvcml0eSwKCQkJCSAgc3ViLT5yYW5nZV9zdWJpZCwgc3ViLT5yYW5nZV91Ym91bmQsICIiKTsKCn0KCgp2b2lkCnNodXRkb3duX3RyZWUodm9pZCkgewogICAgb2lkIGNjaXR0WzFdICAgICAgICAgICA9IHsgMCB9OwogICAgb2lkIGlzb1sxXSAgICAgICAgICAgICA9IHsgMSB9OwogICAgb2lkIGpvaW50X2NjaXR0X2lzb1sxXSA9IHsgMiB9OwoKICAgIERFQlVHTVNHVEwoKCJhZ2VudF9yZWdpc3RyeSIsICJzaHV0IGRvd24gdHJlZVxuIikpOwoKICAgIHJlbW92ZV90cmVlX2VudHJ5KGpvaW50X2NjaXR0X2lzbywgMSk7CiAgICByZW1vdmVfdHJlZV9lbnRyeShpc28sIDEpOwogICAgcmVtb3ZlX3RyZWVfZW50cnkoY2NpdHQsIDEpOwoKfQoKZXh0ZXJuIHZvaWQgICAgIGR1bXBfaWR4X3JlZ2lzdHJ5KHZvaWQpOwp2b2lkCmR1bXBfcmVnaXN0cnkodm9pZCkKewogICAgc3RydWN0IHZhcmlhYmxlICp2cCA9IE5VTEw7CiAgICBuZXRzbm1wX3N1YnRyZWUgKm15cHRyLCAqbXlwdHIyOwogICAgdV9jaGFyICpzID0gTlVMTCwgKmUgPSBOVUxMLCAqdiA9IE5VTEw7CiAgICBzaXplX3Qgc2wgPSAyNTYsIGVsID0gMjU2LCB2bCA9IDI1Niwgc2xfbyA9IDAsIGVsX28gPSAwLCB2bF9vID0gMDsKICAgIGludCBpID0gMDsKCiAgICBpZiAoKHMgPSAodV9jaGFyICopIGNhbGxvYyhzbCwgMSkpICE9IE5VTEwgJiYKICAgICAgICAoZSA9ICh1X2NoYXIgKikgY2FsbG9jKHNsLCAxKSkgIT0gTlVMTCAmJgogICAgICAgICh2ID0gKHVfY2hhciAqKSBjYWxsb2Moc2wsIDEpKSAhPSBOVUxMKSB7CgogICAgICAgIHN1YnRyZWVfY29udGV4dF9jYWNoZSAqcHRyOwogICAgICAgIGZvciAocHRyID0gY29udGV4dF9zdWJ0cmVlczsgcHRyOyBwdHIgPSBwdHItPm5leHQpIHsKICAgICAgICAgICAgcHJpbnRmKCJTdWJ0cmVlcyBmb3IgQ29udGV4dDogJXNcbiIsIHB0ci0+Y29udGV4dF9uYW1lKTsKICAgICAgICAgICAgZm9yIChteXB0ciA9IHB0ci0+Zmlyc3Rfc3VidHJlZTsgbXlwdHIgIT0gTlVMTDsKICAgICAgICAgICAgICAgICBteXB0ciA9IG15cHRyLT5uZXh0KSB7CiAgICAgICAgICAgICAgICBzbF9vID0gZWxfbyA9IHZsX28gPSAwOwoKICAgICAgICAgICAgICAgIGlmICghc3ByaW50X3JlYWxsb2Nfb2JqaWQoJnMsICZzbCwgJnNsX28sIDEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG15cHRyLT5zdGFydF9hLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBteXB0ci0+c3RhcnRfbGVuKSkgewogICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgaWYgKCFzcHJpbnRfcmVhbGxvY19vYmppZCgmZSwgJmVsLCAmZWxfbywgMSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbXlwdHItPmVuZF9hLAoJCQkJCSAgbXlwdHItPmVuZF9sZW4pKSB7CiAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgaWYgKG15cHRyLT52YXJpYWJsZXMpIHsKICAgICAgICAgICAgICAgICAgICBwcmludGYoIiUwMnggKCAlcyAtICVzICkgWyIsIG15cHRyLT5mbGFncywgcywgZSk7CiAgICAgICAgICAgICAgICAgICAgZm9yIChpID0gMCwgdnAgPSBteXB0ci0+dmFyaWFibGVzOwogICAgICAgICAgICAgICAgICAgICAgICAgaSA8IG15cHRyLT52YXJpYWJsZXNfbGVuOyBpKyspIHsKICAgICAgICAgICAgICAgICAgICAgICAgdmxfbyA9IDA7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghc3ByaW50X3JlYWxsb2Nfb2JqaWQKICAgICAgICAgICAgICAgICAgICAgICAgICAgICgmdiwgJnZsLCAmdmxfbywgMSwgdnAtPm5hbWUsIHZwLT5uYW1lbGVuKSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgcHJpbnRmKCIlcywgIiwgdik7CiAgICAgICAgICAgICAgICAgICAgICAgIHZwID0gKHN0cnVjdCB2YXJpYWJsZSAqKSAoKGNoYXIgKikgdnAgKwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG15cHRyLT52YXJpYWJsZXNfd2lkdGgpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBwcmludGYoIl1cbiIpOwogICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICBwcmludGYoIiUwMnggICAlcyAtICVzICBcbiIsIG15cHRyLT5mbGFncywgcywgZSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBmb3IgKG15cHRyMiA9IG15cHRyOyBteXB0cjIgIT0gTlVMTDsKICAgICAgICAgICAgICAgICAgICAgbXlwdHIyID0gbXlwdHIyLT5jaGlsZHJlbikgewogICAgICAgICAgICAgICAgICAgIGlmIChteXB0cjItPmxhYmVsX2EgJiYgbXlwdHIyLT5sYWJlbF9hWzBdKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzdHJjbXAobXlwdHIyLT5sYWJlbF9hLCAib2xkX2FwaSIpID09IDApIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCB2YXJpYWJsZSAqdnAgPQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChzdHJ1Y3QgdmFyaWFibGUqKW15cHRyMi0+cmVnaW5mby0+aGFuZGxlci0+bXl2b2lkOwoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghc3ByaW50X3JlYWxsb2Nfb2JqaWQoJnMsICZzbCwgJnNsX28sIDEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2cC0+bmFtZSwgdnAtPm5hbWVsZW4pKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmludGYoIlx0JXNbJXNdICVwIHZhciAlc1xuIiwgbXlwdHIyLT5sYWJlbF9hLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG15cHRyMi0+cmVnaW5mby0+aGFuZGxlck5hbWUgPwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG15cHRyMi0+cmVnaW5mby0+aGFuZGxlck5hbWUgOiAibm8tbmFtZSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbXlwdHIyLT5yZWdpbmZvLCBzKTsKICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByaW50ZigiXHQlcyAlcyAlcFxuIiwgbXlwdHIyLT5sYWJlbF9hLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG15cHRyMi0+cmVnaW5mby0+aGFuZGxlck5hbWUgPwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG15cHRyMi0+cmVnaW5mby0+aGFuZGxlck5hbWUgOiAibm8taGFuZGxlci1uYW1lIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBteXB0cjItPnJlZ2luZm8pOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfQoKICAgIFNOTVBfRlJFRShzKTsKICAgIFNOTVBfRlJFRShlKTsKICAgIFNOTVBfRlJFRSh2KTsKCiAgICBkdW1wX2lkeF9yZWdpc3RyeSgpOwp9CgovKiogIEB9ICovCi8qIEVuZCBvZiBNSUIgcmVnaXN0cmF0aW9uIGNvZGUgKi8KCgpuZXRzbm1wX2ZlYXR1cmVfY2hpbGRfb2YocmVnaXN0ZXJfc2lnbmFsLCBuZXRzbm1wX3VudXNlZCkKI2lmbmRlZiBORVRTTk1QX0ZFQVRVUkVfUkVNT1ZFX1JFR0lTVEVSX1NJR05BTAoKLyoqIEBkZWZncm91cCBhZ2VudF9zaWduYWxzIFBPU0lYIHNpZ25hbHMgc3VwcG9ydCBmb3IgYWdlbnRzLgogKiAgICAgUmVnaXN0ZXJpbmcgYW5kIHVucmVnaXN0ZXJpbmcgc2lnbmFsIGhhbmRsZXJzLgogKiAgIEBpbmdyb3VwIGFnZW50X3JlZ2lzdHJ5CiAqCiAqIEB7CiAqLwoKaW50ICAgICAgICAgICAgIGV4dGVybmFsX3NpZ25hbF9zY2hlZHVsZWRbTlVNX0VYVEVSTkFMX1NJR1NdOwp2b2lkICAgICAgICAgICAgKCpleHRlcm5hbF9zaWduYWxfaGFuZGxlcltOVU1fRVhURVJOQUxfU0lHU10pIChpbnQpOwoKI2lmbmRlZiBXSU4zMgoKLyoKICogVE9ETzogYWRkIGFnZW50X1NJR1hYWF9oYW5kbGVyIGZ1bmN0aW9ucyBhbmQgYGNhc2UgU0lHWFhYOiAuLi4nIGxpbmVzCiAqICAgICAgIGJlbG93IGZvciBldmVyeSBzaW5nbGUgdGhhdCBtaWdodCBiZSBoYW5kbGVkIGJ5IHJlZ2lzdGVyX3NpZ25hbCgpLgogKi8KClJFVFNJR1RZUEUKYWdlbnRfU0lHQ0hMRF9oYW5kbGVyKGludCBzaWcpCnsKICAgIGV4dGVybmFsX3NpZ25hbF9zY2hlZHVsZWRbU0lHQ0hMRF0rKzsKI2lmbmRlZiBIQVZFX1NJR0FDVElPTgogICAgLyoKICAgICAqIHNpZ25hbCgpIHN1Y2tzLiBJdCAqbWlnaHQqIGhhdmUgU3lzViBzZW1hbnRpY3MsIHdoaWNoIG1lYW5zIHRoYXQKICAgICAqICogYSBzaWduYWwgaGFuZGxlciBpcyByZXNldCBvbmNlIGl0IGdldHMgY2FsbGVkLiBFbnN1cmUgdGhhdCBpdAogICAgICogKiByZW1haW5zIGFjdGl2ZS4KICAgICAqLwogICAgc2lnbmFsKFNJR0NITEQsIGFnZW50X1NJR0NITERfaGFuZGxlcik7CiNlbmRpZgp9CgovKiogUmVnaXN0ZXJzIGEgUE9TSVggU2lnbmFsIGhhbmRsZXIuCiAqICBJbXBsZW1lbnRzIHRoZSBzaWduYWwgcmVnaXN0ZXJpbmcgcHJvY2VzcyBmb3IgUE9TSVggYW5kIG5vbi1QT1NJWAogKiAgc3lzdGVtcy4gQWxzbywgdW5pZmllcyB0aGUgd2F5IHNpZ25hbHMgd29yay4KICogIE5vdGUgdGhhdCB0aGUgc2lnbmFsIGhhbmRsZXIgc2hvdWxkIHJlZ2lzdGVyIGl0c2VsZiBhZ2FpbiB3aXRoCiAqICBzaWduYWwoKSBjYWxsIGJlZm9yZSBlbmQgb2YgZXhlY3V0aW9uIHRvIHByZXZlbnQgcG9zc2libGUgcHJvYmxlbXMuCiAqCiAqICBAcGFyYW0gc2lnIFBPU0lYIFNpZ25hbCBJRCBudW1iZXIsIGFzIGRlZmluZWQgaW4gc2lnbmFsLmguCiAqCiAqICBAcGFyYW0gZnVuYyBOZXcgc2lnbmFsIGhhbmRsZXIgZnVuY3Rpb24uCiAqCiAqICBAcmV0dXJuIHZhbHVlIGlzIFNJR19SRUdJU1RFUkVEX09LIGZvciBzdWNjZXNzIGFuZAogKiAgICAgICAgU0lHX1JFR0lTVFJBVElPTl9GQUlMRUQgaWYgdGhlIHJlZ2lzdHJhdGlvbiBjYW4ndAogKiAgICAgICAgYmUgaGFuZGxlZC4KICovCmludApyZWdpc3Rlcl9zaWduYWwoaW50IHNpZywgdm9pZCAoKmZ1bmMpIChpbnQpKQp7CgogICAgc3dpdGNoIChzaWcpIHsKI2lmIGRlZmluZWQoU0lHQ0hMRCkKICAgIGNhc2UgU0lHQ0hMRDoKI2lmZGVmIEhBVkVfU0lHQUNUSU9OCiAgICAgICAgewogICAgICAgICAgICBzdGF0aWMgc3RydWN0IHNpZ2FjdGlvbiBhY3Q7CiAgICAgICAgICAgIGFjdC5zYV9oYW5kbGVyID0gYWdlbnRfU0lHQ0hMRF9oYW5kbGVyOwogICAgICAgICAgICBzaWdlbXB0eXNldCgmYWN0LnNhX21hc2spOwogICAgICAgICAgICBhY3Quc2FfZmxhZ3MgPSAwOwogICAgICAgICAgICBzaWdhY3Rpb24oU0lHQ0hMRCwgJmFjdCwgTlVMTCk7CiAgICAgICAgfQojZWxzZQogICAgICAgIHNpZ25hbChTSUdDSExELCBhZ2VudF9TSUdDSExEX2hhbmRsZXIpOwojZW5kaWYKICAgICAgICBicmVhazsKI2VuZGlmCiAgICBkZWZhdWx0OgogICAgICAgIHNubXBfbG9nKExPR19DUklULAogICAgICAgICAgICAgICAgICJyZWdpc3Rlcl9zaWduYWw6IHNpZ25hbCAlZCBjYW5ub3QgYmUgaGFuZGxlZFxuIiwgc2lnKTsKICAgICAgICByZXR1cm4gU0lHX1JFR0lTVFJBVElPTl9GQUlMRUQ7CiAgICB9CgogICAgZXh0ZXJuYWxfc2lnbmFsX2hhbmRsZXJbc2lnXSA9IGZ1bmM7CiAgICBleHRlcm5hbF9zaWduYWxfc2NoZWR1bGVkW3NpZ10gPSAwOwoKICAgIERFQlVHTVNHVEwoKCJyZWdpc3Rlcl9zaWduYWwiLCAicmVnaXN0ZXJlZCBzaWduYWwgJWRcbiIsIHNpZykpOwogICAgcmV0dXJuIFNJR19SRUdJU1RFUkVEX09LOwp9CgovKiogVW5yZWdpc3RlcnMgYSBQT1NJWCBTaWduYWwgaGFuZGxlci4KICoKICogIEBwYXJhbSBzaWcgUE9TSVggU2lnbmFsIElEIG51bWJlciwgYXMgZGVmaW5lZCBpbiBzaWduYWwuaC4KICoKICogIEByZXR1cm4gdmFsdWUgaXMgU0lHX1VOUkVHSVNURVJFRF9PSyBmb3Igc3VjY2Vzcywgb3IgZXJyb3IgY29kZS4KICovCmludAp1bnJlZ2lzdGVyX3NpZ25hbChpbnQgc2lnKQp7CiAgICBzaWduYWwoc2lnLCBTSUdfREZMKTsKICAgIERFQlVHTVNHVEwoKCJ1bnJlZ2lzdGVyX3NpZ25hbCIsICJ1bnJlZ2lzdGVyZWQgc2lnbmFsICVkXG4iLCBzaWcpKTsKICAgIHJldHVybiBTSUdfVU5SRUdJU1RFUkVEX09LOwp9CgojZW5kaWYgICAgICAgICAgICAgICAgICAgICAgICAgIC8qICFXSU4zMiAqLwoKLyoqICBAfSAqLwovKiBFbmQgb2Ygc2lnbmFscyBzdXBwb3J0IGNvZGUgKi8KCiNlbmRpZiAvKiBORVRTTk1QX0ZFQVRVUkVfUkVNT1ZFX1JFR0lTVEVSX1NJR05BTCAqLwoKLyoqICBAfSAqLwoK