From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-7.0 required=3.0 tests=HEADER_FROM_DIFFERENT_DOMAINS, INCLUDES_PATCH,MAILING_LIST_MULTI,SIGNED_OFF_BY,SPF_PASS,URIBL_BLOCKED autolearn=ham autolearn_force=no version=3.4.0 Received: from mail.kernel.org (mail.kernel.org [198.145.29.99]) by smtp.lore.kernel.org (Postfix) with ESMTP id A988EC282CB for ; Tue, 5 Feb 2019 09:34:53 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by mail.kernel.org (Postfix) with ESMTP id 7943D20844 for ; Tue, 5 Feb 2019 09:34:53 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1726887AbfBEJex (ORCPT ); Tue, 5 Feb 2019 04:34:53 -0500 Received: from lb3-smtp-cloud7.xs4all.net ([194.109.24.31]:60282 "EHLO lb3-smtp-cloud7.xs4all.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1725898AbfBEJew (ORCPT ); Tue, 5 Feb 2019 04:34:52 -0500 Received: from [IPv6:2001:983:e9a7:1:2989:f759:211b:c8a5] ([IPv6:2001:983:e9a7:1:2989:f759:211b:c8a5]) by smtp-cloud7.xs4all.net with ESMTPA id qx7vgbMH4BDyIqx7wgBGu9; Tue, 05 Feb 2019 10:34:50 +0100 Subject: Re: [Xen-devel][PATCH v4 1/1] cameraif: add ABI for para-virtual camera To: Oleksandr Andrushchenko , Oleksandr Andrushchenko , "xen-devel@lists.xenproject.org" , "konrad.wilk@oracle.com" , "jgross@suse.com" , "boris.ostrovsky@oracle.com" , "mchehab@kernel.org" , "linux-media@vger.kernel.org" , "sakari.ailus@linux.intel.com" , "koji.matsuoka.xm@renesas.com" References: <20190115093853.15495-1-andr2000@gmail.com> <20190115093853.15495-2-andr2000@gmail.com> <393f824d-e543-476c-777f-402bcc1c0bcb@xs4all.nl> <1152536e-9238-4192-653e-b784b34b8a0d@epam.com> From: Hans Verkuil Message-ID: Date: Tue, 5 Feb 2019 10:34:47 +0100 User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:60.0) Gecko/20100101 Thunderbird/60.3.1 MIME-Version: 1.0 In-Reply-To: Content-Type: text/plain; charset=utf-8 Content-Language: en-US Content-Transfer-Encoding: 8bit X-CMAE-Envelope: MS4wfDVZIIcMxeXpAAGs5/J5nfua5dwtRI+ZSPycmdE3JOikK9Oo/tZeknQysB+Jfp7wqGbQ8qhSiLgASIEE1JbYl8EGgn2ctQ2XEiCfI6rp/KRT36dXBmqF ZnslS4NT2ULx9cadGOB0oKxHGqWnwivZyB6IawN/BwN1MSyAg5VYRZH/HoUCEN0synQj8LMU3+UBDBrHt3josJEw6WnqMJYzRb8KwjB5+a09pPo5c7pJUIoS bTFUfb0RkSFdDkG3A6wj/DO+XkCkDfhkFuYspZQzoHI/p/MJGyeq7qJ0JF+M/tvRxHtUF6jy7LrMkJsbWxyIS2p/c7UXtpMqkt5EzAN73+GVMFardVcZryw2 fLEso8I8kFfU8AB3uq1S2QyqvvtdnZSlP28vivwQYNTLsP8pyHEJcYSlyeY8OHHE0S/ix0kq5ACkqNq7ySZwRcdOfklu6+koKKF3hyKDLz0qgXZXJnz7NCr5 2iYwCuQ3+mwKbMwhBJDC28aco8phvyFNxQiHwHgHMGP2G7cHHGA5gi05AiQpKG6MPBrMNjppf7ul1IvqQXKkdRGLIvOassPEmaOwYnMWMhQexg9rZbSzJZ3M kbXKkTUC9CAAsIt0XHNOi3Bi Sender: linux-media-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-media@vger.kernel.org On 2/5/19 9:48 AM, Oleksandr Andrushchenko wrote: > On 1/23/19 10:14 AM, Oleksandr Andrushchenko wrote: >> Any comments from Xen community? >> Konrad? > While I am still looking forward to any comments from Xen community... >> >> On 1/15/19 4:44 PM, Hans Verkuil wrote: >>> Hi Oleksandr, >>> >>> Just two remaining comments: >>> >>> On 1/15/19 10:38 AM, Oleksandr Andrushchenko wrote: >>>> From: Oleksandr Andrushchenko >>>> >>>> This is the ABI for the two halves of a para-virtualized >>>> camera driver which extends Xen's reach multimedia capabilities even >>>> farther enabling it for video conferencing, In-Vehicle Infotainment, >>>> high definition maps etc. >>>> >>>> The initial goal is to support most needed functionality with the >>>> final idea to make it possible to extend the protocol if need be: >>>> >>>> 1. Provide means for base virtual device configuration: >>>>    - pixel formats >>>>    - resolutions >>>>    - frame rates >>>> 2. Support basic camera controls: >>>>    - contrast >>>>    - brightness >>>>    - hue >>>>    - saturation >>>> 3. Support streaming control >>>> >>>> Signed-off-by: Oleksandr Andrushchenko >>>> --- >>>>    xen/include/public/io/cameraif.h | 1364 ++++++++++++++++++++++++++++++ >>>>    1 file changed, 1364 insertions(+) >>>>    create mode 100644 xen/include/public/io/cameraif.h >>>> >>>> diff --git a/xen/include/public/io/cameraif.h b/xen/include/public/io/cameraif.h >>>> new file mode 100644 >>>> index 000000000000..246eb2457f40 >>>> --- /dev/null >>>> +++ b/xen/include/public/io/cameraif.h >>>> @@ -0,0 +1,1364 @@ >>> >>> >>>> +/* >>>> + ****************************************************************************** >>>> + *                                 EVENT CODES >>>> + ****************************************************************************** >>>> + */ >>>> +#define XENCAMERA_EVT_FRAME_AVAIL      0x00 >>>> +#define XENCAMERA_EVT_CTRL_CHANGE      0x01 >>>> + >>>> +/* Resolution has changed. */ >>>> +#define XENCAMERA_EVT_CFG_FLG_RESOL    (1 << 0) >>> I think this flag is a left-over from v2 and should be removed. >>> >>> >>> >>>> + * Request number of buffers to be used: >>>> + *         0                1                 2               3        octet >>>> + * +----------------+----------------+----------------+----------------+ >>>> + * |               id                | _OP_BUF_REQUEST|   reserved     | 4 >>>> + * +----------------+----------------+----------------+----------------+ >>>> + * |                             reserved                              | 8 >>>> + * +----------------+----------------+----------------+----------------+ >>>> + * |    num_bufs    |                     reserved                     | 12 >>>> + * +----------------+----------------+----------------+----------------+ >>>> + * |                             reserved                              | 16 >>>> + * +----------------+----------------+----------------+----------------+ >>>> + * |/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/| >>>> + * +----------------+----------------+----------------+----------------+ >>>> + * |                             reserved                              | 64 >>>> + * +----------------+----------------+----------------+----------------+ >>>> + * >>>> + * num_bufs - uint8_t, desired number of buffers to be used. This is >>>> + *   limited to the value configured in XenStore.max-buffers. >>>> + *   Passing zero num_bufs in this request (after streaming has stopped >>>> + *   and all buffers destroyed) unblocks camera configuration changes. >>> I think the phrase 'unblocks camera configuration changes' is confusing. >>> >>> In v3 this sentence came after the third note below, and so it made sense >>> in that context, but now the order has been reversed and it became hard to >>> understand. >>> >>> I'm not sure what the best approach is to fix this. One option is to remove >>> the third note and integrate it somehow in the sentence above. Or perhaps >>> do away with the 'notes' at all and just write a more extensive documentation >>> for this op. I leave that up to you. > Hans, how about: > >  * num_bufs - uint8_t, desired number of buffers to be used. >  * >  * The number of buffers in this request must not exceed the value configured >  * in XenStore.max-buffers. If the number of buffers is not zero then after this >  * request the camera configuration cannot be changed. In order to allow camera >  * (re)configuration this request must be sent with num_bufs set to zero and >  * the streaming must be stopped and buffers destroyed. >  * It is allowed for the frontend to send multiple XENCAMERA_OP_BUF_REQUEST >  * requests before sending XENCAMERA_OP_STREAM_START request to update or >  * tune the final configuration. >  * Frontend is responsible for checking the corresponding response in order to >  * see if the values reported back by the backend do match the desired ones >  * and can be accepted. >  * >  * See response format for this request. >  */ Hmm, it still is awkward. Part of the reason for that is that VIDIOC_REQBUFS is just weird in that a value of 0 has a special meaning. Perhaps it would be much cleaner for the Xen implementation to just add a new OP: _OP_FREE_ALL_BUFS (or perhaps _RELEASE_ALL_BUFS) that effectively does VIDIOC_REQBUFS with a 0 count value. And this OP_BUF_REQUEST (wouldn't OP_REQUEST_BUFS be a better name?) would then do nothing or return an error if num_bufs == 0. If you don't want to create a new Xen op, then I would change the text some more since you do not actually explain what the op does if num_bufs is 0. I would write something like this: If num_bufs is greater than 0, then . If num_bufs is equal to 0, then . If num_bufs is not zero then after this request the camera configuration cannot be changed. In order to allow camera (re)configuration this request must be sent with num_bufs set to zero and the streaming must be stopped and buffers destroyed. Regards, Hans > >>>> + * >>>> + * See response format for this request. >>>> + * >>>> + * Notes: >>>> + *  - frontend must check the corresponding response in order to see >>>> + *    if the values reported back by the backend do match the desired ones >>>> + *    and can be accepted. >>>> + *  - frontend may send multiple XENCAMERA_OP_BUF_REQUEST requests before >>>> + *    sending XENCAMERA_OP_STREAM_START request to update or tune the >>>> + *    configuration. >>>> + *  - after this request camera configuration cannot be changed, unless >>> camera configuration -> the camera configuration >>> >>>> + *    streaming is stopped and buffers destroyed >>>> + */ >>> Regards, >>> >>>     Hans > From mboxrd@z Thu Jan 1 00:00:00 1970 From: Hans Verkuil Subject: Re: [PATCH v4 1/1] cameraif: add ABI for para-virtual camera Date: Tue, 5 Feb 2019 10:34:47 +0100 Message-ID: References: <20190115093853.15495-1-andr2000@gmail.com> <20190115093853.15495-2-andr2000@gmail.com> <393f824d-e543-476c-777f-402bcc1c0bcb@xs4all.nl> <1152536e-9238-4192-653e-b784b34b8a0d@epam.com> Mime-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: base64 Return-path: Received: from us1-rack-dfw2.inumbo.com ([104.130.134.6]) by lists.xenproject.org with esmtp (Exim 4.89) (envelope-from ) id 1gqx81-0002ih-Tj for xen-devel@lists.xenproject.org; Tue, 05 Feb 2019 09:34:53 +0000 In-Reply-To: Content-Language: en-US List-Unsubscribe: , List-Post: List-Help: List-Subscribe: , Errors-To: xen-devel-bounces@lists.xenproject.org Sender: "Xen-devel" To: Oleksandr Andrushchenko , Oleksandr Andrushchenko , "xen-devel@lists.xenproject.org" , "konrad.wilk@oracle.com" , "jgross@suse.com" , "boris.ostrovsky@oracle.com" , "mchehab@kernel.org" , "linux-media@vger.kernel.org" , "sakari.ailus@linux.intel.com" , "koji.matsuoka.xm@renesas.com" List-Id: xen-devel@lists.xenproject.org T24gMi81LzE5IDk6NDggQU0sIE9sZWtzYW5kciBBbmRydXNoY2hlbmtvIHdyb3RlOgo+IE9uIDEv MjMvMTkgMTA6MTQgQU0sIE9sZWtzYW5kciBBbmRydXNoY2hlbmtvIHdyb3RlOgo+PiBBbnkgY29t bWVudHMgZnJvbSBYZW4gY29tbXVuaXR5Pwo+PiBLb25yYWQ/Cj4gV2hpbGUgSSBhbSBzdGlsbCBs b29raW5nIGZvcndhcmQgdG8gYW55IGNvbW1lbnRzIGZyb20gWGVuIGNvbW11bml0eS4uLgo+Pgo+ PiBPbiAxLzE1LzE5IDQ6NDQgUE0sIEhhbnMgVmVya3VpbCB3cm90ZToKPj4+IEhpIE9sZWtzYW5k ciwKPj4+Cj4+PiBKdXN0IHR3byByZW1haW5pbmcgY29tbWVudHM6Cj4+Pgo+Pj4gT24gMS8xNS8x OSAxMDozOCBBTSwgT2xla3NhbmRyIEFuZHJ1c2hjaGVua28gd3JvdGU6Cj4+Pj4gRnJvbTogT2xl a3NhbmRyIEFuZHJ1c2hjaGVua28gPG9sZWtzYW5kcl9hbmRydXNoY2hlbmtvQGVwYW0uY29tPgo+ Pj4+Cj4+Pj4gVGhpcyBpcyB0aGUgQUJJIGZvciB0aGUgdHdvIGhhbHZlcyBvZiBhIHBhcmEtdmly dHVhbGl6ZWQKPj4+PiBjYW1lcmEgZHJpdmVyIHdoaWNoIGV4dGVuZHMgWGVuJ3MgcmVhY2ggbXVs dGltZWRpYSBjYXBhYmlsaXRpZXMgZXZlbgo+Pj4+IGZhcnRoZXIgZW5hYmxpbmcgaXQgZm9yIHZp ZGVvIGNvbmZlcmVuY2luZywgSW4tVmVoaWNsZSBJbmZvdGFpbm1lbnQsCj4+Pj4gaGlnaCBkZWZp bml0aW9uIG1hcHMgZXRjLgo+Pj4+Cj4+Pj4gVGhlIGluaXRpYWwgZ29hbCBpcyB0byBzdXBwb3J0 IG1vc3QgbmVlZGVkIGZ1bmN0aW9uYWxpdHkgd2l0aCB0aGUKPj4+PiBmaW5hbCBpZGVhIHRvIG1h a2UgaXQgcG9zc2libGUgdG8gZXh0ZW5kIHRoZSBwcm90b2NvbCBpZiBuZWVkIGJlOgo+Pj4+Cj4+ Pj4gMS4gUHJvdmlkZSBtZWFucyBmb3IgYmFzZSB2aXJ0dWFsIGRldmljZSBjb25maWd1cmF0aW9u Ogo+Pj4+IMKgwqAgLSBwaXhlbCBmb3JtYXRzCj4+Pj4gwqDCoCAtIHJlc29sdXRpb25zCj4+Pj4g wqDCoCAtIGZyYW1lIHJhdGVzCj4+Pj4gMi4gU3VwcG9ydCBiYXNpYyBjYW1lcmEgY29udHJvbHM6 Cj4+Pj4gwqDCoCAtIGNvbnRyYXN0Cj4+Pj4gwqDCoCAtIGJyaWdodG5lc3MKPj4+PiDCoMKgIC0g aHVlCj4+Pj4gwqDCoCAtIHNhdHVyYXRpb24KPj4+PiAzLiBTdXBwb3J0IHN0cmVhbWluZyBjb250 cm9sCj4+Pj4KPj4+PiBTaWduZWQtb2ZmLWJ5OiBPbGVrc2FuZHIgQW5kcnVzaGNoZW5rbyA8b2xl a3NhbmRyX2FuZHJ1c2hjaGVua29AZXBhbS5jb20+Cj4+Pj4gLS0tCj4+Pj4gwqDCoCB4ZW4vaW5j bHVkZS9wdWJsaWMvaW8vY2FtZXJhaWYuaCB8IDEzNjQgKysrKysrKysrKysrKysrKysrKysrKysr KysrKysrCj4+Pj4gwqDCoCAxIGZpbGUgY2hhbmdlZCwgMTM2NCBpbnNlcnRpb25zKCspCj4+Pj4g wqDCoCBjcmVhdGUgbW9kZSAxMDA2NDQgeGVuL2luY2x1ZGUvcHVibGljL2lvL2NhbWVyYWlmLmgK Pj4+Pgo+Pj4+IGRpZmYgLS1naXQgYS94ZW4vaW5jbHVkZS9wdWJsaWMvaW8vY2FtZXJhaWYuaCBi L3hlbi9pbmNsdWRlL3B1YmxpYy9pby9jYW1lcmFpZi5oCj4+Pj4gbmV3IGZpbGUgbW9kZSAxMDA2 NDQKPj4+PiBpbmRleCAwMDAwMDAwMDAwMDAuLjI0NmViMjQ1N2Y0MAo+Pj4+IC0tLSAvZGV2L251 bGwKPj4+PiArKysgYi94ZW4vaW5jbHVkZS9wdWJsaWMvaW8vY2FtZXJhaWYuaAo+Pj4+IEBAIC0w LDAgKzEsMTM2NCBAQAo+Pj4gPHNuaXA+Cj4+Pgo+Pj4+ICsvKgo+Pj4+ICsgKioqKioqKioqKioq KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioq KioqKioqKioqCj4+Pj4gKyAqwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCBFVkVOVCBDT0RFUwo+Pj4+ICsgKioqKioqKioqKioq KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioq KioqKioqKioqCj4+Pj4gKyAqLwo+Pj4+ICsjZGVmaW5lIFhFTkNBTUVSQV9FVlRfRlJBTUVfQVZB SUzCoMKgwqDCoMKgIDB4MDAKPj4+PiArI2RlZmluZSBYRU5DQU1FUkFfRVZUX0NUUkxfQ0hBTkdF wqDCoMKgwqDCoCAweDAxCj4+Pj4gKwo+Pj4+ICsvKiBSZXNvbHV0aW9uIGhhcyBjaGFuZ2VkLiAq Lwo+Pj4+ICsjZGVmaW5lIFhFTkNBTUVSQV9FVlRfQ0ZHX0ZMR19SRVNPTMKgwqDCoCAoMSA8PCAw KQo+Pj4gSSB0aGluayB0aGlzIGZsYWcgaXMgYSBsZWZ0LW92ZXIgZnJvbSB2MiBhbmQgc2hvdWxk IGJlIHJlbW92ZWQuCj4+Pgo+Pj4gPHNuaXA+Cj4+Pgo+Pj4+ICsgKiBSZXF1ZXN0IG51bWJlciBv ZiBidWZmZXJzIHRvIGJlIHVzZWQ6Cj4+Pj4gKyAqwqDCoMKgwqDCoMKgwqDCoCAwwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgIDHCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCAy wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCAzwqDCoMKgwqDCoMKgwqAgb2N0ZXQKPj4+PiAr ICogKy0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tKy0t LS0tLS0tLS0tLS0tLS0rCj4+Pj4gKyAqIHzCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgIGlk wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgIHwgX09QX0JVRl9SRVFVRVNUfMKgwqAgcmVz ZXJ2ZWTCoMKgwqDCoCB8IDQKPj4+PiArICogKy0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0t LS0tLSstLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0rCj4+Pj4gKyAqIHzCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCByZXNlcnZl ZMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqAgfCA4Cj4+Pj4gKyAqICstLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0rLS0tLS0t LS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tKwo+Pj4+ICsgKiB8wqDCoMKgIG51bV9idWZzwqDC oMKgIHzCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgIHJlc2VydmVkwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCB8IDEyCj4+Pj4gKyAqICstLS0t LS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0t LS0tLS0tKwo+Pj4+ICsgKiB8wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqAgcmVzZXJ2ZWTCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgIHwgMTYKPj4+PiArICogKy0tLS0tLS0tLS0tLS0t LS0rLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0rCj4+ Pj4gKyAqIHwvXC9cL1wvXC9cL1wvXC9cL1wvXC9cL1wvXC9cL1wvXC9cL1wvXC9cL1wvXC9cL1wv XC9cL1wvXC9cL1wvXC9cL1wvfAo+Pj4+ICsgKiArLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0t LS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLSsKPj4+PiArICogfMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgIHJlc2Vy dmVkwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoCB8IDY0Cj4+Pj4gKyAqICstLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0rLS0t LS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tKwo+Pj4+ICsgKgo+Pj4+ICsgKiBudW1fYnVm cyAtIHVpbnQ4X3QsIGRlc2lyZWQgbnVtYmVyIG9mIGJ1ZmZlcnMgdG8gYmUgdXNlZC4gVGhpcyBp cwo+Pj4+ICsgKsKgwqAgbGltaXRlZCB0byB0aGUgdmFsdWUgY29uZmlndXJlZCBpbiBYZW5TdG9y ZS5tYXgtYnVmZmVycy4KPj4+PiArICrCoMKgIFBhc3NpbmcgemVybyBudW1fYnVmcyBpbiB0aGlz IHJlcXVlc3QgKGFmdGVyIHN0cmVhbWluZyBoYXMgc3RvcHBlZAo+Pj4+ICsgKsKgwqAgYW5kIGFs bCBidWZmZXJzIGRlc3Ryb3llZCkgdW5ibG9ja3MgY2FtZXJhIGNvbmZpZ3VyYXRpb24gY2hhbmdl cy4KPj4+IEkgdGhpbmsgdGhlIHBocmFzZSAndW5ibG9ja3MgY2FtZXJhIGNvbmZpZ3VyYXRpb24g Y2hhbmdlcycgaXMgY29uZnVzaW5nLgo+Pj4KPj4+IEluIHYzIHRoaXMgc2VudGVuY2UgY2FtZSBh ZnRlciB0aGUgdGhpcmQgbm90ZSBiZWxvdywgYW5kIHNvIGl0IG1hZGUgc2Vuc2UKPj4+IGluIHRo YXQgY29udGV4dCwgYnV0IG5vdyB0aGUgb3JkZXIgaGFzIGJlZW4gcmV2ZXJzZWQgYW5kIGl0IGJl Y2FtZSBoYXJkIHRvCj4+PiB1bmRlcnN0YW5kLgo+Pj4KPj4+IEknbSBub3Qgc3VyZSB3aGF0IHRo ZSBiZXN0IGFwcHJvYWNoIGlzIHRvIGZpeCB0aGlzLiBPbmUgb3B0aW9uIGlzIHRvIHJlbW92ZQo+ Pj4gdGhlIHRoaXJkIG5vdGUgYW5kIGludGVncmF0ZSBpdCBzb21laG93IGluIHRoZSBzZW50ZW5j ZSBhYm92ZS4gT3IgcGVyaGFwcwo+Pj4gZG8gYXdheSB3aXRoIHRoZSAnbm90ZXMnIGF0IGFsbCBh bmQganVzdCB3cml0ZSBhIG1vcmUgZXh0ZW5zaXZlIGRvY3VtZW50YXRpb24KPj4+IGZvciB0aGlz IG9wLiBJIGxlYXZlIHRoYXQgdXAgdG8geW91Lgo+IEhhbnMsIGhvdyBhYm91dDoKPiAKPiDCoCog bnVtX2J1ZnMgLSB1aW50OF90LCBkZXNpcmVkIG51bWJlciBvZiBidWZmZXJzIHRvIGJlIHVzZWQu Cj4gwqAqCj4gwqAqIFRoZSBudW1iZXIgb2YgYnVmZmVycyBpbiB0aGlzIHJlcXVlc3QgbXVzdCBu b3QgZXhjZWVkIHRoZSB2YWx1ZSBjb25maWd1cmVkCj4gwqAqIGluIFhlblN0b3JlLm1heC1idWZm ZXJzLiBJZiB0aGUgbnVtYmVyIG9mIGJ1ZmZlcnMgaXMgbm90IHplcm8gdGhlbiBhZnRlciB0aGlz Cj4gwqAqIHJlcXVlc3QgdGhlIGNhbWVyYSBjb25maWd1cmF0aW9uIGNhbm5vdCBiZSBjaGFuZ2Vk LiBJbiBvcmRlciB0byBhbGxvdyBjYW1lcmEKPiDCoCogKHJlKWNvbmZpZ3VyYXRpb24gdGhpcyBy ZXF1ZXN0IG11c3QgYmUgc2VudCB3aXRoIG51bV9idWZzIHNldCB0byB6ZXJvIGFuZAo+IMKgKiB0 aGUgc3RyZWFtaW5nIG11c3QgYmUgc3RvcHBlZCBhbmQgYnVmZmVycyBkZXN0cm95ZWQuCj4gwqAq IEl0IGlzIGFsbG93ZWQgZm9yIHRoZSBmcm9udGVuZCB0byBzZW5kIG11bHRpcGxlIFhFTkNBTUVS QV9PUF9CVUZfUkVRVUVTVAo+IMKgKiByZXF1ZXN0cyBiZWZvcmUgc2VuZGluZyBYRU5DQU1FUkFf T1BfU1RSRUFNX1NUQVJUIHJlcXVlc3QgdG8gdXBkYXRlIG9yCj4gwqAqIHR1bmUgdGhlIGZpbmFs IGNvbmZpZ3VyYXRpb24uCj4gwqAqIEZyb250ZW5kIGlzIHJlc3BvbnNpYmxlIGZvciBjaGVja2lu ZyB0aGUgY29ycmVzcG9uZGluZyByZXNwb25zZSBpbiBvcmRlciB0bwo+IMKgKiBzZWUgaWYgdGhl IHZhbHVlcyByZXBvcnRlZCBiYWNrIGJ5IHRoZSBiYWNrZW5kIGRvIG1hdGNoIHRoZSBkZXNpcmVk IG9uZXMKPiDCoCogYW5kIGNhbiBiZSBhY2NlcHRlZC4KPiDCoCoKPiDCoCogU2VlIHJlc3BvbnNl IGZvcm1hdCBmb3IgdGhpcyByZXF1ZXN0Lgo+IMKgKi8KCkhtbSwgaXQgc3RpbGwgaXMgYXdrd2Fy ZC4gUGFydCBvZiB0aGUgcmVhc29uIGZvciB0aGF0IGlzIHRoYXQgVklESU9DX1JFUUJVRlMKaXMg anVzdCB3ZWlyZCBpbiB0aGF0IGEgdmFsdWUgb2YgMCBoYXMgYSBzcGVjaWFsIG1lYW5pbmcuCgpQ ZXJoYXBzIGl0IHdvdWxkIGJlIG11Y2ggY2xlYW5lciBmb3IgdGhlIFhlbiBpbXBsZW1lbnRhdGlv biB0byBqdXN0IGFkZCBhIG5ldwpPUDogX09QX0ZSRUVfQUxMX0JVRlMgKG9yIHBlcmhhcHMgX1JF TEVBU0VfQUxMX0JVRlMpIHRoYXQgZWZmZWN0aXZlbHkgZG9lcwpWSURJT0NfUkVRQlVGUyB3aXRo IGEgMCBjb3VudCB2YWx1ZS4gQW5kIHRoaXMgT1BfQlVGX1JFUVVFU1QgKHdvdWxkbid0Ck9QX1JF UVVFU1RfQlVGUyBiZSBhIGJldHRlciBuYW1lPykgd291bGQgdGhlbiBkbyBub3RoaW5nIG9yIHJl dHVybiBhbiBlcnJvcgppZiBudW1fYnVmcyA9PSAwLgoKSWYgeW91IGRvbid0IHdhbnQgdG8gY3Jl YXRlIGEgbmV3IFhlbiBvcCwgdGhlbiBJIHdvdWxkIGNoYW5nZSB0aGUgdGV4dCBzb21lCm1vcmUg c2luY2UgeW91IGRvIG5vdCBhY3R1YWxseSBleHBsYWluIHdoYXQgdGhlIG9wIGRvZXMgaWYgbnVt X2J1ZnMgaXMgMC4KCkkgd291bGQgd3JpdGUgc29tZXRoaW5nIGxpa2UgdGhpczoKCklmIG51bV9i dWZzIGlzIGdyZWF0ZXIgdGhhbiAwLCB0aGVuIDxkZXNjcmliZSB3aGF0IGhhcHBlbnM+LgoKSWYg bnVtX2J1ZnMgaXMgZXF1YWwgdG8gMCwgdGhlbiA8ZGVzY3JpYmUgd2hhdCBoYXBwZW5zPi4KCklm IG51bV9idWZzIGlzIG5vdCB6ZXJvIHRoZW4gYWZ0ZXIgdGhpcyByZXF1ZXN0IHRoZSBjYW1lcmEg Y29uZmlndXJhdGlvbgpjYW5ub3QgYmUgY2hhbmdlZC4gSW4gb3JkZXIgdG8gYWxsb3cgY2FtZXJh IChyZSljb25maWd1cmF0aW9uIHRoaXMgcmVxdWVzdAptdXN0IGJlIHNlbnQgd2l0aCBudW1fYnVm cyBzZXQgdG8gemVybyBhbmQgdGhlIHN0cmVhbWluZyBtdXN0IGJlIHN0b3BwZWQKYW5kIGJ1ZmZl cnMgZGVzdHJveWVkLgoKUmVnYXJkcywKCglIYW5zCgo+IAo+Pj4+ICsgKgo+Pj4+ICsgKiBTZWUg cmVzcG9uc2UgZm9ybWF0IGZvciB0aGlzIHJlcXVlc3QuCj4+Pj4gKyAqCj4+Pj4gKyAqIE5vdGVz Ogo+Pj4+ICsgKsKgIC0gZnJvbnRlbmQgbXVzdCBjaGVjayB0aGUgY29ycmVzcG9uZGluZyByZXNw b25zZSBpbiBvcmRlciB0byBzZWUKPj4+PiArICrCoMKgwqAgaWYgdGhlIHZhbHVlcyByZXBvcnRl ZCBiYWNrIGJ5IHRoZSBiYWNrZW5kIGRvIG1hdGNoIHRoZSBkZXNpcmVkIG9uZXMKPj4+PiArICrC oMKgwqAgYW5kIGNhbiBiZSBhY2NlcHRlZC4KPj4+PiArICrCoCAtIGZyb250ZW5kIG1heSBzZW5k IG11bHRpcGxlIFhFTkNBTUVSQV9PUF9CVUZfUkVRVUVTVCByZXF1ZXN0cyBiZWZvcmUKPj4+PiAr ICrCoMKgwqAgc2VuZGluZyBYRU5DQU1FUkFfT1BfU1RSRUFNX1NUQVJUIHJlcXVlc3QgdG8gdXBk YXRlIG9yIHR1bmUgdGhlCj4+Pj4gKyAqwqDCoMKgIGNvbmZpZ3VyYXRpb24uCj4+Pj4gKyAqwqAg LSBhZnRlciB0aGlzIHJlcXVlc3QgY2FtZXJhIGNvbmZpZ3VyYXRpb24gY2Fubm90IGJlIGNoYW5n ZWQsIHVubGVzcwo+Pj4gY2FtZXJhIGNvbmZpZ3VyYXRpb24gLT4gdGhlIGNhbWVyYSBjb25maWd1 cmF0aW9uCj4+Pgo+Pj4+ICsgKsKgwqDCoCBzdHJlYW1pbmcgaXMgc3RvcHBlZCBhbmQgYnVmZmVy cyBkZXN0cm95ZWQKPj4+PiArICovCj4+PiBSZWdhcmRzLAo+Pj4KPj4+IMKgwqDCoMKgSGFucwo+ IAoKCl9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fClhlbi1k ZXZlbCBtYWlsaW5nIGxpc3QKWGVuLWRldmVsQGxpc3RzLnhlbnByb2plY3Qub3JnCmh0dHBzOi8v bGlzdHMueGVucHJvamVjdC5vcmcvbWFpbG1hbi9saXN0aW5mby94ZW4tZGV2ZWw=