From mboxrd@z Thu Jan 1 00:00:00 1970 From: Praveen Kumar Subject: [PATCH 15/17] rbtree: handle 1-child recoloring in rb_erase() instead of rb_erase_color() Date: Thu, 1 Jun 2017 02:17:06 +0530 Message-ID: <20170531204708.10470-16-kpraveen.lkml@gmail.com> References: <20170531204708.10470-1-kpraveen.lkml@gmail.com> Mime-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: base64 Return-path: In-Reply-To: <20170531204708.10470-1-kpraveen.lkml@gmail.com> List-Unsubscribe: , List-Post: List-Help: List-Subscribe: , Errors-To: xen-devel-bounces@lists.xen.org Sender: "Xen-devel" To: xen-devel@lists.xen.org Cc: Andrea Arcangeli , sstabellini@kernel.org, wei.liu2@citrix.com, Peter Zijlstra , George.Dunlap@eu.citrix.com, andrew.cooper3@citrix.com, dario.faggioli@citrix.com, ian.jackson@eu.citrix.com, tim@xen.org, Linus Torvalds , Praveen Kumar , jbeulich@suse.com, Andrew Morton , Michel Lespinasse , David Woodhouse List-Id: xen-devel@lists.xenproject.org QW4gaW50ZXJlc3Rpbmcgb2JzZXJ2YXRpb24gZm9yIHJiX2VyYXNlKCkgaXMgdGhhdCB3aGVuIGEg bm9kZSBoYXMKZXhhY3RseSBvbmUgY2hpbGQsIHRoZSBub2RlIG11c3QgYmUgYmxhY2sgYW5kIHRo ZSBjaGlsZCBtdXN0IGJlIHJlZC4KQW4gaW50ZXJlc3RpbmcgY29uc2VxdWVuY2UgaXMgdGhhdCBy ZW1vdmluZyBzdWNoIGEgbm9kZSBjYW4gYmUgZG9uZSBieQpzaW1wbHkgcmVwbGFjaW5nIGl0IHdp dGggaXRzIGNoaWxkIGFuZCBtYWtpbmcgdGhlIGNoaWxkIGJsYWNrLAp3aGljaCB3ZSBjYW4gZG8g ZWZmaWNpZW50bHkgaW4gcmJfZXJhc2UoKS4gX19yYl9lcmFzZV9jb2xvcigpIHRoZW4Kb25seSBu ZWVkcyB0byBoYW5kbGUgdGhlIG5vLWNoaWxkcyBjYXNlIGFuZCBjYW4gYmUgbW9kaWZpZWQgYWNj b3JkaW5nbHkuCgpjb21taXQgNDZiNjEzNWE3NDAyYWMyM2M1YjI1ZjJiZDc5YjAzYmFiOGY5ODI3 OCBmcm9tIExpbnV4IHRyZWUKClNpZ25lZC1vZmYtYnk6IE1pY2hlbCBMZXNwaW5hc3NlIDx3YWxr ZW5AZ29vZ2xlLmNvbT4KQWNrZWQtYnk6IFJpayB2YW4gUmllbCA8cmllbEByZWRoYXQuY29tPgpD YzogUGV0ZXIgWmlqbHN0cmEgPGEucC56aWpsc3RyYUBjaGVsbG8ubmw+CkNjOiBBbmRyZWEgQXJj YW5nZWxpIDxhYXJjYW5nZUByZWRoYXQuY29tPgpDYzogRGF2aWQgV29vZGhvdXNlIDxkd213MkBp bmZyYWRlYWQub3JnPgpTaWduZWQtb2ZmLWJ5OiBBbmRyZXcgTW9ydG9uIDxha3BtQGxpbnV4LWZv dW5kYXRpb24ub3JnPgpTaWduZWQtb2ZmLWJ5OiBMaW51cyBUb3J2YWxkcyA8dG9ydmFsZHNAbGlu dXgtZm91bmRhdGlvbi5vcmc+Ci0tLQogeGVuL2NvbW1vbi9yYnRyZWUuYyB8IDExMCArKysrKysr KysrKysrKysrKysrKysrKysrKysrKysrLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAxIGZpbGUgY2hh bmdlZCwgNjYgaW5zZXJ0aW9ucygrKSwgNDQgZGVsZXRpb25zKC0pCgpkaWZmIC0tZ2l0IGEveGVu L2NvbW1vbi9yYnRyZWUuYyBiL3hlbi9jb21tb24vcmJ0cmVlLmMKaW5kZXggNjljNzQ5NmM2NS4u NmUzN2U5NjBhYiAxMDA2NDQKLS0tIGEveGVuL2NvbW1vbi9yYnRyZWUuYworKysgYi94ZW4vY29t bW9uL3JidHJlZS5jCkBAIC0yLDYgKzIsNyBAQAogICBSZWQgQmxhY2sgVHJlZXMKICAgKEMpIDE5 OTkgIEFuZHJlYSBBcmNhbmdlbGkgPGFuZHJlYUBzdXNlLmRlPgogICAoQykgMjAwMiAgRGF2aWQg V29vZGhvdXNlIDxkd213MkBpbmZyYWRlYWQub3JnPgorICAoQykgMjAxMiAgTWljaGVsIExlc3Bp bmFzc2UgPHdhbGtlbkBnb29nbGUuY29tPgogICAKICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29m dHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKICAgaXQgdW5kZXIg dGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQg YnkKQEAgLTQ5LDYgKzUwLDEyIEBACiAjZGVmaW5lIHJiX2lzX3JlZChyKSAgICAoIXJiX2NvbG9y KHIpKQogI2RlZmluZSByYl9pc19ibGFjayhyKSAgcmJfY29sb3IocikKIAorc3RhdGljIGlubGlu ZSB2b2lkIHJiX3NldF9ibGFjayhzdHJ1Y3QgcmJfbm9kZSAqcmIpCit7CisgICAgcmItPl9fcmJf cGFyZW50X2NvbG9yIHw9IFJCX0JMQUNLOworfQorCisKIHN0YXRpYyBpbmxpbmUgdm9pZCByYl9z ZXRfcGFyZW50KHN0cnVjdCByYl9ub2RlICpyYiwgc3RydWN0IHJiX25vZGUgKnApCiB7CiAgICAg cmItPl9fcmJfcGFyZW50X2NvbG9yID0gcmJfY29sb3IocmIpIHwgKHVuc2lnbmVkIGxvbmcpcDsK QEAgLTIxOSwyOSArMjI2LDE5IEBAIHZvaWQgcmJfaW5zZXJ0X2NvbG9yKHN0cnVjdCByYl9ub2Rl ICpub2RlLCBzdHJ1Y3QgcmJfcm9vdCAqcm9vdCkKIH0KIEVYUE9SVF9TWU1CT0wocmJfaW5zZXJ0 X2NvbG9yKTsKIAotc3RhdGljIHZvaWQgX19yYl9lcmFzZV9jb2xvcihzdHJ1Y3QgcmJfbm9kZSAq bm9kZSwgc3RydWN0IHJiX25vZGUgKnBhcmVudCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgc3RydWN0IHJiX3Jvb3QgKnJvb3QpCitzdGF0aWMgdm9pZCBfX3JiX2VyYXNlX2NvbG9yKHN0 cnVjdCByYl9ub2RlICpwYXJlbnQsIHN0cnVjdCByYl9yb290ICpyb290KQogewotICAgIHN0cnVj dCByYl9ub2RlICpzaWJsaW5nLCAqdG1wMSwgKnRtcDI7CisgICAgc3RydWN0IHJiX25vZGUgKm5v ZGUgPSBOVUxMLCAqc2libGluZywgKnRtcDEsICp0bXAyOwogCiAgICAgd2hpbGUgKHRydWUpCiAg ICAgewogICAgICAgICAvKgotICAgICAgICAgKiBMb29wIGludmFyaWFudDogYWxsIGxlYWYgcGF0 aHMgZ29pbmcgdGhyb3VnaCBub2RlIGhhdmUgYQotICAgICAgICAgKiBibGFjayBub2RlIGNvdW50 IHRoYXQgaXMgMSBsb3dlciB0aGFuIG90aGVyIGxlYWYgcGF0aHMuCi0gICAgICAgICAqCi0gICAg ICAgICAqIElmIG5vZGUgaXMgcmVkLCB3ZSBjYW4gZmxpcCBpdCB0byBibGFjayB0byBhZGp1c3Qu Ci0gICAgICAgICAqIElmIG5vZGUgaXMgdGhlIHJvb3QsIGFsbCBsZWFmIHBhdGhzIGdvIHRocm91 Z2ggaXQuCi0gICAgICAgICAqIE90aGVyd2lzZSwgd2UgbmVlZCB0byBhZGp1c3QgdGhlIHRyZWUg dGhyb3VnaCBjb2xvciBmbGlwcwotICAgICAgICAgKiBhbmQgdHJlZSByb3RhdGlvbnMgYXMgcGVy IG9uZSBvZiB0aGUgNCBjYXNlcyBiZWxvdy4KKyAgICAgICAgICogTG9vcCBpbnZhcmlhbnRzOgor ICAgICAgICAgKiAtIG5vZGUgaXMgYmxhY2sgKG9yIE5VTEwgb24gZmlyc3QgaXRlcmF0aW9uKQor ICAgICAgICAgKiAtIG5vZGUgaXMgbm90IHRoZSByb290IChwYXJlbnQgaXMgbm90IE5VTEwpCisg ICAgICAgICAqIC0gQWxsIGxlYWYgcGF0aHMgZ29pbmcgdGhyb3VnaCBwYXJlbnQgYW5kIG5vZGUg aGF2ZSBhCisgICAgICAgICAqICAgYmxhY2sgbm9kZSBjb3VudCB0aGF0IGlzIDEgbG93ZXIgdGhh biBvdGhlciBsZWFmIHBhdGhzLgogICAgICAgICAgKi8KLSAgICAgICAgaWYgKG5vZGUgJiYgcmJf aXNfcmVkKG5vZGUpKQotICAgICAgICB7Ci0gICAgICAgICAgICByYl9zZXRfcGFyZW50X2NvbG9y KG5vZGUsIHBhcmVudCwgUkJfQkxBQ0spOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0g ZWxzZSBpZiAoIXBhcmVudCkgewotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KICAgICAg ICAgc2libGluZyA9IHBhcmVudC0+cmJfcmlnaHQ7CiAgICAgICAgIGlmICggbm9kZSAhPSBzaWJs aW5nKSAgICAvKiBub2RlID09IHBhcmVudC0+cmJfbGVmdCAqLwogICAgICAgICB7CkBAIC0yNzcs MTcgKzI3NCwyMiBAQCBzdGF0aWMgdm9pZCBfX3JiX2VyYXNlX2NvbG9yKHN0cnVjdCByYl9ub2Rl ICpub2RlLCBzdHJ1Y3QgcmJfbm9kZSAqcGFyZW50LAogICAgICAgICAgICAgICAgICAgICAgKiAg ICAgIC8gXCAgICAgICAgICAgLyBcCiAgICAgICAgICAgICAgICAgICAgICAqICAgICBTbCAgU3Ig ICAgICAgIFNsICBTcgogICAgICAgICAgICAgICAgICAgICAgKgotICAgICAgICAgICAgICAgICAg ICAgKiBUaGlzIGxlYXZlcyB1cyB2aW9sYXRpbmcgNSksIHNvCi0gICAgICAgICAgICAgICAgICAg ICAqIHJlY3Vyc2UgYXQgcC4gSWYgcCBpcyByZWQsIHRoZQotICAgICAgICAgICAgICAgICAgICAg KiByZWN1cnNpb24gd2lsbCBqdXN0IGZsaXAgaXQgdG8gYmxhY2sKLSAgICAgICAgICAgICAgICAg ICAgICogYW5kIGV4aXQuIElmIGNvbWluZyBmcm9tIENhc2UgMSwKLSAgICAgICAgICAgICAgICAg ICAgICogcCBpcyBrbm93biB0byBiZSByZWQuCisgICAgICAgICAgICAgICAgICAgICAqIFRoaXMg bGVhdmVzIHVzIHZpb2xhdGluZyA1KSB3aGljaAorICAgICAgICAgICAgICAgICAgICAgKiBjYW4g YmUgZml4ZWQgYnkgZmxpcHBpbmcgcCB0byBibGFjaworICAgICAgICAgICAgICAgICAgICAgKiBp ZiBpdCB3YXMgcmVkLCBvciBieSByZWN1cnNpbmcgYXQgcC4KKyAgICAgICAgICAgICAgICAgICAg ICogcCBpcyByZWQgd2hlbiBjb21pbmcgZnJvbSBDYXNlIDEuCiAgICAgICAgICAgICAgICAgICAg ICAqLwogICAgICAgICAgICAgICAgICAgICByYl9zZXRfcGFyZW50X2NvbG9yKHNpYmxpbmcsIHBh cmVudCwgUkJfUkVEKTsKLSAgICAgICAgICAgICAgICAgICAgbm9kZSA9IHBhcmVudDsKLSAgICAg ICAgICAgICAgICAgICAgcGFyZW50ID0gcmJfcGFyZW50KG5vZGUpOwotICAgICAgICAgICAgICAg ICAgICBjb250aW51ZTsKLQorICAgICAgICAgICAgICAgICAgICBpZiAocmJfaXNfcmVkKHBhcmVu dCkpCisgICAgICAgICAgICAgICAgICAgICAgICByYl9zZXRfYmxhY2socGFyZW50KTsKKyAgICAg ICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAg ICAgICAgICAgICBub2RlID0gcGFyZW50OworICAgICAgICAgICAgICAgICAgICAgICAgcGFyZW50 ID0gcmJfcGFyZW50KG5vZGUpOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHBhcmVudCkK KyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgICAgICAg ICAgfQorICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICB9CiAgICAg ICAgICAgICAgICAgLyoKICAgICAgICAgICAgICAgICAgKiBDYXNlIDMgLSByaWdodCByb3RhdGUg YXQgc2libGluZwpAQCAtMzQ5LDkgKzM1MSwxNiBAQCBzdGF0aWMgdm9pZCBfX3JiX2VyYXNlX2Nv bG9yKHN0cnVjdCByYl9ub2RlICpub2RlLCBzdHJ1Y3QgcmJfbm9kZSAqcGFyZW50LAogICAgICAg ICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgLyogQ2FzZSAyIC0gc2libGluZyBjb2xv ciBmbGlwICovCiAgICAgICAgICAgICAgICAgICAgIHJiX3NldF9wYXJlbnRfY29sb3Ioc2libGlu ZywgcGFyZW50LCBSQl9SRUQpOwotICAgICAgICAgICAgICAgICAgICBub2RlID0gcGFyZW50Owot ICAgICAgICAgICAgICAgICAgICBwYXJlbnQgPSByYl9wYXJlbnQobm9kZSk7Ci0gICAgICAgICAg ICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgICAgICAgICBpZiAocmJfaXNfcmVkKHBh cmVudCkpCisgICAgICAgICAgICAgICAgICAgICAgICByYl9zZXRfYmxhY2socGFyZW50KTsKKyAg ICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAg ICAgICAgICAgICAgICBub2RlID0gcGFyZW50OworICAgICAgICAgICAgICAgICAgICAgICAgcGFy ZW50ID0gcmJfcGFyZW50KG5vZGUpOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHBhcmVu dCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgICAg ICAgICAgfQorICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICB9CiAg ICAgICAgICAgICAgICAgLyogQ2FzZSAzIC0gcmlnaHQgcm90YXRlIGF0IHNpYmxpbmcgKi8KICAg ICAgICAgICAgICAgICBzaWJsaW5nLT5yYl9yaWdodCA9IHRtcDEgPSB0bXAyLT5yYl9sZWZ0OwpA QCAtMzc3LDI0ICszODYsMzMgQEAgc3RhdGljIHZvaWQgX19yYl9lcmFzZV9jb2xvcihzdHJ1Y3Qg cmJfbm9kZSAqbm9kZSwgc3RydWN0IHJiX25vZGUgKnBhcmVudCwKIHZvaWQgcmJfZXJhc2Uoc3Ry dWN0IHJiX25vZGUgKm5vZGUsIHN0cnVjdCByYl9yb290ICpyb290KQogewogICAgIHN0cnVjdCBy Yl9ub2RlICpjaGlsZCA9IG5vZGUtPnJiX3JpZ2h0LCAqdG1wID0gbm9kZS0+cmJfbGVmdDsKLSAg ICBzdHJ1Y3QgcmJfbm9kZSAqcGFyZW50OwotICAgIGludCBjb2xvcjsKKyAgICBzdHJ1Y3QgcmJf bm9kZSAqcGFyZW50LCAqcmViYWxhbmNlOwogCiAgICAgaWYgKCF0bXApCiAgICAgewotICAgIGNh c2UxOgotICAgICAgICAvKiBDYXNlIDE6IG5vZGUgdG8gZXJhc2UgaGFzIG5vIG1vcmUgdGhhbiAx IGNoaWxkIChlYXN5ISkgKi8KKyAgICAgICAgLyoKKyAgICAgICAgICogQ2FzZSAxOiBub2RlIHRv IGVyYXNlIGhhcyBubyBtb3JlIHRoYW4gMSBjaGlsZCAoZWFzeSEpCisgICAgICAgICAqCisgICAg ICAgICAqIE5vdGUgdGhhdCBpZiB0aGVyZSBpcyBvbmUgY2hpbGQgaXQgbXVzdCBiZSByZWQgZHVl IHRvIDUpCisgICAgICAgICAqIGFuZCBub2RlIG11c3QgYmUgYmxhY2sgZHVlIHRvIDQpLiBXZSBh ZGp1c3QgY29sb3JzIGxvY2FsbHkKKyAgICAgICAgICogc28gYXMgdG8gYnlwYXNzIF9fcmJfZXJh c2VfY29sb3IoKSBsYXRlciBvbi4KKyAgICAgICAgICovCiAKICAgICAgICAgcGFyZW50ID0gcmJf cGFyZW50KG5vZGUpOwotICAgICAgICBjb2xvciA9IHJiX2NvbG9yKG5vZGUpOwotCi0gICAgICAg IGlmIChjaGlsZCkKLSAgICAgICAgICAgIHJiX3NldF9wYXJlbnQoY2hpbGQsIHBhcmVudCk7CiAg ICAgICAgIF9fcmJfY2hhbmdlX2NoaWxkKG5vZGUsIGNoaWxkLCBwYXJlbnQsIHJvb3QpOworICAg ICAgICBpZiAoY2hpbGQpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJiX3NldF9wYXJlbnRfY29s b3IoY2hpbGQsIHBhcmVudCwgUkJfQkxBQ0spOworICAgICAgICAgICAgcmViYWxhbmNlID0gTlVM TDsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHJlYmFsYW5jZSA9IHJiX2lzX2JsYWNr KG5vZGUpID8gcGFyZW50IDogTlVMTDsKKyAgICAgICAgfQogICAgIH0gZWxzZSBpZiAoIWNoaWxk KSB7CiAgICAgICAgIC8qIFN0aWxsIGNhc2UgMSwgYnV0IHRoaXMgdGltZSB0aGUgY2hpbGQgaXMg bm9kZS0+cmJfbGVmdCAqLwotICAgICAgICBjaGlsZCA9IHRtcDsKLSAgICAgICAgZ290byBjYXNl MTsKKyAgICAgICAgcGFyZW50ID0gcmJfcGFyZW50KG5vZGUpOworICAgICAgICBfX3JiX2NoYW5n ZV9jaGlsZChub2RlLCB0bXAsIHBhcmVudCwgcm9vdCk7CisgICAgICAgIHJiX3NldF9wYXJlbnRf Y29sb3IodG1wLCBwYXJlbnQsIFJCX0JMQUNLKTsKKyAgICAgICAgcmViYWxhbmNlID0gTlVMTDsK ICAgICB9IGVsc2UgewogICAgICAgICBzdHJ1Y3QgcmJfbm9kZSAqb2xkID0gbm9kZSwgKmxlZnQ7 CiAKQEAgLTQwNiwyNyArNDI0LDMxIEBAIHZvaWQgcmJfZXJhc2Uoc3RydWN0IHJiX25vZGUgKm5v ZGUsIHN0cnVjdCByYl9yb290ICpyb290KQogCiAgICAgICAgIGNoaWxkID0gbm9kZS0+cmJfcmln aHQ7CiAgICAgICAgIHBhcmVudCA9IHJiX3BhcmVudChub2RlKTsKLSAgICAgICAgY29sb3IgPSBy Yl9jb2xvcihub2RlKTsKIAogICAgICAgICBpZiAocGFyZW50ID09IG9sZCkgewogICAgICAgICAg ICAgcGFyZW50ID0gbm9kZTsKICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGlmIChjaGls ZCkKLSAgICAgICAgICAgICAgICByYl9zZXRfcGFyZW50KGNoaWxkLCBwYXJlbnQpOwogICAgICAg ICAgICAgcGFyZW50LT5yYl9sZWZ0ID0gY2hpbGQ7CiAKICAgICAgICAgICAgIG5vZGUtPnJiX3Jp Z2h0ID0gb2xkLT5yYl9yaWdodDsKICAgICAgICAgICAgIHJiX3NldF9wYXJlbnQob2xkLT5yYl9y aWdodCwgbm9kZSk7CiAgICAgICAgIH0KIAorICAgICAgICBpZiAoY2hpbGQpIHsKKyAgICAgICAg ICAgIHJiX3NldF9wYXJlbnRfY29sb3IoY2hpbGQsIHBhcmVudCwgUkJfQkxBQ0spOworICAgICAg ICAgICAgcmViYWxhbmNlID0gTlVMTDsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHJl YmFsYW5jZSA9IHJiX2lzX2JsYWNrKG5vZGUpID8gcGFyZW50IDogTlVMTDsKKyAgICAgICAgfQor CiAgICAgICAgIG5vZGUtPl9fcmJfcGFyZW50X2NvbG9yID0gb2xkLT5fX3JiX3BhcmVudF9jb2xv cjsKICAgICAgICAgbm9kZS0+cmJfbGVmdCA9IG9sZC0+cmJfbGVmdDsKIAogICAgICAgICByYl9z ZXRfcGFyZW50KG9sZC0+cmJfbGVmdCwgbm9kZSk7CiAgICAgfQogCi0gICAgaWYgKGNvbG9yID09 IFJCX0JMQUNLKQotICAgICAgICBfX3JiX2VyYXNlX2NvbG9yKGNoaWxkLCBwYXJlbnQsIHJvb3Qp OworICAgIGlmIChyZWJhbGFuY2UpCisgICAgICAgIF9fcmJfZXJhc2VfY29sb3IocmViYWxhbmNl LCByb290KTsKIH0KIEVYUE9SVF9TWU1CT0wocmJfZXJhc2UpOwogCi0tIAoyLjEyLjAKCgpfX19f X19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXwpYZW4tZGV2ZWwgbWFp bGluZyBsaXN0Clhlbi1kZXZlbEBsaXN0cy54ZW4ub3JnCmh0dHBzOi8vbGlzdHMueGVuLm9yZy94 ZW4tZGV2ZWwK