From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from mga01.intel.com ([192.55.52.88]:63833 "EHLO mga01.intel.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1750787AbeEAPrl (ORCPT ); Tue, 1 May 2018 11:47:41 -0400 Subject: Re: igt trouble with planes shared between multiple CRTCs (Re: [PATCH v2 0/8] R-Car DU: Support CRC calculation) From: Maarten Lankhorst To: Daniel Vetter , Laurent Pinchart Cc: dri-devel@lists.freedesktop.org, linux-renesas-soc@vger.kernel.org, Kieran Bingham , Ulrich Hecht , IGT development References: <20180422223430.16407-1-laurent.pinchart+renesas@ideasonboard.com> <3482108.jirjkbZynl@avalon> <20180430145524.GJ12521@phenom.ffwll.local> <20180430145640.GK12521@phenom.ffwll.local> <0f7c2e60-23d0-b222-c8c0-36b17f1e7c25@linux.intel.com> Message-ID: <296ab1a6-b333-114c-99d6-a9724c228e57@linux.intel.com> Date: Tue, 1 May 2018 17:47:38 +0200 MIME-Version: 1.0 In-Reply-To: <0f7c2e60-23d0-b222-c8c0-36b17f1e7c25@linux.intel.com> Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: 7bit Content-Language: en-US Sender: linux-renesas-soc-owner@vger.kernel.org List-ID: Op 01-05-18 om 10:58 schreef Maarten Lankhorst: > Hey, > > Op 30-04-18 om 16:56 schreef Daniel Vetter: >> On Mon, Apr 30, 2018 at 04:55:24PM +0200, Daniel Vetter wrote: >>> On Sat, Apr 28, 2018 at 12:07:04AM +0300, Laurent Pinchart wrote: >>>> Hi Daniel, >>>> >>>> (Removing the linux-media mailing list from CC as it is out of scope) >>>> >>>> You enquired on IRC whether this patch series passes the igt CRC tests. >>>> >>>> # ./kms_pipe_crc_basic --run-subtest read-crc-pipe-A >>>> IGT-Version: 1.22-gf447f5fc531d (aarch64) (Linux: 4.17.0-rc1-00085-g56e849d93cc9 aarch64) >>>> read-crc-pipe-A: Testing connector LVDS-1 using pipe A >>>> (kms_pipe_crc_basic:1638) igt-debugfs-CRITICAL: Test assertion failure function igt_pipe_crc_start, file igt_debugfs.c:764: >>>> (kms_pipe_crc_basic:1638) igt-debugfs-CRITICAL: Failed assertion: pipe_crc->crc_fd != -1 >>>> (kms_pipe_crc_basic:1638) igt-debugfs-CRITICAL: Last errno: 5, Input/output error >>>> Stack trace: >>>> Subtest read-crc-pipe-A failed. >>>> **** DEBUG **** >>>> (kms_pipe_crc_basic:1638) DEBUG: Test requirement passed: !(pipe >= data->display.n_pipes) >>>> (kms_pipe_crc_basic:1638) INFO: read-crc-pipe-A: Testing connector LVDS-1 using pipe A >>>> (kms_pipe_crc_basic:1638) igt-kms-DEBUG: display: LVDS-1: set_pipe(A) >>>> (kms_pipe_crc_basic:1638) igt-kms-DEBUG: display: LVDS-1: Selecting pipe A >>>> (kms_pipe_crc_basic:1638) DEBUG: Clearing the fb with color (0.00,1.00,0.00) >>>> (kms_pipe_crc_basic:1638) igt-fb-DEBUG: igt_create_fb_with_bo_size(width=1024, height=768, format=0x34325258, tiling=0x0, size=0) >>>> (kms_pipe_crc_basic:1638) igt-fb-DEBUG: igt_create_fb_with_bo_size(handle=1, pitch=4096) >>>> (kms_pipe_crc_basic:1638) igt-kms-DEBUG: Test requirement passed: plane_idx >= 0 && plane_idx < pipe->n_planes >>>> (kms_pipe_crc_basic:1638) igt-kms-DEBUG: display: A.0: plane_set_fb(140) >>>> (kms_pipe_crc_basic:1638) igt-kms-DEBUG: display: A.0: plane_set_size (1024x768) >>>> (kms_pipe_crc_basic:1638) igt-kms-DEBUG: display: A.0: fb_set_position(0,0) >>>> (kms_pipe_crc_basic:1638) igt-kms-DEBUG: display: A.0: fb_set_size(1024x768) >>>> (kms_pipe_crc_basic:1638) igt-kms-DEBUG: display: commit { >>>> (kms_pipe_crc_basic:1638) igt-kms-DEBUG: display: LVDS-1: SetCrtc pipe A, fb 140, src (0, 0), mode 1024x768 >>>> (kms_pipe_crc_basic:1638) igt-kms-DEBUG: display: SetCrtc pipe A, disabling >>>> (kms_pipe_crc_basic:1638) igt-kms-DEBUG: display: SetPlane pipe A, plane 2, disabling >>>> (kms_pipe_crc_basic:1638) igt-kms-DEBUG: display: SetPlane pipe A, plane 3, disabling >>>> (kms_pipe_crc_basic:1638) igt-kms-DEBUG: display: SetPlane pipe A, plane 4, disabling >>>> (kms_pipe_crc_basic:1638) igt-kms-DEBUG: display: SetCrtc pipe B, disabling >>>> (kms_pipe_crc_basic:1638) igt-kms-DEBUG: display: SetPlane pipe B, plane 1, disabling >>>> (kms_pipe_crc_basic:1638) igt-kms-DEBUG: display: SetPlane pipe B, plane 2, disabling >>>> (kms_pipe_crc_basic:1638) igt-kms-DEBUG: display: SetPlane pipe B, plane 3, disabling >>>> (kms_pipe_crc_basic:1638) igt-kms-DEBUG: display: SetPlane pipe B, plane 4, disabling >>>> (kms_pipe_crc_basic:1638) igt-kms-DEBUG: display: SetCrtc pipe C, disabling >>>> (kms_pipe_crc_basic:1638) igt-kms-DEBUG: display: SetPlane pipe C, plane 1, disabling >>>> (kms_pipe_crc_basic:1638) igt-kms-DEBUG: display: SetPlane pipe C, plane 2, disabling >>>> (kms_pipe_crc_basic:1638) igt-kms-DEBUG: display: SetPlane pipe C, plane 3, disabling >>>> (kms_pipe_crc_basic:1638) igt-kms-DEBUG: display: SetPlane pipe C, plane 4, disabling >>>> (kms_pipe_crc_basic:1638) igt-kms-DEBUG: display: SetCrtc pipe D, disabling >>>> (kms_pipe_crc_basic:1638) igt-kms-DEBUG: display: SetCrtc pipe D, disabling >>>> (kms_pipe_crc_basic:1638) igt-kms-DEBUG: display: SetPlane pipe D, plane 2, disabling >>>> (kms_pipe_crc_basic:1638) igt-kms-DEBUG: display: SetPlane pipe D, plane 3, disabling >>>> (kms_pipe_crc_basic:1638) igt-kms-DEBUG: display: SetPlane pipe D, plane 4, disabling >>>> (kms_pipe_crc_basic:1638) igt-kms-DEBUG: display: } >>>> (kms_pipe_crc_basic:1638) igt-debugfs-DEBUG: Opening debugfs directory '/sys/kernel/debug/dri/0' >>>> (kms_pipe_crc_basic:1638) igt-debugfs-DEBUG: Opening debugfs directory '/sys/kernel/debug/dri/0' >>>> (kms_pipe_crc_basic:1638) igt-debugfs-CRITICAL: Test assertion failure function igt_pipe_crc_start, file igt_debugfs.c:764: >>>> (kms_pipe_crc_basic:1638) igt-debugfs-CRITICAL: Failed assertion: pipe_crc->crc_fd != -1 >>>> (kms_pipe_crc_basic:1638) igt-debugfs-CRITICAL: Last errno: 5, Input/output error >>>> (kms_pipe_crc_basic:1638) igt-core-INFO: Stack trace: >>>> **** END **** >>>> Subtest read-crc-pipe-A: FAIL (0.061s) >>>> >>>> I think the answer is no, but I don't think it's the fault of this patch >>>> series. Opening the CRC data file returns -EIO because the CRTC is not active, >>>> and I'm trying to find out why that is the case. The debug log shows a commit >>>> that seems strange to me, enabling pipe A and immediately disabling right >>>> afterwards. After some investigation I believe that this is caused by sharing >>>> primary planes between CRTCs. >>>> >>>> The R-Car DU groups CRTCs by two and shares 5 planes between the two CRTCs of >>>> the group. This specific SoC has two groups of two CRTCs, but that's not >>>> relevant here, so we can ignore pipes C and D. >>>> >>>> Pipes A and B thus shared 5 planes that I will number 0 to 4 for simplicity. >>>> The driver sets plane 0 as the primary plane for CRTC A and plane 1 as the >>>> primary plane for CRTC B. Planes 2, 3 and 4 are created as overlay planes. >>>> >>>> When igt iterates over all planes for pipe A, it will first encounter plane 0 >>>> that has a framebuffer, and thus enables the pipe. It then iterates over >>>> plane 1, recognizes it as a primary plane without a framebuffer, and thus >>>> disables the pipe. Planes 2, 3 and 4 are recognized as overlay planes and thus >>>> don't affect the pipe active state. Pipe B is handled the same way, and igt >>>> disables it twice as planes 0 and 1 are primary. >>>> >>>> I don't know if the fault here is with igt that doesn't properly support this >>>> architecture, or with the driver that shouldn't have two primary planes >>>> available for a CRTC. In the former case, I'm not sure how to fix it, as I'm >>>> not familiar enough with igt to rearchitecture the commit helpers. In the >>>> latter case, how would you recommend fixing it on the driver side ? >>> I guess thus far no one did run igt on a chip which did have reassignable >>> primary planes. The problem here is that it's pretty hard to figure out >>> which one is the real primary plane, since with possible CRTCs you could >>> have multiple primary planes on 1 CRTC. There's no property or anything >>> that explicitly tells you this. Two fixes: >>> >>> 1. Change drivers to limit primary planes to 1 crtc. Same for cursor >>> overlays. There's probably other userspace than igt that gets confused >>> by this, but this has the ugly downside that we artifically limit plane >>> usage - if only 1 CRTC is on, we want to use all the available planes >>> on that one. >>> >>> 2. Add some implicit or explicit uapi to allow userspace to figure out >>> which primary plane is the primary plane for this crtc. >>> >>> a) Explicit option: We add a PRIMARY_ID property (and CURSOR_ID prop >>> while at it) on the CRTC which points at the primary/cursor plane. >>> >>> b) Implicit option: We require primary planes are assigned to CRTC in the >>> same order as they're created. So first primary plane you encouter >>> is the one for the first CRTC, 2nd primary plane is the one for the >>> 2nd CRTC and so on. If we go with this we probably should add a bit >>> of code to the kernel to check that invariant (by making sure the >>> primary plane has the corresponding CRTC included in its >>> possible_crtc mask). >>> >>> Either way igt needs to be patched to not treat any primary plane that >>> could work on a CRTC as the primary plane for that CRTC. >>> >>> Personally I'm leaning towards 2b). >> Adding Maarten and igt-dev. > We should first make the plane array global, instead of per crtc. > > That means removing plane->pipe and plane->index. > > And pipe_obj->planes and pipe_obj->n_planes need to be gone too. I think it's > easiest to make > > There is one problem. Most of the tests are not aware of the limitations. > If we make the plane array global it should be possible to make > a for_each_possible_plane_on_pipe enumerate all planes that could be assigned > to a certain pipe. We need to sort by z order somehow, but if we then add > igt_plane_set_pipe() which updates the IGT_PLANE_CRTC_ID property, we should > be good. > > Only thing we don't see is how the default crtc->primary and crtc->cursor are > assigned. For the calls with COMMIT_LEGACY we need to know the mappings, but > I don't think the kernel exposes them? > I guess we could put it in a FIFO way, first enumerated plane with PRIMARY type > is bound to the first crtc, same for cursor. > > This will hopefully allow legacy tests to keep working, while atomic plane aware > tests will be able to use all planes. > > ~Maarten > https://cgit.freedesktop.org/~mlankhorst/intel-gpu-tools is what I was thinking about, didn't test if it works, only compiles. What's missing is that we should only create 1 igt_plane_t for each drm plane instead of one for each pipe. Not sure how to get that working without breaking a lot of assumptions in the tests, mainly the dual output tests. I think that we should prevent for_each_plane_on_pipe until an output is set on the pipe, and then automatically assign all planes to it and set plane->type to something matching. When a second output is bound, steal unused sprite planes as required and divide them equally. :) ~Maarten From mboxrd@z Thu Jan 1 00:00:00 1970 From: Maarten Lankhorst Subject: Re: igt trouble with planes shared between multiple CRTCs (Re: [PATCH v2 0/8] R-Car DU: Support CRC calculation) Date: Tue, 1 May 2018 17:47:38 +0200 Message-ID: <296ab1a6-b333-114c-99d6-a9724c228e57@linux.intel.com> References: <20180422223430.16407-1-laurent.pinchart+renesas@ideasonboard.com> <3482108.jirjkbZynl@avalon> <20180430145524.GJ12521@phenom.ffwll.local> <20180430145640.GK12521@phenom.ffwll.local> <0f7c2e60-23d0-b222-c8c0-36b17f1e7c25@linux.intel.com> Mime-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: base64 Return-path: In-Reply-To: <0f7c2e60-23d0-b222-c8c0-36b17f1e7c25@linux.intel.com> Content-Language: en-US List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: dri-devel-bounces@lists.freedesktop.org Sender: "dri-devel" To: Daniel Vetter , Laurent Pinchart Cc: linux-renesas-soc@vger.kernel.org, IGT development , Ulrich Hecht , Kieran Bingham , dri-devel@lists.freedesktop.org List-Id: dri-devel@lists.freedesktop.org T3AgMDEtMDUtMTggb20gMTA6NTggc2NocmVlZiBNYWFydGVuIExhbmtob3JzdDoKPiBIZXksCj4K PiBPcCAzMC0wNC0xOCBvbSAxNjo1NiBzY2hyZWVmIERhbmllbCBWZXR0ZXI6Cj4+IE9uIE1vbiwg QXByIDMwLCAyMDE4IGF0IDA0OjU1OjI0UE0gKzAyMDAsIERhbmllbCBWZXR0ZXIgd3JvdGU6Cj4+ PiBPbiBTYXQsIEFwciAyOCwgMjAxOCBhdCAxMjowNzowNEFNICswMzAwLCBMYXVyZW50IFBpbmNo YXJ0IHdyb3RlOgo+Pj4+IEhpIERhbmllbCwKPj4+Pgo+Pj4+IChSZW1vdmluZyB0aGUgbGludXgt bWVkaWEgbWFpbGluZyBsaXN0IGZyb20gQ0MgYXMgaXQgaXMgb3V0IG9mIHNjb3BlKQo+Pj4+Cj4+ Pj4gWW91IGVucXVpcmVkIG9uIElSQyB3aGV0aGVyIHRoaXMgcGF0Y2ggc2VyaWVzIHBhc3NlcyB0 aGUgaWd0IENSQyB0ZXN0cy4KPj4+Pgo+Pj4+ICMgLi9rbXNfcGlwZV9jcmNfYmFzaWMgLS1ydW4t c3VidGVzdCByZWFkLWNyYy1waXBlLUEKPj4+PiBJR1QtVmVyc2lvbjogMS4yMi1nZjQ0N2Y1ZmM1 MzFkIChhYXJjaDY0KSAoTGludXg6IDQuMTcuMC1yYzEtMDAwODUtZzU2ZTg0OWQ5M2NjOSBhYXJj aDY0KQo+Pj4+IHJlYWQtY3JjLXBpcGUtQTogVGVzdGluZyBjb25uZWN0b3IgTFZEUy0xIHVzaW5n IHBpcGUgQQo+Pj4+IChrbXNfcGlwZV9jcmNfYmFzaWM6MTYzOCkgaWd0LWRlYnVnZnMtQ1JJVElD QUw6IFRlc3QgYXNzZXJ0aW9uIGZhaWx1cmUgZnVuY3Rpb24gaWd0X3BpcGVfY3JjX3N0YXJ0LCBm aWxlIGlndF9kZWJ1Z2ZzLmM6NzY0Ogo+Pj4+IChrbXNfcGlwZV9jcmNfYmFzaWM6MTYzOCkgaWd0 LWRlYnVnZnMtQ1JJVElDQUw6IEZhaWxlZCBhc3NlcnRpb246IHBpcGVfY3JjLT5jcmNfZmQgIT0g LTEKPj4+PiAoa21zX3BpcGVfY3JjX2Jhc2ljOjE2MzgpIGlndC1kZWJ1Z2ZzLUNSSVRJQ0FMOiBM YXN0IGVycm5vOiA1LCBJbnB1dC9vdXRwdXQgZXJyb3IKPj4+PiBTdGFjayB0cmFjZToKPj4+PiBT dWJ0ZXN0IHJlYWQtY3JjLXBpcGUtQSBmYWlsZWQuCj4+Pj4gKioqKiBERUJVRyAqKioqCj4+Pj4g KGttc19waXBlX2NyY19iYXNpYzoxNjM4KSBERUJVRzogVGVzdCByZXF1aXJlbWVudCBwYXNzZWQ6 ICEocGlwZSA+PSBkYXRhLT5kaXNwbGF5Lm5fcGlwZXMpCj4+Pj4gKGttc19waXBlX2NyY19iYXNp YzoxNjM4KSBJTkZPOiByZWFkLWNyYy1waXBlLUE6IFRlc3RpbmcgY29ubmVjdG9yIExWRFMtMSB1 c2luZyBwaXBlIEEKPj4+PiAoa21zX3BpcGVfY3JjX2Jhc2ljOjE2MzgpIGlndC1rbXMtREVCVUc6 IGRpc3BsYXk6IExWRFMtMTogc2V0X3BpcGUoQSkKPj4+PiAoa21zX3BpcGVfY3JjX2Jhc2ljOjE2 MzgpIGlndC1rbXMtREVCVUc6IGRpc3BsYXk6IExWRFMtMTogU2VsZWN0aW5nIHBpcGUgQQo+Pj4+ IChrbXNfcGlwZV9jcmNfYmFzaWM6MTYzOCkgREVCVUc6IENsZWFyaW5nIHRoZSBmYiB3aXRoIGNv bG9yICgwLjAwLDEuMDAsMC4wMCkKPj4+PiAoa21zX3BpcGVfY3JjX2Jhc2ljOjE2MzgpIGlndC1m Yi1ERUJVRzogaWd0X2NyZWF0ZV9mYl93aXRoX2JvX3NpemUod2lkdGg9MTAyNCwgaGVpZ2h0PTc2 OCwgZm9ybWF0PTB4MzQzMjUyNTgsIHRpbGluZz0weDAsIHNpemU9MCkKPj4+PiAoa21zX3BpcGVf Y3JjX2Jhc2ljOjE2MzgpIGlndC1mYi1ERUJVRzogaWd0X2NyZWF0ZV9mYl93aXRoX2JvX3NpemUo aGFuZGxlPTEsIHBpdGNoPTQwOTYpCj4+Pj4gKGttc19waXBlX2NyY19iYXNpYzoxNjM4KSBpZ3Qt a21zLURFQlVHOiBUZXN0IHJlcXVpcmVtZW50IHBhc3NlZDogcGxhbmVfaWR4ID49IDAgJiYgcGxh bmVfaWR4IDwgcGlwZS0+bl9wbGFuZXMKPj4+PiAoa21zX3BpcGVfY3JjX2Jhc2ljOjE2MzgpIGln dC1rbXMtREVCVUc6IGRpc3BsYXk6IEEuMDogcGxhbmVfc2V0X2ZiKDE0MCkKPj4+PiAoa21zX3Bp cGVfY3JjX2Jhc2ljOjE2MzgpIGlndC1rbXMtREVCVUc6IGRpc3BsYXk6IEEuMDogcGxhbmVfc2V0 X3NpemUgKDEwMjR4NzY4KQo+Pj4+IChrbXNfcGlwZV9jcmNfYmFzaWM6MTYzOCkgaWd0LWttcy1E RUJVRzogZGlzcGxheTogQS4wOiBmYl9zZXRfcG9zaXRpb24oMCwwKQo+Pj4+IChrbXNfcGlwZV9j cmNfYmFzaWM6MTYzOCkgaWd0LWttcy1ERUJVRzogZGlzcGxheTogQS4wOiBmYl9zZXRfc2l6ZSgx MDI0eDc2OCkKPj4+PiAoa21zX3BpcGVfY3JjX2Jhc2ljOjE2MzgpIGlndC1rbXMtREVCVUc6IGRp c3BsYXk6IGNvbW1pdCB7Cj4+Pj4gKGttc19waXBlX2NyY19iYXNpYzoxNjM4KSBpZ3Qta21zLURF QlVHOiBkaXNwbGF5OiAgICAgTFZEUy0xOiBTZXRDcnRjIHBpcGUgQSwgZmIgMTQwLCBzcmMgKDAs IDApLCBtb2RlIDEwMjR4NzY4Cj4+Pj4gKGttc19waXBlX2NyY19iYXNpYzoxNjM4KSBpZ3Qta21z LURFQlVHOiBkaXNwbGF5OiAgICAgU2V0Q3J0YyBwaXBlIEEsIGRpc2FibGluZwo+Pj4+IChrbXNf cGlwZV9jcmNfYmFzaWM6MTYzOCkgaWd0LWttcy1ERUJVRzogZGlzcGxheTogICAgIFNldFBsYW5l IHBpcGUgQSwgcGxhbmUgMiwgZGlzYWJsaW5nCj4+Pj4gKGttc19waXBlX2NyY19iYXNpYzoxNjM4 KSBpZ3Qta21zLURFQlVHOiBkaXNwbGF5OiAgICAgU2V0UGxhbmUgcGlwZSBBLCBwbGFuZSAzLCBk aXNhYmxpbmcKPj4+PiAoa21zX3BpcGVfY3JjX2Jhc2ljOjE2MzgpIGlndC1rbXMtREVCVUc6IGRp c3BsYXk6ICAgICBTZXRQbGFuZSBwaXBlIEEsIHBsYW5lIDQsIGRpc2FibGluZwo+Pj4+IChrbXNf cGlwZV9jcmNfYmFzaWM6MTYzOCkgaWd0LWttcy1ERUJVRzogZGlzcGxheTogICAgIFNldENydGMg cGlwZSBCLCBkaXNhYmxpbmcKPj4+PiAoa21zX3BpcGVfY3JjX2Jhc2ljOjE2MzgpIGlndC1rbXMt REVCVUc6IGRpc3BsYXk6ICAgICBTZXRQbGFuZSBwaXBlIEIsIHBsYW5lIDEsIGRpc2FibGluZwo+ Pj4+IChrbXNfcGlwZV9jcmNfYmFzaWM6MTYzOCkgaWd0LWttcy1ERUJVRzogZGlzcGxheTogICAg IFNldFBsYW5lIHBpcGUgQiwgcGxhbmUgMiwgZGlzYWJsaW5nCj4+Pj4gKGttc19waXBlX2NyY19i YXNpYzoxNjM4KSBpZ3Qta21zLURFQlVHOiBkaXNwbGF5OiAgICAgU2V0UGxhbmUgcGlwZSBCLCBw bGFuZSAzLCBkaXNhYmxpbmcKPj4+PiAoa21zX3BpcGVfY3JjX2Jhc2ljOjE2MzgpIGlndC1rbXMt REVCVUc6IGRpc3BsYXk6ICAgICBTZXRQbGFuZSBwaXBlIEIsIHBsYW5lIDQsIGRpc2FibGluZwo+ Pj4+IChrbXNfcGlwZV9jcmNfYmFzaWM6MTYzOCkgaWd0LWttcy1ERUJVRzogZGlzcGxheTogICAg IFNldENydGMgcGlwZSBDLCBkaXNhYmxpbmcKPj4+PiAoa21zX3BpcGVfY3JjX2Jhc2ljOjE2Mzgp IGlndC1rbXMtREVCVUc6IGRpc3BsYXk6ICAgICBTZXRQbGFuZSBwaXBlIEMsIHBsYW5lIDEsIGRp c2FibGluZwo+Pj4+IChrbXNfcGlwZV9jcmNfYmFzaWM6MTYzOCkgaWd0LWttcy1ERUJVRzogZGlz cGxheTogICAgIFNldFBsYW5lIHBpcGUgQywgcGxhbmUgMiwgZGlzYWJsaW5nCj4+Pj4gKGttc19w aXBlX2NyY19iYXNpYzoxNjM4KSBpZ3Qta21zLURFQlVHOiBkaXNwbGF5OiAgICAgU2V0UGxhbmUg cGlwZSBDLCBwbGFuZSAzLCBkaXNhYmxpbmcKPj4+PiAoa21zX3BpcGVfY3JjX2Jhc2ljOjE2Mzgp IGlndC1rbXMtREVCVUc6IGRpc3BsYXk6ICAgICBTZXRQbGFuZSBwaXBlIEMsIHBsYW5lIDQsIGRp c2FibGluZwo+Pj4+IChrbXNfcGlwZV9jcmNfYmFzaWM6MTYzOCkgaWd0LWttcy1ERUJVRzogZGlz cGxheTogICAgIFNldENydGMgcGlwZSBELCBkaXNhYmxpbmcKPj4+PiAoa21zX3BpcGVfY3JjX2Jh c2ljOjE2MzgpIGlndC1rbXMtREVCVUc6IGRpc3BsYXk6ICAgICBTZXRDcnRjIHBpcGUgRCwgZGlz YWJsaW5nCj4+Pj4gKGttc19waXBlX2NyY19iYXNpYzoxNjM4KSBpZ3Qta21zLURFQlVHOiBkaXNw bGF5OiAgICAgU2V0UGxhbmUgcGlwZSBELCBwbGFuZSAyLCBkaXNhYmxpbmcKPj4+PiAoa21zX3Bp cGVfY3JjX2Jhc2ljOjE2MzgpIGlndC1rbXMtREVCVUc6IGRpc3BsYXk6ICAgICBTZXRQbGFuZSBw aXBlIEQsIHBsYW5lIDMsIGRpc2FibGluZwo+Pj4+IChrbXNfcGlwZV9jcmNfYmFzaWM6MTYzOCkg aWd0LWttcy1ERUJVRzogZGlzcGxheTogICAgIFNldFBsYW5lIHBpcGUgRCwgcGxhbmUgNCwgZGlz YWJsaW5nCj4+Pj4gKGttc19waXBlX2NyY19iYXNpYzoxNjM4KSBpZ3Qta21zLURFQlVHOiBkaXNw bGF5OiB9Cj4+Pj4gKGttc19waXBlX2NyY19iYXNpYzoxNjM4KSBpZ3QtZGVidWdmcy1ERUJVRzog T3BlbmluZyBkZWJ1Z2ZzIGRpcmVjdG9yeSAnL3N5cy9rZXJuZWwvZGVidWcvZHJpLzAnCj4+Pj4g KGttc19waXBlX2NyY19iYXNpYzoxNjM4KSBpZ3QtZGVidWdmcy1ERUJVRzogT3BlbmluZyBkZWJ1 Z2ZzIGRpcmVjdG9yeSAnL3N5cy9rZXJuZWwvZGVidWcvZHJpLzAnCj4+Pj4gKGttc19waXBlX2Ny Y19iYXNpYzoxNjM4KSBpZ3QtZGVidWdmcy1DUklUSUNBTDogVGVzdCBhc3NlcnRpb24gZmFpbHVy ZSBmdW5jdGlvbiBpZ3RfcGlwZV9jcmNfc3RhcnQsIGZpbGUgaWd0X2RlYnVnZnMuYzo3NjQ6Cj4+ Pj4gKGttc19waXBlX2NyY19iYXNpYzoxNjM4KSBpZ3QtZGVidWdmcy1DUklUSUNBTDogRmFpbGVk IGFzc2VydGlvbjogcGlwZV9jcmMtPmNyY19mZCAhPSAtMQo+Pj4+IChrbXNfcGlwZV9jcmNfYmFz aWM6MTYzOCkgaWd0LWRlYnVnZnMtQ1JJVElDQUw6IExhc3QgZXJybm86IDUsIElucHV0L291dHB1 dCBlcnJvcgo+Pj4+IChrbXNfcGlwZV9jcmNfYmFzaWM6MTYzOCkgaWd0LWNvcmUtSU5GTzogU3Rh Y2sgdHJhY2U6Cj4+Pj4gKioqKiAgRU5EICAqKioqCj4+Pj4gU3VidGVzdCByZWFkLWNyYy1waXBl LUE6IEZBSUwgKDAuMDYxcykKPj4+Pgo+Pj4+IEkgdGhpbmsgdGhlIGFuc3dlciBpcyBubywgYnV0 IEkgZG9uJ3QgdGhpbmsgaXQncyB0aGUgZmF1bHQgb2YgdGhpcyBwYXRjaAo+Pj4+IHNlcmllcy4g T3BlbmluZyB0aGUgQ1JDIGRhdGEgZmlsZSByZXR1cm5zIC1FSU8gYmVjYXVzZSB0aGUgQ1JUQyBp cyBub3QgYWN0aXZlLAo+Pj4+IGFuZCBJJ20gdHJ5aW5nIHRvIGZpbmQgb3V0IHdoeSB0aGF0IGlz IHRoZSBjYXNlLiBUaGUgZGVidWcgbG9nIHNob3dzIGEgY29tbWl0Cj4+Pj4gdGhhdCBzZWVtcyBz dHJhbmdlIHRvIG1lLCBlbmFibGluZyBwaXBlIEEgYW5kIGltbWVkaWF0ZWx5IGRpc2FibGluZyBy aWdodAo+Pj4+IGFmdGVyd2FyZHMuIEFmdGVyIHNvbWUgaW52ZXN0aWdhdGlvbiBJIGJlbGlldmUg dGhhdCB0aGlzIGlzIGNhdXNlZCBieSBzaGFyaW5nCj4+Pj4gcHJpbWFyeSBwbGFuZXMgYmV0d2Vl biBDUlRDcy4KPj4+Pgo+Pj4+IFRoZSBSLUNhciBEVSBncm91cHMgQ1JUQ3MgYnkgdHdvIGFuZCBz aGFyZXMgNSBwbGFuZXMgYmV0d2VlbiB0aGUgdHdvIENSVENzIG9mCj4+Pj4gdGhlIGdyb3VwLiBU aGlzIHNwZWNpZmljIFNvQyBoYXMgdHdvIGdyb3VwcyBvZiB0d28gQ1JUQ3MsIGJ1dCB0aGF0J3Mg bm90Cj4+Pj4gcmVsZXZhbnQgaGVyZSwgc28gd2UgY2FuIGlnbm9yZSBwaXBlcyBDIGFuZCBELgo+ Pj4+Cj4+Pj4gUGlwZXMgQSBhbmQgQiB0aHVzIHNoYXJlZCA1IHBsYW5lcyB0aGF0IEkgd2lsbCBu dW1iZXIgMCB0byA0IGZvciBzaW1wbGljaXR5Lgo+Pj4+IFRoZSBkcml2ZXIgc2V0cyBwbGFuZSAw IGFzIHRoZSBwcmltYXJ5IHBsYW5lIGZvciBDUlRDIEEgYW5kIHBsYW5lIDEgYXMgdGhlCj4+Pj4g cHJpbWFyeSBwbGFuZSBmb3IgQ1JUQyBCLiBQbGFuZXMgMiwgMyBhbmQgNCBhcmUgY3JlYXRlZCBh cyBvdmVybGF5IHBsYW5lcy4KPj4+Pgo+Pj4+IFdoZW4gaWd0IGl0ZXJhdGVzIG92ZXIgYWxsIHBs YW5lcyBmb3IgcGlwZSBBLCBpdCB3aWxsIGZpcnN0IGVuY291bnRlciBwbGFuZSAwCj4+Pj4gdGhh dCBoYXMgYSBmcmFtZWJ1ZmZlciwgYW5kIHRodXMgZW5hYmxlcyB0aGUgcGlwZS4gSXQgdGhlbiBp dGVyYXRlcyBvdmVyCj4+Pj4gcGxhbmUgMSwgcmVjb2duaXplcyBpdCBhcyBhIHByaW1hcnkgcGxh bmUgd2l0aG91dCBhIGZyYW1lYnVmZmVyLCBhbmQgdGh1cwo+Pj4+IGRpc2FibGVzIHRoZSBwaXBl LiBQbGFuZXMgMiwgMyBhbmQgNCBhcmUgcmVjb2duaXplZCBhcyBvdmVybGF5IHBsYW5lcyBhbmQg dGh1cwo+Pj4+IGRvbid0IGFmZmVjdCB0aGUgcGlwZSBhY3RpdmUgc3RhdGUuIFBpcGUgQiBpcyBo YW5kbGVkIHRoZSBzYW1lIHdheSwgYW5kIGlndAo+Pj4+IGRpc2FibGVzIGl0IHR3aWNlIGFzIHBs YW5lcyAwIGFuZCAxIGFyZSBwcmltYXJ5Lgo+Pj4+Cj4+Pj4gSSBkb24ndCBrbm93IGlmIHRoZSBm YXVsdCBoZXJlIGlzIHdpdGggaWd0IHRoYXQgZG9lc24ndCBwcm9wZXJseSBzdXBwb3J0IHRoaXMK Pj4+PiBhcmNoaXRlY3R1cmUsIG9yIHdpdGggdGhlIGRyaXZlciB0aGF0IHNob3VsZG4ndCBoYXZl IHR3byBwcmltYXJ5IHBsYW5lcwo+Pj4+IGF2YWlsYWJsZSBmb3IgYSBDUlRDLiBJbiB0aGUgZm9y bWVyIGNhc2UsIEknbSBub3Qgc3VyZSBob3cgdG8gZml4IGl0LCBhcyBJJ20KPj4+PiBub3QgZmFt aWxpYXIgZW5vdWdoIHdpdGggaWd0IHRvIHJlYXJjaGl0ZWN0dXJlIHRoZSBjb21taXQgaGVscGVy cy4gSW4gdGhlCj4+Pj4gbGF0dGVyIGNhc2UsIGhvdyB3b3VsZCB5b3UgcmVjb21tZW5kIGZpeGlu ZyBpdCBvbiB0aGUgZHJpdmVyIHNpZGUgPwo+Pj4gSSBndWVzcyB0aHVzIGZhciBubyBvbmUgZGlk IHJ1biBpZ3Qgb24gYSBjaGlwIHdoaWNoIGRpZCBoYXZlIHJlYXNzaWduYWJsZQo+Pj4gcHJpbWFy eSBwbGFuZXMuIFRoZSBwcm9ibGVtIGhlcmUgaXMgdGhhdCBpdCdzIHByZXR0eSBoYXJkIHRvIGZp Z3VyZSBvdXQKPj4+IHdoaWNoIG9uZSBpcyB0aGUgcmVhbCBwcmltYXJ5IHBsYW5lLCBzaW5jZSB3 aXRoIHBvc3NpYmxlIENSVENzIHlvdSBjb3VsZAo+Pj4gaGF2ZSBtdWx0aXBsZSBwcmltYXJ5IHBs YW5lcyBvbiAxIENSVEMuIFRoZXJlJ3Mgbm8gcHJvcGVydHkgb3IgYW55dGhpbmcKPj4+IHRoYXQg ZXhwbGljaXRseSB0ZWxscyB5b3UgdGhpcy4gVHdvIGZpeGVzOgo+Pj4KPj4+IDEuIENoYW5nZSBk cml2ZXJzIHRvIGxpbWl0IHByaW1hcnkgcGxhbmVzIHRvIDEgY3J0Yy4gU2FtZSBmb3IgY3Vyc29y Cj4+PiAgICBvdmVybGF5cy4gVGhlcmUncyBwcm9iYWJseSBvdGhlciB1c2Vyc3BhY2UgdGhhbiBp Z3QgdGhhdCBnZXRzIGNvbmZ1c2VkCj4+PiAgICBieSB0aGlzLCBidXQgdGhpcyBoYXMgdGhlIHVn bHkgZG93bnNpZGUgdGhhdCB3ZSBhcnRpZmljYWxseSBsaW1pdCBwbGFuZQo+Pj4gICAgdXNhZ2Ug LSBpZiBvbmx5IDEgQ1JUQyBpcyBvbiwgd2Ugd2FudCB0byB1c2UgYWxsIHRoZSBhdmFpbGFibGUg cGxhbmVzCj4+PiAgICBvbiB0aGF0IG9uZS4KPj4+Cj4+PiAyLiBBZGQgc29tZSBpbXBsaWNpdCBv ciBleHBsaWNpdCB1YXBpIHRvIGFsbG93IHVzZXJzcGFjZSB0byBmaWd1cmUgb3V0Cj4+PiAgICB3 aGljaCBwcmltYXJ5IHBsYW5lIGlzIHRoZSBwcmltYXJ5IHBsYW5lIGZvciB0aGlzIGNydGMuCj4+ Pgo+Pj4gICAgYSkgRXhwbGljaXQgb3B0aW9uOiBXZSBhZGQgYSBQUklNQVJZX0lEIHByb3BlcnR5 IChhbmQgQ1VSU09SX0lEIHByb3AKPj4+ICAgICAgIHdoaWxlIGF0IGl0KSBvbiB0aGUgQ1JUQyB3 aGljaCBwb2ludHMgYXQgdGhlIHByaW1hcnkvY3Vyc29yIHBsYW5lLgo+Pj4KPj4+ICAgIGIpIElt cGxpY2l0IG9wdGlvbjogV2UgcmVxdWlyZSBwcmltYXJ5IHBsYW5lcyBhcmUgYXNzaWduZWQgdG8g Q1JUQyBpbiB0aGUKPj4+ICAgICAgIHNhbWUgb3JkZXIgYXMgdGhleSdyZSBjcmVhdGVkLiBTbyBm aXJzdCBwcmltYXJ5IHBsYW5lIHlvdSBlbmNvdXRlcgo+Pj4gICAgICAgaXMgdGhlIG9uZSBmb3Ig dGhlIGZpcnN0IENSVEMsIDJuZCBwcmltYXJ5IHBsYW5lIGlzIHRoZSBvbmUgZm9yIHRoZQo+Pj4g ICAgICAgMm5kIENSVEMgYW5kIHNvIG9uLiBJZiB3ZSBnbyB3aXRoIHRoaXMgd2UgcHJvYmFibHkg c2hvdWxkIGFkZCBhIGJpdAo+Pj4gICAgICAgb2YgY29kZSB0byB0aGUga2VybmVsIHRvIGNoZWNr IHRoYXQgaW52YXJpYW50IChieSBtYWtpbmcgc3VyZSB0aGUKPj4+ICAgICAgIHByaW1hcnkgcGxh bmUgaGFzIHRoZSBjb3JyZXNwb25kaW5nIENSVEMgaW5jbHVkZWQgaW4gaXRzCj4+PiAgICAgICBw b3NzaWJsZV9jcnRjIG1hc2spLgo+Pj4KPj4+IEVpdGhlciB3YXkgaWd0IG5lZWRzIHRvIGJlIHBh dGNoZWQgdG8gbm90IHRyZWF0IGFueSBwcmltYXJ5IHBsYW5lIHRoYXQKPj4+IGNvdWxkIHdvcmsg b24gYSBDUlRDIGFzIHRoZSBwcmltYXJ5IHBsYW5lIGZvciB0aGF0IENSVEMuCj4+Pgo+Pj4gUGVy c29uYWxseSBJJ20gbGVhbmluZyB0b3dhcmRzIDJiKS4KPj4gQWRkaW5nIE1hYXJ0ZW4gYW5kIGln dC1kZXYuCj4gV2Ugc2hvdWxkIGZpcnN0IG1ha2UgdGhlIHBsYW5lIGFycmF5IGdsb2JhbCwgaW5z dGVhZCBvZiBwZXIgY3J0Yy4KPgo+IFRoYXQgbWVhbnMgcmVtb3ZpbmcgcGxhbmUtPnBpcGUgYW5k IHBsYW5lLT5pbmRleC4KPgo+IEFuZCBwaXBlX29iai0+cGxhbmVzIGFuZCBwaXBlX29iai0+bl9w bGFuZXMgbmVlZCB0byBiZSBnb25lIHRvby4gSSB0aGluayBpdCdzCj4gZWFzaWVzdCB0byBtYWtl Cj4KPiBUaGVyZSBpcyBvbmUgcHJvYmxlbS4gTW9zdCBvZiB0aGUgdGVzdHMgYXJlIG5vdCBhd2Fy ZSBvZiB0aGUgbGltaXRhdGlvbnMuCj4gSWYgd2UgbWFrZSB0aGUgcGxhbmUgYXJyYXkgZ2xvYmFs IGl0IHNob3VsZCBiZSBwb3NzaWJsZSB0byBtYWtlCj4gYSBmb3JfZWFjaF9wb3NzaWJsZV9wbGFu ZV9vbl9waXBlIGVudW1lcmF0ZSBhbGwgcGxhbmVzIHRoYXQgY291bGQgYmUgYXNzaWduZWQKPiB0 byBhIGNlcnRhaW4gcGlwZS4gV2UgbmVlZCB0byBzb3J0IGJ5IHogb3JkZXIgc29tZWhvdywgYnV0 IGlmIHdlIHRoZW4gYWRkCj4gaWd0X3BsYW5lX3NldF9waXBlKCkgd2hpY2ggdXBkYXRlcyB0aGUg SUdUX1BMQU5FX0NSVENfSUQgcHJvcGVydHksIHdlIHNob3VsZAo+IGJlIGdvb2QuCj4KPiBPbmx5 IHRoaW5nIHdlIGRvbid0IHNlZSBpcyBob3cgdGhlIGRlZmF1bHQgY3J0Yy0+cHJpbWFyeSBhbmQg Y3J0Yy0+Y3Vyc29yIGFyZQo+IGFzc2lnbmVkLiBGb3IgdGhlIGNhbGxzIHdpdGggQ09NTUlUX0xF R0FDWSB3ZSBuZWVkIHRvIGtub3cgdGhlIG1hcHBpbmdzLCBidXQKPiBJIGRvbid0IHRoaW5rIHRo ZSBrZXJuZWwgZXhwb3NlcyB0aGVtPwo+IEkgZ3Vlc3Mgd2UgY291bGQgcHV0IGl0IGluIGEgRklG TyB3YXksIGZpcnN0IGVudW1lcmF0ZWQgcGxhbmUgd2l0aCBQUklNQVJZIHR5cGUKPiBpcyBib3Vu ZCB0byB0aGUgZmlyc3QgY3J0Yywgc2FtZSBmb3IgY3Vyc29yLgo+Cj4gVGhpcyB3aWxsIGhvcGVm dWxseSBhbGxvdyBsZWdhY3kgdGVzdHMgdG8ga2VlcCB3b3JraW5nLCB3aGlsZSBhdG9taWMgcGxh bmUgYXdhcmUKPiB0ZXN0cyB3aWxsIGJlIGFibGUgdG8gdXNlIGFsbCBwbGFuZXMuCj4KPiB+TWFh cnRlbgo+Cmh0dHBzOi8vY2dpdC5mcmVlZGVza3RvcC5vcmcvfm1sYW5raG9yc3QvaW50ZWwtZ3B1 LXRvb2xzIGlzIHdoYXQgSSB3YXMgdGhpbmtpbmcKYWJvdXQsIGRpZG4ndCB0ZXN0IGlmIGl0IHdv cmtzLCBvbmx5IGNvbXBpbGVzLgoKV2hhdCdzIG1pc3NpbmcgaXMgdGhhdCB3ZSBzaG91bGQgb25s eSBjcmVhdGUgMSBpZ3RfcGxhbmVfdCBmb3IgZWFjaCBkcm0gcGxhbmUKaW5zdGVhZCBvZiBvbmUg Zm9yIGVhY2ggcGlwZS4gTm90IHN1cmUgaG93IHRvIGdldCB0aGF0IHdvcmtpbmcgd2l0aG91dApi cmVha2luZyBhIGxvdCBvZiBhc3N1bXB0aW9ucyBpbiB0aGUgdGVzdHMsIG1haW5seSB0aGUgZHVh bCBvdXRwdXQgdGVzdHMuIEkgdGhpbmsKdGhhdCB3ZSBzaG91bGQgcHJldmVudCBmb3JfZWFjaF9w bGFuZV9vbl9waXBlIHVudGlsIGFuIG91dHB1dCBpcyBzZXQgb24gdGhlIHBpcGUsCmFuZCB0aGVu IGF1dG9tYXRpY2FsbHkgYXNzaWduIGFsbCBwbGFuZXMgdG8gaXQgYW5kIHNldCBwbGFuZS0+dHlw ZSB0byBzb21ldGhpbmcgbWF0Y2hpbmcuCgpXaGVuIGEgc2Vjb25kIG91dHB1dCBpcyBib3VuZCwg c3RlYWwgdW51c2VkIHNwcml0ZSBwbGFuZXMgYXMgcmVxdWlyZWQgYW5kIGRpdmlkZSB0aGVtCmVx dWFsbHkuIDopCgp+TWFhcnRlbgoKX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19f X19fX19fX19fX18KZHJpLWRldmVsIG1haWxpbmcgbGlzdApkcmktZGV2ZWxAbGlzdHMuZnJlZWRl c2t0b3Aub3JnCmh0dHBzOi8vbGlzdHMuZnJlZWRlc2t0b3Aub3JnL21haWxtYW4vbGlzdGluZm8v ZHJpLWRldmVsCg== From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: From: Maarten Lankhorst References: <20180422223430.16407-1-laurent.pinchart+renesas@ideasonboard.com> <3482108.jirjkbZynl@avalon> <20180430145524.GJ12521@phenom.ffwll.local> <20180430145640.GK12521@phenom.ffwll.local> <0f7c2e60-23d0-b222-c8c0-36b17f1e7c25@linux.intel.com> Message-ID: <296ab1a6-b333-114c-99d6-a9724c228e57@linux.intel.com> Date: Tue, 1 May 2018 17:47:38 +0200 MIME-Version: 1.0 In-Reply-To: <0f7c2e60-23d0-b222-c8c0-36b17f1e7c25@linux.intel.com> Content-Language: en-US Subject: Re: [igt-dev] igt trouble with planes shared between multiple CRTCs (Re: [PATCH v2 0/8] R-Car DU: Support CRC calculation) List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: base64 Errors-To: igt-dev-bounces@lists.freedesktop.org Sender: "igt-dev" To: Daniel Vetter , Laurent Pinchart Cc: linux-renesas-soc@vger.kernel.org, IGT development , Kieran Bingham , dri-devel@lists.freedesktop.org List-ID: T3AgMDEtMDUtMTggb20gMTA6NTggc2NocmVlZiBNYWFydGVuIExhbmtob3JzdDoKPiBIZXksCj4K PiBPcCAzMC0wNC0xOCBvbSAxNjo1NiBzY2hyZWVmIERhbmllbCBWZXR0ZXI6Cj4+IE9uIE1vbiwg QXByIDMwLCAyMDE4IGF0IDA0OjU1OjI0UE0gKzAyMDAsIERhbmllbCBWZXR0ZXIgd3JvdGU6Cj4+ PiBPbiBTYXQsIEFwciAyOCwgMjAxOCBhdCAxMjowNzowNEFNICswMzAwLCBMYXVyZW50IFBpbmNo YXJ0IHdyb3RlOgo+Pj4+IEhpIERhbmllbCwKPj4+Pgo+Pj4+IChSZW1vdmluZyB0aGUgbGludXgt bWVkaWEgbWFpbGluZyBsaXN0IGZyb20gQ0MgYXMgaXQgaXMgb3V0IG9mIHNjb3BlKQo+Pj4+Cj4+ Pj4gWW91IGVucXVpcmVkIG9uIElSQyB3aGV0aGVyIHRoaXMgcGF0Y2ggc2VyaWVzIHBhc3NlcyB0 aGUgaWd0IENSQyB0ZXN0cy4KPj4+Pgo+Pj4+ICMgLi9rbXNfcGlwZV9jcmNfYmFzaWMgLS1ydW4t c3VidGVzdCByZWFkLWNyYy1waXBlLUEKPj4+PiBJR1QtVmVyc2lvbjogMS4yMi1nZjQ0N2Y1ZmM1 MzFkIChhYXJjaDY0KSAoTGludXg6IDQuMTcuMC1yYzEtMDAwODUtZzU2ZTg0OWQ5M2NjOSBhYXJj aDY0KQo+Pj4+IHJlYWQtY3JjLXBpcGUtQTogVGVzdGluZyBjb25uZWN0b3IgTFZEUy0xIHVzaW5n IHBpcGUgQQo+Pj4+IChrbXNfcGlwZV9jcmNfYmFzaWM6MTYzOCkgaWd0LWRlYnVnZnMtQ1JJVElD QUw6IFRlc3QgYXNzZXJ0aW9uIGZhaWx1cmUgZnVuY3Rpb24gaWd0X3BpcGVfY3JjX3N0YXJ0LCBm aWxlIGlndF9kZWJ1Z2ZzLmM6NzY0Ogo+Pj4+IChrbXNfcGlwZV9jcmNfYmFzaWM6MTYzOCkgaWd0 LWRlYnVnZnMtQ1JJVElDQUw6IEZhaWxlZCBhc3NlcnRpb246IHBpcGVfY3JjLT5jcmNfZmQgIT0g LTEKPj4+PiAoa21zX3BpcGVfY3JjX2Jhc2ljOjE2MzgpIGlndC1kZWJ1Z2ZzLUNSSVRJQ0FMOiBM YXN0IGVycm5vOiA1LCBJbnB1dC9vdXRwdXQgZXJyb3IKPj4+PiBTdGFjayB0cmFjZToKPj4+PiBT dWJ0ZXN0IHJlYWQtY3JjLXBpcGUtQSBmYWlsZWQuCj4+Pj4gKioqKiBERUJVRyAqKioqCj4+Pj4g KGttc19waXBlX2NyY19iYXNpYzoxNjM4KSBERUJVRzogVGVzdCByZXF1aXJlbWVudCBwYXNzZWQ6 ICEocGlwZSA+PSBkYXRhLT5kaXNwbGF5Lm5fcGlwZXMpCj4+Pj4gKGttc19waXBlX2NyY19iYXNp YzoxNjM4KSBJTkZPOiByZWFkLWNyYy1waXBlLUE6IFRlc3RpbmcgY29ubmVjdG9yIExWRFMtMSB1 c2luZyBwaXBlIEEKPj4+PiAoa21zX3BpcGVfY3JjX2Jhc2ljOjE2MzgpIGlndC1rbXMtREVCVUc6 IGRpc3BsYXk6IExWRFMtMTogc2V0X3BpcGUoQSkKPj4+PiAoa21zX3BpcGVfY3JjX2Jhc2ljOjE2 MzgpIGlndC1rbXMtREVCVUc6IGRpc3BsYXk6IExWRFMtMTogU2VsZWN0aW5nIHBpcGUgQQo+Pj4+ IChrbXNfcGlwZV9jcmNfYmFzaWM6MTYzOCkgREVCVUc6IENsZWFyaW5nIHRoZSBmYiB3aXRoIGNv bG9yICgwLjAwLDEuMDAsMC4wMCkKPj4+PiAoa21zX3BpcGVfY3JjX2Jhc2ljOjE2MzgpIGlndC1m Yi1ERUJVRzogaWd0X2NyZWF0ZV9mYl93aXRoX2JvX3NpemUod2lkdGg9MTAyNCwgaGVpZ2h0PTc2 OCwgZm9ybWF0PTB4MzQzMjUyNTgsIHRpbGluZz0weDAsIHNpemU9MCkKPj4+PiAoa21zX3BpcGVf Y3JjX2Jhc2ljOjE2MzgpIGlndC1mYi1ERUJVRzogaWd0X2NyZWF0ZV9mYl93aXRoX2JvX3NpemUo aGFuZGxlPTEsIHBpdGNoPTQwOTYpCj4+Pj4gKGttc19waXBlX2NyY19iYXNpYzoxNjM4KSBpZ3Qt a21zLURFQlVHOiBUZXN0IHJlcXVpcmVtZW50IHBhc3NlZDogcGxhbmVfaWR4ID49IDAgJiYgcGxh bmVfaWR4IDwgcGlwZS0+bl9wbGFuZXMKPj4+PiAoa21zX3BpcGVfY3JjX2Jhc2ljOjE2MzgpIGln dC1rbXMtREVCVUc6IGRpc3BsYXk6IEEuMDogcGxhbmVfc2V0X2ZiKDE0MCkKPj4+PiAoa21zX3Bp cGVfY3JjX2Jhc2ljOjE2MzgpIGlndC1rbXMtREVCVUc6IGRpc3BsYXk6IEEuMDogcGxhbmVfc2V0 X3NpemUgKDEwMjR4NzY4KQo+Pj4+IChrbXNfcGlwZV9jcmNfYmFzaWM6MTYzOCkgaWd0LWttcy1E RUJVRzogZGlzcGxheTogQS4wOiBmYl9zZXRfcG9zaXRpb24oMCwwKQo+Pj4+IChrbXNfcGlwZV9j cmNfYmFzaWM6MTYzOCkgaWd0LWttcy1ERUJVRzogZGlzcGxheTogQS4wOiBmYl9zZXRfc2l6ZSgx MDI0eDc2OCkKPj4+PiAoa21zX3BpcGVfY3JjX2Jhc2ljOjE2MzgpIGlndC1rbXMtREVCVUc6IGRp c3BsYXk6IGNvbW1pdCB7Cj4+Pj4gKGttc19waXBlX2NyY19iYXNpYzoxNjM4KSBpZ3Qta21zLURF QlVHOiBkaXNwbGF5OiAgICAgTFZEUy0xOiBTZXRDcnRjIHBpcGUgQSwgZmIgMTQwLCBzcmMgKDAs IDApLCBtb2RlIDEwMjR4NzY4Cj4+Pj4gKGttc19waXBlX2NyY19iYXNpYzoxNjM4KSBpZ3Qta21z LURFQlVHOiBkaXNwbGF5OiAgICAgU2V0Q3J0YyBwaXBlIEEsIGRpc2FibGluZwo+Pj4+IChrbXNf cGlwZV9jcmNfYmFzaWM6MTYzOCkgaWd0LWttcy1ERUJVRzogZGlzcGxheTogICAgIFNldFBsYW5l IHBpcGUgQSwgcGxhbmUgMiwgZGlzYWJsaW5nCj4+Pj4gKGttc19waXBlX2NyY19iYXNpYzoxNjM4 KSBpZ3Qta21zLURFQlVHOiBkaXNwbGF5OiAgICAgU2V0UGxhbmUgcGlwZSBBLCBwbGFuZSAzLCBk aXNhYmxpbmcKPj4+PiAoa21zX3BpcGVfY3JjX2Jhc2ljOjE2MzgpIGlndC1rbXMtREVCVUc6IGRp c3BsYXk6ICAgICBTZXRQbGFuZSBwaXBlIEEsIHBsYW5lIDQsIGRpc2FibGluZwo+Pj4+IChrbXNf cGlwZV9jcmNfYmFzaWM6MTYzOCkgaWd0LWttcy1ERUJVRzogZGlzcGxheTogICAgIFNldENydGMg cGlwZSBCLCBkaXNhYmxpbmcKPj4+PiAoa21zX3BpcGVfY3JjX2Jhc2ljOjE2MzgpIGlndC1rbXMt REVCVUc6IGRpc3BsYXk6ICAgICBTZXRQbGFuZSBwaXBlIEIsIHBsYW5lIDEsIGRpc2FibGluZwo+ Pj4+IChrbXNfcGlwZV9jcmNfYmFzaWM6MTYzOCkgaWd0LWttcy1ERUJVRzogZGlzcGxheTogICAg IFNldFBsYW5lIHBpcGUgQiwgcGxhbmUgMiwgZGlzYWJsaW5nCj4+Pj4gKGttc19waXBlX2NyY19i YXNpYzoxNjM4KSBpZ3Qta21zLURFQlVHOiBkaXNwbGF5OiAgICAgU2V0UGxhbmUgcGlwZSBCLCBw bGFuZSAzLCBkaXNhYmxpbmcKPj4+PiAoa21zX3BpcGVfY3JjX2Jhc2ljOjE2MzgpIGlndC1rbXMt REVCVUc6IGRpc3BsYXk6ICAgICBTZXRQbGFuZSBwaXBlIEIsIHBsYW5lIDQsIGRpc2FibGluZwo+ Pj4+IChrbXNfcGlwZV9jcmNfYmFzaWM6MTYzOCkgaWd0LWttcy1ERUJVRzogZGlzcGxheTogICAg IFNldENydGMgcGlwZSBDLCBkaXNhYmxpbmcKPj4+PiAoa21zX3BpcGVfY3JjX2Jhc2ljOjE2Mzgp IGlndC1rbXMtREVCVUc6IGRpc3BsYXk6ICAgICBTZXRQbGFuZSBwaXBlIEMsIHBsYW5lIDEsIGRp c2FibGluZwo+Pj4+IChrbXNfcGlwZV9jcmNfYmFzaWM6MTYzOCkgaWd0LWttcy1ERUJVRzogZGlz cGxheTogICAgIFNldFBsYW5lIHBpcGUgQywgcGxhbmUgMiwgZGlzYWJsaW5nCj4+Pj4gKGttc19w aXBlX2NyY19iYXNpYzoxNjM4KSBpZ3Qta21zLURFQlVHOiBkaXNwbGF5OiAgICAgU2V0UGxhbmUg cGlwZSBDLCBwbGFuZSAzLCBkaXNhYmxpbmcKPj4+PiAoa21zX3BpcGVfY3JjX2Jhc2ljOjE2Mzgp IGlndC1rbXMtREVCVUc6IGRpc3BsYXk6ICAgICBTZXRQbGFuZSBwaXBlIEMsIHBsYW5lIDQsIGRp c2FibGluZwo+Pj4+IChrbXNfcGlwZV9jcmNfYmFzaWM6MTYzOCkgaWd0LWttcy1ERUJVRzogZGlz cGxheTogICAgIFNldENydGMgcGlwZSBELCBkaXNhYmxpbmcKPj4+PiAoa21zX3BpcGVfY3JjX2Jh c2ljOjE2MzgpIGlndC1rbXMtREVCVUc6IGRpc3BsYXk6ICAgICBTZXRDcnRjIHBpcGUgRCwgZGlz YWJsaW5nCj4+Pj4gKGttc19waXBlX2NyY19iYXNpYzoxNjM4KSBpZ3Qta21zLURFQlVHOiBkaXNw bGF5OiAgICAgU2V0UGxhbmUgcGlwZSBELCBwbGFuZSAyLCBkaXNhYmxpbmcKPj4+PiAoa21zX3Bp cGVfY3JjX2Jhc2ljOjE2MzgpIGlndC1rbXMtREVCVUc6IGRpc3BsYXk6ICAgICBTZXRQbGFuZSBw aXBlIEQsIHBsYW5lIDMsIGRpc2FibGluZwo+Pj4+IChrbXNfcGlwZV9jcmNfYmFzaWM6MTYzOCkg aWd0LWttcy1ERUJVRzogZGlzcGxheTogICAgIFNldFBsYW5lIHBpcGUgRCwgcGxhbmUgNCwgZGlz YWJsaW5nCj4+Pj4gKGttc19waXBlX2NyY19iYXNpYzoxNjM4KSBpZ3Qta21zLURFQlVHOiBkaXNw bGF5OiB9Cj4+Pj4gKGttc19waXBlX2NyY19iYXNpYzoxNjM4KSBpZ3QtZGVidWdmcy1ERUJVRzog T3BlbmluZyBkZWJ1Z2ZzIGRpcmVjdG9yeSAnL3N5cy9rZXJuZWwvZGVidWcvZHJpLzAnCj4+Pj4g KGttc19waXBlX2NyY19iYXNpYzoxNjM4KSBpZ3QtZGVidWdmcy1ERUJVRzogT3BlbmluZyBkZWJ1 Z2ZzIGRpcmVjdG9yeSAnL3N5cy9rZXJuZWwvZGVidWcvZHJpLzAnCj4+Pj4gKGttc19waXBlX2Ny Y19iYXNpYzoxNjM4KSBpZ3QtZGVidWdmcy1DUklUSUNBTDogVGVzdCBhc3NlcnRpb24gZmFpbHVy ZSBmdW5jdGlvbiBpZ3RfcGlwZV9jcmNfc3RhcnQsIGZpbGUgaWd0X2RlYnVnZnMuYzo3NjQ6Cj4+ Pj4gKGttc19waXBlX2NyY19iYXNpYzoxNjM4KSBpZ3QtZGVidWdmcy1DUklUSUNBTDogRmFpbGVk IGFzc2VydGlvbjogcGlwZV9jcmMtPmNyY19mZCAhPSAtMQo+Pj4+IChrbXNfcGlwZV9jcmNfYmFz aWM6MTYzOCkgaWd0LWRlYnVnZnMtQ1JJVElDQUw6IExhc3QgZXJybm86IDUsIElucHV0L291dHB1 dCBlcnJvcgo+Pj4+IChrbXNfcGlwZV9jcmNfYmFzaWM6MTYzOCkgaWd0LWNvcmUtSU5GTzogU3Rh Y2sgdHJhY2U6Cj4+Pj4gKioqKiAgRU5EICAqKioqCj4+Pj4gU3VidGVzdCByZWFkLWNyYy1waXBl LUE6IEZBSUwgKDAuMDYxcykKPj4+Pgo+Pj4+IEkgdGhpbmsgdGhlIGFuc3dlciBpcyBubywgYnV0 IEkgZG9uJ3QgdGhpbmsgaXQncyB0aGUgZmF1bHQgb2YgdGhpcyBwYXRjaAo+Pj4+IHNlcmllcy4g T3BlbmluZyB0aGUgQ1JDIGRhdGEgZmlsZSByZXR1cm5zIC1FSU8gYmVjYXVzZSB0aGUgQ1JUQyBp cyBub3QgYWN0aXZlLAo+Pj4+IGFuZCBJJ20gdHJ5aW5nIHRvIGZpbmQgb3V0IHdoeSB0aGF0IGlz IHRoZSBjYXNlLiBUaGUgZGVidWcgbG9nIHNob3dzIGEgY29tbWl0Cj4+Pj4gdGhhdCBzZWVtcyBz dHJhbmdlIHRvIG1lLCBlbmFibGluZyBwaXBlIEEgYW5kIGltbWVkaWF0ZWx5IGRpc2FibGluZyBy aWdodAo+Pj4+IGFmdGVyd2FyZHMuIEFmdGVyIHNvbWUgaW52ZXN0aWdhdGlvbiBJIGJlbGlldmUg dGhhdCB0aGlzIGlzIGNhdXNlZCBieSBzaGFyaW5nCj4+Pj4gcHJpbWFyeSBwbGFuZXMgYmV0d2Vl biBDUlRDcy4KPj4+Pgo+Pj4+IFRoZSBSLUNhciBEVSBncm91cHMgQ1JUQ3MgYnkgdHdvIGFuZCBz aGFyZXMgNSBwbGFuZXMgYmV0d2VlbiB0aGUgdHdvIENSVENzIG9mCj4+Pj4gdGhlIGdyb3VwLiBU aGlzIHNwZWNpZmljIFNvQyBoYXMgdHdvIGdyb3VwcyBvZiB0d28gQ1JUQ3MsIGJ1dCB0aGF0J3Mg bm90Cj4+Pj4gcmVsZXZhbnQgaGVyZSwgc28gd2UgY2FuIGlnbm9yZSBwaXBlcyBDIGFuZCBELgo+ Pj4+Cj4+Pj4gUGlwZXMgQSBhbmQgQiB0aHVzIHNoYXJlZCA1IHBsYW5lcyB0aGF0IEkgd2lsbCBu dW1iZXIgMCB0byA0IGZvciBzaW1wbGljaXR5Lgo+Pj4+IFRoZSBkcml2ZXIgc2V0cyBwbGFuZSAw IGFzIHRoZSBwcmltYXJ5IHBsYW5lIGZvciBDUlRDIEEgYW5kIHBsYW5lIDEgYXMgdGhlCj4+Pj4g cHJpbWFyeSBwbGFuZSBmb3IgQ1JUQyBCLiBQbGFuZXMgMiwgMyBhbmQgNCBhcmUgY3JlYXRlZCBh cyBvdmVybGF5IHBsYW5lcy4KPj4+Pgo+Pj4+IFdoZW4gaWd0IGl0ZXJhdGVzIG92ZXIgYWxsIHBs YW5lcyBmb3IgcGlwZSBBLCBpdCB3aWxsIGZpcnN0IGVuY291bnRlciBwbGFuZSAwCj4+Pj4gdGhh dCBoYXMgYSBmcmFtZWJ1ZmZlciwgYW5kIHRodXMgZW5hYmxlcyB0aGUgcGlwZS4gSXQgdGhlbiBp dGVyYXRlcyBvdmVyCj4+Pj4gcGxhbmUgMSwgcmVjb2duaXplcyBpdCBhcyBhIHByaW1hcnkgcGxh bmUgd2l0aG91dCBhIGZyYW1lYnVmZmVyLCBhbmQgdGh1cwo+Pj4+IGRpc2FibGVzIHRoZSBwaXBl LiBQbGFuZXMgMiwgMyBhbmQgNCBhcmUgcmVjb2duaXplZCBhcyBvdmVybGF5IHBsYW5lcyBhbmQg dGh1cwo+Pj4+IGRvbid0IGFmZmVjdCB0aGUgcGlwZSBhY3RpdmUgc3RhdGUuIFBpcGUgQiBpcyBo YW5kbGVkIHRoZSBzYW1lIHdheSwgYW5kIGlndAo+Pj4+IGRpc2FibGVzIGl0IHR3aWNlIGFzIHBs YW5lcyAwIGFuZCAxIGFyZSBwcmltYXJ5Lgo+Pj4+Cj4+Pj4gSSBkb24ndCBrbm93IGlmIHRoZSBm YXVsdCBoZXJlIGlzIHdpdGggaWd0IHRoYXQgZG9lc24ndCBwcm9wZXJseSBzdXBwb3J0IHRoaXMK Pj4+PiBhcmNoaXRlY3R1cmUsIG9yIHdpdGggdGhlIGRyaXZlciB0aGF0IHNob3VsZG4ndCBoYXZl IHR3byBwcmltYXJ5IHBsYW5lcwo+Pj4+IGF2YWlsYWJsZSBmb3IgYSBDUlRDLiBJbiB0aGUgZm9y bWVyIGNhc2UsIEknbSBub3Qgc3VyZSBob3cgdG8gZml4IGl0LCBhcyBJJ20KPj4+PiBub3QgZmFt aWxpYXIgZW5vdWdoIHdpdGggaWd0IHRvIHJlYXJjaGl0ZWN0dXJlIHRoZSBjb21taXQgaGVscGVy cy4gSW4gdGhlCj4+Pj4gbGF0dGVyIGNhc2UsIGhvdyB3b3VsZCB5b3UgcmVjb21tZW5kIGZpeGlu ZyBpdCBvbiB0aGUgZHJpdmVyIHNpZGUgPwo+Pj4gSSBndWVzcyB0aHVzIGZhciBubyBvbmUgZGlk IHJ1biBpZ3Qgb24gYSBjaGlwIHdoaWNoIGRpZCBoYXZlIHJlYXNzaWduYWJsZQo+Pj4gcHJpbWFy eSBwbGFuZXMuIFRoZSBwcm9ibGVtIGhlcmUgaXMgdGhhdCBpdCdzIHByZXR0eSBoYXJkIHRvIGZp Z3VyZSBvdXQKPj4+IHdoaWNoIG9uZSBpcyB0aGUgcmVhbCBwcmltYXJ5IHBsYW5lLCBzaW5jZSB3 aXRoIHBvc3NpYmxlIENSVENzIHlvdSBjb3VsZAo+Pj4gaGF2ZSBtdWx0aXBsZSBwcmltYXJ5IHBs YW5lcyBvbiAxIENSVEMuIFRoZXJlJ3Mgbm8gcHJvcGVydHkgb3IgYW55dGhpbmcKPj4+IHRoYXQg ZXhwbGljaXRseSB0ZWxscyB5b3UgdGhpcy4gVHdvIGZpeGVzOgo+Pj4KPj4+IDEuIENoYW5nZSBk cml2ZXJzIHRvIGxpbWl0IHByaW1hcnkgcGxhbmVzIHRvIDEgY3J0Yy4gU2FtZSBmb3IgY3Vyc29y Cj4+PiAgICBvdmVybGF5cy4gVGhlcmUncyBwcm9iYWJseSBvdGhlciB1c2Vyc3BhY2UgdGhhbiBp Z3QgdGhhdCBnZXRzIGNvbmZ1c2VkCj4+PiAgICBieSB0aGlzLCBidXQgdGhpcyBoYXMgdGhlIHVn bHkgZG93bnNpZGUgdGhhdCB3ZSBhcnRpZmljYWxseSBsaW1pdCBwbGFuZQo+Pj4gICAgdXNhZ2Ug LSBpZiBvbmx5IDEgQ1JUQyBpcyBvbiwgd2Ugd2FudCB0byB1c2UgYWxsIHRoZSBhdmFpbGFibGUg cGxhbmVzCj4+PiAgICBvbiB0aGF0IG9uZS4KPj4+Cj4+PiAyLiBBZGQgc29tZSBpbXBsaWNpdCBv ciBleHBsaWNpdCB1YXBpIHRvIGFsbG93IHVzZXJzcGFjZSB0byBmaWd1cmUgb3V0Cj4+PiAgICB3 aGljaCBwcmltYXJ5IHBsYW5lIGlzIHRoZSBwcmltYXJ5IHBsYW5lIGZvciB0aGlzIGNydGMuCj4+ Pgo+Pj4gICAgYSkgRXhwbGljaXQgb3B0aW9uOiBXZSBhZGQgYSBQUklNQVJZX0lEIHByb3BlcnR5 IChhbmQgQ1VSU09SX0lEIHByb3AKPj4+ICAgICAgIHdoaWxlIGF0IGl0KSBvbiB0aGUgQ1JUQyB3 aGljaCBwb2ludHMgYXQgdGhlIHByaW1hcnkvY3Vyc29yIHBsYW5lLgo+Pj4KPj4+ICAgIGIpIElt cGxpY2l0IG9wdGlvbjogV2UgcmVxdWlyZSBwcmltYXJ5IHBsYW5lcyBhcmUgYXNzaWduZWQgdG8g Q1JUQyBpbiB0aGUKPj4+ICAgICAgIHNhbWUgb3JkZXIgYXMgdGhleSdyZSBjcmVhdGVkLiBTbyBm aXJzdCBwcmltYXJ5IHBsYW5lIHlvdSBlbmNvdXRlcgo+Pj4gICAgICAgaXMgdGhlIG9uZSBmb3Ig dGhlIGZpcnN0IENSVEMsIDJuZCBwcmltYXJ5IHBsYW5lIGlzIHRoZSBvbmUgZm9yIHRoZQo+Pj4g ICAgICAgMm5kIENSVEMgYW5kIHNvIG9uLiBJZiB3ZSBnbyB3aXRoIHRoaXMgd2UgcHJvYmFibHkg c2hvdWxkIGFkZCBhIGJpdAo+Pj4gICAgICAgb2YgY29kZSB0byB0aGUga2VybmVsIHRvIGNoZWNr IHRoYXQgaW52YXJpYW50IChieSBtYWtpbmcgc3VyZSB0aGUKPj4+ICAgICAgIHByaW1hcnkgcGxh bmUgaGFzIHRoZSBjb3JyZXNwb25kaW5nIENSVEMgaW5jbHVkZWQgaW4gaXRzCj4+PiAgICAgICBw b3NzaWJsZV9jcnRjIG1hc2spLgo+Pj4KPj4+IEVpdGhlciB3YXkgaWd0IG5lZWRzIHRvIGJlIHBh dGNoZWQgdG8gbm90IHRyZWF0IGFueSBwcmltYXJ5IHBsYW5lIHRoYXQKPj4+IGNvdWxkIHdvcmsg b24gYSBDUlRDIGFzIHRoZSBwcmltYXJ5IHBsYW5lIGZvciB0aGF0IENSVEMuCj4+Pgo+Pj4gUGVy c29uYWxseSBJJ20gbGVhbmluZyB0b3dhcmRzIDJiKS4KPj4gQWRkaW5nIE1hYXJ0ZW4gYW5kIGln dC1kZXYuCj4gV2Ugc2hvdWxkIGZpcnN0IG1ha2UgdGhlIHBsYW5lIGFycmF5IGdsb2JhbCwgaW5z dGVhZCBvZiBwZXIgY3J0Yy4KPgo+IFRoYXQgbWVhbnMgcmVtb3ZpbmcgcGxhbmUtPnBpcGUgYW5k IHBsYW5lLT5pbmRleC4KPgo+IEFuZCBwaXBlX29iai0+cGxhbmVzIGFuZCBwaXBlX29iai0+bl9w bGFuZXMgbmVlZCB0byBiZSBnb25lIHRvby4gSSB0aGluayBpdCdzCj4gZWFzaWVzdCB0byBtYWtl Cj4KPiBUaGVyZSBpcyBvbmUgcHJvYmxlbS4gTW9zdCBvZiB0aGUgdGVzdHMgYXJlIG5vdCBhd2Fy ZSBvZiB0aGUgbGltaXRhdGlvbnMuCj4gSWYgd2UgbWFrZSB0aGUgcGxhbmUgYXJyYXkgZ2xvYmFs IGl0IHNob3VsZCBiZSBwb3NzaWJsZSB0byBtYWtlCj4gYSBmb3JfZWFjaF9wb3NzaWJsZV9wbGFu ZV9vbl9waXBlIGVudW1lcmF0ZSBhbGwgcGxhbmVzIHRoYXQgY291bGQgYmUgYXNzaWduZWQKPiB0 byBhIGNlcnRhaW4gcGlwZS4gV2UgbmVlZCB0byBzb3J0IGJ5IHogb3JkZXIgc29tZWhvdywgYnV0 IGlmIHdlIHRoZW4gYWRkCj4gaWd0X3BsYW5lX3NldF9waXBlKCkgd2hpY2ggdXBkYXRlcyB0aGUg SUdUX1BMQU5FX0NSVENfSUQgcHJvcGVydHksIHdlIHNob3VsZAo+IGJlIGdvb2QuCj4KPiBPbmx5 IHRoaW5nIHdlIGRvbid0IHNlZSBpcyBob3cgdGhlIGRlZmF1bHQgY3J0Yy0+cHJpbWFyeSBhbmQg Y3J0Yy0+Y3Vyc29yIGFyZQo+IGFzc2lnbmVkLiBGb3IgdGhlIGNhbGxzIHdpdGggQ09NTUlUX0xF R0FDWSB3ZSBuZWVkIHRvIGtub3cgdGhlIG1hcHBpbmdzLCBidXQKPiBJIGRvbid0IHRoaW5rIHRo ZSBrZXJuZWwgZXhwb3NlcyB0aGVtPwo+IEkgZ3Vlc3Mgd2UgY291bGQgcHV0IGl0IGluIGEgRklG TyB3YXksIGZpcnN0IGVudW1lcmF0ZWQgcGxhbmUgd2l0aCBQUklNQVJZIHR5cGUKPiBpcyBib3Vu ZCB0byB0aGUgZmlyc3QgY3J0Yywgc2FtZSBmb3IgY3Vyc29yLgo+Cj4gVGhpcyB3aWxsIGhvcGVm dWxseSBhbGxvdyBsZWdhY3kgdGVzdHMgdG8ga2VlcCB3b3JraW5nLCB3aGlsZSBhdG9taWMgcGxh bmUgYXdhcmUKPiB0ZXN0cyB3aWxsIGJlIGFibGUgdG8gdXNlIGFsbCBwbGFuZXMuCj4KPiB+TWFh cnRlbgo+Cmh0dHBzOi8vY2dpdC5mcmVlZGVza3RvcC5vcmcvfm1sYW5raG9yc3QvaW50ZWwtZ3B1 LXRvb2xzIGlzIHdoYXQgSSB3YXMgdGhpbmtpbmcKYWJvdXQsIGRpZG4ndCB0ZXN0IGlmIGl0IHdv cmtzLCBvbmx5IGNvbXBpbGVzLgoKV2hhdCdzIG1pc3NpbmcgaXMgdGhhdCB3ZSBzaG91bGQgb25s eSBjcmVhdGUgMSBpZ3RfcGxhbmVfdCBmb3IgZWFjaCBkcm0gcGxhbmUKaW5zdGVhZCBvZiBvbmUg Zm9yIGVhY2ggcGlwZS4gTm90IHN1cmUgaG93IHRvIGdldCB0aGF0IHdvcmtpbmcgd2l0aG91dApi cmVha2luZyBhIGxvdCBvZiBhc3N1bXB0aW9ucyBpbiB0aGUgdGVzdHMsIG1haW5seSB0aGUgZHVh bCBvdXRwdXQgdGVzdHMuIEkgdGhpbmsKdGhhdCB3ZSBzaG91bGQgcHJldmVudCBmb3JfZWFjaF9w bGFuZV9vbl9waXBlIHVudGlsIGFuIG91dHB1dCBpcyBzZXQgb24gdGhlIHBpcGUsCmFuZCB0aGVu IGF1dG9tYXRpY2FsbHkgYXNzaWduIGFsbCBwbGFuZXMgdG8gaXQgYW5kIHNldCBwbGFuZS0+dHlw ZSB0byBzb21ldGhpbmcgbWF0Y2hpbmcuCgpXaGVuIGEgc2Vjb25kIG91dHB1dCBpcyBib3VuZCwg c3RlYWwgdW51c2VkIHNwcml0ZSBwbGFuZXMgYXMgcmVxdWlyZWQgYW5kIGRpdmlkZSB0aGVtCmVx dWFsbHkuIDopCgp+TWFhcnRlbgoKX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19f X19fX19fX19fX18KaWd0LWRldiBtYWlsaW5nIGxpc3QKaWd0LWRldkBsaXN0cy5mcmVlZGVza3Rv cC5vcmcKaHR0cHM6Ly9saXN0cy5mcmVlZGVza3RvcC5vcmcvbWFpbG1hbi9saXN0aW5mby9pZ3Qt ZGV2Cg==