LyoKICogc25tcF92YXJfcm91dGUuYyAtIHJldHVybiBhIHBvaW50ZXIgdG8gdGhlIG5hbWVkIHZhcmlhYmxlLgogKgogKgogKi8KLyogUG9ydGlvbnMgb2YgdGhpcyBmaWxlIGFyZSBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29weXJpZ2h0KHMpLiAgU2VlCiAqIHRoZSBOZXQtU05NUCdzIENPUFlJTkcgZmlsZSBmb3IgbW9yZSBkZXRhaWxzIGFuZCBvdGhlciBjb3B5cmlnaHRzCiAqIHRoYXQgbWF5IGFwcGx5OgogKi8KLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCglDb3B5cmlnaHQgMTk4OCwgMTk4OSBieSBDYXJuZWdpZSBNZWxsb24gVW5pdmVyc2l0eQoJQ29weXJpZ2h0IDE5ODkJVEdWLCBJbmNvcnBvcmF0ZWQKCgkJICAgICAgQWxsIFJpZ2h0cyBSZXNlcnZlZAoKUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgYW5kIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZSBhbmQgaXRzCmRvY3VtZW50YXRpb24gZm9yIGFueSBwdXJwb3NlIGFuZCB3aXRob3V0IGZlZSBpcyBoZXJlYnkgZ3JhbnRlZCwKcHJvdmlkZWQgdGhhdCB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhcHBlYXIgaW4gYWxsIGNvcGllcyBhbmQgdGhhdApib3RoIHRoYXQgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIgaW4Kc3VwcG9ydGluZyBkb2N1bWVudGF0aW9uLCBhbmQgdGhhdCB0aGUgbmFtZSBvZiBDTVUgYW5kIFRHViBub3QgYmUgdXNlZAppbiBhZHZlcnRpc2luZyBvciBwdWJsaWNpdHkgcGVydGFpbmluZyB0byBkaXN0cmlidXRpb24gb2YgdGhlIHNvZnR3YXJlCndpdGhvdXQgc3BlY2lmaWMsIHdyaXR0ZW4gcHJpb3IgcGVybWlzc2lvbi4KCkNNVSBBTkQgVEdWIERJU0NMQUlNUyBBTEwgV0FSUkFOVElFUyBXSVRIIFJFR0FSRCBUTyBUSElTIFNPRlRXQVJFLApJTkNMVURJTkcgQUxMIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MsIElOIE5PCkVWRU5UIFNIQUxMIENNVSBPUiBUR1YgQkUgTElBQkxFIEZPUiBBTlkgU1BFQ0lBTCwgSU5ESVJFQ1QgT1IKQ09OU0VRVUVOVElBTCBEQU1BR0VTIE9SIEFOWSBEQU1BR0VTIFdIQVRTT0VWRVIgUkVTVUxUSU5HIEZST00gTE9TUyBPRgpVU0UsIERBVEEgT1IgUFJPRklUUywgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIE5FR0xJR0VOQ0UgT1IKT1RIRVIgVE9SVElPVVMgQUNUSU9OLCBBUklTSU5HIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFVTRSBPUgpQRVJGT1JNQU5DRSBPRiBUSElTIFNPRlRXQVJFLgoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi8qCiAqIFBvcnRpb25zIG9mIHRoaXMgZmlsZSBhcmUgY29weXJpZ2h0ZWQgYnk6CiAqIENvcHlyaWdodCCpIDIwMDMgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgogKiBVc2UgaXMgc3ViamVjdCB0byBsaWNlbnNlIHRlcm1zIHNwZWNpZmllZCBpbiB0aGUgQ09QWUlORyBmaWxlCiAqIGRpc3RyaWJ1dGVkIHdpdGggdGhlIE5ldC1TTk1QIHBhY2thZ2UuCiAqLwoKLyoKICogYWRkaXRpb25zLCBmaXhlcyBhbmQgZW5oYW5jZW1lbnRzIGZvciBMaW51eCBieSBFcmlrIFNjaG9lbmZlbGRlcgogKiAoc2Nob2VuZnJAaWJyLmNzLnR1LWJzLmRlKSAxOTk0LzE5OTUuCiAqIExpbnV4IGFkZGl0aW9ucyB0YWtlbiBmcm9tIENNVSB0byBVQ0Qgc3RhY2sgYnkgSmVubmlmZXIgQnJheSBvZiBPcmlnaW4KICogKGpicmF5QG9yaWdpbi1hdC5jby51aykgMTk5NwogKiBTdXBwb3J0IGZvciBzeXNjdGwoe0NUTF9ORVQsUEZfUk9VVEUsLi4uKSBieSBTaW1vbiBMZWluZW4KICogKHNpbW9uQHN3aXRjaC5jaCkgMTk5NwogKi8KCiNpbmNsdWRlIDxuZXQtc25tcC9uZXQtc25tcC1jb25maWcuaD4KCiNpbmNsdWRlICJyb3V0ZV9oZWFkZXJzLmgiCiNkZWZpbmUgQ0FDSEVfVElNRSAoMTIwKSAgICAgICAgLyogU2Vjb25kcyAqLwoKI2lmICFkZWZpbmVkKE5FVFNOTVBfQ0FOX1VTRV9TWVNDVEwpCgojaW5jbHVkZSA8bmV0LXNubXAvbmV0LXNubXAtaW5jbHVkZXMuaD4KI2luY2x1ZGUgPG5ldC1zbm1wL2FnZW50L25ldC1zbm1wLWFnZW50LWluY2x1ZGVzLmg+CiNpbmNsdWRlIDxuZXQtc25tcC9hZ2VudC9hdXRvX25saXN0Lmg+CiNpbmNsdWRlIDxuZXQtc25tcC9kYXRhX2FjY2Vzcy9pbnRlcmZhY2UuaD4KCiNpbmNsdWRlICJpcC5oIgojaW5jbHVkZSAia2VybmVsLmgiCiNpbmNsdWRlICJpbnRlcmZhY2VzLmgiCiNpbmNsdWRlICJzdHJ1Y3QuaCIKI2luY2x1ZGUgInV0aWxfZnVuY3MuaCIKCiNpZm5kZWYgIE1JTgojZGVmaW5lICBNSU4oYSxiKSAgICAgICAgICAgICAgICAgICAgICgoKGEpIDwgKGIpKSA/IChhKSA6IChiKSkKI2VuZGlmCgojaWZkZWYgaHB1eDExCiNpbmNsdWRlIDxzeXMvbWliLmg+CiNpbmNsdWRlIDxuZXRpbmV0L21pYl9rZXJuLmg+CiNlbmRpZiAgICAgICAgICAgICAgICAgICAgICAgICAgLyogaHB1eCAqLwoKZXh0ZXJuIFdyaXRlTWV0aG9kIHdyaXRlX3J0ZTsKCiNpZiAhZGVmaW5lZCAoV0lOMzIpICYmICFkZWZpbmVkIChjeWd3aW4pCgojaWZkZWYgVVNFX1NZU0NUTF9ST1VURV9EVU1QCgpzdGF0aWMgdm9pZCAgICAgUm91dGVfU2Nhbl9SZWxvYWQodm9pZCk7CgpzdGF0aWMgdW5zaWduZWQgY2hhciAqYWxsX3JvdXRlcyA9IDA7CnN0YXRpYyB1bnNpZ25lZCBjaGFyICphbGxfcm91dGVzX2VuZDsKc3RhdGljIHNpemVfdCAgIGFsbF9yb3V0ZXNfc2l6ZTsKCmV4dGVybiBjb25zdCBzdHJ1Y3Qgc29ja2FkZHIgKmdldF9hZGRyZXNzKGNvbnN0IHZvaWQgKiwgaW50LCBpbnQpOwpleHRlcm4gY29uc3Qgc3RydWN0IGluX2FkZHIgKmdldF9pbl9hZGRyZXNzKGNvbnN0IHZvaWQgKiwgaW50LCBpbnQpOwoKLyoKICogdmFyX2lwUm91dGVFbnRyeSguLi4KICogQXJndW1lbnRzOgogKiB2cCAgICAgICAgICAgSU4gICAgICAtIHBvaW50ZXIgdG8gdmFyaWFibGUgZW50cnkgdGhhdCBwb2ludHMgaGVyZQogKiBuYW1lICAgICAgICAgIElOL09VVCAgLSBJTi9uYW1lIHJlcXVlc3RlZCwgT1VUL25hbWUgZm91bmQKICogbGVuZ3RoICAgICAgICBJTi9PVVQgIC0gbGVuZ3RoIG9mIElOL09VVCBvaWQncyAKICogZXhhY3QgICAgICAgICBJTiAgICAgIC0gVFJVRSBpZiBhbiBleGFjdCBtYXRjaCB3YXMgcmVxdWVzdGVkCiAqIHZhcl9sZW4gICAgICAgT1VUICAgICAtIGxlbmd0aCBvZiB2YXJpYWJsZSBvciAwIGlmIGZ1bmN0aW9uIHJldHVybmVkCiAqIHdyaXRlX21ldGhvZCAgb3V0ICAgICAtIHBvaW50ZXIgdG8gZnVuY3Rpb24gdG8gc2V0IHZhcmlhYmxlLCBvdGhlcndpc2UgMAogKi8KdV9jaGFyICAgICAgICAgKgp2YXJfaXBSb3V0ZUVudHJ5KHN0cnVjdCB2YXJpYWJsZSAqdnAsCiAgICAgICAgICAgICAgICAgb2lkICogbmFtZSwKICAgICAgICAgICAgICAgICBzaXplX3QgKiBsZW5ndGgsCiAgICAgICAgICAgICAgICAgaW50IGV4YWN0LCBzaXplX3QgKiB2YXJfbGVuLCBXcml0ZU1ldGhvZCAqKiB3cml0ZV9tZXRob2QpCnsKICAgIC8qCiAgICAgKiBvYmplY3QgaWRlbnRpZmllciBpcyBvZiBmb3JtOgogICAgICogMS4zLjYuMS4yLjEuNC4yMS4xLjEuQS5CLkMuRCwgIHdoZXJlIEEuQi5DLkQgaXMgSVAgYWRkcmVzcy4KICAgICAqIElQQUREUiBzdGFydHMgYXQgb2Zmc2V0IDEwLgogICAgICovCiAgICBzdHJ1Y3QgcnRfbXNnaGRyICpydHAsICpzYXZlUnRwID0gMDsKICAgIHJlZ2lzdGVyIGludCAgICBTYXZlX1ZhbGlkLCByZXN1bHQ7CiAgICBzdGF0aWMgaW50ICAgICAgc2F2ZU5hbWVMZW4gPSAwLCBzYXZlRXhhY3QgPSAwOwogICAgc3RhdGljIG9pZCAgICAgIHNhdmVOYW1lW01BWF9PSURfTEVOXSwgQ3VycmVudFtNQVhfT0lEX0xFTl07CiAgICB1X2NoYXIgICAgICAgICAqY3A7CiAgICB1X2NoYXIgICAgICAgICAqYXA7CiAgICBvaWQgICAgICAgICAgICAqb3A7CiAgICBzdGF0aWMgaW5fYWRkcl90IGFkZHJfcmV0OwoKICAgICp3cml0ZV9tZXRob2QgPSBOVUxMOyAgLyogd3JpdGVfcnRlOyAgWFhYOiAgU0VUIHN1cHBvcnQgbm90IHJlYWxseSBpbXBsZW1lbnRlZCAqLwoKI2lmIDAKICAvKiogCiAgKiogdGhpcyBvcHRpbWlzYXRpb24gZmFpbHMsIGlmIHRoZXJlIGlzIG9ubHkgYSBzaW5nbGUgcm91dGUgYXZhaWwuCiAgKiogaXQgaXMgYSB2ZXJ5IHNwZWNpYWwgY2FzZSwgYnV0IGJldHRlciBsZWF2ZSBpdCBvdXQgLi4uCiAgKiovCiNpZiAwCiAgICBpZiAocnRzaXplIDw9IDEpCiAgICAgICAgU2F2ZV9WYWxpZCA9IDA7CiAgICBlbHNlCiNlbmRpZiAgICAgICAgICAgICAgICAgICAgICAgICAgLyogMCAqLwogICAgICAgIC8qCiAgICAgICAgICogIE9QVElNSVpBVElPTjoKICAgICAgICAgKgogICAgICAgICAqICBJZiB0aGUgbmFtZSB3YXMgdGhlIHNhbWUgYXMgdGhlIGxhc3QgbmFtZSwgd2l0aCB0aGUgcG9zc2libGUKICAgICAgICAgKiAgZXhjZXB0aW9uIG9mIHRoZSBbOV10aCB0b2tlbiwgdGhlbiBkb24ndCByZWFkIHRoZSByb3V0aW5nIHRhYmxlCiAgICAgICAgICoKICAgICAgICAgKi8KCiAgICBpZiAoKHNhdmVOYW1lTGVuID09ICpsZW5ndGgpICYmIChzYXZlRXhhY3QgPT0gZXhhY3QpKSB7CiAgICAgICAgcmVnaXN0ZXIgaW50ICAgIHRlbXAgPSBuYW1lWzldOwogICAgICAgIG5hbWVbOV0gPSAwOwogICAgICAgIFNhdmVfVmFsaWQgPQogICAgICAgICAgICAoc25tcF9vaWRfY29tcGFyZShuYW1lLCAqbGVuZ3RoLCBzYXZlTmFtZSwgc2F2ZU5hbWVMZW4pID09IDApOwogICAgICAgIG5hbWVbOV0gPSB0ZW1wOwogICAgfSBlbHNlCiAgICAgICAgU2F2ZV9WYWxpZCA9IDA7CgogICAgaWYgKFNhdmVfVmFsaWQgJiYgc2F2ZVJ0cCkgewogICAgICAgIHJlZ2lzdGVyIGludCAgICB0ZW1wID0gbmFtZVs5XTsgLyogRml4IHVwICdsb3dlc3QnIGZvdW5kIGVudHJ5ICovCiAgICAgICAgbWVtY3B5KChjaGFyICopIG5hbWUsIChjaGFyICopIEN1cnJlbnQsIDE0ICogc2l6ZW9mKG9pZCkpOwogICAgICAgIG5hbWVbOV0gPSB0ZW1wOwogICAgICAgICpsZW5ndGggPSAxNDsKICAgICAgICBydHAgPSBzYXZlUnRwOwogICAgfSBlbHNlIHsKI2VuZGlmICAgICAgICAgICAgICAgICAgICAgICAgICAvKiAwICovCiAgICAgICAgLyoKICAgICAgICAgKiBmaWxsIGluIG9iamVjdCBwYXJ0IG9mIG5hbWUgZm9yIGN1cnJlbnQgKGxlc3Mgc2l6ZW9mIGluc3RhbmNlIHBhcnQpIAogICAgICAgICAqLwoKICAgICAgICBtZW1jcHkoKGNoYXIgKikgQ3VycmVudCwgKGNoYXIgKikgdnAtPm5hbWUsCiAgICAgICAgICAgICAgIChpbnQpICh2cC0+bmFtZWxlbikgKiBzaXplb2Yob2lkKSk7CgojaWYgMAogICAgICAgIC8qCiAgICAgICAgICogIE9ubHkgcmVsb2FkIGlmIHRoaXMgaXMgdGhlIHN0YXJ0IG9mIGEgd2lsZGNhcmQKICAgICAgICAgKi8KICAgICAgICBpZiAoKmxlbmd0aCA8IDE0KSB7CiAgICAgICAgICAgIFJvdXRlX1NjYW5fUmVsb2FkKCk7CiAgICAgICAgfQojZWxzZQogICAgICAgIFJvdXRlX1NjYW5fUmVsb2FkKCk7CiNlbmRpZgogICAgICAgIGZvciAoYXAgPSBhbGxfcm91dGVzOyBhcCA8IGFsbF9yb3V0ZXNfZW5kOyBhcCArPSBydHAtPnJ0bV9tc2dsZW4pIHsKICAgICAgICAgICAgcnRwID0gKHN0cnVjdCBydF9tc2doZHIgKikgYXA7CiAgICAgICAgICAgIGlmIChydHAtPnJ0bV90eXBlID09IDApCiAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgaWYgKHJ0cC0+cnRtX3ZlcnNpb24gIT0gUlRNX1ZFUlNJT04pIHsKICAgICAgICAgICAgICAgIHNubXBfbG9nKExPR19FUlIsCiAgICAgICAgICAgICAgICAgICAgICAgICAicm91dGluZyBzb2NrZXQgbWVzc2FnZSB2ZXJzaW9uIG1pc21hdGNoICglZCBpbnN0ZWFkIG9mICVkKVxuIiwKICAgICAgICAgICAgICAgICAgICAgICAgIHJ0cC0+cnRtX3ZlcnNpb24sIFJUTV9WRVJTSU9OKTsKICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmIChydHAtPnJ0bV90eXBlICE9IFJUTV9HRVQpIHsKICAgICAgICAgICAgICAgIHNubXBfbG9nKExPR19FUlIsCiAgICAgICAgICAgICAgICAgICAgICAgICAicm91dGluZyBzb2NrZXQgcmV0dXJuZWQgbWVzc2FnZSBvdGhlciB0aGFuIEdFVCAoJWQpXG4iLAogICAgICAgICAgICAgICAgICAgICAgICAgcnRwLT5ydG1fdHlwZSk7CiAgICAgICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAoIShydHAtPnJ0bV9hZGRycyAmIFJUQV9EU1QpKQogICAgICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgICAgIGNwID0gKHVfY2hhciAqKSBnZXRfaW5fYWRkcmVzcygoc3RydWN0IHNvY2thZGRyICopIChydHAgKyAxKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJ0cC0+cnRtX2FkZHJzLCBSVEFfRFNUKTsKICAgICAgICAgICAgaWYgKGNwID09IE5VTEwpCiAgICAgICAgICAgICAgICByZXR1cm4gTlVMTDsKCiAgICAgICAgICAgIG9wID0gQ3VycmVudCArIDEwOwogICAgICAgICAgICAqb3ArKyA9ICpjcCsrOwogICAgICAgICAgICAqb3ArKyA9ICpjcCsrOwogICAgICAgICAgICAqb3ArKyA9ICpjcCsrOwogICAgICAgICAgICAqb3ArKyA9ICpjcCsrOwoKICAgICAgICAgICAgcmVzdWx0ID0gc25tcF9vaWRfY29tcGFyZShuYW1lLCAqbGVuZ3RoLCBDdXJyZW50LCAxNCk7CiAgICAgICAgICAgIGlmICgoZXhhY3QgJiYgKHJlc3VsdCA9PSAwKSkgfHwgKCFleGFjdCAmJiAocmVzdWx0IDwgMCkpKQogICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgfQogICAgICAgIGlmIChhcCA+PSBhbGxfcm91dGVzX2VuZCB8fCBydHAtPnJ0bV90eXBlID09IDApCiAgICAgICAgICAgIHJldHVybiAwOwogICAgICAgIC8qCiAgICAgICAgICogIFNhdmUgaW4gdGhlICdjYWNoZScKICAgICAgICAgKi8KICAgICAgICBtZW1jcHkoKGNoYXIgKikgc2F2ZU5hbWUsIChjaGFyICopIG5hbWUsCiAgICAgICAgICAgICAgIFNOTVBfTUlOKCpsZW5ndGgsIE1BWF9PSURfTEVOKSAqIHNpemVvZihvaWQpKTsKICAgICAgICBzYXZlTmFtZVs5XSA9ICdcMCc7CiAgICAgICAgc2F2ZU5hbWVMZW4gPSAqbGVuZ3RoOwogICAgICAgIHNhdmVFeGFjdCA9IGV4YWN0OwogICAgICAgIHNhdmVSdHAgPSBydHA7CiAgICAgICAgLyoKICAgICAgICAgKiAgUmV0dXJuIHRoZSBuYW1lCiAgICAgICAgICovCiAgICAgICAgbWVtY3B5KChjaGFyICopIG5hbWUsIChjaGFyICopIEN1cnJlbnQsIDE0ICogc2l6ZW9mKG9pZCkpOwogICAgICAgICpsZW5ndGggPSAxNDsKI2lmIDAKICAgIH0KI2VuZGlmICAgICAgICAgICAgICAgICAgICAgICAgICAvKiAwICovCgogICAgKnZhcl9sZW4gPSBzaXplb2YobG9uZ19yZXR1cm4pOwoKICAgIHN3aXRjaCAodnAtPm1hZ2ljKSB7CiAgICBjYXNlIElQUk9VVEVERVNUOgogICAgCSp2YXJfbGVuID0gc2l6ZW9mKGFkZHJfcmV0KTsKICAgICAgICByZXR1cm4gKHVfY2hhciAqKSBnZXRfaW5fYWRkcmVzcygoc3RydWN0IHNvY2thZGRyICopIChydHAgKyAxKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBydHAtPnJ0bV9hZGRycywgUlRBX0RTVCk7CiAgICBjYXNlIElQUk9VVEVJRklOREVYOgogICAgICAgIGxvbmdfcmV0dXJuID0gKHVfbG9uZykgcnRwLT5ydG1faW5kZXg7CiAgICAgICAgcmV0dXJuICh1X2NoYXIgKikgJiBsb25nX3JldHVybjsKICAgIGNhc2UgSVBST1VURU1FVFJJQzE6CiAgICAgICAgbG9uZ19yZXR1cm4gPSAocnRwLT5ydG1fZmxhZ3MgJiBSVEZfVVApID8gMSA6IDA7CiAgICAgICAgcmV0dXJuICh1X2NoYXIgKikgJiBsb25nX3JldHVybjsKICAgIGNhc2UgSVBST1VURU1FVFJJQzI6CiNpZiBORVRTTk1QX05PX0RVTU1ZX1ZBTFVFUwogICAgICAgIHJldHVybiBOVUxMOwojZW5kaWYKICAgICAgICBsb25nX3JldHVybiA9IC0xOwogICAgICAgIHJldHVybiAodV9jaGFyICopICYgbG9uZ19yZXR1cm47CiAgICBjYXNlIElQUk9VVEVNRVRSSUMzOgojaWYgTkVUU05NUF9OT19EVU1NWV9WQUxVRVMKICAgICAgICByZXR1cm4gTlVMTDsKI2VuZGlmCiAgICAgICAgbG9uZ19yZXR1cm4gPSAtMTsKICAgICAgICByZXR1cm4gKHVfY2hhciAqKSAmIGxvbmdfcmV0dXJuOwogICAgY2FzZSBJUFJPVVRFTUVUUklDNDoKI2lmIE5FVFNOTVBfTk9fRFVNTVlfVkFMVUVTCiAgICAgICAgcmV0dXJuIE5VTEw7CiNlbmRpZgogICAgICAgIGxvbmdfcmV0dXJuID0gLTE7CiAgICAgICAgcmV0dXJuICh1X2NoYXIgKikgJiBsb25nX3JldHVybjsKICAgIGNhc2UgSVBST1VURU1FVFJJQzU6CiNpZiBORVRTTk1QX05PX0RVTU1ZX1ZBTFVFUwogICAgICAgIHJldHVybiBOVUxMOwojZW5kaWYKICAgICAgICBsb25nX3JldHVybiA9IC0xOwogICAgICAgIHJldHVybiAodV9jaGFyICopICYgbG9uZ19yZXR1cm47CiAgICBjYXNlIElQUk9VVEVORVhUSE9QOgogICAgCSp2YXJfbGVuID0gc2l6ZW9mKGFkZHJfcmV0KTsKICAgIAlyZXR1cm4gKHVfY2hhciAqKSBnZXRfaW5fYWRkcmVzcygoc3RydWN0IHNvY2thZGRyICopIChydHAgKyAxKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBydHAtPnJ0bV9hZGRycywgUlRBX0dBVEVXQVkpOwogICAgY2FzZSBJUFJPVVRFVFlQRToKICAgICAgICBpZiAocnRwLT5ydG1fZmxhZ3MgJiBSVEZfVVApIHsKICAgICAgICAgICAgaWYgKHJ0cC0+cnRtX2ZsYWdzICYgUlRGX0dBVEVXQVkpIHsKICAgICAgICAgICAgICAgIGxvbmdfcmV0dXJuID0gNDsgICAgICAgIC8qICBpbmRpcmVjdCg0KSAgKi8KICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgIGxvbmdfcmV0dXJuID0gMzsgICAgICAgIC8qICBkaXJlY3QoMykgICovCiAgICAgICAgICAgIH0KICAgICAgICB9IGVsc2UgewogICAgICAgICAgICBsb25nX3JldHVybiA9IDI7ICAgIC8qICBpbnZhbGlkKDIpICAqLwogICAgICAgIH0KICAgICAgICByZXR1cm4gKHVfY2hhciAqKSAmIGxvbmdfcmV0dXJuOwogICAgY2FzZSBJUFJPVVRFUFJPVE86CiAgICAgICAgbG9uZ19yZXR1cm4gPSAocnRwLT5ydG1fZmxhZ3MgJiBSVEZfRFlOQU1JQykKICAgICAgICAgICAgPyAxMCA6IChydHAtPnJ0bV9mbGFncyAmIFJURl9TVEFUSUMpCiAgICAgICAgICAgID8gMiA6IChydHAtPnJ0bV9mbGFncyAmIFJURl9EWU5BTUlDKSA/IDQgOiAxOwogICAgICAgIHJldHVybiAodV9jaGFyICopICYgbG9uZ19yZXR1cm47CiAgICBjYXNlIElQUk9VVEVBR0U6CiNpZiBORVRTTk1QX05PX0RVTU1ZX1ZBTFVFUwogICAgICAgIHJldHVybiBOVUxMOwojZW5kaWYKICAgICAgICBsb25nX3JldHVybiA9IDA7CiAgICAgICAgcmV0dXJuICh1X2NoYXIgKikgJiBsb25nX3JldHVybjsKICAgIGNhc2UgSVBST1VURU1BU0s6CiAgICAJKnZhcl9sZW4gPSBzaXplb2YoYWRkcl9yZXQpOyAgIAkgICAgIAogICAgICAgIGlmIChydHAtPnJ0bV9mbGFncyAmIFJURl9IT1NUKSB7CiAgICAgICAgICAgIGFkZHJfcmV0ID0gMHgwMDAwMDAwMTsKICAgICAgICAgICAgcmV0dXJuICh1X2NoYXIgKikgJiBhZGRyX3JldDsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgICByZXR1cm4gKHVfY2hhciAqKSBnZXRfaW5fYWRkcmVzcygoc3RydWN0IHNvY2thZGRyICopIChydHAgKyAxKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcnRwLT5ydG1fYWRkcnMsIFJUQV9ORVRNQVNLKTsKICAgICAgICB9CiAgICBjYXNlIElQUk9VVEVJTkZPOgogICAgICAgICp2YXJfbGVuID0gbnVsbE9pZExlbjsKICAgICAgICByZXR1cm4gKHVfY2hhciAqKSBudWxsT2lkOwogICAgZGVmYXVsdDoKICAgICAgICBERUJVR01TR1RMKCgic25tcGQiLCAidW5rbm93biBzdWItaWQgJWQgaW4gdmFyX2lwUm91dGVFbnRyeVxuIiwKICAgICAgICAgICAgICAgICAgICB2cC0+bWFnaWMpKTsKICAgIH0KICAgIHJldHVybiBOVUxMOwp9CgojZWxzZSAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIG5vdCBVU0VfU1lTQ1RMX1JPVVRFX0RVTVAgKi8KCiNpZmRlZiBocHV4MTEKc3RhdGljIGludCAgICAgIHJ0c2l6ZSA9IDA7CnN0YXRpYyBtaWJfaXBSb3V0ZUVudCAqcnQgPSAobWliX2lwUm91dGVFbnQgKikgMDsKc3RhdGljIHZvaWQgICAgIFJvdXRlX1NjYW5fUmVsb2FkKHZvaWQpOwojZWxpZiAhZGVmaW5lZChzb2xhcmlzMikKc3RhdGljIFJURU5UUlkgKipydGhlYWQgPSAwOwpzdGF0aWMgaW50ICAgICAgcnRzaXplID0gMCwgcnRhbGxvY2F0ZSA9IDA7CgpzdGF0aWMgdm9pZCAgICAgUm91dGVfU2Nhbl9SZWxvYWQodm9pZCk7CgpSVEVOVFJZICoqbmV0c25tcF9nZXRfcm91dGVzKHNpemVfdCAqc2l6ZSkgewogICAgUm91dGVfU2Nhbl9SZWxvYWQoKTsKICAgIGlmIChzaXplKQogICAgICAgICpzaXplID0gcnRzaXplOwogICAgcmV0dXJuIHJ0aGVhZDsKfQojZW5kaWYgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGhwdXgxMSAqLwoKI2lmICEoZGVmaW5lZChsaW51eCkgfHwgZGVmaW5lZChzb2xhcmlzMikgfHwgZGVmaW5lZChocHV4MTEpKSAmJiBkZWZpbmVkKFJUSE9TVF9TWU1CT0wpICYmIGRlZmluZWQoUlRORVRfU1lNQk9MKQojZGVmaW5lIE5VTV9ST1VURV9TWU1CT0xTIDIKc3RhdGljIGNoYXIgICAgKnJvdXRlX3N5bWJvbHNbXSA9IHsKICAgIFJUSE9TVF9TWU1CT0wsCiAgICBSVE5FVF9TWU1CT0wKfTsKI2VuZGlmCiNlbmRpZgoKI2lmZGVmIFVTRV9TWVNDVExfUk9VVEVfRFVNUAoKdm9pZAppbml0X3Zhcl9yb3V0ZSh2b2lkKQp7CiNpZmRlZiBzb2xhcmlzMgogICAgaW5pdF9rZXJuZWxfc3Vub3M1KCk7CiNlbmRpZgp9CgpzdGF0aWMgdm9pZApSb3V0ZV9TY2FuX1JlbG9hZCh2b2lkKQp7CiAgICBzaXplX3QgICAgICAgICAgc2l6ZSA9IDA7CiAgICBpbnQgICAgICAgICAgICAgbmFtZVtdID0geyBDVExfTkVULCBQRl9ST1VURSwgMCwgMCwgTkVUX1JUX0RVTVAsIDAgfTsKCiAgICBpZiAoc3lzY3RsKG5hbWUsIHNpemVvZihuYW1lKSAvIHNpemVvZihpbnQpLCAwLCAmc2l6ZSwgMCwgMCkgPT0gLTEpIHsKICAgICAgICBzbm1wX2xvZyhMT0dfRVJSLCAic3lzY3RsKENUTF9ORVQsUEZfUk9VVEUsMCwwLE5FVF9SVF9EVU1QLDApXG4iKTsKICAgIH0gZWxzZSB7CiAgICAgICAgaWYgKGFsbF9yb3V0ZXMgPT0gMCB8fCBhbGxfcm91dGVzX3NpemUgPCBzaXplKSB7CiAgICAgICAgICAgIGlmIChhbGxfcm91dGVzICE9IDApIHsKICAgICAgICAgICAgICAgIGZyZWUoYWxsX3JvdXRlcyk7CiAgICAgICAgICAgICAgICBhbGxfcm91dGVzID0gMDsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAoKGFsbF9yb3V0ZXMgPSBtYWxsb2Moc2l6ZSkpID09IDApIHsKICAgICAgICAgICAgICAgIHNubXBfbG9nKExPR19FUlIsCiAgICAgICAgICAgICAgICAgICAgICAgICAib3V0IG9mIG1lbW9yeSBhbGxvY2F0aW5nIHJvdXRlIHRhYmxlXG4iKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBhbGxfcm91dGVzX3NpemUgPSBzaXplOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIHNpemUgPSBhbGxfcm91dGVzX3NpemU7CiAgICAgICAgfQogICAgICAgIGlmIChzeXNjdGwobmFtZSwgc2l6ZW9mKG5hbWUpIC8gc2l6ZW9mKGludCksCiAgICAgICAgICAgICAgICAgICBhbGxfcm91dGVzLCAmc2l6ZSwgMCwgMCkgPT0gLTEpIHsKICAgICAgICAgICAgc25tcF9sb2coTE9HX0VSUiwKICAgICAgICAgICAgICAgICAgICAgInN5c2N0bChDVExfTkVULFBGX1JPVVRFLDAsMCxORVRfUlRfRFVNUCwwKVxuIik7CiAgICAgICAgfQogICAgICAgIGFsbF9yb3V0ZXNfZW5kID0gYWxsX3JvdXRlcyArIHNpemU7CiAgICB9Cn0KCiNlbHNlICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogbm90IFVTRV9TWVNDVExfUk9VVEVfRFVNUCAqLwoKdm9pZAppbml0X3Zhcl9yb3V0ZSh2b2lkKQp7CiNpZmRlZiBSVFRBQkxFU19TWU1CT0wKICAgIGF1dG9fbmxpc3QoUlRUQUJMRVNfU1lNQk9MLCAwLCAwKTsKI2VuZGlmCiNpZmRlZiBSVEhBU0hTSVpFX1NZTUJPTAogICAgYXV0b19ubGlzdChSVEhBU0hTSVpFX1NZTUJPTCwgMCwgMCk7CiNlbmRpZgojaWZkZWYgUlRIT1NUX1NZTUJPTAogICAgYXV0b19ubGlzdChSVEhPU1RfU1lNQk9MLCAwLCAwKTsKI2VuZGlmCiNpZmRlZiBSVE5FVF9TWU1CT0wKICAgIGF1dG9fbmxpc3QoUlRORVRfU1lNQk9MLCAwLCAwKTsKI2VuZGlmCn0KCiNpZm5kZWYgc29sYXJpczIKCiNpZiBORUVEX0tMR0VUU0EKc3RhdGljIHVuaW9uIHsKICAgIHN0cnVjdCBzb2NrYWRkcl9pbiBzaW47CiAgICB1X3Nob3J0ICAgICAgICAgZGF0YVsxMjhdOwp9IGtsZ2V0c2F0bXA7CgpzdHJ1Y3Qgc29ja2FkZHJfaW4gKgprbGdldHNhKHN0cnVjdCBzb2NrYWRkcl9pbiAqZHN0KQp7CiAgICBpZiAoIU5FVFNOTVBfS0xPT0tVUChkc3QsIChjaGFyICopICZrbGdldHNhdG1wLnNpbiwgc2l6ZW9mIGtsZ2V0c2F0bXAuc2luKSkgewogICAgICAgIERFQlVHTVNHVEwoKCJtaWJJSS92YXJfcm91dGUiLCAia2xvb2t1cCBmYWlsZWRcbiIpKTsKICAgICAgICByZXR1cm4gTlVMTDsKICAgIH0KICAgIGlmIChrbGdldHNhdG1wLnNpbi5zaW5fbGVuID4gc2l6ZW9mKGtsZ2V0c2F0bXAuc2luKSkgewogICAgICAgIGlmICghTkVUU05NUF9LTE9PS1VQKGRzdCwgKGNoYXIgKikgJmtsZ2V0c2F0bXAuc2luLCBrbGdldHNhdG1wLnNpbi5zaW5fbGVuKSkgewogICAgICAgICAgICBERUJVR01TR1RMKCgibWliSUkvdmFyX3JvdXRlIiwgImtsb29rdXAgZmFpbGVkXG4iKSk7CiAgICAgICAgICAgIHJldHVybiBOVUxMOwogICAgICAgIH0KICAgIH0KICAgIHJldHVybiAoJmtsZ2V0c2F0bXAuc2luKTsKfQojZW5kaWYKCnVfY2hhciAgICAgICAgICoKdmFyX2lwUm91dGVFbnRyeShzdHJ1Y3QgdmFyaWFibGUgKiB2cCwKICAgICAgICAgICAgICAgICBvaWQgKiBuYW1lLAogICAgICAgICAgICAgICAgIHNpemVfdCAqIGxlbmd0aCwKICAgICAgICAgICAgICAgICBpbnQgZXhhY3QsIHNpemVfdCAqIHZhcl9sZW4sIFdyaXRlTWV0aG9kICoqIHdyaXRlX21ldGhvZCkKewogICAgLyoKICAgICAqIG9iamVjdCBpZGVudGlmaWVyIGlzIG9mIGZvcm06CiAgICAgKiAxLjMuNi4xLjIuMS40LjIxLjEuMS5BLkIuQy5ELCAgd2hlcmUgQS5CLkMuRCBpcyBJUCBhZGRyZXNzLgogICAgICogSVBBRERSIHN0YXJ0cyBhdCBvZmZzZXQgMTAuCiAgICAgKi8KICAgIHJlZ2lzdGVyIGludCAgICBTYXZlX1ZhbGlkLCByZXN1bHQsIFJ0SW5kZXg7CiAgICBzdGF0aWMgaW50ICAgICAgc2F2ZU5hbWVMZW4gPSAwLCBzYXZlRXhhY3QgPSAwLCBzYXZlUnRJbmRleCA9IDA7CiAgICBzdGF0aWMgb2lkICAgICAgc2F2ZU5hbWVbTUFYX09JRF9MRU5dLCBDdXJyZW50W01BWF9PSURfTEVOXTsKICAgIHVfY2hhciAgICAgICAgICpjcDsKICAgIG9pZCAgICAgICAgICAgICpvcDsKICAgIHN0YXRpYyBpbl9hZGRyX3QgYWRkcl9yZXQ7CiNpZiBORUVEX0tMR0VUU0EKICAgIHN0cnVjdCBzb2NrYWRkcl9pbiAqc2E7CiNlbmRpZgojaWYgIWRlZmluZWQobGludXgpICYmICFkZWZpbmVkKGhwdXgxMSkKICAgIHN0cnVjdCBpZm5ldCAgICBydF9pZm5ldDsKICAgIHN0cnVjdCBpbl9pZmFkZHIgcnRfaWZuZXRhZGRyOwojZW5kaWYKCiAgICAqd3JpdGVfbWV0aG9kID0gTlVMTDsgIC8qIHdyaXRlX3J0ZTsgIFhYWDogIFNFVCBzdXBwb3J0IG5vdCByZWFsbHkgaW1wbGVtZW50ZWQgKi8KCiAgICAvKiogCiAgICAgKiogdGhpcyBvcHRpbWlzYXRpb24gZmFpbHMsIGlmIHRoZXJlIGlzIG9ubHkgYSBzaW5nbGUgcm91dGUgYXZhaWwuCiAgICAgKiogaXQgaXMgYSB2ZXJ5IHNwZWNpYWwgY2FzZSwgYnV0IGJldHRlciBsZWF2ZSBpdCBvdXQgLi4uCiAgICAgKiovCiNpZiBORVRTTk1QX05PX0RVTU1ZX1ZBTFVFUwogICAgc2F2ZU5hbWVMZW4gPSAwOwojZW5kaWYKICAgIGlmIChydHNpemUgPD0gMSkKICAgICAgICBTYXZlX1ZhbGlkID0gMDsKICAgIGVsc2UKICAgICAgICAvKgogICAgICAgICAqICBPUFRJTUlaQVRJT046CiAgICAgICAgICoKICAgICAgICAgKiAgSWYgdGhlIG5hbWUgd2FzIHRoZSBzYW1lIGFzIHRoZSBsYXN0IG5hbWUsIHdpdGggdGhlIHBvc3NpYmxlCiAgICAgICAgICogIGV4Y2VwdGlvbiBvZiB0aGUgWzlddGggdG9rZW4sIHRoZW4gZG9uJ3QgcmVhZCB0aGUgcm91dGluZyB0YWJsZQogICAgICAgICAqCiAgICAgICAgICovCgogICAgaWYgKChzYXZlTmFtZUxlbiA9PSAqbGVuZ3RoKSAmJiAoc2F2ZUV4YWN0ID09IGV4YWN0KSkgewogICAgICAgIHJlZ2lzdGVyIGludCAgICB0ZW1wID0gbmFtZVs5XTsKICAgICAgICBuYW1lWzldID0gMDsKICAgICAgICBTYXZlX1ZhbGlkID0KICAgICAgICAgICAgKHNubXBfb2lkX2NvbXBhcmUobmFtZSwgKmxlbmd0aCwgc2F2ZU5hbWUsIHNhdmVOYW1lTGVuKSA9PSAwKTsKICAgICAgICBuYW1lWzldID0gdGVtcDsKICAgIH0gZWxzZQogICAgICAgIFNhdmVfVmFsaWQgPSAwOwoKICAgIGlmIChTYXZlX1ZhbGlkKSB7CiAgICAgICAgcmVnaXN0ZXIgaW50ICAgIHRlbXAgPSBuYW1lWzldOyAvKiBGaXggdXAgJ2xvd2VzdCcgZm91bmQgZW50cnkgKi8KICAgICAgICBtZW1jcHkoKGNoYXIgKikgbmFtZSwgKGNoYXIgKikgQ3VycmVudCwgMTQgKiBzaXplb2Yob2lkKSk7CiAgICAgICAgbmFtZVs5XSA9IHRlbXA7CiAgICAgICAgKmxlbmd0aCA9IDE0OwogICAgICAgIFJ0SW5kZXggPSBzYXZlUnRJbmRleDsKICAgIH0gZWxzZSB7CiAgICAgICAgLyoKICAgICAgICAgKiBmaWxsIGluIG9iamVjdCBwYXJ0IG9mIG5hbWUgZm9yIGN1cnJlbnQgKGxlc3Mgc2l6ZW9mIGluc3RhbmNlIHBhcnQpIAogICAgICAgICAqLwoKICAgICAgICBtZW1jcHkoKGNoYXIgKikgQ3VycmVudCwgKGNoYXIgKikgdnAtPm5hbWUsCiAgICAgICAgICAgICAgIChpbnQpICh2cC0+bmFtZWxlbikgKiBzaXplb2Yob2lkKSk7CgojaWYgMAogICAgICAgIC8qCiAgICAgICAgICogIE9ubHkgcmVsb2FkIGlmIHRoaXMgaXMgdGhlIHN0YXJ0IG9mIGEgd2lsZGNhcmQKICAgICAgICAgKi8KICAgICAgICBpZiAoKmxlbmd0aCA8IDE0KSB7CiAgICAgICAgICAgIFJvdXRlX1NjYW5fUmVsb2FkKCk7CiAgICAgICAgfQojZWxzZQogICAgICAgIFJvdXRlX1NjYW5fUmVsb2FkKCk7CiNlbmRpZgogICAgICAgIGZvciAoUnRJbmRleCA9IDA7IFJ0SW5kZXggPCBydHNpemU7IFJ0SW5kZXgrKykgewojaWYgTkVFRF9LTEdFVFNBCiAgICAgICAgICAgIHNhID0ga2xnZXRzYSgoc3RydWN0IHNvY2thZGRyX2luICopIHJ0aGVhZFtSdEluZGV4XS0+cnRfZHN0KTsKICAgICAgICAgICAgY3AgPSAodV9jaGFyICopICYgKHNhLT5zaW5fYWRkci5zX2FkZHIpOwojZWxpZiBkZWZpbmVkKGhwdXgxMSkKICAgICAgICAgICAgY3AgPSAodV9jaGFyICopICYgcnRbUnRJbmRleF0uRGVzdDsKI2Vsc2UKICAgICAgICAgICAgY3AgPSAodV9jaGFyICopICYKICAgICAgICAgICAgICAgICgoKHN0cnVjdCBzb2NrYWRkcl9pbiAqKSAmKHJ0aGVhZFtSdEluZGV4XS0+cnRfZHN0KSktPgogICAgICAgICAgICAgICAgIHNpbl9hZGRyLnNfYWRkcik7CiNlbmRpZgogICAgICAgICAgICBvcCA9IEN1cnJlbnQgKyAxMDsKICAgICAgICAgICAgKm9wKysgPSAqY3ArKzsKICAgICAgICAgICAgKm9wKysgPSAqY3ArKzsKICAgICAgICAgICAgKm9wKysgPSAqY3ArKzsKICAgICAgICAgICAgKm9wKysgPSAqY3ArKzsKCiAgICAgICAgICAgIHJlc3VsdCA9IHNubXBfb2lkX2NvbXBhcmUobmFtZSwgKmxlbmd0aCwgQ3VycmVudCwgMTQpOwogICAgICAgICAgICBpZiAoKGV4YWN0ICYmIChyZXN1bHQgPT0gMCkpIHx8ICghZXhhY3QgJiYgKHJlc3VsdCA8IDApKSkKICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgIH0KICAgICAgICBpZiAoUnRJbmRleCA+PSBydHNpemUpCiAgICAgICAgICAgIHJldHVybiAoTlVMTCk7CiAgICAgICAgLyoKICAgICAgICAgKiAgU2F2ZSBpbiB0aGUgJ2NhY2hlJwogICAgICAgICAqLwogICAgICAgIG1lbWNweSgoY2hhciAqKSBzYXZlTmFtZSwgKGNoYXIgKikgbmFtZSwKICAgICAgICAgICAgICAgU05NUF9NSU4oKmxlbmd0aCwgTUFYX09JRF9MRU4pICogc2l6ZW9mKG9pZCkpOwogICAgICAgIHNhdmVOYW1lWzldID0gMDsKICAgICAgICBzYXZlTmFtZUxlbiA9ICpsZW5ndGg7CiAgICAgICAgc2F2ZUV4YWN0ID0gZXhhY3Q7CiAgICAgICAgc2F2ZVJ0SW5kZXggPSBSdEluZGV4OwogICAgICAgIC8qCiAgICAgICAgICogIFJldHVybiB0aGUgbmFtZQogICAgICAgICAqLwogICAgICAgIG1lbWNweSgoY2hhciAqKSBuYW1lLCAoY2hhciAqKSBDdXJyZW50LCAxNCAqIHNpemVvZihvaWQpKTsKICAgICAgICAqbGVuZ3RoID0gMTQ7CiAgICB9CgogICAgKnZhcl9sZW4gPSBzaXplb2YobG9uZ19yZXR1cm4pOwoKICAgIHN3aXRjaCAodnAtPm1hZ2ljKSB7CiAgICBjYXNlIElQUk9VVEVERVNUOgogICAgICAgICp2YXJfbGVuID0gc2l6ZW9mKGFkZHJfcmV0KTsKI2lmIE5FRURfS0xHRVRTQQogICAgICAgIHNhID0ga2xnZXRzYSgoc3RydWN0IHNvY2thZGRyX2luICopIHJ0aGVhZFtSdEluZGV4XS0+cnRfZHN0KTsKICAgICAgICByZXR1cm4gKHVfY2hhciAqKSAmIChzYS0+c2luX2FkZHIuc19hZGRyKTsKI2VsaWYgZGVmaW5lZChocHV4MTEpCiAgICAgICAgYWRkcl9yZXQgPSBydFtSdEluZGV4XS5EZXN0OwogICAgICAgIHJldHVybiAodV9jaGFyICopICYgYWRkcl9yZXQ7CiNlbHNlCiAgICAgICAgcmV0dXJuICh1X2NoYXIgKikgJiAoKHN0cnVjdCBzb2NrYWRkcl9pbiAqKSAmcnRoZWFkW1J0SW5kZXhdLT4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICBydF9kc3QpLT5zaW5fYWRkci5zX2FkZHI7CiNlbmRpZgogICAgY2FzZSBJUFJPVVRFSUZJTkRFWDoKI2lmZGVmIGhwdXgxMQogICAgICAgIGxvbmdfcmV0dXJuID0gcnRbUnRJbmRleF0uSWZJbmRleDsKI2Vsc2UKICAgICAgICBsb25nX3JldHVybiA9ICh1X2xvbmcpIHJ0aGVhZFtSdEluZGV4XS0+cnRfdW5pdDsKI2VuZGlmCiAgICAgICAgcmV0dXJuICh1X2NoYXIgKikgJiBsb25nX3JldHVybjsKICAgIGNhc2UgSVBST1VURU1FVFJJQzE6CiNpZmRlZiBocHV4MTEKICAgICAgICBsb25nX3JldHVybiA9IHJ0W1J0SW5kZXhdLk1ldHJpYzE7CiNlbHNlCiAgICAgICAgbG9uZ19yZXR1cm4gPSAocnRoZWFkW1J0SW5kZXhdLT5ydF9mbGFncyAmIFJURl9HQVRFV0FZKSA/IDEgOiAwOwojZW5kaWYKICAgICAgICByZXR1cm4gKHVfY2hhciAqKSAmIGxvbmdfcmV0dXJuOwogICAgY2FzZSBJUFJPVVRFTUVUUklDMjoKI2lmZGVmIGhwdXgxMQogICAgICAgIGxvbmdfcmV0dXJuID0gcnRbUnRJbmRleF0uTWV0cmljMjsKICAgICAgICByZXR1cm4gKHVfY2hhciAqKSAmIGxvbmdfcmV0dXJuOwojZWxpZiBkZWZpbmVkKE5FVFNOTVBfTk9fRFVNTVlfVkFMVUVTKQogICAgICAgIHJldHVybiBOVUxMOwojZW5kaWYKICAgICAgICBsb25nX3JldHVybiA9IC0xOwogICAgICAgIHJldHVybiAodV9jaGFyICopICYgbG9uZ19yZXR1cm47CiAgICBjYXNlIElQUk9VVEVNRVRSSUMzOgojaWZkZWYgaHB1eDExCiAgICAgICAgbG9uZ19yZXR1cm4gPSBydFtSdEluZGV4XS5NZXRyaWMzOwogICAgICAgIHJldHVybiAodV9jaGFyICopICYgbG9uZ19yZXR1cm47CiNlbGlmIGRlZmluZWQoTkVUU05NUF9OT19EVU1NWV9WQUxVRVMpCiAgICAgICAgcmV0dXJuIE5VTEw7CiNlbmRpZgogICAgICAgIGxvbmdfcmV0dXJuID0gLTE7CiAgICAgICAgcmV0dXJuICh1X2NoYXIgKikgJiBsb25nX3JldHVybjsKICAgIGNhc2UgSVBST1VURU1FVFJJQzQ6CiNpZmRlZiBocHV4MTEKICAgICAgICBsb25nX3JldHVybiA9IHJ0W1J0SW5kZXhdLk1ldHJpYzQ7CiAgICAgICAgcmV0dXJuICh1X2NoYXIgKikgJiBsb25nX3JldHVybjsKI2VsaWYgZGVmaW5lZChORVRTTk1QX05PX0RVTU1ZX1ZBTFVFUykKICAgICAgICByZXR1cm4gTlVMTDsKI2VuZGlmCiAgICAgICAgbG9uZ19yZXR1cm4gPSAtMTsKICAgICAgICByZXR1cm4gKHVfY2hhciAqKSAmIGxvbmdfcmV0dXJuOwogICAgY2FzZSBJUFJPVVRFTUVUUklDNToKI2lmIE5FVFNOTVBfTk9fRFVNTVlfVkFMVUVTCiAgICAgICAgcmV0dXJuIE5VTEw7CiNlbmRpZgogICAgICAgIGxvbmdfcmV0dXJuID0gLTE7CiAgICAgICAgcmV0dXJuICh1X2NoYXIgKikgJiBsb25nX3JldHVybjsKICAgIGNhc2UgSVBST1VURU5FWFRIT1A6CiAgICAgICAgKnZhcl9sZW4gPSBzaXplb2YoYWRkcl9yZXQpOwojaWYgTkVFRF9LTEdFVFNBCiAgICAgICAgc2EgPSBrbGdldHNhKChzdHJ1Y3Qgc29ja2FkZHJfaW4gKikgcnRoZWFkW1J0SW5kZXhdLT5ydF9nYXRld2F5KTsKICAgICAgICByZXR1cm4gKHVfY2hhciAqKSAmIChzYS0+c2luX2FkZHIuc19hZGRyKTsKI2VsaWYgZGVmaW5lZChocHV4MTEpCiAgICAgICAgYWRkcl9yZXQgPSBydFtSdEluZGV4XS5OZXh0SG9wOwogICAgICAgIHJldHVybiAodV9jaGFyICopICYgYWRkcl9yZXQ7CiNlbHNlCiAgICAgICAgcmV0dXJuICh1X2NoYXIgKikgJiAoKHN0cnVjdCBzb2NrYWRkcl9pbiAqKSAmcnRoZWFkW1J0SW5kZXhdLT4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICBydF9nYXRld2F5KS0+c2luX2FkZHIuc19hZGRyOwojZW5kaWYgICAgICAgICAgICAgICAgICAgICAgICAgIC8qICpic2QgKi8KICAgIGNhc2UgSVBST1VURVRZUEU6CiNpZmRlZiBocHV4MTEKICAgICAgICBsb25nX3JldHVybiA9IHJ0W1J0SW5kZXhdLlR5cGU7CiNlbHNlCiAgICAgICAgaWYgKHJ0aGVhZFtSdEluZGV4XS0+cnRfZmxhZ3MgJiBSVEZfVVApIHsKICAgICAgICAgICAgaWYgKHJ0aGVhZFtSdEluZGV4XS0+cnRfZmxhZ3MgJiBSVEZfR0FURVdBWSkgewogICAgICAgICAgICAgICAgbG9uZ19yZXR1cm4gPSA0OyAgICAgICAgLyogIGluZGlyZWN0KDQpICAqLwogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgbG9uZ19yZXR1cm4gPSAzOyAgICAgICAgLyogIGRpcmVjdCgzKSAgKi8KICAgICAgICAgICAgfQogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIGxvbmdfcmV0dXJuID0gMjsgICAgLyogIGludmFsaWQoMikgICovCiAgICAgICAgfQojZW5kaWYKICAgICAgICByZXR1cm4gKHVfY2hhciAqKSAmIGxvbmdfcmV0dXJuOwogICAgY2FzZSBJUFJPVVRFUFJPVE86CiNpZmRlZiBocHV4MTEKICAgICAgICBsb25nX3JldHVybiA9IHJ0W1J0SW5kZXhdLlByb3RvOwojZWxzZQogICAgICAgIGxvbmdfcmV0dXJuID0gKHJ0aGVhZFtSdEluZGV4XS0+cnRfZmxhZ3MgJiBSVEZfRFlOQU1JQykgPyA0IDogMjsKI2VuZGlmCiAgICAgICAgcmV0dXJuICh1X2NoYXIgKikgJiBsb25nX3JldHVybjsKICAgIGNhc2UgSVBST1VURUFHRToKI2lmZGVmIGhwdXgxMQogICAgICAgIGxvbmdfcmV0dXJuID0gcnRbUnRJbmRleF0uQWdlOwogICAgICAgIHJldHVybiAodV9jaGFyICopICYgbG9uZ19yZXR1cm47CiNlbGlmIGRlZmluZWQoTkVUU05NUF9OT19EVU1NWV9WQUxVRVMpCiAgICAgICAgcmV0dXJuIE5VTEw7CiNlbmRpZgogICAgICAgIGxvbmdfcmV0dXJuID0gMDsKICAgICAgICByZXR1cm4gKHVfY2hhciAqKSAmIGxvbmdfcmV0dXJuOwogICAgY2FzZSBJUFJPVVRFTUFTSzoKICAgICAgICAqdmFyX2xlbiA9IHNpemVvZihhZGRyX3JldCk7CiNpZiBORUVEX0tMR0VUU0EKICAgICAgICAvKgogICAgICAgICAqIFhYWCAtIEFsbW9zdCBjZXJ0YWlubHkgbm90IHJpZ2h0CiAgICAgICAgICogYnV0IEkgZG9uJ3QgaGF2ZSBhIHN1aXRhYmxlIHN5c3RlbSB0byB0ZXN0IHRoaXMgb24gCiAgICAgICAgICovCiNpZiBORVRTTk1QX05PX0RVTU1ZX1ZBTFVFUwogICAgICAgIHJldHVybiBOVUxMOwojZW5kaWYKICAgICAgICBhZGRyX3JldCA9IDA7CiNlbGlmIGRlZmluZWQoaHB1eDExKQogICAgICAgIGFkZHJfcmV0ID0gcnRbUnRJbmRleF0uTWFzazsKICAgICAgICByZXR1cm4gKHVfY2hhciAqKSAmIGFkZHJfcmV0OwojZWxzZSAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qICFORUVEX0tMR0VUU0EgJiYgIWhwdXgxMSAqLwogICAgICAgIGlmICgoKHN0cnVjdCBzb2NrYWRkcl9pbiAqKSAmcnRoZWFkW1J0SW5kZXhdLT5ydF9kc3QpLT5zaW5fYWRkci4KICAgICAgICAgICAgc19hZGRyID09IDApCiAgICAgICAgICAgIGFkZHJfcmV0ID0gMDsgICAgLyogRGVmYXVsdCByb3V0ZSAqLwogICAgICAgIGVsc2UgewojaWZuZGVmIGxpbnV4CiAgICAgICAgICAgIGlmICghTkVUU05NUF9LTE9PS1VQKHJ0aGVhZFtSdEluZGV4XS0+cnRfaWZwLAogICAgICAgICAgICAgICAgICAgIChjaGFyICopICZydF9pZm5ldCwgc2l6ZW9mKHJ0X2lmbmV0KSkpIHsKICAgICAgICAgICAgICAgIERFQlVHTVNHVEwoKCJtaWJJSS92YXJfcm91dGUiLCAia2xvb2t1cCBmYWlsZWRcbiIpKTsKICAgICAgICAgICAgICAgIHJldHVybiBOVUxMOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmICghTkVUU05NUF9LTE9PS1VQKHJ0X2lmbmV0LmlmX2FkZHJsaXN0LAogICAgICAgICAgICAgICAgICAgIChjaGFyICopICZydF9pZm5ldGFkZHIsIHNpemVvZihydF9pZm5ldGFkZHIpKSkgewogICAgICAgICAgICAgICAgREVCVUdNU0dUTCgoIm1pYklJL3Zhcl9yb3V0ZSIsICJrbG9va3VwIGZhaWxlZFxuIikpOwogICAgICAgICAgICAgICAgcmV0dXJuIE5VTEw7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGFkZHJfcmV0ID0gcnRfaWZuZXRhZGRyLmlhX3N1Ym5ldG1hc2s7CiNlbHNlICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogbGludXggKi8KICAgICAgICAgICAgY3AgPSAodV9jaGFyICopICYKICAgICAgICAgICAgICAgICgoKHN0cnVjdCBzb2NrYWRkcl9pbiAqKSAmKHJ0aGVhZFtSdEluZGV4XS0+cnRfZHN0KSktPgogICAgICAgICAgICAgICAgIHNpbl9hZGRyLnNfYWRkcik7CiAgICAgICAgICAgIHJldHVybiAodV9jaGFyICopICYKICAgICAgICAgICAgICAgICgoKHN0cnVjdCBzb2NrYWRkcl9pbiAqKSAmKHJ0aGVhZFtSdEluZGV4XS0+cnRfZ2VubWFzaykpLT4KICAgICAgICAgICAgICAgICBzaW5fYWRkci5zX2FkZHIpOwojZW5kaWYgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGxpbnV4ICovCiAgICAgICAgfQojZW5kaWYgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIE5FRURfS0xHRVRTQSAqLwogICAgICAgIHJldHVybiAodV9jaGFyICopICYgYWRkcl9yZXQ7CiAgICBjYXNlIElQUk9VVEVJTkZPOgogICAgICAgICp2YXJfbGVuID0gbnVsbE9pZExlbjsKICAgICAgICByZXR1cm4gKHVfY2hhciAqKSBudWxsT2lkOwogICAgZGVmYXVsdDoKICAgICAgICBERUJVR01TR1RMKCgic25tcGQiLCAidW5rbm93biBzdWItaWQgJWQgaW4gdmFyX2lwUm91dGVFbnRyeVxuIiwKICAgICAgICAgICAgICAgICAgICB2cC0+bWFnaWMpKTsKICAgIH0KICAgIHJldHVybiBOVUxMOwp9CgojZWxzZSAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHNvbGFyaXMyICovCgpzdGF0aWMgaW50CklQX0NtcF9Sb3V0ZSh2b2lkICphZGRyLCB2b2lkICplcCkKewogICAgbWliMl9pcFJvdXRlRW50cnlfdCAqRXAgPSBlcCwgKkFkZHIgPSBhZGRyOwoKICAgIGlmICgoRXAtPmlwUm91dGVEZXN0ID09IEFkZHItPmlwUm91dGVEZXN0KSAmJgogICAgICAgIChFcC0+aXBSb3V0ZU5leHRIb3AgPT0gQWRkci0+aXBSb3V0ZU5leHRIb3ApICYmCiAgICAgICAgKEVwLT5pcFJvdXRlVHlwZSA9PSBBZGRyLT5pcFJvdXRlVHlwZSkgJiYKICAgICAgICAoRXAtPmlwUm91dGVQcm90byA9PSBBZGRyLT5pcFJvdXRlUHJvdG8pICYmCiAgICAgICAgKEVwLT5pcFJvdXRlTWFzayA9PSBBZGRyLT5pcFJvdXRlTWFzaykgJiYKICAgICAgICAoRXAtPmlwUm91dGVJbmZvLnJlX21heF9mcmFnID09IEFkZHItPmlwUm91dGVJbmZvLnJlX21heF9mcmFnKSAmJgogICAgICAgIChFcC0+aXBSb3V0ZUluZm8ucmVfcnR0ID09IEFkZHItPmlwUm91dGVJbmZvLnJlX3J0dCkgJiYKICAgICAgICAoRXAtPmlwUm91dGVJbmZvLnJlX3JlZiA9PSBBZGRyLT5pcFJvdXRlSW5mby5yZV9yZWYpICYmCiAgICAgICAgKEVwLT5pcFJvdXRlSW5mby5yZV9mcmFnX2ZsYWcgPT0gQWRkci0+aXBSb3V0ZUluZm8ucmVfZnJhZ19mbGFnKSAmJgogICAgICAgIChFcC0+aXBSb3V0ZUluZm8ucmVfc3JjX2FkZHIgPT0gQWRkci0+aXBSb3V0ZUluZm8ucmVfc3JjX2FkZHIpICYmCiAgICAgICAgKEVwLT5pcFJvdXRlSW5mby5yZV9pcmVfdHlwZSA9PSBBZGRyLT5pcFJvdXRlSW5mby5yZV9pcmVfdHlwZSkgJiYKICAgICAgICAoRXAtPmlwUm91dGVJbmZvLnJlX29icGt0ID09IEFkZHItPmlwUm91dGVJbmZvLnJlX29icGt0KSAmJgogICAgICAgIChFcC0+aXBSb3V0ZUluZm8ucmVfaWJwa3QgPT0gQWRkci0+aXBSb3V0ZUluZm8ucmVfaWJwa3QpCiAgICAgICAgKQogICAgICAgIHJldHVybiAoMCk7CiAgICBlbHNlCiAgICAgICAgcmV0dXJuICgxKTsgICAgICAgICAgICAgLyogTm90IGZvdW5kICovCn0KCnVfY2hhciAgICAgICAgICoKdmFyX2lwUm91dGVFbnRyeShzdHJ1Y3QgdmFyaWFibGUgKiB2cCwKICAgICAgICAgICAgICAgICBvaWQgKiBuYW1lLAogICAgICAgICAgICAgICAgIHNpemVfdCAqIGxlbmd0aCwKICAgICAgICAgICAgICAgICBpbnQgZXhhY3QsIHNpemVfdCAqIHZhcl9sZW4sIFdyaXRlTWV0aG9kICoqIHdyaXRlX21ldGhvZCkKewogICAgLyoKICAgICAqIG9iamVjdCBpZGVudGlmaWVyIGlzIG9mIGZvcm06CiAgICAgKiAxLjMuNi4xLjIuMS40LjIxLjEuMS5BLkIuQy5ELCAgd2hlcmUgQS5CLkMuRCBpcyBJUCBhZGRyZXNzLgogICAgICogSVBBRERSIHN0YXJ0cyBhdCBvZmZzZXQgMTAuCiAgICAgKi8KI2RlZmluZSBJUF9ST1VURU5BTUVfTEVOR1RICTE0CiNkZWZpbmUJSVBfUk9VVEVBRERSX09GRgkxMAogICAgb2lkICAgICAgICAgICAgIGN1cnJlbnRbSVBfUk9VVEVOQU1FX0xFTkdUSF0sCiAgICAgICAgbG93ZXN0W0lQX1JPVVRFTkFNRV9MRU5HVEhdOwogICAgdV9jaGFyICAgICAgICAgKmNwOwogICAgb2lkICAgICAgICAgICAgKm9wOwogICAgbWliMl9pcFJvdXRlRW50cnlfdCBMb3dlbnRyeSwgTmV4dGVudHJ5LCBlbnRyeTsKICAgIGludCAgICAgICAgICAgICBGb3VuZCA9IDA7CiAgICByZXFfZSAgICAgICAgICAgcmVxX3R5cGU7CiAgICBzdGF0aWMgaW5fYWRkcl90IGFkZHJfcmV0OwoKICAgICp3cml0ZV9tZXRob2QgPSBOVUxMOyAgLyogd3JpdGVfcnRlOyAgWFhYOiAgU0VUIHN1cHBvcnQgbm90IHJlYWxseSBpbXBsZW1lbnRlZCAqLwoKICAgIC8qCiAgICAgKiBmaWxsIGluIG9iamVjdCBwYXJ0IG9mIG5hbWUgZm9yIGN1cnJlbnQgKGxlc3Mgc2l6ZW9mIGluc3RhbmNlIHBhcnQpIAogICAgICovCgogICAgbWVtY3B5KChjaGFyICopIGN1cnJlbnQsIChjaGFyICopIHZwLT5uYW1lLCB2cC0+bmFtZWxlbiAqIHNpemVvZihvaWQpKTsKICAgIGlmICgqbGVuZ3RoID09IElQX1JPVVRFTkFNRV9MRU5HVEgpIC8qIEFzc3VtZSB0aGF0IHRoZSBpbnB1dCBuYW1lIGlzIHRoZSBsb3dlc3QgKi8KICAgICAgICBtZW1jcHkoKGNoYXIgKikgbG93ZXN0LCAoY2hhciAqKSBuYW1lLAogICAgICAgICAgICAgICBJUF9ST1VURU5BTUVfTEVOR1RIICogc2l6ZW9mKG9pZCkpOwogICAgZWxzZSB7CiAgICAgICAgbmFtZVtJUF9ST1VURUFERFJfT0ZGXSA9IChvaWQpIC0gMTsgICAgIC8qIEdyaGhoOiB0byBwcmV2ZW50IGFjY2lkZW50YWwgY29tcGFyaXNvbiA6LSggKi8KCWxvd2VzdFswXSA9IDB4ZmY7CiAgICB9CiAgICBmb3IgKE5leHRlbnRyeS5pcFJvdXRlRGVzdCA9ICh1X2xvbmcpIC0gMiwgcmVxX3R5cGUgPSBHRVRfRklSU1Q7OwogICAgICAgICBOZXh0ZW50cnkgPSBlbnRyeSwgcmVxX3R5cGUgPSBHRVRfTkVYVCkgewogICAgICAgIGlmIChnZXRNaWJzdGF0KE1JQl9JUF9ST1VURSwgJmVudHJ5LCBzaXplb2YobWliMl9pcFJvdXRlRW50cnlfdCksCiAgICAgICAgICAgICAgICAgICAgICAgcmVxX3R5cGUsICZJUF9DbXBfUm91dGUsICZOZXh0ZW50cnkpICE9IDApCiAgICAgICAgICAgIGJyZWFrOwogICAgICAgIENPUFlfSVBBRERSKGNwLCAodV9jaGFyICopICYgZW50cnkuaXBSb3V0ZURlc3QsIG9wLAogICAgICAgICAgICAgICAgICAgIGN1cnJlbnQgKyBJUF9ST1VURUFERFJfT0ZGKTsKICAgICAgICBpZiAoZXhhY3QpIHsKICAgICAgICAgICAgaWYgKHNubXBfb2lkX2NvbXBhcmUKICAgICAgICAgICAgICAgIChjdXJyZW50LCBJUF9ST1VURU5BTUVfTEVOR1RILCBuYW1lLCAqbGVuZ3RoKSA9PSAwKSB7CiAgICAgICAgICAgICAgICBtZW1jcHkoKGNoYXIgKikgbG93ZXN0LCAoY2hhciAqKSBjdXJyZW50LAogICAgICAgICAgICAgICAgICAgICAgIElQX1JPVVRFTkFNRV9MRU5HVEggKiBzaXplb2Yob2lkKSk7CiAgICAgICAgICAgICAgICBMb3dlbnRyeSA9IGVudHJ5OwogICAgICAgICAgICAgICAgRm91bmQrKzsKICAgICAgICAgICAgICAgIGJyZWFrOyAgICAgICAgICAvKiBubyBuZWVkIHRvIHNlYXJjaCBmdXJ0aGVyICovCiAgICAgICAgICAgIH0KICAgICAgICB9IGVsc2UgewogICAgICAgICAgICBpZiAoKHNubXBfb2lkX2NvbXBhcmUKICAgICAgICAgICAgICAgICAoY3VycmVudCwgSVBfUk9VVEVOQU1FX0xFTkdUSCwgbmFtZSwgKmxlbmd0aCkgPiAwKQogICAgICAgICAgICAgICAgJiYgKChOZXh0ZW50cnkuaXBSb3V0ZURlc3QgPT0gKHVfbG9uZykgLSAyKQogICAgICAgICAgICAgICAgICAgIHx8CiAgICAgICAgICAgICAgICAgICAgKHNubXBfb2lkX2NvbXBhcmUKICAgICAgICAgICAgICAgICAgICAgKGN1cnJlbnQsIElQX1JPVVRFTkFNRV9MRU5HVEgsIGxvd2VzdCwKICAgICAgICAgICAgICAgICAgICAgIElQX1JPVVRFTkFNRV9MRU5HVEgpIDwgMCkKICAgICAgICAgICAgICAgICAgICB8fAogICAgICAgICAgICAgICAgICAgIChzbm1wX29pZF9jb21wYXJlCiAgICAgICAgICAgICAgICAgICAgIChuYW1lLCBJUF9ST1VURU5BTUVfTEVOR1RILCBsb3dlc3QsCiAgICAgICAgICAgICAgICAgICAgICBJUF9ST1VURU5BTUVfTEVOR1RIKSA9PSAwKSkpIHsKCiAgICAgICAgICAgICAgICAvKgogICAgICAgICAgICAgICAgICogaWYgbmV3IG9uZSBpcyBncmVhdGVyIHRoYW4gaW5wdXQgYW5kIGNsb3NlciB0byBpbnB1dCB0aGFuCiAgICAgICAgICAgICAgICAgKiAqIHByZXZpb3VzIGxvd2VzdCwgYW5kIGlzIG5vdCBlcXVhbCB0byBpdCwgc2F2ZSB0aGlzIG9uZSBhcyB0aGUgIm5leHQiIG9uZS4KICAgICAgICAgICAgICAgICAqLwogICAgICAgICAgICAgICAgbWVtY3B5KChjaGFyICopIGxvd2VzdCwgKGNoYXIgKikgY3VycmVudCwKICAgICAgICAgICAgICAgICAgICAgICBJUF9ST1VURU5BTUVfTEVOR1RIICogc2l6ZW9mKG9pZCkpOwogICAgICAgICAgICAgICAgTG93ZW50cnkgPSBlbnRyeTsKICAgICAgICAgICAgICAgIEZvdW5kKys7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9CiAgICBpZiAoRm91bmQgPT0gMCkKICAgICAgICByZXR1cm4gKE5VTEwpOwogICAgbWVtY3B5KChjaGFyICopIG5hbWUsIChjaGFyICopIGxvd2VzdCwKICAgICAgICAgICBJUF9ST1VURU5BTUVfTEVOR1RIICogc2l6ZW9mKG9pZCkpOwogICAgKmxlbmd0aCA9IElQX1JPVVRFTkFNRV9MRU5HVEg7CiAgICAqdmFyX2xlbiA9IHNpemVvZihsb25nX3JldHVybik7CgogICAgc3dpdGNoICh2cC0+bWFnaWMpIHsKICAgIGNhc2UgSVBST1VURURFU1Q6CiAgICAgICAgKnZhcl9sZW4gPSBzaXplb2YoYWRkcl9yZXQpOwogICAgICAgIGFkZHJfcmV0ID0gTG93ZW50cnkuaXBSb3V0ZURlc3Q7CiAgICAgICAgcmV0dXJuICh1X2NoYXIgKikgJiBhZGRyX3JldDsKICAgIGNhc2UgSVBST1VURUlGSU5ERVg6CiNpZmRlZiBORVRTTk1QX0lOQ0xVREVfSUZUQUJMRV9SRVdSSVRFUwogICAgICAgIExvd2VudHJ5LmlwUm91dGVJZkluZGV4Lm9fYnl0ZXNbTG93ZW50cnkuaXBSb3V0ZUlmSW5kZXgub19sZW5ndGhdID0gJ1wwJzsKICAgICAgICBsb25nX3JldHVybiA9CiAgICAgICAgICAgIG5ldHNubXBfYWNjZXNzX2ludGVyZmFjZV9pbmRleF9maW5kKAogICAgICAgICAgICAgICAgTG93ZW50cnkuaXBSb3V0ZUlmSW5kZXgub19ieXRlcyk7CiNlbHNlCiAgICAgICAgbG9uZ19yZXR1cm4gPQogICAgICAgICAgIEludGVyZmFjZV9JbmRleF9CeV9OYW1lKExvd2VudHJ5LmlwUm91dGVJZkluZGV4Lm9fYnl0ZXMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTG93ZW50cnkuaXBSb3V0ZUlmSW5kZXgub19sZW5ndGgpOwojZW5kaWYKICAgICAgICByZXR1cm4gKHVfY2hhciAqKSAmIGxvbmdfcmV0dXJuOwogICAgY2FzZSBJUFJPVVRFTUVUUklDMToKICAgICAgICBsb25nX3JldHVybiA9IExvd2VudHJ5LmlwUm91dGVNZXRyaWMxOwogICAgICAgIHJldHVybiAodV9jaGFyICopICYgbG9uZ19yZXR1cm47CiAgICBjYXNlIElQUk9VVEVNRVRSSUMyOgogICAgICAgIGxvbmdfcmV0dXJuID0gTG93ZW50cnkuaXBSb3V0ZU1ldHJpYzI7CiAgICAgICAgcmV0dXJuICh1X2NoYXIgKikgJiBsb25nX3JldHVybjsKICAgIGNhc2UgSVBST1VURU1FVFJJQzM6CiAgICAgICAgbG9uZ19yZXR1cm4gPSBMb3dlbnRyeS5pcFJvdXRlTWV0cmljMzsKICAgICAgICByZXR1cm4gKHVfY2hhciAqKSAmIGxvbmdfcmV0dXJuOwogICAgY2FzZSBJUFJPVVRFTUVUUklDNDoKICAgICAgICBsb25nX3JldHVybiA9IExvd2VudHJ5LmlwUm91dGVNZXRyaWM0OwogICAgICAgIHJldHVybiAodV9jaGFyICopICYgbG9uZ19yZXR1cm47CiAgICBjYXNlIElQUk9VVEVORVhUSE9QOgogICAgICAgICp2YXJfbGVuID0gc2l6ZW9mKGFkZHJfcmV0KTsKICAgICAgICBhZGRyX3JldCA9IExvd2VudHJ5LmlwUm91dGVOZXh0SG9wOwogICAgICAgIHJldHVybiAodV9jaGFyICopICYgYWRkcl9yZXQ7CiAgICBjYXNlIElQUk9VVEVUWVBFOgogICAgICAgIGxvbmdfcmV0dXJuID0gTG93ZW50cnkuaXBSb3V0ZVR5cGU7CiAgICAgICAgcmV0dXJuICh1X2NoYXIgKikgJiBsb25nX3JldHVybjsKICAgIGNhc2UgSVBST1VURVBST1RPOgogICAgICAgIGxvbmdfcmV0dXJuID0gTG93ZW50cnkuaXBSb3V0ZVByb3RvOwogICAgICAgIGlmIChsb25nX3JldHVybiA9PSAtMSkKICAgICAgICAgICAgbG9uZ19yZXR1cm4gPSAxOwogICAgICAgIHJldHVybiAodV9jaGFyICopICYgbG9uZ19yZXR1cm47CiAgICBjYXNlIElQUk9VVEVBR0U6CiAgICAgICAgbG9uZ19yZXR1cm4gPSBMb3dlbnRyeS5pcFJvdXRlQWdlOwogICAgICAgIHJldHVybiAodV9jaGFyICopICYgbG9uZ19yZXR1cm47CiAgICBjYXNlIElQUk9VVEVNQVNLOgogICAgICAgICp2YXJfbGVuID0gc2l6ZW9mKGFkZHJfcmV0KTsKICAgICAgICBhZGRyX3JldCA9IExvd2VudHJ5LmlwUm91dGVNYXNrOwogICAgICAgIHJldHVybiAodV9jaGFyICopICYgYWRkcl9yZXQ7CiAgICBkZWZhdWx0OgogICAgICAgIERFQlVHTVNHVEwoKCJzbm1wZCIsICJ1bmtub3duIHN1Yi1pZCAlZCBpbiB2YXJfaXBSb3V0ZUVudHJ5XG4iLAogICAgICAgICAgICAgICAgICAgIHZwLT5tYWdpYykpOwogICAgfTsKICAgIHJldHVybiBOVUxMOwp9CgojZW5kaWYgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHNvbGFyaXMyIC0gdmFyX0lQcm91dGUgKi8KCiNpZm5kZWYgc29sYXJpczIKc3RhdGljIGludCAgICAgIHFzb3J0X2NvbXBhcmUoY29uc3Qgdm9pZCAqLCBjb25zdCB2b2lkICopOwojZW5kaWYKCiNpZiBkZWZpbmVkKFJURU5UUllfNF80KSB8fCBkZWZpbmVkKFJURU5UUllfUlRfTkVYVCkgfHwgZGVmaW5lZChocHV4MTEpCgojaWYgZGVmaW5lZChSVEVOVFJZXzRfNCkgJiYgIWRlZmluZWQoaHB1eDExKQp2b2lkCmxvYWRfcnRlbnRyaWVzKHN0cnVjdCByYWRpeF9ub2RlICpwdCkKewogICAgc3RydWN0IHJhZGl4X25vZGUgbm9kZTsKICAgIFJURU5UUlkgICAgICAgICBydDsKICAgIHN0cnVjdCBpZm5ldCAgICBpZm5ldDsKICAgIGNoYXIgICAgICAgICAgICBuYW1lWzE2XSwgdGVtcFsxNl07CiNpZiAhU1RSVUNUX0lGTkVUX0hBU19JRl9YTkFNRQogICAgcmVnaXN0ZXIgY2hhciAgKmNwOwojZW5kaWYKCiAgICBpZiAoIU5FVFNOTVBfS0xPT0tVUChwdCwgKGNoYXIgKikgJm5vZGUsIHNpemVvZihzdHJ1Y3QgcmFkaXhfbm9kZSkpKSB7CiAgICAgICAgREVCVUdNU0dUTCgoIm1pYklJL3Zhcl9yb3V0ZSIsICJrbG9va3VwIGZhaWxlZFxuIikpOwogICAgICAgIHJldHVybjsKICAgIH0KICAgIGlmIChub2RlLnJuX2IgPj0gMCkgewogICAgICAgIGxvYWRfcnRlbnRyaWVzKG5vZGUucm5fcik7CiAgICAgICAgbG9hZF9ydGVudHJpZXMobm9kZS5ybl9sKTsKICAgIH0gZWxzZSB7CiAgICAgICAgaWYgKG5vZGUucm5fZmxhZ3MgJiBSTkZfUk9PVCkgewogICAgICAgICAgICAvKgogICAgICAgICAgICAgKiByb290IG5vZGUgCiAgICAgICAgICAgICAqLwogICAgICAgICAgICBpZiAobm9kZS5ybl9kdXBlZGtleSkKICAgICAgICAgICAgICAgIGxvYWRfcnRlbnRyaWVzKG5vZGUucm5fZHVwZWRrZXkpOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgICAgIC8qCiAgICAgICAgICogZ2V0IHRoZSByb3V0ZSAKICAgICAgICAgKi8KICAgICAgICBpZiAoIU5FVFNOTVBfS0xPT0tVUChwdCwgKGNoYXIgKikgJnJ0LCBzaXplb2YoUlRFTlRSWSkpKSB7CiAgICAgICAgICAgIERFQlVHTVNHVEwoKCJtaWJJSS92YXJfcm91dGUiLCAia2xvb2t1cCBmYWlsZWRcbiIpKTsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KCiAgICAgICAgaWYgKHJ0LnJ0X2lmcCAhPSAwKSB7CiAgICAgICAgICAgIGlmICghTkVUU05NUF9LTE9PS1VQKHJ0LnJ0X2lmcCwgKGNoYXIgKikgJmlmbmV0LCBzaXplb2YoaWZuZXQpKSkgewogICAgICAgICAgICAgICAgREVCVUdNU0dUTCgoIm1pYklJL3Zhcl9yb3V0ZSIsICJrbG9va3VwIGZhaWxlZFxuIikpOwogICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICB9CiNpZiBTVFJVQ1RfSUZORVRfSEFTX0lGX1hOQU1FCiNpZiBkZWZpbmVkKG5ldGJzZDEpIHx8IGRlZmluZWQob3BlbmJzZDIpCiAgICAgICAgICAgIHN0cmxjcHkobmFtZSwgaWZuZXQuaWZfeG5hbWUsIHNpemVvZihuYW1lKSk7CiNlbHNlCiAgICAgICAgICAgIGlmICghTkVUU05NUF9LTE9PS1VQKGlmbmV0LmlmX3huYW1lLCBuYW1lLCBzaXplb2YgbmFtZSkpIHsKICAgICAgICAgICAgICAgIERFQlVHTVNHVEwoKCJtaWJJSS92YXJfcm91dGUiLCAia2xvb2t1cCBmYWlsZWRcbiIpKTsKICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgfQojZW5kaWYKICAgICAgICAgICAgbmFtZVtzaXplb2YobmFtZSkgLSAxXSA9ICdcMCc7CiNlbHNlCiAgICAgICAgICAgIGlmICghTkVUU05NUF9LTE9PS1VQKGlmbmV0LmlmX25hbWUsIG5hbWUsIHNpemVvZiBuYW1lKSkgewogICAgICAgICAgICAgICAgREVCVUdNU0dUTCgoIm1pYklJL3Zhcl9yb3V0ZSIsICJrbG9va3VwIGZhaWxlZFxuIikpOwogICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICB9CiAgICAgICAgICAgIG5hbWVbc2l6ZW9mKG5hbWUpIC0gMV0gPSAnXDAnOwogICAgICAgICAgICBjcCA9IChjaGFyICopIHN0cmNocihuYW1lLCAnXDAnKTsKICAgICAgICAgICAgc3RyaW5nX2FwcGVuZF9pbnQoY3AsIGlmbmV0LmlmX3VuaXQpOwojZW5kaWYKICAgICAgICAgICAgSW50ZXJmYWNlX1NjYW5fSW5pdCgpOwogICAgICAgICAgICBydC5ydF91bml0ID0gMDsKICAgICAgICAgICAgd2hpbGUgKEludGVyZmFjZV9TY2FuX05leHQKICAgICAgICAgICAgICAgICAgICgoc2hvcnQgKikgJihydC5ydF91bml0KSwgdGVtcCwgTlVMTCwgTlVMTCkgIT0gMCkgewogICAgICAgICAgICAgICAgaWYgKHN0cmNtcChuYW1lLCB0ZW1wKSA9PSAwKQogICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICB9CiAgICAgICAgfQojaWYgQ0hFQ0tfUlRfRkxBR1MKICAgICAgICBpZiAoKChydC5ydF9mbGFncyAmIFJURl9DTE9OSU5HKSAhPSBSVEZfQ0xPTklORykKICAgICAgICAgICAgJiYgKChydC5ydF9mbGFncyAmIFJURl9MTElORk8pICE9IFJURl9MTElORk8pKSB7CiNlbmRpZgogICAgICAgICAgICAvKgogICAgICAgICAgICAgKiBjaGVjayBmb3Igc3BhY2UgYW5kIG1hbGxvYyAKICAgICAgICAgICAgICovCiAgICAgICAgICAgIGlmIChydHNpemUgPj0gcnRhbGxvY2F0ZSkgewogICAgICAgICAgICAgICAgcnRoZWFkID0KICAgICAgICAgICAgICAgICAgICAoUlRFTlRSWSAqKikgcmVhbGxvYygoY2hhciAqKSBydGhlYWQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMiAqIHJ0YWxsb2NhdGUgKgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZihSVEVOVFJZICopKTsKICAgICAgICAgICAgICAgIG1lbXNldCgoY2hhciAqKSAmcnRoZWFkW3J0YWxsb2NhdGVdLCAoMCksCiAgICAgICAgICAgICAgICAgICAgICAgcnRhbGxvY2F0ZSAqIHNpemVvZihSVEVOVFJZICopKTsKCiAgICAgICAgICAgICAgICBydGFsbG9jYXRlICo9IDI7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKCFydGhlYWRbcnRzaXplXSkKICAgICAgICAgICAgICAgIHJ0aGVhZFtydHNpemVdID0gKFJURU5UUlkgKikgbWFsbG9jKHNpemVvZihSVEVOVFJZKSk7CiAgICAgICAgICAgIC8qCiAgICAgICAgICAgICAqICAgICAgQWRkIHRoaXMgdG8gdGhlIGRhdGFiYXNlCiAgICAgICAgICAgICAqLwogICAgICAgICAgICBtZW1jcHkoKGNoYXIgKikgcnRoZWFkW3J0c2l6ZV0sIChjaGFyICopICZydCwgc2l6ZW9mKFJURU5UUlkpKTsKICAgICAgICAgICAgcnRzaXplKys7CiNpZiBDSEVDS19SVF9GTEFHUwogICAgICAgIH0KI2VuZGlmCgogICAgICAgIGlmIChub2RlLnJuX2R1cGVka2V5KQogICAgICAgICAgICBsb2FkX3J0ZW50cmllcyhub2RlLnJuX2R1cGVka2V5KTsKICAgIH0KfQojZW5kaWYgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFJURU5UUllfNF80ICYmICFocHV4MTEgKi8KCnN0YXRpYyB2b2lkClJvdXRlX1NjYW5fUmVsb2FkKHZvaWQpCnsKI2lmZGVmIGhwdXgxMQoKICAgIGludCAgICAgICAgICAgICBmZDsKICAgIHN0cnVjdCBubXBhcm1zICBwOwogICAgaW50ICAgICAgICAgICAgIHZhbDsKICAgIHVuc2lnbmVkIGludCAgICB1bGVuOwogICAgaW50ICAgICAgICAgICAgIHJldDsKCiAgICBpZiAocnQpCiAgICAgICAgZnJlZShydCk7CiAgICBydCA9IChtaWJfaXBSb3V0ZUVudCAqKSAwOwogICAgcnRzaXplID0gMDsKCiAgICBpZiAoKGZkID0gb3Blbl9taWIoIi9kZXYvaXAiLCBPX1JET05MWSwgMCwgTk1fQVNZTkNfT0ZGKSkgPj0gMCkgewogICAgICAgIHAub2JqaWQgPSBJRF9pcFJvdXRlTnVtRW50OwogICAgICAgIHAuYnVmZmVyID0gKHZvaWQgKikgJnZhbDsKICAgICAgICB1bGVuID0gc2l6ZW9mKGludCk7CiAgICAgICAgcC5sZW4gPSAmdWxlbjsKICAgICAgICBpZiAoKHJldCA9IGdldF9taWJfaW5mbyhmZCwgJnApKSA9PSAwKQogICAgICAgICAgICBydHNpemUgPSB2YWw7CgogICAgICAgIGlmIChydHNpemUgPiAwKSB7CiAgICAgICAgICAgIHVsZW4gPSAodW5zaWduZWQpIHJ0c2l6ZSAqc2l6ZW9mKG1pYl9pcFJvdXRlRW50KTsKICAgICAgICAgICAgcnQgPSAobWliX2lwUm91dGVFbnQgKikgbWFsbG9jKHVsZW4pOwogICAgICAgICAgICBwLm9iamlkID0gSURfaXBSb3V0ZVRhYmxlOwogICAgICAgICAgICBwLmJ1ZmZlciA9ICh2b2lkICopIHJ0OwogICAgICAgICAgICBwLmxlbiA9ICZ1bGVuOwogICAgICAgICAgICBpZiAoKHJldCA9IGdldF9taWJfaW5mbyhmZCwgJnApKSA8IDApCiAgICAgICAgICAgICAgICBydHNpemUgPSAwOwogICAgICAgIH0KCiAgICAgICAgY2xvc2VfbWliKGZkKTsKICAgIH0KCiAgICAvKgogICAgICogIFNvcnQgaXQhCiAgICAgKi8KICAgIHFzb3J0KChjaGFyICopIHJ0LCBydHNpemUsIHNpemVvZihydFswXSksCiNpZmRlZiBfX1NURENfXwogICAgICAgICAgKGludCAoKikoY29uc3Qgdm9pZCAqLCBjb25zdCB2b2lkICopKSBxc29ydF9jb21wYXJlCiNlbHNlCiAgICAgICAgICBxc29ydF9jb21wYXJlCiNlbmRpZgogICAgICAgICk7CgojZWxzZSAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGhwdXgxMSAqLwojaWYgZGVmaW5lZChSVEVOVFJZXzRfNCkKICAgIHN0cnVjdCByYWRpeF9ub2RlX2hlYWQgaGVhZCwgKnJ0X3RhYmxlW0FGX01BWCArIDFdOwogICAgaW50ICAgICAgICAgICAgIGk7CiNlbHNlCiAgICBSVEVOVFJZICAgICAgICoqcm91dGVoYXNoLCBtYjsKICAgIHJlZ2lzdGVyIFJURU5UUlkgKm07CiAgICBSVEVOVFJZICAgICAgICAqcnQ7CiAgICBzdHJ1Y3QgaWZuZXQgICAgaWZuZXQ7CiAgICBpbnQgICAgICAgICAgICAgaSwgdGFibGU7CiAgICByZWdpc3RlciBjaGFyICAqY3A7CiAgICBjaGFyICAgICAgICAgICAgbmFtZVsxNl0sIHRlbXBbMTZdOwogICAgaW50ICAgICAgICAgICAgIGhhc2hzaXplOwojZW5kaWYKICAgIHN0YXRpYyBpbnQgICAgICBUaW1lX09mX0xhc3RfUmVsb2FkID0gMDsKICAgIHN0cnVjdCB0aW1ldmFsICBub3c7CgogICAgZ2V0dGltZW9mZGF5KCZub3csIChzdHJ1Y3QgdGltZXpvbmUgKikgMCk7CiAgICBpZiAoVGltZV9PZl9MYXN0X1JlbG9hZCArIENBQ0hFX1RJTUUgPiBub3cudHZfc2VjKQogICAgICAgIHJldHVybjsKICAgIFRpbWVfT2ZfTGFzdF9SZWxvYWQgPSBub3cudHZfc2VjOwoKICAgIC8qCiAgICAgKiAqICBNYWtlcyBzdXJlIHdlIGhhdmUgU09NRSBzcGFjZSBhbGxvY2F0ZWQgZm9yIG5ldyByb3V0aW5nIGVudHJpZXMKICAgICAqLwogICAgaWYgKCFydGhlYWQpIHsKICAgICAgICBydGhlYWQgPSAoUlRFTlRSWSAqKikgbWFsbG9jKDEwMCAqIHNpemVvZihSVEVOVFJZICopKTsKICAgICAgICBpZiAoIXJ0aGVhZCkgewogICAgICAgICAgICBzbm1wX2xvZyhMT0dfRVJSLCAicm91dGUgdGFibGUgbWFsbG9jIGZhaWxcbiIpOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgICAgIG1lbXNldCgoY2hhciAqKSBydGhlYWQsICgwKSwgMTAwICogc2l6ZW9mKFJURU5UUlkgKikpOwogICAgICAgIHJ0YWxsb2NhdGUgPSAxMDA7CiAgICB9CgogICAgLyoKICAgICAqIHJlc2V0IHRoZSByb3V0aW5nIHRhYmxlIHNpemUgdG8gemVybyAtLSB3YXMgYSBDTVUgbWVtb3J5IGxlYWsgCiAgICAgKi8KICAgIHJ0c2l6ZSA9IDA7CgojaWZkZWYgUlRFTlRSWV80XzQKICAgIC8qCiAgICAgKiBydGVudHJ5IGlzIGEgQlNEIDQuNCBjb21wYXQgCiAgICAgKi8KCiNpZiAhZGVmaW5lZChBRl9VTlNQRUMpCiNkZWZpbmUgQUZfVU5TUEVDIEFGX0lORVQKI2VuZGlmCgogICAgYXV0b19ubGlzdChSVFRBQkxFU19TWU1CT0wsIChjaGFyICopIHJ0X3RhYmxlLCBzaXplb2YocnRfdGFibGUpKTsKICAgIGZvciAoaSA9IDA7IGkgPD0gQUZfTUFYOyBpKyspIHsKICAgICAgICBpZiAocnRfdGFibGVbaV0gPT0gMCkKICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgaWYgKE5FVFNOTVBfS0xPT0tVUChydF90YWJsZVtpXSwgKGNoYXIgKikgJmhlYWQsIHNpemVvZihoZWFkKSkpIHsKICAgICAgICAgICAgbG9hZF9ydGVudHJpZXMoaGVhZC5ybmhfdHJlZXRvcCk7CiAgICAgICAgfQogICAgfQoKI2Vsc2UgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBydGVudHJ5IGlzIGEgQlNEIDQuMyBjb21wYXQgKi8KICAgIGZvciAodGFibGUgPSAwOyB0YWJsZSA8IE5VTV9ST1VURV9TWU1CT0xTOyB0YWJsZSsrKSB7CiAgICAgICAgYXV0b19ubGlzdChSVEhBU0hTSVpFX1NZTUJPTCwgKGNoYXIgKikgJmhhc2hzaXplLAogICAgICAgICAgICAgICAgICAgc2l6ZW9mKGhhc2hzaXplKSk7CiAgICAgICAgcm91dGVoYXNoID0gKFJURU5UUlkgKiopIG1hbGxvYyhoYXNoc2l6ZSAqIHNpemVvZihzdHJ1Y3QgbWJ1ZiAqKSk7CiAgICAgICAgYXV0b19ubGlzdChyb3V0ZV9zeW1ib2xzW3RhYmxlXSwgKGNoYXIgKikgcm91dGVoYXNoLAogICAgICAgICAgICAgICAgICAgaGFzaHNpemUgKiBzaXplb2Yoc3RydWN0IG1idWYgKikpOwogICAgICAgIGZvciAoaSA9IDA7IGkgPCBoYXNoc2l6ZTsgaSsrKSB7CiAgICAgICAgICAgIGlmIChyb3V0ZWhhc2hbaV0gPT0gMCkKICAgICAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICAgICBtID0gcm91dGVoYXNoW2ldOwogICAgICAgICAgICB3aGlsZSAobSkgewogICAgICAgICAgICAgICAgLyoKICAgICAgICAgICAgICAgICAqICAgICAgRGlnIHRoZSByb3V0ZSBvdXQgb2YgdGhlIGtlcm5lbC4uLgogICAgICAgICAgICAgICAgICovCiAgICAgICAgICAgICAgICBpZiAoIU5FVFNOTVBfS0xPT0tVUChtLCAoY2hhciAqKSAmbWIsIHNpemVvZihtYikpKSB7CiAgICAgICAgICAgICAgICAgICAgREVCVUdNU0dUTCgoIm1pYklJL3Zhcl9yb3V0ZSIsICJrbG9va3VwIGZhaWxlZFxuIikpOwogICAgICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIG0gPSBtYi5ydF9uZXh0OwoKICAgICAgICAgICAgICAgIHJ0ID0gJm1iOwogICAgICAgICAgICAgICAgaWYgKHJ0LT5ydF9pZnAgIT0gMCkgewogICAgICAgICAgICAgICAgICAgIGlmICghTkVUU05NUF9LTE9PS1VQKHJ0LT5ydF9pZnAsIChjaGFyICopICZpZm5ldCwgc2l6ZW9mKGlmbmV0KSkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgREVCVUdNU0dUTCgoIm1pYklJL3Zhcl9yb3V0ZSIsICJrbG9va3VwIGZhaWxlZFxuIikpOwogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGlmICghTkVUU05NUF9LTE9PS1VQKGlmbmV0LmlmX25hbWUsIG5hbWUsIDE2KSkgewogICAgICAgICAgICAgICAgICAgICAgICBERUJVR01TR1RMKCgibWliSUkvdmFyX3JvdXRlIiwgImtsb29rdXAgZmFpbGVkXG4iKSk7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgbmFtZVsxNV0gPSAnXDAnOwogICAgICAgICAgICAgICAgICAgIGNwID0gKGNoYXIgKikgc3RyY2hyKG5hbWUsICdcMCcpOwogICAgICAgICAgICAgICAgICAgIHN0cmluZ19hcHBlbmRfaW50KGNwLCBpZm5ldC5pZl91bml0KTsKCiAgICAgICAgICAgICAgICAgICAgSW50ZXJmYWNlX1NjYW5fSW5pdCgpOwogICAgICAgICAgICAgICAgICAgIHdoaWxlIChJbnRlcmZhY2VfU2Nhbl9OZXh0CiAgICAgICAgICAgICAgICAgICAgICAgICAgICgoc2hvcnQgKikgJnJ0LT5ydF91bml0LCB0ZW1wLCBOVUxMLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCkgIT0gMCkgewogICAgICAgICAgICAgICAgICAgICAgICBpZiAoc3RyY21wKG5hbWUsIHRlbXApID09IDApCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAvKgogICAgICAgICAgICAgICAgICogICAgICBBbGxvY2F0ZSBhIGJsb2NrIHRvIGhvbGQgaXQgYW5kIGFkZCBpdCB0byB0aGUgZGF0YWJhc2UKICAgICAgICAgICAgICAgICAqLwogICAgICAgICAgICAgICAgaWYgKHJ0c2l6ZSA+PSBydGFsbG9jYXRlKSB7CiAgICAgICAgICAgICAgICAgICAgcnRoZWFkID0KICAgICAgICAgICAgICAgICAgICAgICAgKFJURU5UUlkgKiopIHJlYWxsb2MoKGNoYXIgKikgcnRoZWFkLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAyICogcnRhbGxvY2F0ZSAqCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZihSVEVOVFJZICopKTsKICAgICAgICAgICAgICAgICAgICBtZW1zZXQoKGNoYXIgKikgJnJ0aGVhZFtydGFsbG9jYXRlXSwgKDApLAogICAgICAgICAgICAgICAgICAgICAgICAgICBydGFsbG9jYXRlICogc2l6ZW9mKFJURU5UUlkgKikpOwoKICAgICAgICAgICAgICAgICAgICBydGFsbG9jYXRlICo9IDI7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBpZiAoIXJ0aGVhZFtydHNpemVdKQogICAgICAgICAgICAgICAgICAgIHJ0aGVhZFtydHNpemVdID0gKFJURU5UUlkgKikgbWFsbG9jKHNpemVvZihSVEVOVFJZKSk7CiAgICAgICAgICAgICAgICAvKgogICAgICAgICAgICAgICAgICogICAgICBBZGQgdGhpcyB0byB0aGUgZGF0YWJhc2UKICAgICAgICAgICAgICAgICAqLwogICAgICAgICAgICAgICAgbWVtY3B5KChjaGFyICopIHJ0aGVhZFtydHNpemVdLCAoY2hhciAqKSBydCwKICAgICAgICAgICAgICAgICAgICAgICBzaXplb2YoUlRFTlRSWSkpOwogICAgICAgICAgICAgICAgcnRzaXplKys7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgZnJlZShyb3V0ZWhhc2gpOwogICAgfQojZW5kaWYKICAgIC8qCiAgICAgKiAgU29ydCBpdCEKICAgICAqLwogICAgcXNvcnQoKGNoYXIgKikgcnRoZWFkLCBydHNpemUsIHNpemVvZihydGhlYWRbMF0pLAojaWZkZWYgX19TVERDX18KICAgICAgICAgIChpbnQgKCopKGNvbnN0IHZvaWQgKiwgY29uc3Qgdm9pZCAqKSkgcXNvcnRfY29tcGFyZQojZWxzZQogICAgICAgICAgcXNvcnRfY29tcGFyZQojZW5kaWYKICAgICAgICApOwojZW5kaWYgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGhwdXgxMSAqLwp9CgojZWxzZQoKI2lmIEhBVkVfU1lTX01CVUZfSApzdGF0aWMgdm9pZApSb3V0ZV9TY2FuX1JlbG9hZCh2b2lkKQp7CiAgICBzdHJ1Y3QgbWJ1ZiAgICoqcm91dGVoYXNoLCBtYjsKICAgIHJlZ2lzdGVyIHN0cnVjdCBtYnVmICptOwogICAgc3RydWN0IGlmbmV0ICAgIGlmbmV0OwogICAgUlRFTlRSWSAgICAgICAgKnJ0OwogICAgaW50ICAgICAgICAgICAgIGksIHRhYmxlOwogICAgcmVnaXN0ZXIgY2hhciAgKmNwOwogICAgY2hhciAgICAgICAgICAgIG5hbWVbMTZdLCB0ZW1wWzE2XTsKICAgIHN0YXRpYyBpbnQgICAgICBUaW1lX09mX0xhc3RfUmVsb2FkID0gMDsKICAgIHN0cnVjdCB0aW1ldmFsICBub3c7CiAgICBpbnQgICAgICAgICAgICAgaGFzaHNpemU7CgogICAgZ2V0dGltZW9mZGF5KCZub3csIChzdHJ1Y3QgdGltZXpvbmUgKikgMCk7CiAgICBpZiAoVGltZV9PZl9MYXN0X1JlbG9hZCArIENBQ0hFX1RJTUUgPiBub3cudHZfc2VjKQogICAgICAgIHJldHVybjsKICAgIFRpbWVfT2ZfTGFzdF9SZWxvYWQgPSBub3cudHZfc2VjOwoKICAgIC8qCiAgICAgKiAgTWFrZXMgc3VyZSB3ZSBoYXZlIFNPTUUgc3BhY2UgYWxsb2NhdGVkIGZvciBuZXcgcm91dGluZyBlbnRyaWVzCiAgICAgKi8KICAgIGlmICghcnRoZWFkKSB7CiAgICAgICAgcnRoZWFkID0gKFJURU5UUlkgKiopIG1hbGxvYygxMDAgKiBzaXplb2YoUlRFTlRSWSAqKSk7CiAgICAgICAgaWYgKCFydGhlYWQpIHsKICAgICAgICAgICAgc25tcF9sb2coTE9HX0VSUiwgInJvdXRlIHRhYmxlIG1hbGxvYyBmYWlsXG4iKTsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgICAgICBtZW1zZXQoKGNoYXIgKikgcnRoZWFkLCAoMCksIDEwMCAqIHNpemVvZihSVEVOVFJZICopKTsKICAgICAgICBydGFsbG9jYXRlID0gMTAwOwogICAgfQoKICAgIC8qCiAgICAgKiByZXNldCB0aGUgcm91dGluZyB0YWJsZSBzaXplIHRvIHplcm8gLS0gd2FzIGEgQ01VIG1lbW9yeSBsZWFrIAogICAgICovCiAgICBydHNpemUgPSAwOwoKICAgIGZvciAodGFibGUgPSAwOyB0YWJsZSA8IE5VTV9ST1VURV9TWU1CT0xTOyB0YWJsZSsrKSB7CiNpZmRlZiBzdW5WMwogICAgICAgIGhhc2hzaXplID0gUlRIQVNIU0laOwojZWxzZQogICAgICAgIGF1dG9fbmxpc3QoUlRIQVNIU0laRV9TWU1CT0wsIChjaGFyICopICZoYXNoc2l6ZSwKICAgICAgICAgICAgICAgICAgIHNpemVvZihoYXNoc2l6ZSkpOwojZW5kaWYKICAgICAgICByb3V0ZWhhc2ggPQogICAgICAgICAgICAoc3RydWN0IG1idWYgKiopIG1hbGxvYyhoYXNoc2l6ZSAqIHNpemVvZihzdHJ1Y3QgbWJ1ZiAqKSk7CiAgICAgICAgYXV0b19ubGlzdChyb3V0ZV9zeW1ib2xzW3RhYmxlXSwgKGNoYXIgKikgcm91dGVoYXNoLAogICAgICAgICAgICAgICAgICAgaGFzaHNpemUgKiBzaXplb2Yoc3RydWN0IG1idWYgKikpOwogICAgICAgIGZvciAoaSA9IDA7IGkgPCBoYXNoc2l6ZTsgaSsrKSB7CiAgICAgICAgICAgIGlmIChyb3V0ZWhhc2hbaV0gPT0gMCkKICAgICAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICAgICBtID0gcm91dGVoYXNoW2ldOwogICAgICAgICAgICB3aGlsZSAobSkgewogICAgICAgICAgICAgICAgLyoKICAgICAgICAgICAgICAgICAqICBEaWcgdGhlIHJvdXRlIG91dCBvZiB0aGUga2VybmVsLi4uCiAgICAgICAgICAgICAgICAgKi8KICAgICAgICAgICAgICAgIGlmICghTkVUU05NUF9LTE9PS1VQKG0sIChjaGFyICopICZtYiwgc2l6ZW9mKG1iKSkpIHsKICAgICAgICAgICAgICAgICAgICBERUJVR01TR1RMKCgibWliSUkvdmFyX3JvdXRlIiwgImtsb29rdXAgZmFpbGVkXG4iKSk7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgbSA9IG1iLm1fbmV4dDsKICAgICAgICAgICAgICAgIHJ0ID0gbXRvZCgmbWIsIFJURU5UUlkgKik7CgogICAgICAgICAgICAgICAgaWYgKHJ0LT5ydF9pZnAgIT0gMCkgewoKICAgICAgICAgICAgICAgICAgICBpZiAoIU5FVFNOTVBfS0xPT0tVUChydC0+cnRfaWZwLCAoY2hhciAqKSAmaWZuZXQsIHNpemVvZihpZm5ldCkpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIERFQlVHTVNHVEwoKCJtaWJJSS92YXJfcm91dGUiLCAia2xvb2t1cCBmYWlsZWRcbiIpKTsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBpZiAoIU5FVFNOTVBfS0xPT0tVUChpZm5ldC5pZl9uYW1lLCBuYW1lLCAxNikpIHsKICAgICAgICAgICAgICAgICAgICAgICAgREVCVUdNU0dUTCgoIm1pYklJL3Zhcl9yb3V0ZSIsICJrbG9va3VwIGZhaWxlZFxuIikpOwogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIG5hbWVbMTVdID0gJ1wwJzsKICAgICAgICAgICAgICAgICAgICBjcCA9IChjaGFyICopIHN0cmNocihuYW1lLCAnXDAnKTsKICAgICAgICAgICAgICAgICAgICBzdHJpbmdfYXBwZW5kX2ludChjcCwgaWZuZXQuaWZfdW5pdCk7CiAgICAgICAgICAgICAgICAgICAgaWYgKHN0cmNtcChuYW1lLCAibG8wIikgPT0gMCkKICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7CgogICAgICAgICAgICAgICAgICAgIEludGVyZmFjZV9TY2FuX0luaXQoKTsKICAgICAgICAgICAgICAgICAgICB3aGlsZSAoSW50ZXJmYWNlX1NjYW5fTmV4dAogICAgICAgICAgICAgICAgICAgICAgICAgICAoKHNob3J0ICopICZydC0+cnRfdW5pdCwgdGVtcCwgTlVMTCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwpICE9IDApIHsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHN0cmNtcChuYW1lLCB0ZW1wKSA9PSAwKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgLyoKICAgICAgICAgICAgICAgICAqICBBbGxvY2F0ZSBhIGJsb2NrIHRvIGhvbGQgaXQgYW5kIGFkZCBpdCB0byB0aGUgZGF0YWJhc2UKICAgICAgICAgICAgICAgICAqLwogICAgICAgICAgICAgICAgaWYgKHJ0c2l6ZSA+PSBydGFsbG9jYXRlKSB7CiAgICAgICAgICAgICAgICAgICAgcnRoZWFkID0KICAgICAgICAgICAgICAgICAgICAgICAgKFJURU5UUlkgKiopIHJlYWxsb2MoKGNoYXIgKikgcnRoZWFkLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAyICogcnRhbGxvY2F0ZSAqCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZihSVEVOVFJZICopKTsKICAgICAgICAgICAgICAgICAgICBtZW1zZXQoKGNoYXIgKikgJnJ0aGVhZFtydGFsbG9jYXRlXSwgKDApLAogICAgICAgICAgICAgICAgICAgICAgICAgICBydGFsbG9jYXRlICogc2l6ZW9mKFJURU5UUlkgKikpOwoKICAgICAgICAgICAgICAgICAgICBydGFsbG9jYXRlICo9IDI7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBpZiAoIXJ0aGVhZFtydHNpemVdKQogICAgICAgICAgICAgICAgICAgIHJ0aGVhZFtydHNpemVdID0gKFJURU5UUlkgKikgbWFsbG9jKHNpemVvZihSVEVOVFJZKSk7CiAgICAgICAgICAgICAgICAvKgogICAgICAgICAgICAgICAgICogKiAgICAgIEFkZCB0aGlzIHRvIHRoZSBkYXRhYmFzZQogICAgICAgICAgICAgICAgICovCiAgICAgICAgICAgICAgICBtZW1jcHkoKGNoYXIgKikgcnRoZWFkW3J0c2l6ZV0sIChjaGFyICopIHJ0LAogICAgICAgICAgICAgICAgICAgICAgIHNpemVvZihSVEVOVFJZKSk7CiAgICAgICAgICAgICAgICBydHNpemUrKzsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBmcmVlKHJvdXRlaGFzaCk7CiAgICB9CiAgICAvKgogICAgICogIFNvcnQgaXQhCiAgICAgKi8KICAgIHFzb3J0KChjaGFyICopIHJ0aGVhZCwgcnRzaXplLCBzaXplb2YocnRoZWFkWzBdKSwgcXNvcnRfY29tcGFyZSk7Cn0KI2Vsc2UKI2lmZGVmIGxpbnV4CnN0YXRpYyB2b2lkClJvdXRlX1NjYW5fUmVsb2FkKHZvaWQpCnsKICAgIEZJTEUgICAgICAgICAgICppbjsKICAgIGNoYXIgICAgICAgICAgICBsaW5lWzI1Nl07CiAgICBzdHJ1Y3QgcnRlbnRyeSAqcnQ7CiAgICBjaGFyICAgICAgICAgICAgbmFtZVsxNl07CiAgICBzdGF0aWMgaW50ICAgICAgVGltZV9PZl9MYXN0X1JlbG9hZCA9IDA7CiAgICBzdHJ1Y3QgdGltZXZhbCAgbm93OwoKICAgIGdldHRpbWVvZmRheSgmbm93LCAoc3RydWN0IHRpbWV6b25lICopIDApOwogICAgaWYgKFRpbWVfT2ZfTGFzdF9SZWxvYWQgKyBDQUNIRV9USU1FID4gbm93LnR2X3NlYykKICAgICAgICByZXR1cm47CiAgICBUaW1lX09mX0xhc3RfUmVsb2FkID0gbm93LnR2X3NlYzsKCiAgICAvKgogICAgICogIE1ha2VzIHN1cmUgd2UgaGF2ZSBTT01FIHNwYWNlIGFsbG9jYXRlZCBmb3IgbmV3IHJvdXRpbmcgZW50cmllcwogICAgICovCiAgICBpZiAoIXJ0aGVhZCkgewogICAgICAgIHJ0aGVhZCA9IChzdHJ1Y3QgcnRlbnRyeSAqKikgY2FsbG9jKDEwMCwgc2l6ZW9mKHN0cnVjdCBydGVudHJ5ICopKTsKICAgICAgICBpZiAoIXJ0aGVhZCkgewogICAgICAgICAgICBzbm1wX2xvZyhMT0dfRVJSLCAicm91dGUgdGFibGUgbWFsbG9jIGZhaWxcbiIpOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgICAgIHJ0YWxsb2NhdGUgPSAxMDA7CiAgICB9CgogICAgLyoKICAgICAqIGZldGNoIHJvdXRlcyBmcm9tIHRoZSBwcm9jIGZpbGUtc3lzdGVtOgogICAgICovCgogICAgcnRzaXplID0gMDsKCiAgICBpZiAoIShpbiA9IGZvcGVuKCIvcHJvYy9uZXQvcm91dGUiLCAiciIpKSkgewogICAgICAgIHNubXBfbG9nKExPR19FUlIsICJjYW5ub3Qgb3BlbiAvcHJvYy9uZXQvcm91dGUgLSBidXJwc1xuIik7CiAgICAgICAgcmV0dXJuOwogICAgfQoKICAgIHdoaWxlIChmZ2V0cyhsaW5lLCBzaXplb2YobGluZSksIGluKSkgewogICAgICAgIHN0cnVjdCBydGVudHJ5ICBydGVudDsKICAgICAgICBjaGFyICAgICAgICAgICAgcnRlbnRfbmFtZVszMl07CiAgICAgICAgaW50ICAgICAgICAgICAgIHJlZmNudCwgZmxhZ3MsIG1ldHJpYzsKICAgICAgICB1bnNpZ25lZCAgICAgICAgdXNlOwoKICAgICAgICBydCA9ICZydGVudDsKICAgICAgICBtZW1zZXQoKGNoYXIgKikgcnQsICgwKSwgc2l6ZW9mKCpydCkpOwogICAgICAgIHJ0LT5ydF9kZXYgPSBydGVudF9uYW1lOwoKICAgICAgICAvKgogICAgICAgICAqIGFzIHdpdGggMS45OS4xNDoKICAgICAgICAgKiBJZmFjZSBEZXN0IEdXIEZsYWdzIFJlZkNudCBVc2UgTWV0cmljIE1hc2sgTVRVIFdpbiBJUlRUCiAgICAgICAgICogZXRoMCAwQTBBMEEwQSAwMDAwMDAwMCAwNSAwIDAgMCBGRkZGRkZGRiAxNTAwIDAgMCAKICAgICAgICAgKi8KICAgICAgICBpZiAoOCAhPSBzc2NhbmYobGluZSwgIiVzICV4ICV4ICV4ICV1ICVkICVkICV4ICUqZCAlKmQgJSpkXG4iLAogICAgICAgICAgICAgICAgICAgICAgICBydC0+cnRfZGV2LAogICAgICAgICAgICAgICAgICAgICAgICAmKCgoc3RydWN0IHNvY2thZGRyX2luICopICYocnRlbnQucnRfZHN0KSktPgogICAgICAgICAgICAgICAgICAgICAgICAgIHNpbl9hZGRyLnNfYWRkciksCiAgICAgICAgICAgICAgICAgICAgICAgICYoKChzdHJ1Y3Qgc29ja2FkZHJfaW4gKikgJihydGVudC5ydF9nYXRld2F5KSktPgogICAgICAgICAgICAgICAgICAgICAgICAgIHNpbl9hZGRyLnNfYWRkciksCiAgICAgICAgICAgICAgICAgICAgICAgIC8qCiAgICAgICAgICAgICAgICAgICAgICAgICAqIFhYWDogZml4IHR5cGUgb2YgdGhlIGFyZ3MgCiAgICAgICAgICAgICAgICAgICAgICAgICAqLwogICAgICAgICAgICAgICAgICAgICAgICAmZmxhZ3MsICZyZWZjbnQsICZ1c2UsICZtZXRyaWMsCiAgICAgICAgICAgICAgICAgICAgICAgICYoKChzdHJ1Y3Qgc29ja2FkZHJfaW4gKikgJihydGVudC5ydF9nZW5tYXNrKSktPgogICAgICAgICAgICAgICAgICAgICAgICAgIHNpbl9hZGRyLnNfYWRkcikpKQogICAgICAgICAgICBjb250aW51ZTsKCiAgICAgICAgc3RybGNweShuYW1lLCBydC0+cnRfZGV2LCBzaXplb2YobmFtZSkpOwoKICAgICAgICBydC0+cnRfZmxhZ3MgPSBmbGFncywgcnQtPnJ0X3JlZmNudCA9IHJlZmNudDsKICAgICAgICBydC0+cnRfdXNlID0gdXNlLCBydC0+cnRfbWV0cmljID0gbWV0cmljOwoKICAgICAgICBydC0+cnRfdW5pdCA9IG5ldHNubXBfYWNjZXNzX2ludGVyZmFjZV9pbmRleF9maW5kKG5hbWUpOwoKICAgICAgICAvKgogICAgICAgICAqICBBbGxvY2F0ZSBhIGJsb2NrIHRvIGhvbGQgaXQgYW5kIGFkZCBpdCB0byB0aGUgZGF0YWJhc2UKICAgICAgICAgKi8KICAgICAgICBpZiAocnRzaXplID49IHJ0YWxsb2NhdGUpIHsKICAgICAgICAgICAgcnRoZWFkID0gKHN0cnVjdCBydGVudHJ5ICoqKSByZWFsbG9jKChjaGFyICopIHJ0aGVhZCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDIgKiBydGFsbG9jYXRlICoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZihzdHJ1Y3QgcnRlbnRyeSAqKSk7CiAgICAgICAgICAgIG1lbXNldCgmcnRoZWFkW3J0YWxsb2NhdGVdLCAwLAogICAgICAgICAgICAgICAgICAgcnRhbGxvY2F0ZSAqIHNpemVvZihzdHJ1Y3QgcnRlbnRyeSAqKSk7CiAgICAgICAgICAgIHJ0YWxsb2NhdGUgKj0gMjsKICAgICAgICB9CiAgICAgICAgaWYgKCFydGhlYWRbcnRzaXplXSkKICAgICAgICAgICAgcnRoZWFkW3J0c2l6ZV0gPQogICAgICAgICAgICAgICAgKHN0cnVjdCBydGVudHJ5ICopIG1hbGxvYyhzaXplb2Yoc3RydWN0IHJ0ZW50cnkpKTsKICAgICAgICAvKgogICAgICAgICAqICBBZGQgdGhpcyB0byB0aGUgZGF0YWJhc2UKICAgICAgICAgKi8KICAgICAgICBtZW1jcHkoKGNoYXIgKikgcnRoZWFkW3J0c2l6ZV0sIChjaGFyICopIHJ0LAogICAgICAgICAgICAgICBzaXplb2Yoc3RydWN0IHJ0ZW50cnkpKTsKICAgICAgICBydHNpemUrKzsKICAgIH0KCiAgICBmY2xvc2UoaW4pOwoKICAgIC8qCiAgICAgKiAgU29ydCBpdCEKICAgICAqLwogICAgcXNvcnQoKGNoYXIgKikgcnRoZWFkLCBydHNpemUsIHNpemVvZihydGhlYWRbMF0pLCBxc29ydF9jb21wYXJlKTsKfQojZW5kaWYKI2VuZGlmCiNlbmRpZgoKCiNpZm5kZWYgc29sYXJpczIKLyoKICogICAgICBDcmVhdGUgYSBob3N0IHRhYmxlCiAqLwojaWZkZWYgaHB1eDExCnN0YXRpYyBpbnQKcXNvcnRfY29tcGFyZShjb25zdCB2b2lkICp2MSwgY29uc3Qgdm9pZCAqdjIpCnsKICAgIGNvbnN0IG1pYl9pcFJvdXRlRW50ICpyMSA9IChjb25zdCBtaWJfaXBSb3V0ZUVudCAqKSB2MTsKICAgIGNvbnN0IG1pYl9pcFJvdXRlRW50ICpyMiA9IChjb25zdCBtaWJfaXBSb3V0ZUVudCAqKSB2MjsKICAgIC8qCiAgICAgKiAgICAgIERvIHRoZSBjb21wYXJpc29uCiAgICAgKi8KICAgIGlmIChyMS0+RGVzdCA9PSByMi0+RGVzdCkKICAgICAgICByZXR1cm4gKDApOwogICAgaWYgKHIxLT5EZXN0ICA+IHIyLT5EZXN0KQogICAgICAgIHJldHVybiAoMSk7CiAgICByZXR1cm4gKC0xKTsKfQojZWxzZQpzdGF0aWMgaW50CnFzb3J0X2NvbXBhcmUoY29uc3Qgdm9pZCAqdjEsIGNvbnN0IHZvaWQgKnYyKQp7CiAgICBSVEVOVFJZICogY29uc3QgKnIxID0gKFJURU5UUlkgKiBjb25zdCAqKSB2MTsKICAgIFJURU5UUlkgKiBjb25zdCAqcjIgPSAoUlRFTlRSWSAqIGNvbnN0ICopIHYyOwojaWYgTkVFRF9LTEdFVFNBCiAgICByZWdpc3RlciB1X2xvbmcgZHN0MSA9CiAgICAgICAgbnRvaGwoa2xnZXRzYSgoY29uc3Qgc3RydWN0IHNvY2thZGRyX2luICopICgqcjEpLT5ydF9kc3QpLT4KICAgICAgICAgICAgICBzaW5fYWRkci5zX2FkZHIpOwogICAgcmVnaXN0ZXIgdV9sb25nIGRzdDIgPQogICAgICAgIG50b2hsKGtsZ2V0c2EoKGNvbnN0IHN0cnVjdCBzb2NrYWRkcl9pbiAqKSAoKnIyKS0+cnRfZHN0KS0+CiAgICAgICAgICAgICAgc2luX2FkZHIuc19hZGRyKTsKI2Vsc2UKICAgIHJlZ2lzdGVyIHVfbG9uZyBkc3QxID0KICAgICAgICBudG9obCgoKGNvbnN0IHN0cnVjdCBzb2NrYWRkcl9pbiAqKSAmKCgqcjEpLT5ydF9kc3QpKS0+c2luX2FkZHIuCiAgICAgICAgICAgICAgc19hZGRyKTsKICAgIHJlZ2lzdGVyIHVfbG9uZyBkc3QyID0KICAgICAgICBudG9obCgoKGNvbnN0IHN0cnVjdCBzb2NrYWRkcl9pbiAqKSAmKCgqcjIpLT5ydF9kc3QpKS0+c2luX2FkZHIuCiAgICAgICAgICAgICAgc19hZGRyKTsKI2VuZGlmICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBORUVEX0tMR0VUU0EgKi8KCiAgICAvKgogICAgICogICAgICBEbyB0aGUgY29tcGFyaXNvbgogICAgICovCiAgICBpZiAoZHN0MSA9PSBkc3QyKQogICAgICAgIHJldHVybiAoMCk7CiAgICBpZiAoZHN0MSA+IGRzdDIpCiAgICAgICAgcmV0dXJuICgxKTsKICAgIHJldHVybiAoLTEpOwp9CiNlbmRpZiAgICAgICAgICAgICAgICAgICAgICAgICAgLyogaHB1eDExICovCiNlbmRpZiAgICAgICAgICAgICAgICAgICAgICAgICAgLyogbm90IFVTRV9TWVNDVExfUk9VVEVfRFVNUCAqLwoKI2VuZGlmICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBzb2xhcmlzMiAqLwoKI2Vsc2UgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBXSU4zMiBjeWd3aW4gKi8KI2luY2x1ZGUgPGlwaGxwYXBpLmg+CiNpZm5kZWYgTUlCX0lQUFJPVE9fTkVUTUdNVAojZGVmaW5lIE1JQl9JUFBST1RPX05FVE1HTVQgMwojZW5kaWYKClBNSUJfSVBGT1JXQVJEUk9XIHJvdXRlX3JvdzsKaW50ICAgICAgICAgICAgIGNyZWF0ZV9mbGFnOwp2b2lkCmluaXRfdmFyX3JvdXRlKHZvaWQpCnsKfQoKdV9jaGFyICAgICAgICAgKgp2YXJfaXBSb3V0ZUVudHJ5KHN0cnVjdCB2YXJpYWJsZSAqdnAsCiAgICAgICAgICAgICAgICAgb2lkICogbmFtZSwKICAgICAgICAgICAgICAgICBzaXplX3QgKiBsZW5ndGgsCiAgICAgICAgICAgICAgICAgaW50IGV4YWN0LCBzaXplX3QgKiB2YXJfbGVuLCBXcml0ZU1ldGhvZCAqKiB3cml0ZV9tZXRob2QpCnsKICAgIC8qCiAgICAgKiBvYmplY3QgaWRlbnRpZmllciBpcyBvZiBmb3JtOgogICAgICogMS4zLjYuMS4yLjEuNC4yMS4xLj8uQS5CLkMuRCwgIHdoZXJlIEEuQi5DLkQgaXMgSVAgYWRkcmVzcy4KICAgICAqIElQQUREUiBzdGFydHMgYXQgb2Zmc2V0IDEwLgogICAgICovCiAgICByZWdpc3RlciBpbnQgICAgU2F2ZV9WYWxpZCwgcmVzdWx0LCBSdEluZGV4OwogICAgc3RhdGljIGludCAgICAgIHNhdmVOYW1lTGVuID0gMCwgc2F2ZUV4YWN0ID0gMCwgc2F2ZVJ0SW5kZXggPQogICAgICAgIDAsIHJ0c2l6ZSA9IDA7CiAgICBzdGF0aWMgb2lkICAgICAgc2F2ZU5hbWVbTUFYX09JRF9MRU5dLCBDdXJyZW50W01BWF9PSURfTEVOXTsKICAgIHVfY2hhciAgICAgICAgICpjcDsKICAgIG9pZCAgICAgICAgICAgICpvcDsKICAgIERXT1JEICAgICAgICAgICBzdGF0dXMgPSBOT19FUlJPUjsKICAgIERXT1JEICAgICAgICAgICBkd0FjdHVhbFNpemUgPSAwOwogICAgc3RhdGljIFBNSUJfSVBGT1JXQVJEVEFCTEUgcElwUnRyVGFibGUgPSBOVUxMOwogICAgc3RydWN0IHRpbWV2YWwgIG5vdzsKICAgIHN0YXRpYyBsb25nICAgICBUaW1lX09mX0xhc3RfUmVsb2FkID0gMDsKICAgIHVfY2hhciAgICAgICAgICBkZXN0X2FkZHJbNF07CiAgICBNSUJfSVBGT1JXQVJEUk9XIHRlbXBfcm93OwogICAgc3RhdGljIGluX2FkZHJfdCBhZGRyX3JldDsKCgogICAgLyoqIAogICAgICoqIHRoaXMgb3B0aW1pc2F0aW9uIGZhaWxzLCBpZiB0aGVyZSBpcyBvbmx5IGEgc2luZ2xlIHJvdXRlIGF2YWlsLgogICAgICoqIGl0IGlzIGEgdmVyeSBzcGVjaWFsIGNhc2UsIGJ1dCBiZXR0ZXIgbGVhdmUgaXQgb3V0IC4uLgogICAgICoqLwojaWYgTkVUU05NUF9OT19EVU1NWV9WQUxVRVMKICAgIHNhdmVOYW1lTGVuID0gMDsKI2VuZGlmCiAgICBpZiAocm91dGVfcm93ID09IE5VTEwpIHsKICAgICAgICAvKgogICAgICAgICAqIEZyZWUgYWxsb2NhdGVkIG1lbW9yeSBpbiBjYXNlIG9mIFNFVCByZXF1ZXN0J3MgRlJFRSBwaGFzZSAKICAgICAgICAgKi8KICAgICAgICByb3V0ZV9yb3cgPSAoUE1JQl9JUEZPUldBUkRST1cpIG1hbGxvYyhzaXplb2YoTUlCX0lQRk9SV0FSRFJPVykpOwogICAgfQogICAgZ2V0dGltZW9mZGF5KCZub3csIChzdHJ1Y3QgdGltZXpvbmUgKikgMCk7CiAgICBpZiAoKHJ0c2l6ZSA8PSAxKSB8fCAoVGltZV9PZl9MYXN0X1JlbG9hZCArIDUgPD0gbm93LnR2X3NlYykpCiAgICAgICAgU2F2ZV9WYWxpZCA9IDA7CiAgICBlbHNlCiAgICAgICAgLyoKICAgICAgICAgKiAgT1BUSU1JWkFUSU9OOgogICAgICAgICAqCiAgICAgICAgICogIElmIHRoZSBuYW1lIHdhcyB0aGUgc2FtZSBhcyB0aGUgbGFzdCBuYW1lLCB3aXRoIHRoZSBwb3NzaWJsZQogICAgICAgICAqICBleGNlcHRpb24gb2YgdGhlIFs5XXRoIHRva2VuLCB0aGVuIGRvbid0IHJlYWQgdGhlIHJvdXRpbmcgdGFibGUKICAgICAgICAgKgogICAgICAgICAqLwoKICAgIGlmICgoc2F2ZU5hbWVMZW4gPT0gKGludCkgKmxlbmd0aCkgJiYgKHNhdmVFeGFjdCA9PSBleGFjdCkpIHsKICAgICAgICByZWdpc3RlciBpbnQgICAgdGVtcCA9IG5hbWVbOV07CiAgICAgICAgbmFtZVs5XSA9IDA7CiAgICAgICAgU2F2ZV9WYWxpZCA9CiAgICAgICAgICAgIChzbm1wX29pZF9jb21wYXJlKG5hbWUsICpsZW5ndGgsIHNhdmVOYW1lLCBzYXZlTmFtZUxlbikgPT0gMCk7CiAgICAgICAgbmFtZVs5XSA9IHRlbXA7CiAgICB9IGVsc2UKICAgICAgICBTYXZlX1ZhbGlkID0gMDsKCiAgICBpZiAoU2F2ZV9WYWxpZCkgewogICAgICAgIHJlZ2lzdGVyIGludCAgICB0ZW1wID0gbmFtZVs5XTsgLyogRml4IHVwICdsb3dlc3QnIGZvdW5kIGVudHJ5ICovCiAgICAgICAgbWVtY3B5KChjaGFyICopIG5hbWUsIChjaGFyICopIEN1cnJlbnQsIDE0ICogc2l6ZW9mKG9pZCkpOwogICAgICAgIG5hbWVbOV0gPSB0ZW1wOwogICAgICAgICpsZW5ndGggPSAxNDsKICAgICAgICBSdEluZGV4ID0gc2F2ZVJ0SW5kZXg7CiAgICB9IGVsc2UgewogICAgICAgIC8qCiAgICAgICAgICogZmlsbCBpbiBvYmplY3QgcGFydCBvZiBuYW1lIGZvciBjdXJyZW50KGxlc3Mgc2l6ZW9mIGluc3RhbmNlIHBhcnQpIAogICAgICAgICAqLwoKICAgICAgICBtZW1jcHkoKGNoYXIgKikgQ3VycmVudCwgKGNoYXIgKikgdnAtPm5hbWUsCiAgICAgICAgICAgICAgIChpbnQpICh2cC0+bmFtZWxlbikgKiBzaXplb2Yob2lkKSk7CgoKICAgICAgICBpZiAoKFRpbWVfT2ZfTGFzdF9SZWxvYWQgKyA1IDw9IG5vdy50dl9zZWMpCiAgICAgICAgICAgIHx8IChwSXBSdHJUYWJsZSA9PSBOVUxMKSkgewogICAgICAgICAgICBpZiAocElwUnRyVGFibGUgIT0gTlVMTCkKICAgICAgICAgICAgICAgIGZyZWUocElwUnRyVGFibGUpOwogICAgICAgICAgICBUaW1lX09mX0xhc3RfUmVsb2FkID0gbm93LnR2X3NlYzsKICAgICAgICAgICAgLyoKICAgICAgICAgICAgICogcXVlcnkgZm9yIGJ1ZmZlciBzaXplIG5lZWRlZCAKICAgICAgICAgICAgICovCiAgICAgICAgICAgIHN0YXR1cyA9IEdldElwRm9yd2FyZFRhYmxlKHBJcFJ0clRhYmxlLCAmZHdBY3R1YWxTaXplLCBUUlVFKTsKICAgICAgICAgICAgaWYgKHN0YXR1cyA9PSBFUlJPUl9JTlNVRkZJQ0lFTlRfQlVGRkVSKSB7CiAgICAgICAgICAgICAgICBwSXBSdHJUYWJsZSA9IChQTUlCX0lQRk9SV0FSRFRBQkxFKSBtYWxsb2MoZHdBY3R1YWxTaXplKTsKICAgICAgICAgICAgICAgIGlmIChwSXBSdHJUYWJsZSAhPSBOVUxMKSB7CiAgICAgICAgICAgICAgICAgICAgLyoKICAgICAgICAgICAgICAgICAgICAgKiBHZXQgdGhlIHNvcnRlZCBJUCBSb3V0ZSBUYWJsZSAKICAgICAgICAgICAgICAgICAgICAgKi8KICAgICAgICAgICAgICAgICAgICBzdGF0dXMgPQogICAgICAgICAgICAgICAgICAgICAgICBHZXRJcEZvcndhcmRUYWJsZShwSXBSdHJUYWJsZSwgJmR3QWN0dWFsU2l6ZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVFJVRSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgaWYgKHN0YXR1cyA9PSBOT19FUlJPUikgewogICAgICAgICAgICBydHNpemUgPSBwSXBSdHJUYWJsZS0+ZHdOdW1FbnRyaWVzOwogICAgICAgICAgICBmb3IgKFJ0SW5kZXggPSAwOyBSdEluZGV4IDwgcnRzaXplOyBSdEluZGV4KyspIHsKICAgICAgICAgICAgICAgIGNwID0gKHVfY2hhciAqKSAmIHBJcFJ0clRhYmxlLT50YWJsZVtSdEluZGV4XS4KICAgICAgICAgICAgICAgICAgICBkd0ZvcndhcmREZXN0OwogICAgICAgICAgICAgICAgb3AgPSBDdXJyZW50ICsgMTA7CiAgICAgICAgICAgICAgICAqb3ArKyA9ICpjcCsrOwogICAgICAgICAgICAgICAgKm9wKysgPSAqY3ArKzsKICAgICAgICAgICAgICAgICpvcCsrID0gKmNwKys7CiAgICAgICAgICAgICAgICAqb3ArKyA9ICpjcCsrOwoKICAgICAgICAgICAgICAgIHJlc3VsdCA9IHNubXBfb2lkX2NvbXBhcmUobmFtZSwgKmxlbmd0aCwgQ3VycmVudCwgMTQpOwogICAgICAgICAgICAgICAgaWYgKChleGFjdCAmJiAocmVzdWx0ID09IDApKSB8fCAoIWV4YWN0ICYmIChyZXN1bHQgPCAwKSkpCiAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgaWYgKFJ0SW5kZXggPj0gcnRzaXplKSB7CiAgICAgICAgICAgIC8qCiAgICAgICAgICAgICAqIGZvciBjcmVhdGlvbiBvZiBuZXcgcm93LCBvbmx5IGlwTmV0VG9NZWRpYVRhYmxlIGNhc2UgaXMgY29uc2lkZXJlZCAKICAgICAgICAgICAgICovCiAgICAgICAgICAgIGlmICgqbGVuZ3RoID09IDE0KSB7CiAgICAgICAgICAgICAgICBjcmVhdGVfZmxhZyA9IDE7CiAgICAgICAgICAgICAgICAqd3JpdGVfbWV0aG9kID0gd3JpdGVfcnRlOwogICAgICAgICAgICAgICAgZGVzdF9hZGRyWzBdID0gKHVfY2hhcikgbmFtZVsxMF07CiAgICAgICAgICAgICAgICBkZXN0X2FkZHJbMV0gPSAodV9jaGFyKSBuYW1lWzExXTsKICAgICAgICAgICAgICAgIGRlc3RfYWRkclsyXSA9ICh1X2NoYXIpIG5hbWVbMTJdOwogICAgICAgICAgICAgICAgZGVzdF9hZGRyWzNdID0gKHVfY2hhcikgbmFtZVsxM107CiAgICAgICAgICAgICAgICB0ZW1wX3Jvdy5kd0ZvcndhcmREZXN0ID0gKigoRFdPUkQgKikgZGVzdF9hZGRyKTsKICAgICAgICAgICAgICAgIHRlbXBfcm93LmR3Rm9yd2FyZFBvbGljeSA9IDA7CiAgICAgICAgICAgICAgICB0ZW1wX3Jvdy5kd0ZvcndhcmRQcm90byA9IE1JQl9JUFBST1RPX05FVE1HTVQ7CiAgICAgICAgICAgICAgICAqcm91dGVfcm93ID0gdGVtcF9yb3c7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZnJlZShwSXBSdHJUYWJsZSk7CiAgICAgICAgICAgIHBJcFJ0clRhYmxlID0gTlVMTDsKICAgICAgICAgICAgcnRzaXplID0gMDsKICAgICAgICAgICAgcmV0dXJuIChOVUxMKTsKICAgICAgICB9CiAgICAgICAgY3JlYXRlX2ZsYWcgPSAwOwogICAgICAgIC8qCiAgICAgICAgICogIFNhdmUgaW4gdGhlICdjYWNoZScKICAgICAgICAgKi8KICAgICAgICBtZW1jcHkoKGNoYXIgKikgc2F2ZU5hbWUsIChjaGFyICopIG5hbWUsCiAgICAgICAgICAgICAgIFNOTVBfTUlOKCpsZW5ndGgsIE1BWF9PSURfTEVOKSAqIHNpemVvZihvaWQpKTsKICAgICAgICBzYXZlTmFtZVs5XSA9IDA7CiAgICAgICAgc2F2ZU5hbWVMZW4gPSAqbGVuZ3RoOwogICAgICAgIHNhdmVFeGFjdCA9IGV4YWN0OwogICAgICAgIHNhdmVSdEluZGV4ID0gUnRJbmRleDsKCiAgICAgICAgLyoKICAgICAgICAgKiAgUmV0dXJuIHRoZSBuYW1lCiAgICAgICAgICovCiAgICAgICAgbWVtY3B5KChjaGFyICopIG5hbWUsIChjaGFyICopIEN1cnJlbnQsIDE0ICogc2l6ZW9mKG9pZCkpOwogICAgICAgICpsZW5ndGggPSAxNDsKICAgIH0KICAgICp2YXJfbGVuID0gc2l6ZW9mKGxvbmdfcmV0dXJuKTsKICAgICpyb3V0ZV9yb3cgPSBwSXBSdHJUYWJsZS0+dGFibGVbUnRJbmRleF07CgogICAgc3dpdGNoICh2cC0+bWFnaWMpIHsKICAgIGNhc2UgSVBST1VURURFU1Q6CiAgICAgICAgKnZhcl9sZW4gPSBzaXplb2YoYWRkcl9yZXQpOwogICAgICAgICp3cml0ZV9tZXRob2QgPSB3cml0ZV9ydGU7CiAgICAgICAgYWRkcl9yZXQgPSBwSXBSdHJUYWJsZS0+dGFibGVbUnRJbmRleF0uZHdGb3J3YXJkRGVzdDsKICAgICAgICByZXR1cm4gKHVfY2hhciAqKSAmIGFkZHJfcmV0OwogICAgY2FzZSBJUFJPVVRFSUZJTkRFWDoKICAgICAgICAqd3JpdGVfbWV0aG9kID0gd3JpdGVfcnRlOwogICAgICAgIGxvbmdfcmV0dXJuID0gcElwUnRyVGFibGUtPnRhYmxlW1J0SW5kZXhdLmR3Rm9yd2FyZElmSW5kZXg7CiAgICAgICAgcmV0dXJuICh1X2NoYXIgKikgJiBsb25nX3JldHVybjsKICAgIGNhc2UgSVBST1VURU1FVFJJQzE6CiAgICAgICAgKndyaXRlX21ldGhvZCA9IHdyaXRlX3J0ZTsKICAgICAgICBsb25nX3JldHVybiA9IHBJcFJ0clRhYmxlLT50YWJsZVtSdEluZGV4XS5kd0ZvcndhcmRNZXRyaWMxOwogICAgICAgIHJldHVybiAodV9jaGFyICopICYgbG9uZ19yZXR1cm47CiAgICBjYXNlIElQUk9VVEVNRVRSSUMyOgogICAgICAgICp3cml0ZV9tZXRob2QgPSB3cml0ZV9ydGU7CiAgICAgICAgbG9uZ19yZXR1cm4gPSBwSXBSdHJUYWJsZS0+dGFibGVbUnRJbmRleF0uZHdGb3J3YXJkTWV0cmljMjsKICAgICAgICByZXR1cm4gKHVfY2hhciAqKSAmIGxvbmdfcmV0dXJuOwogICAgY2FzZSBJUFJPVVRFTUVUUklDMzoKICAgICAgICAqd3JpdGVfbWV0aG9kID0gd3JpdGVfcnRlOwogICAgICAgIGxvbmdfcmV0dXJuID0gcElwUnRyVGFibGUtPnRhYmxlW1J0SW5kZXhdLmR3Rm9yd2FyZE1ldHJpYzM7CiAgICAgICAgcmV0dXJuICh1X2NoYXIgKikgJiBsb25nX3JldHVybjsKICAgIGNhc2UgSVBST1VURU1FVFJJQzQ6CiAgICAgICAgKndyaXRlX21ldGhvZCA9IHdyaXRlX3J0ZTsKICAgICAgICBsb25nX3JldHVybiA9IHBJcFJ0clRhYmxlLT50YWJsZVtSdEluZGV4XS5kd0ZvcndhcmRNZXRyaWM0OwogICAgICAgIHJldHVybiAodV9jaGFyICopICYgbG9uZ19yZXR1cm47CiAgICBjYXNlIElQUk9VVEVNRVRSSUM1OgogICAgICAgICp3cml0ZV9tZXRob2QgPSB3cml0ZV9ydGU7CiAgICAgICAgbG9uZ19yZXR1cm4gPSBwSXBSdHJUYWJsZS0+dGFibGVbUnRJbmRleF0uZHdGb3J3YXJkTWV0cmljNTsKICAgICAgICByZXR1cm4gKHVfY2hhciAqKSAmIGxvbmdfcmV0dXJuOwogICAgY2FzZSBJUFJPVVRFTkVYVEhPUDoKICAgICAgICAqdmFyX2xlbiA9IHNpemVvZihhZGRyX3JldCk7CiAgICAgICAgKndyaXRlX21ldGhvZCA9IHdyaXRlX3J0ZTsKICAgICAgICBhZGRyX3JldCA9IHBJcFJ0clRhYmxlLT50YWJsZVtSdEluZGV4XS5kd0ZvcndhcmROZXh0SG9wOwogICAgICAgIHJldHVybiAodV9jaGFyICopICYgYWRkcl9yZXQ7CiAgICBjYXNlIElQUk9VVEVUWVBFOgogICAgICAgICp3cml0ZV9tZXRob2QgPSB3cml0ZV9ydGU7CiAgICAgICAgbG9uZ19yZXR1cm4gPSBwSXBSdHJUYWJsZS0+dGFibGVbUnRJbmRleF0uZHdGb3J3YXJkVHlwZTsKICAgICAgICByZXR1cm4gKHVfY2hhciAqKSAmIGxvbmdfcmV0dXJuOwogICAgY2FzZSBJUFJPVVRFUFJPVE86CiAgICAgICAgbG9uZ19yZXR1cm4gPSBwSXBSdHJUYWJsZS0+dGFibGVbUnRJbmRleF0uZHdGb3J3YXJkUHJvdG87CiAgICAgICAgcmV0dXJuICh1X2NoYXIgKikgJiBsb25nX3JldHVybjsKICAgIGNhc2UgSVBST1VURUFHRToKICAgICAgICAqd3JpdGVfbWV0aG9kID0gd3JpdGVfcnRlOwogICAgICAgIGxvbmdfcmV0dXJuID0gcElwUnRyVGFibGUtPnRhYmxlW1J0SW5kZXhdLmR3Rm9yd2FyZEFnZTsKICAgICAgICByZXR1cm4gKHVfY2hhciAqKSAmIGxvbmdfcmV0dXJuOwogICAgY2FzZSBJUFJPVVRFTUFTSzoKICAgICAgICAqd3JpdGVfbWV0aG9kID0gd3JpdGVfcnRlOwogICAgICAgICp2YXJfbGVuID0gc2l6ZW9mKGFkZHJfcmV0KTsKICAgICAgICBhZGRyX3JldCA9IHBJcFJ0clRhYmxlLT50YWJsZVtSdEluZGV4XS5kd0ZvcndhcmRNYXNrOwogICAgICAgIHJldHVybiAodV9jaGFyICopICYgYWRkcl9yZXQ7CiAgICBjYXNlIElQUk9VVEVJTkZPOgogICAgICAgICp2YXJfbGVuID0gbnVsbE9pZExlbjsKICAgICAgICByZXR1cm4gKHVfY2hhciAqKSBudWxsT2lkOwogICAgZGVmYXVsdDoKICAgICAgICBERUJVR01TR1RMKCgic25tcGQiLCAidW5rbm93biBzdWItaWQgJWQgaW4gdmFyX2lwUm91dGVFbnRyeVxuIiwKICAgICAgICAgICAgICAgICAgICB2cC0+bWFnaWMpKTsKICAgIH0KICAgIHJldHVybiBOVUxMOwp9CgojZW5kaWYgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFdJTjMyIGN5Z3dpbiAqLwoKI2Vsc2UgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBORVRTTk1QX0NBTl9VU0VfU1lTQ1RMICovCgpzdGF0aWMKVEFJTFFfSEVBRCgsIHNubXBydCkKICAgIHJ0aGVhZDsKICAgICBzdGF0aWMgY2hhciAgICAqcnRidWY7CiAgICAgc3RhdGljIHNpemVfdCAgIHJ0YnVmbGVuOwogICAgIHN0YXRpYyB0aW1lX3QgICBsYXN0dGltZTsKCiAgICAgc3RydWN0IHNubXBydCB7CiAgICAgICAgIFRBSUxRX0VOVFJZKHNubXBydCkgbGluazsKICAgICAgICAgc3RydWN0IHJ0X21zZ2hkciAqaGRyOwogICAgICAgICBzdHJ1Y3QgaW5fYWRkciAgZGVzdDsKICAgICAgICAgc3RydWN0IGluX2FkZHIgIGdhdGV3YXk7CiAgICAgICAgIHN0cnVjdCBpbl9hZGRyICBuZXRtYXNrOwogICAgICAgICBpbnQgICAgICAgICAgICAgaW5kZXg7CiAgICAgICAgIHN0cnVjdCBpbl9hZGRyICBpZmE7CiAgICAgfTsKCiAgICAgc3RhdGljIHZvaWQKICAgICAgICAgICAgICAgICAgICAgcnRtc2coc3RydWN0IHJ0X21zZ2hkciAqcnRtKQp7CiAgICBzdHJ1Y3Qgc25tcHJ0ICAqcnQ7CiAgICBzdHJ1Y3Qgc29ja2FkZHIgKnNhOwogICAgaW50ICAgICAgICAgICAgIGJpdCwgZ290ZGVzdCwgZ290bWFzazsKCiAgICBydCA9IG1hbGxvYyhzaXplb2YgKnJ0KTsKICAgIGlmIChydCA9PSAwKQogICAgICAgIHJldHVybjsKICAgIHJ0LT5oZHIgPSBydG07CiAgICBydC0+aWZhLnNfYWRkciA9IDA7CiAgICBydC0+ZGVzdCA9IHJ0LT5nYXRld2F5ID0gcnQtPm5ldG1hc2sgPSBydC0+aWZhOwogICAgcnQtPmluZGV4ID0gcnRtLT5ydG1faW5kZXg7CgogICAgZ290ZGVzdCA9IGdvdG1hc2sgPSAwOwogICAgc2EgPSAoc3RydWN0IHNvY2thZGRyICopIChydG0gKyAxKTsKICAgIGZvciAoYml0ID0gMTsgKChjaGFyICopIHNhIDwgKGNoYXIgKikgcnRtICsgcnRtLT5ydG1fbXNnbGVuKSAmJiBiaXQ7CiAgICAgICAgIGJpdCA8PD0gMSkgewogICAgICAgIGlmICgocnRtLT5ydG1fYWRkcnMgJiBiaXQpID09IDApCiAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgIHN3aXRjaCAoYml0KSB7CiAgICAgICAgY2FzZSBSVEFfRFNUOgojZGVmaW5lIHNhdG9zaW4oc2EpICgoc3RydWN0IHNvY2thZGRyX2luICopKHNhKSkKICAgICAgICAgICAgcnQtPmRlc3QgPSBzYXRvc2luKHNhKS0+c2luX2FkZHI7CiAgICAgICAgICAgIGdvdGRlc3QgPSAxOwogICAgICAgICAgICBicmVhazsKICAgICAgICBjYXNlIFJUQV9HQVRFV0FZOgogICAgICAgICAgICBpZiAoc2EtPnNhX2ZhbWlseSA9PSBBRl9JTkVUKQogICAgICAgICAgICAgICAgcnQtPmdhdGV3YXkgPSBzYXRvc2luKHNhKS0+c2luX2FkZHI7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgIGNhc2UgUlRBX05FVE1BU0s6CiAgICAgICAgICAgIGlmIChzYS0+c2FfbGVuID49IG9mZnNldG9mKHN0cnVjdCBzb2NrYWRkcl9pbiwgc2luX2FkZHIpKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJ0LT5uZXRtYXNrID0gc2F0b3NpbihzYSktPnNpbl9hZGRyOwogICAgICAgICAgICBnb3RtYXNrID0gMTsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgY2FzZSBSVEFfSUZBOgogICAgICAgICAgICBpZiAoc2EtPnNhX2ZhbWlseSA9PSBBRl9JTkVUKQogICAgICAgICAgICAgICAgcnQtPmlmYSA9IHNhdG9zaW4oc2EpLT5zaW5fYWRkcjsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgfQogICAgICAgIC8qCiAgICAgICAgICogZnJvbSBydHNvY2suYyAKICAgICAgICAgKi8KI2RlZmluZSBST1VORFVQKGEpIFwKICAgICAgICAoKGEpID4gMCA/ICgxICsgKCgoYSkgLSAxKSB8IChzaXplb2YobG9uZykgLSAxKSkpIDogc2l6ZW9mKGxvbmcpKQogICAgICAgIHNhID0gKHN0cnVjdCBzb2NrYWRkciAqKSAoKGNoYXIgKikgc2EgKyBST1VORFVQKHNhLT5zYV9sZW4pKTsKICAgIH0KICAgIGlmICghZ290ZGVzdCkgewogICAgICAgIC8qCiAgICAgICAgICogWFhYIGNhbid0IGhhcHBlbiBpZiBjb2RlIGFib3ZlIGlzIGNvcnJlY3QgCiAgICAgICAgICovCiAgICAgICAgc25tcF9sb2coTE9HX0VSUiwgInJvdXRlIG5vIGRlc3Q/XG4iKTsKICAgICAgICBmcmVlKHJ0KTsKICAgIH0gZWxzZSB7CiAgICAgICAgLyoKICAgICAgICAgKiBJZiBubyBtYXNrIHByb3ZpZGVkLCBpdCB3YXMgYSBob3N0IHJvdXRlLiAKICAgICAgICAgKi8KICAgICAgICBpZiAoIWdvdG1hc2spCiAgICAgICAgICAgIHJ0LT5uZXRtYXNrLnNfYWRkciA9IH4wOwogICAgICAgIFRBSUxRX0lOU0VSVF9UQUlMKCZydGhlYWQsIHJ0LCBsaW5rKTsKICAgIH0KfQoKc3RhdGljIGludApzdWNrX2tydChpbnQgZm9yY2UpCnsKICAgIHRpbWVfdCAgICAgICAgICBub3c7CiAgICBzdHJ1Y3Qgc25tcHJ0ICAqcnQsICpuZXh0OwogICAgc2l6ZV90ICAgICAgICAgIGxlbjsKICAgIHN0YXRpYyBpbnQgICAgICBuYW1lWzZdID0KICAgICAgICB7IENUTF9ORVQsIFBGX1JPVVRFLCAwLCBBRl9JTkVULCBORVRfUlRfRFVNUCwgMCB9OwogICAgY2hhciAgICAgICAgICAgKmNwOwogICAgc3RydWN0IHJ0X21zZ2hkciAqcnRtOwoKICAgIHRpbWUoJm5vdyk7CiAgICBpZiAobm93IDwgKGxhc3R0aW1lICsgQ0FDSEVfVElNRSkgJiYgIWZvcmNlKQogICAgICAgIHJldHVybiAwOwogICAgbGFzdHRpbWUgPSBub3c7CgogICAgZm9yIChydCA9IHJ0aGVhZC50cWhfZmlyc3Q7IHJ0OyBydCA9IG5leHQpIHsKICAgICAgICBuZXh0ID0gcnQtPmxpbmsudHFlX25leHQ7CiAgICAgICAgZnJlZShydCk7CiAgICB9CiAgICBUQUlMUV9JTklUKCZydGhlYWQpOwoKICAgIGlmIChzeXNjdGwobmFtZSwgNiwgMCwgJmxlbiwgMCwgMCkgPCAwKSB7CiAgICAgICAgc3lzbG9nKExPR19XQVJOSU5HLCAic3lzY3RsIG5ldC1yb3V0ZS1kdW1wOiAlbSIpOwogICAgICAgIHJldHVybiAtMTsKICAgIH0KCiAgICBpZiAobGVuID4gcnRidWZsZW4pIHsKICAgICAgICBjaGFyICAgICAgICAgICAqbmV3YnVmOwogICAgICAgIG5ld2J1ZiA9IHJlYWxsb2MocnRidWYsIGxlbik7CiAgICAgICAgaWYgKG5ld2J1ZiA9PSAwKQogICAgICAgICAgICByZXR1cm4gLTE7CiAgICAgICAgcnRidWYgPSBuZXdidWY7CiAgICAgICAgcnRidWZsZW4gPSBsZW47CiAgICB9CgogICAgaWYgKHN5c2N0bChuYW1lLCA2LCBydGJ1ZiwgJmxlbiwgMCwgMCkgPCAwKSB7CiAgICAgICAgc3lzbG9nKExPR19XQVJOSU5HLCAic3lzY3RsIG5ldC1yb3V0ZS1kdW1wOiAlbSIpOwogICAgICAgIHJldHVybiAtMTsKICAgIH0KCiAgICBjcCA9IHJ0YnVmOwogICAgd2hpbGUgKGNwIDwgcnRidWYgKyBsZW4pIHsKICAgICAgICBydG0gPSAoc3RydWN0IHJ0X21zZ2hkciAqKSBjcDsKICAgICAgICAvKgogICAgICAgICAqIE5COgogICAgICAgICAqIFlvdSBtaWdodCB3YW50IHRvIGV4Y2x1ZGUgcm91dGVzIHdpdGggUlRGX1dBU0NMT05FRAogICAgICAgICAqIHNldC4gIFRoaXMga2VlcHMgdGhlIGNsb25lZCBob3N0IHJvdXRlcyAoYW5kIHRodXMgYWxzbwogICAgICAgICAqIEFSUCBlbnRyaWVzKSBvdXQgb2YgdGhlIHJvdXRpbmcgdGFibGUuICBUaHVzLCBpdCBhbHNvCiAgICAgICAgICogcHJlc2VudHMgbWFuYWdlbWVudCBzdGF0aW9ucyB3aXRoIGFuIGluY29tcGxldGUgdmlldy4KICAgICAgICAgKiBJIGJlbGlldmUgdGhhdCBpdCBzaG91bGQgYmUgcG9zc2libGUgZm9yIGEgbWFuYWdlbWVudAogICAgICAgICAqIHN0YXRpb24gdG8gZXhhbWluZSAoYW5kIHBlcmhhcHMgZGVsZXRlKSBzdWNoIHJvdXRlcy4KICAgICAgICAgKi8KICAgICAgICBpZiAocnRtLT5ydG1fdmVyc2lvbiA9PSBSVE1fVkVSU0lPTiAmJiBydG0tPnJ0bV90eXBlID09IFJUTV9HRVQpCiAgICAgICAgICAgIHJ0bXNnKHJ0bSk7CiAgICAgICAgY3AgKz0gcnRtLT5ydG1fbXNnbGVuOwogICAgfQogICAgcmV0dXJuIDA7Cn0KCnVfY2hhciAgICAgICAgICoKdmFyX2lwUm91dGVFbnRyeShzdHJ1Y3QgdmFyaWFibGUgKiB2cCwKICAgICAgICAgICAgICAgICBvaWQgKiBuYW1lLAogICAgICAgICAgICAgICAgIHNpemVfdCAqIGxlbmd0aCwKICAgICAgICAgICAgICAgICBpbnQgZXhhY3QsIHNpemVfdCAqIHZhcl9sZW4sIFdyaXRlTWV0aG9kICoqIHdyaXRlX21ldGhvZCkKewogICAgLyoKICAgICAqIG9iamVjdCBpZGVudGlmaWVyIGlzIG9mIGZvcm06CiAgICAgKiAxLjMuNi4xLjIuMS40LjIxLjEuMS5BLkIuQy5ELCAgd2hlcmUgQS5CLkMuRCBpcyBJUCBhZGRyZXNzLgogICAgICogSVBBRERSIHN0YXJ0cyBhdCBvZmZzZXQgMTAuCiAgICAgKi8KICAgIGludCAgICAgICAgICAgICBTYXZlX1ZhbGlkLCByZXN1bHQ7CiAgICB1X2NoYXIgICAgICAgICAqY3A7CiAgICBvaWQgICAgICAgICAgICAqb3A7CiAgICBzdHJ1Y3Qgc25tcHJ0ICAqcnQ7CiAgICBzdGF0aWMgc3RydWN0IHNubXBydCAqc2F2ZXJ0OwogICAgc3RhdGljIGludCAgICAgIHNhdmVOYW1lTGVuLCBzYXZlRXhhY3Q7CiAgICBzdGF0aWMgb2lkICAgICAgc2F2ZU5hbWVbMTRdLCBDdXJyZW50WzE0XTsKICAgIHN0YXRpYyBpbl9hZGRyX3QgYWRkcl9yZXQ7CiAgICAKICAgICp3cml0ZV9tZXRob2QgPSBOVUxMOyAgLyogd3JpdGVfcnRlOyAgWFhYOiAgU0VUIHN1cHBvcnQgbm90IHJlYWxseSBpbXBsZW1lbnRlZCAqLwoKI2lmIDAKICAgIC8qCiAgICAgKiAgICAgIE9QVElNSVpBVElPTjoKICAgICAqCiAgICAgKiAgICAgIElmIHRoZSBuYW1lIHdhcyB0aGUgc2FtZSBhcyB0aGUgbGFzdCBuYW1lLCB3aXRoIHRoZSBwb3NzaWJsZQogICAgICogICAgICBleGNlcHRpb24gb2YgdGhlIFs5XXRoIHRva2VuLCB0aGVuIGRvbid0IHJlYWQgdGhlIHJvdXRpbmcgdGFibGUKICAgICAqCiAgICAgKi8KCiAgICBpZiAoKHNhdmVOYW1lTGVuID09ICpsZW5ndGgpICYmIChzYXZlRXhhY3QgPT0gZXhhY3QpKSB7CiAgICAgICAgaW50ICAgICAgICAgICAgIHRlbXAgPSBuYW1lWzldOwogICAgICAgIG5hbWVbOV0gPSAwOwogICAgICAgIFNhdmVfVmFsaWQgPQogICAgICAgICAgICAhc25tcF9vaWRfY29tcGFyZShuYW1lLCAqbGVuZ3RoLCBzYXZlTmFtZSwgc2F2ZU5hbWVMZW4pOwogICAgICAgIG5hbWVbOV0gPSB0ZW1wOwogICAgfSBlbHNlIHsKICAgICAgICBTYXZlX1ZhbGlkID0gMDsKICAgIH0KI2Vsc2UKICAgIFNhdmVfVmFsaWQgPSAwOwojZW5kaWYKCiAgICBpZiAoU2F2ZV9WYWxpZCkgewogICAgICAgIGludCAgICAgICAgICAgICB0ZW1wID0gbmFtZVs5XTsKICAgICAgICBtZW1jcHkobmFtZSwgQ3VycmVudCwgMTQgKiBzaXplb2Yob2lkKSk7CiAgICAgICAgbmFtZVs5XSA9IHRlbXA7CiAgICAgICAgKmxlbmd0aCA9IDE0OwogICAgICAgIHJ0ID0gc2F2ZXJ0OwogICAgfSBlbHNlIHsKICAgICAgICAvKgogICAgICAgICAqIGZpbGwgaW4gb2JqZWN0IHBhcnQgb2YgbmFtZSBmb3IgY3VycmVudAogICAgICAgICAqIChsZXNzIHNpemVvZiBpbnN0YW5jZSBwYXJ0KSAKICAgICAgICAgKi8KCiAgICAgICAgbWVtY3B5KEN1cnJlbnQsIHZwLT5uYW1lLCBTTk1QX01JTihzaXplb2YoQ3VycmVudCksIChpbnQpKHZwLT5uYW1lbGVuKSAqIHNpemVvZihvaWQpKSk7CgogICAgICAgIHN1Y2tfa3J0KDApOwoKICAgICAgICBmb3IgKHJ0ID0gcnRoZWFkLnRxaF9maXJzdDsgcnQ7IHJ0ID0gcnQtPmxpbmsudHFlX25leHQpIHsKICAgICAgICAgICAgb3AgPSBDdXJyZW50ICsgMTA7CiAgICAgICAgICAgIGNwID0gKHVfY2hhciAqKSAmIHJ0LT5kZXN0OwogICAgICAgICAgICAqb3ArKyA9ICpjcCsrOwogICAgICAgICAgICAqb3ArKyA9ICpjcCsrOwogICAgICAgICAgICAqb3ArKyA9ICpjcCsrOwogICAgICAgICAgICAqb3ArKyA9ICpjcCsrOwogICAgICAgICAgICByZXN1bHQgPSBzbm1wX29pZF9jb21wYXJlKG5hbWUsICpsZW5ndGgsIEN1cnJlbnQsIDE0KTsKICAgICAgICAgICAgaWYgKChleGFjdCAmJiAocmVzdWx0ID09IDApKQogICAgICAgICAgICAgICAgfHwgKCFleGFjdCAmJiAocmVzdWx0IDwgMCkpKQogICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgfQogICAgICAgIGlmIChydCA9PSBOVUxMKQogICAgICAgICAgICByZXR1cm4gTlVMTDsKCiAgICAgICAgLyoKICAgICAgICAgKiAgU2F2ZSBpbiB0aGUgJ2NhY2hlJwogICAgICAgICAqLwogICAgICAgIG1lbWNweShzYXZlTmFtZSwgbmFtZSwgU05NUF9NSU4oc2l6ZW9mKHNhdmVOYW1lKSwgKmxlbmd0aCAqIHNpemVvZihvaWQpKSk7CiAgICAgICAgc2F2ZU5hbWVbOV0gPSAwOwogICAgICAgIHNhdmVOYW1lTGVuID0gKmxlbmd0aDsKICAgICAgICBzYXZlRXhhY3QgPSBleGFjdDsKICAgICAgICBzYXZlcnQgPSBydDsKCiAgICAgICAgLyoKICAgICAgICAgKiAgUmV0dXJuIHRoZSBuYW1lCiAgICAgICAgICovCiAgICAgICAgbWVtY3B5KG5hbWUsIEN1cnJlbnQsIDE0ICogc2l6ZW9mKG9pZCkpOwogICAgICAgICpsZW5ndGggPSAxNDsKICAgIH0KCiAgICAqdmFyX2xlbiA9IHNpemVvZihsb25nX3JldHVybik7CgogICAgc3dpdGNoICh2cC0+bWFnaWMpIHsKICAgIGNhc2UgSVBST1VURURFU1Q6CiAgICAgICAgYWRkcl9yZXQgPSBydC0+ZGVzdC5zX2FkZHI7CiAgICAgICAgKnZhcl9sZW4gPSBzaXplb2YoYWRkcl9yZXQpOwogICAgICAgIHJldHVybiAodV9jaGFyICopICYgYWRkcl9yZXQ7CgogICAgY2FzZSBJUFJPVVRFSUZJTkRFWDoKICAgICAgICBsb25nX3JldHVybiA9IHJ0LT5pbmRleDsKICAgICAgICByZXR1cm4gKHVfY2hhciAqKSAmIGxvbmdfcmV0dXJuOwoKICAgIGNhc2UgSVBST1VURU1FVFJJQzE6CiAgICAgICAgbG9uZ19yZXR1cm4gPSAocnQtPmhkci0+cnRtX2ZsYWdzICYgUlRGX0dBVEVXQVkpID8gMSA6IDA7CiAgICAgICAgcmV0dXJuICh1X2NoYXIgKikgJiBsb25nX3JldHVybjsKICAgIGNhc2UgSVBST1VURU1FVFJJQzI6CiAgICAgICAgbG9uZ19yZXR1cm4gPSBydC0+aGRyLT5ydG1fcm14LnJteF9ydHQ7CiAgICAgICAgcmV0dXJuICh1X2NoYXIgKikgJiBsb25nX3JldHVybjsKICAgIGNhc2UgSVBST1VURU1FVFJJQzM6CiAgICAgICAgbG9uZ19yZXR1cm4gPSBydC0+aGRyLT5ydG1fcm14LnJteF9ydHR2YXI7CiAgICAgICAgcmV0dXJuICh1X2NoYXIgKikgJiBsb25nX3JldHVybjsKICAgIGNhc2UgSVBST1VURU1FVFJJQzQ6CiAgICAgICAgbG9uZ19yZXR1cm4gPSBydC0+aGRyLT5ydG1fcm14LnJteF9zc3RocmVzaDsKICAgICAgICByZXR1cm4gKHVfY2hhciAqKSAmIGxvbmdfcmV0dXJuOwogICAgY2FzZSBJUFJPVVRFTUVUUklDNToKICAgICAgICBsb25nX3JldHVybiA9IHJ0LT5oZHItPnJ0bV9ybXgucm14X210dTsKICAgICAgICByZXR1cm4gKHVfY2hhciAqKSAmIGxvbmdfcmV0dXJuOwoKICAgIGNhc2UgSVBST1VURU5FWFRIT1A6CiAgICAgICAgKnZhcl9sZW4gPSBzaXplb2YoYWRkcl9yZXQpOwogICAgICAgIGlmIChydC0+Z2F0ZXdheS5zX2FkZHIgPT0gMCAmJiBydC0+aWZhLnNfYWRkciA9PSAwKQogICAgICAgICAgICBhZGRyX3JldCA9IDA7CiAgICAgICAgZWxzZSBpZiAocnQtPmdhdGV3YXkuc19hZGRyID09IDApCiAgICAgICAgICAgIGFkZHJfcmV0ID0gcnQtPmlmYS5zX2FkZHI7CiAgICAgICAgZWxzZQogICAgICAgICAgICBhZGRyX3JldCA9IHJ0LT5nYXRld2F5LnNfYWRkcjsKICAgICAgICByZXR1cm4gKHVfY2hhciAqKSAmIGFkZHJfcmV0OwoKICAgIGNhc2UgSVBST1VURVRZUEU6CiAgICAgICAgaWYgKHJ0LT5oZHItPnJ0bV9mbGFncyAmIFJURl9VUCkgewogICAgICAgICAgICBpZiAocnQtPmhkci0+cnRtX2ZsYWdzICYgUlRGX0dBVEVXQVkpIHsKICAgICAgICAgICAgICAgIGxvbmdfcmV0dXJuID0gNDsgICAgICAgIC8qICBpbmRpcmVjdCg0KSAgKi8KICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgIGxvbmdfcmV0dXJuID0gMzsgICAgICAgIC8qICBkaXJlY3QoMykgICovCiAgICAgICAgICAgIH0KICAgICAgICB9IGVsc2UgewogICAgICAgICAgICBsb25nX3JldHVybiA9IDI7ICAgIC8qICBpbnZhbGlkKDIpICAqLwogICAgICAgIH0KICAgICAgICByZXR1cm4gKHVfY2hhciAqKSAmIGxvbmdfcmV0dXJuOwoKICAgIGNhc2UgSVBST1VURVBST1RPOgogICAgICAgIGxvbmdfcmV0dXJuID0gKHJ0LT5oZHItPnJ0bV9mbGFncyAmIFJURl9EWU5BTUlDKSA/IDQgOiAyOwogICAgICAgIHJldHVybiAodV9jaGFyICopICYgbG9uZ19yZXR1cm47CgogICAgY2FzZSBJUFJPVVRFQUdFOgojaWYgTkVUU05NUF9OT19EVU1NWV9WQUxVRVMKICAgICAgICByZXR1cm4gTlVMTDsKI2VuZGlmCiAgICAgICAgbG9uZ19yZXR1cm4gPSAwOwogICAgICAgIHJldHVybiAodV9jaGFyICopICYgbG9uZ19yZXR1cm47CgogICAgY2FzZSBJUFJPVVRFTUFTSzoKICAgICAgICBhZGRyX3JldCA9IHJ0LT5uZXRtYXNrLnNfYWRkcjsKICAgICAgICAqdmFyX2xlbiA9IHNpemVvZihhZGRyX3JldCk7CiAgICAgICAgcmV0dXJuICh1X2NoYXIgKikgJiBhZGRyX3JldDsKCiAgICBjYXNlIElQUk9VVEVJTkZPOgogICAgICAgICp2YXJfbGVuID0gbnVsbE9pZExlbjsKICAgICAgICByZXR1cm4gKHVfY2hhciAqKSBudWxsT2lkOwogICAgZGVmYXVsdDoKICAgICAgICBERUJVR01TR1RMKCgic25tcGQiLCAidW5rbm93biBzdWItaWQgJWQgaW4gdmFyX2lwUm91dGVFbnRyeVxuIiwKICAgICAgICAgICAgICAgICAgICB2cC0+bWFnaWMpKTsKICAgIH0KICAgIHJldHVybiBOVUxMOwp9Cgp2b2lkCmluaXRfdmFyX3JvdXRlKHZvaWQpCnsKICAgIDsKfQoKI2VuZGlmICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBORVRTTk1QX0NBTl9VU0VfU1lTQ1RMICovCgojaWYgZGVmaW5lZChIQVZFX1NZU19TWVNDVExfSCkgJiYgIWRlZmluZWQobGludXgpCi8qCiAqIGdldF9hZGRyZXNzKCkKICogCiAqIFRyYXZlcnNlIHRoZSBhZGRyZXNzIHN0cnVjdHVyZXMgYWZ0ZXIgYSByb3V0aW5nIHNvY2tldCBtZXNzYWdlIGFuZAogKiBleHRyYWN0IGEgc3BlY2lmaWMgb25lLgogKiAKICogU29tZSBvZiB0aGlzIGlzIHBlY3VsaWFyIHRvIElSSVggNi4yLCB3aGljaCBkb2Vzbid0IGhhdmUgc2FfbGVuIGluCiAqIHRoZSBzb2NrYWRkciBzdHJ1Y3R1cmUgeWV0LiAgV2l0aCBzYV9sZW4sIHNraXBwaW5nIGFuIGFkZHJlc3MgZW50cnkKICogd291bGQgYmUgbXVjaCBlYXNpZXIuCiAqLwojaW5jbHVkZSA8c3lzL3VuLmg+CgovKgogKiByZXR1cm5zIHRoZSBsZW5ndGggb2YgYSBzb2NrZXQgc3RydWN0dXJlIAogKi8KCnNpemVfdApzbm1wX3NvY2tldF9sZW5ndGgoaW50IGZhbWlseSkKewogICAgc2l6ZV90ICAgICAgICAgIGxlbmd0aDsKCiAgICBzd2l0Y2ggKGZhbWlseSkgewojaWZuZGVmIGN5Z3dpbgojaWYgIWRlZmluZWQgKFdJTjMyKSAmJiAhZGVmaW5lZCAoY3lnd2luKQojaWZkZWYgQUZfVU5JWAogICAgY2FzZSBBRl9VTklYOgogICAgICAgIGxlbmd0aCA9IHNpemVvZihzdHJ1Y3Qgc29ja2FkZHJfdW4pOwogICAgICAgIGJyZWFrOwojZW5kaWYgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEFGX1VOSVggKi8KI2VuZGlmCiNlbmRpZgoKI2lmbmRlZiBhaXgzCiNpZmRlZiBBRl9MSU5LCiAgICBjYXNlIEFGX0xJTks6CiNpZmRlZiBfTUFYX1NBX0xFTgogICAgICAgIGxlbmd0aCA9IF9NQVhfU0FfTEVOOwojZWxpZiBTT0NLX01BWEFERFJMRU4KICAgICAgICBsZW5ndGggPSBTT0NLX01BWEFERFJMRU47CiNlbHNlCiAgICAgICAgbGVuZ3RoID0gc2l6ZW9mKHN0cnVjdCBzb2NrYWRkcl9kbCk7CiNlbmRpZgogICAgICAgIGJyZWFrOwojZW5kaWYgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEFGX0xJTksgKi8KI2VuZGlmCgogICAgY2FzZSBBRl9JTkVUOgogICAgICAgIGxlbmd0aCA9IHNpemVvZihzdHJ1Y3Qgc29ja2FkZHJfaW4pOwogICAgICAgIGJyZWFrOwogICAgZGVmYXVsdDoKICAgICAgICBsZW5ndGggPSBzaXplb2Yoc3RydWN0IHNvY2thZGRyKTsKICAgICAgICBicmVhazsKICAgIH0KCiAgICByZXR1cm4gbGVuZ3RoOwp9Cgpjb25zdCBzdHJ1Y3Qgc29ja2FkZHIgKgpnZXRfYWRkcmVzcyhjb25zdCB2b2lkICpfYXAsIGludCBhZGRyZXNzZXMsIGludCB3YW50ZWQpCnsKICAgIGNvbnN0IHN0cnVjdCBzb2NrYWRkciAqYXAgPSAoY29uc3Qgc3RydWN0IHNvY2thZGRyICopIF9hcDsKICAgIGludCAgICAgICAgICAgICBpaW5kZXg7CiAgICBpbnQgICAgICAgICAgICAgYml0bWFzazsKCiAgICBmb3IgKGlpbmRleCA9IDAsIGJpdG1hc2sgPSAxOwogICAgICAgICBpaW5kZXggPCBSVEFYX01BWDsgKytpaW5kZXgsIGJpdG1hc2sgPDw9IDEpIHsKICAgICAgICBpZiAoYml0bWFzayA9PSB3YW50ZWQpIHsKICAgICAgICAgICAgaWYgKGJpdG1hc2sgJiBhZGRyZXNzZXMpIHsKICAgICAgICAgICAgICAgIHJldHVybiBhcDsKICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgIHJldHVybiAwOwogICAgICAgICAgICB9CiAgICAgICAgfSBlbHNlIGlmIChiaXRtYXNrICYgYWRkcmVzc2VzKSB7CiAgICAgICAgICAgIHVuc2lnbmVkICAgICAgICBsZW5ndGggPQogICAgICAgICAgICAgICAgKHVuc2lnbmVkKSBzbm1wX3NvY2tldF9sZW5ndGgoYXAtPnNhX2ZhbWlseSk7CiAgICAgICAgICAgIHdoaWxlIChsZW5ndGggJSBzaXplb2YobG9uZykgIT0gMCkKICAgICAgICAgICAgICAgICsrbGVuZ3RoOwogICAgICAgICAgICBhcCA9IChjb25zdCBzdHJ1Y3Qgc29ja2FkZHIgKikgKChjb25zdCBjaGFyICopIGFwICsgbGVuZ3RoKTsKICAgICAgICB9CiAgICB9CiAgICByZXR1cm4gMDsKfQoKLyoKICogZ2V0X2luX2FkZHJlc3MoKQogKiAKICogQ29udmVuaWVuY2UgZnVuY3Rpb24gZm9yIHRoZSBzcGVjaWFsIGNhc2Ugb2YgZ2V0X2FkZHJlc3Mgd2hlcmUgYW4KICogQUZfSU5FVCBhZGRyZXNzIGlzIGRlc2lyZWQsIGFuZCB3ZSdyZSBvbmx5IGludGVyZXN0ZWQgaW4gdGhlIGluX2FkZHIKICogcGFydC4KICovCmNvbnN0IHN0cnVjdCBpbl9hZGRyICoKZ2V0X2luX2FkZHJlc3MoY29uc3Qgdm9pZCAqYXAsIGludCBhZGRyZXNzZXMsIGludCB3YW50ZWQpCnsKICAgIGNvbnN0IHN0cnVjdCBzb2NrYWRkcl9pbiAqYTsKCiAgICBhID0gKGNvbnN0IHN0cnVjdCBzb2NrYWRkcl9pbiAqKSBnZXRfYWRkcmVzcyhhcCwgYWRkcmVzc2VzLCB3YW50ZWQpOwogICAgaWYgKGEgPT0gTlVMTCkKICAgICAgICByZXR1cm4gTlVMTDsKCiAgICBpZiAoYS0+c2luX2ZhbWlseSAhPSBBRl9JTkVUKSB7CiAgICAgICAgREVCVUdNU0dUTCgoInNubXBkIiwKICAgICAgICAgICAgICAgICAgICAidW5rbm93biBzb2NrZXQgZmFtaWx5ICVkIFtBRl9JTkVUIGV4cGVjdGVkXSBpbiB2YXJfaXBSb3V0ZUVudHJ5LlxuIiwKICAgICAgICAgICAgICAgICAgICBhLT5zaW5fZmFtaWx5KSk7CiAgICB9CiAgICByZXR1cm4gJmEtPnNpbl9hZGRyOwp9CiNlbmRpZiAgICAgICAgICAgICAgICAgICAgICAgICAgLyogSEFWRV9TWVNfU1lTQ1RMX0ggKi8K