From mboxrd@z Thu Jan 1 00:00:00 1970 From: Mika Kuoppala Subject: Re: [PATCH] drm/i915: Make i915_gem_context_mark_guilty() safe for unlocked updates Date: Mon, 10 Jul 2017 17:14:19 +0300 Message-ID: <87shi48jlw.fsf@gaia.fi.intel.com> References: <20170709093513.26913-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 mga11.intel.com (mga11.intel.com [192.55.52.93]) by gabe.freedesktop.org (Postfix) with ESMTPS id CAA5C6E150 for ; Mon, 10 Jul 2017 14:15:06 +0000 (UTC) In-Reply-To: <20170709093513.26913-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: Chris Wilson , intel-gfx@lists.freedesktop.org List-Id: intel-gfx@lists.freedesktop.org Q2hyaXMgV2lsc29uIDxjaHJpc0BjaHJpcy13aWxzb24uY28udWs+IHdyaXRlczoKCj4gU2luY2Ug d2UgbWFrZSBjYWxsIGk5MTVfZ2VtX2NvbnRleHRfbWFya19ndWlsdHkoKSBjb25jdXJyZW50bHkg d2hlbgo+IHJlc2V0dGluZyBkaWZmZXJlbnQgZW5naW5lcyBpbiBwYXJhbGxlbCwgd2UgbmVlZCB0 byBtYWtlIHN1cmUgdGhhdCBvdXIKPiB1cGRhdGVzIGFyZSBzYWZlIGZvciB0aGUgdW5sb2NrZWQg YWNjZXNzLgo+Cj4gU2lnbmVkLW9mZi1ieTogQ2hyaXMgV2lsc29uIDxjaHJpc0BjaHJpcy13aWxz b24uY28udWs+Cj4gQ2M6IE1pY2hlbCBUaGllcnJ5IDxtaWNoZWwudGhpZXJyeUBpbnRlbC5jb20+ Cj4gQ2M6IE1pa2EgS3VvcHBhbGEgPG1pa2Eua3VvcHBhbGFAbGludXguaW50ZWwuY29tPgoKQW5k IHdlIGRvbnQgZXZlciBjbGVhciB0aGUgY29udGV4dCBiYW5uYWJsZSBmbGFnIHNvCnRoaXMgc2hv dWxkIGJlIGZpbmUuCgpPbmUgaW1wcm92ZW1lbnQgd291bGQgYmUgdGhhdCBvbmx5IHRoZSB0cmln Z2VyaW5nCmJhbiB3b3VsZCBzcGV3IHRoZSBtZXNzYWdlLiBCdXQgbm93IHRoaW5raW5nIGFib3V0 IGl0LAp0aGUgZHVhbCBtZXNzYWdlIHdvdWxkIHJldmVhbCB0aGUgY29uY3VycmVudCBiYW4gYW5k CmlzIG1vcmUgaW5mb3JtYXRpdmUuCgpSZXZpZXdlZC1ieTogTWlrYSBLdW9wcGFsYSA8bWlrYS5r dW9wcGFsYUBpbnRlbC5jb20+Cgo+IC0tLQo+ICBkcml2ZXJzL2dwdS9kcm0vaTkxNS9pOTE1X2Ry di5oICAgICAgICAgfCAgMiArLQo+ICBkcml2ZXJzL2dwdS9kcm0vaTkxNS9pOTE1X2dlbS5jICAg ICAgICAgfCAzMiArKysrKysrKysrKysrKysrKystLS0tLS0tLS0tLS0tLQo+ICBkcml2ZXJzL2dw dS9kcm0vaTkxNS9pOTE1X2dlbV9jb250ZXh0LmMgfCAgNiArKystLS0KPiAgZHJpdmVycy9ncHUv ZHJtL2k5MTUvaTkxNV9nZW1fY29udGV4dC5oIHwgIDYgKysrLS0tCj4gIGRyaXZlcnMvZ3B1L2Ry bS9pOTE1L2k5MTVfZ2VtX3JlcXVlc3QuYyB8ICAzICstLQo+ICBkcml2ZXJzL2dwdS9kcm0vaTkx NS9pOTE1X2dwdV9lcnJvci5jICAgfCAgOCArKysrLS0tLQo+ICA2IGZpbGVzIGNoYW5nZWQsIDMw IGluc2VydGlvbnMoKyksIDI3IGRlbGV0aW9ucygtKQo+Cj4gZGlmZiAtLWdpdCBhL2RyaXZlcnMv Z3B1L2RybS9pOTE1L2k5MTVfZHJ2LmggYi9kcml2ZXJzL2dwdS9kcm0vaTkxNS9pOTE1X2Rydi5o Cj4gaW5kZXggODFjZDIxZWNmYTdkLi42MjIwOGIzYmY0MTcgMTAwNjQ0Cj4gLS0tIGEvZHJpdmVy cy9ncHUvZHJtL2k5MTUvaTkxNV9kcnYuaAo+ICsrKyBiL2RyaXZlcnMvZ3B1L2RybS9pOTE1L2k5 MTVfZHJ2LmgKPiBAQCAtNTk2LDcgKzU5Niw3IEBAIHN0cnVjdCBkcm1faTkxNV9maWxlX3ByaXZh dGUgewo+ICAgKiB0byBsaW1pdCB0aGUgYmFkbHkgYmVoYXZpbmcgY2xpZW50cyBhY2Nlc3MgdG8g Z3B1Lgo+ICAgKi8KPiAgI2RlZmluZSBJOTE1X01BWF9DTElFTlRfQ09OVEVYVF9CQU5TIDMKPiAt CWludCBjb250ZXh0X2JhbnM7Cj4gKwlhdG9taWNfdCBjb250ZXh0X2JhbnM7Cj4gIH07Cj4gIAo+ ICAvKiBVc2VkIGJ5IGRwIGFuZCBmZGkgbGlua3MgKi8KPiBkaWZmIC0tZ2l0IGEvZHJpdmVycy9n cHUvZHJtL2k5MTUvaTkxNV9nZW0uYyBiL2RyaXZlcnMvZ3B1L2RybS9pOTE1L2k5MTVfZ2VtLmMK PiBpbmRleCAxNTY0Y2FkZGE5NGQuLmNiZTcwYTk0YjY2MyAxMDA2NDQKPiAtLS0gYS9kcml2ZXJz L2dwdS9kcm0vaTkxNS9pOTE1X2dlbS5jCj4gKysrIGIvZHJpdmVycy9ncHUvZHJtL2k5MTUvaTkx NV9nZW0uYwo+IEBAIC0yNzM5LDM0ICsyNzM5LDM4IEBAIGk5MTVfZ2VtX29iamVjdF9wd3JpdGVf Z3R0KHN0cnVjdCBkcm1faTkxNV9nZW1fb2JqZWN0ICpvYmosCj4gIAlyZXR1cm4gMDsKPiAgfQo+ ICAKPiAtc3RhdGljIGJvb2wgYmFuX2NvbnRleHQoY29uc3Qgc3RydWN0IGk5MTVfZ2VtX2NvbnRl eHQgKmN0eCkKPiArc3RhdGljIGJvb2wgYmFuX2NvbnRleHQoY29uc3Qgc3RydWN0IGk5MTVfZ2Vt X2NvbnRleHQgKmN0eCwKPiArCQkJdW5zaWduZWQgaW50IHNjb3JlKQo+ICB7Cj4gIAlyZXR1cm4g KGk5MTVfZ2VtX2NvbnRleHRfaXNfYmFubmFibGUoY3R4KSAmJgo+IC0JCWN0eC0+YmFuX3Njb3Jl ID49IENPTlRFWFRfU0NPUkVfQkFOX1RIUkVTSE9MRCk7Cj4gKwkJc2NvcmUgPj0gQ09OVEVYVF9T Q09SRV9CQU5fVEhSRVNIT0xEKTsKPiAgfQo+ICAKPiAgc3RhdGljIHZvaWQgaTkxNV9nZW1fY29u dGV4dF9tYXJrX2d1aWx0eShzdHJ1Y3QgaTkxNV9nZW1fY29udGV4dCAqY3R4KQo+ICB7Cj4gLQlj dHgtPmd1aWx0eV9jb3VudCsrOwo+IC0JY3R4LT5iYW5fc2NvcmUgKz0gQ09OVEVYVF9TQ09SRV9H VUlMVFk7Cj4gLQlpZiAoYmFuX2NvbnRleHQoY3R4KSkKPiAtCQlpOTE1X2dlbV9jb250ZXh0X3Nl dF9iYW5uZWQoY3R4KTsKPiArCXVuc2lnbmVkIGludCBzY29yZTsKPiArCWJvb2wgYmFubmVkOwo+ ICAKPiAtCURSTV9ERUJVR19EUklWRVIoImNvbnRleHQgJXMgbWFya2VkIGd1aWx0eSAoc2NvcmUg JWQpIGJhbm5lZD8gJXNcbiIsCj4gLQkJCSBjdHgtPm5hbWUsIGN0eC0+YmFuX3Njb3JlLAo+IC0J CQkgeWVzbm8oaTkxNV9nZW1fY29udGV4dF9pc19iYW5uZWQoY3R4KSkpOwo+ICsJYXRvbWljX2lu YygmY3R4LT5ndWlsdHlfY291bnQpOwo+ICAKPiAtCWlmICghaTkxNV9nZW1fY29udGV4dF9pc19i YW5uZWQoY3R4KSB8fCBJU19FUlJfT1JfTlVMTChjdHgtPmZpbGVfcHJpdikpCj4gKwlzY29yZSA9 IGF0b21pY19hZGRfcmV0dXJuKENPTlRFWFRfU0NPUkVfR1VJTFRZLCAmY3R4LT5iYW5fc2NvcmUp Owo+ICsJYmFubmVkID0gYmFuX2NvbnRleHQoY3R4LCBzY29yZSk7Cj4gKwlEUk1fREVCVUdfRFJJ VkVSKCJjb250ZXh0ICVzIG1hcmtlZCBndWlsdHkgKHNjb3JlICVkKSBiYW5uZWQ/ICVzXG4iLAo+ ICsJCQkgY3R4LT5uYW1lLCBzY29yZSwgeWVzbm8oYmFubmVkKSk7Cj4gKwlpZiAoIWJhbm5lZCkK PiAgCQlyZXR1cm47Cj4gIAo+IC0JY3R4LT5maWxlX3ByaXYtPmNvbnRleHRfYmFucysrOwo+IC0J RFJNX0RFQlVHX0RSSVZFUigiY2xpZW50ICVzIGhhcyBoYWQgJWQgY29udGV4dCBiYW5uZWRcbiIs Cj4gLQkJCSBjdHgtPm5hbWUsIGN0eC0+ZmlsZV9wcml2LT5jb250ZXh0X2JhbnMpOwo+ICsJaTkx NV9nZW1fY29udGV4dF9zZXRfYmFubmVkKGN0eCk7Cj4gKwlpZiAoIUlTX0VSUl9PUl9OVUxMKGN0 eC0+ZmlsZV9wcml2KSkgewo+ICsJCWF0b21pY19pbmMoJmN0eC0+ZmlsZV9wcml2LT5jb250ZXh0 X2JhbnMpOwo+ICsJCURSTV9ERUJVR19EUklWRVIoImNsaWVudCAlcyBoYXMgaGFkICVkIGNvbnRl eHQgYmFubmVkXG4iLAo+ICsJCQkJIGN0eC0+bmFtZSwgYXRvbWljX3JlYWQoJmN0eC0+ZmlsZV9w cml2LT5jb250ZXh0X2JhbnMpKTsKPiArCX0KPiAgfQo+ICAKPiAgc3RhdGljIHZvaWQgaTkxNV9n ZW1fY29udGV4dF9tYXJrX2lubm9jZW50KHN0cnVjdCBpOTE1X2dlbV9jb250ZXh0ICpjdHgpCj4g IHsKPiAtCWN0eC0+YWN0aXZlX2NvdW50Kys7Cj4gKwlhdG9taWNfaW5jKCZjdHgtPmFjdGl2ZV9j b3VudCk7Cj4gIH0KPiAgCj4gIHN0cnVjdCBkcm1faTkxNV9nZW1fcmVxdWVzdCAqCj4gZGlmZiAt LWdpdCBhL2RyaXZlcnMvZ3B1L2RybS9pOTE1L2k5MTVfZ2VtX2NvbnRleHQuYyBiL2RyaXZlcnMv Z3B1L2RybS9pOTE1L2k5MTVfZ2VtX2NvbnRleHQuYwo+IGluZGV4IDFhODdkMDRlNzkzNy4uZWQ5 MWFjOGNhODMyIDEwMDY0NAo+IC0tLSBhL2RyaXZlcnMvZ3B1L2RybS9pOTE1L2k5MTVfZ2VtX2Nv bnRleHQuYwo+ICsrKyBiL2RyaXZlcnMvZ3B1L2RybS9pOTE1L2k5MTVfZ2VtX2NvbnRleHQuYwo+ IEBAIC05NzcsNyArOTc3LDcgQEAgaW50IGk5MTVfZ2VtX3N3aXRjaF90b19rZXJuZWxfY29udGV4 dChzdHJ1Y3QgZHJtX2k5MTVfcHJpdmF0ZSAqZGV2X3ByaXYpCj4gIAo+ICBzdGF0aWMgYm9vbCBj bGllbnRfaXNfYmFubmVkKHN0cnVjdCBkcm1faTkxNV9maWxlX3ByaXZhdGUgKmZpbGVfcHJpdikK PiAgewo+IC0JcmV0dXJuIGZpbGVfcHJpdi0+Y29udGV4dF9iYW5zID4gSTkxNV9NQVhfQ0xJRU5U X0NPTlRFWFRfQkFOUzsKPiArCXJldHVybiBhdG9taWNfcmVhZCgmZmlsZV9wcml2LT5jb250ZXh0 X2JhbnMpID4gSTkxNV9NQVhfQ0xJRU5UX0NPTlRFWFRfQkFOUzsKPiAgfQo+ICAKPiAgaW50IGk5 MTVfZ2VtX2NvbnRleHRfY3JlYXRlX2lvY3RsKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYsIHZvaWQg KmRhdGEsCj4gQEAgLTExNzksOCArMTE3OSw4IEBAIGludCBpOTE1X2dlbV9jb250ZXh0X3Jlc2V0 X3N0YXRzX2lvY3RsKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYsCj4gIAllbHNlCj4gIAkJYXJncy0+ cmVzZXRfY291bnQgPSAwOwo+ICAKPiAtCWFyZ3MtPmJhdGNoX2FjdGl2ZSA9IFJFQURfT05DRShj dHgtPmd1aWx0eV9jb3VudCk7Cj4gLQlhcmdzLT5iYXRjaF9wZW5kaW5nID0gUkVBRF9PTkNFKGN0 eC0+YWN0aXZlX2NvdW50KTsKPiArCWFyZ3MtPmJhdGNoX2FjdGl2ZSA9IGF0b21pY19yZWFkKCZj dHgtPmd1aWx0eV9jb3VudCk7Cj4gKwlhcmdzLT5iYXRjaF9wZW5kaW5nID0gYXRvbWljX3JlYWQo JmN0eC0+YWN0aXZlX2NvdW50KTsKPiAgCj4gIAlyZXQgPSAwOwo+ICBvdXQ6Cj4gZGlmZiAtLWdp dCBhL2RyaXZlcnMvZ3B1L2RybS9pOTE1L2k5MTVfZ2VtX2NvbnRleHQuaCBiL2RyaXZlcnMvZ3B1 L2RybS9pOTE1L2k5MTVfZ2VtX2NvbnRleHQuaAo+IGluZGV4IDA0MzIwZjgwZjlmNC4uMmQwMjkx OGE0NDllIDEwMDY0NAo+IC0tLSBhL2RyaXZlcnMvZ3B1L2RybS9pOTE1L2k5MTVfZ2VtX2NvbnRl eHQuaAo+ICsrKyBiL2RyaXZlcnMvZ3B1L2RybS9pOTE1L2k5MTVfZ2VtX2NvbnRleHQuaAo+IEBA IC0xOTEsMTcgKzE5MSwxNyBAQCBzdHJ1Y3QgaTkxNV9nZW1fY29udGV4dCB7Cj4gIAl1MzIgZGVz Y190ZW1wbGF0ZTsKPiAgCj4gIAkvKiogZ3VpbHR5X2NvdW50OiBIb3cgbWFueSB0aW1lcyB0aGlz IGNvbnRleHQgaGFzIGNhdXNlZCBhIEdQVSBoYW5nLiAqLwo+IC0JdW5zaWduZWQgaW50IGd1aWx0 eV9jb3VudDsKPiArCWF0b21pY190IGd1aWx0eV9jb3VudDsKPiAgCS8qKgo+ICAJICogQGFjdGl2 ZV9jb3VudDogSG93IG1hbnkgdGltZXMgdGhpcyBjb250ZXh0IHdhcyBhY3RpdmUgZHVyaW5nIGEg R1BVCj4gIAkgKiBoYW5nLCBidXQgZGlkIG5vdCBjYXVzZSBpdC4KPiAgCSAqLwo+IC0JdW5zaWdu ZWQgaW50IGFjdGl2ZV9jb3VudDsKPiArCWF0b21pY190IGFjdGl2ZV9jb3VudDsKPiAgCj4gICNk ZWZpbmUgQ09OVEVYVF9TQ09SRV9HVUlMVFkJCTEwCj4gICNkZWZpbmUgQ09OVEVYVF9TQ09SRV9C QU5fVEhSRVNIT0xECTQwCj4gIAkvKiogYmFuX3Njb3JlOiBBY2N1bXVsYXRlZCBzY29yZSBvZiBh bGwgaGFuZ3MgY2F1c2VkIGJ5IHRoaXMgY29udGV4dC4gKi8KPiAtCWludCBiYW5fc2NvcmU7Cj4g KwlhdG9taWNfdCBiYW5fc2NvcmU7Cj4gIAo+ICAJLyoqIHJlbWFwX3NsaWNlOiBCaXRtYXNrIG9m IGNhY2hlIGxpbmVzIHRoYXQgbmVlZCByZW1hcHBpbmcgKi8KPiAgCXU4IHJlbWFwX3NsaWNlOwo+ IGRpZmYgLS1naXQgYS9kcml2ZXJzL2dwdS9kcm0vaTkxNS9pOTE1X2dlbV9yZXF1ZXN0LmMgYi9k cml2ZXJzL2dwdS9kcm0vaTkxNS9pOTE1X2dlbV9yZXF1ZXN0LmMKPiBpbmRleCA0ODNhZjg5MjEw NjAuLjhiYTg5YWJlNTQ0MSAxMDA2NDQKPiAtLS0gYS9kcml2ZXJzL2dwdS9kcm0vaTkxNS9pOTE1 X2dlbV9yZXF1ZXN0LmMKPiArKysgYi9kcml2ZXJzL2dwdS9kcm0vaTkxNS9pOTE1X2dlbV9yZXF1 ZXN0LmMKPiBAQCAtMzcwLDggKzM3MCw3IEBAIHN0YXRpYyB2b2lkIGk5MTVfZ2VtX3JlcXVlc3Rf cmV0aXJlKHN0cnVjdCBkcm1faTkxNV9nZW1fcmVxdWVzdCAqcmVxdWVzdCkKPiAgCWk5MTVfZ2Vt X3JlcXVlc3RfcmVtb3ZlX2Zyb21fY2xpZW50KHJlcXVlc3QpOwo+ICAKPiAgCS8qIFJldGlyZW1l bnQgZGVjYXlzIHRoZSBiYW4gc2NvcmUgYXMgaXQgaXMgYSBzaWduIG9mIGN0eCBwcm9ncmVzcyAq Lwo+IC0JaWYgKHJlcXVlc3QtPmN0eC0+YmFuX3Njb3JlID4gMCkKPiAtCQlyZXF1ZXN0LT5jdHgt PmJhbl9zY29yZS0tOwo+ICsJYXRvbWljX2RlY19pZl9wb3NpdGl2ZSgmcmVxdWVzdC0+Y3R4LT5i YW5fc2NvcmUpOwo+ICAKPiAgCS8qIFRoZSBiYWNraW5nIG9iamVjdCBmb3IgdGhlIGNvbnRleHQg aXMgZG9uZSBhZnRlciBzd2l0Y2hpbmcgdG8gdGhlCj4gIAkgKiAqbmV4dCogY29udGV4dC4gVGhl cmVmb3JlIHdlIGNhbm5vdCByZXRpcmUgdGhlIHByZXZpb3VzIGNvbnRleHQgdW50aWwKPiBkaWZm IC0tZ2l0IGEvZHJpdmVycy9ncHUvZHJtL2k5MTUvaTkxNV9ncHVfZXJyb3IuYyBiL2RyaXZlcnMv Z3B1L2RybS9pOTE1L2k5MTVfZ3B1X2Vycm9yLmMKPiBpbmRleCBhZTcwMjgzNDcwYTYuLmVkNWEx ZWI4MzlhZCAxMDA2NDQKPiAtLS0gYS9kcml2ZXJzL2dwdS9kcm0vaTkxNS9pOTE1X2dwdV9lcnJv ci5jCj4gKysrIGIvZHJpdmVycy9ncHUvZHJtL2k5MTUvaTkxNV9ncHVfZXJyb3IuYwo+IEBAIC0x MjY2LDcgKzEyNjYsNyBAQCBzdGF0aWMgdm9pZCByZWNvcmRfcmVxdWVzdChzdHJ1Y3QgZHJtX2k5 MTVfZ2VtX3JlcXVlc3QgKnJlcXVlc3QsCj4gIAkJCSAgIHN0cnVjdCBkcm1faTkxNV9lcnJvcl9y ZXF1ZXN0ICplcnEpCj4gIHsKPiAgCWVycS0+Y29udGV4dCA9IHJlcXVlc3QtPmN0eC0+aHdfaWQ7 Cj4gLQllcnEtPmJhbl9zY29yZSA9IHJlcXVlc3QtPmN0eC0+YmFuX3Njb3JlOwo+ICsJZXJxLT5i YW5fc2NvcmUgPSBhdG9taWNfcmVhZCgmcmVxdWVzdC0+Y3R4LT5iYW5fc2NvcmUpOwo+ICAJZXJx LT5zZXFubyA9IHJlcXVlc3QtPmdsb2JhbF9zZXFubzsKPiAgCWVycS0+amlmZmllcyA9IHJlcXVl c3QtPmVtaXR0ZWRfamlmZmllczsKPiAgCWVycS0+aGVhZCA9IHJlcXVlc3QtPmhlYWQ7Cj4gQEAg LTEzNTcsOSArMTM1Nyw5IEBAIHN0YXRpYyB2b2lkIHJlY29yZF9jb250ZXh0KHN0cnVjdCBkcm1f aTkxNV9lcnJvcl9jb250ZXh0ICplLAo+ICAKPiAgCWUtPmhhbmRsZSA9IGN0eC0+dXNlcl9oYW5k bGU7Cj4gIAllLT5od19pZCA9IGN0eC0+aHdfaWQ7Cj4gLQllLT5iYW5fc2NvcmUgPSBjdHgtPmJh bl9zY29yZTsKPiAtCWUtPmd1aWx0eSA9IGN0eC0+Z3VpbHR5X2NvdW50Owo+IC0JZS0+YWN0aXZl ID0gY3R4LT5hY3RpdmVfY291bnQ7Cj4gKwllLT5iYW5fc2NvcmUgPSBhdG9taWNfcmVhZCgmY3R4 LT5iYW5fc2NvcmUpOwo+ICsJZS0+Z3VpbHR5ID0gYXRvbWljX3JlYWQoJmN0eC0+Z3VpbHR5X2Nv dW50KTsKPiArCWUtPmFjdGl2ZSA9IGF0b21pY19yZWFkKCZjdHgtPmFjdGl2ZV9jb3VudCk7Cj4g IH0KPiAgCj4gIHN0YXRpYyB2b2lkIHJlcXVlc3RfcmVjb3JkX3VzZXJfYm8oc3RydWN0IGRybV9p OTE1X2dlbV9yZXF1ZXN0ICpyZXF1ZXN0LAo+IC0tIAo+IDIuMTMuMgpfX19fX19fX19fX19fX19f X19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXwpJbnRlbC1nZnggbWFpbGluZyBsaXN0Cklu dGVsLWdmeEBsaXN0cy5mcmVlZGVza3RvcC5vcmcKaHR0cHM6Ly9saXN0cy5mcmVlZGVza3RvcC5v cmcvbWFpbG1hbi9saXN0aW5mby9pbnRlbC1nZngK