From mboxrd@z Thu Jan 1 00:00:00 1970 From: vijay.kilari@gmail.com Subject: [RFC PATCH v1 16/21] ARM: NUMA: Extract proximity from SRAT table Date: Thu, 9 Feb 2017 21:27:08 +0530 Message-ID: <1486655834-9708-17-git-send-email-vijay.kilari@gmail.com> References: <1486655834-9708-1-git-send-email-vijay.kilari@gmail.com> Mime-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: base64 Return-path: Received: from mail6.bemta6.messagelabs.com ([193.109.254.103]) by lists.xenproject.org with esmtp (Exim 4.84_2) (envelope-from ) id 1cbr8T-0008Rp-JK for xen-devel@lists.xenproject.org; Thu, 09 Feb 2017 15:59:53 +0000 Received: by mail-pg0-f65.google.com with SMTP id 204so619393pge.2 for ; Thu, 09 Feb 2017 07:59:50 -0800 (PST) In-Reply-To: <1486655834-9708-1-git-send-email-vijay.kilari@gmail.com> List-Unsubscribe: , List-Post: List-Help: List-Subscribe: , Errors-To: xen-devel-bounces@lists.xen.org Sender: "Xen-devel" To: julien.grall@arm.com, sstabellini@kernel.org, andre.przywara@arm.com, dario.faggioli@citrix.com Cc: xen-devel@lists.xenproject.org, Vijaya Kumar K List-Id: xen-devel@lists.xenproject.org RnJvbTogVmlqYXlhIEt1bWFyIEsgPFZpamF5YS5LdW1hckBjYXZpdW0uY29tPgoKUmVnaXN0ZXIg U1JBVCBlbnRyeSBoYW5kbGVyIGZvciB0eXBlCkFDUElfU1JBVF9UWVBFX0dJQ0NfQUZGSU5JVFkg dG8gcGFyc2UgU1JBVCB0YWJsZQphbmQgZXh0cmFjdCBwcm94aW1pdHkgZm9yIGFsbCBDUFUgSURz LgoKU2lnbmVkLW9mZi1ieTogVmlqYXlhIEt1bWFyIDxWaWpheWEuS3VtYXJAY2F2aXVtLmNvbT4K LS0tCiB4ZW4vYXJjaC9hcm0vYWNwaV9udW1hLmMgIHwgNTUgKysrKysrKysrKysrKysrKysrKysr KysrKysrKysrKysrKysrKysrKysrKysrKysKIHhlbi9kcml2ZXJzL2FjcGkvbnVtYS5jICAgfCAz NyArKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrCiB4ZW4vZHJpdmVycy9hY3BpL29zbC5j ICAgIHwgIDIgKysKIHhlbi9pbmNsdWRlL2FjcGkvYWN0YmwxLmggfCAxNyArKysrKysrKysrKysr Ky0KIHhlbi9pbmNsdWRlL3hlbi9hY3BpLmggICAgfCAzOSArKysrKysrKysrKysrKysrKysrKysr KysrKysrKysrKysKIDUgZmlsZXMgY2hhbmdlZCwgMTQ5IGluc2VydGlvbnMoKyksIDEgZGVsZXRp b24oLSkKCmRpZmYgLS1naXQgYS94ZW4vYXJjaC9hcm0vYWNwaV9udW1hLmMgYi94ZW4vYXJjaC9h cm0vYWNwaV9udW1hLmMKaW5kZXggM2VlODdmMi4uZjY1OTI3NSAxMDA2NDQKLS0tIGEveGVuL2Fy Y2gvYXJtL2FjcGlfbnVtYS5jCisrKyBiL3hlbi9hcmNoL2FybS9hY3BpX251bWEuYwpAQCAtMTA1 LDYgKzEwNSw2MSBAQCBzdGF0aWMgaW50IF9faW5pdCBhY3BpX3BhcnNlX21hZHRfaGFuZGxlcihz dHJ1Y3QgYWNwaV9zdWJ0YWJsZV9oZWFkZXIgKmhlYWRlciwKICAgICByZXR1cm4gMDsKIH0KIAor LyogQ2FsbGJhY2sgZm9yIFByb3hpbWl0eSBEb21haW4gLT4gQUNQSSBwcm9jZXNzb3IgVUlEIG1h cHBpbmcgKi8KK3ZvaWQgX19pbml0IGFjcGlfbnVtYV9naWNjX2FmZmluaXR5X2luaXQoY29uc3Qg c3RydWN0IGFjcGlfc3JhdF9naWNjX2FmZmluaXR5ICpwYSkKK3sKKyAgICBpbnQgcHhtLCBub2Rl OworICAgIHU2NCBtcGlkciA9IDA7CisgICAgc3RhdGljIHUzMiBjcHVzX2luX3NyYXQ7CisKKyAg ICBpZiAoIHNyYXRfZGlzYWJsZWQoKSApCisgICAgICAgIHJldHVybjsKKworICAgIGlmICggcGEt PmhlYWRlci5sZW5ndGggPCBzaXplb2Yoc3RydWN0IGFjcGlfc3JhdF9naWNjX2FmZmluaXR5KSAp CisgICAgeworICAgICAgICBwcmludGsoWEVOTE9HX1dBUk5JTkcgIlNSQVQ6IEludmFsaWQgU1JB VCBoZWFkZXIgbGVuZ3RoOiAlZFxuIiwKKyAgICAgICAgICAgICAgIHBhLT5oZWFkZXIubGVuZ3Ro KTsKKyAgICAgICAgYmFkX3NyYXQoKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIGlm ICggIShwYS0+ZmxhZ3MgJiBBQ1BJX1NSQVRfR0lDQ19FTkFCTEVEKSApCisgICAgICAgIHJldHVy bjsKKworICAgIGlmICggY3B1c19pbl9zcmF0ID49IE5SX0NQVVMgKQorICAgIHsKKyAgICAgICAg cHJpbnRrKFhFTkxPR19XQVJOSU5HCisgICAgICAgICAgICAgICAiU1JBVDogY3B1X3RvX25vZGVf bWFwWyVkXSBpcyB0b28gc21hbGwgdG8gZml0IGFsbCBjcHVzXG4iLAorICAgICAgICAgICAgICAg TlJfQ1BVUyk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBweG0gPSBwYS0+cHJveGlt aXR5X2RvbWFpbjsKKyAgICBub2RlID0gc2V0dXBfbm9kZShweG0pOworICAgIGlmICggbm9kZSA9 PSBOVU1BX05PX05PREUgfHwgbm9kZSA+PSBNQVhfTlVNTk9ERVMgKQorICAgIHsKKyAgICAgICAg cHJpbnRrKFhFTkxPR19XQVJOSU5HICJTUkFUOiBUb28gbWFueSBwcm94aW1pdHkgZG9tYWlucyAl ZFxuIiwgcHhtKTsKKyAgICAgICAgYmFkX3NyYXQoKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0K KworICAgIG1waWRyID0gYWNwaV9nZXRfY3B1X21waWRyKHBhLT5hY3BpX3Byb2Nlc3Nvcl91aWQp OworICAgIGlmICggbXBpZHIgPT0gTVBJRFJfSU5WQUxJRCApCisgICAgeworICAgICAgICBwcmlu dGsoWEVOTE9HX1dBUk5JTkcKKyAgICAgICAgICAgICAgICJTUkFUOiBQWE0gJWQgd2l0aCBBQ1BJ IElEICVkIGhhcyBubyB2YWxpZCBNUElEUiBpbiBNQURUXG4iLAorICAgICAgICAgICAgICAgcHht LCBwYS0+YWNwaV9wcm9jZXNzb3JfdWlkKTsKKyAgICAgICAgYmFkX3NyYXQoKTsKKyAgICAgICAg cmV0dXJuOworICAgIH0KKworICAgIG5vZGVfc2V0KG5vZGUsIG51bWFfbm9kZXNfcGFyc2VkKTsK KyAgICBjcHVzX2luX3NyYXQrKzsKKyAgICBhY3BpX251bWEgPSAxOworICAgIHByaW50ayhYRU5M T0dfSU5GTyAiU1JBVDogUFhNICVkIC0+IE1QSURSIDB4JWx4IC0+IE5vZGUgJWRcbiIsCisgICAg ICAgICAgIHB4bSwgbXBpZHIsIG5vZGUpOworfQorCiB2b2lkIF9faW5pdCBhY3BpX21hcF91aWRf dG9fbXBpZHIodm9pZCkKIHsKICAgICBpbnQgaTsKZGlmZiAtLWdpdCBhL3hlbi9kcml2ZXJzL2Fj cGkvbnVtYS5jIGIveGVuL2RyaXZlcnMvYWNwaS9udW1hLmMKaW5kZXggNTBiZjlmOC4uY2UyMmU4 OCAxMDA2NDQKLS0tIGEveGVuL2RyaXZlcnMvYWNwaS9udW1hLmMKKysrIGIveGVuL2RyaXZlcnMv YWNwaS9udW1hLmMKQEAgLTI1LDkgKzI1LDExIEBACiAjaW5jbHVkZSA8eGVuL2luaXQuaD4KICNp bmNsdWRlIDx4ZW4vdHlwZXMuaD4KICNpbmNsdWRlIDx4ZW4vZXJybm8uaD4KKyNpbmNsdWRlIDx4 ZW4vbW0uaD4KICNpbmNsdWRlIDx4ZW4vYWNwaS5oPgogI2luY2x1ZGUgPHhlbi9udW1hLmg+CiAj aW5jbHVkZSA8YWNwaS9hY21hY3Jvcy5oPgorI2luY2x1ZGUgPGFzbS9tbS5oPgogCiAjZGVmaW5l IEFDUElfTlVNQQkweDgwMDAwMDAwCiAjZGVmaW5lIF9DT01QT05FTlQJQUNQSV9OVU1BCkBAIC0x MDUsNiArMTA3LDIxIEBAIHZvaWQgX19pbml0IGFjcGlfdGFibGVfcHJpbnRfc3JhdF9lbnRyeShz dHJ1Y3QgYWNwaV9zdWJ0YWJsZV9oZWFkZXIgKiBoZWFkZXIpCiAJCX0KICNlbmRpZgkJCQkvKiBB Q1BJX0RFQlVHX09VVFBVVCAqLwogCQlicmVhazsKKyAgICAgICBjYXNlIEFDUElfU1JBVF9UWVBF X0dJQ0NfQUZGSU5JVFk6CisjaWZkZWYgQUNQSV9ERUJVR19PVVRQVVQKKwkJeworCQkJc3RydWN0 IGFjcGlfc3JhdF9naWNjX2FmZmluaXR5ICpwID0KKwkJCSAgICAoc3RydWN0IGFjcGlfc3JhdF9n aWNjX2FmZmluaXR5ICopaGVhZGVyOworCQkJQUNQSV9ERUJVR19QUklOVCgoQUNQSV9EQl9JTkZP LAorCQkJCQkgICJTUkFUIFByb2Nlc3NvciAoYWNwaSBpZFsweCUwNHhdKSBpbiIKKwkJCQkJICAi IHByb3hpbWl0eSBkb21haW4gJWQgJXNcbiIsCisJCQkJCSAgcC0+YWNwaV9wcm9jZXNzb3JfdWlk LAorCQkJCQkgIHAtPnByb3hpbWl0eV9kb21haW4sCisJCQkJCSAgKHAtPmZsYWdzICYgQUNQSV9T UkFUX0dJQ0NfRU5BQkxFRCkgPworCQkJCQkgICJlbmFibGVkIiA6ICJkaXNhYmxlZCIpOworCQl9 CisjZW5kaWYgICAgICAgICAgICAgICAgICAgICAgICAgLyogQUNQSV9ERUJVR19PVVRQVVQgKi8K KyAgICAgICAgICAgICAgIGJyZWFrOwogCWRlZmF1bHQ6CiAJCXByaW50ayhLRVJOX1dBUk5JTkcg UFJFRklYCiAJCSAgICAgICAiRm91bmQgdW5zdXBwb3J0ZWQgU1JBVCBlbnRyeSAodHlwZSA9ICUj eClcbiIsCkBAIC0xODUsNiArMjAyLDI0IEBAIGludCBfX2luaXQgYWNwaV9wYXJzZV9zcmF0KHN0 cnVjdCBhY3BpX3RhYmxlX2hlYWRlciAqdGFibGUpCiAJcmV0dXJuIDA7CiB9CiAKK3N0YXRpYyBp bnQgX19pbml0CithY3BpX3BhcnNlX2dpY2NfYWZmaW5pdHkoc3RydWN0IGFjcGlfc3VidGFibGVf aGVhZGVyICpoZWFkZXIsCisJCQkgY29uc3QgdW5zaWduZWQgbG9uZyBlbmQpCit7CisJY29uc3Qg c3RydWN0IGFjcGlfc3JhdF9naWNjX2FmZmluaXR5ICpwcm9jZXNzb3JfYWZmaW5pdHkKKwkJCT0g KHN0cnVjdCBhY3BpX3NyYXRfZ2ljY19hZmZpbml0eSAqKWhlYWRlcjsKKworCWlmICghcHJvY2Vz c29yX2FmZmluaXR5KQorCQlyZXR1cm4gLUVJTlZBTDsKKworCWFjcGlfdGFibGVfcHJpbnRfc3Jh dF9lbnRyeShoZWFkZXIpOworCisJLyogbGV0IGFyY2hpdGVjdHVyZS1kZXBlbmRlbnQgcGFydCB0 byBkbyBpdCAqLworCWFjcGlfbnVtYV9naWNjX2FmZmluaXR5X2luaXQocHJvY2Vzc29yX2FmZmlu aXR5KTsKKworCXJldHVybiAwOworfQorCiBpbnQgX19pbml0CiBhY3BpX3RhYmxlX3BhcnNlX3Ny YXQoaW50IGlkLCBhY3BpX21hZHRfZW50cnlfaGFuZGxlciBoYW5kbGVyLAogCQkgICAgICB1bnNp Z25lZCBpbnQgbWF4X2VudHJpZXMpCkBAIC0yMDUsNiArMjQwLDggQEAgaW50IF9faW5pdCBhY3Bp X251bWFfaW5pdCh2b2lkKQogCQlhY3BpX3RhYmxlX3BhcnNlX3NyYXQoQUNQSV9TUkFUX1RZUEVf TUVNT1JZX0FGRklOSVRZLAogCQkJCSAgICAgIGFjcGlfcGFyc2VfbWVtb3J5X2FmZmluaXR5LAog CQkJCSAgICAgIE5SX05PREVfTUVNQkxLUyk7CisJCWFjcGlfdGFibGVfcGFyc2Vfc3JhdChBQ1BJ X1NSQVRfVFlQRV9HSUNDX0FGRklOSVRZLAorCQkJCSAgICAgIGFjcGlfcGFyc2VfZ2ljY19hZmZp bml0eSwgTlJfQ1BVUyk7CiAJfQogCiAJLyogU0xJVDogU3lzdGVtIExvY2FsaXR5IEluZm9ybWF0 aW9uIFRhYmxlICovCmRpZmYgLS1naXQgYS94ZW4vZHJpdmVycy9hY3BpL29zbC5jIGIveGVuL2Ry aXZlcnMvYWNwaS9vc2wuYwppbmRleCA3MTk5MDQ3Li43MDQ2ODE2IDEwMDY0NAotLS0gYS94ZW4v ZHJpdmVycy9hY3BpL29zbC5jCisrKyBiL3hlbi9kcml2ZXJzL2FjcGkvb3NsLmMKQEAgLTI5LDYg KzI5LDcgQEAKICNpbmNsdWRlIDx4ZW4vcGZuLmg+CiAjaW5jbHVkZSA8eGVuL3R5cGVzLmg+CiAj aW5jbHVkZSA8eGVuL2Vycm5vLmg+CisjaW5jbHVkZSA8eGVuL21tLmg+CiAjaW5jbHVkZSA8eGVu L2FjcGkuaD4KICNpbmNsdWRlIDx4ZW4vbnVtYS5oPgogI2luY2x1ZGUgPGFjcGkvYWNtYWNyb3Mu aD4KQEAgLTM5LDYgKzQwLDcgQEAKICNpbmNsdWRlIDx4ZW4vZWZpLmg+CiAjaW5jbHVkZSA8eGVu L3ZtYXAuaD4KICNpbmNsdWRlIDx4ZW4va2NvbmZpZy5oPgorI2luY2x1ZGUgPGFzbS9tbS5oPgog CiAjZGVmaW5lIF9DT01QT05FTlQJCUFDUElfT1NfU0VSVklDRVMKIEFDUElfTU9EVUxFX05BTUUo Im9zbCIpCmRpZmYgLS1naXQgYS94ZW4vaW5jbHVkZS9hY3BpL2FjdGJsMS5oIGIveGVuL2luY2x1 ZGUvYWNwaS9hY3RibDEuaAppbmRleCBlMTk5MTM2Li5iODRiZmJhIDEwMDY0NAotLS0gYS94ZW4v aW5jbHVkZS9hY3BpL2FjdGJsMS5oCisrKyBiL3hlbi9pbmNsdWRlL2FjcGkvYWN0YmwxLmgKQEAg LTk0OSw3ICs5NDksOCBAQCBlbnVtIGFjcGlfc3JhdF90eXBlIHsKIAlBQ1BJX1NSQVRfVFlQRV9D UFVfQUZGSU5JVFkgPSAwLAogCUFDUElfU1JBVF9UWVBFX01FTU9SWV9BRkZJTklUWSA9IDEsCiAJ QUNQSV9TUkFUX1RZUEVfWDJBUElDX0NQVV9BRkZJTklUWSA9IDIsCi0JQUNQSV9TUkFUX1RZUEVf UkVTRVJWRUQgPSAzCS8qIDMgYW5kIGdyZWF0ZXIgYXJlIHJlc2VydmVkICovCisJQUNQSV9TUkFU X1RZUEVfR0lDQ19BRkZJTklUWSA9IDMsCisJQUNQSV9TUkFUX1RZUEVfUkVTRVJWRUQgPSA0CS8q IDQgYW5kIGdyZWF0ZXIgYXJlIHJlc2VydmVkICovCiB9OwogCiAvKgpAQCAtMTAwNyw2ICsxMDA4 LDIwIEBAIHN0cnVjdCBhY3BpX3NyYXRfeDJhcGljX2NwdV9hZmZpbml0eSB7CiAKICNkZWZpbmUg QUNQSV9TUkFUX0NQVV9FTkFCTEVEICAgICAgICgxKQkvKiAwMDogVXNlIGFmZmluaXR5IHN0cnVj dHVyZSAqLwogCisvKiAzOiBHSUNDIEFmZmluaXR5IChBQ1BJIDUuMSkgKi8KKworc3RydWN0IGFj cGlfc3JhdF9naWNjX2FmZmluaXR5IHsKKwlzdHJ1Y3QgYWNwaV9zdWJ0YWJsZV9oZWFkZXIgaGVh ZGVyOworCXUzMiBwcm94aW1pdHlfZG9tYWluOworCXUzMiBhY3BpX3Byb2Nlc3Nvcl91aWQ7CisJ dTMyIGZsYWdzOworCXUzMiBjbG9ja19kb21haW47Cit9OworCisvKiBGbGFncyBmb3Igc3RydWN0 IGFjcGlfc3JhdF9naWNjX2FmZmluaXR5ICovCisKKyNkZWZpbmUgQUNQSV9TUkFUX0dJQ0NfRU5B QkxFRCAgICAgKDEpICAvKiAwMDogVXNlIGFmZmluaXR5IHN0cnVjdHVyZSAqLworCiAvKiBSZXNl dCB0byBkZWZhdWx0IHBhY2tpbmcgKi8KIAogI3ByYWdtYSBwYWNrKCkKZGlmZiAtLWdpdCBhL3hl bi9pbmNsdWRlL3hlbi9hY3BpLmggYi94ZW4vaW5jbHVkZS94ZW4vYWNwaS5oCmluZGV4IDMwZWMw ZWUuLjY3ZmUxYmIgMTAwNjQ0Ci0tLSBhL3hlbi9pbmNsdWRlL3hlbi9hY3BpLmgKKysrIGIveGVu L2luY2x1ZGUveGVuL2FjcGkuaApAQCAtOTIsMTAgKzkyLDQ5IEBAIHZvaWQgYWNwaV90YWJsZV9w cmludF9zcmF0X2VudHJ5IChzdHJ1Y3QgYWNwaV9zdWJ0YWJsZV9oZWFkZXIgKnNyYXQpOwogCiAv KiB0aGUgZm9sbG93aW5nIGZvdXIgZnVuY3Rpb25zIGFyZSBhcmNoaXRlY3R1cmUtZGVwZW5kZW50 ICovCiB2b2lkIGFjcGlfbnVtYV9zbGl0X2luaXQgKHN0cnVjdCBhY3BpX3RhYmxlX3NsaXQgKnNs aXQpOworI2lmIGRlZmluZWQoQ09ORklHX1g4NikKIHZvaWQgYWNwaV9udW1hX3Byb2Nlc3Nvcl9h ZmZpbml0eV9pbml0KGNvbnN0IHN0cnVjdCBhY3BpX3NyYXRfY3B1X2FmZmluaXR5ICopOwogdm9p ZCBhY3BpX251bWFfeDJhcGljX2FmZmluaXR5X2luaXQoY29uc3Qgc3RydWN0IGFjcGlfc3JhdF94 MmFwaWNfY3B1X2FmZmluaXR5ICopOwogdm9pZCBhY3BpX251bWFfbWVtb3J5X2FmZmluaXR5X2lu aXQoY29uc3Qgc3RydWN0IGFjcGlfc3JhdF9tZW1fYWZmaW5pdHkgKik7CiB2b2lkIGFjcGlfbnVt YV9hcmNoX2ZpeHVwKHZvaWQpOworc3RhdGljIGlubGluZSB2b2lkCithY3BpX251bWFfZ2ljY19h ZmZpbml0eV9pbml0KGNvbnN0IHN0cnVjdCBhY3BpX3NyYXRfZ2ljY19hZmZpbml0eSAqcGEpCit7 CisJcmV0dXJuOworfQorI2VsaWYgZGVmaW5lZChDT05GSUdfQVJNKQorc3RhdGljIGlubGluZSB2 b2lkCithY3BpX251bWFfcHJvY2Vzc29yX2FmZmluaXR5X2luaXQoY29uc3Qgc3RydWN0IGFjcGlf c3JhdF9jcHVfYWZmaW5pdHkgKmNwdV9hZmYpCit7CisJcmV0dXJuOworfQorc3RhdGljIGlubGlu ZSB2b2lkCithY3BpX251bWFfeDJhcGljX2FmZmluaXR5X2luaXQoY29uc3Qgc3RydWN0IGFjcGlf c3JhdF94MmFwaWNfY3B1X2FmZmluaXR5ICp4MmFwaWMpCit7CisJcmV0dXJuOworfQorI2lmIGRl ZmluZWQoQ09ORklHX0FDUElfTlVNQSkKK3ZvaWQgYWNwaV9udW1hX2dpY2NfYWZmaW5pdHlfaW5p dChjb25zdCBzdHJ1Y3QgYWNwaV9zcmF0X2dpY2NfYWZmaW5pdHkgKnBhKTsKK3ZvaWQgYWNwaV9u dW1hX21lbW9yeV9hZmZpbml0eV9pbml0KGNvbnN0IHN0cnVjdCBhY3BpX3NyYXRfbWVtX2FmZmlu aXR5ICopOwordm9pZCBhY3BpX251bWFfYXJjaF9maXh1cCh2b2lkKTsKKyNlbHNlCitzdGF0aWMg aW5saW5lIHZvaWQKK2FjcGlfbnVtYV9naWNjX2FmZmluaXR5X2luaXQoY29uc3Qgc3RydWN0IGFj cGlfc3JhdF9naWNjX2FmZmluaXR5ICpwYSkKK3sKKwlyZXR1cm47Cit9CitzdGF0aWMgaW5saW5l IHZvaWQKK2FjcGlfbnVtYV9tZW1vcnlfYWZmaW5pdHlfaW5pdChjb25zdCBzdHJ1Y3QgYWNwaV9z cmF0X21lbV9hZmZpbml0eSAqbWEpCit7CisJcmV0dXJuOworfQorc3RhdGljIGlubGluZSB2b2lk CithY3BpX251bWFfYXJjaF9maXh1cCh2b2lkKQoreworCXJldHVybjsKK30KKyNlbmRpZiAvKiBD T05GSUdfQUNQSV9OVU1BICovCisjZW5kaWYgLyogQ09ORklHX1g4NiAqLwogCiAjaWZkZWYgQ09O RklHX0FDUElfSE9UUExVR19DUFUKIC8qIEFyY2ggZGVwZW5kZW50IGZ1bmN0aW9ucyBmb3IgY3B1 IGhvdHBsdWcgc3VwcG9ydCAqLwotLSAKMi43LjQKCgpfX19fX19fX19fX19fX19fX19fX19fX19f X19fX19fX19fX19fX19fX19fX19fXwpYZW4tZGV2ZWwgbWFpbGluZyBsaXN0Clhlbi1kZXZlbEBs aXN0cy54ZW4ub3JnCmh0dHBzOi8vbGlzdHMueGVuLm9yZy94ZW4tZGV2ZWwK