LyogUG9ydGlvbnMgb2YgdGhpcyBmaWxlIGFyZSBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29weXJpZ2h0KHMpLiAgU2VlCiAqIHRoZSBOZXQtU05NUCdzIENPUFlJTkcgZmlsZSBmb3IgbW9yZSBkZXRhaWxzIGFuZCBvdGhlciBjb3B5cmlnaHRzCiAqIHRoYXQgbWF5IGFwcGx5OgogKi8KLyoKICogUG9ydGlvbnMgb2YgdGhpcyBmaWxlIGFyZSBjb3B5cmlnaHRlZCBieToKICogQ29weXJpZ2h0IKkgMjAwMyBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAqIFVzZSBpcyBzdWJqZWN0IHRvIGxpY2Vuc2UgdGVybXMgc3BlY2lmaWVkIGluIHRoZSBDT1BZSU5HIGZpbGUKICogZGlzdHJpYnV0ZWQgd2l0aCB0aGUgTmV0LVNOTVAgcGFja2FnZS4KICovCi8qCiAqIEBmaWxlIHNubXBfYWdlbnQuaAogKgogKiBAYWRkdG9ncm91cCBhZ2VudAogKiBAYWRkdG9ncm91cCB0YWJsZQogKiBFeHRlcm5hbCBkZWZpbml0aW9ucyBmb3IgZnVuY3Rpb25zIGFuZCB2YXJpYWJsZXMgaW4gc25tcF9hZ2VudC5jLgogKgogKiBAewogKi8KCiNpZm5kZWYgU05NUF9BR0VOVF9ICiNkZWZpbmUgU05NUF9BR0VOVF9ICgojaWZkZWYgX19jcGx1c3BsdXMKZXh0ZXJuICAgICAgICAgICJDIiB7CiNlbmRpZgoKI2luY2x1ZGUgPG5ldC1zbm1wL2xpYnJhcnkvc25tcF9pbXBsLmg+CiNpbmNsdWRlIDxuZXQtc25tcC9saWJyYXJ5L3Rvb2xzLmg+CiNpbmNsdWRlIDxuZXQtc25tcC9saWJyYXJ5L2RhdGFfbGlzdC5oPgoKI2RlZmluZSBTTk1QX01BWF9QRFVfU0laRSA2NDAwMCAvKiBsb2NhbCBjb25zdHJhaW50IG9uIFBEVSBzaXplIHNlbnQgYnkgYWdlbnQKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAoc2VlIGFsc28gU05NUF9NQVhfTVNHX1NJWkUgaW4gc25tcF9hcGkuaCkgKi8KCiAgICAvKgogICAgICogSWYgbm9uLXplcm8sIGNhdXNlcyB0aGUgYWRkcmVzc2VzIG9mIHBlZXJzIHRvIGJlIGxvZ2dlZCB3aGVuIHJlY2VwdGlvbnMKICAgICAqIG9jY3VyLiAgCiAgICAgKi8KCiAgICBleHRlcm4gaW50ICAgICAgbG9nX2FkZHJlc3NlczsKCiAgICAvKgogICAgICogSG93IG1hbnkgdGlja3Mgc2luY2Ugd2UgbGFzdCBhZ2VkIHRoZSBhZGRyZXNzIGNhY2hlIGVudHJpZXMuICAKICAgICAqLwoKICAgIGV4dGVybiBpbnQgICAgICBsYXN0QWRkckFnZTsKCiAgICAvKiogQHR5cGVkZWYgc3RydWN0IG5ldHNubXBfcmVxdWVzdF9pbmZvX3MgbmV0c25tcF9yZXF1ZXN0X2luZm8KICAgICAqIFR5cGVkZWZzIHRoZSBuZXRzbm1wX3JlcXVlc3RfaW5mb19zIHN0cnVjdCBpbnRvCiAgICAgKiBuZXRzbm1wX3JlcXVlc3RfaW5mbyovCiAgICAvKiogQHN0cnVjdCBuZXRzbm1wX3JlcXVlc3RfaW5mb19zCiAgICAgKiBUaGUgbmV0c25tcCByZXF1ZXN0IGluZm8gc3RydWN0dXJlLgogICAgICovCiAgICB0eXBlZGVmIHN0cnVjdCBuZXRzbm1wX3JlcXVlc3RfaW5mb19zIHsKCS8qKgoJICogdmFyaWFibGUgYmluZGluZ3MKIAkgKi8KICAgICAgICBuZXRzbm1wX3ZhcmlhYmxlX2xpc3QgKnJlcXVlc3R2YjsKCiAJLyoqCiAJICogY2FuIGJlIHVzZWQgdG8gcGFzcyBpbmZvcm1hdGlvbiBvbiBhIHBlci1yZXF1ZXN0IGJhc2lzIGZyb20gYQogCSAqIGhlbHBlciB0byB0aGUgbGF0ZXIgaGFuZGxlcnMgCiAJICovCiAgICAgICAgbmV0c25tcF9kYXRhX2xpc3QgKnBhcmVudF9kYXRhOwoKICAgICAgIC8qCiAgICAgICAgKiBwb2ludGVyIHRvIHRoZSBhZ2VudF9yZXF1ZXN0X2luZm8gZm9yIHRoaXMgcmVxdWVzdAogICAgICAgICovCiAgICAgICBzdHJ1Y3QgbmV0c25tcF9hZ2VudF9yZXF1ZXN0X2luZm9fcyAqYWdlbnRfcmVxX2luZm87CgogCS8qKiBkb24ndCBmcmVlLCByZWZlcmVuY2UgdG8gKHN0cnVjdCB0cmVlKS0+ZW5kICovCiAgICAgICAgb2lkICAgICAgICAgICAgKnJhbmdlX2VuZDsKICAgICAgICBzaXplX3QgICAgICAgICAgcmFuZ2VfZW5kX2xlbjsKCiAgICAgICAvKgogICAgICAgICogZmxhZ3MKICAgICAgICAqLwogICAgICAgIGludCAgICAgICAgICAgICBkZWxlZ2F0ZWQ7CiAgICAgICAgaW50ICAgICAgICAgICAgIHByb2Nlc3NlZDsKICAgICAgICBpbnQgICAgICAgICAgICAgaW5jbHVzaXZlOwoKICAgICAgICBpbnQgICAgICAgICAgICAgc3RhdHVzOwogCS8qKiBpbmRleCBpbiBvcmlnaW5hbCBwZHUgKi8KICAgICAgICBpbnQgICAgICAgICAgICAgaW5kZXg7CiAKICAgICAgIC8qKiBnZXQtYnVsayAqLwogICAgICAgIGludCAgICAgICAgICAgICByZXBlYXQ7CiAgICAgICAgaW50ICAgICAgICAgICAgIG9yaWdfcmVwZWF0OwogICAgICAgIG5ldHNubXBfdmFyaWFibGVfbGlzdCAqcmVxdWVzdHZiX3N0YXJ0OwoKICAgICAgIC8qIGludGVybmFsIHVzZSAqLwogICAgICAgIHN0cnVjdCBuZXRzbm1wX3JlcXVlc3RfaW5mb19zICpuZXh0OwogICAgICAgIHN0cnVjdCBuZXRzbm1wX3JlcXVlc3RfaW5mb19zICpwcmV2OwogICAgICAgIHN0cnVjdCBuZXRzbm1wX3N1YnRyZWVfcyAgICAgICpzdWJ0cmVlOwogICAgfSBuZXRzbm1wX3JlcXVlc3RfaW5mbzsKCiAgICB0eXBlZGVmIHN0cnVjdCBuZXRzbm1wX3NldF9pbmZvX3MgewogICAgICAgIGludCAgICAgICAgICAgICBhY3Rpb247CiAgICAgICAgdm9pZCAgICAgICAgICAgKnN0YXRlUmVmOwoKICAgICAgICAvKgogICAgICAgICAqIGRvbid0IHVzZSB5ZXQ6IAogICAgICAgICAqLwogICAgICAgIHZvaWQgICAgICAgICAgKipvbGREYXRhOwogICAgICAgIGludCAgICAgICAgICAgICBzZXRDbGVhbnVwRmxhZ3M7CiNkZWZpbmUgQVVUT19GUkVFX1NUQVRFUkVGIDB4MDEgLyogY2FsbHMgZnJlZShzdGF0ZVJlZikgKi8KI2RlZmluZSBBVVRPX0ZSRUVfT0xEREFUQSAgMHgwMiAvKiBjYWxscyBmcmVlKCpvbGREYXRhKSAqLwojZGVmaW5lIEFVVE9fVU5ETyAgICAgICAgICAweDAzIC8qIC4uLiAqLwogICAgfSBuZXRzbm1wX3NldF9pbmZvOwoKICAgIHR5cGVkZWYgc3RydWN0IG5ldHNubXBfdHJlZV9jYWNoZV9zIHsKICAgICAgICBzdHJ1Y3QgbmV0c25tcF9zdWJ0cmVlX3MgKnN1YnRyZWU7CiAgICAgICAgbmV0c25tcF9yZXF1ZXN0X2luZm8gKnJlcXVlc3RzX2JlZ2luOwogICAgICAgIG5ldHNubXBfcmVxdWVzdF9pbmZvICpyZXF1ZXN0c19lbmQ7CiAgICB9IG5ldHNubXBfdHJlZV9jYWNoZTsKCiNkZWZpbmUgTU9ERV9HRVQgICAgICAgICAgICAgIFNOTVBfTVNHX0dFVAojZGVmaW5lIE1PREVfR0VUTkVYVCAgICAgICAgICBTTk1QX01TR19HRVRORVhUCiNkZWZpbmUgTU9ERV9HRVRCVUxLICAgICAgICAgIFNOTVBfTVNHX0dFVEJVTEsKI2RlZmluZSBNT0RFX0dFVF9TVEFTSCAgICAgICAgU05NUF9NU0dfSU5URVJOQUxfR0VUX1NUQVNICiNkZWZpbmUgTU9ERV9JU19HRVQoeCkgICAgICAgICgoeCA+PSAxMjgpICYmICh4ICE9IC0xKSAgJiYgKHggIT0gU05NUF9NU0dfU0VUKSkKICAgIC8qICNkZWZpbmUgTU9ERV9JU19HRVQoeCkgICAgICAgICgoeCA9PSBTTk1QX01TR19HRVQpIHx8ICh4ID09IFNOTVBfTVNHX0dFVE5FWFQpIHx8ICh4ID09IFNOTVBfTVNHX0dFVEJVTEspIHx8ICh4ID09IFNOTVBfTVNHX0lOVEVSTkFMX0dFVF9TVEFTSCkpICovCgojZGVmaW5lIE1PREVfU0VUX0JFR0lOICAgICAgICBTTk1QX01TR19JTlRFUk5BTF9TRVRfQkVHSU4KI2RlZmluZSBNT0RFX1NFVF9SRVNFUlZFMSAgICAgU05NUF9NU0dfSU5URVJOQUxfU0VUX1JFU0VSVkUxCiNkZWZpbmUgTU9ERV9TRVRfUkVTRVJWRTIgICAgIFNOTVBfTVNHX0lOVEVSTkFMX1NFVF9SRVNFUlZFMgojZGVmaW5lIE1PREVfU0VUX0FDVElPTiAgICAgICBTTk1QX01TR19JTlRFUk5BTF9TRVRfQUNUSU9OCiNkZWZpbmUgTU9ERV9TRVRfQ09NTUlUICAgICAgIFNOTVBfTVNHX0lOVEVSTkFMX1NFVF9DT01NSVQKI2RlZmluZSBNT0RFX1NFVF9GUkVFICAgICAgICAgU05NUF9NU0dfSU5URVJOQUxfU0VUX0ZSRUUKI2RlZmluZSBNT0RFX1NFVF9VTkRPICAgICAgICAgU05NUF9NU0dfSU5URVJOQUxfU0VUX1VORE8KI2RlZmluZSBNT0RFX0lTX1NFVCh4KSAgICAgICAgICgoeCA8IDEyOCkgfHwgKHggPT0gLTEpIHx8ICh4ID09IFNOTVBfTVNHX1NFVCkpCiAgICAvKiAjZGVmaW5lIE1PREVfSVNfU0VUKHgpICAgICAgICAgKCFNT0RFX0lTX0dFVCh4KSkgKi8KCiNkZWZpbmUgTU9ERV9CU1RFUF9QUkVfUkVRVUVTVCAgIFNOTVBfTVNHX0lOVEVSTkFMX1BSRV9SRVFVRVNUCiNkZWZpbmUgTU9ERV9CU1RFUF9QT1NUX1JFUVVFU1QgIFNOTVBfTVNHX0lOVEVSTkFMX1BPU1RfUkVRVUVTVAoKI2RlZmluZSBNT0RFX0JTVEVQX09CSkVDVF9MT09LVVAgICAgICAgU05NUF9NU0dfSU5URVJOQUxfT0JKRUNUX0xPT0tVUAojZGVmaW5lIE1PREVfQlNURVBfQ0hFQ0tfVkFMVUUgICAgICAgICBTTk1QX01TR19JTlRFUk5BTF9DSEVDS19WQUxVRQojZGVmaW5lIE1PREVfQlNURVBfUk9XX0NSRUFURSAgICAgICAgICBTTk1QX01TR19JTlRFUk5BTF9ST1dfQ1JFQVRFCiNkZWZpbmUgTU9ERV9CU1RFUF9VTkRPX1NFVFVQICAgICAgICAgIFNOTVBfTVNHX0lOVEVSTkFMX1VORE9fU0VUVVAKI2RlZmluZSBNT0RFX0JTVEVQX1NFVF9WQUxVRSAgICAgICAgICAgU05NUF9NU0dfSU5URVJOQUxfU0VUX1ZBTFVFCiNkZWZpbmUgTU9ERV9CU1RFUF9DSEVDS19DT05TSVNURU5DWSAgIFNOTVBfTVNHX0lOVEVSTkFMX0NIRUNLX0NPTlNJU1RFTkNZCiNkZWZpbmUgTU9ERV9CU1RFUF9VTkRPX1NFVCAgICAgICAgICAgIFNOTVBfTVNHX0lOVEVSTkFMX1VORE9fU0VUCiNkZWZpbmUgTU9ERV9CU1RFUF9DT01NSVQgICAgICAgICAgICAgIFNOTVBfTVNHX0lOVEVSTkFMX0NPTU1JVAojZGVmaW5lIE1PREVfQlNURVBfVU5ET19DT01NSVQgICAgICAgICBTTk1QX01TR19JTlRFUk5BTF9VTkRPX0NPTU1JVAojZGVmaW5lIE1PREVfQlNURVBfSVJSRVZFUlNJQkxFX0NPTU1JVCBTTk1QX01TR19JTlRFUk5BTF9JUlJFVkVSU0lCTEVfQ09NTUlUCiNkZWZpbmUgTU9ERV9CU1RFUF9VTkRPX0NMRUFOVVAgICAgICAgIFNOTVBfTVNHX0lOVEVSTkFMX1VORE9fQ0xFQU5VUAoKCi8qKiBAdHlwZWRlZiBzdHJ1Y3QgbmV0c25tcF9hZ2VudF9yZXF1ZXN0X2luZm9fcyBuZXRzbm1wX2FnZW50X3JlcXVlc3RfaW5mbwogKiBUeXBlZGVmcyB0aGUgbmV0c25tcF9hZ2VudF9yZXF1ZXN0X2luZm9fcyBzdHJ1Y3QgaW50bwogKiBuZXRzbm1wX2FnZW50X3JlcXVlc3RfaW5mbwogKi8KCi8qKiBAc3RydWN0IG5ldHNubXBfYWdlbnRfcmVxdWVzdF9pbmZvX3MKICogVGhlIGFnZW50IHRyYW5zYWN0aW9uIHJlcXVlc3Qgc3RydWN0dXJlCiAqLwogICAgdHlwZWRlZiBzdHJ1Y3QgbmV0c25tcF9hZ2VudF9yZXF1ZXN0X2luZm9fcyB7CiAgICAgICAgaW50ICAgICAgICAgICAgIG1vZGU7CiAJLyoqIHBkdSBjb250YWlucyBhdXRoaW5mbywgZWcgKi8KLyogICAgICAgIG5ldHNubXBfcGR1ICAgICpwZHU7ICAgICovCiAgICAgICAgc3RydWN0IG5ldHNubXBfYWdlbnRfc2Vzc2lvbl9zICphc3A7ICAgIC8qIG1heSBub3QgYmUgbmVlZGVkICovCiAgICAgICAgLyoKICAgICAgICAgKiBjYW4gYmUgdXNlZCB0byBwYXNzIGluZm9ybWF0aW9uIG9uIGEgcGVyLXBkdSBiYXNpcyBmcm9tIGEKICAgICAgICAgKiBoZWxwZXIgdG8gdGhlIGxhdGVyIGhhbmRsZXJzIAogICAgICAgICAqLwogICAgICAgIG5ldHNubXBfZGF0YV9saXN0ICphZ2VudF9kYXRhOwogICAgfSBuZXRzbm1wX2FnZW50X3JlcXVlc3RfaW5mbzsKCiAgICB0eXBlZGVmIHN0cnVjdCBuZXRzbm1wX2NhY2hlbWFwX3MgewogICAgICAgIGludCAgICAgICAgICAgICBnbG9iYWxpZDsKICAgICAgICBpbnQgICAgICAgICAgICAgY2FjaGVpZDsKICAgICAgICBzdHJ1Y3QgbmV0c25tcF9jYWNoZW1hcF9zICpuZXh0OwogICAgfSBuZXRzbm1wX2NhY2hlbWFwOwoKICAgIHR5cGVkZWYgc3RydWN0IG5ldHNubXBfYWdlbnRfc2Vzc2lvbl9zIHsKICAgICAgICBpbnQgICAgICAgICAgICAgbW9kZTsKICAgICAgICBuZXRzbm1wX3Nlc3Npb24gKnNlc3Npb247CiAgICAgICAgbmV0c25tcF9wZHUgICAgKnBkdTsKICAgICAgICBuZXRzbm1wX3BkdSAgICAqb3JpZ19wZHU7CiAgICAgICAgaW50ICAgICAgICAgICAgIHJ3OwogICAgICAgIGludCAgICAgICAgICAgICBleGFjdDsKICAgICAgICBpbnQgICAgICAgICAgICAgc3RhdHVzOwogICAgICAgIGludCAgICAgICAgICAgICBpbmRleDsKICAgICAgICBpbnQgICAgICAgICAgICAgb2xkbW9kZTsKCiAgICAgICAgc3RydWN0IG5ldHNubXBfYWdlbnRfc2Vzc2lvbl9zICpuZXh0OwoKICAgICAgICAvKgogICAgICAgICAqIG5ldyBBUEkgcG9pbnRlcnMgCiAgICAgICAgICovCiAgICAgICAgbmV0c25tcF9hZ2VudF9yZXF1ZXN0X2luZm8gKnJlcWluZm87CiAgICAgICAgbmV0c25tcF9yZXF1ZXN0X2luZm8gKnJlcXVlc3RzOwogICAgICAgIG5ldHNubXBfdHJlZV9jYWNoZSAqdHJlZWNhY2hlOwogICAgICAgIG5ldHNubXBfdmFyaWFibGVfbGlzdCAqKmJ1bGtjYWNoZTsKICAgICAgICBpbnQgICAgICAgICAgICAgdHJlZWNhY2hlX2xlbjsgIC8qIGxlbmd0aCBvZiBjYWNoZSBhcnJheSAqLwogICAgICAgIGludCAgICAgICAgICAgICB0cmVlY2FjaGVfbnVtOyAgLyogbnVtYmVyIG9mIGN1cnJlbnQgY2FjaGUgZW50cmllcyAqLwogICAgICAgIG5ldHNubXBfY2FjaGVtYXAgKmNhY2hlX3N0b3JlOwogICAgICAgIGludCAgICAgICAgICAgICB2YmNvdW50OwogICAgfSBuZXRzbm1wX2FnZW50X3Nlc3Npb247CgogICAgLyoKICAgICAqIEFkZHJlc3MgY2FjaGUgaGFuZGxpbmcgZnVuY3Rpb25zLiAgCiAgICAgKi8KCiAgICB2b2lkICAgICAgICAgICAgbmV0c25tcF9hZGRyY2FjaGVfaW5pdGlhbGlzZSh2b2lkKTsKICAgIHZvaWQgICAgICAgICAgICBuZXRzbm1wX2FkZHJjYWNoZV9kZXN0cm95KHZvaWQpOwogICAgdm9pZCAgICAgICAgICAgIG5ldHNubXBfYWRkcmNhY2hlX2FnZSh2b2lkKTsKCgogICAgLyoKICAgICAqIGNvbmZpZyBmaWxlIHBhcnNpbmcgcm91dGluZXMgCiAgICAgKi8KICAgIGludCAgICAgICAgICAgICBoYW5kbGVfc25tcF9wYWNrZXQoaW50LCBuZXRzbm1wX3Nlc3Npb24gKiwgaW50LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXRzbm1wX3BkdSAqLCB2b2lkICopOwogICAgdm9pZCAgICAgICAgICAgIHNubXBfYWdlbnRfcGFyc2VfY29uZmlnKGNoYXIgKiwgY2hhciAqKTsKICAgIG5ldHNubXBfYWdlbnRfc2Vzc2lvbiAqaW5pdF9hZ2VudF9zbm1wX3Nlc3Npb24obmV0c25tcF9zZXNzaW9uICosCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldHNubXBfcGR1ICopOwogICAgdm9pZCAgICAgICAgICAgIGZyZWVfYWdlbnRfc25tcF9zZXNzaW9uKG5ldHNubXBfYWdlbnRfc2Vzc2lvbiAqKTsKICAgIHZvaWQgICAgICAgICAgIAogICAgICAgIG5ldHNubXBfcmVtb3ZlX2FuZF9mcmVlX2FnZW50X3NubXBfc2Vzc2lvbihuZXRzbm1wX2FnZW50X3Nlc3Npb24KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmFzcCk7CiNpZmRlZiBTTk1QX05FRURfUkVRVUVTVF9MSVNUCiAgICB2b2lkICAgICAgICAgICAKICAgICAgICBuZXRzbm1wX2ZyZWVfYWdlbnRfc25tcF9zZXNzaW9uX2J5X3Nlc3Npb24obmV0c25tcF9zZXNzaW9uICogc2VzcywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAoKmZyZWVfcmVxdWVzdCkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKG5ldHNubXBfcmVxdWVzdF9saXN0CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKSk7CiNlbmRpZgogICAgaW50ICAgICAgICAgICAgIGdldE5leHRTZXNzSUQodm9pZCk7CiAgICB2b2lkICAgICAgICAgICAgZHVtcF9zZXNzX2xpc3Qodm9pZCk7CiAgICBpbnQgICAgICAgICAgICAgaW5pdF9tYXN0ZXJfYWdlbnQodm9pZCk7CiAgICB2b2lkICAgICAgICAgICAgc2h1dGRvd25fbWFzdGVyX2FnZW50KHZvaWQpOwogICAgaW50ICAgICAgICAgICAgIGFnZW50X2NoZWNrX2FuZF9wcm9jZXNzKGludCBibG9jayk7CiAgICB2b2lkICAgICAgICAgICAgbmV0c25tcF9jaGVja19vdXRzdGFuZGluZ19hZ2VudF9yZXF1ZXN0cyh2b2lkKTsKCiAgICBpbnQgICAgICAgICAgICAgbmV0c25tcF9yZXF1ZXN0X3NldF9lcnJvcihuZXRzbm1wX3JlcXVlc3RfaW5mbyAqcmVxdWVzdCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBlcnJvcl92YWx1ZSk7CiAgICBpbnQgICAgICAgICAgICAgbmV0c25tcF9jaGVja19yZXF1ZXN0c19lcnJvcihuZXRzbm1wX3JlcXVlc3RfaW5mbyAqcmVxcyk7CiAgICBpbnQgICAgICAgICAgICAgbmV0c25tcF9jaGVja19hbGxfcmVxdWVzdHNfZXJyb3IobmV0c25tcF9hZ2VudF9zZXNzaW9uICphc3AsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGxvb2tfZm9yX3NwZWNpZmljKTsKICAgIGludAogICAgICAgIG5ldHNubXBfc2V0X2FsbF9yZXF1ZXN0c19lcnJvcihuZXRzbm1wX2FnZW50X3JlcXVlc3RfaW5mbyAqcmVxaW5mbywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV0c25tcF9yZXF1ZXN0X2luZm8gKnJlcXVlc3RzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZXJyb3JfdmFsdWUpOwogICAgaW50IG5ldHNubXBfcmVxdWVzdF9zZXRfZXJyb3JfaWR4KG5ldHNubXBfcmVxdWVzdF9pbmZvICpyZXF1ZXN0cywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGVycm9yX3ZhbHVlLCBpbnQgaWR4KTsKICAgIGludAogICAgICAgIG5ldHNubXBfcmVxdWVzdF9zZXRfZXJyb3JfYWxsKG5ldHNubXBfcmVxdWVzdF9pbmZvICpyZXF1ZXN0cywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGVycm9yX3ZhbHVlKTsKICAgIAogICAgLyoqIGRlcHJlY2F0ZWQsIHVzZSBuZXRzbm1wX3JlcXVlc3Rfc2V0X2Vycm9yIGluc3RlYWQgKi8KICAgIGludCAgICAgICAgICAgICBuZXRzbm1wX3NldF9yZXF1ZXN0X2Vycm9yKG5ldHNubXBfYWdlbnRfcmVxdWVzdF9pbmZvCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqcmVxaW5mbywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldHNubXBfcmVxdWVzdF9pbmZvCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqcmVxdWVzdCwgaW50IGVycm9yX3ZhbHVlKTsKICAgIC8qKiBkZXByZWNhdGVkLCB1c2UgbmV0c25tcF9yZXF1ZXN0X3NldF9lcnJvciBpbnN0ZWFkICovCiAgICBpbnQgICAgICAgICAgICAgbmV0c25tcF9zZXRfbW9kZV9yZXF1ZXN0X2Vycm9yKGludCBtb2RlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXRzbm1wX3JlcXVlc3RfaW5mbwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqcmVxdWVzdCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGVycm9yX3ZhbHVlKTsKCiAgICB1X2xvbmcgICAgICAgICAgbmV0c25tcF9tYXJrZXJfdXB0aW1lKG1hcmtlcl90IHBtKTsKICAgIHVfbG9uZyAgICAgICAgICBuZXRzbm1wX3RpbWV2YWxfdXB0aW1lKHN0cnVjdCB0aW1ldmFsICp0dik7CiAgICB1X2xvbmcgICAgICAgICAgbmV0c25tcF9nZXRfYWdlbnRfdXB0aW1lKHZvaWQpOwogICAgaW50ICAgICAgICAgICAgIG5ldHNubXBfY2hlY2tfdHJhbnNhY3Rpb25faWQoaW50IHRyYW5zYWN0aW9uX2lkKTsKICAgIGludCAgICAgICAgICAgICBuZXRzbm1wX2FnZW50X2NoZWNrX3BhY2tldChuZXRzbm1wX3Nlc3Npb24gKiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgbmV0c25tcF90cmFuc3BvcnRfcwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICosIHZvaWQgKiwgaW50KTsKICAgIGludCAgICAgICAgICAgICBuZXRzbm1wX2FnZW50X2NoZWNrX3BhcnNlKG5ldHNubXBfc2Vzc2lvbiAqLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV0c25tcF9wZHUgKiwgaW50KTsKICAgIGludCAgICAgICAgICAgICBuZXRzbm1wX2FsbG9jYXRlX2dsb2JhbGNhY2hlaWQodm9pZCk7CgogICAgaW50IG5ldHNubXBfcmVtb3ZlX2RlbGVnYXRlZF9yZXF1ZXN0c19mb3Jfc2Vzc2lvbihuZXRzbm1wX3Nlc3Npb24gKnNlc3MpOwoKICAgIC8qCiAgICAgKiBSZWdpc3RlciBhbmQgZGUtcmVnaXN0ZXIgYWdlbnQgTlNBUHMuICAKICAgICAqLwoKICAgIHN0cnVjdCBuZXRzbm1wX3RyYW5zcG9ydF9zOwoKICAgIGludCAgICAgICAgICAgICBuZXRzbm1wX3JlZ2lzdGVyX2FnZW50X25zYXAoc3RydWN0IG5ldHNubXBfdHJhbnNwb3J0X3MKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKnQpOwogICAgdm9pZCAgICAgICAgICAgIG5ldHNubXBfZGVyZWdpc3Rlcl9hZ2VudF9uc2FwKGludCBoYW5kbGUpOwoKICAgIHZvaWQKICAgICAgICBuZXRzbm1wX2FnZW50X2FkZF9saXN0X2RhdGEobmV0c25tcF9hZ2VudF9yZXF1ZXN0X2luZm8gKmFnZW50LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXRzbm1wX2RhdGFfbGlzdCAqbm9kZSk7CgogICAgaW50CiAgICAgICAgbmV0c25tcF9hZ2VudF9yZW1vdmVfbGlzdF9kYXRhKG5ldHNubXBfYWdlbnRfcmVxdWVzdF9pbmZvICphcmksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKiBuYW1lKTsKCiAgICB2b2lkICoKICAgICAgICAgICAgbmV0c25tcF9hZ2VudF9nZXRfbGlzdF9kYXRhKG5ldHNubXBfYWdlbnRfcmVxdWVzdF9pbmZvCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqYWdlbnQsIGNvbnN0IGNoYXIgKm5hbWUpOwoKICAgIHZvaWQKICAgICAgICAgICAgbmV0c25tcF9mcmVlX2FnZW50X2RhdGFfc2V0KG5ldHNubXBfYWdlbnRfcmVxdWVzdF9pbmZvICphZ2VudCk7CgogICAgdm9pZAogICAgICAgICAgIG5ldHNubXBfZnJlZV9hZ2VudF9kYXRhX3NldHMobmV0c25tcF9hZ2VudF9yZXF1ZXN0X2luZm8gKmFnZW50KTsKICAgIHZvaWQKICAgICAgICBuZXRzbm1wX2ZyZWVfYWdlbnRfcmVxdWVzdF9pbmZvKG5ldHNubXBfYWdlbnRfcmVxdWVzdF9pbmZvICphcmkpOwoKI2lmZGVmIF9fY3BsdXNwbHVzCn0KI2VuZGlmCiNlbmRpZgovKiogQH0gKi8K