From mboxrd@z Thu Jan 1 00:00:00 1970 From: Zhi Wang Subject: [RFC 18/29] drm/i915: gvt: vGPU configuration emulation Date: Thu, 28 Jan 2016 18:21:40 +0800 Message-ID: <1453976511-27322-19-git-send-email-zhi.a.wang@intel.com> References: <1453976511-27322-1-git-send-email-zhi.a.wang@intel.com> Mime-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: base64 Return-path: Received: from mga01.intel.com (mga01.intel.com [192.55.52.88]) by gabe.freedesktop.org (Postfix) with ESMTP id CE20C6E7FB for ; Thu, 28 Jan 2016 02:24:49 -0800 (PST) In-Reply-To: <1453976511-27322-1-git-send-email-zhi.a.wang@intel.com> List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: intel-gfx-bounces@lists.freedesktop.org Sender: "Intel-gfx" To: intel-gfx@lists.freedesktop.org, igvt-g@lists.01.org Cc: daniel.vetter@ffwll.ch, david.j.cowperthwaite@intel.com List-Id: intel-gfx@lists.freedesktop.org VGhpcyBwYXRjaCBpbnRyb2R1Y2VzIHRoZSB2R1BVIGNvbmZpZ3VyYXRpb24gc3BhY2UgaGFuZGxl cnMgYnVpbHQgb24gdGhlCmdlbmVyaWMgTVBUIGZyYW1ld29yay4KCkluIHZHUFUgY29uZmlndXJh dGlvbiBzcGFjZSBlbXVsYXRpb24sIEdWVC1nIHdpbGw6CgotIEFkanVzdCB0aGUgdHJhcHBlZCBH UEZOKEd1ZXN0IFBhZ2UgRnJhbWUgTnVtYmVyKSBvZiB2aXJ0dWFsIEdFTiBQQ0kgQkFSIDAsCndo ZW4gZ3Vlc3QgQklPUy9PUyBtb2RpZnkgdGhlIEJBUiBhZGRyZXNzLgoKLSBFbXVsYXRlIE9wUmVn aW9uIHdoZW4gZ3Vlc3QgQklPUyBjb25maWd1cmUgdGhlIE9wUmVnaW9uIDMgcGFnZXMuCgotIFBh c3MtdGhyb3VnaCBhIHBhcnQgb2YgYXBlcnR1cmUgdG8gZ3Vlc3QgYWNjb2RpbnQgdG8gdGhlIEdW VCByZXNvdXJjZSBhbGxvY2F0b3IuCgpTaWduZWQtb2ZmLWJ5OiBaaGkgV2FuZyA8emhpLmEud2Fu Z0BpbnRlbC5jb20+Ci0tLQogZHJpdmVycy9ncHUvZHJtL2k5MTUvZ3Z0L01ha2VmaWxlICAgIHwg ICAyICstCiBkcml2ZXJzL2dwdS9kcm0vaTkxNS9ndnQvY2ZnX3NwYWNlLmMgfCAxNzcgKysrKysr KysrKysrKysrKysrKysrKysrKysrKysrKysrKysKIGRyaXZlcnMvZ3B1L2RybS9pOTE1L2d2dC9j Zmdfc3BhY2UuaCB8ICAzMyArKysrKysrCiBkcml2ZXJzL2dwdS9kcm0vaTkxNS9ndnQvZ3Z0LmMg ICAgICAgfCAgIDIgKwogZHJpdmVycy9ncHUvZHJtL2k5MTUvZ3Z0L2d2dC5oICAgICAgIHwgIDEw ICsrCiBkcml2ZXJzL2dwdS9kcm0vaTkxNS9ndnQvcmVnLmggICAgICAgfCAgMTYgKysrKwogZHJp dmVycy9ncHUvZHJtL2k5MTUvZ3Z0L3V0aWxpdHkuYyAgIHwgIDkxICsrKysrKysrKysrKysrKysr KwogNyBmaWxlcyBjaGFuZ2VkLCAzMzAgaW5zZXJ0aW9ucygrKSwgMSBkZWxldGlvbigtKQogY3Jl YXRlIG1vZGUgMTAwNjQ0IGRyaXZlcnMvZ3B1L2RybS9pOTE1L2d2dC9jZmdfc3BhY2UuYwogY3Jl YXRlIG1vZGUgMTAwNjQ0IGRyaXZlcnMvZ3B1L2RybS9pOTE1L2d2dC9jZmdfc3BhY2UuaAogY3Jl YXRlIG1vZGUgMTAwNjQ0IGRyaXZlcnMvZ3B1L2RybS9pOTE1L2d2dC91dGlsaXR5LmMKCmRpZmYg LS1naXQgYS9kcml2ZXJzL2dwdS9kcm0vaTkxNS9ndnQvTWFrZWZpbGUgYi9kcml2ZXJzL2dwdS9k cm0vaTkxNS9ndnQvTWFrZWZpbGUKaW5kZXggMzYwNTM5Yy4uYTgyMWQzZCAxMDA2NDQKLS0tIGEv ZHJpdmVycy9ncHUvZHJtL2k5MTUvZ3Z0L01ha2VmaWxlCisrKyBiL2RyaXZlcnMvZ3B1L2RybS9p OTE1L2d2dC9NYWtlZmlsZQpAQCAtMSw1ICsxLDUgQEAKIEdWVF9TT1VSQ0UgOj0gZ3Z0Lm8gcGFy YW1zLm8gYXBlcnR1cmVfZ20ubyBtbWlvLm8gaGFuZGxlcnMubyBpbnN0YW5jZS5vIFwKLQkJdHJh Y2VfcG9pbnRzLm8gaW50ZXJydXB0Lm8gZ3R0Lm8gZmJfZGVjb2Rlci5vCisJCXRyYWNlX3BvaW50 cy5vIGludGVycnVwdC5vIGd0dC5vIGNmZ19zcGFjZS5vIHV0aWxpdHkubyBmYl9kZWNvZGVyLm8K IAogY2NmbGFncy15CQkJKz0gLUkkKHNyYykgLUkkKHNyYykvLi4gLVdhbGwgLVdlcnJvciAtV25v LXVudXNlZC1mdW5jdGlvbgogaTkxNV9ndnQteQkJCTo9ICQoR1ZUX1NPVVJDRSkKZGlmZiAtLWdp dCBhL2RyaXZlcnMvZ3B1L2RybS9pOTE1L2d2dC9jZmdfc3BhY2UuYyBiL2RyaXZlcnMvZ3B1L2Ry bS9pOTE1L2d2dC9jZmdfc3BhY2UuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAw Li5iZGEwZTlkCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9ncHUvZHJtL2k5MTUvZ3Z0L2Nm Z19zcGFjZS5jCkBAIC0wLDAgKzEsMTc3IEBACisvKgorICogQ29weXJpZ2h0KGMpIDIwMTEtMjAx NiBJbnRlbCBDb3Jwb3JhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBQZXJtaXNz aW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRh aW5pbmcgYQorICogY29weSBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50 YXRpb24gZmlsZXMgKHRoZSAiU29mdHdhcmUiKSwKKyAqIHRvIGRlYWwgaW4gdGhlIFNvZnR3YXJl IHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24KKyAqIHRo ZSByaWdodHMgdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRl LCBzdWJsaWNlbnNlLAorICogYW5kL29yIHNlbGwgY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5k IHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlCisgKiBTb2Z0d2FyZSBpcyBmdXJuaXNoZWQg dG8gZG8gc28sIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgorICoKKyAqIFRo ZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIChpbmNs dWRpbmcgdGhlIG5leHQKKyAqIHBhcmFncmFwaCkgc2hhbGwgYmUgaW5jbHVkZWQgaW4gYWxsIGNv cGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUKKyAqIFNvZnR3YXJlLgorICoKKyAq IFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFO WSBLSU5ELCBFWFBSRVNTIE9SCisgKiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVE IFRPIFRIRSBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSwKKyAqIEZJVE5FU1MgRk9SIEEg UEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuICBJTiBOTyBFVkVOVCBTSEFM TAorICogVEhFIEFVVEhPUlMgT1IgQ09QWVJJR0hUIEhPTERFUlMgQkUgTElBQkxFIEZPUiBBTlkg Q0xBSU0sIERBTUFHRVMgT1IgT1RIRVIKKyAqIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJ T04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HIEZST00sCisgKiBPVVQg T0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVS IERFQUxJTkdTIElOIFRIRQorICogU09GVFdBUkUuCisgKi8KKworI2luY2x1ZGUgImd2dC5oIgor CitzdGF0aWMgYm9vbCBjZmdfc2NpX3JlYWQoc3RydWN0IHZndF9kZXZpY2UgKnZndCwgdW5zaWdu ZWQgaW50IG9mZnNldCwKKwl2b2lkICpwX2RhdGEsIGludCBieXRlcykKK3sKKwlndnRfaW5mbygi W3ZndCAlZF0gUmVhZCBTQ0kgVHJpZ2dlciBSZWdpc3RlciwgYnl0ZXM9JWQgdmFsdWU9MHgleCIs CisJCQl2Z3QtPmlkLCBieXRlcywgKih1MTYqKXBfZGF0YSk7CisKKwlyZXR1cm4gdHJ1ZTsKK30K KworYm9vbCBndnRfZW11bGF0ZV9jZmdfcmVhZChzdHJ1Y3Qgdmd0X2RldmljZSAqdmd0LCB1bnNp Z25lZCBpbnQgb2Zmc2V0LCB2b2lkICpwX2RhdGEsIGludCBieXRlcykKK3sKKwlBU1NFUlQoKG9m ZnNldCArIGJ5dGVzKSA8PSBHVlRfQ0ZHX1NQQUNFX1NaKTsKKwltZW1jcHkocF9kYXRhLCAmdmd0 LT5zdGF0ZS5jZmcuc3BhY2Vbb2Zmc2V0XSwgYnl0ZXMpOworCisJLyogVE9ETzogaG9va3MgKi8K KwlvZmZzZXQgJj0gfjM7CisJc3dpdGNoIChvZmZzZXQpIHsKKwkJY2FzZSAwOgorCQljYXNlIDQ6 CisJCQlicmVhazsKKwkJY2FzZSBHVlRfUkVHX0NGR19TV1NDSV9UUklHR0VSOgorCQkJY2ZnX3Nj aV9yZWFkKHZndCwgb2Zmc2V0LCBwX2RhdGEsIGJ5dGVzKTsKKwkJCWJyZWFrOworCQlkZWZhdWx0 OgorCQkJYnJlYWs7CisJfQorCXJldHVybiB0cnVlOworfQorCitib29sIGd2dF9lbXVsYXRlX2Nm Z193cml0ZShzdHJ1Y3Qgdmd0X2RldmljZSAqdmd0LCB1bnNpZ25lZCBpbnQgb2ZmLAorCXZvaWQg KnBfZGF0YSwgaW50IGJ5dGVzKQoreworCWNoYXIgKmNmZ19zcGFjZSA9ICZ2Z3QtPnN0YXRlLmNm Zy5zcGFjZVswXTsKKwl1MzIgKmNmZ19yZWcsIG5ldzsKKwl1NjQgc2l6ZTsKKwl1OCBvbGRfY21k LCBjbWRfY2hhbmdlZDsgLyogd2UgZG9uJ3QgY2FyZSB0aGUgaGlnaCA4IGJpdHMgKi8KKwlib29s IHJjID0gdHJ1ZTsKKwl1MzIgbG93X21lbV9tYXhfZ3BmbjsKKworCUFTU0VSVCAoKG9mZiArIGJ5 dGVzKSA8PSBHVlRfQ0ZHX1NQQUNFX1NaKTsKKwljZmdfcmVnID0gKHUzMiopKGNmZ19zcGFjZSAr IChvZmYgJiB+MykpOworCXN3aXRjaCAob2ZmICYgfjMpIHsKKwkJY2FzZSBHVlRfUkVHX0NGR19W RU5ET1JfSUQ6CisJCQlsb3dfbWVtX21heF9ncGZuID0gKih1MzIgKilwX2RhdGE7CisJCQlndnRf aW5mbygibG93X21lbV9tYXhfZ3BmbjogMHgleCIsIGxvd19tZW1fbWF4X2dwZm4pOworCQkJaWYg KGJ5dGVzICE9IDQgfHwKKwkJCQlsb3dfbWVtX21heF9ncGZuID49ICgxVUwgPDwgKDMyLVBBR0Vf U0hJRlQpKSkgeworCQkJCWd2dF9lcnIoImludmFsaWQgbG93X21lbV9tYXhfZ3BmbiEiKTsKKwkJ CQlicmVhazsKKwkJCX0KKwkJCWlmICh2Z3QtPmxvd19tZW1fbWF4X2dwZm4gPT0gMCkKKwkJCQl2 Z3QtPmxvd19tZW1fbWF4X2dwZm4gPSBsb3dfbWVtX21heF9ncGZuOworCQkJYnJlYWs7CisKKwkJ Y2FzZSBHVlRfUkVHX0NGR19DT01NQU5EOgorCQkJb2xkX2NtZCA9IHZndC0+c3RhdGUuY2ZnLnNw YWNlW29mZl07CisJCQljbWRfY2hhbmdlZCA9IG9sZF9jbWQgXiAoKih1OCopcF9kYXRhKTsKKwkJ CW1lbWNweSAoJnZndC0+c3RhdGUuY2ZnLnNwYWNlW29mZl0sIHBfZGF0YSwgYnl0ZXMpOworCQkJ aWYgKGNtZF9jaGFuZ2VkICYgX1JFR0JJVF9DRkdfQ09NTUFORF9NRU1PUlkpIHsKKwkJCQlpZiAo b2xkX2NtZCAmIF9SRUdCSVRfQ0ZHX0NPTU1BTkRfTUVNT1JZKSB7CisJCQkJCSBndnRfaHZtX21h cF9hcGVydHVyZSh2Z3QsIDApOworCQkJCX0gZWxzZSB7CisJCQkJCWlmKCF2Z3QtPnN0YXRlLmNm Zy5iYXJfbWFwcGVkWzFdKSB7CisJCQkJCQlndnRfaHZtX21hcF9hcGVydHVyZSh2Z3QsIDEpOwor CQkJCQkJZ3Z0X2h2bV9zZXRfdHJhcF9hcmVhKHZndCwgMSk7CisJCQkJCX0KKwkJCQl9CisJCQl9 IGVsc2UgeworCQkJCWd2dF9kYmcoR1ZUX0RCR19DT1JFLCAibmVlZCB0byB0cmFwIHRoZSBQSU8g QkFSPyAiCisJCQkJCSJvbGRfY21kPTB4JXgsIGNtZF9jaGFuZ2VkPSUweCIsCisJCQkJCW9sZF9j bWQsIGNtZF9jaGFuZ2VkKTsKKwkJCX0KKwkJCWJyZWFrOworCQljYXNlIEdWVF9SRUdfQ0ZHX1NQ QUNFX0JBUjA6CS8qIEdUVE1NSU8gKi8KKwkJY2FzZSBHVlRfUkVHX0NGR19TUEFDRV9CQVIxOgkv KiBHTUFEUiAqLworCQljYXNlIEdWVF9SRUdfQ0ZHX1NQQUNFX0JBUjI6CS8qIElPICovCisJCQlB U1NFUlQoKGJ5dGVzID09IDQpICYmIChvZmYgJiAzKSA9PSAwKTsKKwkJCW5ldyA9ICoodTMyICop cF9kYXRhOworCQkJZ3Z0X2luZm8oIlByb2dyYW1taW5nIGJhciAweCV4IHdpdGggMHgleCIsIG9m ZiwgbmV3KTsKKwkJCXNpemUgPSB2Z3QtPnN0YXRlLmNmZy5iYXJfc2l6ZVsob2ZmIC0gR1ZUX1JF R19DRkdfU1BBQ0VfQkFSMCkvOF07CisJCQlpZiAobmV3ID09IDB4RkZGRkZGRkYpIHsKKwkJCQkv KgorCQkJCSAqIFBvd2VyLXVwIHNvZnR3YXJlIGNhbiBkZXRlcm1pbmUgaG93IG11Y2ggYWRkcmVz cworCQkJCSAqIHNwYWNlIHRoZSBkZXZpY2UgcmVxdWlyZXMgYnkgd3JpdGluZyBhIHZhbHVlIG9m CisJCQkJICogYWxsIDEncyB0byB0aGUgcmVnaXN0ZXIgYW5kIHRoZW4gcmVhZGluZyB0aGUgdmFs dWUKKwkJCQkgKiBiYWNrLiBUaGUgZGV2aWNlIHdpbGwgcmV0dXJuIDAncyBpbiBhbGwgZG9uJ3Qt Y2FyZQorCQkJCSAqIGFkZHJlc3MgYml0cy4KKwkJCQkgKi8KKwkJCQluZXcgPSBuZXcgJiB+KHNp emUtMSk7CisJCQkJaWYgKChvZmYgJiB+MykgPT0gR1ZUX1JFR19DRkdfU1BBQ0VfQkFSMSkKKwkJ CQkJZ3Z0X2h2bV9tYXBfYXBlcnR1cmUodmd0LCAwKTsKKwkJCQlpZiAoKG9mZiAmIH4zKSA9PSBH VlRfUkVHX0NGR19TUEFDRV9CQVIwKQorCQkJCQlndnRfaHZtX3NldF90cmFwX2FyZWEodmd0LCAw KTsKKwkJCQlndnRfcGNpX2Jhcl93cml0ZV8zMih2Z3QsIG9mZiwgbmV3KTsKKwkJCX0gZWxzZSB7 CisJCQkJaWYgKChvZmYgJiB+MykgPT0gR1ZUX1JFR19DRkdfU1BBQ0VfQkFSMSkKKwkJCQkJZ3Z0 X2h2bV9tYXBfYXBlcnR1cmUodmd0LCAwKTsKKwkJCQlpZiAoKG9mZiAmIH4zKSA9PSBHVlRfUkVH X0NGR19TUEFDRV9CQVIwKQorCQkJCQlndnRfaHZtX3NldF90cmFwX2FyZWEodmd0LCAwKTsKKwkJ CQlndnRfcGNpX2Jhcl93cml0ZV8zMih2Z3QsIG9mZiwgbmV3KTsKKwkJCQlpZiAoKG9mZiAmIH4z KSA9PSBHVlRfUkVHX0NGR19TUEFDRV9CQVIxKQorCQkJCQlndnRfaHZtX21hcF9hcGVydHVyZSh2 Z3QsIDEpOworCQkJCWlmICgob2ZmICYgfjMpID09IEdWVF9SRUdfQ0ZHX1NQQUNFX0JBUjApCisJ CQkJCWd2dF9odm1fc2V0X3RyYXBfYXJlYSh2Z3QsIDEpOworCQkJfQorCQkJYnJlYWs7CisKKwkJ Y2FzZSBHVlRfUkVHX0NGR19TUEFDRV9NU0FDOgorCQkJZ3Z0X2luZm8oIkd1ZXN0IHdyaXRlIE1T QUMgJXgsICVkOiBOb3Qgc3VwcG9ydGVkIHlldCIsCisJCQkJCSooY2hhciAqKXBfZGF0YSwgYnl0 ZXMpOworCQkJYnJlYWs7CisKKwkJY2FzZSBHVlRfUkVHX0NGR19TUEFDRV9CQVIxKzQ6CisJCWNh c2UgR1ZUX1JFR19DRkdfU1BBQ0VfQkFSMCs0OgorCQljYXNlIEdWVF9SRUdfQ0ZHX1NQQUNFX0JB UjIrNDoKKwkJCUFTU0VSVCgoYnl0ZXMgPT0gNCkgJiYgKG9mZiAmIDMpID09IDApOworCQkJbmV3 ID0gKih1MzIgKilwX2RhdGE7CisJCQlndnRfaW5mbygiUHJvZ3JhbW1pbmcgYmFyIDB4JXggd2l0 aCAweCV4Iiwgb2ZmLCBuZXcpOworCQkJc2l6ZSA9IHZndC0+c3RhdGUuY2ZnLmJhcl9zaXplWyhv ZmYgLSAoR1ZUX1JFR19DRkdfU1BBQ0VfQkFSMCArIDQpKS84XTsKKwkJCS8qIGZvciAzMmJpdCBt b2RlIGJhciBpdCByZXR1cm5zIGFsbC0wIGluIHVwcGVyIDMyIGJpdCwgZm9yIDY0Yml0CisJCQkg KiBtb2RlIGJhciBpdCB3aWxsIGNhbGN1bGF0ZSB0aGUgc2l6ZSB3aXRoIGxvd2VyIDMyYml0IGFu ZCByZXR1cm4KKwkJCSAqIHRoZSBjb3JyZXNwb25kaW5nIHZhbHVlCisJCQkgKi8KKwkJCWlmIChu ZXcgPT0gMHhGRkZGRkZGRikgeworCQkJCWlmIChHVlRfR0VUX0JJVFMoKihjZmdfc3BhY2UgKyBv ZmYgLSA0KSwgMiwgMSkgPT0gMikKKwkJCQkJbmV3ICY9IH4oc2l6ZS0xKSA+PiAzMjsKKwkJCQll bHNlCisJCQkJCW5ldyA9IDA7CisJCQkJKmNmZ19yZWcgPSBuZXc7CisJCQl9IGVsc2UgeworCQkJ CWlmICgob2ZmICYgfjMpID09IEdWVF9SRUdfQ0ZHX1NQQUNFX0JBUjEgKyA0KQorCQkJCQlndnRf aHZtX21hcF9hcGVydHVyZSh2Z3QsIDApOworCQkJCWlmICgob2ZmICYgfjMpID09IEdWVF9SRUdf Q0ZHX1NQQUNFX0JBUjAgKyA0KQorCQkJCQlndnRfaHZtX3NldF90cmFwX2FyZWEodmd0LCAwKTsK KwkJCQkqY2ZnX3JlZyA9IG5ldzsKKwkJCQlpZiAoKG9mZiAmIH4zKSA9PSBHVlRfUkVHX0NGR19T UEFDRV9CQVIxICsgNCkKKwkJCQkJZ3Z0X2h2bV9tYXBfYXBlcnR1cmUodmd0LCAxKTsKKwkJCQlp ZiAoKG9mZiAmIH4zKSA9PSBHVlRfUkVHX0NGR19TUEFDRV9CQVIwICsgNCkKKwkJCQkJZ3Z0X2h2 bV9zZXRfdHJhcF9hcmVhKHZndCwgMSk7CisJCQl9CisJCQlicmVhazsKKworCQljYXNlIDB4OTA6 CisJCWNhc2UgMHg5NDoKKwkJY2FzZSAweDk4OgorCQkJZ3Z0X2luZm8oIndyaXRlIHRvIE1TSSBj YXBhKCV4KSB3aXRoIHZhbCAoJXgpIiwgb2ZmLCAqKHUzMiAqKXBfZGF0YSk7CisJCWRlZmF1bHQ6 CisJCQltZW1jcHkoJnZndC0+c3RhdGUuY2ZnLnNwYWNlW29mZl0sIHBfZGF0YSwgYnl0ZXMpOwor CQkJYnJlYWs7CisJfQorCXJldHVybiByYzsKK30KZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2Ry bS9pOTE1L2d2dC9jZmdfc3BhY2UuaCBiL2RyaXZlcnMvZ3B1L2RybS9pOTE1L2d2dC9jZmdfc3Bh Y2UuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42ZDkzMDFiCi0tLSAvZGV2 L251bGwKKysrIGIvZHJpdmVycy9ncHUvZHJtL2k5MTUvZ3Z0L2NmZ19zcGFjZS5oCkBAIC0wLDAg KzEsMzMgQEAKKy8qCisgKiBDb3B5cmlnaHQoYykgMjAxMS0yMDE2IEludGVsIENvcnBvcmF0aW9u LiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50 ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhCisgKiBjb3B5IG9m IHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlICJT b2Z0d2FyZSIpLAorICogdG8gZGVhbCBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlv biwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbgorICogdGhlIHJpZ2h0cyB0byB1c2UsIGNv cHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsCisgKiBh bmQvb3Igc2VsbCBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNvbnMg dG8gd2hvbSB0aGUKKyAqIFNvZnR3YXJlIGlzIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0 byB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CisgKgorICogVGhlIGFib3ZlIGNvcHlyaWdodCBu b3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgKGluY2x1ZGluZyB0aGUgbmV4dAorICog cGFyYWdyYXBoKSBzaGFsbCBiZSBpbmNsdWRlZCBpbiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFs IHBvcnRpb25zIG9mIHRoZQorICogU29mdHdhcmUuCisgKgorICogVEhFIFNPRlRXQVJFIElTIFBS T1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MgT1IK KyAqIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMg T0YgTUVSQ0hBTlRBQklMSVRZLAorICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0Ug QU5EIE5PTklORlJJTkdFTUVOVC4gIElOIE5PIEVWRU5UIFNIQUxMCisgKiBUSEUgQVVUSE9SUyBP UiBDT1BZUklHSFQgSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBP VEhFUgorICogTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9S VCBPUiBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSwKKyAqIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9O IFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU4gVEhFCisg KiBTT0ZUV0FSRS4KKyAqLworCisjaWZuZGVmIF9fR1ZUX0NGR19TUEFDRV9IX18KKyNkZWZpbmUg X19HVlRfQ0ZHX1NQQUNFX0hfXworCitib29sIGd2dF9lbXVsYXRlX2NmZ19yZWFkKHN0cnVjdCB2 Z3RfZGV2aWNlICp2Z3QsCisJdW5zaWduZWQgaW50IG9mZnNldCwgdm9pZCAqcF9kYXRhLCBpbnQg Ynl0ZXMpOworCitib29sIGd2dF9lbXVsYXRlX2NmZ193cml0ZShzdHJ1Y3Qgdmd0X2RldmljZSAq dmd0LAorCXVuc2lnbmVkIGludCBvZmZzZXQsIHZvaWQgKnBfZGF0YSwgaW50IGJ5dGVzKTsKKwor I2VuZGlmCmRpZmYgLS1naXQgYS9kcml2ZXJzL2dwdS9kcm0vaTkxNS9ndnQvZ3Z0LmMgYi9kcml2 ZXJzL2dwdS9kcm0vaTkxNS9ndnQvZ3Z0LmMKaW5kZXggMjhhNTFkOS4uMzI4NTNiMiAxMDA2NDQK LS0tIGEvZHJpdmVycy9ncHUvZHJtL2k5MTUvZ3Z0L2d2dC5jCisrKyBiL2RyaXZlcnMvZ3B1L2Ry bS9pOTE1L2d2dC9ndnQuYwpAQCAtMzYsNiArMzYsOCBAQCBleHRlcm4gc3RydWN0IGd2dF9rZXJu ZWxfZG0ga3ZtZ3Rfa2RtOwogc3RhdGljIHN0cnVjdCBndnRfaW9fZW11bGF0aW9uX29wcyBkZWZh dWx0X2lvX2VtdWxhdGlvbl9vcHMgPSB7CiAJLmVtdWxhdGVfbW1pb19yZWFkID0gZ3Z0X2VtdWxh dGVfbW1pb19yZWFkLAogCS5lbXVsYXRlX21taW9fd3JpdGUgPSBndnRfZW11bGF0ZV9tbWlvX3dy aXRlLAorCS5lbXVsYXRlX2NmZ19yZWFkID0gZ3Z0X2VtdWxhdGVfY2ZnX3JlYWQsCisJLmVtdWxh dGVfY2ZnX3dyaXRlID0gZ3Z0X2VtdWxhdGVfY2ZnX3dyaXRlLAogfTsKIAogdW5zaWduZWQgaW50 IHBhX3RvX21taW9fb2Zmc2V0KHN0cnVjdCB2Z3RfZGV2aWNlICp2Z3QsCmRpZmYgLS1naXQgYS9k cml2ZXJzL2dwdS9kcm0vaTkxNS9ndnQvZ3Z0LmggYi9kcml2ZXJzL2dwdS9kcm0vaTkxNS9ndnQv Z3Z0LmgKaW5kZXggODNmOTBhMi4uMjQ0ZDg3NjQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZ3B1L2Ry bS9pOTE1L2d2dC9ndnQuaAorKysgYi9kcml2ZXJzL2dwdS9kcm0vaTkxNS9ndnQvZ3Z0LmgKQEAg LTM2LDYgKzM2LDcgQEAKICNpbmNsdWRlICJpbnRlcnJ1cHQuaCIKICNpbmNsdWRlICJwZXJmLmgi CiAjaW5jbHVkZSAiZ3R0LmgiCisjaW5jbHVkZSAiY2ZnX3NwYWNlLmgiCiAKICNkZWZpbmUgR1ZU X01BWF9WR1BVIDgKIApAQCAtOTksNiArMTAwLDcgQEAgc3RydWN0IGd2dF92aXJ0dWFsX2NmZ19z dGF0ZSB7CiAJdW5zaWduZWQgY2hhciBzcGFjZVtHVlRfQ0ZHX1NQQUNFX1NaXTsKIAlib29sIGJh cl9tYXBwZWRbR1ZUX0JBUl9OVU1dOwogCXU2NCBiYXJfc2l6ZVtHVlRfQkFSX05VTV07CisJdm9p ZCAqb3ByZWdpb25fdmE7CiB9OwogCiBzdHJ1Y3QgZ3Z0X3ZpcnR1YWxfZ21fc3RhdGUgewpAQCAt NjAwLDYgKzYwMiwxNCBAQCBzdGF0aWMgaW5saW5lIHUzMiBoMmdfZ3R0X2luZGV4KHN0cnVjdCB2 Z3RfZGV2aWNlICp2Z3QsIHVpbnQzMl90IGhfaW5kZXgpCiAJcmV0dXJuICh1MzIpKGgyZ19nbSh2 Z3QsIGhfYWRkcikgPj4gR1RUX1BBR0VfU0hJRlQpOwogfQogCisvKiBnZXQgdGhlIGJpdHMgaGln aDpsb3cgb2YgdGhlIGRhdGEsIGhpZ2ggYW5kIGxvdyBpcyBzdGFydGluZyBmcm9tIHplcm8qLwor I2RlZmluZSBHVlRfR0VUX0JJVFMoZGF0YSwgaGlnaCwgbG93KSAgICgoKGRhdGEpICYgKCgxIDw8 ICgoaGlnaCkgKyAxKSkgLSAxKSkgPj4gKGxvdykpCisvKiBnZXQgb25lIGJpdCBvZiB0aGUgZGF0 YSwgYml0IGlzIHN0YXJ0aW5nIGZyb20gemVvciAqLworI2RlZmluZSBHVlRfR0VUX0JJVChkYXRh LCBiaXQpICAgICAgICAgIEdWVF9HRVRfQklUUyhkYXRhLCBiaXQsIGJpdCkKKworaW50IGd2dF9o dm1fbWFwX2FwZXJ0dXJlKHN0cnVjdCB2Z3RfZGV2aWNlICp2Z3QsIGludCBtYXApOworaW50IGd2 dF9odm1fc2V0X3RyYXBfYXJlYShzdHJ1Y3Qgdmd0X2RldmljZSAqdmd0LCBpbnQgbWFwKTsKKwog I2luY2x1ZGUgIm1wdC5oIgogCiAjZW5kaWYKZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2RybS9p OTE1L2d2dC9yZWcuaCBiL2RyaXZlcnMvZ3B1L2RybS9pOTE1L2d2dC9yZWcuaAppbmRleCAwZTI4 YTcxLi4zZmI0NDk1IDEwMDY0NAotLS0gYS9kcml2ZXJzL2dwdS9kcm0vaTkxNS9ndnQvcmVnLmgK KysrIGIvZHJpdmVycy9ncHUvZHJtL2k5MTUvZ3Z0L3JlZy5oCkBAIC00OCw2ICs0OCwyMiBAQAog I2RlZmluZSBfUkVHQklUX0NGR19TV1NDSV9TQ0lfVFJJR0dFUiAgICAgICAgICAgMQogI2RlZmlu ZSBHVlRfUkVHX0NGR19PUFJFR0lPTiAgICAgICAgICAgICAgICAgICAgMHhGQwogCisjZGVmaW5l IEdWVF9PUFJFR0lPTl9QQUdFUyAgICAgICAgICAgICAgICAgICAgICAyCisjZGVmaW5lIEdWVF9P UFJFR0lPTl9QT1JERVIgICAgICAgICAgICAgICAgICAgICAxCisjZGVmaW5lIEdWVF9PUFJFR0lP Tl9TSVpFICAgICAgICAgICAgICAgICAgICAgICAoOCAqIDEwMjQpCisjZGVmaW5lIEdWVF9PUFJF R0lPTl9SRUdfQ0xJRCAgICAgICAgICAgICAgICAgICAweDFBQworI2RlZmluZSBHVlRfT1BSRUdJ T05fUkVHX1NDSUMgICAgICAgICAgICAgICAgICAgMHgyMDAKKyNkZWZpbmUgX1JFR0JJVF9PUFJF R0lPTl9TQ0lDX0ZVTkNfTUFTSyAgICAgICAgIDB4MUUKKyNkZWZpbmUgX1JFR0JJVF9PUFJFR0lP Tl9TQ0lDX0ZVTkNfU0hJRlQgICAgICAgIDEKKyNkZWZpbmUgX1JFR0JJVF9PUFJFR0lPTl9TQ0lD X1NVQkZVTkNfTUFTSyAgICAgIDB4RkYwMAorI2RlZmluZSBfUkVHQklUX09QUkVHSU9OX1NDSUNf U1VCRlVOQ19TSElGVCAgICAgOAorI2RlZmluZSBfUkVHQklUX09QUkVHSU9OX1NDSUNfRVhJVF9N QVNLICAgICAgICAgMHhFMAorI2RlZmluZSBHVlRfT1BSRUdJT05fU0NJQ19GX0dFVEJJT1NEQVRB ICAgICAgICAgNAorI2RlZmluZSBHVlRfT1BSRUdJT05fU0NJQ19GX0dFVEJJT1NDQUxMQkFDS1Mg ICAgNgorI2RlZmluZSBHVlRfT1BSRUdJT05fU0NJQ19TRl9TVVBQUlRFRENBTExTICAgICAgMAor I2RlZmluZSBHVlRfT1BSRUdJT05fU0NJQ19TRl9SRVFFVVNURURDQUxMQkFDS1MgMQorI2RlZmlu ZSBHVlRfT1BSRUdJT05fUkVHX1BBUk0JCQkweDIwNAorCiAjZGVmaW5lIF9SRUdfR01DSF9DT05U Uk9MICAgICAgICAgICAgICAgMHg1MAogI2RlZmluZSAgICBfUkVHQklUX0JEV19HTUNIX0dNU19T SElGVCAgIDgKICNkZWZpbmUgICAgX1JFR0JJVF9CRFdfR01DSF9HTVNfTUFTSyAgICAweGZmCmRp ZmYgLS1naXQgYS9kcml2ZXJzL2dwdS9kcm0vaTkxNS9ndnQvdXRpbGl0eS5jIGIvZHJpdmVycy9n cHUvZHJtL2k5MTUvZ3Z0L3V0aWxpdHkuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAw MDAwLi5lNWU1MTgzCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9ncHUvZHJtL2k5MTUvZ3Z0 L3V0aWxpdHkuYwpAQCAtMCwwICsxLDkxIEBACisvKgorICogQ29weXJpZ2h0KGMpIDIwMTEtMjAx NiBJbnRlbCBDb3Jwb3JhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBQZXJtaXNz aW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRh aW5pbmcgYQorICogY29weSBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50 YXRpb24gZmlsZXMgKHRoZSAiU29mdHdhcmUiKSwKKyAqIHRvIGRlYWwgaW4gdGhlIFNvZnR3YXJl IHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24KKyAqIHRo ZSByaWdodHMgdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRl LCBzdWJsaWNlbnNlLAorICogYW5kL29yIHNlbGwgY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5k IHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlCisgKiBTb2Z0d2FyZSBpcyBmdXJuaXNoZWQg dG8gZG8gc28sIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgorICoKKyAqIFRo ZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIChpbmNs dWRpbmcgdGhlIG5leHQKKyAqIHBhcmFncmFwaCkgc2hhbGwgYmUgaW5jbHVkZWQgaW4gYWxsIGNv cGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUKKyAqIFNvZnR3YXJlLgorICoKKyAq IFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFO WSBLSU5ELCBFWFBSRVNTIE9SCisgKiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVE IFRPIFRIRSBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSwKKyAqIEZJVE5FU1MgRk9SIEEg UEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuICBJTiBOTyBFVkVOVCBTSEFM TAorICogVEhFIEFVVEhPUlMgT1IgQ09QWVJJR0hUIEhPTERFUlMgQkUgTElBQkxFIEZPUiBBTlkg Q0xBSU0sIERBTUFHRVMgT1IgT1RIRVIKKyAqIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJ T04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HIEZST00sCisgKiBPVVQg T0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVS IERFQUxJTkdTIElOIFRIRQorICogU09GVFdBUkUuCisgKi8KKworI2luY2x1ZGUgImd2dC5oIgor CitpbnQgZ3Z0X2h2bV9tYXBfYXBlcnR1cmUoc3RydWN0IHZndF9kZXZpY2UgKnZndCwgaW50IG1h cCkKK3sKKwljaGFyICpjZmdfc3BhY2UgPSAmdmd0LT5zdGF0ZS5jZmcuc3BhY2VbMF07CisJdWlu dDY0X3QgYmFyX3M7CisJaW50IHIsIG5yX21mbnM7CisJdW5zaWduZWQgbG9uZyBmaXJzdF9nZm4s IGZpcnN0X21mbjsKKworCWlmICghZ3Z0X3BjaV9tbWlvX2lzX2VuYWJsZWQodmd0KSkKKwkJcmV0 dXJuIDA7CisKKwkvKiBndWFyYW50ZWUgdGhlIHNlcXVlbmNlIG9mIG1hcCAtPiB1bm1hcCAtPiBt YXAgLT4gdW5tYXAgKi8KKwlpZiAobWFwID09IHZndC0+c3RhdGUuY2ZnLmJhcl9tYXBwZWRbMV0p CisJCXJldHVybiAwOworCisJY2ZnX3NwYWNlICs9IEdWVF9SRUdfQ0ZHX1NQQUNFX0JBUjE7CS8q IEFQRVJUVVIgKi8KKwlpZiAoR1ZUX0dFVF9CSVRTKCpjZmdfc3BhY2UsIDIsIDEpID09IDIpewor CQkvKiA2NCBiaXRzIE1NSU8gYmFyICovCisJCWJhcl9zID0gKiAodWludDY0X3QgKikgY2ZnX3Nw YWNlOworCX0gZWxzZSB7CisJCS8qIDMyIGJpdHMgTU1JTyBiYXIgKi8KKwkJYmFyX3MgPSAqICh1 aW50MzJfdCopIGNmZ19zcGFjZTsKKwl9CisKKwlmaXJzdF9nZm4gPSAoYmFyX3MgKyBndnRfYXBl cnR1cmVfb2Zmc2V0KHZndCkpID4+IFBBR0VfU0hJRlQ7CisJZmlyc3RfbWZuID0gZ3Z0X2FwZXJ0 dXJlX2Jhc2Uodmd0KSA+PiBQQUdFX1NISUZUOworCW5yX21mbnMgPSBndnRfYXBlcnR1cmVfc3oo dmd0KSA+PiBQQUdFX1NISUZUOworCisJcHJpbnRrKCIlczogZG9taWQ9JWQgZ2ZuX3M9MHglbHgg bWZuX3M9MHglbHggbnJfbWZucz0weCV4XG4iLCBtYXA9PTA/ICJyZW1vdmVfbWFwIjoiYWRkX21h cCIsCisJCXZndC0+dm1faWQsIGZpcnN0X2dmbiwgZmlyc3RfbWZuLCBucl9tZm5zKTsKKworCXIg PSBoeXBlcnZpc29yX21hcF9tZm5fdG9fZ3Bmbih2Z3QsIGZpcnN0X2dmbiwgZmlyc3RfbWZuLAor CQlucl9tZm5zLCBtYXAsIEdWVF9NQVBfQVBFUlRVUkUpOworCisJaWYgKHIgIT0gMCkKKwkJcHJp bnRrKEtFUk5fRVJSICJndnRfaHZtX21hcF9hcGVydHVyZSBmYWlsIHdpdGggJWQhXG4iLCByKTsK KwllbHNlCisJCXZndC0+c3RhdGUuY2ZnLmJhcl9tYXBwZWRbMV0gPSBtYXA7CisKKwlyZXR1cm4g cjsKK30KKworLyoKKyAqIFphcCB0aGUgR1RUTU1JTyBiYXIgYXJlYSBmb3IgdkdUIHRyYXAgYW5k IGVtdWxhdGlvbi4KKyAqLworaW50IGd2dF9odm1fc2V0X3RyYXBfYXJlYShzdHJ1Y3Qgdmd0X2Rl dmljZSAqdmd0LCBpbnQgbWFwKQoreworCWNoYXIgKmNmZ19zcGFjZSA9ICZ2Z3QtPnN0YXRlLmNm Zy5zcGFjZVswXTsKKwl1aW50NjRfdCBiYXJfcywgYmFyX2U7CisKKwlpZiAoIWd2dF9wY2lfbW1p b19pc19lbmFibGVkKHZndCkpCisJCXJldHVybiAwOworCisJY2ZnX3NwYWNlICs9IEdWVF9SRUdf Q0ZHX1NQQUNFX0JBUjA7CisJaWYgKEdWVF9HRVRfQklUUygqY2ZnX3NwYWNlLCAyLCAxKSA9PSAy KSB7CisJCS8qIDY0IGJpdHMgTU1JTyBiYXIgKi8KKwkJYmFyX3MgPSAqICh1aW50NjRfdCAqKSBj Zmdfc3BhY2U7CisJfSBlbHNlIHsKKwkJLyogMzIgYml0cyBNTUlPIGJhciAqLworCQliYXJfcyA9 ICogKHVpbnQzMl90KikgY2ZnX3NwYWNlOworCX0KKworCWJhcl9zICY9IH4weEY7IC8qIGNsZWFy IHRoZSBMU0IgNCBiaXRzICovCisJYmFyX2UgPSBiYXJfcyArIHZndC0+c3RhdGUuY2ZnLmJhcl9z aXplWzBdIC0gMTsKKworCXJldHVybiBoeXBlcnZpc29yX3NldF90cmFwX2FyZWEodmd0LCBiYXJf cywgYmFyX2UsIG1hcCk7Cit9Ci0tIAoxLjkuMQoKX19fX19fX19fX19fX19fX19fX19fX19fX19f X19fX19fX19fX19fX19fX19fX18KSW50ZWwtZ2Z4IG1haWxpbmcgbGlzdApJbnRlbC1nZnhAbGlz dHMuZnJlZWRlc2t0b3Aub3JnCmh0dHA6Ly9saXN0cy5mcmVlZGVza3RvcC5vcmcvbWFpbG1hbi9s aXN0aW5mby9pbnRlbC1nZngK