From mboxrd@z Thu Jan 1 00:00:00 1970 Content-Type: multipart/mixed; boundary="===============9143464698279044150==" MIME-Version: 1.0 From: rajyalakshmi bommaraju Subject: Patch for voice call history plugin merge Date: Tue, 18 May 2010 09:51:25 -0700 Message-ID: <4BF2C58D.6090901@intel.com> List-Id: To: ofono@ofono.org --===============9143464698279044150== Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Hi, I have implemented voice call history plugin using memory mapped file , = this implementation tested on meego images right now as an external = plugin to ofono. I am submitting the code here so that it can be merged an= d will be used as builtin plugin of ofono in future. Please review the p= atch and let = me know your decision and any changes that needs to be done for accepting i= t. Thanks Raji Bommaraju --===============9143464698279044150== Content-Type: text/x-patch MIME-Version: 1.0 Content-Transfer-Encoding: base64 Content-Disposition: attachment; filename="0001-Merging-voice-call-history-plugin-implementation.patch" PkZyb20gNmY5YWM1ZGM4YjZmZTliZDkyMjZjZDYzODAzYmZjYWJkOTk3ODIxOSBNb24gU2VwIDE3 IDAwOjAwOjAwIDIwMDEKRnJvbTogUmFqaSBCb21tYXJhanUgPFJhanlhbGFrc2htaSBCb21tYXJh anU+CkRhdGU6IFR1ZSwgMTggTWF5IDIwMTAgMDk6NTM6MDkgLTA3MDAKU3ViamVjdDogW1BBVENI XSBNZXJnaW5nIHZvaWNlIGNhbGwgaGlzdG9yeSBwbHVnaW4gaW1wbGVtZW50YXRpb24KCi0tLQog TWFrZWZpbGUuYW0gICAgICAgICAgIHwgICAgMiArCiBwbHVnaW5zL2NhbGxoaXN0b3J5LmMgfCAg NTc5ICsrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysKIDIg ZmlsZXMgY2hhbmdlZCwgNTgxIGluc2VydGlvbnMoKyksIDAgZGVsZXRpb25zKC0pCiBjcmVhdGUg bW9kZSAxMDA2NDQgcGx1Z2lucy9jYWxsaGlzdG9yeS5jCgpkaWZmIC0tZ2l0IGEvTWFrZWZpbGUu YW0gYi9NYWtlZmlsZS5hbQppbmRleCA3ZmQ4NjJmLi5kMmYxYWExIDEwMDY0NAotLS0gYS9NYWtl ZmlsZS5hbQorKysgYi9NYWtlZmlsZS5hbQpAQCAtMjM5LDYgKzIzOSw4IEBAIGJ1aWx0aW5fc291 cmNlcyArPSBwbHVnaW5zL3BhbG1wcmUuYwogYnVpbHRpbl9tb2R1bGVzICs9IHN0ZQogYnVpbHRp bl9zb3VyY2VzICs9IHBsdWdpbnMvc3RlLmMKIAorYnVpbHRpbl9tb2R1bGVzICs9IGNhbGxoaXN0 b3J5IAorYnVpbHRpbl9zb3VyY2VzICs9IHBsdWdpbnMvY2FsbGhpc3RvcnkuYwogZW5kaWYKIAog aWYgTUFJTlRBSU5FUl9NT0RFCmRpZmYgLS1naXQgYS9wbHVnaW5zL2NhbGxoaXN0b3J5LmMgYi9w bHVnaW5zL2NhbGxoaXN0b3J5LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4u M2RjZTNjMgotLS0gL2Rldi9udWxsCisrKyBiL3BsdWdpbnMvY2FsbGhpc3RvcnkuYwpAQCAtMCww ICsxLDU3OSBAQAorLyoKKyAqCisgKiBvRm9ubyAtIE9wZW4gU291cmNlIFRlbGVwaG9ueQorICoK KyAqIENvcHlyaWdodCAoQykgMjAwOC0yMDEwICBJbnRlbCBDb3Jwb3JhdGlvbi4gQWxsIHJpZ2h0 cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNh biByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9m IHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMKKyAqIHB1Ymxpc2hl ZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqICBUaGlzIHByb2dyYW0g aXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqICBi dXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50 eSBvZgorICogIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVS UE9TRS4gIFNlZSB0aGUKKyAqICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBk ZXRhaWxzLgorICoKKyAqICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBH TlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBp ZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiAgRm91bmRhdGlvbiwgSW5jLiwg NTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BICAwMjExMC0xMzAxICBVU0EK KyAqCisgKi8KKworCisjaWZkZWYgSEFWRV9DT05GSUdfSAorI2luY2x1ZGUgPGNvbmZpZy5oPgor I2VuZGlmCisKKyNkZWZpbmUgT0ZPTk9fQVBJX1NVQkpFQ1RfVE9fQ0hBTkdFCisjaW5jbHVkZSA8 c3RyaW5nLmg+CisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzdGRpbnQuaD4KKyNpbmNs dWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxlcnJuby5oPgorI2luY2x1ZGUgPGdsaWIuaD4KKyNp bmNsdWRlIDx0aW1lLmg+CisjaW5jbHVkZSA8dW5pc3RkLmg+CisjaW5jbHVkZSA8c3lzL3R5cGVz Lmg+CisjaW5jbHVkZSA8c3lzL3N0YXQuaD4KKyNpbmNsdWRlIDxzeXMvZGlyLmg+CisjaW5jbHVk ZSA8c3lzL21tYW4uaD4KKyNpbmNsdWRlIDxzZW1hcGhvcmUuaD4KKyNpbmNsdWRlIDxmY250bC5o PgorI2luY2x1ZGUgPG9mb25vL2RidXMuaD4KKyNpbmNsdWRlIDxkYnVzL2RidXMtZ2xpYi5oPgor I2luY2x1ZGUgPG9mb25vL3R5cGVzLmg+CisjaW5jbHVkZSA8b2Zvbm8vcGx1Z2luLmg+CisjaW5j bHVkZSA8b2Zvbm8vbG9nLmg+CisjaW5jbHVkZSA8b2Zvbm8vaGlzdG9yeS5oPgorI2luY2x1ZGUg ImdkYnVzLmgiCisjaW5jbHVkZSAiY29tbW9uLmgiCisKKyNkZWZpbmUgSElTVE9SWV9GSUxFX1BB VEggIi92YXIvY2FjaGUvY2FsbGhpc3RvcnkvIgorI2RlZmluZSBISVNUT1JZX0ZJTEUgSElTVE9S WV9GSUxFX1BBVEgidm9pY2VjYWxsaGlzdG9yeWRhdGEiCisjZGVmaW5lIE9GT05PX01BTkFHRVJf UEFUSCAiLyIKKyNkZWZpbmUgUEhPTkVfTlVNQkVSX1NJWkUgNjQKKyNkZWZpbmUgUkVDT1JEX1NJ WkUgODAKKyNkZWZpbmUgSEVBREVSX1NJWkUgMTYgCisKKyNpZmRlZiBOVU1fVkNBTExfSElTVE9S WV9FTlRSSUVTCisjZGVmaW5lIE1BWF9JVEVNUyBOVU1fVkNBTExfSElTVE9SWV9FTlRSSUVTCisj ZWxzZQorI2RlZmluZSBNQVhfSVRFTVMgNTAKKyNlbmRpZgorCisjZGVmaW5lIFRPVEFMX1NJWkUg KE1BWF9JVEVNUyAqIFJFQ09SRF9TSVpFICsgSEVBREVSX1NJWkUpCisKK2VudW0gVk9JQ0VfQ0FM TF9UWVBFIHsKKwlPVVRHT0lORyA9IDAsCisJSU5DT01JTkcsCisJTUlTU0VECit9OworCit0eXBl ZGVmIHN0cnVjdCBfRklMRUhFQURFUiB7CisJaW50IGhlYWQ7CisJaW50IHRhaWw7CisJaW50IHVu cmVhZDsKKwl1bnNpZ25lZCBpbnQgbGFzdGlkOyAKK30gSGlzdG9yeUZpbGVIZWFkZXI7CisKK3R5 cGVkZWYgc3RydWN0IF9WT0lDRUhJU1RPUlkgeworCWludCBpZDsKKwljaGFyIGxpbmVpZFtQSE9O RV9OVU1CRVJfU0laRV07CisJc2hvcnQgaW50IGNhbGx0eXBlOworCXRpbWVfdCBzdGFydHRpbWU7 CisJdGltZV90IGVuZHRpbWU7Cit9IFZvaWNlSGlzdG9yeTsKKworLy8gR2xvYmFsIFNoYXJlZCBk YXRhCit0eXBlZGVmIHN0cnVjdCBfU0hBUkVECit7CisJSGlzdG9yeUZpbGVIZWFkZXIgaGVhZGVy OworCXZvaWQgKmRhdGFNYXA7CisJc2VtX3QgbXV0ZXg7CisJaW50IHRlbXBfdW5yZWFkOworCWlu dCB0ZW1wX3RhaWw7Cit9IFNoYXJlZERhdGE7CisKK3N0YXRpYyBTaGFyZWREYXRhICpzaGFyZWRf ZGF0YSA9IE5VTEw7CisKKworc3RhdGljIHZvaWQgY2FsbGhpc3RvcnlfZW1pdF92b2ljZV9oaXN0 b3J5X2NoYW5nZWQoaW50ICk7CisKK3N0YXRpYyBpbnQgY2FsbF9oaXN0b3J5X3Byb2JlKHN0cnVj dCBvZm9ub19oaXN0b3J5X2NvbnRleHQgKmNvbnRleHQpCit7CisJREJHKCJIaXN0b3J5IFByb2Jl IGZvciBtb2RlbTogJXAiLCBjb250ZXh0LT5tb2RlbSk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRp YyB2b2lkIGNhbGxfaGlzdG9yeV9yZW1vdmUoc3RydWN0IG9mb25vX2hpc3RvcnlfY29udGV4dCAq Y29udGV4dCkKK3sKKwlEQkcoIkV4YW1wbGUgSGlzdG9yeSBSZW1vdmUgZm9yIG1vZGVtOiAlcCIs IGNvbnRleHQtPm1vZGVtKTsKK30KKworc3RhdGljIHZvaWQgY2xlYW5fdXAoKQoreworCWdfcmV0 dXJuX2lmX2ZhaWwoc2hhcmVkX2RhdGEhPSBOVUxMKTsKKworCXNlbV93YWl0KCYoc2hhcmVkX2Rh dGEtPm11dGV4KSk7CisJLy8gdW5tYXAKKwltdW5tYXAoc2hhcmVkX2RhdGEtPmRhdGFNYXAsVE9U QUxfU0laRSk7CisJc2VtX3Bvc3QoJihzaGFyZWRfZGF0YS0+bXV0ZXgpKTsKKworCS8vIHJlbW92 ZSBzZW1hcGhvcmUKKwlpZiAoc2VtX2Rlc3Ryb3koJihzaGFyZWRfZGF0YS0+bXV0ZXgpKSA8IDAp CisJCXBlcnJvcigic2VtX2Rlc3Ryb3kgZmFpbGVkIik7CisKKwlnX2ZyZWUoc2hhcmVkX2RhdGEp OworfQorCisKK3N0YXRpYyBpbnQgaW5pdF9zZW0oKQoreworCXVuc2lnbmVkIGludCB2YWx1ZSA9 IDE7CisJZ19yZXR1cm5fdmFsX2lmX2ZhaWwoc2hhcmVkX2RhdGEhPSBOVUxMLC0xKTsKKworCWlm IChzZW1faW5pdCgmKHNoYXJlZF9kYXRhLT5tdXRleCksIFRSVUUsIHZhbHVlKSA8IDApeworCQlw ZXJyb3IoInNlbV9pbml0IGZhaWxlZCIpOworCQlyZXR1cm4gLTE7CisJfQorCXJldHVybiAwOwor fQorCitzdGF0aWMgaW50IGluaXRfaGVhZGVyKHZvaWQgKmRhdGFQdHIpCit7CisJaW50IHVucmVh ZCA9IDA7CisKKwlnX3JldHVybl92YWxfaWZfZmFpbCgoc2hhcmVkX2RhdGEhPU5VTEwpLCAtMSk7 CisJZ19yZXR1cm5fdmFsX2lmX2ZhaWwoKGRhdGFQdHIhPU5VTEwpLCAtMSk7CisJdW5yZWFkID0g KHNoYXJlZF9kYXRhLT5oZWFkZXIpLnVucmVhZDsKKworCXNlbV93YWl0KCYoc2hhcmVkX2RhdGEt Pm11dGV4KSk7CisJbWVtY3B5KCYoc2hhcmVkX2RhdGEtPmhlYWRlciksIChIaXN0b3J5RmlsZUhl YWRlciAqKShkYXRhUHRyKSwKKwkJCQkJCQlIRUFERVJfU0laRSk7CisKKwlvZm9ub19kZWJ1Zygi VW5yZWFkOiAlZCwgSGVhZGVyOiAlZCwgVGFpbDogJWQsIHNlcmlhbG5vOiAlZFxuIiwKKwkJCQkJ dW5yZWFkLAorCQkJCQkoc2hhcmVkX2RhdGEtPmhlYWRlcikuaGVhZCwKKwkJCQkJKHNoYXJlZF9k YXRhLT5oZWFkZXIpLnRhaWwsCisJCQkJCShzaGFyZWRfZGF0YS0+aGVhZGVyKS5sYXN0aWQpOwor CXNlbV9wb3N0KCYoc2hhcmVkX2RhdGEtPm11dGV4KSk7CisJaWYgKHVucmVhZCA+IDApeworCQlj YWxsaGlzdG9yeV9lbWl0X3ZvaWNlX2hpc3RvcnlfY2hhbmdlZCh1bnJlYWQpOworCX0KKwlyZXR1 cm4gMDsKK30KKworLyoqCisgKiBDcmVhdGVzIGZpbGUgICJjYWxsaGlzdG9yeSIKKyAqLworc3Rh dGljIGdib29sZWFuIGluaXRfZmlsZSgpCit7CisJaW50IGhpc3RvcnlGaWxlOworCXN0cnVjdCBz dGF0IHN0YXRidWY7CisJRElSICpkaXJwdHI7CisJY2hhciAqZmlsbCA9IE5VTEw7CisKKwlnX3Jl dHVybl92YWxfaWZfZmFpbCgoc2hhcmVkX2RhdGEhPU5VTEwpLCBGQUxTRSk7CisKKwlpZiAoIShk aXJwdHIgPSBvcGVuZGlyKEhJU1RPUllfRklMRV9QQVRIKSkgKXsKKwkJb2Zvbm9fZGVidWcoIiVz OiBkb2VzbnQgZXhpc3QiLEhJU1RPUllfRklMRV9QQVRIKTsKKwkJaWYgKG1rZGlyKEhJU1RPUllf RklMRV9QQVRILAorCQkJCVNfSVJXWFV8U19JUkdSUHxTX0lYR1JQfFNfSVJPVEh8U19JWE9USCkg PCAwKXsKKwkJCXBlcnJvcigiRXJyb3IgY3JlYXRpbmcgY2FsbGhpc3RvcnkgZGlyIik7CisJCQly ZXR1cm4gRkFMU0U7CisJCX0KKwl9CisKKwlpZiAoKGhpc3RvcnlGaWxlID0gb3BlbiggSElTVE9S WV9GSUxFLAorCQkJCU9fUkRXUnxPX0NSRUFUfE9fQVBQRU5ELAorCQkJCVNfSVJXWFUpKQorCQkJ CTwgMCl7CisJCXBlcnJvcigiT3BlbiBmaWxlIGZhaWxlZCIpOworCQlyZXR1cm4gRkFMU0U7CisJ fQorCisJaWYgKHN0YXQoIEhJU1RPUllfRklMRSwmc3RhdGJ1ZikgPCAtMSl7CisJCXBlcnJvcigi c3RhdCBmYWlsZWQiKTsKKwkJcmV0dXJuIEZBTFNFOworCX0KKwlvZm9ub19kZWJ1Zygic3RhdCBm aWxlOiAlZCIsKGludCkgKHN0YXRidWYuc3Rfc2l6ZSkpOworCisJaWYgKHN0YXRidWYuc3Rfc2l6 ZSA9PSAwKXsKKwkJaW50IGJ5dGVzd3JpdHRlbiA9IDA7CisJCS8vd3JpdGUgaGVhZGVyIHRvIHRo ZSBmaWxlCisJCShzaGFyZWRfZGF0YS0+aGVhZGVyKS5oZWFkPUhFQURFUl9TSVpFOworCQkoc2hh cmVkX2RhdGEtPmhlYWRlcikudGFpbD0oc2hhcmVkX2RhdGEtPmhlYWRlcikuaGVhZDsKKwkJKHNo YXJlZF9kYXRhLT5oZWFkZXIpLnVucmVhZD0wOworCQlvZm9ub19kZWJ1Zygic2V0dGluZyBoZWFk OiAlZCx0YWlsOiAlZCx1bnJlYWQ6ICVkIiwKKwkJCQkJCShzaGFyZWRfZGF0YS0+aGVhZGVyKS5o ZWFkLAorCQkJCQkJKHNoYXJlZF9kYXRhLT5oZWFkZXIpLnRhaWwsCisJCQkJCQkoc2hhcmVkX2Rh dGEtPmhlYWRlcikudW5yZWFkKTsKKworCQkvLyAgZmlsbCB0aGUgZmlsZSB3aXRoIHplcm9zCisJ CW9mb25vX2RlYnVnKCJUcnlpbmcgdG8gYWxsb2NhdGUgJWQgc2l6ZSIsVE9UQUxfU0laRSk7CisJ CWZpbGwgPSAoY2hhciAqKSBnX3RyeV9tYWxsb2MwKFRPVEFMX1NJWkUpOworICAgICAgICAgCWlm ICghZmlsbCApeworICAgICAgICAgICAgIAkJb2Zvbm9fZGVidWcoIkVycm9yIGFsbG9jYXRpbmcg aW5pdCBtZW1vcnkiKTsKKyAgICAgICAgICAgICAJCXJldHVybiBGQUxTRTsKKwkJfQorICAgICAg ICAKKwkJLy8gUHJlZGVmaW5lIGZpbGUgc2l6ZSBhbmQgZmlsbCB3aXRoIHNvbWUgZGF0YQorCQli emVybyhmaWxsLFRPVEFMX1NJWkUpOworCQltZW1jcHkoZmlsbCwmKHNoYXJlZF9kYXRhLT5oZWFk ZXIpLCBIRUFERVJfU0laRSk7CisKKwkJaWYgKChieXRlc3dyaXR0ZW4gPSB3cml0ZSAoaGlzdG9y eUZpbGUsZmlsbCwgVE9UQUxfU0laRSkpIDwwKXsKKwkJCW9mb25vX2RlYnVnKCJFcnJvciB3cml0 aW5nIHRvIGZpbGUiKTsKKwkJCXJldHVybiBGQUxTRTsKKwkJfQorCQlnX2ZyZWUoZmlsbCk7CisK KwkJc3RhdGJ1Zi5zdF9zaXplID0gVE9UQUxfU0laRTsKKwkJb2Zvbm9fZGVidWcoIkhpc3Rvcnkg ZmlsZSAlZCBzaXplIGNyZWF0ZWQgXG4iLGJ5dGVzd3JpdHRlbik7CisJfQorCS8vIGNyZWF0ZSBz ZW1hcGhvcmUKKwlpZiAoaW5pdF9zZW0oKSA8IDApCisJCXJldHVybiBGQUxTRTsgCisKKwlzZW1f d2FpdCgmKHNoYXJlZF9kYXRhLT5tdXRleCkpOworCXNoYXJlZF9kYXRhLT5kYXRhTWFwID0gbW1h cCgoIGNhZGRyX3QpTlVMTCwKKwkJCQlzdGF0YnVmLnN0X3NpemUsCisJCQkJUFJPVF9SRUFEfFBS T1RfV1JJVEV8UFJPVF9FWEVDLAorCQkJCU1BUF9TSEFSRUQsCisJCQkJaGlzdG9yeUZpbGUsCisJ CQkJMCk7CisJc2VtX3Bvc3QoJihzaGFyZWRfZGF0YS0+bXV0ZXgpKTsKKwlpZiAoc2hhcmVkX2Rh dGEtPmRhdGFNYXAgPT0gKHZvaWQgKikoLTEpKXsKKwkJcGVycm9yKCJtbWFwIGZhbGllZCIpOwor CQlyZXR1cm4gRkFMU0U7CisJfQorCisJY2xvc2UoaGlzdG9yeUZpbGUpOworCisJaW5pdF9oZWFk ZXIoc2hhcmVkX2RhdGEtPmRhdGFNYXApOworCisJcmV0dXJuIFRSVUU7Cit9CisKK3N0YXRpYyB2 b2lkIHN5bmNfbWVtX2ZpbGUoVm9pY2VIaXN0b3J5ICp2Y2FsbCl7CisJdm9pZCAqd3JpdGVNYXAg PSBOVUxMOworCWludCB1bnJlYWQgPSAwOworCisJZ19yZXR1cm5faWZfZmFpbCh2Y2FsbCAhPSBO VUxMKTsKKwlnX3JldHVybl9pZl9mYWlsKHNoYXJlZF9kYXRhICE9IE5VTEwpOworCWdfcmV0dXJu X2lmX2ZhaWwoc2hhcmVkX2RhdGEtPmRhdGFNYXAgIT0gTlVMTCk7CisKKwlzZW1fd2FpdCgmKHNo YXJlZF9kYXRhLT5tdXRleCkpOworCisJd3JpdGVNYXAgPSBzaGFyZWRfZGF0YS0+ZGF0YU1hcDsK Kwl3cml0ZU1hcCA9IHdyaXRlTWFwICsgKHNoYXJlZF9kYXRhLT5oZWFkZXIpLmhlYWQ7IAorCXZj YWxsLT5pZCA9IChzaGFyZWRfZGF0YS0+aGVhZGVyKS5sYXN0aWQ7CisJKHNoYXJlZF9kYXRhLT5o ZWFkZXIpLmxhc3RpZCsrOworCW1lbWNweSh3cml0ZU1hcCwgdmNhbGwsIFJFQ09SRF9TSVpFKTsK KworCS8vIHVwZGF0ZSBoZWFkZXIKKwkoKHNoYXJlZF9kYXRhLT5oZWFkZXIpLnVucmVhZCkrKzsK Kwkoc2hhcmVkX2RhdGEtPmhlYWRlcikuaGVhZCArPSBSRUNPUkRfU0laRTsKKwlpZiAoKHNoYXJl ZF9kYXRhLT5oZWFkZXIpLmxhc3RpZCA+PSBVSU5UX01BWCkKKwkJKHNoYXJlZF9kYXRhLT5oZWFk ZXIpLmxhc3RpZCA9IDA7CisKKwl1bnJlYWQgPSAoc2hhcmVkX2RhdGEtPmhlYWRlcikudW5yZWFk OworCQorCS8vaGVhZGVyIHJlYWNoZXMgZW5kIG9mIGZpbGUKKwlpZiAoKHNoYXJlZF9kYXRhLT5o ZWFkZXIpLmhlYWQgPj0gVE9UQUxfU0laRSl7CisJCS8vcmVzZXQgaGVhZCBiYWNrIHRvIGZyb250 CisJCShzaGFyZWRfZGF0YS0+aGVhZGVyKS5oZWFkID0gSEVBREVSX1NJWkU7CisKKyAgICAgICAg CW9mb25vX2RlYnVnKCJIZWFkZXIgPSAlZCwgVGFpbD0lZCIsCisJCQkJKHNoYXJlZF9kYXRhLT5o ZWFkZXIpLmhlYWQsCisJCQkJKHNoYXJlZF9kYXRhLT5oZWFkZXIpLnRhaWwpOworCisgICAgICAg IAlpZiAodW5yZWFkID49IE1BWF9JVEVNUykKKyAgICAgICAgICAgCQlvZm9ub19lcnJvcigiTm8g b25lIHJlYWRpbmcgaGlzdG9yeSBkYXRhIik7CisgICAgCX0KKworCW1lbWNweShzaGFyZWRfZGF0 YS0+ZGF0YU1hcCwmKHNoYXJlZF9kYXRhLT5oZWFkZXIpLEhFQURFUl9TSVpFKTsKKwltc3luYyhz aGFyZWRfZGF0YS0+ZGF0YU1hcCwgVE9UQUxfU0laRSwgTVNfQVNZTkMpOworCisJc2VtX3Bvc3Qo JihzaGFyZWRfZGF0YS0+bXV0ZXgpKTsKKworCWlmICh1bnJlYWQgPiAwKQorCQljYWxsaGlzdG9y eV9lbWl0X3ZvaWNlX2hpc3RvcnlfY2hhbmdlZCh1bnJlYWQpOworICAgIAkKK30KKworLyoqCisg KiBjYWxsX2hpc3RvcnlfY2FsbF9lbmRlZDoKKyAqIG9mb25vIGNhbGxzIHRoaXMgbWV0aG9kIHdp dGggdGhlIGNhbGwgaW5mb3JtYXRpb24KKyAqLworIAorc3RhdGljIHZvaWQgY2FsbF9oaXN0b3J5 X2NhbGxfZW5kZWQoc3RydWN0IG9mb25vX2hpc3RvcnlfY29udGV4dCAqY29udGV4dCwKKwkJCQlj b25zdCBzdHJ1Y3Qgb2Zvbm9fY2FsbCAqY2FsbCwKKwkJCQl0aW1lX3Qgc3RhcnQsCisgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgIHRpbWVfdCBlbmQpCit7CisJY29uc3QgY2hhciAqZnJv bSA9ICJVbmtub3duIjsKKwlzdHJ1Y3QgdG0gdG1zdGFydCwgdG1lbmQ7CisJY2hhciBzdHRpbWVb MTI4XSwgZW5kdGltZVsxMjhdOworCWludCBmcm9tbGVuID0gMDsKKwlWb2ljZUhpc3RvcnkgdmNh bGw7CisKKwlvZm9ub19kZWJ1ZygiQ2FsbCBFbmRlZCBvbiBtb2RlbTogJXAiLCBjb250ZXh0LT5t b2RlbSk7CisKKwlpZiAoY2FsbC0+dHlwZSAhPSAwKQorCQlyZXR1cm47CisJb2Zvbm9fZGVidWco IlZvaWNlIENhbGwsICVzIiwKKwkJY2FsbC0+ZGlyZWN0aW9uID8gIkluY29taW5nIiA6ICJPdXRn b2luZyIpOworCisJaWYgKGNhbGwtPmRpcmVjdGlvbikKKwkJdmNhbGwuY2FsbHR5cGUgPSBJTkNP TUlORzsKKwllbHNlCisJCXZjYWxsLmNhbGx0eXBlID0gT1VUR09JTkc7CisKKwlpZiAoY2FsbC0+ Y2xpcF92YWxpZGl0eSA9PSAwKQorCQlmcm9tID0gcGhvbmVfbnVtYmVyX3RvX3N0cmluZygmY2Fs bC0+cGhvbmVfbnVtYmVyKTsKKwlmcm9tbGVuID0gc3RybGVuKGZyb20pOworCXN0cmNweSh2Y2Fs bC5saW5laWQsIGZyb20pOworCXZjYWxsLmxpbmVpZFtmcm9tbGVuXSA9ICdcMCc7CisKKwl2Y2Fs bC5zdGFydHRpbWUgPSBzdGFydDsKKwlnbXRpbWVfcigmc3RhcnQsICZ0bXN0YXJ0KTsKKwlzdHJm dGltZShzdHRpbWUsIDEyNywgIiVhLCAlZCAlYiAlWSAlSDolTTolUyAleiIsICZ0bXN0YXJ0KTsK KwlzdHRpbWVbMTI3XSA9ICdcMCc7CisKKwlvZm9ub19kZWJ1ZygiU3RhcnRUaW1lOiAlcyIsc3R0 aW1lKTsKKworCXZjYWxsLmVuZHRpbWUgPSBlbmQ7CisJZ210aW1lX3IoJmVuZCwgJnRtZW5kKTsK KwlzdHJmdGltZShlbmR0aW1lLCAxMjcsICIlYSwgJWQgJWIgJVkgJUg6JU06JVMgJXoiLCAmdG1l bmQpOworCWVuZHRpbWVbMTI3XSA9ICdcMCc7CisJb2Zvbm9fZGVidWcoIkVuZFRpbWU6ICVzIixl bmR0aW1lKTsKKworCXN5bmNfbWVtX2ZpbGUoJnZjYWxsKTsKK30KKworLyoqCisgKiBjYWxsX2hp c3RvcnlfY2FsbF9taXNzZWQ6CisgKiBvZm9ubyBjYWxscyB0aGlzIG1ldGhvZCB3aXRoIHRoZSBj YWxsIGluZm9ybWF0aW9uCisgKi8KK3N0YXRpYyB2b2lkIGNhbGxfaGlzdG9yeV9jYWxsX21pc3Nl ZChzdHJ1Y3Qgb2Zvbm9faGlzdG9yeV9jb250ZXh0ICpjb250ZXh0LAorCQkJCQljb25zdCBzdHJ1 Y3Qgb2Zvbm9fY2FsbCAqY2FsbCwKKwkJCQkJdGltZV90IHdoZW4pCit7CisJY29uc3QgY2hhciAq ZnJvbSA9ICJVbmtub3duIjsKKwlzdHJ1Y3QgdG0gbXRpbWU7CisJY2hhciBzdHRpbWVbMTI4XTsK KwlWb2ljZUhpc3RvcnkgdmNhbGw7CisJaW50IGZyb21sZW4gPSAwOworCisJb2Zvbm9fZGVidWco IkNhbGwgTWlzc2VkIG9uIG1vZGVtOiAlcCIsIGNvbnRleHQtPm1vZGVtKTsKKworCWlmIChjYWxs LT50eXBlICE9IDApCisJCXJldHVybjsKKworCW9mb25vX2RlYnVnKCJWb2ljZSBDYWxsLCBNaXNz ZWQiKTsKKwlvZm9ub19kZWJ1ZygiVm9pY2UgQ2FsbCwgJXMiLAorCQljYWxsLT5kaXJlY3Rpb24g PyAiSW5jb21pbmciIDogIk91dGdvaW5nIik7CisKKwl2Y2FsbC5jYWxsdHlwZSA9IE1JU1NFRDsK KworCWlmIChjYWxsLT5jbGlwX3ZhbGlkaXR5ID09IDApCisJCWZyb20gPSBwaG9uZV9udW1iZXJf dG9fc3RyaW5nKCZjYWxsLT5waG9uZV9udW1iZXIpOworCisJZnJvbWxlbiA9IHN0cmxlbihmcm9t KTsKKwlzdHJuY3B5KHZjYWxsLmxpbmVpZCwgZnJvbSAsZnJvbWxlbik7CisJdmNhbGwubGluZWlk W2Zyb21sZW5dID0gJ1wwJzsKKworCXZjYWxsLnN0YXJ0dGltZSA9IHdoZW47CisKKwlnbXRpbWVf cigmd2hlbiwgJm10aW1lKTsKKwlvZm9ub19kZWJ1ZygiRnJvbTogJXMiLCB2Y2FsbC5saW5laWQp OworCXN0cmZ0aW1lKHN0dGltZSwgMTI3LCAiJWEsICVkICViICVZICVIOiVNOiVTICV6IiwgJm10 aW1lKTsKKwlzdHRpbWVbMTI3XSA9ICdcMCc7CisJb2Zvbm9fZGVidWcoIk1pc3NlZCBUaW1lOiAl cyIsIHN0dGltZSk7CisgICAgICAgIAorCXZjYWxsLmVuZHRpbWUgPSB3aGVuOworCisJc3luY19t ZW1fZmlsZSgmdmNhbGwpOworfQorCisKKy8qIFN0YXJ0IG9mIERCdXMgc3R1ZmYgKi8KKy8qICoq KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioq KioqKioqKioqKioqKioKKyAqIEV4cG9zZSBhbiBpbnRlcmZhY2UsIHByb3BlcnRpZXMgYW5kIHNp Z25hbHMgZm9yIHF1ZXJ5aW5nIHN0b3JhZ2UgYmFja2VuZAorICogKioqKioqKioqKioqKioqKioq KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8K KyNkZWZpbmUgT0ZPTk9fQ0FMTF9ISVNUT1JZX0lOVEVSRkFDRSBPRk9OT19TRVJWSUNFIi5DYWxs SGlzdG9yeSIKKworc3RhdGljIHZvaWQgY2FsbGhpc3RvcnlfZW1pdF92b2ljZV9oaXN0b3J5X2No YW5nZWQoaW50IHVzZXJkYXRhKQoreworCWludCAqdmFsaW50ID0gJnVzZXJkYXRhOworCURCdXND b25uZWN0aW9uICpjb25uID0gb2Zvbm9fZGJ1c19nZXRfY29ubmVjdGlvbigpOworCWdfZGJ1c19l bWl0X3NpZ25hbChjb25uLAorCQlPRk9OT19NQU5BR0VSX1BBVEgsCisJCU9GT05PX0NBTExfSElT VE9SWV9JTlRFUkZBQ0UsCisJCSJWb2ljZUhpc3RvcnlDaGFuZ2VkIiwKKwkJREJVU19UWVBFX1VJ TlQzMiwKKwkJdmFsaW50LAorCQlEQlVTX1RZUEVfSU5WQUxJRCk7Cit9CisKK3N0YXRpYyBEQnVz TWVzc2FnZSAqY2FsbF9oaXN0b3J5X3NldF92b2ljZV9oaXN0b3J5X3JlYWQoREJ1c0Nvbm5lY3Rp b24gKmNvbm4sCisJCQkJCQkJREJ1c01lc3NhZ2UgKm1zZywKKwkJCQkJCQl2b2lkICp1c2VyZGF0 YSkKK3sKKwlEQnVzTWVzc2FnZSAqcmVwbHk7CisJREJ1c01lc3NhZ2VJdGVyIGl0ZXI7CisJZ19y ZXR1cm5fdmFsX2lmX2ZhaWwoKHNoYXJlZF9kYXRhIT1OVUxMKSwgTlVMTCk7CisKKwlvZm9ub19k ZWJ1ZygiUmVhZCBhY2sgcmVjZWl2ZWQiKTsKKworCXJlcGx5ID0gZGJ1c19tZXNzYWdlX25ld19t ZXRob2RfcmV0dXJuKG1zZyk7CisJaWYgKCFyZXBseSkKKwkJcmV0dXJuIE5VTEw7CisKKwlkYnVz X21lc3NhZ2VfaXRlcl9pbml0X2FwcGVuZChyZXBseSwgJml0ZXIpOworCXNlbV93YWl0KCYoc2hh cmVkX2RhdGEtPm11dGV4KSk7CisJc2hhcmVkX2RhdGEtPmhlYWRlci51bnJlYWQgPSAoc2hhcmVk X2RhdGEtPmhlYWRlcikudW5yZWFkIC0KKwkJCQkJc2hhcmVkX2RhdGEtPnRlbXBfdW5yZWFkOwor CXNoYXJlZF9kYXRhLT5oZWFkZXIudGFpbCA9IHNoYXJlZF9kYXRhLT50ZW1wX3RhaWw7CisgCisJ Ly8gd3JpdGUgdG8gZmlsZQorCW1lbWNweShzaGFyZWRfZGF0YS0+ZGF0YU1hcCwmKHNoYXJlZF9k YXRhLT5oZWFkZXIpLEhFQURFUl9TSVpFKTsKKwlzZW1fcG9zdCgmKHNoYXJlZF9kYXRhLT5tdXRl eCkpOworCW1zeW5jKHNoYXJlZF9kYXRhLT5kYXRhTWFwLFRPVEFMX1NJWkUsIE1TX0FTWU5DKTsK KwlyZXR1cm4gcmVwbHk7Cit9CisKK3N0YXRpYyB2b2lkIHJlYWRfZGF0YShWb2ljZUhpc3Rvcnkg KmRhdGEsaW50IHRlbXApCit7CisJdm9pZCAqcmVhZE1hcCA9IE5VTEw7CisJZ19yZXR1cm5faWZf ZmFpbChzaGFyZWRfZGF0YSAhPSBOVUxMKTsKKwlnX3JldHVybl9pZl9mYWlsKHNoYXJlZF9kYXRh LT5kYXRhTWFwICE9IE5VTEwpOworCisJLy8gbG9jayAKKwlzZW1fd2FpdCgmKHNoYXJlZF9kYXRh LT5tdXRleCkpOworCXJlYWRNYXAgPSBzaGFyZWRfZGF0YS0+ZGF0YU1hcCt0ZW1wOworCS8vIHJl YWQgYSBjaHVuayBpbnRvICpkYXRhCisJbWVtY3B5KGRhdGEsIHJlYWRNYXAsUkVDT1JEX1NJWkUp OworCXNoYXJlZF9kYXRhLT50ZW1wX3VucmVhZCsrOworCXNlbV9wb3N0KCYoc2hhcmVkX2RhdGEt Pm11dGV4KSk7Cit9CisKK3N0YXRpYyBEQnVzTWVzc2FnZSAqY2FsbF9oaXN0b3J5X2dldF92b2lj ZV9oaXN0b3J5KERCdXNDb25uZWN0aW9uICpjb25uLAorCQkJCQkJREJ1c01lc3NhZ2UgKm1zZywK KwkJCQkJCXZvaWQgKnVzZXJkYXRhKQoreworCURCdXNNZXNzYWdlICAgICAqcmVwbHk7CisJREJ1 c01lc3NhZ2VJdGVyICBpdGVyOworCURCdXNNZXNzYWdlSXRlciAgYXJyYXksc3RydWN0X3M7CisJ aW50IGk7CisJY2hhciAqbGluZWlkOworCVZvaWNlSGlzdG9yeSBkYXRhOworCWludCB1bnJlYWQg PSAwOworCisJcmVwbHkgPSBkYnVzX21lc3NhZ2VfbmV3X21ldGhvZF9yZXR1cm4obXNnKTsKKwor CWlmICghcmVwbHkpCisJCXJldHVybiBOVUxMOworCWdfcmV0dXJuX3ZhbF9pZl9mYWlsKHNoYXJl ZF9kYXRhIT1OVUxMLE5VTEwpOworCisJZGJ1c19tZXNzYWdlX2l0ZXJfaW5pdF9hcHBlbmQocmVw bHksICZpdGVyKTsKKworCWRidXNfbWVzc2FnZV9pdGVyX29wZW5fY29udGFpbmVyKCZpdGVyLERC VVNfVFlQRV9BUlJBWSwKKwkJCQkJREJVU19TVFJVQ1RfQkVHSU5fQ0hBUl9BU19TVFJJTkcKKwkJ CQkJREJVU19UWVBFX1VJTlQzMl9BU19TVFJJTkcKKwkJCQkJREJVU19UWVBFX1NUUklOR19BU19T VFJJTkcKKwkJCQkJREJVU19UWVBFX1VJTlQxNl9BU19TVFJJTkcKKwkJCQkJREJVU19UWVBFX0lO VDMyX0FTX1NUUklORworCQkJCQlEQlVTX1RZUEVfSU5UMzJfQVNfU1RSSU5HCisJCQkJCURCVVNf U1RSVUNUX0VORF9DSEFSX0FTX1NUUklORworCQkJCQksJmFycmF5KTsKKworCXNlbV93YWl0KCYo c2hhcmVkX2RhdGEtPm11dGV4KSk7CisJc2hhcmVkX2RhdGEtPnRlbXBfdW5yZWFkPTA7CisJc2hh cmVkX2RhdGEtPnRlbXBfdGFpbCA9IChzaGFyZWRfZGF0YS0+aGVhZGVyKS50YWlsOworCXVucmVh ZCA9IChzaGFyZWRfZGF0YS0+aGVhZGVyKS51bnJlYWQ7CisJc2VtX3Bvc3QoJihzaGFyZWRfZGF0 YS0+bXV0ZXgpKTsKKworCWZvciAoaT0wOyBpIDwgdW5yZWFkOyBpKyspeworCQlyZWFkX2RhdGEo JmRhdGEsIHNoYXJlZF9kYXRhLT50ZW1wX3RhaWwpOworCQlsaW5laWQgPSBkYXRhLmxpbmVpZDsK KwkJZGJ1c19tZXNzYWdlX2l0ZXJfb3Blbl9jb250YWluZXIoJmFycmF5LCBEQlVTX1RZUEVfU1RS VUNULE5VTEwsCisJCQkJCQkmc3RydWN0X3MpOworCQlkYnVzX21lc3NhZ2VfaXRlcl9hcHBlbmRf YmFzaWMoJnN0cnVjdF9zLCBEQlVTX1RZUEVfVUlOVDMyLAorCQkJCQkJJihkYXRhLmlkKSk7CisJ CWRidXNfbWVzc2FnZV9pdGVyX2FwcGVuZF9iYXNpYygmc3RydWN0X3MsIERCVVNfVFlQRV9TVFJJ TkcsCisJCQkJCQkmKGxpbmVpZCkpOworCQlkYnVzX21lc3NhZ2VfaXRlcl9hcHBlbmRfYmFzaWMo JnN0cnVjdF9zLCBEQlVTX1RZUEVfVUlOVDE2LAorCQkJCQkJJihkYXRhLmNhbGx0eXBlKSk7CisJ CWRidXNfbWVzc2FnZV9pdGVyX2FwcGVuZF9iYXNpYygmc3RydWN0X3MsIERCVVNfVFlQRV9JTlQz MiwKKwkJCQkJCSYoZGF0YS5zdGFydHRpbWUpKTsKKwkJZGJ1c19tZXNzYWdlX2l0ZXJfYXBwZW5k X2Jhc2ljKCZzdHJ1Y3RfcywgREJVU19UWVBFX0lOVDMyLAorCQkJCQkJJihkYXRhLmVuZHRpbWUp KTsKKwkJZGJ1c19tZXNzYWdlX2l0ZXJfY2xvc2VfY29udGFpbmVyKCZhcnJheSwgJnN0cnVjdF9z KTsKKworCQlzaGFyZWRfZGF0YS0+dGVtcF90YWlsID0gc2hhcmVkX2RhdGEtPnRlbXBfdGFpbCAr IFJFQ09SRF9TSVpFOworCisJCWlmIChzaGFyZWRfZGF0YS0+dGVtcF90YWlsID09IFRPVEFMX1NJ WkUpeworCQkJb2Zvbm9fZGVidWcgKCJFbmQgb2YgUXVldWU6ICVkIixzaGFyZWRfZGF0YS0+dGVt cF90YWlsKTsJCS8vIHJlc2V0IGJhY2sgdG8gZnJvbnQKKwkJc2hhcmVkX2RhdGEtPnRlbXBfdGFp bCA9IEhFQURFUl9TSVpFOworCQl9CisJfQorCWRidXNfbWVzc2FnZV9pdGVyX2Nsb3NlX2NvbnRh aW5lcigmaXRlciwmYXJyYXkpOworCisJcmV0dXJuIHJlcGx5OworfQorCitzdGF0aWMgR0RCdXNN ZXRob2RUYWJsZSBjYWxsX2hpc3RvcnlfbWV0aG9kc1tdID0geworCXsgIkdldFZvaWNlSGlzdG9y eSIsICIiLCAiYSh1c3FpaSkiLCBjYWxsX2hpc3RvcnlfZ2V0X3ZvaWNlX2hpc3RvcnkgfSwKKwl7 ICJTZXRWb2ljZUhpc3RvcnlSZWFkIiwgIiIsICIiLCBjYWxsX2hpc3Rvcnlfc2V0X3ZvaWNlX2hp c3RvcnlfcmVhZCB9LAorCXsgfQorfTsKKworc3RhdGljIEdEQnVzU2lnbmFsVGFibGUgY2FsbF9o aXN0b3J5X3NpZ25hbHNbXSA9IHsKKwl7ICJWb2ljZUhpc3RvcnlDaGFuZ2VkIiwidSIgfSwKKwl7 fQorfTsKKworLyogRW5kIG9mIERCdXMgc3R1ZmYgKi8KK3N0YXRpYyBzdHJ1Y3Qgb2Zvbm9faGlz dG9yeV9kcml2ZXIgY2FsbF9oaXN0b3J5X2RyaXZlciA9IHsKKwkubmFtZSA9ICJjYWxsaGlzdG9y eSIsCisJLnByb2JlID0gY2FsbF9oaXN0b3J5X3Byb2JlLAorCS5yZW1vdmUgPSBjYWxsX2hpc3Rv cnlfcmVtb3ZlLAorCS5jYWxsX2VuZGVkID0gY2FsbF9oaXN0b3J5X2NhbGxfZW5kZWQsCisJLmNh bGxfbWlzc2VkID0gY2FsbF9oaXN0b3J5X2NhbGxfbWlzc2VkLAorfTsKKworc3RhdGljIGludCBj YWxsX2hpc3RvcnlfaW5pdCh2b2lkKQoreworCURCdXNDb25uZWN0aW9uICpjb25uID0gb2Zvbm9f ZGJ1c19nZXRfY29ubmVjdGlvbigpOworCisJaWYgKCFzaGFyZWRfZGF0YSkKKwkJaWYgKCEoc2hh cmVkX2RhdGEgPSBnX3RyeV9uZXcwKFNoYXJlZERhdGEsIDEpKSkKKwkJCXJldHVybiAtRU5PTUVN OworCisKKwlpZiAoIWdfZGJ1c19yZWdpc3Rlcl9pbnRlcmZhY2UoY29ubiwKKwkJCQkJT0ZPTk9f TUFOQUdFUl9QQVRILAorCQkJCQlPRk9OT19DQUxMX0hJU1RPUllfSU5URVJGQUNFLAorCQkJCQlj YWxsX2hpc3RvcnlfbWV0aG9kcywKKwkJCQkJY2FsbF9oaXN0b3J5X3NpZ25hbHMsCisJCQkJCU5V TEwsICAgIC8qIFByb3BlcnRpZXMgKi8KKwkJCQkJc2hhcmVkX2RhdGEsICAgIC8qIFVzZXJkYXRh ICAgKi8KKwkJCQkJTlVMTCkpICAgIC8qIERlc3Ryb3kgZnVuYyAqLworICAgICAgICByZXR1cm4g LUVJTzsKKworICAgIAlpZiAoIWluaXRfZmlsZSgpKQorICAgICAgIAkJcmV0dXJuIC1FTk9FTlQ7 CisKKwlyZXR1cm4gb2Zvbm9faGlzdG9yeV9kcml2ZXJfcmVnaXN0ZXIoJmNhbGxfaGlzdG9yeV9k cml2ZXIpOworfQorCitzdGF0aWMgdm9pZCBjYWxsX2hpc3RvcnlfZXhpdCh2b2lkKQoreworCWNs ZWFuX3VwKCk7CisJb2Zvbm9faGlzdG9yeV9kcml2ZXJfdW5yZWdpc3RlcigmY2FsbF9oaXN0b3J5 X2RyaXZlcik7Cit9CisKK09GT05PX1BMVUdJTl9ERUZJTkUoY2FsbGhpc3RvcnksICJDYWxsIEhp c3RvcnkgUGx1Z2luIiwKKwkJCU9GT05PX1ZFUlNJT04sIE9GT05PX1BMVUdJTl9QUklPUklUWV9E RUZBVUxULAorCQkJY2FsbF9oaXN0b3J5X2luaXQsIGNhbGxfaGlzdG9yeV9leGl0KQotLSAKMS42 LjYuMQoK --===============9143464698279044150==--