I2luY2x1ZGUgIm1sdGFsbi5oIgojaW5jbHVkZSAiZHAuaCIKCiNkZWZpbmUgTUFDSElHQUkgMAojZGVmaW5lIE9VVEdBUDBUUlkgMQojZGVmaW5lIERFQlVHIDAKI2RlZmluZSBYWFhYWFhYICAgIDAKI2RlZmluZSBVU0VfUEVOQUxUWV9FWCAgMAojZGVmaW5lIEZBU1RNQVRDSENBTEMgMQoKI2lmIDAKc3RhdGljIHZvaWQgc3RfT3BlbmluZ0dhcENvdW50KCBmbG9hdCAqb2djcCwgaW50IGNsdXMsIGNoYXIgKipzZXEsIGRvdWJsZSAqZWZmLCBpbnQgbGVuICkKewoJaW50IGksIGosIGdjLCBnYjsgCglmbG9hdCBmZWZmOwoJCglmb3IoIGk9MDsgaTxsZW47IGkrKyApIG9nY3BbaV0gPSAwLjA7Cglmb3IoIGo9MDsgajxjbHVzOyBqKysgKSAKCXsKCQlmZWZmID0gKGZsb2F0KWVmZltqXTsKCQlnYyA9IDA7CgkJZm9yKCBpPTA7IGk8bGVuOyBpKysgKSAKCQl7CgkJCWdiID0gZ2M7CgkJCWdjID0gKCBzZXFbal1baV0gPT0gJy0nICk7CgkJCXsKCQkJCWlmKCAhZ2IgKiAgZ2MgKSBvZ2NwW2ldICs9IGZlZmY7CgkJCX0KCQl9Cgl9Cn0KCnN0YXRpYyB2b2lkIHN0X0ZpbmFsR2FwQ291bnQoIGZsb2F0ICpmZ2NwLCBpbnQgY2x1cywgY2hhciAqKnNlcSwgZG91YmxlICplZmYsIGludCBsZW4gKQp7CglpbnQgaSwgaiwgZ2MsIGdiOyAKCWZsb2F0IGZlZmY7CgkKCWZvciggaT0wOyBpPGxlbjsgaSsrICkgZmdjcFtpXSA9IDAuMDsKCWZvciggaj0wOyBqPGNsdXM7IGorKyApIAoJewoJCWZlZmYgPSAoZmxvYXQpZWZmW2pdOwoJCWdjID0gKCBzZXFbal1bMF0gPT0gJy0nICk7CgkJZm9yKCBpPTE7IGk8bGVuKzE7IGkrKyApIAoJCXsKCQkJZ2IgPSBnYzsKCQkJZ2MgPSAoIHNlcVtqXVtpXSA9PSAnLScgKTsKCQkJewoJCQkJaWYoIGdiICogIWdjICkgZmdjcFtpLTFdICs9IGZlZmY7CgkJCX0KCQl9Cgl9Cn0KI2VuZGlmCgoKCQkJCgkJCgpzdGF0aWMgaW50IGltcGFsbG9jbGVuID0gMDsKc3RhdGljIGZsb2F0ICoqaW1wbXR4ID0gTlVMTDsKZmxvYXQgcGFydF9pbXBfbWF0Y2hfb3V0X3NjKCBpbnQgaTEsIGludCBqMSApCnsKLy8JZnByaW50Ziggc3RkZXJyLCAiaW1wYWxsb2NsZW4gPSAlZFxuIiwgaW1wYWxsb2NsZW4gKTsKLy8JZnByaW50Ziggc3RkZXJyLCAiaTEsajE9JWQsJWQgLT4gaW1wbXR4PSVmXG4iLCBpMSwgajEsIGltcG10eFtpMV1bajFdICk7CglyZXR1cm4oIGltcG10eFtpMV1bajFdICk7CiNpZiAwCglpZiggaTEgPT0gbDEgfHwgajEgPT0gbDIgKSByZXR1cm4oIDAuMCApOwoJcmV0dXJuKCBpbXBtdHhbaTErc3RhcnQxXVtqMStzdGFydDJdICk7CiNlbmRpZgp9CnN0YXRpYyB2b2lkIHBhcnRfaW1wX21hdGNoX291dF92ZWFkX2dhcG1hcCggZmxvYXQgKmltcCwgaW50IGkxLCBpbnQgbGd0aDIsIGludCBzdGFydDIsIGludCAqZ2FwbWFwMiApCnsKI2lmIEZBU1RNQUNIQ0FMQwoJZmxvYXQgKnB0ID0gaW1wOwoJaW50ICpnYXBtYXBwdCA9IGdhcG1hcDI7Cgl3aGlsZSggbGd0aDItLSApCgkJKnB0KysgKz0gaW1wbXR4W2kxXVtzdGFydDIrKmdhcG1hcHB0KytdOwojZWxzZQoJaW50IGo7Cglmb3IoIGo9MDsgajxsZ3RoMjsgaisrICkKCXsKCQlpbXBbal0gKz0gaW1wbXR4W2kxXVtzdGFydDIrZ2FwbWFwMltqXV07Cgl9CiNlbmRpZgp9CgpzdGF0aWMgdm9pZCBwYXJ0X2ltcF9tYXRjaF9vdXRfdmVhZF90YXRlX2dhcG1hcCggZmxvYXQgKmltcCwgaW50IGoxLCBpbnQgbGd0aDEsIGludCBzdGFydDEsIGludCAqZ2FwbWFwMSApCnsKI2lmIEZBU1RNQUNIQ0FMQwoJZmxvYXQgKnB0ID0gaW1wOwoJaW50ICpnYXBtYXBwdCA9IGdhcG1hcDE7Cgl3aGlsZSggbGd0aDEtLSApCgkJKnB0KysgPSBpbXBtdHhbc3RhcnQxKypnYXBtYXBwdCsrXVtqMV07CiNlbHNlCglpbnQgaTsKCWZvciggaT0wOyBpPGxndGgxOyBpKysgKQoJewoJCWltcFtpXSArPSBpbXBtdHhbc3RhcnQxK2dhcG1hcDFbaV1dW2oxXTsKCX0KI2VuZGlmCn0KCnZvaWQgcGFydF9pbXBfbWF0Y2hfaW5pdF9zdHJpY3QoIGZsb2F0ICppbXAsIGludCBjbHVzMSwgaW50IGNsdXMyLCBpbnQgbGd0aDEsIGludCBsZ3RoMiwgY2hhciAqKnNlcTEsIGNoYXIgKipzZXEyLCBkb3VibGUgKmVmZjEsIGRvdWJsZSAqZWZmMiwgTG9jYWxIb20gKioqbG9jYWxob20sIGludCBmb3JzY29yZSApCnsKCWludCBpLCBqLCBrMSwgazIsIHRtcGludCwgc3RhcnQxLCBzdGFydDIsIGVuZDEsIGVuZDI7Cglkb3VibGUgZWZmaWosIGVmZmlqeDsgCgljaGFyICpwdCwgKnB0MSwgKnB0MjsKCUxvY2FsSG9tICp0bXBwdHI7CgoJaWYoIGltcGFsbG9jbGVuIDw9IGxndGgxICsgMiB8fCBpbXBhbGxvY2xlbiA8PSBsZ3RoMiArIDIgKQoJewoJCWlmKCBpbXBtdHggKSBGcmVlRmxvYXRNdHgoIGltcG10eCApOwoJCWltcGFsbG9jbGVuID0gTUFYKCBsZ3RoMSwgbGd0aDIgKSArIDI7CgkJaW1wbXR4ID0gQWxsb2NhdGVGbG9hdE10eCggaW1wYWxsb2NsZW4rMTAwLCBpbXBhbGxvY2xlbisxMDAgKTsKCX0KCgojaWYgMAoJZnByaW50Ziggc3RkZXJyLCAiZWZmMSBpbiBfaW5pdF9zdHJpY3QgPSBcbiIgKTsKCWZvciggaT0wOyBpPGNsdXMxOyBpKysgKQoJCWZwcmludGYoIHN0ZGVyciwgImVmZjFbXSA9ICVmXG4iLCBlZmYxW2ldICk7Cglmb3IoIGk9MDsgaTxjbHVzMjsgaSsrICkKCQlmcHJpbnRmKCBzdGRlcnIsICJlZmYyW10gPSAlZlxuIiwgZWZmMltpXSApOwojZW5kaWYKCglmb3IoIGk9MDsgaTxsZ3RoMTsgaSsrICkgZm9yKCBqPTA7IGo8bGd0aDI7IGorKyApCgkJaW1wbXR4W2ldW2pdID0gMC4wOwoJZWZmaWp4ID0gMS4wICogZmFzdGF0aHJlc2hvbGQ7Cglmb3IoIGk9MDsgaTxjbHVzMTsgaSsrICkKCXsKCQlmb3IoIGo9MDsgajxjbHVzMjsgaisrICkKCQl7CgkJCWVmZmlqID0gZWZmMVtpXSAqIGVmZjJbal0gKiBlZmZpang7CgkJCXRtcHB0ciA9IGxvY2FsaG9tW2ldW2pdOwoJCQl3aGlsZSggdG1wcHRyICkKCQkJewovLwkJCQlmcHJpbnRmKCBzdGRlcnIsICJzdGFydDEgPSAlZFxuIiwgdG1wcHRyLT5zdGFydDEgKTsKLy8JCQkJZnByaW50Ziggc3RkZXJyLCAiZW5kMSAgID0gJWRcbiIsIHRtcHB0ci0+ZW5kMSAgICk7Ci8vCQkJCWZwcmludGYoIHN0ZGVyciwgImkgPSAlZCwgc2VxMSA9IFxuJXNcbiIsIGksIHNlcTFbaV0gKTsKLy8JCQkJZnByaW50Ziggc3RkZXJyLCAiaiA9ICVkLCBzZXEyID0gXG4lc1xuIiwgaiwgc2VxMltqXSApOwoJCQkJcHQgPSBzZXExW2ldOwoJCQkJdG1waW50ID0gLTE7CgkJCQl3aGlsZSggKnB0ICE9IDAgKQoJCQkJewoJCQkJCWlmKCAqcHQrKyAhPSAnLScgKSB0bXBpbnQrKzsKCQkJCQlpZiggdG1waW50ID09IHRtcHB0ci0+c3RhcnQxICkgYnJlYWs7CgkJCQl9CgkJCQlzdGFydDEgPSAoaW50KSggcHQgLSBzZXExW2ldICkgLSAxOwoJCgkJCQlpZiggdG1wcHRyLT5zdGFydDEgPT0gdG1wcHRyLT5lbmQxICkgZW5kMSA9IHN0YXJ0MTsKCQkJCWVsc2UKCQkJCXsKI2lmIE1BQ0hJR0FJCgkJCQkJd2hpbGUoICpwdCAhPSAwICkKCQkJCQl7CgkJCQkJCWlmKCB0bXBpbnQgPT0gdG1wcHRyLT5lbmQxICkgYnJlYWs7CgkJCQkJCWlmKCAqcHQrKyAhPSAnLScgKSB0bXBpbnQrKzsKCQkJCQl9CgkJCQkJZW5kMSA9IChpbnQpKCBwdCAtIHNlcTFbaV0gKSAtIDE7CiNlbHNlCgkJCQkJd2hpbGUoICpwdCAhPSAwICkKCQkJCQl7Ci8vCQkJCQkJZnByaW50Ziggc3RkZXJyLCAidG1waW50ID0gJWQsIGVuZDEgPSAlZCBwb3MgPSAlZFxuIiwgdG1waW50LCB0bXBwdHItPmVuZDEsIHB0LXNlcTFbaV0gKTsKCQkJCQkJaWYoICpwdCsrICE9ICctJyApIHRtcGludCsrOwoJCQkJCQlpZiggdG1waW50ID09IHRtcHB0ci0+ZW5kMSApIGJyZWFrOwoJCQkJCX0KCQkJCQllbmQxID0gKGludCkoIHB0IC0gc2VxMVtpXSApIC0gMTsKI2VuZGlmCgkJCQl9CgkKCQkJCXB0ID0gc2VxMltqXTsKCQkJCXRtcGludCA9IC0xOwoJCQkJd2hpbGUoICpwdCAhPSAwICkKCQkJCXsKCQkJCQlpZiggKnB0KysgIT0gJy0nICkgdG1waW50Kys7CgkJCQkJaWYoIHRtcGludCA9PSB0bXBwdHItPnN0YXJ0MiApIGJyZWFrOwoJCQkJfQoJCQkJc3RhcnQyID0gKGludCkoIHB0IC0gc2VxMltqXSApIC0gMTsKCQkJCWlmKCB0bXBwdHItPnN0YXJ0MiA9PSB0bXBwdHItPmVuZDIgKSBlbmQyID0gc3RhcnQyOwoJCQkJZWxzZQoJCQkJewojaWYgTUFDSElHQUkKCQkJCQl3aGlsZSggKnB0ICE9IDAgKQoJCQkJCXsKCQkJCQkJaWYoIHRtcGludCA9PSB0bXBwdHItPmVuZDIgKSBicmVhazsKCQkJCQkJaWYoICpwdCsrICE9ICctJyApIHRtcGludCsrOwoJCQkJCX0KCQkJCQllbmQyID0gKGludCkoIHB0IC0gc2VxMltqXSApIC0gMTsKI2Vsc2UKCQkJCQl3aGlsZSggKnB0ICE9IDAgKQoJCQkJCXsKCQkJCQkJaWYoICpwdCsrICE9ICctJyApIHRtcGludCsrOwoJCQkJCQlpZiggdG1waW50ID09IHRtcHB0ci0+ZW5kMiApIGJyZWFrOwoJCQkJCX0KCQkJCQllbmQyID0gKGludCkoIHB0IC0gc2VxMltqXSApIC0gMTsKI2VuZGlmCgkJCQl9Ci8vCQkJCWZwcmludGYoIHN0ZGVyciwgInN0YXJ0MSA9ICVkICglYyksIGVuZDEgPSAlZCAoJWMpLCBzdGFydDIgPSAlZCAoJWMpLCBlbmQyID0gJWQgKCVjKVxuIiwgc3RhcnQxLCBzZXExW2ldW3N0YXJ0MV0sIGVuZDEsIHNlcTFbaV1bZW5kMV0sIHN0YXJ0Miwgc2VxMltqXVtzdGFydDJdLCBlbmQyLCBzZXEyW2pdW2VuZDJdICk7Ci8vCQkJCWZwcmludGYoIHN0ZGVyciwgInN0ZXAgMFxuIiApOwoJCQkJaWYoIGVuZDEgLSBzdGFydDEgIT0gZW5kMiAtIHN0YXJ0MiApCgkJCQl7Ci8vCQkJCQlmcHJpbnRmKCBzdGRlcnIsICJDSFVVSSEhLCBzdGFydDEgPSAlZCwgZW5kMSA9ICVkLCBzdGFydDIgPSAlZCwgZW5kMiA9ICVkXG4iLCBzdGFydDEsIGVuZDEsIHN0YXJ0MiwgZW5kMiApOwoJCQkJfQoKCQkJCWsxID0gc3RhcnQxOyBrMiA9IHN0YXJ0MjsKCQkJCXB0MSA9IHNlcTFbaV0gKyBrMTsKCQkJCXB0MiA9IHNlcTJbal0gKyBrMjsKCQkJCXdoaWxlKCAqcHQxICYmICpwdDIgKQoJCQkJewoJCQkJCWlmKCAqcHQxICE9ICctJyAmJiAqcHQyICE9ICctJyApCgkJCQkJewovLyC9xaTfpPLG873FpMukq6SxpMqkpKTopKaky8PtsNWkt6TGsryktaSkoaMKLy8JCQkJCQlpbXBtdHhbazFdW2syXSArPSB0bXBwdHItPndpbXBvcnRhbmNlICogZmFzdGF0aHJlc2hvbGQ7Ci8vCQkJCQkJaW1wbXR4W2sxXVtrMl0gKz0gdG1wcHRyLT5pbXBvcnRhbmNlICogZWZmaWo7CgkJCQkJCWltcG10eFtrMV1bazJdICs9IHRtcHB0ci0+ZmltcG9ydGFuY2UgKiBlZmZpajsKLy8JCQkJCQlmcHJpbnRmKCBzdGRlcnIsICJrMT0lZCwgazI9JWQsIGltcGFsbG9jbGVuPSVkXG4iLCBrMSwgazIsIGltcGFsbG9jbGVuICk7Ci8vCQkJCQkJZnByaW50Ziggc3RkZXJyLCAibWFyaywgJWQgKCVjKSAtICVkICglYykgXG4iLCBrMSwgKnB0MSwgazIsICpwdDIgKTsKCQkJCQkJazErKzsgazIrKzsKCQkJCQkJcHQxKys7IHB0MisrOwoJCQkJCX0KCQkJCQllbHNlIGlmKCAqcHQxICE9ICctJyAmJiAqcHQyID09ICctJyApCgkJCQkJewovLwkJCQkJCWZwcmludGYoIHN0ZGVyciwgInNraXAsICVkICglYykgLSAlZCAoJWMpIFxuIiwgazEsICpwdDEsIGsyLCAqcHQyICk7CgkJCQkJCWsyKys7IHB0MisrOwoJCQkJCX0KCQkJCQllbHNlIGlmKCAqcHQxID09ICctJyAmJiAqcHQyICE9ICctJyApCgkJCQkJewovLwkJCQkJCWZwcmludGYoIHN0ZGVyciwgInNraXAsICVkICglYykgLSAlZCAoJWMpIFxuIiwgazEsICpwdDEsIGsyLCAqcHQyICk7CgkJCQkJCWsxKys7IHB0MSsrOwoJCQkJCX0KCQkJCQllbHNlIGlmKCAqcHQxID09ICctJyAmJiAqcHQyID09ICctJyApCgkJCQkJewovLwkJCQkJCWZwcmludGYoIHN0ZGVyciwgInNraXAsICVkICglYykgLSAlZCAoJWMpIFxuIiwgazEsICpwdDEsIGsyLCAqcHQyICk7CgkJCQkJCWsxKys7IHB0MSsrOwoJCQkJCQlrMisrOyBwdDIrKzsKCQkJCQl9CgkJCQkJaWYoIGsxID4gZW5kMSB8fCBrMiA+IGVuZDIgKSBicmVhazsKCQkJCX0KCQkJCXRtcHB0ciA9IHRtcHB0ci0+bmV4dDsKCQkJfQoJCX0KCX0KI2lmIDAKCWZwcmludGYoIHN0ZGVyciwgImltcG10eCA9IFxuIiApOwoJZm9yKCBrMj0wOyBrMjxsZ3RoMjsgazIrKyApCgkJZnByaW50Ziggc3RkZXJyLCAiJTYuM2YgIiwgKGRvdWJsZSlrMiApOwoJZnByaW50Ziggc3RkZXJyLCAiXG4iICk7Cglmb3IoIGsxPTA7IGsxPGxndGgxOyBrMSsrICkKCXsKCQlmcHJpbnRmKCBzdGRlcnIsICIlZCIsIGsxICk7CgkJZm9yKCBrMj0wOyBrMjxsZ3RoMjsgazIrKyApCgkJCWZwcmludGYoIHN0ZGVyciwgIiUyLjFmICIsIGltcG10eFtrMV1bazJdICk7CgkJZnByaW50Ziggc3RkZXJyLCAiXG4iICk7Cgl9CglleGl0KCAxICk7CiNlbmRpZgp9CgoKdm9pZCBwYXJ0X2ltcF9ybmEoIGludCBuc2VxMSwgaW50IG5zZXEyLCBjaGFyICoqc2VxMSwgY2hhciAqKnNlcTIsIGRvdWJsZSAqZWZmMSwgZG91YmxlICplZmYyLCBSTkFwYWlyICoqKmdyb3Vwcm5hMSwgUk5BcGFpciAqKipncm91cHJuYTIsIGludCAqZ2FwbWFwMSwgaW50ICpnYXBtYXAyLCBSTkFwYWlyICphZGRpdGlvbmFscGFpciApCnsKCWZvbGRybmEoIG5zZXExLCBuc2VxMiwgc2VxMSwgc2VxMiwgZWZmMSwgZWZmMiwgZ3JvdXBybmExLCBncm91cHJuYTIsIGltcG10eCwgZ2FwbWFwMSwgZ2FwbWFwMiwgYWRkaXRpb25hbHBhaXIgKTsKfQoKCnZvaWQgcGFydF9pbXBfbWF0Y2hfaW5pdCggZmxvYXQgKmltcCwgaW50IGNsdXMxLCBpbnQgY2x1czIsIGludCBsZ3RoMSwgaW50IGxndGgyLCBjaGFyICoqc2VxMSwgY2hhciAqKnNlcTIsIGRvdWJsZSAqZWZmMSwgZG91YmxlICplZmYyLCBMb2NhbEhvbSAqKipsb2NhbGhvbSApCnsKCWludCBkaWYsIGksIGosIGsxLCBrMiwgdG1waW50LCBzdGFydDEsIHN0YXJ0MiwgZW5kMSwgZW5kMjsKCXN0YXRpYyBpbnQgaW1wYWxsb2NsZW4gPSAwOwoJY2hhciAqcHQ7CglzdGF0aWMgY2hhciAqbm9jb3VudDEgPSBOVUxMOwoJc3RhdGljIGNoYXIgKm5vY291bnQyID0gTlVMTDsKCglpZiggaW1wYWxsb2NsZW4gPCBsZ3RoMSB8fCBpbXBhbGxvY2xlbiA8IGxndGgyICkKCXsKCQlpZiggaW1wbXR4ICkgRnJlZUZsb2F0TXR4KCBpbXBtdHggKTsKCQlpZiggbm9jb3VudDEgKSBmcmVlKCBub2NvdW50MSApOwoJCWlmKCBub2NvdW50MiApIGZyZWUoIG5vY291bnQyICk7CgkJaW1wYWxsb2NsZW4gPSBNQVgoIGxndGgxLCBsZ3RoMiApICsgMjsKCQlpbXBtdHggPSBBbGxvY2F0ZUZsb2F0TXR4KCBpbXBhbGxvY2xlbiwgaW1wYWxsb2NsZW4gKTsKCQlub2NvdW50MSA9IEFsbG9jYXRlQ2hhclZlYyggaW1wYWxsb2NsZW4gKTsKCQlub2NvdW50MiA9IEFsbG9jYXRlQ2hhclZlYyggaW1wYWxsb2NsZW4gKTsKCQlpbXBhbGxvY2xlbiAtPSAyOwoJfQoKCWZvciggaT0wOyBpPGxndGgxOyBpKysgKQoJewoJCWZvciggaj0wOyBqPGNsdXMxOyBqKysgKQoJCQlpZiggc2VxMVtqXVtpXSA9PSAnLScgKSBicmVhazsKCQlpZiggaiAhPSBjbHVzMSApIG5vY291bnQxW2ldID0gMTsgCgkJZWxzZQkJCSBub2NvdW50MVtpXSA9IDA7Cgl9Cglmb3IoIGk9MDsgaTxsZ3RoMjsgaSsrICkKCXsKCQlmb3IoIGo9MDsgajxjbHVzMjsgaisrICkKCQkJaWYoIHNlcTJbal1baV0gPT0gJy0nICkgYnJlYWs7CgkJaWYoIGogIT0gY2x1czIgKSBub2NvdW50MltpXSA9IDE7CgkJZWxzZQkJCSBub2NvdW50MltpXSA9IDA7Cgl9CgojaWYgMApmcHJpbnRmKCBzdGRlcnIsICJub2NvdW50MiA9XG4iICk7CmZvciggaSA9IDA7IGk8aW1wYWxsb2NsZW47IGkrKyApCnsKCWZwcmludGYoIHN0ZGVyciwgIm5vY291bnQyWyVkXSA9ICVkICglYylcbiIsIGksIG5vY291bnQyW2ldLCBzZXEyWzBdW2ldICk7Cn0KI2VuZGlmCgoJZm9yKCBpPTA7IGk8bGd0aDE7IGkrKyApIGZvciggaj0wOyBqPGxndGgyOyBqKysgKQoJCWltcG10eFtpXVtqXSA9IDAuMDsKCWZvciggaT0wOyBpPGNsdXMxOyBpKysgKQoJewoJCWZwcmludGYoIHN0ZGVyciwgImkgPSAlZCwgc2VxMSA9ICVzXG4iLCBpLCBzZXExW2ldICk7CgkJZm9yKCBqPTA7IGo8Y2x1czI7IGorKyApCgkJewoJCQlmcHJpbnRmKCBzdGRlcnIsICJzdGFydDEgPSAlZFxuIiwgbG9jYWxob21baV1bal0tPnN0YXJ0MSApOwoJCQlmcHJpbnRmKCBzdGRlcnIsICJlbmQxICAgPSAlZFxuIiwgbG9jYWxob21baV1bal0tPmVuZDEgICApOwoJCQlmcHJpbnRmKCBzdGRlcnIsICJqID0gJWQsIHNlcTIgPSAlc1xuIiwgaiwgc2VxMltqXSApOwoJCQlwdCA9IHNlcTFbaV07CgkJCXRtcGludCA9IC0xOwoJCQl3aGlsZSggKnB0ICE9IDAgKQoJCQl7CgkJCQlpZiggKnB0KysgIT0gJy0nICkgdG1waW50Kys7CgkJCQlpZiggdG1waW50ID09IGxvY2FsaG9tW2ldW2pdLT5zdGFydDEgKSBicmVhazsKCQkJfQoJCQlzdGFydDEgPSBwdCAtIHNlcTFbaV0gLSAxOwoKCQkJd2hpbGUoICpwdCAhPSAwICkKCQkJewovLwkJCQlmcHJpbnRmKCBzdGRlcnIsICJ0bXBpbnQgPSAlZCwgZW5kMSA9ICVkIHBvcyA9ICVkXG4iLCB0bXBpbnQsIGxvY2FsaG9tW2ldW2pdLmVuZDEsIHB0LXNlcTFbaV0gKTsKCQkJCWlmKCAqcHQrKyAhPSAnLScgKSB0bXBpbnQrKzsKCQkJCWlmKCB0bXBpbnQgPT0gbG9jYWxob21baV1bal0tPmVuZDEgKSBicmVhazsKCQkJfQoJCQllbmQxID0gcHQgLSBzZXExW2ldIC0gMTsKCgkJCXB0ID0gc2VxMltqXTsKCQkJdG1waW50ID0gLTE7CgkJCXdoaWxlKCAqcHQgIT0gMCApCgkJCXsKCQkJCWlmKCAqcHQrKyAhPSAnLScgKSB0bXBpbnQrKzsKCQkJCWlmKCB0bXBpbnQgPT0gbG9jYWxob21baV1bal0tPnN0YXJ0MiApIGJyZWFrOwoJCQl9CgkJCXN0YXJ0MiA9IHB0IC0gc2VxMltqXSAtIDE7CgkJCXdoaWxlKCAqcHQgIT0gMCApCgkJCXsKCQkJCWlmKCAqcHQrKyAhPSAnLScgKSB0bXBpbnQrKzsKCQkJCWlmKCB0bXBpbnQgPT0gbG9jYWxob21baV1bal0tPmVuZDIgKSBicmVhazsKCQkJfQoJCQllbmQyID0gcHQgLSBzZXEyW2pdIC0gMTsKLy8JCQlmcHJpbnRmKCBzdGRlcnIsICJzdGFydDEgPSAlZCwgZW5kMSA9ICVkLCBzdGFydDIgPSAlZCwgZW5kMiA9ICVkXG4iLCBzdGFydDEsIGVuZDEsIHN0YXJ0MiwgZW5kMiApOwoJCQlrMSA9IHN0YXJ0MTsKCQkJazIgPSBzdGFydDI7CgkJCWZwcmludGYoIHN0ZGVyciwgInN0ZXAgMFxuIiApOwoJCQl3aGlsZSggazEgPD0gZW5kMSAmJiBrMiA8PSBlbmQyICkKCQkJewojaWYgMAoJCQkJaWYoICFub2NvdW50MVtrMV0gJiYgIW5vY291bnQyW2syXSApCgkJCQkJaW1wbXR4W2sxXVtrMl0gKz0gbG9jYWxob21baV1bal0ud2ltcG9ydGFuY2UgKiBlZmYxW2ldICogZWZmMltqXTsKCQkJCWsxKys7IGsyKys7CiNlbHNlCgkJCQlpZiggIW5vY291bnQxW2sxXSAmJiAhbm9jb3VudDJbazJdICkKCQkJCQlpbXBtdHhbazFdW2syXSArPSBsb2NhbGhvbVtpXVtqXS0+d2ltcG9ydGFuY2UgKiBlZmYxW2ldICogZWZmMltqXTsKCQkJCWsxKys7IGsyKys7CiNlbmRpZgoJCQl9CgoJCQlkaWYgPSAoIGVuZDEgLSBzdGFydDEgKSAtICggZW5kMiAtIHN0YXJ0MiApOwoJCQlmcHJpbnRmKCBzdGRlcnIsICJkaWYgPSAlZFxuIiwgZGlmICk7CgkJCWlmKCBkaWYgPiAwICkKCQkJewoJCQkJZG8KCQkJCXsKCQkJCQlmcHJpbnRmKCBzdGRlcnIsICJkaWYgPSAlZFxuIiwgZGlmICk7CgkJCQkJazEgPSBzdGFydDE7CgkJCQkJazIgPSBzdGFydDIgLSBkaWY7CgkJCQkJd2hpbGUoIGsxIDw9IGVuZDEgJiYgazIgPD0gZW5kMiApCgkJCQkJewoJCQkJCQlpZiggMCA8PSBrMiAmJiBzdGFydDIgPD0gazIgJiYgIW5vY291bnQxW2sxXSAmJiAhbm9jb3VudDJbazJdICkKCQkJCQkJCWltcG10eFtrMV1bazJdID0gbG9jYWxob21baV1bal0tPndpbXBvcnRhbmNlICogZWZmMVtpXSAqIGVmZjJbal07CgkJCQkJCWsxKys7IGsyKys7CgkJCQkJfQoJCQkJfQoJCQkJd2hpbGUoIGRpZi0tICk7CgkJCX0KCQkJZWxzZQoJCQl7CgkJCQlkbwoJCQkJewoJCQkJCWsxID0gc3RhcnQxICsgZGlmOwoJCQkJCWsyID0gc3RhcnQyOwoJCQkJCXdoaWxlKCBrMSA8PSBlbmQxICkKCQkJCQl7CgkJCQkJCWlmKCBrMSA+PSAwICYmIGsxID49IHN0YXJ0MSAmJiAhbm9jb3VudDFbazFdICYmICFub2NvdW50MltrMl0gKQoJCQkJCQkJaW1wbXR4W2sxXVtrMl0gPSBsb2NhbGhvbVtpXVtqXS0+d2ltcG9ydGFuY2UgKiBlZmYxW2ldICogZWZmMltqXTsKCQkJCQkJazErKzsgazIrKzsKCQkJCQl9CgkJCQl9CgkJCQl3aGlsZSggZGlmKysgKTsKCQkJfQoJCX0KCX0KI2lmIDAKCWZwcmludGYoIHN0ZGVyciwgImltcG10eCA9IFxuIiApOwoJZm9yKCBrMj0wOyBrMjxsZ3RoMjsgazIrKyApCgkJZnByaW50Ziggc3RkZXJyLCAiJTYuM2YgIiwgKGRvdWJsZSlrMiApOwoJZnByaW50Ziggc3RkZXJyLCAiXG4iICk7Cglmb3IoIGsxPTA7IGsxPGxndGgxOyBrMSsrICkKCXsKCQlmcHJpbnRmKCBzdGRlcnIsICIlZCIsIGsxICk7CgkJZm9yKCBrMj0wOyBrMjxsZ3RoMjsgazIrKyApCgkJCWZwcmludGYoIHN0ZGVyciwgIiU2LjNmICIsIGltcG10eFtrMV1bazJdICk7CgkJZnByaW50Ziggc3RkZXJyLCAiXG4iICk7Cgl9CglleGl0KCAxICk7CiNlbmRpZgp9CgpzdGF0aWMgdm9pZCBtYXRjaF9jYWxjKCBmbG9hdCAqbWF0Y2gsIGZsb2F0ICoqY3BteDEsIGZsb2F0ICoqY3BteDIsIGludCBpMSwgaW50IGxndGgyLCBmbG9hdCAqKmZsb2F0d29yaywgaW50ICoqaW50d29yaywgaW50IGluaXRpYWxpemUgKQp7CiNpZiBGQVNUTUFUQ0hDQUxDCglpbnQgaiwgbDsKCWZsb2F0IHNjYXJyWzI2XTsKCWZsb2F0ICoqY3BteHBkID0gZmxvYXR3b3JrOwoJaW50ICoqY3BteHBkbiA9IGludHdvcms7CglmbG9hdCAqbWF0Y2hwdCwgKmNwbXhwZHB0LCAqKmNwbXhwZHB0cHQ7CglpbnQgKmNwbXhwZG5wdCwgKipjcG14cGRucHRwdDsKCWlmKCBpbml0aWFsaXplICkKCXsKCQlpbnQgY291bnQgPSAwOwoJCWZvciggaj0wOyBqPGxndGgyOyBqKysgKQoJCXsKCQkJY291bnQgPSAwOwoJCQlmb3IoIGw9MDsgbDwyNjsgbCsrICkKCQkJewoJCQkJaWYoIGNwbXgyW2xdW2pdICkKCQkJCXsKCQkJCQljcG14cGRbal1bY291bnRdID0gY3BteDJbbF1bal07CgkJCQkJY3BteHBkbltqXVtjb3VudF0gPSBsOwoJCQkJCWNvdW50Kys7CgkJCQl9CgkJCX0KCQkJY3BteHBkbltqXVtjb3VudF0gPSAtMTsKCQl9Cgl9CgoJewoJCWZvciggbD0wOyBsPDI2OyBsKysgKQoJCXsKCQkJc2NhcnJbbF0gPSAwLjA7CgkJCWZvciggaj0wOyBqPDI2OyBqKysgKQoJCQkJc2NhcnJbbF0gKz0gbl9kaXNfY29uc3dlaWdodF9tdWx0aVtqXVtsXSAqIGNwbXgxW2pdW2kxXTsKLy8JCQkJc2NhcnJbbF0gKz0gbl9kaXNbal1bbF0gKiBjcG14MVtqXVtpMV07CgkJfQoJCW1hdGNocHQgPSBtYXRjaDsKCQljcG14cGRucHRwdCA9IGNwbXhwZG47CgkJY3BteHBkcHRwdCA9IGNwbXhwZDsKCQl3aGlsZSggbGd0aDItLSApCgkJewoJCQkqbWF0Y2hwdCA9IDAuMDsKCQkJY3BteHBkbnB0ID0gKmNwbXhwZG5wdHB0Kys7CgkJCWNwbXhwZHB0ID0gKmNwbXhwZHB0cHQrKzsKCQkJd2hpbGUoICpjcG14cGRucHQ+LTEgKQoJCQkJKm1hdGNocHQgKz0gc2NhcnJbKmNwbXhwZG5wdCsrXSAqICpjcG14cGRwdCsrOwoJCQltYXRjaHB0Kys7CgkJfSAKCX0KI2Vsc2UKCWludCBqLCBrLCBsOwoJZmxvYXQgc2NhcnJbMjZdOwoJZmxvYXQgKipjcG14cGQgPSBmbG9hdHdvcms7CglpbnQgKipjcG14cGRuID0gaW50d29yazsKCS8vIHNpbXBsZQoJaWYoIGluaXRpYWxpemUgKQoJewoJCWludCBjb3VudCA9IDA7CgkJZm9yKCBqPTA7IGo8bGd0aDI7IGorKyApCgkJewoJCQljb3VudCA9IDA7CgkJCWZvciggbD0wOyBsPDI2OyBsKysgKQoJCQl7CgkJCQlpZiggY3BteDJbbF1bal0gKQoJCQkJewoJCQkJCWNwbXhwZFtjb3VudF1bal0gPSBjcG14MltsXVtqXTsKCQkJCQljcG14cGRuW2NvdW50XVtqXSA9IGw7CgkJCQkJY291bnQrKzsKCQkJCX0KCQkJfQoJCQljcG14cGRuW2NvdW50XVtqXSA9IC0xOwoJCX0KCX0KCWZvciggbD0wOyBsPDI2OyBsKysgKQoJewoJCXNjYXJyW2xdID0gMC4wOwoJCWZvciggaz0wOyBrPDI2OyBrKysgKQoJCQlzY2FycltsXSArPSBuX2Rpc19jb25zd2VpZ2h0X211bHRpW2tdW2xdICogY3BteDFba11baTFdOwovLwkJCXNjYXJyW2xdICs9IG5fZGlzW2tdW2xdICogY3BteDFba11baTFdOwoJfQoJZm9yKCBqPTA7IGo8bGd0aDI7IGorKyApCgl7CgkJbWF0Y2hbal0gPSAwLjA7CgkJZm9yKCBrPTA7IGNwbXhwZG5ba11bal0+LTE7IGsrKyApCgkJCW1hdGNoW2pdICs9IHNjYXJyW2NwbXhwZG5ba11bal1dICogY3BteHBkW2tdW2pdOwoJfSAKI2VuZGlmCn0KCnN0YXRpYyB2b2lkIEF0cmFja2luZ19sb2NhbGhvbSggZmxvYXQgKmltcHdtcHQsIGZsb2F0ICpsYXN0aG9yaXpvbnRhbHcsIGZsb2F0ICpsYXN0dmVydGljYWx3LCAKCQkJCQkJY2hhciAqKnNlcTEsIGNoYXIgKipzZXEyLCAKICAgICAgICAgICAgICAgICAgICAgICAgY2hhciAqKm1zZXExLCBjaGFyICoqbXNlcTIsIAogICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCAqKmNwbXgxLCBmbG9hdCAqKmNwbXgyLCAKICAgICAgICAgICAgICAgICAgICAgICAgaW50ICoqaWpwLCBpbnQgaWN5YywgaW50IGpjeWMsCgkJCQkJCWludCBzdGFydDEsIGludCBlbmQxLCBpbnQgc3RhcnQyLCBpbnQgZW5kMiwKCQkJCQkJaW50ICpnYXBtYXAxLCBpbnQgKmdhcG1hcDIgKQp7CglpbnQgaSwgaiwgbCwgaWluLCBqaW4sIGlmaSwgamZpLCBsZ3RoMSwgbGd0aDIsIGs7CgljaGFyIGdhcFtdID0gIi0iOwoJZmxvYXQgd207CglsZ3RoMSA9IHN0cmxlbiggc2VxMVswXSApOwoJbGd0aDIgPSBzdHJsZW4oIHNlcTJbMF0gKTsKCiNpZiAwCglmb3IoIGk9MDsgaTxsZ3RoMTsgaSsrICkgCgl7CgkJZnByaW50Ziggc3RkZXJyLCAibGFzdHZlcnRpY2Fsd1slZF0gPSAlZlxuIiwgaSwgbGFzdHZlcnRpY2Fsd1tpXSApOwoJfQojZW5kaWYKIAoJaWYoIG91dGdhcCA9PSAxICkKCQk7CgllbHNlCgl7CgkJd20gPSBsYXN0dmVydGljYWx3WzBdOwoJCWZvciggaT0wOyBpPGxndGgxOyBpKysgKQoJCXsKCQkJaWYoIGxhc3R2ZXJ0aWNhbHdbaV0gPj0gd20gKQoJCQl7CgkJCQl3bSA9IGxhc3R2ZXJ0aWNhbHdbaV07CgkJCQlpaW4gPSBpOyBqaW4gPSBsZ3RoMi0xOwoJCQkJaWpwW2xndGgxXVtsZ3RoMl0gPSArKCBsZ3RoMSAtIGkgKTsKCQkJfQoJCX0KCQlmb3IoIGo9MDsgajxsZ3RoMjsgaisrICkKCQl7CgkJCWlmKCBsYXN0aG9yaXpvbnRhbHdbal0gPj0gd20gKQoJCQl7CgkJCQl3bSA9IGxhc3Rob3Jpem9udGFsd1tqXTsKCQkJCWlpbiA9IGxndGgxLTE7IGppbiA9IGo7CgkJCQlpanBbbGd0aDFdW2xndGgyXSA9IC0oIGxndGgyIC0gaiApOwoJCQl9CgkJfQoJfQoKICAgIGZvciggaT0wOyBpPGxndGgxKzE7IGkrKyApIAogICAgewogICAgICAgIGlqcFtpXVswXSA9IGkgKyAxOwogICAgfQogICAgZm9yKCBqPTA7IGo8bGd0aDIrMTsgaisrICkgCiAgICB7CiAgICAgICAgaWpwWzBdW2pdID0gLSggaiArIDEgKTsKICAgIH0KCglmb3IoIGk9MDsgaTxpY3ljOyBpKysgKQoJewoJCW1zZXExW2ldICs9IGxndGgxK2xndGgyOwoJCSptc2VxMVtpXSA9IDA7Cgl9Cglmb3IoIGo9MDsgajxqY3ljOyBqKysgKQoJewoJCW1zZXEyW2pdICs9IGxndGgxK2xndGgyOwoJCSptc2VxMltqXSA9IDA7Cgl9CglpaW4gPSBsZ3RoMTsgamluID0gbGd0aDI7CgkqaW1wd21wdCA9IDAuMDsKCWZvciggaz0wOyBrPD1sZ3RoMStsZ3RoMjsgaysrICkgCgl7CgkJaWYoIGlqcFtpaW5dW2ppbl0gPCAwICkgCgkJewoJCQlpZmkgPSBpaW4tMTsgamZpID0gamluK2lqcFtpaW5dW2ppbl07CgkJfQoJCWVsc2UgaWYoIGlqcFtpaW5dW2ppbl0gPiAwICkKCQl7CgkJCWlmaSA9IGlpbi1panBbaWluXVtqaW5dOyBqZmkgPSBqaW4tMTsKCQl9CgkJZWxzZQoJCXsKCQkJaWZpID0gaWluLTE7IGpmaSA9IGppbi0xOwoJCX0KCQlsID0gaWluIC0gaWZpOwoJCXdoaWxlKCAtLWwgKSAKCQl7CgkJCWZvciggaT0wOyBpPGljeWM7IGkrKyApCgkJCQkqLS1tc2VxMVtpXSA9IHNlcTFbaV1baWZpK2xdOwoJCQlmb3IoIGo9MDsgajxqY3ljOyBqKysgKSAKCQkJCSotLW1zZXEyW2pdID0gKmdhcDsKCQkJaysrOwoJCX0KCQlsPSBqaW4gLSBqZmk7CgkJd2hpbGUoIC0tbCApCgkJewoJCQlmb3IoIGk9MDsgaTxpY3ljOyBpKysgKSAKCQkJCSotLW1zZXExW2ldID0gKmdhcDsKCQkJZm9yKCBqPTA7IGo8amN5YzsgaisrICkgCgkJCQkqLS1tc2VxMltqXSA9IHNlcTJbal1bamZpK2xdOwoJCQlrKys7CgkJfQoJCWlmKCBpaW4gIT0gbGd0aDEgJiYgamluICE9IGxndGgyICkgLy8gPz8KCQl7CgkJCSppbXB3bXB0ICs9IHBhcnRfaW1wX21hdGNoX291dF9zYyggZ2FwbWFwMVtpaW5dK3N0YXJ0MSwgZ2FwbWFwMltqaW5dK3N0YXJ0MiApOwovLwkJCWZwcmludGYoIHN0ZGVyciwgImltcHdtID0gJWYgKGlpbj0lZCwgamluPSVkKSBzZXExPSVjLCBzZXEyPSVjXG4iLCAqaW1wd21wdCwgaWluLCBqaW4sIHNlcTFbMF1baWluXSwgc2VxMlswXVtqaW5dICk7CgkJfQoJCWlmKCBpaW4gPD0gMCB8fCBqaW4gPD0gMCApIGJyZWFrOwoJCWZvciggaT0wOyBpPGljeWM7IGkrKyApIAoJCQkqLS1tc2VxMVtpXSA9IHNlcTFbaV1baWZpXTsKCQlmb3IoIGo9MDsgajxqY3ljOyBqKysgKSAKCQkJKi0tbXNlcTJbal0gPSBzZXEyW2pdW2pmaV07CgkJaysrOwoJCWlpbiA9IGlmaTsgamluID0gamZpOwoJfQp9CnN0YXRpYyBmbG9hdCBBdHJhY2tpbmcoIGZsb2F0ICpsYXN0aG9yaXpvbnRhbHcsIGZsb2F0ICpsYXN0dmVydGljYWx3LCAKCQkJCQkJY2hhciAqKnNlcTEsIGNoYXIgKipzZXEyLCAKICAgICAgICAgICAgICAgICAgICAgICAgY2hhciAqKm1zZXExLCBjaGFyICoqbXNlcTIsIAogICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCAqKmNwbXgxLCBmbG9hdCAqKmNwbXgyLCAKICAgICAgICAgICAgICAgICAgICAgICAgaW50ICoqaWpwLCBpbnQgaWN5YywgaW50IGpjeWMgKQp7CglpbnQgaSwgaiwgbCwgaWluLCBqaW4sIGlmaSwgamZpLCBsZ3RoMSwgbGd0aDIsIGssIGxhc3RrOwoJY2hhciBnYXBbXSA9ICItIjsKCWZsb2F0IHdtID0gMC4wOwoJbGd0aDEgPSBzdHJsZW4oIHNlcTFbMF0gKTsKCWxndGgyID0gc3RybGVuKCBzZXEyWzBdICk7CgojaWYgMAoJZm9yKCBpPTA7IGk8bGd0aDE7IGkrKyApIAoJewoJCWZwcmludGYoIHN0ZGVyciwgImxhc3R2ZXJ0aWNhbHdbJWRdID0gJWZcbiIsIGksIGxhc3R2ZXJ0aWNhbHdbaV0gKTsKCX0KI2VuZGlmCiAKCWlmKCBvdXRnYXAgPT0gMSApCgkJOwoJZWxzZQoJewoJCXdtID0gbGFzdHZlcnRpY2Fsd1swXTsKCQlmb3IoIGk9MDsgaTxsZ3RoMTsgaSsrICkKCQl7CgkJCWlmKCBsYXN0dmVydGljYWx3W2ldID49IHdtICkKCQkJewoJCQkJd20gPSBsYXN0dmVydGljYWx3W2ldOwoJCQkJaWluID0gaTsgamluID0gbGd0aDItMTsKCQkJCWlqcFtsZ3RoMV1bbGd0aDJdID0gKyggbGd0aDEgLSBpICk7CgkJCX0KCQl9CgkJZm9yKCBqPTA7IGo8bGd0aDI7IGorKyApCgkJewoJCQlpZiggbGFzdGhvcml6b250YWx3W2pdID49IHdtICkKCQkJewoJCQkJd20gPSBsYXN0aG9yaXpvbnRhbHdbal07CgkJCQlpaW4gPSBsZ3RoMS0xOyBqaW4gPSBqOwoJCQkJaWpwW2xndGgxXVtsZ3RoMl0gPSAtKCBsZ3RoMiAtIGogKTsKCQkJfQoJCX0KCX0KCiAgICBmb3IoIGk9MDsgaTxsZ3RoMSsxOyBpKysgKSAKICAgIHsKICAgICAgICBpanBbaV1bMF0gPSBpICsgMTsKICAgIH0KICAgIGZvciggaj0wOyBqPGxndGgyKzE7IGorKyApIAogICAgewogICAgICAgIGlqcFswXVtqXSA9IC0oIGogKyAxICk7CiAgICB9CgoJZm9yKCBpPTA7IGk8aWN5YzsgaSsrICkKCXsKCQltc2VxMVtpXSArPSBsZ3RoMStsZ3RoMjsKCQkqbXNlcTFbaV0gPSAwOwoJfQoJZm9yKCBqPTA7IGo8amN5YzsgaisrICkKCXsKCQltc2VxMltqXSArPSBsZ3RoMStsZ3RoMjsKCQkqbXNlcTJbal0gPSAwOwoJfQoJaWluID0gbGd0aDE7IGppbiA9IGxndGgyOwoJbGFzdGsgPSBsZ3RoMStsZ3RoMjsKCWZvciggaz0wOyBrPD1sYXN0azsgaysrICkgCgl7CgkJaWYoIGlqcFtpaW5dW2ppbl0gPCAwICkgCgkJewoJCQlpZmkgPSBpaW4tMTsgamZpID0gamluK2lqcFtpaW5dW2ppbl07CgkJfQoJCWVsc2UgaWYoIGlqcFtpaW5dW2ppbl0gPiAwICkKCQl7CgkJCWlmaSA9IGlpbi1panBbaWluXVtqaW5dOyBqZmkgPSBqaW4tMTsKCQl9CgkJZWxzZQoJCXsKCQkJaWZpID0gaWluLTE7IGpmaSA9IGppbi0xOwoJCX0KCQlsID0gaWluIC0gaWZpOwoJCXdoaWxlKCAtLWwgKSAKCQl7CgkJCWZvciggaT0wOyBpPGljeWM7IGkrKyApCgkJCQkqLS1tc2VxMVtpXSA9IHNlcTFbaV1baWZpK2xdOwoJCQlmb3IoIGo9MDsgajxqY3ljOyBqKysgKSAKCQkJCSotLW1zZXEyW2pdID0gKmdhcDsKCQkJaysrOwoJCX0KCQlsPSBqaW4gLSBqZmk7CgkJd2hpbGUoIC0tbCApCgkJewoJCQlmb3IoIGk9MDsgaTxpY3ljOyBpKysgKSAKCQkJCSotLW1zZXExW2ldID0gKmdhcDsKCQkJZm9yKCBqPTA7IGo8amN5YzsgaisrICkgCgkJCQkqLS1tc2VxMltqXSA9IHNlcTJbal1bamZpK2xdOwoJCQlrKys7CgkJfQoJCWlmKCBpaW4gPD0gMCB8fCBqaW4gPD0gMCApIGJyZWFrOwoJCWZvciggaT0wOyBpPGljeWM7IGkrKyApIAoJCQkqLS1tc2VxMVtpXSA9IHNlcTFbaV1baWZpXTsKCQlmb3IoIGo9MDsgajxqY3ljOyBqKysgKSAKCQkJKi0tbXNlcTJbal0gPSBzZXEyW2pdW2pmaV07CgkJaysrOwoJCWlpbiA9IGlmaTsgamluID0gamZpOwoJfQoJcmV0dXJuKCAwLjAgKTsKfQoKZmxvYXQgcGFydEFfX2FsaWduKCBjaGFyICoqc2VxMSwgY2hhciAqKnNlcTIsIGRvdWJsZSAqZWZmMSwgZG91YmxlICplZmYyLCBpbnQgaWN5YywgaW50IGpjeWMsIGludCBhbGxvY2xlbiwgTG9jYWxIb20gKioqbG9jYWxob20sIGZsb2F0ICppbXBtYXRjaCwgaW50IHN0YXJ0MSwgaW50IGVuZDEsIGludCBzdGFydDIsIGludCBlbmQyLCBpbnQgKmdhcG1hcDEsIGludCAqZ2FwbWFwMiwgY2hhciAqc2dhcDEsIGNoYXIgKnNnYXAyLCBjaGFyICplZ2FwMSwgY2hhciAqZWdhcDIgKQovKiBzY29yZSBubyBrZWlzYW4gbm8gc2FpIG1vdG9rYXJhYXJ1IGdhcCBubyBhdHVrYWkgbmkgbW9uZGFpIGdhIGFydSAqLwp7Ci8vCWludCBrOwoJcmVnaXN0ZXIgaW50IGksIGo7CglpbnQgbGFzdGksIGxhc3RqOyAvKiBvdXRnYXAgPT0gMCAtPiBsZ3RoMSwgb3V0Z2FwID09IDEgLT4gbGd0aDErMSAqLwoJaW50IGxndGgxLCBsZ3RoMjsKCWludCByZXN1bHRsZW47CglmbG9hdCB3bSA9IDAuMDsgICAvKiBpbnQgPz8/Pz8/ICovCglmbG9hdCBnOwoJZmxvYXQgKmN1cnJlbnR3LCAqcHJldmlvdXN3OwojaWYgMQoJZmxvYXQgKnd0bXA7CglpbnQgKmlqcHB0OwoJZmxvYXQgKm1qcHQsICpwcmVwdCwgKmN1cnB0OwoJaW50ICptcGpwdDsKI2VuZGlmCglzdGF0aWMgZmxvYXQgbWksICptOwoJc3RhdGljIGludCAqKmlqcDsKCXN0YXRpYyBpbnQgbXBpLCAqbXA7CglzdGF0aWMgZmxvYXQgKncxLCAqdzI7CglzdGF0aWMgZmxvYXQgKm1hdGNoOwoJc3RhdGljIGZsb2F0ICppbml0dmVydGljYWx3OyAgICAvKiBrdWZ1dSBzdXJlYmEgaXJhbmFpICovCglzdGF0aWMgZmxvYXQgKmxhc3R2ZXJ0aWNhbHc7ICAgIC8qIGt1ZnV1IHN1cmViYSBpcmFuYWkgKi8KCXN0YXRpYyBjaGFyICoqbXNlcTE7CglzdGF0aWMgY2hhciAqKm1zZXEyOwoJc3RhdGljIGNoYXIgKiptc2VxOwoJc3RhdGljIGZsb2F0ICpvZ2NwMTsKCXN0YXRpYyBmbG9hdCAqb2djcDI7CglzdGF0aWMgZmxvYXQgKmZnY3AxOwoJc3RhdGljIGZsb2F0ICpmZ2NwMjsKCXN0YXRpYyBmbG9hdCAqKmNwbXgxOwoJc3RhdGljIGZsb2F0ICoqY3BteDI7CglzdGF0aWMgaW50ICoqaW50d29yazsKCXN0YXRpYyBmbG9hdCAqKmZsb2F0d29yazsKCXN0YXRpYyBpbnQgb3JsZ3RoMSA9IDAsIG9ybGd0aDIgPSAwOwoJZmxvYXQgZnBlbmFsdHkgPSAoZmxvYXQpcGVuYWx0eTsKI2lmIFVTRV9QRU5BTFRZX0VYCglmbG9hdCBmcGVuYWx0eV9leCA9IChmbG9hdClwZW5hbHR5X2V4OwojZW5kaWYKCWZsb2F0ICpmZ2NwMnB0OwoJZmxvYXQgKm9nY3AycHQ7CglmbG9hdCBmZ2NwMXZhOwoJZmxvYXQgb2djcDF2YTsKCgoKI2lmIDAKCWZwcmludGYoIHN0ZGVyciwgImVmZiBpbiBTQSsrK2FsaWduXG4iICk7Cglmb3IoIGk9MDsgaTxpY3ljOyBpKysgKSBmcHJpbnRmKCBzdGRlcnIsICJlZmYxWyVkXSA9ICVmXG4iLCBpLCBlZmYxW2ldICk7CiNlbmRpZgoJaWYoIG9ybGd0aDEgPT0gMCApCgl7CgkJbXNlcTEgPSBBbGxvY2F0ZUNoYXJNdHgoIG5qb2IsIDAgKTsKCQltc2VxMiA9IEFsbG9jYXRlQ2hhck10eCggbmpvYiwgMCApOwoJfQoKCglsZ3RoMSA9IHN0cmxlbiggc2VxMVswXSApOwoJbGd0aDIgPSBzdHJsZW4oIHNlcTJbMF0gKTsKCglpZiggbGd0aDEgPiBvcmxndGgxIHx8IGxndGgyID4gb3JsZ3RoMiApCgl7CgkJaW50IGxsMSwgbGwyOwoKCQlpZiggb3JsZ3RoMSA+IDAgJiYgb3JsZ3RoMiA+IDAgKQoJCXsKCQkJRnJlZUZsb2F0VmVjKCB3MSApOwoJCQlGcmVlRmxvYXRWZWMoIHcyICk7CgkJCUZyZWVGbG9hdFZlYyggbWF0Y2ggKTsKCQkJRnJlZUZsb2F0VmVjKCBpbml0dmVydGljYWx3ICk7CgkJCUZyZWVGbG9hdFZlYyggbGFzdHZlcnRpY2FsdyApOwoKCQkJRnJlZUZsb2F0VmVjKCBtICk7CgkJCUZyZWVJbnRWZWMoIG1wICk7CgoJCQlGcmVlQ2hhck10eCggbXNlcSApOwoKCQkJRnJlZUZsb2F0VmVjKCBvZ2NwMSApOwoJCQlGcmVlRmxvYXRWZWMoIG9nY3AyICk7CgkJCUZyZWVGbG9hdFZlYyggZmdjcDEgKTsKCQkJRnJlZUZsb2F0VmVjKCBmZ2NwMiApOwoKCgkJCUZyZWVGbG9hdE10eCggY3BteDEgKTsKCQkJRnJlZUZsb2F0TXR4KCBjcG14MiApOwoKCQkJRnJlZUZsb2F0TXR4KCBmbG9hdHdvcmsgKTsKCQkJRnJlZUludE10eCggaW50d29yayApOwoJCX0KCgkJbGwxID0gTUFYKCAoaW50KSgxLjMqbGd0aDEpLCBvcmxndGgxICkgKyAxMDA7CgkJbGwyID0gTUFYKCAoaW50KSgxLjMqbGd0aDIpLCBvcmxndGgyICkgKyAxMDA7CgojaWYgREVCVUcKCQlmcHJpbnRmKCBzdGRlcnIsICJcbnRyeWluZyB0byBhbGxvY2F0ZSAoJWQrJWQpeG4gbWF0cmljZXMgLi4uICIsIGxsMSwgbGwyICk7CiNlbmRpZgoKCQl3MSA9IEFsbG9jYXRlRmxvYXRWZWMoIGxsMisyICk7CgkJdzIgPSBBbGxvY2F0ZUZsb2F0VmVjKCBsbDIrMiApOwoJCW1hdGNoID0gQWxsb2NhdGVGbG9hdFZlYyggbGwyKzIgKTsKCgkJaW5pdHZlcnRpY2FsdyA9IEFsbG9jYXRlRmxvYXRWZWMoIGxsMSsyICk7CgkJbGFzdHZlcnRpY2FsdyA9IEFsbG9jYXRlRmxvYXRWZWMoIGxsMSsyICk7CgoJCW0gPSBBbGxvY2F0ZUZsb2F0VmVjKCBsbDIrMiApOwoJCW1wID0gQWxsb2NhdGVJbnRWZWMoIGxsMisyICk7CgoJCW1zZXEgPSBBbGxvY2F0ZUNoYXJNdHgoIG5qb2IsIGxsMStsbDIgKTsKCgkJb2djcDEgPSBBbGxvY2F0ZUZsb2F0VmVjKCBsbDErMiApOwoJCW9nY3AyID0gQWxsb2NhdGVGbG9hdFZlYyggbGwyKzIgKTsKCQlmZ2NwMSA9IEFsbG9jYXRlRmxvYXRWZWMoIGxsMSsyICk7CgkJZmdjcDIgPSBBbGxvY2F0ZUZsb2F0VmVjKCBsbDIrMiApOwoKCQljcG14MSA9IEFsbG9jYXRlRmxvYXRNdHgoIDI2LCBsbDErMiApOwoJCWNwbXgyID0gQWxsb2NhdGVGbG9hdE10eCggMjYsIGxsMisyICk7CgojaWYgRkFTVE1BVENIQ0FMQwoJCWZsb2F0d29yayA9IEFsbG9jYXRlRmxvYXRNdHgoIE1BWCggbGwxLCBsbDIgKSsyLCAyNiApOyAKCQlpbnR3b3JrID0gQWxsb2NhdGVJbnRNdHgoIE1BWCggbGwxLCBsbDIgKSsyLCAyNiApOyAKI2Vsc2UKCQlmbG9hdHdvcmsgPSBBbGxvY2F0ZUZsb2F0TXR4KCAyNiwgTUFYKCBsbDEsIGxsMiApKzIgKTsgCgkJaW50d29yayA9IEFsbG9jYXRlSW50TXR4KCAyNiwgTUFYKCBsbDEsIGxsMiApKzIgKTsgCiNlbmRpZgoKI2lmIERFQlVHCgkJZnByaW50Ziggc3RkZXJyLCAic3VjY2VlZGVkXG4iICk7CiNlbmRpZgoKCQlvcmxndGgxID0gbGwxIC0gMTAwOwoJCW9ybGd0aDIgPSBsbDIgLSAxMDA7Cgl9CgoKCWZvciggaT0wOyBpPGljeWM7IGkrKyApIG1zZXExW2ldID0gbXNlcVtpXTsKCWZvciggaj0wOyBqPGpjeWM7IGorKyApIG1zZXEyW2pdID0gbXNlcVtpY3ljK2pdOwoKCglpZiggb3JsZ3RoMSA+IGNvbW1vbkFsbG9jMSB8fCBvcmxndGgyID4gY29tbW9uQWxsb2MyICkKCXsKCQlpbnQgbGwxLCBsbDI7CgoJCWlmKCBjb21tb25BbGxvYzEgJiYgY29tbW9uQWxsb2MyICkKCQl7CgkJCUZyZWVJbnRNdHgoIGNvbW1vbklQICk7CgkJfQoKCQlsbDEgPSBNQVgoIG9ybGd0aDEsIGNvbW1vbkFsbG9jMSApOwoJCWxsMiA9IE1BWCggb3JsZ3RoMiwgY29tbW9uQWxsb2MyICk7CgojaWYgREVCVUcKCQlmcHJpbnRmKCBzdGRlcnIsICJcblxudHJ5aW5nIHRvIGFsbG9jYXRlICVkeCVkIG1hdHJpY2VzIC4uLiAiLCBsbDErMSwgbGwyKzEgKTsKI2VuZGlmCgoJCWNvbW1vbklQID0gQWxsb2NhdGVJbnRNdHgoIGxsMSsxMCwgbGwyKzEwICk7CgojaWYgREVCVUcKCQlmcHJpbnRmKCBzdGRlcnIsICJzdWNjZWVkZWRcblxuIiApOwojZW5kaWYKCgkJY29tbW9uQWxsb2MxID0gbGwxOwoJCWNvbW1vbkFsbG9jMiA9IGxsMjsKCX0KCWlqcCA9IGNvbW1vbklQOwoKCWNwbXhfY2FsY19uZXcoIHNlcTEsIGNwbXgxLCBlZmYxLCBsZ3RoMSwgaWN5YyApOwoJY3BteF9jYWxjX25ldyggc2VxMiwgY3BteDIsIGVmZjIsIGxndGgyLCBqY3ljICk7CgoJaWYoIHNnYXAxICkKCXsKCQluZXdfT3BlbmluZ0dhcENvdW50KCBvZ2NwMSwgaWN5Yywgc2VxMSwgZWZmMSwgbGd0aDEsIHNnYXAxICk7CgkJbmV3X09wZW5pbmdHYXBDb3VudCggb2djcDIsIGpjeWMsIHNlcTIsIGVmZjIsIGxndGgyLCBzZ2FwMiApOwoJCW5ld19GaW5hbEdhcENvdW50KCBmZ2NwMSwgaWN5Yywgc2VxMSwgZWZmMSwgbGd0aDEsIGVnYXAxICk7CgkJbmV3X0ZpbmFsR2FwQ291bnQoIGZnY3AyLCBqY3ljLCBzZXEyLCBlZmYyLCBsZ3RoMiwgZWdhcDIgKTsKCX0KCWVsc2UKCXsKCQlzdF9PcGVuaW5nR2FwQ291bnQoIG9nY3AxLCBpY3ljLCBzZXExLCBlZmYxLCBsZ3RoMSApOwoJCXN0X09wZW5pbmdHYXBDb3VudCggb2djcDIsIGpjeWMsIHNlcTIsIGVmZjIsIGxndGgyICk7CgkJc3RfRmluYWxHYXBDb3VudCggZmdjcDEsIGljeWMsIHNlcTEsIGVmZjEsIGxndGgxICk7CgkJc3RfRmluYWxHYXBDb3VudCggZmdjcDIsIGpjeWMsIHNlcTIsIGVmZjIsIGxndGgyICk7Cgl9CgoJZm9yKCBpPTA7IGk8bGd0aDE7IGkrKyApIAoJewoJCW9nY3AxW2ldID0gMC41ICogKCAxLjAgLSBvZ2NwMVtpXSApICogZnBlbmFsdHk7CgkJZmdjcDFbaV0gPSAwLjUgKiAoIDEuMCAtIGZnY3AxW2ldICkgKiBmcGVuYWx0eTsKCX0KCWZvciggaT0wOyBpPGxndGgyOyBpKysgKSAKCXsKCQlvZ2NwMltpXSA9IDAuNSAqICggMS4wIC0gb2djcDJbaV0gKSAqIGZwZW5hbHR5OwoJCWZnY3AyW2ldID0gMC41ICogKCAxLjAgLSBmZ2NwMltpXSApICogZnBlbmFsdHk7Cgl9CiNpZiAwCglmb3IoIGk9MDsgaTxsZ3RoMTsgaSsrICkgCgkJZnByaW50Ziggc3RkZXJyLCAib2djcDFbJWRdPSVmXG4iLCBpLCBvZ2NwMVtpXSApOwojZW5kaWYKCgljdXJyZW50dyA9IHcxOwoJcHJldmlvdXN3ID0gdzI7CgoKCW1hdGNoX2NhbGMoIGluaXR2ZXJ0aWNhbHcsIGNwbXgyLCBjcG14MSwgMCwgbGd0aDEsIGZsb2F0d29yaywgaW50d29yaywgMSApOwoJaWYoIGxvY2FsaG9tICkKCQlwYXJ0X2ltcF9tYXRjaF9vdXRfdmVhZF90YXRlX2dhcG1hcCggaW5pdHZlcnRpY2FsdywgZ2FwbWFwMlswXStzdGFydDIsIGxndGgxLCBzdGFydDEsIGdhcG1hcDEgKTsKCgoJbWF0Y2hfY2FsYyggY3VycmVudHcsIGNwbXgxLCBjcG14MiwgMCwgbGd0aDIsIGZsb2F0d29yaywgaW50d29yaywgMSApOwoJaWYoIGxvY2FsaG9tICkKCQlwYXJ0X2ltcF9tYXRjaF9vdXRfdmVhZF9nYXBtYXAoIGN1cnJlbnR3LCBnYXBtYXAxWzBdK3N0YXJ0MSwgbGd0aDIsIHN0YXJ0MiwgZ2FwbWFwMiApOwojaWYgMCAvLyAtPiB0YmZhc3QuYwoJaWYoIGxvY2FsaG9tICkKCQlpbXBfbWF0Y2hfY2FsYyggY3VycmVudHcsIGljeWMsIGpjeWMsIGxndGgxLCBsZ3RoMiwgc2VxMSwgc2VxMiwgZWZmMSwgZWZmMiwgbG9jYWxob20sIDEsIDAgKTsKCiNlbmRpZgoKCWlmKCBvdXRnYXAgPT0gMSApCgl7CgkJZm9yKCBpPTE7IGk8bGd0aDErMTsgaSsrICkKCQl7CgkJCWluaXR2ZXJ0aWNhbHdbaV0gKz0gKCBvZ2NwMVswXSArIGZnY3AxW2ktMV0gKSA7CgkJfQoJCWZvciggaj0xOyBqPGxndGgyKzE7IGorKyApCgkJewoJCQljdXJyZW50d1tqXSArPSAoIG9nY3AyWzBdICsgZmdjcDJbai0xXSApIDsKCQl9Cgl9CiNpZiBPVVRHQVAwVFJZCgllbHNlCgl7CgkJZm9yKCBqPTE7IGo8bGd0aDIrMTsgaisrICkKCQkJY3VycmVudHdbal0gLT0gb2Zmc2V0ICogaiAvIDIuMDsKCQlmb3IoIGk9MTsgaTxsZ3RoMSsxOyBpKysgKQoJCQlpbml0dmVydGljYWx3W2ldIC09IG9mZnNldCAqIGkgLyAyLjA7Cgl9CiNlbmRpZgoKCWZvciggaj0xOyBqPGxndGgyKzE7ICsraiApIAoJewoJCW1bal0gPSBjdXJyZW50d1tqLTFdICsgb2djcDFbMV07IG1wW2pdID0gMDsKCX0KCglsYXN0dmVydGljYWx3WzBdID0gY3VycmVudHdbbGd0aDItMV07CgoJaWYoIG91dGdhcCApIGxhc3RpID0gbGd0aDErMTsgZWxzZSBsYXN0aSA9IGxndGgxOwoJbGFzdGogPSBsZ3RoMisxOwoKI2lmIFhYWFhYWFgKZnByaW50Ziggc3RkZXJyLCAiY3VycmVudHcgPSBcbiIgKTsKZm9yKCBpPTA7IGk8bGd0aDErMTsgaSsrICkKewoJZnByaW50Ziggc3RkZXJyLCAiJTUuMmYgIiwgY3VycmVudHdbaV0gKTsKfQpmcHJpbnRmKCBzdGRlcnIsICJcbiIgKTsKZnByaW50Ziggc3RkZXJyLCAiaW5pdHZlcnRpY2FsdyA9IFxuIiApOwpmb3IoIGk9MDsgaTxsZ3RoMisxOyBpKysgKQp7CglmcHJpbnRmKCBzdGRlcnIsICIlNS4yZiAiLCBpbml0dmVydGljYWx3W2ldICk7Cn0KZnByaW50Ziggc3RkZXJyLCAiXG4iICk7CmZwcmludGYoIHN0ZGVyciwgImZjZ3BcbiIgKTsKZm9yKCBpPTA7IGk8bGd0aDE7IGkrKyApIAoJZnByaW50Ziggc3RkZXJyLCAiZmdjcDFbJWRdPSVmXG4iLCBpLCBvZ2NwMVtpXSApOwpmb3IoIGk9MDsgaTxsZ3RoMjsgaSsrICkgCglmcHJpbnRmKCBzdGRlcnIsICJmZ2NwMlslZF09JWZcbiIsIGksIG9nY3AyW2ldICk7CiNlbmRpZgoKCWZvciggaT0xOyBpPGxhc3RpOyBpKysgKQoJewoJCXd0bXAgPSBwcmV2aW91c3c7IAoJCXByZXZpb3VzdyA9IGN1cnJlbnR3OwoJCWN1cnJlbnR3ID0gd3RtcDsKCgkJcHJldmlvdXN3WzBdID0gaW5pdHZlcnRpY2Fsd1tpLTFdOwoKCQltYXRjaF9jYWxjKCBjdXJyZW50dywgY3BteDEsIGNwbXgyLCBpLCBsZ3RoMiwgZmxvYXR3b3JrLCBpbnR3b3JrLCAwICk7CiNpZiBYWFhYWFhYCmZwcmludGYoIHN0ZGVyciwgIlxuIiApOwpmcHJpbnRmKCBzdGRlcnIsICJpPSVkXG4iLCBpICk7CmZwcmludGYoIHN0ZGVyciwgImN1cnJlbnR3ID0gXG4iICk7CmZvciggaj0wOyBqPGxndGgyOyBqKysgKQp7CglmcHJpbnRmKCBzdGRlcnIsICIlNS4yZiAiLCBjdXJyZW50d1tqXSApOwp9CmZwcmludGYoIHN0ZGVyciwgIlxuIiApOwojZW5kaWYKCQlpZiggbG9jYWxob20gKQoJCXsKLy8JCQlmcHJpbnRmKCBzdGRlcnIsICJDYWxsaW5nIGltcF9tYXRjaF9jYWxjIChvKSBsZ3RoID0gJWQsIGkgPSAlZFxuIiwgbGd0aDEsIGkgKTsKLy8JCQlpbXBfbWF0Y2hfb3V0X3ZlYWQoIGN1cnJlbnR3LCBpLCBsZ3RoMiApOwoJCQlwYXJ0X2ltcF9tYXRjaF9vdXRfdmVhZF9nYXBtYXAoIGN1cnJlbnR3LCBnYXBtYXAxW2ldK3N0YXJ0MSwgbGd0aDIsIHN0YXJ0MiwgZ2FwbWFwMiApOwoJCX0KI2lmIFhYWFhYWFgKZnByaW50Ziggc3RkZXJyLCAiXG4iICk7CmZwcmludGYoIHN0ZGVyciwgImk9JWRcbiIsIGkgKTsKZnByaW50Ziggc3RkZXJyLCAiY3VycmVudHcgPSBcbiIgKTsKZm9yKCBqPTA7IGo8bGd0aDI7IGorKyApCnsKCWZwcmludGYoIHN0ZGVyciwgIiU1LjJmICIsIGN1cnJlbnR3W2pdICk7Cn0KZnByaW50Ziggc3RkZXJyLCAiXG4iICk7CiNlbmRpZgoJCWN1cnJlbnR3WzBdID0gaW5pdHZlcnRpY2Fsd1tpXTsKCgoJCW1pID0gcHJldmlvdXN3WzBdICsgb2djcDJbMV07IG1waSA9IDA7CgoJCWlqcHB0ID0gaWpwW2ldICsgMTsKCQltanB0ID0gbSArIDE7CgkJcHJlcHQgPSBwcmV2aW91c3c7CgkJY3VycHQgPSBjdXJyZW50dyArIDE7CgkJbXBqcHQgPSBtcCArIDE7CgkJZmdjcDJwdCA9IGZnY3AyOwoJCW9nY3AycHQgPSBvZ2NwMisxOwoJCWZnY3AxdmEgPSBmZ2NwMVtpLTFdOwoJCW9nY3AxdmEgPSBvZ2NwMVtpXTsKCQlmb3IoIGo9MTsgajxsYXN0ajsgaisrICkKCQl7CgkJCXdtID0gKnByZXB0OwoJCQkqaWpwcHQgPSAwOwoKI2lmIDAKCQkJZnByaW50Ziggc3RkZXJyLCAiJTUuMGYtPiIsIHdtICk7CiNlbmRpZgoJCQlnID0gbWkgKyAqZmdjcDJwdDsKI2lmIDAKCQkJZnByaW50Ziggc3RkZXJyLCAiJTUuMGY/IiwgZyApOwojZW5kaWYKCQkJaWYoIGcgPiB3bSApCgkJCXsKCQkJCXdtID0gZzsKCQkJCSppanBwdCA9IC0oIGogLSBtcGkgKTsKCQkJfQoJCQlnID0gKnByZXB0ICsgKm9nY3AycHQ7CgkJCWlmKCBnID49IG1pICkKCQkJewoJCQkJbWkgPSBnOwoJCQkJbXBpID0gai0xOwoJCQl9CiNpZiBVU0VfUEVOQUxUWV9FWAoJCQltaSArPSBmcGVuYWx0eV9leDsKI2VuZGlmCgoJCQlnID0gKm1qcHQgKyBmZ2NwMXZhOwojaWYgMCAKCQkJZnByaW50Ziggc3RkZXJyLCAiJTUuMGY/IiwgZyApOwojZW5kaWYKCQkJaWYoIGcgPiB3bSApCgkJCXsKCQkJCXdtID0gZzsKCQkJCSppanBwdCA9ICsoIGkgLSAqbXBqcHQgKTsKCQkJfQoJCQlnID0gKnByZXB0ICsgb2djcDF2YTsKCQkJaWYoIGcgPj0gKm1qcHQgKQoJCQl7CgkJCQkqbWpwdCA9IGc7CgkJCQkqbXBqcHQgPSBpLTE7CgkJCX0KI2lmIFVTRV9QRU5BTFRZX0VYCgkJCW1bal0gKz0gZnBlbmFsdHlfZXg7CiNlbmRpZgoKI2lmIDAKCQkJZnByaW50Ziggc3RkZXJyLCAiJTUuMGYgIiwgd20gKTsKI2VuZGlmCgkJCSpjdXJwdCArPSB3bTsKCQkJaWpwcHQrKzsKCQkJbWpwdCsrOwoJCQlwcmVwdCsrOwoJCQltcGpwdCsrOwoJCQljdXJwdCsrOwoJCQlmZ2NwMnB0Kys7CgkJCW9nY3AycHQrKzsKCQl9CgkJbGFzdHZlcnRpY2Fsd1tpXSA9IGN1cnJlbnR3W2xndGgyLTFdOwoJfQoKI2lmIE9VVEdBUDBUUlkKCWlmKCAhb3V0Z2FwICkKCXsKCQlmb3IoIGo9MTsgajxsZ3RoMisxOyBqKysgKQoJCQljdXJyZW50d1tqXSAtPSBvZmZzZXQgKiAoIGxndGgyIC0gaiApIC8gMi4wOwoJCWZvciggaT0xOyBpPGxndGgxKzE7IGkrKyApCgkJCWxhc3R2ZXJ0aWNhbHdbaV0gLT0gb2Zmc2V0ICogKCBsZ3RoMSAtIGkgIC8gMi4wKTsKCX0KI2VuZGlmCgkJCgkvKgoJZnByaW50Ziggc3RkZXJyLCAiXG4iICk7Cglmb3IoIGk9MDsgaTxpY3ljOyBpKysgKSBmcHJpbnRmKCBzdGRlcnIsIiVzXG4iLCBzZXExW2ldICk7CglmcHJpbnRmKCBzdGRlcnIsICIjIyMjI1xuIiApOwoJZm9yKCBqPTA7IGo8amN5YzsgaisrICkgZnByaW50Ziggc3RkZXJyLCIlc1xuIiwgc2VxMltqXSApOwoJZnByaW50Ziggc3RkZXJyLCAiPT09PT4iICk7Cglmb3IoIGk9MDsgaTxpY3ljOyBpKysgKSBzdHJjcHkoIG1zZXExW2ldLCBzZXExW2ldICk7Cglmb3IoIGo9MDsgajxqY3ljOyBqKysgKSBzdHJjcHkoIG1zZXEyW2pdLCBzZXEyW2pdICk7CgkqLwoJaWYoIGxvY2FsaG9tICkKCXsKCQlBdHJhY2tpbmdfbG9jYWxob20oIGltcG1hdGNoLCBjdXJyZW50dywgbGFzdHZlcnRpY2Fsdywgc2VxMSwgc2VxMiwgbXNlcTEsIG1zZXEyLCBjcG14MSwgY3BteDIsIGlqcCwgaWN5YywgamN5Yywgc3RhcnQxLCBlbmQxLCBzdGFydDIsIGVuZDIsIGdhcG1hcDEsIGdhcG1hcDIgKTsKCX0KCWVsc2UKCQlBdHJhY2tpbmcoIGN1cnJlbnR3LCBsYXN0dmVydGljYWx3LCBzZXExLCBzZXEyLCBtc2VxMSwgbXNlcTIsIGNwbXgxLCBjcG14MiwgaWpwLCBpY3ljLCBqY3ljICk7CgovLwlmcHJpbnRmKCBzdGRlcnIsICIjIyMgaW1wbWF0Y2ggPSAlZlxuIiwgKmltcG1hdGNoICk7CgoJcmVzdWx0bGVuID0gc3RybGVuKCBtc2VxMVswXSApOwoJaWYoIGFsbG9jbGVuIDwgcmVzdWx0bGVuIHx8IHJlc3VsdGxlbiA+IE4gKQoJewoJCWZwcmludGYoIHN0ZGVyciwgImFsbG9jbGVuPSVkLCByZXN1bHRsZW49JWQsIE49JWRcbiIsIGFsbG9jbGVuLCByZXN1bHRsZW4sIE4gKTsKCQlFcnJvckV4aXQoICJMRU5HVEggT1ZFUiFcbiIgKTsKCX0KCgoJZm9yKCBpPTA7IGk8aWN5YzsgaSsrICkgc3RyY3B5KCBzZXExW2ldLCBtc2VxMVtpXSApOwoJZm9yKCBqPTA7IGo8amN5YzsgaisrICkgc3RyY3B5KCBzZXEyW2pdLCBtc2VxMltqXSApOwoJLyoKCWZwcmludGYoIHN0ZGVyciwgIlxuIiApOwoJZm9yKCBpPTA7IGk8aWN5YzsgaSsrICkgZnByaW50Ziggc3RkZXJyLCAiJXNcbiIsIG1zZXExW2ldICk7CglmcHJpbnRmKCBzdGRlcnIsICIjIyMjI1xuIiApOwoJZm9yKCBqPTA7IGo8amN5YzsgaisrICkgZnByaW50Ziggc3RkZXJyLCAiJXNcbiIsIG1zZXEyW2pdICk7CgkqLwoKCglyZXR1cm4oIHdtICk7Cn0KCg==