From mboxrd@z Thu Jan 1 00:00:00 1970 From: Dave Gordon Subject: [PATCH v7 6/7] drm/i915: refactor duplicate object vmap functions (the final rework?) Date: Tue, 1 Mar 2016 16:33:58 +0000 Message-ID: <1456850039-25856-7-git-send-email-david.s.gordon@intel.com> References: <1456850039-25856-1-git-send-email-david.s.gordon@intel.com> Mime-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: base64 Return-path: Received: from mga03.intel.com (mga03.intel.com [134.134.136.65]) by gabe.freedesktop.org (Postfix) with ESMTP id 118706E6D9 for ; Tue, 1 Mar 2016 16:34:27 +0000 (UTC) In-Reply-To: <1456850039-25856-1-git-send-email-david.s.gordon@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 List-Id: intel-gfx@lists.freedesktop.org VGhpcyBpcyBlc3NlbnRpYWxseSBDaHJpcyBXaWxzb24ncyBwYXRjaCBvZiBhIHNpbWlsYXIgbmFt ZSwgcmV3b3JrZWQgb24KdG9wIG9mIEFsZXggRGFpJ3MgcmVjZW50IHBhdGNoOgp8IGRybS9pOTE1 OiBBZGQgaTkxNV9nZW1fb2JqZWN0X3ZtYXAgdG8gbWFwIEdFTSBvYmplY3QgdG8gdmlydHVhbCBz cGFjZQoKQ2hyaXMnIG9yaWdpbmFsIGNvbW1lbnRhcnkgc2FpZDoKfCBXZSBub3cgaGF2ZSB0d28g aW1wbGVtZW50YXRpb25zIGZvciB2bWFwcGluZyBhIHdob2xlIG9iamVjdCwgb25lIGZvcgp8IGRt YS1idWYgYW5kIG9uZSBmb3IgdGhlIHJpbmdidWZmZXIuIElmIHdlIGNvdXBsZSB0aGUgdm1hcHBp bmcgaW50bwp8IHRoZSBvYmotPnBhZ2VzIGxpZmV0aW1lLCB0aGVuIHdlIGNhbiByZXVzZSBhbiBv YmotPnZtYXBwaW5nIGZvciBib3RoCnwgYW5kIGF0IHRoZSBzYW1lIHRpbWUgY291cGxlIGl0IGlu dG8gdGhlIHNocmlua2VyLgp8CnwgdjI6IE1hcmsgdGhlIGZhaWxhYmxlIGttYWxsb2MoKSBhcyBf X0dGUF9OT1dBUk4gKHZzeXJqYWxhKQp8IHYzOiBDYWxsIHVucGluX3ZtYXAgZnJvbSB0aGUgcmln aHQgZG1hYnVmIHVubWFwcGVyCgp2NDogcmVpbXBsZW1lbnRzIHRoZSBzYW1lIGZ1bmN0aW9uYWxp dHksIGJ1dCBub3cgYXMgd3JhcHBlcnMgcm91bmQgdGhlCiAgICByZWNlbnRseS1pbnRyb2R1Y2Vk IGk5MTVfZ2VtX29iamVjdF92bWFwX3JhbmdlKCkgZnJvbSBBbGV4J3MgcGF0Y2gKICAgIG1lbnRp b25lZCBhYm92ZS4KCnY1OiBzZXBhcmF0ZWQgZnJvbSB0d28gbWlub3IgYnV0IHVucmVsYXRlZCBj aGFuZ2VzIFtUdnJ0a28gVXJzdWxpbl07CiAgICB0aGlzIGlzIHRoZSB0aGlyZCBhbmQgbW9zdCBz dWJzdGFudGlhbCBwb3J0aW9uLgoKICAgIERlY2lkZWQgbm90IHRvIGhvbGQgb250byB2bWFwcGlu Z3MgYWZ0ZXIgdGhlIHBpbiBjb3VudCBnb2VzIHRvIHplcm8uCiAgICBUaGlzIG1heSByZWR1Y2Ug dGhlIGJlbmVmaXQgb2YgQ2hyaXMnIHNjaGVtZSBhIGJpdCwgYnV0IGRvZXMgYXZvaWQKICAgIGFu eSBpbmNyZWFzZWQgcmlzayBvZiBleGhhdXN0aW5nIGtlcm5lbCB2bWFwIHNwYWNlIG9uIDMyLWJp dCBrZXJuZWxzCiAgICBbVHZydGtvIFVyc3VsaW5dLiBQb3RlbnRpYWxseSwgdGhlIHZ1bm1hcCgp IGNvdWxkIGJlIGRlZmVycmVkIHVudGlsCiAgICB0aGUgcHV0X3BhZ2VzKCkgc3RhZ2UgaWYgYSBz dWl0YWJsZSBub3RpZmllciB3ZXJlIHdyaXR0ZW4sIGJ1dCB3ZSdyZQogICAgbm90IGRvaW5nIHRo YXQgaGVyZS4gTm9uZXRoZWxlc3MsIHRoZSBzaW1wbGlmaWNhdGlvbiBvZiBib3RoIGRtYWJ1Zgog ICAgYW5kIHJpbmdidWZmZXIgY29kZSBtYWtlcyBpdCB3b3J0aHdoaWxlIGluIGl0cyBvd24gcmln aHQuCgp2NjogY2hhbmdlIEJVR19PTigpIHRvIFdBUk5fT04oKS4gW1R2cnRrbyBVcnN1bGluXQoK U2lnbmVkLW9mZi1ieTogRGF2ZSBHb3Jkb24gPGRhdmlkLnMuZ29yZG9uQGludGVsLmNvbT4KUmV2 aWV3ZWQtYnk6IFR2cnRrbyBVcnN1bGluIDx0dnJ0a28udXJzdWxpbkBpbnRlbC5jb20+CkNjOiBD aHJpcyBXaWxzb24gPGNocmlzQGNocmlzLXdpbHNvbi5jby51az4KQ2M6IEFsZXggRGFpIDx5dS5k YWlAaW50ZWwuY29tPgotLS0KIGRyaXZlcnMvZ3B1L2RybS9pOTE1L2k5MTVfZHJ2LmggICAgICAg ICB8IDIyICsrKysrKysrKysrKysrLS0tLS0KIGRyaXZlcnMvZ3B1L2RybS9pOTE1L2k5MTVfZ2Vt LmMgICAgICAgICB8IDM5ICsrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKwogZHJpdmVy cy9ncHUvZHJtL2k5MTUvaTkxNV9nZW1fZG1hYnVmLmMgIHwgMzYgKysrKy0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tCiBkcml2ZXJzL2dwdS9kcm0vaTkxNS9pbnRlbF9yaW5nYnVmZmVyLmMgfCAg OSArKysrLS0tLQogNCBmaWxlcyBjaGFuZ2VkLCA2NSBpbnNlcnRpb25zKCspLCA0MSBkZWxldGlv bnMoLSkKCmRpZmYgLS1naXQgYS9kcml2ZXJzL2dwdS9kcm0vaTkxNS9pOTE1X2Rydi5oIGIvZHJp dmVycy9ncHUvZHJtL2k5MTUvaTkxNV9kcnYuaAppbmRleCBiM2FlMTkxLi5mMWFkM2IzIDEwMDY0 NAotLS0gYS9kcml2ZXJzL2dwdS9kcm0vaTkxNS9pOTE1X2Rydi5oCisrKyBiL2RyaXZlcnMvZ3B1 L2RybS9pOTE1L2k5MTVfZHJ2LmgKQEAgLTIxNzIsMTAgKzIxNzIsNyBAQCBzdHJ1Y3QgZHJtX2k5 MTVfZ2VtX29iamVjdCB7CiAJCXN0cnVjdCBzY2F0dGVybGlzdCAqc2c7CiAJCWludCBsYXN0Owog CX0gZ2V0X3BhZ2U7Ci0KLQkvKiBwcmltZSBkbWEtYnVmIHN1cHBvcnQgKi8KLQl2b2lkICpkbWFf YnVmX3ZtYXBwaW5nOwotCWludCB2bWFwcGluZ19jb3VudDsKKwl2b2lkICp2bWFwcGluZzsKIAog CS8qKiBCcmVhZGNydW1iIG9mIGxhc3QgcmVuZGVyaW5nIHRvIHRoZSBidWZmZXIuCiAJICogVGhl cmUgY2FuIG9ubHkgYmUgb25lIHdyaXRlciwgYnV0IHdlIGFsbG93IGZvciBtdWx0aXBsZSByZWFk ZXJzLgpAQCAtMjk4MCw3ICsyOTc3LDIyIEBAIHN0YXRpYyBpbmxpbmUgdm9pZCBpOTE1X2dlbV9v YmplY3RfcGluX3BhZ2VzKHN0cnVjdCBkcm1faTkxNV9nZW1fb2JqZWN0ICpvYmopCiBzdGF0aWMg aW5saW5lIHZvaWQgaTkxNV9nZW1fb2JqZWN0X3VucGluX3BhZ2VzKHN0cnVjdCBkcm1faTkxNV9n ZW1fb2JqZWN0ICpvYmopCiB7CiAJQlVHX09OKG9iai0+cGFnZXNfcGluX2NvdW50ID09IDApOwot CW9iai0+cGFnZXNfcGluX2NvdW50LS07CisJaWYgKC0tb2JqLT5wYWdlc19waW5fY291bnQgPT0g MCAmJiBvYmotPnZtYXBwaW5nKSB7CisJCS8qCisJCSAqIFJlbGVhc2luZyB0aGUgdm1hcHBpbmcg aGVyZSBtYXkgeWllbGQgbGVzcyBiZW5lZml0IHRoYW4KKwkJICogaWYgd2Uga2VwdCBpdCB1bnRp bCBwdXRfcGFnZXMoKSwgYnV0IG9uIHRoZSBvdGhlciBoYW5kCisJCSAqIGF2b2lkcyBpc3N1ZXMg b2YgZXhoYXVzdGluZyBrZXJuZWwgdm1hcHBhYmxlIGFkZHJlc3MKKwkJICogc3BhY2Ugb24gMzIt Yml0IGtlcm5lbHMuCisJCSAqLworCQl2dW5tYXAob2JqLT52bWFwcGluZyk7CisJCW9iai0+dm1h cHBpbmcgPSBOVUxMOworCX0KK30KKwordm9pZCAqX19tdXN0X2NoZWNrIGk5MTVfZ2VtX29iamVj dF9waW5fdm1hcChzdHJ1Y3QgZHJtX2k5MTVfZ2VtX29iamVjdCAqb2JqKTsKK3N0YXRpYyBpbmxp bmUgdm9pZCBpOTE1X2dlbV9vYmplY3RfdW5waW5fdm1hcChzdHJ1Y3QgZHJtX2k5MTVfZ2VtX29i amVjdCAqb2JqKQoreworCWk5MTVfZ2VtX29iamVjdF91bnBpbl9wYWdlcyhvYmopOwogfQogCiB2 b2lkICpfX211c3RfY2hlY2sgaTkxNV9nZW1fb2JqZWN0X3ZtYXBfcmFuZ2Uoc3RydWN0IGRybV9p OTE1X2dlbV9vYmplY3QgKm9iaiwKZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2RybS9pOTE1L2k5 MTVfZ2VtLmMgYi9kcml2ZXJzL2dwdS9kcm0vaTkxNS9pOTE1X2dlbS5jCmluZGV4IDViNjc3NGIu LjRiY2E2NDMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZ3B1L2RybS9pOTE1L2k5MTVfZ2VtLmMKKysr IGIvZHJpdmVycy9ncHUvZHJtL2k5MTUvaTkxNV9nZW0uYwpAQCAtMjIzNSw2ICsyMjM1LDEyIEBA IHN0YXRpYyB2b2lkIGk5MTVfZ2VtX29iamVjdF9mcmVlX21tYXBfb2Zmc2V0KHN0cnVjdCBkcm1f aTkxNV9nZW1fb2JqZWN0ICpvYmopCiAJb3BzLT5wdXRfcGFnZXMob2JqKTsKIAlvYmotPnBhZ2Vz ID0gTlVMTDsKIAorCS8qIHZtYXBwaW5nIHNob3VsZCBoYXZlIGJlZW4gZHJvcHBlZCB3aGVuIHBh Z2VzX3Bpbl9jb3VudCB3ZW50IHRvIDAgKi8KKwlpZiAoV0FSTl9PTihvYmotPnZtYXBwaW5nKSkg eworCQl2dW5tYXAob2JqLT52bWFwcGluZyk7CisJCW9iai0+dm1hcHBpbmcgPSBOVUxMOworCX0K KwogCWk5MTVfZ2VtX29iamVjdF9pbnZhbGlkYXRlKG9iaik7CiAKIAlyZXR1cm4gMDsKQEAgLTI0 NjQsNiArMjQ3MCwzOSBAQCB2b2lkICppOTE1X2dlbV9vYmplY3Rfdm1hcF9yYW5nZShzdHJ1Y3Qg ZHJtX2k5MTVfZ2VtX29iamVjdCAqb2JqLAogCXJldHVybiBhZGRyOwogfQogCisvKioKKyAqIGk5 MTVfZ2VtX29iamVjdF9waW5fdm1hcCAtIHBpbiBhIEdFTSBvYmplY3QgYW5kIG1hcCBpdCBpbnRv IGtlcm5lbCBzcGFjZQorICogQG9iajogdGhlIEdFTSBvYmplY3QgdG8gYmUgbWFwcGVkCisgKgor ICogQ29tYmluZXMgdGhlIGZ1bmN0aW9ucyBvZiBnZXRfcGFnZXMoKSwgcGluX3BhZ2VzKCkgYW5k IHZtYXBfcmFuZ2UoKSBvbgorICogdGhlIHdob2xlIG9iamVjdC4gIFRoZSBjYWxsZXIgc2hvdWxk IHJlbGVhc2UgdGhlIG1hcHBpbmcgYnkgY2FsbGluZworICogaTkxNV9nZW1fb2JqZWN0X3VucGlu X3ZtYXAoKSB3aGVuIGl0IGlzIG5vIGxvbmdlciByZXF1aXJlZC4KKyAqCisgKiBSZXR1cm5zIHRo ZSBhZGRyZXNzIGF0IHdoaWNoIHRoZSBvYmplY3QgaGFzIGJlZW4gbWFwcGVkLCBvciBhbiBFUlJf UFRSCisgKiBvbiBmYWlsdXJlLgorICovCit2b2lkICppOTE1X2dlbV9vYmplY3RfcGluX3ZtYXAo c3RydWN0IGRybV9pOTE1X2dlbV9vYmplY3QgKm9iaikKK3sKKwlpbnQgcmV0OworCisJcmV0ID0g aTkxNV9nZW1fb2JqZWN0X2dldF9wYWdlcyhvYmopOworCWlmIChyZXQpCisJCXJldHVybiBFUlJf UFRSKHJldCk7CisKKwlpOTE1X2dlbV9vYmplY3RfcGluX3BhZ2VzKG9iaik7CisKKwlpZiAob2Jq LT52bWFwcGluZyA9PSBOVUxMKSB7CisJCW9iai0+dm1hcHBpbmcgPSBpOTE1X2dlbV9vYmplY3Rf dm1hcF9yYW5nZShvYmosIDAsIDApOworCisJCWlmIChvYmotPnZtYXBwaW5nID09IE5VTEwpIHsK KwkJCWk5MTVfZ2VtX29iamVjdF91bnBpbl9wYWdlcyhvYmopOworCQkJcmV0dXJuIEVSUl9QVFIo LUVOT01FTSk7CisJCX0KKwl9CisKKwlyZXR1cm4gb2JqLT52bWFwcGluZzsKK30KKwogdm9pZCBp OTE1X3ZtYV9tb3ZlX3RvX2FjdGl2ZShzdHJ1Y3QgaTkxNV92bWEgKnZtYSwKIAkJCSAgICAgc3Ry dWN0IGRybV9pOTE1X2dlbV9yZXF1ZXN0ICpyZXEpCiB7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2dw dS9kcm0vaTkxNS9pOTE1X2dlbV9kbWFidWYuYyBiL2RyaXZlcnMvZ3B1L2RybS9pOTE1L2k5MTVf Z2VtX2RtYWJ1Zi5jCmluZGV4IDNhNWQwMWEuLmFkYzdiNWUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMv Z3B1L2RybS9pOTE1L2k5MTVfZ2VtX2RtYWJ1Zi5jCisrKyBiL2RyaXZlcnMvZ3B1L2RybS9pOTE1 L2k5MTVfZ2VtX2RtYWJ1Zi5jCkBAIC0xMDgsNDAgKzEwOCwxNyBAQCBzdGF0aWMgdm9pZCAqaTkx NV9nZW1fZG1hYnVmX3ZtYXAoc3RydWN0IGRtYV9idWYgKmRtYV9idWYpCiB7CiAJc3RydWN0IGRy bV9pOTE1X2dlbV9vYmplY3QgKm9iaiA9IGRtYV9idWZfdG9fb2JqKGRtYV9idWYpOwogCXN0cnVj dCBkcm1fZGV2aWNlICpkZXYgPSBvYmotPmJhc2UuZGV2OworCXZvaWQgKmFkZHI7CiAJaW50IHJl dDsKIAogCXJldCA9IGk5MTVfbXV0ZXhfbG9ja19pbnRlcnJ1cHRpYmxlKGRldik7CiAJaWYgKHJl dCkKIAkJcmV0dXJuIEVSUl9QVFIocmV0KTsKIAotCWlmIChvYmotPmRtYV9idWZfdm1hcHBpbmcp IHsKLQkJb2JqLT52bWFwcGluZ19jb3VudCsrOwotCQlnb3RvIG91dF91bmxvY2s7Ci0JfQotCi0J cmV0ID0gaTkxNV9nZW1fb2JqZWN0X2dldF9wYWdlcyhvYmopOwotCWlmIChyZXQpCi0JCWdvdG8g ZXJyOwotCi0JaTkxNV9nZW1fb2JqZWN0X3Bpbl9wYWdlcyhvYmopOwotCi0JcmV0ID0gLUVOT01F TTsKLQotCW9iai0+ZG1hX2J1Zl92bWFwcGluZyA9IGk5MTVfZ2VtX29iamVjdF92bWFwX3Jhbmdl KG9iaiwgMCwgMCk7Ci0KLQlpZiAoIW9iai0+ZG1hX2J1Zl92bWFwcGluZykKLQkJZ290byBlcnJf dW5waW47Ci0KLQlvYmotPnZtYXBwaW5nX2NvdW50ID0gMTsKLW91dF91bmxvY2s6CisJYWRkciA9 IGk5MTVfZ2VtX29iamVjdF9waW5fdm1hcChvYmopOwogCW11dGV4X3VubG9jaygmZGV2LT5zdHJ1 Y3RfbXV0ZXgpOwotCXJldHVybiBvYmotPmRtYV9idWZfdm1hcHBpbmc7CiAKLWVycl91bnBpbjoK LQlpOTE1X2dlbV9vYmplY3RfdW5waW5fcGFnZXMob2JqKTsKLWVycjoKLQltdXRleF91bmxvY2so JmRldi0+c3RydWN0X211dGV4KTsKLQlyZXR1cm4gRVJSX1BUUihyZXQpOworCXJldHVybiBhZGRy OwogfQogCiBzdGF0aWMgdm9pZCBpOTE1X2dlbV9kbWFidWZfdnVubWFwKHN0cnVjdCBkbWFfYnVm ICpkbWFfYnVmLCB2b2lkICp2YWRkcikKQEAgLTE1MCwxMiArMTI3LDcgQEAgc3RhdGljIHZvaWQg aTkxNV9nZW1fZG1hYnVmX3Z1bm1hcChzdHJ1Y3QgZG1hX2J1ZiAqZG1hX2J1Ziwgdm9pZCAqdmFk ZHIpCiAJc3RydWN0IGRybV9kZXZpY2UgKmRldiA9IG9iai0+YmFzZS5kZXY7CiAKIAltdXRleF9s b2NrKCZkZXYtPnN0cnVjdF9tdXRleCk7Ci0JaWYgKC0tb2JqLT52bWFwcGluZ19jb3VudCA9PSAw KSB7Ci0JCXZ1bm1hcChvYmotPmRtYV9idWZfdm1hcHBpbmcpOwotCQlvYmotPmRtYV9idWZfdm1h cHBpbmcgPSBOVUxMOwotCi0JCWk5MTVfZ2VtX29iamVjdF91bnBpbl9wYWdlcyhvYmopOwotCX0K KwlpOTE1X2dlbV9vYmplY3RfdW5waW5fdm1hcChvYmopOwogCW11dGV4X3VubG9jaygmZGV2LT5z dHJ1Y3RfbXV0ZXgpOwogfQogCmRpZmYgLS1naXQgYS9kcml2ZXJzL2dwdS9kcm0vaTkxNS9pbnRl bF9yaW5nYnVmZmVyLmMgYi9kcml2ZXJzL2dwdS9kcm0vaTkxNS9pbnRlbF9yaW5nYnVmZmVyLmMK aW5kZXggNThhMThlMS4uNDdmMTg2ZSAxMDA2NDQKLS0tIGEvZHJpdmVycy9ncHUvZHJtL2k5MTUv aW50ZWxfcmluZ2J1ZmZlci5jCisrKyBiL2RyaXZlcnMvZ3B1L2RybS9pOTE1L2ludGVsX3Jpbmdi dWZmZXIuYwpAQCAtMjA1Niw3ICsyMDU2LDcgQEAgc3RhdGljIGludCBpbml0X3BoeXNfc3RhdHVz X3BhZ2Uoc3RydWN0IGludGVsX2VuZ2luZV9jcyAqcmluZykKIHZvaWQgaW50ZWxfdW5waW5fcmlu Z2J1ZmZlcl9vYmooc3RydWN0IGludGVsX3JpbmdidWZmZXIgKnJpbmdidWYpCiB7CiAJaWYgKEhB U19MTEMocmluZ2J1Zi0+b2JqLT5iYXNlLmRldikgJiYgIXJpbmdidWYtPm9iai0+c3RvbGVuKQot CQl2dW5tYXAocmluZ2J1Zi0+dmlydHVhbF9zdGFydCk7CisJCWk5MTVfZ2VtX29iamVjdF91bnBp bl92bWFwKHJpbmdidWYtPm9iaik7CiAJZWxzZQogCQlpb3VubWFwKHJpbmdidWYtPnZpcnR1YWxf c3RhcnQpOwogCXJpbmdidWYtPnZpcnR1YWxfc3RhcnQgPSBOVUxMOwpAQCAtMjA4MCw5ICsyMDgw LDEwIEBAIGludCBpbnRlbF9waW5fYW5kX21hcF9yaW5nYnVmZmVyX29iaihzdHJ1Y3QgZHJtX2Rl dmljZSAqZGV2LAogCQlpZiAocmV0KQogCQkJZ290byB1bnBpbjsKIAotCQlyaW5nYnVmLT52aXJ0 dWFsX3N0YXJ0ID0gaTkxNV9nZW1fb2JqZWN0X3ZtYXBfcmFuZ2Uob2JqLCAwLCAwKTsKLQkJaWYg KHJpbmdidWYtPnZpcnR1YWxfc3RhcnQgPT0gTlVMTCkgewotCQkJcmV0ID0gLUVOT01FTTsKKwkJ cmluZ2J1Zi0+dmlydHVhbF9zdGFydCA9IGk5MTVfZ2VtX29iamVjdF9waW5fdm1hcChvYmopOwor CQlpZiAoSVNfRVJSKHJpbmdidWYtPnZpcnR1YWxfc3RhcnQpKSB7CisJCQlyZXQgPSBQVFJfRVJS KHJpbmdidWYtPnZpcnR1YWxfc3RhcnQpOworCQkJcmluZ2J1Zi0+dmlydHVhbF9zdGFydCA9IE5V TEw7CiAJCQlnb3RvIHVucGluOwogCQl9CiAJfSBlbHNlIHsKLS0gCjEuOS4xCgpfX19fX19fX19f X19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXwpJbnRlbC1nZnggbWFpbGluZyBs aXN0CkludGVsLWdmeEBsaXN0cy5mcmVlZGVza3RvcC5vcmcKaHR0cHM6Ly9saXN0cy5mcmVlZGVz a3RvcC5vcmcvbWFpbG1hbi9saXN0aW5mby9pbnRlbC1nZngK