From mboxrd@z Thu Jan 1 00:00:00 1970 From: Kevin Strasser Subject: [PATCH 2/3] drm: Add optional PIXEL_NORMALIZE_RANGE property to drm_plane Date: Wed, 28 Nov 2018 22:38:12 -0800 Message-ID: <1543473493-30973-3-git-send-email-kevin.strasser@intel.com> References: <1543473493-30973-1-git-send-email-kevin.strasser@intel.com> Mime-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: base64 Return-path: In-Reply-To: <1543473493-30973-1-git-send-email-kevin.strasser@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, dri-devel@lists.freedesktop.org Cc: David Airlie , Daniel Vetter List-Id: dri-devel@lists.freedesktop.org QWRkIGFuIG9wdGlvbmFsIHByb3BlcnR5IHRvIGFsbG93IGFwcGxpY2F0aW9ucyB0byBpbmRpY2F0 ZSB3aGF0IHJhbmdlIHRoZWlyCmZsb2F0aW5nIHBvaW50IHBpeGVsIGRhdGEgaXMgbm9ybWFsaXpl ZCB0by4gRHJpdmVycyBhcmUgZnJlZSB0byBjaG9vc2Ugd2hhdApyYW5nZXMgdGhleSB3YW50IHRv IHN1cHBvcnQgYW5kIGNhbiBhdHRhY2ggdGhpcyBwcm9wZXJ0eSB0byBlYWNoIHBsYW5lIHRoYXQK YWN0dWFsbHkgc3VwcG9ydHMgZmxvYXRpbmcgcG9pbnQgZm9ybWF0cwoKU2lnbmVkLW9mZi1ieTog S2V2aW4gU3RyYXNzZXIgPGtldmluLnN0cmFzc2VyQGludGVsLmNvbT4KQ2M6IFVtYSBTaGFua2Fy IDx1bWEuc2hhbmthckBpbnRlbC5jb20+CkNjOiBTaGFzaGFuayBTaGFybWEgPHNoYXNoYW5rLnNo YXJtYUBpbnRlbC5jb20+CkNjOiBWaWxsZSBTeXJqw6Rsw6QgPHZpbGxlLnN5cmphbGFAbGludXgu aW50ZWwuY29tPgpDYzogRGF2aWQgQWlybGllIDxhaXJsaWVkQGxpbnV4LmllPgpDYzogRGFuaWVs IFZldHRlciA8ZGFuaWVsLnZldHRlckBmZndsbC5jaD4KQ2M6IGRyaS1kZXZlbEBsaXN0cy5mcmVl ZGVza3RvcC5vcmcKLS0tCiBkcml2ZXJzL2dwdS9kcm0vZHJtX2F0b21pYy5jICAgICAgICB8ICAy ICsrCiBkcml2ZXJzL2dwdS9kcm0vZHJtX2F0b21pY191YXBpLmMgICB8ICA0ICsrKwogZHJpdmVy cy9ncHUvZHJtL2RybV9jb2xvcl9tZ210LmMgICAgfCA2OCArKysrKysrKysrKysrKysrKysrKysr KysrKysrKysrKysrKysrCiBkcml2ZXJzL2dwdS9kcm0vZHJtX2NydGNfaW50ZXJuYWwuaCB8ICAx ICsKIGluY2x1ZGUvZHJtL2RybV9jb2xvcl9tZ210LmggICAgICAgIHwgIDkgKysrKysKIGluY2x1 ZGUvZHJtL2RybV9wbGFuZS5oICAgICAgICAgICAgIHwgMTQgKysrKysrKysKIDYgZmlsZXMgY2hh bmdlZCwgOTggaW5zZXJ0aW9ucygrKQoKZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2RybS9kcm1f YXRvbWljLmMgYi9kcml2ZXJzL2dwdS9kcm0vZHJtX2F0b21pYy5jCmluZGV4IDE3MDZlZDEuLjFm NTIwZWYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZ3B1L2RybS9kcm1fYXRvbWljLmMKKysrIGIvZHJp dmVycy9ncHUvZHJtL2RybV9hdG9taWMuYwpAQCAtNjI0LDYgKzYyNCw4IEBAIHN0YXRpYyB2b2lk IGRybV9hdG9taWNfcGxhbmVfcHJpbnRfc3RhdGUoc3RydWN0IGRybV9wcmludGVyICpwLAogCQkg ICBkcm1fZ2V0X2NvbG9yX2VuY29kaW5nX25hbWUoc3RhdGUtPmNvbG9yX2VuY29kaW5nKSk7CiAJ ZHJtX3ByaW50ZihwLCAiXHRjb2xvci1yYW5nZT0lc1xuIiwKIAkJICAgZHJtX2dldF9jb2xvcl9y YW5nZV9uYW1lKHN0YXRlLT5jb2xvcl9yYW5nZSkpOworCWRybV9wcmludGYocCwgIlx0cGl4ZWwt bm9ybWFsaXplLXJhbmdlPSVzXG4iLAorCQkgICBkcm1fZ2V0X3BpeGVsX25vcm1hbGl6ZV9yYW5n ZV9uYW1lKHN0YXRlLT5waXhlbF9ub3JtYWxpemVfcmFuZ2UpKTsKIAogCWlmIChwbGFuZS0+ZnVu Y3MtPmF0b21pY19wcmludF9zdGF0ZSkKIAkJcGxhbmUtPmZ1bmNzLT5hdG9taWNfcHJpbnRfc3Rh dGUocCwgc3RhdGUpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncHUvZHJtL2RybV9hdG9taWNfdWFw aS5jIGIvZHJpdmVycy9ncHUvZHJtL2RybV9hdG9taWNfdWFwaS5jCmluZGV4IDg2YWMzMzkuLmU3 OWEyM2NkIDEwMDY0NAotLS0gYS9kcml2ZXJzL2dwdS9kcm0vZHJtX2F0b21pY191YXBpLmMKKysr IGIvZHJpdmVycy9ncHUvZHJtL2RybV9hdG9taWNfdWFwaS5jCkBAIC01NjYsNiArNTY2LDggQEAg c3RhdGljIGludCBkcm1fYXRvbWljX3BsYW5lX3NldF9wcm9wZXJ0eShzdHJ1Y3QgZHJtX3BsYW5l ICpwbGFuZSwKIAkJc3RhdGUtPmNvbG9yX2VuY29kaW5nID0gdmFsOwogCX0gZWxzZSBpZiAocHJv cGVydHkgPT0gcGxhbmUtPmNvbG9yX3JhbmdlX3Byb3BlcnR5KSB7CiAJCXN0YXRlLT5jb2xvcl9y YW5nZSA9IHZhbDsKKwl9IGVsc2UgaWYgKHByb3BlcnR5ID09IHBsYW5lLT5waXhlbF9ub3JtYWxp emVfcmFuZ2VfcHJvcGVydHkpIHsKKwkJc3RhdGUtPnBpeGVsX25vcm1hbGl6ZV9yYW5nZSA9IHZh bDsKIAl9IGVsc2UgaWYgKHBsYW5lLT5mdW5jcy0+YXRvbWljX3NldF9wcm9wZXJ0eSkgewogCQly ZXR1cm4gcGxhbmUtPmZ1bmNzLT5hdG9taWNfc2V0X3Byb3BlcnR5KHBsYW5lLCBzdGF0ZSwKIAkJ CQlwcm9wZXJ0eSwgdmFsKTsKQEAgLTYyMSw2ICs2MjMsOCBAQCBkcm1fYXRvbWljX3BsYW5lX2dl dF9wcm9wZXJ0eShzdHJ1Y3QgZHJtX3BsYW5lICpwbGFuZSwKIAkJKnZhbCA9IHN0YXRlLT5jb2xv cl9lbmNvZGluZzsKIAl9IGVsc2UgaWYgKHByb3BlcnR5ID09IHBsYW5lLT5jb2xvcl9yYW5nZV9w cm9wZXJ0eSkgewogCQkqdmFsID0gc3RhdGUtPmNvbG9yX3JhbmdlOworCX0gZWxzZSBpZiAocHJv cGVydHkgPT0gcGxhbmUtPnBpeGVsX25vcm1hbGl6ZV9yYW5nZV9wcm9wZXJ0eSkgeworCQkqdmFs ID0gc3RhdGUtPnBpeGVsX25vcm1hbGl6ZV9yYW5nZTsKIAl9IGVsc2UgaWYgKHBsYW5lLT5mdW5j cy0+YXRvbWljX2dldF9wcm9wZXJ0eSkgewogCQlyZXR1cm4gcGxhbmUtPmZ1bmNzLT5hdG9taWNf Z2V0X3Byb3BlcnR5KHBsYW5lLCBzdGF0ZSwgcHJvcGVydHksIHZhbCk7CiAJfSBlbHNlIHsKZGlm ZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2RybS9kcm1fY29sb3JfbWdtdC5jIGIvZHJpdmVycy9ncHUv ZHJtL2RybV9jb2xvcl9tZ210LmMKaW5kZXggNTgxY2MzNy4uYjFlMmEwYSAxMDA2NDQKLS0tIGEv ZHJpdmVycy9ncHUvZHJtL2RybV9jb2xvcl9tZ210LmMKKysrIGIvZHJpdmVycy9ncHUvZHJtL2Ry bV9jb2xvcl9tZ210LmMKQEAgLTQ3MiwzICs0NzIsNzEgQEAgaW50IGRybV9wbGFuZV9jcmVhdGVf Y29sb3JfcHJvcGVydGllcyhzdHJ1Y3QgZHJtX3BsYW5lICpwbGFuZSwKIAlyZXR1cm4gMDsKIH0K IEVYUE9SVF9TWU1CT0woZHJtX3BsYW5lX2NyZWF0ZV9jb2xvcl9wcm9wZXJ0aWVzKTsKKworc3Rh dGljIGNvbnN0IGNoYXIgKiBjb25zdCBwaXhlbF9ub3JtYWxpemVfcmFuZ2VfbmFtZVtdID0gewor CVtEUk1fUElYRUxfTk9STUFMSVpFX1JBTkdFXzBfMV0gPSAiMC4wIC0gMS4wIiwKKwlbRFJNX1BJ WEVMX05PUk1BTElaRV9SQU5HRV8wXzI1NV0gPSAiMC4wIC0gMjU1LjAiLAorfTsKKworLyoqCisg KiBkcm1fZ2V0X3BpeGVsX25vcm1hbGl6ZV9yYW5nZV9uYW1lIC0gcmV0dXJuIGEgc3RyaW5nIGZv ciBwaXhlbCBub3JtYWxpemUKKyAqIHJhbmdlCisgKiBAcmFuZ2U6IHBpeGVsIG5vcm1hbGl6ZSBy YW5nZSB0byBjb21wdXRlIG5hbWUgb2YKKyAqCisgKiBJbiBjb250cmFzdCB0byB0aGUgb3RoZXIg ZHJtX2dldF8qX25hbWUgZnVuY3Rpb25zIHRoaXMgb25lIGhlcmUgcmV0dXJucyBhCisgKiBjb25z dCBwb2ludGVyIGFuZCBoZW5jZSBpcyB0aHJlYWRzYWZlLgorICovCitjb25zdCBjaGFyICpkcm1f Z2V0X3BpeGVsX25vcm1hbGl6ZV9yYW5nZV9uYW1lKGVudW0gZHJtX3BpeGVsX25vcm1hbGl6ZV9y YW5nZSByYW5nZSkKK3sKKwlpZiAoV0FSTl9PTihyYW5nZSA+PSBBUlJBWV9TSVpFKHBpeGVsX25v cm1hbGl6ZV9yYW5nZV9uYW1lKSkpCisJCXJldHVybiAidW5rbm93biI7CisKKwlyZXR1cm4gcGl4 ZWxfbm9ybWFsaXplX3JhbmdlX25hbWVbcmFuZ2VdOworfQorCisvKioKKyAqIGRybV9wbGFuZV9j cmVhdGVfcGl4ZWxfbm9ybWFsaXplX3JhbmdlX3Byb3BlcnR5IC0gcGl4ZWwgbm9ybWFsaXplIHJh bmdlCisgKiBwcm9wZXJ0eQorICogQHBsYW5lOiBwbGFuZSBvYmplY3QKKyAqIEBzdXBwb3J0ZWRf cmFuZ2VzOiBiaXRmaWVsZCBpbmRpY2F0aW5nIHN1cHBvcnRlZCBub3JtYWxpemUgcmFuZ2VzCisg KiBAZGVmYXVsdF9yYW5nZTogZGVmYXVsdCBub3JtYWxpemUgcmFuZ2UKKyAqCisgKiBDcmVhdGUg YW5kIGF0dGFjaCBwbGFuZSBzcGVjaWZpYyBQSVhFTF9OT1JNQUxJWkVfUkFOR0UgcHJvcGVydHkg dG8gQHBsYW5lLgorICogVGhlIHN1cHBvcnRlZCByYW5nZXMgc2hvdWxkIGJlIHByb3ZpZGVkIGlu IHN1cHBvcnRlZF9yYW5nZXMgYml0bWFzay4gRWVhY2gKKyAqIGJpdCBzZXQgaW4gdGhlIGJpdG1h c2sgaW5kaWNhdGVzIHRoYXQgaXRzIG51bWJlciBhcyBlbnVtIHZhbHVlIGlzIHN1cHBvcnRlZC4K KyAqLworaW50IGRybV9wbGFuZV9jcmVhdGVfcGl4ZWxfbm9ybWFsaXplX3JhbmdlX3Byb3BlcnR5 KHN0cnVjdCBkcm1fcGxhbmUgKnBsYW5lLAorCXUzMiBzdXBwb3J0ZWRfcmFuZ2VzLCBlbnVtIGRy bV9waXhlbF9ub3JtYWxpemVfcmFuZ2UgZGVmYXVsdF9yYW5nZSkKK3sKKwlzdHJ1Y3QgZHJtX3By b3BlcnR5ICpwcm9wOworCXN0cnVjdCBkcm1fcHJvcF9lbnVtX2xpc3QgZW51bV9saXN0W0RSTV9Q SVhFTF9OT1JNQUxJWkVfUkFOR0VfTUFYXTsKKwlpbnQgaSwgbGVuID0gMDsKKworCWlmIChXQVJO X09OKHN1cHBvcnRlZF9yYW5nZXMgPT0gMCB8fAorCQkgICAgKHN1cHBvcnRlZF9yYW5nZXMgJiAt QklUKERSTV9QSVhFTF9OT1JNQUxJWkVfUkFOR0VfTUFYKSkgIT0gMCB8fAorCQkgICAgKHN1cHBv cnRlZF9yYW5nZXMgJiBCSVQoZGVmYXVsdF9yYW5nZSkpID09IDApKQorCQlyZXR1cm4gLUVJTlZB TDsKKworCWZvciAoaSA9IDA7IGkgPCBEUk1fUElYRUxfTk9STUFMSVpFX1JBTkdFX01BWDsgaSsr KSB7CisJCWlmICgoc3VwcG9ydGVkX3JhbmdlcyAmIEJJVChpKSkgPT0gMCkKKwkJCWNvbnRpbnVl OworCisJCWVudW1fbGlzdFtsZW5dLnR5cGUgPSBpOworCQllbnVtX2xpc3RbbGVuXS5uYW1lID0g cGl4ZWxfbm9ybWFsaXplX3JhbmdlX25hbWVbaV07CisJCWxlbisrOworCX0KKworCXByb3AgPSBk cm1fcHJvcGVydHlfY3JlYXRlX2VudW0ocGxhbmUtPmRldiwgMCwgIlBJWEVMX05PUk1BTElaRV9S QU5HRSIsCisJCQkJCWVudW1fbGlzdCwgbGVuKTsKKwlpZiAoIXByb3ApCisJCXJldHVybiAtRU5P TUVNOworCisJcGxhbmUtPnBpeGVsX25vcm1hbGl6ZV9yYW5nZV9wcm9wZXJ0eSA9IHByb3A7CisJ ZHJtX29iamVjdF9hdHRhY2hfcHJvcGVydHkoJnBsYW5lLT5iYXNlLCBwcm9wLCBkZWZhdWx0X3Jh bmdlKTsKKworCWlmIChwbGFuZS0+c3RhdGUpCisJCXBsYW5lLT5zdGF0ZS0+cGl4ZWxfbm9ybWFs aXplX3JhbmdlID0gZGVmYXVsdF9yYW5nZTsKKworCXJldHVybiAwOworfQorRVhQT1JUX1NZTUJP TChkcm1fcGxhbmVfY3JlYXRlX3BpeGVsX25vcm1hbGl6ZV9yYW5nZV9wcm9wZXJ0eSk7CmRpZmYg LS1naXQgYS9kcml2ZXJzL2dwdS9kcm0vZHJtX2NydGNfaW50ZXJuYWwuaCBiL2RyaXZlcnMvZ3B1 L2RybS9kcm1fY3J0Y19pbnRlcm5hbC5oCmluZGV4IDg2ODkzNDQuLjgyZGRjNTAgMTAwNjQ0Ci0t LSBhL2RyaXZlcnMvZ3B1L2RybS9kcm1fY3J0Y19pbnRlcm5hbC5oCisrKyBiL2RyaXZlcnMvZ3B1 L2RybS9kcm1fY3J0Y19pbnRlcm5hbC5oCkBAIC05MCw2ICs5MCw3IEBAIGludCBkcm1fbW9kZV9k ZXN0cm95X2R1bWJfaW9jdGwoc3RydWN0IGRybV9kZXZpY2UgKmRldiwKIC8qIGRybV9jb2xvcl9t Z210LmMgKi8KIGNvbnN0IGNoYXIgKmRybV9nZXRfY29sb3JfZW5jb2RpbmdfbmFtZShlbnVtIGRy bV9jb2xvcl9lbmNvZGluZyBlbmNvZGluZyk7CiBjb25zdCBjaGFyICpkcm1fZ2V0X2NvbG9yX3Jh bmdlX25hbWUoZW51bSBkcm1fY29sb3JfcmFuZ2UgcmFuZ2UpOworY29uc3QgY2hhciAqZHJtX2dl dF9waXhlbF9ub3JtYWxpemVfcmFuZ2VfbmFtZShlbnVtIGRybV9waXhlbF9ub3JtYWxpemVfcmFu Z2UgcmFuZ2UpOwogCiAvKiBJT0NUTHMgKi8KIGludCBkcm1fbW9kZV9nYW1tYV9nZXRfaW9jdGwo c3RydWN0IGRybV9kZXZpY2UgKmRldiwKZGlmZiAtLWdpdCBhL2luY2x1ZGUvZHJtL2RybV9jb2xv cl9tZ210LmggYi9pbmNsdWRlL2RybS9kcm1fY29sb3JfbWdtdC5oCmluZGV4IDkwZWY5OTkuLjQ2 MGUzMWMgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvZHJtL2RybV9jb2xvcl9tZ210LmgKKysrIGIvaW5j bHVkZS9kcm0vZHJtX2NvbG9yX21nbXQuaApAQCAtNjQsOSArNjQsMTggQEAgZW51bSBkcm1fY29s b3JfcmFuZ2UgewogCURSTV9DT0xPUl9SQU5HRV9NQVgsCiB9OwogCitlbnVtIGRybV9waXhlbF9u b3JtYWxpemVfcmFuZ2UgeworCURSTV9QSVhFTF9OT1JNQUxJWkVfUkFOR0VfMF8xLAorCURSTV9Q SVhFTF9OT1JNQUxJWkVfUkFOR0VfMF8yNTUsCisJRFJNX1BJWEVMX05PUk1BTElaRV9SQU5HRV9N QVgKK307CisKIGludCBkcm1fcGxhbmVfY3JlYXRlX2NvbG9yX3Byb3BlcnRpZXMoc3RydWN0IGRy bV9wbGFuZSAqcGxhbmUsCiAJCQkJICAgICAgdTMyIHN1cHBvcnRlZF9lbmNvZGluZ3MsCiAJCQkJ ICAgICAgdTMyIHN1cHBvcnRlZF9yYW5nZXMsCiAJCQkJICAgICAgZW51bSBkcm1fY29sb3JfZW5j b2RpbmcgZGVmYXVsdF9lbmNvZGluZywKIAkJCQkgICAgICBlbnVtIGRybV9jb2xvcl9yYW5nZSBk ZWZhdWx0X3JhbmdlKTsKK2ludCBkcm1fcGxhbmVfY3JlYXRlX3BpeGVsX25vcm1hbGl6ZV9yYW5n ZV9wcm9wZXJ0eShzdHJ1Y3QgZHJtX3BsYW5lICpwbGFuZSwKKwkJCQl1MzIgc3VwcG9ydGVkX3Jh bmdlcywKKwkJCQllbnVtIGRybV9waXhlbF9ub3JtYWxpemVfcmFuZ2UgZGVmYXVsdF9yYW5nZSk7 CiAjZW5kaWYKZGlmZiAtLWdpdCBhL2luY2x1ZGUvZHJtL2RybV9wbGFuZS5oIGIvaW5jbHVkZS9k cm0vZHJtX3BsYW5lLmgKaW5kZXggMzcwMWY1Ni4uMTFmNWJlNCAxMDA2NDQKLS0tIGEvaW5jbHVk ZS9kcm0vZHJtX3BsYW5lLmgKKysrIGIvaW5jbHVkZS9kcm0vZHJtX3BsYW5lLmgKQEAgLTEzMCw2 ICsxMzAsMTMgQEAgc3RydWN0IGRybV9wbGFuZV9zdGF0ZSB7CiAJdWludDE2X3QgcGl4ZWxfYmxl bmRfbW9kZTsKIAogCS8qKgorCSAqIEBwaXhlbF9ub3JtYWxpemVfcmFuZ2U6CisJICogVGhlIHJh bmdlIHRvIHVzZSBmb3IgZmxvYXRpbmcgcG9pbnQgcGl4ZWwgZGF0YSBub3JtYWxpemF0aW9uLiBT ZWUKKwkgKiBkcm1fcGxhbmVfY3JlYXRlX3BpeGVsX25vcm1hbGl6ZV9yYW5nZV9wcm9wZXJ0eSgp IGZvciBtb3JlIGRldGFpbHMuCisJICovCisJZW51bSBkcm1fcGl4ZWxfbm9ybWFsaXplX3Jhbmdl IHBpeGVsX25vcm1hbGl6ZV9yYW5nZTsKKworCS8qKgogCSAqIEByb3RhdGlvbjoKIAkgKiBSb3Rh dGlvbiBvZiB0aGUgcGxhbmUuIFNlZSBkcm1fcGxhbmVfY3JlYXRlX3JvdGF0aW9uX3Byb3BlcnR5 KCkgZm9yCiAJICogbW9yZSBkZXRhaWxzLgpAQCAtNjgwLDYgKzY4NywxMyBAQCBzdHJ1Y3QgZHJt X3BsYW5lIHsKIAlzdHJ1Y3QgZHJtX3Byb3BlcnR5ICpibGVuZF9tb2RlX3Byb3BlcnR5OwogCiAJ LyoqCisJICogQHBpeGVsX25vcm1hbGl6ZV9yYW5nZV9wcm9wZXJ0eToKKwkgKiBPcHRpb25hbCAi UElYRUxfTk9STUFMSVpFX1JBTkdFIiBwcm9wZXJ0eSBmb3IgdGhpcyBwbGFuZS4gU2VlCisJICog ZHJtX3BsYW5lX2NyZWF0ZV9waXhlbF9ub3JtYWxpemVfcmFuZ2VfcHJvcGVydHkoKS4KKwkgKi8K KwlzdHJ1Y3QgZHJtX3Byb3BlcnR5ICpwaXhlbF9ub3JtYWxpemVfcmFuZ2VfcHJvcGVydHk7CisK KwkvKioKIAkgKiBAY29sb3JfZW5jb2RpbmdfcHJvcGVydHk6CiAJICoKIAkgKiBPcHRpb25hbCAi Q09MT1JfRU5DT0RJTkciIGVudW0gcHJvcGVydHkgZm9yIHNwZWNpZnlpbmcKLS0gCjIuNy40Cgpf X19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXwpJbnRlbC1nZngg bWFpbGluZyBsaXN0CkludGVsLWdmeEBsaXN0cy5mcmVlZGVza3RvcC5vcmcKaHR0cHM6Ly9saXN0 cy5mcmVlZGVza3RvcC5vcmcvbWFpbG1hbi9saXN0aW5mby9pbnRlbC1nZngK