From mboxrd@z Thu Jan 1 00:00:00 1970 From: Chris Wilson Subject: [PATCH 7/7] drm/i915/userptr: Probe vma range before gup Date: Tue, 4 Dec 2018 14:15:22 +0000 Message-ID: <20181204141522.13640-7-chris@chris-wilson.co.uk> References: <20181204141522.13640-1-chris@chris-wilson.co.uk> Mime-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: base64 Return-path: Received: from fireflyinternet.com (mail.fireflyinternet.com [109.228.58.192]) by gabe.freedesktop.org (Postfix) with ESMTPS id 3AB416E263 for ; Tue, 4 Dec 2018 14:15:40 +0000 (UTC) In-Reply-To: <20181204141522.13640-1-chris@chris-wilson.co.uk> 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 List-Id: intel-gfx@lists.freedesktop.org V2Ugd2FudCB0byBleGNsdWRlIGFueSBHR1RUIG9iamVjdHMgZnJvbSBiZWluZyBwcmVzZW50IG9u IG91ciBpbnRlcm5hbApsaXN0cyB0byBhdm9pZCB0aGUgZGVhZGxvY2sgd2UgbWF5IHJ1biBpbnRv IHdpdGggb3VyIHJlcXVpcmVtZW50IGZvcgpzdHJ1Y3RfbXV0ZXggZHVyaW5nIGludmFsaWRhdGUu IEhvd2V2ZXIsIGlmIHRoZSBndXBfZmFzdCBmYWlscywgd2UgcHV0CnRoZSB1c2VycHRyIG9udG8g dGhlIHdvcmtxdWV1ZSBhbmQgbWFyayBpdCBhcyBhY3RpdmUsIHNvIHRoYXQgd2UKcmVtZW1iZXIg dG8gc2VyaWFsaXNlIHRoZSB3b3JrZXIgdXBvbiBtbXVfaW52YWxpZGF0ZS4KCk5vdGUgdGhhdCBk ZXNwaXRlIHRoZSBwcmV2aW91cyBmaXgsIGl0IGlzIHN0aWxsIGJldHRlciB0byBhdm9pZCB0aGUK c3RydWN0X211dGV4IHJlY3Vyc2lvbiB3aGVyZSBwb3NzaWJsZSwgbGVhdmluZyB0aGUgcmVjdXJz aW9uIG9ubHkgdG8KaGFuZGxlIHRoZSBzaHJpbmtlci1lc3F1ZSBwYXRocy4KCnYyOiBIb2xkIG1t YXBfc2VtIHRvIHByZXZlbnQgbW9kaWZpY2F0aW9ucyB0byB0aGUgbW0gd2hpbGUgd2UgcHJvYmUg YW5kCmFkZCBvdXJzZWx2ZXMgdG8gdGhlIGludGVydmFsLXRyZWUgZm9yIG5vdGlmaWNpYXRpb24u CnYzOiBSZWx5IG9uIG1tYXBfc2VtIGZvciBhIHNpbXBsZXIgcGF0Y2guCnY0OiBNYXJrIHVwIHRo ZSBtbWFwX3NlbSBuZXN0aW5nCnY1OiBEb24ndCBkZWFjdGl2YXRlIG9uIC1FQUdBSU4gYXMgdGhh dCBtZWFucyB0aGUgd29ya2VyIGlzIHF1ZXVlZAp2NjogRmlnaHQgdGhlIGluZGVudGF0aW9uIGFu ZCBjaGFpbmVkIGlmLWVsc2UgZXJyb3IgaGFuZGxpbmcKdjc6IEZpZ2h0IGFnYWluLgoKQnVnemls bGE6IGh0dHBzOi8vYnVncy5mcmVlZGVza3RvcC5vcmcvc2hvd19idWcuY2dpP2lkPTEwNDIwOQpT aWduZWQtb2ZmLWJ5OiBDaHJpcyBXaWxzb24gPGNocmlzQGNocmlzLXdpbHNvbi5jby51az4KQ2M6 IFR2cnRrbyBVcnN1bGluIDx0dnJ0a28udXJzdWxpbkBpbnRlbC5jb20+CkNjOiBNaWNoYcWCIFdp bmlhcnNraSA8bWljaGFsLndpbmlhcnNraUBpbnRlbC5jb20+Ci0tLQogZHJpdmVycy9ncHUvZHJt L2k5MTUvaTkxNV9nZW1fdXNlcnB0ci5jIHwgMTU4ICsrKysrKysrKysrKysrKystLS0tLS0tLQog MSBmaWxlIGNoYW5nZWQsIDEwNiBpbnNlcnRpb25zKCspLCA1MiBkZWxldGlvbnMoLSkKCmRpZmYg LS1naXQgYS9kcml2ZXJzL2dwdS9kcm0vaTkxNS9pOTE1X2dlbV91c2VycHRyLmMgYi9kcml2ZXJz L2dwdS9kcm0vaTkxNS9pOTE1X2dlbV91c2VycHRyLmMKaW5kZXggOGIwN2ZkNDQ3MzFmLi43NDRh YTUzOGQ1ZGIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZ3B1L2RybS9pOTE1L2k5MTVfZ2VtX3VzZXJw dHIuYworKysgYi9kcml2ZXJzL2dwdS9kcm0vaTkxNS9pOTE1X2dlbV91c2VycHRyLmMKQEAgLTQz OSw3ICs0MzksNyBAQCBzdHJ1Y3QgZ2V0X3BhZ2VzX3dvcmsgewogCXN0cnVjdCB0YXNrX3N0cnVj dCAqdGFzazsKIH07CiAKLXN0YXRpYyBzdHJ1Y3Qgc2dfdGFibGUgKgorc3RhdGljIGludAogX19p OTE1X2dlbV91c2VycHRyX2FsbG9jX3BhZ2VzKHN0cnVjdCBkcm1faTkxNV9nZW1fb2JqZWN0ICpv YmosCiAJCQkgICAgICAgc3RydWN0IHBhZ2UgKipwdmVjLCBpbnQgbnVtX3BhZ2VzKQogewpAQCAt NDUwLDcgKzQ1MCw3IEBAIF9faTkxNV9nZW1fdXNlcnB0cl9hbGxvY19wYWdlcyhzdHJ1Y3QgZHJt X2k5MTVfZ2VtX29iamVjdCAqb2JqLAogCiAJc3QgPSBrbWFsbG9jKHNpemVvZigqc3QpLCBHRlBf S0VSTkVMKTsKIAlpZiAoIXN0KQotCQlyZXR1cm4gRVJSX1BUUigtRU5PTUVNKTsKKwkJcmV0dXJu IC1FTk9NRU07CiAKIGFsbG9jX3RhYmxlOgogCXJldCA9IF9fc2dfYWxsb2NfdGFibGVfZnJvbV9w YWdlcyhzdCwgcHZlYywgbnVtX3BhZ2VzLApAQCAtNDU5LDcgKzQ1OSw3IEBAIF9faTkxNV9nZW1f dXNlcnB0cl9hbGxvY19wYWdlcyhzdHJ1Y3QgZHJtX2k5MTVfZ2VtX29iamVjdCAqb2JqLAogCQkJ CQkgIEdGUF9LRVJORUwpOwogCWlmIChyZXQpIHsKIAkJa2ZyZWUoc3QpOwotCQlyZXR1cm4gRVJS X1BUUihyZXQpOworCQlyZXR1cm4gcmV0OwogCX0KIAogCXJldCA9IGk5MTVfZ2VtX2d0dF9wcmVw YXJlX3BhZ2VzKG9iaiwgc3QpOwpAQCAtNDcyLDE0ICs0NzIsMTQgQEAgX19pOTE1X2dlbV91c2Vy cHRyX2FsbG9jX3BhZ2VzKHN0cnVjdCBkcm1faTkxNV9nZW1fb2JqZWN0ICpvYmosCiAJCX0KIAog CQlrZnJlZShzdCk7Ci0JCXJldHVybiBFUlJfUFRSKHJldCk7CisJCXJldHVybiByZXQ7CiAJfQog CiAJc2dfcGFnZV9zaXplcyA9IGk5MTVfc2dfcGFnZV9zaXplcyhzdC0+c2dsKTsKIAogCV9faTkx NV9nZW1fb2JqZWN0X3NldF9wYWdlcyhvYmosIHN0LCBzZ19wYWdlX3NpemVzKTsKIAotCXJldHVy biBzdDsKKwlyZXR1cm4gMDsKIH0KIAogc3RhdGljIHZvaWQKQEAgLTUyNCwxOSArNTI0LDE0IEBA IF9faTkxNV9nZW1fdXNlcnB0cl9nZXRfcGFnZXNfd29ya2VyKHN0cnVjdCB3b3JrX3N0cnVjdCAq X3dvcmspCiAKIAltdXRleF9sb2NrKCZvYmotPm1tLmxvY2spOwogCWlmIChvYmotPnVzZXJwdHIu d29yayA9PSAmd29yay0+d29yaykgewotCQlzdHJ1Y3Qgc2dfdGFibGUgKnBhZ2VzID0gRVJSX1BU UihyZXQpOwotCiAJCWlmIChwaW5uZWQgPT0gbnBhZ2VzKSB7Ci0JCQlwYWdlcyA9IF9faTkxNV9n ZW1fdXNlcnB0cl9hbGxvY19wYWdlcyhvYmosIHB2ZWMsCi0JCQkJCQkJICAgICAgIG5wYWdlcyk7 Ci0JCQlpZiAoIUlTX0VSUihwYWdlcykpIHsKKwkJCXJldCA9IF9faTkxNV9nZW1fdXNlcnB0cl9h bGxvY19wYWdlcyhvYmosIHB2ZWMsIG5wYWdlcyk7CisJCQlpZiAoIXJldCkKIAkJCQlwaW5uZWQg PSAwOwotCQkJCXBhZ2VzID0gTlVMTDsKLQkJCX0KIAkJfQogCi0JCW9iai0+dXNlcnB0ci53b3Jr ID0gRVJSX0NBU1QocGFnZXMpOwotCQlpZiAoSVNfRVJSKHBhZ2VzKSkKKwkJb2JqLT51c2VycHRy LndvcmsgPSBFUlJfUFRSKHJldCk7CisJCWlmIChyZXQpCiAJCQlfX2k5MTVfZ2VtX3VzZXJwdHJf c2V0X2FjdGl2ZShvYmosIGZhbHNlKTsKIAl9CiAJbXV0ZXhfdW5sb2NrKCZvYmotPm1tLmxvY2sp OwpAQCAtNTQ5LDcgKzU0NCw3IEBAIF9faTkxNV9nZW1fdXNlcnB0cl9nZXRfcGFnZXNfd29ya2Vy KHN0cnVjdCB3b3JrX3N0cnVjdCAqX3dvcmspCiAJa2ZyZWUod29yayk7CiB9CiAKLXN0YXRpYyBz dHJ1Y3Qgc2dfdGFibGUgKgorc3RhdGljIGludAogX19pOTE1X2dlbV91c2VycHRyX2dldF9wYWdl c19zY2hlZHVsZShzdHJ1Y3QgZHJtX2k5MTVfZ2VtX29iamVjdCAqb2JqKQogewogCXN0cnVjdCBn ZXRfcGFnZXNfd29yayAqd29yazsKQEAgLTU3NSw3ICs1NzAsNyBAQCBfX2k5MTVfZ2VtX3VzZXJw dHJfZ2V0X3BhZ2VzX3NjaGVkdWxlKHN0cnVjdCBkcm1faTkxNV9nZW1fb2JqZWN0ICpvYmopCiAJ ICovCiAJd29yayA9IGttYWxsb2Moc2l6ZW9mKCp3b3JrKSwgR0ZQX0tFUk5FTCk7CiAJaWYgKHdv cmsgPT0gTlVMTCkKLQkJcmV0dXJuIEVSUl9QVFIoLUVOT01FTSk7CisJCXJldHVybiAtRU5PTUVN OwogCiAJb2JqLT51c2VycHRyLndvcmsgPSAmd29yay0+d29yazsKIApAQCAtNTg3LDE5ICs1ODIs ODkgQEAgX19pOTE1X2dlbV91c2VycHRyX2dldF9wYWdlc19zY2hlZHVsZShzdHJ1Y3QgZHJtX2k5 MTVfZ2VtX29iamVjdCAqb2JqKQogCUlOSVRfV09SSygmd29yay0+d29yaywgX19pOTE1X2dlbV91 c2VycHRyX2dldF9wYWdlc193b3JrZXIpOwogCXF1ZXVlX3dvcmsodG9faTkxNShvYmotPmJhc2Uu ZGV2KS0+bW0udXNlcnB0cl93cSwgJndvcmstPndvcmspOwogCi0JcmV0dXJuIEVSUl9QVFIoLUVB R0FJTik7CisJcmV0dXJuIC1FQUdBSU47CiB9CiAKLXN0YXRpYyBpbnQgaTkxNV9nZW1fdXNlcnB0 cl9nZXRfcGFnZXMoc3RydWN0IGRybV9pOTE1X2dlbV9vYmplY3QgKm9iaikKK3N0YXRpYyBpbnQK K3Byb2JlX3JhbmdlKHN0cnVjdCBtbV9zdHJ1Y3QgKm1tLCB1bnNpZ25lZCBsb25nIGFkZHIsIHVu c2lnbmVkIGxvbmcgbGVuKQoreworCWNvbnN0IHVuc2lnbmVkIGxvbmcgZW5kID0gYWRkciArIGxl bjsKKwlzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYTsKKwlpbnQgcmV0ID0gLUVGQVVMVDsKKwor CWZvciAodm1hID0gZmluZF92bWEobW0sIGFkZHIpOyB2bWE7IHZtYSA9IHZtYS0+dm1fbmV4dCkg eworCQlpZiAodm1hLT52bV9zdGFydCA+IGFkZHIpCisJCQlicmVhazsKKworCQkvKgorCQkgKiBF eGNsdWRlIGFueSBWTUEgdGhhdCBpcyBub3QgYmFja2VkIG9ubHkgYnkgc3RydWN0X3BhZ2UsIGku ZS4KKwkJICogSU8gcmVnaW9ucyB0aGF0IGluY2x1ZGUgb3VyIG93biBHR1RUIG1tYXBzLiBXZSBj YW5ub3QgaGFuZGxlCisJCSAqIHN1Y2ggcmFuZ2VzLCBhcyB3ZSBtYXkgZW5jb3VudGVyIGRlYWRs b2NrcyBhcm91bmQgb3VyCisJCSAqIHN0cnVjdF9tdXRleCBvbiBtbXVfaW52YWxpZGF0ZV9yYW5n ZS4KKwkJICovCisJCWlmICh2bWEtPnZtX2ZsYWdzICYgKFZNX1BGTk1BUCB8IFZNX01JWEVETUFQ KSkKKwkJCWJyZWFrOworCisJCWlmICh2bWEtPnZtX2VuZCA+PSBlbmQpIHsKKwkJCXJldCA9IDA7 CisJCQlicmVhazsKKwkJfQorCisJCWFkZHIgPSB2bWEtPnZtX2VuZDsKKwl9CisKKwlyZXR1cm4g cmV0OworfQorCitzdGF0aWMgaW50IHRyeV9mYXN0X2d1cChzdHJ1Y3QgZHJtX2k5MTVfZ2VtX29i amVjdCAqb2JqKQogewogCWNvbnN0IGludCBudW1fcGFnZXMgPSBvYmotPmJhc2Uuc2l6ZSA+PiBQ QUdFX1NISUZUOwotCXN0cnVjdCBtbV9zdHJ1Y3QgKm1tID0gb2JqLT51c2VycHRyLm1tLT5tbTsK IAlzdHJ1Y3QgcGFnZSAqKnB2ZWM7Ci0Jc3RydWN0IHNnX3RhYmxlICpwYWdlczsKLQlib29sIGFj dGl2ZTsKLQlpbnQgcGlubmVkOworCWludCBwaW5uZWQsIGVycjsKIAotCS8qIElmIHVzZXJzcGFj ZSBzaG91bGQgZW5naW5lZXIgdGhhdCB0aGVzZSBwYWdlcyBhcmUgcmVwbGFjZWQgaW4KKwlwdmVj ID0ga3ZtYWxsb2NfYXJyYXkobnVtX3BhZ2VzLCBzaXplb2Yoc3RydWN0IHBhZ2UgKiksCisJCQkg ICAgICBHRlBfS0VSTkVMIHwgX19HRlBfTk9SRVRSWSB8IF9fR0ZQX05PV0FSTik7CisJaWYgKCFw dmVjKSAvKiBkZWZlciB0byB3b3JrZXIgaWYgbWFsbG9jIGZhaWxzICovCisJCXJldHVybiAtRU5P TUVNOworCisJcGlubmVkID0gX19nZXRfdXNlcl9wYWdlc19mYXN0KG9iai0+dXNlcnB0ci5wdHIs CisJCQkJICAgICAgIG51bV9wYWdlcywKKwkJCQkgICAgICAgIWk5MTVfZ2VtX29iamVjdF9pc19y ZWFkb25seShvYmopLAorCQkJCSAgICAgICBwdmVjKTsKKwlpZiAocGlubmVkIDwgMCkgeworCQll cnIgPSBwaW5uZWQ7CisJCXBpbm5lZCA9IDA7CisJCWdvdG8gb3V0X3B2ZWM7CisJfQorCisJaWYg KHBpbm5lZCA8IG51bV9wYWdlcykgeworCQllcnIgPSAtRUZBVUxUOworCQlnb3RvIG91dF9waW5u ZWQ7CisJfQorCisJX19pOTE1X2dlbV91c2VycHRyX3NldF9hY3RpdmUob2JqLCB0cnVlKTsKKwor CWVyciA9IF9faTkxNV9nZW1fdXNlcnB0cl9hbGxvY19wYWdlcyhvYmosIHB2ZWMsIG51bV9wYWdl cyk7CisJaWYgKGVycikgeworCQlfX2k5MTVfZ2VtX3VzZXJwdHJfc2V0X2FjdGl2ZShvYmosIGZh bHNlKTsKKwkJZ290byBvdXRfcGlubmVkOworCX0KKworCXBpbm5lZCA9IDA7CitvdXRfcGlubmVk OgorCXJlbGVhc2VfcGFnZXMocHZlYywgcGlubmVkKTsKK291dF9wdmVjOgorCWt2ZnJlZShwdmVj KTsKKwlyZXR1cm4gZXJyOworfQorCitzdGF0aWMgaW50IGk5MTVfZ2VtX3VzZXJwdHJfZ2V0X3Bh Z2VzKHN0cnVjdCBkcm1faTkxNV9nZW1fb2JqZWN0ICpvYmopCit7CisJc3RydWN0IG1tX3N0cnVj dCAqbW0gPSBvYmotPnVzZXJwdHIubW0tPm1tOworCWludCBlcnI7CisKKwkvKgorCSAqIElmIHVz ZXJzcGFjZSBzaG91bGQgZW5naW5lZXIgdGhhdCB0aGVzZSBwYWdlcyBhcmUgcmVwbGFjZWQgaW4K IAkgKiB0aGUgdm1hIGJldHdlZW4gdXMgYmluZGluZyB0aGlzIHBhZ2UgaW50byB0aGUgR1RUIGFu ZCBjb21wbGV0aW9uCiAJICogb2YgcmVuZGVyaW5nLi4uIFRoZWlyIGxvc3MuIElmIHRoZXkgY2hh bmdlIHRoZSBtYXBwaW5nIG9mIHRoZWlyCiAJICogcGFnZXMgdGhleSBuZWVkIHRvIGNyZWF0ZSBh IG5ldyBibyB0byBwb2ludCB0byB0aGUgbmV3IHZtYS4KQEAgLTYyNCw0MCArNjg5LDI5IEBAIHN0 YXRpYyBpbnQgaTkxNV9nZW1fdXNlcnB0cl9nZXRfcGFnZXMoc3RydWN0IGRybV9pOTE1X2dlbV9v YmplY3QgKm9iaikKIAkJCXJldHVybiAtRUFHQUlOOwogCX0KIAotCXB2ZWMgPSBOVUxMOwotCXBp bm5lZCA9IDA7Ci0KIAlpZiAobW0gPT0gY3VycmVudC0+bW0pIHsKLQkJcHZlYyA9IGt2bWFsbG9j X2FycmF5KG51bV9wYWdlcywgc2l6ZW9mKHN0cnVjdCBwYWdlICopLAotCQkJCSAgICAgIEdGUF9L RVJORUwgfAotCQkJCSAgICAgIF9fR0ZQX05PUkVUUlkgfAotCQkJCSAgICAgIF9fR0ZQX05PV0FS Tik7Ci0JCWlmIChwdmVjKSAvKiBkZWZlciB0byB3b3JrZXIgaWYgbWFsbG9jIGZhaWxzICovCi0J CQlwaW5uZWQgPSBfX2dldF91c2VyX3BhZ2VzX2Zhc3Qob2JqLT51c2VycHRyLnB0ciwKLQkJCQkJ CSAgICAgICBudW1fcGFnZXMsCi0JCQkJCQkgICAgICAgIWk5MTVfZ2VtX29iamVjdF9pc19yZWFk b25seShvYmopLAotCQkJCQkJICAgICAgIHB2ZWMpOworCQllcnIgPSB0cnlfZmFzdF9ndXAob2Jq KTsKKwkJaWYgKCFlcnIpCisJCQlyZXR1cm4gMDsKIAl9CiAKLQlhY3RpdmUgPSBmYWxzZTsKLQlp ZiAocGlubmVkIDwgMCkgewotCQlwYWdlcyA9IEVSUl9QVFIocGlubmVkKTsKLQkJcGlubmVkID0g MDsKLQl9IGVsc2UgaWYgKHBpbm5lZCA8IG51bV9wYWdlcykgewotCQlwYWdlcyA9IF9faTkxNV9n ZW1fdXNlcnB0cl9nZXRfcGFnZXNfc2NoZWR1bGUob2JqKTsKLQkJYWN0aXZlID0gcGFnZXMgPT0g RVJSX1BUUigtRUFHQUlOKTsKLQl9IGVsc2UgewotCQlwYWdlcyA9IF9faTkxNV9nZW1fdXNlcnB0 cl9hbGxvY19wYWdlcyhvYmosIHB2ZWMsIG51bV9wYWdlcyk7Ci0JCWFjdGl2ZSA9ICFJU19FUlIo cGFnZXMpOwotCX0KLQlpZiAoYWN0aXZlKQotCQlfX2k5MTVfZ2VtX3VzZXJwdHJfc2V0X2FjdGl2 ZShvYmosIHRydWUpOworCS8qIGxvY2tkZXAgZG9lc24ndCB5ZXQgYXV0b21hdGljYWxseSBhbGxv dyBuZXN0aW5nIG9mIHJlYWRlcnMgKi8KKwlkb3duX3JlYWRfbmVzdGVkKCZtbS0+bW1hcF9zZW0s IFNJTkdMRV9ERVBUSF9ORVNUSU5HKTsKIAotCWlmIChJU19FUlIocGFnZXMpKQotCQlyZWxlYXNl X3BhZ2VzKHB2ZWMsIHBpbm5lZCk7Ci0Ja3ZmcmVlKHB2ZWMpOworCWVyciA9IHByb2JlX3Jhbmdl KG1tLCBvYmotPnVzZXJwdHIucHRyLCBvYmotPmJhc2Uuc2l6ZSk7CisJaWYgKGVycikKKwkJZ290 byBlcnJfdW5sb2NrOworCisJX19pOTE1X2dlbV91c2VycHRyX3NldF9hY3RpdmUob2JqLCB0cnVl KTsKKworCWVyciA9IF9faTkxNV9nZW1fdXNlcnB0cl9nZXRfcGFnZXNfc2NoZWR1bGUob2JqKTsK KwlpZiAoZXJyICE9IC1FQUdBSU4pCisJCV9faTkxNV9nZW1fdXNlcnB0cl9zZXRfYWN0aXZlKG9i aiwgZmFsc2UpOworCitlcnJfdW5sb2NrOgorCXVwX3JlYWQoJm1tLT5tbWFwX3NlbSk7CiAKLQly ZXR1cm4gUFRSX0VSUl9PUl9aRVJPKHBhZ2VzKTsKKwlyZXR1cm4gZXJyOwogfQogCiBzdGF0aWMg dm9pZAotLSAKMi4yMC4wLnJjMgoKX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19f X19fX19fX19fX18KSW50ZWwtZ2Z4IG1haWxpbmcgbGlzdApJbnRlbC1nZnhAbGlzdHMuZnJlZWRl c2t0b3Aub3JnCmh0dHBzOi8vbGlzdHMuZnJlZWRlc2t0b3Aub3JnL21haWxtYW4vbGlzdGluZm8v aW50ZWwtZ2Z4Cg==