From mboxrd@z Thu Jan 1 00:00:00 1970 From: Tvrtko Ursulin Subject: Re: [PATCH v3] drm/i915/scheduler: emulate a scheduler for guc Date: Wed, 11 Jan 2017 17:08:18 +0000 Message-ID: References: <20170111131304.21974-2-chris@chris-wilson.co.uk> <20170111161148.22849-1-chris@chris-wilson.co.uk> Mime-Version: 1.0 Content-Type: text/plain; charset="utf-8"; Format="flowed" Content-Transfer-Encoding: base64 Return-path: Received: from mga06.intel.com (mga06.intel.com [134.134.136.31]) by gabe.freedesktop.org (Postfix) with ESMTPS id 391906E98D for ; Wed, 11 Jan 2017 17:08:21 +0000 (UTC) In-Reply-To: <20170111161148.22849-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 Ck9uIDExLzAxLzIwMTcgMTY6MTEsIENocmlzIFdpbHNvbiB3cm90ZToKPiBUaGlzIGVtdWxhdGVz IGV4ZWNsaXN0cyBvbiB0b3Agb2YgdGhlIEd1QyBpbiBvcmRlciB0byBkZWZlciBzdWJtaXNzaW9u IG9mCj4gcmVxdWVzdHMgdG8gdGhlIGhhcmR3YXJlLiBUaGlzIGRlZmVycmFsIGFsbG93cyB0aW1l IGZvciBoaWdoIHByaW9yaXR5Cj4gcmVxdWVzdHMgdG8gZ2F6dW1wIHRoZWlyIHdheSB0byB0aGUg aGVhZCBvZiB0aGUgcXVldWUsIGhvd2V2ZXIgaXQgbmVyZnMKPiB0aGUgR3VDIGJ5IGNvbnZlcnRp bmcgaXQgYmFjayBpbnRvIGEgc2ltcGxlIGV4ZWNsaXN0ICh3aGVyZSB0aGUgQ1BVIGhhcwo+IHRv IHdha2UgdXAgYWZ0ZXIgZXZlcnkgcmVxdWVzdCB0byBmZWVkIG5ldyBjb21tYW5kcyBpbnRvIHRo ZSBHdUMpLgo+Cj4gdjI6IERyb3AgaGFjayBzdGF0dXMgLSB0aG91Z2ggaWlyYyB0aGVyZSBpcyBz dGlsbCBhIGxvY2tkZXAgaW52ZXJzaW9uCj4gYmV0d2VlbiBmZW5jZSBhbmQgZW5naW5lLT50aW1l bGluZS0+bG9jayAod2hpY2ggaXMgaW1wb3NzaWJsZSBhcyB0aGUKPiBuZXN0aW5nIG9ubHkgb2Nj dXJzIG9uIGRpZmZlcmVudCBmZW5jZXMgLSBob3BlZnVsbHkganVzdCByZXF1aXJlcyBzb21lCj4g anVkaWNpb3VzIGxvY2tkZXAgYW5ub3RhdGlvbikKPiB2MzogQXBwbHkgbG9ja2RlcCBuZXN0aW5n IHRvIGVuYWJsaW5nIHNpZ25hbGluZyBvbiB0aGUgcmVxdWVzdCwgdXNpbmcKPiB0aGUgcGF0dGVy biB3ZSBhbHJlYWR5IGhhdmUgaW4gX19pOTE1X2dlbV9yZXF1ZXN0X3N1Ym1pdCgpOwo+Cj4gU2ln bmVkLW9mZi1ieTogQ2hyaXMgV2lsc29uIDxjaHJpc0BjaHJpcy13aWxzb24uY28udWs+Cj4gQ2M6 IFR2cnRrbyBVcnN1bGluIDx0dnJ0a28udXJzdWxpbkBsaW51eC5pbnRlbC5jb20+Cj4gLS0tCj4g IGRyaXZlcnMvZ3B1L2RybS9pOTE1L2k5MTVfZ3VjX3N1Ym1pc3Npb24uYyB8IDkyICsrKysrKysr KysrKysrKysrKysrKysrKysrKy0tLQo+ICBkcml2ZXJzL2dwdS9kcm0vaTkxNS9pOTE1X2lycS5j ICAgICAgICAgICAgfCAgNCArLQo+ICBkcml2ZXJzL2dwdS9kcm0vaTkxNS9pbnRlbF9scmMuYyAg ICAgICAgICAgfCAgNSArLQo+ICAzIGZpbGVzIGNoYW5nZWQsIDg5IGluc2VydGlvbnMoKyksIDEy IGRlbGV0aW9ucygtKQo+Cj4gZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2RybS9pOTE1L2k5MTVf Z3VjX3N1Ym1pc3Npb24uYyBiL2RyaXZlcnMvZ3B1L2RybS9pOTE1L2k5MTVfZ3VjX3N1Ym1pc3Np b24uYwo+IGluZGV4IDkxM2Q4NzM1ODk3Mi4uNDQ4NDU5MWNiZjdjIDEwMDY0NAo+IC0tLSBhL2Ry aXZlcnMvZ3B1L2RybS9pOTE1L2k5MTVfZ3VjX3N1Ym1pc3Npb24uYwo+ICsrKyBiL2RyaXZlcnMv Z3B1L2RybS9pOTE1L2k5MTVfZ3VjX3N1Ym1pc3Npb24uYwo+IEBAIC0zNTAsNyArMzUwLDcgQEAg aW50IGk5MTVfZ3VjX3dxX3Jlc2VydmUoc3RydWN0IGRybV9pOTE1X2dlbV9yZXF1ZXN0ICpyZXF1 ZXN0KQo+ICAJdTMyIGZyZWVzcGFjZTsKPiAgCWludCByZXQ7Cj4KPiAtCXNwaW5fbG9jaygmY2xp ZW50LT53cV9sb2NrKTsKPiArCXNwaW5fbG9ja19pcnEoJmNsaWVudC0+d3FfbG9jayk7Cj4gIAlm cmVlc3BhY2UgPSBDSVJDX1NQQUNFKGNsaWVudC0+d3FfdGFpbCwgZGVzYy0+aGVhZCwgY2xpZW50 LT53cV9zaXplKTsKPiAgCWZyZWVzcGFjZSAtPSBjbGllbnQtPndxX3JzdmQ7Cj4gIAlpZiAobGlr ZWx5KGZyZWVzcGFjZSA+PSB3cWlfc2l6ZSkpIHsKPiBAQCAtMzYwLDcgKzM2MCw3IEBAIGludCBp OTE1X2d1Y193cV9yZXNlcnZlKHN0cnVjdCBkcm1faTkxNV9nZW1fcmVxdWVzdCAqcmVxdWVzdCkK PiAgCQljbGllbnQtPm5vX3dxX3NwYWNlKys7Cj4gIAkJcmV0ID0gLUVBR0FJTjsKPiAgCX0KPiAt CXNwaW5fdW5sb2NrKCZjbGllbnQtPndxX2xvY2spOwo+ICsJc3Bpbl91bmxvY2tfaXJxKCZjbGll bnQtPndxX2xvY2spOwo+Cj4gIAlyZXR1cm4gcmV0Owo+ICB9Cj4gQEAgLTM3Miw5ICszNzIsOSBA QCB2b2lkIGk5MTVfZ3VjX3dxX3VucmVzZXJ2ZShzdHJ1Y3QgZHJtX2k5MTVfZ2VtX3JlcXVlc3Qg KnJlcXVlc3QpCj4KPiAgCUdFTV9CVUdfT04oUkVBRF9PTkNFKGNsaWVudC0+d3FfcnN2ZCkgPCB3 cWlfc2l6ZSk7Cj4KPiAtCXNwaW5fbG9jaygmY2xpZW50LT53cV9sb2NrKTsKPiArCXNwaW5fbG9j a19pcnEoJmNsaWVudC0+d3FfbG9jayk7Cj4gIAljbGllbnQtPndxX3JzdmQgLT0gd3FpX3NpemU7 Cj4gLQlzcGluX3VubG9jaygmY2xpZW50LT53cV9sb2NrKTsKPiArCXNwaW5fdW5sb2NrX2lycSgm Y2xpZW50LT53cV9sb2NrKTsKPiAgfQo+Cj4gIC8qIENvbnN0cnVjdCBhIFdvcmsgSXRlbSBhbmQg YXBwZW5kIGl0IHRvIHRoZSBHdUMncyBXb3JrIFF1ZXVlICovCj4gQEAgLTUzNCwxMCArNTM0LDg3 IEBAIHN0YXRpYyB2b2lkIF9faTkxNV9ndWNfc3VibWl0KHN0cnVjdCBkcm1faTkxNV9nZW1fcmVx dWVzdCAqcnEpCj4KPiAgc3RhdGljIHZvaWQgaTkxNV9ndWNfc3VibWl0KHN0cnVjdCBkcm1faTkx NV9nZW1fcmVxdWVzdCAqcnEpCj4gIHsKPiAtCWk5MTVfZ2VtX3JlcXVlc3Rfc3VibWl0KHJxKTsK PiArCV9faTkxNV9nZW1fcmVxdWVzdF9zdWJtaXQocnEpOwo+ICAJX19pOTE1X2d1Y19zdWJtaXQo cnEpOwo+ICB9Cj4KPiArc3RhdGljIHZvaWQgbmVzdGVkX2VuYWJsZV9zaWduYWxpbmcoc3RydWN0 IGRybV9pOTE1X2dlbV9yZXF1ZXN0ICpycSkKPiArewo+ICsJaWYgKHRlc3RfYW5kX3NldF9iaXQo RE1BX0ZFTkNFX0ZMQUdfRU5BQkxFX1NJR05BTF9CSVQsCj4gKwkJCSAgICAgJnJxLT5mZW5jZS5m bGFncykpCj4gKwkJcmV0dXJuOwo+ICsKPiArCUdFTV9CVUdfT04odGVzdF9iaXQoRE1BX0ZFTkNF X0ZMQUdfU0lHTkFMRURfQklULCAmcnEtPmZlbmNlLmZsYWdzKSk7Cj4gKwo+ICsJc3Bpbl9sb2Nr X25lc3RlZCgmcnEtPmxvY2ssIFNJTkdMRV9ERVBUSF9ORVNUSU5HKTsKPiArCWludGVsX2VuZ2lu ZV9lbmFibGVfc2lnbmFsaW5nKHJxKTsKPiArCXNwaW5fdW5sb2NrKCZycS0+bG9jayk7Cj4gK30K CkNyb3NzZWQgd2lyZXMuIDopIE9wZW5jb2RpbmcgdGhpcyB3b3JrcyBJIGd1ZXNzLgoKSSB3b3Vs ZCBzdGljayBhIHRyYWNlX2RtYV9mZW5jZV9lbmFibGVfc2lnbmFsIGludG8gaXQgdG8gYmUgZXh0 cmEgbmljZS4KClJlZ2FyZHMsCgpUdnJ0a28KCj4gKwo+ICtzdGF0aWMgYm9vbCBpOTE1X2d1Y19k ZXF1ZXVlKHN0cnVjdCBpbnRlbF9lbmdpbmVfY3MgKmVuZ2luZSkKPiArewo+ICsJc3RydWN0IGV4 ZWNsaXN0X3BvcnQgKnBvcnQgPSBlbmdpbmUtPmV4ZWNsaXN0X3BvcnQ7Cj4gKwlzdHJ1Y3QgZHJt X2k5MTVfZ2VtX3JlcXVlc3QgKmxhc3QgPSBwb3J0WzBdLnJlcXVlc3Q7Cj4gKwl1bnNpZ25lZCBs b25nIGZsYWdzOwo+ICsJc3RydWN0IHJiX25vZGUgKnJiOwo+ICsJYm9vbCBzdWJtaXQgPSBmYWxz ZTsKPiArCj4gKwlzcGluX2xvY2tfaXJxc2F2ZSgmZW5naW5lLT50aW1lbGluZS0+bG9jaywgZmxh Z3MpOwo+ICsJcmIgPSBlbmdpbmUtPmV4ZWNsaXN0X2ZpcnN0Owo+ICsJd2hpbGUgKHJiKSB7Cj4g KwkJc3RydWN0IGRybV9pOTE1X2dlbV9yZXF1ZXN0ICpjdXJzb3IgPQo+ICsJCQlyYl9lbnRyeShy YiwgdHlwZW9mKCpjdXJzb3IpLCBwcmlvdHJlZS5ub2RlKTsKPiArCj4gKwkJaWYgKGxhc3QgJiYg Y3Vyc29yLT5jdHggIT0gbGFzdC0+Y3R4KSB7Cj4gKwkJCWlmIChwb3J0ICE9IGVuZ2luZS0+ZXhl Y2xpc3RfcG9ydCkKPiArCQkJCWJyZWFrOwo+ICsKPiArCQkJaTkxNV9nZW1fcmVxdWVzdF9hc3Np Z24oJnBvcnQtPnJlcXVlc3QsIGxhc3QpOwo+ICsJCQluZXN0ZWRfZW5hYmxlX3NpZ25hbGluZyhs YXN0KTsKPiArCQkJcG9ydCsrOwo+ICsJCX0KPiArCj4gKwkJcmIgPSByYl9uZXh0KHJiKTsKPiAr CQlyYl9lcmFzZSgmY3Vyc29yLT5wcmlvdHJlZS5ub2RlLCAmZW5naW5lLT5leGVjbGlzdF9xdWV1 ZSk7Cj4gKwkJUkJfQ0xFQVJfTk9ERSgmY3Vyc29yLT5wcmlvdHJlZS5ub2RlKTsKPiArCQljdXJz b3ItPnByaW90cmVlLnByaW9yaXR5ID0gSU5UX01BWDsKPiArCj4gKwkJaTkxNV9ndWNfc3VibWl0 KGN1cnNvcik7Cj4gKwkJbGFzdCA9IGN1cnNvcjsKPiArCQlzdWJtaXQgPSB0cnVlOwo+ICsJfQo+ ICsJaWYgKHN1Ym1pdCkgewo+ICsJCWk5MTVfZ2VtX3JlcXVlc3RfYXNzaWduKCZwb3J0LT5yZXF1 ZXN0LCBsYXN0KTsKPiArCQluZXN0ZWRfZW5hYmxlX3NpZ25hbGluZyhsYXN0KTsKPiArCQllbmdp bmUtPmV4ZWNsaXN0X2ZpcnN0ID0gcmI7Cj4gKwl9Cj4gKwlzcGluX3VubG9ja19pcnFyZXN0b3Jl KCZlbmdpbmUtPnRpbWVsaW5lLT5sb2NrLCBmbGFncyk7Cj4gKwo+ICsJcmV0dXJuIHN1Ym1pdDsK PiArfQo+ICsKPiArc3RhdGljIHZvaWQgaTkxNV9ndWNfaXJxX2hhbmRsZXIodW5zaWduZWQgbG9u ZyBkYXRhKQo+ICt7Cj4gKwlzdHJ1Y3QgaW50ZWxfZW5naW5lX2NzICplbmdpbmUgPSAoc3RydWN0 IGludGVsX2VuZ2luZV9jcyAqKWRhdGE7Cj4gKwlzdHJ1Y3QgZXhlY2xpc3RfcG9ydCAqcG9ydCA9 IGVuZ2luZS0+ZXhlY2xpc3RfcG9ydDsKPiArCXN0cnVjdCBkcm1faTkxNV9nZW1fcmVxdWVzdCAq cnE7Cj4gKwlib29sIHN1Ym1pdDsKPiArCj4gKwlkbyB7Cj4gKwkJcnEgPSBwb3J0WzBdLnJlcXVl c3Q7Cj4gKwkJd2hpbGUgKHJxICYmIGk5MTVfZ2VtX3JlcXVlc3RfY29tcGxldGVkKHJxKSkgewo+ ICsJCQlpOTE1X2dlbV9yZXF1ZXN0X3B1dChycSk7Cj4gKwkJCXJxID0gcG9ydFsxXS5yZXF1ZXN0 Owo+ICsJCQlwb3J0WzBdLnJlcXVlc3QgPSBycTsKPiArCQkJcG9ydFsxXS5yZXF1ZXN0ID0gTlVM TDsKPiArCQl9Cj4gKwo+ICsJCXN1Ym1pdCA9IGZhbHNlOwo+ICsJCWlmICghcG9ydFsxXS5yZXF1 ZXN0KQo+ICsJCQlzdWJtaXQgPSBpOTE1X2d1Y19kZXF1ZXVlKGVuZ2luZSk7Cj4gKwl9IHdoaWxl IChzdWJtaXQpOwo+ICt9Cj4gKwo+ICAvKgo+ICAgKiBFdmVyeXRoaW5nIGJlbG93IGhlcmUgaXMg Y29uY2VybmVkIHdpdGggc2V0dXAgJiB0ZWFyZG93biwgYW5kIGlzCj4gICAqIHRoZXJlZm9yZSBu b3QgcGFydCBvZiB0aGUgc29tZXdoYXQgdGltZS1jcml0aWNhbCBiYXRjaC1zdWJtaXNzaW9uCj4g QEAgLTE0MjgsOCArMTUwNSw5IEBAIGludCBpOTE1X2d1Y19zdWJtaXNzaW9uX2VuYWJsZShzdHJ1 Y3QgZHJtX2k5MTVfcHJpdmF0ZSAqZGV2X3ByaXYpCj4gIAlmb3JfZWFjaF9lbmdpbmUoZW5naW5l LCBkZXZfcHJpdiwgaWQpIHsKPiAgCQlzdHJ1Y3QgZHJtX2k5MTVfZ2VtX3JlcXVlc3QgKnJxOwo+ Cj4gLQkJZW5naW5lLT5zdWJtaXRfcmVxdWVzdCA9IGk5MTVfZ3VjX3N1Ym1pdDsKPiAtCQllbmdp bmUtPnNjaGVkdWxlID0gTlVMTDsKPiArCQl0YXNrbGV0X2luaXQoJmVuZ2luZS0+aXJxX3Rhc2ts ZXQsCj4gKwkJCSAgICAgaTkxNV9ndWNfaXJxX2hhbmRsZXIsCj4gKwkJCSAgICAgKHVuc2lnbmVk IGxvbmcpZW5naW5lKTsKPgo+ICAJCS8qIFJlcGxheSB0aGUgY3VycmVudCBzZXQgb2YgcHJldmlv dXNseSBzdWJtaXR0ZWQgcmVxdWVzdHMgKi8KPiAgCQlsaXN0X2Zvcl9lYWNoX2VudHJ5KHJxLCAm ZW5naW5lLT50aW1lbGluZS0+cmVxdWVzdHMsIGxpbmspIHsKPiBkaWZmIC0tZ2l0IGEvZHJpdmVy cy9ncHUvZHJtL2k5MTUvaTkxNV9pcnEuYyBiL2RyaXZlcnMvZ3B1L2RybS9pOTE1L2k5MTVfaXJx LmMKPiBpbmRleCA3NWZiMWY2NmNjMGMuLjYyNDI2N2JlYmY1NiAxMDA2NDQKPiAtLS0gYS9kcml2 ZXJzL2dwdS9kcm0vaTkxNS9pOTE1X2lycS5jCj4gKysrIGIvZHJpdmVycy9ncHUvZHJtL2k5MTUv aTkxNV9pcnEuYwo+IEBAIC0xMzQxLDggKzEzNDEsMTAgQEAgc3RhdGljIHZvaWQgc25iX2d0X2ly cV9oYW5kbGVyKHN0cnVjdCBkcm1faTkxNV9wcml2YXRlICpkZXZfcHJpdiwKPiAgc3RhdGljIF9f YWx3YXlzX2lubGluZSB2b2lkCj4gIGdlbjhfY3NfaXJxX2hhbmRsZXIoc3RydWN0IGludGVsX2Vu Z2luZV9jcyAqZW5naW5lLCB1MzIgaWlyLCBpbnQgdGVzdF9zaGlmdCkKPiAgewo+IC0JaWYgKGlp ciAmIChHVF9SRU5ERVJfVVNFUl9JTlRFUlJVUFQgPDwgdGVzdF9zaGlmdCkpCj4gKwlpZiAoaWly ICYgKEdUX1JFTkRFUl9VU0VSX0lOVEVSUlVQVCA8PCB0ZXN0X3NoaWZ0KSkgewo+ICsJCXRhc2ts ZXRfc2NoZWR1bGUoJmVuZ2luZS0+aXJxX3Rhc2tsZXQpOwo+ICAJCW5vdGlmeV9yaW5nKGVuZ2lu ZSk7Cj4gKwl9Cj4gIAlpZiAoaWlyICYgKEdUX0NPTlRFWFRfU1dJVENIX0lOVEVSUlVQVCA8PCB0 ZXN0X3NoaWZ0KSkKPiAgCQl0YXNrbGV0X3NjaGVkdWxlKCZlbmdpbmUtPmlycV90YXNrbGV0KTsK PiAgfQo+IGRpZmYgLS1naXQgYS9kcml2ZXJzL2dwdS9kcm0vaTkxNS9pbnRlbF9scmMuYyBiL2Ry aXZlcnMvZ3B1L2RybS9pOTE1L2ludGVsX2xyYy5jCj4gaW5kZXggZDlkZTQ1NWRhMTMxLi4zM2Zl N2U1YzkzNjQgMTAwNjQ0Cj4gLS0tIGEvZHJpdmVycy9ncHUvZHJtL2k5MTUvaW50ZWxfbHJjLmMK PiArKysgYi9kcml2ZXJzL2dwdS9kcm0vaTkxNS9pbnRlbF9scmMuYwo+IEBAIC0xMzUyLDcgKzEz NTIsNyBAQCBzdGF0aWMgaW50IGdlbjhfaW5pdF9jb21tb25fcmluZyhzdHJ1Y3QgaW50ZWxfZW5n aW5lX2NzICplbmdpbmUpCj4gIAlEUk1fREVCVUdfRFJJVkVSKCJFeGVjbGlzdHMgZW5hYmxlZCBm b3IgJXNcbiIsIGVuZ2luZS0+bmFtZSk7Cj4KPiAgCS8qIEFmdGVyIGEgR1BVIHJlc2V0LCB3ZSBt YXkgaGF2ZSByZXF1ZXN0cyB0byByZXBsYXkgKi8KPiAtCWlmICghZXhlY2xpc3RzX2Vsc3BfaWRs ZShlbmdpbmUpKSB7Cj4gKwlpZiAoIWk5MTUuZW5hYmxlX2d1Y19zdWJtaXNzaW9uICYmICFleGVj bGlzdHNfZWxzcF9pZGxlKGVuZ2luZSkpIHsKPiAgCQllbmdpbmUtPmV4ZWNsaXN0X3BvcnRbMF0u Y291bnQgPSAwOwo+ICAJCWVuZ2luZS0+ZXhlY2xpc3RfcG9ydFsxXS5jb3VudCA9IDA7Cj4gIAkJ ZXhlY2xpc3RzX3N1Ym1pdF9wb3J0cyhlbmdpbmUpOwo+IEBAIC0xNDIwLDkgKzE0MjAsNiBAQCBz dGF0aWMgdm9pZCByZXNldF9jb21tb25fcmluZyhzdHJ1Y3QgaW50ZWxfZW5naW5lX2NzICplbmdp bmUsCj4gIAlyZXF1ZXN0LT5yaW5nLT5sYXN0X3JldGlyZWRfaGVhZCA9IC0xOwo+ICAJaW50ZWxf cmluZ191cGRhdGVfc3BhY2UocmVxdWVzdC0+cmluZyk7Cj4KPiAtCWlmIChpOTE1LmVuYWJsZV9n dWNfc3VibWlzc2lvbikKPiAtCQlyZXR1cm47Cj4gLQo+ICAJLyogQ2F0Y2ggdXAgd2l0aCBhbnkg bWlzc2VkIGNvbnRleHQtc3dpdGNoIGludGVycnVwdHMgKi8KPiAgCUk5MTVfV1JJVEUoUklOR19D T05URVhUX1NUQVRVU19QVFIoZW5naW5lKSwgX01BU0tFRF9GSUVMRCgweGZmZmYsIDApKTsKPiAg CWlmIChyZXF1ZXN0LT5jdHggIT0gcG9ydFswXS5yZXF1ZXN0LT5jdHgpIHsKPgpfX19fX19fX19f X19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXwpJbnRlbC1nZnggbWFpbGluZyBs aXN0CkludGVsLWdmeEBsaXN0cy5mcmVlZGVza3RvcC5vcmcKaHR0cHM6Ly9saXN0cy5mcmVlZGVz a3RvcC5vcmcvbWFpbG1hbi9saXN0aW5mby9pbnRlbC1nZngK