LyoKICogQ29weXJpZ2h0IDIwMDMgVmluY2VudCBC6XJvbgogKgogKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCiAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCiAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgogKgogKiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKICogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KICoKICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYwogKiBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCiAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3ICBVU0EKICovCgojaW5jbHVkZSA8c3RkaW8uaD4KI2luY2x1ZGUgPHN0ZGxpYi5oPgoKI2luY2x1ZGUgImR1bXByZXMuaCIKI2luY2x1ZGUgIndyYy5oIgoKI2RlZmluZSBNQVNURVJfTEFOR1VBR0UgTEFOR19FTkdMSVNICiNkZWZpbmUgTkJfTEFORyAweDk0CgplbnVtIGxhbmdfdHlwZV9lIHsKCWxhbmdfdHlwZV9tYXN0ZXIgPSAwLAoJbGFuZ190eXBlX25ldXRyYWwsCglsYW5nX3R5cGVfbm9ybWFsCn07CgpzdGF0aWMgaW50IHByZXNlbnRfcmVzb3VyY2VzW3Jlc191c3IrMV07CnN0YXRpYyBjaGFyICpyZXNfbmFtZXNbcmVzX3VzcisxXTsKc3RhdGljIGludCBuYl9yZXNvdXJjZXNbcmVzX3VzcisxXVtsYW5nX3R5cGVfbm9ybWFsKzFdOwpzdGF0aWMgcmVzb3VyY2VfdCAqKmxpc3RfcmVzb3VyY2VzW3Jlc191c3IrMV1bbGFuZ190eXBlX25vcm1hbCsxXTsKCnN0YXRpYyBpbnQgZ2V0X2xhbmd1YWdlX2lkKHJlc291cmNlX3QgKnJlc291cmNlKSB7Cglzd2l0Y2gocmVzb3VyY2UtPnR5cGUpIHsKCQljYXNlIHJlc19hY2M6CgkJCXJldHVybiByZXNvdXJjZS0+cmVzLmFjYy0+bHZjLmxhbmd1YWdlLT5pZDsKCQljYXNlIHJlc19ibXA6CgkJCXJldHVybiByZXNvdXJjZS0+cmVzLmJtcC0+ZGF0YS0+bHZjLmxhbmd1YWdlLT5pZDsKCQljYXNlIHJlc19jdXI6CgkJCXJldHVybiByZXNvdXJjZS0+cmVzLmN1ci0+bHZjLmxhbmd1YWdlLT5pZDsKCQljYXNlIHJlc19jdXJnOgoJCQlyZXR1cm4gcmVzb3VyY2UtPnJlcy5jdXJnLT5sdmMubGFuZ3VhZ2UtPmlkOwoJCWNhc2UgcmVzX2RsZzoKCQkJcmV0dXJuIHJlc291cmNlLT5yZXMuZGxnLT5sdmMubGFuZ3VhZ2UtPmlkOwoJCWNhc2UgcmVzX2RsZ2V4OgoJCQlyZXR1cm4gcmVzb3VyY2UtPnJlcy5kbGdleC0+bHZjLmxhbmd1YWdlLT5pZDsKCQljYXNlIHJlc19mbnQ6CgkJCXJldHVybiByZXNvdXJjZS0+cmVzLmZudC0+ZGF0YS0+bHZjLmxhbmd1YWdlLT5pZDsKCQljYXNlIHJlc19mbnRkaXI6CgkJCXJldHVybiByZXNvdXJjZS0+cmVzLmZuZC0+ZGF0YS0+bHZjLmxhbmd1YWdlLT5pZDsKCQljYXNlIHJlc19pY286CgkJCXJldHVybiByZXNvdXJjZS0+cmVzLmljby0+bHZjLmxhbmd1YWdlLT5pZDsKCQljYXNlIHJlc19pY29nOgoJCQlyZXR1cm4gcmVzb3VyY2UtPnJlcy5pY29nLT5sdmMubGFuZ3VhZ2UtPmlkOwoJCWNhc2UgcmVzX21lbjoKCQkJcmV0dXJuIHJlc291cmNlLT5yZXMubWVuLT5sdmMubGFuZ3VhZ2UtPmlkOwoJCWNhc2UgcmVzX21lbmV4OgoJCQlyZXR1cm4gcmVzb3VyY2UtPnJlcy5tZW5leC0+bHZjLmxhbmd1YWdlLT5pZDsKCQljYXNlIHJlc19yZHQ6CgkJCXJldHVybiByZXNvdXJjZS0+cmVzLnJkdC0+ZGF0YS0+bHZjLmxhbmd1YWdlLT5pZDsKCQljYXNlIHJlc19zdHQ6CgkJCXJldHVybiByZXNvdXJjZS0+cmVzLnN0dC0+bHZjLmxhbmd1YWdlLT5pZDsKCQljYXNlIHJlc191c3I6CgkJCXJldHVybiByZXNvdXJjZS0+cmVzLnVzci0+ZGF0YS0+bHZjLmxhbmd1YWdlLT5pZDsKCQljYXNlIHJlc19tc2c6CgkJCXJldHVybiByZXNvdXJjZS0+cmVzLm1zZy0+ZGF0YS0+bHZjLmxhbmd1YWdlLT5pZDsKCQljYXNlIHJlc192ZXI6CgkJCXJldHVybiByZXNvdXJjZS0+cmVzLnZlci0+bHZjLmxhbmd1YWdlLT5pZDsKCQljYXNlIHJlc19kbGdpbml0OgoJCQlyZXR1cm4gcmVzb3VyY2UtPnJlcy5kbGdpLT5kYXRhLT5sdmMubGFuZ3VhZ2UtPmlkOwoJCWNhc2UgcmVzX3Rvb2xiYXI6CgkJCXJldHVybiByZXNvdXJjZS0+cmVzLnRidC0+bHZjLmxhbmd1YWdlLT5pZDsKCQljYXNlIHJlc19hbmljdXI6CgkJY2FzZSByZXNfYW5paWNvOgoJCQlyZXR1cm4gcmVzb3VyY2UtPnJlcy5hbmktPmRhdGEtPmx2Yy5sYW5ndWFnZS0+aWQ7CgkJZGVmYXVsdDoKCQkJLyogTm90IHN1cHBvc2VkIHRvIHJlYWNoIGhlcmUgKi8KCQkJZnByaW50ZihzdGRlcnIsICJOb3Qgc3VwcG9zZWQgdG8gcmVhY2ggaGVyZSAoZ2V0X2xhbmd1YWdlX2lkKCkpXG4iKTsKCQkJYWJvcnQoKTsKCQkJcmV0dXJuIC0xOwoJfQp9CgpzdGF0aWMgdm9pZCBhZGRfcmVzb3VyY2UocmVzb3VyY2VfdCAqcmVzb3VyY2UpIHsKCWVudW0gbGFuZ190eXBlX2UgbGFuZ190eXBlOwoJZW51bSByZXNfZSByZXNfdHlwZSA9IHJlc291cmNlLT50eXBlOwoJaW50IGxpZCA9IGdldF9sYW5ndWFnZV9pZChyZXNvdXJjZSk7CgoJaWYobGlkID09IE1BU1RFUl9MQU5HVUFHRSkgewoJCWxhbmdfdHlwZSA9IGxhbmdfdHlwZV9tYXN0ZXI7Cgl9IGVsc2UgaWYobGlkID09IExBTkdfTkVVVFJBTCkgewoJCWxhbmdfdHlwZSA9IGxhbmdfdHlwZV9uZXV0cmFsOwoJfSBlbHNlIHsKCQlsYW5nX3R5cGUgPSBsYW5nX3R5cGVfbm9ybWFsOwoJfQoJbmJfcmVzb3VyY2VzW3Jlc190eXBlXVtsYW5nX3R5cGVdKys7CglsaXN0X3Jlc291cmNlc1tyZXNfdHlwZV1bbGFuZ190eXBlXSA9IHJlYWxsb2MobGlzdF9yZXNvdXJjZXNbcmVzX3R5cGVdW2xhbmdfdHlwZV0sIG5iX3Jlc291cmNlc1tyZXNfdHlwZV1bbGFuZ190eXBlXSpzaXplb2YocmVzb3VyY2VfdCAqKSk7CglsaXN0X3Jlc291cmNlc1tyZXNfdHlwZV1bbGFuZ190eXBlXVtuYl9yZXNvdXJjZXNbcmVzX3R5cGVdW2xhbmdfdHlwZV0tMV0gPSByZXNvdXJjZTsKfQoKI2lmIDAKCiNkZWZpbmUgUFJFVFRZUFJJTlRMQU5HKGxhbmdpZCkgXAoJaWYoTEFOR18jI2xhbmdpZCA9PSBsaWQpIHsgXAoJCXJldHVybiAjbGFuZ2lkOyBcCgl9CgpzdGF0aWMgY29uc3QgY2hhciAqZ2V0X2xhbmd1YWdlX25hbWUoaW50IGxpZCkgewoJUFJFVFRZUFJJTlRMQU5HKE5FVVRSQUwpCglQUkVUVFlQUklOVExBTkcoQUZSSUtBQU5TKQoJUFJFVFRZUFJJTlRMQU5HKEFMQkFOSUFOKQoJUFJFVFRZUFJJTlRMQU5HKEFSQUJJQykKCVBSRVRUWVBSSU5UTEFORyhBUk1FTklBTikKCVBSRVRUWVBSSU5UTEFORyhBU1NBTUVTRSkKCVBSRVRUWVBSSU5UTEFORyhBWkVSSSkKCVBSRVRUWVBSSU5UTEFORyhCQVNRVUUpCglQUkVUVFlQUklOVExBTkcoQkVMQVJVU0lBTikKCVBSRVRUWVBSSU5UTEFORyhCRU5HQUxJKQoJUFJFVFRZUFJJTlRMQU5HKEJVTEdBUklBTikKCVBSRVRUWVBSSU5UTEFORyhDQVRBTEFOKQoJUFJFVFRZUFJJTlRMQU5HKENISU5FU0UpCglQUkVUVFlQUklOVExBTkcoQ1JPQVRJQU4pCglQUkVUVFlQUklOVExBTkcoQ1pFQ0gpCglQUkVUVFlQUklOVExBTkcoREFOSVNIKQoJUFJFVFRZUFJJTlRMQU5HKERJVkVISSkKCVBSRVRUWVBSSU5UTEFORyhEVVRDSCkKCVBSRVRUWVBSSU5UTEFORyhFTkdMSVNIKQoJUFJFVFRZUFJJTlRMQU5HKEVTVE9OSUFOKQoJUFJFVFRZUFJJTlRMQU5HKEZBRVJPRVNFKQoJUFJFVFRZUFJJTlRMQU5HKEZBUlNJKQoJUFJFVFRZUFJJTlRMQU5HKEZJTk5JU0gpCglQUkVUVFlQUklOVExBTkcoRlJFTkNIKQoJUFJFVFRZUFJJTlRMQU5HKEdBTElDSUFOKQoJUFJFVFRZUFJJTlRMQU5HKEdFT1JHSUFOKQoJUFJFVFRZUFJJTlRMQU5HKEdFUk1BTikKCVBSRVRUWVBSSU5UTEFORyhHUkVFSykKCVBSRVRUWVBSSU5UTEFORyhHVUpBUkFUSSkKCVBSRVRUWVBSSU5UTEFORyhIRUJSRVcpCglQUkVUVFlQUklOVExBTkcoSElOREkpCglQUkVUVFlQUklOVExBTkcoSFVOR0FSSUFOKQoJUFJFVFRZUFJJTlRMQU5HKElDRUxBTkRJQykKCVBSRVRUWVBSSU5UTEFORyhJTkRPTkVTSUFOKQoJUFJFVFRZUFJJTlRMQU5HKElUQUxJQU4pCglQUkVUVFlQUklOVExBTkcoSkFQQU5FU0UpCglQUkVUVFlQUklOVExBTkcoS0FOTkFEQSkKCVBSRVRUWVBSSU5UTEFORyhLQVNITUlSSSkKCVBSRVRUWVBSSU5UTEFORyhLQVpBSykKCVBSRVRUWVBSSU5UTEFORyhLT05LQU5JKQoJUFJFVFRZUFJJTlRMQU5HKEtPUkVBTikKCVBSRVRUWVBSSU5UTEFORyhLWVJHWVopCglQUkVUVFlQUklOVExBTkcoTEFUVklBTikKCVBSRVRUWVBSSU5UTEFORyhMSVRIVUFOSUFOKQoJUFJFVFRZUFJJTlRMQU5HKE1BQ0VET05JQU4pCglQUkVUVFlQUklOVExBTkcoTUFMQVkpCglQUkVUVFlQUklOVExBTkcoTUFMQVlBTEFNKQoJUFJFVFRZUFJJTlRMQU5HKE1BTklQVVJJKQoJUFJFVFRZUFJJTlRMQU5HKE1BUkFUSEkpCglQUkVUVFlQUklOVExBTkcoTU9OR09MSUFOKQoJUFJFVFRZUFJJTlRMQU5HKE5FUEFMSSkKCVBSRVRUWVBSSU5UTEFORyhOT1JXRUdJQU4pCglQUkVUVFlQUklOVExBTkcoT1JJWUEpCglQUkVUVFlQUklOVExBTkcoUE9MSVNIKQoJUFJFVFRZUFJJTlRMQU5HKFBPUlRVR1VFU0UpCglQUkVUVFlQUklOVExBTkcoUFVOSkFCSSkKCVBSRVRUWVBSSU5UTEFORyhST01BTklBTikKCVBSRVRUWVBSSU5UTEFORyhSVVNTSUFOKQoJUFJFVFRZUFJJTlRMQU5HKFNBTlNLUklUKQoJUFJFVFRZUFJJTlRMQU5HKFNFUkJJQU4pCglQUkVUVFlQUklOVExBTkcoU0lOREhJKQoJUFJFVFRZUFJJTlRMQU5HKFNMT1ZBSykKCVBSRVRUWVBSSU5UTEFORyhTTE9WRU5JQU4pCglQUkVUVFlQUklOVExBTkcoU1BBTklTSCkKCVBSRVRUWVBSSU5UTEFORyhTV0FISUxJKQoJUFJFVFRZUFJJTlRMQU5HKFNXRURJU0gpCglQUkVUVFlQUklOVExBTkcoU1lSSUFDKQoJUFJFVFRZUFJJTlRMQU5HKFRBTUlMKQoJUFJFVFRZUFJJTlRMQU5HKFRBVEFSKQoJUFJFVFRZUFJJTlRMQU5HKFRFTFVHVSkKCVBSRVRUWVBSSU5UTEFORyhUSEFJKQoJUFJFVFRZUFJJTlRMQU5HKFRVUktJU0gpCglQUkVUVFlQUklOVExBTkcoVUtSQUlOSUFOKQoJUFJFVFRZUFJJTlRMQU5HKFVSRFUpCglQUkVUVFlQUklOVExBTkcoVVpCRUspCglQUkVUVFlQUklOVExBTkcoVklFVE5BTUVTRSkKCVBSRVRUWVBSSU5UTEFORyhHQUVMSUMpCglQUkVUVFlQUklOVExBTkcoTUFMVEVTRSkKCVBSRVRUWVBSSU5UTEFORyhNQU9SSSkKCVBSRVRUWVBSSU5UTEFORyhSSEFFVE9fUk9NQU5DRSkKCVBSRVRUWVBSSU5UTEFORyhTQUFNSSkKCVBSRVRUWVBSSU5UTEFORyhTT1JCSUFOKQoJUFJFVFRZUFJJTlRMQU5HKFNVVFUpCglQUkVUVFlQUklOVExBTkcoVFNPTkdBKQoJUFJFVFRZUFJJTlRMQU5HKFRTV0FOQSkKCVBSRVRUWVBSSU5UTEFORyhWRU5EQSkKCVBSRVRUWVBSSU5UTEFORyhYSE9TQSkKCVBSRVRUWVBSSU5UTEFORyhaVUxVKQoJUFJFVFRZUFJJTlRMQU5HKEVTUEVSQU5UTykKCVBSRVRUWVBSSU5UTEFORyhXQUxPTikKCVBSRVRUWVBSSU5UTEFORyhDT1JOSVNIKQoJUFJFVFRZUFJJTlRMQU5HKFdFTFNIKQoJUFJFVFRZUFJJTlRMQU5HKEJSRVRPTikKCXJldHVybiAiVW5rbm93biBsYW5ndWFnZSI7Cn0KI2VuZGlmCgpzdGF0aWMgaW50IGNvbXBhcmVfYWNjZWxlcmF0b3IoYWNjZWxlcmF0b3JfdCAqYWNjZWxlcmF0b3IxLCBhY2NlbGVyYXRvcl90ICphY2NlbGVyYXRvcjIpIHsKCWludCBkaWZmZXJlbnQgPSAwOwoJZXZlbnRfdCAqZXYxID0gTlVMTCwgKmV2MiA9IE5VTEw7CglpZighZGlmZmVyZW50ICYmCgkgICAoKGFjY2VsZXJhdG9yMS0+bWVtb3B0ICE9IGFjY2VsZXJhdG9yMi0+bWVtb3B0KSB8fAoJICAgKGFjY2VsZXJhdG9yMS0+bHZjLnZlcnNpb24gIT0gYWNjZWxlcmF0b3IyLT5sdmMudmVyc2lvbikgfHwKCSAgIChhY2NlbGVyYXRvcjEtPmx2Yy5jaGFyYWN0cyAhPSBhY2NlbGVyYXRvcjItPmx2Yy5jaGFyYWN0cykpKQoJCWRpZmZlcmVudCA9IDE7CglldjEgPSBhY2NlbGVyYXRvcjEtPmV2ZW50czsKCWV2MiA9IGFjY2VsZXJhdG9yMi0+ZXZlbnRzOwoJd2hpbGUoIWRpZmZlcmVudCAmJiBldjEgJiYgZXYyKSB7CgkJaWYoIWRpZmZlcmVudCAmJgoJCSAgICgoZXYxLT5pZCAhPSBldjItPmlkKSB8fAoJCSAgIChldjEtPmZsYWdzICE9IGV2Mi0+ZmxhZ3MpKSkKCQkJZGlmZmVyZW50ID0gMTsKCQlldjEgPSBldjEtPm5leHQ7CgkJZXYyID0gZXYyLT5uZXh0OwoJfQoJaWYoIWRpZmZlcmVudCAmJgoJICAgKChldjEgJiYgIWV2MikgfHwgKCFldjEgJiYgZXYyKSkpCgkJZGlmZmVyZW50ID0gMTsKCXJldHVybiBkaWZmZXJlbnQ7Cn0KCnN0YXRpYyBpbnQgY29tcGFyZV9iaXRtYXAoYml0bWFwX3QgKmJpdG1hcDEsIGJpdG1hcF90ICpiaXRtYXAyKSB7CglpbnQgZGlmZmVyZW50ID0gMDsKCWlmKCFkaWZmZXJlbnQgJiYKCSAgICgoYml0bWFwMS0+bWVtb3B0ICE9IGJpdG1hcDItPm1lbW9wdCkgfHwKCSAgIChiaXRtYXAxLT5kYXRhLT5sdmMudmVyc2lvbiAhPSBiaXRtYXAyLT5kYXRhLT5sdmMudmVyc2lvbikgfHwKCSAgIChiaXRtYXAxLT5kYXRhLT5sdmMuY2hhcmFjdHMgIT0gYml0bWFwMi0+ZGF0YS0+bHZjLmNoYXJhY3RzKSkpCgkJZGlmZmVyZW50ID0gMTsKCXJldHVybiBkaWZmZXJlbnQ7Cn0KCnN0YXRpYyBpbnQgY29tcGFyZV9jdXJzb3IoY3Vyc29yX3QgKmN1cnNvcjEsIGN1cnNvcl90ICpjdXJzb3IyKSB7CglpbnQgZGlmZmVyZW50ID0gMDsKCWlmKCFkaWZmZXJlbnQgJiYKCSAgICgoY3Vyc29yMS0+aWQgIT0gY3Vyc29yMi0+aWQpIHx8CgkgICAoY3Vyc29yMS0+d2lkdGggIT0gY3Vyc29yMi0+d2lkdGgpIHx8CgkgICAoY3Vyc29yMS0+aGVpZ2h0ICE9IGN1cnNvcjItPmhlaWdodCkgfHwKCSAgIChjdXJzb3IxLT54aG90ICE9IGN1cnNvcjItPnhob3QpIHx8CgkgICAoY3Vyc29yMS0+eWhvdCAhPSBjdXJzb3IyLT55aG90KSkpCgkJZGlmZmVyZW50ID0gMTsKCWlmKCFkaWZmZXJlbnQgJiYKCSAgICgoY3Vyc29yMS0+bHZjLnZlcnNpb24gIT0gY3Vyc29yMi0+bHZjLnZlcnNpb24pIHx8CgkgICAoY3Vyc29yMS0+bHZjLmNoYXJhY3RzICE9IGN1cnNvcjItPmx2Yy5jaGFyYWN0cykpKQoJCWRpZmZlcmVudCA9IDE7CglyZXR1cm4gZGlmZmVyZW50Owp9CgpzdGF0aWMgaW50IGNvbXBhcmVfY3Vyc29yX2dyb3VwKGN1cnNvcl9ncm91cF90ICpjdXJzb3JfZ3JvdXAxLCBjdXJzb3JfZ3JvdXBfdCAqY3Vyc29yX2dyb3VwMikgewoJaW50IGRpZmZlcmVudCA9IDA7CgljdXJzb3JfdCAqY3Vyc29yMSA9IE5VTEwsICpjdXJzb3IyID0gTlVMTDsKCWlmKCFkaWZmZXJlbnQgJiYKCSAgICgoY3Vyc29yX2dyb3VwMS0+bWVtb3B0ICE9IGN1cnNvcl9ncm91cDItPm1lbW9wdCkgfHwKCSAgIChjdXJzb3JfZ3JvdXAxLT5sdmMudmVyc2lvbiAhPSBjdXJzb3JfZ3JvdXAyLT5sdmMudmVyc2lvbikgfHwKCSAgIChjdXJzb3JfZ3JvdXAxLT5sdmMuY2hhcmFjdHMgIT0gY3Vyc29yX2dyb3VwMi0+bHZjLmNoYXJhY3RzKSkpCgkJZGlmZmVyZW50ID0gMTsKCWlmKCFkaWZmZXJlbnQgJiYKCSAgIChjdXJzb3JfZ3JvdXAxLT5uY3Vyc29yICE9IGN1cnNvcl9ncm91cDItPm5jdXJzb3IpKQoJCWRpZmZlcmVudCA9IDE7CglpZighZGlmZmVyZW50KSB7CgkJY3Vyc29yMSA9IGN1cnNvcl9ncm91cDEtPmN1cnNvcmxpc3Q7CgkJY3Vyc29yMiA9IGN1cnNvcl9ncm91cDItPmN1cnNvcmxpc3Q7CgkJd2hpbGUoIWRpZmZlcmVudCAmJiBjdXJzb3IxICYmIGN1cnNvcjIpIHsKCQkJZGlmZmVyZW50ID0gY29tcGFyZV9jdXJzb3IoY3Vyc29yMSwgY3Vyc29yMik7CgkJCWN1cnNvcjEgPSBjdXJzb3IxLT5uZXh0OwoJCQljdXJzb3IyID0gY3Vyc29yMi0+bmV4dDsKCQl9CgkJaWYoIWRpZmZlcmVudCAmJgoJCSAgICgoY3Vyc29yMSAmJiAhY3Vyc29yMikgfHwKCQkgICAoIWN1cnNvcjEgJiYgY3Vyc29yMikpKQoJCQlkaWZmZXJlbnQgPSAxOwoJfQoJcmV0dXJuIGRpZmZlcmVudDsKfQoKc3RhdGljIGludCBjb21wYXJlX2NvbnRyb2woY29udHJvbF90ICpjb250cm9sMSwgY29udHJvbF90ICpjb250cm9sMikgewoJaW50IGRpZmZlcmVudCA9IDA7CgljaGFyICpuYW1laWQgPSBOVUxMOwoJaWYoIWRpZmZlcmVudCAmJgoJCSgoY29udHJvbDEgJiYgIWNvbnRyb2wyKSB8fAoJCSghY29udHJvbDEgJiYgY29udHJvbDIpKSkKCQkJZGlmZmVyZW50ID0gMTsKCWlmKGRpZmZlcmVudCB8fCAhY29udHJvbDEgfHwgIWNvbnRyb2wyKQoJCXJldHVybiBkaWZmZXJlbnQ7CgluYW1laWQgPSBzdHJkdXAoZ2V0X25hbWVpZF9zdHIoY29udHJvbDEtPmN0bGNsYXNzKSk7CglpZighZGlmZmVyZW50ICYmIHN0cmNtcChuYW1laWQsIGdldF9uYW1laWRfc3RyKGNvbnRyb2wyLT5jdGxjbGFzcykpKQoJCWRpZmZlcmVudCA9IDE7CglmcmVlKG5hbWVpZCk7CglpZighZGlmZmVyZW50ICYmIAoJICAgKGNvbnRyb2wxLT5pZCAhPSBjb250cm9sMi0+aWQpKQoJCWRpZmZlcmVudCA9IDE7CglpZighZGlmZmVyZW50ICYmIGNvbnRyb2wxLT5nb3RzdHlsZSAmJiBjb250cm9sMi0+Z290c3R5bGUpIHsKCQlpZigoIWNvbnRyb2wxLT5zdHlsZSB8fCAhY29udHJvbDItPnN0eWxlKSB8fAoJCSAgIChjb250cm9sMS0+c3R5bGUtPmFuZF9tYXNrIHx8IGNvbnRyb2wyLT5zdHlsZS0+YW5kX21hc2spIHx8CgkJICAgKGNvbnRyb2wxLT5zdHlsZS0+b3JfbWFzayAhPSBjb250cm9sMi0+c3R5bGUtPm9yX21hc2spKQoJCQlkaWZmZXJlbnQgPSAxOwoJfSBlbHNlIGlmKCFkaWZmZXJlbnQgJiYKCQkgICgoY29udHJvbDEtPmdvdHN0eWxlICYmICFjb250cm9sMi0+Z290c3R5bGUpIHx8CgkJICAoIWNvbnRyb2wxLT5nb3RzdHlsZSAmJiBjb250cm9sMi0+Z290c3R5bGUpKSkKCQkJZGlmZmVyZW50ID0gMTsKCWlmKCFkaWZmZXJlbnQgJiYgY29udHJvbDEtPmdvdGV4c3R5bGUgJiYgY29udHJvbDItPmdvdGV4c3R5bGUpIHsKCQlpZigoIWNvbnRyb2wxLT5leHN0eWxlIHx8ICFjb250cm9sMi0+ZXhzdHlsZSkgfHwKCQkgICAoY29udHJvbDEtPmV4c3R5bGUtPmFuZF9tYXNrIHx8IGNvbnRyb2wyLT5leHN0eWxlLT5hbmRfbWFzaykgfHwKCQkgICAoY29udHJvbDEtPmV4c3R5bGUtPm9yX21hc2sgIT0gY29udHJvbDItPmV4c3R5bGUtPm9yX21hc2spKQoJCQlkaWZmZXJlbnQgPSAxOwoJfSBlbHNlIGlmKCFkaWZmZXJlbnQgJiYKCQkgICgoY29udHJvbDEtPmdvdGV4c3R5bGUgJiYgIWNvbnRyb2wyLT5nb3RleHN0eWxlKSB8fAoJCSAgKCFjb250cm9sMS0+Z290ZXhzdHlsZSAmJiBjb250cm9sMi0+Z290ZXhzdHlsZSkpKQoJCQlkaWZmZXJlbnQgPSAxOwoJaWYoIWRpZmZlcmVudCAmJiBjb250cm9sMS0+Z290aGVscGlkICYmIGNvbnRyb2wyLT5nb3RoZWxwaWQpIHsKCQlpZihjb250cm9sMS0+aGVscGlkICE9IGNvbnRyb2wyLT5oZWxwaWQpCgkJCWRpZmZlcmVudCA9IDE7Cgl9IGVsc2UgaWYoIWRpZmZlcmVudCAmJgoJCSAgKChjb250cm9sMS0+Z290aGVscGlkICYmICFjb250cm9sMi0+Z290aGVscGlkKSB8fAoJCSAgKCFjb250cm9sMS0+Z290aGVscGlkICYmIGNvbnRyb2wyLT5nb3RoZWxwaWQpKSkKCQkJZGlmZmVyZW50ID0gMTsKCXJldHVybiBkaWZmZXJlbnQ7Cn0KCnN0YXRpYyBpbnQgY29tcGFyZV9kaWFsb2coZGlhbG9nX3QgKmRpYWxvZzEsIGRpYWxvZ190ICpkaWFsb2cyKSB7CglpbnQgZGlmZmVyZW50ID0gMDsKCWNoYXIgKm5hbWVpZCA9IE5VTEw7CglpZighZGlmZmVyZW50ICYmCgkgICAoKGRpYWxvZzEtPm1lbW9wdCAhPSBkaWFsb2cyLT5tZW1vcHQpIHx8CgkgICAoZGlhbG9nMS0+bHZjLnZlcnNpb24gIT0gZGlhbG9nMi0+bHZjLnZlcnNpb24pIHx8CgkgICAoZGlhbG9nMS0+bHZjLmNoYXJhY3RzICE9IGRpYWxvZzItPmx2Yy5jaGFyYWN0cykpKQoJCWRpZmZlcmVudCA9IDE7CglpZighZGlmZmVyZW50ICYmIGRpYWxvZzEtPmdvdHN0eWxlICYmIGRpYWxvZzItPmdvdHN0eWxlKSB7CgkJaWYoKCFkaWFsb2cxLT5zdHlsZSB8fCAhZGlhbG9nMi0+c3R5bGUpIHx8CgkJICAgKGRpYWxvZzEtPnN0eWxlLT5hbmRfbWFzayB8fCBkaWFsb2cyLT5zdHlsZS0+YW5kX21hc2spIHx8CgkJICAgKGRpYWxvZzEtPnN0eWxlLT5vcl9tYXNrICE9IGRpYWxvZzItPnN0eWxlLT5vcl9tYXNrKSkKCQkJZGlmZmVyZW50ID0gMTsKCX0gZWxzZSBpZighZGlmZmVyZW50ICYmCgkJICAoKGRpYWxvZzEtPmdvdHN0eWxlICYmICFkaWFsb2cyLT5nb3RzdHlsZSkgfHwKCQkgICghZGlhbG9nMS0+Z290c3R5bGUgJiYgZGlhbG9nMi0+Z290c3R5bGUpKSkKCQkJZGlmZmVyZW50ID0gMTsKCWlmKCFkaWZmZXJlbnQgJiYgZGlhbG9nMS0+Z290ZXhzdHlsZSAmJiBkaWFsb2cyLT5nb3RleHN0eWxlKSB7CgkJaWYoKCFkaWFsb2cxLT5leHN0eWxlIHx8ICFkaWFsb2cyLT5leHN0eWxlKSB8fAoJCSAgIChkaWFsb2cxLT5leHN0eWxlLT5hbmRfbWFzayB8fCBkaWFsb2cyLT5leHN0eWxlLT5hbmRfbWFzaykgfHwKCQkgICAoZGlhbG9nMS0+ZXhzdHlsZS0+b3JfbWFzayAhPSBkaWFsb2cyLT5leHN0eWxlLT5vcl9tYXNrKSkKCQkJZGlmZmVyZW50ID0gMTsKCX0gZWxzZSBpZighZGlmZmVyZW50ICYmCgkJICAoKGRpYWxvZzEtPmdvdGV4c3R5bGUgJiYgIWRpYWxvZzItPmdvdGV4c3R5bGUpIHx8CgkJICAoIWRpYWxvZzEtPmdvdGV4c3R5bGUgJiYgZGlhbG9nMi0+Z290ZXhzdHlsZSkpKQoJCQlkaWZmZXJlbnQgPSAxOwoJbmFtZWlkID0gc3RyZHVwKGdldF9uYW1laWRfc3RyKGRpYWxvZzEtPm1lbnUpKTsKCWlmKCFkaWZmZXJlbnQgJiYgc3RyY21wKG5hbWVpZCwgZ2V0X25hbWVpZF9zdHIoZGlhbG9nMi0+bWVudSkpKQoJCWRpZmZlcmVudCA9IDE7CglmcmVlKG5hbWVpZCk7CgluYW1laWQgPSBzdHJkdXAoZ2V0X25hbWVpZF9zdHIoZGlhbG9nMS0+ZGxnY2xhc3MpKTsKCWlmKCFkaWZmZXJlbnQgJiYgc3RyY21wKG5hbWVpZCwgZ2V0X25hbWVpZF9zdHIoZGlhbG9nMi0+ZGxnY2xhc3MpKSkKCQlkaWZmZXJlbnQgPSAxOwoJZnJlZShuYW1laWQpOwoJaWYoIWRpZmZlcmVudCkKCQlkaWZmZXJlbnQgPSBjb21wYXJlX2NvbnRyb2woZGlhbG9nMS0+Y29udHJvbHMsIGRpYWxvZzItPmNvbnRyb2xzKTsKCXJldHVybiBkaWZmZXJlbnQ7Cn0KCnN0YXRpYyBpbnQgY29tcGFyZV9kaWFsb2dleChkaWFsb2dleF90ICpkaWFsb2dleDEsIGRpYWxvZ2V4X3QgKmRpYWxvZ2V4MikgewoJaW50IGRpZmZlcmVudCA9IDA7CgljaGFyICpuYW1laWQgPSBOVUxMOwoJaWYoIWRpZmZlcmVudCAmJgoJICAgKChkaWFsb2dleDEtPm1lbW9wdCAhPSBkaWFsb2dleDItPm1lbW9wdCkgfHwKCSAgIChkaWFsb2dleDEtPmx2Yy52ZXJzaW9uICE9IGRpYWxvZ2V4Mi0+bHZjLnZlcnNpb24pIHx8CgkgICAoZGlhbG9nZXgxLT5sdmMuY2hhcmFjdHMgIT0gZGlhbG9nZXgyLT5sdmMuY2hhcmFjdHMpKSkKCQlkaWZmZXJlbnQgPSAxOwoJaWYoIWRpZmZlcmVudCAmJiBkaWFsb2dleDEtPmdvdHN0eWxlICYmIGRpYWxvZ2V4Mi0+Z290c3R5bGUpIHsKCQlpZigoIWRpYWxvZ2V4MS0+c3R5bGUgfHwgIWRpYWxvZ2V4Mi0+c3R5bGUpIHx8CgkJICAgKGRpYWxvZ2V4MS0+c3R5bGUtPmFuZF9tYXNrIHx8IGRpYWxvZ2V4Mi0+c3R5bGUtPmFuZF9tYXNrKSB8fAoJCSAgIChkaWFsb2dleDEtPnN0eWxlLT5vcl9tYXNrICE9IGRpYWxvZ2V4Mi0+c3R5bGUtPm9yX21hc2spKQoJCQlkaWZmZXJlbnQgPSAxOwoJfSBlbHNlIGlmKCFkaWZmZXJlbnQgJiYKCQkgICgoZGlhbG9nZXgxLT5nb3RzdHlsZSAmJiAhZGlhbG9nZXgyLT5nb3RzdHlsZSkgfHwKCQkgICghZGlhbG9nZXgxLT5nb3RzdHlsZSAmJiBkaWFsb2dleDItPmdvdHN0eWxlKSkpCgkJCWRpZmZlcmVudCA9IDE7CglpZighZGlmZmVyZW50ICYmIGRpYWxvZ2V4MS0+Z290ZXhzdHlsZSAmJiBkaWFsb2dleDItPmdvdGV4c3R5bGUpIHsKCQlpZigoIWRpYWxvZ2V4MS0+ZXhzdHlsZSB8fCAhZGlhbG9nZXgyLT5leHN0eWxlKSB8fAoJCSAgIChkaWFsb2dleDEtPmV4c3R5bGUtPmFuZF9tYXNrIHx8IGRpYWxvZ2V4Mi0+ZXhzdHlsZS0+YW5kX21hc2spIHx8CgkJICAgKGRpYWxvZ2V4MS0+ZXhzdHlsZS0+b3JfbWFzayAhPSBkaWFsb2dleDItPmV4c3R5bGUtPm9yX21hc2spKQoJCQlkaWZmZXJlbnQgPSAxOwoJfSBlbHNlIGlmKCFkaWZmZXJlbnQgJiYKCQkgICgoZGlhbG9nZXgxLT5nb3RleHN0eWxlICYmICFkaWFsb2dleDItPmdvdGV4c3R5bGUpIHx8CgkJICAoIWRpYWxvZ2V4MS0+Z290ZXhzdHlsZSAmJiBkaWFsb2dleDItPmdvdGV4c3R5bGUpKSkKCQkJZGlmZmVyZW50ID0gMTsKCWlmKCFkaWZmZXJlbnQgJiYgZGlhbG9nZXgxLT5nb3RoZWxwaWQgJiYgZGlhbG9nZXgyLT5nb3RoZWxwaWQpIHsKCQlpZihkaWFsb2dleDEtPmhlbHBpZCAhPSBkaWFsb2dleDItPmhlbHBpZCkKCQkJZGlmZmVyZW50ID0gMTsKCX0gZWxzZSBpZighZGlmZmVyZW50ICYmCgkJICAoKGRpYWxvZ2V4MS0+Z290aGVscGlkICYmICFkaWFsb2dleDItPmdvdGhlbHBpZCkgfHwKCQkgICghZGlhbG9nZXgxLT5nb3RoZWxwaWQgJiYgZGlhbG9nZXgyLT5nb3RoZWxwaWQpKSkKCQkJZGlmZmVyZW50ID0gMTsKCW5hbWVpZCA9IHN0cmR1cChnZXRfbmFtZWlkX3N0cihkaWFsb2dleDEtPm1lbnUpKTsKCWlmKCFkaWZmZXJlbnQgJiYgc3RyY21wKG5hbWVpZCwgZ2V0X25hbWVpZF9zdHIoZGlhbG9nZXgyLT5tZW51KSkpCgkJZGlmZmVyZW50ID0gMTsKCWZyZWUobmFtZWlkKTsKCW5hbWVpZCA9IHN0cmR1cChnZXRfbmFtZWlkX3N0cihkaWFsb2dleDEtPmRsZ2NsYXNzKSk7CglpZighZGlmZmVyZW50ICYmIHN0cmNtcChuYW1laWQsIGdldF9uYW1laWRfc3RyKGRpYWxvZ2V4Mi0+ZGxnY2xhc3MpKSkKCQlkaWZmZXJlbnQgPSAxOwoJZnJlZShuYW1laWQpOwoJaWYoIWRpZmZlcmVudCkKCQlkaWZmZXJlbnQgPSBjb21wYXJlX2NvbnRyb2woZGlhbG9nZXgxLT5jb250cm9scywgZGlhbG9nZXgyLT5jb250cm9scyk7CglyZXR1cm4gZGlmZmVyZW50Owp9CgpzdGF0aWMgaW50IGNvbXBhcmVfZm9udChmb250X3QgKmZvbnQxLCBmb250X3QgKmZvbnQyKSB7CglpbnQgZGlmZmVyZW50ID0gMDsKCWlmKCFkaWZmZXJlbnQgJiYKCSAgICgoZm9udDEtPm1lbW9wdCAhPSBmb250Mi0+bWVtb3B0KSB8fAoJICAgKGZvbnQxLT5kYXRhLT5sdmMudmVyc2lvbiAhPSBmb250Mi0+ZGF0YS0+bHZjLnZlcnNpb24pIHx8CgkgICAoZm9udDEtPmRhdGEtPmx2Yy5jaGFyYWN0cyAhPSBmb250Mi0+ZGF0YS0+bHZjLmNoYXJhY3RzKSkpCgkJZGlmZmVyZW50ID0gMTsKCXJldHVybiBkaWZmZXJlbnQ7Cn0KCnN0YXRpYyBpbnQgY29tcGFyZV9mb250ZGlyKGZvbnRkaXJfdCAqZm9udGRpcjEsIGZvbnRkaXJfdCAqZm9udGRpcjIpIHsKCWludCBkaWZmZXJlbnQgPSAwOwoJaWYoIWRpZmZlcmVudCAmJgoJICAgKChmb250ZGlyMS0+bWVtb3B0ICE9IGZvbnRkaXIyLT5tZW1vcHQpIHx8CgkgICAoZm9udGRpcjEtPmRhdGEtPmx2Yy52ZXJzaW9uICE9IGZvbnRkaXIyLT5kYXRhLT5sdmMudmVyc2lvbikgfHwKCSAgIChmb250ZGlyMS0+ZGF0YS0+bHZjLmNoYXJhY3RzICE9IGZvbnRkaXIyLT5kYXRhLT5sdmMuY2hhcmFjdHMpKSkKCQlkaWZmZXJlbnQgPSAxOwoJcmV0dXJuIGRpZmZlcmVudDsKfQoKc3RhdGljIGludCBjb21wYXJlX2ljb24oaWNvbl90ICppY29uMSwgaWNvbl90ICppY29uMikgewoJaW50IGRpZmZlcmVudCA9IDA7CglpZighZGlmZmVyZW50ICYmCgkgICAoKGljb24xLT5pZCAhPSBpY29uMi0+aWQpIHx8CgkgICAoaWNvbjEtPndpZHRoICE9IGljb24yLT53aWR0aCkgfHwKCSAgIChpY29uMS0+aGVpZ2h0ICE9IGljb24yLT5oZWlnaHQpKSkKCQlkaWZmZXJlbnQgPSAxOwoJaWYoIWRpZmZlcmVudCAmJgoJICAgKChpY29uMS0+bHZjLnZlcnNpb24gIT0gaWNvbjItPmx2Yy52ZXJzaW9uKSB8fAoJICAgKGljb24xLT5sdmMuY2hhcmFjdHMgIT0gaWNvbjItPmx2Yy5jaGFyYWN0cykpKQoJCWRpZmZlcmVudCA9IDE7CglyZXR1cm4gZGlmZmVyZW50Owp9CgpzdGF0aWMgaW50IGNvbXBhcmVfaWNvbl9ncm91cChpY29uX2dyb3VwX3QgKmljb25fZ3JvdXAxLCBpY29uX2dyb3VwX3QgKmljb25fZ3JvdXAyKSB7CglpbnQgZGlmZmVyZW50ID0gMDsKCWljb25fdCAqaWNvbjEgPSBOVUxMLCAqaWNvbjIgPSBOVUxMOwoJaWYoIWRpZmZlcmVudCAmJgoJICAgKChpY29uX2dyb3VwMS0+bWVtb3B0ICE9IGljb25fZ3JvdXAyLT5tZW1vcHQpIHx8CgkgICAoaWNvbl9ncm91cDEtPmx2Yy52ZXJzaW9uICE9IGljb25fZ3JvdXAyLT5sdmMudmVyc2lvbikgfHwKCSAgIChpY29uX2dyb3VwMS0+bHZjLmNoYXJhY3RzICE9IGljb25fZ3JvdXAyLT5sdmMuY2hhcmFjdHMpKSkKCQlkaWZmZXJlbnQgPSAxOwoJaWYoIWRpZmZlcmVudCAmJgoJICAgKGljb25fZ3JvdXAxLT5uaWNvbiAhPSBpY29uX2dyb3VwMi0+bmljb24pKQoJCWRpZmZlcmVudCA9IDE7CglpZighZGlmZmVyZW50KSB7CgkJaWNvbjEgPSBpY29uX2dyb3VwMS0+aWNvbmxpc3Q7CgkJaWNvbjIgPSBpY29uX2dyb3VwMi0+aWNvbmxpc3Q7CgkJd2hpbGUoIWRpZmZlcmVudCAmJiBpY29uMSAmJiBpY29uMikgewoJCQlkaWZmZXJlbnQgPSBjb21wYXJlX2ljb24oaWNvbjEsIGljb24yKTsKCQkJaWNvbjEgPSBpY29uMS0+bmV4dDsKCQkJaWNvbjIgPSBpY29uMi0+bmV4dDsKCQl9CgkJaWYoIWRpZmZlcmVudCAmJgoJCSAgICgoaWNvbjEgJiYgIWljb24yKSB8fAoJCSAgICghaWNvbjEgJiYgaWNvbjIpKSkKCQkJZGlmZmVyZW50ID0gMTsKCX0KCXJldHVybiBkaWZmZXJlbnQ7Cn0KCnN0YXRpYyBpbnQgY29tcGFyZV9tZW51X2l0ZW0obWVudV9pdGVtX3QgKm1lbnVfaXRlbTEsIG1lbnVfaXRlbV90ICptZW51X2l0ZW0yKSB7CglpbnQgZGlmZmVyZW50ID0gMDsKCXdoaWxlKCFkaWZmZXJlbnQgJiYgbWVudV9pdGVtMSAmJiBtZW51X2l0ZW0yKSB7CgkJaWYobWVudV9pdGVtMS0+cG9wdXAgJiYgbWVudV9pdGVtMi0+cG9wdXApCgkJCWRpZmZlcmVudCA9IGNvbXBhcmVfbWVudV9pdGVtKG1lbnVfaXRlbTEtPnBvcHVwLCBtZW51X2l0ZW0yLT5wb3B1cCk7CgkJZWxzZSBpZighbWVudV9pdGVtMS0+cG9wdXAgJiYgIW1lbnVfaXRlbTItPnBvcHVwKSB7CgkJCWlmKG1lbnVfaXRlbTEtPm5hbWUgJiYgbWVudV9pdGVtMi0+bmFtZSkgewoJCQkJaWYoKG1lbnVfaXRlbTEtPmlkICE9IG1lbnVfaXRlbTItPmlkKSB8fAoJCQkJICAgKG1lbnVfaXRlbTEtPnN0YXRlICE9IG1lbnVfaXRlbTItPnN0YXRlKSkKCQkJCQlkaWZmZXJlbnQgPSAxOwoJCQl9IGVsc2UgaWYoKG1lbnVfaXRlbTEtPm5hbWUgJiYgIW1lbnVfaXRlbTItPm5hbWUpIHx8CgkJCQkgICghbWVudV9pdGVtMS0+bmFtZSAmJiBtZW51X2l0ZW0yLT5uYW1lKSkKCQkJCQlkaWZmZXJlbnQgPSAxOwoJCX0gZWxzZQoJCQlkaWZmZXJlbnQgPSAxOwoJCW1lbnVfaXRlbTEgPSBtZW51X2l0ZW0xLT5uZXh0OwoJCW1lbnVfaXRlbTIgPSBtZW51X2l0ZW0yLT5uZXh0OwoJfQoJaWYoIWRpZmZlcmVudCAmJgoJICAgKChtZW51X2l0ZW0xICYmICFtZW51X2l0ZW0yKSB8fAoJICAgKCFtZW51X2l0ZW0xICYmIG1lbnVfaXRlbTIpKSkKCQlkaWZmZXJlbnQgPSAxOwoJcmV0dXJuIGRpZmZlcmVudDsKfQoKc3RhdGljIGludCBjb21wYXJlX21lbnUobWVudV90ICptZW51MSwgbWVudV90ICptZW51MikgewoJaW50IGRpZmZlcmVudCA9IDA7CglpZighZGlmZmVyZW50ICYmCgkgICAoKG1lbnUxLT5tZW1vcHQgIT0gbWVudTItPm1lbW9wdCkgfHwKCSAgIChtZW51MS0+bHZjLnZlcnNpb24gIT0gbWVudTItPmx2Yy52ZXJzaW9uKSB8fAoJICAgKG1lbnUxLT5sdmMuY2hhcmFjdHMgIT0gbWVudTItPmx2Yy5jaGFyYWN0cykpKQoJCWRpZmZlcmVudCA9IDE7CglpZighZGlmZmVyZW50KQoJCWRpZmZlcmVudCA9IGNvbXBhcmVfbWVudV9pdGVtKG1lbnUxLT5pdGVtcywgbWVudTItPml0ZW1zKTsKCXJldHVybiBkaWZmZXJlbnQ7Cn0KCnN0YXRpYyBpbnQgY29tcGFyZV9tZW51ZXhfaXRlbShtZW51ZXhfaXRlbV90ICptZW51ZXhfaXRlbTEsIG1lbnVleF9pdGVtX3QgKm1lbnVleF9pdGVtMikgewoJaW50IGRpZmZlcmVudCA9IDA7Cgl3aGlsZSghZGlmZmVyZW50ICYmIG1lbnVleF9pdGVtMSAmJiBtZW51ZXhfaXRlbTIpIHsKCQlpZihtZW51ZXhfaXRlbTEtPnBvcHVwICYmIG1lbnVleF9pdGVtMi0+cG9wdXApIHsKCQkJaWYoIWRpZmZlcmVudCAmJiBtZW51ZXhfaXRlbTEtPmdvdGlkICYmIG1lbnVleF9pdGVtMi0+Z290aWQpIHsKCQkJCWlmKG1lbnVleF9pdGVtMS0+aWQgIT0gbWVudWV4X2l0ZW0yLT5pZCkKCQkJCQlkaWZmZXJlbnQgPSAxOwoJCQl9IGVsc2UgaWYoIWRpZmZlcmVudCAmJgoJCQkJICAoKG1lbnVleF9pdGVtMS0+Z290aWQgJiYgIW1lbnVleF9pdGVtMi0+Z290aWQpIHx8CgkJCQkgICghbWVudWV4X2l0ZW0yLT5nb3RpZCAmJiBtZW51ZXhfaXRlbTItPmdvdGlkKSkpCgkJCQkJZGlmZmVyZW50ID0gMTsKCQkJaWYoIWRpZmZlcmVudCAmJiBtZW51ZXhfaXRlbTEtPmdvdHR5cGUgJiYgbWVudWV4X2l0ZW0yLT5nb3R0eXBlKSB7CgkJCQlpZihtZW51ZXhfaXRlbTEtPnR5cGUgIT0gbWVudWV4X2l0ZW0yLT50eXBlKQoJCQkJCWRpZmZlcmVudCA9IDE7CgkJCX0gZWxzZSBpZighZGlmZmVyZW50ICYmCgkJCQkgICgobWVudWV4X2l0ZW0xLT5nb3R0eXBlICYmICFtZW51ZXhfaXRlbTItPmdvdHR5cGUpIHx8CgkJCQkgICghbWVudWV4X2l0ZW0yLT5nb3R0eXBlICYmIG1lbnVleF9pdGVtMi0+Z290dHlwZSkpKQoJCQkJCWRpZmZlcmVudCA9IDE7CgkJCWlmKCFkaWZmZXJlbnQgJiYgbWVudWV4X2l0ZW0xLT5nb3RzdGF0ZSAmJiBtZW51ZXhfaXRlbTItPmdvdHN0YXRlKSB7CgkJCQlpZihtZW51ZXhfaXRlbTEtPnN0YXRlICE9IG1lbnVleF9pdGVtMi0+c3RhdGUpCgkJCQkJZGlmZmVyZW50ID0gMTsKCQkJfSBlbHNlIGlmKCFkaWZmZXJlbnQgJiYKCQkJCSAgKChtZW51ZXhfaXRlbTEtPmdvdHN0YXRlICYmICFtZW51ZXhfaXRlbTItPmdvdHN0YXRlKSB8fAoJCQkJICAoIW1lbnVleF9pdGVtMi0+Z290c3RhdGUgJiYgbWVudWV4X2l0ZW0yLT5nb3RzdGF0ZSkpKQoJCQkJCWRpZmZlcmVudCA9IDE7CgkJCWlmKCFkaWZmZXJlbnQgJiYgbWVudWV4X2l0ZW0xLT5nb3RoZWxwaWQgJiYgbWVudWV4X2l0ZW0yLT5nb3RoZWxwaWQpIHsKCQkJCWlmKG1lbnVleF9pdGVtMS0+aGVscGlkICE9IG1lbnVleF9pdGVtMi0+aGVscGlkKQoJCQkJCWRpZmZlcmVudCA9IDE7CgkJCX0gZWxzZSBpZighZGlmZmVyZW50ICYmCgkJCQkgICgobWVudWV4X2l0ZW0xLT5nb3RoZWxwaWQgJiYgIW1lbnVleF9pdGVtMi0+Z290aGVscGlkKSB8fAoJCQkJICAoIW1lbnVleF9pdGVtMi0+Z290aGVscGlkICYmIG1lbnVleF9pdGVtMi0+Z290aGVscGlkKSkpCgkJCQkJZGlmZmVyZW50ID0gMTsKCQkJaWYoIWRpZmZlcmVudCkKCQkJCWRpZmZlcmVudCA9IGNvbXBhcmVfbWVudWV4X2l0ZW0obWVudWV4X2l0ZW0xLT5wb3B1cCwgbWVudWV4X2l0ZW0yLT5wb3B1cCk7CgkJfSBlbHNlIGlmKCFtZW51ZXhfaXRlbTEtPnBvcHVwICYmICFtZW51ZXhfaXRlbTItPnBvcHVwKSB7CgkJCWlmKG1lbnVleF9pdGVtMS0+bmFtZSAmJiBtZW51ZXhfaXRlbTItPm5hbWUpIHsKCQkJCWlmKCFkaWZmZXJlbnQgJiYgbWVudWV4X2l0ZW0xLT5nb3RpZCAmJiBtZW51ZXhfaXRlbTItPmdvdGlkKSB7CgkJCQkJaWYobWVudWV4X2l0ZW0xLT5pZCAhPSBtZW51ZXhfaXRlbTItPmlkKQoJCQkJCQlkaWZmZXJlbnQgPSAxOwoJCQkJfSBlbHNlIGlmKCFkaWZmZXJlbnQgJiYKCQkJCQkgICgobWVudWV4X2l0ZW0xLT5nb3RpZCAmJiAhbWVudWV4X2l0ZW0yLT5nb3RpZCkgfHwKCQkJCQkgICghbWVudWV4X2l0ZW0yLT5nb3RpZCAmJiBtZW51ZXhfaXRlbTItPmdvdGlkKSkpCgkJCQkJCWRpZmZlcmVudCA9IDE7CgkJCQlpZighZGlmZmVyZW50ICYmIG1lbnVleF9pdGVtMS0+Z290dHlwZSAmJiBtZW51ZXhfaXRlbTItPmdvdHR5cGUpIHsKCQkJCQlpZihtZW51ZXhfaXRlbTEtPnR5cGUgIT0gbWVudWV4X2l0ZW0yLT50eXBlKQoJCQkJCQlkaWZmZXJlbnQgPSAxOwoJCQkJfSBlbHNlIGlmKCFkaWZmZXJlbnQgJiYKCQkJCQkgICgobWVudWV4X2l0ZW0xLT5nb3R0eXBlICYmICFtZW51ZXhfaXRlbTItPmdvdHR5cGUpIHx8CgkJCQkJICAoIW1lbnVleF9pdGVtMi0+Z290dHlwZSAmJiBtZW51ZXhfaXRlbTItPmdvdHR5cGUpKSkKCQkJCQkJZGlmZmVyZW50ID0gMTsKCQkJCWlmKCFkaWZmZXJlbnQgJiYgbWVudWV4X2l0ZW0xLT5nb3RzdGF0ZSAmJiBtZW51ZXhfaXRlbTItPmdvdHN0YXRlKSB7CgkJCQkJaWYobWVudWV4X2l0ZW0xLT5zdGF0ZSAhPSBtZW51ZXhfaXRlbTItPnN0YXRlKQoJCQkJCQlkaWZmZXJlbnQgPSAxOwoJCQkJfSBlbHNlIGlmKCFkaWZmZXJlbnQgJiYKCQkJCQkgICgobWVudWV4X2l0ZW0xLT5nb3RzdGF0ZSAmJiAhbWVudWV4X2l0ZW0yLT5nb3RzdGF0ZSkgfHwKCQkJCQkgICghbWVudWV4X2l0ZW0yLT5nb3RzdGF0ZSAmJiBtZW51ZXhfaXRlbTItPmdvdHN0YXRlKSkpCgkJCQkJCWRpZmZlcmVudCA9IDE7CgkJCQlpZighZGlmZmVyZW50ICYmIG1lbnVleF9pdGVtMS0+Z290aGVscGlkICYmIG1lbnVleF9pdGVtMi0+Z290aGVscGlkKSB7CgkJCQkJaWYobWVudWV4X2l0ZW0xLT5oZWxwaWQgIT0gbWVudWV4X2l0ZW0yLT5oZWxwaWQpCgkJCQkJCWRpZmZlcmVudCA9IDE7CgkJCQl9IGVsc2UgaWYoIWRpZmZlcmVudCAmJgoJCQkJCSAgKChtZW51ZXhfaXRlbTEtPmdvdGhlbHBpZCAmJiAhbWVudWV4X2l0ZW0yLT5nb3RoZWxwaWQpIHx8CgkJCQkJICAoIW1lbnVleF9pdGVtMi0+Z290aGVscGlkICYmIG1lbnVleF9pdGVtMi0+Z290aGVscGlkKSkpCgkJCQkJCWRpZmZlcmVudCA9IDE7CgkJCX0gZWxzZSBpZigobWVudWV4X2l0ZW0xLT5uYW1lICYmICFtZW51ZXhfaXRlbTItPm5hbWUpIHx8CgkJCQkgICghbWVudWV4X2l0ZW0xLT5uYW1lICYmIG1lbnVleF9pdGVtMi0+bmFtZSkpCgkJCQkJZGlmZmVyZW50ID0gMTsKCQl9IGVsc2UKCQkJZGlmZmVyZW50ID0gMTsKCQltZW51ZXhfaXRlbTEgPSBtZW51ZXhfaXRlbTEtPm5leHQ7CgkJbWVudWV4X2l0ZW0yID0gbWVudWV4X2l0ZW0yLT5uZXh0OwoJfQoJaWYoIWRpZmZlcmVudCAmJgoJICAgKChtZW51ZXhfaXRlbTEgJiYgIW1lbnVleF9pdGVtMikgfHwKCSAgICghbWVudWV4X2l0ZW0xICYmIG1lbnVleF9pdGVtMikpKQoJCWRpZmZlcmVudCA9IDE7CglyZXR1cm4gZGlmZmVyZW50Owp9CgpzdGF0aWMgaW50IGNvbXBhcmVfbWVudWV4KG1lbnVleF90ICptZW51ZXgxLCBtZW51ZXhfdCAqbWVudWV4MikgewoJaW50IGRpZmZlcmVudCA9IDA7CglpZighZGlmZmVyZW50ICYmCgkgICAoKG1lbnVleDEtPm1lbW9wdCAhPSBtZW51ZXgyLT5tZW1vcHQpIHx8CgkgICAobWVudWV4MS0+bHZjLnZlcnNpb24gIT0gbWVudWV4Mi0+bHZjLnZlcnNpb24pIHx8CgkgICAobWVudWV4MS0+bHZjLmNoYXJhY3RzICE9IG1lbnVleDItPmx2Yy5jaGFyYWN0cykpKQoJCWRpZmZlcmVudCA9IDE7CglpZighZGlmZmVyZW50KQoJCWRpZmZlcmVudCA9IGNvbXBhcmVfbWVudWV4X2l0ZW0obWVudWV4MS0+aXRlbXMsIG1lbnVleDItPml0ZW1zKTsKCXJldHVybiBkaWZmZXJlbnQ7Cn0KCnN0YXRpYyBpbnQgY29tcGFyZV9yY2RhdGEocmNkYXRhX3QgKnJjZGF0YTEsIHJjZGF0YV90ICpyY2RhdGEyKSB7CglpbnQgZGlmZmVyZW50ID0gMDsKCWlmKCFkaWZmZXJlbnQgJiYKCSAgICgocmNkYXRhMS0+bWVtb3B0ICE9IHJjZGF0YTItPm1lbW9wdCkgfHwKCSAgIChyY2RhdGExLT5kYXRhLT5sdmMudmVyc2lvbiAhPSByY2RhdGEyLT5kYXRhLT5sdmMudmVyc2lvbikgfHwKCSAgIChyY2RhdGExLT5kYXRhLT5sdmMuY2hhcmFjdHMgIT0gcmNkYXRhMi0+ZGF0YS0+bHZjLmNoYXJhY3RzKSkpCgkJZGlmZmVyZW50ID0gMTsKCXJldHVybiBkaWZmZXJlbnQ7Cn0KCnN0YXRpYyBpbnQgY29tcGFyZV9zdHJpbmd0YWJsZShzdHJpbmd0YWJsZV90ICpzdHJpbmd0YWJsZTEsIHN0cmluZ3RhYmxlX3QgKnN0cmluZ3RhYmxlMikgewoJaW50IGRpZmZlcmVudCA9IDA7CglpbnQgaTsKCXdoaWxlKCFkaWZmZXJlbnQgJiYgc3RyaW5ndGFibGUxICYmIHN0cmluZ3RhYmxlMikgewoJCWlmKChzdHJpbmd0YWJsZTEtPm1lbW9wdCAhPSBzdHJpbmd0YWJsZTItPm1lbW9wdCkgfHwKCQkgICAoc3RyaW5ndGFibGUxLT5sdmMudmVyc2lvbiAhPSBzdHJpbmd0YWJsZTItPmx2Yy52ZXJzaW9uKSB8fAoJCSAgIChzdHJpbmd0YWJsZTEtPmx2Yy5jaGFyYWN0cyAhPSBzdHJpbmd0YWJsZTItPmx2Yy5jaGFyYWN0cykpCgkJCWRpZmZlcmVudCA9IDE7CgkJaWYoIWRpZmZlcmVudCkgewoJCQlpZigoc3RyaW5ndGFibGUxLT5uZW50cmllcyAhPSBzdHJpbmd0YWJsZTItPm5lbnRyaWVzKSB8fAoJCQkgICAoc3RyaW5ndGFibGUxLT5pZGJhc2UgIT0gc3RyaW5ndGFibGUyLT5pZGJhc2UpKQoJCQkJZGlmZmVyZW50ID0gMTsKCQkJZWxzZQoJCQkJZm9yKGkgPSAwIDsgaSA8IHN0cmluZ3RhYmxlMS0+bmVudHJpZXM7IGkrKykKCQkJCQlpZigoc3RyaW5ndGFibGUxLT5lbnRyaWVzW2ldLmlkICE9IHN0cmluZ3RhYmxlMi0+ZW50cmllc1tpXS5pZCkgfHwKCQkJCQkgICAoc3RyaW5ndGFibGUxLT5lbnRyaWVzW2ldLm1lbW9wdCAhPSBzdHJpbmd0YWJsZTItPmVudHJpZXNbaV0ubWVtb3B0KSB8fAoJCQkJCSAgIChzdHJpbmd0YWJsZTEtPmVudHJpZXNbaV0uc3RyICYmICFzdHJpbmd0YWJsZTItPmVudHJpZXNbaV0uc3RyKSB8fAoJCQkJCSAgICghc3RyaW5ndGFibGUxLT5lbnRyaWVzW2ldLnN0ciAmJiBzdHJpbmd0YWJsZTItPmVudHJpZXNbaV0uc3RyKSkgewoJCQkJCQlkaWZmZXJlbnQgPSAxOwoJCQkJCQlicmVhazsKCQkJCQl9CgkJfQoJCXN0cmluZ3RhYmxlMSA9IHN0cmluZ3RhYmxlMS0+bmV4dDsKCQlzdHJpbmd0YWJsZTIgPSBzdHJpbmd0YWJsZTItPm5leHQ7Cgl9CglyZXR1cm4gZGlmZmVyZW50Owp9CgpzdGF0aWMgaW50IGNvbXBhcmVfdXNlcih1c2VyX3QgKnVzZXIxLCB1c2VyX3QgKnVzZXIyKSB7CglpbnQgZGlmZmVyZW50ID0gMDsKCWNoYXIgKm5hbWVpZCA9IE5VTEw7CglpZighZGlmZmVyZW50ICYmCgkgICAoKHVzZXIxLT5tZW1vcHQgIT0gdXNlcjItPm1lbW9wdCkgfHwKCSAgICh1c2VyMS0+ZGF0YS0+bHZjLnZlcnNpb24gIT0gdXNlcjItPmRhdGEtPmx2Yy52ZXJzaW9uKSB8fAoJICAgKHVzZXIxLT5kYXRhLT5sdmMuY2hhcmFjdHMgIT0gdXNlcjItPmRhdGEtPmx2Yy5jaGFyYWN0cykpKQoJCWRpZmZlcmVudCA9IDE7CgluYW1laWQgPSBzdHJkdXAoZ2V0X25hbWVpZF9zdHIodXNlcjEtPnR5cGUpKTsKCWlmKCFkaWZmZXJlbnQgJiYgc3RyY21wKG5hbWVpZCwgZ2V0X25hbWVpZF9zdHIodXNlcjItPnR5cGUpKSkKCQlkaWZmZXJlbnQgPSAxOwoJZnJlZShuYW1laWQpOwoJcmV0dXJuIGRpZmZlcmVudDsKfQoKc3RhdGljIGludCBjb21wYXJlX21lc3NhZ2V0YWJsZShtZXNzYWdldGFibGVfdCAqbWVzc2FnZXRhYmxlMSwgbWVzc2FnZXRhYmxlX3QgKm1lc3NhZ2V0YWJsZTIpIHsKCWludCBkaWZmZXJlbnQgPSAwOwoJaWYoIWRpZmZlcmVudCAmJgoJICAgKChtZXNzYWdldGFibGUxLT5tZW1vcHQgIT0gbWVzc2FnZXRhYmxlMi0+bWVtb3B0KSB8fAoJICAgKG1lc3NhZ2V0YWJsZTEtPmRhdGEtPmx2Yy52ZXJzaW9uICE9IG1lc3NhZ2V0YWJsZTItPmRhdGEtPmx2Yy52ZXJzaW9uKSB8fAoJICAgKG1lc3NhZ2V0YWJsZTEtPmRhdGEtPmx2Yy5jaGFyYWN0cyAhPSBtZXNzYWdldGFibGUyLT5kYXRhLT5sdmMuY2hhcmFjdHMpKSkKCQlkaWZmZXJlbnQgPSAxOwoJcmV0dXJuIGRpZmZlcmVudDsKfQoKc3RhdGljIGludCBjb21wYXJlX3N0cmluZyhzdHJpbmdfdCAqc3RyaW5nMSwgc3RyaW5nX3QgKnN0cmluZzIpIHsKCWludCBkaWZmZXJlbnQgPSAwOwoJaWYoIWRpZmZlcmVudCAmJgoJICAgKChzdHJpbmcxLT5zaXplICE9IHN0cmluZzItPnNpemUpIHx8CgkgICAoc3RyaW5nMS0+dHlwZSAhPSBzdHJpbmcyLT50eXBlKSkpCgkJZGlmZmVyZW50ID0gMTsKCWlmKCFkaWZmZXJlbnQpIHsKCQlpZihzdHJpbmcxLT50eXBlID09IHN0cl9jaGFyKQoJCQlkaWZmZXJlbnQgPSBtZW1jbXAoc3RyaW5nMS0+c3RyLmNzdHIsIHN0cmluZzItPnN0ci5jc3RyLCBzdHJpbmcxLT5zaXplKTsKCQllbHNlIGlmKHN0cmluZzEtPnR5cGUgPT0gc3RyX3VuaWNvZGUpCgkJCWRpZmZlcmVudCA9IG1lbWNtcChzdHJpbmcxLT5zdHIud3N0ciwgc3RyaW5nMi0+c3RyLndzdHIsIHN0cmluZzEtPnNpemUqc2l6ZW9mKFdDSEFSKSk7CgkJZWxzZQoJCQlkaWZmZXJlbnQgPSAxOwoJfQoJcmV0dXJuIGRpZmZlcmVudDsKfQoKc3RhdGljIGludCBjb21wYXJlX3Zlcl9ibG9jayh2ZXJfYmxvY2tfdCAqdmVyX2Jsb2NrMSwgdmVyX2Jsb2NrX3QgKnZlcl9ibG9jazIpOwoKc3RhdGljIGludCBjb21wYXJlX3Zlcl92YWx1ZSh2ZXJfdmFsdWVfdCAqdmVyX3ZhbHVlMSwgdmVyX3ZhbHVlX3QgKnZlcl92YWx1ZTIpIHsKCWludCBkaWZmZXJlbnQgPSAwOwoJaW50IGkgPSAwOwoJaWYoIWRpZmZlcmVudCAmJgoJICAgKHZlcl92YWx1ZTEtPnR5cGUgPT0gdmVyX3ZhbHVlMi0+dHlwZSkpIHsKCQlzd2l0Y2godmVyX3ZhbHVlMS0+dHlwZSkgewoJCQljYXNlIHZhbF9zdHI6CgkJCQlpZighZGlmZmVyZW50ICYmIHZlcl92YWx1ZTEtPmtleSAmJiB2ZXJfdmFsdWUyLT5rZXkpCgkJCQkJZGlmZmVyZW50ID0gY29tcGFyZV9zdHJpbmcodmVyX3ZhbHVlMS0+a2V5LCB2ZXJfdmFsdWUyLT5rZXkpOwoJCQkJZWxzZSBpZighZGlmZmVyZW50ICYmCgkJCQkJKCh2ZXJfdmFsdWUxLT5rZXkgJiYgIXZlcl92YWx1ZTItPmtleSkgfHwKCQkJCQkoIXZlcl92YWx1ZTEtPmtleSAmJiB2ZXJfdmFsdWUyLT5rZXkpKSkKCQkJCQkJZGlmZmVyZW50ID0gMTsKCQkJCWJyZWFrOwoJCQljYXNlIHZhbF93b3JkczoKCQkJCWlmKCFkaWZmZXJlbnQgJiYgdmVyX3ZhbHVlMS0+a2V5ICYmIHZlcl92YWx1ZTItPmtleSkKCQkJCQlkaWZmZXJlbnQgPSBjb21wYXJlX3N0cmluZyh2ZXJfdmFsdWUxLT5rZXksIHZlcl92YWx1ZTItPmtleSk7CgkJCQllbHNlIGlmKCFkaWZmZXJlbnQgJiYKCQkJCQkoKHZlcl92YWx1ZTEtPmtleSAmJiAhdmVyX3ZhbHVlMi0+a2V5KSB8fAoJCQkJCSghdmVyX3ZhbHVlMS0+a2V5ICYmIHZlcl92YWx1ZTItPmtleSkpKQoJCQkJCQlkaWZmZXJlbnQgPSAxOwoJCQkJaWYoIWRpZmZlcmVudCAmJiB2ZXJfdmFsdWUxLT52YWx1ZS53b3JkcyAmJiB2ZXJfdmFsdWUyLT52YWx1ZS53b3JkcykgewoJCQkJCWlmKCFkaWZmZXJlbnQgJiYKCQkJCQkgICAodmVyX3ZhbHVlMS0+dmFsdWUud29yZHMtPm53b3JkcyAhPSB2ZXJfdmFsdWUyLT52YWx1ZS53b3Jkcy0+bndvcmRzKSkKCQkJCQkJZGlmZmVyZW50ID0gMTsKCQkJCQlpZighZGlmZmVyZW50KQoJCQkJCQlmb3IoaSA9IDA7IGkgPCB2ZXJfdmFsdWUxLT52YWx1ZS53b3Jkcy0+bndvcmRzOyBpKyspIHsKCQkJCQkJCWlmKHZlcl92YWx1ZTEtPnZhbHVlLndvcmRzLT53b3Jkc1tpXSAhPSB2ZXJfdmFsdWUyLT52YWx1ZS53b3Jkcy0+d29yZHNbaV0pIHsKCQkJCQkJCQlkaWZmZXJlbnQgPSAxOwoJCQkJCQkJCWJyZWFrOwoJCQkJCQkJfQoJCQkJCQl9CgkJCQl9IGVsc2UgaWYoIWRpZmZlcmVudCAmJgoJCQkJCSAgKCh2ZXJfdmFsdWUxLT52YWx1ZS53b3JkcyAmJiAhdmVyX3ZhbHVlMi0+dmFsdWUud29yZHMpIHx8CgkJCQkJICAoIXZlcl92YWx1ZTEtPnZhbHVlLndvcmRzICYmIHZlcl92YWx1ZTItPnZhbHVlLndvcmRzKSkpCgkJCQkJCWRpZmZlcmVudCA9IDE7CgkJCQlicmVhazsKCQkJY2FzZSB2YWxfYmxvY2s6CgkJCQlpZighZGlmZmVyZW50ICYmIHZlcl92YWx1ZTEtPnZhbHVlLmJsb2NrICYmIHZlcl92YWx1ZTItPnZhbHVlLmJsb2NrKQoJCQkJCWRpZmZlcmVudCA9IGNvbXBhcmVfdmVyX2Jsb2NrKHZlcl92YWx1ZTEtPnZhbHVlLmJsb2NrLCB2ZXJfdmFsdWUyLT52YWx1ZS5ibG9jayk7CgkJCQllbHNlIGlmKCFkaWZmZXJlbnQgJiYKCQkJCQkoKHZlcl92YWx1ZTEtPnZhbHVlLmJsb2NrICYmICF2ZXJfdmFsdWUyLT52YWx1ZS5ibG9jaykgfHwKCQkJCQkoIXZlcl92YWx1ZTEtPnZhbHVlLmJsb2NrICYmIHZlcl92YWx1ZTItPnZhbHVlLmJsb2NrKSkpCgkJCQkJCWRpZmZlcmVudCA9IDE7CgkJCQlicmVhazsKCQkJZGVmYXVsdDoKCQkJCWRpZmZlcmVudCA9IDE7CgkJfQoJfSBlbHNlCgkJZGlmZmVyZW50ID0gMTsKCXJldHVybiBkaWZmZXJlbnQ7Cn0KCnN0YXRpYyBpbnQgY29tcGFyZV92ZXJfYmxvY2sodmVyX2Jsb2NrX3QgKnZlcl9ibG9jazEsIHZlcl9ibG9ja190ICp2ZXJfYmxvY2syKSB7CglpbnQgZGlmZmVyZW50ID0gMDsKCXZlcl92YWx1ZV90ICp2ZXJfdmFsdWUxID0gTlVMTCwgKnZlcl92YWx1ZTIgPSBOVUxMOwoJaWYoIWRpZmZlcmVudCkgewoJCXZlcl92YWx1ZTEgPSB2ZXJfYmxvY2sxLT52YWx1ZXM7CgkJdmVyX3ZhbHVlMiA9IHZlcl9ibG9jazItPnZhbHVlczsKCQl3aGlsZSghZGlmZmVyZW50ICYmIHZlcl92YWx1ZTEgJiYgdmVyX3ZhbHVlMikgewoJCQlkaWZmZXJlbnQgPSBjb21wYXJlX3Zlcl92YWx1ZSh2ZXJfdmFsdWUxLCB2ZXJfdmFsdWUyKTsKCQkJdmVyX3ZhbHVlMSA9IHZlcl92YWx1ZTEtPm5leHQ7CgkJCXZlcl92YWx1ZTIgPSB2ZXJfdmFsdWUyLT5uZXh0OwoJCX0KCQlpZighZGlmZmVyZW50ICYmCgkJICAgKCh2ZXJfdmFsdWUxICYmICF2ZXJfdmFsdWUyKSB8fAoJCSAgICghdmVyX3ZhbHVlMSAmJiB2ZXJfdmFsdWUyKSkpCgkJCWRpZmZlcmVudCA9IDE7Cgl9CglyZXR1cm4gZGlmZmVyZW50Owp9CgpzdGF0aWMgaW50IGNvbXBhcmVfdmVyc2lvbmluZm8odmVyc2lvbmluZm9fdCAqdmVyc2lvbmluZm8xLCB2ZXJzaW9uaW5mb190ICp2ZXJzaW9uaW5mbzIpIHsKCWludCBkaWZmZXJlbnQgPSAwOwoJdmVyX2Jsb2NrX3QgKnZlcl9ibG9jazEgPSBOVUxMLCAqdmVyX2Jsb2NrMiA9IE5VTEw7CglpZighZGlmZmVyZW50ICYmCgkgICAoKHZlcnNpb25pbmZvMS0+bWVtb3B0ICE9IHZlcnNpb25pbmZvMi0+bWVtb3B0KSB8fAoJICAgKHZlcnNpb25pbmZvMS0+bHZjLnZlcnNpb24gIT0gdmVyc2lvbmluZm8yLT5sdmMudmVyc2lvbikgfHwKCSAgICh2ZXJzaW9uaW5mbzEtPmx2Yy5jaGFyYWN0cyAhPSB2ZXJzaW9uaW5mbzItPmx2Yy5jaGFyYWN0cykpKQoJCWRpZmZlcmVudCA9IDE7CglpZighZGlmZmVyZW50ICYmIHZlcnNpb25pbmZvMS0+Z290aXQuZnYgJiYgdmVyc2lvbmluZm8yLT5nb3RpdC5mdikgewoJCWlmKCh2ZXJzaW9uaW5mbzEtPmZpbGV2ZXJfbWFqMSAhPSB2ZXJzaW9uaW5mbzItPmZpbGV2ZXJfbWFqMSkgfHwKCQkgICAodmVyc2lvbmluZm8xLT5maWxldmVyX21hajIgIT0gdmVyc2lvbmluZm8yLT5maWxldmVyX21hajIpIHx8CgkJICAgKHZlcnNpb25pbmZvMS0+ZmlsZXZlcl9taW4xICE9IHZlcnNpb25pbmZvMi0+ZmlsZXZlcl9taW4xKSB8fAoJCSAgICh2ZXJzaW9uaW5mbzEtPmZpbGV2ZXJfbWluMiAhPSB2ZXJzaW9uaW5mbzItPmZpbGV2ZXJfbWluMikpCgkJCWRpZmZlcmVudCA9IDE7Cgl9IGVsc2UgaWYoIWRpZmZlcmVudCAmJgoJCSAgKCh2ZXJzaW9uaW5mbzEtPmdvdGl0LmZ2ICYmICF2ZXJzaW9uaW5mbzItPmdvdGl0LmZ2KSB8fAoJCSAgKCF2ZXJzaW9uaW5mbzEtPmdvdGl0LmZ2ICYmIHZlcnNpb25pbmZvMi0+Z290aXQuZnYpKSkKCQkJZGlmZmVyZW50ID0gMTsKCWlmKCFkaWZmZXJlbnQgJiYgdmVyc2lvbmluZm8xLT5nb3RpdC5wdiAmJiB2ZXJzaW9uaW5mbzItPmdvdGl0LnB2KSB7CgkJaWYoKHZlcnNpb25pbmZvMS0+cHJvZHZlcl9tYWoxICE9IHZlcnNpb25pbmZvMi0+cHJvZHZlcl9tYWoxKSB8fAoJCSAgICh2ZXJzaW9uaW5mbzEtPnByb2R2ZXJfbWFqMiAhPSB2ZXJzaW9uaW5mbzItPnByb2R2ZXJfbWFqMikgfHwKCQkgICAodmVyc2lvbmluZm8xLT5wcm9kdmVyX21pbjEgIT0gdmVyc2lvbmluZm8yLT5wcm9kdmVyX21pbjEpIHx8CgkJICAgKHZlcnNpb25pbmZvMS0+cHJvZHZlcl9taW4yICE9IHZlcnNpb25pbmZvMi0+cHJvZHZlcl9taW4yKSkKCQkJZGlmZmVyZW50ID0gMTsKCX0gZWxzZSBpZighZGlmZmVyZW50ICYmCgkJICAoKHZlcnNpb25pbmZvMS0+Z290aXQucHYgJiYgIXZlcnNpb25pbmZvMi0+Z290aXQucHYpIHx8CgkJICAoIXZlcnNpb25pbmZvMS0+Z290aXQucHYgJiYgdmVyc2lvbmluZm8yLT5nb3RpdC5wdikpKQoJCQlkaWZmZXJlbnQgPSAxOwoJaWYoIWRpZmZlcmVudCAmJiB2ZXJzaW9uaW5mbzEtPmdvdGl0LmZvICYmIHZlcnNpb25pbmZvMi0+Z290aXQuZm8pIHsKCQlpZih2ZXJzaW9uaW5mbzEtPmZpbGVvcyAhPSB2ZXJzaW9uaW5mbzItPmZpbGVvcykKCQkJZGlmZmVyZW50ID0gMTsKCX0gZWxzZSBpZighZGlmZmVyZW50ICYmCgkJICAoKHZlcnNpb25pbmZvMS0+Z290aXQuZm8gJiYgIXZlcnNpb25pbmZvMi0+Z290aXQuZm8pIHx8CgkJICAoIXZlcnNpb25pbmZvMS0+Z290aXQuZm8gJiYgdmVyc2lvbmluZm8yLT5nb3RpdC5mbykpKQoJCQlkaWZmZXJlbnQgPSAxOwoJaWYoIWRpZmZlcmVudCAmJiB2ZXJzaW9uaW5mbzEtPmdvdGl0LmZmICYmIHZlcnNpb25pbmZvMi0+Z290aXQuZmYpIHsKCQlpZih2ZXJzaW9uaW5mbzEtPmZpbGVmbGFncyAhPSB2ZXJzaW9uaW5mbzItPmZpbGVmbGFncykKCQkJZGlmZmVyZW50ID0gMTsKCX0gZWxzZSBpZighZGlmZmVyZW50ICYmCgkJICAoKHZlcnNpb25pbmZvMS0+Z290aXQuZmYgJiYgIXZlcnNpb25pbmZvMi0+Z290aXQuZmYpIHx8CgkJICAoIXZlcnNpb25pbmZvMS0+Z290aXQuZmYgJiYgdmVyc2lvbmluZm8yLT5nb3RpdC5mZikpKQoJCQlkaWZmZXJlbnQgPSAxOwoJaWYoIWRpZmZlcmVudCAmJiB2ZXJzaW9uaW5mbzEtPmdvdGl0LmZmbSAmJiB2ZXJzaW9uaW5mbzItPmdvdGl0LmZmbSkgewoJCWlmKHZlcnNpb25pbmZvMS0+ZmlsZWZsYWdzbWFzayAhPSB2ZXJzaW9uaW5mbzItPmZpbGVmbGFnc21hc2spCgkJCWRpZmZlcmVudCA9IDE7Cgl9IGVsc2UgaWYoIWRpZmZlcmVudCAmJgoJCSAgKCh2ZXJzaW9uaW5mbzEtPmdvdGl0LmZmbSAmJiAhdmVyc2lvbmluZm8yLT5nb3RpdC5mZm0pIHx8CgkJICAoIXZlcnNpb25pbmZvMS0+Z290aXQuZmZtICYmIHZlcnNpb25pbmZvMi0+Z290aXQuZmZtKSkpCgkJCWRpZmZlcmVudCA9IDE7CglpZighZGlmZmVyZW50ICYmIHZlcnNpb25pbmZvMS0+Z290aXQuZnQgJiYgdmVyc2lvbmluZm8yLT5nb3RpdC5mdCkgewoJCWlmKHZlcnNpb25pbmZvMS0+ZmlsZXR5cGUgIT0gdmVyc2lvbmluZm8yLT5maWxldHlwZSkKCQkJZGlmZmVyZW50ID0gMTsKCX0gZWxzZSBpZighZGlmZmVyZW50ICYmCgkJICAoKHZlcnNpb25pbmZvMS0+Z290aXQuZnQgJiYgIXZlcnNpb25pbmZvMi0+Z290aXQuZnQpIHx8CgkJICAoIXZlcnNpb25pbmZvMS0+Z290aXQuZnQgJiYgdmVyc2lvbmluZm8yLT5nb3RpdC5mdCkpKQoJCQlkaWZmZXJlbnQgPSAxOwoJaWYoIWRpZmZlcmVudCAmJiB2ZXJzaW9uaW5mbzEtPmdvdGl0LmZzdCAmJiB2ZXJzaW9uaW5mbzItPmdvdGl0LmZzdCkgewoJCWlmKHZlcnNpb25pbmZvMS0+ZmlsZXN1YnR5cGUgIT0gdmVyc2lvbmluZm8yLT5maWxlc3VidHlwZSkKCQkJZGlmZmVyZW50ID0gMTsKCX0gZWxzZSBpZighZGlmZmVyZW50ICYmCgkJICAoKHZlcnNpb25pbmZvMS0+Z290aXQuZnN0ICYmICF2ZXJzaW9uaW5mbzItPmdvdGl0LmZzdCkgfHwKCQkgICghdmVyc2lvbmluZm8xLT5nb3RpdC5mc3QgJiYgdmVyc2lvbmluZm8yLT5nb3RpdC5mc3QpKSkKCQkJZGlmZmVyZW50ID0gMTsKCWlmKCFkaWZmZXJlbnQpIHsKCQl2ZXJfYmxvY2sxID0gdmVyc2lvbmluZm8xLT5ibG9ja3M7CgkJdmVyX2Jsb2NrMiA9IHZlcnNpb25pbmZvMi0+YmxvY2tzOwoJCXdoaWxlKCFkaWZmZXJlbnQgJiYgdmVyX2Jsb2NrMSAmJiB2ZXJfYmxvY2syKSB7CgkJCWRpZmZlcmVudCA9IGNvbXBhcmVfdmVyX2Jsb2NrKHZlcl9ibG9jazEsIHZlcl9ibG9jazIpOwoJCQl2ZXJfYmxvY2sxID0gdmVyX2Jsb2NrMS0+bmV4dDsKCQkJdmVyX2Jsb2NrMiA9IHZlcl9ibG9jazItPm5leHQ7CgkJfQoJCWlmKCFkaWZmZXJlbnQgJiYKCQkgICAoKHZlcl9ibG9jazEgJiYgIXZlcl9ibG9jazIpIHx8CgkJICAgKHZlcl9ibG9jazEgJiYgIXZlcl9ibG9jazIpKSkKCQkJZGlmZmVyZW50ID0gMTsKCX0KCXJldHVybiBkaWZmZXJlbnQ7Cn0KCnN0YXRpYyBpbnQgY29tcGFyZV9kbGdpbml0KGRsZ2luaXRfdCAqZGxnaW5pdDEsIGRsZ2luaXRfdCAqZGxnaW5pdDIpIHsKCWludCBkaWZmZXJlbnQgPSAwOwoJaWYoIWRpZmZlcmVudCAmJgoJICAgKChkbGdpbml0MS0+bWVtb3B0ICE9IGRsZ2luaXQyLT5tZW1vcHQpIHx8CgkgICAoZGxnaW5pdDEtPmRhdGEtPmx2Yy52ZXJzaW9uICE9IGRsZ2luaXQyLT5kYXRhLT5sdmMudmVyc2lvbikgfHwKCSAgIChkbGdpbml0MS0+ZGF0YS0+bHZjLmNoYXJhY3RzICE9IGRsZ2luaXQyLT5kYXRhLT5sdmMuY2hhcmFjdHMpKSkKCQlkaWZmZXJlbnQgPSAxOwoJcmV0dXJuIGRpZmZlcmVudDsKfQoKc3RhdGljIGludCBjb21wYXJlX3Rvb2xiYXJfaXRlbSh0b29sYmFyX2l0ZW1fdCAqdG9vbGJhcl9pdGVtMSwgdG9vbGJhcl9pdGVtX3QgKnRvb2xiYXJfaXRlbTIpIHsKCWludCBkaWZmZXJlbnQgPSAwOwoJd2hpbGUoIWRpZmZlcmVudCAmJiB0b29sYmFyX2l0ZW0xICYmIHRvb2xiYXJfaXRlbTIpIHsKCQlpZigodG9vbGJhcl9pdGVtMS0+aWQgJiYgIXRvb2xiYXJfaXRlbTItPmlkKSB8fAoJCSAgICghdG9vbGJhcl9pdGVtMS0+aWQgJiYgdG9vbGJhcl9pdGVtMi0+aWQpKQoJCQlkaWZmZXJlbnQgPSAxOwoJCXRvb2xiYXJfaXRlbTEgPSB0b29sYmFyX2l0ZW0xLT5uZXh0OwoJCXRvb2xiYXJfaXRlbTIgPSB0b29sYmFyX2l0ZW0yLT5uZXh0OwoJfQoJaWYoIWRpZmZlcmVudCAmJgoJICAgKCh0b29sYmFyX2l0ZW0xICYmICF0b29sYmFyX2l0ZW0yKSB8fAoJICAgKCF0b29sYmFyX2l0ZW0xICYmIHRvb2xiYXJfaXRlbTIpKSkKCQlkaWZmZXJlbnQgPSAxOwoJcmV0dXJuIGRpZmZlcmVudDsKfQoKc3RhdGljIGludCBjb21wYXJlX3Rvb2xiYXIodG9vbGJhcl90ICp0b29sYmFyMSwgdG9vbGJhcl90ICp0b29sYmFyMikgewoJaW50IGRpZmZlcmVudCA9IDA7CglpZighZGlmZmVyZW50ICYmCgkgICAoKHRvb2xiYXIxLT5tZW1vcHQgIT0gdG9vbGJhcjItPm1lbW9wdCkgfHwKCSAgICh0b29sYmFyMS0+bHZjLnZlcnNpb24gIT0gdG9vbGJhcjItPmx2Yy52ZXJzaW9uKSB8fAoJICAgKHRvb2xiYXIxLT5sdmMuY2hhcmFjdHMgIT0gdG9vbGJhcjItPmx2Yy5jaGFyYWN0cykpKQoJCWRpZmZlcmVudCA9IDE7CglpZighZGlmZmVyZW50KQoJCWRpZmZlcmVudCA9IGNvbXBhcmVfdG9vbGJhcl9pdGVtKHRvb2xiYXIxLT5pdGVtcywgdG9vbGJhcjItPml0ZW1zKTsKCXJldHVybiBkaWZmZXJlbnQ7Cn0KCnN0YXRpYyBpbnQgY29tcGFyZV9hbmlfY3VyaWNvKGFuaV9jdXJpY29fdCAqYW5pX2N1cmljbzEsIGFuaV9jdXJpY29fdCAqYW5pX2N1cmljbzIpIHsKCWludCBkaWZmZXJlbnQgPSAwOwoJaWYoIWRpZmZlcmVudCAmJgoJICAgKChhbmlfY3VyaWNvMS0+bWVtb3B0ICE9IGFuaV9jdXJpY28yLT5tZW1vcHQpIHx8CgkgICAoYW5pX2N1cmljbzEtPmRhdGEtPmx2Yy52ZXJzaW9uICE9IGFuaV9jdXJpY28yLT5kYXRhLT5sdmMudmVyc2lvbikgfHwKCSAgIChhbmlfY3VyaWNvMS0+ZGF0YS0+bHZjLmNoYXJhY3RzICE9IGFuaV9jdXJpY28yLT5kYXRhLT5sdmMuY2hhcmFjdHMpKSkKCQlkaWZmZXJlbnQgPSAxOwoJcmV0dXJuIGRpZmZlcmVudDsKfQoKc3RhdGljIGludCBjb21wYXJlKHJlc291cmNlX3QgKnJlc291cmNlMSwgcmVzb3VyY2VfdCAqcmVzb3VyY2UyKSB7Cglzd2l0Y2gocmVzb3VyY2UxLT50eXBlKSB7CgkJY2FzZSByZXNfYWNjOgoJCQlyZXR1cm4gY29tcGFyZV9hY2NlbGVyYXRvcihyZXNvdXJjZTEtPnJlcy5hY2MsIHJlc291cmNlMi0+cmVzLmFjYyk7CgkJY2FzZSByZXNfYm1wOgoJCQlyZXR1cm4gY29tcGFyZV9iaXRtYXAocmVzb3VyY2UxLT5yZXMuYm1wLCByZXNvdXJjZTItPnJlcy5ibXApOwoJCWNhc2UgcmVzX2N1cjoKCQkJcmV0dXJuIGNvbXBhcmVfY3Vyc29yKHJlc291cmNlMS0+cmVzLmN1ciwgcmVzb3VyY2UyLT5yZXMuY3VyKTsKCQljYXNlIHJlc19jdXJnOgoJCQlyZXR1cm4gY29tcGFyZV9jdXJzb3JfZ3JvdXAocmVzb3VyY2UxLT5yZXMuY3VyZywgcmVzb3VyY2UyLT5yZXMuY3VyZyk7CgkJY2FzZSByZXNfZGxnOgoJCQlyZXR1cm4gY29tcGFyZV9kaWFsb2cocmVzb3VyY2UxLT5yZXMuZGxnLCByZXNvdXJjZTItPnJlcy5kbGcpOwoJCWNhc2UgcmVzX2RsZ2V4OgoJCQlyZXR1cm4gY29tcGFyZV9kaWFsb2dleChyZXNvdXJjZTEtPnJlcy5kbGdleCwgcmVzb3VyY2UyLT5yZXMuZGxnZXgpOwoJCWNhc2UgcmVzX2ZudDoKCQkJcmV0dXJuIGNvbXBhcmVfZm9udChyZXNvdXJjZTEtPnJlcy5mbnQsIHJlc291cmNlMi0+cmVzLmZudCk7CgkJY2FzZSByZXNfZm50ZGlyOgoJCQlyZXR1cm4gY29tcGFyZV9mb250ZGlyKHJlc291cmNlMS0+cmVzLmZuZCwgcmVzb3VyY2UyLT5yZXMuZm5kKTsKCQljYXNlIHJlc19pY286CgkJCXJldHVybiBjb21wYXJlX2ljb24ocmVzb3VyY2UxLT5yZXMuaWNvLCByZXNvdXJjZTItPnJlcy5pY28pOwoJCWNhc2UgcmVzX2ljb2c6CgkJCXJldHVybiBjb21wYXJlX2ljb25fZ3JvdXAocmVzb3VyY2UxLT5yZXMuaWNvZywgcmVzb3VyY2UyLT5yZXMuaWNvZyk7CgkJY2FzZSByZXNfbWVuOgoJCQlyZXR1cm4gY29tcGFyZV9tZW51KHJlc291cmNlMS0+cmVzLm1lbiwgcmVzb3VyY2UyLT5yZXMubWVuKTsKCQljYXNlIHJlc19tZW5leDoKCQkJcmV0dXJuIGNvbXBhcmVfbWVudWV4KHJlc291cmNlMS0+cmVzLm1lbmV4LCByZXNvdXJjZTItPnJlcy5tZW5leCk7CgkJY2FzZSByZXNfcmR0OgoJCQlyZXR1cm4gY29tcGFyZV9yY2RhdGEocmVzb3VyY2UxLT5yZXMucmR0LCByZXNvdXJjZTItPnJlcy5yZHQpOwoJCWNhc2UgcmVzX3N0dDoKCQkJcmV0dXJuIGNvbXBhcmVfc3RyaW5ndGFibGUocmVzb3VyY2UxLT5yZXMuc3R0LCByZXNvdXJjZTItPnJlcy5zdHQpOwoJCWNhc2UgcmVzX3VzcjoKCQkJcmV0dXJuIGNvbXBhcmVfdXNlcihyZXNvdXJjZTEtPnJlcy51c3IsIHJlc291cmNlMi0+cmVzLnVzcik7CgkJY2FzZSByZXNfbXNnOgoJCQlyZXR1cm4gY29tcGFyZV9tZXNzYWdldGFibGUocmVzb3VyY2UxLT5yZXMubXNnLCByZXNvdXJjZTItPnJlcy5tc2cpOwoJCWNhc2UgcmVzX3ZlcjoKCQkJcmV0dXJuIGNvbXBhcmVfdmVyc2lvbmluZm8ocmVzb3VyY2UxLT5yZXMudmVyLCByZXNvdXJjZTItPnJlcy52ZXIpOwoJCWNhc2UgcmVzX2RsZ2luaXQ6CgkJCXJldHVybiBjb21wYXJlX2RsZ2luaXQocmVzb3VyY2UxLT5yZXMuZGxnaSwgcmVzb3VyY2UyLT5yZXMuZGxnaSk7CgkJY2FzZSByZXNfdG9vbGJhcjoKCQkJcmV0dXJuIGNvbXBhcmVfdG9vbGJhcihyZXNvdXJjZTEtPnJlcy50YnQsIHJlc291cmNlMi0+cmVzLnRidCk7CgkJY2FzZSByZXNfYW5pY3VyOgoJCWNhc2UgcmVzX2FuaWljbzoKCQkJcmV0dXJuIGNvbXBhcmVfYW5pX2N1cmljbyhyZXNvdXJjZTEtPnJlcy5hbmksIHJlc291cmNlMi0+cmVzLmFuaSk7CgkJZGVmYXVsdDoKCQkJLyogTm90IHN1cHBvc2VkIHRvIHJlYWNoIGhlcmUgKi8KCQkJZnByaW50ZihzdGRlcnIsICJOb3Qgc3VwcG9zZWQgdG8gcmVhY2ggaGVyZSAoY29tcGFyZSgpKVxuIik7CgkJCWFib3J0KCk7CgkJCXJldHVybiAtMTsKCX0KfQoKdm9pZCB2ZXJpZnlfdHJhbnNsYXRpb25zKHJlc291cmNlX3QgKnRvcCkgewoJZW51bSBsYW5nX3R5cGVfZSBsYW5nX3R5cGU7CgllbnVtIHJlc19lIHJlc190eXBlOwoJaW50ICoqcHJlc2VuY2U7CglpbnQgaSwgajsKCWNoYXIgKm5hbWVpZDsKCWNoYXIgKipwcm9ibGVtczsKCWludCBuYl9wcm9ibGVtcywgbGFzdF9wcm9ibGVtOwoJaW50IGNvbXBsZXRlLCBuZWVkc193b3JrLCBwYXJ0aWFsOwoJcmVzb3VyY2VfdCAqbmV4dCA9IHRvcDsKCglmb3IocmVzX3R5cGUgPSByZXNfMDsgcmVzX3R5cGUgPD0gcmVzX3VzcjsgcmVzX3R5cGUrKykgewoJCXByZXNlbnRfcmVzb3VyY2VzW3Jlc190eXBlXSA9IDA7CgkJZm9yKGxhbmdfdHlwZSA9IGxhbmdfdHlwZV9tYXN0ZXI7IGxhbmdfdHlwZSA8PSBsYW5nX3R5cGVfbm9ybWFsOyBsYW5nX3R5cGUrKykgewoJCQluYl9yZXNvdXJjZXNbcmVzX3R5cGVdW2xhbmdfdHlwZV0gPSAwOwoJCQlsaXN0X3Jlc291cmNlc1tyZXNfdHlwZV1bbGFuZ190eXBlXSA9IE5VTEw7CgkJfQoJfQoKCXdoaWxlKG5leHQpIHsKCQlzd2l0Y2gobmV4dC0+dHlwZSkgewoJCQljYXNlIHJlc19hY2M6CgkJCWNhc2UgcmVzX2JtcDoKCQkJY2FzZSByZXNfY3VyOgoJCQljYXNlIHJlc19jdXJnOgoJCQljYXNlIHJlc19kbGc6CgkJCWNhc2UgcmVzX2RsZ2V4OgoJCQljYXNlIHJlc19mbnQ6CgkJCWNhc2UgcmVzX2ZudGRpcjoKCQkJY2FzZSByZXNfaWNvOgoJCQljYXNlIHJlc19pY29nOgoJCQljYXNlIHJlc19tZW46CgkJCWNhc2UgcmVzX21lbmV4OgoJCQljYXNlIHJlc19yZHQ6CgkJCWNhc2UgcmVzX3N0dDoKCQkJY2FzZSByZXNfdXNyOgoJCQljYXNlIHJlc19tc2c6CgkJCWNhc2UgcmVzX3ZlcjoKCQkJY2FzZSByZXNfZGxnaW5pdDoKCQkJY2FzZSByZXNfdG9vbGJhcjoKCQkJY2FzZSByZXNfYW5pY3VyOgoJCQljYXNlIHJlc19hbmlpY286CgkJCQlhZGRfcmVzb3VyY2UobmV4dCk7CgkJCQlicmVhazsKCQkJZGVmYXVsdDoKCQkJCWZwcmludGYoc3RkZXJyLCAiUmVwb3J0IHRoaXM6IHVua25vd24gcmVzb3VyY2UgdHlwZSBwYXJzZWQgJTA4eFxuIiwgbmV4dC0+dHlwZSk7CgkJfQoJCW5leHQgPSBuZXh0LT5uZXh0OwoJfQoJcHJlc2VudF9yZXNvdXJjZXNbcmVzX2FjY10gPSAxOwoJcmVzX25hbWVzW3Jlc19hY2NdID0gc3RyZHVwKCJhY2NlbGVyYXRvciIpOwoJcHJlc2VudF9yZXNvdXJjZXNbcmVzX2JtcF0gPSAxOwoJcmVzX25hbWVzW3Jlc19ibXBdID0gc3RyZHVwKCJiaXRtYXAiKTsKCXByZXNlbnRfcmVzb3VyY2VzW3Jlc19jdXJdID0gMTsKCXJlc19uYW1lc1tyZXNfY3VyXSA9IHN0cmR1cCgiY3Vyc29yIik7CglwcmVzZW50X3Jlc291cmNlc1tyZXNfY3VyZ10gPSAxOwoJcmVzX25hbWVzW3Jlc19jdXJnXSA9IHN0cmR1cCgiY3Vyc29yX2dyb3VwIik7CglwcmVzZW50X3Jlc291cmNlc1tyZXNfZGxnXSA9IDE7CglyZXNfbmFtZXNbcmVzX2RsZ10gPSBzdHJkdXAoImRpYWxvZyIpOwoJcHJlc2VudF9yZXNvdXJjZXNbcmVzX2RsZ2V4XSA9IDE7CglyZXNfbmFtZXNbcmVzX2RsZ2V4XSA9IHN0cmR1cCgiZGlhbG9nZXgiKTsKCXByZXNlbnRfcmVzb3VyY2VzW3Jlc19mbnRdID0gMTsKCXJlc19uYW1lc1tyZXNfZm50XSA9IHN0cmR1cCgiZm9udCIpOwoJcHJlc2VudF9yZXNvdXJjZXNbcmVzX2ZudGRpcl0gPSAxOwoJcmVzX25hbWVzW3Jlc19mbnRkaXJdID0gc3RyZHVwKCJmb250ZGlyIik7CglwcmVzZW50X3Jlc291cmNlc1tyZXNfaWNvXSA9IDE7CglyZXNfbmFtZXNbcmVzX2ljb10gPSBzdHJkdXAoImljb24iKTsKCXByZXNlbnRfcmVzb3VyY2VzW3Jlc19pY29nXSA9IDE7CglyZXNfbmFtZXNbcmVzX2ljb2ddID0gc3RyZHVwKCJpY29uX2dyb3VwIik7CglwcmVzZW50X3Jlc291cmNlc1tyZXNfbWVuXSA9IDE7CglyZXNfbmFtZXNbcmVzX21lbl0gPSBzdHJkdXAoIm1lbnUiKTsKCXByZXNlbnRfcmVzb3VyY2VzW3Jlc19tZW5leF0gPSAxOwoJcmVzX25hbWVzW3Jlc19tZW5leF0gPSBzdHJkdXAoIm1lbnVleCIpOwoJcHJlc2VudF9yZXNvdXJjZXNbcmVzX3JkdF0gPSAxOwoJcmVzX25hbWVzW3Jlc19yZHRdID0gc3RyZHVwKCJyY2RhdGEiKTsKCXByZXNlbnRfcmVzb3VyY2VzW3Jlc19zdHRdID0gMTsKCXJlc19uYW1lc1tyZXNfc3R0XSA9IHN0cmR1cCgic3RyaW5ndGFibGUiKTsKCXByZXNlbnRfcmVzb3VyY2VzW3Jlc191c3JdID0gMTsKCXJlc19uYW1lc1tyZXNfdXNyXSA9IHN0cmR1cCgidXNlciIpOwoJcHJlc2VudF9yZXNvdXJjZXNbcmVzX21zZ10gPSAxOwoJcmVzX25hbWVzW3Jlc19tc2ddID0gc3RyZHVwKCJtZXNzYWdldGFibGUiKTsKCXByZXNlbnRfcmVzb3VyY2VzW3Jlc192ZXJdID0gMTsKCXJlc19uYW1lc1tyZXNfdmVyXSA9IHN0cmR1cCgidmVyc2lvbmluZm8iKTsKCXByZXNlbnRfcmVzb3VyY2VzW3Jlc19kbGdpbml0XSA9IDE7CglyZXNfbmFtZXNbcmVzX2RsZ2luaXRdID0gc3RyZHVwKCJkbGdpbml0Iik7CglwcmVzZW50X3Jlc291cmNlc1tyZXNfdG9vbGJhcl0gPSAxOwoJcmVzX25hbWVzW3Jlc190b29sYmFyXSA9IHN0cmR1cCgidG9vbGJhciIpOwoJcHJlc2VudF9yZXNvdXJjZXNbcmVzX2FuaWN1cl0gPSAxOwoJcmVzX25hbWVzW3Jlc19hbmljdXJdID0gc3RyZHVwKCJhbmlfY3Vyc29yIik7CglwcmVzZW50X3Jlc291cmNlc1tyZXNfYW5paWNvXSA9IDE7CglyZXNfbmFtZXNbcmVzX2FuaWljb10gPSBzdHJkdXAoImFuaV9pY29uIik7CgoJZm9yKHJlc190eXBlID0gcmVzXzA7IHJlc190eXBlIDw9IHJlc191c3I7IHJlc190eXBlKyspIHsKCQlpZighcHJlc2VudF9yZXNvdXJjZXNbcmVzX3R5cGVdKSB7CgkJCWNvbnRpbnVlOwoJCX0KCQlpZihuYl9yZXNvdXJjZXNbcmVzX3R5cGVdW2xhbmdfdHlwZV9ub3JtYWxdID4gMCkgewoJCQlpZihuYl9yZXNvdXJjZXNbcmVzX3R5cGVdW2xhbmdfdHlwZV9tYXN0ZXJdICYmIG5iX3Jlc291cmNlc1tyZXNfdHlwZV1bbGFuZ190eXBlX25ldXRyYWxdKSB7CgkJCQlmcHJpbnRmKHN0ZGVyciwgIlR5cGUgJXM6XG4iLCByZXNfbmFtZXNbcmVzX3R5cGVdKTsKCQkJCWZwcmludGYoc3RkZXJyLCAiVGhlcmUgYXJlIGJvdGggYSBORVVUUkFMIGFuZCBhIE1BU1RFUiB2ZXJzaW9uIGZvciAlcywgYWxvbmcgd2l0aCBhZGRpdGlvbmFsIGxvY2FsaXplZCB2ZXJzaW9ucy4gVGhlIE5FVVRSQUwgdmVyc2lvbnMgd2lsbCBub3QgYmUgY2hlY2tlZCBhZ2FpbnN0IG90aGVyIHZlcnNpb25zLlxuIiwgcmVzX25hbWVzW3Jlc190eXBlXSk7CgkJCX0gZWxzZSBpZihuYl9yZXNvdXJjZXNbcmVzX3R5cGVdW2xhbmdfdHlwZV9uZXV0cmFsXSkgewoJCQkJZnByaW50ZihzdGRlcnIsICJUeXBlICVzOlxuIiwgcmVzX25hbWVzW3Jlc190eXBlXSk7CgkJCQlmcHJpbnRmKHN0ZGVyciwgIlRoZXJlIGFyZSBubyBNQVNURVIgdmVyc2lvbiwgYnV0IHRoZXJlIGFyZSBzb21lIE5FVVRSQUwgdmVyc2lvbnMgZm9yICVzLCBzbyB3aWxsIHVzZSB0aG9zZSBpbnN0ZWFkIG9mIE1BU1RFUiBmb3IgY29tcGFyaXNvbi5cbiIsIHJlc19uYW1lc1tyZXNfdHlwZV0pOwoJCQkJbGlzdF9yZXNvdXJjZXNbcmVzX3R5cGVdW2xhbmdfdHlwZV9tYXN0ZXJdID0gbGlzdF9yZXNvdXJjZXNbcmVzX3R5cGVdW2xhbmdfdHlwZV9uZXV0cmFsXTsKCQkJCW5iX3Jlc291cmNlc1tyZXNfdHlwZV1bbGFuZ190eXBlX21hc3Rlcl0gPSBuYl9yZXNvdXJjZXNbcmVzX3R5cGVdW2xhbmdfdHlwZV9uZXV0cmFsXTsKCQkJfSBlbHNlIGlmKCFuYl9yZXNvdXJjZXNbcmVzX3R5cGVdW2xhbmdfdHlwZV9tYXN0ZXJdKSB7CgkJCQlmcHJpbnRmKHN0ZGVyciwgIlR5cGUgJXM6XG4iLCByZXNfbmFtZXNbcmVzX3R5cGVdKTsKCQkJCWZwcmludGYoc3RkZXJyLCAiVGhlcmUgYXJlIG5vIE5FVVRSQUwgbm9yIE1BU1RFUiB2ZXJzaW9ucyBmb3IgJXMsIGJ1dCB0aGVyZSBhcmUgc29tZSBvdGhlciBsb2NhbGl6ZWQgdmVyc2lvbnMuIE5vIGNvbXBhcmlzb24gd2lsbCBiZSBkb25lIGF0IGFsbC5cbiIsIHJlc19uYW1lc1tyZXNfdHlwZV0pOwoJCQl9CgkJfSBlbHNlIHsKCQkJaWYobmJfcmVzb3VyY2VzW3Jlc190eXBlXVtsYW5nX3R5cGVfbWFzdGVyXSAmJiBuYl9yZXNvdXJjZXNbcmVzX3R5cGVdW2xhbmdfdHlwZV9uZXV0cmFsXSkgewoJCQkJZnByaW50ZihzdGRlcnIsICJUeXBlICVzOlxuIiwgcmVzX25hbWVzW3Jlc190eXBlXSk7CgkJCQlmcHJpbnRmKHN0ZGVyciwgIlRoZXJlIGFyZSBib3RoIGEgTkVVVFJBTCBhbmQgYSBNQVNURVIgdmVyc2lvbnMgZm9yICVzLCBidXQgbm8gb3RoZXIgbG9jYWxpemVkIHZlcnNpb24uIE5vIGNvbXBhcmlzb24gd2lsbCBiZSBkb25lIGF0IGFsbC5cbiIsIHJlc19uYW1lc1tyZXNfdHlwZV0pOwoJCQl9IGVsc2UgaWYobmJfcmVzb3VyY2VzW3Jlc190eXBlXVtsYW5nX3R5cGVfbWFzdGVyXSkgewoJCQkJZnByaW50ZihzdGRlcnIsICJUeXBlICVzOlxuIiwgcmVzX25hbWVzW3Jlc190eXBlXSk7CgkJCQlmcHJpbnRmKHN0ZGVyciwgIlRoZXJlIGFyZSBvbmx5IE1BU1RFUiB2ZXJzaW9ucyBmb3IgJXMuIE5vIGNvbXBhcmlzb24gd2lsbCBiZSBkb25lIGF0IGFsbC5cbiIsIHJlc19uYW1lc1tyZXNfdHlwZV0pOwoJCQl9IGVsc2UgaWYobmJfcmVzb3VyY2VzW3Jlc190eXBlXVtsYW5nX3R5cGVfbmV1dHJhbF0pIHsKCQkJCS8qIGZwcmludGYoc3RkZXJyLCAiVGhlcmUgYXJlIG9ubHkgTkVVVFJBTCB2ZXJzaW9ucyBmb3IgJXMuIE5vIGNvbXBhcmlzb24gd2lsbCBiZSBkb25lIGF0IGFsbC5cbiIsIHJlc19uYW1lc1tyZXNfdHlwZV0pOyAqLwoJCQl9IGVsc2UgewoJCQkJLyogZnByaW50ZihzdGRlcnIsICJUaGVyZSBhcmUgbm8gdmVyc2lvbnMgYXQgYWxsIGZvciAlcy4gTm8gY29tcGFyaXNvbiB3aWxsIGJlIGRvbmUgYXQgYWxsLlxuIiwgcmVzX25hbWVzW3Jlc190eXBlXSk7ICovCgkJCX0KCQl9CgoJCXByZXNlbmNlID0gbWFsbG9jKG5iX3Jlc291cmNlc1tyZXNfdHlwZV1bbGFuZ190eXBlX21hc3Rlcl0qc2l6ZW9mKGludCAqKSk7CgkJZm9yKGkgPSAwOyBpIDwgbmJfcmVzb3VyY2VzW3Jlc190eXBlXVtsYW5nX3R5cGVfbWFzdGVyXTsgaSsrKSB7CgkJCXByZXNlbmNlW2ldID0gY2FsbG9jKE5CX0xBTkcsIHNpemVvZihpbnQpKTsKCQkJcHJlc2VuY2VbaV1bTUFTVEVSX0xBTkdVQUdFXSA9IC0xOwoJCX0KCgkJZm9yKGkgPSAwOyBpIDwgbmJfcmVzb3VyY2VzW3Jlc190eXBlXVtsYW5nX3R5cGVfbm9ybWFsXTsgaSsrKSB7CgkJCWZvcihqID0gMDsgaiA8IG5iX3Jlc291cmNlc1tyZXNfdHlwZV1bbGFuZ190eXBlX21hc3Rlcl07IGorKykgewoJCQkJbmFtZWlkID0gc3RyZHVwKGdldF9uYW1laWRfc3RyKGxpc3RfcmVzb3VyY2VzW3Jlc190eXBlXVtsYW5nX3R5cGVfbm9ybWFsXVtpXS0+bmFtZSkpOwoJCQkJaWYoIXN0cmNtcChuYW1laWQsIGdldF9uYW1laWRfc3RyKGxpc3RfcmVzb3VyY2VzW3Jlc190eXBlXVtsYW5nX3R5cGVfbWFzdGVyXVtqXS0+bmFtZSkpKSB7CgkJCQkJaWYoY29tcGFyZShsaXN0X3Jlc291cmNlc1tyZXNfdHlwZV1bbGFuZ190eXBlX25vcm1hbF1baV0sIGxpc3RfcmVzb3VyY2VzW3Jlc190eXBlXVtsYW5nX3R5cGVfbWFzdGVyXVtqXSkpIHsKCQkJCQkJcHJlc2VuY2Vbal1bZ2V0X2xhbmd1YWdlX2lkKGxpc3RfcmVzb3VyY2VzW3Jlc190eXBlXVtsYW5nX3R5cGVfbm9ybWFsXVtpXSldID0gMjsKCQkJCQkJLyogZnByaW50ZihzdGRlcnIsICJEaWZmZXJlbmNlcyBpbiB0eXBlICVzLCBJRCAlcywgZm9yIGxhbmd1YWdlICVzXG4iLCByZXNfbmFtZXNbcmVzX3R5cGVdLCBuYW1laWQsIGdldF9sYW5ndWFnZV9uYW1lKGdldF9sYW5ndWFnZV9pZChsaXN0X3Jlc291cmNlc1tyZXNfdHlwZV1bbGFuZ190eXBlX25vcm1hbF1baV0pKSk7ICovCgkJCQkJfSBlbHNlIHsKCQkJCQkJcHJlc2VuY2Vbal1bZ2V0X2xhbmd1YWdlX2lkKGxpc3RfcmVzb3VyY2VzW3Jlc190eXBlXVtsYW5nX3R5cGVfbm9ybWFsXVtpXSldID0gMTsKCQkJCQl9CgkJCQl9CgkJCQlmcmVlKG5hbWVpZCk7CgkJCX0KCQl9CgoJCXByb2JsZW1zID0gbWFsbG9jKHNpemVvZihjaGFyICopKTsKCQlwcm9ibGVtc1swXSA9IHN0cmR1cCgiIik7CgkJbmJfcHJvYmxlbXMgPSAwOwoJCWxhc3RfcHJvYmxlbSA9IC0xOwoJCWZvcihpID0gMDsgaSA8IE5CX0xBTkc7IGkrKykgewoJCQljb21wbGV0ZSA9IDE7CgkJCW5lZWRzX3dvcmsgPSAwOwoJCQlwYXJ0aWFsID0gMDsKCQkJZm9yKGogPSAwOyBqIDwgbmJfcmVzb3VyY2VzW3Jlc190eXBlXVtsYW5nX3R5cGVfbWFzdGVyXTsgaisrKSB7CgkJCQlpZihwcmVzZW5jZVtqXVtpXSkgewoJCQkJCXBhcnRpYWwgPSAxOwoJCQkJCWlmKHByZXNlbmNlW2pdW2ldID09IDIpIHsKCQkJCQkJbmVlZHNfd29yayA9IDE7CgkJCQkJCXByb2JsZW1zID0gcmVhbGxvYyhwcm9ibGVtcywgKCsrbmJfcHJvYmxlbXMrMSkqc2l6ZW9mKGNoYXIgKikpOwoJCQkJCQlwcm9ibGVtc1tuYl9wcm9ibGVtc10gPSBtYWxsb2Moc3RybGVuKGdldF9uYW1laWRfc3RyKGxpc3RfcmVzb3VyY2VzW3Jlc190eXBlXVtsYW5nX3R5cGVfbWFzdGVyXVtqXS0+bmFtZSkpICsgOSk7CgkJCQkJCXNwcmludGYocHJvYmxlbXNbbmJfcHJvYmxlbXNdLCAiRElGRiAlcyAlMDJ4IiwgZ2V0X25hbWVpZF9zdHIobGlzdF9yZXNvdXJjZXNbcmVzX3R5cGVdW2xhbmdfdHlwZV9tYXN0ZXJdW2pdLT5uYW1lKSwgaSk7CgkJCQkJCWlmKGxhc3RfcHJvYmxlbSA9PSBpKSB7CgkJCQkJCQlwcm9ibGVtc1tuYl9wcm9ibGVtcy0xXSA9IHJlYWxsb2MocHJvYmxlbXNbbmJfcHJvYmxlbXMtMV0sIHN0cmxlbihwcm9ibGVtc1tuYl9wcm9ibGVtcy0xXSkgKyAzKTsKCQkJCQkJCXN0cmNhdChwcm9ibGVtc1tuYl9wcm9ibGVtcy0xXSwgIiBcXCIpOwoJCQkJCQl9IGVsc2UgewoJCQkJCQkJbGFzdF9wcm9ibGVtID0gaTsKCQkJCQkJfQoJCQkJCX0KCQkJCX0gZWxzZSB7CgkJCQkJY29tcGxldGUgPSAwOwoJCQkJCXByb2JsZW1zID0gcmVhbGxvYyhwcm9ibGVtcywgKCsrbmJfcHJvYmxlbXMrMSkqc2l6ZW9mKGNoYXIgKikpOwoJCQkJCXByb2JsZW1zW25iX3Byb2JsZW1zXSA9IG1hbGxvYyhzdHJsZW4oZ2V0X25hbWVpZF9zdHIobGlzdF9yZXNvdXJjZXNbcmVzX3R5cGVdW2xhbmdfdHlwZV9tYXN0ZXJdW2pdLT5uYW1lKSkgKyA4KTsKCQkJCQlzcHJpbnRmKHByb2JsZW1zW25iX3Byb2JsZW1zXSwgIkFCUyAlcyAlMDJ4IiwgZ2V0X25hbWVpZF9zdHIobGlzdF9yZXNvdXJjZXNbcmVzX3R5cGVdW2xhbmdfdHlwZV9tYXN0ZXJdW2pdLT5uYW1lKSwgaSk7CgkJCQkJaWYobGFzdF9wcm9ibGVtID09IGkpIHsKCQkJCQkJcHJvYmxlbXNbbmJfcHJvYmxlbXMtMV0gPSByZWFsbG9jKHByb2JsZW1zW25iX3Byb2JsZW1zLTFdLCBzdHJsZW4ocHJvYmxlbXNbbmJfcHJvYmxlbXMtMV0pICsgMyk7CgkJCQkJCXN0cmNhdChwcm9ibGVtc1tuYl9wcm9ibGVtcy0xXSwgIiBcXCIpOwoJCQkJCX0gZWxzZSB7CgkJCQkJCWxhc3RfcHJvYmxlbSA9IGk7CgkJCQkJfQoJCQkJfQoJCQl9CgkJCWlmKGNvbXBsZXRlICYmIHBhcnRpYWwgJiYgIW5lZWRzX3dvcmspIHsKCQkJCS8qIFN1cHBvcnQgaXMgY29tcGxldGUsIG5vIG5lZWQgdG8gZG8gYW55dGhpbmcgKi8KCQkJCS8qIGZwcmludGYoc3RkZXJyLCAiU3VwcG9ydCBmb3IgbGFuZ3VhZ2UgJXMgaXMgY29tcGxldGUgZm9yICVzLlxuIiwgZ2V0X2xhbmd1YWdlX25hbWUoaSksIHJlc19uYW1lc1tyZXNfdHlwZV0pOyAqLwoJCQkJcHJpbnRmKCIuIik7CgkJCX0gZWxzZSBpZihjb21wbGV0ZSAmJiBwYXJ0aWFsICYmIG5lZWRzX3dvcmspIHsKCQkJCS8qIFN1cHBvcnQgaXMgaW5jb21wbGV0ZSAoZGlmZmVyaW5nIHJlc291cmNlcyksIG5lZWRzIHdvcmsgKi8KCQkJCS8qIGZwcmludGYoc3RkZXJyLCAiU3VwcG9ydCBmb3IgbGFuZ3VhZ2UgJXMgaXMgaW5jb21wbGV0ZSAoZGlmZmVyaW5nIHJlc291cmNlcykgZm9yICVzLlxuIiwgZ2V0X2xhbmd1YWdlX25hbWUoaSksIHJlc19uYW1lc1tyZXNfdHlwZV0pOyAqLwoJCQkJcHJpbnRmKCJ4Iik7CgkJCX0gZWxzZSBpZighY29tcGxldGUgJiYgcGFydGlhbCAmJiAhbmVlZHNfd29yaykgewoJCQkJLyogU3VwcG9ydCBpcyBpbmNvbXBsZXRlIChtaXNzaW5nIHJlc291cmNlcyksIG5lZWRzIHdvcmsgKi8KCQkJCS8qIGZwcmludGYoc3RkZXJyLCAiU3VwcG9ydCBmb3IgbGFuZ3VhZ2UgJXMgaXMgaW5jb21wbGV0ZSAobWlzc2luZyByZXNvdXJjZXMpIGZvciAlcy5cbiIsIGdldF9sYW5ndWFnZV9uYW1lKGkpLCByZXNfbmFtZXNbcmVzX3R5cGVdKTsgKi8KCQkJCXByaW50ZigiLSIpOwoJCQl9IGVsc2UgaWYoIWNvbXBsZXRlICYmIHBhcnRpYWwgJiYgbmVlZHNfd29yaykgewoJCQkJLyogU3VwcG9ydCBpcyBpbmNvbXBsZXRlIChtaXNzaW5nIGFuZCBkaWZmZXJpbmcgcmVzb3VyY2VzKSwgbmVlZHMgd29yayAqLwoJCQkJLyogZnByaW50ZihzdGRlcnIsICJTdXBwb3J0IGZvciBsYW5ndWFnZSAlcyBpcyBpbmNvbXBsZXRlIChtaXNzaW5nIGFuZCBkaWZmZXJpbmcgcmVzb3VyY2VzKSBmb3IgJXMuXG4iLCBnZXRfbGFuZ3VhZ2VfbmFtZShpKSwgcmVzX25hbWVzW3Jlc190eXBlXSk7ICovCgkJCQlwcmludGYoIisiKTsKCQkJfSBlbHNlIGlmKCFjb21wbGV0ZSAmJiAhcGFydGlhbCkgewoJCQkJLyogU3VwcG9ydCBpcyB0b3RhbGx5IGFic2VudCwgbWlnaHQgYmUgaW50ZXJlc3RpbmcgdG8gZG8gKi8KCQkJCS8qIGZwcmludGYoc3RkZXJyLCAiU3VwcG9ydCBmb3IgbGFuZ3VhZ2UgJXMgaXMgYWJzZW50IGZvciAlcy5cbiIsIGdldF9sYW5ndWFnZV9uYW1lKGkpLCByZXNfbmFtZXNbcmVzX3R5cGVdKTsgKi8KCQkJCXByaW50ZigiICIpOwoJCQl9IGVsc2UgewoJCQkJLyogU3VwcG9ydCBpcyBub3QgcmVsZXZhbnQsIG5vIG5lZWQgdG8gZG8gYW55dGhpbmcgKi8KCQkJCS8qIGZwcmludGYoc3RkZXJyLCAiU3VwcG9ydCBmb3IgbGFuZ3VhZ2UgJXMgaXMgbm90IHJlbGV2YW50IGZvciAlcy5cbiIsIGdldF9sYW5ndWFnZV9uYW1lKGkpLCByZXNfbmFtZXNbcmVzX3R5cGVdKTsgKi8KCQkJCXByaW50ZigibiIpOwoJCQl9CgkJfQoJCXByaW50ZigiXG4iKTsKCQlmb3IoaSA9IDE7IGkgPD0gbmJfcHJvYmxlbXM7IGkrKykgewoJCQlwcmludGYoIiVzXG4iLCBwcm9ibGVtc1tpXSk7CgkJCWZyZWUocHJvYmxlbXNbaV0pOwoJCX0KCQlmcmVlKHByb2JsZW1zWzBdKTsKCQlmcmVlKHByb2JsZW1zKTsKCQlmb3IoaSA9IDA7IGkgPCBuYl9yZXNvdXJjZXNbcmVzX3R5cGVdW2xhbmdfdHlwZV9tYXN0ZXJdOyBpKyspCgkJCWZyZWUocHJlc2VuY2VbaV0pOwoJCWZyZWUocHJlc2VuY2UpOwoJfQp9Cg==