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=-1.0 required=3.0 tests=HEADER_FROM_DIFFERENT_DOMAINS, MAILING_LIST_MULTI,SPF_PASS 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 C508AC10F03 for ; Tue, 23 Apr 2019 16:46:55 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by mail.kernel.org (Postfix) with ESMTP id 7C662218B0 for ; Tue, 23 Apr 2019 16:46:55 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1729382AbfDWQqx (ORCPT ); Tue, 23 Apr 2019 12:46:53 -0400 Received: from relay9-d.mail.gandi.net ([217.70.183.199]:51639 "EHLO relay9-d.mail.gandi.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1728758AbfDWQqw (ORCPT ); Tue, 23 Apr 2019 12:46:52 -0400 X-Originating-IP: 93.29.109.196 Received: from collins (196.109.29.93.rev.sfr.net [93.29.109.196]) (Authenticated sender: paul.kocialkowski@bootlin.com) by relay9-d.mail.gandi.net (Postfix) with ESMTPSA id 87A07FF807; Tue, 23 Apr 2019 16:46:46 +0000 (UTC) Message-ID: <6a0364f797c944d20a8d7aee251dab91105be4e0.camel@bootlin.com> Subject: Re: [PATCH 00/20] drm: Split out the formats API and move it to a common place From: Paul Kocialkowski To: Laurent Pinchart , Maxime Ripard , Daniel Vetter , David Airlie , Maarten Lankhorst , Sean Paul , Mauro Carvalho Chehab , Sakari Ailus , Linux Kernel Mailing List , dri-devel , Hans Verkuil , Thomas Petazzoni , "open list:DMA BUFFER SHARING FRAMEWORK" Date: Tue, 23 Apr 2019 18:46:45 +0200 In-Reply-To: <20190423154527.GH16111@pendragon.ideasonboard.com> References: <20190417154121.GJ13337@phenom.ffwll.local> <20190418062229.eyog4i62eg4pr6uf@flea> <20190418090221.e57dogn4yx5nwdni@flea> <20190420225904.GZ4964@pendragon.ideasonboard.com> <20190423072554.GW13337@phenom.ffwll.local> <20190423154527.GH16111@pendragon.ideasonboard.com> Content-Type: text/plain; charset="UTF-8" User-Agent: Evolution 3.32.0 MIME-Version: 1.0 Content-Transfer-Encoding: 8bit Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Hi, Le mardi 23 avril 2019 à 18:45 +0300, Laurent Pinchart a écrit : > Hi Daniel, > > On Tue, Apr 23, 2019 at 09:25:54AM +0200, Daniel Vetter wrote: > > On Sun, Apr 21, 2019 at 01:59:04AM +0300, Laurent Pinchart wrote: > > > On Thu, Apr 18, 2019 at 12:07:44PM +0200, Daniel Vetter wrote: > > > > On Thu, Apr 18, 2019 at 11:02 AM Maxime Ripard wrote: > > > > > On Thu, Apr 18, 2019 at 09:52:10AM +0200, Daniel Vetter wrote: > > > > > > On Thu, Apr 18, 2019 at 8:22 AM Maxime Ripard wrote: > > > > > > > On Wed, Apr 17, 2019 at 05:41:21PM +0200, Daniel Vetter wrote: > > > > > > > > On Wed, Apr 17, 2019 at 09:54:26AM +0200, Maxime Ripard wrote: > > > > > > > > > Hi, > > > > > > > > > > > > > > > > > > DRM comes with an extensive format support to retrieve the various > > > > > > > > > parameters associated with a given format (such as the subsampling, or the > > > > > > > > > bits per pixel), as well as some helpers and utilities to ease the driver > > > > > > > > > development. > > > > > > > > > > > > > > > > > > v4l2, on the other side, doesn't provide such facilities, leaving each > > > > > > > > > driver reimplement a subset of the formats parameters for the one supported > > > > > > > > > by that particular driver. This leads to a lot of duplication and > > > > > > > > > boilerplate code in the v4l2 drivers. > > > > > > > > > > > > > > > > > > This series tries to address this by moving the DRM format API into lib and > > > > > > > > > turning it into a more generic API. In order to do this, we've needed to do > > > > > > > > > some preliminary changes on the DRM drivers, then moved the API and finally > > > > > > > > > converted a v4l2 driver to give an example of how such library could be > > > > > > > > > used. > > > > > > > > > > > > > > > > > > Let me know what you think, > > > > > > > > > Maxime > > > > > > > > > > > > > > > > > > Changes from RFC: > > > > > > > > > - Rebased on next > > > > > > > > > - Fixed the various formats mapping > > > > > > > > > - Added tags > > > > > > > > > - Did most of the formats functions as inline functions > > > > > > > > > - Used a consistent prefix for all the utilities functions > > > > > > > > > - Fixed the compilation breakages, and did a run of allmodconfig for arm, > > > > > > > > > arm64 and x86_64 > > > > > > > > > - Fixed out of array bounds warnings in the image_format_info_block_* > > > > > > > > > functions > > > > > > > > > - Added License and copyright headers on missing files > > > > > > > > > > > > > > > > > > Maxime Ripard (20): > > > > > > > > > drm: Remove users of drm_format_num_planes > > > > > > > > > drm: Remove users of drm_format_(horz|vert)_chroma_subsampling > > > > > > > > > drm/fourcc: Pass the format_info pointer to drm_format_plane_cpp > > > > > > > > > drm/fourcc: Pass the format_info pointer to drm_format_plane_width/height > > > > > > > > > drm: Replace instances of drm_format_info by drm_get_format_info > > > > > > > > > lib: Add video format information library > > > > > > > > > drm/fb: Move from drm_format_info to image_format_info > > > > > > > > > drm/malidp: Convert to generic image format library > > > > > > > > > drm/client: Convert to generic image format library > > > > > > > > > drm/exynos: Convert to generic image format library > > > > > > > > > drm/i915: Convert to generic image format library > > > > > > > > > drm/ipuv3: Convert to generic image format library > > > > > > > > > drm/msm: Convert to generic image format library > > > > > > > > > drm/omap: Convert to generic image format library > > > > > > > > > drm/rockchip: Convert to generic image format library > > > > > > > > > drm/tegra: Convert to generic image format library > > > > > > > > > drm/fourcc: Remove old DRM format API > > > > > > > > > lib: image-formats: Add v4l2 formats support > > > > > > > > > lib: image-formats: Add more functions > > > > > > > > > media: sun6i: Convert to the image format API > > > > > > > > > > > > > > > > In the interest of making myself unpopular: Why move this out of drm? > > > > > > > > > > > > > > > > We do have a bunch of other such shared helpers already (mostly in > > > > > > > > drivers/video) for dt videomode and hdmi infoframes, and I'm not super > > > > > > > > sure that's going better than keeping it maintained in drm. > > > > > > That's a bit of a different situation as both DRM and FBDEV address the > > > same features (display output), and FBDEV is deprecared and replaced by > > > DRM. > > > > > > I'm not against maintaining a 4CC library in DRM (adding a third-party > > > maintainer would likely create more problems than it would solve), but > > > that doesn't mean the library has to live in drivers/gpu/, nor that it > > > needs to have the drm_ prefix. I would actually advocate to make it live > > > in a neutral directory, with a neutral prefix (kudos to anyone who can > > > propose a nice naming convention that would establish a new shared > > > ground for image/video-related Linux APIs), and maintained through the > > > DRM tree (possibly with extra entries in MAINTAINERS to ensure it > > > reaches all the related folks). > > > > > > > > > > > Plus the uapi is already that you include drm_fourcc.h to get at these, > > > > > > > > dropping the drm prefix isn't going to help I think. > > > > > > > > > > > > > > > > Of course we'd need to make it a separate drm_formats.ko (so that v4l can > > > > > > > > use it without dragging in all of drm), and we need to add some fields for > > > > > > > > converting to v4l fourcc codes (which are different). But that should be > > > > > > > > all possible. And I don't think the drm_ prefix in v4l code is a problem, > > > > > > > > it's actually a feature: It makes it really clear that these are the drm > > > > > > > > fourcc codes, as allocated in drm_fourcc.h, plus their modifiers, and all > > > > > > > > that. That allocation authority is also already baked into various khr/ext > > > > > > > > standards, too. > > > > > > There's one thing that V4L2 has and DRM hasn't for 4CCs: good > > > documentation. Look at > > > https://linuxtv.org/downloads/v4l-dvb-apis-new/uapi/v4l/pixfmt-packed-rgb.html > > > or > > > https://linuxtv.org/downloads/v4l-dvb-apis-new/uapi/v4l/yuv-formats.html > > > for instance. It's painful to write, painful to read, but defines the > > > 4CCs very clearly without ambiguity. I wouldn't be surprised if > > > different drivers used the same DRM 4CC for different formats due to the > > > lack of detailed documentation. Moving to a shared library for 4CCs > > > should also address the documentation side, and any new format added to > > > the kernel, whether from the V4L2 side or the DRM side, would be > > > required to provide detailed documentation. That would be a great > > > improvement for DRM 4CC handling. > > > > > > > > > > The way I see it, there's a fundamental difference between the UAPI > > > > > > > and the kernel. I don't suggest we change anything about the UAPI: the > > > > > > > drm formats should keep their prefix, drm_fourcc.h can remain that > > > > > > > authority, it's all fine. > > > > > > > > > > > > > > Internally however, the long term goal is to share the fourcc's > > > > > > > between DRM and V4L2 for the same formats. It basically means that of > > > > > > > course v4l2 should be using the DRM fourcc when a format exists in DRM > > > > > > > and not v4l2, but also that DRM should use v4l2 fourcc when the format > > > > > > > exists in v4l2 but not DRM, and that is far more likely, given the > > > > > > > already extensive v4l2 formats support. > > > > > > > > > > > > Uh no. We did look at v4l fourcc extensively when deciding upon a drm > > > > > > format identifier space. > > > > > > > > > > No to what exactly? > > > > > > > > > > > And a lot of people pushed for the "fourcc is a standard", when > > > > > > really it's totally not. > > > > > > > > > > Even if it's not a standard, having consistency would be a good thing. > > > > > > > > > > And you said yourself that DRM fourcc is now pretty much an authority > > > > > for the fourcc, so it definitely looks like a standard to me. > > > > > > > > drm fourcc is the authority for drm fourcc codes. Not for any of the > > > > others (and there's lots of them). Now it's used in a bunch of other > > > > places (khr standards, dri protocols in wayland/X11), but they're > > > > still only drm fourcc. There is no overall fourcc standard. > > > > > > > > > > v4l tends to conflate pixel format with stuff that we tend to encode > > > > > > in modifiers a lot more. > > > > > > > > > > Boris is working on adding the modifiers concept to v4l2, so we're > > > > > converging here, and we can totally have a layer in v4l2 to convert > > > > > between old v4l2 "format+modifiers" formats, and DRM style formats. > > > > > > > > > > > There's a bunch of reasons we can't just use v4l, and they're as > > > > > > valid as ever: > > > > > > > > > > > > - We overlap badly in some areas, so even if fourcc codes match, we > > > > > > can't use them and need a duplicated DRM_FOURCC code. > > > > > > > > > > Do yo have an example of one of those areas? > > > > > > > > I think the rgb stuff was one of the big reasons to not reuse any > > > > existing fourcc standard (whether v4l, or another one from e.g. video > > > > container formats). We had initial patches to reuse the fourcc that > > > > existed, but the end result was really inconsistent, so we ditch that > > > > and rolled out a new set of entirely drm specific fourcc codes for > > > > rgba. > > > > > > Could you give one or a couple of examples of V4L2 4CCs that are not > > > OCD-compatible ? :-) > > > > > > > > > - v4l encodes some metadata into the fourcc that we encode elsewhere, > > > > > > e.g. offset for planar yuv formats, or tiling mode > > > > > > > > > > As I was saying, this changes on the v4l2 side, and converging to > > > > > what DRM is doing. > > > > > > > > > > > - drm fourcc code doesn't actually define the drm_format_info > > > > > > uniquely, drivers can override that (that's an explicit design > > > > > > intent of modifiers, to allow drivers to add another plane for > > > > > > e.g. compression information). You'd need to pull that driver > > > > > > knowledge into your format library. > > > > > > That's a mistake in my opinion. We tried that in V4L2 to store metadata > > > in a separate plane, and had to go another route eventually as it > > > created a very bad mess. > > > > Just quick clarification in the middle here: This is how the hw works. > > The hardware takes parameters from a buffer, but it doesn't mandate how > that buffer is exposed to userspace :-) Using an extra plane is one > option, but other APIs are possible. > > > It's not metadata that sw ever touches (in general, testcases to make sure > > we display these correctly excepted). > > > > There has been some talking to add maybe a bit more mixed metadata, for > > fast-clear colors (which isn't used by any display engine afaik yet). That > > What are fast-clear colors ? > > > would generally be written by the cpu (in the gl stack), but again read by > > the hw (loaded as indirect state packet most likely, or something like > > that). So again hw specific layout, because the hw needs to read it. > > > > Pure metadata only of interest for the cpu/sw stack has been shot down > > completely on the drm side too. > > > > > There's a tendency in both subsystems to look at the other as a bit of a > > > retarded relative, and that's a shame, we have lots to learn from each > > > other's mistakes. That wouldn't be too difficult if people started > > > talking to each other. > > > > > > A semi-related comment: DRM also carries other mistakes of its own, I'm > > > thinking about DRM_FORMAT_BIG_ENDIAN in particular > > > > Yeah that one is hilarios, but in practice big endian is dead, except for > > a very few server chips, and there I think Gerd's work mostly fixed up > > that mess. > > > > > > > I'm not sure how my patches are changing anything here. This is > > > > > litterally the same code, with the functions renamed. > > > > > > > > > > If drivers want to override that, then yeah, fine, we can let them do > > > > > that. Just like any helper this just provides a default that covers > > > > > most of the cases. > > > > > > > > > > > Iow there's no way we can easily adopt v4l fourcc, except if we do > > > > > > something like a new addfb flag. > > > > > > > > > > For the formats that would be described as a modifier, sure. For all > > > > > the others (that are not yet supported by DRM), then I don't really > > > > > see why not. > > > > > > > > See above, we tried that initially, didn't pass the ocd tests when > > > > reviewing. Maybe the situation is better outside of rbgx/a formats, > > > > and I think we do at least try to use the same fourcc codes there when > > > > there already is one. But then the details occasionally look > > > > different. > > > > > > > > > > > And given how the current state is a mess in this regard, I'm not too > > > > > > > optimistic about keeping the formats in their relevant frameworks. > > > > > > > > > > > > > > Having a shared library, governed by both, will make this far easier, > > > > > > > since it will be easy to discover the formats that are already > > > > > > > supported by the other subsystem. > > > > > > > > > > > > I think a compat library that (tries to, best effort) convert between > > > > > > v4l and drm fourcc would make sense. Somewhere in drivers/video, next > > > > > > to the conversion functions for videomode <-> drm_display_mode > > > > > > perhaps. That should be useful for drivers. > > > > > > > > > > That's not really what this series is about though. That series is > > > > > about sharing the (image|pixels) formats database across everyone so > > > > > that everyone can benefit from it. > > > > > > > > Yeah I know. I still think leaving the drm fourcc with the drm prefix > > > > would be good, since there's really no standard here. > > > > > > > > > > Unifying the formats themselves, and all the associated metadata is > > > > > > imo a no-go, and was a pretty conscious decision when we implemented > > > > > > drm_fourcc a few years back. > > > > > > > > > > > > > If we want to keep the current library in DRM, we have two options > > > > > > > then: > > > > > > > > > > > > > > - Support all the v4l2 formats in the DRM library, which is > > > > > > > essentially what I'm doing in the last patches. However, that > > > > > > > would require to have the v4l2 developpers also reviewing stuff > > > > > > > there. And given how busy they are, I cannot really see how that > > > > > > > would work. > > > > > > > > > > > > Well, if we end up with a common library then yes we need cross > > > > > > review. There's no way around that. Doesn't matter where exactly that > > > > > > library is in the filesystem tree, and adding a special MAINTAINERS > > > > > > entry for anything related to fourcc (both drm and v4l) to make sure > > > > > > they get cross-posted is easy. No file renaming needed. > > > > > > > > > > That would create some governing issues as well. For example, if you > > > > > ever have a patch from one fourcc addition (that might or might not be > > > > > covered by v4l2), will you wait for any v4l2 developper to review it? > > > > > > > > None of this is fixed by code renaming or locations. Either way we > > > > need to figure that out. > > > > > > > > And yes part of the reasons for not moving this out of drm is that I'm > > > > not a fan of boutique trees for small stuff. If sharing means we need > > > > to split the drm_fourcc code and library out of drm trees, I'm not > > > > sure that's a good idea. We're already super liberal with merging > > > > anything through driver trees with acks, and integrating them quickly > > > > into drm-next. This would still be workable if v4l sends regular pull > > > > requests to drm-next (every 1-2 weeks, like the other big gpu trees > > > > do). If we can only sync up once per merge window with a shared > > > > boutique tree for formats only, life is going to be painful. > > > > > > That should be solved by the proposal above, maintaining the shared > > > library in the DRM tree. We would need to be careful there, and ideally > > > maintain that in a separate branch that could be merged in both DRM and > > > V4L2 without having to merge most of the other subsystem's pending > > > changes at the same time, but I think it's doable without any big issue. > > > > > > > > If it's shared code, then it should be shared, and every client > > > > > framework put on an equal footing. > > > > > > > > > > > > - Develop the same library from within v4l2. That is really a poor > > > > > > > solution, since the information would be greatly duplicated > > > > > > > between the two, and in terms of maintainance, code, and binary > > > > > > > size that would be duplicated too. > > > > > > > > > > > > It's essentially what we decided to do for drm years back. > > > > > > > > > > And it was probably the right solution back then, but I'm really not > > > > > convinced it's still the right thing to do today. > > > > > > > > > > > > Having it shared allows to easily share, and discover formats from the > > > > > > > other subsystem, and to have a single, unique place where this is > > > > > > > centralized. > > > > > > > > > > > > What I think could work as middle ground: > > > > > > - Put drm_format stuff into a separate .ko > > > > > > - Add a MAINTAINERS entry to make sure all things fourcc are cross > > > > > > posted to both drm and v4l lists. Easy on the drm side, since it's all > > > > > > separate files. Not sure it's so convenient for v4l uapi. > > > > > > - Add a conversion library that tries to best-effort map between drm > > > > > > and v4l formats. On the drm side that most likely means you need > > > > > > offsets for planes, and modifiers too (since those are implied in some > > > > > > v4l fourcc). Emphasis on "best effort" i.e. only support as much as > > > > > > the drivers that use this library need. > > > > > > - Add drm_fourcc as-needed by these drivers that want to use a unified > > > > > > format space. > > > > > > > > > > > > Forcing this unification on everyone otoh is imo way too much. > > > > > > > > > > v4l2 is starting to converge with DRM, and we're using the DRM API > > > > > pretty much untouched for that library, so I'm not really sure how > > > > > anyone is hurt by that unification. > > > > > > > > It might make sense to regularly pull v4l updates into drm-next then > > > > anyway. That would also remove the need to have the format library > > > > somewhere else. > > > > > > Are you saying it should the live in V4L2 ? ;-) > > > > Maybe a few clarifications on how the drm shared core thing usually works, > > and why I'm a sticker here. Bottom reply since I'm not sure where to put > > it: > > > > - Refactorings usually go in through drm-misc (at least since a few > > years). > > > > - Small patches go in through the relevant driver tree (which is often > > drm-misc, but not always), with an Ack from drm maintainers. > > > > - No topic branches, everyone just pushes patches where it's most > > convenient. > > > > We get away with this mess because everyone sends regular pull requests to > > drm, where the entire history is baked in and others can backmerge/fast > > forward/rebase. Worst case you wait one month (around the merge window, > > when drm-next is closed for features), but usually it's just 1-2 weeks. > > Plus we tend to have fairly big trees, with good chances that the next > > patch series lands in the same tree again and no work at all is needed. > > > > If we start regularly sharing lots of code with v4l (which seems to be the > > long term goal here), then I think we need something equally convenient > > for all that. > > > > We're not going to be able to teach some complicated topic branch scheme > > to the 50+ submaintainers/committers we have in drm - a lot much more > > basic stuff already takes lots of work to get it to stick. If the proposal > > is "to be careful" and "maintain it in a separate branch", I'm not in > > favour because I think that just wouldn't work. > > Why not ? It can be a fast-moving branch that gets merged in drm-misc > as often as you want (even at every commit if that's desired). We're > dealing with a limited amount of code here, and there's no more reason > that V4L2 should pull in drm-misc to get 4CC updates than DRM should > pull V4L2 for the same. I have no objection against a 4CC branch being > officially maintained under the DRM umbrella, but I think the code > should live elsewhere than drivers/gpu/drm/, have a neutral prefix, and > not require pulling an entire subsystem in. I think that having a subsystem-neutral tree is what Maxime had in mind initially. The way I see it, the idea would indeed be to keep it low- traffic and avoid having any serious core code in there. Basically just stick to format helpers and ideally later buffer description structures and helpers. I also like the idea of having a few shared ioctls to retrieve a buffer memory layout information from a dma-buf fd and mmap-ing on a per-plane basis, but that's rather unlikely to evolve much once it's there. Cheers, Paul From mboxrd@z Thu Jan 1 00:00:00 1970 From: Paul Kocialkowski Subject: Re: [PATCH 00/20] drm: Split out the formats API and move it to a common place Date: Tue, 23 Apr 2019 18:46:45 +0200 Message-ID: <6a0364f797c944d20a8d7aee251dab91105be4e0.camel@bootlin.com> References: <20190417154121.GJ13337@phenom.ffwll.local> <20190418062229.eyog4i62eg4pr6uf@flea> <20190418090221.e57dogn4yx5nwdni@flea> <20190420225904.GZ4964@pendragon.ideasonboard.com> <20190423072554.GW13337@phenom.ffwll.local> <20190423154527.GH16111@pendragon.ideasonboard.com> Mime-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: base64 Return-path: Received: from relay9-d.mail.gandi.net (relay9-d.mail.gandi.net [217.70.183.199]) by gabe.freedesktop.org (Postfix) with ESMTPS id 3B16E89219 for ; Tue, 23 Apr 2019 16:46:50 +0000 (UTC) In-Reply-To: <20190423154527.GH16111@pendragon.ideasonboard.com> List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: dri-devel-bounces@lists.freedesktop.org Sender: "dri-devel" To: Laurent Pinchart , Maxime Ripard , Daniel Vetter , David Airlie , Maarten Lankhorst , Sean Paul , Mauro Carvalho Chehab , Sakari Ailus , Linux Kernel Mailing List , dri-devel , Hans Verkuil , Thomas Petazzoni , "open list:DMA BUFFER SHARING FRAMEWORK" List-Id: dri-devel@lists.freedesktop.org SGksCgpMZSBtYXJkaSAyMyBhdnJpbCAyMDE5IMOgIDE4OjQ1ICswMzAwLCBMYXVyZW50IFBpbmNo YXJ0IGEgw6ljcml0IDoKPiBIaSBEYW5pZWwsCj4gCj4gT24gVHVlLCBBcHIgMjMsIDIwMTkgYXQg MDk6MjU6NTRBTSArMDIwMCwgRGFuaWVsIFZldHRlciB3cm90ZToKPiA+IE9uIFN1biwgQXByIDIx LCAyMDE5IGF0IDAxOjU5OjA0QU0gKzAzMDAsIExhdXJlbnQgUGluY2hhcnQgd3JvdGU6Cj4gPiA+ IE9uIFRodSwgQXByIDE4LCAyMDE5IGF0IDEyOjA3OjQ0UE0gKzAyMDAsIERhbmllbCBWZXR0ZXIg d3JvdGU6Cj4gPiA+ID4gT24gVGh1LCBBcHIgMTgsIDIwMTkgYXQgMTE6MDIgQU0gTWF4aW1lIFJp cGFyZCB3cm90ZToKPiA+ID4gPiA+IE9uIFRodSwgQXByIDE4LCAyMDE5IGF0IDA5OjUyOjEwQU0g KzAyMDAsIERhbmllbCBWZXR0ZXIgd3JvdGU6Cj4gPiA+ID4gPiA+IE9uIFRodSwgQXByIDE4LCAy MDE5IGF0IDg6MjIgQU0gTWF4aW1lIFJpcGFyZCB3cm90ZToKPiA+ID4gPiA+ID4gPiBPbiBXZWQs IEFwciAxNywgMjAxOSBhdCAwNTo0MToyMVBNICswMjAwLCBEYW5pZWwgVmV0dGVyIHdyb3RlOgo+ ID4gPiA+ID4gPiA+ID4gT24gV2VkLCBBcHIgMTcsIDIwMTkgYXQgMDk6NTQ6MjZBTSArMDIwMCwg TWF4aW1lIFJpcGFyZCB3cm90ZToKPiA+ID4gPiA+ID4gPiA+ID4gSGksCj4gPiA+ID4gPiA+ID4g PiA+IAo+ID4gPiA+ID4gPiA+ID4gPiBEUk0gY29tZXMgd2l0aCBhbiBleHRlbnNpdmUgZm9ybWF0 IHN1cHBvcnQgdG8gcmV0cmlldmUgdGhlIHZhcmlvdXMKPiA+ID4gPiA+ID4gPiA+ID4gcGFyYW1l dGVycyBhc3NvY2lhdGVkIHdpdGggYSBnaXZlbiBmb3JtYXQgKHN1Y2ggYXMgdGhlIHN1YnNhbXBs aW5nLCBvciB0aGUKPiA+ID4gPiA+ID4gPiA+ID4gYml0cyBwZXIgcGl4ZWwpLCBhcyB3ZWxsIGFz IHNvbWUgaGVscGVycyBhbmQgdXRpbGl0aWVzIHRvIGVhc2UgdGhlIGRyaXZlcgo+ID4gPiA+ID4g PiA+ID4gPiBkZXZlbG9wbWVudC4KPiA+ID4gPiA+ID4gPiA+ID4gCj4gPiA+ID4gPiA+ID4gPiA+ IHY0bDIsIG9uIHRoZSBvdGhlciBzaWRlLCBkb2Vzbid0IHByb3ZpZGUgc3VjaCBmYWNpbGl0aWVz LCBsZWF2aW5nIGVhY2gKPiA+ID4gPiA+ID4gPiA+ID4gZHJpdmVyIHJlaW1wbGVtZW50IGEgc3Vi c2V0IG9mIHRoZSBmb3JtYXRzIHBhcmFtZXRlcnMgZm9yIHRoZSBvbmUgc3VwcG9ydGVkCj4gPiA+ ID4gPiA+ID4gPiA+IGJ5IHRoYXQgcGFydGljdWxhciBkcml2ZXIuIFRoaXMgbGVhZHMgdG8gYSBs b3Qgb2YgZHVwbGljYXRpb24gYW5kCj4gPiA+ID4gPiA+ID4gPiA+IGJvaWxlcnBsYXRlIGNvZGUg aW4gdGhlIHY0bDIgZHJpdmVycy4KPiA+ID4gPiA+ID4gPiA+ID4gCj4gPiA+ID4gPiA+ID4gPiA+ IFRoaXMgc2VyaWVzIHRyaWVzIHRvIGFkZHJlc3MgdGhpcyBieSBtb3ZpbmcgdGhlIERSTSBmb3Jt YXQgQVBJIGludG8gbGliIGFuZAo+ID4gPiA+ID4gPiA+ID4gPiB0dXJuaW5nIGl0IGludG8gYSBt b3JlIGdlbmVyaWMgQVBJLiBJbiBvcmRlciB0byBkbyB0aGlzLCB3ZSd2ZSBuZWVkZWQgdG8gZG8K PiA+ID4gPiA+ID4gPiA+ID4gc29tZSBwcmVsaW1pbmFyeSBjaGFuZ2VzIG9uIHRoZSBEUk0gZHJp dmVycywgdGhlbiBtb3ZlZCB0aGUgQVBJIGFuZCBmaW5hbGx5Cj4gPiA+ID4gPiA+ID4gPiA+IGNv bnZlcnRlZCBhIHY0bDIgZHJpdmVyIHRvIGdpdmUgYW4gZXhhbXBsZSBvZiBob3cgc3VjaCBsaWJy YXJ5IGNvdWxkIGJlCj4gPiA+ID4gPiA+ID4gPiA+IHVzZWQuCj4gPiA+ID4gPiA+ID4gPiA+IAo+ ID4gPiA+ID4gPiA+ID4gPiBMZXQgbWUga25vdyB3aGF0IHlvdSB0aGluaywKPiA+ID4gPiA+ID4g PiA+ID4gTWF4aW1lCj4gPiA+ID4gPiA+ID4gPiA+IAo+ID4gPiA+ID4gPiA+ID4gPiBDaGFuZ2Vz IGZyb20gUkZDOgo+ID4gPiA+ID4gPiA+ID4gPiAgIC0gUmViYXNlZCBvbiBuZXh0Cj4gPiA+ID4g PiA+ID4gPiA+ICAgLSBGaXhlZCB0aGUgdmFyaW91cyBmb3JtYXRzIG1hcHBpbmcKPiA+ID4gPiA+ ID4gPiA+ID4gICAtIEFkZGVkIHRhZ3MKPiA+ID4gPiA+ID4gPiA+ID4gICAtIERpZCBtb3N0IG9m IHRoZSBmb3JtYXRzIGZ1bmN0aW9ucyBhcyBpbmxpbmUgZnVuY3Rpb25zCj4gPiA+ID4gPiA+ID4g PiA+ICAgLSBVc2VkIGEgY29uc2lzdGVudCBwcmVmaXggZm9yIGFsbCB0aGUgdXRpbGl0aWVzIGZ1 bmN0aW9ucwo+ID4gPiA+ID4gPiA+ID4gPiAgIC0gRml4ZWQgdGhlIGNvbXBpbGF0aW9uIGJyZWFr YWdlcywgYW5kIGRpZCBhIHJ1biBvZiBhbGxtb2Rjb25maWcgZm9yIGFybSwKPiA+ID4gPiA+ID4g PiA+ID4gICAgIGFybTY0IGFuZCB4ODZfNjQKPiA+ID4gPiA+ID4gPiA+ID4gICAtIEZpeGVkIG91 dCBvZiBhcnJheSBib3VuZHMgd2FybmluZ3MgaW4gdGhlIGltYWdlX2Zvcm1hdF9pbmZvX2Jsb2Nr XyoKPiA+ID4gPiA+ID4gPiA+ID4gICAgIGZ1bmN0aW9ucwo+ID4gPiA+ID4gPiA+ID4gPiAgIC0g QWRkZWQgTGljZW5zZSBhbmQgY29weXJpZ2h0IGhlYWRlcnMgb24gbWlzc2luZyBmaWxlcwo+ID4g PiA+ID4gPiA+ID4gPiAKPiA+ID4gPiA+ID4gPiA+ID4gTWF4aW1lIFJpcGFyZCAoMjApOgo+ID4g PiA+ID4gPiA+ID4gPiAgIGRybTogUmVtb3ZlIHVzZXJzIG9mIGRybV9mb3JtYXRfbnVtX3BsYW5l cwo+ID4gPiA+ID4gPiA+ID4gPiAgIGRybTogUmVtb3ZlIHVzZXJzIG9mIGRybV9mb3JtYXRfKGhv cnp8dmVydClfY2hyb21hX3N1YnNhbXBsaW5nCj4gPiA+ID4gPiA+ID4gPiA+ICAgZHJtL2ZvdXJj YzogUGFzcyB0aGUgZm9ybWF0X2luZm8gcG9pbnRlciB0byBkcm1fZm9ybWF0X3BsYW5lX2NwcAo+ ID4gPiA+ID4gPiA+ID4gPiAgIGRybS9mb3VyY2M6IFBhc3MgdGhlIGZvcm1hdF9pbmZvIHBvaW50 ZXIgdG8gZHJtX2Zvcm1hdF9wbGFuZV93aWR0aC9oZWlnaHQKPiA+ID4gPiA+ID4gPiA+ID4gICBk cm06IFJlcGxhY2UgaW5zdGFuY2VzIG9mIGRybV9mb3JtYXRfaW5mbyBieSBkcm1fZ2V0X2Zvcm1h dF9pbmZvCj4gPiA+ID4gPiA+ID4gPiA+ICAgbGliOiBBZGQgdmlkZW8gZm9ybWF0IGluZm9ybWF0 aW9uIGxpYnJhcnkKPiA+ID4gPiA+ID4gPiA+ID4gICBkcm0vZmI6IE1vdmUgZnJvbSBkcm1fZm9y bWF0X2luZm8gdG8gaW1hZ2VfZm9ybWF0X2luZm8KPiA+ID4gPiA+ID4gPiA+ID4gICBkcm0vbWFs aWRwOiBDb252ZXJ0IHRvIGdlbmVyaWMgaW1hZ2UgZm9ybWF0IGxpYnJhcnkKPiA+ID4gPiA+ID4g PiA+ID4gICBkcm0vY2xpZW50OiBDb252ZXJ0IHRvIGdlbmVyaWMgaW1hZ2UgZm9ybWF0IGxpYnJh cnkKPiA+ID4gPiA+ID4gPiA+ID4gICBkcm0vZXh5bm9zOiBDb252ZXJ0IHRvIGdlbmVyaWMgaW1h Z2UgZm9ybWF0IGxpYnJhcnkKPiA+ID4gPiA+ID4gPiA+ID4gICBkcm0vaTkxNTogQ29udmVydCB0 byBnZW5lcmljIGltYWdlIGZvcm1hdCBsaWJyYXJ5Cj4gPiA+ID4gPiA+ID4gPiA+ICAgZHJtL2lw dXYzOiBDb252ZXJ0IHRvIGdlbmVyaWMgaW1hZ2UgZm9ybWF0IGxpYnJhcnkKPiA+ID4gPiA+ID4g PiA+ID4gICBkcm0vbXNtOiBDb252ZXJ0IHRvIGdlbmVyaWMgaW1hZ2UgZm9ybWF0IGxpYnJhcnkK PiA+ID4gPiA+ID4gPiA+ID4gICBkcm0vb21hcDogQ29udmVydCB0byBnZW5lcmljIGltYWdlIGZv cm1hdCBsaWJyYXJ5Cj4gPiA+ID4gPiA+ID4gPiA+ICAgZHJtL3JvY2tjaGlwOiBDb252ZXJ0IHRv IGdlbmVyaWMgaW1hZ2UgZm9ybWF0IGxpYnJhcnkKPiA+ID4gPiA+ID4gPiA+ID4gICBkcm0vdGVn cmE6IENvbnZlcnQgdG8gZ2VuZXJpYyBpbWFnZSBmb3JtYXQgbGlicmFyeQo+ID4gPiA+ID4gPiA+ ID4gPiAgIGRybS9mb3VyY2M6IFJlbW92ZSBvbGQgRFJNIGZvcm1hdCBBUEkKPiA+ID4gPiA+ID4g PiA+ID4gICBsaWI6IGltYWdlLWZvcm1hdHM6IEFkZCB2NGwyIGZvcm1hdHMgc3VwcG9ydAo+ID4g PiA+ID4gPiA+ID4gPiAgIGxpYjogaW1hZ2UtZm9ybWF0czogQWRkIG1vcmUgZnVuY3Rpb25zCj4g PiA+ID4gPiA+ID4gPiA+ICAgbWVkaWE6IHN1bjZpOiBDb252ZXJ0IHRvIHRoZSBpbWFnZSBmb3Jt YXQgQVBJCj4gPiA+ID4gPiA+ID4gPiAKPiA+ID4gPiA+ID4gPiA+IEluIHRoZSBpbnRlcmVzdCBv ZiBtYWtpbmcgbXlzZWxmIHVucG9wdWxhcjogV2h5IG1vdmUgdGhpcyBvdXQgb2YgZHJtPwo+ID4g PiA+ID4gPiA+ID4gCj4gPiA+ID4gPiA+ID4gPiBXZSBkbyBoYXZlIGEgYnVuY2ggb2Ygb3RoZXIg c3VjaCBzaGFyZWQgaGVscGVycyBhbHJlYWR5IChtb3N0bHkgaW4KPiA+ID4gPiA+ID4gPiA+IGRy aXZlcnMvdmlkZW8pIGZvciBkdCB2aWRlb21vZGUgYW5kIGhkbWkgaW5mb2ZyYW1lcywgYW5kIEkn bSBub3Qgc3VwZXIKPiA+ID4gPiA+ID4gPiA+IHN1cmUgdGhhdCdzIGdvaW5nIGJldHRlciB0aGFu IGtlZXBpbmcgaXQgbWFpbnRhaW5lZCBpbiBkcm0uCj4gPiA+IAo+ID4gPiBUaGF0J3MgYSBiaXQg b2YgYSBkaWZmZXJlbnQgc2l0dWF0aW9uIGFzIGJvdGggRFJNIGFuZCBGQkRFViBhZGRyZXNzIHRo ZQo+ID4gPiBzYW1lIGZlYXR1cmVzIChkaXNwbGF5IG91dHB1dCksIGFuZCBGQkRFViBpcyBkZXBy ZWNhcmVkIGFuZCByZXBsYWNlZCBieQo+ID4gPiBEUk0uCj4gPiA+IAo+ID4gPiBJJ20gbm90IGFn YWluc3QgbWFpbnRhaW5pbmcgYSA0Q0MgbGlicmFyeSBpbiBEUk0gKGFkZGluZyBhIHRoaXJkLXBh cnR5Cj4gPiA+IG1haW50YWluZXIgd291bGQgbGlrZWx5IGNyZWF0ZSBtb3JlIHByb2JsZW1zIHRo YW4gaXQgd291bGQgc29sdmUpLCBidXQKPiA+ID4gdGhhdCBkb2Vzbid0IG1lYW4gdGhlIGxpYnJh cnkgaGFzIHRvIGxpdmUgaW4gZHJpdmVycy9ncHUvLCBub3IgdGhhdCBpdAo+ID4gPiBuZWVkcyB0 byBoYXZlIHRoZSBkcm1fIHByZWZpeC4gSSB3b3VsZCBhY3R1YWxseSBhZHZvY2F0ZSB0byBtYWtl IGl0IGxpdmUKPiA+ID4gaW4gYSBuZXV0cmFsIGRpcmVjdG9yeSwgd2l0aCBhIG5ldXRyYWwgcHJl Zml4IChrdWRvcyB0byBhbnlvbmUgd2hvIGNhbgo+ID4gPiBwcm9wb3NlIGEgbmljZSBuYW1pbmcg Y29udmVudGlvbiB0aGF0IHdvdWxkIGVzdGFibGlzaCBhIG5ldyBzaGFyZWQKPiA+ID4gZ3JvdW5k IGZvciBpbWFnZS92aWRlby1yZWxhdGVkIExpbnV4IEFQSXMpLCBhbmQgbWFpbnRhaW5lZCB0aHJv dWdoIHRoZQo+ID4gPiBEUk0gdHJlZSAocG9zc2libHkgd2l0aCBleHRyYSBlbnRyaWVzIGluIE1B SU5UQUlORVJTIHRvIGVuc3VyZSBpdAo+ID4gPiByZWFjaGVzIGFsbCB0aGUgcmVsYXRlZCBmb2xr cykuCj4gPiA+IAo+ID4gPiA+ID4gPiA+ID4gUGx1cyB0aGUgdWFwaSBpcyBhbHJlYWR5IHRoYXQg eW91IGluY2x1ZGUgZHJtX2ZvdXJjYy5oIHRvIGdldCBhdCB0aGVzZSwKPiA+ID4gPiA+ID4gPiA+ IGRyb3BwaW5nIHRoZSBkcm0gcHJlZml4IGlzbid0IGdvaW5nIHRvIGhlbHAgSSB0aGluay4KPiA+ ID4gPiA+ID4gPiA+IAo+ID4gPiA+ID4gPiA+ID4gT2YgY291cnNlIHdlJ2QgbmVlZCB0byBtYWtl IGl0IGEgc2VwYXJhdGUgZHJtX2Zvcm1hdHMua28gKHNvIHRoYXQgdjRsIGNhbgo+ID4gPiA+ID4g PiA+ID4gdXNlIGl0IHdpdGhvdXQgZHJhZ2dpbmcgaW4gYWxsIG9mIGRybSksIGFuZCB3ZSBuZWVk IHRvIGFkZCBzb21lIGZpZWxkcyBmb3IKPiA+ID4gPiA+ID4gPiA+IGNvbnZlcnRpbmcgdG8gdjRs IGZvdXJjYyBjb2RlcyAod2hpY2ggYXJlIGRpZmZlcmVudCkuIEJ1dCB0aGF0IHNob3VsZCBiZQo+ ID4gPiA+ID4gPiA+ID4gYWxsIHBvc3NpYmxlLiBBbmQgSSBkb24ndCB0aGluayB0aGUgZHJtXyBw cmVmaXggaW4gdjRsIGNvZGUgaXMgYSBwcm9ibGVtLAo+ID4gPiA+ID4gPiA+ID4gaXQncyBhY3R1 YWxseSBhIGZlYXR1cmU6IEl0IG1ha2VzIGl0IHJlYWxseSBjbGVhciB0aGF0IHRoZXNlIGFyZSB0 aGUgZHJtCj4gPiA+ID4gPiA+ID4gPiBmb3VyY2MgY29kZXMsIGFzIGFsbG9jYXRlZCBpbiBkcm1f Zm91cmNjLmgsIHBsdXMgdGhlaXIgbW9kaWZpZXJzLCBhbmQgYWxsCj4gPiA+ID4gPiA+ID4gPiB0 aGF0LiBUaGF0IGFsbG9jYXRpb24gYXV0aG9yaXR5IGlzIGFsc28gYWxyZWFkeSBiYWtlZCBpbnRv IHZhcmlvdXMga2hyL2V4dAo+ID4gPiA+ID4gPiA+ID4gc3RhbmRhcmRzLCB0b28uCj4gPiA+IAo+ ID4gPiBUaGVyZSdzIG9uZSB0aGluZyB0aGF0IFY0TDIgaGFzIGFuZCBEUk0gaGFzbid0IGZvciA0 Q0NzOiBnb29kCj4gPiA+IGRvY3VtZW50YXRpb24uIExvb2sgYXQKPiA+ID4gaHR0cHM6Ly9saW51 eHR2Lm9yZy9kb3dubG9hZHMvdjRsLWR2Yi1hcGlzLW5ldy91YXBpL3Y0bC9waXhmbXQtcGFja2Vk LXJnYi5odG1sCj4gPiA+IG9yCj4gPiA+IGh0dHBzOi8vbGludXh0di5vcmcvZG93bmxvYWRzL3Y0 bC1kdmItYXBpcy1uZXcvdWFwaS92NGwveXV2LWZvcm1hdHMuaHRtbAo+ID4gPiBmb3IgaW5zdGFu Y2UuIEl0J3MgcGFpbmZ1bCB0byB3cml0ZSwgcGFpbmZ1bCB0byByZWFkLCBidXQgZGVmaW5lcyB0 aGUKPiA+ID4gNENDcyB2ZXJ5IGNsZWFybHkgd2l0aG91dCBhbWJpZ3VpdHkuIEkgd291bGRuJ3Qg YmUgc3VycHJpc2VkIGlmCj4gPiA+IGRpZmZlcmVudCBkcml2ZXJzIHVzZWQgdGhlIHNhbWUgRFJN IDRDQyBmb3IgZGlmZmVyZW50IGZvcm1hdHMgZHVlIHRvIHRoZQo+ID4gPiBsYWNrIG9mIGRldGFp bGVkIGRvY3VtZW50YXRpb24uIE1vdmluZyB0byBhIHNoYXJlZCBsaWJyYXJ5IGZvciA0Q0NzCj4g PiA+IHNob3VsZCBhbHNvIGFkZHJlc3MgdGhlIGRvY3VtZW50YXRpb24gc2lkZSwgYW5kIGFueSBu ZXcgZm9ybWF0IGFkZGVkIHRvCj4gPiA+IHRoZSBrZXJuZWwsIHdoZXRoZXIgZnJvbSB0aGUgVjRM MiBzaWRlIG9yIHRoZSBEUk0gc2lkZSwgd291bGQgYmUKPiA+ID4gcmVxdWlyZWQgdG8gcHJvdmlk ZSBkZXRhaWxlZCBkb2N1bWVudGF0aW9uLiBUaGF0IHdvdWxkIGJlIGEgZ3JlYXQKPiA+ID4gaW1w cm92ZW1lbnQgZm9yIERSTSA0Q0MgaGFuZGxpbmcuCj4gPiA+IAo+ID4gPiA+ID4gPiA+IFRoZSB3 YXkgSSBzZWUgaXQsIHRoZXJlJ3MgYSBmdW5kYW1lbnRhbCBkaWZmZXJlbmNlIGJldHdlZW4gdGhl IFVBUEkKPiA+ID4gPiA+ID4gPiBhbmQgdGhlIGtlcm5lbC4gSSBkb24ndCBzdWdnZXN0IHdlIGNo YW5nZSBhbnl0aGluZyBhYm91dCB0aGUgVUFQSTogdGhlCj4gPiA+ID4gPiA+ID4gZHJtIGZvcm1h dHMgc2hvdWxkIGtlZXAgdGhlaXIgcHJlZml4LCBkcm1fZm91cmNjLmggY2FuIHJlbWFpbiB0aGF0 Cj4gPiA+ID4gPiA+ID4gYXV0aG9yaXR5LCBpdCdzIGFsbCBmaW5lLgo+ID4gPiA+ID4gPiA+IAo+ ID4gPiA+ID4gPiA+IEludGVybmFsbHkgaG93ZXZlciwgdGhlIGxvbmcgdGVybSBnb2FsIGlzIHRv IHNoYXJlIHRoZSBmb3VyY2Mncwo+ID4gPiA+ID4gPiA+IGJldHdlZW4gRFJNIGFuZCBWNEwyIGZv ciB0aGUgc2FtZSBmb3JtYXRzLiBJdCBiYXNpY2FsbHkgbWVhbnMgdGhhdCBvZgo+ID4gPiA+ID4g PiA+IGNvdXJzZSB2NGwyIHNob3VsZCBiZSB1c2luZyB0aGUgRFJNIGZvdXJjYyB3aGVuIGEgZm9y bWF0IGV4aXN0cyBpbiBEUk0KPiA+ID4gPiA+ID4gPiBhbmQgbm90IHY0bDIsIGJ1dCBhbHNvIHRo YXQgRFJNIHNob3VsZCB1c2UgdjRsMiBmb3VyY2Mgd2hlbiB0aGUgZm9ybWF0Cj4gPiA+ID4gPiA+ ID4gZXhpc3RzIGluIHY0bDIgYnV0IG5vdCBEUk0sIGFuZCB0aGF0IGlzIGZhciBtb3JlIGxpa2Vs eSwgZ2l2ZW4gdGhlCj4gPiA+ID4gPiA+ID4gYWxyZWFkeSBleHRlbnNpdmUgdjRsMiBmb3JtYXRz IHN1cHBvcnQuCj4gPiA+ID4gPiA+IAo+ID4gPiA+ID4gPiBVaCBuby4gV2UgZGlkIGxvb2sgYXQg djRsIGZvdXJjYyBleHRlbnNpdmVseSB3aGVuIGRlY2lkaW5nIHVwb24gYSBkcm0KPiA+ID4gPiA+ ID4gZm9ybWF0IGlkZW50aWZpZXIgc3BhY2UuCj4gPiA+ID4gPiAKPiA+ID4gPiA+IE5vIHRvIHdo YXQgZXhhY3RseT8KPiA+ID4gPiA+IAo+ID4gPiA+ID4gPiBBbmQgYSBsb3Qgb2YgcGVvcGxlIHB1 c2hlZCBmb3IgdGhlICJmb3VyY2MgaXMgYSBzdGFuZGFyZCIsIHdoZW4KPiA+ID4gPiA+ID4gcmVh bGx5IGl0J3MgdG90YWxseSBub3QuCj4gPiA+ID4gPiAKPiA+ID4gPiA+IEV2ZW4gaWYgaXQncyBu b3QgYSBzdGFuZGFyZCwgaGF2aW5nIGNvbnNpc3RlbmN5IHdvdWxkIGJlIGEgZ29vZCB0aGluZy4K PiA+ID4gPiA+IAo+ID4gPiA+ID4gQW5kIHlvdSBzYWlkIHlvdXJzZWxmIHRoYXQgRFJNIGZvdXJj YyBpcyBub3cgcHJldHR5IG11Y2ggYW4gYXV0aG9yaXR5Cj4gPiA+ID4gPiBmb3IgdGhlIGZvdXJj Yywgc28gaXQgZGVmaW5pdGVseSBsb29rcyBsaWtlIGEgc3RhbmRhcmQgdG8gbWUuCj4gPiA+ID4g Cj4gPiA+ID4gZHJtIGZvdXJjYyBpcyB0aGUgYXV0aG9yaXR5IGZvciBkcm0gZm91cmNjIGNvZGVz LiBOb3QgZm9yIGFueSBvZiB0aGUKPiA+ID4gPiBvdGhlcnMgKGFuZCB0aGVyZSdzIGxvdHMgb2Yg dGhlbSkuIE5vdyBpdCdzIHVzZWQgaW4gYSBidW5jaCBvZiBvdGhlcgo+ID4gPiA+IHBsYWNlcyAo a2hyIHN0YW5kYXJkcywgZHJpIHByb3RvY29scyBpbiB3YXlsYW5kL1gxMSksIGJ1dCB0aGV5J3Jl Cj4gPiA+ID4gc3RpbGwgb25seSBkcm0gZm91cmNjLiBUaGVyZSBpcyBubyBvdmVyYWxsIGZvdXJj YyBzdGFuZGFyZC4KPiA+ID4gPiAKPiA+ID4gPiA+ID4gdjRsIHRlbmRzIHRvIGNvbmZsYXRlIHBp eGVsIGZvcm1hdCB3aXRoIHN0dWZmIHRoYXQgd2UgdGVuZCB0byBlbmNvZGUKPiA+ID4gPiA+ID4g aW4gbW9kaWZpZXJzIGEgbG90IG1vcmUuCj4gPiA+ID4gPiAKPiA+ID4gPiA+IEJvcmlzIGlzIHdv cmtpbmcgb24gYWRkaW5nIHRoZSBtb2RpZmllcnMgY29uY2VwdCB0byB2NGwyLCBzbyB3ZSdyZQo+ ID4gPiA+ID4gY29udmVyZ2luZyBoZXJlLCBhbmQgd2UgY2FuIHRvdGFsbHkgaGF2ZSBhIGxheWVy IGluIHY0bDIgdG8gY29udmVydAo+ID4gPiA+ID4gYmV0d2VlbiBvbGQgdjRsMiAiZm9ybWF0K21v ZGlmaWVycyIgZm9ybWF0cywgYW5kIERSTSBzdHlsZSBmb3JtYXRzLgo+ID4gPiA+ID4gCj4gPiA+ ID4gPiA+IFRoZXJlJ3MgYSBidW5jaCBvZiByZWFzb25zIHdlIGNhbid0IGp1c3QgdXNlIHY0bCwg YW5kIHRoZXkncmUgYXMKPiA+ID4gPiA+ID4gdmFsaWQgYXMgZXZlcjoKPiA+ID4gPiA+ID4gCj4g PiA+ID4gPiA+IC0gV2Ugb3ZlcmxhcCBiYWRseSBpbiBzb21lIGFyZWFzLCBzbyBldmVuIGlmIGZv dXJjYyBjb2RlcyBtYXRjaCwgd2UKPiA+ID4gPiA+ID4gICBjYW4ndCB1c2UgdGhlbSBhbmQgbmVl ZCBhIGR1cGxpY2F0ZWQgRFJNX0ZPVVJDQyBjb2RlLgo+ID4gPiA+ID4gCj4gPiA+ID4gPiBEbyB5 byBoYXZlIGFuIGV4YW1wbGUgb2Ygb25lIG9mIHRob3NlIGFyZWFzPwo+ID4gPiA+IAo+ID4gPiA+ IEkgdGhpbmsgdGhlIHJnYiBzdHVmZiB3YXMgb25lIG9mIHRoZSBiaWcgcmVhc29ucyB0byBub3Qg cmV1c2UgYW55Cj4gPiA+ID4gZXhpc3RpbmcgZm91cmNjIHN0YW5kYXJkICh3aGV0aGVyIHY0bCwg b3IgYW5vdGhlciBvbmUgZnJvbSBlLmcuIHZpZGVvCj4gPiA+ID4gY29udGFpbmVyIGZvcm1hdHMp LiBXZSBoYWQgaW5pdGlhbCBwYXRjaGVzIHRvIHJldXNlIHRoZSBmb3VyY2MgdGhhdAo+ID4gPiA+ IGV4aXN0ZWQsIGJ1dCB0aGUgZW5kIHJlc3VsdCB3YXMgcmVhbGx5IGluY29uc2lzdGVudCwgc28g d2UgZGl0Y2ggdGhhdAo+ID4gPiA+IGFuZCByb2xsZWQgb3V0IGEgbmV3IHNldCBvZiBlbnRpcmVs eSBkcm0gc3BlY2lmaWMgZm91cmNjIGNvZGVzIGZvcgo+ID4gPiA+IHJnYmEuCj4gPiA+IAo+ID4g PiBDb3VsZCB5b3UgZ2l2ZSBvbmUgb3IgYSBjb3VwbGUgb2YgZXhhbXBsZXMgb2YgVjRMMiA0Q0Nz IHRoYXQgYXJlIG5vdAo+ID4gPiBPQ0QtY29tcGF0aWJsZSA/IDotKQo+ID4gPiAKPiA+ID4gPiA+ ID4gLSB2NGwgZW5jb2RlcyBzb21lIG1ldGFkYXRhIGludG8gdGhlIGZvdXJjYyB0aGF0IHdlIGVu Y29kZSBlbHNld2hlcmUsCj4gPiA+ID4gPiA+ICAgZS5nLiBvZmZzZXQgZm9yIHBsYW5hciB5dXYg Zm9ybWF0cywgb3IgdGlsaW5nIG1vZGUKPiA+ID4gPiA+IAo+ID4gPiA+ID4gQXMgSSB3YXMgc2F5 aW5nLCB0aGlzIGNoYW5nZXMgb24gdGhlIHY0bDIgc2lkZSwgYW5kIGNvbnZlcmdpbmcgdG8KPiA+ ID4gPiA+IHdoYXQgRFJNIGlzIGRvaW5nLgo+ID4gPiA+ID4gCj4gPiA+ID4gPiA+IC0gZHJtIGZv dXJjYyBjb2RlIGRvZXNuJ3QgYWN0dWFsbHkgZGVmaW5lIHRoZSBkcm1fZm9ybWF0X2luZm8KPiA+ ID4gPiA+ID4gICB1bmlxdWVseSwgZHJpdmVycyBjYW4gb3ZlcnJpZGUgdGhhdCAodGhhdCdzIGFu IGV4cGxpY2l0IGRlc2lnbgo+ID4gPiA+ID4gPiAgIGludGVudCBvZiBtb2RpZmllcnMsIHRvIGFs bG93IGRyaXZlcnMgdG8gYWRkIGFub3RoZXIgcGxhbmUgZm9yCj4gPiA+ID4gPiA+ICAgZS5nLiBj b21wcmVzc2lvbiBpbmZvcm1hdGlvbikuIFlvdSdkIG5lZWQgdG8gcHVsbCB0aGF0IGRyaXZlcgo+ ID4gPiA+ID4gPiAgIGtub3dsZWRnZSBpbnRvIHlvdXIgZm9ybWF0IGxpYnJhcnkuCj4gPiA+IAo+ ID4gPiBUaGF0J3MgYSBtaXN0YWtlIGluIG15IG9waW5pb24uIFdlIHRyaWVkIHRoYXQgaW4gVjRM MiB0byBzdG9yZSBtZXRhZGF0YQo+ID4gPiBpbiBhIHNlcGFyYXRlIHBsYW5lLCBhbmQgaGFkIHRv IGdvIGFub3RoZXIgcm91dGUgZXZlbnR1YWxseSBhcyBpdAo+ID4gPiBjcmVhdGVkIGEgdmVyeSBi YWQgbWVzcy4KPiA+IAo+ID4gSnVzdCBxdWljayBjbGFyaWZpY2F0aW9uIGluIHRoZSBtaWRkbGUg aGVyZTogVGhpcyBpcyBob3cgdGhlIGh3IHdvcmtzLgo+IAo+IFRoZSBoYXJkd2FyZSB0YWtlcyBw YXJhbWV0ZXJzIGZyb20gYSBidWZmZXIsIGJ1dCBpdCBkb2Vzbid0IG1hbmRhdGUgaG93Cj4gdGhh dCBidWZmZXIgaXMgZXhwb3NlZCB0byB1c2Vyc3BhY2UgOi0pIFVzaW5nIGFuIGV4dHJhIHBsYW5l IGlzIG9uZQo+IG9wdGlvbiwgYnV0IG90aGVyIEFQSXMgYXJlIHBvc3NpYmxlLgo+IAo+ID4gSXQn cyBub3QgbWV0YWRhdGEgdGhhdCBzdyBldmVyIHRvdWNoZXMgKGluIGdlbmVyYWwsIHRlc3RjYXNl cyB0byBtYWtlIHN1cmUKPiA+IHdlIGRpc3BsYXkgdGhlc2UgY29ycmVjdGx5IGV4Y2VwdGVkKS4K PiA+IAo+ID4gVGhlcmUgaGFzIGJlZW4gc29tZSB0YWxraW5nIHRvIGFkZCBtYXliZSBhIGJpdCBt b3JlIG1peGVkIG1ldGFkYXRhLCBmb3IKPiA+IGZhc3QtY2xlYXIgY29sb3JzICh3aGljaCBpc24n dCB1c2VkIGJ5IGFueSBkaXNwbGF5IGVuZ2luZSBhZmFpayB5ZXQpLiBUaGF0Cj4gCj4gV2hhdCBh cmUgZmFzdC1jbGVhciBjb2xvcnMgPwo+IAo+ID4gd291bGQgZ2VuZXJhbGx5IGJlIHdyaXR0ZW4g YnkgdGhlIGNwdSAoaW4gdGhlIGdsIHN0YWNrKSwgYnV0IGFnYWluIHJlYWQgYnkKPiA+IHRoZSBo dyAobG9hZGVkIGFzIGluZGlyZWN0IHN0YXRlIHBhY2tldCBtb3N0IGxpa2VseSwgb3Igc29tZXRo aW5nIGxpa2UKPiA+IHRoYXQpLiBTbyBhZ2FpbiBodyBzcGVjaWZpYyBsYXlvdXQsIGJlY2F1c2Ug dGhlIGh3IG5lZWRzIHRvIHJlYWQgaXQuCj4gPiAKPiA+IFB1cmUgbWV0YWRhdGEgb25seSBvZiBp bnRlcmVzdCBmb3IgdGhlIGNwdS9zdyBzdGFjayBoYXMgYmVlbiBzaG90IGRvd24KPiA+IGNvbXBs ZXRlbHkgb24gdGhlIGRybSBzaWRlIHRvby4KPiA+IAo+ID4gPiBUaGVyZSdzIGEgdGVuZGVuY3kg aW4gYm90aCBzdWJzeXN0ZW1zIHRvIGxvb2sgYXQgdGhlIG90aGVyIGFzIGEgYml0IG9mIGEKPiA+ ID4gcmV0YXJkZWQgcmVsYXRpdmUsIGFuZCB0aGF0J3MgYSBzaGFtZSwgd2UgaGF2ZSBsb3RzIHRv IGxlYXJuIGZyb20gZWFjaAo+ID4gPiBvdGhlcidzIG1pc3Rha2VzLiBUaGF0IHdvdWxkbid0IGJl IHRvbyBkaWZmaWN1bHQgaWYgcGVvcGxlIHN0YXJ0ZWQKPiA+ID4gdGFsa2luZyB0byBlYWNoIG90 aGVyLgo+ID4gPiAKPiA+ID4gQSBzZW1pLXJlbGF0ZWQgY29tbWVudDogRFJNIGFsc28gY2Fycmll cyBvdGhlciBtaXN0YWtlcyBvZiBpdHMgb3duLCBJJ20KPiA+ID4gdGhpbmtpbmcgYWJvdXQgRFJN X0ZPUk1BVF9CSUdfRU5ESUFOIGluIHBhcnRpY3VsYXIKPiA+IAo+ID4gWWVhaCB0aGF0IG9uZSBp cyBoaWxhcmlvcywgYnV0IGluIHByYWN0aWNlIGJpZyBlbmRpYW4gaXMgZGVhZCwgZXhjZXB0IGZv cgo+ID4gYSB2ZXJ5IGZldyBzZXJ2ZXIgY2hpcHMsIGFuZCB0aGVyZSBJIHRoaW5rIEdlcmQncyB3 b3JrIG1vc3RseSBmaXhlZCB1cAo+ID4gdGhhdCBtZXNzLgo+ID4gCj4gPiA+ID4gPiBJJ20gbm90 IHN1cmUgaG93IG15IHBhdGNoZXMgYXJlIGNoYW5naW5nIGFueXRoaW5nIGhlcmUuIFRoaXMgaXMK PiA+ID4gPiA+IGxpdHRlcmFsbHkgdGhlIHNhbWUgY29kZSwgd2l0aCB0aGUgZnVuY3Rpb25zIHJl bmFtZWQuCj4gPiA+ID4gPiAKPiA+ID4gPiA+IElmIGRyaXZlcnMgd2FudCB0byBvdmVycmlkZSB0 aGF0LCB0aGVuIHllYWgsIGZpbmUsIHdlIGNhbiBsZXQgdGhlbSBkbwo+ID4gPiA+ID4gdGhhdC4g SnVzdCBsaWtlIGFueSBoZWxwZXIgdGhpcyBqdXN0IHByb3ZpZGVzIGEgZGVmYXVsdCB0aGF0IGNv dmVycwo+ID4gPiA+ID4gbW9zdCBvZiB0aGUgY2FzZXMuCj4gPiA+ID4gPiAKPiA+ID4gPiA+ID4g SW93IHRoZXJlJ3Mgbm8gd2F5IHdlIGNhbiBlYXNpbHkgYWRvcHQgdjRsIGZvdXJjYywgZXhjZXB0 IGlmIHdlIGRvCj4gPiA+ID4gPiA+IHNvbWV0aGluZyBsaWtlIGEgbmV3IGFkZGZiIGZsYWcuCj4g PiA+ID4gPiAKPiA+ID4gPiA+IEZvciB0aGUgZm9ybWF0cyB0aGF0IHdvdWxkIGJlIGRlc2NyaWJl ZCBhcyBhIG1vZGlmaWVyLCBzdXJlLiBGb3IgYWxsCj4gPiA+ID4gPiB0aGUgb3RoZXJzICh0aGF0 IGFyZSBub3QgeWV0IHN1cHBvcnRlZCBieSBEUk0pLCB0aGVuIEkgZG9uJ3QgcmVhbGx5Cj4gPiA+ ID4gPiBzZWUgd2h5IG5vdC4KPiA+ID4gPiAKPiA+ID4gPiBTZWUgYWJvdmUsIHdlIHRyaWVkIHRo YXQgaW5pdGlhbGx5LCBkaWRuJ3QgcGFzcyB0aGUgb2NkIHRlc3RzIHdoZW4KPiA+ID4gPiByZXZp ZXdpbmcuIE1heWJlIHRoZSBzaXR1YXRpb24gaXMgYmV0dGVyIG91dHNpZGUgb2YgcmJneC9hIGZv cm1hdHMsCj4gPiA+ID4gYW5kIEkgdGhpbmsgd2UgZG8gYXQgbGVhc3QgdHJ5IHRvIHVzZSB0aGUg c2FtZSBmb3VyY2MgY29kZXMgdGhlcmUgd2hlbgo+ID4gPiA+IHRoZXJlIGFscmVhZHkgaXMgb25l LiBCdXQgdGhlbiB0aGUgZGV0YWlscyBvY2Nhc2lvbmFsbHkgbG9vawo+ID4gPiA+IGRpZmZlcmVu dC4KPiA+ID4gPiAKPiA+ID4gPiA+ID4gPiBBbmQgZ2l2ZW4gaG93IHRoZSBjdXJyZW50IHN0YXRl IGlzIGEgbWVzcyBpbiB0aGlzIHJlZ2FyZCwgSSdtIG5vdCB0b28KPiA+ID4gPiA+ID4gPiBvcHRp bWlzdGljIGFib3V0IGtlZXBpbmcgdGhlIGZvcm1hdHMgaW4gdGhlaXIgcmVsZXZhbnQgZnJhbWV3 b3Jrcy4KPiA+ID4gPiA+ID4gPiAKPiA+ID4gPiA+ID4gPiBIYXZpbmcgYSBzaGFyZWQgbGlicmFy eSwgZ292ZXJuZWQgYnkgYm90aCwgd2lsbCBtYWtlIHRoaXMgZmFyIGVhc2llciwKPiA+ID4gPiA+ ID4gPiBzaW5jZSBpdCB3aWxsIGJlIGVhc3kgdG8gZGlzY292ZXIgdGhlIGZvcm1hdHMgdGhhdCBh cmUgYWxyZWFkeQo+ID4gPiA+ID4gPiA+IHN1cHBvcnRlZCBieSB0aGUgb3RoZXIgc3Vic3lzdGVt Lgo+ID4gPiA+ID4gPiAKPiA+ID4gPiA+ID4gSSB0aGluayBhIGNvbXBhdCBsaWJyYXJ5IHRoYXQg KHRyaWVzIHRvLCBiZXN0IGVmZm9ydCkgY29udmVydCBiZXR3ZWVuCj4gPiA+ID4gPiA+IHY0bCBh bmQgZHJtIGZvdXJjYyB3b3VsZCBtYWtlIHNlbnNlLiBTb21ld2hlcmUgaW4gZHJpdmVycy92aWRl bywgbmV4dAo+ID4gPiA+ID4gPiB0byB0aGUgY29udmVyc2lvbiBmdW5jdGlvbnMgZm9yIHZpZGVv bW9kZSA8LT4gZHJtX2Rpc3BsYXlfbW9kZQo+ID4gPiA+ID4gPiBwZXJoYXBzLiBUaGF0IHNob3Vs ZCBiZSB1c2VmdWwgZm9yIGRyaXZlcnMuCj4gPiA+ID4gPiAKPiA+ID4gPiA+IFRoYXQncyBub3Qg cmVhbGx5IHdoYXQgdGhpcyBzZXJpZXMgaXMgYWJvdXQgdGhvdWdoLiBUaGF0IHNlcmllcyBpcwo+ ID4gPiA+ID4gYWJvdXQgc2hhcmluZyB0aGUgKGltYWdlfHBpeGVscykgZm9ybWF0cyBkYXRhYmFz ZSBhY3Jvc3MgZXZlcnlvbmUgc28KPiA+ID4gPiA+IHRoYXQgZXZlcnlvbmUgY2FuIGJlbmVmaXQg ZnJvbSBpdC4KPiA+ID4gPiAKPiA+ID4gPiBZZWFoIEkga25vdy4gSSBzdGlsbCB0aGluayBsZWF2 aW5nIHRoZSBkcm0gZm91cmNjIHdpdGggdGhlIGRybSBwcmVmaXgKPiA+ID4gPiB3b3VsZCBiZSBn b29kLCBzaW5jZSB0aGVyZSdzIHJlYWxseSBubyBzdGFuZGFyZCBoZXJlLgo+ID4gPiA+IAo+ID4g PiA+ID4gPiBVbmlmeWluZyB0aGUgZm9ybWF0cyB0aGVtc2VsdmVzLCBhbmQgYWxsIHRoZSBhc3Nv Y2lhdGVkIG1ldGFkYXRhIGlzCj4gPiA+ID4gPiA+IGltbyBhIG5vLWdvLCBhbmQgd2FzIGEgcHJl dHR5IGNvbnNjaW91cyBkZWNpc2lvbiB3aGVuIHdlIGltcGxlbWVudGVkCj4gPiA+ID4gPiA+IGRy bV9mb3VyY2MgYSBmZXcgeWVhcnMgYmFjay4KPiA+ID4gPiA+ID4gCj4gPiA+ID4gPiA+ID4gSWYg d2Ugd2FudCB0byBrZWVwIHRoZSBjdXJyZW50IGxpYnJhcnkgaW4gRFJNLCB3ZSBoYXZlIHR3byBv cHRpb25zCj4gPiA+ID4gPiA+ID4gdGhlbjoKPiA+ID4gPiA+ID4gPiAKPiA+ID4gPiA+ID4gPiAg IC0gU3VwcG9ydCBhbGwgdGhlIHY0bDIgZm9ybWF0cyBpbiB0aGUgRFJNIGxpYnJhcnksIHdoaWNo IGlzCj4gPiA+ID4gPiA+ID4gICAgIGVzc2VudGlhbGx5IHdoYXQgSSdtIGRvaW5nIGluIHRoZSBs YXN0IHBhdGNoZXMuIEhvd2V2ZXIsIHRoYXQKPiA+ID4gPiA+ID4gPiAgICAgd291bGQgcmVxdWly ZSB0byBoYXZlIHRoZSB2NGwyIGRldmVsb3BwZXJzIGFsc28gcmV2aWV3aW5nIHN0dWZmCj4gPiA+ ID4gPiA+ID4gICAgIHRoZXJlLiBBbmQgZ2l2ZW4gaG93IGJ1c3kgdGhleSBhcmUsIEkgY2Fubm90 IHJlYWxseSBzZWUgaG93IHRoYXQKPiA+ID4gPiA+ID4gPiAgICAgd291bGQgd29yay4KPiA+ID4g PiA+ID4gCj4gPiA+ID4gPiA+IFdlbGwsIGlmIHdlIGVuZCB1cCB3aXRoIGEgY29tbW9uIGxpYnJh cnkgdGhlbiB5ZXMgd2UgbmVlZCBjcm9zcwo+ID4gPiA+ID4gPiByZXZpZXcuIFRoZXJlJ3Mgbm8g d2F5IGFyb3VuZCB0aGF0LiBEb2Vzbid0IG1hdHRlciB3aGVyZSBleGFjdGx5IHRoYXQKPiA+ID4g PiA+ID4gbGlicmFyeSBpcyBpbiB0aGUgZmlsZXN5c3RlbSB0cmVlLCBhbmQgYWRkaW5nIGEgc3Bl Y2lhbCBNQUlOVEFJTkVSUwo+ID4gPiA+ID4gPiBlbnRyeSBmb3IgYW55dGhpbmcgcmVsYXRlZCB0 byBmb3VyY2MgKGJvdGggZHJtIGFuZCB2NGwpIHRvIG1ha2Ugc3VyZQo+ID4gPiA+ID4gPiB0aGV5 IGdldCBjcm9zcy1wb3N0ZWQgaXMgZWFzeS4gTm8gZmlsZSByZW5hbWluZyBuZWVkZWQuCj4gPiA+ ID4gPiAKPiA+ID4gPiA+IFRoYXQgd291bGQgY3JlYXRlIHNvbWUgZ292ZXJuaW5nIGlzc3VlcyBh cyB3ZWxsLiBGb3IgZXhhbXBsZSwgaWYgeW91Cj4gPiA+ID4gPiBldmVyIGhhdmUgYSBwYXRjaCBm cm9tIG9uZSBmb3VyY2MgYWRkaXRpb24gKHRoYXQgbWlnaHQgb3IgbWlnaHQgbm90IGJlCj4gPiA+ ID4gPiBjb3ZlcmVkIGJ5IHY0bDIpLCB3aWxsIHlvdSB3YWl0IGZvciBhbnkgdjRsMiBkZXZlbG9w cGVyIHRvIHJldmlldyBpdD8KPiA+ID4gPiAKPiA+ID4gPiBOb25lIG9mIHRoaXMgaXMgZml4ZWQg YnkgY29kZSByZW5hbWluZyBvciBsb2NhdGlvbnMuIEVpdGhlciB3YXkgd2UKPiA+ID4gPiBuZWVk IHRvIGZpZ3VyZSB0aGF0IG91dC4KPiA+ID4gPiAKPiA+ID4gPiBBbmQgeWVzIHBhcnQgb2YgdGhl IHJlYXNvbnMgZm9yIG5vdCBtb3ZpbmcgdGhpcyBvdXQgb2YgZHJtIGlzIHRoYXQgSSdtCj4gPiA+ ID4gbm90IGEgZmFuIG9mIGJvdXRpcXVlIHRyZWVzIGZvciBzbWFsbCBzdHVmZi4gSWYgc2hhcmlu ZyBtZWFucyB3ZSBuZWVkCj4gPiA+ID4gdG8gc3BsaXQgdGhlIGRybV9mb3VyY2MgY29kZSBhbmQg bGlicmFyeSBvdXQgb2YgZHJtIHRyZWVzLCBJJ20gbm90Cj4gPiA+ID4gc3VyZSB0aGF0J3MgYSBn b29kIGlkZWEuIFdlJ3JlIGFscmVhZHkgc3VwZXIgbGliZXJhbCB3aXRoIG1lcmdpbmcKPiA+ID4g PiBhbnl0aGluZyB0aHJvdWdoIGRyaXZlciB0cmVlcyB3aXRoIGFja3MsIGFuZCBpbnRlZ3JhdGlu ZyB0aGVtIHF1aWNrbHkKPiA+ID4gPiBpbnRvIGRybS1uZXh0LiBUaGlzIHdvdWxkIHN0aWxsIGJl IHdvcmthYmxlIGlmIHY0bCBzZW5kcyByZWd1bGFyIHB1bGwKPiA+ID4gPiByZXF1ZXN0cyB0byBk cm0tbmV4dCAoZXZlcnkgMS0yIHdlZWtzLCBsaWtlIHRoZSBvdGhlciBiaWcgZ3B1IHRyZWVzCj4g PiA+ID4gZG8pLiBJZiB3ZSBjYW4gb25seSBzeW5jIHVwIG9uY2UgcGVyIG1lcmdlIHdpbmRvdyB3 aXRoIGEgc2hhcmVkCj4gPiA+ID4gYm91dGlxdWUgdHJlZSBmb3IgZm9ybWF0cyBvbmx5LCBsaWZl IGlzIGdvaW5nIHRvIGJlIHBhaW5mdWwuCj4gPiA+IAo+ID4gPiBUaGF0IHNob3VsZCBiZSBzb2x2 ZWQgYnkgdGhlIHByb3Bvc2FsIGFib3ZlLCBtYWludGFpbmluZyB0aGUgc2hhcmVkCj4gPiA+IGxp YnJhcnkgaW4gdGhlIERSTSB0cmVlLiBXZSB3b3VsZCBuZWVkIHRvIGJlIGNhcmVmdWwgdGhlcmUs IGFuZCBpZGVhbGx5Cj4gPiA+IG1haW50YWluIHRoYXQgaW4gYSBzZXBhcmF0ZSBicmFuY2ggdGhh dCBjb3VsZCBiZSBtZXJnZWQgaW4gYm90aCBEUk0gYW5kCj4gPiA+IFY0TDIgd2l0aG91dCBoYXZp bmcgdG8gbWVyZ2UgbW9zdCBvZiB0aGUgb3RoZXIgc3Vic3lzdGVtJ3MgcGVuZGluZwo+ID4gPiBj aGFuZ2VzIGF0IHRoZSBzYW1lIHRpbWUsIGJ1dCBJIHRoaW5rIGl0J3MgZG9hYmxlIHdpdGhvdXQg YW55IGJpZyBpc3N1ZS4KPiA+ID4gCj4gPiA+ID4gPiBJZiBpdCdzIHNoYXJlZCBjb2RlLCB0aGVu IGl0IHNob3VsZCBiZSBzaGFyZWQsIGFuZCBldmVyeSBjbGllbnQKPiA+ID4gPiA+IGZyYW1ld29y ayBwdXQgb24gYW4gZXF1YWwgZm9vdGluZy4KPiA+ID4gPiA+IAo+ID4gPiA+ID4gPiA+ICAgLSBE ZXZlbG9wIHRoZSBzYW1lIGxpYnJhcnkgZnJvbSB3aXRoaW4gdjRsMi4gVGhhdCBpcyByZWFsbHkg YSBwb29yCj4gPiA+ID4gPiA+ID4gICAgIHNvbHV0aW9uLCBzaW5jZSB0aGUgaW5mb3JtYXRpb24g d291bGQgYmUgZ3JlYXRseSBkdXBsaWNhdGVkCj4gPiA+ID4gPiA+ID4gICAgIGJldHdlZW4gdGhl IHR3bywgYW5kIGluIHRlcm1zIG9mIG1haW50YWluYW5jZSwgY29kZSwgYW5kIGJpbmFyeQo+ID4g PiA+ID4gPiA+ICAgICBzaXplIHRoYXQgd291bGQgYmUgZHVwbGljYXRlZCB0b28uCj4gPiA+ID4g PiA+IAo+ID4gPiA+ID4gPiBJdCdzIGVzc2VudGlhbGx5IHdoYXQgd2UgZGVjaWRlZCB0byBkbyBm b3IgZHJtIHllYXJzIGJhY2suCj4gPiA+ID4gPiAKPiA+ID4gPiA+IEFuZCBpdCB3YXMgcHJvYmFi bHkgdGhlIHJpZ2h0IHNvbHV0aW9uIGJhY2sgdGhlbiwgYnV0IEknbSByZWFsbHkgbm90Cj4gPiA+ ID4gPiBjb252aW5jZWQgaXQncyBzdGlsbCB0aGUgcmlnaHQgdGhpbmcgdG8gZG8gdG9kYXkuCj4g PiA+ID4gPiAKPiA+ID4gPiA+ID4gPiBIYXZpbmcgaXQgc2hhcmVkIGFsbG93cyB0byBlYXNpbHkg c2hhcmUsIGFuZCBkaXNjb3ZlciBmb3JtYXRzIGZyb20gdGhlCj4gPiA+ID4gPiA+ID4gb3RoZXIg c3Vic3lzdGVtLCBhbmQgdG8gaGF2ZSBhIHNpbmdsZSwgdW5pcXVlIHBsYWNlIHdoZXJlIHRoaXMg aXMKPiA+ID4gPiA+ID4gPiBjZW50cmFsaXplZC4KPiA+ID4gPiA+ID4gCj4gPiA+ID4gPiA+IFdo YXQgSSB0aGluayBjb3VsZCB3b3JrIGFzIG1pZGRsZSBncm91bmQ6Cj4gPiA+ID4gPiA+IC0gUHV0 IGRybV9mb3JtYXQgc3R1ZmYgaW50byBhIHNlcGFyYXRlIC5rbwo+ID4gPiA+ID4gPiAtIEFkZCBh IE1BSU5UQUlORVJTIGVudHJ5IHRvIG1ha2Ugc3VyZSBhbGwgdGhpbmdzIGZvdXJjYyBhcmUgY3Jv c3MKPiA+ID4gPiA+ID4gcG9zdGVkIHRvIGJvdGggZHJtIGFuZCB2NGwgbGlzdHMuIEVhc3kgb24g dGhlIGRybSBzaWRlLCBzaW5jZSBpdCdzIGFsbAo+ID4gPiA+ID4gPiBzZXBhcmF0ZSBmaWxlcy4g Tm90IHN1cmUgaXQncyBzbyBjb252ZW5pZW50IGZvciB2NGwgdWFwaS4KPiA+ID4gPiA+ID4gLSBB ZGQgYSBjb252ZXJzaW9uIGxpYnJhcnkgdGhhdCB0cmllcyB0byBiZXN0LWVmZm9ydCBtYXAgYmV0 d2VlbiBkcm0KPiA+ID4gPiA+ID4gYW5kIHY0bCBmb3JtYXRzLiBPbiB0aGUgZHJtIHNpZGUgdGhh dCBtb3N0IGxpa2VseSBtZWFucyB5b3UgbmVlZAo+ID4gPiA+ID4gPiBvZmZzZXRzIGZvciBwbGFu ZXMsIGFuZCBtb2RpZmllcnMgdG9vIChzaW5jZSB0aG9zZSBhcmUgaW1wbGllZCBpbiBzb21lCj4g PiA+ID4gPiA+IHY0bCBmb3VyY2MpLiBFbXBoYXNpcyBvbiAiYmVzdCBlZmZvcnQiIGkuZS4gb25s eSBzdXBwb3J0IGFzIG11Y2ggYXMKPiA+ID4gPiA+ID4gdGhlIGRyaXZlcnMgdGhhdCB1c2UgdGhp cyBsaWJyYXJ5IG5lZWQuCj4gPiA+ID4gPiA+IC0gQWRkIGRybV9mb3VyY2MgYXMtbmVlZGVkIGJ5 IHRoZXNlIGRyaXZlcnMgdGhhdCB3YW50IHRvIHVzZSBhIHVuaWZpZWQKPiA+ID4gPiA+ID4gZm9y bWF0IHNwYWNlLgo+ID4gPiA+ID4gPiAKPiA+ID4gPiA+ID4gRm9yY2luZyB0aGlzIHVuaWZpY2F0 aW9uIG9uIGV2ZXJ5b25lIG90b2ggaXMgaW1vIHdheSB0b28gbXVjaC4KPiA+ID4gPiA+IAo+ID4g PiA+ID4gdjRsMiBpcyBzdGFydGluZyB0byBjb252ZXJnZSB3aXRoIERSTSwgYW5kIHdlJ3JlIHVz aW5nIHRoZSBEUk0gQVBJCj4gPiA+ID4gPiBwcmV0dHkgbXVjaCB1bnRvdWNoZWQgZm9yIHRoYXQg bGlicmFyeSwgc28gSSdtIG5vdCByZWFsbHkgc3VyZSBob3cKPiA+ID4gPiA+IGFueW9uZSBpcyBo dXJ0IGJ5IHRoYXQgdW5pZmljYXRpb24uCj4gPiA+ID4gCj4gPiA+ID4gSXQgbWlnaHQgbWFrZSBz ZW5zZSB0byByZWd1bGFybHkgcHVsbCB2NGwgdXBkYXRlcyBpbnRvIGRybS1uZXh0IHRoZW4KPiA+ ID4gPiBhbnl3YXkuIFRoYXQgd291bGQgYWxzbyByZW1vdmUgdGhlIG5lZWQgdG8gaGF2ZSB0aGUg Zm9ybWF0IGxpYnJhcnkKPiA+ID4gPiBzb21ld2hlcmUgZWxzZS4KPiA+ID4gCj4gPiA+IEFyZSB5 b3Ugc2F5aW5nIGl0IHNob3VsZCB0aGUgbGl2ZSBpbiBWNEwyID8gOy0pCj4gPiAKPiA+IE1heWJl IGEgZmV3IGNsYXJpZmljYXRpb25zIG9uIGhvdyB0aGUgZHJtIHNoYXJlZCBjb3JlIHRoaW5nIHVz dWFsbHkgd29ya3MsCj4gPiBhbmQgd2h5IEknbSBhIHN0aWNrZXIgaGVyZS4gQm90dG9tIHJlcGx5 IHNpbmNlIEknbSBub3Qgc3VyZSB3aGVyZSB0byBwdXQKPiA+IGl0Ogo+ID4gCj4gPiAtIFJlZmFj dG9yaW5ncyB1c3VhbGx5IGdvIGluIHRocm91Z2ggZHJtLW1pc2MgKGF0IGxlYXN0IHNpbmNlIGEg ZmV3Cj4gPiAgIHllYXJzKS4KPiA+IAo+ID4gLSBTbWFsbCBwYXRjaGVzIGdvIGluIHRocm91Z2gg dGhlIHJlbGV2YW50IGRyaXZlciB0cmVlICh3aGljaCBpcyBvZnRlbgo+ID4gICBkcm0tbWlzYywg YnV0IG5vdCBhbHdheXMpLCB3aXRoIGFuIEFjayBmcm9tIGRybSBtYWludGFpbmVycy4KPiA+IAo+ ID4gLSBObyB0b3BpYyBicmFuY2hlcywgZXZlcnlvbmUganVzdCBwdXNoZXMgcGF0Y2hlcyB3aGVy ZSBpdCdzIG1vc3QKPiA+ICAgY29udmVuaWVudC4KPiA+IAo+ID4gV2UgZ2V0IGF3YXkgd2l0aCB0 aGlzIG1lc3MgYmVjYXVzZSBldmVyeW9uZSBzZW5kcyByZWd1bGFyIHB1bGwgcmVxdWVzdHMgdG8K PiA+IGRybSwgd2hlcmUgdGhlIGVudGlyZSBoaXN0b3J5IGlzIGJha2VkIGluIGFuZCBvdGhlcnMg Y2FuIGJhY2ttZXJnZS9mYXN0Cj4gPiBmb3J3YXJkL3JlYmFzZS4gV29yc3QgY2FzZSB5b3Ugd2Fp dCBvbmUgbW9udGggKGFyb3VuZCB0aGUgbWVyZ2Ugd2luZG93LAo+ID4gd2hlbiBkcm0tbmV4dCBp cyBjbG9zZWQgZm9yIGZlYXR1cmVzKSwgYnV0IHVzdWFsbHkgaXQncyBqdXN0IDEtMiB3ZWVrcy4K PiA+IFBsdXMgd2UgdGVuZCB0byBoYXZlIGZhaXJseSBiaWcgdHJlZXMsIHdpdGggZ29vZCBjaGFu Y2VzIHRoYXQgdGhlIG5leHQKPiA+IHBhdGNoIHNlcmllcyBsYW5kcyBpbiB0aGUgc2FtZSB0cmVl IGFnYWluIGFuZCBubyB3b3JrIGF0IGFsbCBpcyBuZWVkZWQuCj4gPiAKPiA+IElmIHdlIHN0YXJ0 IHJlZ3VsYXJseSBzaGFyaW5nIGxvdHMgb2YgY29kZSB3aXRoIHY0bCAod2hpY2ggc2VlbXMgdG8g YmUgdGhlCj4gPiBsb25nIHRlcm0gZ29hbCBoZXJlKSwgdGhlbiBJIHRoaW5rIHdlIG5lZWQgc29t ZXRoaW5nIGVxdWFsbHkgY29udmVuaWVudAo+ID4gZm9yIGFsbCB0aGF0Lgo+ID4gCj4gPiBXZSdy ZSBub3QgZ29pbmcgdG8gYmUgYWJsZSB0byB0ZWFjaCBzb21lIGNvbXBsaWNhdGVkIHRvcGljIGJy YW5jaCBzY2hlbWUKPiA+IHRvIHRoZSA1MCsgc3VibWFpbnRhaW5lcnMvY29tbWl0dGVycyB3ZSBo YXZlIGluIGRybSAtIGEgbG90IG11Y2ggbW9yZQo+ID4gYmFzaWMgc3R1ZmYgYWxyZWFkeSB0YWtl cyBsb3RzIG9mIHdvcmsgdG8gZ2V0IGl0IHRvIHN0aWNrLiBJZiB0aGUgcHJvcG9zYWwKPiA+IGlz ICJ0byBiZSBjYXJlZnVsIiBhbmQgIm1haW50YWluIGl0IGluIGEgc2VwYXJhdGUgYnJhbmNoIiwg SSdtIG5vdCBpbgo+ID4gZmF2b3VyIGJlY2F1c2UgSSB0aGluayB0aGF0IGp1c3Qgd291bGRuJ3Qg d29yay4KPiAKPiBXaHkgbm90ID8gSXQgY2FuIGJlIGEgZmFzdC1tb3ZpbmcgYnJhbmNoIHRoYXQg Z2V0cyBtZXJnZWQgaW4gZHJtLW1pc2MKPiBhcyBvZnRlbiBhcyB5b3Ugd2FudCAoZXZlbiBhdCBl dmVyeSBjb21taXQgaWYgdGhhdCdzIGRlc2lyZWQpLiBXZSdyZQo+IGRlYWxpbmcgd2l0aCBhIGxp bWl0ZWQgYW1vdW50IG9mIGNvZGUgaGVyZSwgYW5kIHRoZXJlJ3Mgbm8gbW9yZSByZWFzb24KPiB0 aGF0IFY0TDIgc2hvdWxkIHB1bGwgaW4gZHJtLW1pc2MgdG8gZ2V0IDRDQyB1cGRhdGVzIHRoYW4g RFJNIHNob3VsZAo+IHB1bGwgVjRMMiBmb3IgdGhlIHNhbWUuIEkgaGF2ZSBubyBvYmplY3Rpb24g YWdhaW5zdCBhIDRDQyBicmFuY2ggYmVpbmcKPiBvZmZpY2lhbGx5IG1haW50YWluZWQgdW5kZXIg dGhlIERSTSB1bWJyZWxsYSwgYnV0IEkgdGhpbmsgdGhlIGNvZGUKPiBzaG91bGQgbGl2ZSBlbHNl d2hlcmUgdGhhbiBkcml2ZXJzL2dwdS9kcm0vLCBoYXZlIGEgbmV1dHJhbCBwcmVmaXgsIGFuZAo+ IG5vdCByZXF1aXJlIHB1bGxpbmcgYW4gZW50aXJlIHN1YnN5c3RlbSBpbi4KCkkgdGhpbmsgdGhh dCBoYXZpbmcgYSBzdWJzeXN0ZW0tbmV1dHJhbCB0cmVlIGlzIHdoYXQgTWF4aW1lIGhhZCBpbiBt aW5kCmluaXRpYWxseS4gVGhlIHdheSBJIHNlZSBpdCwgdGhlIGlkZWEgd291bGQgaW5kZWVkIGJl IHRvIGtlZXAgaXQgbG93LQp0cmFmZmljIGFuZCBhdm9pZCBoYXZpbmcgYW55IHNlcmlvdXMgY29y ZSBjb2RlIGluIHRoZXJlLiBCYXNpY2FsbHkganVzdApzdGljayB0byBmb3JtYXQgaGVscGVycyBh bmQgaWRlYWxseSBsYXRlciBidWZmZXIgZGVzY3JpcHRpb24gc3RydWN0dXJlcwphbmQgaGVscGVy cy4KCkkgYWxzbyBsaWtlIHRoZSBpZGVhIG9mIGhhdmluZyBhIGZldyBzaGFyZWQgaW9jdGxzIHRv IHJldHJpZXZlIGEgYnVmZmVyCm1lbW9yeSBsYXlvdXQgaW5mb3JtYXRpb24gZnJvbSBhIGRtYS1i dWYgZmQgYW5kIG1tYXAtaW5nIG9uIGEgcGVyLXBsYW5lIApiYXNpcywgYnV0IHRoYXQncyByYXRo ZXIgdW5saWtlbHkgdG8gZXZvbHZlIG11Y2ggb25jZSBpdCdzIHRoZXJlLgoKQ2hlZXJzLAoKUGF1 bAoKX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18KZHJpLWRl dmVsIG1haWxpbmcgbGlzdApkcmktZGV2ZWxAbGlzdHMuZnJlZWRlc2t0b3Aub3JnCmh0dHBzOi8v bGlzdHMuZnJlZWRlc2t0b3Aub3JnL21haWxtYW4vbGlzdGluZm8vZHJpLWRldmVs