ZGlmZiAtLWdpdCBhL2FwL2xpYi9saWJmbGFncy9mbGFnc19hcGkuYyBiL2FwL2xpYi9saWJmbGFncy9mbGFnc19hcGkuYwpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi4zNzY1M2ZjCi0tLSAvZGV2L251bGwKKysrIGIvYXAvbGliL2xpYmZsYWdzL2ZsYWdzX2FwaS5jCkBAIC0wLDAgKzEsODk0IEBACisvKioNCisgKiBAZmlsZSBmbGFnc19hcGkuYw0KKyAqIEBicmllZiBmbGFnc7fWx/i907/ayrXP1g0KKyAqDQorICogQ29weXJpZ2h0IChDKSAyMDIzIFNhbmVjaGlwcyBUZWNobm9sb2d5IENvLiwgTHRkLg0KKyAqIEBhdXRob3IgDQorICogDQorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkNCisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhcw0KKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiCjqLHY0aGjukdQTHYyIExpY2VuY2WjqQ0KKyAqDQorICovDQorDQorDQorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgIEluY2x1ZGUgaGVhZGVyIGZpbGVzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKg0KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQorI2luY2x1ZGUgPHN0ZGlvLmg+DQorI2luY2x1ZGUgPHN0ZGxpYi5oPg0KKyNpbmNsdWRlIDx1bmlzdGQuaD4NCisjaW5jbHVkZSA8c3RyaW5nLmg+DQorI2luY2x1ZGUgPGVycm5vLmg+DQorI2luY2x1ZGUgPHN5cy9pb2N0bC5oPg0KKyNpbmNsdWRlIDxzeXMvc3RhdC5oPg0KKyNpbmNsdWRlIDxmY250bC5oPg0KKyNpbmNsdWRlIDxtdGQvbXRkLWFiaS5oPg0KKw0KKyNpbmNsdWRlICJwdWJfZmxhZ3MuaCINCisNCisjaW5jbHVkZSAiZmxhZ3NfbG9nLmgiDQorI2luY2x1ZGUgImZsYWdzX2FwaS5oIg0KKw0KKw0KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1hY3JvIGRlZmluaXRpb25zICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoNCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KKyNkZWZpbmUgTUFYX1BBVEhfTEVOICgyNTYpDQorDQorI2RlZmluZSBQQVJUSVRJT05fTkFNRV9GTEFHUyAiZmxhZ3MiDQorDQorI2RlZmluZSBGTEFHU19JTklUX1ZBTElEX0JMT0NLU19OVU0JKDgpDQorDQorI2RlZmluZSBHT09EX0JMT0NLICgwKQ0KKyNkZWZpbmUgQkFEX0JMT0NLICgxKQ0KKw0KKyNkZWZpbmUgRklMRV9QQVRIX1BST0NfQ01ETElORSAiL3Byb2MvY21kbGluZSINCisNCisjZGVmaW5lIFBST0NfQ01ETElORV9TWVNURU1fQV9GTEFHICAgInN5c3RlbT1zeXN0ZW1fYSINCisjZGVmaW5lIFBST0NfQ01ETElORV9TWVNURU1fQl9GTEFHICAgInN5c3RlbT1zeXN0ZW1fYiINCisNCisjZGVmaW5lIFNZU1RFTV9JTkRFWF9VTktOT1dOICgtMSkNCisjZGVmaW5lIFNZU1RFTV9JTkRFWF8xICgxKQ0KKyNkZWZpbmUgU1lTVEVNX0lOREVYXzIgKDIpDQorDQorDQorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVHlwZSBkZWZpbml0aW9ucyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKg0KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQordHlwZWRlZiBzdHJ1Y3QNCit7DQorICAgIHVuc2lnbmVkIGludCBtdGRfdG90YWxzaXplOwkJCQkvLyBtdGQgZGV2aWNlIHRvdGFsIHNpemUNCisgICAgdW5zaWduZWQgaW50IG10ZF9wYWdlcGVyYmxvY2s7CQkJLy8gbXRkIGRldmljZSBwYWdlIHBlciBibG9jaw0KKyAgICB1bnNpZ25lZCBpbnQgbXRkX2Jsb2Nrc2l6ZTsJCQkJLy8gbXRkIGRldmljZSBibG9jayBzaXplDQorICAgIHVuc2lnbmVkIGludCBtdGRfcGFnZXNpemU7CQkJCS8vIG10ZCBkZXZpY2UgcGFnZSBzaXplDQorICAgIHVuc2lnbmVkIGludCBtdGRfb29ic2l6ZTsJCQkJLy8gbXRkIGRldmljZSBvb2Igc2l6ZQ0KKyAgICBpbnQgcGFydGlfZmlsZV9kZXNjOwkJCQkJLy8gcGFydGl0aW9uIHVwZGF0ZSBmaWxlIGRlc2NyaXB0aW9uDQorfSBwYXJ0aXRpb25fbXRkX2luZm9fdDsNCisNCisNCit0eXBlZGVmIGVudW0NCit7DQorICAgIERFVklDRV9NVEQgPSAwLA0KKyAgICBERVZJQ0VfWkZUTCA9IDEsDQorICAgIERFVklDRV9NVERfQkxPQ0ssDQorfSBkZXZpY2VfdHlwZV90Ow0KKw0KKw0KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQorICoJCQkJCQkgICBMb2NhbCB2YXJpYWJsZSBkZWZpbml0aW9ucwkJCQkJCSAgICoNCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KKw0KKw0KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQorICoJCQkJCQkgIEdsb2JhbCB2YXJpYWJsZSBkZWZpbml0aW9ucwkJCQkJCSAgICoNCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KKw0KKw0KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQorICogCQkJCQkgICBMb2NhbCBmdW5jdGlvbiBkZWNsYXJhdGlvbnMJCQkJCQkJICAgKg0KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQorc3RhdGljIGludCBtdGRfZ2V0KGNvbnN0IGNoYXIgKmlfcGFydGlfbmFtZSwgZGV2aWNlX3R5cGVfdCBkZXZpY2VfdHlwZSwgY2hhciAqb19tdGRfcGF0aCwgdW5zaWduZWQgaW50IG9fbXRkX3BhdGhfbGVuKTsNCitzdGF0aWMgaW50IHdyaXRlX2ZsYWdzX2luZm8ocGFydGl0aW9uX210ZF9pbmZvX3QgKnBfbXRkX2luZm8sIGludCBpbmRleCwgdW5zaWduZWQgY2hhciAqY29udGVudCwgaW50IGxlbik7DQorDQorc3RhdGljIGludCBnZXRfZmxhZ3NfaW5mbyhUX0ZMQUdTX0lORk8gKnBfbWFpbiwgaW50ICpwX21haW5faW5kZXgsIFRfRkxBR1NfSU5GTyAqcF9iYWNrdXAsIGludCAqcF9iYWNrdXBfaW5kZXgpOw0KK3N0YXRpYyBpbnQgc2V0X2ZsYWdzX2luZm8oVF9GTEFHU19JTkZPICpwX2ZsYWdzX2luZm8sIGludCAqcF9tYWluX2luZGV4LCBpbnQgKnBfYmFja3VwX2luZGV4KTsNCisNCitzdGF0aWMgdm9pZCBjb3B5X2ZsYWdzX2luZm8oVF9GTEFHU19JTkZPICpkc3QsIFRfRkxBR1NfSU5GTyAqc3JjKTsNCisNCitzdGF0aWMgaW50IGdldF9jdXJyZW50X3N5c3RlbSgpOw0KKw0KKw0KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQorICogCQkJCQkgTG9jYWwgZnVuY3Rpb24gaW1wbGVtZW50YXRpb25zIAkJCQkJCSAgICoNCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KK3N0YXRpYyBpbnQgbXRkX2dldChjb25zdCBjaGFyICppX3BhcnRpX25hbWUsIGRldmljZV90eXBlX3QgZGV2aWNlX3R5cGUsIGNoYXIgKm9fbXRkX3BhdGgsIHVuc2lnbmVkIGludCBvX210ZF9wYXRoX2xlbikNCit7DQorICAgIEZJTEUgKmZwX210ZCA9IDA7DQorICAgIGNoYXIgYnVmWzEyOF07DQorICAgIGNoYXIgKmxpbmVfc3RyOw0KKw0KKyAgICBpZiAoIW9fbXRkX3BhdGhfbGVuKQ0KKyAgICB7DQorICAgICAgICByZXR1cm4gLTE7DQorICAgIH0NCisNCisgICAgZnBfbXRkID0gZm9wZW4oIi9wcm9jL210ZCIsICJyKyIpOw0KKyAgICBpZiAoTlVMTCA9PSBmcF9tdGQpDQorICAgIHsNCisgICAgICAgIGZsYWdzX2Vycigib3BlbiBmaWxlIGVycm9yOiAlcyIsIHN0cmVycm9yKGVycm5vKSk7DQorICAgICAgICByZXR1cm4gLTE7DQorICAgIH0NCisgICAgLy8gcHJpbnRmKCJbbGlibXRkXTogcGFydGl0aW9uIG5hbWU6JXNcbiIsIGlfcGFydGlfbmFtZSk7DQorDQorICAgIHdoaWxlICgxKQ0KKyAgICB7DQorICAgICAgICBpbnQgbWF0Y2hlcyA9IDA7DQorICAgICAgICBjaGFyIG10ZG5hbWVbNjRdID0gezB9Ow0KKyAgICAgICAgaW50IG10ZG51bSA9IDA7DQorICAgICAgICB1bnNpZ25lZCBpbnQgbXRkc2l6ZSwgbXRkZXJhc2VzaXplOw0KKyAgICAgICAgbWVtc2V0KGJ1ZiwgMCwgc2l6ZW9mKGJ1ZikpOw0KKyAgICAgICAgbGluZV9zdHIgPSBmZ2V0cyhidWYsIHNpemVvZihidWYpIC0gMSwgZnBfbXRkKTsNCisNCisgICAgICAgIGlmIChOVUxMID09IGxpbmVfc3RyKQ0KKyAgICAgICAgew0KKyAgICAgICAgICAgIGZsYWdzX2VycigiZ2V0IGluZm8gZnJvbSBtdGQgZXJyb3I6ICVzIiwgc3RyZXJyb3IoZXJybm8pKTsNCisgICAgICAgICAgICBmY2xvc2UoZnBfbXRkKTsNCisgICAgICAgICAgICByZXR1cm4gLTE7DQorICAgICAgICB9DQorICAgICAgICAvLyBtdGQ1OiAwMDEwMDAwMCAwMDAyMDAwMCAiZm90YWZsYWciDQorICAgICAgICBtYXRjaGVzID0gc3NjYW5mKGJ1ZiwgIm10ZCVkOiAleCAleCBcIiU2M1teXCJdIiwNCisgICAgICAgICAgICAgICAgICAgICAgICAgJm10ZG51bSwgJm10ZHNpemUsICZtdGRlcmFzZXNpemUsIG10ZG5hbWUpOw0KKyAgICAgICAgbXRkbmFtZVs2M10gPSAnXDAnOw0KKw0KKyAgICAgICAgaWYgKChtYXRjaGVzID09IDQpICYmIChzdHJjbXAobXRkbmFtZSwgaV9wYXJ0aV9uYW1lKSA9PSAwKSkNCisgICAgICAgIHsNCisgICAgICAgICAgICBtZW1zZXQob19tdGRfcGF0aCwgMCwgb19tdGRfcGF0aF9sZW4pOw0KKyAgICAgICAgICAgIGlmIChkZXZpY2VfdHlwZSA9PSBERVZJQ0VfTVREX0JMT0NLKQ0KKyAgICAgICAgICAgIHsNCisgICAgICAgICAgICAgICAgc25wcmludGYob19tdGRfcGF0aCwgb19tdGRfcGF0aF9sZW4sICIvZGV2L210ZGJsb2NrJWQiLCBtdGRudW0pOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgICBlbHNlIGlmIChkZXZpY2VfdHlwZSA9PSBERVZJQ0VfTVREKQ0KKyAgICAgICAgICAgIHsNCisgICAgICAgICAgICAgICAgc25wcmludGYob19tdGRfcGF0aCwgb19tdGRfcGF0aF9sZW4sICIvZGV2L210ZCVkIiwgbXRkbnVtKTsNCisgICAgICAgICAgICB9DQorICAgICAgICAgICAgZWxzZSBpZiAoZGV2aWNlX3R5cGUgPT0gREVWSUNFX1pGVEwpDQorICAgICAgICAgICAgew0KKyAgICAgICAgICAgICAgICBzbnByaW50ZihvX210ZF9wYXRoLCBvX210ZF9wYXRoX2xlbiwgIi9kZXYvemZ0bCVkIiwgbXRkbnVtKTsNCisgICAgICAgICAgICB9DQorICAgICAgICAgICAgZWxzZQ0KKyAgICAgICAgICAgIHsNCisgICAgICAgICAgICAgICAgZmxhZ3NfZXJyKCJ1bmtub3duIGRldmljZSB0eXBlICVkIiwgZGV2aWNlX3R5cGUpOw0KKyAgICAgICAgICAgICAgICBmY2xvc2UoZnBfbXRkKTsNCisgICAgICAgICAgICAgICAgcmV0dXJuIC0xOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgICAvLyBwcmludGYoIltsaWJtdGRdOiBvX210ZF9wYXRoPVslc11cbiIsIG9fbXRkX3BhdGgpOw0KKyAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgfQ0KKyAgICB9DQorICAgIGZjbG9zZShmcF9tdGQpOw0KKyAgICByZXR1cm4gMDsNCit9DQorDQorDQorc3RhdGljIGludCB3cml0ZV9mbGFnc19pbmZvKHBhcnRpdGlvbl9tdGRfaW5mb190ICpwX210ZF9pbmZvLCBpbnQgaW5kZXgsIHVuc2lnbmVkIGNoYXIgKmNvbnRlbnQsIGludCBsZW4pDQorew0KKyAgICBzdHJ1Y3QgZXJhc2VfaW5mb191c2VyIGVyYXNlX2luZm87DQorICAgIGludCB3cml0ZV9sZW4gPSAwOw0KKyAgICBsb25nIGxvbmcgIG9mZnMgPSAwOw0KKw0KKyAgICBlcmFzZV9pbmZvLnN0YXJ0ID0gaW5kZXggKiBwX210ZF9pbmZvLT5tdGRfYmxvY2tzaXplOw0KKyAgICBlcmFzZV9pbmZvLmxlbmd0aCA9IHBfbXRkX2luZm8tPm10ZF9ibG9ja3NpemU7DQorDQorICAgIG9mZnMgPSAobG9uZyBsb25nKWluZGV4ICogcF9tdGRfaW5mby0+bXRkX2Jsb2Nrc2l6ZTsNCisNCisgICAgaWYgKGlvY3RsKHBfbXRkX2luZm8tPnBhcnRpX2ZpbGVfZGVzYywgV1JJVEVFTkFCTEUsIDApICE9IDApDQorICAgIHsNCisgICAgICAgIGZsYWdzX2VycigiZmFpbGVkIHRvIGVuYWJsZSBtdGQgd3JpdGVhYmxlLCBlcnJubz0lZCwgc3RyZXJyb3I9JXMiLCBlcnJubywgc3RyZXJyb3IoZXJybm8pKTsNCisJCQ0KKyAgICAgICAgcmV0dXJuIC0xOw0KKyAgICB9DQorDQorICAgIGlmIChpb2N0bChwX210ZF9pbmZvLT5wYXJ0aV9maWxlX2Rlc2MsIE1FTUdFVEJBREJMT0NLLCAmb2ZmcykgIT0gMCkNCisgICAgew0KKyAgICAgICAgZmxhZ3NfZXJyKCJpb2N0bCBbTUVNR0VUQkFEQkxPQ0tdIGJsb2NrOiAlZCwgY2hhbmdlIHRvIGJlIGJhZCBibG9jaywgZXJybm89JWQsIHN0cmVycm9yPVslc10iLCBpbmRleCwgZXJybm8sIHN0cmVycm9yKGVycm5vKSk7DQorCQkNCisgICAgICAgIHJldHVybiBCQURfQkxPQ0s7DQorICAgIH0NCisNCisgICAgaWYgKGlvY3RsKHBfbXRkX2luZm8tPnBhcnRpX2ZpbGVfZGVzYywgTUVNRVJBU0UsICZlcmFzZV9pbmZvKSA8IDApDQorICAgIHsNCisgICAgICAgIGZsYWdzX2VycigiaW9jdGwgW01FTUVSQVNFXSBibG9jazogJWQgZmFpbCwgZXJybm89JWQsIHN0cmVycm9yPVslc10iLCBpbmRleCwgZXJybm8sIHN0cmVycm9yKGVycm5vKSk7DQorCQkNCisgICAgICAgIHJldHVybiAtMTsNCisgICAgfQ0KKw0KKyAgICBpZiAoaW9jdGwocF9tdGRfaW5mby0+cGFydGlfZmlsZV9kZXNjLCBNRU1HRVRCQURCTE9DSywgJm9mZnMpICE9IDApDQorICAgIHsNCisgICAgICAgIGZsYWdzX2VycigiaW9jdGwgW01FTUdFVEJBREJMT0NLXSBibG9jazolZCAsIGNoYW5nZSB0byBiZSBiYWQgYmxvY2ssIGVycm5vPSVkLCBzdHJlcnJvcj1bJXNdIiwgaW5kZXgsIGVycm5vLCBzdHJlcnJvcihlcnJubykpOw0KKwkJDQorICAgICAgICByZXR1cm4gQkFEX0JMT0NLOw0KKyAgICB9DQorDQorICAgIGlmIChsc2VlayhwX210ZF9pbmZvLT5wYXJ0aV9maWxlX2Rlc2MsIGluZGV4ICogcF9tdGRfaW5mby0+bXRkX2Jsb2Nrc2l6ZSwgU0VFS19TRVQpIDwgMCkNCisgICAgew0KKyAgICAgICAgZmxhZ3NfZXJyKCJsc2VlayBmYWlsLCBlcnJubz0lZCwgc3RyZXJyb3I9WyVzXSIsIGVycm5vLCBzdHJlcnJvcihlcnJubykpOw0KKwkJDQorICAgICAgICByZXR1cm4gLTE7DQorICAgIH0NCisNCisgICAgd3JpdGVfbGVuID0gd3JpdGUocF9tdGRfaW5mby0+cGFydGlfZmlsZV9kZXNjLCBjb250ZW50LCBwX210ZF9pbmZvLT5tdGRfYmxvY2tzaXplKTsNCisNCisgICAgaWYgKHdyaXRlX2xlbiAhPSBwX210ZF9pbmZvLT5tdGRfYmxvY2tzaXplKQ0KKyAgICB7DQorICAgICAgICBmbGFnc19lcnIoIndyaXRlIGZsYXNoIGZhaWwsIGVycm5vPSVkLCBzdHJlcnJvcj1bJXNdIiwgZXJybm8sIHN0cmVycm9yKGVycm5vKSk7DQorCQkNCisgICAgICAgIHJldHVybiAtMTsNCisgICAgfQ0KKw0KKyAgICBpZiAoaW9jdGwocF9tdGRfaW5mby0+cGFydGlfZmlsZV9kZXNjLCBXUklURURJU0FCTEUsIDApICE9IDApDQorICAgIHsNCisgICAgICAgIGZsYWdzX2VycigiZmFpbGVkIHRvIGRpc2FibGUgbXRkIHdyaXRlYWJsZSwgZXJybm89JWQsIHN0cmVycm9yPSVzIiwgZXJybm8sIHN0cmVycm9yKGVycm5vKSk7DQorICAgIH0NCisJDQorICAgIHJldHVybiAwOw0KK30NCisNCisNCitzdGF0aWMgaW50IGdldF9mbGFnc19pbmZvKFRfRkxBR1NfSU5GTyAqcF9tYWluLCBpbnQgKnBfbWFpbl9pbmRleCwgVF9GTEFHU19JTkZPICpwX2JhY2t1cCwgaW50ICpwX2JhY2t1cF9pbmRleCkNCit7DQorICAgIGludCByZXQgPSAtMTsNCisgICAgaW50IGZkX2RzdCA9IC0xOw0KKyAgICBjaGFyIG10ZF9wYXRoW01BWF9QQVRIX0xFTl0gPSB7MH07DQorICAgIHN0cnVjdCBtdGRfaW5mb191c2VyIG1lbWluZm8gPSB7MH07DQorICAgIHBhcnRpdGlvbl9tdGRfaW5mb190IG10ZF9pbmZvID0gezB9Ow0KKyAgICBpbnQgaW5kZXggID0gMDsNCisgICAgaW50IGJsb2NrX251bSA9IDA7DQorICAgIGludCBnb29kX2luZGV4ID0gMDsNCisgICAgaW50IHJlYWRfbGVuICA9IDA7DQorDQorICAgIGxvbmcgbG9uZyBvZmZzID0gMDsNCisNCisgICAgaW50IGJsb2NrX2ZsYWcgPSBHT09EX0JMT0NLOw0KKw0KKyAgICByZXQgPSBtdGRfZ2V0KFBBUlRJVElPTl9OQU1FX0ZMQUdTLCBERVZJQ0VfTVRELCBtdGRfcGF0aCwgTUFYX1BBVEhfTEVOKTsNCisgICAgaWYgKHJldCA8IDApDQorICAgIHsNCisgICAgICAgIGZsYWdzX2VycigicGFydGl0aW9uIFslc10gbm90IGZpbmQiLCBQQVJUSVRJT05fTkFNRV9GTEFHUyk7DQorICAgICAgICBnb3RvIGVycm9yOw0KKyAgICB9DQorDQorICAgIGlmICgoZmRfZHN0ID0gb3BlbihtdGRfcGF0aCwgT19SRFdSIHwgT19TWU5DKSkgPCAwKQ0KKyAgICB7DQorICAgICAgICBmbGFnc19lcnIoIm9wZW4gZmxhc2ggZXJyb3IsIGVycm5vPSVkLCBzdHJlcnJvcj1bJXNdIiwgZXJybm8sIHN0cmVycm9yKGVycm5vKSk7DQorICAgICAgICBnb3RvIGVycm9yOw0KKyAgICB9DQorCQ0KKyAgICBtdGRfaW5mby5wYXJ0aV9maWxlX2Rlc2MgPSBmZF9kc3Q7DQorDQorICAgIGlmIChpb2N0bChmZF9kc3QsIE1FTUdFVElORk8sICZtZW1pbmZvKSAhPSAwKQ0KKyAgICB7DQorICAgICAgICBmbGFnc19lcnIoImdldCBmbGFzaCBpbmZvIGVycm9yLCBlcnJubz0lZCwgc3RyZXJyb3I9WyVzXSIsIGVycm5vLCBzdHJlcnJvcihlcnJubykpOw0KKyAgICAgICAgZ290byBlcnJvcl9jbG9zZTsNCisgICAgfQ0KKw0KKyAgICBtdGRfaW5mby5tdGRfYmxvY2tzaXplCQk9IG1lbWluZm8uZXJhc2VzaXplOw0KKyAgICBtdGRfaW5mby5tdGRfb29ic2l6ZQkJPSBtZW1pbmZvLm9vYnNpemU7DQorICAgIG10ZF9pbmZvLm10ZF9wYWdlcGVyYmxvY2sgCT0gbWVtaW5mby5lcmFzZXNpemUgLyBtZW1pbmZvLndyaXRlc2l6ZTsNCisgICAgbXRkX2luZm8ubXRkX3BhZ2VzaXplIAkJPSBtZW1pbmZvLndyaXRlc2l6ZTsNCisgICAgbXRkX2luZm8ubXRkX3RvdGFsc2l6ZQkJPSBtZW1pbmZvLnNpemU7DQorDQorICAgIGJsb2NrX251bSA9IG10ZF9pbmZvLm10ZF90b3RhbHNpemUgLyBtdGRfaW5mby5tdGRfYmxvY2tzaXplOw0KKw0KKyAgICBmb3IgKGluZGV4ID0gMDsgKGdvb2RfaW5kZXggPCAyICYmIGluZGV4IDwgYmxvY2tfbnVtKTsgaW5kZXgrKykNCisgICAgew0KKw0KKyAgICAgICAgb2ZmcyA9IGluZGV4ICogbXRkX2luZm8ubXRkX2Jsb2Nrc2l6ZTsNCisgICAgICAgIGlmIChpb2N0bChtdGRfaW5mby5wYXJ0aV9maWxlX2Rlc2MsIE1FTUdFVEJBREJMT0NLLCAmb2ZmcykgPT0gMCkNCisgICAgICAgIHsNCisgICAgICAgICAgICBibG9ja19mbGFnID0gR09PRF9CTE9DSzsNCisgICAgICAgIH0NCisgICAgICAgIGVsc2UNCisgICAgICAgIHsNCisgICAgICAgICAgICBmbGFnc19lcnIoImZsYWdzIGJsb2NrIFslZF0gaXMgYmFkLCBlcnJubz0lZCwgc3RyZXJyb3I9WyVzXSIsIGluZGV4LCBlcnJubywgc3RyZXJyb3IoZXJybm8pKTsNCisgICAgICAgICAgICBibG9ja19mbGFnID0gIEJBRF9CTE9DSzsNCisgICAgICAgIH0NCisNCisgICAgICAgIGlmIChibG9ja19mbGFnID09IEdPT0RfQkxPQ0spDQorICAgICAgICB7DQorICAgICAgICAgICAgaWYgKGxzZWVrKG10ZF9pbmZvLnBhcnRpX2ZpbGVfZGVzYywgaW5kZXggKiBtdGRfaW5mby5tdGRfYmxvY2tzaXplLCBTRUVLX1NFVCkgPCAwKQ0KKyAgICAgICAgICAgIHsNCisgICAgICAgICAgICAgICAgZmxhZ3NfZXJyKCJsc2VlayBlcnJvciwgZXJybm89JWQsIHN0cmVycm9yPVslc10iLCBlcnJubywgc3RyZXJyb3IoZXJybm8pKTsNCisgICAgICAgICAgICAgICAgZ290byBlcnJvcl9jbG9zZTsNCisgICAgICAgICAgICB9DQorDQorICAgICAgICAgICAgaWYgKGdvb2RfaW5kZXggPT0gMCkNCisgICAgICAgICAgICB7DQorICAgICAgICAgICAgICAgIHJlYWRfbGVuID0gcmVhZChtdGRfaW5mby5wYXJ0aV9maWxlX2Rlc2MsICh1bnNpZ25lZCBjaGFyKilwX21haW4sIHNpemVvZihUX0ZMQUdTX0lORk8pKTsNCisgICAgICAgICAgICAgICAgKnBfbWFpbl9pbmRleCA9IGluZGV4Ow0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgICBlbHNlIGlmIChnb29kX2luZGV4ID09IDEpDQorICAgICAgICAgICAgew0KKyAgICAgICAgICAgICAgICByZWFkX2xlbiA9IHJlYWQobXRkX2luZm8ucGFydGlfZmlsZV9kZXNjLCAodW5zaWduZWQgY2hhciopcF9iYWNrdXAsIHNpemVvZihUX0ZMQUdTX0lORk8pKTsNCisgICAgICAgICAgICAgICAgKnBfYmFja3VwX2luZGV4ID0gaW5kZXg7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIGVsc2UNCisgICAgICAgICAgICB7DQorICAgICAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgICAgIH0NCisNCisgICAgICAgICAgICBpZiAocmVhZF9sZW4gPCBzaXplb2YoVF9GTEFHU19JTkZPKSkNCisgICAgICAgICAgICB7DQorICAgICAgICAgICAgICAgIGZsYWdzX2VycigicmVhZCBsZW4gKCVkKSA8IG5lZWQgbGVuICglZCkiLCByZWFkX2xlbiwgc2l6ZW9mKFRfRkxBR1NfSU5GTykpOw0KKyAgICAgICAgICAgICAgICBnb3RvIGVycm9yX2Nsb3NlOw0KKyAgICAgICAgICAgIH0NCisNCisgICAgICAgICAgICBnb29kX2luZGV4Kys7DQorICAgICAgICB9DQorDQorICAgIH0NCisNCisgICAgY2xvc2UoZmRfZHN0KTsNCisNCisgICAgcmV0dXJuIDA7DQorDQorZXJyb3JfY2xvc2U6DQorICAgIGNsb3NlKGZkX2RzdCk7DQorDQorZXJyb3I6DQorICAgIHJldHVybiAtMTsNCit9DQorDQorDQorc3RhdGljIGludCBzZXRfZmxhZ3NfaW5mbyhUX0ZMQUdTX0lORk8gKnBfZmxhZ3NfaW5mbywgaW50ICpwX21haW5faW5kZXgsIGludCAqcF9iYWNrdXBfaW5kZXgpDQorew0KKyAgICBpbnQgcmV0ID0gLTE7DQorICAgIGludCBmZF9kc3QgPSAtMTsNCisgICAgY2hhciBtdGRfcGF0aFtNQVhfUEFUSF9MRU5dID0gezB9Ow0KKyAgICBzdHJ1Y3QgbXRkX2luZm9fdXNlciBtZW1pbmZvID0gezB9Ow0KKyAgICBwYXJ0aXRpb25fbXRkX2luZm9fdCBtdGRfaW5mbyA9IHswfTsNCisNCisgICAgdW5zaWduZWQgY2hhciAqcmVhbF93cml0ZV9jb250ZW50ID0gTlVMTDsNCisNCisgICAgaW50IGluZGV4ICA9IDA7DQorICAgIGludCBibG9ja19udW0gPSAwOw0KKyAgICBpbnQgbWFpbl9pbmRleCA9ICpwX21haW5faW5kZXg7DQorICAgIGludCBiYWNrX2luZGV4ID0gKnBfYmFja3VwX2luZGV4Ow0KKw0KKyAgICByZXQgPSBtdGRfZ2V0KFBBUlRJVElPTl9OQU1FX0ZMQUdTLCBERVZJQ0VfTVRELCBtdGRfcGF0aCwgTUFYX1BBVEhfTEVOKTsNCisgICAgaWYgKHJldCA8IDApDQorICAgIHsNCisgICAgICAgIGZsYWdzX2VycigicGFydGl0aW9uIFslc10gbm90IGZvdW5kIiwgUEFSVElUSU9OX05BTUVfRkxBR1MpOw0KKwkJDQorICAgICAgICByZXR1cm4gLTE7DQorICAgIH0NCisNCisgICAgaWYgKChmZF9kc3QgPSBvcGVuKG10ZF9wYXRoLCBPX1JEV1IgfCBPX1NZTkMpKSA8IDApDQorICAgIHsNCisgICAgICAgIGZsYWdzX2Vycigib3BlbiBmbGFzaCBlcnJvciwgZXJybm89JWQsIHN0cmVycm9yPVslc10iLCBlcnJubywgc3RyZXJyb3IoZXJybm8pKTsNCisgICAgICAgIHJldHVybiAtMTsNCisgICAgfQ0KKw0KKyAgICBpZiAoaW9jdGwoZmRfZHN0LCBNRU1HRVRJTkZPLCAmbWVtaW5mbykgIT0gMCkNCisgICAgew0KKyAgICAgICAgZmxhZ3NfZXJyKCJnZXQgZmxhc2ggaW5mbyBlcnJvciwgZXJybm89JWQsIHN0cmVycm9yPVslc10iLCBlcnJubywgc3RyZXJyb3IoZXJybm8pKTsNCisgICAgICAgIGdvdG8gZXJyb3I7DQorICAgIH0NCisNCisgICAgbXRkX2luZm8ucGFydGlfZmlsZV9kZXNjIAk9IGZkX2RzdDsNCisgICAgbXRkX2luZm8ubXRkX2Jsb2Nrc2l6ZQkJPSBtZW1pbmZvLmVyYXNlc2l6ZTsNCisgICAgbXRkX2luZm8ubXRkX29vYnNpemUJCT0gbWVtaW5mby5vb2JzaXplOw0KKyAgICBtdGRfaW5mby5tdGRfcGFnZXBlcmJsb2NrIAk9IG1lbWluZm8uZXJhc2VzaXplIC8gbWVtaW5mby53cml0ZXNpemU7DQorICAgIG10ZF9pbmZvLm10ZF9wYWdlc2l6ZSAJCT0gbWVtaW5mby53cml0ZXNpemU7DQorICAgIG10ZF9pbmZvLm10ZF90b3RhbHNpemUJCT0gbWVtaW5mby5zaXplOw0KKw0KKyAgICBibG9ja19udW0gPSBtdGRfaW5mby5tdGRfdG90YWxzaXplIC8gbXRkX2luZm8ubXRkX2Jsb2Nrc2l6ZTsNCisNCisgICAgcmVhbF93cml0ZV9jb250ZW50ID0gKHVuc2lnbmVkIGNoYXIgKiltYWxsb2MobXRkX2luZm8ubXRkX2Jsb2Nrc2l6ZSk7DQorICAgIGlmIChOVUxMID09IHJlYWxfd3JpdGVfY29udGVudCkNCisgICAgew0KKyAgICAgICAgZmxhZ3NfZXJyKCJtYWxsb2MgYmxvY2sgZmFpbCIpOw0KKyAgICAgICAgZ290byBlcnJvcjsNCisgICAgfQ0KKw0KKyAgICBtZW1zZXQocmVhbF93cml0ZV9jb250ZW50LCAweEZGLCBtdGRfaW5mby5tdGRfYmxvY2tzaXplKTsNCisgICAgbWVtY3B5KHJlYWxfd3JpdGVfY29udGVudCwgKGNoYXIgKilwX2ZsYWdzX2luZm8sIHNpemVvZihUX0ZMQUdTX0lORk8pKTsNCisJDQorICAgIGZsYWdzX2xvZygiYmVnaW4gdG8gd3JpdGUgbWFpbiBmbGFncyIpOw0KKw0KKyAgICBmb3IgKGluZGV4ID0gMDsgaW5kZXggPCBibG9ja19udW07IGluZGV4KyspDQorICAgIHsNCisgICAgICAgIGlmIChpbmRleCA9PSBiYWNrX2luZGV4KQ0KKyAgICAgICAgew0KKyAgICAgICAgICAgIGNvbnRpbnVlOw0KKyAgICAgICAgfQ0KKw0KKyAgICAgICAgcmV0ID0gd3JpdGVfZmxhZ3NfaW5mbygmbXRkX2luZm8sIGluZGV4LCByZWFsX3dyaXRlX2NvbnRlbnQsIG10ZF9pbmZvLm10ZF9ibG9ja3NpemUpOw0KKyAgICAgICAgaWYgKHJldCA9PSAwKQ0KKyAgICAgICAgew0KKyAgICAgICAgICAgIC8vINC0s8m5pqOszcuz9qOssqK4/NDCtdrSu7/pzrvWww0KKyAgICAgICAgICAgIGZsYWdzX2xvZygibWFpbiBmbGFncyBsb2NhdGlvbjogWyVkXS0+WyVkXSIsIG1haW5faW5kZXgsIGluZGV4KTsNCisgICAgICAgICAgICBtYWluX2luZGV4ID0gaW5kZXg7DQorICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICB9DQorICAgICAgICBlbHNlIGlmIChyZXQgPT0gQkFEX0JMT0NLKQ0KKyAgICAgICAgew0KKyAgICAgICAgICAgIC8vINP2tb27tb/po6zP8rrzzPjSu7/pDQorICAgICAgICAgICAgZmxhZ3NfbG9nKCJmbGFncyBibG9jayBpbmRleCBbJWRdIGlzIGJhZCIsIGluZGV4KTsNCisgICAgICAgICAgICBjb250aW51ZTsNCisgICAgICAgIH0NCisgICAgICAgIGVsc2UNCisgICAgICAgIHsNCisgICAgICAgICAgICBmbGFnc19lcnIoIndyaXRlIG1haW4gZmxhZ3MgZmFpbCIpOw0KKyAgICAgICAgICAgIG1haW5faW5kZXggPSAtMTsNCisgICAgICAgICAgICBicmVhazsNCisgICAgICAgIH0NCisgICAgfQ0KKw0KKyAgICBmbGFnc19sb2coImJlZ2luIHRvIHdyaXRlIGJhY2t1cCBmbGFncyIpOw0KKw0KKyAgICBmb3IgKGluZGV4ID0gMDsgaW5kZXggPCBibG9ja19udW07IGluZGV4KyspDQorICAgIHsNCisgICAgICAgIGlmIChpbmRleCA9PSBtYWluX2luZGV4KQ0KKyAgICAgICAgew0KKyAgICAgICAgICAgIGNvbnRpbnVlOw0KKyAgICAgICAgfQ0KKw0KKyAgICAgICAgZmxhZ3NfbG9nKCJ3cml0ZSBiYWNrdXAgdG8gWyVkXSBibG9jayIsIGluZGV4KTsNCisgICAgICAgIHJldCA9IHdyaXRlX2ZsYWdzX2luZm8oJm10ZF9pbmZvLCBpbmRleCwgcmVhbF93cml0ZV9jb250ZW50LCBtdGRfaW5mby5tdGRfYmxvY2tzaXplKTsNCisgICAgICAgIGlmIChyZXQgPT0gMCkNCisgICAgICAgIHsNCisgICAgICAgICAgICAvLyDQtLPJuaajrM3Ls/ajrLKiuPzQwrXa0ru/6c671sMNCisgICAgICAgICAgICBmbGFnc19sb2coImJhY2t1cCBmbGFncyBsb2NhdGlvbjogWyVkXS0+WyVkXSIsIGJhY2tfaW5kZXgsIGluZGV4KTsNCisgICAgICAgICAgICBiYWNrX2luZGV4ID0gaW5kZXg7DQorICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICB9DQorICAgICAgICBlbHNlIGlmIChyZXQgPT0gQkFEX0JMT0NLKQ0KKyAgICAgICAgew0KKyAgICAgICAgICAgIC8vINP2tb27tb/po6zP8rrzzPjSu7/pDQorICAgICAgICAgICAgY29udGludWU7DQorICAgICAgICB9DQorICAgICAgICBlbHNlDQorICAgICAgICB7DQorICAgICAgICAgICAgZmxhZ3NfZXJyKCJ3cml0ZSBiYWNrdXAgZmxhZ3MgZmFpbCIpOw0KKyAgICAgICAgICAgIGJhY2tfaW5kZXggPSAtMTsNCisgICAgICAgICAgICBicmVhazsNCisgICAgICAgIH0NCisgICAgfQ0KKw0KKyAgICBpZiAobWFpbl9pbmRleCA9PSAtMSAmJiBiYWNrX2luZGV4ID09IC0xKQ0KKyAgICB7DQorICAgICAgICBnb3RvIGVycm9yOw0KKyAgICB9DQorICAgIGVsc2UNCisgICAgew0KKyAgICAgICAgcmV0ID0gMDsNCisgICAgICAgIGdvdG8gZW5kOw0KKyAgICB9DQorDQorZXJyb3I6DQorICAgIHJldCA9IC0xOw0KKw0KK2VuZDoNCisgICAgY2xvc2UoZmRfZHN0KTsNCisJDQorCWlmKE5VTEwgIT0gcmVhbF93cml0ZV9jb250ZW50KQ0KKwl7DQorCQlmcmVlKHJlYWxfd3JpdGVfY29udGVudCk7DQorCQlyZWFsX3dyaXRlX2NvbnRlbnQgPSBOVUxMOw0KKwl9DQorCQ0KKyAgICByZXR1cm4gcmV0Ow0KK30NCisNCisNCitzdGF0aWMgdm9pZCBjb3B5X2ZsYWdzX2luZm8oVF9GTEFHU19JTkZPICpkc3QsIFRfRkxBR1NfSU5GTyAqc3JjKQ0KK3sNCisJZHN0LT5tYWdpY19zdGFydCA9IHNyYy0+bWFnaWNfc3RhcnQ7DQorCQ0KKyAgICBkc3QtPmJvb3RfZm90YV9mbGFnLmJvb3RfdG8gPSBzcmMtPmJvb3RfZm90YV9mbGFnLmJvb3RfdG87DQorICAgIGRzdC0+Ym9vdF9mb3RhX2ZsYWcuZm90YV9zdGF0dXMgPSBzcmMtPmJvb3RfZm90YV9mbGFnLmZvdGFfc3RhdHVzOw0KKyAgICBkc3QtPmJvb3RfZm90YV9mbGFnLnN5c3RlbS5zdGF0dXMgPSBzcmMtPmJvb3RfZm90YV9mbGFnLnN5c3RlbS5zdGF0dXM7DQorICAgIGRzdC0+Ym9vdF9mb3RhX2ZsYWcuc3lzdGVtLnRyeV9jbnQgPSBzcmMtPmJvb3RfZm90YV9mbGFnLnN5c3RlbS50cnlfY250Ow0KKyAgICBkc3QtPmJvb3RfZm90YV9mbGFnLnN5c3RlbTIuc3RhdHVzID0gc3JjLT5ib290X2ZvdGFfZmxhZy5zeXN0ZW0yLnN0YXR1czsNCisgICAgZHN0LT5ib290X2ZvdGFfZmxhZy5zeXN0ZW0yLnRyeV9jbnQgPSBzcmMtPmJvb3RfZm90YV9mbGFnLnN5c3RlbTIudHJ5X2NudDsNCisJDQorICAgIGRzdC0+Ym9vdF9lbnYuZHVhbHN5c190eXBlID0gc3JjLT5ib290X2Vudi5kdWFsc3lzX3R5cGU7DQorCXN0cm5jcHkoZHN0LT5ib290X2Vudi5zeXN0ZW1fYm9vdF9lbnYsIHNyYy0+Ym9vdF9lbnYuc3lzdGVtX2Jvb3RfZW52LCBzaXplb2YoZHN0LT5ib290X2Vudi5zeXN0ZW1fYm9vdF9lbnYpKTsNCisJc3RybmNweShkc3QtPmJvb3RfZW52LnN5c3RlbTJfYm9vdF9lbnYsIHNyYy0+Ym9vdF9lbnYuc3lzdGVtMl9ib290X2Vudiwgc2l6ZW9mKGRzdC0+Ym9vdF9lbnYuc3lzdGVtMl9ib290X2VudikpOw0KKw0KKwlkc3QtPnViaWZzX3N0YXR1cy5mc19zdGF0dXMgPSBzcmMtPnViaWZzX3N0YXR1cy5mc19zdGF0dXM7DQorCXN0cm5jcHkoZHN0LT51Ymlmc19zdGF0dXMuZnNfbXRkX25hbWUsIHNyYy0+dWJpZnNfc3RhdHVzLmZzX210ZF9uYW1lLCBzaXplb2YoZHN0LT51Ymlmc19zdGF0dXMuZnNfbXRkX25hbWUpKTsNCisJc3RybmNweShkc3QtPnViaWZzX3N0YXR1cy5mc191Ymlfdm9sX25hbWUsIHNyYy0+dWJpZnNfc3RhdHVzLmZzX3ViaV92b2xfbmFtZSwgc2l6ZW9mKGRzdC0+dWJpZnNfc3RhdHVzLmZzX3ViaV92b2xfbmFtZSkpOw0KKwkNCisJZHN0LT5tYWdpY19lbmQgPSBzcmMtPm1hZ2ljX2VuZDsNCisNCisJcmV0dXJuOw0KK30NCisNCisNCitzdGF0aWMgaW50IGdldF9jdXJyZW50X3N5c3RlbSgpDQorew0KKyAgICBjaGFyIGJ1ZlsxMDI0XSA9IHswfTsNCisNCisgICAgY2hhciAqcGFyYSA9IE5VTEw7DQorICAgIGludCBtYXRjaGVzID0gMDsNCisNCisgICAgRklMRSAqZmRfY21kID0gTlVMTDsNCisgICAgY2hhciAqbGluZV9zdHIgPSBOVUxMOw0KKw0KKyAgICBpbnQgY3VycmVudF9zeXN0ZW0gPSAtMTsNCisNCisNCisgICAgZmRfY21kID0gZm9wZW4oRklMRV9QQVRIX1BST0NfQ01ETElORSwgInIiKTsNCisgICAgaWYgKCFmZF9jbWQpDQorICAgIHsNCisgICAgICAgIGZsYWdzX2Vycigib3BlbiBmaWxlICVzIGVycm9yLCBlcnJvcjolcyIsIEZJTEVfUEFUSF9QUk9DX0NNRExJTkUsIHN0cmVycm9yKGVycm5vKSk7DQorICAgICAgICByZXR1cm4gU1lTVEVNX0lOREVYX1VOS05PV047DQorICAgIH0NCisNCisgICAgd2hpbGUgKCFmZW9mKGZkX2NtZCkpDQorICAgIHsNCisgICAgICAgIG1lbXNldChidWYsIDAsIHNpemVvZihidWYpKTsNCisgICAgICAgIGxpbmVfc3RyID0gZmdldHMoYnVmLCBzaXplb2YoYnVmKSwgZmRfY21kKTsNCisNCisgICAgICAgIGlmIChOVUxMID09IGxpbmVfc3RyKQ0KKyAgICAgICAgew0KKyAgICAgICAgICAgIGZsYWdzX2VycigiZ2V0IGluZm8gZnJvbSAvcHJvYy9jbWRsaW5lIGVycm9yOiVzIiwgc3RyZXJyb3IoZXJybm8pKTsNCisgICAgICAgICAgICBnb3RvIGVuZDsNCisgICAgICAgIH0NCisNCisgICAgICAgIGZsYWdzX2xvZygiYnVmZjolcyIsIGJ1Zik7DQorDQorICAgICAgICBwYXJhID0gc3RydG9rKGJ1ZiwgIiAiKTsNCisgICAgICAgIHdoaWxlIChwYXJhKQ0KKyAgICAgICAgew0KKyAgICAgICAgICAgIGZsYWdzX2xvZygicGFyYTolcyIsIHBhcmEpOw0KKyAgICAgICAgICAgIGlmIChzdHJuY21wKHBhcmEsIFBST0NfQ01ETElORV9TWVNURU1fQV9GTEFHLCBzdHJsZW4oUFJPQ19DTURMSU5FX1NZU1RFTV9BX0ZMQUcpKSA9PSAwKQ0KKyAgICAgICAgICAgIHsNCisgICAgICAgICAgICAgICAgY3VycmVudF9zeXN0ZW0gPSBTWVNURU1fSU5ERVhfMTsNCisgICAgICAgICAgICAgICAgZ290byBlbmQ7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIGVsc2UgaWYgKHN0cm5jbXAocGFyYSwgUFJPQ19DTURMSU5FX1NZU1RFTV9CX0ZMQUcsIHN0cmxlbihQUk9DX0NNRExJTkVfU1lTVEVNX0JfRkxBRykpID09IDApDQorICAgICAgICAgICAgew0KKyAgICAgICAgICAgICAgICBjdXJyZW50X3N5c3RlbSA9IFNZU1RFTV9JTkRFWF8yOw0KKyAgICAgICAgICAgICAgICBnb3RvIGVuZDsNCisgICAgICAgICAgICB9DQorICAgICAgICAgICAgZWxzZQ0KKyAgICAgICAgICAgIHsNCisgICAgICAgICAgICAgICAgLy86DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIHBhcmEgPSBzdHJ0b2soTlVMTCwgIiAiKTsNCisgICAgICAgIH0NCisgICAgfQ0KKw0KK2VuZDoNCisgICAgaWYgKGZkX2NtZCkNCisgICAgew0KKyAgICAgICAgZmNsb3NlKGZkX2NtZCk7DQorICAgIH0NCisJDQorICAgIHJldHVybiBjdXJyZW50X3N5c3RlbTsNCit9DQorDQorDQorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCisgKiAJCQkJCSBHbG9iYWwgZnVuY3Rpb24gaW1wbGVtZW50YXRpb25zCQkJCQkJICAgKg0KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQoraW50IGZsYWdzX2luaXQoKQ0KK3sNCisJVF9GTEFHU19JTkZPIGZsYWdzX2luZm8gPSB7MH07DQorCWludCBtYWluX2luZGV4ID0gMDsNCisJaW50IGJhY2tfaW5kZXggPSAxOw0KKwlpbnQgcmV0ID0gLTE7DQorCWludCBmZF9kc3QgPSAtMTsNCisJY2hhciBtdGRfcGF0aFtNQVhfUEFUSF9MRU5dID0gezB9Ow0KKwlzdHJ1Y3QgbXRkX2luZm9fdXNlciBtZW1pbmZvID0gezB9Ow0KKwlwYXJ0aXRpb25fbXRkX2luZm9fdCBtdGRfaW5mbyA9IHswfTsNCisNCisJdW5zaWduZWQgY2hhciAqcmVhbF93cml0ZV9jb250ZW50ID0gTlVMTDsNCisJVF9GTEFHU19JTkZPICpwX3dyaXRlID0gTlVMTDsNCisNCisJaW50IGluZGV4ICA9IDA7DQorCWludCBibG9ja19udW0gPSAwOw0KKwlpbnQgYWxyZWFkeV93cml0ZSA9IDA7DQorCQ0KKyAgICBmbGFnc19pbmZvLm1hZ2ljX3N0YXJ0ID0gRkxBR1NfTUFHSUM7DQorCQ0KKyAgICBmbGFnc19pbmZvLmJvb3RfZm90YV9mbGFnLmJvb3RfdG8gPSBEVUFMX1NZU1RFTTsNCisgICAgZmxhZ3NfaW5mby5ib290X2ZvdGFfZmxhZy5mb3RhX3N0YXR1cyA9IDA7DQorICAgIGZsYWdzX2luZm8uYm9vdF9mb3RhX2ZsYWcuc3lzdGVtLnN0YXR1cyA9IERVQUxTWVNURU1fU1RBVFVTX0JPT1RBQkxFOw0KKyAgICBmbGFnc19pbmZvLmJvb3RfZm90YV9mbGFnLnN5c3RlbS50cnlfY250ID0gMDsNCisgICAgZmxhZ3NfaW5mby5ib290X2ZvdGFfZmxhZy5zeXN0ZW0yLnN0YXR1cyA9IERVQUxTWVNURU1fU1RBVFVTX0JPT1RBQkxFOw0KKyAgICBmbGFnc19pbmZvLmJvb3RfZm90YV9mbGFnLnN5c3RlbTIudHJ5X2NudCA9IDA7DQorDQorICAgIGZsYWdzX2luZm8uYm9vdF9lbnYuZHVhbHN5c190eXBlID0gRFVBTFNZU1RFTV9BQjsNCisNCisJZmxhZ3NfaW5mby51Ymlmc19zdGF0dXMuZnNfc3RhdHVzID0gMDsNCisJDQorICAgIGZsYWdzX2luZm8ubWFnaWNfZW5kID0gRkxBR1NfTUFHSUM7DQorDQorCXJldCA9IG10ZF9nZXQoUEFSVElUSU9OX05BTUVfRkxBR1MsIERFVklDRV9NVEQsIG10ZF9wYXRoLCBNQVhfUEFUSF9MRU4pOw0KKwlpZiAocmV0IDwgMCkNCisJew0KKwkJZmxhZ3NfZXJyKCJwYXJ0aXRpb24gWyVzXSBub3QgZm91bmQiLCBQQVJUSVRJT05fTkFNRV9GTEFHUyk7DQorCQkNCisJCXJldHVybiAtMTsNCisJfQ0KKw0KKwlpZiAoKGZkX2RzdCA9IG9wZW4obXRkX3BhdGgsIE9fUkRXUiB8IE9fU1lOQykpIDwgMCkNCisJew0KKwkJZmxhZ3NfZXJyKCJvcGVuIGZsYXNoIGVycm9yLCBlcnJubz0lZCwgc3RyZXJyb3I9WyVzXSIsIGVycm5vLCBzdHJlcnJvcihlcnJubykpOw0KKwkJDQorCQlyZXR1cm4gLTE7DQorCX0NCisNCisJaWYgKGlvY3RsKGZkX2RzdCwgTUVNR0VUSU5GTywgJm1lbWluZm8pICE9IDApDQorCXsNCisJCWZsYWdzX2VycigiZ2V0IGZsYXNoIGluZm8gZXJyb3IsIGVycm5vPSVkLCBzdHJlcnJvcj1bJXNdIiwgZXJybm8sIHN0cmVycm9yKGVycm5vKSk7DQorCQkNCisJCWdvdG8gZXJyb3I7DQorCX0NCisNCisJbXRkX2luZm8ucGFydGlfZmlsZV9kZXNjIAk9IGZkX2RzdDsNCisJbXRkX2luZm8ubXRkX2Jsb2Nrc2l6ZQkJPSBtZW1pbmZvLmVyYXNlc2l6ZTsNCisJbXRkX2luZm8ubXRkX29vYnNpemUJCT0gbWVtaW5mby5vb2JzaXplOw0KKwltdGRfaW5mby5tdGRfcGFnZXBlcmJsb2NrCT0gbWVtaW5mby5lcmFzZXNpemUgLyBtZW1pbmZvLndyaXRlc2l6ZTsNCisJbXRkX2luZm8ubXRkX3BhZ2VzaXplCQk9IG1lbWluZm8ud3JpdGVzaXplOw0KKwltdGRfaW5mby5tdGRfdG90YWxzaXplCQk9IG1lbWluZm8uc2l6ZTsNCisNCisJYmxvY2tfbnVtID0gbXRkX2luZm8ubXRkX3RvdGFsc2l6ZSAvIG10ZF9pbmZvLm10ZF9ibG9ja3NpemU7DQorDQorCXJlYWxfd3JpdGVfY29udGVudCA9ICh1bnNpZ25lZCBjaGFyICopbWFsbG9jKG10ZF9pbmZvLm10ZF9ibG9ja3NpemUpOw0KKwlpZiAoTlVMTCA9PSByZWFsX3dyaXRlX2NvbnRlbnQpDQorCXsNCisJCWZsYWdzX2VycigibWFsbG9jIGZvciBibG9jayBmYWlsIik7DQorCQkNCisJCWdvdG8gZXJyb3I7DQorCX0NCisNCisJbWVtc2V0KHJlYWxfd3JpdGVfY29udGVudCwgMHhGRiwgbXRkX2luZm8ubXRkX2Jsb2Nrc2l6ZSk7DQorCW1lbWNweShyZWFsX3dyaXRlX2NvbnRlbnQsIChjaGFyICopKCZmbGFnc19pbmZvKSwgc2l6ZW9mKFRfRkxBR1NfSU5GTykpOw0KKw0KKwlmb3IgKGluZGV4ID0gMDsgaW5kZXggPCBibG9ja19udW07IGluZGV4KyspDQorCXsNCisJCWlmIChhbHJlYWR5X3dyaXRlID49IEZMQUdTX0lOSVRfVkFMSURfQkxPQ0tTX05VTSkNCisJCXsNCisJCQlicmVhazsNCisJCX0NCisNCisJCXJldCA9IHdyaXRlX2ZsYWdzX2luZm8oJm10ZF9pbmZvLCBpbmRleCwgcmVhbF93cml0ZV9jb250ZW50LCBtdGRfaW5mby5tdGRfYmxvY2tzaXplKTsNCisJCWlmIChyZXQgPT0gMCkNCisJCXsNCisJCQlhbHJlYWR5X3dyaXRlKys7DQorCQkJZmxhZ3NfbG9nKCJ3cml0ZSBpbml0IHZhbGlkIGJsb2NrIG51bTogJWQiLCBhbHJlYWR5X3dyaXRlKTsNCisJCQkNCisJCQljb250aW51ZTsNCisJCX0NCisJCWVsc2UgaWYgKEJBRF9CTE9DSyA9PSByZXQpDQorCQl7DQorCQkJY29udGludWU7DQorCQl9DQorCX0NCisNCisJaWYgKGFscmVhZHlfd3JpdGUgPj0gMikNCisJew0KKwkJZmxhZ3NfbG9nKCJpbml0IHN5c3RlbSBzdGF0dXMgc3VjY2VzcywgYWxyZWFkIHdyaXRlIGJsb2NrOiAlZCIsIGFscmVhZHlfd3JpdGUpOw0KKwkJcmV0ID0gMDsNCisJfQ0KKwllbHNlDQorCXsNCisJCWZsYWdzX2xvZygiaW5pdCBzeXN0ZW0gc3RhdHVzIGZhaWwsIGFscmVhZCB3cml0ZSBibG9jazogJWQiLCBhbHJlYWR5X3dyaXRlKTsNCisJCXJldCA9IC0xOw0KKwl9DQorDQorCWdvdG8gZW5kOw0KKw0KK2Vycm9yOg0KKwlyZXQgPSAtMTsNCisNCitlbmQ6DQorCWNsb3NlKGZkX2RzdCk7DQorCQ0KKwlpZihOVUxMICE9IHJlYWxfd3JpdGVfY29udGVudCkNCisJew0KKwkJZnJlZShyZWFsX3dyaXRlX2NvbnRlbnQpOw0KKwkJcmVhbF93cml0ZV9jb250ZW50ID0gTlVMTDsNCisJfQ0KKwkNCisJcmV0dXJuIHJldDsNCit9DQorDQorDQoraW50IGZsYWdzX2dldChUX0ZMQUdTX0lORk8gKnBfZmxhZ3NfaW5mbykNCit7DQorICAgIFRfRkxBR1NfSU5GTyBtYWluX2ZsYWcgPSB7MH07DQorICAgIFRfRkxBR1NfSU5GTyBiYWNrdXBfZmxhZyA9IHswfTsNCisgICAgaW50IG1haW5faW5kZXggPSAwOw0KKyAgICBpbnQgYmFja3VwX2luZGV4ID0gMTsNCisNCisJaWYgKE5VTEwgPT0gcF9mbGFnc19pbmZvKQ0KKwl7DQorCQlmbGFnc19lcnIoImludmFsaWQgcGFyYW0gTlVMTCIpOw0KKwkJDQorCQlyZXR1cm4gLTE7DQorCX0NCisNCisgICAgaWYgKGdldF9mbGFnc19pbmZvKCZtYWluX2ZsYWcsICZtYWluX2luZGV4LCAmYmFja3VwX2ZsYWcsICZiYWNrdXBfaW5kZXgpICE9IDApDQorICAgIHsNCisgICAgCWZsYWdzX2VycigiZ2V0IGZsYWdzIGluZm8gZmFpbCIpOw0KKwkJDQorICAgICAgICByZXR1cm4gLTE7DQorICAgIH0NCisNCisgICAgaWYgKChGTEFHU19NQUdJQyA9PSBtYWluX2ZsYWcubWFnaWNfc3RhcnQpICYmIChGTEFHU19NQUdJQyA9PSBtYWluX2ZsYWcubWFnaWNfZW5kKSkNCisgICAgew0KKyAgICAgICAgY29weV9mbGFnc19pbmZvKHBfZmxhZ3NfaW5mbywgJm1haW5fZmxhZyk7DQorCQkNCisgICAgICAgIHJldHVybiAwOw0KKyAgICB9DQorCQ0KKyAgICBpZiAoKEZMQUdTX01BR0lDID09IGJhY2t1cF9mbGFnLm1hZ2ljX3N0YXJ0KSAmJiAoRkxBR1NfTUFHSUMgPT0gYmFja3VwX2ZsYWcubWFnaWNfZW5kKSkNCisgICAgew0KKyAgICAgICAgY29weV9mbGFnc19pbmZvKHBfZmxhZ3NfaW5mbywgJmJhY2t1cF9mbGFnKTsNCisJCQ0KKyAgICAgICAgcmV0dXJuIDA7DQorICAgIH0NCisNCisgICAgZmxhZ3NfZXJyKCJkbyBub3QgZmluZCB2YWxpZCBmbGFncyBpbmZvIik7DQorCQ0KKyAgICByZXR1cm4gLTE7DQorfQ0KKw0KKw0KK2ludCBmbGFnc19zZXQoVF9GTEFHU19JTkZPICpwX2ZsYWdzX2luZm8pDQorew0KKwlUX0ZMQUdTX0lORk8gbWFpbl9mbGFnID0gezB9Ow0KKyAgICBUX0ZMQUdTX0lORk8gYmFja3VwX2ZsYWcgPSB7MH07DQorICAgIGludCBtYWluX2luZGV4ID0gMDsNCisgICAgaW50IGJhY2t1cF9pbmRleCA9IDE7DQorCQ0KKwlpZiAoTlVMTCA9PSBwX2ZsYWdzX2luZm8pDQorCXsNCisJCWZsYWdzX2VycigiaW52YWxpZCBwYXJhbSBOVUxMIik7DQorCQkNCisJCXJldHVybiAtMTsNCisJfQ0KKw0KKwlpZiAoKEZMQUdTX01BR0lDICE9IHBfZmxhZ3NfaW5mby0+bWFnaWNfc3RhcnQpIHx8IChGTEFHU19NQUdJQyAhPSBwX2ZsYWdzX2luZm8tPm1hZ2ljX2VuZCkpDQorCXsNCisJCWZsYWdzX2VycigiaW52YWxpZCBtYWdpYyIpOw0KKwkJDQorCQlyZXR1cm4gLTE7DQorCX0NCisJDQorICAgIGlmIChnZXRfZmxhZ3NfaW5mbygmbWFpbl9mbGFnLCAmbWFpbl9pbmRleCwgJmJhY2t1cF9mbGFnLCAmYmFja3VwX2luZGV4KSAhPSAwKQ0KKyAgICB7DQorICAgIAlmbGFnc19lcnIoImdldCBmbGFncyBpbmZvIGZhaWwiKTsNCisJCQ0KKyAgICAgICAgcmV0dXJuIC0xOw0KKyAgICB9DQorDQorICAgIGlmIChzZXRfZmxhZ3NfaW5mbyhwX2ZsYWdzX2luZm8sICZtYWluX2luZGV4LCAmYmFja3VwX2luZGV4KSAhPSAwKQ0KKyAgICB7DQorICAgICAgICBmbGFnc19lcnIoInNldCB1YmlmcyBzdGF0dXMgZmFpbCIpOw0KKwkJDQorICAgICAgICByZXR1cm4gLTE7DQorICAgIH0NCisNCisJcmV0dXJuIDA7DQorfQ0KKw0KKw0KK2ludCBmbGFnc19nZXRfdWJpZnNfc3RhdHVzKFRfVUJJRlNfU1RBVFVTICpwX3ViaWZzX3N0YXR1cykNCit7DQorICAgIFRfRkxBR1NfSU5GTyBtYWluX2ZsYWcgPSB7MH07DQorICAgIFRfRkxBR1NfSU5GTyBiYWNrdXBfZmxhZyA9IHswfTsNCisgICAgaW50IG1haW5faW5kZXggPSAwOw0KKyAgICBpbnQgYmFja3VwX2luZGV4ID0gMTsNCisJDQorCWlmIChOVUxMID09IHBfdWJpZnNfc3RhdHVzKQ0KKwl7DQorCQlmbGFnc19lcnIoImludmFsaWQgcGFyYW0gTlVMTCIpOw0KKwkJDQorCQlyZXR1cm4gLTE7DQorCX0NCisNCisgICAgaWYgKGdldF9mbGFnc19pbmZvKCZtYWluX2ZsYWcsICZtYWluX2luZGV4LCAmYmFja3VwX2ZsYWcsICZiYWNrdXBfaW5kZXgpICE9IDApDQorICAgIHsNCisgICAgCWZsYWdzX2VycigiZ2V0IGZsYWdzIGluZm8gZmFpbCIpOw0KKwkJDQorICAgICAgICByZXR1cm4gLTE7DQorICAgIH0NCisJDQorICAgIGlmICgoRkxBR1NfTUFHSUMgPT0gbWFpbl9mbGFnLm1hZ2ljX3N0YXJ0KSAmJiAoRkxBR1NfTUFHSUMgPT0gbWFpbl9mbGFnLm1hZ2ljX2VuZCkpDQorICAgIHsNCisJCXBfdWJpZnNfc3RhdHVzLT5mc19zdGF0dXMgPSBtYWluX2ZsYWcudWJpZnNfc3RhdHVzLmZzX3N0YXR1czsNCisJCXN0cm5jcHkocF91Ymlmc19zdGF0dXMtPmZzX210ZF9uYW1lLCBtYWluX2ZsYWcudWJpZnNfc3RhdHVzLmZzX210ZF9uYW1lLCBzaXplb2YocF91Ymlmc19zdGF0dXMtPmZzX210ZF9uYW1lKSk7DQorCQlzdHJuY3B5KHBfdWJpZnNfc3RhdHVzLT5mc191Ymlfdm9sX25hbWUsIG1haW5fZmxhZy51Ymlmc19zdGF0dXMuZnNfdWJpX3ZvbF9uYW1lLCBzaXplb2YocF91Ymlmc19zdGF0dXMtPmZzX3ViaV92b2xfbmFtZSkpOw0KKwkJDQorICAgICAgICByZXR1cm4gMDsNCisgICAgfQ0KKwkJCQ0KKyAgICBpZiAoKEZMQUdTX01BR0lDID09IGJhY2t1cF9mbGFnLm1hZ2ljX3N0YXJ0KSAmJiAoRkxBR1NfTUFHSUMgPT0gYmFja3VwX2ZsYWcubWFnaWNfZW5kKSkNCisgICAgew0KKwkJcF91Ymlmc19zdGF0dXMtPmZzX3N0YXR1cyA9IGJhY2t1cF9mbGFnLnViaWZzX3N0YXR1cy5mc19zdGF0dXM7DQorCQlzdHJuY3B5KHBfdWJpZnNfc3RhdHVzLT5mc19tdGRfbmFtZSwgYmFja3VwX2ZsYWcudWJpZnNfc3RhdHVzLmZzX210ZF9uYW1lLCBzaXplb2YocF91Ymlmc19zdGF0dXMtPmZzX210ZF9uYW1lKSk7DQorCQlzdHJuY3B5KHBfdWJpZnNfc3RhdHVzLT5mc191Ymlfdm9sX25hbWUsIGJhY2t1cF9mbGFnLnViaWZzX3N0YXR1cy5mc191Ymlfdm9sX25hbWUsIHNpemVvZihwX3ViaWZzX3N0YXR1cy0+ZnNfdWJpX3ZvbF9uYW1lKSk7DQorCQkNCisgICAgICAgIHJldHVybiAwOw0KKyAgICB9DQorDQorICAgIGZsYWdzX2VycigiZG8gbm90IGZpbmQgdmFsaWQgZmxhZ3MgaW5mbyIpOw0KKwkNCisgICAgcmV0dXJuIC0xOw0KK30NCisNCisNCitpbnQgZmxhZ3Nfc2V0X3ViaWZzX3N0YXR1cyhUX1VCSUZTX1NUQVRVUyAqcF91Ymlmc19zdGF0dXMpDQorew0KKyAgICBUX0ZMQUdTX0lORk8gbWFpbl9mbGFnID0gezB9Ow0KKyAgICBUX0ZMQUdTX0lORk8gYmFja3VwX2ZsYWcgPSB7MH07DQorICAgIGludCBtYWluX2luZGV4ID0gMDsNCisgICAgaW50IGJhY2t1cF9pbmRleCA9IDE7DQorCQ0KKyAgICBUX0ZMQUdTX0lORk8gKmZsYWdzX2luZm8gPSBOVUxMOw0KKw0KKwlpZiAoTlVMTCA9PSBwX3ViaWZzX3N0YXR1cykNCisJew0KKwkJZmxhZ3NfZXJyKCJpbnZhbGlkIHBhcmFtIE5VTEwiKTsNCisJCQ0KKwkJcmV0dXJuIC0xOw0KKwl9DQorCQ0KKyAgICBpZiAoZ2V0X2ZsYWdzX2luZm8oJm1haW5fZmxhZywgJm1haW5faW5kZXgsICZiYWNrdXBfZmxhZywgJmJhY2t1cF9pbmRleCkgIT0gMCkNCisgICAgew0KKyAgICAJZmxhZ3NfZXJyKCJnZXQgZmxhZ3MgaW5mbyBmYWlsIik7DQorCQkNCisgICAgICAgIHJldHVybiAtMTsNCisgICAgfQ0KKw0KKyAgICBpZiAoKEZMQUdTX01BR0lDID09IG1haW5fZmxhZy5tYWdpY19zdGFydCkgJiYgKEZMQUdTX01BR0lDID09IG1haW5fZmxhZy5tYWdpY19lbmQpKQ0KKyAgICB7DQorICAgICAgICBmbGFnc19pbmZvID0gJm1haW5fZmxhZzsNCisgICAgfQ0KKyAgICBlbHNlIGlmICgoRkxBR1NfTUFHSUMgPT0gYmFja3VwX2ZsYWcubWFnaWNfc3RhcnQpICYmIChGTEFHU19NQUdJQyA9PSBiYWNrdXBfZmxhZy5tYWdpY19lbmQpKQ0KKyAgICB7DQorICAgICAgICBmbGFnc19pbmZvID0gJmJhY2t1cF9mbGFnOw0KKyAgICB9DQorICAgIGVsc2UNCisgICAgew0KKyAgICAgICAgZmxhZ3NfZXJyKCJnZXQgdWJpZnMgc3RhdHVzIGludmFsaWQiKTsNCisJCQ0KKyAgICAgICAgcmV0dXJuIC0xOw0KKyAgICB9DQorDQorCW1lbWNweSgmKGZsYWdzX2luZm8tPnViaWZzX3N0YXR1cyksIHBfdWJpZnNfc3RhdHVzLCBzaXplb2YoVF9VQklGU19TVEFUVVMpKTsNCisNCisgICAgaWYgKHNldF9mbGFnc19pbmZvKGZsYWdzX2luZm8sICZtYWluX2luZGV4LCAmYmFja3VwX2luZGV4KSAhPSAwKQ0KKyAgICB7DQorICAgICAgICBmbGFnc19lcnIoInNldCB1YmlmcyBzdGF0dXMgZmFpbCIpOw0KKwkJDQorICAgICAgICByZXR1cm4gLTE7DQorICAgIH0NCisNCisgICAgcmV0dXJuIDA7DQorfQ0KKw0KKw0KK2ludCBmbGFnc19nZXRfY3VycmVudF9zeXN0ZW0oKQ0KK3sNCisgICAgaW50IGN1cnJlbnQgPSBnZXRfY3VycmVudF9zeXN0ZW0oKTsNCisJDQorICAgIGlmIChjdXJyZW50ID09IDEpDQorICAgIHsNCisgICAgICAgIHJldHVybiBEVUFMX1NZU1RFTTsNCisgICAgfQ0KKyAgICBlbHNlIGlmIChjdXJyZW50ID09IDIpDQorICAgIHsNCisgICAgICAgIHJldHVybiBEVUFMX1NZU1RFTTI7DQorICAgIH0NCisNCisgICAgcmV0dXJuIC0xOw0KK30NCisNCg==