From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from mail-wm1-x32e.google.com (mail-wm1-x32e.google.com [IPv6:2a00:1450:4864:20::32e]) by sourceware.org (Postfix) with ESMTPS id 3B7E23887F46 for ; Tue, 15 Nov 2022 11:32:54 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.4.1 sourceware.org 3B7E23887F46 Authentication-Results: sourceware.org; dmarc=none (p=none dis=none) header.from=embecosm.com Authentication-Results: sourceware.org; spf=pass smtp.mailfrom=embecosm.com Received: by mail-wm1-x32e.google.com with SMTP id i186-20020a1c3bc3000000b003cfe29a5733so3034930wma.3 for ; Tue, 15 Nov 2022 03:32:54 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=embecosm.com; s=google; h=in-reply-to:subject:autocrypt:from:references:cc:to :content-language:user-agent:mime-version:date:message-id:from:to:cc :subject:date:message-id:reply-to; bh=JqtTHQo/S4SChHWI50Pmh8Obvx+L7nNn3Fu5lR1/O0s=; b=Aigv486qFoYOOVA5B3CjgLwih9ZGq869/7AqIDmlOj+vQBPtlFtp7N3GBiK/bmlaN/ lXCyqRmwhK7g0fyhnrMODpDVbSC3PP7nQg7XQn6DEgsM/OGeY/JFB2nwSjZ94vLboOOa Bf3CPyJJvXFR5oqJ6XqnzpAMyY8F1nGHK+DvuKqnvQ1m0Dnyogmr7epEf2qJfGXSnmoC LV2MUA71OjUJdq+JvpdiILG5tqRigK1+Y06x2F5auP8sThbk8Lc4eE7Nr39TtTwC7Wzx vDVZVpYPfGakfeUfmtJQ7zh1PhMaCiHbqqsNmnH+eTQ8Cs+jF97fcpQtrQr73GYjr8zI PIqQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=in-reply-to:subject:autocrypt:from:references:cc:to :content-language:user-agent:mime-version:date:message-id :x-gm-message-state:from:to:cc:subject:date:message-id:reply-to; bh=JqtTHQo/S4SChHWI50Pmh8Obvx+L7nNn3Fu5lR1/O0s=; b=4Ae4Ah1e4D70hvoKZdYTQvziMAbQuxL/Nq/xLSxObmZ7ZdgUrgudb38ycFmvzGZTny cNCr+yMgdNYZfN8eiEmREkswWb3qOe6X00vkhqb4fnbqsWP83eXuw+fUf4Vdhsq/92I9 hVBTvKshmYUr0AEcFbI3JjlWKz1FglB33mGpBaX1ZLLEz/zny7rkIO9ndXq+k+N2db2E TESIFQZKEapoGhuiGbR1tr0rcyYn00nRoXAjp/hg3WTWLDgUi8q2LGcYfIcW1tKH/zu/ +8XcdIVgChrGghWDRtTWJDxkK59I0ktQZ5fasbrN2sxMFiqQEKq0Yf9R+ARoYDoTg0yZ a12A== X-Gm-Message-State: ANoB5pnEQgX3Y/7AtpzM+anwEXFwcLRKk6FuYIDNnZheZEcfEGn4/oRP ftrF10IAfuP+Lobvv+l1EL7D X-Google-Smtp-Source: AA0mqf5yzjAk4aIV2CljvzupOM3DBdLZuYGhijeUyu0AVP4Sz481FbFyBi4Pazg2vhHXrvIqrw4dAA== X-Received: by 2002:a05:600c:5563:b0:3cf:8443:e4a with SMTP id ja3-20020a05600c556300b003cf84430e4amr1145266wmb.27.1668511971551; Tue, 15 Nov 2022 03:32:51 -0800 (PST) Received: from ?IPV6:2001:861:5e4c:3bb0:6424:328a:1734:3249? ([2001:861:5e4c:3bb0:6424:328a:1734:3249]) by smtp.gmail.com with ESMTPSA id k34-20020a05600c1ca200b003b47b80cec3sm24105831wms.42.2022.11.15.03.32.50 (version=TLS1_3 cipher=TLS_AES_128_GCM_SHA256 bits=128/128); Tue, 15 Nov 2022 03:32:50 -0800 (PST) Message-ID: Date: Tue, 15 Nov 2022 12:35:54 +0100 MIME-Version: 1.0 User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:102.0) Gecko/20100101 Thunderbird/102.4.1 Content-Language: en-US To: Richard Biener Cc: gcc-patches@gcc.gnu.org, gcc-rust@gcc.gnu.org References: <20221026081811.602573-1-arthur.cohen@embecosm.com> <20221026081811.602573-16-arthur.cohen@embecosm.com> From: Arthur Cohen Autocrypt: addr=arthur.cohen@embecosm.com; keydata= xsFNBGIMH/sBEAC/+yKgi+y9knsqZUNIqlF85v9Lv0lZ2jOUgFgD5R10gz8j39vIYxM/DWA8 BGudqx/s0V3T2arTIJ9u9StA6846SD4lCmdFBUkE0ylOl9UjYrZpoNOYF85TrhwDBB8LxNzo pJxrQIv/WqU2pfs4+QyZuzNPWkGv1b06dDqY1hr7jUxJzAhRklGMyd6kPzr4lJUJLvIPxjQ1 Y+NXAiLrm7n7HqXeHxGBHFwxTRKMb720fcP8pkNQKZNoZBAhNr/665yIH3fV1+D/xsjbVkow BJn5MG3iburNfps50fMNNkBZgzIBRjBxdyJ7iJmpZRQkdLSEf/gpWEc/vUVs8OIdqT60vuFo ueuQUyntFuvGWyCP/o71+eaMdG1Xx8TROJM9usU+Zz3V8GwpPSUUiAI/tDhR/ANtrrJ7jbuh w/9fm7HLovGniQcpN2INgY/Ema3dmU7EWnFqeGymP8R3MQY1Ge8xqlNL1KGrp45ZHp623XgH +IDkvy1ne7RU+WuOPxKKWGeN9LfHNGfTX3ZvFCCxlnbU6KwwoeiLBVdkY1zbgA5LPIPrPtzQ vSPTivQswMkCEVrqLkBYnAXGiavx8V63HltdohJMvkE0wkH3XmsTgrbtqxADlHHz7WZbBWx9 G6OElEThcuT/H/pR9dxr83+qbkUpyIYxW3zP/kpz97oOElSyEQARAQABzShBcnRodXIgQ29o ZW4gPGFydGh1ci5jb2hlbkBlbWJlY29zbS5jb20+wsGOBBMBCAA4FiEEhx8wPNj7cw6CrvzG GzRlsEStnGUFAmIMH/sCGwMFCwkIBwIGFQoJCAsCBBYCAwECHgECF4AACgkQGzRlsEStnGW7 GhAApgjuTe1IRIGxhF8o2VLRYYOHugSI6tNBPpnOjRBbt/Uj5xECBLDtIx+/GR+fUSZ/wRj7 hIpbSoClfnCwQ5/Z0055MY8T9UsCwElOPluzCNmrmRPL2snMsAhhMxDVVtX5xvF25It0qRQJ LVKWiJPoPsQbl3ouaQhPbr2zeIAa74BlWn03zbUJdTXcdjd8+ZBnSGntqwV/hP/g1NwZzuxh roOq1UafPFd3RKwcuIRUkr5JE1ymNP4R8u3GU4/gwGr9s69wIEsBohPowgYGt84ZvLZpt84y Ufsf9CH4OE4/+x1QGumD1b9VcIv5/vZsg7Z8EXKibb6X5TM2vtCcNAHv+0KsERZyLHXn+GOj PQgISzPEcxYkeGNtEnf6IhsIfZyeUe2ZiMPz48Tok9w7r0XfhMCj2SMFjbAFfsufsglDnGO7 CRuCBXtYJYZInmf5XzaQ8FfMRPs9jZeD6SFZjFH00E1o5GLsY9le5euxLo1aLqDNqMp6I8R7 0rK65c7zRAnQ9CO8watmXsBMuJ0Y6Jmf/noFXn8SGVA9b7j+uumum1zToTSmPwhn83X3KwoX TmQ9RD1eiEBJDT9/phSTVDTqhsu8GJVzOIRVXKHxRZLZJo1pGt3YzbDlTshXAV4Ln5YsJIgy AuLU6vmH50QoZhuJK3xMnUaMRdxgyqZe5ACmWXXOwU0EYgwf+wEQAL5Bd4WYiqpsBgW1k/To zz4cThT+CueIqitD5lhTzEJ73SyrAmUiZrkSmR2Vc6G1mJEqozkmeXHjjQ8gMbz6HZBmacnJ hWObf1aUTHjowIsyT0hJJVag1Exq16lBUZCelNG0Jb07TnVWTi/2xHRTLsNVzTQpKnWC3OoA y6M9KwNp5I0hk2cJaFrMjz7/Q16kx8vOov28UcsNDhbq25W64fdEYZApNZI1sKk33tAQj4t0 BxHtG1Hb6EwxbPmVZpL07fmLLVWe3nI5znekXq8AHlUcPGpb4EjUIsmK8+VnGF3f0cDeSupJ WSaHiuufc/jONsM8ZiuYJ6i9Lr8IvgeTUZMXVrjwuIDaMLn5F24dmNSheuwLukQTTiB9LKfU yKZzkFb8Opiqzjng+psvkECIVwk5xaZgraKtivyq+RHGrhSzkJv17QLb7rEiMjKl+20v3xCY l8ogR/7O/slPZMisDV5QOEZEMrWfVYZCW5UIO+vXekTweJxVzPfrkUSpzce67iyeTzzNNwPl FnS/6eB1+IKKAtuxEhbOokBsYf+WnY7xdLGCLyVTXdg99oXZ9AJUUJL3dy9eIggZciQSzkhf eKykoUDmHUAAbWTAxWLwkJ/QBku/Ay5ffRQ9ukhngdu8PsyPGwsOORNIVYbKU0hMtqU7UjOz hVviQufJY2C4KCp5ABEBAAHCwXYEGAEIACAWIQSHHzA82PtzDoKu/MYbNGWwRK2cZQUCYgwf +wIbDAAKCRAbNGWwRK2cZQJ6D/95URtl/eu1akFC1VNqdghWrOAJiL8Jgk53cXug3GXoh8qj DYXT7S6zC6Gyq2nqhGy5JdNmZRdhFCIqZAg2DyBY/1gJEM0yLXEhWZy8AxuUaadAuUG8erdn gXD2az4glSKhjAM5oxRXkWB3P9lr5I2n0Yx7tPlFusfIInV/3RKOYezPS9seoJS31hb6dvYs f3/RGF5Fau3+sm4urTn7zqhqBYgqBmih8sgsifXAzsJ+tO33Cd10SPZmKlKlZWxouTL4Nky6 e2DJHX7phX1DIZBmJBIUvkK6uA7mdJ1yzQonNJq8nABtXBioO+YnP3msZPutEJzGnBjRSpJr 0FULqeIX5JTPqa023Kj2zvnFfqKrT6rgMUomNjQxCryix+EoBUvHcHAyWPQuYb38eV15GqcC jEezziKqTXPBETXkM3rq8+STsSwxn6wz6gwgC1sbj+IXUY2jGzq8fS/99uferADYXEnzKheU 5Q4gWv2XQ/juSJh6AuxTdlr7+5ndAmVUh8U0p47S5ErJnHt1H4pLxIoR7VM9YiIZHn833Xms 2QT2JVIVzL+opHU5XdoXPgd58b8Sxd2j1Fj8LevvZ4isfpr6ZHQ3S0sdOZFtg+Sdnri0Eg+Z g28sczMMKT0W+wb/dpZCA8p3ONJE5hWUhtUpNuhV7j8A4PBVzNHOqPWx7FJmBg== Subject: Re: [PATCH Rust front-end v3 15/46] gccrs: Add expansion pass for the Rust front-end In-Reply-To: Content-Type: multipart/signed; micalg=pgp-sha256; protocol="application/pgp-signature"; boundary="------------cYS53IAKj3fwWfg4hnQnQ018" X-Spam-Status: No, score=-13.7 required=5.0 tests=BAYES_00,DKIM_SIGNED,DKIM_VALID,DKIM_VALID_AU,DKIM_VALID_EF,GIT_PATCH_0,KAM_SHORT,NICE_REPLY_A,RCVD_IN_DNSWL_NONE,SPF_HELO_NONE,SPF_PASS,TXREP autolearn=unavailable autolearn_force=no version=3.4.6 X-Spam-Checker-Version: SpamAssassin 3.4.6 (2021-04-09) on server2.sourceware.org List-Id: This is an OpenPGP/MIME signed message (RFC 4880 and 3156) --------------cYS53IAKj3fwWfg4hnQnQ018 Content-Type: multipart/mixed; boundary="------------AYvxY90qpRvCapR3Ckc3WwUJ"; protected-headers="v1" From: Arthur Cohen To: Richard Biener Cc: gcc-patches@gcc.gnu.org, gcc-rust@gcc.gnu.org Message-ID: Subject: Re: [PATCH Rust front-end v3 15/46] gccrs: Add expansion pass for the Rust front-end References: <20221026081811.602573-1-arthur.cohen@embecosm.com> <20221026081811.602573-16-arthur.cohen@embecosm.com> In-Reply-To: --------------AYvxY90qpRvCapR3Ckc3WwUJ Content-Type: multipart/mixed; boundary="------------MtVlL2u4eFsHe3HNt0Y1s039" --------------MtVlL2u4eFsHe3HNt0Y1s039 Content-Type: text/plain; charset=UTF-8; format=flowed Content-Transfer-Encoding: base64 DQoNCk9uIDExLzEwLzIyIDExOjQ5LCBSaWNoYXJkIEJpZW5lciB3cm90ZToNCj4gT24gV2Vk LCBPY3QgMjYsIDIwMjIgYXQgMTA6MjggQU0gPGFydGh1ci5jb2hlbkBlbWJlY29zbS5jb20+ IHdyb3RlOg0KPj4NCj4+IEZyb206IEFydGh1ciBDb2hlbiA8YXJ0aHVyLmNvaGVuQGVtYmVj b3NtLmNvbT4NCj4+DQo+PiBUaGUgZXhwYW5zaW9uIHBhc3MgaXMgcmVzcG9uc2libGUgZm9y IHR3byBhY3Rpb25zIG9uIG91ciBBU1Q6DQo+Pg0KPj4gMS4gRXhwYW5kaW5nIG1hY3JvIGNh bGxzDQo+PiAyLiBQZXJmb3JtaW5nIGNvbmRpdGlvbmFsIGNvbXBpbGF0aW9uDQo+Pg0KPj4g Q2FsbHMgdG8gbWFjcm9zIHNob3VsZCBiZSBjaGVja2VkIGFuZCBleHBhbmRlZCBpbnRvIGFu IEFTVCBmcmFnbWVudCBiYXNlZCBvbg0KPj4gdGhlIGNvbnRleHQgdGhleSd2ZSBiZWVuIGNh bGxlZCBpbi4gVGhpcyBpcyBzaW1pbGFyIHRvIHRva2VuIHN1YnN0aXR1dGlvbiwgd2l0aA0K Pj4gYSBsb3Qgb2YgaW50cmljYWNpZXMgYW5kIGNoZWNrcyBiZWluZyBwZXJmb3JtZWQuIEEg c2luZ2xlIGludm9jYXRpb24gY2FuIHJlc3VsdA0KPj4gaW4gYW4gQVNUIGZyYWdtZW50IGNv bnRhaW5pbmcgbXVsdGlwbGUgc3RhdGVtZW50cyBvciBtdWx0aXBsZSBleHByZXNzaW9ucywN Cj4+IHdoaWNoIG5lZWQgdG8gYmUgaGFuZGxlZCBhcyB3ZWxsLiBGdXJ0aGVybW9yZSwgUnVz dCBtYWNyb3MgY2FuIGNvbnRhaW4NCj4+IHJlcGV0aXRpb25zIHJlbHlpbmcgb24gS2xlaW5l IG9wZXJhdG9ycywgc2ltaWxhciB0byByZWd1bGFyIGV4cHJlc3Npb24NCj4+IHBhdHRlcm5z LCB0aGF0IGFsc28gbmVlZCB0byBiZSBleHBhbmRlZCBwcm9wZXJseS4NCj4+DQo+PiBGaW5h bGx5LCBSdXN0IGNvZGUgY2FuIGJlIGhpZGRlbiBiZWhpbmQgYGNmZ2AgZGlyZWN0aXZlcywg d2hpY2ggYWxsb3cgdGhlIHVzZXINCj4+IHRvIHBlcmZvcm0gY29uZGl0aW9uYWwgY29tcGls YXRpb24uIElmIGEgYGNmZ2AgcHJlZGljYXRlIGlzIG5vdCBtZXQsIHRoZQ0KPj4gZXhwcmVz c2lvbiBvciBzdGF0ZW1lbnQgaXQgcmVmZXJzIHRvIHNob3VsZCBiZSBtYXJrZWQgZm9yIHN0 cmlwIGFuZCByZW1vdmVkDQo+PiBmcm9tIHRoZSBBU1QuDQo+IA0KPiBJJ20ganVzdCBwaWNr aW5nIG9uZSBvZiB0aGUgcHVyZWx5IHJ1c3QgZnJvbnRlbmQgc3BlY2lmaWMgcGF0Y2hlcyBh cyBleGFtcGxlIGFuZA0KPiBkbyBub3QgcGxhbiB0byBsb29rIG9uIG90aGVycyAtIEkgZG9u J3QgdGhpbmsgbWVhbmluZ2Z1bCByZXZpZXcgY2FuIGhhcHBlbiBieQ0KPiBzb21lYm9keSBu b3QgZGVlcGx5IHVuZGVyc3RhbmRpbmcgcnVzdCBvciB0aGlzIGZyb250ZW5kIGNhbiBiZSBk b25lIHdoaWNoIG1lYW5zDQo+IGFwcHJvdmFsIG9mIHRob3NlIHBhcnRzIHNob3VsZG4ndCBi ZSBuZWVkZWQgYnV0IHdvdWxkIGJlIGNvdmVyZWQgKGV2ZW4NCj4gdGhlIGluaXRpYWwNCj4g Y29udHJpYnV0aW9uKSBieSB5b3VyIG1haW50YWluZXJzaGlwIG9mIHRoZSBjb2RlLg0KPiAN Cj4gVGhlIGNvbW1pdCBjb21tZW50IGFib3ZlIGlzIHF1aXRlIGhlbHBmdWwgaW4gZ2V0dGlu ZyBhbiBpZGVhIG9mIHdoYXQgdGhpcyBwYXJ0DQo+IG9mIHRoZSBydXN0IGZyb250ZW5kIGlz IGRvaW5nLiAgSSdkIGFwcHJlY2lhdGUgaWYgc29tZXRoaW5nIGFsb25nIHRoZXNlIGxpbmVz DQo+IHdvdWxkIGJlIGFkZGVkIHRvIGVhY2ggb2YgdGhlIGluZGl2aWR1YWwgc291cmNlIGZp bGVzIChwcmVmZXJhYmx5IHRoZQ0KPiBpbXBsZW1lbnRhdGlvbiwgbm90IHRoZSBoZWFkZXIp Lg0KDQpJcyB0aGVyZSBhbnkgcmVhc29uIGFzIHRvIHdoeSB0aGUgaW1wbGVtZW50YXRpb24g c2hvdWxkIGJlIHByZWZlcmVkIG92ZXIgDQp0aGUgaGVhZGVyPyBUaGlzIGlzIGEgY29tbWVu dCB5b3UgYWxzbyBtYWtlIGRvd24gdGhlIGxpbmUgb24gb25lIG9mIG91ciANCmZ1bmN0aW9u J3MgZG9jdW1lbnRhdGlvbi4gTXkgdmlldyBpcyB0aGF0IHRoZSBoZWFkZXIgc2hvdWxkIGJl IGtlcHQgYXMgDQpzaW1wbGUgYW5kIHBvc3NpYmxlLCB3aXRoIGFzIGxpdHRsZSBjb2RlIGFz IHBvc3NpYmxlLCBhbmQgdGhhdCBpdCBpcyANCmVhc3kgdG8gZmluZCBkb2N1bWVudGF0aW9u IGFyb3VuZCBmdW5jdGlvbiBkZWNsYXJhdGlvbnMsIG11Y2ggZWFzaWVyIA0KdGhhbiB0byBm aW5kIGl0IGluIHRoZSBpbXBsZW1lbnRhdGlvbiB3aGVuIGNvZGUgYmxvY2tzIGFyZSBwcmVz ZW50IGFsbCANCmFyb3VuZC4NCg0KVG8gYmUgY2xlYXIsIEknbSBub3Qgb3Bwb3NlZCB0byBz d2l0Y2hpbmcgdGhlIGRvY3VtZW50YXRpb24gb3ZlciB0byBvdXIgDQppbXBsZW1lbnRhdGlv biAtIGp1c3QgbG9va2luZyB0byB1bmRlcnN0YW5kLiBXZSdsbCBtYWtlIHRoZSBuZWNlc3Nh cnkgDQpjaGFuZ2VzLg0KDQo+IERvY3VtZW50YXRpb24gb2YgdGhlIHN1Yi1kaXJlY3Rvcnkg c3RydWN0dXJlIHdvdWxkDQo+IGFsc28gYmUgbmljZSwNCj4gd2UgaGF2ZSAoaGFkIC4uKSBz b3VyY2VidWlsZC50ZXhpIHdoaWNoIGNvbnRhaW5zIHNvbWUgb2YgdGhhdCBidXQgbm90IHJl YWxseSBmb3INCj4gc3BlY2lmaWMgZnJvbnRlbmRzIChzb2ZhcikuDQoNClJpZ2h0LiBXZSB3 aWxsIHdvcmsgb24gYWRkaW5nIHByb3BlciBkb2N1bWVudGF0aW9uIEFTQVAuDQoNCj4gU29t ZSBjb21tZW50cyBvbiB0aGlzIHBhcnRpY3VsYXIgcGF0Y2ggdGhhdCBwcm9iYWJseSBhcHBs eSB0byBhbGwgb3RoZXJzIGFzIHdlbGwNCj4gaW5saW5lIGJlbG93Lg0KPiANCj4+IENvLWF1 dGhvcmVkLWJ5OiBQaGlsaXAgSGVycm9uIDxwaGlsaXAuaGVycm9uQGVtYmVjb3NtLmNvbT4N Cj4+IENvLWF1dGhvcmVkLWJ5OiBUaGUgT3RoZXIgPHNpbXBseXRoZW90aGVyQGdtYWlsLmNv bT4NCj4+IC0tLQ0KPj4gICBnY2MvcnVzdC9leHBhbmQvcnVzdC1hdHRyaWJ1dGUtdmlzaXRv ci5jYyAgICB8IDM0NDUgKysrKysrKysrKysrKysrKysrDQo+PiAgIGdjYy9ydXN0L2V4cGFu ZC9ydXN0LWF0dHJpYnV0ZS12aXNpdG9yLmggICAgIHwgIDMxNiArKw0KPj4gICBnY2MvcnVz dC9leHBhbmQvcnVzdC1tYWNyby1idWlsdGlucy5jYyAgICAgICB8ICA0ODQgKysrDQo+PiAg IGdjYy9ydXN0L2V4cGFuZC9ydXN0LW1hY3JvLWJ1aWx0aW5zLmggICAgICAgIHwgIDEwNyAr DQo+PiAgIGdjYy9ydXN0L2V4cGFuZC9ydXN0LW1hY3JvLWV4cGFuZC5jYyAgICAgICAgIHwg MTAxMiArKysrKw0KPj4gICBnY2MvcnVzdC9leHBhbmQvcnVzdC1tYWNyby1leHBhbmQuaCAg ICAgICAgICB8ICAzNjYgKysNCj4+ICAgZ2NjL3J1c3QvZXhwYW5kL3J1c3QtbWFjcm8taW52 b2MtbGV4ZXIuY2MgICAgfCAgIDI5ICsNCj4+ICAgZ2NjL3J1c3QvZXhwYW5kL3J1c3QtbWFj cm8taW52b2MtbGV4ZXIuaCAgICAgfCAgIDY0ICsNCj4+ICAgZ2NjL3J1c3QvZXhwYW5kL3J1 c3QtbWFjcm8tc3Vic3RpdHV0ZS1jdHguY2MgfCAgMzEyICsrDQo+PiAgIGdjYy9ydXN0L2V4 cGFuZC9ydXN0LW1hY3JvLXN1YnN0aXR1dGUtY3R4LmggIHwgICA5MyArDQo+PiAgIDEwIGZp bGVzIGNoYW5nZWQsIDYyMjggaW5zZXJ0aW9ucygrKQ0KPj4gICBjcmVhdGUgbW9kZSAxMDA2 NDQgZ2NjL3J1c3QvZXhwYW5kL3J1c3QtYXR0cmlidXRlLXZpc2l0b3IuY2MNCj4+ICAgY3Jl YXRlIG1vZGUgMTAwNjQ0IGdjYy9ydXN0L2V4cGFuZC9ydXN0LWF0dHJpYnV0ZS12aXNpdG9y LmgNCj4+ICAgY3JlYXRlIG1vZGUgMTAwNjQ0IGdjYy9ydXN0L2V4cGFuZC9ydXN0LW1hY3Jv LWJ1aWx0aW5zLmNjDQo+PiAgIGNyZWF0ZSBtb2RlIDEwMDY0NCBnY2MvcnVzdC9leHBhbmQv cnVzdC1tYWNyby1idWlsdGlucy5oDQo+PiAgIGNyZWF0ZSBtb2RlIDEwMDY0NCBnY2MvcnVz dC9leHBhbmQvcnVzdC1tYWNyby1leHBhbmQuY2MNCj4+ICAgY3JlYXRlIG1vZGUgMTAwNjQ0 IGdjYy9ydXN0L2V4cGFuZC9ydXN0LW1hY3JvLWV4cGFuZC5oDQo+PiAgIGNyZWF0ZSBtb2Rl IDEwMDY0NCBnY2MvcnVzdC9leHBhbmQvcnVzdC1tYWNyby1pbnZvYy1sZXhlci5jYw0KPj4g ICBjcmVhdGUgbW9kZSAxMDA2NDQgZ2NjL3J1c3QvZXhwYW5kL3J1c3QtbWFjcm8taW52b2Mt bGV4ZXIuaA0KPj4gICBjcmVhdGUgbW9kZSAxMDA2NDQgZ2NjL3J1c3QvZXhwYW5kL3J1c3Qt bWFjcm8tc3Vic3RpdHV0ZS1jdHguY2MNCj4+ICAgY3JlYXRlIG1vZGUgMTAwNjQ0IGdjYy9y dXN0L2V4cGFuZC9ydXN0LW1hY3JvLXN1YnN0aXR1dGUtY3R4LmgNCj4+DQo+PiBkaWZmIC0t Z2l0IGEvZ2NjL3J1c3QvZXhwYW5kL3J1c3QtYXR0cmlidXRlLXZpc2l0b3IuY2MgYi9nY2Mv cnVzdC9leHBhbmQvcnVzdC1hdHRyaWJ1dGUtdmlzaXRvci5jYw0KPj4gbmV3IGZpbGUgbW9k ZSAxMDA2NDQNCj4+IGluZGV4IDAwMDAwMDAwMDAwLi44MDE2Zjk0MzBlYg0KPj4gLS0tIC9k ZXYvbnVsbA0KPj4gKysrIGIvZ2NjL3J1c3QvZXhwYW5kL3J1c3QtYXR0cmlidXRlLXZpc2l0 b3IuY2MNCj4+IEBAIC0wLDAgKzEsMzQ0NSBAQA0KPj4gKy8vIENvcHlyaWdodCAoQykgMjAy MC0yMDIyIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLg0KPj4gKw0KPj4gKy8vIFRo aXMgZmlsZSBpcyBwYXJ0IG9mIEdDQy4NCj4+ICsNCj4+ICsvLyBHQ0MgaXMgZnJlZSBzb2Z0 d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdCB1bmRlcg0K Pj4gKy8vIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMg cHVibGlzaGVkIGJ5IHRoZSBGcmVlDQo+PiArLy8gU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0 aGVyIHZlcnNpb24gMywgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXINCj4+ICsvLyB2 ZXJzaW9uLg0KPj4gKw0KPj4gKy8vIEdDQyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0 aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVCBBTlkNCj4+ICsvLyBXQVJSQU5U WTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElU WSBvcg0KPj4gKy8vIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRo ZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQ0KPj4gKy8vIGZvciBtb3JlIGRldGFpbHMu DQo+PiArDQo+PiArLy8gWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUg R05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UNCj4+ICsvLyBhbG9uZyB3aXRoIEdDQzsgc2Vl IHRoZSBmaWxlIENPUFlJTkczLiAgSWYgbm90IHNlZQ0KPj4gKy8vIDxodHRwOi8vd3d3Lmdu dS5vcmcvbGljZW5zZXMvPi4NCj4+ICsNCj4+ICsjaW5jbHVkZSAicnVzdC1hdHRyaWJ1dGUt dmlzaXRvci5oIg0KPj4gKyNpbmNsdWRlICJydXN0LXNlc3Npb24tbWFuYWdlci5oIg0KPj4g Kw0KPj4gK25hbWVzcGFjZSBSdXN0IHsNCj4+ICsNCj4+ICsvLyBWaXNpdG9yIHVzZWQgdG8g ZXhwYW5kIGF0dHJpYnV0ZXMuDQo+PiArdm9pZA0KPj4gK0F0dHJWaXNpdG9yOjpleHBhbmRf c3RydWN0X2ZpZWxkcyAoc3RkOjp2ZWN0b3I8QVNUOjpTdHJ1Y3RGaWVsZD4gJmZpZWxkcykN Cj4+ICt7DQo+PiArICBmb3IgKGF1dG8gaXQgPSBmaWVsZHMuYmVnaW4gKCk7IGl0ICE9IGZp ZWxkcy5lbmQgKCk7KQ0KPj4gKyAgICB7DQo+PiArICAgICAgYXV0byAmZmllbGQgPSAqaXQ7 DQo+PiArDQo+PiArICAgICAgYXV0byAmZmllbGRfYXR0cnMgPSBmaWVsZC5nZXRfb3V0ZXJf YXR0cnMgKCk7DQo+PiArICAgICAgZXhwYW5kZXIuZXhwYW5kX2NmZ19hdHRycyAoZmllbGRf YXR0cnMpOw0KPj4gKyAgICAgIGlmIChleHBhbmRlci5mYWlsc19jZmdfd2l0aF9leHBhbmQg KGZpZWxkX2F0dHJzKSkNCj4+ICsgICAgICAgew0KPj4gKyAgICAgICAgIGl0ID0gZmllbGRz LmVyYXNlIChpdCk7DQo+PiArICAgICAgICAgY29udGludWU7DQo+PiArICAgICAgIH0NCj4+ ICsNCj4+ICsgICAgICBleHBhbmRlci5wdXNoX2NvbnRleHQgKE1hY3JvRXhwYW5kZXI6OkNv bnRleHRUeXBlOjpUWVBFKTsNCj4+ICsNCj4+ICsgICAgICAvLyBleHBhbmQgc3ViLXR5cGVz IG9mIHR5cGUsIGJ1dCBjYW4ndCBzdHJpcCB0eXBlIGl0c2VsZg0KPj4gKyAgICAgIGF1dG8g JnR5cGUgPSBmaWVsZC5nZXRfZmllbGRfdHlwZSAoKTsNCj4+ICsgICAgICB0eXBlLT5hY2Nl cHRfdmlzICgqdGhpcyk7DQo+PiArDQo+PiArICAgICAgbWF5YmVfZXhwYW5kX3R5cGUgKHR5 cGUpOw0KPj4gKw0KPj4gKyAgICAgIGlmICh0eXBlLT5pc19tYXJrZWRfZm9yX3N0cmlwICgp KQ0KPj4gKyAgICAgICBydXN0X2Vycm9yX2F0ICh0eXBlLT5nZXRfbG9jdXMgKCksDQo+PiAr ICAgICAgICAgICAgICAgICAgICAgICJjYW5ub3Qgc3RyaXAgdHlwZSBpbiB0aGlzIHBvc2l0 aW9uIik7DQo+PiArDQo+PiArICAgICAgZXhwYW5kZXIucG9wX2NvbnRleHQgKCk7DQo+PiAr DQo+PiArICAgICAgLy8gaWYgbm90aGluZyBlbHNlIGhhcHBlbnMsIGluY3JlbWVudA0KPj4g KyAgICAgICsraXQ7DQo+PiArICAgIH0NCj4+ICt9DQo+PiArDQo+IA0KPiBUaGUgY29kaW5n IGNvbnZlbnRpb25zIHdhcnJhbnQgYSBmdW5jdGlvbiBsZXZlbCBjb21tZW50IGZvciBlYWNo IGZ1bmN0aW9uLg0KPiBJZiB0aGVyZSdzIGFueXRoaW5nIG1lYW5pbmdmdWwgdG8gc2F5IChp biB0aGlzIGNhc2UgIi8vIGV4cGFuZCB0dXBsZSBmaWVsZHMiDQo+IHdvdWxkbid0IGJlIG1l YW5pbmdmdWwpIHBsZWFzZSBjb25zaWRlciBhZGRpbmcgc3VjaCB0byBhbGwgZnVuY3Rpb25z LiAgSW4NCj4gbXkgdmlldyBldmVyeSBmdW5jdGlvbiB0aGF0IGRvZXNuJ3QgZml0IGluIGEg ODB4MjQgdGVybWluYWwgd2FycmFudHMgb25lLg0KPg0KPj4gK3ZvaWQNCj4+ICtBdHRyVmlz aXRvcjo6ZXhwYW5kX3R1cGxlX2ZpZWxkcyAoc3RkOjp2ZWN0b3I8QVNUOjpUdXBsZUZpZWxk PiAmZmllbGRzKQ0KPj4gK3sNCj4+ICsgIGZvciAoYXV0byBpdCA9IGZpZWxkcy5iZWdpbiAo KTsgaXQgIT0gZmllbGRzLmVuZCAoKTspDQo+PiArICAgIHsNCj4+ICsgICAgICBhdXRvICZm aWVsZCA9ICppdDsNCj4+ICsNCj4+ICsgICAgICBhdXRvICZmaWVsZF9hdHRycyA9IGZpZWxk LmdldF9vdXRlcl9hdHRycyAoKTsNCj4+ICsgICAgICBleHBhbmRlci5leHBhbmRfY2ZnX2F0 dHJzIChmaWVsZF9hdHRycyk7DQo+PiArICAgICAgaWYgKGV4cGFuZGVyLmZhaWxzX2NmZ193 aXRoX2V4cGFuZCAoZmllbGRfYXR0cnMpKQ0KPj4gKyAgICAgICB7DQo+PiArICAgICAgICAg aXQgPSBmaWVsZHMuZXJhc2UgKGl0KTsNCj4+ICsgICAgICAgICBjb250aW51ZTsNCj4+ICsg ICAgICAgfQ0KPj4gKw0KPj4gKyAgICAgIC8vIGV4cGFuZCBzdWItdHlwZXMgb2YgdHlwZSwg YnV0IGNhbid0IHN0cmlwIHR5cGUgaXRzZWxmDQo+PiArICAgICAgYXV0byAmdHlwZSA9IGZp ZWxkLmdldF9maWVsZF90eXBlICgpOw0KPj4gKyAgICAgIHR5cGUtPmFjY2VwdF92aXMgKCp0 aGlzKTsNCj4+ICsgICAgICBpZiAodHlwZS0+aXNfbWFya2VkX2Zvcl9zdHJpcCAoKSkNCj4+ ICsgICAgICAgcnVzdF9lcnJvcl9hdCAodHlwZS0+Z2V0X2xvY3VzICgpLA0KPj4gKyAgICAg ICAgICAgICAgICAgICAgICAiY2Fubm90IHN0cmlwIHR5cGUgaW4gdGhpcyBwb3NpdGlvbiIp Ow0KPiANCj4gV2hlbiByZWFkaW5nIHRoZSBvdGhlciBwYXRjaGVzIEkgd29uZGVyZWQgd2hl dGhlciBydXN0X2Vycm9yX2F0IGFyZQ0KPiB1c2VyLWZhY2luZyBkaWFnbm9zdGljcyBvciBp bnRlcm5hbCBlcnJvcnM/DQo+IA0KPj4gKw0KPj4gKyAgICAgIC8vIGlmIG5vdGhpbmcgZWxz ZSBoYXBwZW5zLCBpbmNyZW1lbnQNCj4+ICsgICAgICArK2l0Ow0KPj4gKyAgICB9DQo+PiAr fQ0KPj4gKw0KPj4gK3ZvaWQNCj4+ICtBdHRyVmlzaXRvcjo6ZXhwYW5kX2Z1bmN0aW9uX3Bh cmFtcyAoc3RkOjp2ZWN0b3I8QVNUOjpGdW5jdGlvblBhcmFtPiAmcGFyYW1zKQ0KPj4gK3sN Cj4+ICsgIGV4cGFuZGVyLnB1c2hfY29udGV4dCAoTWFjcm9FeHBhbmRlcjo6Q29udGV4dFR5 cGU6OlRZUEUpOw0KPj4gKw0KPj4gKyAgZm9yIChhdXRvIGl0ID0gcGFyYW1zLmJlZ2luICgp OyBpdCAhPSBwYXJhbXMuZW5kICgpOykNCj4+ICsgICAgew0KPj4gKyAgICAgIGF1dG8gJnBh cmFtID0gKml0Ow0KPj4gKw0KPj4gKyAgICAgIGF1dG8gJnBhcmFtX2F0dHJzID0gcGFyYW0u Z2V0X291dGVyX2F0dHJzICgpOw0KPj4gKyAgICAgIGV4cGFuZGVyLmV4cGFuZF9jZmdfYXR0 cnMgKHBhcmFtX2F0dHJzKTsNCj4+ICsgICAgICBpZiAoZXhwYW5kZXIuZmFpbHNfY2ZnX3dp dGhfZXhwYW5kIChwYXJhbV9hdHRycykpDQo+PiArICAgICAgIHsNCj4+ICsgICAgICAgICBp dCA9IHBhcmFtcy5lcmFzZSAoaXQpOw0KPj4gKyAgICAgICAgIGNvbnRpbnVlOw0KPj4gKyAg ICAgICB9DQo+PiArDQo+PiArICAgICAgLy8gVE9ETzogc2hvdWxkIGFuIHVud2FudGVkIHN0 cmlwIGxlYWQgdG8gYnJlYWsgb3V0IG9mIGxvb3A/DQo+PiArICAgICAgYXV0byAmcGF0dGVy biA9IHBhcmFtLmdldF9wYXR0ZXJuICgpOw0KPiANCj4gJ2F1dG8nIGlzIHVzZWQgYSBsb3Qg aW4gdGhlIGZyb250ZW5kLCBpdCBkb2VzIG1ha2UgcmVhZGluZyBjb2RlIGhhcmRlciBiZWNh dXNlDQo+IGNyaXRpY2FsIGluZm9ybWF0aW9uIG9uIGNvbnRleHQgaXMgbG9zdC4gIEhlcmUg SSBjYW4gYXQgbGVhc3QgMm5kIGd1ZXNzDQo+ICdwYXJhbScgYmVpbmcgb2YgdHlwZSBBU1Q6 OkZ1bmN0aW9uUGFyYW0gYW5kIHRodXMgZmluZCBnZXRfcGF0dGVybiAoKSwNCj4gYnV0IEkg d2lsbCBoYXZlIHRvIGZpbmQgdGhhdCB0byBiZSBhYmxlIHRvIGZpbmQgYWNjZXB0X3ZpcyAo KSBiZWxvdy4NCj4gDQo+IEluIG15IG1pbmQgJ2F1dG8nIGlzIHVzZWZ1bCB3aGVuIGl0IGhp ZGVzIGluZm9ybWF0aW9uIHRoYXQncyBub3QgdXNlZCBhcyBpbg0KPiANCj4gICBmb3IgKGF1 dG8gaXQgPSAuLi4pDQo+ICAgICB7DQo+ICAgICAgICBBU1Q6OkZ1bmN0aW9uUGFyYW0gJnBh cmFtID0gKml0Ow0KPiANCj4gYnV0IG5vdCBzbyBtdWNoIGZvciBiZWluZyBsYXp5IHdoZW4g dHlwaW5nLg0KPiANCj4gQXQgbGVhc3Qgd2l0aCAoc29tZSBvZikgdGhlIHVzZXMgdGhlIGlk ZW50aWZpZXJzIG9mIHRoZSBtZXRob2RzIGxvb2sNCj4gdW5pcXVlIGVub3VnaCBzbyBncmVw IHdpbGwgYmUgb2YgaGVscCwgT1RPSCBpc19tYXJrZWRfZm9yX3N0cmlwDQo+IGlzIGRlZmlu ZWQgYSBsb3QuDQo+IA0KDQpJIHRoaW5rIHJlbW92aW5nIGFsbCB0aGUgYGF1dG9gcyBmcm9t IHRoZSBnY2NycyBjb2RlYmFzZSB3b3VsZCBiZSBhIA0KaGVyY3VsZWFuIHRhc2sgYXQgdGhp cyBwb2ludCwgYXMgYSBxdWljayBncmVwIGZvciAnYXV0byAnIGluIG91ciANCmZyb250ZW5k IHJldmVhbHMgYXJvdW5kIDI3MDAgbWF0Y2hlcy4NCg0KIEZyb20gdGhlIGxpdHRsZSByZXNl YXJjaCBJIGRpZCwgaXQgc2VlbXMgdGhlIEMrKyBmcm9udGVuZCBhbHNvIHVzZXMgaXQgDQpz b21ld2hhdCwgYXMgd2VsbCBhcyB0aGUgRCBmcm9udGVuZCAoYnV0IHRoYXQgZnJvbnRlbmQg aXMgd3JpdHRlbiBpbiBELCANCnNvIHRoYXQgbWlnaHQgYmUgbW9vdCkuDQoNClBhaXJlZCB3 aXRoIGRlc2NyaXB0aXZlIHZhcmlhYmxlIG5hbWVzIGFuZCBzaG9ydCBmdW5jdGlvbnMsIEkg cGVyc29uYWxseSANCmRvbid0IGhhdmUgYW4gaXNzdWUgd2l0aCByZXZpZXdpbmcgY29kZSB0 aGF0IHVzZXMgYGF1dG9gIGJ1dCBJIHNlZSBob3cgDQp0aGF0IG1pZ2h0IGJlIHRoZSBjYXNl LCBlc3BlY2lhbGx5IGZvciBzb21lb25lIHdobyBpcyBub3QgZmFtaWxpYXIgd2l0aCANCm91 ciBmcm9udGVuZC4NCg0KU28gSSB0aGluayB0aGUgcXVlc3Rpb24gSSdtIGFza2luZyBpcyBh cyBmb2xsb3dzOiBjb25zaWRlcmluZyBQaGlsaXAgYW5kIA0KSSB3aWxsIGJlIHJldmlld2Vy cyBvZiB0aGUgUnVzdCBmcm9udGVuZCBwYXJ0IHNwZWNpZmljYWxseSwgaXMgaXQgb2theSAN CnRvIG5vdCBtYWtlIHN1Y2ggYSBodWdlIGNoYW5nZSB0byB0aGUgZnJvbnRlbmQgd2hpY2gg d291bGQgY29zdCB1cyBhIGxvdCANCm9mIHRpbWUgd2hpbGUgbm90IG5lY2Vzc2FyaWx5IG1h a2luZyBhIGRpZmZlcmVuY2UgdG8gdXM/IEFnYWluLCBJIA0KdW5kZXJzdGFuZCB0aGF0IHRo aXMgbWFrZXMgYSBkaWZmZXJlbmNlIHRvIHNvbWUgcGVvcGxlLCBidXQgYXMgeW91IA0KbWVu dGlvbmVkIEknbSBub3Qgc3VyZSBhbnlvbmUgd291bGQgYmUgd2lsbGluZyB0byByZXZpZXcg YWxsIG9mIG91ciANCmZyb250ZW5kIGNvZGUsIGVzcGVjaWFsbHkgYXMgaXQgY29udGFpbnMg YXJvdW5kIDE2MCAwMDAgbGluZXMgb2YgY29kZS4NCg0KRnVydGhlcmluZyBteSBwb2ludCBv biB0aGUgRCBmcm9udGVuZDogaXQncyBhbHNvIG5vIHNlY3JldCB0aGF0IHdlIHdvdWxkIA0K bGlrZSB0byByZXdyaXRlIHNvbWUgcGFydHMgb2YgdGhlIGZyb250ZW5kIGluIFJ1c3QgaW4g dGhlIGZ1dHVyZSwgYXMgYSANCmZ1bmN0aW9uYWwgcHJvZ3JhbW1pbmcgbGFuZ3VhZ2UgaXMg d2VsbCBzdWl0ZWQgdG8gdGhlIGNvbXBpbGF0aW9uIG9mIA0KUnVzdC4gV2hlbiB0aGF0IGlz IHRoZSBjYXNlLCB3ZSB3aWxsIHVzZSB3aGF0IEkgd291bGQgY29uc2lkZXIgDQoiaWRpb21h dGljIFJ1c3QiLCB3aGljaCBtYWtlcyBoZWF2eSB1c2Ugb2YgdGhlIGBsZXRgIGtleXdvcmQg KHNpbWlsYXIgaW4gDQptYW55IHdheXMgdG8gYGF1dG9gKSBhbmQgdHlwZSBpbmZlcmVuY2Uu IFR5cGVzIGFyZSByYXJlbHkgZXhwbGljaXRseSANCnNwZWNpZmllZCBmb3IgdmFyaWFibGVz LCBidXQgYXJlIGFsd2F5cyBzcGVjaWZpZWQgZm9yIGZ1bmN0aW9uIGFyZ3VtZW50cyANCm9y IGZ1bmN0aW9uIHJldHVybiB0eXBlcyAoYXMgd2UgZG8gcHJlc2VudGx5IGluIHRoZSBDKysg aW1wbGVtZW50YXRpb24gDQpvZiBvdXIgZnJvbnRlbmQpLg0KDQo+PiArICAgICAgcGF0dGVy bi0+YWNjZXB0X3ZpcyAoKnRoaXMpOw0KPj4gKyAgICAgIGlmIChwYXR0ZXJuLT5pc19tYXJr ZWRfZm9yX3N0cmlwICgpKQ0KPj4gKyAgICAgICBydXN0X2Vycm9yX2F0IChwYXR0ZXJuLT5n ZXRfbG9jdXMgKCksDQo+PiArICAgICAgICAgICAgICAgICAgICAgICJjYW5ub3Qgc3RyaXAg cGF0dGVybiBpbiB0aGlzIHBvc2l0aW9uIik7DQo+PiArDQo+PiArICAgICAgYXV0byAmdHlw ZSA9IHBhcmFtLmdldF90eXBlICgpOw0KPj4gKyAgICAgIHR5cGUtPmFjY2VwdF92aXMgKCp0 aGlzKTsNCj4+ICsNCj4+ICsgICAgICBtYXliZV9leHBhbmRfdHlwZSAodHlwZSk7DQo+PiAr DQo+PiArICAgICAgaWYgKHR5cGUtPmlzX21hcmtlZF9mb3Jfc3RyaXAgKCkpDQo+PiArICAg ICAgIHJ1c3RfZXJyb3JfYXQgKHR5cGUtPmdldF9sb2N1cyAoKSwNCj4+ICsgICAgICAgICAg ICAgICAgICAgICAgImNhbm5vdCBzdHJpcCB0eXBlIGluIHRoaXMgcG9zaXRpb24iKTsNCj4+ ICsNCj4+ICsgICAgICAvLyBpbmNyZW1lbnQNCj4+ICsgICAgICArK2l0Ow0KPj4gKyAgICB9 DQo+PiArDQo+PiArICBleHBhbmRlci5wb3BfY29udGV4dCAoKTsNCj4+ICt9DQo+PiArDQo+ PiArdm9pZA0KPj4gK0F0dHJWaXNpdG9yOjpleHBhbmRfZ2VuZXJpY19hcmdzIChBU1Q6Okdl bmVyaWNBcmdzICZhcmdzKQ0KPj4gK3sNCj4+ICsgIC8vIGxpZmV0aW1lIGFyZ3MgY2FuJ3Qg YmUgZXhwYW5kZWQNCj4+ICsgIC8vIEZJWE1FOiBDYW4gd2UgaGF2ZSBtYWNybyBpbnZvY2F0 aW9ucyBmb3IgbGlmZXRpbWVzPw0KPj4gKw0KPj4gKyAgZXhwYW5kZXIucHVzaF9jb250ZXh0 IChNYWNyb0V4cGFuZGVyOjpDb250ZXh0VHlwZTo6VFlQRSk7DQo+PiArDQo+PiArICAvLyBl eHBhbmQgdHlwZSBhcmdzIC0gc3RyaXAgc3ViLXR5cGVzIG9ubHkNCj4+ICsgIGZvciAoYXV0 byAmYXJnIDogYXJncy5nZXRfZ2VuZXJpY19hcmdzICgpKQ0KPj4gKyAgICB7DQo+PiArICAg ICAgc3dpdGNoIChhcmcuZ2V0X2tpbmQgKCkpDQo+PiArICAgICAgIHsNCj4+ICsgICAgICAg ICBjYXNlIEFTVDo6R2VuZXJpY0FyZzo6S2luZDo6VHlwZTogew0KPj4gKyAgICAgICAgICAg YXV0byAmdHlwZSA9IGFyZy5nZXRfdHlwZSAoKTsNCj4+ICsgICAgICAgICAgIHR5cGUtPmFj Y2VwdF92aXMgKCp0aGlzKTsNCj4+ICsgICAgICAgICAgIG1heWJlX2V4cGFuZF90eXBlICh0 eXBlKTsNCj4+ICsNCj4+ICsgICAgICAgICAgIGlmICh0eXBlLT5pc19tYXJrZWRfZm9yX3N0 cmlwICgpKQ0KPj4gKyAgICAgICAgICAgICBydXN0X2Vycm9yX2F0ICh0eXBlLT5nZXRfbG9j dXMgKCksDQo+PiArICAgICAgICAgICAgICAgICAgICAgICAgICAgICJjYW5ub3Qgc3RyaXAg dHlwZSBpbiB0aGlzIHBvc2l0aW9uIik7DQo+PiArICAgICAgICAgICBicmVhazsNCj4+ICsg ICAgICAgICB9DQo+PiArICAgICAgICAgY2FzZSBBU1Q6OkdlbmVyaWNBcmc6OktpbmQ6OkNv bnN0OiB7DQo+PiArICAgICAgICAgICBhdXRvICZleHByID0gYXJnLmdldF9leHByZXNzaW9u ICgpOw0KPj4gKyAgICAgICAgICAgZXhwci0+YWNjZXB0X3ZpcyAoKnRoaXMpOw0KPj4gKyAg ICAgICAgICAgbWF5YmVfZXhwYW5kX2V4cHIgKGV4cHIpOw0KPj4gKw0KPj4gKyAgICAgICAg ICAgaWYgKGV4cHItPmlzX21hcmtlZF9mb3Jfc3RyaXAgKCkpDQo+PiArICAgICAgICAgICAg IHJ1c3RfZXJyb3JfYXQgKGV4cHItPmdldF9sb2N1cyAoKSwNCj4+ICsgICAgICAgICAgICAg ICAgICAgICAgICAgICAgImNhbm5vdCBzdHJpcCBleHByZXNzaW9uIGluIHRoaXMgcG9zaXRp b24iKTsNCj4+ICsgICAgICAgICAgIGJyZWFrOw0KPj4gKyAgICAgICAgIH0NCj4+ICsgICAg ICAgZGVmYXVsdDoNCj4+ICsgICAgICAgICBicmVhazsNCj4+ICsgICAgICAgICAvLyBGSVhN RTogRmlndXJlIG91dCB3aGF0IHRvIGRvIGhlcmUgaWYgdGhlcmUgaXMgYW1iaWd1aXR5LiBT aW5jZSB0aGUNCj4+ICsgICAgICAgICAvLyByZXNvbHZlciBjb21lcyBhZnRlciB0aGUgZXhw YW5zaW9uLCB3ZSBuZWVkIHRvIGZpZ3VyZSBvdXQgYSB3YXkgdG8NCj4+ICsgICAgICAgICAv LyBzdHJpcCBhbWJpZ3VvdXMgdmFsdWVzIGhlcmUNCj4+ICsgICAgICAgICAvLyBUT0RPOiBB cnRodXI6IFByb2JhYmx5IGFkZCBhIGBtYXJrX2FzX3N0cmlwYCBtZXRob2QgdG8gYEdlbmVy aWNBcmdgDQo+PiArICAgICAgICAgLy8gb3Igc29tZXRoaW5nLiBUaGlzIHdvdWxkIGNsZWFu IHVwIHRoaXMgd2hvbGUgdGhpbmcNCj4+ICsgICAgICAgfQ0KPj4gKyAgICB9DQo+PiArDQo+ PiArICBleHBhbmRlci5wb3BfY29udGV4dCAoKTsNCj4+ICsNCj4+ICsgIC8vIEZJWE1FOiBD YW4gd2UgaGF2ZSBtYWNybyBpbnZvY2F0aW9ucyBpbiBnZW5lcmljIHR5cGUgYmluZGluZ3M/ DQo+PiArICAvLyBleHBhbmQgYmluZGluZyBhcmdzIC0gc3RyaXAgc3ViLXR5cGVzIG9ubHkN Cj4+ICsgIGZvciAoYXV0byAmYmluZGluZyA6IGFyZ3MuZ2V0X2JpbmRpbmdfYXJncyAoKSkN Cj4+ICsgICAgew0KPj4gKyAgICAgIGF1dG8gJnR5cGUgPSBiaW5kaW5nLmdldF90eXBlICgp Ow0KPj4gKyAgICAgIHR5cGUtPmFjY2VwdF92aXMgKCp0aGlzKTsNCj4+ICsNCj4+ICsgICAg ICBpZiAodHlwZS0+aXNfbWFya2VkX2Zvcl9zdHJpcCAoKSkNCj4+ICsgICAgICAgcnVzdF9l cnJvcl9hdCAodHlwZS0+Z2V0X2xvY3VzICgpLA0KPj4gKyAgICAgICAgICAgICAgICAgICAg ICAiY2Fubm90IHN0cmlwIHR5cGUgaW4gdGhpcyBwb3NpdGlvbiIpOw0KPj4gKyAgICB9DQo+ PiArfQ0KPj4gKw0KPj4gK3ZvaWQNCj4+ICtBdHRyVmlzaXRvcjo6ZXhwYW5kX3F1YWxpZmll ZF9wYXRoX3R5cGUgKEFTVDo6UXVhbGlmaWVkUGF0aFR5cGUgJnBhdGhfdHlwZSkNCj4+ICt7 DQo+PiArICBleHBhbmRlci5wdXNoX2NvbnRleHQgKE1hY3JvRXhwYW5kZXI6OkNvbnRleHRU eXBlOjpUWVBFKTsNCj4+ICsNCj4+ICsgIGF1dG8gJnR5cGUgPSBwYXRoX3R5cGUuZ2V0X3R5 cGUgKCk7DQo+PiArICB0eXBlLT5hY2NlcHRfdmlzICgqdGhpcyk7DQo+PiArDQo+PiArICBt YXliZV9leHBhbmRfdHlwZSAodHlwZSk7DQo+PiArDQo+PiArICBleHBhbmRlci5wb3BfY29u dGV4dCAoKTsNCj4+ICsNCj4+ICsgIGlmICh0eXBlLT5pc19tYXJrZWRfZm9yX3N0cmlwICgp KQ0KPj4gKyAgICBydXN0X2Vycm9yX2F0ICh0eXBlLT5nZXRfbG9jdXMgKCksICJjYW5ub3Qg c3RyaXAgdHlwZSBpbiB0aGlzIHBvc2l0aW9uIik7DQo+PiArDQo+PiArICBpZiAocGF0aF90 eXBlLmhhc19hc19jbGF1c2UgKCkpDQo+PiArICAgIHsNCj4+ICsgICAgICBhdXRvICZ0eXBl X3BhdGggPSBwYXRoX3R5cGUuZ2V0X2FzX3R5cGVfcGF0aCAoKTsNCj4+ICsgICAgICB2aXNp dCAodHlwZV9wYXRoKTsNCj4+ICsgICAgICBpZiAodHlwZV9wYXRoLmlzX21hcmtlZF9mb3Jf c3RyaXAgKCkpDQo+PiArICAgICAgIHJ1c3RfZXJyb3JfYXQgKHR5cGVfcGF0aC5nZXRfbG9j dXMgKCksDQo+PiArICAgICAgICAgICAgICAgICAgICAgICJjYW5ub3Qgc3RyaXAgdHlwZSBw YXRoIGluIHRoaXMgcG9zaXRpb24iKTsNCj4+ICsgICAgfQ0KPj4gK30NCj4+ICsNCj4+ICt2 b2lkDQo+PiArQXR0clZpc2l0b3I6OkF0dHJWaXNpdG9yOjpleHBhbmRfY2xvc3VyZV9wYXJh bXMgKA0KPj4gKyAgc3RkOjp2ZWN0b3I8QVNUOjpDbG9zdXJlUGFyYW0+ICZwYXJhbXMpDQo+ PiArew0KPj4gKyAgZm9yIChhdXRvIGl0ID0gcGFyYW1zLmJlZ2luICgpOyBpdCAhPSBwYXJh bXMuZW5kICgpOykNCj4+ICsgICAgew0KPj4gKyAgICAgIGF1dG8gJnBhcmFtID0gKml0Ow0K Pj4gKw0KPj4gKyAgICAgIGF1dG8gJnBhcmFtX2F0dHJzID0gcGFyYW0uZ2V0X291dGVyX2F0 dHJzICgpOw0KPj4gKyAgICAgIGV4cGFuZGVyLmV4cGFuZF9jZmdfYXR0cnMgKHBhcmFtX2F0 dHJzKTsNCj4+ICsgICAgICBpZiAoZXhwYW5kZXIuZmFpbHNfY2ZnX3dpdGhfZXhwYW5kIChw YXJhbV9hdHRycykpDQo+PiArICAgICAgIHsNCj4+ICsgICAgICAgICBpdCA9IHBhcmFtcy5l cmFzZSAoaXQpOw0KPj4gKyAgICAgICAgIGNvbnRpbnVlOw0KPj4gKyAgICAgICB9DQo+PiAr DQo+PiArICAgICAgYXV0byAmcGF0dGVybiA9IHBhcmFtLmdldF9wYXR0ZXJuICgpOw0KPj4g KyAgICAgIHBhdHRlcm4tPmFjY2VwdF92aXMgKCp0aGlzKTsNCj4+ICsgICAgICBpZiAocGF0 dGVybi0+aXNfbWFya2VkX2Zvcl9zdHJpcCAoKSkNCj4+ICsgICAgICAgcnVzdF9lcnJvcl9h dCAocGF0dGVybi0+Z2V0X2xvY3VzICgpLA0KPj4gKyAgICAgICAgICAgICAgICAgICAgICAi Y2Fubm90IHN0cmlwIHBhdHRlcm4gaW4gdGhpcyBwb3NpdGlvbiIpOw0KPj4gKw0KPj4gKyAg ICAgIGlmIChwYXJhbS5oYXNfdHlwZV9naXZlbiAoKSkNCj4+ICsgICAgICAgew0KPj4gKyAg ICAgICAgIGV4cGFuZGVyLnB1c2hfY29udGV4dCAoTWFjcm9FeHBhbmRlcjo6Q29udGV4dFR5 cGU6OlRZUEUpOw0KPj4gKyAgICAgICAgIGF1dG8gJnR5cGUgPSBwYXJhbS5nZXRfdHlwZSAo KTsNCj4+ICsgICAgICAgICB0eXBlLT5hY2NlcHRfdmlzICgqdGhpcyk7DQo+PiArDQo+PiAr ICAgICAgICAgbWF5YmVfZXhwYW5kX3R5cGUgKHR5cGUpOw0KPj4gKw0KPj4gKyAgICAgICAg IGlmICh0eXBlLT5pc19tYXJrZWRfZm9yX3N0cmlwICgpKQ0KPj4gKyAgICAgICAgICAgcnVz dF9lcnJvcl9hdCAodHlwZS0+Z2V0X2xvY3VzICgpLA0KPj4gKyAgICAgICAgICAgICAgICAg ICAgICAgICAgImNhbm5vdCBzdHJpcCB0eXBlIGluIHRoaXMgcG9zaXRpb24iKTsNCj4+ICsN Cj4+ICsgICAgICAgICBleHBhbmRlci5wb3BfY29udGV4dCAoKTsNCj4+ICsgICAgICAgfQ0K Pj4gKw0KPj4gKyAgICAgIC8vIGluY3JlbWVudCBpZiBmb3VuZCBub3RoaW5nIGVsc2Ugc28g ZmFyDQo+PiArICAgICAgKytpdDsNCj4+ICsgICAgfQ0KPj4gK30NCj4+ICsNCj4+ICt2b2lk DQo+PiArQXR0clZpc2l0b3I6OmV4cGFuZF9zZWxmX3BhcmFtIChBU1Q6OlNlbGZQYXJhbSAm c2VsZl9wYXJhbSkNCj4+ICt7DQo+PiArICBpZiAoc2VsZl9wYXJhbS5oYXNfdHlwZSAoKSkN Cj4+ICsgICAgew0KPj4gKyAgICAgIGV4cGFuZGVyLnB1c2hfY29udGV4dCAoTWFjcm9FeHBh bmRlcjo6Q29udGV4dFR5cGU6OlRZUEUpOw0KPj4gKyAgICAgIGF1dG8gJnR5cGUgPSBzZWxm X3BhcmFtLmdldF90eXBlICgpOw0KPj4gKyAgICAgIHR5cGUtPmFjY2VwdF92aXMgKCp0aGlz KTsNCj4+ICsNCj4+ICsgICAgICBtYXliZV9leHBhbmRfdHlwZSAodHlwZSk7DQo+PiArDQo+ PiArICAgICAgaWYgKHR5cGUtPmlzX21hcmtlZF9mb3Jfc3RyaXAgKCkpDQo+PiArICAgICAg IHJ1c3RfZXJyb3JfYXQgKHR5cGUtPmdldF9sb2N1cyAoKSwNCj4+ICsgICAgICAgICAgICAg ICAgICAgICAgImNhbm5vdCBzdHJpcCB0eXBlIGluIHRoaXMgcG9zaXRpb24iKTsNCj4+ICsN Cj4+ICsgICAgICBleHBhbmRlci5wb3BfY29udGV4dCAoKTsNCj4+ICsgICAgfQ0KPj4gKyAg LyogVE9ETzogbWF5YmUgY2hlY2sgZm9yIGludmFyaWFudHMgYmVpbmcgdmlvbGF0ZWQgLSBl LmcuIGJvdGggdHlwZSBhbmQNCj4+ICsgICAqIGxpZmV0aW1lPyAqLw0KPiANCj4gQy1zdHls ZSBjb21tZW50IHdoZXJlIEkgc2VlIEMrKy1zdHlsZSBjb21tZW50cyBldmVyeXdoZXJlIGVs c2UuDQo+IA0KPj4gK30NCj4+ICsNCj4+ICt2b2lkDQo+PiArQXR0clZpc2l0b3I6OmV4cGFu ZF93aGVyZV9jbGF1c2UgKEFTVDo6V2hlcmVDbGF1c2UgJndoZXJlX2NsYXVzZSkNCj4+ICt7 DQo+PiArICAvLyBpdGVtcyBjYW5ub3QgYmUgc3RyaXBwZWQgY29uY2VwdHVhbGx5LCBzbyBq dXN0IGFjY2VwdCB2aXNpdG9yDQo+PiArICBmb3IgKGF1dG8gJml0ZW0gOiB3aGVyZV9jbGF1 c2UuZ2V0X2l0ZW1zICgpKQ0KPj4gKyAgICBpdGVtLT5hY2NlcHRfdmlzICgqdGhpcyk7DQo+ PiArfQ0KPj4gKw0KPj4gK3ZvaWQNCj4+ICtBdHRyVmlzaXRvcjo6ZXhwYW5kX3RyYWl0X2Z1 bmN0aW9uX2RlY2wgKEFTVDo6VHJhaXRGdW5jdGlvbkRlY2wgJmRlY2wpDQo+PiArew0KPj4g KyAgLy8ganVzdCBleHBhbmQgc3ViLXN0dWZmIC0gY2FuJ3QgYWN0dWFsbHkgc3RyaXAgZ2Vu ZXJpYyBwYXJhbXMgdGhlbXNlbHZlcw0KPj4gKyAgZm9yIChhdXRvICZwYXJhbSA6IGRlY2wu Z2V0X2dlbmVyaWNfcGFyYW1zICgpKQ0KPj4gKyAgICBwYXJhbS0+YWNjZXB0X3ZpcyAoKnRo aXMpOw0KPj4gKw0KPj4gKyAgLyogc3RyaXAgZnVuY3Rpb24gcGFyYW1ldGVycyBpZiByZXF1 aXJlZCAtIHRoaXMgaXMgc3BlY2lmaWNhbGx5DQo+PiArICAgKiBhbGxvd2VkIGJ5IHNwZWMg Ki8NCj4+ICsgIGV4cGFuZF9mdW5jdGlvbl9wYXJhbXMgKGRlY2wuZ2V0X2Z1bmN0aW9uX3Bh cmFtcyAoKSk7DQo+PiArDQo+PiArICBpZiAoZGVjbC5oYXNfcmV0dXJuX3R5cGUgKCkpDQo+ PiArICAgIHsNCj4+ICsgICAgICBleHBhbmRlci5wdXNoX2NvbnRleHQgKE1hY3JvRXhwYW5k ZXI6OkNvbnRleHRUeXBlOjpUWVBFKTsNCj4+ICsNCj4+ICsgICAgICBhdXRvICZyZXR1cm5f dHlwZSA9IGRlY2wuZ2V0X3JldHVybl90eXBlICgpOw0KPj4gKyAgICAgIHJldHVybl90eXBl LT5hY2NlcHRfdmlzICgqdGhpcyk7DQo+PiArDQo+PiArICAgICAgbWF5YmVfZXhwYW5kX3R5 cGUgKHJldHVybl90eXBlKTsNCj4+ICsNCj4+ICsgICAgICBpZiAocmV0dXJuX3R5cGUtPmlz X21hcmtlZF9mb3Jfc3RyaXAgKCkpDQo+PiArICAgICAgIHJ1c3RfZXJyb3JfYXQgKHJldHVy bl90eXBlLT5nZXRfbG9jdXMgKCksDQo+PiArICAgICAgICAgICAgICAgICAgICAgICJjYW5u b3Qgc3RyaXAgdHlwZSBpbiB0aGlzIHBvc2l0aW9uIik7DQo+PiArDQo+PiArICAgICAgZXhw YW5kZXIucG9wX2NvbnRleHQgKCk7DQo+PiArICAgIH0NCj4+ICsNCj4+ICsgIGlmIChkZWNs Lmhhc193aGVyZV9jbGF1c2UgKCkpDQo+PiArICAgIGV4cGFuZF93aGVyZV9jbGF1c2UgKGRl Y2wuZ2V0X3doZXJlX2NsYXVzZSAoKSk7DQo+PiArfQ0KPj4gKw0KPj4gK3ZvaWQNCj4+ICtB dHRyVmlzaXRvcjo6ZXhwYW5kX3RyYWl0X21ldGhvZF9kZWNsIChBU1Q6OlRyYWl0TWV0aG9k RGVjbCAmZGVjbCkNCj4+ICt7DQo+PiArICAvLyBqdXN0IGV4cGFuZCBzdWItc3R1ZmYgLSBj YW4ndCBhY3R1YWxseSBzdHJpcCBnZW5lcmljIHBhcmFtcyB0aGVtc2VsdmVzDQo+PiArICBm b3IgKGF1dG8gJnBhcmFtIDogZGVjbC5nZXRfZ2VuZXJpY19wYXJhbXMgKCkpDQo+PiArICAg IHBhcmFtLT5hY2NlcHRfdmlzICgqdGhpcyk7DQo+PiArDQo+PiArICAvKiBhc3N1bWluZyB5 b3UgY2FuJ3Qgc3RyaXAgc2VsZiBwYXJhbSAtIHdvdWxkbid0IGJlIGEgbWV0aG9kDQo+PiAr ICAgKiBhbnltb3JlLiBzcGVjIGFsbG93cyBvdXRlciBhdHRycyBvbiBzZWxmIHBhcmFtLCBi dXQgZG9lc24ndA0KPj4gKyAgICogc3BlY2lmeSB3aGV0aGVyIGNmZyBpcyB1c2VkLiAqLw0K Pj4gKyAgZXhwYW5kX3NlbGZfcGFyYW0gKGRlY2wuZ2V0X3NlbGZfcGFyYW0gKCkpOw0KPj4g Kw0KPj4gKyAgLyogc3RyaXAgZnVuY3Rpb24gcGFyYW1ldGVycyBpZiByZXF1aXJlZCAtIHRo aXMgaXMgc3BlY2lmaWNhbGx5DQo+PiArICAgKiBhbGxvd2VkIGJ5IHNwZWMgKi8NCj4+ICsg IGV4cGFuZF9mdW5jdGlvbl9wYXJhbXMgKGRlY2wuZ2V0X2Z1bmN0aW9uX3BhcmFtcyAoKSk7 DQo+PiArDQo+PiArICBpZiAoZGVjbC5oYXNfcmV0dXJuX3R5cGUgKCkpDQo+PiArICAgIHsN Cj4+ICsgICAgICBleHBhbmRlci5wdXNoX2NvbnRleHQgKE1hY3JvRXhwYW5kZXI6OkNvbnRl eHRUeXBlOjpUWVBFKTsNCj4+ICsNCj4+ICsgICAgICBhdXRvICZyZXR1cm5fdHlwZSA9IGRl Y2wuZ2V0X3JldHVybl90eXBlICgpOw0KPj4gKyAgICAgIHJldHVybl90eXBlLT5hY2NlcHRf dmlzICgqdGhpcyk7DQo+PiArDQo+PiArICAgICAgbWF5YmVfZXhwYW5kX3R5cGUgKHJldHVy bl90eXBlKTsNCj4+ICsNCj4+ICsgICAgICBpZiAocmV0dXJuX3R5cGUtPmlzX21hcmtlZF9m b3Jfc3RyaXAgKCkpDQo+PiArICAgICAgIHJ1c3RfZXJyb3JfYXQgKHJldHVybl90eXBlLT5n ZXRfbG9jdXMgKCksDQo+PiArICAgICAgICAgICAgICAgICAgICAgICJjYW5ub3Qgc3RyaXAg dHlwZSBpbiB0aGlzIHBvc2l0aW9uIik7DQo+PiArDQo+PiArICAgICAgZXhwYW5kZXIucG9w X2NvbnRleHQgKCk7DQo+PiArICAgIH0NCj4+ICsNCj4+ICsgIGlmIChkZWNsLmhhc193aGVy ZV9jbGF1c2UgKCkpDQo+PiArICAgIGV4cGFuZF93aGVyZV9jbGF1c2UgKGRlY2wuZ2V0X3do ZXJlX2NsYXVzZSAoKSk7DQo+PiArfQ0KPj4gKw0KPj4gK3ZvaWQNCj4+ICtBdHRyVmlzaXRv cjo6dmlzaXQgKEFTVDo6VG9rZW4gJikNCj4+ICt7DQo+PiArICAvLyBzaG91bGRuJ3QgcmVx dWlyZT8NCj4+ICt9DQo+PiArdm9pZA0KPj4gK0F0dHJWaXNpdG9yOjp2aXNpdCAoQVNUOjpE ZWxpbVRva2VuVHJlZSAmKQ0KPj4gK3sNCj4+ICsgIC8vIHNob3VsZG4ndCByZXF1aXJlPw0K Pj4gK30NCj4+ICt2b2lkDQo+PiArQXR0clZpc2l0b3I6OnZpc2l0IChBU1Q6OkF0dHJJbnB1 dE1ldGFJdGVtQ29udGFpbmVyICYpDQo+PiArew0KPj4gKyAgLy8gc2hvdWxkbid0IHJlcXVp cmU/DQo+PiArfQ0KPj4gK3ZvaWQNCj4+ICtBdHRyVmlzaXRvcjo6dmlzaXQgKEFTVDo6SWRl bnRpZmllckV4cHIgJmlkZW50X2V4cHIpDQo+PiArew0KPj4gKyAgLy8gc3RyaXAgdGVzdCBi YXNlZCBvbiBvdXRlciBhdHRycw0KPj4gKyAgZXhwYW5kZXIuZXhwYW5kX2NmZ19hdHRycyAo aWRlbnRfZXhwci5nZXRfb3V0ZXJfYXR0cnMgKCkpOw0KPj4gKyAgaWYgKGV4cGFuZGVyLmZh aWxzX2NmZ193aXRoX2V4cGFuZCAoaWRlbnRfZXhwci5nZXRfb3V0ZXJfYXR0cnMgKCkpKQ0K Pj4gKyAgICB7DQo+PiArICAgICAgaWRlbnRfZXhwci5tYXJrX2Zvcl9zdHJpcCAoKTsNCj4+ ICsgICAgICByZXR1cm47DQo+PiArICAgIH0NCj4+ICt9DQo+PiArdm9pZA0KPj4gK0F0dHJW aXNpdG9yOjp2aXNpdCAoQVNUOjpMaWZldGltZSAmKQ0KPj4gK3sNCj4+ICsgIC8vIHNob3Vs ZG4ndCByZXF1aXJlPw0KPj4gK30NCj4+ICt2b2lkDQo+PiArQXR0clZpc2l0b3I6OnZpc2l0 IChBU1Q6OkxpZmV0aW1lUGFyYW0gJikNCj4+ICt7DQo+PiArICAvLyBzdXBwb3NlZGx5IGRv ZXMgbm90IHJlcXVpcmUgLSBjZmcgZG9lcyBub3RoaW5nDQo+PiArfQ0KPj4gK3ZvaWQNCj4+ ICtBdHRyVmlzaXRvcjo6dmlzaXQgKEFTVDo6Q29uc3RHZW5lcmljUGFyYW0gJikNCj4+ICt7 DQo+PiArICAvLyBsaWtld2lzZQ0KPj4gK30NCj4+ICsNCj4+ICt2b2lkDQo+PiArQXR0clZp c2l0b3I6OnZpc2l0IChBU1Q6Ok1hY3JvSW52b2NhdGlvbiAmbWFjcm9faW52b2MpDQo+PiAr ew0KPj4gKyAgLy8gaW5pdGlhbCBzdHJpcCB0ZXN0IGJhc2VkIG9uIG91dGVyIGF0dHJzDQo+ PiArICBleHBhbmRlci5leHBhbmRfY2ZnX2F0dHJzIChtYWNyb19pbnZvYy5nZXRfb3V0ZXJf YXR0cnMgKCkpOw0KPj4gKyAgaWYgKGV4cGFuZGVyLmZhaWxzX2NmZ193aXRoX2V4cGFuZCAo bWFjcm9faW52b2MuZ2V0X291dGVyX2F0dHJzICgpKSkNCj4+ICsgICAgew0KPj4gKyAgICAg IG1hY3JvX2ludm9jLm1hcmtfZm9yX3N0cmlwICgpOw0KPj4gKyAgICAgIHJldHVybjsNCj4+ ICsgICAgfQ0KPj4gKw0KPj4gKyAgLy8gY2FuJ3Qgc3RyaXAgc2ltcGxlIHBhdGgNCj4+ICsN Cj4+ICsgIC8vIEkgZG9uJ3QgdGhpbmsgYW55IG1hY3JvIHRva2VuIHRyZWVzIGNhbiBiZSBz dHJpcHBlZCBpbiBhbnkgd2F5DQo+PiArDQo+PiArICAvLyBUT0RPOiBtYXliZSBoYXZlIGNm ZyEgbWFjcm8gc3RyaXBwaW5nIGJlaGF2aW91ciBoZXJlPw0KPj4gKyAgZXhwYW5kZXIuZXhw YW5kX2ludm9jIChtYWNyb19pbnZvYywgbWFjcm9faW52b2MuaGFzX3NlbWljb2xvbiAoKSk7 DQo+PiArfQ0KPj4gKw0KPj4gK3ZvaWQNCj4+ICtBdHRyVmlzaXRvcjo6dmlzaXQgKEFTVDo6 UGF0aEluRXhwcmVzc2lvbiAmcGF0aCkNCj4+ICt7DQo+PiArICAvLyBpbml0aWFsIHN0cmlw IHRlc3QgYmFzZWQgb24gb3V0ZXIgYXR0cnMNCj4+ICsgIGV4cGFuZGVyLmV4cGFuZF9jZmdf YXR0cnMgKHBhdGguZ2V0X291dGVyX2F0dHJzICgpKTsNCj4+ICsgIGlmIChleHBhbmRlci5m YWlsc19jZmdfd2l0aF9leHBhbmQgKHBhdGguZ2V0X291dGVyX2F0dHJzICgpKSkNCj4+ICsg ICAgew0KPj4gKyAgICAgIHBhdGgubWFya19mb3Jfc3RyaXAgKCk7DQo+PiArICAgICAgcmV0 dXJuOw0KPj4gKyAgICB9DQo+PiArDQo+PiArICBmb3IgKGF1dG8gJnNlZ21lbnQgOiBwYXRo LmdldF9zZWdtZW50cyAoKSkNCj4+ICsgICAgew0KPj4gKyAgICAgIGlmIChzZWdtZW50Lmhh c19nZW5lcmljX2FyZ3MgKCkpDQo+PiArICAgICAgIGV4cGFuZF9nZW5lcmljX2FyZ3MgKHNl Z21lbnQuZ2V0X2dlbmVyaWNfYXJncyAoKSk7DQo+PiArICAgIH0NCj4+ICt9DQo+PiArdm9p ZA0KPj4gK0F0dHJWaXNpdG9yOjp2aXNpdCAoQVNUOjpUeXBlUGF0aFNlZ21lbnQgJikNCj4+ ICt7DQo+PiArICAvLyBzaG91bGRuJ3QgcmVxdWlyZQ0KPj4gK30NCj4+ICt2b2lkDQo+PiAr QXR0clZpc2l0b3I6OnZpc2l0IChBU1Q6OlR5cGVQYXRoU2VnbWVudEdlbmVyaWMgJnNlZ21l bnQpDQo+PiArew0KPj4gKyAgLy8gVE9ETzogc3RyaXAgaW5zaWRlIGdlbmVyaWMgYXJncw0K Pj4gKw0KPj4gKyAgaWYgKCFzZWdtZW50Lmhhc19nZW5lcmljX2FyZ3MgKCkpDQo+PiArICAg IHJldHVybjsNCj4+ICsNCj4+ICsgIGV4cGFuZF9nZW5lcmljX2FyZ3MgKHNlZ21lbnQuZ2V0 X2dlbmVyaWNfYXJncyAoKSk7DQo+PiArfQ0KPj4gK3ZvaWQNCj4+ICtBdHRyVmlzaXRvcjo6 dmlzaXQgKEFTVDo6VHlwZVBhdGhTZWdtZW50RnVuY3Rpb24gJnNlZ21lbnQpDQo+PiArew0K Pj4gKyAgYXV0byAmdHlwZV9wYXRoX2Z1bmN0aW9uID0gc2VnbWVudC5nZXRfdHlwZV9wYXRo X2Z1bmN0aW9uICgpOw0KPj4gKw0KPj4gKyAgZm9yIChhdXRvICZ0eXBlIDogdHlwZV9wYXRo X2Z1bmN0aW9uLmdldF9wYXJhbXMgKCkpDQo+PiArICAgIHsNCj4+ICsgICAgICB0eXBlLT5h Y2NlcHRfdmlzICgqdGhpcyk7DQo+PiArICAgICAgaWYgKHR5cGUtPmlzX21hcmtlZF9mb3Jf c3RyaXAgKCkpDQo+PiArICAgICAgIHJ1c3RfZXJyb3JfYXQgKHR5cGUtPmdldF9sb2N1cyAo KSwNCj4+ICsgICAgICAgICAgICAgICAgICAgICAgImNhbm5vdCBzdHJpcCB0eXBlIGluIHRo aXMgcG9zaXRpb24iKTsNCj4+ICsgICAgfQ0KPj4gKw0KPj4gKyAgaWYgKHR5cGVfcGF0aF9m dW5jdGlvbi5oYXNfcmV0dXJuX3R5cGUgKCkpDQo+PiArICAgIHsNCj4+ICsgICAgICBleHBh bmRlci5wdXNoX2NvbnRleHQgKE1hY3JvRXhwYW5kZXI6OkNvbnRleHRUeXBlOjpUWVBFKTsN Cj4+ICsNCj4+ICsgICAgICBhdXRvICZyZXR1cm5fdHlwZSA9IHR5cGVfcGF0aF9mdW5jdGlv bi5nZXRfcmV0dXJuX3R5cGUgKCk7DQo+PiArICAgICAgcmV0dXJuX3R5cGUtPmFjY2VwdF92 aXMgKCp0aGlzKTsNCj4+ICsNCj4+ICsgICAgICBtYXliZV9leHBhbmRfdHlwZSAocmV0dXJu X3R5cGUpOw0KPj4gKw0KPj4gKyAgICAgIGlmIChyZXR1cm5fdHlwZS0+aXNfbWFya2VkX2Zv cl9zdHJpcCAoKSkNCj4+ICsgICAgICAgcnVzdF9lcnJvcl9hdCAocmV0dXJuX3R5cGUtPmdl dF9sb2N1cyAoKSwNCj4+ICsgICAgICAgICAgICAgICAgICAgICAgImNhbm5vdCBzdHJpcCB0 eXBlIGluIHRoaXMgcG9zaXRpb24iKTsNCj4+ICsNCj4+ICsgICAgICBleHBhbmRlci5wb3Bf Y29udGV4dCAoKTsNCj4+ICsgICAgfQ0KPj4gK30NCj4+ICt2b2lkDQo+PiArQXR0clZpc2l0 b3I6OnZpc2l0IChBU1Q6OlR5cGVQYXRoICZwYXRoKQ0KPj4gK3sNCj4+ICsgIC8vIHRoaXMg c2hvdWxkbid0IHN0cmlwIGFueSBzZWdtZW50cywgYnV0IGNhbiBzdHJpcCBpbnNpZGUgdGhl bQ0KPj4gKyAgZm9yIChhdXRvICZzZWdtZW50IDogcGF0aC5nZXRfc2VnbWVudHMgKCkpDQo+ PiArICAgIHNlZ21lbnQtPmFjY2VwdF92aXMgKCp0aGlzKTsNCj4+ICt9DQo+PiArdm9pZA0K Pj4gK0F0dHJWaXNpdG9yOjp2aXNpdCAoQVNUOjpRdWFsaWZpZWRQYXRoSW5FeHByZXNzaW9u ICZwYXRoKQ0KPj4gK3sNCj4+ICsgIC8vIGluaXRpYWwgc3RyaXAgdGVzdCBiYXNlZCBvbiBv dXRlciBhdHRycw0KPj4gKyAgZXhwYW5kZXIuZXhwYW5kX2NmZ19hdHRycyAocGF0aC5nZXRf b3V0ZXJfYXR0cnMgKCkpOw0KPj4gKyAgaWYgKGV4cGFuZGVyLmZhaWxzX2NmZ193aXRoX2V4 cGFuZCAocGF0aC5nZXRfb3V0ZXJfYXR0cnMgKCkpKQ0KPj4gKyAgICB7DQo+PiArICAgICAg cGF0aC5tYXJrX2Zvcl9zdHJpcCAoKTsNCj4+ICsgICAgICByZXR1cm47DQo+PiArICAgIH0N Cj4+ICsNCj4+ICsgIGV4cGFuZF9xdWFsaWZpZWRfcGF0aF90eXBlIChwYXRoLmdldF9xdWFs aWZpZWRfcGF0aF90eXBlICgpKTsNCj4+ICsNCj4+ICsgIGZvciAoYXV0byAmc2VnbWVudCA6 IHBhdGguZ2V0X3NlZ21lbnRzICgpKQ0KPj4gKyAgICB7DQo+PiArICAgICAgaWYgKHNlZ21l bnQuaGFzX2dlbmVyaWNfYXJncyAoKSkNCj4+ICsgICAgICAgZXhwYW5kX2dlbmVyaWNfYXJn cyAoc2VnbWVudC5nZXRfZ2VuZXJpY19hcmdzICgpKTsNCj4+ICsgICAgfQ0KPj4gK30NCj4+ ICt2b2lkDQo+PiArQXR0clZpc2l0b3I6OnZpc2l0IChBU1Q6OlF1YWxpZmllZFBhdGhJblR5 cGUgJnBhdGgpDQo+PiArew0KPj4gKyAgZXhwYW5kX3F1YWxpZmllZF9wYXRoX3R5cGUgKHBh dGguZ2V0X3F1YWxpZmllZF9wYXRoX3R5cGUgKCkpOw0KPj4gKw0KPj4gKyAgLy8gdGhpcyBz aG91bGRuJ3Qgc3RyaXAgYW55IHNlZ21lbnRzLCBidXQgY2FuIHN0cmlwIGluc2lkZSB0aGVt DQo+PiArICBmb3IgKGF1dG8gJnNlZ21lbnQgOiBwYXRoLmdldF9zZWdtZW50cyAoKSkNCj4+ ICsgICAgc2VnbWVudC0+YWNjZXB0X3ZpcyAoKnRoaXMpOw0KPj4gK30NCj4+ICsNCj4+ICt2 b2lkDQo+PiArQXR0clZpc2l0b3I6OnZpc2l0IChBU1Q6OkxpdGVyYWxFeHByICZleHByKQ0K Pj4gK3sNCj4+ICsgIC8vIGluaXRpYWwgc3RyaXAgdGVzdCBiYXNlZCBvbiBvdXRlciBhdHRy cw0KPj4gKyAgZXhwYW5kZXIuZXhwYW5kX2NmZ19hdHRycyAoZXhwci5nZXRfb3V0ZXJfYXR0 cnMgKCkpOw0KPj4gKyAgaWYgKGV4cGFuZGVyLmZhaWxzX2NmZ193aXRoX2V4cGFuZCAoZXhw ci5nZXRfb3V0ZXJfYXR0cnMgKCkpKQ0KPj4gKyAgICB7DQo+PiArICAgICAgZXhwci5tYXJr X2Zvcl9zdHJpcCAoKTsNCj4+ICsgICAgICByZXR1cm47DQo+PiArICAgIH0NCj4+ICt9DQo+ PiArdm9pZA0KPj4gK0F0dHJWaXNpdG9yOjp2aXNpdCAoQVNUOjpBdHRySW5wdXRMaXRlcmFs ICYpDQo+PiArew0KPj4gKyAgLy8gc2hvdWxkbid0IHJlcXVpcmU/DQo+PiArfQ0KPj4gK3Zv aWQNCj4+ICtBdHRyVmlzaXRvcjo6dmlzaXQgKEFTVDo6TWV0YUl0ZW1MaXRFeHByICYpDQo+ PiArew0KPj4gKyAgLy8gc2hvdWxkbid0IHJlcXVpcmU/DQo+PiArfQ0KPj4gK3ZvaWQNCj4+ ICtBdHRyVmlzaXRvcjo6dmlzaXQgKEFTVDo6TWV0YUl0ZW1QYXRoTGl0ICYpDQo+PiArew0K Pj4gKyAgLy8gc2hvdWxkbid0IHJlcXVpcmU/DQo+PiArfQ0KPj4gK3ZvaWQNCj4+ICtBdHRy VmlzaXRvcjo6dmlzaXQgKEFTVDo6Qm9ycm93RXhwciAmZXhwcikNCj4+ICt7DQo+PiArICAv LyBpbml0aWFsIHN0cmlwIHRlc3QgYmFzZWQgb24gb3V0ZXIgYXR0cnMNCj4+ICsgIGV4cGFu ZGVyLmV4cGFuZF9jZmdfYXR0cnMgKGV4cHIuZ2V0X291dGVyX2F0dHJzICgpKTsNCj4+ICsg IGlmIChleHBhbmRlci5mYWlsc19jZmdfd2l0aF9leHBhbmQgKGV4cHIuZ2V0X291dGVyX2F0 dHJzICgpKSkNCj4+ICsgICAgew0KPj4gKyAgICAgIGV4cHIubWFya19mb3Jfc3RyaXAgKCk7 DQo+PiArICAgICAgcmV0dXJuOw0KPj4gKyAgICB9DQo+PiArDQo+PiArICAvKiBzdHJpcCBh bnkgaW50ZXJuYWwgc3ViLWV4cHJlc3Npb25zIC0gZXhwcmVzc2lvbiBpdHNlbGYgaXNuJ3QN Cj4+ICsgICAqIGFsbG93ZWQgdG8gaGF2ZSBleHRlcm5hbCBhdHRyaWJ1dGVzIGluIHRoaXMg cG9zaXRpb24gc28gY2FuJ3QgYmUNCj4+ICsgICAqIHN0cmlwcGVkLiAqLw0KPj4gKyAgYXV0 byAmYm9ycm93ZWRfZXhwciA9IGV4cHIuZ2V0X2JvcnJvd2VkX2V4cHIgKCk7DQo+PiArICBi b3Jyb3dlZF9leHByLT5hY2NlcHRfdmlzICgqdGhpcyk7DQo+PiArICBpZiAoYm9ycm93ZWRf ZXhwci0+aXNfbWFya2VkX2Zvcl9zdHJpcCAoKSkNCj4+ICsgICAgcnVzdF9lcnJvcl9hdCAo Ym9ycm93ZWRfZXhwci0+Z2V0X2xvY3VzICgpLA0KPj4gKyAgICAgICAgICAgICAgICAgICJj YW5ub3Qgc3RyaXAgZXhwcmVzc2lvbiBpbiB0aGlzIHBvc2l0aW9uIC0gb3V0ZXIgIg0KPj4g KyAgICAgICAgICAgICAgICAgICJhdHRyaWJ1dGVzIG5vdCBhbGxvd2VkIik7DQo+PiArfQ0K Pj4gK3ZvaWQNCj4+ICtBdHRyVmlzaXRvcjo6dmlzaXQgKEFTVDo6RGVyZWZlcmVuY2VFeHBy ICZleHByKQ0KPj4gK3sNCj4+ICsgIC8vIGluaXRpYWwgc3RyaXAgdGVzdCBiYXNlZCBvbiBv dXRlciBhdHRycw0KPj4gKyAgZXhwYW5kZXIuZXhwYW5kX2NmZ19hdHRycyAoZXhwci5nZXRf b3V0ZXJfYXR0cnMgKCkpOw0KPj4gKyAgaWYgKGV4cGFuZGVyLmZhaWxzX2NmZ193aXRoX2V4 cGFuZCAoZXhwci5nZXRfb3V0ZXJfYXR0cnMgKCkpKQ0KPj4gKyAgICB7DQo+PiArICAgICAg ZXhwci5tYXJrX2Zvcl9zdHJpcCAoKTsNCj4+ICsgICAgICByZXR1cm47DQo+PiArICAgIH0N Cj4+ICsNCj4+ICsgIC8qIHN0cmlwIGFueSBpbnRlcm5hbCBzdWItZXhwcmVzc2lvbnMgLSBl eHByZXNzaW9uIGl0c2VsZiBpc24ndA0KPj4gKyAgICogYWxsb3dlZCB0byBoYXZlIGV4dGVy bmFsIGF0dHJpYnV0ZXMgaW4gdGhpcyBwb3NpdGlvbiBzbyBjYW4ndCBiZQ0KPj4gKyAgICog c3RyaXBwZWQuICovDQo+PiArICBhdXRvICZkZXJlZmVyZW5jZWRfZXhwciA9IGV4cHIuZ2V0 X2RlcmVmZXJlbmNlZF9leHByICgpOw0KPj4gKyAgZGVyZWZlcmVuY2VkX2V4cHItPmFjY2Vw dF92aXMgKCp0aGlzKTsNCj4+ICsgIGlmIChkZXJlZmVyZW5jZWRfZXhwci0+aXNfbWFya2Vk X2Zvcl9zdHJpcCAoKSkNCj4+ICsgICAgcnVzdF9lcnJvcl9hdCAoZGVyZWZlcmVuY2VkX2V4 cHItPmdldF9sb2N1cyAoKSwNCj4+ICsgICAgICAgICAgICAgICAgICAiY2Fubm90IHN0cmlw IGV4cHJlc3Npb24gaW4gdGhpcyBwb3NpdGlvbiAtIG91dGVyICINCj4+ICsgICAgICAgICAg ICAgICAgICAiYXR0cmlidXRlcyBub3QgYWxsb3dlZCIpOw0KPj4gK30NCj4+ICt2b2lkDQo+ PiArQXR0clZpc2l0b3I6OnZpc2l0IChBU1Q6OkVycm9yUHJvcGFnYXRpb25FeHByICZleHBy KQ0KPj4gK3sNCj4+ICsgIC8vIGluaXRpYWwgc3RyaXAgdGVzdCBiYXNlZCBvbiBvdXRlciBh dHRycw0KPj4gKyAgZXhwYW5kZXIuZXhwYW5kX2NmZ19hdHRycyAoZXhwci5nZXRfb3V0ZXJf YXR0cnMgKCkpOw0KPj4gKyAgaWYgKGV4cGFuZGVyLmZhaWxzX2NmZ193aXRoX2V4cGFuZCAo ZXhwci5nZXRfb3V0ZXJfYXR0cnMgKCkpKQ0KPj4gKyAgICB7DQo+PiArICAgICAgZXhwci5t YXJrX2Zvcl9zdHJpcCAoKTsNCj4+ICsgICAgICByZXR1cm47DQo+PiArICAgIH0NCj4+ICsN Cj4+ICsgIC8qIHN0cmlwIGFueSBpbnRlcm5hbCBzdWItZXhwcmVzc2lvbnMgLSBleHByZXNz aW9uIGl0c2VsZiBpc24ndA0KPj4gKyAgICogYWxsb3dlZCB0byBoYXZlIGV4dGVybmFsIGF0 dHJpYnV0ZXMgaW4gdGhpcyBwb3NpdGlvbiBzbyBjYW4ndCBiZQ0KPj4gKyAgICogc3RyaXBw ZWQuICovDQo+PiArICBhdXRvICZwcm9wYWdhdGluZ19leHByID0gZXhwci5nZXRfcHJvcGFn YXRpbmdfZXhwciAoKTsNCj4+ICsgIHByb3BhZ2F0aW5nX2V4cHItPmFjY2VwdF92aXMgKCp0 aGlzKTsNCj4+ICsgIGlmIChwcm9wYWdhdGluZ19leHByLT5pc19tYXJrZWRfZm9yX3N0cmlw ICgpKQ0KPj4gKyAgICBydXN0X2Vycm9yX2F0IChwcm9wYWdhdGluZ19leHByLT5nZXRfbG9j dXMgKCksDQo+PiArICAgICAgICAgICAgICAgICAgImNhbm5vdCBzdHJpcCBleHByZXNzaW9u IGluIHRoaXMgcG9zaXRpb24gLSBvdXRlciAiDQo+PiArICAgICAgICAgICAgICAgICAgImF0 dHJpYnV0ZXMgbm90IGFsbG93ZWQiKTsNCj4+ICt9DQo+PiArdm9pZA0KPj4gK0F0dHJWaXNp dG9yOjp2aXNpdCAoQVNUOjpOZWdhdGlvbkV4cHIgJmV4cHIpDQo+PiArew0KPj4gKyAgLy8g aW5pdGlhbCBzdHJpcCB0ZXN0IGJhc2VkIG9uIG91dGVyIGF0dHJzDQo+PiArICBleHBhbmRl ci5leHBhbmRfY2ZnX2F0dHJzIChleHByLmdldF9vdXRlcl9hdHRycyAoKSk7DQo+PiArICBp ZiAoZXhwYW5kZXIuZmFpbHNfY2ZnX3dpdGhfZXhwYW5kIChleHByLmdldF9vdXRlcl9hdHRy cyAoKSkpDQo+PiArICAgIHsNCj4+ICsgICAgICBleHByLm1hcmtfZm9yX3N0cmlwICgpOw0K Pj4gKyAgICAgIHJldHVybjsNCj4+ICsgICAgfQ0KPj4gKw0KPj4gKyAgLyogc3RyaXAgYW55 IGludGVybmFsIHN1Yi1leHByZXNzaW9ucyAtIGV4cHJlc3Npb24gaXRzZWxmIGlzbid0DQo+ PiArICAgKiBhbGxvd2VkIHRvIGhhdmUgZXh0ZXJuYWwgYXR0cmlidXRlcyBpbiB0aGlzIHBv c2l0aW9uIHNvIGNhbid0IGJlDQo+PiArICAgKiBzdHJpcHBlZC4gKi8NCj4+ICsgIGF1dG8g Jm5lZ2F0ZWRfZXhwciA9IGV4cHIuZ2V0X25lZ2F0ZWRfZXhwciAoKTsNCj4+ICsgIG5lZ2F0 ZWRfZXhwci0+YWNjZXB0X3ZpcyAoKnRoaXMpOw0KPj4gKyAgaWYgKG5lZ2F0ZWRfZXhwci0+ aXNfbWFya2VkX2Zvcl9zdHJpcCAoKSkNCj4+ICsgICAgcnVzdF9lcnJvcl9hdCAobmVnYXRl ZF9leHByLT5nZXRfbG9jdXMgKCksDQo+PiArICAgICAgICAgICAgICAgICAgImNhbm5vdCBz dHJpcCBleHByZXNzaW9uIGluIHRoaXMgcG9zaXRpb24gLSBvdXRlciAiDQo+PiArICAgICAg ICAgICAgICAgICAgImF0dHJpYnV0ZXMgbm90IGFsbG93ZWQiKTsNCj4+ICt9DQo+PiArdm9p ZA0KPj4gK0F0dHJWaXNpdG9yOjp2aXNpdCAoQVNUOjpBcml0aG1ldGljT3JMb2dpY2FsRXhw ciAmZXhwcikNCj4+ICt7DQo+PiArICAvKiBvdXRlciBhdHRyaWJ1dGVzIG5ldmVyIGFsbG93 ZWQgYmVmb3JlIHRoZXNlLiB3aGlsZSBjYW5ub3Qgc3RyaXANCj4+ICsgICAqIHR3byBkaXJl Y3QgZGVzY2VuZGFudCBleHByZXNzaW9ucywgY2FuIHN0cmlwIG9uZXMgYmVsb3cgdGhhdCAq Lw0KPj4gKw0KPj4gKyAgLyogc2hvdWxkIGhhdmUgbm8gcG9zc2liaWxpdHkgZm9yIG91dGVy IGF0dHJzIGFzIHdvdWxkIGJlIHBhcnNlZA0KPj4gKyAgICogd2l0aCBvdXRlciBleHByICov DQo+PiArICBhdXRvICZsX2V4cHIgPSBleHByLmdldF9sZWZ0X2V4cHIgKCk7DQo+PiArICBs X2V4cHItPmFjY2VwdF92aXMgKCp0aGlzKTsNCj4+ICsgIG1heWJlX2V4cGFuZF9leHByIChs X2V4cHIpOw0KPj4gKw0KPj4gKyAgLyogc2hvdWxkIHN5bnRhY3RpY2FsbHkgbm90IGhhdmUg b3V0ZXIgYXR0cmlidXRlcywgdGhvdWdoIHRoaXMgbWF5DQo+PiArICAgKiBub3QgaGF2ZSB3 b3JrZWQgaW4gcHJhY3RpY2UgKi8NCj4+ICsgIGF1dG8gJnJfZXhwciA9IGV4cHIuZ2V0X3Jp Z2h0X2V4cHIgKCk7DQo+PiArICByX2V4cHItPmFjY2VwdF92aXMgKCp0aGlzKTsNCj4+ICsg IG1heWJlX2V4cGFuZF9leHByIChyX2V4cHIpOw0KPj4gKw0KPj4gKyAgLy8gZW5zdXJlIHRo YXQgdGhleSBhcmUgbm90IG1hcmtlZCBmb3Igc3RyaXANCj4+ICsgIGlmIChleHByLmdldF9s ZWZ0X2V4cHIgKCktPmlzX21hcmtlZF9mb3Jfc3RyaXAgKCkpDQo+PiArICAgIHJ1c3RfZXJy b3JfYXQgKGV4cHIuZ2V0X2xlZnRfZXhwciAoKS0+Z2V0X2xvY3VzICgpLA0KPj4gKyAgICAg ICAgICAgICAgICAgICJjYW5ub3Qgc3RyaXAgZXhwcmVzc2lvbiBpbiB0aGlzIHBvc2l0aW9u IC0gb3V0ZXIgIg0KPj4gKyAgICAgICAgICAgICAgICAgICJhdHRyaWJ1dGVzIGFyZSBuZXZl ciBhbGxvd2VkICINCj4+ICsgICAgICAgICAgICAgICAgICAiYmVmb3JlIGJpbmFyeSBvcCBl eHBycyIpOw0KPj4gKyAgaWYgKGV4cHIuZ2V0X3JpZ2h0X2V4cHIgKCktPmlzX21hcmtlZF9m b3Jfc3RyaXAgKCkpDQo+PiArICAgIHJ1c3RfZXJyb3JfYXQgKGV4cHIuZ2V0X3JpZ2h0X2V4 cHIgKCktPmdldF9sb2N1cyAoKSwNCj4+ICsgICAgICAgICAgICAgICAgICAiY2Fubm90IHN0 cmlwIGV4cHJlc3Npb24gaW4gdGhpcyBwb3NpdGlvbiAtIG91dGVyICINCj4+ICsgICAgICAg ICAgICAgICAgICAiYXR0cmlidXRlcyBub3QgYWxsb3dlZCIpOw0KPj4gK30NCj4+ICt2b2lk DQo+PiArQXR0clZpc2l0b3I6OnZpc2l0IChBU1Q6OkNvbXBhcmlzb25FeHByICZleHByKQ0K Pj4gK3sNCj4+ICsgIC8qIG91dGVyIGF0dHJpYnV0ZXMgbmV2ZXIgYWxsb3dlZCBiZWZvcmUg dGhlc2UuIHdoaWxlIGNhbm5vdCBzdHJpcA0KPj4gKyAgICogdHdvIGRpcmVjdCBkZXNjZW5k YW50IGV4cHJlc3Npb25zLCBjYW4gc3RyaXAgb25lcyBiZWxvdyB0aGF0ICovDQo+PiArDQo+ PiArICAvKiBzaG91bGQgaGF2ZSBubyBwb3NzaWJpbGl0eSBmb3Igb3V0ZXIgYXR0cnMgYXMg d291bGQgYmUgcGFyc2VkDQo+PiArICAgKiB3aXRoIG91dGVyIGV4cHIgKi8NCj4+ICsgIGF1 dG8gJmxfZXhwciA9IGV4cHIuZ2V0X2xlZnRfZXhwciAoKTsNCj4+ICsgIGxfZXhwci0+YWNj ZXB0X3ZpcyAoKnRoaXMpOw0KPj4gKyAgbWF5YmVfZXhwYW5kX2V4cHIgKGxfZXhwcik7DQo+ PiArDQo+PiArICAvKiBzaG91bGQgc3ludGFjdGljYWxseSBub3QgaGF2ZSBvdXRlciBhdHRy aWJ1dGVzLCB0aG91Z2ggdGhpcyBtYXkNCj4+ICsgICAqIG5vdCBoYXZlIHdvcmtlZCBpbiBw cmFjdGljZSAqLw0KPj4gKyAgYXV0byAmcl9leHByID0gZXhwci5nZXRfcmlnaHRfZXhwciAo KTsNCj4+ICsgIHJfZXhwci0+YWNjZXB0X3ZpcyAoKnRoaXMpOw0KPj4gKyAgbWF5YmVfZXhw YW5kX2V4cHIgKHJfZXhwcik7DQo+PiArDQo+PiArICAvLyBlbnN1cmUgdGhhdCB0aGV5IGFy ZSBub3QgbWFya2VkIGZvciBzdHJpcA0KPj4gKyAgaWYgKGV4cHIuZ2V0X2xlZnRfZXhwciAo KS0+aXNfbWFya2VkX2Zvcl9zdHJpcCAoKSkNCj4+ICsgICAgcnVzdF9lcnJvcl9hdCAoZXhw ci5nZXRfbGVmdF9leHByICgpLT5nZXRfbG9jdXMgKCksDQo+PiArICAgICAgICAgICAgICAg ICAgImNhbm5vdCBzdHJpcCBleHByZXNzaW9uIGluIHRoaXMgcG9zaXRpb24gLSBvdXRlciAi DQo+PiArICAgICAgICAgICAgICAgICAgImF0dHJpYnV0ZXMgYXJlIG5ldmVyIGFsbG93ZWQg Ig0KPj4gKyAgICAgICAgICAgICAgICAgICJiZWZvcmUgYmluYXJ5IG9wIGV4cHJzIik7DQo+ PiArICBpZiAoZXhwci5nZXRfcmlnaHRfZXhwciAoKS0+aXNfbWFya2VkX2Zvcl9zdHJpcCAo KSkNCj4+ICsgICAgcnVzdF9lcnJvcl9hdCAoZXhwci5nZXRfcmlnaHRfZXhwciAoKS0+Z2V0 X2xvY3VzICgpLA0KPj4gKyAgICAgICAgICAgICAgICAgICJjYW5ub3Qgc3RyaXAgZXhwcmVz c2lvbiBpbiB0aGlzIHBvc2l0aW9uIC0gb3V0ZXIgIg0KPj4gKyAgICAgICAgICAgICAgICAg ICJhdHRyaWJ1dGVzIG5vdCBhbGxvd2VkIik7DQo+PiArfQ0KPiANCj4gdmVydGljYWwgc3Bh Y2UgYmV0d2VlbiBmdW5jdGlvbiBkZWZpbml0aW9ucyBtaXNzaW5nIGhlcmUgKGFuZCBhYm92 ZSBhbmQgYmVsb3cpDQo+IA0KPj4gK3ZvaWQNCj4+ICtBdHRyVmlzaXRvcjo6dmlzaXQgKEFT VDo6TGF6eUJvb2xlYW5FeHByICZleHByKQ0KPj4gK3sNCj4+ICsgIC8qIG91dGVyIGF0dHJp YnV0ZXMgbmV2ZXIgYWxsb3dlZCBiZWZvcmUgdGhlc2UuIHdoaWxlIGNhbm5vdCBzdHJpcA0K Pj4gKyAgICogdHdvIGRpcmVjdCBkZXNjZW5kYW50IGV4cHJlc3Npb25zLCBjYW4gc3RyaXAg b25lcyBiZWxvdyB0aGF0ICovDQo+PiArDQo+PiArICAvKiBzaG91bGQgaGF2ZSBubyBwb3Nz aWJpbGl0eSBmb3Igb3V0ZXIgYXR0cnMgYXMgd291bGQgYmUgcGFyc2VkDQo+PiArICAgKiB3 aXRoIG91dGVyIGV4cHIgKi8NCj4+ICsgIGF1dG8gJmxfZXhwciA9IGV4cHIuZ2V0X2xlZnRf ZXhwciAoKTsNCj4+ICsgIGxfZXhwci0+YWNjZXB0X3ZpcyAoKnRoaXMpOw0KPj4gKyAgbWF5 YmVfZXhwYW5kX2V4cHIgKGxfZXhwcik7DQo+PiArDQo+PiArICAvKiBzaG91bGQgc3ludGFj dGljYWxseSBub3QgaGF2ZSBvdXRlciBhdHRyaWJ1dGVzLCB0aG91Z2ggdGhpcyBtYXkNCj4+ ICsgICAqIG5vdCBoYXZlIHdvcmtlZCBpbiBwcmFjdGljZSAqLw0KPj4gKyAgYXV0byAmcl9l eHByID0gZXhwci5nZXRfcmlnaHRfZXhwciAoKTsNCj4+ICsgIHJfZXhwci0+YWNjZXB0X3Zp cyAoKnRoaXMpOw0KPj4gKyAgbWF5YmVfZXhwYW5kX2V4cHIgKHJfZXhwcik7DQo+PiArDQo+ PiArICAvLyBlbnN1cmUgdGhhdCB0aGV5IGFyZSBub3QgbWFya2VkIGZvciBzdHJpcA0KPj4g KyAgaWYgKGV4cHIuZ2V0X2xlZnRfZXhwciAoKS0+aXNfbWFya2VkX2Zvcl9zdHJpcCAoKSkN Cj4+ICsgICAgcnVzdF9lcnJvcl9hdCAoZXhwci5nZXRfbGVmdF9leHByICgpLT5nZXRfbG9j dXMgKCksDQo+PiArICAgICAgICAgICAgICAgICAgImNhbm5vdCBzdHJpcCBleHByZXNzaW9u IGluIHRoaXMgcG9zaXRpb24gLSBvdXRlciAiDQo+PiArICAgICAgICAgICAgICAgICAgImF0 dHJpYnV0ZXMgYXJlIG5ldmVyIGFsbG93ZWQgIg0KPj4gKyAgICAgICAgICAgICAgICAgICJi ZWZvcmUgYmluYXJ5IG9wIGV4cHJzIik7DQo+PiArICBpZiAoZXhwci5nZXRfcmlnaHRfZXhw ciAoKS0+aXNfbWFya2VkX2Zvcl9zdHJpcCAoKSkNCj4+ICsgICAgcnVzdF9lcnJvcl9hdCAo ZXhwci5nZXRfcmlnaHRfZXhwciAoKS0+Z2V0X2xvY3VzICgpLA0KPj4gKyAgICAgICAgICAg ICAgICAgICJjYW5ub3Qgc3RyaXAgZXhwcmVzc2lvbiBpbiB0aGlzIHBvc2l0aW9uIC0gb3V0 ZXIgIg0KPj4gKyAgICAgICAgICAgICAgICAgICJhdHRyaWJ1dGVzIG5vdCBhbGxvd2VkIik7 DQo+PiArfQ0KPj4gK3ZvaWQNCj4+ICtBdHRyVmlzaXRvcjo6dmlzaXQgKEFTVDo6VHlwZUNh c3RFeHByICZleHByKQ0KPj4gK3sNCj4+ICsgIC8qIG91dGVyIGF0dHJpYnV0ZXMgbmV2ZXIg YWxsb3dlZCBiZWZvcmUgdGhlc2UuIHdoaWxlIGNhbm5vdCBzdHJpcA0KPj4gKyAgICogZGly ZWN0IGRlc2NlbmRhbnQgZXhwcmVzc2lvbiwgY2FuIHN0cmlwIG9uZXMgYmVsb3cgdGhhdCAq Lw0KPj4gKw0KPj4gKyAgYXV0byAmY2FzdGVkX2V4cHIgPSBleHByLmdldF9jYXN0ZWRfZXhw ciAoKTsNCj4+ICsgIC8qIHNob3VsZCBoYXZlIG5vIHBvc3NpYmlsaXR5IGZvciBvdXRlciBh dHRycyBhcyB3b3VsZCBiZSBwYXJzZWQNCj4+ICsgICAqIHdpdGggb3V0ZXIgZXhwciAqLw0K Pj4gKyAgY2FzdGVkX2V4cHItPmFjY2VwdF92aXMgKCp0aGlzKTsNCj4+ICsNCj4+ICsgIC8v IGVuc3VyZSB0aGF0IHRoZXkgYXJlIG5vdCBtYXJrZWQgZm9yIHN0cmlwDQo+PiArICBpZiAo Y2FzdGVkX2V4cHItPmlzX21hcmtlZF9mb3Jfc3RyaXAgKCkpDQo+PiArICAgIHJ1c3RfZXJy b3JfYXQgKGNhc3RlZF9leHByLT5nZXRfbG9jdXMgKCksDQo+PiArICAgICAgICAgICAgICAg ICAgImNhbm5vdCBzdHJpcCBleHByZXNzaW9uIGluIHRoaXMgcG9zaXRpb24gLSBvdXRlciAi DQo+PiArICAgICAgICAgICAgICAgICAgImF0dHJpYnV0ZXMgYXJlIG5ldmVyIGFsbG93ZWQg YmVmb3JlIGNhc3QgZXhwcnMiKTsNCj4+ICsNCj4+ICsgIC8vIFRPRE86IHN0cmlwIHN1Yi10 eXBlcyBvZiB0eXBlDQo+PiArICBhdXRvICZ0eXBlID0gZXhwci5nZXRfdHlwZV90b19jYXN0 X3RvICgpOw0KPj4gKyAgdHlwZS0+YWNjZXB0X3ZpcyAoKnRoaXMpOw0KPj4gKyAgaWYgKHR5 cGUtPmlzX21hcmtlZF9mb3Jfc3RyaXAgKCkpDQo+PiArICAgIHJ1c3RfZXJyb3JfYXQgKHR5 cGUtPmdldF9sb2N1cyAoKSwgImNhbm5vdCBzdHJpcCB0eXBlIGluIHRoaXMgcG9zaXRpb24i KTsNCj4+ICt9DQo+PiArdm9pZA0KPj4gK0F0dHJWaXNpdG9yOjp2aXNpdCAoQVNUOjpBc3Np Z25tZW50RXhwciAmZXhwcikNCj4+ICt7DQo+PiArICBleHBhbmRlci5leHBhbmRfY2ZnX2F0 dHJzIChleHByLmdldF9vdXRlcl9hdHRycyAoKSk7DQo+PiArICBpZiAoZXhwYW5kZXIuZmFp bHNfY2ZnX3dpdGhfZXhwYW5kIChleHByLmdldF9vdXRlcl9hdHRycyAoKSkpDQo+PiArICAg IHsNCj4+ICsgICAgICBleHByLm1hcmtfZm9yX3N0cmlwICgpOw0KPj4gKyAgICAgIHJldHVy bjsNCj4+ICsgICAgfQ0KPj4gKw0KPj4gKyAgLyogc2hvdWxkIGhhdmUgbm8gcG9zc2liaWxp dHkgZm9yIG91dGVyIGF0dHJzIGFzIHdvdWxkIGJlIHBhcnNlZA0KPj4gKyAgICogd2l0aCBv dXRlciBleHByICovDQo+PiArICBhdXRvICZsX2V4cHIgPSBleHByLmdldF9sZWZ0X2V4cHIg KCk7DQo+PiArICBsX2V4cHItPmFjY2VwdF92aXMgKCp0aGlzKTsNCj4+ICsgIG1heWJlX2V4 cGFuZF9leHByIChsX2V4cHIpOw0KPj4gKw0KPj4gKyAgLyogc2hvdWxkIHN5bnRhY3RpY2Fs bHkgbm90IGhhdmUgb3V0ZXIgYXR0cmlidXRlcywgdGhvdWdoIHRoaXMgbWF5DQo+PiArICAg KiBub3QgaGF2ZSB3b3JrZWQgaW4gcHJhY3RpY2UgKi8NCj4+ICsgIGF1dG8gJnJfZXhwciA9 IGV4cHIuZ2V0X3JpZ2h0X2V4cHIgKCk7DQo+PiArICByX2V4cHItPmFjY2VwdF92aXMgKCp0 aGlzKTsNCj4+ICsgIG1heWJlX2V4cGFuZF9leHByIChyX2V4cHIpOw0KPj4gKw0KPj4gKyAg Ly8gZW5zdXJlIHRoYXQgdGhleSBhcmUgbm90IG1hcmtlZCBmb3Igc3RyaXANCj4+ICsgIGlm IChleHByLmdldF9sZWZ0X2V4cHIgKCktPmlzX21hcmtlZF9mb3Jfc3RyaXAgKCkpDQo+PiAr ICAgIHJ1c3RfZXJyb3JfYXQgKGV4cHIuZ2V0X2xlZnRfZXhwciAoKS0+Z2V0X2xvY3VzICgp LA0KPj4gKyAgICAgICAgICAgICAgICAgICJjYW5ub3Qgc3RyaXAgZXhwcmVzc2lvbiBpbiB0 aGlzIHBvc2l0aW9uIC0gb3V0ZXIgIg0KPj4gKyAgICAgICAgICAgICAgICAgICJhdHRyaWJ1 dGVzIGFyZSBuZXZlciBhbGxvd2VkICINCj4+ICsgICAgICAgICAgICAgICAgICAiYmVmb3Jl IGJpbmFyeSBvcCBleHBycyIpOw0KPj4gKyAgaWYgKGV4cHIuZ2V0X3JpZ2h0X2V4cHIgKCkt PmlzX21hcmtlZF9mb3Jfc3RyaXAgKCkpDQo+PiArICAgIHJ1c3RfZXJyb3JfYXQgKGV4cHIu Z2V0X3JpZ2h0X2V4cHIgKCktPmdldF9sb2N1cyAoKSwNCj4+ICsgICAgICAgICAgICAgICAg ICAiY2Fubm90IHN0cmlwIGV4cHJlc3Npb24gaW4gdGhpcyBwb3NpdGlvbiAtIG91dGVyICIN Cj4+ICsgICAgICAgICAgICAgICAgICAiYXR0cmlidXRlcyBub3QgYWxsb3dlZCIpOw0KPj4g K30NCj4+ICt2b2lkDQo+PiArQXR0clZpc2l0b3I6OnZpc2l0IChBU1Q6OkNvbXBvdW5kQXNz aWdubWVudEV4cHIgJmV4cHIpDQo+PiArew0KPj4gKyAgLyogb3V0ZXIgYXR0cmlidXRlcyBu ZXZlciBhbGxvd2VkIGJlZm9yZSB0aGVzZS4gd2hpbGUgY2Fubm90IHN0cmlwDQo+PiArICAg KiB0d28gZGlyZWN0IGRlc2NlbmRhbnQgZXhwcmVzc2lvbnMsIGNhbiBzdHJpcCBvbmVzIGJl bG93IHRoYXQgKi8NCj4+ICsNCj4+ICsgIC8qIHNob3VsZCBoYXZlIG5vIHBvc3NpYmlsaXR5 IGZvciBvdXRlciBhdHRycyBhcyB3b3VsZCBiZSBwYXJzZWQNCj4+ICsgICAqIHdpdGggb3V0 ZXIgZXhwciAqLw0KPj4gKyAgYXV0byAmbF9leHByID0gZXhwci5nZXRfbGVmdF9leHByICgp Ow0KPj4gKyAgbF9leHByLT5hY2NlcHRfdmlzICgqdGhpcyk7DQo+PiArICBtYXliZV9leHBh bmRfZXhwciAobF9leHByKTsNCj4+ICsNCj4+ICsgIC8qIHNob3VsZCBzeW50YWN0aWNhbGx5 IG5vdCBoYXZlIG91dGVyIGF0dHJpYnV0ZXMsIHRob3VnaCB0aGlzIG1heQ0KPj4gKyAgICog bm90IGhhdmUgd29ya2VkIGluIHByYWN0aWNlICovDQo+PiArICBhdXRvICZyX2V4cHIgPSBl eHByLmdldF9yaWdodF9leHByICgpOw0KPj4gKyAgcl9leHByLT5hY2NlcHRfdmlzICgqdGhp cyk7DQo+PiArICBtYXliZV9leHBhbmRfZXhwciAocl9leHByKTsNCj4+ICsNCj4+ICsgIC8v IGVuc3VyZSB0aGF0IHRoZXkgYXJlIG5vdCBtYXJrZWQgZm9yIHN0cmlwDQo+PiArICBpZiAo ZXhwci5nZXRfbGVmdF9leHByICgpLT5pc19tYXJrZWRfZm9yX3N0cmlwICgpKQ0KPj4gKyAg ICBydXN0X2Vycm9yX2F0IChleHByLmdldF9sZWZ0X2V4cHIgKCktPmdldF9sb2N1cyAoKSwN Cj4+ICsgICAgICAgICAgICAgICAgICAiY2Fubm90IHN0cmlwIGV4cHJlc3Npb24gaW4gdGhp cyBwb3NpdGlvbiAtIG91dGVyICINCj4+ICsgICAgICAgICAgICAgICAgICAiYXR0cmlidXRl cyBhcmUgbmV2ZXIgYWxsb3dlZCAiDQo+PiArICAgICAgICAgICAgICAgICAgImJlZm9yZSBi aW5hcnkgb3AgZXhwcnMiKTsNCj4+ICsgIGlmIChleHByLmdldF9yaWdodF9leHByICgpLT5p c19tYXJrZWRfZm9yX3N0cmlwICgpKQ0KPj4gKyAgICBydXN0X2Vycm9yX2F0IChleHByLmdl dF9yaWdodF9leHByICgpLT5nZXRfbG9jdXMgKCksDQo+PiArICAgICAgICAgICAgICAgICAg ImNhbm5vdCBzdHJpcCBleHByZXNzaW9uIGluIHRoaXMgcG9zaXRpb24gLSBvdXRlciAiDQo+ PiArICAgICAgICAgICAgICAgICAgImF0dHJpYnV0ZXMgbm90IGFsbG93ZWQiKTsNCj4+ICt9 DQo+PiArdm9pZA0KPj4gK0F0dHJWaXNpdG9yOjp2aXNpdCAoQVNUOjpHcm91cGVkRXhwciAm ZXhwcikNCj4+ICt7DQo+PiArICAvLyBpbml0aWFsIHN0cmlwIHRlc3QgYmFzZWQgb24gb3V0 ZXIgYXR0cnMNCj4+ICsgIGV4cGFuZGVyLmV4cGFuZF9jZmdfYXR0cnMgKGV4cHIuZ2V0X291 dGVyX2F0dHJzICgpKTsNCj4+ICsgIGlmIChleHBhbmRlci5mYWlsc19jZmdfd2l0aF9leHBh bmQgKGV4cHIuZ2V0X291dGVyX2F0dHJzICgpKSkNCj4+ICsgICAgew0KPj4gKyAgICAgIGV4 cHIubWFya19mb3Jfc3RyaXAgKCk7DQo+PiArICAgICAgcmV0dXJuOw0KPj4gKyAgICB9DQo+ PiArDQo+PiArICAvKiBzdHJpcCB0ZXN0IGJhc2VkIG9uIGlubmVyIGF0dHJzIC0gc3BlYyBz YXlzIHRoZXNlIGFyZSBpbm5lcg0KPj4gKyAgICogYXR0cmlidXRlcywgbm90IG91dGVyIGF0 dHJpYnV0ZXMgb2YgaW5uZXIgZXhwciAqLw0KPj4gKyAgZXhwYW5kZXIuZXhwYW5kX2NmZ19h dHRycyAoZXhwci5nZXRfaW5uZXJfYXR0cnMgKCkpOw0KPj4gKyAgaWYgKGV4cGFuZGVyLmZh aWxzX2NmZ193aXRoX2V4cGFuZCAoZXhwci5nZXRfaW5uZXJfYXR0cnMgKCkpKQ0KPj4gKyAg ICB7DQo+PiArICAgICAgZXhwci5tYXJrX2Zvcl9zdHJpcCAoKTsNCj4+ICsgICAgICByZXR1 cm47DQo+PiArICAgIH0NCj4+ICsNCj4+ICsgIC8qIHN0cmlwIGFueSBpbnRlcm5hbCBzdWIt ZXhwcmVzc2lvbnMgLSBleHByZXNzaW9uIGl0c2VsZiBpc24ndA0KPj4gKyAgICogYWxsb3dl ZCB0byBoYXZlIGV4dGVybmFsIGF0dHJpYnV0ZXMgaW4gdGhpcyBwb3NpdGlvbiBzbyBjYW4n dCBiZQ0KPj4gKyAgICogc3RyaXBwZWQuICovDQo+PiArICBhdXRvICZpbm5lcl9leHByID0g ZXhwci5nZXRfZXhwcl9pbl9wYXJlbnMgKCk7DQo+PiArICBpbm5lcl9leHByLT5hY2NlcHRf dmlzICgqdGhpcyk7DQo+PiArICBpZiAoaW5uZXJfZXhwci0+aXNfbWFya2VkX2Zvcl9zdHJp cCAoKSkNCj4+ICsgICAgcnVzdF9lcnJvcl9hdCAoaW5uZXJfZXhwci0+Z2V0X2xvY3VzICgp LA0KPj4gKyAgICAgICAgICAgICAgICAgICJjYW5ub3Qgc3RyaXAgZXhwcmVzc2lvbiBpbiB0 aGlzIHBvc2l0aW9uIC0gb3V0ZXIgIg0KPj4gKyAgICAgICAgICAgICAgICAgICJhdHRyaWJ1 dGVzIG5vdCBhbGxvd2VkIik7DQo+PiArfQ0KPj4gK3ZvaWQNCj4+ICtBdHRyVmlzaXRvcjo6 dmlzaXQgKEFTVDo6QXJyYXlFbGVtc1ZhbHVlcyAmZWxlbXMpDQo+PiArew0KPj4gKyAgLyog YXBwYXJlbnRseSBvdXRlciBhdHRyaWJ1dGVzIGFyZSBhbGxvd2VkIGluICJlbGVtZW50cyBv ZiBhcnJheQ0KPj4gKyAgICogZXhwcmVzc2lvbnMiIGFjY29yZGluZyB0byBzcGVjICovDQo+ PiArICBleHBhbmRfcG9pbnRlcl9hbGxvd19zdHJpcCAoZWxlbXMuZ2V0X3ZhbHVlcyAoKSk7 DQo+PiArfQ0KPj4gK3ZvaWQNCj4+ICtBdHRyVmlzaXRvcjo6dmlzaXQgKEFTVDo6QXJyYXlF bGVtc0NvcGllZCAmZWxlbXMpDQo+PiArew0KPj4gKyAgLyogYXBwYXJlbnRseSBvdXRlciBh dHRyaWJ1dGVzIGFyZSBhbGxvd2VkIGluICJlbGVtZW50cyBvZiBhcnJheQ0KPj4gKyAgICog ZXhwcmVzc2lvbnMiIGFjY29yZGluZyB0byBzcGVjLiBvbiB0aGUgb3RoZXIgaGFuZCwgaXQg d291bGQgbm90DQo+PiArICAgKiBtYWtlIGNvbmNlcHR1YWwgc2Vuc2UgdG8gYmUgYWJsZSB0 byByZW1vdmUgZWl0aGVyIGV4cHJlc3Npb24uIEFzDQo+PiArICAgKiBzdWNoLCBub3QgaW1w bGVtZW50aW5nLiBUT0RPIGNsZWFyIHVwIHRoZSBhbWJpZ3VpdHkgaGVyZSAqLw0KPj4gKw0K Pj4gKyAgLy8gb25seSBpbnRlbmQgc3RyaXBwaW5nIGZvciBpbnRlcm5hbCBzdWItZXhwcmVz c2lvbnMNCj4+ICsgIGF1dG8gJmNvcGllZF9leHByID0gZWxlbXMuZ2V0X2VsZW1fdG9fY29w eSAoKTsNCj4+ICsgIGNvcGllZF9leHByLT5hY2NlcHRfdmlzICgqdGhpcyk7DQo+PiArICBp ZiAoY29waWVkX2V4cHItPmlzX21hcmtlZF9mb3Jfc3RyaXAgKCkpDQo+PiArICAgIHJ1c3Rf ZXJyb3JfYXQgKGNvcGllZF9leHByLT5nZXRfbG9jdXMgKCksDQo+PiArICAgICAgICAgICAg ICAgICAgImNhbm5vdCBzdHJpcCBleHByZXNzaW9uIGluIHRoaXMgcG9zaXRpb24gLSBvdXRl ciAiDQo+PiArICAgICAgICAgICAgICAgICAgImF0dHJpYnV0ZXMgbm90IGFsbG93ZWQiKTsN Cj4+ICsNCj4+ICsgIGF1dG8gJmNvcHlfY291bnQgPSBlbGVtcy5nZXRfbnVtX2NvcGllcyAo KTsNCj4+ICsgIGNvcHlfY291bnQtPmFjY2VwdF92aXMgKCp0aGlzKTsNCj4+ICsgIGlmIChj b3B5X2NvdW50LT5pc19tYXJrZWRfZm9yX3N0cmlwICgpKQ0KPj4gKyAgICBydXN0X2Vycm9y X2F0IChjb3B5X2NvdW50LT5nZXRfbG9jdXMgKCksDQo+PiArICAgICAgICAgICAgICAgICAg ImNhbm5vdCBzdHJpcCBleHByZXNzaW9uIGluIHRoaXMgcG9zaXRpb24gLSBvdXRlciAiDQo+ PiArICAgICAgICAgICAgICAgICAgImF0dHJpYnV0ZXMgbm90IGFsbG93ZWQiKTsNCj4+ICt9 DQo+PiArdm9pZA0KPj4gK0F0dHJWaXNpdG9yOjp2aXNpdCAoQVNUOjpBcnJheUV4cHIgJmV4 cHIpDQo+PiArew0KPj4gKyAgLy8gaW5pdGlhbCBzdHJpcCB0ZXN0IGJhc2VkIG9uIG91dGVy IGF0dHJzDQo+PiArICBleHBhbmRlci5leHBhbmRfY2ZnX2F0dHJzIChleHByLmdldF9vdXRl cl9hdHRycyAoKSk7DQo+PiArICBpZiAoZXhwYW5kZXIuZmFpbHNfY2ZnX3dpdGhfZXhwYW5k IChleHByLmdldF9vdXRlcl9hdHRycyAoKSkpDQo+PiArICAgIHsNCj4+ICsgICAgICBleHBy Lm1hcmtfZm9yX3N0cmlwICgpOw0KPj4gKyAgICAgIHJldHVybjsNCj4+ICsgICAgfQ0KPj4g Kw0KPj4gKyAgLyogc3RyaXAgdGVzdCBiYXNlZCBvbiBpbm5lciBhdHRycyAtIHNwZWMgc2F5 cyB0aGVyZSBhcmUgc2VwYXJhdGUNCj4+ICsgICAqIGlubmVyIGF0dHJpYnV0ZXMsIG5vdCBq dXN0IG91dGVyIGF0dHJpYnV0ZXMgb2YgaW5uZXIgZXhwcnMgKi8NCj4+ICsgIGV4cGFuZGVy LmV4cGFuZF9jZmdfYXR0cnMgKGV4cHIuZ2V0X2lubmVyX2F0dHJzICgpKTsNCj4+ICsgIGlm IChleHBhbmRlci5mYWlsc19jZmdfd2l0aF9leHBhbmQgKGV4cHIuZ2V0X2lubmVyX2F0dHJz ICgpKSkNCj4+ICsgICAgew0KPj4gKyAgICAgIGV4cHIubWFya19mb3Jfc3RyaXAgKCk7DQo+ PiArICAgICAgcmV0dXJuOw0KPj4gKyAgICB9DQo+PiArDQo+PiArICAvKiBhc3N1bWluZyB5 b3UgY2FuJ3Qgc3RyaXAgYXdheSB0aGUgQXJyYXlFbGVtcyB0eXBlLCBidXQgY2FuIHN0cmlw DQo+PiArICAgKiBpbnRlcm5hbCBleHByZXNzaW9ucyBhbmQgd2hhdGV2ZXIgKi8NCj4+ICsg IGV4cHIuZ2V0X2FycmF5X2VsZW1zICgpLT5hY2NlcHRfdmlzICgqdGhpcyk7DQo+PiArfQ0K Pj4gK3ZvaWQNCj4+ICtBdHRyVmlzaXRvcjo6dmlzaXQgKEFTVDo6QXJyYXlJbmRleEV4cHIg JmV4cHIpDQo+PiArew0KPj4gKyAgLyogaXQgaXMgdW5jbGVhciB3aGV0aGVyIG91dGVyIGF0 dHJpYnV0ZXMgYXJlIHN1cHBvc2VkIHRvIGJlDQo+PiArICAgKiBhbGxvd2VkLCBidXQgY29u Y2VwdHVhbGx5IGl0IHdvdWxkbid0IG1ha2UgbXVjaCBzZW5zZSwgYnV0DQo+PiArICAgKiBo YXZpbmcgZXhwYW5zaW9uIGNvZGUgYW55d2F5LiBUT0RPICovDQo+PiArICAvLyBpbml0aWFs IHN0cmlwIHRlc3QgYmFzZWQgb24gb3V0ZXIgYXR0cnMNCj4+ICsgIGV4cGFuZGVyLmV4cGFu ZF9jZmdfYXR0cnMgKGV4cHIuZ2V0X291dGVyX2F0dHJzICgpKTsNCj4+ICsgIGlmIChleHBh bmRlci5mYWlsc19jZmdfd2l0aF9leHBhbmQgKGV4cHIuZ2V0X291dGVyX2F0dHJzICgpKSkN Cj4+ICsgICAgew0KPj4gKyAgICAgIGV4cHIubWFya19mb3Jfc3RyaXAgKCk7DQo+PiArICAg ICAgcmV0dXJuOw0KPj4gKyAgICB9DQo+PiArDQo+PiArICAvKiBzdHJpcCBhbnkgaW50ZXJu YWwgc3ViLWV4cHJlc3Npb25zIC0gZXhwcmVzc2lvbiBpdHNlbGYgaXNuJ3QNCj4+ICsgICAq IGFsbG93ZWQgdG8gaGF2ZSBleHRlcm5hbCBhdHRyaWJ1dGVzIGluIHRoaXMgcG9zaXRpb24g c28gY2FuJ3QgYmUNCj4+ICsgICAqIHN0cmlwcGVkLiAqLw0KPj4gKyAgYXV0byAmYXJyYXlf ZXhwciA9IGV4cHIuZ2V0X2FycmF5X2V4cHIgKCk7DQo+PiArICBhcnJheV9leHByLT5hY2Nl cHRfdmlzICgqdGhpcyk7DQo+PiArICBpZiAoYXJyYXlfZXhwci0+aXNfbWFya2VkX2Zvcl9z dHJpcCAoKSkNCj4+ICsgICAgcnVzdF9lcnJvcl9hdCAoYXJyYXlfZXhwci0+Z2V0X2xvY3Vz ICgpLA0KPj4gKyAgICAgICAgICAgICAgICAgICJjYW5ub3Qgc3RyaXAgZXhwcmVzc2lvbiBp biB0aGlzIHBvc2l0aW9uIC0gb3V0ZXIgIg0KPj4gKyAgICAgICAgICAgICAgICAgICJhdHRy aWJ1dGVzIG5vdCBhbGxvd2VkIik7DQo+PiArDQo+PiArICBhdXRvICZpbmRleF9leHByID0g ZXhwci5nZXRfaW5kZXhfZXhwciAoKTsNCj4+ICsgIGluZGV4X2V4cHItPmFjY2VwdF92aXMg KCp0aGlzKTsNCj4+ICsgIGlmIChpbmRleF9leHByLT5pc19tYXJrZWRfZm9yX3N0cmlwICgp KQ0KPj4gKyAgICBydXN0X2Vycm9yX2F0IChpbmRleF9leHByLT5nZXRfbG9jdXMgKCksDQo+ PiArICAgICAgICAgICAgICAgICAgImNhbm5vdCBzdHJpcCBleHByZXNzaW9uIGluIHRoaXMg cG9zaXRpb24gLSBvdXRlciAiDQo+PiArICAgICAgICAgICAgICAgICAgImF0dHJpYnV0ZXMg bm90IGFsbG93ZWQiKTsNCj4+ICt9DQo+PiArdm9pZA0KPj4gK0F0dHJWaXNpdG9yOjp2aXNp dCAoQVNUOjpUdXBsZUV4cHIgJmV4cHIpDQo+PiArew0KPj4gKyAgLyogYWNjb3JkaW5nIHRv IHNwZWMsIG91dGVyIGF0dHJpYnV0ZXMgYXJlIGFsbG93ZWQgb24gImVsZW1lbnRzIG9mDQo+ PiArICAgKiB0dXBsZSBleHByZXNzaW9ucyIgKi8NCj4+ICsNCj4+ICsgIC8vIGluaXRpYWwg c3RyaXAgdGVzdCBiYXNlZCBvbiBvdXRlciBhdHRycw0KPj4gKyAgZXhwYW5kZXIuZXhwYW5k X2NmZ19hdHRycyAoZXhwci5nZXRfb3V0ZXJfYXR0cnMgKCkpOw0KPj4gKyAgaWYgKGV4cGFu ZGVyLmZhaWxzX2NmZ193aXRoX2V4cGFuZCAoZXhwci5nZXRfb3V0ZXJfYXR0cnMgKCkpKQ0K Pj4gKyAgICB7DQo+PiArICAgICAgZXhwci5tYXJrX2Zvcl9zdHJpcCAoKTsNCj4+ICsgICAg ICByZXR1cm47DQo+PiArICAgIH0NCj4+ICsNCj4+ICsgIC8qIHN0cmlwIHRlc3QgYmFzZWQg b24gaW5uZXIgYXR0cnMgLSBzcGVjIHNheXMgdGhlc2UgYXJlIGlubmVyDQo+PiArICAgKiBh dHRyaWJ1dGVzLCBub3Qgb3V0ZXIgYXR0cmlidXRlcyBvZiBpbm5lciBleHByICovDQo+PiAr ICBleHBhbmRlci5leHBhbmRfY2ZnX2F0dHJzIChleHByLmdldF9pbm5lcl9hdHRycyAoKSk7 DQo+PiArICBpZiAoZXhwYW5kZXIuZmFpbHNfY2ZnX3dpdGhfZXhwYW5kIChleHByLmdldF9p bm5lcl9hdHRycyAoKSkpDQo+PiArICAgIHsNCj4+ICsgICAgICBleHByLm1hcmtfZm9yX3N0 cmlwICgpOw0KPj4gKyAgICAgIHJldHVybjsNCj4+ICsgICAgfQ0KPj4gKw0KPj4gKyAgLyog YXBwYXJlbnRseSBvdXRlciBhdHRyaWJ1dGVzIGFyZSBhbGxvd2VkIGluICJlbGVtZW50cyBv ZiB0dXBsZQ0KPj4gKyAgICogZXhwcmVzc2lvbnMiIGFjY29yZGluZyB0byBzcGVjICovDQo+ PiArICBleHBhbmRfcG9pbnRlcl9hbGxvd19zdHJpcCAoZXhwci5nZXRfdHVwbGVfZWxlbXMg KCkpOw0KPj4gK30NCj4+ICt2b2lkDQo+PiArQXR0clZpc2l0b3I6OnZpc2l0IChBU1Q6OlR1 cGxlSW5kZXhFeHByICZleHByKQ0KPj4gK3sNCj4+ICsgIC8vIGluaXRpYWwgc3RyaXAgdGVz dCBiYXNlZCBvbiBvdXRlciBhdHRycw0KPj4gKyAgZXhwYW5kZXIuZXhwYW5kX2NmZ19hdHRy cyAoZXhwci5nZXRfb3V0ZXJfYXR0cnMgKCkpOw0KPj4gKyAgaWYgKGV4cGFuZGVyLmZhaWxz X2NmZ193aXRoX2V4cGFuZCAoZXhwci5nZXRfb3V0ZXJfYXR0cnMgKCkpKQ0KPj4gKyAgICB7 DQo+PiArICAgICAgZXhwci5tYXJrX2Zvcl9zdHJpcCAoKTsNCj4+ICsgICAgICByZXR1cm47 DQo+PiArICAgIH0NCj4+ICsNCj4+ICsgIC8qIHdvdWxkbid0IHN0cmlwIHRoaXMgZGlyZWN0 bHkgKGFzIG91dGVyIGF0dHJzIHNob3VsZCBiZQ0KPj4gKyAgICogYXNzb2NpYXRlZCB3aXRo IHRoaXMgbGV2ZWwpLCBidXQgYW55IHN1Yi1leHByZXNzaW9ucyB3b3VsZCBiZQ0KPj4gKyAg ICogc3RyaXBwZWQuIFRodXMsIG5vIG5lZWQgdG8gZXJhc2Ugd2hlbiBzdHJpcCBjaGVjayBj YWxsZWQuICovDQo+PiArICBhdXRvICZ0dXBsZV9leHByID0gZXhwci5nZXRfdHVwbGVfZXhw ciAoKTsNCj4+ICsgIHR1cGxlX2V4cHItPmFjY2VwdF92aXMgKCp0aGlzKTsNCj4+ICsgIGlm ICh0dXBsZV9leHByLT5pc19tYXJrZWRfZm9yX3N0cmlwICgpKQ0KPj4gKyAgICBydXN0X2Vy cm9yX2F0ICh0dXBsZV9leHByLT5nZXRfbG9jdXMgKCksDQo+PiArICAgICAgICAgICAgICAg ICAgImNhbm5vdCBzdHJpcCBleHByZXNzaW9uIGluIHRoaXMgcG9zaXRpb24gLSBvdXRlciAi DQo+PiArICAgICAgICAgICAgICAgICAgImF0dHJpYnV0ZXMgbm90IGFsbG93ZWQiKTsNCj4+ ICt9DQo+PiArdm9pZA0KPj4gK0F0dHJWaXNpdG9yOjp2aXNpdCAoQVNUOjpTdHJ1Y3RFeHBy U3RydWN0ICZleHByKQ0KPj4gK3sNCj4+ICsgIC8vIGluaXRpYWwgc3RyaXAgdGVzdCBiYXNl ZCBvbiBvdXRlciBhdHRycw0KPj4gKyAgZXhwYW5kZXIuZXhwYW5kX2NmZ19hdHRycyAoZXhw ci5nZXRfb3V0ZXJfYXR0cnMgKCkpOw0KPj4gKyAgaWYgKGV4cGFuZGVyLmZhaWxzX2NmZ193 aXRoX2V4cGFuZCAoZXhwci5nZXRfb3V0ZXJfYXR0cnMgKCkpKQ0KPj4gKyAgICB7DQo+PiAr ICAgICAgZXhwci5tYXJrX2Zvcl9zdHJpcCAoKTsNCj4+ICsgICAgICByZXR1cm47DQo+PiAr ICAgIH0NCj4+ICsNCj4+ICsgIC8qIHN0cmlwIHRlc3QgYmFzZWQgb24gaW5uZXIgYXR0cnMg LSBzcGVjIHNheXMgdGhlc2UgYXJlIGlubmVyDQo+PiArICAgKiBhdHRyaWJ1dGVzLCBub3Qg b3V0ZXIgYXR0cmlidXRlcyBvZiBpbm5lciBleHByICovDQo+PiArICBleHBhbmRlci5leHBh bmRfY2ZnX2F0dHJzIChleHByLmdldF9pbm5lcl9hdHRycyAoKSk7DQo+PiArICBpZiAoZXhw YW5kZXIuZmFpbHNfY2ZnX3dpdGhfZXhwYW5kIChleHByLmdldF9pbm5lcl9hdHRycyAoKSkp DQo+PiArICAgIHsNCj4+ICsgICAgICBleHByLm1hcmtfZm9yX3N0cmlwICgpOw0KPj4gKyAg ICAgIHJldHVybjsNCj4+ICsgICAgfQ0KPj4gKw0KPj4gKyAgLy8gc3RyaXAgc3ViLWV4cHJz IG9mIHBhdGgNCj4+ICsgIGF1dG8gJnN0cnVjdF9uYW1lID0gZXhwci5nZXRfc3RydWN0X25h bWUgKCk7DQo+PiArICB2aXNpdCAoc3RydWN0X25hbWUpOw0KPj4gKyAgaWYgKHN0cnVjdF9u YW1lLmlzX21hcmtlZF9mb3Jfc3RyaXAgKCkpDQo+PiArICAgIHJ1c3RfZXJyb3JfYXQgKHN0 cnVjdF9uYW1lLmdldF9sb2N1cyAoKSwNCj4+ICsgICAgICAgICAgICAgICAgICAiY2Fubm90 IHN0cmlwIHBhdGggaW4gdGhpcyBwb3NpdGlvbiIpOw0KPj4gK30NCj4+ICt2b2lkDQo+PiAr QXR0clZpc2l0b3I6OnZpc2l0IChBU1Q6OlN0cnVjdEV4cHJGaWVsZElkZW50aWZpZXIgJikN Cj4+ICt7DQo+PiArICAvLyBhcyBubyBhdHRycyAoYXQgbW9tZW50LCBhdCBsZWFzdCksIG5v IHN0cmlwcGluZyBwb3NzaWJsZQ0KPiANCj4gaGFzDQo+IA0KPiBpcyB0aGVyZSBhIHJlYXNv biB0byBub3QgcHV0IGEgZ2NjX3VucmVhY2hhYmxlICgpIGhlcmU/DQo+IA0KDQpUaGUgdmlz aXRvciBnb2VzIHRocm91Z2ggYWxsIHRoZSBub2RlcyBpbiBhIGNyYXRlLCBldmVuIGlmIHRo ZXJlIGlzIA0Kbm90aGluZyB0byBkby4gSW4gdGhlIGNhc2Ugb2YgdGhlIEF0dHJpYnV0ZSB2 aXNpdG9yLCB0aGVyZSBjdXJyZW50bHkgDQppc24ndCBhbnl0aGluZyB0byBkbyBmb3IgdGhl IGZvbGxvd2luZyBwYXR0ZXJuICh3aGljaCBpcyB3aGF0IA0KYFN0cnVjdEV4cHJlRmllbGRJ ZGVudGlmaWVyYCBpcyB0aGUgbm9kZSBmb3IpDQoNCmBgYHJ1c3QNCnN0cnVjdCBGb28gew0K ICAgICBhOiBpMzIsDQogICAgIGI6IGkzMiwNCn0NCg0KZm4gaW5pdF9zdHJ1Y3Rfd2l0aF9h KGE6IGkzMikgLT4gRm9vIHsNCiAgICAgRm9vIHsNCiAgICAgICAgIGEsICAgICAgICAvLyA8 LS0tIGhlcmUNCiAgICAgICAgIGI6IHNvbWVfZm4oKSwNCiAgICAgfQ0KfQ0KYGBgDQoNCndo ZXJlIGEgc3RydWN0J3MgZmllbGQgaXMgaW5pdGlhbGl6ZWQgYnkgYSB2YXJpYWJsZSBvZiB0 aGUgc2FtZSBuYW1lIA0KKHRoaXMgaXMgYSBzaG9ydC1oYW5kIGZvciBgYTogYWApLg0KDQpC dXQgdGhhdCBkb2VzIG5vdCBtZWFuIHRoYXQgdGhlIG5vZGUgaXMgbm90IHZpc2l0ZWQuIFdo YXQgaGFwcGVucyBpcyANCnRoYXQgd2UgdmlzaXQgYWxsIHRoZSBub2RlcyBvZiBhIHN0cnVj dCdzIGluaXRpYWxpemF0aW9uLCB3aGljaCBhcmUgb2YgDQp0aGUgYmFzZSBjbGFzcyBgU3Ry dWN0RXhwckZpZWxkYCBhbmQgdGhlbiBkeW5hbWljYWxseSBkaXNwYXRjaCB0byB0aGUgDQpw cm9wZXIgdmlzaXRvciBmdW5jdGlvbnMsIHdlIG11c3QgaGFuZGxlIHRoZSBjYXNlIG9mIGEg DQpgU3RydWN0RXhwckZpZWxkSWRlbnRpZmllcmAgYmVpbmcgdmlzaXRlZCBldmVuIGlmIHRo ZXJlIGlzIG5vdGhpbmcgdG8gZG8uDQoNCklmIHdlIGFkZCBhIGBnY2NfdW5yZWFjaGFibGVg IGhlcmUsIHRoZSBhYm92ZSB0ZXN0IGNhc2Ugd291bGQgY3Jhc2gsIGFzIA0KaXQgd291bGQg dHJ5IHN0cmlwcGluZyB0aGUgYXR0cmlidXRlcyBvZiBib3RoIGZpZWxkIGluaXRhbGl6YXRp b25zLiBGb3IgDQp0aGUgZmlyc3QgY2FzZSwgdGhlcmUgaXMgbm90aGluZyB0byBkby4gRm9y IHRoZSBzZWNvbmQgY2FzZSwgd2Ugd2FudCB0byANCm1ha2Ugc3VyZSB3ZSBzaG91bGQgbm90 IGJlIHN0cmlwcGluZyB0aGUgc3ViLWV4cHJlc3Npb24gKHRoZSBjYWxsIHRvIA0KYHNvbWVf Zm5gKQ0KDQo+PiArfQ0KPj4gK3ZvaWQNCj4+ICtBdHRyVmlzaXRvcjo6dmlzaXQgKEFTVDo6 U3RydWN0RXhwckZpZWxkSWRlbnRpZmllclZhbHVlICZmaWVsZCkNCj4+ICt7DQo+PiArICAv KiBhcyBubyBhdHRycyBwb3NzaWJsZSAoYXQgbW9tZW50LCBhdCBsZWFzdCksIG9ubHkgc3Vi LWV4cHJlc3Npb24NCj4+ICsgICAqIHN0cmlwcGluZyBpcyBwb3NzaWJsZSAqLw0KPj4gKyAg YXV0byAmdmFsdWUgPSBmaWVsZC5nZXRfdmFsdWUgKCk7DQo+PiArICB2YWx1ZS0+YWNjZXB0 X3ZpcyAoKnRoaXMpOw0KPj4gKyAgaWYgKHZhbHVlLT5pc19tYXJrZWRfZm9yX3N0cmlwICgp KQ0KPj4gKyAgICBydXN0X2Vycm9yX2F0ICh2YWx1ZS0+Z2V0X2xvY3VzICgpLA0KPj4gKyAg ICAgICAgICAgICAgICAgICJjYW5ub3Qgc3RyaXAgZXhwcmVzc2lvbiBpbiB0aGlzIHBvc2l0 aW9uIC0gb3V0ZXIgIg0KPj4gKyAgICAgICAgICAgICAgICAgICJhdHRyaWJ1dGVzIG5vdCBh bGxvd2VkIik7DQo+PiArfQ0KPj4gK3ZvaWQNCj4+ICtBdHRyVmlzaXRvcjo6dmlzaXQgKEFT VDo6U3RydWN0RXhwckZpZWxkSW5kZXhWYWx1ZSAmZmllbGQpDQo+PiArew0KPj4gKyAgLyog YXMgbm8gYXR0cnMgcG9zc2libGUgKGF0IG1vbWVudCwgYXQgbGVhc3QpLCBvbmx5IHN1Yi1l eHByZXNzaW9uDQo+PiArICAgKiBzdHJpcHBpbmcgaXMgcG9zc2libGUgKi8NCj4+ICsgIGF1 dG8gJnZhbHVlID0gZmllbGQuZ2V0X3ZhbHVlICgpOw0KPj4gKyAgdmFsdWUtPmFjY2VwdF92 aXMgKCp0aGlzKTsNCj4+ICsgIGlmICh2YWx1ZS0+aXNfbWFya2VkX2Zvcl9zdHJpcCAoKSkN Cj4+ICsgICAgcnVzdF9lcnJvcl9hdCAodmFsdWUtPmdldF9sb2N1cyAoKSwNCj4+ICsgICAg ICAgICAgICAgICAgICAiY2Fubm90IHN0cmlwIGV4cHJlc3Npb24gaW4gdGhpcyBwb3NpdGlv biAtIG91dGVyICINCj4+ICsgICAgICAgICAgICAgICAgICAiYXR0cmlidXRlcyBub3QgYWxs b3dlZCIpOw0KPj4gK30NCj4+ICt2b2lkDQo+PiArQXR0clZpc2l0b3I6OnZpc2l0IChBU1Q6 OlN0cnVjdEV4cHJTdHJ1Y3RGaWVsZHMgJmV4cHIpDQo+PiArew0KPj4gKyAgLy8gaW5pdGlh bCBzdHJpcCB0ZXN0IGJhc2VkIG9uIG91dGVyIGF0dHJzDQo+PiArICBleHBhbmRlci5leHBh bmRfY2ZnX2F0dHJzIChleHByLmdldF9vdXRlcl9hdHRycyAoKSk7DQo+PiArICBpZiAoZXhw YW5kZXIuZmFpbHNfY2ZnX3dpdGhfZXhwYW5kIChleHByLmdldF9vdXRlcl9hdHRycyAoKSkp DQo+PiArICAgIHsNCj4+ICsgICAgICBleHByLm1hcmtfZm9yX3N0cmlwICgpOw0KPj4gKyAg ICAgIHJldHVybjsNCj4+ICsgICAgfQ0KPj4gKw0KPj4gKyAgLyogc3RyaXAgdGVzdCBiYXNl ZCBvbiBpbm5lciBhdHRycyAtIHNwZWMgc2F5cyB0aGVzZSBhcmUgaW5uZXINCj4+ICsgICAq IGF0dHJpYnV0ZXMsIG5vdCBvdXRlciBhdHRyaWJ1dGVzIG9mIGlubmVyIGV4cHIgKi8NCj4+ ICsgIGV4cGFuZGVyLmV4cGFuZF9jZmdfYXR0cnMgKGV4cHIuZ2V0X2lubmVyX2F0dHJzICgp KTsNCj4+ICsgIGlmIChleHBhbmRlci5mYWlsc19jZmdfd2l0aF9leHBhbmQgKGV4cHIuZ2V0 X2lubmVyX2F0dHJzICgpKSkNCj4+ICsgICAgew0KPj4gKyAgICAgIGV4cHIubWFya19mb3Jf c3RyaXAgKCk7DQo+PiArICAgICAgcmV0dXJuOw0KPj4gKyAgICB9DQo+PiArDQo+PiArICAv LyBzdHJpcCBzdWItZXhwcnMgb2YgcGF0aA0KPj4gKyAgYXV0byAmc3RydWN0X25hbWUgPSBl eHByLmdldF9zdHJ1Y3RfbmFtZSAoKTsNCj4+ICsgIHZpc2l0IChzdHJ1Y3RfbmFtZSk7DQo+ PiArICBpZiAoc3RydWN0X25hbWUuaXNfbWFya2VkX2Zvcl9zdHJpcCAoKSkNCj4+ICsgICAg cnVzdF9lcnJvcl9hdCAoc3RydWN0X25hbWUuZ2V0X2xvY3VzICgpLA0KPj4gKyAgICAgICAg ICAgICAgICAgICJjYW5ub3Qgc3RyaXAgcGF0aCBpbiB0aGlzIHBvc2l0aW9uIik7DQo+PiAr DQo+PiArICAvKiBzcGVjIGRvZXMgbm90IHNwZWNpZnkgd2hldGhlciBleHByZXNzaW9ucyBh cmUgYWxsb3dlZCB0byBiZQ0KPj4gKyAgICogc3RyaXBwZWQgYXQgdG9wIGxldmVsIG9mIHN0 cnVjdCBmaWVsZHMsIGJ1dCBJIHdvdWxkbid0IHRoaW5rDQo+PiArICAgKiB0aGF0IHRoZXkg d291bGQgYmUsIHNvIG9wZXJhdGluZyB1bmRlciB0aGUgYXNzdW1wdGlvbiB0aGF0IG9ubHkN Cj4+ICsgICAqIHN1Yi1leHByZXNzaW9ucyBjYW4gYmUgc3RyaXBwZWQuICovDQo+PiArICBm b3IgKGF1dG8gJmZpZWxkIDogZXhwci5nZXRfZmllbGRzICgpKQ0KPj4gKyAgICB7DQo+PiAr ICAgICAgZmllbGQtPmFjY2VwdF92aXMgKCp0aGlzKTsNCj4+ICsgICAgICAvLyBzaG91bGRu J3Qgc3RyaXAgaW4gdGhpcw0KPj4gKyAgICB9DQo+PiArDQo+PiArICAvKiBzdHJ1Y3QgYmFz ZSBwcmVzdW1hYmx5IGNhbid0IGJlIHN0cmlwcGVkLCBhcyB0aGUgJy4uJyBpcyBiZWZvcmUN Cj4+ICsgICAqIHRoZSBleHByZXNzaW9uLiBhcyBzdWNoLCBjYW4gb25seSBzdHJpcCBzdWIt ZXhwcmVzc2lvbnMuICovDQo+PiArICBpZiAoZXhwci5oYXNfc3RydWN0X2Jhc2UgKCkpDQo+ PiArICAgIHsNCj4+ICsgICAgICBhdXRvICZiYXNlX3N0cnVjdF9leHByID0gZXhwci5nZXRf c3RydWN0X2Jhc2UgKCkuZ2V0X2Jhc2Vfc3RydWN0ICgpOw0KPj4gKyAgICAgIGJhc2Vfc3Ry dWN0X2V4cHItPmFjY2VwdF92aXMgKCp0aGlzKTsNCj4+ICsgICAgICBpZiAoYmFzZV9zdHJ1 Y3RfZXhwci0+aXNfbWFya2VkX2Zvcl9zdHJpcCAoKSkNCj4+ICsgICAgICAgcnVzdF9lcnJv cl9hdCAoYmFzZV9zdHJ1Y3RfZXhwci0+Z2V0X2xvY3VzICgpLA0KPj4gKyAgICAgICAgICAg ICAgICAgICAgICAiY2Fubm90IHN0cmlwIGV4cHJlc3Npb24gaW4gdGhpcyBwb3NpdGlvbiAt IG91dGVyICINCj4+ICsgICAgICAgICAgICAgICAgICAgICAgImF0dHJpYnV0ZXMgbm90IGFs bG93ZWQiKTsNCj4+ICsgICAgfQ0KPj4gK30NCj4+ICt2b2lkDQo+PiArQXR0clZpc2l0b3I6 OnZpc2l0IChBU1Q6OlN0cnVjdEV4cHJTdHJ1Y3RCYXNlICZleHByKQ0KPj4gK3sNCj4+ICsg IC8vIGluaXRpYWwgc3RyaXAgdGVzdCBiYXNlZCBvbiBvdXRlciBhdHRycw0KPj4gKyAgZXhw YW5kZXIuZXhwYW5kX2NmZ19hdHRycyAoZXhwci5nZXRfb3V0ZXJfYXR0cnMgKCkpOw0KPj4g KyAgaWYgKGV4cGFuZGVyLmZhaWxzX2NmZ193aXRoX2V4cGFuZCAoZXhwci5nZXRfb3V0ZXJf YXR0cnMgKCkpKQ0KPj4gKyAgICB7DQo+PiArICAgICAgZXhwci5tYXJrX2Zvcl9zdHJpcCAo KTsNCj4+ICsgICAgICByZXR1cm47DQo+PiArICAgIH0NCj4+ICsNCj4+ICsgIC8qIHN0cmlw IHRlc3QgYmFzZWQgb24gaW5uZXIgYXR0cnMgLSBzcGVjIHNheXMgdGhlc2UgYXJlIGlubmVy DQo+PiArICAgKiBhdHRyaWJ1dGVzLCBub3Qgb3V0ZXIgYXR0cmlidXRlcyBvZiBpbm5lciBl eHByICovDQo+PiArICBleHBhbmRlci5leHBhbmRfY2ZnX2F0dHJzIChleHByLmdldF9pbm5l cl9hdHRycyAoKSk7DQo+PiArICBpZiAoZXhwYW5kZXIuZmFpbHNfY2ZnX3dpdGhfZXhwYW5k IChleHByLmdldF9pbm5lcl9hdHRycyAoKSkpDQo+PiArICAgIHsNCj4+ICsgICAgICBleHBy Lm1hcmtfZm9yX3N0cmlwICgpOw0KPj4gKyAgICAgIHJldHVybjsNCj4+ICsgICAgfQ0KPj4g Kw0KPj4gKyAgLy8gc3RyaXAgc3ViLWV4cHJzIG9mIHBhdGgNCj4+ICsgIGF1dG8gJnN0cnVj dF9uYW1lID0gZXhwci5nZXRfc3RydWN0X25hbWUgKCk7DQo+PiArICB2aXNpdCAoc3RydWN0 X25hbWUpOw0KPj4gKyAgaWYgKHN0cnVjdF9uYW1lLmlzX21hcmtlZF9mb3Jfc3RyaXAgKCkp DQo+PiArICAgIHJ1c3RfZXJyb3JfYXQgKHN0cnVjdF9uYW1lLmdldF9sb2N1cyAoKSwNCj4+ ICsgICAgICAgICAgICAgICAgICAiY2Fubm90IHN0cmlwIHBhdGggaW4gdGhpcyBwb3NpdGlv biIpOw0KPj4gKw0KPj4gKyAgLyogc3RydWN0IGJhc2UgcHJlc3VtYWJseSBjYW4ndCBiZSBz dHJpcHBlZCwgYXMgdGhlICcuLicgaXMgYmVmb3JlDQo+PiArICAgKiB0aGUgZXhwcmVzc2lv bi4gYXMgc3VjaCwgY2FuIG9ubHkgc3RyaXAgc3ViLWV4cHJlc3Npb25zLiAqLw0KPj4gKyAg cnVzdF9hc3NlcnQgKCFleHByLmdldF9zdHJ1Y3RfYmFzZSAoKS5pc19pbnZhbGlkICgpKTsN Cj4+ICsgIGF1dG8gJmJhc2Vfc3RydWN0X2V4cHIgPSBleHByLmdldF9zdHJ1Y3RfYmFzZSAo KS5nZXRfYmFzZV9zdHJ1Y3QgKCk7DQo+PiArICBiYXNlX3N0cnVjdF9leHByLT5hY2NlcHRf dmlzICgqdGhpcyk7DQo+PiArICBpZiAoYmFzZV9zdHJ1Y3RfZXhwci0+aXNfbWFya2VkX2Zv cl9zdHJpcCAoKSkNCj4+ICsgICAgcnVzdF9lcnJvcl9hdCAoYmFzZV9zdHJ1Y3RfZXhwci0+ Z2V0X2xvY3VzICgpLA0KPj4gKyAgICAgICAgICAgICAgICAgICJjYW5ub3Qgc3RyaXAgZXhw cmVzc2lvbiBpbiB0aGlzIHBvc2l0aW9uIC0gb3V0ZXIgIg0KPj4gKyAgICAgICAgICAgICAg ICAgICJhdHRyaWJ1dGVzIG5vdCBhbGxvd2VkIik7DQo+PiArfQ0KPj4gK3ZvaWQNCj4+ICtB dHRyVmlzaXRvcjo6dmlzaXQgKEFTVDo6Q2FsbEV4cHIgJmV4cHIpDQo+PiArew0KPj4gKyAg Ly8gaW5pdGlhbCBzdHJpcCB0ZXN0IGJhc2VkIG9uIG91dGVyIGF0dHJzDQo+PiArICBleHBh bmRlci5leHBhbmRfY2ZnX2F0dHJzIChleHByLmdldF9vdXRlcl9hdHRycyAoKSk7DQo+PiAr ICBpZiAoZXhwYW5kZXIuZmFpbHNfY2ZnX3dpdGhfZXhwYW5kIChleHByLmdldF9vdXRlcl9h dHRycyAoKSkpDQo+PiArICAgIHsNCj4+ICsgICAgICBleHByLm1hcmtfZm9yX3N0cmlwICgp Ow0KPj4gKyAgICAgIHJldHVybjsNCj4+ICsgICAgfQ0KPj4gKw0KPj4gKyAgLyogc2hvdWxk IG5vdCBiZSBvdXRlciBhdHRycyBvbiAiZnVuY3Rpb24iIGV4cHJlc3Npb24gLSBvdXRlciBh dHRycw0KPj4gKyAgICogc2hvdWxkIGJlIGFzc29jaWF0ZWQgd2l0aCBjYWxsIGV4cHIgYXMg YSB3aG9sZS4gb25seSBzdWItZXhwcg0KPj4gKyAgICogZXhwYW5zaW9uIGlzIHBvc3NpYmxl LiAqLw0KPj4gKyAgYXV0byAmZnVuY3Rpb24gPSBleHByLmdldF9mdW5jdGlvbl9leHByICgp Ow0KPj4gKyAgZnVuY3Rpb24tPmFjY2VwdF92aXMgKCp0aGlzKTsNCj4+ICsgIGlmIChmdW5j dGlvbi0+aXNfbWFya2VkX2Zvcl9zdHJpcCAoKSkNCj4+ICsgICAgcnVzdF9lcnJvcl9hdCAo ZnVuY3Rpb24tPmdldF9sb2N1cyAoKSwNCj4+ICsgICAgICAgICAgICAgICAgICAiY2Fubm90 IHN0cmlwIGV4cHJlc3Npb24gaW4gdGhpcyBwb3NpdGlvbiAtIG91dGVyICINCj4+ICsgICAg ICAgICAgICAgICAgICAiYXR0cmlidXRlcyBub3QgYWxsb3dlZCIpOw0KPj4gKw0KPj4gKyAg Lyogc3BlYyBzYXlzIG91dGVyIGF0dHJpYnV0ZXMgYXJlIHNwZWNpZmljYWxseSBhbGxvd2Vk IGZvciBlbGVtZW50cw0KPj4gKyAgICogb2YgY2FsbCBleHByZXNzaW9ucywgc28gZnVsbCBz dHJpcHBpbmcgcG9zc2libGUgKi8NCj4+ICsgIC8vIEZJWE1FOiBBcnRodXI6IEZpZ3VyZSBv dXQgaG93IHRvIHJlZmFjdG9yIHRoaXMgLSBUaGlzIGlzIHNpbWlsYXIgdG8NCj4+ICsgIC8v IGV4cGFuZGluZyBpdGVtcyBpbiB0aGUgY3JhdGUgb3Igc3RtdHMgaW4gYmxvY2tzDQo+PiAr ICBleHBhbmRfcG9pbnRlcl9hbGxvd19zdHJpcCAoZXhwci5nZXRfcGFyYW1zICgpKTsNCj4+ ICsgIGF1dG8gJnBhcmFtcyA9IGV4cHIuZ2V0X3BhcmFtcyAoKTsNCj4+ICsgIGZvciAoYXV0 byBpdCA9IHBhcmFtcy5iZWdpbiAoKTsgaXQgIT0gcGFyYW1zLmVuZCAoKTspDQo+PiArICAg IHsNCj4+ICsgICAgICBhdXRvICZzdG10ID0gKml0Ow0KPj4gKw0KPj4gKyAgICAgIHN0bXQt PmFjY2VwdF92aXMgKCp0aGlzKTsNCj4+ICsNCj4+ICsgICAgICBhdXRvIGZpbmFsX2ZyYWdt ZW50ID0gZXhwYW5kX21hY3JvX2ZyYWdtZW50X3JlY3Vyc2l2ZSAoKTsNCj4+ICsgICAgICBp ZiAoZmluYWxfZnJhZ21lbnQuc2hvdWxkX2V4cGFuZCAoKSkNCj4+ICsgICAgICAgew0KPj4g KyAgICAgICAgIC8vIFJlbW92ZSB0aGUgY3VycmVudCBleHBhbmRlZCBpbnZvY2F0aW9uDQo+ PiArICAgICAgICAgaXQgPSBwYXJhbXMuZXJhc2UgKGl0KTsNCj4+ICsgICAgICAgICBmb3Ig KGF1dG8gJm5vZGUgOiBmaW5hbF9mcmFnbWVudC5nZXRfbm9kZXMgKCkpDQo+PiArICAgICAg ICAgICB7DQo+PiArICAgICAgICAgICAgIGl0ID0gcGFyYW1zLmluc2VydCAoaXQsIG5vZGUu dGFrZV9leHByICgpKTsNCj4+ICsgICAgICAgICAgICAgaXQrKzsNCj4+ICsgICAgICAgICAg IH0NCj4+ICsgICAgICAgfQ0KPj4gKyAgICAgIGVsc2UgaWYgKHN0bXQtPmlzX21hcmtlZF9m b3Jfc3RyaXAgKCkpDQo+PiArICAgICAgIGl0ID0gcGFyYW1zLmVyYXNlIChpdCk7DQo+PiAr ICAgICAgZWxzZQ0KPj4gKyAgICAgICBpdCsrOw0KPj4gKyAgICB9DQo+PiArfQ0KPj4gK3Zv aWQNCj4+ICtBdHRyVmlzaXRvcjo6dmlzaXQgKEFTVDo6TWV0aG9kQ2FsbEV4cHIgJmV4cHIp DQo+PiArew0KPj4gKyAgLy8gaW5pdGlhbCBzdHJpcCB0ZXN0IGJhc2VkIG9uIG91dGVyIGF0 dHJzDQo+PiArICBleHBhbmRlci5leHBhbmRfY2ZnX2F0dHJzIChleHByLmdldF9vdXRlcl9h dHRycyAoKSk7DQo+PiArICBpZiAoZXhwYW5kZXIuZmFpbHNfY2ZnX3dpdGhfZXhwYW5kIChl eHByLmdldF9vdXRlcl9hdHRycyAoKSkpDQo+PiArICAgIHsNCj4+ICsgICAgICBleHByLm1h cmtfZm9yX3N0cmlwICgpOw0KPj4gKyAgICAgIHJldHVybjsNCj4+ICsgICAgfQ0KPj4gKw0K Pj4gKyAgLyogc2hvdWxkIG5vdCBiZSBvdXRlciBhdHRycyBvbiAicmVjZWl2ZXIiIGV4cHJl c3Npb24gLSBvdXRlciBhdHRycw0KPj4gKyAgICogc2hvdWxkIGJlIGFzc29jaWF0ZWQgd2l0 aCBjYWxsIGV4cHIgYXMgYSB3aG9sZS4gb25seSBzdWItZXhwcg0KPj4gKyAgICogZXhwYW5z aW9uIGlzIHBvc3NpYmxlLiAqLw0KPj4gKyAgYXV0byAmcmVjZWl2ZXIgPSBleHByLmdldF9y ZWNlaXZlcl9leHByICgpOw0KPj4gKyAgcmVjZWl2ZXItPmFjY2VwdF92aXMgKCp0aGlzKTsN Cj4+ICsgIGlmIChyZWNlaXZlci0+aXNfbWFya2VkX2Zvcl9zdHJpcCAoKSkNCj4+ICsgICAg cnVzdF9lcnJvcl9hdCAocmVjZWl2ZXItPmdldF9sb2N1cyAoKSwNCj4+ICsgICAgICAgICAg ICAgICAgICAiY2Fubm90IHN0cmlwIGV4cHJlc3Npb24gaW4gdGhpcyBwb3NpdGlvbiAtIG91 dGVyICINCj4+ICsgICAgICAgICAgICAgICAgICAiYXR0cmlidXRlcyBub3QgYWxsb3dlZCIp Ow0KPj4gKw0KPj4gKyAgYXV0byAmbWV0aG9kX25hbWUgPSBleHByLmdldF9tZXRob2RfbmFt ZSAoKTsNCj4+ICsgIGlmIChtZXRob2RfbmFtZS5oYXNfZ2VuZXJpY19hcmdzICgpKQ0KPj4g KyAgICBleHBhbmRfZ2VuZXJpY19hcmdzIChtZXRob2RfbmFtZS5nZXRfZ2VuZXJpY19hcmdz ICgpKTsNCj4+ICsNCj4+ICsgIC8qIHNwZWMgc2F5cyBvdXRlciBhdHRyaWJ1dGVzIGFyZSBz cGVjaWZpY2FsbHkgYWxsb3dlZCBmb3IgZWxlbWVudHMNCj4+ICsgICAqIG9mIG1ldGhvZCBj YWxsIGV4cHJlc3Npb25zLCBzbyBmdWxsIHN0cmlwcGluZyBwb3NzaWJsZSAqLw0KPj4gKyAg ZXhwYW5kX3BvaW50ZXJfYWxsb3dfc3RyaXAgKGV4cHIuZ2V0X3BhcmFtcyAoKSk7DQo+PiAr fQ0KPj4gK3ZvaWQNCj4+ICtBdHRyVmlzaXRvcjo6dmlzaXQgKEFTVDo6RmllbGRBY2Nlc3NF eHByICZleHByKQ0KPj4gK3sNCj4+ICsgIC8vIGluaXRpYWwgc3RyaXAgdGVzdCBiYXNlZCBv biBvdXRlciBhdHRycw0KPj4gKyAgZXhwYW5kZXIuZXhwYW5kX2NmZ19hdHRycyAoZXhwci5n ZXRfb3V0ZXJfYXR0cnMgKCkpOw0KPj4gKyAgaWYgKGV4cGFuZGVyLmZhaWxzX2NmZ193aXRo X2V4cGFuZCAoZXhwci5nZXRfb3V0ZXJfYXR0cnMgKCkpKQ0KPj4gKyAgICB7DQo+PiArICAg ICAgZXhwci5tYXJrX2Zvcl9zdHJpcCAoKTsNCj4+ICsgICAgICByZXR1cm47DQo+PiArICAg IH0NCj4+ICsNCj4+ICsgIC8qIHNob3VsZCBub3QgYmUgb3V0ZXIgYXR0cnMgb24gInJlY2Vp dmVyIiBleHByZXNzaW9uIC0gb3V0ZXIgYXR0cnMNCj4+ICsgICAqIHNob3VsZCBiZSBhc3Nv Y2lhdGVkIHdpdGggZmllbGQgZXhwciBhcyBhIHdob2xlLiBvbmx5IHN1Yi1leHByDQo+PiAr ICAgKiBleHBhbnNpb24gaXMgcG9zc2libGUuICovDQo+PiArICBhdXRvICZyZWNlaXZlciA9 IGV4cHIuZ2V0X3JlY2VpdmVyX2V4cHIgKCk7DQo+PiArICByZWNlaXZlci0+YWNjZXB0X3Zp cyAoKnRoaXMpOw0KPj4gKyAgaWYgKHJlY2VpdmVyLT5pc19tYXJrZWRfZm9yX3N0cmlwICgp KQ0KPj4gKyAgICBydXN0X2Vycm9yX2F0IChyZWNlaXZlci0+Z2V0X2xvY3VzICgpLA0KPj4g KyAgICAgICAgICAgICAgICAgICJjYW5ub3Qgc3RyaXAgZXhwcmVzc2lvbiBpbiB0aGlzIHBv c2l0aW9uIC0gb3V0ZXIgIg0KPj4gKyAgICAgICAgICAgICAgICAgICJhdHRyaWJ1dGVzIG5v dCBhbGxvd2VkIik7DQo+PiArfQ0KPj4gK3ZvaWQNCj4+ICtBdHRyVmlzaXRvcjo6dmlzaXQg KEFTVDo6Q2xvc3VyZUV4cHJJbm5lciAmZXhwcikNCj4+ICt7DQo+PiArICAvLyBpbml0aWFs IHN0cmlwIHRlc3QgYmFzZWQgb24gb3V0ZXIgYXR0cnMNCj4+ICsgIGV4cGFuZGVyLmV4cGFu ZF9jZmdfYXR0cnMgKGV4cHIuZ2V0X291dGVyX2F0dHJzICgpKTsNCj4+ICsgIGlmIChleHBh bmRlci5mYWlsc19jZmdfd2l0aF9leHBhbmQgKGV4cHIuZ2V0X291dGVyX2F0dHJzICgpKSkN Cj4+ICsgICAgew0KPj4gKyAgICAgIGV4cHIubWFya19mb3Jfc3RyaXAgKCk7DQo+PiArICAg ICAgcmV0dXJuOw0KPj4gKyAgICB9DQo+PiArDQo+PiArICAvKiBzdHJpcCBjbG9zdXJlIHBh cmFtZXRlcnMgaWYgcmVxdWlyZWQgLSB0aGlzIGlzIHNwZWNpZmljYWxseQ0KPj4gKyAgICog YWxsb3dlZCBieSBzcGVjICovDQo+PiArICBleHBhbmRfY2xvc3VyZV9wYXJhbXMgKGV4cHIu Z2V0X3BhcmFtcyAoKSk7DQo+PiArDQo+PiArICAvLyBjYW4ndCBzdHJpcCBleHByZXNzaW9u IGl0c2VsZiwgYnV0IGNhbiBzdHJpcCBzdWItZXhwcmVzc2lvbnMNCj4+ICsgIGF1dG8gJmRl ZmluaXRpb25fZXhwciA9IGV4cHIuZ2V0X2RlZmluaXRpb25fZXhwciAoKTsNCj4+ICsgIGRl ZmluaXRpb25fZXhwci0+YWNjZXB0X3ZpcyAoKnRoaXMpOw0KPj4gKyAgaWYgKGRlZmluaXRp b25fZXhwci0+aXNfbWFya2VkX2Zvcl9zdHJpcCAoKSkNCj4+ICsgICAgcnVzdF9lcnJvcl9h dCAoZGVmaW5pdGlvbl9leHByLT5nZXRfbG9jdXMgKCksDQo+PiArICAgICAgICAgICAgICAg ICAgImNhbm5vdCBzdHJpcCBleHByZXNzaW9uIGluIHRoaXMgcG9zaXRpb24gLSBvdXRlciAi DQo+PiArICAgICAgICAgICAgICAgICAgImF0dHJpYnV0ZXMgbm90IGFsbG93ZWQiKTsNCj4+ ICt9DQo+PiArDQo+PiArdm9pZA0KPj4gK0F0dHJWaXNpdG9yOjp2aXNpdCAoQVNUOjpCbG9j a0V4cHIgJmV4cHIpDQo+PiArew0KPj4gKyAgLy8gaW5pdGlhbCBzdHJpcCB0ZXN0IGJhc2Vk IG9uIG91dGVyIGF0dHJzDQo+PiArICBleHBhbmRlci5leHBhbmRfY2ZnX2F0dHJzIChleHBy LmdldF9vdXRlcl9hdHRycyAoKSk7DQo+PiArICBpZiAoZXhwYW5kZXIuZmFpbHNfY2ZnX3dp dGhfZXhwYW5kIChleHByLmdldF9vdXRlcl9hdHRycyAoKSkpDQo+PiArICAgIHsNCj4+ICsg ICAgICBleHByLm1hcmtfZm9yX3N0cmlwICgpOw0KPj4gKyAgICAgIHJldHVybjsNCj4+ICsg ICAgfQ0KPj4gKw0KPj4gKyAgLyogc3RyaXAgdGVzdCBiYXNlZCBvbiBpbm5lciBhdHRycyAt IHNwZWMgc2F5cyB0aGVyZSBhcmUgaW5uZXINCj4+ICsgICAqIGF0dHJpYnV0ZXMsIG5vdCBq dXN0IG91dGVyIGF0dHJpYnV0ZXMgb2YgaW5uZXIgc3RtdHMgKi8NCj4+ICsgIGV4cGFuZGVy LmV4cGFuZF9jZmdfYXR0cnMgKGV4cHIuZ2V0X2lubmVyX2F0dHJzICgpKTsNCj4+ICsgIGlm IChleHBhbmRlci5mYWlsc19jZmdfd2l0aF9leHBhbmQgKGV4cHIuZ2V0X2lubmVyX2F0dHJz ICgpKSkNCj4+ICsgICAgew0KPj4gKyAgICAgIGV4cHIubWFya19mb3Jfc3RyaXAgKCk7DQo+ PiArICAgICAgcmV0dXJuOw0KPj4gKyAgICB9DQo+PiArDQo+PiArICBzdGQ6OmZ1bmN0aW9u PHN0ZDo6dW5pcXVlX3B0cjxBU1Q6OlN0bXQ+IChBU1Q6OlNpbmdsZUFTVE5vZGUpPiBleHRy YWN0b3INCj4+ICsgICAgPSBbXSAoQVNUOjpTaW5nbGVBU1ROb2RlIG5vZGUpIHsgcmV0dXJu IG5vZGUudGFrZV9zdG10ICgpOyB9Ow0KPj4gKw0KPj4gKyAgZXhwYW5kX21hY3JvX2NoaWxk cmVuIChNYWNyb0V4cGFuZGVyOjpCTE9DSywgZXhwci5nZXRfc3RhdGVtZW50cyAoKSwNCj4+ ICsgICAgICAgICAgICAgICAgICAgICAgICBleHRyYWN0b3IpOw0KPj4gKw0KPj4gKyAgZXhw YW5kZXIucHVzaF9jb250ZXh0IChNYWNyb0V4cGFuZGVyOjpCTE9DSyk7DQo+PiArDQo+PiAr ICAvLyBzdHJpcCB0YWlsIGV4cHJlc3Npb24gaWYgZXhpc3RzIC0gY2FuIGFjdHVhbGx5IGZ1 bGx5IHJlbW92ZSBpdA0KPj4gKyAgaWYgKGV4cHIuaGFzX3RhaWxfZXhwciAoKSkNCj4+ICsg ICAgew0KPj4gKyAgICAgIGF1dG8gJnRhaWxfZXhwciA9IGV4cHIuZ2V0X3RhaWxfZXhwciAo KTsNCj4+ICsNCj4+ICsgICAgICB0YWlsX2V4cHItPmFjY2VwdF92aXMgKCp0aGlzKTsNCj4+ ICsgICAgICBtYXliZV9leHBhbmRfZXhwciAodGFpbF9leHByKTsNCj4+ICsNCj4+ICsgICAg ICBpZiAodGFpbF9leHByLT5pc19tYXJrZWRfZm9yX3N0cmlwICgpKQ0KPj4gKyAgICAgICBl eHByLnN0cmlwX3RhaWxfZXhwciAoKTsNCj4+ICsgICAgfQ0KPj4gKyAgZXhwYW5kZXIucG9w X2NvbnRleHQgKCk7DQo+PiArfQ0KPj4gKw0KPj4gK3ZvaWQNCj4+ICtBdHRyVmlzaXRvcjo6 dmlzaXQgKEFTVDo6Q2xvc3VyZUV4cHJJbm5lclR5cGVkICZleHByKQ0KPj4gK3sNCj4+ICsg IC8vIGluaXRpYWwgc3RyaXAgdGVzdCBiYXNlZCBvbiBvdXRlciBhdHRycw0KPj4gKyAgZXhw YW5kZXIuZXhwYW5kX2NmZ19hdHRycyAoZXhwci5nZXRfb3V0ZXJfYXR0cnMgKCkpOw0KPj4g KyAgaWYgKGV4cGFuZGVyLmZhaWxzX2NmZ193aXRoX2V4cGFuZCAoZXhwci5nZXRfb3V0ZXJf YXR0cnMgKCkpKQ0KPj4gKyAgICB7DQo+PiArICAgICAgZXhwci5tYXJrX2Zvcl9zdHJpcCAo KTsNCj4+ICsgICAgICByZXR1cm47DQo+PiArICAgIH0NCj4+ICsNCj4+ICsgIC8qIHN0cmlw IGNsb3N1cmUgcGFyYW1ldGVycyBpZiByZXF1aXJlZCAtIHRoaXMgaXMgc3BlY2lmaWNhbGx5 DQo+PiArICAgKiBhbGxvd2VkIGJ5IHNwZWMgKi8NCj4+ICsgIGV4cGFuZF9jbG9zdXJlX3Bh cmFtcyAoZXhwci5nZXRfcGFyYW1zICgpKTsNCj4+ICsNCj4+ICsgIGV4cGFuZGVyLnB1c2hf Y29udGV4dCAoTWFjcm9FeHBhbmRlcjo6Q29udGV4dFR5cGU6OlRZUEUpOw0KPj4gKw0KPj4g KyAgLy8gY2FuJ3Qgc3RyaXAgcmV0dXJuIHR5cGUsIGJ1dCBjYW4gc3RyaXAgc3ViLXR5cGVz DQo+PiArICBhdXRvICZ0eXBlID0gZXhwci5nZXRfcmV0dXJuX3R5cGUgKCk7DQo+PiArICB0 eXBlLT5hY2NlcHRfdmlzICgqdGhpcyk7DQo+PiArDQo+PiArICBtYXliZV9leHBhbmRfdHlw ZSAodHlwZSk7DQo+PiArDQo+PiArICBpZiAodHlwZS0+aXNfbWFya2VkX2Zvcl9zdHJpcCAo KSkNCj4+ICsgICAgcnVzdF9lcnJvcl9hdCAodHlwZS0+Z2V0X2xvY3VzICgpLCAiY2Fubm90 IHN0cmlwIHR5cGUgaW4gdGhpcyBwb3NpdGlvbiIpOw0KPj4gKw0KPj4gKyAgZXhwYW5kZXIu cG9wX2NvbnRleHQgKCk7DQo+PiArDQo+PiArICAvLyBjYW4ndCBzdHJpcCBleHByZXNzaW9u IGl0c2VsZiwgYnV0IGNhbiBzdHJpcCBzdWItZXhwcmVzc2lvbnMNCj4+ICsgIGF1dG8gJmRl ZmluaXRpb25fYmxvY2sgPSBleHByLmdldF9kZWZpbml0aW9uX2Jsb2NrICgpOw0KPj4gKyAg ZGVmaW5pdGlvbl9ibG9jay0+YWNjZXB0X3ZpcyAoKnRoaXMpOw0KPj4gKyAgaWYgKGRlZmlu aXRpb25fYmxvY2stPmlzX21hcmtlZF9mb3Jfc3RyaXAgKCkpDQo+PiArICAgIHJ1c3RfZXJy b3JfYXQgKGRlZmluaXRpb25fYmxvY2stPmdldF9sb2N1cyAoKSwNCj4+ICsgICAgICAgICAg ICAgICAgICAiY2Fubm90IHN0cmlwIGJsb2NrIGV4cHJlc3Npb24gaW4gdGhpcyBwb3NpdGlv biAtIG91dGVyICINCj4+ICsgICAgICAgICAgICAgICAgICAiYXR0cmlidXRlcyBub3QgYWxs b3dlZCIpOw0KPj4gK30NCj4+ICt2b2lkDQo+PiArQXR0clZpc2l0b3I6OnZpc2l0IChBU1Q6 OkNvbnRpbnVlRXhwciAmZXhwcikNCj4+ICt7DQo+PiArICAvLyBpbml0aWFsIHN0cmlwIHRl c3QgYmFzZWQgb24gb3V0ZXIgYXR0cnMNCj4+ICsgIGV4cGFuZGVyLmV4cGFuZF9jZmdfYXR0 cnMgKGV4cHIuZ2V0X291dGVyX2F0dHJzICgpKTsNCj4+ICsgIGlmIChleHBhbmRlci5mYWls c19jZmdfd2l0aF9leHBhbmQgKGV4cHIuZ2V0X291dGVyX2F0dHJzICgpKSkNCj4+ICsgICAg ew0KPj4gKyAgICAgIGV4cHIubWFya19mb3Jfc3RyaXAgKCk7DQo+PiArICAgICAgcmV0dXJu Ow0KPj4gKyAgICB9DQo+PiArfQ0KPj4gK3ZvaWQNCj4+ICtBdHRyVmlzaXRvcjo6dmlzaXQg KEFTVDo6QnJlYWtFeHByICZleHByKQ0KPj4gK3sNCj4+ICsgIC8vIGluaXRpYWwgc3RyaXAg dGVzdCBiYXNlZCBvbiBvdXRlciBhdHRycw0KPj4gKyAgZXhwYW5kZXIuZXhwYW5kX2NmZ19h dHRycyAoZXhwci5nZXRfb3V0ZXJfYXR0cnMgKCkpOw0KPj4gKyAgaWYgKGV4cGFuZGVyLmZh aWxzX2NmZ193aXRoX2V4cGFuZCAoZXhwci5nZXRfb3V0ZXJfYXR0cnMgKCkpKQ0KPj4gKyAg ICB7DQo+PiArICAgICAgZXhwci5tYXJrX2Zvcl9zdHJpcCAoKTsNCj4+ICsgICAgICByZXR1 cm47DQo+PiArICAgIH0NCj4+ICsNCj4+ICsgIC8qIHNwZWMgZG9lcyBub3Qgc2F5IHRoYXQg eW91IGNhbiBoYXZlIG91dGVyIGF0dHJpYnV0ZXMgb24NCj4+ICsgICAqIGV4cHJlc3Npb24s IHNvIGFzc3VtaW5nIHlvdSBjYW4ndC4gc3RyaXBwaW5nIGZvciBzdWItZXhwcmVzc2lvbnMN Cj4+ICsgICAqIGlzIHRoZSBvbmx5IHRoaW5nIHRoYXQgY2FuIGJlIGRvbmUgKi8NCj4+ICsg IGlmIChleHByLmhhc19icmVha19leHByICgpKQ0KPj4gKyAgICB7DQo+PiArICAgICAgYXV0 byAmYnJlYWtfZXhwciA9IGV4cHIuZ2V0X2JyZWFrX2V4cHIgKCk7DQo+PiArDQo+PiArICAg ICAgYnJlYWtfZXhwci0+YWNjZXB0X3ZpcyAoKnRoaXMpOw0KPj4gKw0KPj4gKyAgICAgIGlm IChicmVha19leHByLT5pc19tYXJrZWRfZm9yX3N0cmlwICgpKQ0KPj4gKyAgICAgICBydXN0 X2Vycm9yX2F0IChicmVha19leHByLT5nZXRfbG9jdXMgKCksDQo+PiArICAgICAgICAgICAg ICAgICAgICAgICJjYW5ub3Qgc3RyaXAgZXhwcmVzc2lvbiBpbiB0aGlzIHBvc2l0aW9uIC0g b3V0ZXIgIg0KPj4gKyAgICAgICAgICAgICAgICAgICAgICAiYXR0cmlidXRlcyBub3QgYWxs b3dlZCIpOw0KPj4gKyAgICB9DQo+PiArfQ0KPj4gK3ZvaWQNCj4+ICtBdHRyVmlzaXRvcjo6 dmlzaXQgKEFTVDo6UmFuZ2VGcm9tVG9FeHByICZleHByKQ0KPj4gK3sNCj4+ICsgIC8qIG91 dGVyIGF0dHJpYnV0ZXMgbmV2ZXIgYWxsb3dlZCBiZWZvcmUgdGhlc2UuIHdoaWxlIGNhbm5v dCBzdHJpcA0KPj4gKyAgICogdHdvIGRpcmVjdCBkZXNjZW5kYW50IGV4cHJlc3Npb25zLCBj YW4gc3RyaXAgb25lcyBiZWxvdyB0aGF0ICovDQo+PiArDQo+PiArICAvKiBzaG91bGQgaGF2 ZSBubyBwb3NzaWJpbGl0eSBmb3Igb3V0ZXIgYXR0cnMgYXMgd291bGQgYmUgcGFyc2VkDQo+ PiArICAgKiB3aXRoIG91dGVyIGV4cHIgKi8NCj4+ICsgIGV4cHIuZ2V0X2Zyb21fZXhwciAo KS0+YWNjZXB0X3ZpcyAoKnRoaXMpOw0KPj4gKyAgLyogc2hvdWxkIHN5bnRhY3RpY2FsbHkg bm90IGhhdmUgb3V0ZXIgYXR0cmlidXRlcywgdGhvdWdoIHRoaXMgbWF5DQo+PiArICAgKiBu b3QgaGF2ZSB3b3JrZWQgaW4gcHJhY3RpY2UgKi8NCj4+ICsgIGV4cHIuZ2V0X3RvX2V4cHIg KCktPmFjY2VwdF92aXMgKCp0aGlzKTsNCj4+ICsNCj4+ICsgIC8vIGVuc3VyZSB0aGF0IHRo ZXkgYXJlIG5vdCBtYXJrZWQgZm9yIHN0cmlwDQo+PiArICBpZiAoZXhwci5nZXRfZnJvbV9l eHByICgpLT5pc19tYXJrZWRfZm9yX3N0cmlwICgpKQ0KPj4gKyAgICBydXN0X2Vycm9yX2F0 IChleHByLmdldF9mcm9tX2V4cHIgKCktPmdldF9sb2N1cyAoKSwNCj4+ICsgICAgICAgICAg ICAgICAgICAiY2Fubm90IHN0cmlwIGV4cHJlc3Npb24gaW4gdGhpcyBwb3NpdGlvbiAtIG91 dGVyICINCj4+ICsgICAgICAgICAgICAgICAgICAiYXR0cmlidXRlcyBhcmUgbmV2ZXIgYWxs b3dlZCAiDQo+PiArICAgICAgICAgICAgICAgICAgImJlZm9yZSByYW5nZSBleHBycyIpOw0K Pj4gKyAgaWYgKGV4cHIuZ2V0X3RvX2V4cHIgKCktPmlzX21hcmtlZF9mb3Jfc3RyaXAgKCkp DQo+PiArICAgIHJ1c3RfZXJyb3JfYXQgKGV4cHIuZ2V0X3RvX2V4cHIgKCktPmdldF9sb2N1 cyAoKSwNCj4+ICsgICAgICAgICAgICAgICAgICAiY2Fubm90IHN0cmlwIGV4cHJlc3Npb24g aW4gdGhpcyBwb3NpdGlvbiAtIG91dGVyICINCj4+ICsgICAgICAgICAgICAgICAgICAiYXR0 cmlidXRlcyBub3QgYWxsb3dlZCIpOw0KPj4gK30NCj4+ICt2b2lkDQo+PiArQXR0clZpc2l0 b3I6OnZpc2l0IChBU1Q6OlJhbmdlRnJvbUV4cHIgJmV4cHIpDQo+PiArew0KPj4gKyAgLyog b3V0ZXIgYXR0cmlidXRlcyBuZXZlciBhbGxvd2VkIGJlZm9yZSB0aGVzZS4gd2hpbGUgY2Fu bm90IHN0cmlwDQo+PiArICAgKiBkaXJlY3QgZGVzY2VuZGFudCBleHByZXNzaW9uLCBjYW4g c3RyaXAgb25lcyBiZWxvdyB0aGF0ICovDQo+PiArDQo+PiArICAvKiBzaG91bGQgaGF2ZSBu byBwb3NzaWJpbGl0eSBmb3Igb3V0ZXIgYXR0cnMgYXMgd291bGQgYmUgcGFyc2VkDQo+PiAr ICAgKiB3aXRoIG91dGVyIGV4cHIgKi8NCj4+ICsgIGF1dG8gJmZyb21fZXhwciA9IGV4cHIu Z2V0X2Zyb21fZXhwciAoKTsNCj4+ICsNCj4+ICsgIGZyb21fZXhwci0+YWNjZXB0X3ZpcyAo KnRoaXMpOw0KPj4gKw0KPj4gKyAgaWYgKGZyb21fZXhwci0+aXNfbWFya2VkX2Zvcl9zdHJp cCAoKSkNCj4+ICsgICAgcnVzdF9lcnJvcl9hdCAoZnJvbV9leHByLT5nZXRfbG9jdXMgKCks DQo+PiArICAgICAgICAgICAgICAgICAgImNhbm5vdCBzdHJpcCBleHByZXNzaW9uIGluIHRo aXMgcG9zaXRpb24gLSBvdXRlciAiDQo+PiArICAgICAgICAgICAgICAgICAgImF0dHJpYnV0 ZXMgYXJlIG5ldmVyIGFsbG93ZWQgYmVmb3JlIHJhbmdlIGV4cHJzIik7DQo+PiArfQ0KPj4g K3ZvaWQNCj4+ICtBdHRyVmlzaXRvcjo6dmlzaXQgKEFTVDo6UmFuZ2VUb0V4cHIgJmV4cHIp DQo+PiArew0KPj4gKyAgLyogb3V0ZXIgYXR0cmlidXRlcyBuZXZlciBhbGxvd2VkIGJlZm9y ZSB0aGVzZS4gd2hpbGUgY2Fubm90IHN0cmlwDQo+PiArICAgKiBkaXJlY3QgZGVzY2VuZGFu dCBleHByZXNzaW9uLCBjYW4gc3RyaXAgb25lcyBiZWxvdyB0aGF0ICovDQo+PiArDQo+PiAr ICAvKiBzaG91bGQgc3ludGFjdGljYWxseSBub3QgaGF2ZSBvdXRlciBhdHRyaWJ1dGVzLCB0 aG91Z2ggdGhpcyBtYXkNCj4+ICsgICAqIG5vdCBoYXZlIHdvcmtlZCBpbiBwcmFjdGljZSAq Lw0KPj4gKyAgYXV0byAmdG9fZXhwciA9IGV4cHIuZ2V0X3RvX2V4cHIgKCk7DQo+PiArDQo+ PiArICB0b19leHByLT5hY2NlcHRfdmlzICgqdGhpcyk7DQo+PiArDQo+PiArICBpZiAodG9f ZXhwci0+aXNfbWFya2VkX2Zvcl9zdHJpcCAoKSkNCj4+ICsgICAgcnVzdF9lcnJvcl9hdCAo dG9fZXhwci0+Z2V0X2xvY3VzICgpLA0KPj4gKyAgICAgICAgICAgICAgICAgICJjYW5ub3Qg c3RyaXAgZXhwcmVzc2lvbiBpbiB0aGlzIHBvc2l0aW9uIC0gb3V0ZXIgIg0KPj4gKyAgICAg ICAgICAgICAgICAgICJhdHRyaWJ1dGVzIG5vdCBhbGxvd2VkIik7DQo+PiArfQ0KPj4gK3Zv aWQNCj4+ICtBdHRyVmlzaXRvcjo6dmlzaXQgKEFTVDo6UmFuZ2VGdWxsRXhwciAmKQ0KPj4g K3sNCj4+ICsgIC8vIG91dGVyIGF0dHJpYnV0ZXMgbmV2ZXIgYWxsb3dlZCBiZWZvcmUgdGhl c2UsIHNvIG5vIHN0cmlwcGluZw0KPj4gK30NCj4+ICt2b2lkDQo+PiArQXR0clZpc2l0b3I6 OnZpc2l0IChBU1Q6OlJhbmdlRnJvbVRvSW5jbEV4cHIgJmV4cHIpDQo+PiArew0KPj4gKyAg Lyogb3V0ZXIgYXR0cmlidXRlcyBuZXZlciBhbGxvd2VkIGJlZm9yZSB0aGVzZS4gd2hpbGUg Y2Fubm90IHN0cmlwDQo+PiArICAgKiB0d28gZGlyZWN0IGRlc2NlbmRhbnQgZXhwcmVzc2lv bnMsIGNhbiBzdHJpcCBvbmVzIGJlbG93IHRoYXQgKi8NCj4+ICsNCj4+ICsgIC8qIHNob3Vs ZCBoYXZlIG5vIHBvc3NpYmlsaXR5IGZvciBvdXRlciBhdHRycyBhcyB3b3VsZCBiZSBwYXJz ZWQNCj4+ICsgICAqIHdpdGggb3V0ZXIgZXhwciAqLw0KPj4gKyAgZXhwci5nZXRfZnJvbV9l eHByICgpLT5hY2NlcHRfdmlzICgqdGhpcyk7DQo+PiArICAvKiBzaG91bGQgc3ludGFjdGlj YWxseSBub3QgaGF2ZSBvdXRlciBhdHRyaWJ1dGVzLCB0aG91Z2ggdGhpcyBtYXkNCj4+ICsg ICAqIG5vdCBoYXZlIHdvcmtlZCBpbiBwcmFjdGljZSAqLw0KPj4gKyAgZXhwci5nZXRfdG9f ZXhwciAoKS0+YWNjZXB0X3ZpcyAoKnRoaXMpOw0KPj4gKw0KPj4gKyAgLy8gZW5zdXJlIHRo YXQgdGhleSBhcmUgbm90IG1hcmtlZCBmb3Igc3RyaXANCj4+ICsgIGlmIChleHByLmdldF9m cm9tX2V4cHIgKCktPmlzX21hcmtlZF9mb3Jfc3RyaXAgKCkpDQo+PiArICAgIHJ1c3RfZXJy b3JfYXQgKGV4cHIuZ2V0X2Zyb21fZXhwciAoKS0+Z2V0X2xvY3VzICgpLA0KPj4gKyAgICAg ICAgICAgICAgICAgICJjYW5ub3Qgc3RyaXAgZXhwcmVzc2lvbiBpbiB0aGlzIHBvc2l0aW9u IC0gb3V0ZXIgIg0KPj4gKyAgICAgICAgICAgICAgICAgICJhdHRyaWJ1dGVzIGFyZSBuZXZl ciBhbGxvd2VkICINCj4+ICsgICAgICAgICAgICAgICAgICAiYmVmb3JlIHJhbmdlIGV4cHJz Iik7DQo+PiArICBpZiAoZXhwci5nZXRfdG9fZXhwciAoKS0+aXNfbWFya2VkX2Zvcl9zdHJp cCAoKSkNCj4+ICsgICAgcnVzdF9lcnJvcl9hdCAoZXhwci5nZXRfdG9fZXhwciAoKS0+Z2V0 X2xvY3VzICgpLA0KPj4gKyAgICAgICAgICAgICAgICAgICJjYW5ub3Qgc3RyaXAgZXhwcmVz c2lvbiBpbiB0aGlzIHBvc2l0aW9uIC0gb3V0ZXIgIg0KPj4gKyAgICAgICAgICAgICAgICAg ICJhdHRyaWJ1dGVzIG5vdCBhbGxvd2VkIik7DQo+PiArfQ0KPj4gK3ZvaWQNCj4+ICtBdHRy VmlzaXRvcjo6dmlzaXQgKEFTVDo6UmFuZ2VUb0luY2xFeHByICZleHByKQ0KPj4gK3sNCj4+ ICsgIC8qIG91dGVyIGF0dHJpYnV0ZXMgbmV2ZXIgYWxsb3dlZCBiZWZvcmUgdGhlc2UuIHdo aWxlIGNhbm5vdCBzdHJpcA0KPj4gKyAgICogZGlyZWN0IGRlc2NlbmRhbnQgZXhwcmVzc2lv biwgY2FuIHN0cmlwIG9uZXMgYmVsb3cgdGhhdCAqLw0KPj4gKw0KPj4gKyAgLyogc2hvdWxk IHN5bnRhY3RpY2FsbHkgbm90IGhhdmUgb3V0ZXIgYXR0cmlidXRlcywgdGhvdWdoIHRoaXMg bWF5DQo+PiArICAgKiBub3QgaGF2ZSB3b3JrZWQgaW4gcHJhY3RpY2UgKi8NCj4+ICsgIGF1 dG8gJnRvX2V4cHIgPSBleHByLmdldF90b19leHByICgpOw0KPj4gKw0KPj4gKyAgdG9fZXhw ci0+YWNjZXB0X3ZpcyAoKnRoaXMpOw0KPj4gKw0KPj4gKyAgaWYgKHRvX2V4cHItPmlzX21h cmtlZF9mb3Jfc3RyaXAgKCkpDQo+PiArICAgIHJ1c3RfZXJyb3JfYXQgKHRvX2V4cHItPmdl dF9sb2N1cyAoKSwNCj4+ICsgICAgICAgICAgICAgICAgICAiY2Fubm90IHN0cmlwIGV4cHJl c3Npb24gaW4gdGhpcyBwb3NpdGlvbiAtIG91dGVyICINCj4+ICsgICAgICAgICAgICAgICAg ICAiYXR0cmlidXRlcyBub3QgYWxsb3dlZCIpOw0KPj4gK30NCj4+ICt2b2lkDQo+PiArQXR0 clZpc2l0b3I6OnZpc2l0IChBU1Q6OlJldHVybkV4cHIgJmV4cHIpDQo+PiArew0KPj4gKyAg Ly8gaW5pdGlhbCBzdHJpcCB0ZXN0IGJhc2VkIG9uIG91dGVyIGF0dHJzDQo+PiArICBleHBh bmRlci5leHBhbmRfY2ZnX2F0dHJzIChleHByLmdldF9vdXRlcl9hdHRycyAoKSk7DQo+PiAr ICBpZiAoZXhwYW5kZXIuZmFpbHNfY2ZnX3dpdGhfZXhwYW5kIChleHByLmdldF9vdXRlcl9h dHRycyAoKSkpDQo+PiArICAgIHsNCj4+ICsgICAgICBleHByLm1hcmtfZm9yX3N0cmlwICgp Ow0KPj4gKyAgICAgIHJldHVybjsNCj4+ICsgICAgfQ0KPj4gKw0KPj4gKyAgLyogc3BlYyBk b2VzIG5vdCBzYXkgdGhhdCB5b3UgY2FuIGhhdmUgb3V0ZXIgYXR0cmlidXRlcyBvbg0KPj4g KyAgICogZXhwcmVzc2lvbiwgc28gYXNzdW1pbmcgeW91IGNhbid0LiBzdHJpcHBpbmcgZm9y IHN1Yi1leHByZXNzaW9ucw0KPj4gKyAgICogaXMgdGhlIG9ubHkgdGhpbmcgdGhhdCBjYW4g YmUgZG9uZSAqLw0KPj4gKyAgaWYgKGV4cHIuaGFzX3JldHVybmVkX2V4cHIgKCkpDQo+PiAr ICAgIHsNCj4+ICsgICAgICBhdXRvICZyZXR1cm5lZF9leHByID0gZXhwci5nZXRfcmV0dXJu ZWRfZXhwciAoKTsNCj4+ICsNCj4+ICsgICAgICByZXR1cm5lZF9leHByLT5hY2NlcHRfdmlz ICgqdGhpcyk7DQo+PiArDQo+PiArICAgICAgaWYgKHJldHVybmVkX2V4cHItPmlzX21hcmtl ZF9mb3Jfc3RyaXAgKCkpDQo+PiArICAgICAgIHJ1c3RfZXJyb3JfYXQgKHJldHVybmVkX2V4 cHItPmdldF9sb2N1cyAoKSwNCj4+ICsgICAgICAgICAgICAgICAgICAgICAgImNhbm5vdCBz dHJpcCBleHByZXNzaW9uIGluIHRoaXMgcG9zaXRpb24gLSBvdXRlciAiDQo+PiArICAgICAg ICAgICAgICAgICAgICAgICJhdHRyaWJ1dGVzIG5vdCBhbGxvd2VkIik7DQo+PiArICAgIH0N Cj4+ICsgIC8qIFRPRE86IGNvbmNlcHR1YWxseSwgeW91IHdvdWxkIG1heWJlIGJlIGFibGUg dG8gcmVtb3ZlIGEgcmV0dXJuZWQNCj4+ICsgICAqIGV4cHIgLSBlLmcuIGlmIHlvdSBoYWQg Y29uZGl0aW9uYWwgY29tcGlsYXRpb24gcmV0dXJuaW5nIHZvaWQgb3INCj4+ICsgICAqIHJl dHVybmluZyBhIHR5cGUuIE9uIHRoZSBvdGhlciBoYW5kLCBJIHRoaW5rIHRoYXQgZnVuY3Rp b24NCj4+ICsgICAqIHJldHVybiB0eXBlIGNhbm5vdCBiZSBjb25kaXRpb25hbGx5IGNvbXBp bGVkLCBzbyBJIGFzc3VtZWQgeW91DQo+PiArICAgKiBjYW4ndCBkbyB0aGlzIGVpdGhlci4g Ki8NCj4+ICt9DQo+PiArdm9pZA0KPj4gK0F0dHJWaXNpdG9yOjp2aXNpdCAoQVNUOjpVbnNh ZmVCbG9ja0V4cHIgJmV4cHIpDQo+PiArew0KPj4gKyAgLy8gaW5pdGlhbCBzdHJpcCB0ZXN0 IGJhc2VkIG9uIG91dGVyIGF0dHJzDQo+PiArICBleHBhbmRlci5leHBhbmRfY2ZnX2F0dHJz IChleHByLmdldF9vdXRlcl9hdHRycyAoKSk7DQo+PiArICBpZiAoZXhwYW5kZXIuZmFpbHNf Y2ZnX3dpdGhfZXhwYW5kIChleHByLmdldF9vdXRlcl9hdHRycyAoKSkpDQo+PiArICAgIHsN Cj4+ICsgICAgICBleHByLm1hcmtfZm9yX3N0cmlwICgpOw0KPj4gKyAgICAgIHJldHVybjsN Cj4+ICsgICAgfQ0KPj4gKw0KPj4gKyAgLy8gY2FuJ3Qgc3RyaXAgYmxvY2sgaXRzZWxmLCBi dXQgY2FuIHN0cmlwIHN1Yi1leHByZXNzaW9ucw0KPj4gKyAgYXV0byAmYmxvY2tfZXhwciA9 IGV4cHIuZ2V0X2Jsb2NrX2V4cHIgKCk7DQo+PiArICBibG9ja19leHByLT5hY2NlcHRfdmlz ICgqdGhpcyk7DQo+PiArICBpZiAoYmxvY2tfZXhwci0+aXNfbWFya2VkX2Zvcl9zdHJpcCAo KSkNCj4+ICsgICAgcnVzdF9lcnJvcl9hdCAoYmxvY2tfZXhwci0+Z2V0X2xvY3VzICgpLA0K Pj4gKyAgICAgICAgICAgICAgICAgICJjYW5ub3Qgc3RyaXAgYmxvY2sgZXhwcmVzc2lvbiBp biB0aGlzIHBvc2l0aW9uIC0gb3V0ZXIgIg0KPj4gKyAgICAgICAgICAgICAgICAgICJhdHRy aWJ1dGVzIG5vdCBhbGxvd2VkIik7DQo+PiArfQ0KPj4gK3ZvaWQNCj4+ICtBdHRyVmlzaXRv cjo6dmlzaXQgKEFTVDo6TG9vcEV4cHIgJmV4cHIpDQo+PiArew0KPj4gKyAgLy8gaW5pdGlh bCBzdHJpcCB0ZXN0IGJhc2VkIG9uIG91dGVyIGF0dHJzDQo+PiArICBleHBhbmRlci5leHBh bmRfY2ZnX2F0dHJzIChleHByLmdldF9vdXRlcl9hdHRycyAoKSk7DQo+PiArICBpZiAoZXhw YW5kZXIuZmFpbHNfY2ZnX3dpdGhfZXhwYW5kIChleHByLmdldF9vdXRlcl9hdHRycyAoKSkp DQo+PiArICAgIHsNCj4+ICsgICAgICBleHByLm1hcmtfZm9yX3N0cmlwICgpOw0KPj4gKyAg ICAgIHJldHVybjsNCj4+ICsgICAgfQ0KPj4gKw0KPj4gKyAgLy8gY2FuJ3Qgc3RyaXAgYmxv Y2sgaXRzZWxmLCBidXQgY2FuIHN0cmlwIHN1Yi1leHByZXNzaW9ucw0KPj4gKyAgYXV0byAm bG9vcF9ibG9jayA9IGV4cHIuZ2V0X2xvb3BfYmxvY2sgKCk7DQo+PiArICBsb29wX2Jsb2Nr LT5hY2NlcHRfdmlzICgqdGhpcyk7DQo+PiArICBpZiAobG9vcF9ibG9jay0+aXNfbWFya2Vk X2Zvcl9zdHJpcCAoKSkNCj4+ICsgICAgcnVzdF9lcnJvcl9hdCAobG9vcF9ibG9jay0+Z2V0 X2xvY3VzICgpLA0KPj4gKyAgICAgICAgICAgICAgICAgICJjYW5ub3Qgc3RyaXAgYmxvY2sg ZXhwcmVzc2lvbiBpbiB0aGlzIHBvc2l0aW9uIC0gb3V0ZXIgIg0KPj4gKyAgICAgICAgICAg ICAgICAgICJhdHRyaWJ1dGVzIG5vdCBhbGxvd2VkIik7DQo+PiArfQ0KPj4gK3ZvaWQNCj4+ ICtBdHRyVmlzaXRvcjo6dmlzaXQgKEFTVDo6V2hpbGVMb29wRXhwciAmZXhwcikNCj4+ICt7 DQo+PiArICAvLyBpbml0aWFsIHN0cmlwIHRlc3QgYmFzZWQgb24gb3V0ZXIgYXR0cnMNCj4+ ICsgIGV4cGFuZGVyLmV4cGFuZF9jZmdfYXR0cnMgKGV4cHIuZ2V0X291dGVyX2F0dHJzICgp KTsNCj4+ICsgIGlmIChleHBhbmRlci5mYWlsc19jZmdfd2l0aF9leHBhbmQgKGV4cHIuZ2V0 X291dGVyX2F0dHJzICgpKSkNCj4+ICsgICAgew0KPj4gKyAgICAgIGV4cHIubWFya19mb3Jf c3RyaXAgKCk7DQo+PiArICAgICAgcmV0dXJuOw0KPj4gKyAgICB9DQo+PiArDQo+PiArICAv LyBjYW4ndCBzdHJpcCBwcmVkaWNhdGUgZXhwciBpdHNlbGYsIGJ1dCBjYW4gc3RyaXAgc3Vi LWV4cHJlc3Npb25zDQo+PiArICBhdXRvICZwcmVkaWNhdGVfZXhwciA9IGV4cHIuZ2V0X3By ZWRpY2F0ZV9leHByICgpOw0KPj4gKyAgcHJlZGljYXRlX2V4cHItPmFjY2VwdF92aXMgKCp0 aGlzKTsNCj4+ICsgIGlmIChwcmVkaWNhdGVfZXhwci0+aXNfbWFya2VkX2Zvcl9zdHJpcCAo KSkNCj4+ICsgICAgcnVzdF9lcnJvcl9hdCAocHJlZGljYXRlX2V4cHItPmdldF9sb2N1cyAo KSwNCj4+ICsgICAgICAgICAgICAgICAgICAiY2Fubm90IHN0cmlwIGV4cHJlc3Npb24gaW4g dGhpcyBwb3NpdGlvbiAtIG91dGVyICINCj4+ICsgICAgICAgICAgICAgICAgICAiYXR0cmli dXRlcyBub3QgYWxsb3dlZCIpOw0KPj4gKw0KPj4gKyAgLy8gY2FuJ3Qgc3RyaXAgYmxvY2sg aXRzZWxmLCBidXQgY2FuIHN0cmlwIHN1Yi1leHByZXNzaW9ucw0KPj4gKyAgYXV0byAmbG9v cF9ibG9jayA9IGV4cHIuZ2V0X2xvb3BfYmxvY2sgKCk7DQo+PiArICBsb29wX2Jsb2NrLT5h Y2NlcHRfdmlzICgqdGhpcyk7DQo+PiArICBpZiAobG9vcF9ibG9jay0+aXNfbWFya2VkX2Zv cl9zdHJpcCAoKSkNCj4+ICsgICAgcnVzdF9lcnJvcl9hdCAobG9vcF9ibG9jay0+Z2V0X2xv Y3VzICgpLA0KPj4gKyAgICAgICAgICAgICAgICAgICJjYW5ub3Qgc3RyaXAgYmxvY2sgZXhw cmVzc2lvbiBpbiB0aGlzIHBvc2l0aW9uIC0gb3V0ZXIgIg0KPj4gKyAgICAgICAgICAgICAg ICAgICJhdHRyaWJ1dGVzIG5vdCBhbGxvd2VkIik7DQo+PiArfQ0KPj4gK3ZvaWQNCj4+ICtB dHRyVmlzaXRvcjo6dmlzaXQgKEFTVDo6V2hpbGVMZXRMb29wRXhwciAmZXhwcikNCj4+ICt7 DQo+PiArICAvLyBpbml0aWFsIHN0cmlwIHRlc3QgYmFzZWQgb24gb3V0ZXIgYXR0cnMNCj4+ ICsgIGV4cGFuZGVyLmV4cGFuZF9jZmdfYXR0cnMgKGV4cHIuZ2V0X291dGVyX2F0dHJzICgp KTsNCj4+ICsgIGlmIChleHBhbmRlci5mYWlsc19jZmdfd2l0aF9leHBhbmQgKGV4cHIuZ2V0 X291dGVyX2F0dHJzICgpKSkNCj4+ICsgICAgew0KPj4gKyAgICAgIGV4cHIubWFya19mb3Jf c3RyaXAgKCk7DQo+PiArICAgICAgcmV0dXJuOw0KPj4gKyAgICB9DQo+PiArDQo+PiArICBm b3IgKGF1dG8gJnBhdHRlcm4gOiBleHByLmdldF9wYXR0ZXJucyAoKSkNCj4+ICsgICAgew0K Pj4gKyAgICAgIHBhdHRlcm4tPmFjY2VwdF92aXMgKCp0aGlzKTsNCj4+ICsgICAgICBpZiAo cGF0dGVybi0+aXNfbWFya2VkX2Zvcl9zdHJpcCAoKSkNCj4+ICsgICAgICAgcnVzdF9lcnJv cl9hdCAocGF0dGVybi0+Z2V0X2xvY3VzICgpLA0KPj4gKyAgICAgICAgICAgICAgICAgICAg ICAiY2Fubm90IHN0cmlwIHBhdHRlcm4gaW4gdGhpcyBwb3NpdGlvbiIpOw0KPj4gKyAgICB9 DQo+PiArDQo+PiArICAvLyBjYW4ndCBzdHJpcCBzY3J1dGluZWUgZXhwciBpdHNlbGYsIGJ1 dCBjYW4gc3RyaXAgc3ViLWV4cHJlc3Npb25zDQo+PiArICBhdXRvICZzY3J1dGluZWVfZXhw ciA9IGV4cHIuZ2V0X3NjcnV0aW5lZV9leHByICgpOw0KPj4gKyAgc2NydXRpbmVlX2V4cHIt PmFjY2VwdF92aXMgKCp0aGlzKTsNCj4+ICsgIGlmIChzY3J1dGluZWVfZXhwci0+aXNfbWFy a2VkX2Zvcl9zdHJpcCAoKSkNCj4+ICsgICAgcnVzdF9lcnJvcl9hdCAoc2NydXRpbmVlX2V4 cHItPmdldF9sb2N1cyAoKSwNCj4+ICsgICAgICAgICAgICAgICAgICAiY2Fubm90IHN0cmlw IGV4cHJlc3Npb24gaW4gdGhpcyBwb3NpdGlvbiAtIG91dGVyICINCj4+ICsgICAgICAgICAg ICAgICAgICAiYXR0cmlidXRlcyBub3QgYWxsb3dlZCIpOw0KPj4gKw0KPj4gKyAgLy8gY2Fu J3Qgc3RyaXAgYmxvY2sgaXRzZWxmLCBidXQgY2FuIHN0cmlwIHN1Yi1leHByZXNzaW9ucw0K Pj4gKyAgYXV0byAmbG9vcF9ibG9jayA9IGV4cHIuZ2V0X2xvb3BfYmxvY2sgKCk7DQo+PiAr ICBsb29wX2Jsb2NrLT5hY2NlcHRfdmlzICgqdGhpcyk7DQo+PiArICBpZiAobG9vcF9ibG9j ay0+aXNfbWFya2VkX2Zvcl9zdHJpcCAoKSkNCj4+ICsgICAgcnVzdF9lcnJvcl9hdCAobG9v cF9ibG9jay0+Z2V0X2xvY3VzICgpLA0KPj4gKyAgICAgICAgICAgICAgICAgICJjYW5ub3Qg c3RyaXAgYmxvY2sgZXhwcmVzc2lvbiBpbiB0aGlzIHBvc2l0aW9uIC0gb3V0ZXIgIg0KPj4g KyAgICAgICAgICAgICAgICAgICJhdHRyaWJ1dGVzIG5vdCBhbGxvd2VkIik7DQo+PiArfQ0K Pj4gK3ZvaWQNCj4+ICtBdHRyVmlzaXRvcjo6dmlzaXQgKEFTVDo6Rm9yTG9vcEV4cHIgJmV4 cHIpDQo+PiArew0KPj4gKyAgLy8gaW5pdGlhbCBzdHJpcCB0ZXN0IGJhc2VkIG9uIG91dGVy IGF0dHJzDQo+PiArICBleHBhbmRlci5leHBhbmRfY2ZnX2F0dHJzIChleHByLmdldF9vdXRl cl9hdHRycyAoKSk7DQo+PiArICBpZiAoZXhwYW5kZXIuZmFpbHNfY2ZnX3dpdGhfZXhwYW5k IChleHByLmdldF9vdXRlcl9hdHRycyAoKSkpDQo+PiArICAgIHsNCj4+ICsgICAgICBleHBy Lm1hcmtfZm9yX3N0cmlwICgpOw0KPj4gKyAgICAgIHJldHVybjsNCj4+ICsgICAgfQ0KPj4g Kw0KPj4gKyAgLy8gc3RyaXAgc3ViLXBhdHRlcm5zIG9mIHBhdHRlcm4NCj4+ICsgIGF1dG8g JnBhdHRlcm4gPSBleHByLmdldF9wYXR0ZXJuICgpOw0KPj4gKyAgcGF0dGVybi0+YWNjZXB0 X3ZpcyAoKnRoaXMpOw0KPj4gKyAgaWYgKHBhdHRlcm4tPmlzX21hcmtlZF9mb3Jfc3RyaXAg KCkpDQo+PiArICAgIHJ1c3RfZXJyb3JfYXQgKHBhdHRlcm4tPmdldF9sb2N1cyAoKSwNCj4+ ICsgICAgICAgICAgICAgICAgICAiY2Fubm90IHN0cmlwIHBhdHRlcm4gaW4gdGhpcyBwb3Np dGlvbiIpOw0KPj4gKw0KPj4gKyAgLy8gY2FuJ3Qgc3RyaXAgc2NydXRpbmVlIGV4cHIgaXRz ZWxmLCBidXQgY2FuIHN0cmlwIHN1Yi1leHByZXNzaW9ucw0KPj4gKyAgYXV0byAmaXRlcmF0 b3JfZXhwciA9IGV4cHIuZ2V0X2l0ZXJhdG9yX2V4cHIgKCk7DQo+PiArICBpdGVyYXRvcl9l eHByLT5hY2NlcHRfdmlzICgqdGhpcyk7DQo+PiArICBpZiAoaXRlcmF0b3JfZXhwci0+aXNf bWFya2VkX2Zvcl9zdHJpcCAoKSkNCj4+ICsgICAgcnVzdF9lcnJvcl9hdCAoaXRlcmF0b3Jf ZXhwci0+Z2V0X2xvY3VzICgpLA0KPj4gKyAgICAgICAgICAgICAgICAgICJjYW5ub3Qgc3Ry aXAgZXhwcmVzc2lvbiBpbiB0aGlzIHBvc2l0aW9uIC0gb3V0ZXIgIg0KPj4gKyAgICAgICAg ICAgICAgICAgICJhdHRyaWJ1dGVzIG5vdCBhbGxvd2VkIik7DQo+PiArDQo+PiArICAvLyBj YW4ndCBzdHJpcCBibG9jayBpdHNlbGYsIGJ1dCBjYW4gc3RyaXAgc3ViLWV4cHJlc3Npb25z DQo+PiArICBhdXRvICZsb29wX2Jsb2NrID0gZXhwci5nZXRfbG9vcF9ibG9jayAoKTsNCj4+ ICsgIGxvb3BfYmxvY2stPmFjY2VwdF92aXMgKCp0aGlzKTsNCj4+ICsgIGlmIChsb29wX2Js b2NrLT5pc19tYXJrZWRfZm9yX3N0cmlwICgpKQ0KPj4gKyAgICBydXN0X2Vycm9yX2F0IChs b29wX2Jsb2NrLT5nZXRfbG9jdXMgKCksDQo+PiArICAgICAgICAgICAgICAgICAgImNhbm5v dCBzdHJpcCBibG9jayBleHByZXNzaW9uIGluIHRoaXMgcG9zaXRpb24gLSBvdXRlciAiDQo+ PiArICAgICAgICAgICAgICAgICAgImF0dHJpYnV0ZXMgbm90IGFsbG93ZWQiKTsNCj4+ICt9 DQo+PiArdm9pZA0KPj4gK0F0dHJWaXNpdG9yOjp2aXNpdCAoQVNUOjpJZkV4cHIgJmV4cHIp DQo+PiArew0KPj4gKyAgLy8gcnVzdCBwbGF5Z3JvdW5kIHRlc3Qgc2hvd3MgdGhhdCBJZkV4 cHIgZG9lcyBzdXBwb3J0IG91dGVyIGF0dHJzLCBhdCBsZWFzdA0KPj4gKyAgLy8gd2hlbiB1 c2VkIGFzIHN0YXRlbWVudA0KPj4gKw0KPj4gKyAgLy8gaW5pdGlhbCBzdHJpcCB0ZXN0IGJh c2VkIG9uIG91dGVyIGF0dHJzDQo+PiArICBleHBhbmRlci5leHBhbmRfY2ZnX2F0dHJzIChl eHByLmdldF9vdXRlcl9hdHRycyAoKSk7DQo+PiArICBpZiAoZXhwYW5kZXIuZmFpbHNfY2Zn X3dpdGhfZXhwYW5kIChleHByLmdldF9vdXRlcl9hdHRycyAoKSkpDQo+PiArICAgIHsNCj4+ ICsgICAgICBleHByLm1hcmtfZm9yX3N0cmlwICgpOw0KPj4gKyAgICAgIHJldHVybjsNCj4+ ICsgICAgfQ0KPj4gKw0KPj4gKyAgLy8gY2FuJ3Qgc3RyaXAgY29uZGl0aW9uIGV4cHIgaXRz ZWxmLCBidXQgY2FuIHN0cmlwIHN1Yi1leHByZXNzaW9ucw0KPj4gKyAgYXV0byAmY29uZGl0 aW9uX2V4cHIgPSBleHByLmdldF9jb25kaXRpb25fZXhwciAoKTsNCj4+ICsgIGNvbmRpdGlv bl9leHByLT5hY2NlcHRfdmlzICgqdGhpcyk7DQo+PiArICBtYXliZV9leHBhbmRfZXhwciAo Y29uZGl0aW9uX2V4cHIpOw0KPj4gKyAgaWYgKGNvbmRpdGlvbl9leHByLT5pc19tYXJrZWRf Zm9yX3N0cmlwICgpKQ0KPj4gKyAgICBydXN0X2Vycm9yX2F0IChjb25kaXRpb25fZXhwci0+ Z2V0X2xvY3VzICgpLA0KPj4gKyAgICAgICAgICAgICAgICAgICJjYW5ub3Qgc3RyaXAgZXhw cmVzc2lvbiBpbiB0aGlzIHBvc2l0aW9uIC0gb3V0ZXIgIg0KPj4gKyAgICAgICAgICAgICAg ICAgICJhdHRyaWJ1dGVzIG5vdCBhbGxvd2VkIik7DQo+PiArDQo+PiArICAvLyBjYW4ndCBz dHJpcCBpZiBibG9jayBpdHNlbGYsIGJ1dCBjYW4gc3RyaXAgc3ViLWV4cHJlc3Npb25zDQo+ PiArICBhdXRvICZpZl9ibG9jayA9IGV4cHIuZ2V0X2lmX2Jsb2NrICgpOw0KPj4gKyAgaWZf YmxvY2stPmFjY2VwdF92aXMgKCp0aGlzKTsNCj4+ICsgIGlmIChpZl9ibG9jay0+aXNfbWFy a2VkX2Zvcl9zdHJpcCAoKSkNCj4+ICsgICAgcnVzdF9lcnJvcl9hdCAoaWZfYmxvY2stPmdl dF9sb2N1cyAoKSwNCj4+ICsgICAgICAgICAgICAgICAgICAiY2Fubm90IHN0cmlwIGJsb2Nr IGV4cHJlc3Npb24gaW4gdGhpcyBwb3NpdGlvbiAtIG91dGVyICINCj4+ICsgICAgICAgICAg ICAgICAgICAiYXR0cmlidXRlcyBub3QgYWxsb3dlZCIpOw0KPj4gK30NCj4+ICt2b2lkDQo+ PiArQXR0clZpc2l0b3I6OnZpc2l0IChBU1Q6OklmRXhwckNvbnNlcUVsc2UgJmV4cHIpDQo+ PiArew0KPj4gKyAgLy8gaW5pdGlhbCBzdHJpcCB0ZXN0IGJhc2VkIG9uIG91dGVyIGF0dHJz DQo+PiArICBleHBhbmRlci5leHBhbmRfY2ZnX2F0dHJzIChleHByLmdldF9vdXRlcl9hdHRy cyAoKSk7DQo+PiArICBpZiAoZXhwYW5kZXIuZmFpbHNfY2ZnX3dpdGhfZXhwYW5kIChleHBy LmdldF9vdXRlcl9hdHRycyAoKSkpDQo+PiArICAgIHsNCj4+ICsgICAgICBleHByLm1hcmtf Zm9yX3N0cmlwICgpOw0KPj4gKyAgICAgIHJldHVybjsNCj4+ICsgICAgfQ0KPj4gKw0KPj4g KyAgLy8gY2FuJ3Qgc3RyaXAgY29uZGl0aW9uIGV4cHIgaXRzZWxmLCBidXQgY2FuIHN0cmlw IHN1Yi1leHByZXNzaW9ucw0KPj4gKyAgYXV0byAmY29uZGl0aW9uX2V4cHIgPSBleHByLmdl dF9jb25kaXRpb25fZXhwciAoKTsNCj4+ICsgIGNvbmRpdGlvbl9leHByLT5hY2NlcHRfdmlz ICgqdGhpcyk7DQo+PiArICBtYXliZV9leHBhbmRfZXhwciAoY29uZGl0aW9uX2V4cHIpOw0K Pj4gKyAgaWYgKGNvbmRpdGlvbl9leHByLT5pc19tYXJrZWRfZm9yX3N0cmlwICgpKQ0KPj4g KyAgICBydXN0X2Vycm9yX2F0IChjb25kaXRpb25fZXhwci0+Z2V0X2xvY3VzICgpLA0KPj4g KyAgICAgICAgICAgICAgICAgICJjYW5ub3Qgc3RyaXAgZXhwcmVzc2lvbiBpbiB0aGlzIHBv c2l0aW9uIC0gb3V0ZXIgIg0KPj4gKyAgICAgICAgICAgICAgICAgICJhdHRyaWJ1dGVzIG5v dCBhbGxvd2VkIik7DQo+PiArDQo+PiArICAvLyBjYW4ndCBzdHJpcCBpZiBibG9jayBpdHNl bGYsIGJ1dCBjYW4gc3RyaXAgc3ViLWV4cHJlc3Npb25zDQo+PiArICBhdXRvICZpZl9ibG9j ayA9IGV4cHIuZ2V0X2lmX2Jsb2NrICgpOw0KPj4gKyAgaWZfYmxvY2stPmFjY2VwdF92aXMg KCp0aGlzKTsNCj4+ICsgIGlmIChpZl9ibG9jay0+aXNfbWFya2VkX2Zvcl9zdHJpcCAoKSkN Cj4+ICsgICAgcnVzdF9lcnJvcl9hdCAoaWZfYmxvY2stPmdldF9sb2N1cyAoKSwNCj4+ICsg ICAgICAgICAgICAgICAgICAiY2Fubm90IHN0cmlwIGJsb2NrIGV4cHJlc3Npb24gaW4gdGhp cyBwb3NpdGlvbiAtIG91dGVyICINCj4+ICsgICAgICAgICAgICAgICAgICAiYXR0cmlidXRl cyBub3QgYWxsb3dlZCIpOw0KPj4gKw0KPj4gKyAgLy8gY2FuJ3Qgc3RyaXAgZWxzZSBibG9j ayBpdHNlbGYsIGJ1dCBjYW4gc3RyaXAgc3ViLWV4cHJlc3Npb25zDQo+PiArICBhdXRvICZl bHNlX2Jsb2NrID0gZXhwci5nZXRfZWxzZV9ibG9jayAoKTsNCj4+ICsgIGVsc2VfYmxvY2st PmFjY2VwdF92aXMgKCp0aGlzKTsNCj4+ICsgIGlmIChlbHNlX2Jsb2NrLT5pc19tYXJrZWRf Zm9yX3N0cmlwICgpKQ0KPj4gKyAgICBydXN0X2Vycm9yX2F0IChlbHNlX2Jsb2NrLT5nZXRf bG9jdXMgKCksDQo+PiArICAgICAgICAgICAgICAgICAgImNhbm5vdCBzdHJpcCBibG9jayBl eHByZXNzaW9uIGluIHRoaXMgcG9zaXRpb24gLSBvdXRlciAiDQo+PiArICAgICAgICAgICAg ICAgICAgImF0dHJpYnV0ZXMgbm90IGFsbG93ZWQiKTsNCj4+ICt9DQo+PiArdm9pZA0KPj4g K0F0dHJWaXNpdG9yOjp2aXNpdCAoQVNUOjpJZkV4cHJDb25zZXFJZiAmZXhwcikNCj4+ICt7 DQo+PiArICAvLyBpbml0aWFsIHN0cmlwIHRlc3QgYmFzZWQgb24gb3V0ZXIgYXR0cnMNCj4+ ICsgIGV4cGFuZGVyLmV4cGFuZF9jZmdfYXR0cnMgKGV4cHIuZ2V0X291dGVyX2F0dHJzICgp KTsNCj4+ICsgIGlmIChleHBhbmRlci5mYWlsc19jZmdfd2l0aF9leHBhbmQgKGV4cHIuZ2V0 X291dGVyX2F0dHJzICgpKSkNCj4+ICsgICAgew0KPj4gKyAgICAgIGV4cHIubWFya19mb3Jf c3RyaXAgKCk7DQo+PiArICAgICAgcmV0dXJuOw0KPj4gKyAgICB9DQo+PiArDQo+PiArICAv LyBjYW4ndCBzdHJpcCBjb25kaXRpb24gZXhwciBpdHNlbGYsIGJ1dCBjYW4gc3RyaXAgc3Vi LWV4cHJlc3Npb25zDQo+PiArICBhdXRvICZjb25kaXRpb25fZXhwciA9IGV4cHIuZ2V0X2Nv bmRpdGlvbl9leHByICgpOw0KPj4gKyAgY29uZGl0aW9uX2V4cHItPmFjY2VwdF92aXMgKCp0 aGlzKTsNCj4+ICsgIG1heWJlX2V4cGFuZF9leHByIChjb25kaXRpb25fZXhwcik7DQo+PiAr ICBpZiAoY29uZGl0aW9uX2V4cHItPmlzX21hcmtlZF9mb3Jfc3RyaXAgKCkpDQo+PiArICAg IHJ1c3RfZXJyb3JfYXQgKGNvbmRpdGlvbl9leHByLT5nZXRfbG9jdXMgKCksDQo+PiArICAg ICAgICAgICAgICAgICAgImNhbm5vdCBzdHJpcCBleHByZXNzaW9uIGluIHRoaXMgcG9zaXRp b24gLSBvdXRlciAiDQo+PiArICAgICAgICAgICAgICAgICAgImF0dHJpYnV0ZXMgbm90IGFs bG93ZWQiKTsNCj4+ICsNCj4+ICsgIC8vIGNhbid0IHN0cmlwIGlmIGJsb2NrIGl0c2VsZiwg YnV0IGNhbiBzdHJpcCBzdWItZXhwcmVzc2lvbnMNCj4+ICsgIGF1dG8gJmlmX2Jsb2NrID0g ZXhwci5nZXRfaWZfYmxvY2sgKCk7DQo+PiArICBpZl9ibG9jay0+YWNjZXB0X3ZpcyAoKnRo aXMpOw0KPj4gKyAgaWYgKGlmX2Jsb2NrLT5pc19tYXJrZWRfZm9yX3N0cmlwICgpKQ0KPj4g KyAgICBydXN0X2Vycm9yX2F0IChpZl9ibG9jay0+Z2V0X2xvY3VzICgpLA0KPj4gKyAgICAg ICAgICAgICAgICAgICJjYW5ub3Qgc3RyaXAgYmxvY2sgZXhwcmVzc2lvbiBpbiB0aGlzIHBv c2l0aW9uIC0gb3V0ZXIgIg0KPj4gKyAgICAgICAgICAgICAgICAgICJhdHRyaWJ1dGVzIG5v dCBhbGxvd2VkIik7DQo+PiArDQo+PiArICAvLyBjYW4ndCBzdHJpcCBpZiBleHByIGl0c2Vs ZiwgYnV0IGNhbiBzdHJpcCBzdWItZXhwcmVzc2lvbnMNCj4+ICsgIGF1dG8gJmNvbnNlcV9p Zl9leHByID0gZXhwci5nZXRfY29uc2VxX2lmX2V4cHIgKCk7DQo+PiArICBjb25zZXFfaWZf ZXhwci0+YWNjZXB0X3ZpcyAoKnRoaXMpOw0KPj4gKyAgaWYgKGNvbnNlcV9pZl9leHByLT5p c19tYXJrZWRfZm9yX3N0cmlwICgpKQ0KPj4gKyAgICBydXN0X2Vycm9yX2F0IChjb25zZXFf aWZfZXhwci0+Z2V0X2xvY3VzICgpLA0KPj4gKyAgICAgICAgICAgICAgICAgICJjYW5ub3Qg c3RyaXAgY29uc2VxdWVudCBpZiBleHByZXNzaW9uIGluIHRoaXMgIg0KPj4gKyAgICAgICAg ICAgICAgICAgICJwb3NpdGlvbiAtIG91dGVyIGF0dHJpYnV0ZXMgbm90IGFsbG93ZWQiKTsN Cj4+ICt9DQo+PiArdm9pZA0KPj4gK0F0dHJWaXNpdG9yOjp2aXNpdCAoQVNUOjpJZkV4cHJD b25zZXFJZkxldCAmZXhwcikNCj4+ICt7DQo+PiArICAvLyBpbml0aWFsIHN0cmlwIHRlc3Qg YmFzZWQgb24gb3V0ZXIgYXR0cnMNCj4+ICsgIGV4cGFuZGVyLmV4cGFuZF9jZmdfYXR0cnMg KGV4cHIuZ2V0X291dGVyX2F0dHJzICgpKTsNCj4+ICsgIGlmIChleHBhbmRlci5mYWlsc19j Zmdfd2l0aF9leHBhbmQgKGV4cHIuZ2V0X291dGVyX2F0dHJzICgpKSkNCj4+ICsgICAgew0K Pj4gKyAgICAgIGV4cHIubWFya19mb3Jfc3RyaXAgKCk7DQo+PiArICAgICAgcmV0dXJuOw0K Pj4gKyAgICB9DQo+PiArDQo+PiArICAvLyBjYW4ndCBzdHJpcCBjb25kaXRpb24gZXhwciBp dHNlbGYsIGJ1dCBjYW4gc3RyaXAgc3ViLWV4cHJlc3Npb25zDQo+PiArICBhdXRvICZjb25k aXRpb25fZXhwciA9IGV4cHIuZ2V0X2NvbmRpdGlvbl9leHByICgpOw0KPj4gKyAgY29uZGl0 aW9uX2V4cHItPmFjY2VwdF92aXMgKCp0aGlzKTsNCj4+ICsgIG1heWJlX2V4cGFuZF9leHBy IChjb25kaXRpb25fZXhwcik7DQo+PiArICBpZiAoY29uZGl0aW9uX2V4cHItPmlzX21hcmtl ZF9mb3Jfc3RyaXAgKCkpDQo+PiArICAgIHJ1c3RfZXJyb3JfYXQgKGNvbmRpdGlvbl9leHBy LT5nZXRfbG9jdXMgKCksDQo+PiArICAgICAgICAgICAgICAgICAgImNhbm5vdCBzdHJpcCBl eHByZXNzaW9uIGluIHRoaXMgcG9zaXRpb24gLSBvdXRlciAiDQo+PiArICAgICAgICAgICAg ICAgICAgImF0dHJpYnV0ZXMgbm90IGFsbG93ZWQiKTsNCj4+ICsNCj4+ICsgIC8vIGNhbid0 IHN0cmlwIGlmIGJsb2NrIGl0c2VsZiwgYnV0IGNhbiBzdHJpcCBzdWItZXhwcmVzc2lvbnMN Cj4+ICsgIGF1dG8gJmlmX2Jsb2NrID0gZXhwci5nZXRfaWZfYmxvY2sgKCk7DQo+PiArICBp Zl9ibG9jay0+YWNjZXB0X3ZpcyAoKnRoaXMpOw0KPj4gKyAgaWYgKGlmX2Jsb2NrLT5pc19t YXJrZWRfZm9yX3N0cmlwICgpKQ0KPj4gKyAgICBydXN0X2Vycm9yX2F0IChpZl9ibG9jay0+ Z2V0X2xvY3VzICgpLA0KPj4gKyAgICAgICAgICAgICAgICAgICJjYW5ub3Qgc3RyaXAgYmxv Y2sgZXhwcmVzc2lvbiBpbiB0aGlzIHBvc2l0aW9uIC0gb3V0ZXIgIg0KPj4gKyAgICAgICAg ICAgICAgICAgICJhdHRyaWJ1dGVzIG5vdCBhbGxvd2VkIik7DQo+PiArDQo+PiArICAvLyBj YW4ndCBzdHJpcCBpZiBsZXQgZXhwciBpdHNlbGYsIGJ1dCBjYW4gc3RyaXAgc3ViLWV4cHJl c3Npb25zDQo+PiArICBhdXRvICZjb25zZXFfaWZfbGV0X2V4cHIgPSBleHByLmdldF9jb25z ZXFfaWZfbGV0X2V4cHIgKCk7DQo+PiArICBjb25zZXFfaWZfbGV0X2V4cHItPmFjY2VwdF92 aXMgKCp0aGlzKTsNCj4+ICsgIGlmIChjb25zZXFfaWZfbGV0X2V4cHItPmlzX21hcmtlZF9m b3Jfc3RyaXAgKCkpDQo+PiArICAgIHJ1c3RfZXJyb3JfYXQgKGNvbnNlcV9pZl9sZXRfZXhw ci0+Z2V0X2xvY3VzICgpLA0KPj4gKyAgICAgICAgICAgICAgICAgICJjYW5ub3Qgc3RyaXAg Y29uc2VxdWVudCBpZiBsZXQgZXhwcmVzc2lvbiBpbiB0aGlzICINCj4+ICsgICAgICAgICAg ICAgICAgICAicG9zaXRpb24gLSBvdXRlciBhdHRyaWJ1dGVzIG5vdCAiDQo+PiArICAgICAg ICAgICAgICAgICAgImFsbG93ZWQiKTsNCj4+ICt9DQo+PiArdm9pZA0KPj4gK0F0dHJWaXNp dG9yOjp2aXNpdCAoQVNUOjpJZkxldEV4cHIgJmV4cHIpDQo+PiArew0KPj4gKyAgLy8gaW5p dGlhbCBzdHJpcCB0ZXN0IGJhc2VkIG9uIG91dGVyIGF0dHJzDQo+PiArICBleHBhbmRlci5l eHBhbmRfY2ZnX2F0dHJzIChleHByLmdldF9vdXRlcl9hdHRycyAoKSk7DQo+PiArICBpZiAo ZXhwYW5kZXIuZmFpbHNfY2ZnX3dpdGhfZXhwYW5kIChleHByLmdldF9vdXRlcl9hdHRycyAo KSkpDQo+PiArICAgIHsNCj4+ICsgICAgICBleHByLm1hcmtfZm9yX3N0cmlwICgpOw0KPj4g KyAgICAgIHJldHVybjsNCj4+ICsgICAgfQ0KPj4gKw0KPj4gKyAgZm9yIChhdXRvICZwYXR0 ZXJuIDogZXhwci5nZXRfcGF0dGVybnMgKCkpDQo+PiArICAgIHsNCj4+ICsgICAgICBwYXR0 ZXJuLT5hY2NlcHRfdmlzICgqdGhpcyk7DQo+PiArICAgICAgaWYgKHBhdHRlcm4tPmlzX21h cmtlZF9mb3Jfc3RyaXAgKCkpDQo+PiArICAgICAgIHJ1c3RfZXJyb3JfYXQgKHBhdHRlcm4t PmdldF9sb2N1cyAoKSwNCj4+ICsgICAgICAgICAgICAgICAgICAgICAgImNhbm5vdCBzdHJp cCBwYXR0ZXJuIGluIHRoaXMgcG9zaXRpb24iKTsNCj4+ICsgICAgfQ0KPj4gKw0KPj4gKyAg Ly8gY2FuJ3Qgc3RyaXAgdmFsdWUgZXhwciBpdHNlbGYsIGJ1dCBjYW4gc3RyaXAgc3ViLWV4 cHJlc3Npb25zDQo+PiArICBhdXRvICZ2YWx1ZV9leHByID0gZXhwci5nZXRfdmFsdWVfZXhw ciAoKTsNCj4+ICsgIHZhbHVlX2V4cHItPmFjY2VwdF92aXMgKCp0aGlzKTsNCj4+ICsgIGlm ICh2YWx1ZV9leHByLT5pc19tYXJrZWRfZm9yX3N0cmlwICgpKQ0KPj4gKyAgICBydXN0X2Vy cm9yX2F0ICh2YWx1ZV9leHByLT5nZXRfbG9jdXMgKCksDQo+PiArICAgICAgICAgICAgICAg ICAgImNhbm5vdCBzdHJpcCBleHByZXNzaW9uIGluIHRoaXMgcG9zaXRpb24gLSBvdXRlciAi DQo+PiArICAgICAgICAgICAgICAgICAgImF0dHJpYnV0ZXMgbm90IGFsbG93ZWQiKTsNCj4+ ICsNCj4+ICsgIC8vIGNhbid0IHN0cmlwIGlmIGJsb2NrIGl0c2VsZiwgYnV0IGNhbiBzdHJp cCBzdWItZXhwcmVzc2lvbnMNCj4+ICsgIGF1dG8gJmlmX2Jsb2NrID0gZXhwci5nZXRfaWZf YmxvY2sgKCk7DQo+PiArICBpZl9ibG9jay0+YWNjZXB0X3ZpcyAoKnRoaXMpOw0KPj4gKyAg aWYgKGlmX2Jsb2NrLT5pc19tYXJrZWRfZm9yX3N0cmlwICgpKQ0KPj4gKyAgICBydXN0X2Vy cm9yX2F0IChpZl9ibG9jay0+Z2V0X2xvY3VzICgpLA0KPj4gKyAgICAgICAgICAgICAgICAg ICJjYW5ub3Qgc3RyaXAgYmxvY2sgZXhwcmVzc2lvbiBpbiB0aGlzIHBvc2l0aW9uIC0gb3V0 ZXIgIg0KPj4gKyAgICAgICAgICAgICAgICAgICJhdHRyaWJ1dGVzIG5vdCBhbGxvd2VkIik7 DQo+PiArfQ0KPj4gK3ZvaWQNCj4+ICtBdHRyVmlzaXRvcjo6dmlzaXQgKEFTVDo6SWZMZXRF eHByQ29uc2VxRWxzZSAmZXhwcikNCj4+ICt7DQo+PiArICAvLyBpbml0aWFsIHN0cmlwIHRl c3QgYmFzZWQgb24gb3V0ZXIgYXR0cnMNCj4+ICsgIGV4cGFuZGVyLmV4cGFuZF9jZmdfYXR0 cnMgKGV4cHIuZ2V0X291dGVyX2F0dHJzICgpKTsNCj4+ICsgIGlmIChleHBhbmRlci5mYWls c19jZmdfd2l0aF9leHBhbmQgKGV4cHIuZ2V0X291dGVyX2F0dHJzICgpKSkNCj4+ICsgICAg ew0KPj4gKyAgICAgIGV4cHIubWFya19mb3Jfc3RyaXAgKCk7DQo+PiArICAgICAgcmV0dXJu Ow0KPj4gKyAgICB9DQo+PiArDQo+PiArICBmb3IgKGF1dG8gJnBhdHRlcm4gOiBleHByLmdl dF9wYXR0ZXJucyAoKSkNCj4+ICsgICAgew0KPj4gKyAgICAgIHBhdHRlcm4tPmFjY2VwdF92 aXMgKCp0aGlzKTsNCj4+ICsgICAgICBpZiAocGF0dGVybi0+aXNfbWFya2VkX2Zvcl9zdHJp cCAoKSkNCj4+ICsgICAgICAgcnVzdF9lcnJvcl9hdCAocGF0dGVybi0+Z2V0X2xvY3VzICgp LA0KPj4gKyAgICAgICAgICAgICAgICAgICAgICAiY2Fubm90IHN0cmlwIHBhdHRlcm4gaW4g dGhpcyBwb3NpdGlvbiIpOw0KPj4gKyAgICB9DQo+PiArDQo+PiArICAvLyBjYW4ndCBzdHJp cCB2YWx1ZSBleHByIGl0c2VsZiwgYnV0IGNhbiBzdHJpcCBzdWItZXhwcmVzc2lvbnMNCj4+ ICsgIGF1dG8gJnZhbHVlX2V4cHIgPSBleHByLmdldF92YWx1ZV9leHByICgpOw0KPj4gKyAg dmFsdWVfZXhwci0+YWNjZXB0X3ZpcyAoKnRoaXMpOw0KPj4gKyAgaWYgKHZhbHVlX2V4cHIt PmlzX21hcmtlZF9mb3Jfc3RyaXAgKCkpDQo+PiArICAgIHJ1c3RfZXJyb3JfYXQgKHZhbHVl X2V4cHItPmdldF9sb2N1cyAoKSwNCj4+ICsgICAgICAgICAgICAgICAgICAiY2Fubm90IHN0 cmlwIGV4cHJlc3Npb24gaW4gdGhpcyBwb3NpdGlvbiAtIG91dGVyICINCj4+ICsgICAgICAg ICAgICAgICAgICAiYXR0cmlidXRlcyBub3QgYWxsb3dlZCIpOw0KPj4gKw0KPj4gKyAgLy8g Y2FuJ3Qgc3RyaXAgaWYgYmxvY2sgaXRzZWxmLCBidXQgY2FuIHN0cmlwIHN1Yi1leHByZXNz aW9ucw0KPj4gKyAgYXV0byAmaWZfYmxvY2sgPSBleHByLmdldF9pZl9ibG9jayAoKTsNCj4+ ICsgIGlmX2Jsb2NrLT5hY2NlcHRfdmlzICgqdGhpcyk7DQo+PiArICBpZiAoaWZfYmxvY2st PmlzX21hcmtlZF9mb3Jfc3RyaXAgKCkpDQo+PiArICAgIHJ1c3RfZXJyb3JfYXQgKGlmX2Js b2NrLT5nZXRfbG9jdXMgKCksDQo+PiArICAgICAgICAgICAgICAgICAgImNhbm5vdCBzdHJp cCBibG9jayBleHByZXNzaW9uIGluIHRoaXMgcG9zaXRpb24gLSBvdXRlciAiDQo+PiArICAg ICAgICAgICAgICAgICAgImF0dHJpYnV0ZXMgbm90IGFsbG93ZWQiKTsNCj4+ICsNCj4+ICsg IC8vIGNhbid0IHN0cmlwIGVsc2UgYmxvY2sgaXRzZWxmLCBidXQgY2FuIHN0cmlwIHN1Yi1l eHByZXNzaW9ucw0KPj4gKyAgYXV0byAmZWxzZV9ibG9jayA9IGV4cHIuZ2V0X2Vsc2VfYmxv Y2sgKCk7DQo+PiArICBlbHNlX2Jsb2NrLT5hY2NlcHRfdmlzICgqdGhpcyk7DQo+PiArICBp ZiAoZWxzZV9ibG9jay0+aXNfbWFya2VkX2Zvcl9zdHJpcCAoKSkNCj4+ICsgICAgcnVzdF9l cnJvcl9hdCAoZWxzZV9ibG9jay0+Z2V0X2xvY3VzICgpLA0KPj4gKyAgICAgICAgICAgICAg ICAgICJjYW5ub3Qgc3RyaXAgYmxvY2sgZXhwcmVzc2lvbiBpbiB0aGlzIHBvc2l0aW9uIC0g b3V0ZXIgIg0KPj4gKyAgICAgICAgICAgICAgICAgICJhdHRyaWJ1dGVzIG5vdCBhbGxvd2Vk Iik7DQo+PiArfQ0KPj4gK3ZvaWQNCj4+ICtBdHRyVmlzaXRvcjo6dmlzaXQgKEFTVDo6SWZM ZXRFeHByQ29uc2VxSWYgJmV4cHIpDQo+PiArew0KPj4gKyAgLy8gaW5pdGlhbCBzdHJpcCB0 ZXN0IGJhc2VkIG9uIG91dGVyIGF0dHJzDQo+PiArICBleHBhbmRlci5leHBhbmRfY2ZnX2F0 dHJzIChleHByLmdldF9vdXRlcl9hdHRycyAoKSk7DQo+PiArICBpZiAoZXhwYW5kZXIuZmFp bHNfY2ZnX3dpdGhfZXhwYW5kIChleHByLmdldF9vdXRlcl9hdHRycyAoKSkpDQo+PiArICAg IHsNCj4+ICsgICAgICBleHByLm1hcmtfZm9yX3N0cmlwICgpOw0KPj4gKyAgICAgIHJldHVy bjsNCj4+ICsgICAgfQ0KPj4gKw0KPj4gKyAgZm9yIChhdXRvICZwYXR0ZXJuIDogZXhwci5n ZXRfcGF0dGVybnMgKCkpDQo+PiArICAgIHsNCj4+ICsgICAgICBwYXR0ZXJuLT5hY2NlcHRf dmlzICgqdGhpcyk7DQo+PiArICAgICAgaWYgKHBhdHRlcm4tPmlzX21hcmtlZF9mb3Jfc3Ry aXAgKCkpDQo+PiArICAgICAgIHJ1c3RfZXJyb3JfYXQgKHBhdHRlcm4tPmdldF9sb2N1cyAo KSwNCj4+ICsgICAgICAgICAgICAgICAgICAgICAgImNhbm5vdCBzdHJpcCBwYXR0ZXJuIGlu IHRoaXMgcG9zaXRpb24iKTsNCj4+ICsgICAgfQ0KPj4gKw0KPj4gKyAgLy8gY2FuJ3Qgc3Ry aXAgdmFsdWUgZXhwciBpdHNlbGYsIGJ1dCBjYW4gc3RyaXAgc3ViLWV4cHJlc3Npb25zDQo+ PiArICBhdXRvICZ2YWx1ZV9leHByID0gZXhwci5nZXRfdmFsdWVfZXhwciAoKTsNCj4+ICsg IHZhbHVlX2V4cHItPmFjY2VwdF92aXMgKCp0aGlzKTsNCj4+ICsgIGlmICh2YWx1ZV9leHBy LT5pc19tYXJrZWRfZm9yX3N0cmlwICgpKQ0KPj4gKyAgICBydXN0X2Vycm9yX2F0ICh2YWx1 ZV9leHByLT5nZXRfbG9jdXMgKCksDQo+PiArICAgICAgICAgICAgICAgICAgImNhbm5vdCBz dHJpcCBleHByZXNzaW9uIGluIHRoaXMgcG9zaXRpb24gLSBvdXRlciAiDQo+PiArICAgICAg ICAgICAgICAgICAgImF0dHJpYnV0ZXMgbm90IGFsbG93ZWQiKTsNCj4+ICsNCj4+ICsgIC8v IGNhbid0IHN0cmlwIGlmIGJsb2NrIGl0c2VsZiwgYnV0IGNhbiBzdHJpcCBzdWItZXhwcmVz c2lvbnMNCj4+ICsgIGF1dG8gJmlmX2Jsb2NrID0gZXhwci5nZXRfaWZfYmxvY2sgKCk7DQo+ PiArICBpZl9ibG9jay0+YWNjZXB0X3ZpcyAoKnRoaXMpOw0KPj4gKyAgaWYgKGlmX2Jsb2Nr LT5pc19tYXJrZWRfZm9yX3N0cmlwICgpKQ0KPj4gKyAgICBydXN0X2Vycm9yX2F0IChpZl9i bG9jay0+Z2V0X2xvY3VzICgpLA0KPj4gKyAgICAgICAgICAgICAgICAgICJjYW5ub3Qgc3Ry aXAgYmxvY2sgZXhwcmVzc2lvbiBpbiB0aGlzIHBvc2l0aW9uIC0gb3V0ZXIgIg0KPj4gKyAg ICAgICAgICAgICAgICAgICJhdHRyaWJ1dGVzIG5vdCBhbGxvd2VkIik7DQo+PiArDQo+PiAr ICAvLyBjYW4ndCBzdHJpcCBpZiBleHByIGl0c2VsZiwgYnV0IGNhbiBzdHJpcCBzdWItZXhw cmVzc2lvbnMNCj4+ICsgIGF1dG8gJmNvbnNlcV9pZl9leHByID0gZXhwci5nZXRfY29uc2Vx X2lmX2V4cHIgKCk7DQo+PiArICBjb25zZXFfaWZfZXhwci0+YWNjZXB0X3ZpcyAoKnRoaXMp Ow0KPj4gKyAgaWYgKGNvbnNlcV9pZl9leHByLT5pc19tYXJrZWRfZm9yX3N0cmlwICgpKQ0K Pj4gKyAgICBydXN0X2Vycm9yX2F0IChjb25zZXFfaWZfZXhwci0+Z2V0X2xvY3VzICgpLA0K Pj4gKyAgICAgICAgICAgICAgICAgICJjYW5ub3Qgc3RyaXAgY29uc2VxdWVudCBpZiBleHBy ZXNzaW9uIGluIHRoaXMgIg0KPj4gKyAgICAgICAgICAgICAgICAgICJwb3NpdGlvbiAtIG91 dGVyIGF0dHJpYnV0ZXMgbm90IGFsbG93ZWQiKTsNCj4+ICt9DQo+PiArdm9pZA0KPj4gK0F0 dHJWaXNpdG9yOjp2aXNpdCAoQVNUOjpJZkxldEV4cHJDb25zZXFJZkxldCAmZXhwcikNCj4+ ICt7DQo+PiArICAvLyBpbml0aWFsIHN0cmlwIHRlc3QgYmFzZWQgb24gb3V0ZXIgYXR0cnMN Cj4+ICsgIGV4cGFuZGVyLmV4cGFuZF9jZmdfYXR0cnMgKGV4cHIuZ2V0X291dGVyX2F0dHJz ICgpKTsNCj4+ICsgIGlmIChleHBhbmRlci5mYWlsc19jZmdfd2l0aF9leHBhbmQgKGV4cHIu Z2V0X291dGVyX2F0dHJzICgpKSkNCj4+ICsgICAgew0KPj4gKyAgICAgIGV4cHIubWFya19m b3Jfc3RyaXAgKCk7DQo+PiArICAgICAgcmV0dXJuOw0KPj4gKyAgICB9DQo+PiArDQo+PiAr ICBmb3IgKGF1dG8gJnBhdHRlcm4gOiBleHByLmdldF9wYXR0ZXJucyAoKSkNCj4+ICsgICAg ew0KPj4gKyAgICAgIHBhdHRlcm4tPmFjY2VwdF92aXMgKCp0aGlzKTsNCj4+ICsgICAgICBp ZiAocGF0dGVybi0+aXNfbWFya2VkX2Zvcl9zdHJpcCAoKSkNCj4+ICsgICAgICAgcnVzdF9l cnJvcl9hdCAocGF0dGVybi0+Z2V0X2xvY3VzICgpLA0KPj4gKyAgICAgICAgICAgICAgICAg ICAgICAiY2Fubm90IHN0cmlwIHBhdHRlcm4gaW4gdGhpcyBwb3NpdGlvbiIpOw0KPj4gKyAg ICB9DQo+PiArDQo+PiArICAvLyBjYW4ndCBzdHJpcCB2YWx1ZSBleHByIGl0c2VsZiwgYnV0 IGNhbiBzdHJpcCBzdWItZXhwcmVzc2lvbnMNCj4+ICsgIGF1dG8gJnZhbHVlX2V4cHIgPSBl eHByLmdldF92YWx1ZV9leHByICgpOw0KPj4gKyAgdmFsdWVfZXhwci0+YWNjZXB0X3ZpcyAo KnRoaXMpOw0KPj4gKyAgaWYgKHZhbHVlX2V4cHItPmlzX21hcmtlZF9mb3Jfc3RyaXAgKCkp DQo+PiArICAgIHJ1c3RfZXJyb3JfYXQgKHZhbHVlX2V4cHItPmdldF9sb2N1cyAoKSwNCj4+ ICsgICAgICAgICAgICAgICAgICAiY2Fubm90IHN0cmlwIGV4cHJlc3Npb24gaW4gdGhpcyBw b3NpdGlvbiAtIG91dGVyICINCj4+ICsgICAgICAgICAgICAgICAgICAiYXR0cmlidXRlcyBu b3QgYWxsb3dlZCIpOw0KPj4gKw0KPj4gKyAgLy8gY2FuJ3Qgc3RyaXAgaWYgYmxvY2sgaXRz ZWxmLCBidXQgY2FuIHN0cmlwIHN1Yi1leHByZXNzaW9ucw0KPj4gKyAgYXV0byAmaWZfYmxv Y2sgPSBleHByLmdldF9pZl9ibG9jayAoKTsNCj4+ICsgIGlmX2Jsb2NrLT5hY2NlcHRfdmlz ICgqdGhpcyk7DQo+PiArICBpZiAoaWZfYmxvY2stPmlzX21hcmtlZF9mb3Jfc3RyaXAgKCkp DQo+PiArICAgIHJ1c3RfZXJyb3JfYXQgKGlmX2Jsb2NrLT5nZXRfbG9jdXMgKCksDQo+PiAr ICAgICAgICAgICAgICAgICAgImNhbm5vdCBzdHJpcCBibG9jayBleHByZXNzaW9uIGluIHRo aXMgcG9zaXRpb24gLSBvdXRlciAiDQo+PiArICAgICAgICAgICAgICAgICAgImF0dHJpYnV0 ZXMgbm90IGFsbG93ZWQiKTsNCj4+ICsNCj4+ICsgIC8vIGNhbid0IHN0cmlwIGlmIGxldCBl eHByIGl0c2VsZiwgYnV0IGNhbiBzdHJpcCBzdWItZXhwcmVzc2lvbnMNCj4+ICsgIGF1dG8g JmNvbnNlcV9pZl9sZXRfZXhwciA9IGV4cHIuZ2V0X2NvbnNlcV9pZl9sZXRfZXhwciAoKTsN Cj4+ICsgIGNvbnNlcV9pZl9sZXRfZXhwci0+YWNjZXB0X3ZpcyAoKnRoaXMpOw0KPj4gKyAg aWYgKGNvbnNlcV9pZl9sZXRfZXhwci0+aXNfbWFya2VkX2Zvcl9zdHJpcCAoKSkNCj4+ICsg ICAgcnVzdF9lcnJvcl9hdCAoY29uc2VxX2lmX2xldF9leHByLT5nZXRfbG9jdXMgKCksDQo+ PiArICAgICAgICAgICAgICAgICAgImNhbm5vdCBzdHJpcCBjb25zZXF1ZW50IGlmIGxldCBl eHByZXNzaW9uIGluIHRoaXMgIg0KPj4gKyAgICAgICAgICAgICAgICAgICJwb3NpdGlvbiAt IG91dGVyIGF0dHJpYnV0ZXMgbm90ICINCj4+ICsgICAgICAgICAgICAgICAgICAiYWxsb3dl ZCIpOw0KPj4gK30NCj4+ICt2b2lkDQo+PiArQXR0clZpc2l0b3I6OnZpc2l0IChBU1Q6Ok1h dGNoRXhwciAmZXhwcikNCj4+ICt7DQo+PiArICAvLyBpbml0aWFsIHN0cmlwIHRlc3QgYmFz ZWQgb24gb3V0ZXIgYXR0cnMNCj4+ICsgIGV4cGFuZGVyLmV4cGFuZF9jZmdfYXR0cnMgKGV4 cHIuZ2V0X291dGVyX2F0dHJzICgpKTsNCj4+ICsgIGlmIChleHBhbmRlci5mYWlsc19jZmdf d2l0aF9leHBhbmQgKGV4cHIuZ2V0X291dGVyX2F0dHJzICgpKSkNCj4+ICsgICAgew0KPj4g KyAgICAgIGV4cHIubWFya19mb3Jfc3RyaXAgKCk7DQo+PiArICAgICAgcmV0dXJuOw0KPj4g KyAgICB9DQo+PiArDQo+PiArICAvLyBpbm5lciBhdHRyIHN0cmlwIHRlc3QNCj4+ICsgIGV4 cGFuZGVyLmV4cGFuZF9jZmdfYXR0cnMgKGV4cHIuZ2V0X2lubmVyX2F0dHJzICgpKTsNCj4+ ICsgIGlmIChleHBhbmRlci5mYWlsc19jZmdfd2l0aF9leHBhbmQgKGV4cHIuZ2V0X2lubmVy X2F0dHJzICgpKSkNCj4+ICsgICAgew0KPj4gKyAgICAgIGV4cHIubWFya19mb3Jfc3RyaXAg KCk7DQo+PiArICAgICAgcmV0dXJuOw0KPj4gKyAgICB9DQo+PiArDQo+PiArICAvLyBjYW4n dCBzdHJpcCBzY3J1dGluZWUgZXhwciBpdHNlbGYsIGJ1dCBjYW4gc3RyaXAgc3ViLWV4cHJl c3Npb25zDQo+PiArICBhdXRvICZzY3J1dGluZWVfZXhwciA9IGV4cHIuZ2V0X3NjcnV0aW5l ZV9leHByICgpOw0KPj4gKyAgc2NydXRpbmVlX2V4cHItPmFjY2VwdF92aXMgKCp0aGlzKTsN Cj4+ICsgIGlmIChzY3J1dGluZWVfZXhwci0+aXNfbWFya2VkX2Zvcl9zdHJpcCAoKSkNCj4+ ICsgICAgcnVzdF9lcnJvcl9hdCAoc2NydXRpbmVlX2V4cHItPmdldF9sb2N1cyAoKSwNCj4+ ICsgICAgICAgICAgICAgICAgICAiY2Fubm90IHN0cmlwIGV4cHJlc3Npb24gaW4gdGhpcyBw b3NpdGlvbiAtIG91dGVyICINCj4+ICsgICAgICAgICAgICAgICAgICAiYXR0cmlidXRlcyBu b3QgYWxsb3dlZCIpOw0KPj4gKw0KPj4gKyAgLy8gc3RyaXAgbWF0Y2ggY2FzZXMNCj4+ICsg IGF1dG8gJm1hdGNoX2Nhc2VzID0gZXhwci5nZXRfbWF0Y2hfY2FzZXMgKCk7DQo+PiArICBm b3IgKGF1dG8gaXQgPSBtYXRjaF9jYXNlcy5iZWdpbiAoKTsgaXQgIT0gbWF0Y2hfY2FzZXMu ZW5kICgpOykNCj4+ICsgICAgew0KPj4gKyAgICAgIGF1dG8gJm1hdGNoX2Nhc2UgPSAqaXQ7 DQo+PiArDQo+PiArICAgICAgLy8gc3RyaXAgbWF0Y2ggY2FzZSBiYXNlZCBvbiBvdXRlciBh dHRyaWJ1dGVzIGluIG1hdGNoIGFybQ0KPj4gKyAgICAgIGF1dG8gJm1hdGNoX2FybSA9IG1h dGNoX2Nhc2UuZ2V0X2FybSAoKTsNCj4+ICsgICAgICBleHBhbmRlci5leHBhbmRfY2ZnX2F0 dHJzIChtYXRjaF9hcm0uZ2V0X291dGVyX2F0dHJzICgpKTsNCj4+ICsgICAgICBpZiAoZXhw YW5kZXIuZmFpbHNfY2ZnX3dpdGhfZXhwYW5kIChtYXRjaF9hcm0uZ2V0X291dGVyX2F0dHJz ICgpKSkNCj4+ICsgICAgICAgew0KPj4gKyAgICAgICAgIC8vIHN0cmlwIG1hdGNoIGNhc2UN Cj4+ICsgICAgICAgICBpdCA9IG1hdGNoX2Nhc2VzLmVyYXNlIChpdCk7DQo+PiArICAgICAg ICAgY29udGludWU7DQo+PiArICAgICAgIH0NCj4+ICsNCj4+ICsgICAgICBmb3IgKGF1dG8g JnBhdHRlcm4gOiBtYXRjaF9hcm0uZ2V0X3BhdHRlcm5zICgpKQ0KPj4gKyAgICAgICB7DQo+ PiArICAgICAgICAgcGF0dGVybi0+YWNjZXB0X3ZpcyAoKnRoaXMpOw0KPj4gKyAgICAgICAg IGlmIChwYXR0ZXJuLT5pc19tYXJrZWRfZm9yX3N0cmlwICgpKQ0KPj4gKyAgICAgICAgICAg cnVzdF9lcnJvcl9hdCAocGF0dGVybi0+Z2V0X2xvY3VzICgpLA0KPj4gKyAgICAgICAgICAg ICAgICAgICAgICAgICAgImNhbm5vdCBzdHJpcCBwYXR0ZXJuIGluIHRoaXMgcG9zaXRpb24i KTsNCj4+ICsgICAgICAgfQ0KPj4gKw0KPj4gKyAgICAgIC8qIGFzc3VtaW5nIHRoYXQgZ3Vh cmQgZXhwcmVzc2lvbiBjYW5ub3QgYmUgc3RyaXBwZWQgYXMNCj4+ICsgICAgICAgKiBzdHJp Y3RseSBzcGVha2luZyB5b3Ugd291bGQgaGF2ZSB0byBzdHJpcCB0aGUgd2hvbGUgZ3VhcmQg dG8NCj4+ICsgICAgICAgKiBtYWtlIHN5bnRhY3RpY2FsIHNlbnNlLCB3aGljaCB5b3UgY2Fu J3QgZG8uIGFzIHN1Y2gsIG9ubHkNCj4+ICsgICAgICAgKiBzdHJpcCBzdWItZXhwcmVzc2lv bnMgKi8NCj4+ICsgICAgICBpZiAobWF0Y2hfYXJtLmhhc19tYXRjaF9hcm1fZ3VhcmQgKCkp DQo+PiArICAgICAgIHsNCj4+ICsgICAgICAgICBhdXRvICZndWFyZF9leHByID0gbWF0Y2hf YXJtLmdldF9ndWFyZF9leHByICgpOw0KPj4gKyAgICAgICAgIGd1YXJkX2V4cHItPmFjY2Vw dF92aXMgKCp0aGlzKTsNCj4+ICsgICAgICAgICBpZiAoZ3VhcmRfZXhwci0+aXNfbWFya2Vk X2Zvcl9zdHJpcCAoKSkNCj4+ICsgICAgICAgICAgIHJ1c3RfZXJyb3JfYXQgKGd1YXJkX2V4 cHItPmdldF9sb2N1cyAoKSwNCj4+ICsgICAgICAgICAgICAgICAgICAgICAgICAgICJjYW5u b3Qgc3RyaXAgZXhwcmVzc2lvbiBpbiB0aGlzIHBvc2l0aW9uIC0gb3V0ZXIgIg0KPj4gKyAg ICAgICAgICAgICAgICAgICAgICAgICAgImF0dHJpYnV0ZXMgbm90IGFsbG93ZWQiKTsNCj4+ ICsgICAgICAgfQ0KPj4gKw0KPj4gKyAgICAgIC8vIHN0cmlwIHN1Yi1leHByZXNzaW9ucyBm cm9tIG1hdGNoIGNhc2VzDQo+PiArICAgICAgYXV0byAmY2FzZV9leHByID0gbWF0Y2hfY2Fz ZS5nZXRfZXhwciAoKTsNCj4+ICsgICAgICBjYXNlX2V4cHItPmFjY2VwdF92aXMgKCp0aGlz KTsNCj4+ICsgICAgICBpZiAoY2FzZV9leHByLT5pc19tYXJrZWRfZm9yX3N0cmlwICgpKQ0K Pj4gKyAgICAgICBydXN0X2Vycm9yX2F0IChjYXNlX2V4cHItPmdldF9sb2N1cyAoKSwNCj4+ ICsgICAgICAgICAgICAgICAgICAgICAgImNhbm5vdCBzdHJpcCBleHByZXNzaW9uIGluIHRo aXMgcG9zaXRpb24gLSBvdXRlciAiDQo+PiArICAgICAgICAgICAgICAgICAgICAgICJhdHRy aWJ1dGVzIG5vdCBhbGxvd2VkIik7DQo+PiArDQo+PiArICAgICAgLy8gaW5jcmVtZW50IHRv IG5leHQgY2FzZSBpZiBoYXZlbid0IGNvbnRpbnVlZA0KPj4gKyAgICAgICsraXQ7DQo+PiAr ICAgIH0NCj4+ICt9DQo+PiArdm9pZA0KPj4gK0F0dHJWaXNpdG9yOjp2aXNpdCAoQVNUOjpB d2FpdEV4cHIgJmV4cHIpDQo+PiArew0KPj4gKyAgLy8gaW5pdGlhbCBzdHJpcCB0ZXN0IGJh c2VkIG9uIG91dGVyIGF0dHJzDQo+PiArICBleHBhbmRlci5leHBhbmRfY2ZnX2F0dHJzIChl eHByLmdldF9vdXRlcl9hdHRycyAoKSk7DQo+PiArICBpZiAoZXhwYW5kZXIuZmFpbHNfY2Zn X3dpdGhfZXhwYW5kIChleHByLmdldF9vdXRlcl9hdHRycyAoKSkpDQo+PiArICAgIHsNCj4+ ICsgICAgICBleHByLm1hcmtfZm9yX3N0cmlwICgpOw0KPj4gKyAgICAgIHJldHVybjsNCj4+ ICsgICAgfQ0KPj4gKw0KPj4gKyAgLyogY2FuJ3Qgc3RyaXAgYXdhaXRlZCBleHByIGl0c2Vs ZiwgYnV0IGNhbiBzdHJpcCBzdWItZXhwcmVzc2lvbnMNCj4+ICsgICAqIC0gdGhpcyBpcyBi ZWNhdXNlIHlvdSBjYW4ndCBoYXZlIG5vIGV4cHIgdG8gYXdhaXQgKi8NCj4+ICsgIGF1dG8g JmF3YWl0ZWRfZXhwciA9IGV4cHIuZ2V0X2F3YWl0ZWRfZXhwciAoKTsNCj4+ICsgIGF3YWl0 ZWRfZXhwci0+YWNjZXB0X3ZpcyAoKnRoaXMpOw0KPj4gKyAgaWYgKGF3YWl0ZWRfZXhwci0+ aXNfbWFya2VkX2Zvcl9zdHJpcCAoKSkNCj4+ICsgICAgcnVzdF9lcnJvcl9hdCAoYXdhaXRl ZF9leHByLT5nZXRfbG9jdXMgKCksDQo+PiArICAgICAgICAgICAgICAgICAgImNhbm5vdCBz dHJpcCBleHByZXNzaW9uIGluIHRoaXMgcG9zaXRpb24gLSBvdXRlciAiDQo+PiArICAgICAg ICAgICAgICAgICAgImF0dHJpYnV0ZXMgbm90IGFsbG93ZWQiKTsNCj4+ICt9DQo+PiArdm9p ZA0KPj4gK0F0dHJWaXNpdG9yOjp2aXNpdCAoQVNUOjpBc3luY0Jsb2NrRXhwciAmZXhwcikN Cj4+ICt7DQo+PiArICAvLyBpbml0aWFsIHN0cmlwIHRlc3QgYmFzZWQgb24gb3V0ZXIgYXR0 cnMNCj4+ICsgIGV4cGFuZGVyLmV4cGFuZF9jZmdfYXR0cnMgKGV4cHIuZ2V0X291dGVyX2F0 dHJzICgpKTsNCj4+ICsgIGlmIChleHBhbmRlci5mYWlsc19jZmdfd2l0aF9leHBhbmQgKGV4 cHIuZ2V0X291dGVyX2F0dHJzICgpKSkNCj4+ICsgICAgew0KPj4gKyAgICAgIGV4cHIubWFy a19mb3Jfc3RyaXAgKCk7DQo+PiArICAgICAgcmV0dXJuOw0KPj4gKyAgICB9DQo+PiArDQo+ PiArICAvLyBjYW4ndCBzdHJpcCBibG9jayBpdHNlbGYsIGJ1dCBjYW4gc3RyaXAgc3ViLWV4 cHJlc3Npb25zDQo+PiArICBhdXRvICZibG9ja19leHByID0gZXhwci5nZXRfYmxvY2tfZXhw ciAoKTsNCj4+ICsgIGJsb2NrX2V4cHItPmFjY2VwdF92aXMgKCp0aGlzKTsNCj4+ICsgIGlm IChibG9ja19leHByLT5pc19tYXJrZWRfZm9yX3N0cmlwICgpKQ0KPj4gKyAgICBydXN0X2Vy cm9yX2F0IChibG9ja19leHByLT5nZXRfbG9jdXMgKCksDQo+PiArICAgICAgICAgICAgICAg ICAgImNhbm5vdCBzdHJpcCBibG9jayBleHByZXNzaW9uIGluIHRoaXMgcG9zaXRpb24gLSBv dXRlciAiDQo+PiArICAgICAgICAgICAgICAgICAgImF0dHJpYnV0ZXMgbm90IGFsbG93ZWQi KTsNCj4+ICt9DQo+PiArDQo+PiArdm9pZA0KPj4gK0F0dHJWaXNpdG9yOjp2aXNpdCAoQVNU OjpUeXBlUGFyYW0gJnBhcmFtKQ0KPj4gK3sNCj4+ICsgIC8vIG91dGVyIGF0dHJpYnV0ZXMg ZG9uJ3QgYWN0dWFsbHkgZG8gYW55dGhpbmcsIHNvIGlnbm9yZSB0aGVtDQo+PiArDQo+PiAr ICBpZiAocGFyYW0uaGFzX3R5cGVfcGFyYW1fYm91bmRzICgpKQ0KPj4gKyAgICB7DQo+PiAr ICAgICAgLy8gZG9uJ3Qgc3RyaXAgZGlyZWN0bHksIG9ubHkgY29tcG9uZW50cyBvZiBib3Vu ZHMNCj4+ICsgICAgICBmb3IgKGF1dG8gJmJvdW5kIDogcGFyYW0uZ2V0X3R5cGVfcGFyYW1f Ym91bmRzICgpKQ0KPj4gKyAgICAgICBib3VuZC0+YWNjZXB0X3ZpcyAoKnRoaXMpOw0KPj4g KyAgICB9DQo+PiArDQo+PiArICBpZiAocGFyYW0uaGFzX3R5cGUgKCkpDQo+PiArICAgIHsN Cj4+ICsgICAgICBleHBhbmRlci5wdXNoX2NvbnRleHQgKE1hY3JvRXhwYW5kZXI6OkNvbnRl eHRUeXBlOjpUWVBFKTsNCj4+ICsgICAgICBhdXRvICZ0eXBlID0gcGFyYW0uZ2V0X3R5cGUg KCk7DQo+PiArICAgICAgdHlwZS0+YWNjZXB0X3ZpcyAoKnRoaXMpOw0KPj4gKw0KPj4gKyAg ICAgIG1heWJlX2V4cGFuZF90eXBlICh0eXBlKTsNCj4+ICsNCj4+ICsgICAgICBpZiAodHlw ZS0+aXNfbWFya2VkX2Zvcl9zdHJpcCAoKSkNCj4+ICsgICAgICAgcnVzdF9lcnJvcl9hdCAo dHlwZS0+Z2V0X2xvY3VzICgpLA0KPj4gKyAgICAgICAgICAgICAgICAgICAgICAiY2Fubm90 IHN0cmlwIHR5cGUgaW4gdGhpcyBwb3NpdGlvbiIpOw0KPj4gKw0KPj4gKyAgICAgIGV4cGFu ZGVyLnBvcF9jb250ZXh0ICgpOw0KPj4gKyAgICB9DQo+PiArfQ0KPj4gK3ZvaWQNCj4+ICtB dHRyVmlzaXRvcjo6dmlzaXQgKEFTVDo6TGlmZXRpbWVXaGVyZUNsYXVzZUl0ZW0gJikNCj4+ ICt7DQo+PiArICAvLyBzaG91bGRuJ3QgcmVxdWlyZQ0KPj4gK30NCj4+ICt2b2lkDQo+PiAr QXR0clZpc2l0b3I6OnZpc2l0IChBU1Q6OlR5cGVCb3VuZFdoZXJlQ2xhdXNlSXRlbSAmaXRl bSkNCj4+ICt7DQo+PiArICAvLyBmb3IgbGlmZXRpbWVzIHNob3VsZG4ndCByZXF1aXJlDQo+ PiArDQo+PiArICBleHBhbmRlci5wdXNoX2NvbnRleHQgKE1hY3JvRXhwYW5kZXI6OkNvbnRl eHRUeXBlOjpUWVBFKTsNCj4+ICsNCj4+ICsgIGF1dG8gJnR5cGUgPSBpdGVtLmdldF90eXBl ICgpOw0KPj4gKyAgdHlwZS0+YWNjZXB0X3ZpcyAoKnRoaXMpOw0KPj4gKw0KPj4gKyAgbWF5 YmVfZXhwYW5kX3R5cGUgKHR5cGUpOw0KPj4gKw0KPj4gKyAgaWYgKHR5cGUtPmlzX21hcmtl ZF9mb3Jfc3RyaXAgKCkpDQo+PiArICAgIHJ1c3RfZXJyb3JfYXQgKHR5cGUtPmdldF9sb2N1 cyAoKSwgImNhbm5vdCBzdHJpcCB0eXBlIGluIHRoaXMgcG9zaXRpb24iKTsNCj4+ICsNCj4+ ICsgIGV4cGFuZGVyLnBvcF9jb250ZXh0ICgpOw0KPj4gKw0KPj4gKyAgLy8gZG9uJ3Qgc3Ry aXAgZGlyZWN0bHksIG9ubHkgY29tcG9uZW50cyBvZiBib3VuZHMNCj4+ICsgIGZvciAoYXV0 byAmYm91bmQgOiBpdGVtLmdldF90eXBlX3BhcmFtX2JvdW5kcyAoKSkNCj4+ICsgICAgYm91 bmQtPmFjY2VwdF92aXMgKCp0aGlzKTsNCj4+ICt9DQo+PiArdm9pZA0KPj4gK0F0dHJWaXNp dG9yOjp2aXNpdCAoQVNUOjpNZXRob2QgJm1ldGhvZCkNCj4+ICt7DQo+PiArICAvLyBpbml0 aWFsIHRlc3QgYmFzZWQgb24gb3V0ZXIgYXR0cnMNCj4+ICsgIGV4cGFuZGVyLmV4cGFuZF9j ZmdfYXR0cnMgKG1ldGhvZC5nZXRfb3V0ZXJfYXR0cnMgKCkpOw0KPj4gKyAgaWYgKGV4cGFu ZGVyLmZhaWxzX2NmZ193aXRoX2V4cGFuZCAobWV0aG9kLmdldF9vdXRlcl9hdHRycyAoKSkp DQo+PiArICAgIHsNCj4+ICsgICAgICBtZXRob2QubWFya19mb3Jfc3RyaXAgKCk7DQo+PiAr ICAgICAgcmV0dXJuOw0KPj4gKyAgICB9DQo+PiArDQo+PiArICAvLyBqdXN0IGV4cGFuZCBz dWItc3R1ZmYgLSBjYW4ndCBhY3R1YWxseSBzdHJpcCBnZW5lcmljIHBhcmFtcyB0aGVtc2Vs dmVzDQo+PiArICBmb3IgKGF1dG8gJnBhcmFtIDogbWV0aG9kLmdldF9nZW5lcmljX3BhcmFt cyAoKSkNCj4+ICsgICAgcGFyYW0tPmFjY2VwdF92aXMgKCp0aGlzKTsNCj4+ICsNCj4+ICsg IC8qIGFzc3VtaW5nIHlvdSBjYW4ndCBzdHJpcCBzZWxmIHBhcmFtIC0gd291bGRuJ3QgYmUg YSBtZXRob2QNCj4+ICsgICAqIGFueW1vcmUuIHNwZWMgYWxsb3dzIG91dGVyIGF0dHJzIG9u IHNlbGYgcGFyYW0sIGJ1dCBkb2Vzbid0DQo+PiArICAgKiBzcGVjaWZ5IHdoZXRoZXIgY2Zn IGlzIHVzZWQuICovDQo+PiArICBleHBhbmRfc2VsZl9wYXJhbSAobWV0aG9kLmdldF9zZWxm X3BhcmFtICgpKTsNCj4+ICsNCj4+ICsgIC8qIHN0cmlwIG1ldGhvZCBwYXJhbWV0ZXJzIGlm IHJlcXVpcmVkIC0gdGhpcyBpcyBzcGVjaWZpY2FsbHkNCj4+ICsgICAqIGFsbG93ZWQgYnkg c3BlYyAqLw0KPj4gKyAgZXhwYW5kX2Z1bmN0aW9uX3BhcmFtcyAobWV0aG9kLmdldF9mdW5j dGlvbl9wYXJhbXMgKCkpOw0KPj4gKw0KPj4gKyAgaWYgKG1ldGhvZC5oYXNfcmV0dXJuX3R5 cGUgKCkpDQo+PiArICAgIHsNCj4+ICsgICAgICBleHBhbmRlci5wdXNoX2NvbnRleHQgKE1h Y3JvRXhwYW5kZXI6OkNvbnRleHRUeXBlOjpUWVBFKTsNCj4+ICsNCj4+ICsgICAgICBhdXRv ICZyZXR1cm5fdHlwZSA9IG1ldGhvZC5nZXRfcmV0dXJuX3R5cGUgKCk7DQo+PiArICAgICAg cmV0dXJuX3R5cGUtPmFjY2VwdF92aXMgKCp0aGlzKTsNCj4+ICsNCj4+ICsgICAgICBtYXli ZV9leHBhbmRfdHlwZSAocmV0dXJuX3R5cGUpOw0KPj4gKw0KPj4gKyAgICAgIGlmIChyZXR1 cm5fdHlwZS0+aXNfbWFya2VkX2Zvcl9zdHJpcCAoKSkNCj4+ICsgICAgICAgcnVzdF9lcnJv cl9hdCAocmV0dXJuX3R5cGUtPmdldF9sb2N1cyAoKSwNCj4+ICsgICAgICAgICAgICAgICAg ICAgICAgImNhbm5vdCBzdHJpcCB0eXBlIGluIHRoaXMgcG9zaXRpb24iKTsNCj4+ICsNCj4+ ICsgICAgICBleHBhbmRlci5wb3BfY29udGV4dCAoKTsNCj4+ICsgICAgfQ0KPj4gKw0KPj4g KyAgaWYgKG1ldGhvZC5oYXNfd2hlcmVfY2xhdXNlICgpKQ0KPj4gKyAgICBleHBhbmRfd2hl cmVfY2xhdXNlIChtZXRob2QuZ2V0X3doZXJlX2NsYXVzZSAoKSk7DQo+PiArDQo+PiArICAv KiBib2R5IHNob3VsZCBhbHdheXMgZXhpc3QgLSBpZiBlcnJvciBzdGF0ZSwgc2hvdWxkIGhh dmUgcmV0dXJuZWQNCj4+ICsgICAqIGJlZm9yZSBub3cgKi8NCj4+ICsgIC8vIGNhbid0IHN0 cmlwIGJsb2NrIGl0c2VsZiwgYnV0IGNhbiBzdHJpcCBzdWItZXhwcmVzc2lvbnMNCj4+ICsg IGF1dG8gJmJsb2NrX2V4cHIgPSBtZXRob2QuZ2V0X2RlZmluaXRpb24gKCk7DQo+PiArICBi bG9ja19leHByLT5hY2NlcHRfdmlzICgqdGhpcyk7DQo+PiArICBpZiAoYmxvY2tfZXhwci0+ aXNfbWFya2VkX2Zvcl9zdHJpcCAoKSkNCj4+ICsgICAgcnVzdF9lcnJvcl9hdCAoYmxvY2tf ZXhwci0+Z2V0X2xvY3VzICgpLA0KPj4gKyAgICAgICAgICAgICAgICAgICJjYW5ub3Qgc3Ry aXAgYmxvY2sgZXhwcmVzc2lvbiBpbiB0aGlzIHBvc2l0aW9uIC0gb3V0ZXIgIg0KPj4gKyAg ICAgICAgICAgICAgICAgICJhdHRyaWJ1dGVzIG5vdCBhbGxvd2VkIik7DQo+PiArfQ0KPj4g K3ZvaWQNCj4+ICtBdHRyVmlzaXRvcjo6dmlzaXQgKEFTVDo6TW9kdWxlICZtb2R1bGUpDQo+ PiArew0KPj4gKyAgLy8gc3RyaXAgdGVzdCBiYXNlZCBvbiBvdXRlciBhdHRycw0KPj4gKyAg ZXhwYW5kZXIuZXhwYW5kX2NmZ19hdHRycyAobW9kdWxlLmdldF9vdXRlcl9hdHRycyAoKSk7 DQo+PiArICBpZiAoZXhwYW5kZXIuZmFpbHNfY2ZnX3dpdGhfZXhwYW5kIChtb2R1bGUuZ2V0 X291dGVyX2F0dHJzICgpKSkNCj4+ICsgICAgew0KPj4gKyAgICAgIG1vZHVsZS5tYXJrX2Zv cl9zdHJpcCAoKTsNCj4+ICsgICAgICByZXR1cm47DQo+PiArICAgIH0NCj4+ICsNCj4+ICsg IC8vIEEgbG9hZGVkIG1vZHVsZSBtaWdodCBoYXZlIGlubmVyIGF0dHJpYnV0ZXMNCj4+ICsg IGlmIChtb2R1bGUuZ2V0X2tpbmQgKCkgPT0gQVNUOjpNb2R1bGU6Ok1vZHVsZUtpbmQ6OkxP QURFRCkNCj4+ICsgICAgew0KPj4gKyAgICAgIC8vIHN0cmlwIHRlc3QgYmFzZWQgb24gaW5u ZXIgYXR0cnMNCj4+ICsgICAgICBleHBhbmRlci5leHBhbmRfY2ZnX2F0dHJzIChtb2R1bGUu Z2V0X2lubmVyX2F0dHJzICgpKTsNCj4+ICsgICAgICBpZiAoZXhwYW5kZXIuZmFpbHNfY2Zn X3dpdGhfZXhwYW5kIChtb2R1bGUuZ2V0X2lubmVyX2F0dHJzICgpKSkNCj4+ICsgICAgICAg ew0KPj4gKyAgICAgICAgIG1vZHVsZS5tYXJrX2Zvcl9zdHJpcCAoKTsNCj4+ICsgICAgICAg ICByZXR1cm47DQo+PiArICAgICAgIH0NCj4+ICsgICAgfQ0KPj4gKw0KPj4gKyAgLy8gUGFy c2UgdGhlIG1vZHVsZSdzIGl0ZW1zIGlmIHRoZXkgaGF2ZW4ndCBiZWVuIGV4cGFuZGVkIGFu ZCB0aGUgZmlsZQ0KPj4gKyAgLy8gc2hvdWxkIGJlIHBhcnNlZCAoaS5lIGlzbid0IGhpZGRl biBiZWhpbmQgYW4gdW50cnVlIG9yIGltcG9zc2libGUgY2ZnDQo+PiArICAvLyBkaXJlY3Rp dmUpDQo+PiArICBpZiAoIW1vZHVsZS5pc19tYXJrZWRfZm9yX3N0cmlwICgpDQo+PiArICAg ICAgJiYgbW9kdWxlLmdldF9raW5kICgpID09IEFTVDo6TW9kdWxlOjpNb2R1bGVLaW5kOjpV TkxPQURFRCkNCj4+ICsgICAgew0KPj4gKyAgICAgIG1vZHVsZS5sb2FkX2l0ZW1zICgpOw0K Pj4gKyAgICB9DQo+PiArDQo+PiArICAvLyBzdHJpcCBpdGVtcyBpZiByZXF1aXJlZA0KPj4g KyAgZXhwYW5kX3BvaW50ZXJfYWxsb3dfc3RyaXAgKG1vZHVsZS5nZXRfaXRlbXMgKCkpOw0K Pj4gK30NCj4+ICt2b2lkDQo+PiArQXR0clZpc2l0b3I6OnZpc2l0IChBU1Q6OkV4dGVybkNy YXRlICZleHRlcm5fY3JhdGUpDQo+PiArew0KPj4gKyAgLy8gc3RyaXAgdGVzdCBiYXNlZCBv biBvdXRlciBhdHRycw0KPj4gKyAgZXhwYW5kZXIuZXhwYW5kX2NmZ19hdHRycyAoZXh0ZXJu X2NyYXRlLmdldF9vdXRlcl9hdHRycyAoKSk7DQo+PiArICBpZiAoZXhwYW5kZXIuZmFpbHNf Y2ZnX3dpdGhfZXhwYW5kIChleHRlcm5fY3JhdGUuZ2V0X291dGVyX2F0dHJzICgpKSkNCj4+ ICsgICAgew0KPj4gKyAgICAgIGV4dGVybl9jcmF0ZS5tYXJrX2Zvcl9zdHJpcCAoKTsNCj4+ ICsgICAgICByZXR1cm47DQo+PiArICAgIH0NCj4+ICsNCj4+ICsgIGlmICghZXh0ZXJuX2Ny YXRlLnJlZmVyZW5jZXNfc2VsZiAoKSkNCj4+ICsgICAgew0KPj4gKyAgICAgIFNlc3Npb24g JnNlc3Npb24gPSBTZXNzaW9uOjpnZXRfaW5zdGFuY2UgKCk7DQo+PiArICAgICAgc2Vzc2lv bi5sb2FkX2V4dGVybl9jcmF0ZSAoZXh0ZXJuX2NyYXRlLmdldF9yZWZlcmVuY2VkX2NyYXRl ICgpLA0KPj4gKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXh0ZXJuX2NyYXRl LmdldF9sb2N1cyAoKSk7DQo+PiArICAgIH0NCj4+ICt9DQo+PiArdm9pZA0KPj4gK0F0dHJW aXNpdG9yOjp2aXNpdCAoQVNUOjpVc2VUcmVlR2xvYiAmKQ0KPj4gK3sNCj4+ICsgIC8vIHNo b3VsZG4ndCByZXF1aXJlPw0KPj4gK30NCj4+ICt2b2lkDQo+PiArQXR0clZpc2l0b3I6OnZp c2l0IChBU1Q6OlVzZVRyZWVMaXN0ICYpDQo+PiArew0KPj4gKyAgLy8gc2hvdWxkbid0IHJl cXVpcmU/DQo+PiArfQ0KPj4gK3ZvaWQNCj4+ICtBdHRyVmlzaXRvcjo6dmlzaXQgKEFTVDo6 VXNlVHJlZVJlYmluZCAmKQ0KPj4gK3sNCj4+ICsgIC8vIHNob3VsZG4ndCByZXF1aXJlPw0K Pj4gK30NCj4+ICt2b2lkDQo+PiArQXR0clZpc2l0b3I6OnZpc2l0IChBU1Q6OlVzZURlY2xh cmF0aW9uICZ1c2VfZGVjbCkNCj4+ICt7DQo+PiArICAvLyBzdHJpcCB0ZXN0IGJhc2VkIG9u IG91dGVyIGF0dHJzDQo+PiArICBleHBhbmRlci5leHBhbmRfY2ZnX2F0dHJzICh1c2VfZGVj bC5nZXRfb3V0ZXJfYXR0cnMgKCkpOw0KPj4gKyAgaWYgKGV4cGFuZGVyLmZhaWxzX2NmZ193 aXRoX2V4cGFuZCAodXNlX2RlY2wuZ2V0X291dGVyX2F0dHJzICgpKSkNCj4+ICsgICAgew0K Pj4gKyAgICAgIHVzZV9kZWNsLm1hcmtfZm9yX3N0cmlwICgpOw0KPj4gKyAgICAgIHJldHVy bjsNCj4+ICsgICAgfQ0KPj4gK30NCj4+ICt2b2lkDQo+PiArQXR0clZpc2l0b3I6OnZpc2l0 IChBU1Q6OkZ1bmN0aW9uICZmdW5jdGlvbikNCj4+ICt7DQo+PiArICAvLyBpbml0aWFsIHRl c3QgYmFzZWQgb24gb3V0ZXIgYXR0cnMNCj4+ICsgIGV4cGFuZGVyLmV4cGFuZF9jZmdfYXR0 cnMgKGZ1bmN0aW9uLmdldF9vdXRlcl9hdHRycyAoKSk7DQo+PiArICBpZiAoZXhwYW5kZXIu ZmFpbHNfY2ZnX3dpdGhfZXhwYW5kIChmdW5jdGlvbi5nZXRfb3V0ZXJfYXR0cnMgKCkpKQ0K Pj4gKyAgICB7DQo+PiArICAgICAgZnVuY3Rpb24ubWFya19mb3Jfc3RyaXAgKCk7DQo+PiAr ICAgICAgcmV0dXJuOw0KPj4gKyAgICB9DQo+PiArDQo+PiArICAvLyBqdXN0IGV4cGFuZCBz dWItc3R1ZmYgLSBjYW4ndCBhY3R1YWxseSBzdHJpcCBnZW5lcmljIHBhcmFtcyB0aGVtc2Vs dmVzDQo+PiArICBmb3IgKGF1dG8gJnBhcmFtIDogZnVuY3Rpb24uZ2V0X2dlbmVyaWNfcGFy YW1zICgpKQ0KPj4gKyAgICBwYXJhbS0+YWNjZXB0X3ZpcyAoKnRoaXMpOw0KPj4gKw0KPj4g KyAgLyogc3RyaXAgZnVuY3Rpb24gcGFyYW1ldGVycyBpZiByZXF1aXJlZCAtIHRoaXMgaXMg c3BlY2lmaWNhbGx5DQo+PiArICAgKiBhbGxvd2VkIGJ5IHNwZWMgKi8NCj4+ICsgIGV4cGFu ZF9mdW5jdGlvbl9wYXJhbXMgKGZ1bmN0aW9uLmdldF9mdW5jdGlvbl9wYXJhbXMgKCkpOw0K Pj4gKw0KPj4gKyAgaWYgKGZ1bmN0aW9uLmhhc19yZXR1cm5fdHlwZSAoKSkNCj4+ICsgICAg ew0KPj4gKyAgICAgIGV4cGFuZGVyLnB1c2hfY29udGV4dCAoTWFjcm9FeHBhbmRlcjo6Q29u dGV4dFR5cGU6OlRZUEUpOw0KPj4gKw0KPj4gKyAgICAgIGF1dG8gJnJldHVybl90eXBlID0g ZnVuY3Rpb24uZ2V0X3JldHVybl90eXBlICgpOw0KPj4gKyAgICAgIHJldHVybl90eXBlLT5h Y2NlcHRfdmlzICgqdGhpcyk7DQo+PiArDQo+PiArICAgICAgbWF5YmVfZXhwYW5kX3R5cGUg KHJldHVybl90eXBlKTsNCj4+ICsNCj4+ICsgICAgICBpZiAocmV0dXJuX3R5cGUtPmlzX21h cmtlZF9mb3Jfc3RyaXAgKCkpDQo+PiArICAgICAgIHJ1c3RfZXJyb3JfYXQgKHJldHVybl90 eXBlLT5nZXRfbG9jdXMgKCksDQo+PiArICAgICAgICAgICAgICAgICAgICAgICJjYW5ub3Qg c3RyaXAgdHlwZSBpbiB0aGlzIHBvc2l0aW9uIik7DQo+PiArDQo+PiArICAgICAgZXhwYW5k ZXIucG9wX2NvbnRleHQgKCk7DQo+PiArICAgIH0NCj4+ICsNCj4+ICsgIGlmIChmdW5jdGlv bi5oYXNfd2hlcmVfY2xhdXNlICgpKQ0KPj4gKyAgICBleHBhbmRfd2hlcmVfY2xhdXNlIChm dW5jdGlvbi5nZXRfd2hlcmVfY2xhdXNlICgpKTsNCj4+ICsNCj4+ICsgIC8qIGJvZHkgc2hv dWxkIGFsd2F5cyBleGlzdCAtIGlmIGVycm9yIHN0YXRlLCBzaG91bGQgaGF2ZSByZXR1cm5l ZA0KPj4gKyAgICogYmVmb3JlIG5vdyAqLw0KPj4gKyAgLy8gY2FuJ3Qgc3RyaXAgYmxvY2sg aXRzZWxmLCBidXQgY2FuIHN0cmlwIHN1Yi1leHByZXNzaW9ucw0KPj4gKyAgYXV0byAmYmxv Y2tfZXhwciA9IGZ1bmN0aW9uLmdldF9kZWZpbml0aW9uICgpOw0KPj4gKyAgYmxvY2tfZXhw ci0+YWNjZXB0X3ZpcyAoKnRoaXMpOw0KPj4gKyAgaWYgKGJsb2NrX2V4cHItPmlzX21hcmtl ZF9mb3Jfc3RyaXAgKCkpDQo+PiArICAgIHJ1c3RfZXJyb3JfYXQgKGJsb2NrX2V4cHItPmdl dF9sb2N1cyAoKSwNCj4+ICsgICAgICAgICAgICAgICAgICAiY2Fubm90IHN0cmlwIGJsb2Nr IGV4cHJlc3Npb24gaW4gdGhpcyBwb3NpdGlvbiAtIG91dGVyICINCj4+ICsgICAgICAgICAg ICAgICAgICAiYXR0cmlidXRlcyBub3QgYWxsb3dlZCIpOw0KPj4gK30NCj4+ICt2b2lkDQo+ PiArQXR0clZpc2l0b3I6OnZpc2l0IChBU1Q6OlR5cGVBbGlhcyAmdHlwZV9hbGlhcykNCj4+ ICt7DQo+PiArICAvLyBpbml0aWFsIHRlc3QgYmFzZWQgb24gb3V0ZXIgYXR0cnMNCj4+ICsg IGV4cGFuZGVyLmV4cGFuZF9jZmdfYXR0cnMgKHR5cGVfYWxpYXMuZ2V0X291dGVyX2F0dHJz ICgpKTsNCj4+ICsgIGlmIChleHBhbmRlci5mYWlsc19jZmdfd2l0aF9leHBhbmQgKHR5cGVf YWxpYXMuZ2V0X291dGVyX2F0dHJzICgpKSkNCj4+ICsgICAgew0KPj4gKyAgICAgIHR5cGVf YWxpYXMubWFya19mb3Jfc3RyaXAgKCk7DQo+PiArICAgICAgcmV0dXJuOw0KPj4gKyAgICB9 DQo+PiArDQo+PiArICAvLyBqdXN0IGV4cGFuZCBzdWItc3R1ZmYgLSBjYW4ndCBhY3R1YWxs eSBzdHJpcCBnZW5lcmljIHBhcmFtcyB0aGVtc2VsdmVzDQo+PiArICBmb3IgKGF1dG8gJnBh cmFtIDogdHlwZV9hbGlhcy5nZXRfZ2VuZXJpY19wYXJhbXMgKCkpDQo+PiArICAgIHBhcmFt LT5hY2NlcHRfdmlzICgqdGhpcyk7DQo+PiArDQo+PiArICBpZiAodHlwZV9hbGlhcy5oYXNf d2hlcmVfY2xhdXNlICgpKQ0KPj4gKyAgICBleHBhbmRfd2hlcmVfY2xhdXNlICh0eXBlX2Fs aWFzLmdldF93aGVyZV9jbGF1c2UgKCkpOw0KPj4gKw0KPj4gKyAgYXV0byAmdHlwZSA9IHR5 cGVfYWxpYXMuZ2V0X3R5cGVfYWxpYXNlZCAoKTsNCj4+ICsgIHR5cGUtPmFjY2VwdF92aXMg KCp0aGlzKTsNCj4+ICsgIGlmICh0eXBlLT5pc19tYXJrZWRfZm9yX3N0cmlwICgpKQ0KPj4g KyAgICBydXN0X2Vycm9yX2F0ICh0eXBlLT5nZXRfbG9jdXMgKCksICJjYW5ub3Qgc3RyaXAg dHlwZSBpbiB0aGlzIHBvc2l0aW9uIik7DQo+PiArfQ0KPj4gK3ZvaWQNCj4+ICtBdHRyVmlz aXRvcjo6dmlzaXQgKEFTVDo6U3RydWN0U3RydWN0ICZzdHJ1Y3RfaXRlbSkNCj4+ICt7DQo+ PiArICAvLyBpbml0aWFsIHRlc3QgYmFzZWQgb24gb3V0ZXIgYXR0cnMNCj4+ICsgIGV4cGFu ZGVyLmV4cGFuZF9jZmdfYXR0cnMgKHN0cnVjdF9pdGVtLmdldF9vdXRlcl9hdHRycyAoKSk7 DQo+PiArICBpZiAoZXhwYW5kZXIuZmFpbHNfY2ZnX3dpdGhfZXhwYW5kIChzdHJ1Y3RfaXRl bS5nZXRfb3V0ZXJfYXR0cnMgKCkpKQ0KPj4gKyAgICB7DQo+PiArICAgICAgc3RydWN0X2l0 ZW0ubWFya19mb3Jfc3RyaXAgKCk7DQo+PiArICAgICAgcmV0dXJuOw0KPj4gKyAgICB9DQo+ PiArDQo+PiArICAvLyBqdXN0IGV4cGFuZCBzdWItc3R1ZmYgLSBjYW4ndCBhY3R1YWxseSBz dHJpcCBnZW5lcmljIHBhcmFtcyB0aGVtc2VsdmVzDQo+PiArICBmb3IgKGF1dG8gJnBhcmFt IDogc3RydWN0X2l0ZW0uZ2V0X2dlbmVyaWNfcGFyYW1zICgpKQ0KPj4gKyAgICBwYXJhbS0+ YWNjZXB0X3ZpcyAoKnRoaXMpOw0KPj4gKw0KPj4gKyAgaWYgKHN0cnVjdF9pdGVtLmhhc193 aGVyZV9jbGF1c2UgKCkpDQo+PiArICAgIGV4cGFuZF93aGVyZV9jbGF1c2UgKHN0cnVjdF9p dGVtLmdldF93aGVyZV9jbGF1c2UgKCkpOw0KPj4gKw0KPj4gKyAgLyogc3RyaXAgc3RydWN0 IGZpZWxkcyBpZiByZXF1aXJlZCAtIHRoaXMgaXMgcHJlc3VtYWJseQ0KPj4gKyAgICogYWxs b3dlZCBieSBzcGVjICovDQo+PiArICBleHBhbmRfc3RydWN0X2ZpZWxkcyAoc3RydWN0X2l0 ZW0uZ2V0X2ZpZWxkcyAoKSk7DQo+PiArfQ0KPj4gK3ZvaWQNCj4+ICtBdHRyVmlzaXRvcjo6 dmlzaXQgKEFTVDo6VHVwbGVTdHJ1Y3QgJnR1cGxlX3N0cnVjdCkNCj4+ICt7DQo+PiArICAv LyBpbml0aWFsIHRlc3QgYmFzZWQgb24gb3V0ZXIgYXR0cnMNCj4+ICsgIGV4cGFuZGVyLmV4 cGFuZF9jZmdfYXR0cnMgKHR1cGxlX3N0cnVjdC5nZXRfb3V0ZXJfYXR0cnMgKCkpOw0KPj4g KyAgaWYgKGV4cGFuZGVyLmZhaWxzX2NmZ193aXRoX2V4cGFuZCAodHVwbGVfc3RydWN0Lmdl dF9vdXRlcl9hdHRycyAoKSkpDQo+PiArICAgIHsNCj4+ICsgICAgICB0dXBsZV9zdHJ1Y3Qu bWFya19mb3Jfc3RyaXAgKCk7DQo+PiArICAgICAgcmV0dXJuOw0KPj4gKyAgICB9DQo+PiAr DQo+PiArICAvLyBqdXN0IGV4cGFuZCBzdWItc3R1ZmYgLSBjYW4ndCBhY3R1YWxseSBzdHJp cCBnZW5lcmljIHBhcmFtcyB0aGVtc2VsdmVzDQo+PiArICBmb3IgKGF1dG8gJnBhcmFtIDog dHVwbGVfc3RydWN0LmdldF9nZW5lcmljX3BhcmFtcyAoKSkNCj4+ICsgICAgcGFyYW0tPmFj Y2VwdF92aXMgKCp0aGlzKTsNCj4+ICsNCj4+ICsgIC8qIHN0cmlwIHN0cnVjdCBmaWVsZHMg aWYgcmVxdWlyZWQgLSB0aGlzIGlzIHByZXN1bWFibHkNCj4+ICsgICAqIGFsbG93ZWQgYnkg c3BlYyAqLw0KPj4gKyAgZXhwYW5kX3R1cGxlX2ZpZWxkcyAodHVwbGVfc3RydWN0LmdldF9m aWVsZHMgKCkpOw0KPj4gKw0KPj4gKyAgaWYgKHR1cGxlX3N0cnVjdC5oYXNfd2hlcmVfY2xh dXNlICgpKQ0KPj4gKyAgICBleHBhbmRfd2hlcmVfY2xhdXNlICh0dXBsZV9zdHJ1Y3QuZ2V0 X3doZXJlX2NsYXVzZSAoKSk7DQo+PiArfQ0KPj4gK3ZvaWQNCj4+ICtBdHRyVmlzaXRvcjo6 dmlzaXQgKEFTVDo6RW51bUl0ZW0gJml0ZW0pDQo+PiArew0KPj4gKyAgLy8gaW5pdGlhbCB0 ZXN0IGJhc2VkIG9uIG91dGVyIGF0dHJzDQo+PiArICBleHBhbmRlci5leHBhbmRfY2ZnX2F0 dHJzIChpdGVtLmdldF9vdXRlcl9hdHRycyAoKSk7DQo+PiArICBpZiAoZXhwYW5kZXIuZmFp bHNfY2ZnX3dpdGhfZXhwYW5kIChpdGVtLmdldF9vdXRlcl9hdHRycyAoKSkpDQo+PiArICAg IHsNCj4+ICsgICAgICBpdGVtLm1hcmtfZm9yX3N0cmlwICgpOw0KPj4gKyAgICAgIHJldHVy bjsNCj4+ICsgICAgfQ0KPj4gK30NCj4+ICt2b2lkDQo+PiArQXR0clZpc2l0b3I6OnZpc2l0 IChBU1Q6OkVudW1JdGVtVHVwbGUgJml0ZW0pDQo+PiArew0KPj4gKyAgLy8gaW5pdGlhbCB0 ZXN0IGJhc2VkIG9uIG91dGVyIGF0dHJzDQo+PiArICBleHBhbmRlci5leHBhbmRfY2ZnX2F0 dHJzIChpdGVtLmdldF9vdXRlcl9hdHRycyAoKSk7DQo+PiArICBpZiAoZXhwYW5kZXIuZmFp bHNfY2ZnX3dpdGhfZXhwYW5kIChpdGVtLmdldF9vdXRlcl9hdHRycyAoKSkpDQo+PiArICAg IHsNCj4+ICsgICAgICBpdGVtLm1hcmtfZm9yX3N0cmlwICgpOw0KPj4gKyAgICAgIHJldHVy bjsNCj4+ICsgICAgfQ0KPj4gKw0KPj4gKyAgLyogc3RyaXAgaXRlbSBmaWVsZHMgaWYgcmVx dWlyZWQgLSB0aGlzIGlzIHByZXN1bWFibHkNCj4+ICsgICAqIGFsbG93ZWQgYnkgc3BlYyAq Lw0KPj4gKyAgZXhwYW5kX3R1cGxlX2ZpZWxkcyAoaXRlbS5nZXRfdHVwbGVfZmllbGRzICgp KTsNCj4+ICt9DQo+PiArdm9pZA0KPj4gK0F0dHJWaXNpdG9yOjp2aXNpdCAoQVNUOjpFbnVt SXRlbVN0cnVjdCAmaXRlbSkNCj4+ICt7DQo+PiArICAvLyBpbml0aWFsIHRlc3QgYmFzZWQg b24gb3V0ZXIgYXR0cnMNCj4+ICsgIGV4cGFuZGVyLmV4cGFuZF9jZmdfYXR0cnMgKGl0ZW0u Z2V0X291dGVyX2F0dHJzICgpKTsNCj4+ICsgIGlmIChleHBhbmRlci5mYWlsc19jZmdfd2l0 aF9leHBhbmQgKGl0ZW0uZ2V0X291dGVyX2F0dHJzICgpKSkNCj4+ICsgICAgew0KPj4gKyAg ICAgIGl0ZW0ubWFya19mb3Jfc3RyaXAgKCk7DQo+PiArICAgICAgcmV0dXJuOw0KPj4gKyAg ICB9DQo+PiArDQo+PiArICAvKiBzdHJpcCBpdGVtIGZpZWxkcyBpZiByZXF1aXJlZCAtIHRo aXMgaXMgcHJlc3VtYWJseQ0KPj4gKyAgICogYWxsb3dlZCBieSBzcGVjICovDQo+PiArICBl eHBhbmRfc3RydWN0X2ZpZWxkcyAoaXRlbS5nZXRfc3RydWN0X2ZpZWxkcyAoKSk7DQo+PiAr fQ0KPj4gK3ZvaWQNCj4+ICtBdHRyVmlzaXRvcjo6dmlzaXQgKEFTVDo6RW51bUl0ZW1EaXNj cmltaW5hbnQgJml0ZW0pDQo+PiArew0KPj4gKyAgLy8gaW5pdGlhbCB0ZXN0IGJhc2VkIG9u IG91dGVyIGF0dHJzDQo+PiArICBleHBhbmRlci5leHBhbmRfY2ZnX2F0dHJzIChpdGVtLmdl dF9vdXRlcl9hdHRycyAoKSk7DQo+PiArICBpZiAoZXhwYW5kZXIuZmFpbHNfY2ZnX3dpdGhf ZXhwYW5kIChpdGVtLmdldF9vdXRlcl9hdHRycyAoKSkpDQo+PiArICAgIHsNCj4+ICsgICAg ICBpdGVtLm1hcmtfZm9yX3N0cmlwICgpOw0KPj4gKyAgICAgIHJldHVybjsNCj4+ICsgICAg fQ0KPj4gKw0KPj4gKyAgLyogc3RyaXAgYW55IGludGVybmFsIHN1Yi1leHByZXNzaW9ucyAt IGV4cHJlc3Npb24gaXRzZWxmIGlzbid0DQo+PiArICAgKiBhbGxvd2VkIHRvIGhhdmUgZXh0 ZXJuYWwgYXR0cmlidXRlcyBpbiB0aGlzIHBvc2l0aW9uIHNvIGNhbid0IGJlDQo+PiArICAg KiBzdHJpcHBlZC4gKi8NCj4+ICsgIGF1dG8gJmV4cHIgPSBpdGVtLmdldF9leHByICgpOw0K Pj4gKyAgZXhwci0+YWNjZXB0X3ZpcyAoKnRoaXMpOw0KPj4gKyAgaWYgKGV4cHItPmlzX21h cmtlZF9mb3Jfc3RyaXAgKCkpDQo+PiArICAgIHJ1c3RfZXJyb3JfYXQgKGV4cHItPmdldF9s b2N1cyAoKSwNCj4+ICsgICAgICAgICAgICAgICAgICAiY2Fubm90IHN0cmlwIGV4cHJlc3Np b24gaW4gdGhpcyBwb3NpdGlvbiAtIG91dGVyICINCj4+ICsgICAgICAgICAgICAgICAgICAi YXR0cmlidXRlcyBub3QgYWxsb3dlZCIpOw0KPj4gK30NCj4+ICt2b2lkDQo+PiArQXR0clZp c2l0b3I6OnZpc2l0IChBU1Q6OkVudW0gJmVudW1faXRlbSkNCj4+ICt7DQo+PiArICAvLyBp bml0aWFsIHRlc3QgYmFzZWQgb24gb3V0ZXIgYXR0cnMNCj4+ICsgIGV4cGFuZGVyLmV4cGFu ZF9jZmdfYXR0cnMgKGVudW1faXRlbS5nZXRfb3V0ZXJfYXR0cnMgKCkpOw0KPj4gKyAgaWYg KGV4cGFuZGVyLmZhaWxzX2NmZ193aXRoX2V4cGFuZCAoZW51bV9pdGVtLmdldF9vdXRlcl9h dHRycyAoKSkpDQo+PiArICAgIHsNCj4+ICsgICAgICBlbnVtX2l0ZW0ubWFya19mb3Jfc3Ry aXAgKCk7DQo+PiArICAgICAgcmV0dXJuOw0KPj4gKyAgICB9DQo+PiArDQo+PiArICAvLyBq dXN0IGV4cGFuZCBzdWItc3R1ZmYgLSBjYW4ndCBhY3R1YWxseSBzdHJpcCBnZW5lcmljIHBh cmFtcyB0aGVtc2VsdmVzDQo+PiArICBmb3IgKGF1dG8gJnBhcmFtIDogZW51bV9pdGVtLmdl dF9nZW5lcmljX3BhcmFtcyAoKSkNCj4+ICsgICAgcGFyYW0tPmFjY2VwdF92aXMgKCp0aGlz KTsNCj4+ICsNCj4+ICsgIGlmIChlbnVtX2l0ZW0uaGFzX3doZXJlX2NsYXVzZSAoKSkNCj4+ ICsgICAgZXhwYW5kX3doZXJlX2NsYXVzZSAoZW51bV9pdGVtLmdldF93aGVyZV9jbGF1c2Ug KCkpOw0KPj4gKw0KPj4gKyAgLyogc3RyaXAgZW51bSBmaWVsZHMgaWYgcmVxdWlyZWQgLSB0 aGlzIGlzIHByZXN1bWFibHkNCj4+ICsgICAqIGFsbG93ZWQgYnkgc3BlYyAqLw0KPj4gKyAg ZXhwYW5kX3BvaW50ZXJfYWxsb3dfc3RyaXAgKGVudW1faXRlbS5nZXRfdmFyaWFudHMgKCkp Ow0KPj4gK30NCj4+ICt2b2lkDQo+PiArQXR0clZpc2l0b3I6OnZpc2l0IChBU1Q6OlVuaW9u ICZ1bmlvbl9pdGVtKQ0KPj4gK3sNCj4+ICsgIC8vIGluaXRpYWwgdGVzdCBiYXNlZCBvbiBv dXRlciBhdHRycw0KPj4gKyAgZXhwYW5kZXIuZXhwYW5kX2NmZ19hdHRycyAodW5pb25faXRl bS5nZXRfb3V0ZXJfYXR0cnMgKCkpOw0KPj4gKyAgaWYgKGV4cGFuZGVyLmZhaWxzX2NmZ193 aXRoX2V4cGFuZCAodW5pb25faXRlbS5nZXRfb3V0ZXJfYXR0cnMgKCkpKQ0KPj4gKyAgICB7 DQo+PiArICAgICAgdW5pb25faXRlbS5tYXJrX2Zvcl9zdHJpcCAoKTsNCj4+ICsgICAgICBy ZXR1cm47DQo+PiArICAgIH0NCj4+ICsNCj4+ICsgIC8vIGp1c3QgZXhwYW5kIHN1Yi1zdHVm ZiAtIGNhbid0IGFjdHVhbGx5IHN0cmlwIGdlbmVyaWMgcGFyYW1zIHRoZW1zZWx2ZXMNCj4+ ICsgIGZvciAoYXV0byAmcGFyYW0gOiB1bmlvbl9pdGVtLmdldF9nZW5lcmljX3BhcmFtcyAo KSkNCj4+ICsgICAgcGFyYW0tPmFjY2VwdF92aXMgKCp0aGlzKTsNCj4+ICsNCj4+ICsgIGlm ICh1bmlvbl9pdGVtLmhhc193aGVyZV9jbGF1c2UgKCkpDQo+PiArICAgIGV4cGFuZF93aGVy ZV9jbGF1c2UgKHVuaW9uX2l0ZW0uZ2V0X3doZXJlX2NsYXVzZSAoKSk7DQo+PiArDQo+PiAr ICAvKiBzdHJpcCB1bmlvbiBmaWVsZHMgaWYgcmVxdWlyZWQgLSB0aGlzIGlzIHByZXN1bWFi bHkNCj4+ICsgICAqIGFsbG93ZWQgYnkgc3BlYyAqLw0KPj4gKyAgZXhwYW5kX3N0cnVjdF9m aWVsZHMgKHVuaW9uX2l0ZW0uZ2V0X3ZhcmlhbnRzICgpKTsNCj4+ICt9DQo+PiArdm9pZA0K Pj4gK0F0dHJWaXNpdG9yOjp2aXNpdCAoQVNUOjpDb25zdGFudEl0ZW0gJmNvbnN0X2l0ZW0p DQo+PiArew0KPj4gKyAgLy8gaW5pdGlhbCB0ZXN0IGJhc2VkIG9uIG91dGVyIGF0dHJzDQo+ PiArICBleHBhbmRlci5leHBhbmRfY2ZnX2F0dHJzIChjb25zdF9pdGVtLmdldF9vdXRlcl9h dHRycyAoKSk7DQo+PiArICBpZiAoZXhwYW5kZXIuZmFpbHNfY2ZnX3dpdGhfZXhwYW5kIChj b25zdF9pdGVtLmdldF9vdXRlcl9hdHRycyAoKSkpDQo+PiArICAgIHsNCj4+ICsgICAgICBj b25zdF9pdGVtLm1hcmtfZm9yX3N0cmlwICgpOw0KPj4gKyAgICAgIHJldHVybjsNCj4+ICsg ICAgfQ0KPj4gKw0KPj4gKyAgZXhwYW5kZXIucHVzaF9jb250ZXh0IChNYWNyb0V4cGFuZGVy OjpDb250ZXh0VHlwZTo6VFlQRSk7DQo+PiArDQo+PiArICAvLyBzdHJpcCBhbnkgc3ViLXR5 cGVzDQo+PiArICBhdXRvICZ0eXBlID0gY29uc3RfaXRlbS5nZXRfdHlwZSAoKTsNCj4+ICsg IHR5cGUtPmFjY2VwdF92aXMgKCp0aGlzKTsNCj4+ICsNCj4+ICsgIG1heWJlX2V4cGFuZF90 eXBlICh0eXBlKTsNCj4+ICsNCj4+ICsgIGlmICh0eXBlLT5pc19tYXJrZWRfZm9yX3N0cmlw ICgpKQ0KPj4gKyAgICBydXN0X2Vycm9yX2F0ICh0eXBlLT5nZXRfbG9jdXMgKCksICJjYW5u b3Qgc3RyaXAgdHlwZSBpbiB0aGlzIHBvc2l0aW9uIik7DQo+PiArDQo+PiArICBleHBhbmRl ci5wb3BfY29udGV4dCAoKTsNCj4+ICsNCj4+ICsgIC8qIHN0cmlwIGFueSBpbnRlcm5hbCBz dWItZXhwcmVzc2lvbnMgLSBleHByZXNzaW9uIGl0c2VsZiBpc24ndA0KPj4gKyAgICogYWxs b3dlZCB0byBoYXZlIGV4dGVybmFsIGF0dHJpYnV0ZXMgaW4gdGhpcyBwb3NpdGlvbiBzbyBj YW4ndCBiZQ0KPj4gKyAgICogc3RyaXBwZWQuICovDQo+PiArICBhdXRvICZleHByID0gY29u c3RfaXRlbS5nZXRfZXhwciAoKTsNCj4+ICsgIGV4cHItPmFjY2VwdF92aXMgKCp0aGlzKTsN Cj4+ICsgIGlmIChleHByLT5pc19tYXJrZWRfZm9yX3N0cmlwICgpKQ0KPj4gKyAgICBydXN0 X2Vycm9yX2F0IChleHByLT5nZXRfbG9jdXMgKCksDQo+PiArICAgICAgICAgICAgICAgICAg ImNhbm5vdCBzdHJpcCBleHByZXNzaW9uIGluIHRoaXMgcG9zaXRpb24gLSBvdXRlciAiDQo+ PiArICAgICAgICAgICAgICAgICAgImF0dHJpYnV0ZXMgbm90IGFsbG93ZWQiKTsNCj4+ICt9 DQo+PiArdm9pZA0KPj4gK0F0dHJWaXNpdG9yOjp2aXNpdCAoQVNUOjpTdGF0aWNJdGVtICZz dGF0aWNfaXRlbSkNCj4+ICt7DQo+PiArICAvLyBpbml0aWFsIHRlc3QgYmFzZWQgb24gb3V0 ZXIgYXR0cnMNCj4+ICsgIGV4cGFuZGVyLmV4cGFuZF9jZmdfYXR0cnMgKHN0YXRpY19pdGVt LmdldF9vdXRlcl9hdHRycyAoKSk7DQo+PiArICBpZiAoZXhwYW5kZXIuZmFpbHNfY2ZnX3dp dGhfZXhwYW5kIChzdGF0aWNfaXRlbS5nZXRfb3V0ZXJfYXR0cnMgKCkpKQ0KPj4gKyAgICB7 DQo+PiArICAgICAgc3RhdGljX2l0ZW0ubWFya19mb3Jfc3RyaXAgKCk7DQo+PiArICAgICAg cmV0dXJuOw0KPj4gKyAgICB9DQo+PiArDQo+PiArICBleHBhbmRlci5wdXNoX2NvbnRleHQg KE1hY3JvRXhwYW5kZXI6OkNvbnRleHRUeXBlOjpUWVBFKTsNCj4+ICsNCj4+ICsgIC8vIHN0 cmlwIGFueSBzdWItdHlwZXMNCj4+ICsgIGF1dG8gJnR5cGUgPSBzdGF0aWNfaXRlbS5nZXRf dHlwZSAoKTsNCj4+ICsgIHR5cGUtPmFjY2VwdF92aXMgKCp0aGlzKTsNCj4+ICsNCj4+ICsg IG1heWJlX2V4cGFuZF90eXBlICh0eXBlKTsNCj4+ICsNCj4+ICsgIGlmICh0eXBlLT5pc19t YXJrZWRfZm9yX3N0cmlwICgpKQ0KPj4gKyAgICBydXN0X2Vycm9yX2F0ICh0eXBlLT5nZXRf bG9jdXMgKCksICJjYW5ub3Qgc3RyaXAgdHlwZSBpbiB0aGlzIHBvc2l0aW9uIik7DQo+PiAr DQo+PiArICBleHBhbmRlci5wb3BfY29udGV4dCAoKTsNCj4+ICsNCj4+ICsgIC8qIHN0cmlw IGFueSBpbnRlcm5hbCBzdWItZXhwcmVzc2lvbnMgLSBleHByZXNzaW9uIGl0c2VsZiBpc24n dA0KPj4gKyAgICogYWxsb3dlZCB0byBoYXZlIGV4dGVybmFsIGF0dHJpYnV0ZXMgaW4gdGhp cyBwb3NpdGlvbiBzbyBjYW4ndCBiZQ0KPj4gKyAgICogc3RyaXBwZWQuICovDQo+PiArICBh dXRvICZleHByID0gc3RhdGljX2l0ZW0uZ2V0X2V4cHIgKCk7DQo+PiArICBleHByLT5hY2Nl cHRfdmlzICgqdGhpcyk7DQo+PiArICBpZiAoZXhwci0+aXNfbWFya2VkX2Zvcl9zdHJpcCAo KSkNCj4+ICsgICAgcnVzdF9lcnJvcl9hdCAoZXhwci0+Z2V0X2xvY3VzICgpLA0KPj4gKyAg ICAgICAgICAgICAgICAgICJjYW5ub3Qgc3RyaXAgZXhwcmVzc2lvbiBpbiB0aGlzIHBvc2l0 aW9uIC0gb3V0ZXIgIg0KPj4gKyAgICAgICAgICAgICAgICAgICJhdHRyaWJ1dGVzIG5vdCBh bGxvd2VkIik7DQo+PiArfQ0KPj4gK3ZvaWQNCj4+ICtBdHRyVmlzaXRvcjo6dmlzaXQgKEFT VDo6VHJhaXRJdGVtRnVuYyAmaXRlbSkNCj4+ICt7DQo+PiArICAvLyBpbml0aWFsIHRlc3Qg YmFzZWQgb24gb3V0ZXIgYXR0cnMNCj4+ICsgIGV4cGFuZGVyLmV4cGFuZF9jZmdfYXR0cnMg KGl0ZW0uZ2V0X291dGVyX2F0dHJzICgpKTsNCj4+ICsgIGlmIChleHBhbmRlci5mYWlsc19j Zmdfd2l0aF9leHBhbmQgKGl0ZW0uZ2V0X291dGVyX2F0dHJzICgpKSkNCj4+ICsgICAgew0K Pj4gKyAgICAgIGl0ZW0ubWFya19mb3Jfc3RyaXAgKCk7DQo+PiArICAgICAgcmV0dXJuOw0K Pj4gKyAgICB9DQo+PiArDQo+PiArICBleHBhbmRfdHJhaXRfZnVuY3Rpb25fZGVjbCAoaXRl bS5nZXRfdHJhaXRfZnVuY3Rpb25fZGVjbCAoKSk7DQo+PiArDQo+PiArICBpZiAoaXRlbS5o YXNfZGVmaW5pdGlvbiAoKSkNCj4+ICsgICAgew0KPj4gKyAgICAgIC8qIHN0cmlwIGFueSBp bnRlcm5hbCBzdWItZXhwcmVzc2lvbnMgLSBleHByZXNzaW9uIGl0c2VsZiBpc24ndA0KPj4g KyAgICAgICAqIGFsbG93ZWQgdG8gaGF2ZSBleHRlcm5hbCBhdHRyaWJ1dGVzIGluIHRoaXMg cG9zaXRpb24gc28gY2FuJ3QgYmUNCj4+ICsgICAgICAgKiBzdHJpcHBlZC4gKi8NCj4+ICsg ICAgICBhdXRvICZibG9jayA9IGl0ZW0uZ2V0X2RlZmluaXRpb24gKCk7DQo+PiArICAgICAg YmxvY2stPmFjY2VwdF92aXMgKCp0aGlzKTsNCj4+ICsgICAgICBpZiAoYmxvY2stPmlzX21h cmtlZF9mb3Jfc3RyaXAgKCkpDQo+PiArICAgICAgIHJ1c3RfZXJyb3JfYXQgKGJsb2NrLT5n ZXRfbG9jdXMgKCksDQo+PiArICAgICAgICAgICAgICAgICAgICAgICJjYW5ub3Qgc3RyaXAg YmxvY2sgZXhwcmVzc2lvbiBpbiB0aGlzICINCj4+ICsgICAgICAgICAgICAgICAgICAgICAg InBvc2l0aW9uIC0gb3V0ZXIgYXR0cmlidXRlcyBub3QgYWxsb3dlZCIpOw0KPj4gKyAgICB9 DQo+PiArfQ0KPj4gK3ZvaWQNCj4+ICtBdHRyVmlzaXRvcjo6dmlzaXQgKEFTVDo6VHJhaXRJ dGVtTWV0aG9kICZpdGVtKQ0KPj4gK3sNCj4+ICsgIC8vIGluaXRpYWwgdGVzdCBiYXNlZCBv biBvdXRlciBhdHRycw0KPj4gKyAgZXhwYW5kZXIuZXhwYW5kX2NmZ19hdHRycyAoaXRlbS5n ZXRfb3V0ZXJfYXR0cnMgKCkpOw0KPj4gKyAgaWYgKGV4cGFuZGVyLmZhaWxzX2NmZ193aXRo X2V4cGFuZCAoaXRlbS5nZXRfb3V0ZXJfYXR0cnMgKCkpKQ0KPj4gKyAgICB7DQo+PiArICAg ICAgaXRlbS5tYXJrX2Zvcl9zdHJpcCAoKTsNCj4+ICsgICAgICByZXR1cm47DQo+PiArICAg IH0NCj4+ICsNCj4+ICsgIGV4cGFuZF90cmFpdF9tZXRob2RfZGVjbCAoaXRlbS5nZXRfdHJh aXRfbWV0aG9kX2RlY2wgKCkpOw0KPj4gKw0KPj4gKyAgaWYgKGl0ZW0uaGFzX2RlZmluaXRp b24gKCkpDQo+PiArICAgIHsNCj4+ICsgICAgICAvKiBzdHJpcCBhbnkgaW50ZXJuYWwgc3Vi LWV4cHJlc3Npb25zIC0gZXhwcmVzc2lvbiBpdHNlbGYgaXNuJ3QNCj4+ICsgICAgICAgKiBh bGxvd2VkIHRvIGhhdmUgZXh0ZXJuYWwgYXR0cmlidXRlcyBpbiB0aGlzIHBvc2l0aW9uIHNv IGNhbid0IGJlDQo+PiArICAgICAgICogc3RyaXBwZWQuICovDQo+PiArICAgICAgYXV0byAm YmxvY2sgPSBpdGVtLmdldF9kZWZpbml0aW9uICgpOw0KPj4gKyAgICAgIGJsb2NrLT5hY2Nl cHRfdmlzICgqdGhpcyk7DQo+PiArICAgICAgaWYgKGJsb2NrLT5pc19tYXJrZWRfZm9yX3N0 cmlwICgpKQ0KPj4gKyAgICAgICBydXN0X2Vycm9yX2F0IChibG9jay0+Z2V0X2xvY3VzICgp LA0KPj4gKyAgICAgICAgICAgICAgICAgICAgICAiY2Fubm90IHN0cmlwIGJsb2NrIGV4cHJl c3Npb24gaW4gdGhpcyAiDQo+PiArICAgICAgICAgICAgICAgICAgICAgICJwb3NpdGlvbiAt IG91dGVyIGF0dHJpYnV0ZXMgbm90IGFsbG93ZWQiKTsNCj4+ICsgICAgfQ0KPj4gK30NCj4+ ICt2b2lkDQo+PiArQXR0clZpc2l0b3I6OnZpc2l0IChBU1Q6OlRyYWl0SXRlbUNvbnN0ICZp dGVtKQ0KPj4gK3sNCj4+ICsgIC8vIGluaXRpYWwgdGVzdCBiYXNlZCBvbiBvdXRlciBhdHRy cw0KPj4gKyAgZXhwYW5kZXIuZXhwYW5kX2NmZ19hdHRycyAoaXRlbS5nZXRfb3V0ZXJfYXR0 cnMgKCkpOw0KPj4gKyAgaWYgKGV4cGFuZGVyLmZhaWxzX2NmZ193aXRoX2V4cGFuZCAoaXRl bS5nZXRfb3V0ZXJfYXR0cnMgKCkpKQ0KPj4gKyAgICB7DQo+PiArICAgICAgaXRlbS5tYXJr X2Zvcl9zdHJpcCAoKTsNCj4+ICsgICAgICByZXR1cm47DQo+PiArICAgIH0NCj4+ICsNCj4+ ICsgIGV4cGFuZGVyLnB1c2hfY29udGV4dCAoTWFjcm9FeHBhbmRlcjo6Q29udGV4dFR5cGU6 OlRZUEUpOw0KPj4gKw0KPj4gKyAgLy8gc3RyaXAgYW55IHN1Yi10eXBlcw0KPj4gKyAgYXV0 byAmdHlwZSA9IGl0ZW0uZ2V0X3R5cGUgKCk7DQo+PiArICB0eXBlLT5hY2NlcHRfdmlzICgq dGhpcyk7DQo+PiArDQo+PiArICBtYXliZV9leHBhbmRfdHlwZSAodHlwZSk7DQo+PiArDQo+ PiArICBpZiAodHlwZS0+aXNfbWFya2VkX2Zvcl9zdHJpcCAoKSkNCj4+ICsgICAgcnVzdF9l cnJvcl9hdCAodHlwZS0+Z2V0X2xvY3VzICgpLCAiY2Fubm90IHN0cmlwIHR5cGUgaW4gdGhp cyBwb3NpdGlvbiIpOw0KPj4gKw0KPj4gKyAgZXhwYW5kZXIucG9wX2NvbnRleHQgKCk7DQo+ PiArDQo+PiArICAvKiBzdHJpcCBhbnkgaW50ZXJuYWwgc3ViLWV4cHJlc3Npb25zIC0gZXhw cmVzc2lvbiBpdHNlbGYgaXNuJ3QNCj4+ICsgICAqIGFsbG93ZWQgdG8gaGF2ZSBleHRlcm5h bCBhdHRyaWJ1dGVzIGluIHRoaXMgcG9zaXRpb24gc28gY2FuJ3QgYmUNCj4+ICsgICAqIHN0 cmlwcGVkICovDQo+PiArICBpZiAoaXRlbS5oYXNfZXhwcmVzc2lvbiAoKSkNCj4+ICsgICAg ew0KPj4gKyAgICAgIGF1dG8gJmV4cHIgPSBpdGVtLmdldF9leHByICgpOw0KPj4gKyAgICAg IGV4cHItPmFjY2VwdF92aXMgKCp0aGlzKTsNCj4+ICsgICAgICBpZiAoZXhwci0+aXNfbWFy a2VkX2Zvcl9zdHJpcCAoKSkNCj4+ICsgICAgICAgcnVzdF9lcnJvcl9hdCAoZXhwci0+Z2V0 X2xvY3VzICgpLA0KPj4gKyAgICAgICAgICAgICAgICAgICAgICAiY2Fubm90IHN0cmlwIGV4 cHJlc3Npb24gaW4gdGhpcyBwb3NpdGlvbiAtIG91dGVyICINCj4+ICsgICAgICAgICAgICAg ICAgICAgICAgImF0dHJpYnV0ZXMgbm90IGFsbG93ZWQiKTsNCj4+ICsgICAgfQ0KPj4gK30N Cj4+ICt2b2lkDQo+PiArQXR0clZpc2l0b3I6OnZpc2l0IChBU1Q6OlRyYWl0SXRlbVR5cGUg Jml0ZW0pDQo+PiArew0KPj4gKyAgLy8gaW5pdGlhbCB0ZXN0IGJhc2VkIG9uIG91dGVyIGF0 dHJzDQo+PiArICBleHBhbmRlci5leHBhbmRfY2ZnX2F0dHJzIChpdGVtLmdldF9vdXRlcl9h dHRycyAoKSk7DQo+PiArICBpZiAoZXhwYW5kZXIuZmFpbHNfY2ZnX3dpdGhfZXhwYW5kIChp dGVtLmdldF9vdXRlcl9hdHRycyAoKSkpDQo+PiArICAgIHsNCj4+ICsgICAgICBpdGVtLm1h cmtfZm9yX3N0cmlwICgpOw0KPj4gKyAgICAgIHJldHVybjsNCj4+ICsgICAgfQ0KPj4gKw0K Pj4gKyAgaWYgKGl0ZW0uaGFzX3R5cGVfcGFyYW1fYm91bmRzICgpKQ0KPj4gKyAgICB7DQo+ PiArICAgICAgLy8gZG9uJ3Qgc3RyaXAgZGlyZWN0bHksIG9ubHkgY29tcG9uZW50cyBvZiBi b3VuZHMNCj4+ICsgICAgICBmb3IgKGF1dG8gJmJvdW5kIDogaXRlbS5nZXRfdHlwZV9wYXJh bV9ib3VuZHMgKCkpDQo+PiArICAgICAgIGJvdW5kLT5hY2NlcHRfdmlzICgqdGhpcyk7DQo+ PiArICAgIH0NCj4+ICt9DQo+PiArdm9pZA0KPj4gK0F0dHJWaXNpdG9yOjp2aXNpdCAoQVNU OjpUcmFpdCAmdHJhaXQpDQo+PiArew0KPj4gKyAgLy8gaW5pdGlhbCBzdHJpcCB0ZXN0IGJh c2VkIG9uIG91dGVyIGF0dHJzDQo+PiArICBleHBhbmRlci5leHBhbmRfY2ZnX2F0dHJzICh0 cmFpdC5nZXRfb3V0ZXJfYXR0cnMgKCkpOw0KPj4gKyAgaWYgKGV4cGFuZGVyLmZhaWxzX2Nm Z193aXRoX2V4cGFuZCAodHJhaXQuZ2V0X291dGVyX2F0dHJzICgpKSkNCj4+ICsgICAgew0K Pj4gKyAgICAgIHRyYWl0Lm1hcmtfZm9yX3N0cmlwICgpOw0KPj4gKyAgICAgIHJldHVybjsN Cj4+ICsgICAgfQ0KPj4gKw0KPj4gKyAgLy8gc3RyaXAgdGVzdCBiYXNlZCBvbiBpbm5lciBh dHRycw0KPj4gKyAgZXhwYW5kZXIuZXhwYW5kX2NmZ19hdHRycyAodHJhaXQuZ2V0X2lubmVy X2F0dHJzICgpKTsNCj4+ICsgIGlmIChleHBhbmRlci5mYWlsc19jZmdfd2l0aF9leHBhbmQg KHRyYWl0LmdldF9pbm5lcl9hdHRycyAoKSkpDQo+PiArICAgIHsNCj4+ICsgICAgICB0cmFp dC5tYXJrX2Zvcl9zdHJpcCAoKTsNCj4+ICsgICAgICByZXR1cm47DQo+PiArICAgIH0NCj4+ ICsNCj4+ICsgIC8vIGp1c3QgZXhwYW5kIHN1Yi1zdHVmZiAtIGNhbid0IGFjdHVhbGx5IHN0 cmlwIGdlbmVyaWMgcGFyYW1zIHRoZW1zZWx2ZXMNCj4+ICsgIGZvciAoYXV0byAmcGFyYW0g OiB0cmFpdC5nZXRfZ2VuZXJpY19wYXJhbXMgKCkpDQo+PiArICAgIHBhcmFtLT5hY2NlcHRf dmlzICgqdGhpcyk7DQo+PiArDQo+PiArICBpZiAodHJhaXQuaGFzX3R5cGVfcGFyYW1fYm91 bmRzICgpKQ0KPj4gKyAgICB7DQo+PiArICAgICAgLy8gZG9uJ3Qgc3RyaXAgZGlyZWN0bHks IG9ubHkgY29tcG9uZW50cyBvZiBib3VuZHMNCj4+ICsgICAgICBmb3IgKGF1dG8gJmJvdW5k IDogdHJhaXQuZ2V0X3R5cGVfcGFyYW1fYm91bmRzICgpKQ0KPj4gKyAgICAgICBib3VuZC0+ YWNjZXB0X3ZpcyAoKnRoaXMpOw0KPj4gKyAgICB9DQo+PiArDQo+PiArICBpZiAodHJhaXQu aGFzX3doZXJlX2NsYXVzZSAoKSkNCj4+ICsgICAgZXhwYW5kX3doZXJlX2NsYXVzZSAodHJh aXQuZ2V0X3doZXJlX2NsYXVzZSAoKSk7DQo+PiArDQo+PiArICBzdGQ6OmZ1bmN0aW9uPHN0 ZDo6dW5pcXVlX3B0cjxBU1Q6OlRyYWl0SXRlbT4gKEFTVDo6U2luZ2xlQVNUTm9kZSk+IGV4 dHJhY3Rvcg0KPj4gKyAgICA9IFtdIChBU1Q6OlNpbmdsZUFTVE5vZGUgbm9kZSkgeyByZXR1 cm4gbm9kZS50YWtlX3RyYWl0X2l0ZW0gKCk7IH07DQo+PiArDQo+PiArICBleHBhbmRfbWFj cm9fY2hpbGRyZW4gKE1hY3JvRXhwYW5kZXI6OlRSQUlULCB0cmFpdC5nZXRfdHJhaXRfaXRl bXMgKCksDQo+PiArICAgICAgICAgICAgICAgICAgICAgICAgZXh0cmFjdG9yKTsNCj4+ICt9 DQo+PiArdm9pZA0KPj4gK0F0dHJWaXNpdG9yOjp2aXNpdCAoQVNUOjpJbmhlcmVudEltcGwg JmltcGwpDQo+PiArew0KPj4gKyAgLy8gaW5pdGlhbCBzdHJpcCB0ZXN0IGJhc2VkIG9uIG91 dGVyIGF0dHJzDQo+PiArICBleHBhbmRlci5leHBhbmRfY2ZnX2F0dHJzIChpbXBsLmdldF9v dXRlcl9hdHRycyAoKSk7DQo+PiArICBpZiAoZXhwYW5kZXIuZmFpbHNfY2ZnX3dpdGhfZXhw YW5kIChpbXBsLmdldF9vdXRlcl9hdHRycyAoKSkpDQo+PiArICAgIHsNCj4+ICsgICAgICBp bXBsLm1hcmtfZm9yX3N0cmlwICgpOw0KPj4gKyAgICAgIHJldHVybjsNCj4+ICsgICAgfQ0K Pj4gKw0KPj4gKyAgLy8gc3RyaXAgdGVzdCBiYXNlZCBvbiBpbm5lciBhdHRycw0KPj4gKyAg ZXhwYW5kZXIuZXhwYW5kX2NmZ19hdHRycyAoaW1wbC5nZXRfaW5uZXJfYXR0cnMgKCkpOw0K Pj4gKyAgaWYgKGV4cGFuZGVyLmZhaWxzX2NmZ193aXRoX2V4cGFuZCAoaW1wbC5nZXRfaW5u ZXJfYXR0cnMgKCkpKQ0KPj4gKyAgICB7DQo+PiArICAgICAgaW1wbC5tYXJrX2Zvcl9zdHJp cCAoKTsNCj4+ICsgICAgICByZXR1cm47DQo+PiArICAgIH0NCj4+ICsNCj4+ICsgIC8vIGp1 c3QgZXhwYW5kIHN1Yi1zdHVmZiAtIGNhbid0IGFjdHVhbGx5IHN0cmlwIGdlbmVyaWMgcGFy YW1zIHRoZW1zZWx2ZXMNCj4+ICsgIGZvciAoYXV0byAmcGFyYW0gOiBpbXBsLmdldF9nZW5l cmljX3BhcmFtcyAoKSkNCj4+ICsgICAgcGFyYW0tPmFjY2VwdF92aXMgKCp0aGlzKTsNCj4+ ICsNCj4+ICsgIGV4cGFuZGVyLnB1c2hfY29udGV4dCAoTWFjcm9FeHBhbmRlcjo6Q29udGV4 dFR5cGU6OlRZUEUpOw0KPj4gKw0KPj4gKyAgYXV0byAmdHlwZSA9IGltcGwuZ2V0X3R5cGUg KCk7DQo+PiArICB0eXBlLT5hY2NlcHRfdmlzICgqdGhpcyk7DQo+PiArDQo+PiArICBtYXli ZV9leHBhbmRfdHlwZSAodHlwZSk7DQo+PiArDQo+PiArICBpZiAodHlwZS0+aXNfbWFya2Vk X2Zvcl9zdHJpcCAoKSkNCj4+ICsgICAgcnVzdF9lcnJvcl9hdCAodHlwZS0+Z2V0X2xvY3Vz ICgpLCAiY2Fubm90IHN0cmlwIHR5cGUgaW4gdGhpcyBwb3NpdGlvbiIpOw0KPj4gKw0KPj4g KyAgZXhwYW5kZXIucG9wX2NvbnRleHQgKCk7DQo+PiArDQo+PiArICBpZiAoaW1wbC5oYXNf d2hlcmVfY2xhdXNlICgpKQ0KPj4gKyAgICBleHBhbmRfd2hlcmVfY2xhdXNlIChpbXBsLmdl dF93aGVyZV9jbGF1c2UgKCkpOw0KPj4gKw0KPj4gKyAgc3RkOjpmdW5jdGlvbjxzdGQ6OnVu aXF1ZV9wdHI8QVNUOjpJbmhlcmVudEltcGxJdGVtPiAoQVNUOjpTaW5nbGVBU1ROb2RlKT4N Cj4+ICsgICAgZXh0cmFjdG9yID0gW10gKEFTVDo6U2luZ2xlQVNUTm9kZSBub2RlKSB7IHJl dHVybiBub2RlLnRha2VfaW1wbF9pdGVtICgpOyB9Ow0KPj4gKw0KPj4gKyAgZXhwYW5kX21h Y3JvX2NoaWxkcmVuIChNYWNyb0V4cGFuZGVyOjpJTVBMLCBpbXBsLmdldF9pbXBsX2l0ZW1z ICgpLA0KPj4gKyAgICAgICAgICAgICAgICAgICAgICAgIGV4dHJhY3Rvcik7DQo+PiArfQ0K Pj4gK3ZvaWQNCj4+ICtBdHRyVmlzaXRvcjo6dmlzaXQgKEFTVDo6VHJhaXRJbXBsICZpbXBs KQ0KPj4gK3sNCj4+ICsgIC8vIGluaXRpYWwgc3RyaXAgdGVzdCBiYXNlZCBvbiBvdXRlciBh dHRycw0KPj4gKyAgZXhwYW5kZXIuZXhwYW5kX2NmZ19hdHRycyAoaW1wbC5nZXRfb3V0ZXJf YXR0cnMgKCkpOw0KPj4gKyAgaWYgKGV4cGFuZGVyLmZhaWxzX2NmZ193aXRoX2V4cGFuZCAo aW1wbC5nZXRfb3V0ZXJfYXR0cnMgKCkpKQ0KPj4gKyAgICB7DQo+PiArICAgICAgaW1wbC5t YXJrX2Zvcl9zdHJpcCAoKTsNCj4+ICsgICAgICByZXR1cm47DQo+PiArICAgIH0NCj4+ICsN Cj4+ICsgIC8vIHN0cmlwIHRlc3QgYmFzZWQgb24gaW5uZXIgYXR0cnMNCj4+ICsgIGV4cGFu ZGVyLmV4cGFuZF9jZmdfYXR0cnMgKGltcGwuZ2V0X2lubmVyX2F0dHJzICgpKTsNCj4+ICsg IGlmIChleHBhbmRlci5mYWlsc19jZmdfd2l0aF9leHBhbmQgKGltcGwuZ2V0X2lubmVyX2F0 dHJzICgpKSkNCj4+ICsgICAgew0KPj4gKyAgICAgIGltcGwubWFya19mb3Jfc3RyaXAgKCk7 DQo+PiArICAgICAgcmV0dXJuOw0KPj4gKyAgICB9DQo+PiArDQo+PiArICAvLyBqdXN0IGV4 cGFuZCBzdWItc3R1ZmYgLSBjYW4ndCBhY3R1YWxseSBzdHJpcCBnZW5lcmljIHBhcmFtcyB0 aGVtc2VsdmVzDQo+PiArICBmb3IgKGF1dG8gJnBhcmFtIDogaW1wbC5nZXRfZ2VuZXJpY19w YXJhbXMgKCkpDQo+PiArICAgIHBhcmFtLT5hY2NlcHRfdmlzICgqdGhpcyk7DQo+PiArDQo+ PiArICBleHBhbmRlci5wdXNoX2NvbnRleHQgKE1hY3JvRXhwYW5kZXI6OkNvbnRleHRUeXBl OjpUWVBFKTsNCj4+ICsNCj4+ICsgIGF1dG8gJnR5cGUgPSBpbXBsLmdldF90eXBlICgpOw0K Pj4gKyAgdHlwZS0+YWNjZXB0X3ZpcyAoKnRoaXMpOw0KPj4gKw0KPj4gKyAgbWF5YmVfZXhw YW5kX3R5cGUgKHR5cGUpOw0KPj4gKw0KPj4gKyAgaWYgKHR5cGUtPmlzX21hcmtlZF9mb3Jf c3RyaXAgKCkpDQo+PiArICAgIHJ1c3RfZXJyb3JfYXQgKHR5cGUtPmdldF9sb2N1cyAoKSwg ImNhbm5vdCBzdHJpcCB0eXBlIGluIHRoaXMgcG9zaXRpb24iKTsNCj4+ICsNCj4+ICsgIGV4 cGFuZGVyLnBvcF9jb250ZXh0ICgpOw0KPj4gKw0KPj4gKyAgYXV0byAmdHJhaXRfcGF0aCA9 IGltcGwuZ2V0X3RyYWl0X3BhdGggKCk7DQo+PiArICB2aXNpdCAodHJhaXRfcGF0aCk7DQo+ PiArICBpZiAodHJhaXRfcGF0aC5pc19tYXJrZWRfZm9yX3N0cmlwICgpKQ0KPj4gKyAgICBy dXN0X2Vycm9yX2F0ICh0cmFpdF9wYXRoLmdldF9sb2N1cyAoKSwNCj4+ICsgICAgICAgICAg ICAgICAgICAiY2Fubm90IHN0cmlwIHR5cGVwYXRoIGluIHRoaXMgcG9zaXRpb24iKTsNCj4+ ICsNCj4+ICsgIGlmIChpbXBsLmhhc193aGVyZV9jbGF1c2UgKCkpDQo+PiArICAgIGV4cGFu ZF93aGVyZV9jbGF1c2UgKGltcGwuZ2V0X3doZXJlX2NsYXVzZSAoKSk7DQo+PiArDQo+PiAr ICBzdGQ6OmZ1bmN0aW9uPHN0ZDo6dW5pcXVlX3B0cjxBU1Q6OlRyYWl0SW1wbEl0ZW0+IChB U1Q6OlNpbmdsZUFTVE5vZGUpPg0KPj4gKyAgICBleHRyYWN0b3INCj4+ICsgICAgPSBbXSAo QVNUOjpTaW5nbGVBU1ROb2RlIG5vZGUpIHsgcmV0dXJuIG5vZGUudGFrZV90cmFpdF9pbXBs X2l0ZW0gKCk7IH07DQo+PiArDQo+PiArICBleHBhbmRfbWFjcm9fY2hpbGRyZW4gKE1hY3Jv RXhwYW5kZXI6OlRSQUlUX0lNUEwsIGltcGwuZ2V0X2ltcGxfaXRlbXMgKCksDQo+PiArICAg ICAgICAgICAgICAgICAgICAgICAgZXh0cmFjdG9yKTsNCj4+ICt9DQo+PiArdm9pZA0KPj4g K0F0dHJWaXNpdG9yOjp2aXNpdCAoQVNUOjpFeHRlcm5hbFN0YXRpY0l0ZW0gJml0ZW0pDQo+ PiArew0KPj4gKyAgLy8gc3RyaXAgdGVzdCBiYXNlZCBvbiBvdXRlciBhdHRycw0KPj4gKyAg ZXhwYW5kZXIuZXhwYW5kX2NmZ19hdHRycyAoaXRlbS5nZXRfb3V0ZXJfYXR0cnMgKCkpOw0K Pj4gKyAgaWYgKGV4cGFuZGVyLmZhaWxzX2NmZ193aXRoX2V4cGFuZCAoaXRlbS5nZXRfb3V0 ZXJfYXR0cnMgKCkpKQ0KPj4gKyAgICB7DQo+PiArICAgICAgaXRlbS5tYXJrX2Zvcl9zdHJp cCAoKTsNCj4+ICsgICAgICByZXR1cm47DQo+PiArICAgIH0NCj4+ICsNCj4+ICsgIGV4cGFu ZGVyLnB1c2hfY29udGV4dCAoTWFjcm9FeHBhbmRlcjo6Q29udGV4dFR5cGU6OlRZUEUpOw0K Pj4gKw0KPj4gKyAgYXV0byAmdHlwZSA9IGl0ZW0uZ2V0X3R5cGUgKCk7DQo+PiArICB0eXBl LT5hY2NlcHRfdmlzICgqdGhpcyk7DQo+PiArDQo+PiArICBtYXliZV9leHBhbmRfdHlwZSAo dHlwZSk7DQo+PiArDQo+PiArICBpZiAodHlwZS0+aXNfbWFya2VkX2Zvcl9zdHJpcCAoKSkN Cj4+ICsgICAgcnVzdF9lcnJvcl9hdCAodHlwZS0+Z2V0X2xvY3VzICgpLCAiY2Fubm90IHN0 cmlwIHR5cGUgaW4gdGhpcyBwb3NpdGlvbiIpOw0KPj4gKw0KPj4gKyAgZXhwYW5kZXIucG9w X2NvbnRleHQgKCk7DQo+PiArfQ0KPj4gK3ZvaWQNCj4+ICtBdHRyVmlzaXRvcjo6dmlzaXQg KEFTVDo6RXh0ZXJuYWxGdW5jdGlvbkl0ZW0gJml0ZW0pDQo+PiArew0KPj4gKyAgLy8gc3Ry aXAgdGVzdCBiYXNlZCBvbiBvdXRlciBhdHRycw0KPj4gKyAgZXhwYW5kZXIuZXhwYW5kX2Nm Z19hdHRycyAoaXRlbS5nZXRfb3V0ZXJfYXR0cnMgKCkpOw0KPj4gKyAgaWYgKGV4cGFuZGVy LmZhaWxzX2NmZ193aXRoX2V4cGFuZCAoaXRlbS5nZXRfb3V0ZXJfYXR0cnMgKCkpKQ0KPj4g KyAgICB7DQo+PiArICAgICAgaXRlbS5tYXJrX2Zvcl9zdHJpcCAoKTsNCj4+ICsgICAgICBy ZXR1cm47DQo+PiArICAgIH0NCj4+ICsNCj4+ICsgIC8vIGp1c3QgZXhwYW5kIHN1Yi1zdHVm ZiAtIGNhbid0IGFjdHVhbGx5IHN0cmlwIGdlbmVyaWMgcGFyYW1zIHRoZW1zZWx2ZXMNCj4+ ICsgIGZvciAoYXV0byAmcGFyYW0gOiBpdGVtLmdldF9nZW5lcmljX3BhcmFtcyAoKSkNCj4+ ICsgICAgcGFyYW0tPmFjY2VwdF92aXMgKCp0aGlzKTsNCj4+ICsNCj4+ICsgIC8qIHN0cmlw IGZ1bmN0aW9uIHBhcmFtZXRlcnMgaWYgcmVxdWlyZWQgLSB0aGlzIGlzIHNwZWNpZmljYWxs eQ0KPj4gKyAgICogYWxsb3dlZCBieSBzcGVjICovDQo+PiArICBhdXRvICZwYXJhbXMgPSBp dGVtLmdldF9mdW5jdGlvbl9wYXJhbXMgKCk7DQo+PiArICBmb3IgKGF1dG8gaXQgPSBwYXJh bXMuYmVnaW4gKCk7IGl0ICE9IHBhcmFtcy5lbmQgKCk7KQ0KPj4gKyAgICB7DQo+PiArICAg ICAgYXV0byAmcGFyYW0gPSAqaXQ7DQo+PiArDQo+PiArICAgICAgYXV0byAmcGFyYW1fYXR0 cnMgPSBwYXJhbS5nZXRfb3V0ZXJfYXR0cnMgKCk7DQo+PiArICAgICAgZXhwYW5kZXIuZXhw YW5kX2NmZ19hdHRycyAocGFyYW1fYXR0cnMpOw0KPj4gKyAgICAgIGlmIChleHBhbmRlci5m YWlsc19jZmdfd2l0aF9leHBhbmQgKHBhcmFtX2F0dHJzKSkNCj4+ICsgICAgICAgew0KPj4g KyAgICAgICAgIGl0ID0gcGFyYW1zLmVyYXNlIChpdCk7DQo+PiArICAgICAgICAgY29udGlu dWU7DQo+PiArICAgICAgIH0NCj4+ICsNCj4+ICsgICAgICBleHBhbmRlci5wdXNoX2NvbnRl eHQgKE1hY3JvRXhwYW5kZXI6OkNvbnRleHRUeXBlOjpUWVBFKTsNCj4+ICsNCj4+ICsgICAg ICBhdXRvICZ0eXBlID0gcGFyYW0uZ2V0X3R5cGUgKCk7DQo+PiArICAgICAgdHlwZS0+YWNj ZXB0X3ZpcyAoKnRoaXMpOw0KPj4gKw0KPj4gKyAgICAgIG1heWJlX2V4cGFuZF90eXBlICh0 eXBlKTsNCj4+ICsNCj4+ICsgICAgICBpZiAodHlwZS0+aXNfbWFya2VkX2Zvcl9zdHJpcCAo KSkNCj4+ICsgICAgICAgcnVzdF9lcnJvcl9hdCAodHlwZS0+Z2V0X2xvY3VzICgpLA0KPj4g KyAgICAgICAgICAgICAgICAgICAgICAiY2Fubm90IHN0cmlwIHR5cGUgaW4gdGhpcyBwb3Np dGlvbiIpOw0KPj4gKw0KPj4gKyAgICAgIGV4cGFuZGVyLnBvcF9jb250ZXh0ICgpOw0KPj4g Kw0KPj4gKyAgICAgIC8vIGluY3JlbWVudCBpZiBub3RoaW5nIGVsc2UgaGFwcGVucw0KPj4g KyAgICAgICsraXQ7DQo+PiArICAgIH0NCj4+ICsgIC8qIE5PVEU6IHRoZXNlIGFyZSBleHRl cm4gZnVuY3Rpb24gcGFyYW1zLCB3aGljaCBtYXkgaGF2ZSBkaWZmZXJlbnQNCj4+ICsgICAq IHJ1bGVzIGFuZCByZXN0cmljdGlvbnMgdG8gIm5vcm1hbCIgZnVuY3Rpb24gcGFyYW1zLiBT byBleHBhbnNpb24NCj4+ICsgICAqIGhhbmRsZWQgc2VwYXJhdGVseS4gKi8NCj4+ICsNCj4+ ICsgIC8qIFRPRE86IGFzc3VtaW5nIHRoYXQgdmFyaWFkaWMgbmF0dXJlIGNhbm5vdCBiZSBz dHJpcHBlZC4gSWYgdGhpcw0KPj4gKyAgICogaXMgbm90IHRydWUsIHRoZW4gaGF2ZSBjb2Rl IGhlcmUgdG8gZG8gc28uICovDQo+PiArDQo+PiArICBpZiAoaXRlbS5oYXNfcmV0dXJuX3R5 cGUgKCkpDQo+PiArICAgIHsNCj4+ICsgICAgICBleHBhbmRlci5wdXNoX2NvbnRleHQgKE1h Y3JvRXhwYW5kZXI6OkNvbnRleHRUeXBlOjpUWVBFKTsNCj4+ICsNCj4+ICsgICAgICBhdXRv ICZyZXR1cm5fdHlwZSA9IGl0ZW0uZ2V0X3JldHVybl90eXBlICgpOw0KPj4gKyAgICAgIHJl dHVybl90eXBlLT5hY2NlcHRfdmlzICgqdGhpcyk7DQo+PiArDQo+PiArICAgICAgbWF5YmVf ZXhwYW5kX3R5cGUgKHJldHVybl90eXBlKTsNCj4+ICsNCj4+ICsgICAgICBpZiAocmV0dXJu X3R5cGUtPmlzX21hcmtlZF9mb3Jfc3RyaXAgKCkpDQo+PiArICAgICAgIHJ1c3RfZXJyb3Jf YXQgKHJldHVybl90eXBlLT5nZXRfbG9jdXMgKCksDQo+PiArICAgICAgICAgICAgICAgICAg ICAgICJjYW5ub3Qgc3RyaXAgdHlwZSBpbiB0aGlzIHBvc2l0aW9uIik7DQo+PiArDQo+PiAr ICAgICAgZXhwYW5kZXIucG9wX2NvbnRleHQgKCk7DQo+PiArICAgIH0NCj4+ICsNCj4+ICsg IGlmIChpdGVtLmhhc193aGVyZV9jbGF1c2UgKCkpDQo+PiArICAgIGV4cGFuZF93aGVyZV9j bGF1c2UgKGl0ZW0uZ2V0X3doZXJlX2NsYXVzZSAoKSk7DQo+PiArfQ0KPj4gKw0KPj4gK3Zv aWQNCj4+ICtBdHRyVmlzaXRvcjo6dmlzaXQgKEFTVDo6RXh0ZXJuQmxvY2sgJmJsb2NrKQ0K Pj4gK3sNCj4+ICsgIC8vIGluaXRpYWwgc3RyaXAgdGVzdCBiYXNlZCBvbiBvdXRlciBhdHRy cw0KPj4gKyAgZXhwYW5kZXIuZXhwYW5kX2NmZ19hdHRycyAoYmxvY2suZ2V0X291dGVyX2F0 dHJzICgpKTsNCj4+ICsgIGlmIChleHBhbmRlci5mYWlsc19jZmdfd2l0aF9leHBhbmQgKGJs b2NrLmdldF9vdXRlcl9hdHRycyAoKSkpDQo+PiArICAgIHsNCj4+ICsgICAgICBibG9jay5t YXJrX2Zvcl9zdHJpcCAoKTsNCj4+ICsgICAgICByZXR1cm47DQo+PiArICAgIH0NCj4+ICsN Cj4+ICsgIC8vIHN0cmlwIHRlc3QgYmFzZWQgb24gaW5uZXIgYXR0cnMNCj4+ICsgIGV4cGFu ZGVyLmV4cGFuZF9jZmdfYXR0cnMgKGJsb2NrLmdldF9pbm5lcl9hdHRycyAoKSk7DQo+PiAr ICBpZiAoZXhwYW5kZXIuZmFpbHNfY2ZnX3dpdGhfZXhwYW5kIChibG9jay5nZXRfaW5uZXJf YXR0cnMgKCkpKQ0KPj4gKyAgICB7DQo+PiArICAgICAgYmxvY2subWFya19mb3Jfc3RyaXAg KCk7DQo+PiArICAgICAgcmV0dXJuOw0KPj4gKyAgICB9DQo+PiArDQo+PiArICBzdGQ6OmZ1 bmN0aW9uPHN0ZDo6dW5pcXVlX3B0cjxBU1Q6OkV4dGVybmFsSXRlbT4gKEFTVDo6U2luZ2xl QVNUTm9kZSk+DQo+PiArICAgIGV4dHJhY3Rvcg0KPj4gKyAgICA9IFtdIChBU1Q6OlNpbmds ZUFTVE5vZGUgbm9kZSkgeyByZXR1cm4gbm9kZS50YWtlX2V4dGVybmFsX2l0ZW0gKCk7IH07 DQo+PiArDQo+PiArICBleHBhbmRfbWFjcm9fY2hpbGRyZW4gKE1hY3JvRXhwYW5kZXI6OkVY VEVSTiwgYmxvY2suZ2V0X2V4dGVybl9pdGVtcyAoKSwNCj4+ICsgICAgICAgICAgICAgICAg ICAgICAgICBleHRyYWN0b3IpOw0KPj4gK30NCj4+ICsNCj4+ICsvLyBJIGRvbid0IHRoaW5r IGl0IHdvdWxkIGJlIHBvc3NpYmxlIHRvIHN0cmlwIG1hY3JvcyB3aXRob3V0IGV4cGFuc2lv bg0KPj4gK3ZvaWQNCj4+ICtBdHRyVmlzaXRvcjo6dmlzaXQgKEFTVDo6TWFjcm9NYXRjaEZy YWdtZW50ICYpDQo+PiAre30NCj4+ICt2b2lkDQo+PiArQXR0clZpc2l0b3I6OnZpc2l0IChB U1Q6Ok1hY3JvTWF0Y2hSZXBldGl0aW9uICYpDQo+PiAre30NCj4+ICt2b2lkDQo+PiArQXR0 clZpc2l0b3I6OnZpc2l0IChBU1Q6Ok1hY3JvTWF0Y2hlciAmKQ0KPj4gK3t9DQo+PiArdm9p ZA0KPj4gK0F0dHJWaXNpdG9yOjp2aXNpdCAoQVNUOjpNYWNyb1J1bGVzRGVmaW5pdGlvbiAm cnVsZXNfZGVmKQ0KPj4gK3sNCj4+ICsgIC8vIGluaXRpYWwgc3RyaXAgdGVzdCBiYXNlZCBv biBvdXRlciBhdHRycw0KPj4gKyAgZXhwYW5kZXIuZXhwYW5kX2NmZ19hdHRycyAocnVsZXNf ZGVmLmdldF9vdXRlcl9hdHRycyAoKSk7DQo+PiArICBpZiAoZXhwYW5kZXIuZmFpbHNfY2Zn X3dpdGhfZXhwYW5kIChydWxlc19kZWYuZ2V0X291dGVyX2F0dHJzICgpKSkNCj4+ICsgICAg ew0KPj4gKyAgICAgIHJ1bGVzX2RlZi5tYXJrX2Zvcl9zdHJpcCAoKTsNCj4+ICsgICAgICBy ZXR1cm47DQo+PiArICAgIH0NCj4+ICsNCj4+ICsgIC8vIEkgZG9uJ3QgdGhpbmsgYW55IG1h Y3JvIHJ1bGVzIGNhbiBiZSBzdHJpcHBlZCBpbiBhbnkgd2F5DQo+PiArDQo+PiArICBhdXRv IHBhdGggPSBSZXNvbHZlcjo6Q2Fub25pY2FsUGF0aDo6bmV3X3NlZyAocnVsZXNfZGVmLmdl dF9ub2RlX2lkICgpLA0KPj4gKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgcnVsZXNfZGVmLmdldF9ydWxlX25hbWUgKCkpOw0KPj4gKyAgZXhwYW5k ZXIucmVzb2x2ZXItPmdldF9tYWNyb19zY29wZSAoKS5pbnNlcnQgKHBhdGgsIHJ1bGVzX2Rl Zi5nZXRfbm9kZV9pZCAoKSwNCj4+ICsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgIHJ1bGVzX2RlZi5nZXRfbG9jdXMgKCkpOw0KPj4gKyAgZXhwYW5k ZXIubWFwcGluZ3MtPmluc2VydF9tYWNyb19kZWYgKCZydWxlc19kZWYpOw0KPj4gKyAgcnVz dF9kZWJ1Z19sb2MgKHJ1bGVzX2RlZi5nZXRfbG9jdXMgKCksICJpbnNlcnRpbmcgbWFjcm8g ZGVmOiBbJXNdIiwNCj4+ICsgICAgICAgICAgICAgICAgIHBhdGguZ2V0ICgpLmNfc3RyICgp KTsNCj4+ICt9DQo+PiArDQo+PiArdm9pZA0KPj4gK0F0dHJWaXNpdG9yOjp2aXNpdCAoQVNU OjpNZXRhSXRlbVBhdGggJikNCj4+ICt7fQ0KPj4gK3ZvaWQNCj4+ICtBdHRyVmlzaXRvcjo6 dmlzaXQgKEFTVDo6TWV0YUl0ZW1TZXEgJikNCj4+ICt7fQ0KPj4gK3ZvaWQNCj4+ICtBdHRy VmlzaXRvcjo6dmlzaXQgKEFTVDo6TWV0YVdvcmQgJikNCj4+ICt7fQ0KPj4gK3ZvaWQNCj4+ ICtBdHRyVmlzaXRvcjo6dmlzaXQgKEFTVDo6TWV0YU5hbWVWYWx1ZVN0ciAmKQ0KPj4gK3t9 DQo+PiArdm9pZA0KPj4gK0F0dHJWaXNpdG9yOjp2aXNpdCAoQVNUOjpNZXRhTGlzdFBhdGhz ICYpDQo+PiAre30NCj4+ICt2b2lkDQo+PiArQXR0clZpc2l0b3I6OnZpc2l0IChBU1Q6Ok1l dGFMaXN0TmFtZVZhbHVlU3RyICYpDQo+PiAre30NCj4+ICsNCj4+ICt2b2lkDQo+PiArQXR0 clZpc2l0b3I6OnZpc2l0IChBU1Q6OkxpdGVyYWxQYXR0ZXJuICYpDQo+PiArew0KPj4gKyAg Ly8gbm90IHBvc3NpYmxlDQo+PiArfQ0KPj4gK3ZvaWQNCj4+ICtBdHRyVmlzaXRvcjo6dmlz aXQgKEFTVDo6SWRlbnRpZmllclBhdHRlcm4gJnBhdHRlcm4pDQo+PiArew0KPj4gKyAgLy8g Y2FuIG9ubHkgc3RyaXAgc3ViLXBhdHRlcm5zIG9mIHRoZSBpbm5lciBwYXR0ZXJuIHRvIGJp bmQNCj4+ICsgIGlmICghcGF0dGVybi5oYXNfcGF0dGVybl90b19iaW5kICgpKQ0KPj4gKyAg ICByZXR1cm47DQo+PiArDQo+PiArICBhdXRvICZzdWJfcGF0dGVybiA9IHBhdHRlcm4uZ2V0 X3BhdHRlcm5fdG9fYmluZCAoKTsNCj4+ICsgIHN1Yl9wYXR0ZXJuLT5hY2NlcHRfdmlzICgq dGhpcyk7DQo+PiArICBpZiAoc3ViX3BhdHRlcm4tPmlzX21hcmtlZF9mb3Jfc3RyaXAgKCkp DQo+PiArICAgIHJ1c3RfZXJyb3JfYXQgKHN1Yl9wYXR0ZXJuLT5nZXRfbG9jdXMgKCksDQo+ PiArICAgICAgICAgICAgICAgICAgImNhbm5vdCBzdHJpcCBwYXR0ZXJuIGluIHRoaXMgcG9z aXRpb24iKTsNCj4+ICt9DQo+PiArdm9pZA0KPj4gK0F0dHJWaXNpdG9yOjp2aXNpdCAoQVNU OjpXaWxkY2FyZFBhdHRlcm4gJikNCj4+ICt7DQo+PiArICAvLyBub3QgcG9zc2libGUNCj4+ ICt9DQo+PiArdm9pZA0KPj4gK0F0dHJWaXNpdG9yOjp2aXNpdCAoQVNUOjpSYW5nZVBhdHRl cm5Cb3VuZExpdGVyYWwgJikNCj4+ICt7DQo+PiArICAvLyBub3QgcG9zc2libGUNCj4+ICt9 DQo+PiArdm9pZA0KPj4gK0F0dHJWaXNpdG9yOjp2aXNpdCAoQVNUOjpSYW5nZVBhdHRlcm5C b3VuZFBhdGggJmJvdW5kKQ0KPj4gK3sNCj4+ICsgIC8vIGNhbiBleHBhbmQgcGF0aCwgYnV0 IG5vdCBzdHJpcCBpdCBkaXJlY3RseQ0KPj4gKyAgYXV0byAmcGF0aCA9IGJvdW5kLmdldF9w YXRoICgpOw0KPj4gKyAgdmlzaXQgKHBhdGgpOw0KPj4gKyAgaWYgKHBhdGguaXNfbWFya2Vk X2Zvcl9zdHJpcCAoKSkNCj4+ICsgICAgcnVzdF9lcnJvcl9hdCAocGF0aC5nZXRfbG9jdXMg KCksICJjYW5ub3Qgc3RyaXAgcGF0aCBpbiB0aGlzIHBvc2l0aW9uIik7DQo+PiArfQ0KPj4g K3ZvaWQNCj4+ICtBdHRyVmlzaXRvcjo6dmlzaXQgKEFTVDo6UmFuZ2VQYXR0ZXJuQm91bmRR dWFsUGF0aCAmYm91bmQpDQo+PiArew0KPj4gKyAgLy8gY2FuIGV4cGFuZCBwYXRoLCBidXQg bm90IHN0cmlwIGl0IGRpcmVjdGx5DQo+PiArICBhdXRvICZwYXRoID0gYm91bmQuZ2V0X3F1 YWxpZmllZF9wYXRoICgpOw0KPj4gKyAgdmlzaXQgKHBhdGgpOw0KPj4gKyAgaWYgKHBhdGgu aXNfbWFya2VkX2Zvcl9zdHJpcCAoKSkNCj4+ICsgICAgcnVzdF9lcnJvcl9hdCAocGF0aC5n ZXRfbG9jdXMgKCksICJjYW5ub3Qgc3RyaXAgcGF0aCBpbiB0aGlzIHBvc2l0aW9uIik7DQo+ PiArfQ0KPj4gK3ZvaWQNCj4+ICtBdHRyVmlzaXRvcjo6dmlzaXQgKEFTVDo6UmFuZ2VQYXR0 ZXJuICZwYXR0ZXJuKQ0KPj4gK3sNCj4+ICsgIC8vIHNob3VsZCBoYXZlIG5vIGNhcGFiaWxp dHkgdG8gc3RyaXAgbG93ZXIgb3IgdXBwZXIgYm91bmRzLCBvbmx5IGV4cGFuZA0KPj4gKyAg cGF0dGVybi5nZXRfbG93ZXJfYm91bmQgKCktPmFjY2VwdF92aXMgKCp0aGlzKTsNCj4+ICsg IHBhdHRlcm4uZ2V0X3VwcGVyX2JvdW5kICgpLT5hY2NlcHRfdmlzICgqdGhpcyk7DQo+PiAr fQ0KPj4gK3ZvaWQNCj4+ICtBdHRyVmlzaXRvcjo6dmlzaXQgKEFTVDo6UmVmZXJlbmNlUGF0 dGVybiAmcGF0dGVybikNCj4+ICt7DQo+PiArICBhdXRvICZzdWJfcGF0dGVybiA9IHBhdHRl cm4uZ2V0X3JlZmVyZW5jZWRfcGF0dGVybiAoKTsNCj4+ICsgIHN1Yl9wYXR0ZXJuLT5hY2Nl cHRfdmlzICgqdGhpcyk7DQo+PiArICBpZiAoc3ViX3BhdHRlcm4tPmlzX21hcmtlZF9mb3Jf c3RyaXAgKCkpDQo+PiArICAgIHJ1c3RfZXJyb3JfYXQgKHN1Yl9wYXR0ZXJuLT5nZXRfbG9j dXMgKCksDQo+PiArICAgICAgICAgICAgICAgICAgImNhbm5vdCBzdHJpcCBwYXR0ZXJuIGlu IHRoaXMgcG9zaXRpb24iKTsNCj4+ICt9DQo+PiArdm9pZA0KPj4gK0F0dHJWaXNpdG9yOjp2 aXNpdCAoQVNUOjpTdHJ1Y3RQYXR0ZXJuRmllbGRUdXBsZVBhdCAmZmllbGQpDQo+PiArew0K Pj4gKyAgLy8gaW5pdGlhbCBzdHJpcCB0ZXN0IGJhc2VkIG9uIG91dGVyIGF0dHJzDQo+PiAr ICBleHBhbmRlci5leHBhbmRfY2ZnX2F0dHJzIChmaWVsZC5nZXRfb3V0ZXJfYXR0cnMgKCkp Ow0KPj4gKyAgaWYgKGV4cGFuZGVyLmZhaWxzX2NmZ193aXRoX2V4cGFuZCAoZmllbGQuZ2V0 X291dGVyX2F0dHJzICgpKSkNCj4+ICsgICAgew0KPj4gKyAgICAgIGZpZWxkLm1hcmtfZm9y X3N0cmlwICgpOw0KPj4gKyAgICAgIHJldHVybjsNCj4+ICsgICAgfQ0KPj4gKw0KPj4gKyAg Ly8gc3RyaXAgc3ViLXBhdHRlcm5zIChjYW4ndCBzdHJpcCB0b3AtbGV2ZWwgcGF0dGVybikN Cj4+ICsgIGF1dG8gJnN1Yl9wYXR0ZXJuID0gZmllbGQuZ2V0X2luZGV4X3BhdHRlcm4gKCk7 DQo+PiArICBzdWJfcGF0dGVybi0+YWNjZXB0X3ZpcyAoKnRoaXMpOw0KPj4gKyAgaWYgKHN1 Yl9wYXR0ZXJuLT5pc19tYXJrZWRfZm9yX3N0cmlwICgpKQ0KPj4gKyAgICBydXN0X2Vycm9y X2F0IChzdWJfcGF0dGVybi0+Z2V0X2xvY3VzICgpLA0KPj4gKyAgICAgICAgICAgICAgICAg ICJjYW5ub3Qgc3RyaXAgcGF0dGVybiBpbiB0aGlzIHBvc2l0aW9uIik7DQo+PiArfQ0KPj4g K3ZvaWQNCj4+ICtBdHRyVmlzaXRvcjo6dmlzaXQgKEFTVDo6U3RydWN0UGF0dGVybkZpZWxk SWRlbnRQYXQgJmZpZWxkKQ0KPj4gK3sNCj4+ICsgIC8vIGluaXRpYWwgc3RyaXAgdGVzdCBi YXNlZCBvbiBvdXRlciBhdHRycw0KPj4gKyAgZXhwYW5kZXIuZXhwYW5kX2NmZ19hdHRycyAo ZmllbGQuZ2V0X291dGVyX2F0dHJzICgpKTsNCj4+ICsgIGlmIChleHBhbmRlci5mYWlsc19j Zmdfd2l0aF9leHBhbmQgKGZpZWxkLmdldF9vdXRlcl9hdHRycyAoKSkpDQo+PiArICAgIHsN Cj4+ICsgICAgICBmaWVsZC5tYXJrX2Zvcl9zdHJpcCAoKTsNCj4+ICsgICAgICByZXR1cm47 DQo+PiArICAgIH0NCj4+ICsNCj4+ICsgIC8vIHN0cmlwIHN1Yi1wYXR0ZXJucyAoY2FuJ3Qg c3RyaXAgdG9wLWxldmVsIHBhdHRlcm4pDQo+PiArICBhdXRvICZzdWJfcGF0dGVybiA9IGZp ZWxkLmdldF9pZGVudF9wYXR0ZXJuICgpOw0KPj4gKyAgc3ViX3BhdHRlcm4tPmFjY2VwdF92 aXMgKCp0aGlzKTsNCj4+ICsgIGlmIChzdWJfcGF0dGVybi0+aXNfbWFya2VkX2Zvcl9zdHJp cCAoKSkNCj4+ICsgICAgcnVzdF9lcnJvcl9hdCAoc3ViX3BhdHRlcm4tPmdldF9sb2N1cyAo KSwNCj4+ICsgICAgICAgICAgICAgICAgICAiY2Fubm90IHN0cmlwIHBhdHRlcm4gaW4gdGhp cyBwb3NpdGlvbiIpOw0KPj4gK30NCj4+ICt2b2lkDQo+PiArQXR0clZpc2l0b3I6OnZpc2l0 IChBU1Q6OlN0cnVjdFBhdHRlcm5GaWVsZElkZW50ICZmaWVsZCkNCj4+ICt7DQo+PiArICAv LyBpbml0aWFsIHN0cmlwIHRlc3QgYmFzZWQgb24gb3V0ZXIgYXR0cnMNCj4+ICsgIGV4cGFu ZGVyLmV4cGFuZF9jZmdfYXR0cnMgKGZpZWxkLmdldF9vdXRlcl9hdHRycyAoKSk7DQo+PiAr ICBpZiAoZXhwYW5kZXIuZmFpbHNfY2ZnX3dpdGhfZXhwYW5kIChmaWVsZC5nZXRfb3V0ZXJf YXR0cnMgKCkpKQ0KPj4gKyAgICB7DQo+PiArICAgICAgZmllbGQubWFya19mb3Jfc3RyaXAg KCk7DQo+PiArICAgICAgcmV0dXJuOw0KPj4gKyAgICB9DQo+PiArfQ0KPj4gK3ZvaWQNCj4+ ICtBdHRyVmlzaXRvcjo6dmlzaXQgKEFTVDo6U3RydWN0UGF0dGVybiAmcGF0dGVybikNCj4+ ICt7DQo+PiArICAvLyBleHBhbmQgKGJ1dCBkb24ndCBzdHJpcCkgcGF0aA0KPj4gKyAgYXV0 byAmcGF0aCA9IHBhdHRlcm4uZ2V0X3BhdGggKCk7DQo+PiArICB2aXNpdCAocGF0aCk7DQo+ PiArICBpZiAocGF0aC5pc19tYXJrZWRfZm9yX3N0cmlwICgpKQ0KPj4gKyAgICBydXN0X2Vy cm9yX2F0IChwYXRoLmdldF9sb2N1cyAoKSwgImNhbm5vdCBzdHJpcCBwYXRoIGluIHRoaXMg cG9zaXRpb24iKTsNCj4+ICsNCj4+ICsgIC8qIFRPRE86IGFwcGFyZW50bHkgc3RydWN0IHBh dHRlcm4gZmllbGRzIGNhbiBoYXZlIG91dGVyIGF0dHJzLiBzbyBjYW4gdGhleQ0KPj4gKyAg ICogYmUgc3RyaXBwZWQ/ICovDQo+PiArICBpZiAoIXBhdHRlcm4uaGFzX3N0cnVjdF9wYXR0 ZXJuX2VsZW1zICgpKQ0KPj4gKyAgICByZXR1cm47DQo+PiArDQo+PiArICBhdXRvICZlbGVt cyA9IHBhdHRlcm4uZ2V0X3N0cnVjdF9wYXR0ZXJuX2VsZW1zICgpOw0KPj4gKw0KPj4gKyAg Ly8gYXNzdW1pbmcgeW91IGNhbiBzdHJpcCBzdHJ1Y3QgcGF0dGVybiBmaWVsZHMNCj4+ICsg IGV4cGFuZF9wb2ludGVyX2FsbG93X3N0cmlwIChlbGVtcy5nZXRfc3RydWN0X3BhdHRlcm5f ZmllbGRzICgpKTsNCj4+ICsNCj4+ICsgIC8vIGFzc3VtaW5nIHlvdSBjYW4gc3RyaXAgdGhl ICIuLiIgcGFydA0KPj4gKyAgaWYgKGVsZW1zLmhhc19ldGMgKCkpDQo+PiArICAgIHsNCj4+ ICsgICAgICBleHBhbmRlci5leHBhbmRfY2ZnX2F0dHJzIChlbGVtcy5nZXRfZXRjX291dGVy X2F0dHJzICgpKTsNCj4+ICsgICAgICBpZiAoZXhwYW5kZXIuZmFpbHNfY2ZnX3dpdGhfZXhw YW5kIChlbGVtcy5nZXRfZXRjX291dGVyX2F0dHJzICgpKSkNCj4+ICsgICAgICAgZWxlbXMu c3RyaXBfZXRjICgpOw0KPj4gKyAgICB9DQo+PiArfQ0KPj4gK3ZvaWQNCj4+ICtBdHRyVmlz aXRvcjo6dmlzaXQgKEFTVDo6VHVwbGVTdHJ1Y3RJdGVtc05vUmFuZ2UgJnR1cGxlX2l0ZW1z KQ0KPj4gK3sNCj4+ICsgIC8vIGNhbid0IHN0cmlwIGluZGl2aWR1YWwgcGF0dGVybnMsIG9u bHkgc3ViLXBhdHRlcm5zDQo+PiArICBmb3IgKGF1dG8gJnBhdHRlcm4gOiB0dXBsZV9pdGVt cy5nZXRfcGF0dGVybnMgKCkpDQo+PiArICAgIHsNCj4+ICsgICAgICBwYXR0ZXJuLT5hY2Nl cHRfdmlzICgqdGhpcyk7DQo+PiArDQo+PiArICAgICAgaWYgKHBhdHRlcm4tPmlzX21hcmtl ZF9mb3Jfc3RyaXAgKCkpDQo+PiArICAgICAgIHJ1c3RfZXJyb3JfYXQgKHBhdHRlcm4tPmdl dF9sb2N1cyAoKSwNCj4+ICsgICAgICAgICAgICAgICAgICAgICAgImNhbm5vdCBzdHJpcCBw YXR0ZXJuIGluIHRoaXMgcG9zaXRpb24iKTsNCj4+ICsgICAgICAvLyBUT0RPOiBxdWl0IHN0 cmlwcGluZyBub3c/IG9yIGtlZXAgZ29pbmc/DQo+PiArICAgIH0NCj4+ICt9DQo+PiArdm9p ZA0KPj4gK0F0dHJWaXNpdG9yOjp2aXNpdCAoQVNUOjpUdXBsZVN0cnVjdEl0ZW1zUmFuZ2Ug JnR1cGxlX2l0ZW1zKQ0KPj4gK3sNCj4+ICsgIC8vIGNhbid0IHN0cmlwIGluZGl2aWR1YWwg cGF0dGVybnMsIG9ubHkgc3ViLXBhdHRlcm5zDQo+PiArICBmb3IgKGF1dG8gJmxvd2VyX3Bh dHRlcm4gOiB0dXBsZV9pdGVtcy5nZXRfbG93ZXJfcGF0dGVybnMgKCkpDQo+PiArICAgIHsN Cj4+ICsgICAgICBsb3dlcl9wYXR0ZXJuLT5hY2NlcHRfdmlzICgqdGhpcyk7DQo+PiArDQo+ PiArICAgICAgaWYgKGxvd2VyX3BhdHRlcm4tPmlzX21hcmtlZF9mb3Jfc3RyaXAgKCkpDQo+ PiArICAgICAgIHJ1c3RfZXJyb3JfYXQgKGxvd2VyX3BhdHRlcm4tPmdldF9sb2N1cyAoKSwN Cj4+ICsgICAgICAgICAgICAgICAgICAgICAgImNhbm5vdCBzdHJpcCBwYXR0ZXJuIGluIHRo aXMgcG9zaXRpb24iKTsNCj4+ICsgICAgICAvLyBUT0RPOiBxdWl0IHN0cmlwcGluZyBub3c/ IG9yIGtlZXAgZ29pbmc/DQo+PiArICAgIH0NCj4+ICsgIGZvciAoYXV0byAmdXBwZXJfcGF0 dGVybiA6IHR1cGxlX2l0ZW1zLmdldF91cHBlcl9wYXR0ZXJucyAoKSkNCj4+ICsgICAgew0K Pj4gKyAgICAgIHVwcGVyX3BhdHRlcm4tPmFjY2VwdF92aXMgKCp0aGlzKTsNCj4+ICsNCj4+ ICsgICAgICBpZiAodXBwZXJfcGF0dGVybi0+aXNfbWFya2VkX2Zvcl9zdHJpcCAoKSkNCj4+ ICsgICAgICAgcnVzdF9lcnJvcl9hdCAodXBwZXJfcGF0dGVybi0+Z2V0X2xvY3VzICgpLA0K Pj4gKyAgICAgICAgICAgICAgICAgICAgICAiY2Fubm90IHN0cmlwIHBhdHRlcm4gaW4gdGhp cyBwb3NpdGlvbiIpOw0KPj4gKyAgICAgIC8vIFRPRE86IHF1aXQgc3RyaXBwaW5nIG5vdz8g b3Iga2VlcCBnb2luZz8NCj4+ICsgICAgfQ0KPj4gK30NCj4+ICt2b2lkDQo+PiArQXR0clZp c2l0b3I6OnZpc2l0IChBU1Q6OlR1cGxlU3RydWN0UGF0dGVybiAmcGF0dGVybikNCj4+ICt7 DQo+PiArICAvLyBleHBhbmQgKGJ1dCBkb24ndCBzdHJpcCkgcGF0aA0KPj4gKyAgYXV0byAm cGF0aCA9IHBhdHRlcm4uZ2V0X3BhdGggKCk7DQo+PiArICB2aXNpdCAocGF0aCk7DQo+PiAr ICBpZiAocGF0aC5pc19tYXJrZWRfZm9yX3N0cmlwICgpKQ0KPj4gKyAgICBydXN0X2Vycm9y X2F0IChwYXRoLmdldF9sb2N1cyAoKSwgImNhbm5vdCBzdHJpcCBwYXRoIGluIHRoaXMgcG9z aXRpb24iKTsNCj4+ICsNCj4+ICsgIGlmIChwYXR0ZXJuLmhhc19pdGVtcyAoKSkNCj4+ICsg ICAgcGF0dGVybi5nZXRfaXRlbXMgKCktPmFjY2VwdF92aXMgKCp0aGlzKTsNCj4+ICt9DQo+ PiArdm9pZA0KPj4gK0F0dHJWaXNpdG9yOjp2aXNpdCAoQVNUOjpUdXBsZVBhdHRlcm5JdGVt c011bHRpcGxlICZ0dXBsZV9pdGVtcykNCj4+ICt7DQo+PiArICAvLyBjYW4ndCBzdHJpcCBp bmRpdmlkdWFsIHBhdHRlcm5zLCBvbmx5IHN1Yi1wYXR0ZXJucw0KPj4gKyAgZm9yIChhdXRv ICZwYXR0ZXJuIDogdHVwbGVfaXRlbXMuZ2V0X3BhdHRlcm5zICgpKQ0KPj4gKyAgICB7DQo+ PiArICAgICAgcGF0dGVybi0+YWNjZXB0X3ZpcyAoKnRoaXMpOw0KPj4gKw0KPj4gKyAgICAg IGlmIChwYXR0ZXJuLT5pc19tYXJrZWRfZm9yX3N0cmlwICgpKQ0KPj4gKyAgICAgICBydXN0 X2Vycm9yX2F0IChwYXR0ZXJuLT5nZXRfbG9jdXMgKCksDQo+PiArICAgICAgICAgICAgICAg ICAgICAgICJjYW5ub3Qgc3RyaXAgcGF0dGVybiBpbiB0aGlzIHBvc2l0aW9uIik7DQo+PiAr ICAgICAgLy8gVE9ETzogcXVpdCBzdHJpcHBpbmcgbm93PyBvciBrZWVwIGdvaW5nPw0KPj4g KyAgICB9DQo+PiArfQ0KPj4gK3ZvaWQNCj4+ICtBdHRyVmlzaXRvcjo6dmlzaXQgKEFTVDo6 VHVwbGVQYXR0ZXJuSXRlbXNSYW5nZWQgJnR1cGxlX2l0ZW1zKQ0KPj4gK3sNCj4+ICsgIC8v IGNhbid0IHN0cmlwIGluZGl2aWR1YWwgcGF0dGVybnMsIG9ubHkgc3ViLXBhdHRlcm5zDQo+ PiArICBmb3IgKGF1dG8gJmxvd2VyX3BhdHRlcm4gOiB0dXBsZV9pdGVtcy5nZXRfbG93ZXJf cGF0dGVybnMgKCkpDQo+PiArICAgIHsNCj4+ICsgICAgICBsb3dlcl9wYXR0ZXJuLT5hY2Nl cHRfdmlzICgqdGhpcyk7DQo+PiArDQo+PiArICAgICAgaWYgKGxvd2VyX3BhdHRlcm4tPmlz X21hcmtlZF9mb3Jfc3RyaXAgKCkpDQo+PiArICAgICAgIHJ1c3RfZXJyb3JfYXQgKGxvd2Vy X3BhdHRlcm4tPmdldF9sb2N1cyAoKSwNCj4+ICsgICAgICAgICAgICAgICAgICAgICAgImNh bm5vdCBzdHJpcCBwYXR0ZXJuIGluIHRoaXMgcG9zaXRpb24iKTsNCj4+ICsgICAgICAvLyBU T0RPOiBxdWl0IHN0cmlwcGluZyBub3c/IG9yIGtlZXAgZ29pbmc/DQo+PiArICAgIH0NCj4+ ICsgIGZvciAoYXV0byAmdXBwZXJfcGF0dGVybiA6IHR1cGxlX2l0ZW1zLmdldF91cHBlcl9w YXR0ZXJucyAoKSkNCj4+ICsgICAgew0KPj4gKyAgICAgIHVwcGVyX3BhdHRlcm4tPmFjY2Vw dF92aXMgKCp0aGlzKTsNCj4+ICsNCj4+ICsgICAgICBpZiAodXBwZXJfcGF0dGVybi0+aXNf bWFya2VkX2Zvcl9zdHJpcCAoKSkNCj4+ICsgICAgICAgcnVzdF9lcnJvcl9hdCAodXBwZXJf cGF0dGVybi0+Z2V0X2xvY3VzICgpLA0KPj4gKyAgICAgICAgICAgICAgICAgICAgICAiY2Fu bm90IHN0cmlwIHBhdHRlcm4gaW4gdGhpcyBwb3NpdGlvbiIpOw0KPj4gKyAgICAgIC8vIFRP RE86IHF1aXQgc3RyaXBwaW5nIG5vdz8gb3Iga2VlcCBnb2luZz8NCj4+ICsgICAgfQ0KPj4g K30NCj4+ICt2b2lkDQo+PiArQXR0clZpc2l0b3I6OnZpc2l0IChBU1Q6OlR1cGxlUGF0dGVy biAmcGF0dGVybikNCj4+ICt7DQo+PiArICBpZiAocGF0dGVybi5oYXNfdHVwbGVfcGF0dGVy bl9pdGVtcyAoKSkNCj4+ICsgICAgcGF0dGVybi5nZXRfaXRlbXMgKCktPmFjY2VwdF92aXMg KCp0aGlzKTsNCj4+ICt9DQo+PiArdm9pZA0KPj4gK0F0dHJWaXNpdG9yOjp2aXNpdCAoQVNU OjpHcm91cGVkUGF0dGVybiAmcGF0dGVybikNCj4+ICt7DQo+PiArICAvLyBjYW4ndCBzdHJp cCBpbm5lciBwYXR0ZXJuLCBvbmx5IHN1Yi1wYXR0ZXJucw0KPj4gKyAgYXV0byAmcGF0dGVy bl9pbl9wYXJlbnMgPSBwYXR0ZXJuLmdldF9wYXR0ZXJuX2luX3BhcmVucyAoKTsNCj4+ICsN Cj4+ICsgIHBhdHRlcm5faW5fcGFyZW5zLT5hY2NlcHRfdmlzICgqdGhpcyk7DQo+PiArDQo+ PiArICBpZiAocGF0dGVybl9pbl9wYXJlbnMtPmlzX21hcmtlZF9mb3Jfc3RyaXAgKCkpDQo+ PiArICAgIHJ1c3RfZXJyb3JfYXQgKHBhdHRlcm5faW5fcGFyZW5zLT5nZXRfbG9jdXMgKCks DQo+PiArICAgICAgICAgICAgICAgICAgImNhbm5vdCBzdHJpcCBwYXR0ZXJuIGluIHRoaXMg cG9zaXRpb24iKTsNCj4+ICt9DQo+PiArdm9pZA0KPj4gK0F0dHJWaXNpdG9yOjp2aXNpdCAo QVNUOjpTbGljZVBhdHRlcm4gJnBhdHRlcm4pDQo+PiArew0KPj4gKyAgLy8gY2FuJ3Qgc3Ry aXAgaW5kaXZpZHVhbCBwYXR0ZXJucywgb25seSBzdWItcGF0dGVybnMNCj4+ICsgIGZvciAo YXV0byAmaXRlbSA6IHBhdHRlcm4uZ2V0X2l0ZW1zICgpKQ0KPj4gKyAgICB7DQo+PiArICAg ICAgaXRlbS0+YWNjZXB0X3ZpcyAoKnRoaXMpOw0KPj4gKw0KPj4gKyAgICAgIGlmIChpdGVt LT5pc19tYXJrZWRfZm9yX3N0cmlwICgpKQ0KPj4gKyAgICAgICBydXN0X2Vycm9yX2F0IChp dGVtLT5nZXRfbG9jdXMgKCksDQo+PiArICAgICAgICAgICAgICAgICAgICAgICJjYW5ub3Qg c3RyaXAgcGF0dGVybiBpbiB0aGlzIHBvc2l0aW9uIik7DQo+PiArICAgICAgLy8gVE9ETzog cXVpdCBzdHJpcHBpbmcgbm93PyBvciBrZWVwIGdvaW5nPw0KPj4gKyAgICB9DQo+PiArfQ0K Pj4gKw0KPj4gK3ZvaWQNCj4+ICtBdHRyVmlzaXRvcjo6dmlzaXQgKEFTVDo6RW1wdHlTdG10 ICYpDQo+PiArew0KPj4gKyAgLy8gYXNzdW1pbmcgbm8gb3V0ZXIgYXR0cmlidXRlcywgc28g bm90aGluZyBjYW4gaGFwcGVuDQo+PiArfQ0KPj4gK3ZvaWQNCj4+ICtBdHRyVmlzaXRvcjo6 dmlzaXQgKEFTVDo6TGV0U3RtdCAmc3RtdCkNCj4+ICt7DQo+PiArICAvLyBpbml0aWFsIHN0 cmlwIHRlc3QgYmFzZWQgb24gb3V0ZXIgYXR0cnMNCj4+ICsgIGV4cGFuZGVyLmV4cGFuZF9j ZmdfYXR0cnMgKHN0bXQuZ2V0X291dGVyX2F0dHJzICgpKTsNCj4+ICsgIGlmIChleHBhbmRl ci5mYWlsc19jZmdfd2l0aF9leHBhbmQgKHN0bXQuZ2V0X291dGVyX2F0dHJzICgpKSkNCj4+ ICsgICAgew0KPj4gKyAgICAgIHN0bXQubWFya19mb3Jfc3RyaXAgKCk7DQo+PiArICAgICAg cmV0dXJuOw0KPj4gKyAgICB9DQo+PiArDQo+PiArICAvLyBjYW4ndCBzdHJpcCBwYXR0ZXJu LCBidXQgY2FsbCBmb3Igc3ViLXBhdHRlcm5zDQo+PiArICBhdXRvICZwYXR0ZXJuID0gc3Rt dC5nZXRfcGF0dGVybiAoKTsNCj4+ICsgIHBhdHRlcm4tPmFjY2VwdF92aXMgKCp0aGlzKTsN Cj4+ICsgIGlmIChwYXR0ZXJuLT5pc19tYXJrZWRfZm9yX3N0cmlwICgpKQ0KPj4gKyAgICBy dXN0X2Vycm9yX2F0IChwYXR0ZXJuLT5nZXRfbG9jdXMgKCksDQo+PiArICAgICAgICAgICAg ICAgICAgImNhbm5vdCBzdHJpcCBwYXR0ZXJuIGluIHRoaXMgcG9zaXRpb24iKTsNCj4+ICsN Cj4+ICsgIC8vIHNpbWlsYXIgZm9yIHR5cGUNCj4+ICsgIGlmIChzdG10Lmhhc190eXBlICgp KQ0KPj4gKyAgICB7DQo+PiArICAgICAgZXhwYW5kZXIucHVzaF9jb250ZXh0IChNYWNyb0V4 cGFuZGVyOjpDb250ZXh0VHlwZTo6VFlQRSk7DQo+PiArDQo+PiArICAgICAgYXV0byAmdHlw ZSA9IHN0bXQuZ2V0X3R5cGUgKCk7DQo+PiArICAgICAgdHlwZS0+YWNjZXB0X3ZpcyAoKnRo aXMpOw0KPj4gKw0KPj4gKyAgICAgIG1heWJlX2V4cGFuZF90eXBlICh0eXBlKTsNCj4+ICsN Cj4+ICsgICAgICBpZiAodHlwZS0+aXNfbWFya2VkX2Zvcl9zdHJpcCAoKSkNCj4+ICsgICAg ICAgcnVzdF9lcnJvcl9hdCAodHlwZS0+Z2V0X2xvY3VzICgpLA0KPj4gKyAgICAgICAgICAg ICAgICAgICAgICAiY2Fubm90IHN0cmlwIHR5cGUgaW4gdGhpcyBwb3NpdGlvbiIpOw0KPj4g Kw0KPj4gKyAgICAgIGV4cGFuZGVyLnBvcF9jb250ZXh0ICgpOw0KPj4gKyAgICB9DQo+PiAr DQo+PiArICAvKiBzdHJpcCBhbnkgaW50ZXJuYWwgc3ViLWV4cHJlc3Npb25zIC0gZXhwcmVz c2lvbiBpdHNlbGYgaXNuJ3QNCj4+ICsgICAqIGFsbG93ZWQgdG8gaGF2ZSBleHRlcm5hbCBh dHRyaWJ1dGVzIGluIHRoaXMgcG9zaXRpb24gc28gY2FuJ3QgYmUNCj4+ICsgICAqIHN0cmlw cGVkICovDQo+PiArICBpZiAoc3RtdC5oYXNfaW5pdF9leHByICgpKQ0KPj4gKyAgICB7DQo+ PiArICAgICAgYXV0byAmaW5pdF9leHByID0gc3RtdC5nZXRfaW5pdF9leHByICgpOw0KPj4g KyAgICAgIGluaXRfZXhwci0+YWNjZXB0X3ZpcyAoKnRoaXMpOw0KPj4gKw0KPj4gKyAgICAg IGlmIChpbml0X2V4cHItPmlzX21hcmtlZF9mb3Jfc3RyaXAgKCkpDQo+PiArICAgICAgIHJ1 c3RfZXJyb3JfYXQgKGluaXRfZXhwci0+Z2V0X2xvY3VzICgpLA0KPj4gKyAgICAgICAgICAg ICAgICAgICAgICAiY2Fubm90IHN0cmlwIGV4cHJlc3Npb24gaW4gdGhpcyBwb3NpdGlvbiAt IG91dGVyICINCj4+ICsgICAgICAgICAgICAgICAgICAgICAgImF0dHJpYnV0ZXMgbm90IGFs bG93ZWQiKTsNCj4+ICsNCj4+ICsgICAgICBtYXliZV9leHBhbmRfZXhwciAoaW5pdF9leHBy KTsNCj4+ICsgICAgfQ0KPj4gK30NCj4+ICt2b2lkDQo+PiArQXR0clZpc2l0b3I6OnZpc2l0 IChBU1Q6OkV4cHJTdG10V2l0aG91dEJsb2NrICZzdG10KQ0KPj4gK3sNCj4+ICsgIC8vIG91 dGVyIGF0dHJpYnV0ZXMgYXNzb2NpYXRlZCB3aXRoIGV4cHIsIHNvIHJlbHkgb24gZXhwcg0K Pj4gKw0KPj4gKyAgLy8gZ3VhcmQgLSBzaG91bGQgcHJldmVudCBudWxsIHBvaW50ZXIgZXhw cg0KPj4gKyAgaWYgKHN0bXQuaXNfbWFya2VkX2Zvcl9zdHJpcCAoKSkNCj4+ICsgICAgcmV0 dXJuOw0KPj4gKw0KPj4gKyAgLy8gc3RyaXAgaWYgZXhwciBpcyB0byBiZSBzdHJpcHBlZA0K Pj4gKyAgYXV0byAmZXhwciA9IHN0bXQuZ2V0X2V4cHIgKCk7DQo+PiArICBleHByLT5hY2Nl cHRfdmlzICgqdGhpcyk7DQo+PiArICBpZiAoZXhwci0+aXNfbWFya2VkX2Zvcl9zdHJpcCAo KSkNCj4+ICsgICAgew0KPj4gKyAgICAgIHN0bXQubWFya19mb3Jfc3RyaXAgKCk7DQo+PiAr ICAgICAgcmV0dXJuOw0KPj4gKyAgICB9DQo+PiArfQ0KPj4gK3ZvaWQNCj4+ICtBdHRyVmlz aXRvcjo6dmlzaXQgKEFTVDo6RXhwclN0bXRXaXRoQmxvY2sgJnN0bXQpDQo+PiArew0KPj4g KyAgLy8gb3V0ZXIgYXR0cmlidXRlcyBhc3NvY2lhdGVkIHdpdGggZXhwciwgc28gcmVseSBv biBleHByDQo+PiArDQo+PiArICAvLyBndWFyZCAtIHNob3VsZCBwcmV2ZW50IG51bGwgcG9p bnRlciBleHByDQo+PiArICBpZiAoc3RtdC5pc19tYXJrZWRfZm9yX3N0cmlwICgpKQ0KPj4g KyAgICByZXR1cm47DQo+PiArDQo+PiArICAvLyBzdHJpcCBpZiBleHByIGlzIHRvIGJlIHN0 cmlwcGVkDQo+PiArICBhdXRvICZleHByID0gc3RtdC5nZXRfZXhwciAoKTsNCj4+ICsgIGV4 cHItPmFjY2VwdF92aXMgKCp0aGlzKTsNCj4+ICsgIGlmIChleHByLT5pc19tYXJrZWRfZm9y X3N0cmlwICgpKQ0KPj4gKyAgICB7DQo+PiArICAgICAgc3RtdC5tYXJrX2Zvcl9zdHJpcCAo KTsNCj4+ICsgICAgICByZXR1cm47DQo+PiArICAgIH0NCj4+ICt9DQo+PiArDQo+PiArdm9p ZA0KPj4gK0F0dHJWaXNpdG9yOjp2aXNpdCAoQVNUOjpUcmFpdEJvdW5kICZib3VuZCkNCj4+ ICt7DQo+PiArICAvLyBub3RoaW5nIGluIGZvciBsaWZldGltZXMgdG8gc3RyaXANCj4+ICsN Cj4+ICsgIC8vIGV4cGFuZCBidXQgZG9uJ3Qgc3RyaXAgdHlwZSBwYXRoDQo+PiArICBhdXRv ICZwYXRoID0gYm91bmQuZ2V0X3R5cGVfcGF0aCAoKTsNCj4+ICsgIHZpc2l0IChwYXRoKTsN Cj4+ICsgIGlmIChwYXRoLmlzX21hcmtlZF9mb3Jfc3RyaXAgKCkpDQo+PiArICAgIHJ1c3Rf ZXJyb3JfYXQgKHBhdGguZ2V0X2xvY3VzICgpLA0KPj4gKyAgICAgICAgICAgICAgICAgICJj YW5ub3Qgc3RyaXAgdHlwZSBwYXRoIGluIHRoaXMgcG9zaXRpb24iKTsNCj4+ICt9DQo+PiAr dm9pZA0KPj4gK0F0dHJWaXNpdG9yOjp2aXNpdCAoQVNUOjpJbXBsVHJhaXRUeXBlICZ0eXBl KQ0KPj4gK3sNCj4+ICsgIC8vIGRvbid0IHN0cmlwIGRpcmVjdGx5LCBvbmx5IGNvbXBvbmVu dHMgb2YgYm91bmRzDQo+PiArICBmb3IgKGF1dG8gJmJvdW5kIDogdHlwZS5nZXRfdHlwZV9w YXJhbV9ib3VuZHMgKCkpDQo+PiArICAgIGJvdW5kLT5hY2NlcHRfdmlzICgqdGhpcyk7DQo+ PiArfQ0KPj4gK3ZvaWQNCj4+ICtBdHRyVmlzaXRvcjo6dmlzaXQgKEFTVDo6VHJhaXRPYmpl Y3RUeXBlICZ0eXBlKQ0KPj4gK3sNCj4+ICsgIC8vIGRvbid0IHN0cmlwIGRpcmVjdGx5LCBv bmx5IGNvbXBvbmVudHMgb2YgYm91bmRzDQo+PiArICBmb3IgKGF1dG8gJmJvdW5kIDogdHlw ZS5nZXRfdHlwZV9wYXJhbV9ib3VuZHMgKCkpDQo+PiArICAgIGJvdW5kLT5hY2NlcHRfdmlz ICgqdGhpcyk7DQo+PiArfQ0KPj4gK3ZvaWQNCj4+ICtBdHRyVmlzaXRvcjo6dmlzaXQgKEFT VDo6UGFyZW50aGVzaXNlZFR5cGUgJnR5cGUpDQo+PiArew0KPj4gKyAgLy8gZXhwYW5kIGJ1 dCBkb24ndCBzdHJpcCBpbm5lciB0eXBlDQo+PiArICBhdXRvICZpbm5lcl90eXBlID0gdHlw ZS5nZXRfdHlwZV9pbl9wYXJlbnMgKCk7DQo+PiArICBpbm5lcl90eXBlLT5hY2NlcHRfdmlz ICgqdGhpcyk7DQo+PiArICBpZiAoaW5uZXJfdHlwZS0+aXNfbWFya2VkX2Zvcl9zdHJpcCAo KSkNCj4+ICsgICAgcnVzdF9lcnJvcl9hdCAoaW5uZXJfdHlwZS0+Z2V0X2xvY3VzICgpLA0K Pj4gKyAgICAgICAgICAgICAgICAgICJjYW5ub3Qgc3RyaXAgdHlwZSBpbiB0aGlzIHBvc2l0 aW9uIik7DQo+PiArfQ0KPj4gK3ZvaWQNCj4+ICtBdHRyVmlzaXRvcjo6dmlzaXQgKEFTVDo6 SW1wbFRyYWl0VHlwZU9uZUJvdW5kICZ0eXBlKQ0KPj4gK3sNCj4+ICsgIC8vIG5vIHN0cmlw cGluZyBwb3NzaWJsZQ0KPj4gKyAgdmlzaXQgKHR5cGUuZ2V0X3RyYWl0X2JvdW5kICgpKTsN Cj4+ICt9DQo+PiArdm9pZA0KPj4gK0F0dHJWaXNpdG9yOjp2aXNpdCAoQVNUOjpUcmFpdE9i amVjdFR5cGVPbmVCb3VuZCAmdHlwZSkNCj4+ICt7DQo+PiArICAvLyBubyBzdHJpcHBpbmcg cG9zc2libGUNCj4+ICsgIHZpc2l0ICh0eXBlLmdldF90cmFpdF9ib3VuZCAoKSk7DQo+PiAr fQ0KPj4gK3ZvaWQNCj4+ICtBdHRyVmlzaXRvcjo6dmlzaXQgKEFTVDo6VHVwbGVUeXBlICZ0 eXBlKQ0KPj4gK3sNCj4+ICsgIC8vIFRPRE86IGFzc3VtaW5nIHRoYXQgdHlwZXMgY2FuJ3Qg YmUgc3RyaXBwZWQgYXMgdHlwZXMgZG9uJ3QgaGF2ZSBvdXRlcg0KPj4gKyAgLy8gYXR0cmli dXRlcw0KPj4gKyAgZm9yIChhdXRvICZlbGVtX3R5cGUgOiB0eXBlLmdldF9lbGVtcyAoKSkN Cj4+ICsgICAgew0KPj4gKyAgICAgIGVsZW1fdHlwZS0+YWNjZXB0X3ZpcyAoKnRoaXMpOw0K Pj4gKyAgICAgIGlmIChlbGVtX3R5cGUtPmlzX21hcmtlZF9mb3Jfc3RyaXAgKCkpDQo+PiAr ICAgICAgIHJ1c3RfZXJyb3JfYXQgKGVsZW1fdHlwZS0+Z2V0X2xvY3VzICgpLA0KPj4gKyAg ICAgICAgICAgICAgICAgICAgICAiY2Fubm90IHN0cmlwIHR5cGUgaW4gdGhpcyBwb3NpdGlv biIpOw0KPj4gKyAgICB9DQo+PiArfQ0KPj4gK3ZvaWQNCj4+ICtBdHRyVmlzaXRvcjo6dmlz aXQgKEFTVDo6TmV2ZXJUeXBlICYpDQo+PiArew0KPj4gKyAgLy8gbm8gc3RyaXBwaW5nIHBv c3NpYmxlDQo+PiArfQ0KPj4gK3ZvaWQNCj4+ICtBdHRyVmlzaXRvcjo6dmlzaXQgKEFTVDo6 UmF3UG9pbnRlclR5cGUgJnR5cGUpDQo+PiArew0KPj4gKyAgLy8gZXhwYW5kIGJ1dCBkb24n dCBzdHJpcCB0eXBlIHBvaW50ZWQgdG8NCj4+ICsgIGF1dG8gJnBvaW50ZWRfdHlwZSA9IHR5 cGUuZ2V0X3R5cGVfcG9pbnRlZF90byAoKTsNCj4+ICsgIHBvaW50ZWRfdHlwZS0+YWNjZXB0 X3ZpcyAoKnRoaXMpOw0KPj4gKyAgaWYgKHBvaW50ZWRfdHlwZS0+aXNfbWFya2VkX2Zvcl9z dHJpcCAoKSkNCj4+ICsgICAgcnVzdF9lcnJvcl9hdCAocG9pbnRlZF90eXBlLT5nZXRfbG9j dXMgKCksDQo+PiArICAgICAgICAgICAgICAgICAgImNhbm5vdCBzdHJpcCB0eXBlIGluIHRo aXMgcG9zaXRpb24iKTsNCj4+ICt9DQo+PiArdm9pZA0KPj4gK0F0dHJWaXNpdG9yOjp2aXNp dCAoQVNUOjpSZWZlcmVuY2VUeXBlICZ0eXBlKQ0KPj4gK3sNCj4+ICsgIC8vIGV4cGFuZCBi dXQgZG9uJ3Qgc3RyaXAgdHlwZSByZWZlcmVuY2VkDQo+PiArICBhdXRvICZyZWZlcmVuY2Vk X3R5cGUgPSB0eXBlLmdldF90eXBlX3JlZmVyZW5jZWQgKCk7DQo+PiArICByZWZlcmVuY2Vk X3R5cGUtPmFjY2VwdF92aXMgKCp0aGlzKTsNCj4+ICsgIGlmIChyZWZlcmVuY2VkX3R5cGUt PmlzX21hcmtlZF9mb3Jfc3RyaXAgKCkpDQo+PiArICAgIHJ1c3RfZXJyb3JfYXQgKHJlZmVy ZW5jZWRfdHlwZS0+Z2V0X2xvY3VzICgpLA0KPj4gKyAgICAgICAgICAgICAgICAgICJjYW5u b3Qgc3RyaXAgdHlwZSBpbiB0aGlzIHBvc2l0aW9uIik7DQo+PiArfQ0KPj4gK3ZvaWQNCj4+ ICtBdHRyVmlzaXRvcjo6dmlzaXQgKEFTVDo6QXJyYXlUeXBlICZ0eXBlKQ0KPj4gK3sNCj4+ ICsgIC8vIGV4cGFuZCBidXQgZG9uJ3Qgc3RyaXAgdHlwZSByZWZlcmVuY2VkDQo+PiArICBh dXRvICZiYXNlX3R5cGUgPSB0eXBlLmdldF9lbGVtX3R5cGUgKCk7DQo+PiArICBiYXNlX3R5 cGUtPmFjY2VwdF92aXMgKCp0aGlzKTsNCj4+ICsgIGlmIChiYXNlX3R5cGUtPmlzX21hcmtl ZF9mb3Jfc3RyaXAgKCkpDQo+PiArICAgIHJ1c3RfZXJyb3JfYXQgKGJhc2VfdHlwZS0+Z2V0 X2xvY3VzICgpLA0KPj4gKyAgICAgICAgICAgICAgICAgICJjYW5ub3Qgc3RyaXAgdHlwZSBp biB0aGlzIHBvc2l0aW9uIik7DQo+PiArDQo+PiArICAvLyBzYW1lIGZvciBleHByZXNzaW9u DQo+PiArICBhdXRvICZzaXplX2V4cHIgPSB0eXBlLmdldF9zaXplX2V4cHIgKCk7DQo+PiAr ICBzaXplX2V4cHItPmFjY2VwdF92aXMgKCp0aGlzKTsNCj4+ICsgIGlmIChzaXplX2V4cHIt PmlzX21hcmtlZF9mb3Jfc3RyaXAgKCkpDQo+PiArICAgIHJ1c3RfZXJyb3JfYXQgKHNpemVf ZXhwci0+Z2V0X2xvY3VzICgpLA0KPj4gKyAgICAgICAgICAgICAgICAgICJjYW5ub3Qgc3Ry aXAgZXhwcmVzc2lvbiBpbiB0aGlzIHBvc2l0aW9uIik7DQo+PiArfQ0KPj4gK3ZvaWQNCj4+ ICtBdHRyVmlzaXRvcjo6dmlzaXQgKEFTVDo6U2xpY2VUeXBlICZ0eXBlKQ0KPj4gK3sNCj4+ ICsgIC8vIGV4cGFuZCBidXQgZG9uJ3Qgc3RyaXAgZWxlbSB0eXBlDQo+PiArICBhdXRvICZl bGVtX3R5cGUgPSB0eXBlLmdldF9lbGVtX3R5cGUgKCk7DQo+PiArICBlbGVtX3R5cGUtPmFj Y2VwdF92aXMgKCp0aGlzKTsNCj4+ICsgIGlmIChlbGVtX3R5cGUtPmlzX21hcmtlZF9mb3Jf c3RyaXAgKCkpDQo+PiArICAgIHJ1c3RfZXJyb3JfYXQgKGVsZW1fdHlwZS0+Z2V0X2xvY3Vz ICgpLA0KPj4gKyAgICAgICAgICAgICAgICAgICJjYW5ub3Qgc3RyaXAgdHlwZSBpbiB0aGlz IHBvc2l0aW9uIik7DQo+PiArfQ0KPj4gK3ZvaWQNCj4+ICtBdHRyVmlzaXRvcjo6dmlzaXQg KEFTVDo6SW5mZXJyZWRUeXBlICYpDQo+PiArew0KPj4gKyAgLy8gbm9uZSBwb3NzaWJsZQ0K Pj4gK30NCj4+ICt2b2lkDQo+PiArQXR0clZpc2l0b3I6OnZpc2l0IChBU1Q6OkJhcmVGdW5j dGlvblR5cGUgJnR5cGUpDQo+PiArew0KPj4gKyAgLy8gc2VlbSB0byBiZSBubyBnZW5lcmlj cw0KPj4gKw0KPj4gKyAgLy8gcHJlc3VtYWJseSBmdW5jdGlvbiBwYXJhbXMgY2FuIGJlIHN0 cmlwcGVkDQo+PiArICBhdXRvICZwYXJhbXMgPSB0eXBlLmdldF9mdW5jdGlvbl9wYXJhbXMg KCk7DQo+PiArICBmb3IgKGF1dG8gaXQgPSBwYXJhbXMuYmVnaW4gKCk7IGl0ICE9IHBhcmFt cy5lbmQgKCk7KQ0KPj4gKyAgICB7DQo+PiArICAgICAgYXV0byAmcGFyYW0gPSAqaXQ7DQo+ PiArDQo+PiArICAgICAgYXV0byAmcGFyYW1fYXR0cnMgPSBwYXJhbS5nZXRfb3V0ZXJfYXR0 cnMgKCk7DQo+PiArICAgICAgZXhwYW5kZXIuZXhwYW5kX2NmZ19hdHRycyAocGFyYW1fYXR0 cnMpOw0KPj4gKyAgICAgIGlmIChleHBhbmRlci5mYWlsc19jZmdfd2l0aF9leHBhbmQgKHBh cmFtX2F0dHJzKSkNCj4+ICsgICAgICAgew0KPj4gKyAgICAgICAgIGl0ID0gcGFyYW1zLmVy YXNlIChpdCk7DQo+PiArICAgICAgICAgY29udGludWU7DQo+PiArICAgICAgIH0NCj4+ICsN Cj4+ICsgICAgICBleHBhbmRlci5wdXNoX2NvbnRleHQgKE1hY3JvRXhwYW5kZXI6OkNvbnRl eHRUeXBlOjpUWVBFKTsNCj4+ICsNCj4+ICsgICAgICBhdXRvICZ0eXBlID0gcGFyYW0uZ2V0 X3R5cGUgKCk7DQo+PiArICAgICAgdHlwZS0+YWNjZXB0X3ZpcyAoKnRoaXMpOw0KPj4gKw0K Pj4gKyAgICAgIG1heWJlX2V4cGFuZF90eXBlICh0eXBlKTsNCj4+ICsNCj4+ICsgICAgICBp ZiAodHlwZS0+aXNfbWFya2VkX2Zvcl9zdHJpcCAoKSkNCj4+ICsgICAgICAgcnVzdF9lcnJv cl9hdCAodHlwZS0+Z2V0X2xvY3VzICgpLA0KPj4gKyAgICAgICAgICAgICAgICAgICAgICAi Y2Fubm90IHN0cmlwIHR5cGUgaW4gdGhpcyBwb3NpdGlvbiIpOw0KPj4gKw0KPj4gKyAgICAg IGV4cGFuZGVyLnBvcF9jb250ZXh0ICgpOw0KPj4gKw0KPj4gKyAgICAgIC8vIGluY3JlbWVu dCBpZiBub3RoaW5nIGVsc2UgaGFwcGVucw0KPj4gKyAgICAgICsraXQ7DQo+PiArICAgIH0N Cj4+ICsNCj4+ICsgIC8qIFRPRE86IGFzc3VtaW5nIHRoYXQgdmFyaWFkaWMgbmF0dXJlIGNh bm5vdCBiZSBzdHJpcHBlZC4gSWYgdGhpcw0KPj4gKyAgICogaXMgbm90IHRydWUsIHRoZW4g aGF2ZSBjb2RlIGhlcmUgdG8gZG8gc28uICovDQo+PiArDQo+PiArICBpZiAodHlwZS5oYXNf cmV0dXJuX3R5cGUgKCkpDQo+PiArICAgIHsNCj4+ICsgICAgICAvLyBGSVhNRTogQ2FuIHdl IGhhdmUgdHlwZSBleHBhbnNpb24gaW4gdGhpcyBwb3NpdGlvbj8NCj4+ICsgICAgICAvLyBJ biB0aGF0IGNhc2UsIHdlIG5lZWQgdG8gaGFuZGxlIEFTVDo6VHlwZU5vQm91bmRzIG9uIHRv cCBvZiBqdXN0DQo+PiArICAgICAgLy8gQVNUOjpUeXBlcw0KPj4gKyAgICAgIGF1dG8gJnJl dHVybl90eXBlID0gdHlwZS5nZXRfcmV0dXJuX3R5cGUgKCk7DQo+PiArICAgICAgcmV0dXJu X3R5cGUtPmFjY2VwdF92aXMgKCp0aGlzKTsNCj4+ICsgICAgICBpZiAocmV0dXJuX3R5cGUt PmlzX21hcmtlZF9mb3Jfc3RyaXAgKCkpDQo+PiArICAgICAgIHJ1c3RfZXJyb3JfYXQgKHJl dHVybl90eXBlLT5nZXRfbG9jdXMgKCksDQo+PiArICAgICAgICAgICAgICAgICAgICAgICJj YW5ub3Qgc3RyaXAgdHlwZSBpbiB0aGlzIHBvc2l0aW9uIik7DQo+PiArICAgIH0NCj4+ICsN Cj4+ICsgIC8vIG5vIHdoZXJlIGNsYXVzZSwgYXBwYXJlbnRseQ0KPj4gK30NCj4+ICt2b2lk DQo+PiArQXR0clZpc2l0b3I6Om1heWJlX2V4cGFuZF9leHByIChzdGQ6OnVuaXF1ZV9wdHI8 QVNUOjpFeHByPiAmZXhwcikNCj4+ICt7DQo+PiArICBhdXRvIGZpbmFsX2ZyYWdtZW50ID0g ZXhwYW5kX21hY3JvX2ZyYWdtZW50X3JlY3Vyc2l2ZSAoKTsNCj4+ICsgIGlmIChmaW5hbF9m cmFnbWVudC5zaG91bGRfZXhwYW5kICgpKQ0KPj4gKyAgICBleHByID0gZmluYWxfZnJhZ21l bnQudGFrZV9leHByZXNzaW9uX2ZyYWdtZW50ICgpOw0KPj4gK30NCj4+ICsNCj4+ICt2b2lk DQo+PiArQXR0clZpc2l0b3I6Om1heWJlX2V4cGFuZF90eXBlIChzdGQ6OnVuaXF1ZV9wdHI8 QVNUOjpUeXBlPiAmdHlwZSkNCj4+ICt7DQo+PiArICBhdXRvIGZpbmFsX2ZyYWdtZW50ID0g ZXhwYW5kX21hY3JvX2ZyYWdtZW50X3JlY3Vyc2l2ZSAoKTsNCj4+ICsgIGlmIChmaW5hbF9m cmFnbWVudC5zaG91bGRfZXhwYW5kICgpKQ0KPj4gKyAgICB0eXBlID0gZmluYWxfZnJhZ21l bnQudGFrZV90eXBlX2ZyYWdtZW50ICgpOw0KPj4gK30NCj4+ICt9IC8vIG5hbWVzcGFjZSBS dXN0DQo+PiBkaWZmIC0tZ2l0IGEvZ2NjL3J1c3QvZXhwYW5kL3J1c3QtYXR0cmlidXRlLXZp c2l0b3IuaCBiL2djYy9ydXN0L2V4cGFuZC9ydXN0LWF0dHJpYnV0ZS12aXNpdG9yLmgNCj4+ IG5ldyBmaWxlIG1vZGUgMTAwNjQ0DQo+PiBpbmRleCAwMDAwMDAwMDAwMC4uMGY5ZDEwNjUz MzQNCj4+IC0tLSAvZGV2L251bGwNCj4+ICsrKyBiL2djYy9ydXN0L2V4cGFuZC9ydXN0LWF0 dHJpYnV0ZS12aXNpdG9yLmgNCj4+IEBAIC0wLDAgKzEsMzE2IEBADQo+PiArLy8gQ29weXJp Z2h0IChDKSAyMDIwLTIwMjIgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuDQo+PiAr DQo+PiArLy8gVGhpcyBmaWxlIGlzIHBhcnQgb2YgR0NDLg0KPj4gKw0KPj4gKy8vIEdDQyBp cyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5 IGl0IHVuZGVyDQo+PiArLy8gdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMg TGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUNCj4+ICsvLyBTb2Z0d2FyZSBGb3Vu ZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRl cg0KPj4gKy8vIHZlcnNpb24uDQo+PiArDQo+PiArLy8gR0NDIGlzIGRpc3RyaWJ1dGVkIGlu IHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUIEFOWQ0KPj4g Ky8vIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVS Q0hBTlRBQklMSVRZIG9yDQo+PiArLy8gRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBP U0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlDQo+PiArLy8gZm9yIG1v cmUgZGV0YWlscy4NCj4+ICsNCj4+ICsvLyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBj b3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQ0KPj4gKy8vIGFsb25nIHdp dGggR0NDOyBzZWUgdGhlIGZpbGUgQ09QWUlORzMuICBJZiBub3Qgc2VlDQo+PiArLy8gPGh0 dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+Lg0KPj4gKw0KPj4gKyNpbmNsdWRlICJydXN0 LWFzdC12aXNpdG9yLmgiDQo+PiArI2luY2x1ZGUgInJ1c3QtYXN0LmgiDQo+PiArI2luY2x1 ZGUgInJ1c3QtbWFjcm8tZXhwYW5kLmgiDQo+PiArDQo+PiArbmFtZXNwYWNlIFJ1c3Qgew0K Pj4gKy8vIFZpc2l0b3IgdXNlZCB0byBleHBhbmQgYXR0cmlidXRlcy4NCj4+ICtjbGFzcyBB dHRyVmlzaXRvciA6IHB1YmxpYyBBU1Q6OkFTVFZpc2l0b3INCj4+ICt7DQo+PiArcHJpdmF0 ZToNCj4+ICsgIE1hY3JvRXhwYW5kZXIgJmV4cGFuZGVyOw0KPj4gKyAgdm9pZCBtYXliZV9l eHBhbmRfZXhwciAoc3RkOjp1bmlxdWVfcHRyPEFTVDo6RXhwcj4gJmV4cHIpOw0KPj4gKyAg dm9pZCBtYXliZV9leHBhbmRfdHlwZSAoc3RkOjp1bmlxdWVfcHRyPEFTVDo6VHlwZT4gJmV4 cHIpOw0KPj4gKw0KPj4gK3B1YmxpYzoNCj4+ICsgIEF0dHJWaXNpdG9yIChNYWNyb0V4cGFu ZGVyICZleHBhbmRlcikgOiBleHBhbmRlciAoZXhwYW5kZXIpIHt9DQo+PiArDQo+PiArICB2 b2lkIGV4cGFuZF9zdHJ1Y3RfZmllbGRzIChzdGQ6OnZlY3RvcjxBU1Q6OlN0cnVjdEZpZWxk PiAmZmllbGRzKTsNCj4+ICsgIHZvaWQgZXhwYW5kX3R1cGxlX2ZpZWxkcyAoc3RkOjp2ZWN0 b3I8QVNUOjpUdXBsZUZpZWxkPiAmZmllbGRzKTsNCj4+ICsgIHZvaWQgZXhwYW5kX2Z1bmN0 aW9uX3BhcmFtcyAoc3RkOjp2ZWN0b3I8QVNUOjpGdW5jdGlvblBhcmFtPiAmcGFyYW1zKTsN Cj4+ICsgIHZvaWQgZXhwYW5kX2dlbmVyaWNfYXJncyAoQVNUOjpHZW5lcmljQXJncyAmYXJn cyk7DQo+PiArICB2b2lkIGV4cGFuZF9xdWFsaWZpZWRfcGF0aF90eXBlIChBU1Q6OlF1YWxp ZmllZFBhdGhUeXBlICZwYXRoX3R5cGUpOw0KPj4gKyAgdm9pZCBleHBhbmRfY2xvc3VyZV9w YXJhbXMgKHN0ZDo6dmVjdG9yPEFTVDo6Q2xvc3VyZVBhcmFtPiAmcGFyYW1zKTsNCj4+ICsg IHZvaWQgZXhwYW5kX3NlbGZfcGFyYW0gKEFTVDo6U2VsZlBhcmFtICZzZWxmX3BhcmFtKTsN Cj4+ICsgIHZvaWQgZXhwYW5kX3doZXJlX2NsYXVzZSAoQVNUOjpXaGVyZUNsYXVzZSAmd2hl cmVfY2xhdXNlKTsNCj4+ICsgIHZvaWQgZXhwYW5kX3RyYWl0X2Z1bmN0aW9uX2RlY2wgKEFT VDo6VHJhaXRGdW5jdGlvbkRlY2wgJmRlY2wpOw0KPj4gKyAgdm9pZCBleHBhbmRfdHJhaXRf bWV0aG9kX2RlY2wgKEFTVDo6VHJhaXRNZXRob2REZWNsICZkZWNsKTsNCj4+ICsNCj4+ICsg IC8qKg0KPj4gKyAgICogRXhwYW5kIFRoZSBjdXJyZW50IG1hY3JvIGZyYWdtZW50IHJlY3Vy c2l2ZWx5IHVudGlsIGl0IGNvdWxkIG5vdCBiZQ0KPj4gKyAgICogZXhwYW5kZWQgZnVydGhl ci4NCj4+ICsgICAqDQo+PiArICAgKiBUaGUgcmV0dXJuIHZhbHVlIGNoZWNraW5nIHdvcmtz IGJlY2F1c2UgY29ycmVjdGx5DQo+PiArICAgKiBleHBhbmRlZCBmcmFnbWVudCBjYW4gbmV2 ZXIgYmUgYW4gZXJyb3IgKGlmIHRoZSBmcmFnbWVudCBjYW4gbm90IGJlDQo+PiArICAgKiBl eHBhbmRlZCwgYSBzdGFuZC1pbiBlcnJvciBmcmFnbWVudCB3aWxsIGJlIHJldHVybmVkOyBm b3IgZnJhZ21lbnRzIHRoYXQNCj4+ICsgICAqIGNvdWxkIG5vdCBiZSBmdXJ0aGVyIGV4cGFu ZGVkOiB0aGUgZnJhZ21lbnQgcHJpb3IgdG8gdGhlIGV4cGFuc2lvbiBmYWlsdXJlDQo+PiAr ICAgKiB3aWxsIGJlIHJldHVybmVkKS4NCj4+ICsgICAqDQo+PiArICAgKiBAcmV0dXJuIEVp dGhlciB0aGUgZXhwYW5kZWQgZnJhZ21lbnQgb3IgYW4gZW1wdHkgZXJyb3JlZC1vdXQgZnJh Z21lbnQNCj4+ICsgICAqIGluZGljYXRpbmcgYW4gZXhwYW5zaW9uIGZhaWx1cmUuDQo+PiAr ICAgKi8NCj4+ICsgIEFTVDo6QVNURnJhZ21lbnQgZXhwYW5kX21hY3JvX2ZyYWdtZW50X3Jl Y3Vyc2l2ZSAoKQ0KPiANCj4gV2h5IGlzIHRoaXMgaW4gdGhlIGhlYWRlcj8NCg0KRG8geW91 IG1lYW4gdGhlIGRlZmluaXRpb24gb3IgdGhlIGRvY3VtZW50YXRpb24/IElmIHlvdSByZWZl ciB0byB0aGUgDQpkZWZpbml0aW9uLCB0aGVuIHRoYXQgaXMgYSBtaXN0YWtlIGFuZCBzaG91 bGQgYmUgaW4gdGhlIGltcGxlbWVudGF0aW9uLg0KDQo+PiArICB7DQo+PiArICAgIGF1dG8g ZnJhZ21lbnQgPSBleHBhbmRlci50YWtlX2V4cGFuZGVkX2ZyYWdtZW50ICgqdGhpcyk7DQo+ PiArICAgIHVuc2lnbmVkIGludCBvcmlnaW5hbF9kZXB0aCA9IGV4cGFuZGVyLmV4cGFuc2lv bl9kZXB0aDsNCj4+ICsgICAgYXV0byBmaW5hbF9mcmFnbWVudCA9IEFTVDo6QVNURnJhZ21l bnQgKHt9LCB0cnVlKTsNCj4+ICsNCj4+ICsgICAgd2hpbGUgKGZyYWdtZW50LnNob3VsZF9l eHBhbmQgKCkpDQo+PiArICAgICAgew0KPj4gKyAgICAgICBmaW5hbF9mcmFnbWVudCA9IHN0 ZDo6bW92ZSAoZnJhZ21lbnQpOw0KPj4gKyAgICAgICBleHBhbmRlci5leHBhbnNpb25fZGVw dGgrKzsNCj4+ICsgICAgICAgLy8gZnVydGhlciBleHBhbmQgdGhlIHByZXZpb3VzbHkgZXhw YW5kZWQgbWFjcm8gZnJhZ21lbnQNCj4+ICsgICAgICAgYXV0byBuZXdfZnJhZ21lbnQgPSBl eHBhbmRlci50YWtlX2V4cGFuZGVkX2ZyYWdtZW50ICgqdGhpcyk7DQo+PiArICAgICAgIGlm IChuZXdfZnJhZ21lbnQuaXNfZXJyb3IgKCkpDQo+PiArICAgICAgICAgYnJlYWs7DQo+PiAr ICAgICAgIGZyYWdtZW50ID0gc3RkOjptb3ZlIChuZXdfZnJhZ21lbnQpOw0KPj4gKyAgICAg IH0NCj4+ICsgICAgZXhwYW5kZXIuZXhwYW5zaW9uX2RlcHRoID0gb3JpZ2luYWxfZGVwdGg7 DQo+PiArICAgIHJldHVybiBmaW5hbF9mcmFnbWVudDsNCj4+ICsgIH0NCj4+ICsNCj4+ICsg IC8qKg0KPj4gKyAgICogRXhwYW5kIGEgc2V0IG9mIHZhbHVlcywgZXJhc2luZyB0aGVtIGlm IHRoZXkgYXJlIG1hcmtlZCBmb3Igc3RyaXAsIGFuZA0KPj4gKyAgICogcmVwbGFjaW5nIHRo ZW0gd2l0aCBleHBhbmRlZCBtYWNybyBub2RlcyBpZiBuZWNlc3NhcnkuDQo+PiArICAgKiBU aGlzIGZ1bmN0aW9uIGlzIHNsaWdodGx5IGRpZmZlcmVudCBmcm9tIGBleHBhbmRfcG9pbnRl cl9hbGxvd19zdHJpcGAgYXMNCj4+ICsgICAqIGl0IGNhbiBvbmx5IGJlIGNhbGxlZCBpbiBj ZXJ0YWluIGV4cGFuc2lvbiBjb250ZXh0cyAtIHdoZXJlIG1hY3JvDQo+PiArICAgKiBpbnZv Y2F0aW9ucyBhcmUgYWxsb3dlZC4NCj4+ICsgICAqDQo+PiArICAgKiBAcGFyYW0gY3R4IENv bnRleHQgdG8gdXNlIGZvciBtYWNybyBleHBhbnNpb24NCj4+ICsgICAqIEBwYXJhbSB2YWx1 ZXMgSXRlcmFibGUgcmVmZXJlbmNlIG92ZXIgdmFsdWVzIHRvIHJlcGxhY2Ugb3IgZXJhc2UN Cj4+ICsgICAqIEBwYXJhbSBleHRyYWN0b3IgRnVuY3Rpb24gdG8gY2FsbCB3aGVuIHJlcGxh Y2luZyB2YWx1ZXMgd2l0aCB0aGUgY29udGVudA0KPj4gKyAgICogICAgICAgICAgIG9mIGFu IGV4cGFuZGVkIEFTVCBub2RlDQo+PiArICAgKi8NCj4+ICsgIHRlbXBsYXRlIDx0eXBlbmFt ZSBULCB0eXBlbmFtZSBVPg0KPj4gKyAgdm9pZCBleHBhbmRfbWFjcm9fY2hpbGRyZW4gKE1h Y3JvRXhwYW5kZXI6OkNvbnRleHRUeXBlIGN0eCwgVCAmdmFsdWVzLA0KPj4gKyAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgc3RkOjpmdW5jdGlvbjxVIChBU1Q6OlNpbmdsZUFTVE5v ZGUpPiBleHRyYWN0b3IpDQo+PiArICB7DQo+PiArICAgIGV4cGFuZGVyLnB1c2hfY29udGV4 dCAoY3R4KTsNCj4+ICsNCj4+ICsgICAgZm9yIChhdXRvIGl0ID0gdmFsdWVzLmJlZ2luICgp OyBpdCAhPSB2YWx1ZXMuZW5kICgpOykNCj4+ICsgICAgICB7DQo+PiArICAgICAgIGF1dG8g JnZhbHVlID0gKml0Ow0KPj4gKw0KPj4gKyAgICAgICAvLyBtYXJrIGZvciBzdHJpcHBpbmcg aWYgcmVxdWlyZWQNCj4+ICsgICAgICAgdmFsdWUtPmFjY2VwdF92aXMgKCp0aGlzKTsNCj4+ ICsNCj4+ICsgICAgICAgLy8gcmVjdXJzaXZlbHkgZXhwYW5kIHRoZSBjaGlsZHJlbg0KPj4g KyAgICAgICBhdXRvIGZpbmFsX2ZyYWdtZW50ID0gZXhwYW5kX21hY3JvX2ZyYWdtZW50X3Jl Y3Vyc2l2ZSAoKTsNCj4+ICsNCj4+ICsgICAgICAgaWYgKGZpbmFsX2ZyYWdtZW50LnNob3Vs ZF9leHBhbmQgKCkpDQo+PiArICAgICAgICAgew0KPj4gKyAgICAgICAgICAgaXQgPSB2YWx1 ZXMuZXJhc2UgKGl0KTsNCj4+ICsgICAgICAgICAgIGZvciAoYXV0byAmbm9kZSA6IGZpbmFs X2ZyYWdtZW50LmdldF9ub2RlcyAoKSkNCj4+ICsgICAgICAgICAgICAgew0KPj4gKyAgICAg ICAgICAgICAgIGF1dG8gbmV3X25vZGUgPSBleHRyYWN0b3IgKG5vZGUpOw0KPj4gKyAgICAg ICAgICAgICAgIGlmIChuZXdfbm9kZSAhPSBudWxscHRyICYmICFuZXdfbm9kZS0+aXNfbWFy a2VkX2Zvcl9zdHJpcCAoKSkNCj4+ICsgICAgICAgICAgICAgICAgIHsNCj4+ICsgICAgICAg ICAgICAgICAgICAgaXQgPSB2YWx1ZXMuaW5zZXJ0IChpdCwgc3RkOjptb3ZlIChuZXdfbm9k ZSkpOw0KPj4gKyAgICAgICAgICAgICAgICAgICBpdCsrOw0KPj4gKyAgICAgICAgICAgICAg ICAgfQ0KPj4gKyAgICAgICAgICAgICB9DQo+PiArICAgICAgICAgfQ0KPj4gKyAgICAgICBl bHNlIGlmICh2YWx1ZS0+aXNfbWFya2VkX2Zvcl9zdHJpcCAoKSkNCj4+ICsgICAgICAgICB7 DQo+PiArICAgICAgICAgICBpdCA9IHZhbHVlcy5lcmFzZSAoaXQpOw0KPj4gKyAgICAgICAg IH0NCj4+ICsgICAgICAgZWxzZQ0KPj4gKyAgICAgICAgIHsNCj4+ICsgICAgICAgICAgICsr aXQ7DQo+PiArICAgICAgICAgfQ0KPj4gKyAgICAgIH0NCj4+ICsNCj4+ICsgICAgZXhwYW5k ZXIucG9wX2NvbnRleHQgKCk7DQo+PiArICB9DQo+PiArDQo+PiArICB0ZW1wbGF0ZSA8dHlw ZW5hbWUgVD4gdm9pZCBleHBhbmRfcG9pbnRlcl9hbGxvd19zdHJpcCAoVCAmdmFsdWVzKQ0K Pj4gKyAgew0KPj4gKyAgICBmb3IgKGF1dG8gaXQgPSB2YWx1ZXMuYmVnaW4gKCk7IGl0ICE9 IHZhbHVlcy5lbmQgKCk7KQ0KPj4gKyAgICAgIHsNCj4+ICsgICAgICAgYXV0byAmdmFsdWUg PSAqaXQ7DQo+PiArDQo+PiArICAgICAgIC8vIG1hcmsgZm9yIHN0cmlwcGluZyBpZiByZXF1 aXJlZA0KPj4gKyAgICAgICB2YWx1ZS0+YWNjZXB0X3ZpcyAoKnRoaXMpOw0KPj4gKyAgICAg ICBpZiAodmFsdWUtPmlzX21hcmtlZF9mb3Jfc3RyaXAgKCkpDQo+PiArICAgICAgICAgew0K Pj4gKyAgICAgICAgICAgaXQgPSB2YWx1ZXMuZXJhc2UgKGl0KTsNCj4+ICsgICAgICAgICB9 DQo+PiArICAgICAgIGVsc2UNCj4+ICsgICAgICAgICB7DQo+PiArICAgICAgICAgICArK2l0 Ow0KPj4gKyAgICAgICAgIH0NCj4+ICsgICAgICB9DQo+PiArICB9DQo+PiArDQo+PiArICB2 b2lkIHZpc2l0IChBU1Q6OlRva2VuICYpIG92ZXJyaWRlOw0KPj4gKyAgdm9pZCB2aXNpdCAo QVNUOjpEZWxpbVRva2VuVHJlZSAmKSBvdmVycmlkZTsNCj4+ICsgIHZvaWQgdmlzaXQgKEFT VDo6QXR0cklucHV0TWV0YUl0ZW1Db250YWluZXIgJikgb3ZlcnJpZGU7DQo+PiArICB2b2lk IHZpc2l0IChBU1Q6OklkZW50aWZpZXJFeHByICZpZGVudF9leHByKSBvdmVycmlkZTsNCj4+ ICsgIHZvaWQgdmlzaXQgKEFTVDo6TGlmZXRpbWUgJikgb3ZlcnJpZGU7DQo+PiArICB2b2lk IHZpc2l0IChBU1Q6OkxpZmV0aW1lUGFyYW0gJikgb3ZlcnJpZGU7DQo+PiArICB2b2lkIHZp c2l0IChBU1Q6OkNvbnN0R2VuZXJpY1BhcmFtICYpIG92ZXJyaWRlOw0KPj4gKw0KPj4gKyAg dm9pZCB2aXNpdCAoQVNUOjpNYWNyb0ludm9jYXRpb24gJm1hY3JvX2ludm9jKSBvdmVycmlk ZTsNCj4+ICsNCj4+ICsgIHZvaWQgdmlzaXQgKEFTVDo6UGF0aEluRXhwcmVzc2lvbiAmcGF0 aCkgb3ZlcnJpZGU7DQo+PiArICB2b2lkIHZpc2l0IChBU1Q6OlR5cGVQYXRoU2VnbWVudCAm KSBvdmVycmlkZTsNCj4+ICsgIHZvaWQgdmlzaXQgKEFTVDo6VHlwZVBhdGhTZWdtZW50R2Vu ZXJpYyAmc2VnbWVudCkgb3ZlcnJpZGU7DQo+PiArICB2b2lkIHZpc2l0IChBU1Q6OlR5cGVQ YXRoU2VnbWVudEZ1bmN0aW9uICZzZWdtZW50KSBvdmVycmlkZTsNCj4+ICsgIHZvaWQgdmlz aXQgKEFTVDo6VHlwZVBhdGggJnBhdGgpIG92ZXJyaWRlOw0KPj4gKyAgdm9pZCB2aXNpdCAo QVNUOjpRdWFsaWZpZWRQYXRoSW5FeHByZXNzaW9uICZwYXRoKSBvdmVycmlkZTsNCj4+ICsg IHZvaWQgdmlzaXQgKEFTVDo6UXVhbGlmaWVkUGF0aEluVHlwZSAmcGF0aCkgb3ZlcnJpZGU7 DQo+PiArDQo+PiArICB2b2lkIHZpc2l0IChBU1Q6OkxpdGVyYWxFeHByICZleHByKSBvdmVy cmlkZTsNCj4+ICsgIHZvaWQgdmlzaXQgKEFTVDo6QXR0cklucHV0TGl0ZXJhbCAmKSBvdmVy cmlkZTsNCj4+ICsgIHZvaWQgdmlzaXQgKEFTVDo6TWV0YUl0ZW1MaXRFeHByICYpIG92ZXJy aWRlOw0KPj4gKyAgdm9pZCB2aXNpdCAoQVNUOjpNZXRhSXRlbVBhdGhMaXQgJikgb3ZlcnJp ZGU7DQo+PiArICB2b2lkIHZpc2l0IChBU1Q6OkJvcnJvd0V4cHIgJmV4cHIpIG92ZXJyaWRl Ow0KPj4gKyAgdm9pZCB2aXNpdCAoQVNUOjpEZXJlZmVyZW5jZUV4cHIgJmV4cHIpIG92ZXJy aWRlOw0KPj4gKyAgdm9pZCB2aXNpdCAoQVNUOjpFcnJvclByb3BhZ2F0aW9uRXhwciAmZXhw cikgb3ZlcnJpZGU7DQo+PiArICB2b2lkIHZpc2l0IChBU1Q6Ok5lZ2F0aW9uRXhwciAmZXhw cikgb3ZlcnJpZGU7DQo+PiArICB2b2lkIHZpc2l0IChBU1Q6OkFyaXRobWV0aWNPckxvZ2lj YWxFeHByICZleHByKSBvdmVycmlkZTsNCj4+ICsgIHZvaWQgdmlzaXQgKEFTVDo6Q29tcGFy aXNvbkV4cHIgJmV4cHIpIG92ZXJyaWRlOw0KPj4gKyAgdm9pZCB2aXNpdCAoQVNUOjpMYXp5 Qm9vbGVhbkV4cHIgJmV4cHIpIG92ZXJyaWRlOw0KPj4gKyAgdm9pZCB2aXNpdCAoQVNUOjpU eXBlQ2FzdEV4cHIgJmV4cHIpIG92ZXJyaWRlOw0KPj4gKyAgdm9pZCB2aXNpdCAoQVNUOjpB c3NpZ25tZW50RXhwciAmZXhwcikgb3ZlcnJpZGU7DQo+PiArICB2b2lkIHZpc2l0IChBU1Q6 OkNvbXBvdW5kQXNzaWdubWVudEV4cHIgJmV4cHIpIG92ZXJyaWRlOw0KPj4gKyAgdm9pZCB2 aXNpdCAoQVNUOjpHcm91cGVkRXhwciAmZXhwcikgb3ZlcnJpZGU7DQo+PiArICB2b2lkIHZp c2l0IChBU1Q6OkFycmF5RWxlbXNWYWx1ZXMgJmVsZW1zKSBvdmVycmlkZTsNCj4+ICsgIHZv aWQgdmlzaXQgKEFTVDo6QXJyYXlFbGVtc0NvcGllZCAmZWxlbXMpIG92ZXJyaWRlOw0KPj4g KyAgdm9pZCB2aXNpdCAoQVNUOjpBcnJheUV4cHIgJmV4cHIpIG92ZXJyaWRlOw0KPj4gKyAg dm9pZCB2aXNpdCAoQVNUOjpBcnJheUluZGV4RXhwciAmZXhwcikgb3ZlcnJpZGU7DQo+PiAr ICB2b2lkIHZpc2l0IChBU1Q6OlR1cGxlRXhwciAmZXhwcikgb3ZlcnJpZGU7DQo+PiArICB2 b2lkIHZpc2l0IChBU1Q6OlR1cGxlSW5kZXhFeHByICZleHByKSBvdmVycmlkZTsNCj4+ICsg IHZvaWQgdmlzaXQgKEFTVDo6U3RydWN0RXhwclN0cnVjdCAmZXhwcikgb3ZlcnJpZGU7DQo+ PiArICB2b2lkIHZpc2l0IChBU1Q6OlN0cnVjdEV4cHJGaWVsZElkZW50aWZpZXIgJikgb3Zl cnJpZGU7DQo+PiArICB2b2lkIHZpc2l0IChBU1Q6OlN0cnVjdEV4cHJGaWVsZElkZW50aWZp ZXJWYWx1ZSAmZmllbGQpIG92ZXJyaWRlOw0KPj4gKw0KPj4gKyAgdm9pZCB2aXNpdCAoQVNU OjpTdHJ1Y3RFeHByRmllbGRJbmRleFZhbHVlICZmaWVsZCkgb3ZlcnJpZGU7DQo+PiArICB2 b2lkIHZpc2l0IChBU1Q6OlN0cnVjdEV4cHJTdHJ1Y3RGaWVsZHMgJmV4cHIpIG92ZXJyaWRl Ow0KPj4gKyAgdm9pZCB2aXNpdCAoQVNUOjpTdHJ1Y3RFeHByU3RydWN0QmFzZSAmZXhwcikg b3ZlcnJpZGU7DQo+PiArICB2b2lkIHZpc2l0IChBU1Q6OkNhbGxFeHByICZleHByKSBvdmVy cmlkZTsNCj4+ICsgIHZvaWQgdmlzaXQgKEFTVDo6TWV0aG9kQ2FsbEV4cHIgJmV4cHIpIG92 ZXJyaWRlOw0KPj4gKyAgdm9pZCB2aXNpdCAoQVNUOjpGaWVsZEFjY2Vzc0V4cHIgJmV4cHIp IG92ZXJyaWRlOw0KPj4gKyAgdm9pZCB2aXNpdCAoQVNUOjpDbG9zdXJlRXhwcklubmVyICZl eHByKSBvdmVycmlkZTsNCj4+ICsNCj4+ICsgIHZvaWQgdmlzaXQgKEFTVDo6QmxvY2tFeHBy ICZleHByKSBvdmVycmlkZTsNCj4+ICsNCj4+ICsgIHZvaWQgdmlzaXQgKEFTVDo6Q2xvc3Vy ZUV4cHJJbm5lclR5cGVkICZleHByKSBvdmVycmlkZTsNCj4+ICsgIHZvaWQgdmlzaXQgKEFT VDo6Q29udGludWVFeHByICZleHByKSBvdmVycmlkZTsNCj4+ICsgIHZvaWQgdmlzaXQgKEFT VDo6QnJlYWtFeHByICZleHByKSBvdmVycmlkZTsNCj4+ICsgIHZvaWQgdmlzaXQgKEFTVDo6 UmFuZ2VGcm9tVG9FeHByICZleHByKSBvdmVycmlkZTsNCj4+ICsgIHZvaWQgdmlzaXQgKEFT VDo6UmFuZ2VGcm9tRXhwciAmZXhwcikgb3ZlcnJpZGU7DQo+PiArICB2b2lkIHZpc2l0IChB U1Q6OlJhbmdlVG9FeHByICZleHByKSBvdmVycmlkZTsNCj4+ICsgIHZvaWQgdmlzaXQgKEFT VDo6UmFuZ2VGdWxsRXhwciAmKSBvdmVycmlkZTsNCj4+ICsgIHZvaWQgdmlzaXQgKEFTVDo6 UmFuZ2VGcm9tVG9JbmNsRXhwciAmZXhwcikgb3ZlcnJpZGU7DQo+PiArICB2b2lkIHZpc2l0 IChBU1Q6OlJhbmdlVG9JbmNsRXhwciAmZXhwcikgb3ZlcnJpZGU7DQo+PiArICB2b2lkIHZp c2l0IChBU1Q6OlJldHVybkV4cHIgJmV4cHIpIG92ZXJyaWRlOw0KPj4gKyAgdm9pZCB2aXNp dCAoQVNUOjpVbnNhZmVCbG9ja0V4cHIgJmV4cHIpIG92ZXJyaWRlOw0KPj4gKyAgdm9pZCB2 aXNpdCAoQVNUOjpMb29wRXhwciAmZXhwcikgb3ZlcnJpZGU7DQo+PiArICB2b2lkIHZpc2l0 IChBU1Q6OldoaWxlTG9vcEV4cHIgJmV4cHIpIG92ZXJyaWRlOw0KPj4gKyAgdm9pZCB2aXNp dCAoQVNUOjpXaGlsZUxldExvb3BFeHByICZleHByKSBvdmVycmlkZTsNCj4+ICsgIHZvaWQg dmlzaXQgKEFTVDo6Rm9yTG9vcEV4cHIgJmV4cHIpIG92ZXJyaWRlOw0KPj4gKyAgdm9pZCB2 aXNpdCAoQVNUOjpJZkV4cHIgJmV4cHIpIG92ZXJyaWRlOw0KPj4gKyAgdm9pZCB2aXNpdCAo QVNUOjpJZkV4cHJDb25zZXFFbHNlICZleHByKSBvdmVycmlkZTsNCj4+ICsgIHZvaWQgdmlz aXQgKEFTVDo6SWZFeHByQ29uc2VxSWYgJmV4cHIpIG92ZXJyaWRlOw0KPj4gKyAgdm9pZCB2 aXNpdCAoQVNUOjpJZkV4cHJDb25zZXFJZkxldCAmZXhwcikgb3ZlcnJpZGU7DQo+PiArICB2 b2lkIHZpc2l0IChBU1Q6OklmTGV0RXhwciAmZXhwcikgb3ZlcnJpZGU7DQo+PiArICB2b2lk IHZpc2l0IChBU1Q6OklmTGV0RXhwckNvbnNlcUVsc2UgJmV4cHIpIG92ZXJyaWRlOw0KPj4g KyAgdm9pZCB2aXNpdCAoQVNUOjpJZkxldEV4cHJDb25zZXFJZiAmZXhwcikgb3ZlcnJpZGU7 DQo+PiArICB2b2lkIHZpc2l0IChBU1Q6OklmTGV0RXhwckNvbnNlcUlmTGV0ICZleHByKSBv dmVycmlkZTsNCj4+ICsgIHZvaWQgdmlzaXQgKEFTVDo6TWF0Y2hFeHByICZleHByKSBvdmVy cmlkZTsNCj4+ICsgIHZvaWQgdmlzaXQgKEFTVDo6QXdhaXRFeHByICZleHByKSBvdmVycmlk ZTsNCj4+ICsgIHZvaWQgdmlzaXQgKEFTVDo6QXN5bmNCbG9ja0V4cHIgJmV4cHIpIG92ZXJy aWRlOw0KPj4gKyAgdm9pZCB2aXNpdCAoQVNUOjpUeXBlUGFyYW0gJnBhcmFtKSBvdmVycmlk ZTsNCj4+ICsgIHZvaWQgdmlzaXQgKEFTVDo6TGlmZXRpbWVXaGVyZUNsYXVzZUl0ZW0gJikg b3ZlcnJpZGU7DQo+PiArICB2b2lkIHZpc2l0IChBU1Q6OlR5cGVCb3VuZFdoZXJlQ2xhdXNl SXRlbSAmaXRlbSkgb3ZlcnJpZGU7DQo+PiArICB2b2lkIHZpc2l0IChBU1Q6Ok1ldGhvZCAm bWV0aG9kKSBvdmVycmlkZTsNCj4+ICsgIHZvaWQgdmlzaXQgKEFTVDo6TW9kdWxlICZtb2R1 bGUpIG92ZXJyaWRlOw0KPj4gKyAgdm9pZCB2aXNpdCAoQVNUOjpFeHRlcm5DcmF0ZSAmY3Jh dGUpIG92ZXJyaWRlOw0KPj4gKyAgdm9pZCB2aXNpdCAoQVNUOjpVc2VUcmVlR2xvYiAmKSBv dmVycmlkZTsNCj4+ICsgIHZvaWQgdmlzaXQgKEFTVDo6VXNlVHJlZUxpc3QgJikgb3ZlcnJp ZGU7DQo+PiArICB2b2lkIHZpc2l0IChBU1Q6OlVzZVRyZWVSZWJpbmQgJikgb3ZlcnJpZGU7 DQo+PiArICB2b2lkIHZpc2l0IChBU1Q6OlVzZURlY2xhcmF0aW9uICZ1c2VfZGVjbCkgb3Zl cnJpZGU7DQo+PiArICB2b2lkIHZpc2l0IChBU1Q6OkZ1bmN0aW9uICZmdW5jdGlvbikgb3Zl cnJpZGU7DQo+PiArICB2b2lkIHZpc2l0IChBU1Q6OlR5cGVBbGlhcyAmdHlwZV9hbGlhcykg b3ZlcnJpZGU7DQo+PiArICB2b2lkIHZpc2l0IChBU1Q6OlN0cnVjdFN0cnVjdCAmc3RydWN0 X2l0ZW0pIG92ZXJyaWRlOw0KPj4gKyAgdm9pZCB2aXNpdCAoQVNUOjpUdXBsZVN0cnVjdCAm dHVwbGVfc3RydWN0KSBvdmVycmlkZTsNCj4+ICsgIHZvaWQgdmlzaXQgKEFTVDo6RW51bUl0 ZW0gJml0ZW0pIG92ZXJyaWRlOw0KPj4gKyAgdm9pZCB2aXNpdCAoQVNUOjpFbnVtSXRlbVR1 cGxlICZpdGVtKSBvdmVycmlkZTsNCj4+ICsgIHZvaWQgdmlzaXQgKEFTVDo6RW51bUl0ZW1T dHJ1Y3QgJml0ZW0pIG92ZXJyaWRlOw0KPj4gKyAgdm9pZCB2aXNpdCAoQVNUOjpFbnVtSXRl bURpc2NyaW1pbmFudCAmaXRlbSkgb3ZlcnJpZGU7DQo+PiArICB2b2lkIHZpc2l0IChBU1Q6 OkVudW0gJmVudW1faXRlbSkgb3ZlcnJpZGU7DQo+PiArICB2b2lkIHZpc2l0IChBU1Q6OlVu aW9uICZ1bmlvbl9pdGVtKSBvdmVycmlkZTsNCj4+ICsgIHZvaWQgdmlzaXQgKEFTVDo6Q29u c3RhbnRJdGVtICZjb25zdF9pdGVtKSBvdmVycmlkZTsNCj4+ICsgIHZvaWQgdmlzaXQgKEFT VDo6U3RhdGljSXRlbSAmc3RhdGljX2l0ZW0pIG92ZXJyaWRlOw0KPj4gKyAgdm9pZCB2aXNp dCAoQVNUOjpUcmFpdEl0ZW1GdW5jICZpdGVtKSBvdmVycmlkZTsNCj4+ICsgIHZvaWQgdmlz aXQgKEFTVDo6VHJhaXRJdGVtTWV0aG9kICZpdGVtKSBvdmVycmlkZTsNCj4+ICsgIHZvaWQg dmlzaXQgKEFTVDo6VHJhaXRJdGVtQ29uc3QgJml0ZW0pIG92ZXJyaWRlOw0KPj4gKyAgdm9p ZCB2aXNpdCAoQVNUOjpUcmFpdEl0ZW1UeXBlICZpdGVtKSBvdmVycmlkZTsNCj4+ICsgIHZv aWQgdmlzaXQgKEFTVDo6VHJhaXQgJnRyYWl0KSBvdmVycmlkZTsNCj4+ICsgIHZvaWQgdmlz aXQgKEFTVDo6SW5oZXJlbnRJbXBsICZpbXBsKSBvdmVycmlkZTsNCj4+ICsgIHZvaWQgdmlz aXQgKEFTVDo6VHJhaXRJbXBsICZpbXBsKSBvdmVycmlkZTsNCj4+ICsgIHZvaWQgdmlzaXQg KEFTVDo6RXh0ZXJuYWxTdGF0aWNJdGVtICZpdGVtKSBvdmVycmlkZTsNCj4+ICsgIHZvaWQg dmlzaXQgKEFTVDo6RXh0ZXJuYWxGdW5jdGlvbkl0ZW0gJml0ZW0pIG92ZXJyaWRlOw0KPj4g KyAgdm9pZCB2aXNpdCAoQVNUOjpFeHRlcm5CbG9jayAmYmxvY2spIG92ZXJyaWRlOw0KPj4g Kw0KPj4gKyAgLy8gSSBkb24ndCB0aGluayBpdCB3b3VsZCBiZSBwb3NzaWJsZSB0byBzdHJp cCBtYWNyb3Mgd2l0aG91dCBleHBhbnNpb24NCj4+ICsgIHZvaWQgdmlzaXQgKEFTVDo6TWFj cm9NYXRjaEZyYWdtZW50ICYpIG92ZXJyaWRlOw0KPj4gKyAgdm9pZCB2aXNpdCAoQVNUOjpN YWNyb01hdGNoUmVwZXRpdGlvbiAmKSBvdmVycmlkZTsNCj4+ICsgIHZvaWQgdmlzaXQgKEFT VDo6TWFjcm9NYXRjaGVyICYpIG92ZXJyaWRlOw0KPj4gKyAgdm9pZCB2aXNpdCAoQVNUOjpN YWNyb1J1bGVzRGVmaW5pdGlvbiAmcnVsZXNfZGVmKSBvdmVycmlkZTsNCj4+ICsgIHZvaWQg dmlzaXQgKEFTVDo6TWV0YUl0ZW1QYXRoICYpIG92ZXJyaWRlOw0KPj4gKyAgdm9pZCB2aXNp dCAoQVNUOjpNZXRhSXRlbVNlcSAmKSBvdmVycmlkZTsNCj4+ICsgIHZvaWQgdmlzaXQgKEFT VDo6TWV0YVdvcmQgJikgb3ZlcnJpZGU7DQo+PiArICB2b2lkIHZpc2l0IChBU1Q6Ok1ldGFO YW1lVmFsdWVTdHIgJikgb3ZlcnJpZGU7DQo+PiArICB2b2lkIHZpc2l0IChBU1Q6Ok1ldGFM aXN0UGF0aHMgJikgb3ZlcnJpZGU7DQo+PiArICB2b2lkIHZpc2l0IChBU1Q6Ok1ldGFMaXN0 TmFtZVZhbHVlU3RyICYpIG92ZXJyaWRlOw0KPj4gKyAgdm9pZCB2aXNpdCAoQVNUOjpMaXRl cmFsUGF0dGVybiAmKSBvdmVycmlkZTsNCj4+ICsgIHZvaWQgdmlzaXQgKEFTVDo6SWRlbnRp ZmllclBhdHRlcm4gJnBhdHRlcm4pIG92ZXJyaWRlOw0KPj4gKyAgdm9pZCB2aXNpdCAoQVNU OjpXaWxkY2FyZFBhdHRlcm4gJikgb3ZlcnJpZGU7DQo+PiArICB2b2lkIHZpc2l0IChBU1Q6 OlJhbmdlUGF0dGVybkJvdW5kTGl0ZXJhbCAmKSBvdmVycmlkZTsNCj4+ICsgIHZvaWQgdmlz aXQgKEFTVDo6UmFuZ2VQYXR0ZXJuQm91bmRQYXRoICZib3VuZCkgb3ZlcnJpZGU7DQo+PiAr ICB2b2lkIHZpc2l0IChBU1Q6OlJhbmdlUGF0dGVybkJvdW5kUXVhbFBhdGggJmJvdW5kKSBv dmVycmlkZTsNCj4+ICsgIHZvaWQgdmlzaXQgKEFTVDo6UmFuZ2VQYXR0ZXJuICZwYXR0ZXJu KSBvdmVycmlkZTsNCj4+ICsgIHZvaWQgdmlzaXQgKEFTVDo6UmVmZXJlbmNlUGF0dGVybiAm cGF0dGVybikgb3ZlcnJpZGU7DQo+PiArICB2b2lkIHZpc2l0IChBU1Q6OlN0cnVjdFBhdHRl cm5GaWVsZFR1cGxlUGF0ICZmaWVsZCkgb3ZlcnJpZGU7DQo+PiArICB2b2lkIHZpc2l0IChB U1Q6OlN0cnVjdFBhdHRlcm5GaWVsZElkZW50UGF0ICZmaWVsZCkgb3ZlcnJpZGU7DQo+PiAr ICB2b2lkIHZpc2l0IChBU1Q6OlN0cnVjdFBhdHRlcm5GaWVsZElkZW50ICZmaWVsZCkgb3Zl cnJpZGU7DQo+PiArICB2b2lkIHZpc2l0IChBU1Q6OlN0cnVjdFBhdHRlcm4gJnBhdHRlcm4p IG92ZXJyaWRlOw0KPj4gKyAgdm9pZCB2aXNpdCAoQVNUOjpUdXBsZVN0cnVjdEl0ZW1zTm9S YW5nZSAmdHVwbGVfaXRlbXMpIG92ZXJyaWRlOw0KPj4gKyAgdm9pZCB2aXNpdCAoQVNUOjpU dXBsZVN0cnVjdEl0ZW1zUmFuZ2UgJnR1cGxlX2l0ZW1zKSBvdmVycmlkZTsNCj4+ICsgIHZv aWQgdmlzaXQgKEFTVDo6VHVwbGVTdHJ1Y3RQYXR0ZXJuICZwYXR0ZXJuKSBvdmVycmlkZTsN Cj4+ICsgIHZvaWQgdmlzaXQgKEFTVDo6VHVwbGVQYXR0ZXJuSXRlbXNNdWx0aXBsZSAmdHVw bGVfaXRlbXMpIG92ZXJyaWRlOw0KPj4gKyAgdm9pZCB2aXNpdCAoQVNUOjpUdXBsZVBhdHRl cm5JdGVtc1JhbmdlZCAmdHVwbGVfaXRlbXMpIG92ZXJyaWRlOw0KPj4gKyAgdm9pZCB2aXNp dCAoQVNUOjpUdXBsZVBhdHRlcm4gJnBhdHRlcm4pIG92ZXJyaWRlOw0KPj4gKyAgdm9pZCB2 aXNpdCAoQVNUOjpHcm91cGVkUGF0dGVybiAmcGF0dGVybikgb3ZlcnJpZGU7DQo+PiArICB2 b2lkIHZpc2l0IChBU1Q6OlNsaWNlUGF0dGVybiAmcGF0dGVybikgb3ZlcnJpZGU7DQo+PiAr DQo+PiArICB2b2lkIHZpc2l0IChBU1Q6OkVtcHR5U3RtdCAmKSBvdmVycmlkZTsNCj4+ICsg IHZvaWQgdmlzaXQgKEFTVDo6TGV0U3RtdCAmc3RtdCkgb3ZlcnJpZGU7DQo+PiArICB2b2lk IHZpc2l0IChBU1Q6OkV4cHJTdG10V2l0aG91dEJsb2NrICZzdG10KSBvdmVycmlkZTsNCj4+ ICsgIHZvaWQgdmlzaXQgKEFTVDo6RXhwclN0bXRXaXRoQmxvY2sgJnN0bXQpIG92ZXJyaWRl Ow0KPj4gKw0KPj4gKyAgdm9pZCB2aXNpdCAoQVNUOjpUcmFpdEJvdW5kICZib3VuZCkgb3Zl cnJpZGU7DQo+PiArICB2b2lkIHZpc2l0IChBU1Q6OkltcGxUcmFpdFR5cGUgJnR5cGUpIG92 ZXJyaWRlOw0KPj4gKyAgdm9pZCB2aXNpdCAoQVNUOjpUcmFpdE9iamVjdFR5cGUgJnR5cGUp IG92ZXJyaWRlOw0KPj4gKyAgdm9pZCB2aXNpdCAoQVNUOjpQYXJlbnRoZXNpc2VkVHlwZSAm dHlwZSkgb3ZlcnJpZGU7DQo+PiArICB2b2lkIHZpc2l0IChBU1Q6OkltcGxUcmFpdFR5cGVP bmVCb3VuZCAmdHlwZSkgb3ZlcnJpZGU7DQo+PiArICB2b2lkIHZpc2l0IChBU1Q6OlRyYWl0 T2JqZWN0VHlwZU9uZUJvdW5kICZ0eXBlKSBvdmVycmlkZTsNCj4+ICsgIHZvaWQgdmlzaXQg KEFTVDo6VHVwbGVUeXBlICZ0eXBlKSBvdmVycmlkZTsNCj4+ICsgIHZvaWQgdmlzaXQgKEFT VDo6TmV2ZXJUeXBlICYpIG92ZXJyaWRlOw0KPj4gKyAgdm9pZCB2aXNpdCAoQVNUOjpSYXdQ b2ludGVyVHlwZSAmdHlwZSkgb3ZlcnJpZGU7DQo+PiArICB2b2lkIHZpc2l0IChBU1Q6OlJl ZmVyZW5jZVR5cGUgJnR5cGUpIG92ZXJyaWRlOw0KPj4gKyAgdm9pZCB2aXNpdCAoQVNUOjpB cnJheVR5cGUgJnR5cGUpIG92ZXJyaWRlOw0KPj4gKyAgdm9pZCB2aXNpdCAoQVNUOjpTbGlj ZVR5cGUgJnR5cGUpIG92ZXJyaWRlOw0KPj4gKyAgdm9pZCB2aXNpdCAoQVNUOjpJbmZlcnJl ZFR5cGUgJikgb3ZlcnJpZGU7DQo+PiArICB2b2lkIHZpc2l0IChBU1Q6OkJhcmVGdW5jdGlv blR5cGUgJnR5cGUpIG92ZXJyaWRlOw0KPj4gK307DQo+PiArfSAvLyBuYW1lc3BhY2UgUnVz dA0KPj4gZGlmZiAtLWdpdCBhL2djYy9ydXN0L2V4cGFuZC9ydXN0LW1hY3JvLWJ1aWx0aW5z LmNjIGIvZ2NjL3J1c3QvZXhwYW5kL3J1c3QtbWFjcm8tYnVpbHRpbnMuY2MNCj4+IG5ldyBm aWxlIG1vZGUgMTAwNjQ0DQo+PiBpbmRleCAwMDAwMDAwMDAwMC4uNWVhY2UxM2QxOTcNCj4+ IC0tLSAvZGV2L251bGwNCj4+ICsrKyBiL2djYy9ydXN0L2V4cGFuZC9ydXN0LW1hY3JvLWJ1 aWx0aW5zLmNjDQo+PiBAQCAtMCwwICsxLDQ4NCBAQA0KPj4gKy8vIENvcHlyaWdodCAoQykg MjAyMC0yMDIyIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLg0KPj4gKw0KPj4gKy8v IFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEdDQy4NCj4+ICsNCj4+ICsvLyBHQ0MgaXMgZnJlZSBz b2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdCB1bmRl cg0KPj4gKy8vIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2Ug YXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlDQo+PiArLy8gU29mdHdhcmUgRm91bmRhdGlvbjsg ZWl0aGVyIHZlcnNpb24gMywgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXINCj4+ICsv LyB2ZXJzaW9uLg0KPj4gKw0KPj4gKy8vIEdDQyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9w ZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVCBBTlkNCj4+ICsvLyBXQVJS QU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJ TElUWSBvcg0KPj4gKy8vIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2Vl IHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQ0KPj4gKy8vIGZvciBtb3JlIGRldGFp bHMuDQo+PiArDQo+PiArLy8gWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0 aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UNCj4+ICsvLyBhbG9uZyB3aXRoIEdDQzsg c2VlIHRoZSBmaWxlIENPUFlJTkczLiAgSWYgbm90IHNlZQ0KPj4gKy8vIDxodHRwOi8vd3d3 LmdudS5vcmcvbGljZW5zZXMvPi4NCj4+ICsNCj4+ICsjaW5jbHVkZSAicnVzdC1tYWNyby1i dWlsdGlucy5oIg0KPj4gKyNpbmNsdWRlICJydXN0LWRpYWdub3N0aWNzLmgiDQo+PiArI2lu Y2x1ZGUgInJ1c3QtZXhwci5oIg0KPj4gKyNpbmNsdWRlICJydXN0LXNlc3Npb24tbWFuYWdl ci5oIg0KPj4gKyNpbmNsdWRlICJydXN0LW1hY3JvLWludm9jLWxleGVyLmgiDQo+PiArI2lu Y2x1ZGUgInJ1c3QtbGV4LmgiDQo+PiArI2luY2x1ZGUgInJ1c3QtcGFyc2UuaCINCj4+ICsN Cj4+ICtuYW1lc3BhY2UgUnVzdCB7DQo+PiArbmFtZXNwYWNlIHsNCj4+ICtzdGQ6OnVuaXF1 ZV9wdHI8QVNUOjpFeHByPg0KPj4gK21ha2Vfc3RyaW5nIChMb2NhdGlvbiBsb2N1cywgc3Rk OjpzdHJpbmcgdmFsdWUpDQo+PiArew0KPj4gKyAgcmV0dXJuIHN0ZDo6dW5pcXVlX3B0cjxB U1Q6OkV4cHI+ICgNCj4+ICsgICAgbmV3IEFTVDo6TGl0ZXJhbEV4cHIgKHZhbHVlLCBBU1Q6 OkxpdGVyYWw6OlNUUklORywNCj4+ICsgICAgICAgICAgICAgICAgICAgICAgICAgUHJpbWl0 aXZlQ29yZVR5cGU6OkNPUkVUWVBFX1NUUiwge30sIGxvY3VzKSk7DQo+PiArfQ0KPj4gKw0K Pj4gKy8qIE1hdGNoIHRoZSBlbmQgdG9rZW4gb2YgYSBtYWNybyBnaXZlbiB0aGUgc3RhcnQg ZGVsaW1pdGVyIG9mIHRoZSBtYWNybyAqLw0KPj4gKw0KPj4gK3N0YXRpYyBpbmxpbmUgVG9r ZW5JZA0KPj4gK21hY3JvX2VuZF90b2tlbiAoQVNUOjpEZWxpbVRva2VuVHJlZSAmaW52b2Nf dG9rZW5fdHJlZSwNCj4+ICsgICAgICAgICAgICAgICAgUGFyc2VyPE1hY3JvSW52b2NMZXhl cj4gJnBhcnNlcikNCj4+ICt7DQo+PiArICBhdXRvIGxhc3RfdG9rZW5faWQgPSBUb2tlbklk OjpSSUdIVF9DVVJMWTsNCj4+ICsgIHN3aXRjaCAoaW52b2NfdG9rZW5fdHJlZS5nZXRfZGVs aW1fdHlwZSAoKSkNCj4+ICsgICAgew0KPj4gKyAgICBjYXNlIEFTVDo6RGVsaW1UeXBlOjpQ QVJFTlM6DQo+PiArICAgICAgbGFzdF90b2tlbl9pZCA9IFRva2VuSWQ6OlJJR0hUX1BBUkVO Ow0KPj4gKyAgICAgIHJ1c3RfYXNzZXJ0IChwYXJzZXIuc2tpcF90b2tlbiAoTEVGVF9QQVJF TikpOw0KPj4gKyAgICAgIGJyZWFrOw0KPj4gKw0KPj4gKyAgICBjYXNlIEFTVDo6RGVsaW1U eXBlOjpDVVJMWToNCj4+ICsgICAgICBydXN0X2Fzc2VydCAocGFyc2VyLnNraXBfdG9rZW4g KExFRlRfQ1VSTFkpKTsNCj4+ICsgICAgICBicmVhazsNCj4+ICsNCj4+ICsgICAgY2FzZSBB U1Q6OkRlbGltVHlwZTo6U1FVQVJFOg0KPj4gKyAgICAgIGxhc3RfdG9rZW5faWQgPSBUb2tl bklkOjpSSUdIVF9TUVVBUkU7DQo+PiArICAgICAgcnVzdF9hc3NlcnQgKHBhcnNlci5za2lw X3Rva2VuIChMRUZUX1NRVUFSRSkpOw0KPj4gKyAgICAgIGJyZWFrOw0KPj4gKyAgICB9DQo+ PiArDQo+PiArICByZXR1cm4gbGFzdF90b2tlbl9pZDsNCj4+ICt9DQo+PiArDQo+PiArLyog UGFyc2UgYSBzaW5nbGUgc3RyaW5nIGxpdGVyYWwgZnJvbSB0aGUgZ2l2ZW4gZGVsaW1pdGVk IHRva2VuIHRyZWUsDQo+PiArICAgYW5kIHJldHVybiB0aGUgTGl0ZXJhbEV4cHIgZm9yIGl0 LiBBbGxvdyBmb3IgYW4gb3B0aW9uYWwgdHJhaWxpbmcgY29tbWEsDQo+PiArICAgYnV0IG90 aGVyd2lzZSBlbmZvcmNlIHRoYXQgdGhlc2UgYXJlIHRoZSBvbmx5IHRva2Vucy4gICovDQo+ PiArDQo+PiArc3RkOjp1bmlxdWVfcHRyPEFTVDo6TGl0ZXJhbEV4cHI+DQo+PiArcGFyc2Vf c2luZ2xlX3N0cmluZ19saXRlcmFsIChBU1Q6OkRlbGltVG9rZW5UcmVlICZpbnZvY190b2tl bl90cmVlLA0KPj4gKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBMb2NhdGlvbiBpbnZv Y19sb2N1cykNCj4+ICt7DQo+PiArICBNYWNyb0ludm9jTGV4ZXIgbGV4IChpbnZvY190b2tl bl90cmVlLnRvX3Rva2VuX3N0cmVhbSAoKSk7DQo+PiArICBQYXJzZXI8TWFjcm9JbnZvY0xl eGVyPiBwYXJzZXIgKGxleCk7DQo+PiArDQo+PiArICBhdXRvIGxhc3RfdG9rZW5faWQgPSBt YWNyb19lbmRfdG9rZW4gKGludm9jX3Rva2VuX3RyZWUsIHBhcnNlcik7DQo+PiArDQo+PiAr ICBzdGQ6OnVuaXF1ZV9wdHI8QVNUOjpMaXRlcmFsRXhwcj4gbGl0X2V4cHIgPSBudWxscHRy Ow0KPj4gKw0KPj4gKyAgaWYgKHBhcnNlci5wZWVrX2N1cnJlbnRfdG9rZW4gKCktPmdldF9p ZCAoKSA9PSBTVFJJTkdfTElURVJBTCkNCj4+ICsgICAgew0KPj4gKyAgICAgIGxpdF9leHBy ID0gcGFyc2VyLnBhcnNlX2xpdGVyYWxfZXhwciAoKTsNCj4+ICsgICAgICBwYXJzZXIubWF5 YmVfc2tpcF90b2tlbiAoQ09NTUEpOw0KPj4gKyAgICAgIGlmIChwYXJzZXIucGVla19jdXJy ZW50X3Rva2VuICgpLT5nZXRfaWQgKCkgIT0gbGFzdF90b2tlbl9pZCkNCj4+ICsgICAgICAg ew0KPj4gKyAgICAgICAgIGxpdF9leHByID0gbnVsbHB0cjsNCj4+ICsgICAgICAgICBydXN0 X2Vycm9yX2F0IChpbnZvY19sb2N1cywgIm1hY3JvIHRha2VzIDEgYXJndW1lbnQiKTsNCj4+ ICsgICAgICAgfQ0KPj4gKyAgICB9DQo+PiArICBlbHNlIGlmIChwYXJzZXIucGVla19jdXJy ZW50X3Rva2VuICgpLT5nZXRfaWQgKCkgPT0gbGFzdF90b2tlbl9pZCkNCj4+ICsgICAgcnVz dF9lcnJvcl9hdCAoaW52b2NfbG9jdXMsICJtYWNybyB0YWtlcyAxIGFyZ3VtZW50Iik7DQo+ PiArICBlbHNlDQo+PiArICAgIHJ1c3RfZXJyb3JfYXQgKGludm9jX2xvY3VzLCAiYXJndW1l bnQgbXVzdCBiZSBhIHN0cmluZyBsaXRlcmFsIik7DQo+PiArDQo+PiArICBwYXJzZXIuc2tp cF90b2tlbiAobGFzdF90b2tlbl9pZCk7DQo+PiArDQo+PiArICByZXR1cm4gbGl0X2V4cHI7 DQo+PiArfQ0KPj4gKw0KPj4gKy8qIFRyZWF0IFBBVEggYXMgYSBwYXRoIHJlbGF0aXZlIHRv IHRoZSBzb3VyY2UgZmlsZSBjdXJyZW50bHkgYmVpbmcNCj4+ICsgICBjb21waWxlZCwgYW5k IHJldHVybiB0aGUgYWJzb2x1dGUgcGF0aCBmb3IgaXQuICAqLw0KPj4gKw0KPj4gK3N0ZDo6 c3RyaW5nDQo+PiArc291cmNlX3JlbGF0aXZlX3BhdGggKHN0ZDo6c3RyaW5nIHBhdGgsIExv Y2F0aW9uIGxvY3VzKQ0KPj4gK3sNCj4+ICsgIHN0ZDo6c3RyaW5nIGNvbXBpbGVfZm5hbWUN Cj4+ICsgICAgPSBTZXNzaW9uOjpnZXRfaW5zdGFuY2UgKCkubGluZW1hcC0+bG9jYXRpb25f ZmlsZSAobG9jdXMpOw0KPj4gKw0KPj4gKyAgYXV0byBkaXJfc2VwYXJhdG9yX3BvcyA9IGNv bXBpbGVfZm5hbWUucmZpbmQgKGZpbGVfc2VwYXJhdG9yKTsNCj4+ICsNCj4+ICsgIC8qIElm IHRoZXJlIGlzIG5vIGZpbGVfc2VwYXJhdG9yIGluIHRoZSBwYXRoLCB1c2UgY3VycmVudCBk aXIgKCcuJykuICAqLw0KPj4gKyAgc3RkOjpzdHJpbmcgZGlybmFtZTsNCj4+ICsgIGlmIChk aXJfc2VwYXJhdG9yX3BvcyA9PSBzdGQ6OnN0cmluZzo6bnBvcykNCj4+ICsgICAgZGlybmFt ZSA9IHN0ZDo6c3RyaW5nICgiLiIpICsgZmlsZV9zZXBhcmF0b3I7DQo+PiArICBlbHNlDQo+ PiArICAgIGRpcm5hbWUgPSBjb21waWxlX2ZuYW1lLnN1YnN0ciAoMCwgZGlyX3NlcGFyYXRv cl9wb3MpICsgZmlsZV9zZXBhcmF0b3I7DQo+PiArDQo+PiArICByZXR1cm4gZGlybmFtZSAr IHBhdGg7DQo+PiArfQ0KPj4gKw0KPj4gKy8qIFJlYWQgdGhlIGZ1bGwgY29udGVudHMgb2Yg dGhlIGZpbGUgRklMRU5BTUUgYW5kIHJldHVybiB0aGVtIGluIGEgdmVjdG9yLg0KPj4gKyAg IEZJWE1FOiBwbGF0Zm9ybSBzcGVjaWZpYy4gICovDQo+PiArDQo+PiArc3RkOjp2ZWN0b3I8 dWludDhfdD4NCj4+ICtsb2FkX2ZpbGVfYnl0ZXMgKGNvbnN0IGNoYXIgKmZpbGVuYW1lKQ0K Pj4gK3sNCj4+ICsgIFJBSUlGaWxlIGZpbGVfd3JhcCAoZmlsZW5hbWUpOw0KPj4gKyAgaWYg KGZpbGVfd3JhcC5nZXRfcmF3ICgpID09IG51bGxwdHIpDQo+PiArICAgIHsNCj4+ICsgICAg ICBydXN0X2Vycm9yX2F0IChMb2NhdGlvbiAoKSwgImNhbm5vdCBvcGVuIGZpbGVuYW1lICVz OiAlbSIsIGZpbGVuYW1lKTsNCj4+ICsgICAgICByZXR1cm4gc3RkOjp2ZWN0b3I8dWludDhf dD4gKCk7DQo+PiArICAgIH0NCj4+ICsNCj4+ICsgIEZJTEUgKmYgPSBmaWxlX3dyYXAuZ2V0 X3JhdyAoKTsNCj4+ICsgIGZzZWVrIChmLCAwTCwgU0VFS19FTkQpOw0KPj4gKyAgbG9uZyBm c2l6ZSA9IGZ0ZWxsIChmKTsNCj4+ICsgIGZzZWVrIChmLCAwTCwgU0VFS19TRVQpOw0KPj4g Kw0KPj4gKyAgc3RkOjp2ZWN0b3I8dWludDhfdD4gYnVmIChmc2l6ZSk7DQo+PiArDQo+PiAr ICBpZiAoZnJlYWQgKCZidWZbMF0sIGZzaXplLCAxLCBmKSAhPSAxKQ0KPj4gKyAgICB7DQo+ PiArICAgICAgcnVzdF9lcnJvcl9hdCAoTG9jYXRpb24gKCksICJlcnJvciByZWFkaW5nIGZp bGUgJXM6ICVtIiwgZmlsZW5hbWUpOw0KPj4gKyAgICAgIHJldHVybiBzdGQ6OnZlY3Rvcjx1 aW50OF90PiAoKTsNCj4+ICsgICAgfQ0KPj4gKw0KPj4gKyAgcmV0dXJuIGJ1ZjsNCj4+ICt9 DQo+PiArfSAvLyBuYW1lc3BhY2UNCj4+ICsNCj4+ICtBU1Q6OkFTVEZyYWdtZW50DQo+PiAr TWFjcm9CdWlsdGluOjphc3NlcnQgKExvY2F0aW9uIGludm9jX2xvY3VzLCBBU1Q6Ok1hY3Jv SW52b2NEYXRhICZpbnZvYykNCj4+ICt7DQo+PiArICBydXN0X2RlYnVnICgiYXNzZXJ0ISgp IGNhbGxlZCIpOw0KPj4gKw0KPj4gKyAgcmV0dXJuIEFTVDo6QVNURnJhZ21lbnQ6OmNyZWF0 ZV9lcnJvciAoKTsNCj4+ICt9DQo+PiArDQo+PiArQVNUOjpBU1RGcmFnbWVudA0KPj4gK01h Y3JvQnVpbHRpbjo6ZmlsZSAoTG9jYXRpb24gaW52b2NfbG9jdXMsIEFTVDo6TWFjcm9JbnZv Y0RhdGEgJmludm9jKQ0KPj4gK3sNCj4+ICsgIGF1dG8gY3VycmVudF9maWxlDQo+PiArICAg ID0gU2Vzc2lvbjo6Z2V0X2luc3RhbmNlICgpLmxpbmVtYXAtPmxvY2F0aW9uX2ZpbGUgKGlu dm9jX2xvY3VzKTsNCj4+ICsgIGF1dG8gZmlsZV9zdHIgPSBBU1Q6OlNpbmdsZUFTVE5vZGUg KG1ha2Vfc3RyaW5nIChpbnZvY19sb2N1cywgY3VycmVudF9maWxlKSk7DQo+PiArDQo+PiAr ICByZXR1cm4gQVNUOjpBU1RGcmFnbWVudCAoe2ZpbGVfc3RyfSk7DQo+PiArfQ0KPj4gKw0K Pj4gK0FTVDo6QVNURnJhZ21lbnQNCj4+ICtNYWNyb0J1aWx0aW46OmNvbHVtbiAoTG9jYXRp b24gaW52b2NfbG9jdXMsIEFTVDo6TWFjcm9JbnZvY0RhdGEgJmludm9jKQ0KPj4gK3sNCj4+ ICsgIGF1dG8gY3VycmVudF9jb2x1bW4NCj4+ICsgICAgPSBTZXNzaW9uOjpnZXRfaW5zdGFu Y2UgKCkubGluZW1hcC0+bG9jYXRpb25fdG9fY29sdW1uIChpbnZvY19sb2N1cyk7DQo+PiAr DQo+PiArICBhdXRvIGNvbHVtbl9ubyA9IEFTVDo6U2luZ2xlQVNUTm9kZSAoc3RkOjp1bmlx dWVfcHRyPEFTVDo6RXhwcj4gKA0KPj4gKyAgICBuZXcgQVNUOjpMaXRlcmFsRXhwciAoc3Rk Ojp0b19zdHJpbmcgKGN1cnJlbnRfY29sdW1uKSwgQVNUOjpMaXRlcmFsOjpJTlQsDQo+PiAr ICAgICAgICAgICAgICAgICAgICAgICAgIFByaW1pdGl2ZUNvcmVUeXBlOjpDT1JFVFlQRV9V MzIsIHt9LCBpbnZvY19sb2N1cykpKTsNCj4+ICsNCj4+ICsgIHJldHVybiBBU1Q6OkFTVEZy YWdtZW50ICh7Y29sdW1uX25vfSk7DQo+PiArfQ0KPj4gKw0KPj4gKy8qIEV4cGFuZCBidWls dGluIG1hY3JvIGluY2x1ZGVfYnl0ZXMhKCJmaWxlbmFtZSIpLCB3aGljaCBpbmNsdWRlcyB0 aGUgY29udGVudHMNCj4+ICsgICBvZiB0aGUgZ2l2ZW4gZmlsZSBhcyByZWZlcmVuY2UgdG8g YSBieXRlIGFycmF5LiBZaWVsZHMgYW4gZXhwcmVzc2lvbiBvZiB0eXBlDQo+PiArICAgJidz dGF0aWMgW3U4OyBOXS4gICovDQo+PiArDQo+PiArQVNUOjpBU1RGcmFnbWVudA0KPj4gK01h Y3JvQnVpbHRpbjo6aW5jbHVkZV9ieXRlcyAoTG9jYXRpb24gaW52b2NfbG9jdXMsIEFTVDo6 TWFjcm9JbnZvY0RhdGEgJmludm9jKQ0KPj4gK3sNCj4+ICsgIC8qIEdldCB0YXJnZXQgZmls ZW5hbWUgZnJvbSB0aGUgbWFjcm8gaW52b2NhdGlvbiwgd2hpY2ggaXMgdHJlYXRlZCBhcyBh IHBhdGgNCj4+ICsgICAgIHJlbGF0aXZlIHRvIHRoZSBpbmNsdWRlIS1pbmcgZmlsZSAoY3Vy cmVudGx5IGJlaW5nIGNvbXBpbGVkKS4gICovDQo+PiArICBhdXRvIGxpdF9leHByDQo+PiAr ICAgID0gcGFyc2Vfc2luZ2xlX3N0cmluZ19saXRlcmFsIChpbnZvYy5nZXRfZGVsaW1fdG9r X3RyZWUgKCksIGludm9jX2xvY3VzKTsNCj4+ICsgIGlmIChsaXRfZXhwciA9PSBudWxscHRy KQ0KPj4gKyAgICByZXR1cm4gQVNUOjpBU1RGcmFnbWVudDo6Y3JlYXRlX2Vycm9yICgpOw0K Pj4gKw0KPj4gKyAgc3RkOjpzdHJpbmcgdGFyZ2V0X2ZpbGVuYW1lDQo+PiArICAgID0gc291 cmNlX3JlbGF0aXZlX3BhdGggKGxpdF9leHByLT5hc19zdHJpbmcgKCksIGludm9jX2xvY3Vz KTsNCj4+ICsNCj4+ICsgIHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+IGJ5dGVzID0gbG9hZF9maWxl X2J5dGVzICh0YXJnZXRfZmlsZW5hbWUuY19zdHIgKCkpOw0KPj4gKw0KPj4gKyAgLyogSXMg dGhlcmUgYSBtb3JlIGVmZmljaWVudCB3YXkgdG8gZG8gdGhpcz8gICovDQo+IA0KPiBXZWxs LCBmaXJzdCBvZiBhbGwgeW91IGRvbid0IG5lZWQgdG8gcmVhZCBhbGwgb2YgdGhlIGZpbGUg YXQgb25jZSwgc2Vjb25kIHlvdQ0KPiBjb3VsZCBwcmUtYWxsb2NhdGUgJ2VsdHMnIHRvIHRo ZSBjb3JyZWN0IHNpemUgYW5kIGZpbmFsIHlvdSBjb3VsZCBvYnZpb3VzbHkNCj4gY2hvb3Nl IGEgY2hlYXBlciByZXByZXNlbnRhdGlvbiA7KQ0KPiANCj4+ICsgIHN0ZDo6dmVjdG9yPHN0 ZDo6dW5pcXVlX3B0cjxBU1Q6OkV4cHI+PiBlbHRzOw0KPj4gKyAgZm9yICh1aW50OF90IGIg OiBieXRlcykNCj4+ICsgICAgew0KPj4gKyAgICAgIGVsdHMuZW1wbGFjZV9iYWNrICgNCj4+ ICsgICAgICAgbmV3IEFTVDo6TGl0ZXJhbEV4cHIgKHN0ZDo6c3RyaW5nICgxLCAoY2hhcikg YiksIEFTVDo6TGl0ZXJhbDo6QllURSwNCj4+ICsgICAgICAgICAgICAgICAgICAgICAgICAg ICAgIFByaW1pdGl2ZUNvcmVUeXBlOjpDT1JFVFlQRV9VOCwNCj4+ICsgICAgICAgICAgICAg ICAgICAgICAgICAgICAgIHt9IC8qIG91dGVyX2F0dHJzICovLCBpbnZvY19sb2N1cykpOw0K Pj4gKyAgICB9DQo+PiArDQo+PiArICBhdXRvIGVsZW1zID0gc3RkOjp1bmlxdWVfcHRyPEFT VDo6QXJyYXlFbGVtcz4gKA0KPj4gKyAgICBuZXcgQVNUOjpBcnJheUVsZW1zVmFsdWVzIChz dGQ6Om1vdmUgKGVsdHMpLCBpbnZvY19sb2N1cykpOw0KPj4gKw0KPj4gKyAgYXV0byBhcnJh eSA9IHN0ZDo6dW5pcXVlX3B0cjxBU1Q6OkV4cHI+ICgNCj4+ICsgICAgbmV3IEFTVDo6QXJy YXlFeHByIChzdGQ6Om1vdmUgKGVsZW1zKSwge30sIHt9LCBpbnZvY19sb2N1cykpOw0KPj4g Kw0KPj4gKyAgYXV0byBib3Jyb3cgPSBzdGQ6OnVuaXF1ZV9wdHI8QVNUOjpFeHByPiAoDQo+ PiArICAgIG5ldyBBU1Q6OkJvcnJvd0V4cHIgKHN0ZDo6bW92ZSAoYXJyYXkpLCBmYWxzZSwg ZmFsc2UsIHt9LCBpbnZvY19sb2N1cykpOw0KPj4gKw0KPj4gKyAgYXV0byBub2RlID0gQVNU OjpTaW5nbGVBU1ROb2RlIChzdGQ6Om1vdmUgKGJvcnJvdykpOw0KPj4gKyAgcmV0dXJuIEFT VDo6QVNURnJhZ21lbnQgKHtub2RlfSk7DQo+PiArfQ0KPj4gKw0KPj4gKy8qIEV4cGFuZCBi dWlsdGluIG1hY3JvIGluY2x1ZGVfc3RyISgiZmlsZW5hbWUiKSwgd2hpY2ggaW5jbHVkZXMg dGhlIGNvbnRlbnRzDQo+PiArICAgb2YgdGhlIGdpdmVuIGZpbGUgYXMgYSBzdHJpbmcuIFRo ZSBmaWxlIG11c3QgYmUgVVRGLTggZW5jb2RlZC4gWWllbGRzIGFuDQo+PiArICAgZXhwcmVz c2lvbiBvZiB0eXBlICYnc3RhdGljIHN0ci4gICovDQo+PiArDQo+PiArQVNUOjpBU1RGcmFn bWVudA0KPj4gK01hY3JvQnVpbHRpbjo6aW5jbHVkZV9zdHIgKExvY2F0aW9uIGludm9jX2xv Y3VzLCBBU1Q6Ok1hY3JvSW52b2NEYXRhICZpbnZvYykNCj4+ICt7DQo+PiArICAvKiBHZXQg dGFyZ2V0IGZpbGVuYW1lIGZyb20gdGhlIG1hY3JvIGludm9jYXRpb24sIHdoaWNoIGlzIHRy ZWF0ZWQgYXMgYSBwYXRoDQo+PiArICAgICByZWxhdGl2ZSB0byB0aGUgaW5jbHVkZSEtaW5n IGZpbGUgKGN1cnJlbnRseSBiZWluZyBjb21waWxlZCkuICAqLw0KPj4gKyAgYXV0byBsaXRf ZXhwcg0KPj4gKyAgICA9IHBhcnNlX3NpbmdsZV9zdHJpbmdfbGl0ZXJhbCAoaW52b2MuZ2V0 X2RlbGltX3Rva190cmVlICgpLCBpbnZvY19sb2N1cyk7DQo+PiArICBpZiAobGl0X2V4cHIg PT0gbnVsbHB0cikNCj4+ICsgICAgcmV0dXJuIEFTVDo6QVNURnJhZ21lbnQ6OmNyZWF0ZV9l cnJvciAoKTsNCj4+ICsNCj4+ICsgIHN0ZDo6c3RyaW5nIHRhcmdldF9maWxlbmFtZQ0KPj4g KyAgICA9IHNvdXJjZV9yZWxhdGl2ZV9wYXRoIChsaXRfZXhwci0+YXNfc3RyaW5nICgpLCBp bnZvY19sb2N1cyk7DQo+PiArDQo+PiArICBzdGQ6OnZlY3Rvcjx1aW50OF90PiBieXRlcyA9 IGxvYWRfZmlsZV9ieXRlcyAodGFyZ2V0X2ZpbGVuYW1lLmNfc3RyICgpKTsNCj4+ICsNCj4+ ICsgIC8qIEZJWE1FOiBFbmZvcmNlIHRoYXQgdGhlIGZpbGUgY29udGVudHMgYXJlIHZhbGlk IFVURi04LiAgKi8NCj4+ICsgIHN0ZDo6c3RyaW5nIHN0ciAoKGNvbnN0IGNoYXIgKikgJmJ5 dGVzWzBdLCBieXRlcy5zaXplICgpKTsNCj4+ICsNCj4+ICsgIGF1dG8gbm9kZSA9IEFTVDo6 U2luZ2xlQVNUTm9kZSAobWFrZV9zdHJpbmcgKGludm9jX2xvY3VzLCBzdHIpKTsNCj4+ICsg IHJldHVybiBBU1Q6OkFTVEZyYWdtZW50ICh7bm9kZX0pOw0KPj4gK30NCj4+ICsNCj4+ICsv KiBFeHBhbmQgYnVpbHRpbiBtYWNybyBjb21waWxlX2Vycm9yISgiZXJyb3IiKSwgd2hpY2gg Zm9yY2VzIGEgY29tcGlsZSBlcnJvcg0KPj4gKyAgIGR1cmluZyB0aGUgY29tcGlsZSB0aW1l LiAqLw0KPj4gK0FTVDo6QVNURnJhZ21lbnQNCj4+ICtNYWNyb0J1aWx0aW46OmNvbXBpbGVf ZXJyb3IgKExvY2F0aW9uIGludm9jX2xvY3VzLCBBU1Q6Ok1hY3JvSW52b2NEYXRhICZpbnZv YykNCj4+ICt7DQo+PiArICBhdXRvIGxpdF9leHByDQo+PiArICAgID0gcGFyc2Vfc2luZ2xl X3N0cmluZ19saXRlcmFsIChpbnZvYy5nZXRfZGVsaW1fdG9rX3RyZWUgKCksIGludm9jX2xv Y3VzKTsNCj4+ICsgIGlmIChsaXRfZXhwciA9PSBudWxscHRyKQ0KPj4gKyAgICByZXR1cm4g QVNUOjpBU1RGcmFnbWVudDo6Y3JlYXRlX2Vycm9yICgpOw0KPj4gKw0KPj4gKyAgc3RkOjpz dHJpbmcgZXJyb3Jfc3RyaW5nID0gbGl0X2V4cHItPmFzX3N0cmluZyAoKTsNCj4+ICsgIHJ1 c3RfZXJyb3JfYXQgKGludm9jX2xvY3VzLCAiJXMiLCBlcnJvcl9zdHJpbmcuY19zdHIgKCkp Ow0KPj4gKw0KPj4gKyAgcmV0dXJuIEFTVDo6QVNURnJhZ21lbnQ6OmNyZWF0ZV9lcnJvciAo KTsNCj4+ICt9DQo+PiArDQo+PiArLyogRXhwYW5kIGJ1aWx0aW4gbWFjcm8gY29uY2F0ISgp LCB3aGljaCBqb2lucyBhbGwgdGhlIGxpdGVyYWwgcGFyYW1ldGVycw0KPj4gKyAgIGludG8g YSBzdHJpbmcgd2l0aCBubyBkZWxpbWl0ZXIuICovDQo+PiArDQo+PiArQVNUOjpBU1RGcmFn bWVudA0KPj4gK01hY3JvQnVpbHRpbjo6Y29uY2F0IChMb2NhdGlvbiBpbnZvY19sb2N1cywg QVNUOjpNYWNyb0ludm9jRGF0YSAmaW52b2MpDQo+PiArew0KPj4gKyAgYXV0byBpbnZvY190 b2tlbl90cmVlID0gaW52b2MuZ2V0X2RlbGltX3Rva190cmVlICgpOw0KPj4gKyAgTWFjcm9J bnZvY0xleGVyIGxleCAoaW52b2NfdG9rZW5fdHJlZS50b190b2tlbl9zdHJlYW0gKCkpOw0K Pj4gKyAgUGFyc2VyPE1hY3JvSW52b2NMZXhlcj4gcGFyc2VyIChsZXgpOw0KPj4gKw0KPj4g KyAgYXV0byBzdHIgPSBzdGQ6OnN0cmluZyAoKTsNCj4+ICsgIGJvb2wgaGFzX2Vycm9yID0g ZmFsc2U7DQo+PiArDQo+PiArICBhdXRvIGxhc3RfdG9rZW5faWQgPSBtYWNyb19lbmRfdG9r ZW4gKGludm9jX3Rva2VuX3RyZWUsIHBhcnNlcik7DQo+PiArDQo+PiArICAvKiBOT1RFOiBj b25jYXQhIGNvdWxkIGFjY2VwdCBubyBhcmd1bWVudCwgc28gd2UgZG9uJ3QgaGF2ZSBhbnkg Y2hlY2tzIGhlcmUgKi8NCj4+ICsgIHdoaWxlIChwYXJzZXIucGVla19jdXJyZW50X3Rva2Vu ICgpLT5nZXRfaWQgKCkgIT0gbGFzdF90b2tlbl9pZCkNCj4+ICsgICAgew0KPj4gKyAgICAg IGF1dG8gbGl0X2V4cHIgPSBwYXJzZXIucGFyc2VfbGl0ZXJhbF9leHByICgpOw0KPj4gKyAg ICAgIGlmIChsaXRfZXhwcikNCj4+ICsgICAgICAgew0KPj4gKyAgICAgICAgIHN0ciArPSBs aXRfZXhwci0+YXNfc3RyaW5nICgpOw0KPj4gKyAgICAgICB9DQo+PiArICAgICAgZWxzZQ0K Pj4gKyAgICAgICB7DQo+PiArICAgICAgICAgYXV0byBjdXJyZW50X3Rva2VuID0gcGFyc2Vy LnBlZWtfY3VycmVudF90b2tlbiAoKTsNCj4+ICsgICAgICAgICBydXN0X2Vycm9yX2F0IChj dXJyZW50X3Rva2VuLT5nZXRfbG9jdXMgKCksDQo+PiArICAgICAgICAgICAgICAgICAgICAg ICAgImFyZ3VtZW50IG11c3QgYmUgYSBjb25zdGFudCBsaXRlcmFsIik7DQo+PiArICAgICAg ICAgaGFzX2Vycm9yID0gdHJ1ZTsNCj4+ICsgICAgICAgICAvLyBKdXN0IGNyYXNoIGlmIHRo ZSBjdXJyZW50IHRva2VuIGNhbid0IGJlIHNraXBwZWQNCj4+ICsgICAgICAgICBydXN0X2Fz c2VydCAocGFyc2VyLnNraXBfdG9rZW4gKGN1cnJlbnRfdG9rZW4tPmdldF9pZCAoKSkpOw0K Pj4gKyAgICAgICB9DQo+PiArICAgICAgcGFyc2VyLm1heWJlX3NraXBfdG9rZW4gKENPTU1B KTsNCj4+ICsgICAgfQ0KPj4gKw0KPj4gKyAgcGFyc2VyLnNraXBfdG9rZW4gKGxhc3RfdG9r ZW5faWQpOw0KPj4gKw0KPj4gKyAgaWYgKGhhc19lcnJvcikNCj4+ICsgICAgcmV0dXJuIEFT VDo6QVNURnJhZ21lbnQ6OmNyZWF0ZV9lcnJvciAoKTsNCj4+ICsNCj4+ICsgIGF1dG8gbm9k ZSA9IEFTVDo6U2luZ2xlQVNUTm9kZSAobWFrZV9zdHJpbmcgKGludm9jX2xvY3VzLCBzdHIp KTsNCj4+ICsgIHJldHVybiBBU1Q6OkFTVEZyYWdtZW50ICh7bm9kZX0pOw0KPj4gK30NCj4+ ICsNCj4+ICsvKiBFeHBhbmQgYnVpbHRpbiBtYWNybyBlbnYhKCksIHdoaWNoIGluc3BlY3Rz IGFuIGVudmlyb25tZW50IHZhcmlhYmxlIGF0DQo+PiArICAgY29tcGlsZSB0aW1lLiAqLw0K Pj4gKw0KPj4gK0FTVDo6QVNURnJhZ21lbnQNCj4+ICtNYWNyb0J1aWx0aW46OmVudiAoTG9j YXRpb24gaW52b2NfbG9jdXMsIEFTVDo6TWFjcm9JbnZvY0RhdGEgJmludm9jKQ0KPj4gK3sN Cj4+ICsgIGF1dG8gaW52b2NfdG9rZW5fdHJlZSA9IGludm9jLmdldF9kZWxpbV90b2tfdHJl ZSAoKTsNCj4+ICsgIE1hY3JvSW52b2NMZXhlciBsZXggKGludm9jX3Rva2VuX3RyZWUudG9f dG9rZW5fc3RyZWFtICgpKTsNCj4+ICsgIFBhcnNlcjxNYWNyb0ludm9jTGV4ZXI+IHBhcnNl ciAobGV4KTsNCj4+ICsNCj4+ICsgIGF1dG8gbGFzdF90b2tlbl9pZCA9IG1hY3JvX2VuZF90 b2tlbiAoaW52b2NfdG9rZW5fdHJlZSwgcGFyc2VyKTsNCj4+ICsNCj4+ICsgIGlmIChwYXJz ZXIucGVla19jdXJyZW50X3Rva2VuICgpLT5nZXRfaWQgKCkgIT0gU1RSSU5HX0xJVEVSQUwp DQo+PiArICAgIHsNCj4+ICsgICAgICBpZiAocGFyc2VyLnBlZWtfY3VycmVudF90b2tlbiAo KS0+Z2V0X2lkICgpID09IGxhc3RfdG9rZW5faWQpDQo+PiArICAgICAgIHJ1c3RfZXJyb3Jf YXQgKGludm9jX2xvY3VzLCAiZW52ISB0YWtlcyAxIG9yIDIgYXJndW1lbnRzIik7DQo+PiAr ICAgICAgZWxzZQ0KPj4gKyAgICAgICBydXN0X2Vycm9yX2F0IChwYXJzZXIucGVla19jdXJy ZW50X3Rva2VuICgpLT5nZXRfbG9jdXMgKCksDQo+PiArICAgICAgICAgICAgICAgICAgICAg ICJhcmd1bWVudCBtdXN0IGJlIGEgc3RyaW5nIGxpdGVyYWwiKTsNCj4+ICsgICAgICByZXR1 cm4gQVNUOjpBU1RGcmFnbWVudDo6Y3JlYXRlX2Vycm9yICgpOw0KPj4gKyAgICB9DQo+PiAr DQo+PiArICBhdXRvIGxpdF9leHByID0gcGFyc2VyLnBhcnNlX2xpdGVyYWxfZXhwciAoKTsN Cj4+ICsgIGF1dG8gY29tbWFfc2tpcHBlZCA9IHBhcnNlci5tYXliZV9za2lwX3Rva2VuIChD T01NQSk7DQo+PiArDQo+PiArICBzdGQ6OnVuaXF1ZV9wdHI8QVNUOjpMaXRlcmFsRXhwcj4g ZXJyb3JfZXhwciA9IG51bGxwdHI7DQo+PiArDQo+PiArICBpZiAocGFyc2VyLnBlZWtfY3Vy cmVudF90b2tlbiAoKS0+Z2V0X2lkICgpICE9IGxhc3RfdG9rZW5faWQpDQo+PiArICAgIHsN Cj4+ICsgICAgICBpZiAoIWNvbW1hX3NraXBwZWQpDQo+PiArICAgICAgIHsNCj4+ICsgICAg ICAgICBydXN0X2Vycm9yX2F0IChwYXJzZXIucGVla19jdXJyZW50X3Rva2VuICgpLT5nZXRf bG9jdXMgKCksDQo+PiArICAgICAgICAgICAgICAgICAgICAgICAgImV4cGVjdGVkIHRva2Vu OiAlPCwlPiIpOw0KPj4gKyAgICAgICAgIHJldHVybiBBU1Q6OkFTVEZyYWdtZW50OjpjcmVh dGVfZXJyb3IgKCk7DQo+PiArICAgICAgIH0NCj4+ICsgICAgICBpZiAocGFyc2VyLnBlZWtf Y3VycmVudF90b2tlbiAoKS0+Z2V0X2lkICgpICE9IFNUUklOR19MSVRFUkFMKQ0KPj4gKyAg ICAgICB7DQo+PiArICAgICAgICAgcnVzdF9lcnJvcl9hdCAocGFyc2VyLnBlZWtfY3VycmVu dF90b2tlbiAoKS0+Z2V0X2xvY3VzICgpLA0KPj4gKyAgICAgICAgICAgICAgICAgICAgICAg ICJhcmd1bWVudCBtdXN0IGJlIGEgc3RyaW5nIGxpdGVyYWwiKTsNCj4+ICsgICAgICAgICBy ZXR1cm4gQVNUOjpBU1RGcmFnbWVudDo6Y3JlYXRlX2Vycm9yICgpOw0KPj4gKyAgICAgICB9 DQo+PiArDQo+PiArICAgICAgZXJyb3JfZXhwciA9IHBhcnNlci5wYXJzZV9saXRlcmFsX2V4 cHIgKCk7DQo+PiArICAgICAgcGFyc2VyLm1heWJlX3NraXBfdG9rZW4gKENPTU1BKTsNCj4+ ICsgICAgfQ0KPj4gKw0KPj4gKyAgaWYgKHBhcnNlci5wZWVrX2N1cnJlbnRfdG9rZW4gKCkt PmdldF9pZCAoKSAhPSBsYXN0X3Rva2VuX2lkKQ0KPj4gKyAgICB7DQo+PiArICAgICAgcnVz dF9lcnJvcl9hdCAoaW52b2NfbG9jdXMsICJlbnYhIHRha2VzIDEgb3IgMiBhcmd1bWVudHMi KTsNCj4+ICsgICAgICByZXR1cm4gQVNUOjpBU1RGcmFnbWVudDo6Y3JlYXRlX2Vycm9yICgp Ow0KPj4gKyAgICB9DQo+PiArDQo+PiArICBwYXJzZXIuc2tpcF90b2tlbiAobGFzdF90b2tl bl9pZCk7DQo+PiArDQo+PiArICBhdXRvIGVudl92YWx1ZSA9IGdldGVudiAobGl0X2V4cHIt PmFzX3N0cmluZyAoKS5jX3N0ciAoKSk7DQo+PiArDQo+PiArICBpZiAoZW52X3ZhbHVlID09 IG51bGxwdHIpDQo+PiArICAgIHsNCj4+ICsgICAgICBpZiAoZXJyb3JfZXhwciA9PSBudWxs cHRyKQ0KPj4gKyAgICAgICBydXN0X2Vycm9yX2F0IChpbnZvY19sb2N1cywgImVudmlyb25t ZW50IHZhcmlhYmxlICVxcyBub3QgZGVmaW5lZCIsDQo+PiArICAgICAgICAgICAgICAgICAg ICAgIGxpdF9leHByLT5hc19zdHJpbmcgKCkuY19zdHIgKCkpOw0KPj4gKyAgICAgIGVsc2UN Cj4+ICsgICAgICAgcnVzdF9lcnJvcl9hdCAoaW52b2NfbG9jdXMsICIlcyIsIGVycm9yX2V4 cHItPmFzX3N0cmluZyAoKS5jX3N0ciAoKSk7DQo+PiArICAgICAgcmV0dXJuIEFTVDo6QVNU RnJhZ21lbnQ6OmNyZWF0ZV9lcnJvciAoKTsNCj4+ICsgICAgfQ0KPj4gKw0KPj4gKyAgYXV0 byBub2RlID0gQVNUOjpTaW5nbGVBU1ROb2RlIChtYWtlX3N0cmluZyAoaW52b2NfbG9jdXMs IGVudl92YWx1ZSkpOw0KPj4gKyAgcmV0dXJuIEFTVDo6QVNURnJhZ21lbnQgKHtub2RlfSk7 DQo+PiArfQ0KPj4gKw0KPj4gK0FTVDo6QVNURnJhZ21lbnQNCj4+ICtNYWNyb0J1aWx0aW46 OmNmZyAoTG9jYXRpb24gaW52b2NfbG9jdXMsIEFTVDo6TWFjcm9JbnZvY0RhdGEgJmludm9j KQ0KPj4gK3sNCj4+ICsgIC8vIG9ubHkgcGFyc2UgaWYgbm90IGFscmVhZHkgcGFyc2VkDQo+ PiArICBpZiAoIWludm9jLmlzX3BhcnNlZCAoKSkNCj4+ICsgICAgew0KPj4gKyAgICAgIHN0 ZDo6dW5pcXVlX3B0cjxBU1Q6OkF0dHJJbnB1dE1ldGFJdGVtQ29udGFpbmVyPiBjb252ZXJ0 ZWRfaW5wdXQgKA0KPj4gKyAgICAgICBpbnZvYy5nZXRfZGVsaW1fdG9rX3RyZWUgKCkucGFy c2VfdG9fbWV0YV9pdGVtICgpKTsNCj4+ICsNCj4+ICsgICAgICBpZiAoY29udmVydGVkX2lu cHV0ID09IG51bGxwdHIpDQo+PiArICAgICAgIHsNCj4+ICsgICAgICAgICBydXN0X2RlYnVn ICgiREVCVUc6IGZhaWxlZCB0byBwYXJzZSBtYWNybyB0byBtZXRhIGl0ZW0iKTsNCj4+ICsg ICAgICAgICAvLyBUT0RPOiBkbyBzb21ldGhpbmcgbm93PyBpcyB0aGlzIGFuIGFjdHVhbCBl cnJvcj8NCj4+ICsgICAgICAgfQ0KPj4gKyAgICAgIGVsc2UNCj4+ICsgICAgICAgew0KPj4g KyAgICAgICAgIHN0ZDo6dmVjdG9yPHN0ZDo6dW5pcXVlX3B0cjxBU1Q6Ok1ldGFJdGVtSW5u ZXI+PiBtZXRhX2l0ZW1zICgNCj4+ICsgICAgICAgICAgIHN0ZDo6bW92ZSAoY29udmVydGVk X2lucHV0LT5nZXRfaXRlbXMgKCkpKTsNCj4+ICsgICAgICAgICBpbnZvYy5zZXRfbWV0YV9p dGVtX291dHB1dCAoc3RkOjptb3ZlIChtZXRhX2l0ZW1zKSk7DQo+PiArICAgICAgIH0NCj4+ ICsgICAgfQ0KPj4gKw0KPj4gKyAgLyogVE9ETzogYXNzdW1pbmcgdGhhdCBjZmchIG1hY3Jv cyBjYW4gb25seSBoYXZlIG9uZSBtZXRhIGl0ZW0gaW5uZXIsIGxpa2UgY2ZnDQo+PiArICAg KiBhdHRyaWJ1dGVzICovDQo+PiArICBpZiAoaW52b2MuZ2V0X21ldGFfaXRlbXMgKCkuc2l6 ZSAoKSAhPSAxKQ0KPj4gKyAgICByZXR1cm4gQVNUOjpBU1RGcmFnbWVudDo6Y3JlYXRlX2Vy cm9yICgpOw0KPj4gKw0KPj4gKyAgYm9vbCByZXN1bHQgPSBpbnZvYy5nZXRfbWV0YV9pdGVt cyAoKVswXS0+Y2hlY2tfY2ZnX3ByZWRpY2F0ZSAoDQo+PiArICAgIFNlc3Npb246OmdldF9p bnN0YW5jZSAoKSk7DQo+PiArICBhdXRvIGxpdGVyYWxfZXhwID0gQVNUOjpTaW5nbGVBU1RO b2RlIChzdGQ6OnVuaXF1ZV9wdHI8QVNUOjpFeHByPiAoDQo+PiArICAgIG5ldyBBU1Q6Okxp dGVyYWxFeHByIChyZXN1bHQgPyAidHJ1ZSIgOiAiZmFsc2UiLCBBU1Q6OkxpdGVyYWw6OkJP T0wsDQo+PiArICAgICAgICAgICAgICAgICAgICAgICAgIFByaW1pdGl2ZUNvcmVUeXBlOjpD T1JFVFlQRV9CT09MLCB7fSwgaW52b2NfbG9jdXMpKSk7DQo+PiArDQo+PiArICByZXR1cm4g QVNUOjpBU1RGcmFnbWVudCAoe2xpdGVyYWxfZXhwfSk7DQo+PiArfQ0KPj4gKw0KPj4gKy8q IEV4cGFuZCBidWlsdGluIG1hY3JvIGluY2x1ZGUhKCksIHdoaWNoIGluY2x1ZGVzIGEgc291 cmNlIGZpbGUgYXQgdGhlIGN1cnJlbnQNCj4+ICsgc2NvcGUgY29tcGlsZSB0aW1lLiAqLw0K Pj4gKw0KPj4gK0FTVDo6QVNURnJhZ21lbnQNCj4+ICtNYWNyb0J1aWx0aW46OmluY2x1ZGUg KExvY2F0aW9uIGludm9jX2xvY3VzLCBBU1Q6Ok1hY3JvSW52b2NEYXRhICZpbnZvYykNCj4+ ICt7DQo+PiArICAvKiBHZXQgdGFyZ2V0IGZpbGVuYW1lIGZyb20gdGhlIG1hY3JvIGludm9j YXRpb24sIHdoaWNoIGlzIHRyZWF0ZWQgYXMgYSBwYXRoDQo+PiArICAgICByZWxhdGl2ZSB0 byB0aGUgaW5jbHVkZSEtaW5nIGZpbGUgKGN1cnJlbnRseSBiZWluZyBjb21waWxlZCkuICAq Lw0KPj4gKyAgYXV0byBsaXRfZXhwcg0KPj4gKyAgICA9IHBhcnNlX3NpbmdsZV9zdHJpbmdf bGl0ZXJhbCAoaW52b2MuZ2V0X2RlbGltX3Rva190cmVlICgpLCBpbnZvY19sb2N1cyk7DQo+ PiArICBpZiAobGl0X2V4cHIgPT0gbnVsbHB0cikNCj4+ICsgICAgcmV0dXJuIEFTVDo6QVNU RnJhZ21lbnQ6OmNyZWF0ZV9lcnJvciAoKTsNCj4+ICsNCj4+ICsgIHN0ZDo6c3RyaW5nIGZp bGVuYW1lDQo+PiArICAgID0gc291cmNlX3JlbGF0aXZlX3BhdGggKGxpdF9leHByLT5hc19z dHJpbmcgKCksIGludm9jX2xvY3VzKTsNCj4+ICsgIGF1dG8gdGFyZ2V0X2ZpbGVuYW1lDQo+ PiArICAgID0gUnVzdDo6U2Vzc2lvbjo6Z2V0X2luc3RhbmNlICgpLmluY2x1ZGVfZXh0cmFf ZmlsZSAoc3RkOjptb3ZlIChmaWxlbmFtZSkpOw0KPj4gKw0KPj4gKyAgUkFJSUZpbGUgdGFy Z2V0X2ZpbGUgKHRhcmdldF9maWxlbmFtZSk7DQo+PiArICBMaW5lbWFwICpsaW5lbWFwID0g U2Vzc2lvbjo6Z2V0X2luc3RhbmNlICgpLmxpbmVtYXA7DQo+PiArDQo+PiArICBpZiAoIXRh cmdldF9maWxlLm9rICgpKQ0KPj4gKyAgICB7DQo+PiArICAgICAgcnVzdF9lcnJvcl9hdCAo bGl0X2V4cHItPmdldF9sb2N1cyAoKSwNCj4+ICsgICAgICAgICAgICAgICAgICAgICJjYW5u b3Qgb3BlbiBpbmNsdWRlZCBmaWxlICVxczogJW0iLCB0YXJnZXRfZmlsZW5hbWUpOw0KPj4g KyAgICAgIHJldHVybiBBU1Q6OkFTVEZyYWdtZW50OjpjcmVhdGVfZXJyb3IgKCk7DQo+PiAr ICAgIH0NCj4+ICsNCj4+ICsgIHJ1c3RfZGVidWcgKCJBdHRlbXB0aW5nIHRvIHBhcnNlIGlu Y2x1ZGVkIGZpbGUgJXMiLCB0YXJnZXRfZmlsZW5hbWUpOw0KPj4gKw0KPj4gKyAgTGV4ZXIg bGV4ICh0YXJnZXRfZmlsZW5hbWUsIHN0ZDo6bW92ZSAodGFyZ2V0X2ZpbGUpLCBsaW5lbWFw KTsNCj4+ICsgIFBhcnNlcjxMZXhlcj4gcGFyc2VyIChsZXgpOw0KPj4gKw0KPj4gKyAgYXV0 byBwYXJzZWRfaXRlbXMgPSBwYXJzZXIucGFyc2VfaXRlbXMgKCk7DQo+PiArICBib29sIGhh c19lcnJvciA9ICFwYXJzZXIuZ2V0X2Vycm9ycyAoKS5lbXB0eSAoKTsNCj4+ICsNCj4+ICsg IGZvciAoY29uc3QgYXV0byAmZXJyb3IgOiBwYXJzZXIuZ2V0X2Vycm9ycyAoKSkNCj4+ICsg ICAgZXJyb3IuZW1pdF9lcnJvciAoKTsNCj4+ICsNCj4+ICsgIGlmIChoYXNfZXJyb3IpDQo+ PiArICAgIHsNCj4+ICsgICAgICAvLyBpbmZvcm0gdGhlIHVzZXIgdGhhdCB0aGUgZXJyb3Jz IGFib3ZlIGFyZSBmcm9tIGEgaW5jbHVkZWQgZmlsZQ0KPj4gKyAgICAgIHJ1c3RfaW5mb3Jt IChpbnZvY19sb2N1cywgImluY2x1ZGVkIGZyb20gaGVyZSIpOw0KPj4gKyAgICAgIHJldHVy biBBU1Q6OkFTVEZyYWdtZW50OjpjcmVhdGVfZXJyb3IgKCk7DQo+PiArICAgIH0NCj4+ICsN Cj4+ICsgIHN0ZDo6dmVjdG9yPEFTVDo6U2luZ2xlQVNUTm9kZT4gbm9kZXN7fTsNCj4+ICsg IGZvciAoYXV0byAmaXRlbSA6IHBhcnNlZF9pdGVtcykNCj4+ICsgICAgew0KPj4gKyAgICAg IEFTVDo6U2luZ2xlQVNUTm9kZSBub2RlIChzdGQ6Om1vdmUgKGl0ZW0pKTsNCj4+ICsgICAg ICBub2Rlcy5wdXNoX2JhY2sgKG5vZGUpOw0KPj4gKyAgICB9DQo+PiArDQo+PiArICByZXR1 cm4gQVNUOjpBU1RGcmFnbWVudCAobm9kZXMpOw0KPj4gK30NCj4+ICsNCj4+ICtBU1Q6OkFT VEZyYWdtZW50DQo+PiArTWFjcm9CdWlsdGluOjpsaW5lIChMb2NhdGlvbiBpbnZvY19sb2N1 cywgQVNUOjpNYWNyb0ludm9jRGF0YSAmaW52b2MpDQo+PiArew0KPj4gKyAgYXV0byBjdXJy ZW50X2xpbmUNCj4+ICsgICAgPSBTZXNzaW9uOjpnZXRfaW5zdGFuY2UgKCkubGluZW1hcC0+ bG9jYXRpb25fdG9fbGluZSAoaW52b2NfbG9jdXMpOw0KPj4gKw0KPj4gKyAgYXV0byBsaW5l X25vID0gQVNUOjpTaW5nbGVBU1ROb2RlIChzdGQ6OnVuaXF1ZV9wdHI8QVNUOjpFeHByPiAo DQo+PiArICAgIG5ldyBBU1Q6OkxpdGVyYWxFeHByIChzdGQ6OnRvX3N0cmluZyAoY3VycmVu dF9saW5lKSwgQVNUOjpMaXRlcmFsOjpJTlQsDQo+PiArICAgICAgICAgICAgICAgICAgICAg ICAgIFByaW1pdGl2ZUNvcmVUeXBlOjpDT1JFVFlQRV9VMzIsIHt9LCBpbnZvY19sb2N1cykp KTsNCj4+ICsNCj4+ICsgIHJldHVybiBBU1Q6OkFTVEZyYWdtZW50ICh7bGluZV9ub30pOw0K Pj4gK30NCj4+ICsNCj4+ICt9IC8vIG5hbWVzcGFjZSBSdXN0DQo+PiBkaWZmIC0tZ2l0IGEv Z2NjL3J1c3QvZXhwYW5kL3J1c3QtbWFjcm8tYnVpbHRpbnMuaCBiL2djYy9ydXN0L2V4cGFu ZC9ydXN0LW1hY3JvLWJ1aWx0aW5zLmgNCj4+IG5ldyBmaWxlIG1vZGUgMTAwNjQ0DQo+PiBp bmRleCAwMDAwMDAwMDAwMC4uOTFmMzcyN2Q0NTANCj4+IC0tLSAvZGV2L251bGwNCj4+ICsr KyBiL2djYy9ydXN0L2V4cGFuZC9ydXN0LW1hY3JvLWJ1aWx0aW5zLmgNCj4+IEBAIC0wLDAg KzEsMTA3IEBADQo+PiArLy8gQ29weXJpZ2h0IChDKSAyMDIwLTIwMjIgRnJlZSBTb2Z0d2Fy ZSBGb3VuZGF0aW9uLCBJbmMuDQo+PiArDQo+PiArLy8gVGhpcyBmaWxlIGlzIHBhcnQgb2Yg R0NDLg0KPj4gKw0KPj4gKy8vIEdDQyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlz dHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0IHVuZGVyDQo+PiArLy8gdGhlIHRlcm1zIG9m IHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZy ZWUNCj4+ICsvLyBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzLCBvciAo YXQgeW91ciBvcHRpb24pIGFueSBsYXRlcg0KPj4gKy8vIHZlcnNpb24uDQo+PiArDQo+PiAr Ly8gR0NDIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2Vm dWwsIGJ1dCBXSVRIT1VUIEFOWQ0KPj4gKy8vIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhl IGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yDQo+PiArLy8gRklUTkVT UyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1Ymxp YyBMaWNlbnNlDQo+PiArLy8gZm9yIG1vcmUgZGV0YWlscy4NCj4+ICsNCj4+ICsvLyBZb3Ug c2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMg TGljZW5zZQ0KPj4gKy8vIGFsb25nIHdpdGggR0NDOyBzZWUgdGhlIGZpbGUgQ09QWUlORzMu ICBJZiBub3Qgc2VlDQo+PiArLy8gPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+Lg0K Pj4gKw0KPj4gKyNpZm5kZWYgUlVTVF9NQUNST19CVUlMVElOU19IDQo+PiArI2RlZmluZSBS VVNUX01BQ1JPX0JVSUxUSU5TX0gNCj4+ICsNCj4+ICsjaW5jbHVkZSAicnVzdC1hc3QuaCIN Cj4+ICsjaW5jbHVkZSAicnVzdC1sb2NhdGlvbi5oIg0KPj4gKw0KPj4gKy8qKg0KPj4gKyAq IFRoaXMgY2xhc3MgcHJvdmlkZXMgYSBsaXN0IG9mIGJ1aWx0aW4gbWFjcm9zIGltcGxlbWVu dGVkIGJ5IHRoZSBjb21waWxlci4NCj4+ICsgKiBUaGUgZnVuY3Rpb25zIGRlZmluZWQgYXJl IGNhbGxlZCAiYnVpbHRpbiB0cmFuc2NyaWJlcnMiIGluIHRoYXQgdGhleSByZXBsYWNlDQo+ PiArICogdGhlIHRyYW5zY3JpYmluZyBwYXJ0IG9mIGEgbWFjcm8gZGVmaW5pdGlvbi4NCj4+ ICsgKg0KPj4gKyAqIExpa2UgcmVndWxhciBtYWNybyB0cmFuc2NyaWJlcnMsIHRoZXkgYXJl IHJlc3BvbnNpYmxlIGZvciBidWlsZGluZyBhbmQNCj4+ICsgKiByZXR1cm5pbmcgYW4gQVNU IGZyYWdtZW50OiBiYXNpY2FsbHkgYSB2ZWN0b3Igb2YgQVNUIG5vZGVzIHB1dCB0b2dldGhl ci4NCj4+ICsgKg0KPj4gKyAqIFVubGlrZSByZWd1bGFyIGRlY2xhcmF0aXZlIG1hY3JvcyB3 aGVyZSBlYWNoIG1hdGNoIGFybSBoYXMgaXRzIG93biBhc3NvY2lhdGVkDQo+PiArICogdHJh bnNjcmliZXIsIGJ1aWx0aW4gdHJhbnNjcmliZXJzIGFyZSByZXNwb25zaWJsZSBmb3IgaGFu ZGxpbmcgYWxsIG1hdGNoIGFybXMNCj4+ICsgKiBvZiB0aGUgbWFjcm8uIFRoaXMgbWVhbnMg dGhhdCB5b3Ugc2hvdWxkIHRha2UgZXh0cmEgY2FyZSB3aGVuIGltcGxlbWVudGluZyBhDQo+ PiArICogYnVpbHRpbiBjb250YWluaW5nIG11bHRpcGxlIG1hdGNoIGFybXM6IFlvdSB3aWxs IHByb2JhYmx5IG5lZWQgdG8gZG8gc29tZQ0KPj4gKyAqIGxvb2thaGVhZCBpbiBvcmRlciB0 byBkZXRlcm1pbmUgd2hpY2ggbWF0Y2ggYXJtIHRoZSB1c2VyIGludGVuZGVkIHRvIHVzZS4N Cj4+ICsgKg0KPj4gKyAqIEFuIGV4YW1wbGUgb2YgdGhpcyBpcyB0aGUgYGFzc2VydCEoKWAg bWFjcm86DQo+PiArICoNCj4+ICsgKiBgYGANCj4+ICsgKiAgbWFjcm9fcnVsZXMhIGFzc2Vy dCB7DQo+PiArICogICAgICgkY29uZDpleHByICQoLCk/KSA9PiB7eyAuLi4gfX07DQo+PiAr ICogICAgICgkY29uZCA6IGV4cHIsICQgKCRhcmcgOiB0dCkgKykgPSA+IHt7IC4uLiB9fTsN Cj4+ICsgKiB9DQo+PiArICogYGBgDQo+PiArICoNCj4+ICsgKiBJZiBtb3JlIHRva2VucyBl eGlzdCBiZXlvbmQgdGhlIG9wdGlvbmFsIGNvbW1hLCB0aGV5IG5lZWQgdG8gYmUgaGFuZGxl ZCBhcw0KPj4gKyAqIGEgdG9rZW4tdHJlZSBmb3IgYSBjdXN0b20gcGFuaWMgbWVzc2FnZS4N Cj4+ICsgKg0KPj4gKyAqIFRoZXNlIGJ1aWx0aW4gbWFjcm9zIHdpdGggZW1wdHkgdHJhbnNj cmliZXJzIGFyZSBkZWZpbmVkIGluIHRoZSBzdGFuZGFyZA0KPj4gKyAqIGxpYnJhcnkuIFRo ZXkgYXJlIG1hcmtlZCB3aXRoIGEgc3BlY2lhbCBhdHRyaWJ1dGUsIGAjW3J1c3RjX2J1aWx0 aW5fbWFjcm9dYC4NCj4+ICsgKiBXaGVuIHRoaXMgYXR0cmlidXRlIGlzIHByZXNlbnQgb24g YSBtYWNybyBkZWZpbml0aW9uLCB0aGUgY29tcGlsZXIgc2hvdWxkDQo+PiArICogbG9vayBm b3IgYW4gYXNzb2NpYXRlZCB0cmFuc2NyaWJlciBpbiB0aGUgbWFwcGluZ3MuIE1lYW5pbmcg dGhhdCB5b3UgbXVzdA0KPj4gKyAqIHJlbWVtYmVyIHRvIGluc2VydCB5b3VyIHRyYW5zY3Jp YmVyIGluIHRoZSBgYnVpbHRpbl9tYWNyb3NgIG1hcCBvZiB0aGUNCj4+ICsgKmBNYXBwaW5n c2AuDQo+PiArICoNCj4+ICsgKiBUaGlzIG1hcCBpcyBidWlsdCBhcyBhIHN0YXRpYyB2YXJp YWJsZSBpbiB0aGUgYGluc2VydF9tYWNyb19kZWYoKWAgbWV0aG9kDQo+PiArICogb2YgdGhl IGBNYXBwaW5nc2AgY2xhc3MuDQo+PiArICovDQo+PiArDQo+PiArLyogSWYgYXNzZXJ0IGlz IGRlZmluZWQgYXMgYSBtYWNybyB0aGlzIGZpbGUgd2lsbCBub3QgcGFyc2UsIHNvIHVuZGVm aW5lIHRoaXMNCj4+ICsgICBiZWZvcmUgY29udGludWluZy4gICovDQo+PiArI2lmZGVmIGFz c2VydA0KPj4gKyN1bmRlZiBhc3NlcnQNCj4+ICsjZW5kaWYNCj4+ICsNCj4+ICtuYW1lc3Bh Y2UgUnVzdCB7DQo+PiArY2xhc3MgTWFjcm9CdWlsdGluDQo+PiArew0KPj4gK3B1YmxpYzoN Cj4+ICsgIHN0YXRpYyBBU1Q6OkFTVEZyYWdtZW50IGFzc2VydCAoTG9jYXRpb24gaW52b2Nf bG9jdXMsDQo+PiArICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVNUOjpNYWNy b0ludm9jRGF0YSAmaW52b2MpOw0KPj4gKw0KPj4gKyAgc3RhdGljIEFTVDo6QVNURnJhZ21l bnQgZmlsZSAoTG9jYXRpb24gaW52b2NfbG9jdXMsDQo+PiArICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgIEFTVDo6TWFjcm9JbnZvY0RhdGEgJmludm9jKTsNCj4+ICsNCj4+ICsg IHN0YXRpYyBBU1Q6OkFTVEZyYWdtZW50IGNvbHVtbiAoTG9jYXRpb24gaW52b2NfbG9jdXMs DQo+PiArICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVNUOjpNYWNyb0ludm9j RGF0YSAmaW52b2MpOw0KPj4gKw0KPj4gKyAgc3RhdGljIEFTVDo6QVNURnJhZ21lbnQgaW5j bHVkZV9ieXRlcyAoTG9jYXRpb24gaW52b2NfbG9jdXMsDQo+PiArICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgIEFTVDo6TWFjcm9JbnZvY0RhdGEgJmludm9jKTsN Cj4+ICsNCj4+ICsgIHN0YXRpYyBBU1Q6OkFTVEZyYWdtZW50IGluY2x1ZGVfc3RyIChMb2Nh dGlvbiBpbnZvY19sb2N1cywNCj4+ICsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgIEFTVDo6TWFjcm9JbnZvY0RhdGEgJmludm9jKTsNCj4+ICsNCj4+ICsgIHN0YXRp YyBBU1Q6OkFTVEZyYWdtZW50IGNvbXBpbGVfZXJyb3IgKExvY2F0aW9uIGludm9jX2xvY3Vz LA0KPj4gKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBU1Q6Ok1h Y3JvSW52b2NEYXRhICZpbnZvYyk7DQo+PiArDQo+PiArICBzdGF0aWMgQVNUOjpBU1RGcmFn bWVudCBjb25jYXQgKExvY2F0aW9uIGludm9jX2xvY3VzLA0KPj4gKyAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgIEFTVDo6TWFjcm9JbnZvY0RhdGEgJmludm9jKTsNCj4+ICsN Cj4+ICsgIHN0YXRpYyBBU1Q6OkFTVEZyYWdtZW50IGVudiAoTG9jYXRpb24gaW52b2NfbG9j dXMsDQo+PiArICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVNUOjpNYWNyb0ludm9j RGF0YSAmaW52b2MpOw0KPj4gKw0KPj4gKyAgc3RhdGljIEFTVDo6QVNURnJhZ21lbnQgY2Zn IChMb2NhdGlvbiBpbnZvY19sb2N1cywNCj4+ICsgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICBBU1Q6Ok1hY3JvSW52b2NEYXRhICZpbnZvYyk7DQo+PiArDQo+PiArICBzdGF0aWMg QVNUOjpBU1RGcmFnbWVudCBpbmNsdWRlIChMb2NhdGlvbiBpbnZvY19sb2N1cywNCj4+ICsg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVNUOjpNYWNyb0ludm9jRGF0YSAm aW52b2MpOw0KPj4gKw0KPj4gKyAgc3RhdGljIEFTVDo6QVNURnJhZ21lbnQgbGluZSAoTG9j YXRpb24gaW52b2NfbG9jdXMsDQo+PiArICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg IEFTVDo6TWFjcm9JbnZvY0RhdGEgJmludm9jKTsNCj4+ICt9Ow0KPj4gK30gLy8gbmFtZXNw YWNlIFJ1c3QNCj4+ICsNCj4+ICsjZW5kaWYgLy8gUlVTVF9NQUNST19CVUlMVElOU19IDQo+ PiBkaWZmIC0tZ2l0IGEvZ2NjL3J1c3QvZXhwYW5kL3J1c3QtbWFjcm8tZXhwYW5kLmNjIGIv Z2NjL3J1c3QvZXhwYW5kL3J1c3QtbWFjcm8tZXhwYW5kLmNjDQo+PiBuZXcgZmlsZSBtb2Rl IDEwMDY0NA0KPj4gaW5kZXggMDAwMDAwMDAwMDAuLjFkNTdlMzk0MjIwDQo+PiAtLS0gL2Rl di9udWxsDQo+PiArKysgYi9nY2MvcnVzdC9leHBhbmQvcnVzdC1tYWNyby1leHBhbmQuY2MN Cj4+IEBAIC0wLDAgKzEsMTAxMiBAQA0KPj4gKy8vIENvcHlyaWdodCAoQykgMjAyMC0yMDIy IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLg0KPj4gKw0KPj4gKy8vIFRoaXMgZmls ZSBpcyBwYXJ0IG9mIEdDQy4NCj4+ICsNCj4+ICsvLyBHQ0MgaXMgZnJlZSBzb2Z0d2FyZTsg eW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdCB1bmRlcg0KPj4gKy8v IHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlz aGVkIGJ5IHRoZSBGcmVlDQo+PiArLy8gU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZl cnNpb24gMywgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXINCj4+ICsvLyB2ZXJzaW9u Lg0KPj4gKw0KPj4gKy8vIEdDQyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0 IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVCBBTlkNCj4+ICsvLyBXQVJSQU5UWTsgd2l0 aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvcg0K Pj4gKy8vIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUg R2VuZXJhbCBQdWJsaWMgTGljZW5zZQ0KPj4gKy8vIGZvciBtb3JlIGRldGFpbHMuDQo+PiAr DQo+PiArLy8gWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdl bmVyYWwgUHVibGljIExpY2Vuc2UNCj4+ICsvLyBhbG9uZyB3aXRoIEdDQzsgc2VlIHRoZSBm aWxlIENPUFlJTkczLiAgSWYgbm90IHNlZQ0KPj4gKy8vIDxodHRwOi8vd3d3LmdudS5vcmcv bGljZW5zZXMvPi4NCj4+ICsNCj4+ICsjaW5jbHVkZSAicnVzdC1tYWNyby1leHBhbmQuaCIN Cj4+ICsjaW5jbHVkZSAicnVzdC1tYWNyby1zdWJzdGl0dXRlLWN0eC5oIg0KPj4gKyNpbmNs dWRlICJydXN0LWFzdC1mdWxsLmgiDQo+PiArI2luY2x1ZGUgInJ1c3QtYXN0LXZpc2l0b3Iu aCINCj4+ICsjaW5jbHVkZSAicnVzdC1kaWFnbm9zdGljcy5oIg0KPj4gKyNpbmNsdWRlICJy dXN0LXBhcnNlLmgiDQo+PiArI2luY2x1ZGUgInJ1c3QtYXR0cmlidXRlLXZpc2l0b3IuaCIN Cj4+ICsNCj4+ICtuYW1lc3BhY2UgUnVzdCB7DQo+PiArQVNUOjpBU1RGcmFnbWVudA0KPj4g K01hY3JvRXhwYW5kZXI6OmV4cGFuZF9kZWNsX21hY3JvIChMb2NhdGlvbiBpbnZvY19sb2N1 cywNCj4+ICsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBU1Q6Ok1hY3JvSW52 b2NEYXRhICZpbnZvYywNCj4+ICsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBB U1Q6Ok1hY3JvUnVsZXNEZWZpbml0aW9uICZydWxlc19kZWYsDQo+PiArICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgYm9vbCBzZW1pY29sb24pDQo+PiArew0KPj4gKyAgLy8g ZW5zdXJlIHRoYXQgYm90aCBpbnZvY2F0aW9uIGFuZCBydWxlcyBhcmUgaW4gYSB2YWxpZCBz dGF0ZQ0KPj4gKyAgcnVzdF9hc3NlcnQgKCFpbnZvYy5pc19tYXJrZWRfZm9yX3N0cmlwICgp KTsNCj4+ICsgIHJ1c3RfYXNzZXJ0ICghcnVsZXNfZGVmLmlzX21hcmtlZF9mb3Jfc3RyaXAg KCkpOw0KPj4gKyAgcnVzdF9hc3NlcnQgKHJ1bGVzX2RlZi5nZXRfbWFjcm9fcnVsZXMgKCku c2l6ZSAoKSA+IDApOw0KPj4gKw0KPj4gKyAgLyogcHJvYmFibHkgc29tZXRoaW5nIGhlcmUg YWJvdXQgcGFyc2luZyBpbnZvYyBhbmQgcnVsZXMgZGVmIHRva2VuIHRyZWVzIHRvDQo+PiAr ICAgKiB0b2tlbiBzdHJlYW0uIGlmIG5vdCwgaG93IHdvdWxkIHBhcnNlciBoYW5kbGUgdGhl IGNhcHR1cmVzIG9mIGV4cHJzIGFuZA0KPj4gKyAgICogc3R1ZmY/IG9uIHRoZSBvdGhlciBo YW5kLCB0b2tlbiB0cmVlcyBtYXkgYmUga2luZCBvZiB1c2VmdWwgaW4gcnVsZXMgZGVmIGFz DQo+PiArICAgKiBjcmVhdGluZyBhIHBvaW50IHdoZXJlIHJlY3Vyc2lvbiBjYW4gb2NjdXIg KGxpa2UgaGF2aW5nDQo+PiArICAgKiAiY29tcGFyZV9tYWNyb19tYXRjaCIgYW5kIHRoZW4g aXQgY2FsbGluZyBpdHNlbGYgd2hlbiBpdCBmaW5kcyBkZWxpbWl0ZXJzKQ0KPj4gKyAgICov DQo+PiArDQo+PiArICAvKiBmaW5kIG1hdGNoaW5nIHJ1bGUgdG8gaW52b2MgdG9rZW4gdHJl ZSwgYmFzZWQgb24gbWFjcm8gcnVsZSdzIG1hdGNoZXIuIGlmDQo+PiArICAgKiBub25lIGV4 aXN0LCBlcnJvci4NCj4+ICsgICAqIC0gc3BlY2lmaWNhbGx5LCBjaGVjayBlYWNoIG1hdGNo ZXIgaW4gb3JkZXIuIGlmIG9uZSBmYWlscyB0byBtYXRjaCwgbW92ZQ0KPj4gKyAgICogb250 byBuZXh0LiAqLw0KPj4gKyAgLyogVE9ETzogZG9lcyBkb2luZyB0aGlzIHJlcXVpcmUgcGFy c2luZyBleHByZXNzaW9ucyBhbmQgd2hhdGV2ZXIgaW4gdGhlDQo+PiArICAgKiBpbnZvYz8g aWYgc28sIG1pZ2h0IGFzIHdlbGwgc2F2ZSB0aGUgcmVzdWx0cyBpZiByZWZlcmVuY2VkIHVz aW5nICQgb3INCj4+ICsgICAqIHdoYXRldmVyLiBJZiBub3QsIGRvIGFub3RoZXIgcGFzcyBz YXZpbmcgdGhlbS4gRXhjZXB0IHRoaXMgaXMgcHJvYmFibHkNCj4+ICsgICAqIHVzZWxlc3Mg YXMgZGlmZmVyZW50IHJ1bGVzIGNvdWxkIGhhdmUgZGlmZmVyZW50IHN0YXJ0aW5nIHBvaW50 cyBmb3IgZXhwcnMNCj4+ICsgICAqIG9yIHdoYXRldmVyLiBEZWNpc2lvbiB0cmVlcyBjb3Vs ZCBhdm9pZCB0aGlzLCBidXQgdGhleSBoYXZlIHRoZWlyIG93bg0KPj4gKyAgICogaXNzdWVz LiAqLw0KPj4gKyAgLyogVE9ETzogd2lsbCBuZWVkIHRvIG1vZGlmeSB0aGUgcGFyc2VyIHNv IHRoYXQgaXQgY2FuIGVzc2VudGlhbGx5ICJjYXRjaCINCj4+ICsgICAqIGVycm9ycyAtIG1h eWJlICJ0cnlfcGFyc2VfZXhwciIgb3Igd2hhdGV2ZXIgbWV0aG9kcy4gKi8NCj4+ICsgIC8v IHRoaXMgdGVjaG5pY2FsbHkgY3JlYXRlcyBhIGJhY2stdHJhY2tpbmcgcGFyc2VyIC0gdGhp cyB3aWxsIGJlIHRoZQ0KPj4gKyAgLy8gaW1wbGVtZW50YXRpb24gc3R5bGUNCj4+ICsNCj4+ ICsgIC8qIHRoZW4sIGFmdGVyIHJlc3VsdHMgYXJlIHNhdmVkLCBnZW5lcmF0ZSB0aGUgbWFj cm8gb3V0cHV0IGZyb20gdGhlDQo+PiArICAgKiB0cmFuc2NyaWJlciB0b2tlbiB0cmVlLiBp ZiBpIHVuZGVyc3RhbmQgdGhpcyBjb3JyZWN0bHksIHRoZSBtYWNybw0KPj4gKyAgICogaW52 b2NhdGlvbiBnZXRzIHJlcGxhY2VkIGJ5IHRoZSB0cmFuc2NyaWJlciB0b2tlbnMsIGV4Y2Vw dCB3aXRoDQo+PiArICAgKiBzdWJzdGl0dXRpb25zIG1hZGUgKGUuZy4gZm9yICRpIHZhcmlh YmxlcykgKi8NCj4+ICsNCj4+ICsgIC8qIFRPRE86IGl0IGlzIHByb2JhYmx5IGJldHRlciB0 byBtb2RpZnkgQVNUOjpUb2tlbiB0byBzdG9yZSBhIHBvaW50ZXIgdG8gYQ0KPj4gKyAgICog TGV4ZXI6OlRva2VuIChyYXRoZXIgdGhhbiBiZWluZyBjb252ZXJ0ZWQpIC0gaS5lLiBub3Qg c28gbXVjaCBoYXZlDQo+PiArICAgKiBBU1Q6OlRva2VuIGFzIGEgVG9rZW4gYnV0IHJhdGhl ciBhIFRva2VuQ29udGFpbmVyIChhcyBpdCBpcyBhbm90aGVyIHR5cGUgb2YNCj4+ICsgICAq IFRva2VuVHJlZSkuIFRoaXMgd2lsbCBwcmV2ZW50IHJlLWNvbnZlcnNpb24gb2YgVG9rZW5z IGJldHdlZW4gZWFjaCB0eXBlDQo+PiArICAgKiBhbGwgdGhlIHRpbWUsIHdoaWxlIHN0aWxs IGFsbG93aW5nIHRoZSBoZXRlcm9nZW5vdXMgc3RvcmFnZSBvZiB0b2tlbiB0cmVlcy4NCj4+ ICsgICAqLw0KPj4gKw0KPj4gKyAgQVNUOjpEZWxpbVRva2VuVHJlZSAmaW52b2NfdG9rZW5f dHJlZSA9IGludm9jLmdldF9kZWxpbV90b2tfdHJlZSAoKTsNCj4+ICsNCj4+ICsgIC8vIGZp bmQgbWF0Y2hpbmcgYXJtDQo+PiArICBBU1Q6Ok1hY3JvUnVsZSAqbWF0Y2hlZF9ydWxlID0g bnVsbHB0cjsNCj4+ICsgIHN0ZDo6bWFwPHN0ZDo6c3RyaW5nLCBNYXRjaGVkRnJhZ21lbnRD b250YWluZXI+IG1hdGNoZWRfZnJhZ21lbnRzOw0KPj4gKyAgZm9yIChhdXRvICZydWxlIDog cnVsZXNfZGVmLmdldF9ydWxlcyAoKSkNCj4+ICsgICAgew0KPj4gKyAgICAgIHN1Yl9zdGFj ay5wdXNoICgpOw0KPj4gKyAgICAgIGJvb2wgZGlkX21hdGNoX3J1bGUgPSB0cnlfbWF0Y2hf cnVsZSAocnVsZSwgaW52b2NfdG9rZW5fdHJlZSk7DQo+PiArICAgICAgbWF0Y2hlZF9mcmFn bWVudHMgPSBzdWJfc3RhY2sucG9wICgpOw0KPj4gKw0KPj4gKyAgICAgIGlmIChkaWRfbWF0 Y2hfcnVsZSkNCj4+ICsgICAgICAgew0KPj4gKyAgICAgICAgIC8vICAvLyBEZWJ1Z2dpbmcN Cj4+ICsgICAgICAgICAvLyAgZm9yIChhdXRvICZrdiA6IG1hdGNoZWRfZnJhZ21lbnRzKQ0K Pj4gKyAgICAgICAgIC8vICAgIHJ1c3RfZGVidWcgKCJbZnJhZ21lbnRdOiAlcyAoJWxkIC0g JXMpIiwga3YuZmlyc3QuY19zdHIgKCksDQo+PiArICAgICAgICAgLy8gICAgICAgICAgICBr di5zZWNvbmQuZ2V0X2ZyYWdtZW50cyAoKS5zaXplICgpLA0KPj4gKyAgICAgICAgIC8vICAg ICAgICAgICAga3Yuc2Vjb25kLmdldF9raW5kICgpDQo+PiArICAgICAgICAgLy8gICAgICAg ICAgICAgICAgPT0gTWF0Y2hlZEZyYWdtZW50Q29udGFpbmVyOjpLaW5kOjpSZXBldGl0aW9u DQo+PiArICAgICAgICAgLy8gICAgICAgICAgICAgID8gInJlcGV0aXRpb24iDQo+PiArICAg ICAgICAgLy8gICAgICAgICAgICAgIDogIm1ldGF2YXIiKTsNCj4+ICsNCj4+ICsgICAgICAg ICBtYXRjaGVkX3J1bGUgPSAmcnVsZTsNCj4+ICsgICAgICAgICBicmVhazsNCj4+ICsgICAg ICAgfQ0KPj4gKyAgICB9DQo+PiArDQo+PiArICBpZiAobWF0Y2hlZF9ydWxlID09IG51bGxw dHIpDQo+PiArICAgIHsNCj4+ICsgICAgICBSaWNoTG9jYXRpb24gciAoaW52b2NfbG9jdXMp Ow0KPj4gKyAgICAgIHIuYWRkX3JhbmdlIChydWxlc19kZWYuZ2V0X2xvY3VzICgpKTsNCj4+ ICsgICAgICBydXN0X2Vycm9yX2F0IChyLCAiRmFpbGVkIHRvIG1hdGNoIGFueSBydWxlIHdp dGhpbiBtYWNybyIpOw0KPj4gKyAgICAgIHJldHVybiBBU1Q6OkFTVEZyYWdtZW50OjpjcmVh dGVfZXJyb3IgKCk7DQo+PiArICAgIH0NCj4+ICsNCj4+ICsgIHJldHVybiB0cmFuc2NyaWJl X3J1bGUgKCptYXRjaGVkX3J1bGUsIGludm9jX3Rva2VuX3RyZWUsIG1hdGNoZWRfZnJhZ21l bnRzLA0KPj4gKyAgICAgICAgICAgICAgICAgICAgICAgICBzZW1pY29sb24sIHBlZWtfY29u dGV4dCAoKSk7DQo+PiArfQ0KPj4gKw0KPj4gK3ZvaWQNCj4+ICtNYWNyb0V4cGFuZGVyOjpl eHBhbmRfaW52b2MgKEFTVDo6TWFjcm9JbnZvY2F0aW9uICZpbnZvYywgYm9vbCBoYXNfc2Vt aWNvbG9uKQ0KPj4gK3sNCj4+ICsgIGlmIChkZXB0aF9leGNlZWRzX3JlY3Vyc2lvbl9saW1p dCAoKSkNCj4+ICsgICAgew0KPj4gKyAgICAgIHJ1c3RfZXJyb3JfYXQgKGludm9jLmdldF9s b2N1cyAoKSwgInJlYWNoZWQgcmVjdXJzaW9uIGxpbWl0Iik7DQo+PiArICAgICAgcmV0dXJu Ow0KPj4gKyAgICB9DQo+PiArDQo+PiArICBBU1Q6Ok1hY3JvSW52b2NEYXRhICZpbnZvY19k YXRhID0gaW52b2MuZ2V0X2ludm9jX2RhdGEgKCk7DQo+PiArDQo+PiArICAvLyA/Pw0KPj4g KyAgLy8gc3dpdGNoIG9uIHR5cGUgb2YgbWFjcm86DQo+PiArICAvLyAgLSAnIScgc3ludGF4 IG1hY3JvIChpbm5lciBzd2l0Y2gpDQo+PiArICAvLyAgICAgIC0gcHJvY2VkdXJhbCBtYWNy byAtICJBIHRva2VuLWJhc2VkIGZ1bmN0aW9uLWxpa2UgbWFjcm8iDQo+PiArICAvLyAgICAg IC0gJ21hY3JvX3J1bGVzJyAoYnkgZXhhbXBsZS9wYXR0ZXJuLW1hdGNoKSBtYWNybz8gb3Ig bm90PyAiYW4NCj4+ICsgIC8vIEFTVC1iYXNlZCBmdW5jdGlvbi1saWtlIG1hY3JvIg0KPj4g KyAgLy8gICAgICAtIGVsc2UgaXMgdW5yZWFjaGFibGUNCj4+ICsgIC8vICAtIGF0dHJpYnV0 ZSBzeW50YXggbWFjcm8gKGlubmVyIHN3aXRjaCkNCj4+ICsgIC8vICAtIHByb2NlZHVyYWwg bWFjcm8gYXR0cmlidXRlIHN5bnRheCAtICJBIHRva2VuLWJhc2VkIGF0dHJpYnV0ZQ0KPj4g KyAgLy8gbWFjcm8iDQo+PiArICAvLyAgICAgIC0gbGVnYWN5IG1hY3JvIGF0dHJpYnV0ZSBz eW50YXg/IC0gImFuIEFTVC1iYXNlZCBhdHRyaWJ1dGUgbWFjcm8iDQo+PiArICAvLyAgICAg IC0gbm9uLW1hY3JvIGF0dHJpYnV0ZTogbWFyayBrbm93bg0KPj4gKyAgLy8gICAgICAtIGVs c2UgaXMgdW5yZWFjaGFibGUNCj4+ICsgIC8vICAtIGRlcml2ZSBtYWNybyAoaW5uZXIgc3dp dGNoKQ0KPj4gKyAgLy8gICAgICAtIGRlcml2ZSBvciBsZWdhY3kgZGVyaXZlIC0gInRva2Vu LWJhc2VkIiB2cyAiQVNULWJhc2VkIg0KPj4gKyAgLy8gICAgICAtIGVsc2UgaXMgdW5yZWFj aGFibGUNCj4+ICsgIC8vICAtIGRlcml2ZSBjb250YWluZXIgbWFjcm8gLSB1bnJlYWNoYWJs ZQ0KPj4gKw0KPj4gKyAgLy8gbG9va3VwIHRoZSBydWxlcyBmb3IgdGhpcyBtYWNybw0KPj4g KyAgTm9kZUlkIHJlc29sdmVkX25vZGUgPSBVTktOT1dOX05PREVJRDsNCj4+ICsgIE5vZGVJ ZCBzb3VyY2Vfbm9kZSA9IFVOS05PV05fTk9ERUlEOw0KPj4gKyAgaWYgKGhhc19zZW1pY29s b24pDQo+PiArICAgIHNvdXJjZV9ub2RlID0gaW52b2MuZ2V0X21hY3JvX25vZGVfaWQgKCk7 DQo+PiArICBlbHNlDQo+PiArICAgIHNvdXJjZV9ub2RlID0gaW52b2MuZ2V0X3BhdHRlcm5f bm9kZV9pZCAoKTsNCj4+ICsgIGF1dG8gc2VnDQo+PiArICAgID0gUmVzb2x2ZXI6OkNhbm9u aWNhbFBhdGg6Om5ld19zZWcgKHNvdXJjZV9ub2RlLA0KPj4gKyAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgIGludm9jX2RhdGEuZ2V0X3BhdGggKCkuYXNfc3RyaW5n ICgpKTsNCj4+ICsNCj4+ICsgIGJvb2wgZm91bmQgPSByZXNvbHZlci0+Z2V0X21hY3JvX3Nj b3BlICgpLmxvb2t1cCAoc2VnLCAmcmVzb2x2ZWRfbm9kZSk7DQo+PiArICBpZiAoIWZvdW5k KQ0KPj4gKyAgICB7DQo+PiArICAgICAgcnVzdF9lcnJvcl9hdCAoaW52b2MuZ2V0X2xvY3Vz ICgpLCAidW5rbm93biBtYWNybzogWyVzXSIsDQo+PiArICAgICAgICAgICAgICAgICAgICBz ZWcuZ2V0ICgpLmNfc3RyICgpKTsNCj4+ICsgICAgICByZXR1cm47DQo+PiArICAgIH0NCj4+ ICsNCj4+ICsgIC8vIGxvb2t1cCB0aGUgcnVsZXMNCj4+ICsgIEFTVDo6TWFjcm9SdWxlc0Rl ZmluaXRpb24gKnJ1bGVzX2RlZiA9IG51bGxwdHI7DQo+PiArICBib29sIG9rID0gbWFwcGlu Z3MtPmxvb2t1cF9tYWNyb19kZWYgKHJlc29sdmVkX25vZGUsICZydWxlc19kZWYpOw0KPj4g KyAgcnVzdF9hc3NlcnQgKG9rKTsNCj4+ICsNCj4+ICsgIGF1dG8gZnJhZ21lbnQgPSBBU1Q6 OkFTVEZyYWdtZW50OjpjcmVhdGVfZXJyb3IgKCk7DQo+PiArDQo+PiArICBpZiAocnVsZXNf ZGVmLT5pc19idWlsdGluICgpKQ0KPj4gKyAgICBmcmFnbWVudA0KPj4gKyAgICAgID0gcnVs ZXNfZGVmLT5nZXRfYnVpbHRpbl90cmFuc2NyaWJlciAoKSAoaW52b2MuZ2V0X2xvY3VzICgp LCBpbnZvY19kYXRhKTsNCj4+ICsgIGVsc2UNCj4+ICsgICAgZnJhZ21lbnQgPSBleHBhbmRf ZGVjbF9tYWNybyAoaW52b2MuZ2V0X2xvY3VzICgpLCBpbnZvY19kYXRhLCAqcnVsZXNfZGVm LA0KPj4gKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhhc19zZW1pY29sb24p Ow0KPj4gKw0KPj4gKyAgc2V0X2V4cGFuZGVkX2ZyYWdtZW50IChzdGQ6Om1vdmUgKGZyYWdt ZW50KSk7DQo+PiArfQ0KPj4gKw0KPj4gKy8qIERldGVybWluZXMgd2hldGhlciBhbnkgY2Zn IHByZWRpY2F0ZSBpcyBmYWxzZSBhbmQgaGVuY2UgaXRlbSB3aXRoIGF0dHJpYnV0ZXMNCj4+ ICsgKiBzaG91bGQgYmUgc3RyaXBwZWQuIE5vdGUgdGhhdCBhdHRyaWJ1dGVzIG11c3QgYmUg ZXhwYW5kZWQgYmVmb3JlIGNhbGxpbmcuICovDQo+PiArYm9vbA0KPj4gK01hY3JvRXhwYW5k ZXI6OmZhaWxzX2NmZyAoY29uc3QgQVNUOjpBdHRyVmVjICZhdHRycykgY29uc3QNCj4+ICt7 DQo+PiArICBmb3IgKGNvbnN0IGF1dG8gJmF0dHIgOiBhdHRycykNCj4+ICsgICAgew0KPj4g KyAgICAgIGlmIChhdHRyLmdldF9wYXRoICgpID09ICJjZmciICYmICFhdHRyLmNoZWNrX2Nm Z19wcmVkaWNhdGUgKHNlc3Npb24pKQ0KPj4gKyAgICAgICByZXR1cm4gdHJ1ZTsNCj4+ICsg ICAgfQ0KPj4gKyAgcmV0dXJuIGZhbHNlOw0KPj4gK30NCj4+ICsNCj4+ICsvKiBEZXRlcm1p bmVzIHdoZXRoZXIgYW55IGNmZyBwcmVkaWNhdGUgaXMgZmFsc2UgYW5kIGhlbmNlIGl0ZW0g d2l0aCBhdHRyaWJ1dGVzDQo+PiArICogc2hvdWxkIGJlIHN0cmlwcGVkLiBXaWxsIGV4cGFu ZCBhdHRyaWJ1dGVzIGFzIHdlbGwuICovDQo+PiArYm9vbA0KPj4gK01hY3JvRXhwYW5kZXI6 OmZhaWxzX2NmZ193aXRoX2V4cGFuZCAoQVNUOjpBdHRyVmVjICZhdHRycykgY29uc3QNCj4+ ICt7DQo+PiArICAvLyBUT0RPOiBtYXliZSBoYXZlIHNvbWV0aGluZyB0aGF0IHN0cmlwcyBj ZmcgYXR0cmlidXRlcyB0aGF0IGV2YWx1YXRlIHRydWU/DQo+PiArICBmb3IgKGF1dG8gJmF0 dHIgOiBhdHRycykNCj4+ICsgICAgew0KPj4gKyAgICAgIGlmIChhdHRyLmdldF9wYXRoICgp ID09ICJjZmciKQ0KPj4gKyAgICAgICB7DQo+PiArICAgICAgICAgaWYgKCFhdHRyLmlzX3Bh cnNlZF90b19tZXRhX2l0ZW0gKCkpDQo+PiArICAgICAgICAgICBhdHRyLnBhcnNlX2F0dHJf dG9fbWV0YV9pdGVtICgpOw0KPj4gKw0KPj4gKyAgICAgICAgIC8vIERFQlVHDQo+PiArICAg ICAgICAgaWYgKCFhdHRyLmlzX3BhcnNlZF90b19tZXRhX2l0ZW0gKCkpDQo+PiArICAgICAg ICAgICBydXN0X2RlYnVnICgiZmFpbGVkIHRvIHBhcnNlIGF0dHIgdG8gbWV0YSBpdGVtLCBy aWdodCBiZWZvcmUgIg0KPj4gKyAgICAgICAgICAgICAgICAgICAgICAgImNmZyBwcmVkaWNh dGUgY2hlY2siKTsNCj4+ICsgICAgICAgICBlbHNlDQo+PiArICAgICAgICAgICBydXN0X2Rl YnVnICgiYXR0ciBoYXMgYmVlbiBzdWNjZXNzZnVsbHkgcGFyc2VkIHRvIG1ldGEgaXRlbSwg Ig0KPj4gKyAgICAgICAgICAgICAgICAgICAgICAgInJpZ2h0IGJlZm9yZSBjZmcgcHJlZGlj YXRlIGNoZWNrIik7DQo+PiArDQo+PiArICAgICAgICAgaWYgKCFhdHRyLmNoZWNrX2NmZ19w cmVkaWNhdGUgKHNlc3Npb24pKQ0KPj4gKyAgICAgICAgICAgew0KPj4gKyAgICAgICAgICAg ICAvLyBERUJVRw0KPj4gKyAgICAgICAgICAgICBydXN0X2RlYnVnICgNCj4+ICsgICAgICAg ICAgICAgICAiY2ZnIHByZWRpY2F0ZSBmYWlsZWQgZm9yIGF0dHJpYnV0ZTogXDAzM1swOzMx bSclcydcMDMzWzBtIiwNCj4+ICsgICAgICAgICAgICAgICBhdHRyLmFzX3N0cmluZyAoKS5j X3N0ciAoKSk7DQo+PiArDQo+PiArICAgICAgICAgICAgIHJldHVybiB0cnVlOw0KPj4gKyAg ICAgICAgICAgfQ0KPj4gKyAgICAgICAgIGVsc2UNCj4+ICsgICAgICAgICAgIHsNCj4+ICsg ICAgICAgICAgICAgLy8gREVCVUcNCj4+ICsgICAgICAgICAgICAgcnVzdF9kZWJ1ZyAoImNm ZyBwcmVkaWNhdGUgc3VjY2VlZGVkIGZvciBhdHRyaWJ1dGU6ICINCj4+ICsgICAgICAgICAg ICAgICAgICAgICAgICAgIlwwMzNbMDszMW0nJXMnXDAzM1swbSIsDQo+PiArICAgICAgICAg ICAgICAgICAgICAgICAgIGF0dHIuYXNfc3RyaW5nICgpLmNfc3RyICgpKTsNCj4+ICsgICAg ICAgICAgIH0NCj4+ICsgICAgICAgfQ0KPj4gKyAgICB9DQo+PiArICByZXR1cm4gZmFsc2U7 DQo+PiArfQ0KPj4gKw0KPj4gKy8vIEV4cGFuZHMgY2ZnX2F0dHIgYXR0cmlidXRlcy4NCj4+ ICt2b2lkDQo+PiArTWFjcm9FeHBhbmRlcjo6ZXhwYW5kX2NmZ19hdHRycyAoQVNUOjpBdHRy VmVjICZhdHRycykNCj4+ICt7DQo+PiArICBmb3IgKHN0ZDo6c2l6ZV90IGkgPSAwOyBpIDwg YXR0cnMuc2l6ZSAoKTsgaSsrKQ0KPj4gKyAgICB7DQo+PiArICAgICAgYXV0byAmYXR0ciA9 IGF0dHJzW2ldOw0KPj4gKyAgICAgIGlmIChhdHRyLmdldF9wYXRoICgpID09ICJjZmdfYXR0 ciIpDQo+PiArICAgICAgIHsNCj4+ICsgICAgICAgICBpZiAoIWF0dHIuaXNfcGFyc2VkX3Rv X21ldGFfaXRlbSAoKSkNCj4+ICsgICAgICAgICAgIGF0dHIucGFyc2VfYXR0cl90b19tZXRh X2l0ZW0gKCk7DQo+PiArDQo+PiArICAgICAgICAgaWYgKGF0dHIuY2hlY2tfY2ZnX3ByZWRp Y2F0ZSAoc2Vzc2lvbikpDQo+PiArICAgICAgICAgICB7DQo+PiArICAgICAgICAgICAgIC8v IHNwbGl0IG9mZiBjZmdfYXR0cg0KPj4gKyAgICAgICAgICAgICBBU1Q6OkF0dHJWZWMgbmV3 X2F0dHJzID0gYXR0ci5zZXBhcmF0ZV9jZmdfYXR0cnMgKCk7DQo+PiArDQo+PiArICAgICAg ICAgICAgIC8vIHJlbW92ZSBhdHRyIGZyb20gdmVjdG9yDQo+PiArICAgICAgICAgICAgIGF0 dHJzLmVyYXNlIChhdHRycy5iZWdpbiAoKSArIGkpOw0KPj4gKw0KPj4gKyAgICAgICAgICAg ICAvLyBhZGQgbmV3IGF0dHJzIHRvIHZlY3Rvcg0KPj4gKyAgICAgICAgICAgICBhdHRycy5p bnNlcnQgKGF0dHJzLmJlZ2luICgpICsgaSwNCj4+ICsgICAgICAgICAgICAgICAgICAgICAg ICAgICBzdGQ6Om1ha2VfbW92ZV9pdGVyYXRvciAobmV3X2F0dHJzLmJlZ2luICgpKSwNCj4+ ICsgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6Om1ha2VfbW92ZV9pdGVyYXRvciAo bmV3X2F0dHJzLmVuZCAoKSkpOw0KPj4gKyAgICAgICAgICAgfQ0KPj4gKw0KPj4gKyAgICAg ICAgIC8qIGRvIHNvbWV0aGluZyAtIGlmIGZlYXR1cmUgKGZpcnN0IHRva2VuIGluIHRyZWUp IGlzIGluIGZhY3QgZW5hYmxlZCwNCj4+ICsgICAgICAgICAgKiBtYWtlIHRva2VucyBsaXN0 ZWQgYWZ0ZXJ3YXJkcyBpbnRvIGF0dHJpYnV0ZXMuIGkuZS46IGZvcg0KPj4gKyAgICAgICAg ICAqIFtjZmdfYXR0cihmZWF0dXJlID0gIndvdyIsIHdvdzEsIHdvdzIpXSwgaWYgIndvdyIg aXMgdHJ1ZSwgdGhlbiBhZGQNCj4+ICsgICAgICAgICAgKiBhdHRyaWJ1dGVzIFt3b3cxXSBh bmQgW3dvdzJdIHRvIGF0dHJpYnV0ZSBsaXN0LiBUaGlzIGNhbiBhbHNvIGJlDQo+PiArICAg ICAgICAgICogcmVjdXJzaXZlLCBzbyBjaGVjayBmb3IgZXhwYW5kZWQgYXR0cmlidXRlcyBi ZWluZyByZWN1cnNpdmUgYW5kDQo+PiArICAgICAgICAgICogcG9zc2libHkgcmVjdXJzaXZl bHkgY2FsbCB0aGUgZXhwYW5kX2F0dHJzPyAqLw0KPj4gKyAgICAgICB9DQo+PiArICAgICAg ZWxzZQ0KPj4gKyAgICAgICB7DQo+PiArICAgICAgICAgaSsrOw0KPj4gKyAgICAgICB9DQo+ PiArICAgIH0NCj4+ICsgIGF0dHJzLnNocmlua190b19maXQgKCk7DQo+PiArfQ0KPj4gKw0K Pj4gK3ZvaWQNCj4+ICtNYWNyb0V4cGFuZGVyOjpleHBhbmRfY3JhdGUgKCkNCj4+ICt7DQo+ PiArICBOb2RlSWQgc2NvcGVfbm9kZV9pZCA9IGNyYXRlLmdldF9ub2RlX2lkICgpOw0KPj4g KyAgcmVzb2x2ZXItPmdldF9tYWNyb19zY29wZSAoKS5wdXNoIChzY29wZV9ub2RlX2lkKTsN Cj4+ICsNCj4+ICsgIC8qIGZpbGwgbWFjcm8vZGVjb3JhdG9yIG1hcCBmcm9tIGluaXQgbGlz dD8gbm90IHN1cmUgd2hlcmUgaW5pdCBsaXN0IGNvbWVzDQo+PiArICAgKiBmcm9tPyAqLw0K Pj4gKw0KPj4gKyAgLy8gVE9ETzogZG9lcyBjZmcgYXBwbHkgZm9yIGlubmVyIGF0dHJpYnV0 ZXM/IHJlc2VhcmNoLg0KPj4gKyAgLy8gdGhlIGFwcGFyZW50IGFuc3dlciAoZnJvbSBwbGF5 Z3JvdW5kIHRlc3QpIGlzIHllcw0KPj4gKw0KPj4gKyAgLy8gZXhwYW5kIGNyYXRlIGNmZ19h dHRyIGF0dHJpYnV0ZXMNCj4+ICsgIGV4cGFuZF9jZmdfYXR0cnMgKGNyYXRlLmlubmVyX2F0 dHJzKTsNCj4+ICsNCj4+ICsgIGlmIChmYWlsc19jZmdfd2l0aF9leHBhbmQgKGNyYXRlLmlu bmVyX2F0dHJzKSkNCj4+ICsgICAgew0KPj4gKyAgICAgIC8vIGJhc2ljYWxseSwgZGVsZXRl IHdob2xlIGNyYXRlDQo+PiArICAgICAgY3JhdGUuc3RyaXBfY3JhdGUgKCk7DQo+PiArICAg ICAgLy8gVE9ETzogbWF5YmUgY3JlYXRlIHdhcm5pbmcgaGVyZT8gcHJvYmFibHkgbm90IGRl c2lyZWQgYmVoYXZpb3VyDQo+PiArICAgIH0NCj4+ICsgIC8vIGV4cGFuZCBtb2R1bGUgYXR0 cmlidXRlcz8NCj4+ICsNCj4+ICsgIHB1c2hfY29udGV4dCAoSVRFTSk7DQo+PiArDQo+PiAr ICAvLyBleHBhbmQgYXR0cmlidXRlcyByZWN1cnNpdmVseSBhbmQgc3RyaXAgaXRlbXMgaWYg cmVxdWlyZWQNCj4+ICsgIEF0dHJWaXNpdG9yIGF0dHJfdmlzaXRvciAoKnRoaXMpOw0KPj4g KyAgYXV0byAmaXRlbXMgPSBjcmF0ZS5pdGVtczsNCj4+ICsgIGZvciAoYXV0byBpdCA9IGl0 ZW1zLmJlZ2luICgpOyBpdCAhPSBpdGVtcy5lbmQgKCk7KQ0KPj4gKyAgICB7DQo+PiArICAg ICAgYXV0byAmaXRlbSA9ICppdDsNCj4+ICsNCj4+ICsgICAgICAvLyBtYXJrIGZvciBzdHJp cHBpbmcgaWYgcmVxdWlyZWQNCj4+ICsgICAgICBpdGVtLT5hY2NlcHRfdmlzIChhdHRyX3Zp c2l0b3IpOw0KPj4gKw0KPj4gKyAgICAgIGF1dG8gZnJhZ21lbnQgPSB0YWtlX2V4cGFuZGVk X2ZyYWdtZW50IChhdHRyX3Zpc2l0b3IpOw0KPj4gKyAgICAgIGlmIChmcmFnbWVudC5zaG91 bGRfZXhwYW5kICgpKQ0KPj4gKyAgICAgICB7DQo+PiArICAgICAgICAgLy8gUmVtb3ZlIHRo ZSBjdXJyZW50IGV4cGFuZGVkIGludm9jYXRpb24NCj4+ICsgICAgICAgICBpdCA9IGl0ZW1z LmVyYXNlIChpdCk7DQo+PiArICAgICAgICAgZm9yIChhdXRvICZub2RlIDogZnJhZ21lbnQu Z2V0X25vZGVzICgpKQ0KPj4gKyAgICAgICAgICAgew0KPj4gKyAgICAgICAgICAgICBpdCA9 IGl0ZW1zLmluc2VydCAoaXQsIG5vZGUudGFrZV9pdGVtICgpKTsNCj4+ICsgICAgICAgICAg ICAgaXQrKzsNCj4+ICsgICAgICAgICAgIH0NCj4+ICsgICAgICAgfQ0KPj4gKyAgICAgIGVs c2UgaWYgKGl0ZW0tPmlzX21hcmtlZF9mb3Jfc3RyaXAgKCkpDQo+PiArICAgICAgIGl0ID0g aXRlbXMuZXJhc2UgKGl0KTsNCj4+ICsgICAgICBlbHNlDQo+PiArICAgICAgIGl0Kys7DQo+ PiArICAgIH0NCj4+ICsNCj4+ICsgIHBvcF9jb250ZXh0ICgpOw0KPj4gKw0KPj4gKyAgLy8g VE9ETzogc2hvdWxkIHJlY3Vyc2l2ZSBhdHRyaWJ1dGUgYW5kIG1hY3JvIGV4cGFuc2lvbiBi ZSBkb25lIGluIHRoZSBzYW1lDQo+PiArICAvLyB0cmFuc3ZlcnNhbD8gT3IgaW4gc2VwYXJh dGUgb25lcyBsaWtlIGN1cnJlbnRseT8NCj4+ICsNCj4+ICsgIC8vIGV4cGFuZCBtb2R1bGUg dHJlZSByZWN1cnNpdmVseQ0KPj4gKw0KPj4gKyAgLy8gcG9zdC1wcm9jZXNzDQo+PiArDQo+ PiArICAvLyBleHRyYWN0IGV4cG9ydGVkIG1hY3Jvcz8NCj4+ICt9DQo+PiArDQo+PiArYm9v bA0KPj4gK01hY3JvRXhwYW5kZXI6OmRlcHRoX2V4Y2VlZHNfcmVjdXJzaW9uX2xpbWl0ICgp IGNvbnN0DQo+PiArew0KPj4gKyAgcmV0dXJuIGV4cGFuc2lvbl9kZXB0aCA+PSBjZmcucmVj dXJzaW9uX2xpbWl0Ow0KPj4gK30NCj4+ICsNCj4+ICtib29sDQo+PiArTWFjcm9FeHBhbmRl cjo6dHJ5X21hdGNoX3J1bGUgKEFTVDo6TWFjcm9SdWxlICZtYXRjaF9ydWxlLA0KPj4gKyAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFTVDo6RGVsaW1Ub2tlblRyZWUgJmludm9j X3Rva2VuX3RyZWUpDQo+PiArew0KPj4gKyAgTWFjcm9JbnZvY0xleGVyIGxleCAoaW52b2Nf dG9rZW5fdHJlZS50b190b2tlbl9zdHJlYW0gKCkpOw0KPj4gKyAgUGFyc2VyPE1hY3JvSW52 b2NMZXhlcj4gcGFyc2VyIChsZXgpOw0KPj4gKw0KPj4gKyAgQVNUOjpNYWNyb01hdGNoZXIg Jm1hdGNoZXIgPSBtYXRjaF9ydWxlLmdldF9tYXRjaGVyICgpOw0KPj4gKw0KPj4gKyAgZXhw YW5zaW9uX2RlcHRoKys7DQo+PiArICBpZiAoIW1hdGNoX21hdGNoZXIgKHBhcnNlciwgbWF0 Y2hlcikpDQo+PiArICAgIHsNCj4+ICsgICAgICBleHBhbnNpb25fZGVwdGgtLTsNCj4+ICsg ICAgICByZXR1cm4gZmFsc2U7DQo+PiArICAgIH0NCj4+ICsgIGV4cGFuc2lvbl9kZXB0aC0t Ow0KPj4gKw0KPj4gKyAgYm9vbCB1c2VkX2FsbF9pbnB1dF90b2tlbnMgPSBwYXJzZXIuc2tp cF90b2tlbiAoRU5EX09GX0ZJTEUpOw0KPj4gKyAgcmV0dXJuIHVzZWRfYWxsX2lucHV0X3Rv a2VuczsNCj4+ICt9DQo+PiArDQo+PiArYm9vbA0KPj4gK01hY3JvRXhwYW5kZXI6Om1hdGNo X2ZyYWdtZW50IChQYXJzZXI8TWFjcm9JbnZvY0xleGVyPiAmcGFyc2VyLA0KPj4gKyAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgIEFTVDo6TWFjcm9NYXRjaEZyYWdtZW50ICZmcmFn bWVudCkNCj4+ICt7DQo+PiArICBzd2l0Y2ggKGZyYWdtZW50LmdldF9mcmFnX3NwZWMgKCku Z2V0X2tpbmQgKCkpDQo+PiArICAgIHsNCj4+ICsgICAgY2FzZSBBU1Q6Ok1hY3JvRnJhZ1Nw ZWM6OkVYUFI6DQo+PiArICAgICAgcGFyc2VyLnBhcnNlX2V4cHIgKCk7DQo+PiArICAgICAg YnJlYWs7DQo+PiArDQo+PiArICAgIGNhc2UgQVNUOjpNYWNyb0ZyYWdTcGVjOjpCTE9DSzoN Cj4+ICsgICAgICBwYXJzZXIucGFyc2VfYmxvY2tfZXhwciAoKTsNCj4+ICsgICAgICBicmVh azsNCj4+ICsNCj4+ICsgICAgY2FzZSBBU1Q6Ok1hY3JvRnJhZ1NwZWM6OklERU5UOg0KPj4g KyAgICAgIHBhcnNlci5wYXJzZV9pZGVudGlmaWVyX3BhdHRlcm4gKCk7DQo+PiArICAgICAg YnJlYWs7DQo+PiArDQo+PiArICAgIGNhc2UgQVNUOjpNYWNyb0ZyYWdTcGVjOjpMSVRFUkFM Og0KPj4gKyAgICAgIHBhcnNlci5wYXJzZV9saXRlcmFsX2V4cHIgKCk7DQo+PiArICAgICAg YnJlYWs7DQo+PiArDQo+PiArICAgIGNhc2UgQVNUOjpNYWNyb0ZyYWdTcGVjOjpJVEVNOg0K Pj4gKyAgICAgIHBhcnNlci5wYXJzZV9pdGVtIChmYWxzZSk7DQo+PiArICAgICAgYnJlYWs7 DQo+PiArDQo+PiArICAgIGNhc2UgQVNUOjpNYWNyb0ZyYWdTcGVjOjpUWToNCj4+ICsgICAg ICBwYXJzZXIucGFyc2VfdHlwZSAoKTsNCj4+ICsgICAgICBicmVhazsNCj4+ICsNCj4+ICsg ICAgY2FzZSBBU1Q6Ok1hY3JvRnJhZ1NwZWM6OlBBVDoNCj4+ICsgICAgICBwYXJzZXIucGFy c2VfcGF0dGVybiAoKTsNCj4+ICsgICAgICBicmVhazsNCj4+ICsNCj4+ICsgICAgY2FzZSBB U1Q6Ok1hY3JvRnJhZ1NwZWM6OlBBVEg6DQo+PiArICAgICAgcGFyc2VyLnBhcnNlX3BhdGhf aW5fZXhwcmVzc2lvbiAoKTsNCj4+ICsgICAgICBicmVhazsNCj4+ICsNCj4+ICsgICAgY2Fz ZSBBU1Q6Ok1hY3JvRnJhZ1NwZWM6OlZJUzoNCj4+ICsgICAgICBwYXJzZXIucGFyc2Vfdmlz aWJpbGl0eSAoKTsNCj4+ICsgICAgICBicmVhazsNCj4+ICsNCj4+ICsgICAgICBjYXNlIEFT VDo6TWFjcm9GcmFnU3BlYzo6U1RNVDogew0KPj4gKyAgICAgICBhdXRvIHJlc3RyaWN0aW9u cyA9IFBhcnNlUmVzdHJpY3Rpb25zICgpOw0KPj4gKyAgICAgICByZXN0cmljdGlvbnMuY29u c3VtZV9zZW1pID0gZmFsc2U7DQo+PiArICAgICAgIHBhcnNlci5wYXJzZV9zdG10IChyZXN0 cmljdGlvbnMpOw0KPj4gKyAgICAgICBicmVhazsNCj4+ICsgICAgICB9DQo+PiArDQo+PiAr ICAgIGNhc2UgQVNUOjpNYWNyb0ZyYWdTcGVjOjpMSUZFVElNRToNCj4+ICsgICAgICBwYXJz ZXIucGFyc2VfbGlmZXRpbWVfcGFyYW1zICgpOw0KPj4gKyAgICAgIGJyZWFrOw0KPj4gKw0K Pj4gKyAgICAgIC8vIGlzIG1ldGEgYXR0cmlidXRlcz8NCj4+ICsgICAgY2FzZSBBU1Q6Ok1h Y3JvRnJhZ1NwZWM6Ok1FVEE6DQo+PiArICAgICAgcGFyc2VyLnBhcnNlX2F0dHJpYnV0ZV9i b2R5ICgpOw0KPj4gKyAgICAgIGJyZWFrOw0KPj4gKw0KPj4gKyAgICBjYXNlIEFTVDo6TWFj cm9GcmFnU3BlYzo6VFQ6DQo+PiArICAgICAgcGFyc2VyLnBhcnNlX3Rva2VuX3RyZWUgKCk7 DQo+PiArICAgICAgYnJlYWs7DQo+PiArDQo+PiArICAgICAgLy8gaSBndWVzcyB3ZSBqdXN0 IGlnbm9yZSBpbnZhbGlkIGFuZCBqdXN0IGVycm9yIG91dA0KPj4gKyAgICBjYXNlIEFTVDo6 TWFjcm9GcmFnU3BlYzo6SU5WQUxJRDoNCj4+ICsgICAgICByZXR1cm4gZmFsc2U7DQo+PiAr ICAgIH0NCj4+ICsNCj4+ICsgIC8vIGl0IG1hdGNoZXMgaWYgdGhlIHBhcnNlciBkaWQgbm90 IHByb2R1Y2UgZXJyb3JzIHRyeWluZyB0byBwYXJzZSB0aGF0IHR5cGUNCj4+ICsgIC8vIG9m IGl0ZW0NCj4+ICsgIHJldHVybiAhcGFyc2VyLmhhc19lcnJvcnMgKCk7DQo+PiArfQ0KPj4g Kw0KPj4gK2Jvb2wNCj4+ICtNYWNyb0V4cGFuZGVyOjptYXRjaF9tYXRjaGVyIChQYXJzZXI8 TWFjcm9JbnZvY0xleGVyPiAmcGFyc2VyLA0KPj4gKyAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgQVNUOjpNYWNyb01hdGNoZXIgJm1hdGNoZXIpDQo+PiArew0KPj4gKyAgaWYgKGRl cHRoX2V4Y2VlZHNfcmVjdXJzaW9uX2xpbWl0ICgpKQ0KPj4gKyAgICB7DQo+PiArICAgICAg cnVzdF9lcnJvcl9hdCAobWF0Y2hlci5nZXRfbWF0Y2hfbG9jdXMgKCksICJyZWFjaGVkIHJl Y3Vyc2lvbiBsaW1pdCIpOw0KPj4gKyAgICAgIHJldHVybiBmYWxzZTsNCj4+ICsgICAgfQ0K Pj4gKw0KPj4gKyAgYXV0byBkZWxpbWl0ZXIgPSBwYXJzZXIucGVla19jdXJyZW50X3Rva2Vu ICgpOw0KPj4gKw0KPj4gKyAgLy8gdGhpcyBpcyB1c2VkIHNvIHdlIGNhbiBjaGVjayB0aGF0 IHdlIGRlbGltaXQgdGhlIHN0cmVhbSBjb3JyZWN0bHkuDQo+PiArICBzd2l0Y2ggKGRlbGlt aXRlci0+Z2V0X2lkICgpKQ0KPj4gKyAgICB7DQo+PiArICAgICAgY2FzZSBMRUZUX1BBUkVO OiB7DQo+PiArICAgICAgIGlmICghcGFyc2VyLnNraXBfdG9rZW4gKExFRlRfUEFSRU4pKQ0K Pj4gKyAgICAgICAgIHJldHVybiBmYWxzZTsNCj4+ICsgICAgICB9DQo+PiArICAgICAgYnJl YWs7DQo+PiArDQo+PiArICAgICAgY2FzZSBMRUZUX1NRVUFSRTogew0KPj4gKyAgICAgICBp ZiAoIXBhcnNlci5za2lwX3Rva2VuIChMRUZUX1NRVUFSRSkpDQo+PiArICAgICAgICAgcmV0 dXJuIGZhbHNlOw0KPj4gKyAgICAgIH0NCj4+ICsgICAgICBicmVhazsNCj4+ICsNCj4+ICsg ICAgICBjYXNlIExFRlRfQ1VSTFk6IHsNCj4+ICsgICAgICAgaWYgKCFwYXJzZXIuc2tpcF90 b2tlbiAoTEVGVF9DVVJMWSkpDQo+PiArICAgICAgICAgcmV0dXJuIGZhbHNlOw0KPj4gKyAg ICAgIH0NCj4+ICsgICAgICBicmVhazsNCj4+ICsgICAgZGVmYXVsdDoNCj4+ICsgICAgICBn Y2NfdW5yZWFjaGFibGUgKCk7DQo+PiArICAgIH0NCj4+ICsNCj4+ICsgIGNvbnN0IE1hY3Jv SW52b2NMZXhlciAmc291cmNlID0gcGFyc2VyLmdldF90b2tlbl9zb3VyY2UgKCk7DQo+PiAr DQo+PiArICBmb3IgKGF1dG8gJm1hdGNoIDogbWF0Y2hlci5nZXRfbWF0Y2hlcyAoKSkNCj4+ ICsgICAgew0KPj4gKyAgICAgIHNpemVfdCBvZmZzX2JlZ2luID0gc291cmNlLmdldF9vZmZz ICgpOw0KPj4gKw0KPj4gKyAgICAgIHN3aXRjaCAobWF0Y2gtPmdldF9tYWNyb19tYXRjaF90 eXBlICgpKQ0KPj4gKyAgICAgICB7DQo+PiArICAgICAgICAgY2FzZSBBU1Q6Ok1hY3JvTWF0 Y2g6Ok1hY3JvTWF0Y2hUeXBlOjpGcmFnbWVudDogew0KPj4gKyAgICAgICAgICAgQVNUOjpN YWNyb01hdGNoRnJhZ21lbnQgKmZyYWdtZW50DQo+PiArICAgICAgICAgICAgID0gc3RhdGlj X2Nhc3Q8QVNUOjpNYWNyb01hdGNoRnJhZ21lbnQgKj4gKG1hdGNoLmdldCAoKSk7DQo+PiAr ICAgICAgICAgICBpZiAoIW1hdGNoX2ZyYWdtZW50IChwYXJzZXIsICpmcmFnbWVudCkpDQo+ PiArICAgICAgICAgICAgIHJldHVybiBmYWxzZTsNCj4+ICsNCj4+ICsgICAgICAgICAgIC8v IG1hdGNoZWQgZnJhZ21lbnQgZ2V0IHRoZSBvZmZzZXQgaW4gdGhlIHRva2VuIHN0cmVhbQ0K Pj4gKyAgICAgICAgICAgc2l6ZV90IG9mZnNfZW5kID0gc291cmNlLmdldF9vZmZzICgpOw0K Pj4gKyAgICAgICAgICAgc3ViX3N0YWNrLmluc2VydF9tZXRhdmFyICgNCj4+ICsgICAgICAg ICAgICAgTWF0Y2hlZEZyYWdtZW50IChmcmFnbWVudC0+Z2V0X2lkZW50ICgpLCBvZmZzX2Jl Z2luLCBvZmZzX2VuZCkpOw0KPj4gKyAgICAgICAgIH0NCj4+ICsgICAgICAgICBicmVhazsN Cj4+ICsNCj4+ICsgICAgICAgICBjYXNlIEFTVDo6TWFjcm9NYXRjaDo6TWFjcm9NYXRjaFR5 cGU6OlRvazogew0KPj4gKyAgICAgICAgICAgQVNUOjpUb2tlbiAqdG9rID0gc3RhdGljX2Nh c3Q8QVNUOjpUb2tlbiAqPiAobWF0Y2guZ2V0ICgpKTsNCj4+ICsgICAgICAgICAgIGlmICgh bWF0Y2hfdG9rZW4gKHBhcnNlciwgKnRvaykpDQo+PiArICAgICAgICAgICAgIHJldHVybiBm YWxzZTsNCj4+ICsgICAgICAgICB9DQo+PiArICAgICAgICAgYnJlYWs7DQo+PiArDQo+PiAr ICAgICAgICAgY2FzZSBBU1Q6Ok1hY3JvTWF0Y2g6Ok1hY3JvTWF0Y2hUeXBlOjpSZXBldGl0 aW9uOiB7DQo+PiArICAgICAgICAgICBBU1Q6Ok1hY3JvTWF0Y2hSZXBldGl0aW9uICpyZXAN Cj4+ICsgICAgICAgICAgICAgPSBzdGF0aWNfY2FzdDxBU1Q6Ok1hY3JvTWF0Y2hSZXBldGl0 aW9uICo+IChtYXRjaC5nZXQgKCkpOw0KPj4gKyAgICAgICAgICAgaWYgKCFtYXRjaF9yZXBl dGl0aW9uIChwYXJzZXIsICpyZXApKQ0KPj4gKyAgICAgICAgICAgICByZXR1cm4gZmFsc2U7 DQo+PiArICAgICAgICAgfQ0KPj4gKyAgICAgICAgIGJyZWFrOw0KPj4gKw0KPj4gKyAgICAg ICAgIGNhc2UgQVNUOjpNYWNyb01hdGNoOjpNYWNyb01hdGNoVHlwZTo6TWF0Y2hlcjogew0K Pj4gKyAgICAgICAgICAgQVNUOjpNYWNyb01hdGNoZXIgKm0NCj4+ICsgICAgICAgICAgICAg PSBzdGF0aWNfY2FzdDxBU1Q6Ok1hY3JvTWF0Y2hlciAqPiAobWF0Y2guZ2V0ICgpKTsNCj4+ ICsgICAgICAgICAgIGV4cGFuc2lvbl9kZXB0aCsrOw0KPj4gKyAgICAgICAgICAgaWYgKCFt YXRjaF9tYXRjaGVyIChwYXJzZXIsICptKSkNCj4+ICsgICAgICAgICAgICAgew0KPj4gKyAg ICAgICAgICAgICAgIGV4cGFuc2lvbl9kZXB0aC0tOw0KPj4gKyAgICAgICAgICAgICAgIHJl dHVybiBmYWxzZTsNCj4+ICsgICAgICAgICAgICAgfQ0KPj4gKyAgICAgICAgICAgZXhwYW5z aW9uX2RlcHRoLS07DQo+PiArICAgICAgICAgfQ0KPj4gKyAgICAgICAgIGJyZWFrOw0KPj4g KyAgICAgICB9DQo+PiArICAgIH0NCj4+ICsNCj4+ICsgIHN3aXRjaCAoZGVsaW1pdGVyLT5n ZXRfaWQgKCkpDQo+PiArICAgIHsNCj4+ICsgICAgICBjYXNlIExFRlRfUEFSRU46IHsNCj4+ ICsgICAgICAgaWYgKCFwYXJzZXIuc2tpcF90b2tlbiAoUklHSFRfUEFSRU4pKQ0KPj4gKyAg ICAgICAgIHJldHVybiBmYWxzZTsNCj4+ICsgICAgICB9DQo+PiArICAgICAgYnJlYWs7DQo+ PiArDQo+PiArICAgICAgY2FzZSBMRUZUX1NRVUFSRTogew0KPj4gKyAgICAgICBpZiAoIXBh cnNlci5za2lwX3Rva2VuIChSSUdIVF9TUVVBUkUpKQ0KPj4gKyAgICAgICAgIHJldHVybiBm YWxzZTsNCj4+ICsgICAgICB9DQo+PiArICAgICAgYnJlYWs7DQo+PiArDQo+PiArICAgICAg Y2FzZSBMRUZUX0NVUkxZOiB7DQo+PiArICAgICAgIGlmICghcGFyc2VyLnNraXBfdG9rZW4g KFJJR0hUX0NVUkxZKSkNCj4+ICsgICAgICAgICByZXR1cm4gZmFsc2U7DQo+PiArICAgICAg fQ0KPj4gKyAgICAgIGJyZWFrOw0KPj4gKyAgICBkZWZhdWx0Og0KPj4gKyAgICAgIGdjY191 bnJlYWNoYWJsZSAoKTsNCj4+ICsgICAgfQ0KPj4gKw0KPj4gKyAgcmV0dXJuIHRydWU7DQo+ PiArfQ0KPj4gKw0KPj4gK2Jvb2wNCj4+ICtNYWNyb0V4cGFuZGVyOjptYXRjaF90b2tlbiAo UGFyc2VyPE1hY3JvSW52b2NMZXhlcj4gJnBhcnNlciwgQVNUOjpUb2tlbiAmdG9rZW4pDQo+ PiArew0KPj4gKyAgLy8gRklYTUUgdGhpcyBuZWVkcyB0byBhY3R1YWxseSBtYXRjaCB0aGUg Y29udGVudCBhbmQgdGhlIHR5cGUNCj4+ICsgIHJldHVybiBwYXJzZXIuc2tpcF90b2tlbiAo dG9rZW4uZ2V0X2lkICgpKTsNCj4+ICt9DQo+PiArDQo+PiArYm9vbA0KPj4gK01hY3JvRXhw YW5kZXI6Om1hdGNoX25fbWF0Y2hlcyAoUGFyc2VyPE1hY3JvSW52b2NMZXhlcj4gJnBhcnNl ciwNCj4+ICsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVNUOjpNYWNyb01hdGNo UmVwZXRpdGlvbiAmcmVwLA0KPj4gKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBz aXplX3QgJm1hdGNoX2Ftb3VudCwgc2l6ZV90IGxvX2JvdW5kLA0KPj4gKyAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICBzaXplX3QgaGlfYm91bmQpDQo+PiArew0KPj4gKyAgbWF0 Y2hfYW1vdW50ID0gMDsNCj4+ICsgIGF1dG8gJm1hdGNoZXMgPSByZXAuZ2V0X21hdGNoZXMg KCk7DQo+PiArDQo+PiArICBjb25zdCBNYWNyb0ludm9jTGV4ZXIgJnNvdXJjZSA9IHBhcnNl ci5nZXRfdG9rZW5fc291cmNlICgpOw0KPj4gKyAgd2hpbGUgKHRydWUpDQo+PiArICAgIHsN Cj4+ICsgICAgICAvLyBJZiB0aGUgY3VycmVudCB0b2tlbiBpcyBhIGNsb3NpbmcgbWFjcm8g ZGVsaW1pdGVyLCBicmVhayBhd2F5Lg0KPj4gKyAgICAgIC8vIFRPRE86IElzIHRoaXMgY29y cmVjdD8NCj4+ICsgICAgICBhdXRvIHRfaWQgPSBwYXJzZXIucGVla19jdXJyZW50X3Rva2Vu ICgpLT5nZXRfaWQgKCk7DQo+PiArICAgICAgaWYgKHRfaWQgPT0gUklHSFRfUEFSRU4gfHwg dF9pZCA9PSBSSUdIVF9TUVVBUkUgfHwgdF9pZCA9PSBSSUdIVF9DVVJMWSkNCj4+ICsgICAg ICAgYnJlYWs7DQo+PiArDQo+PiArICAgICAgLy8gU2tpcCBwYXJzaW5nIGEgc2VwYXJhdG9y IG9uIHRoZSBmaXJzdCBtYXRjaCwgb3RoZXJ3aXNlIGNvbnN1bWUgaXQuDQo+PiArICAgICAg Ly8gSWYgaXQgaXNuJ3QgcHJlc2VudCwgdGhpcyBpcyBhbiBlcnJvcg0KPj4gKyAgICAgIGlm IChyZXAuaGFzX3NlcCAoKSAmJiBtYXRjaF9hbW91bnQgPiAwKQ0KPj4gKyAgICAgICBpZiAo IW1hdGNoX3Rva2VuIChwYXJzZXIsICpyZXAuZ2V0X3NlcCAoKSkpDQo+PiArICAgICAgICAg YnJlYWs7DQo+PiArDQo+PiArICAgICAgYm9vbCB2YWxpZF9jdXJyZW50X21hdGNoID0gZmFs c2U7DQo+PiArICAgICAgZm9yIChhdXRvICZtYXRjaCA6IG1hdGNoZXMpDQo+PiArICAgICAg IHsNCj4+ICsgICAgICAgICBzaXplX3Qgb2Zmc19iZWdpbiA9IHNvdXJjZS5nZXRfb2ZmcyAo KTsNCj4+ICsgICAgICAgICBzd2l0Y2ggKG1hdGNoLT5nZXRfbWFjcm9fbWF0Y2hfdHlwZSAo KSkNCj4+ICsgICAgICAgICAgIHsNCj4+ICsgICAgICAgICAgICAgY2FzZSBBU1Q6Ok1hY3Jv TWF0Y2g6Ok1hY3JvTWF0Y2hUeXBlOjpGcmFnbWVudDogew0KPj4gKyAgICAgICAgICAgICAg IEFTVDo6TWFjcm9NYXRjaEZyYWdtZW50ICpmcmFnbWVudA0KPj4gKyAgICAgICAgICAgICAg ICAgPSBzdGF0aWNfY2FzdDxBU1Q6Ok1hY3JvTWF0Y2hGcmFnbWVudCAqPiAobWF0Y2guZ2V0 ICgpKTsNCj4+ICsgICAgICAgICAgICAgICB2YWxpZF9jdXJyZW50X21hdGNoID0gbWF0Y2hf ZnJhZ21lbnQgKHBhcnNlciwgKmZyYWdtZW50KTsNCj4+ICsNCj4+ICsgICAgICAgICAgICAg ICAvLyBtYXRjaGVkIGZyYWdtZW50IGdldCB0aGUgb2Zmc2V0IGluIHRoZSB0b2tlbiBzdHJl YW0NCj4+ICsgICAgICAgICAgICAgICBzaXplX3Qgb2Zmc19lbmQgPSBzb3VyY2UuZ2V0X29m ZnMgKCk7DQo+PiArDQo+PiArICAgICAgICAgICAgICAgLy8gVGhlIG1haW4gZGlmZmVyZW5j ZSB3aXRoIG1hdGNoX21hdGNoZXIgaGFwcGVucyBoZXJlOiBJbnN0ZWFkDQo+PiArICAgICAg ICAgICAgICAgLy8gb2YgaW5zZXJ0aW5nIGEgbmV3IGZyYWdtZW50LCB3ZSBhcHBlbmQgdG8g b25lLiBJZiB0aGF0DQo+PiArICAgICAgICAgICAgICAgLy8gZnJhZ21lbnQgZG9lcyBub3Qg ZXhpc3QsIHRoZW4gdGhlIG9wZXJhdGlvbiBpcyBzaW1pbGFyIHRvDQo+PiArICAgICAgICAg ICAgICAgLy8gYGluc2VydF9mcmFnbWVudGAgd2l0aCB0aGUgZGlmZmVyZW5jZSB0aGF0IHdl IGFyZSBub3QNCj4+ICsgICAgICAgICAgICAgICAvLyBjcmVhdGluZyBhIG1ldGF2YXJpYWJs ZSwgYnV0IGEgcmVwZXRpdGlvbiBvZiBvbmUsIHdoaWNoIGlzDQo+PiArICAgICAgICAgICAg ICAgLy8gcmVhbGx5IGRpZmZlcmVudC4NCj4+ICsgICAgICAgICAgICAgICBzdWJfc3RhY2su YXBwZW5kX2ZyYWdtZW50ICgNCj4+ICsgICAgICAgICAgICAgICAgIE1hdGNoZWRGcmFnbWVu dCAoZnJhZ21lbnQtPmdldF9pZGVudCAoKSwgb2Zmc19iZWdpbiwNCj4+ICsgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgb2Zmc19lbmQpKTsNCj4+ICsgICAgICAgICAgICAg fQ0KPj4gKyAgICAgICAgICAgICBicmVhazsNCj4+ICsNCj4+ICsgICAgICAgICAgICAgY2Fz ZSBBU1Q6Ok1hY3JvTWF0Y2g6Ok1hY3JvTWF0Y2hUeXBlOjpUb2s6IHsNCj4+ICsgICAgICAg ICAgICAgICBBU1Q6OlRva2VuICp0b2sgPSBzdGF0aWNfY2FzdDxBU1Q6OlRva2VuICo+ICht YXRjaC5nZXQgKCkpOw0KPj4gKyAgICAgICAgICAgICAgIHZhbGlkX2N1cnJlbnRfbWF0Y2gg PSBtYXRjaF90b2tlbiAocGFyc2VyLCAqdG9rKTsNCj4+ICsgICAgICAgICAgICAgfQ0KPj4g KyAgICAgICAgICAgICBicmVhazsNCj4+ICsNCj4+ICsgICAgICAgICAgICAgY2FzZSBBU1Q6 Ok1hY3JvTWF0Y2g6Ok1hY3JvTWF0Y2hUeXBlOjpSZXBldGl0aW9uOiB7DQo+PiArICAgICAg ICAgICAgICAgQVNUOjpNYWNyb01hdGNoUmVwZXRpdGlvbiAqcmVwDQo+PiArICAgICAgICAg ICAgICAgICA9IHN0YXRpY19jYXN0PEFTVDo6TWFjcm9NYXRjaFJlcGV0aXRpb24gKj4gKG1h dGNoLmdldCAoKSk7DQo+PiArICAgICAgICAgICAgICAgdmFsaWRfY3VycmVudF9tYXRjaCA9 IG1hdGNoX3JlcGV0aXRpb24gKHBhcnNlciwgKnJlcCk7DQo+PiArICAgICAgICAgICAgIH0N Cj4+ICsgICAgICAgICAgICAgYnJlYWs7DQo+PiArDQo+PiArICAgICAgICAgICAgIGNhc2Ug QVNUOjpNYWNyb01hdGNoOjpNYWNyb01hdGNoVHlwZTo6TWF0Y2hlcjogew0KPj4gKyAgICAg ICAgICAgICAgIEFTVDo6TWFjcm9NYXRjaGVyICptDQo+PiArICAgICAgICAgICAgICAgICA9 IHN0YXRpY19jYXN0PEFTVDo6TWFjcm9NYXRjaGVyICo+IChtYXRjaC5nZXQgKCkpOw0KPj4g KyAgICAgICAgICAgICAgIHZhbGlkX2N1cnJlbnRfbWF0Y2ggPSBtYXRjaF9tYXRjaGVyIChw YXJzZXIsICptKTsNCj4+ICsgICAgICAgICAgICAgfQ0KPj4gKyAgICAgICAgICAgICBicmVh azsNCj4+ICsgICAgICAgICAgIH0NCj4+ICsgICAgICAgfQ0KPj4gKyAgICAgIC8vIElmIHdl J3ZlIGVuY291bnRlcmVkIGFuIGVycm9yIG9uY2UsIHN0b3AgdHJ5aW5nIHRvIG1hdGNoIG1v cmUNCj4+ICsgICAgICAvLyByZXBldGl0aW9ucw0KPj4gKyAgICAgIGlmICghdmFsaWRfY3Vy cmVudF9tYXRjaCkNCj4+ICsgICAgICAgYnJlYWs7DQo+PiArDQo+PiArICAgICAgbWF0Y2hf YW1vdW50Kys7DQo+PiArDQo+PiArICAgICAgLy8gQnJlYWsgZWFybHkgaWYgd2Ugbm90aWNl IHRoZXJlJ3MgdG9vIG1hbnkgZXhwcmVzc2lvbnMgYWxyZWFkeQ0KPj4gKyAgICAgIGlmICho aV9ib3VuZCAmJiBtYXRjaF9hbW91bnQgPiBoaV9ib3VuZCkNCj4+ICsgICAgICAgYnJlYWs7 DQo+PiArICAgIH0NCj4+ICsNCj4+ICsgIC8vIENoZWNrIGlmIHRoZSBhbW91bnQgb2YgbWF0 Y2hlcyB3ZSBnb3QgaXMgdmFsaWQ6IElzIGl0IG1vcmUgdGhhbiB0aGUgbG93ZXINCj4+ICsg IC8vIGJvdW5kIGFuZCBsZXNzIHRoYW4gdGhlIGhpZ2hlciBib3VuZD8NCj4+ICsgIGJvb2wg ZGlkX21lZXRfbG9fYm91bmQgPSBtYXRjaF9hbW91bnQgPj0gbG9fYm91bmQ7DQo+PiArICBi b29sIGRpZF9tZWV0X2hpX2JvdW5kID0gaGlfYm91bmQgPyBtYXRjaF9hbW91bnQgPD0gaGlf Ym91bmQgOiB0cnVlOw0KPj4gKw0KPj4gKyAgLy8gSWYgdGhlIGVuZC1yZXN1bHQgaXMgdmFs aWQsIHRoZW4gd2UgY2FuIGNsZWFyIHRoZSBwYXJzZSBlcnJvcnM6IFNpbmNlDQo+PiArICAv LyByZXBldGl0aW9ucyBhcmUgcGFyc2VkIGVhZ2VybHksIGl0IGlzIG9rYXkgdG8gZmFpbCBp biBzb21lIGNhc2VzDQo+PiArICBhdXRvIHJlcyA9IGRpZF9tZWV0X2xvX2JvdW5kICYmIGRp ZF9tZWV0X2hpX2JvdW5kOw0KPj4gKyAgaWYgKHJlcykNCj4+ICsgICAgcGFyc2VyLmNsZWFy X2Vycm9ycyAoKTsNCj4+ICsNCj4+ICsgIHJldHVybiByZXM7DQo+PiArfQ0KPj4gKw0KPj4g K2Jvb2wNCj4+ICtNYWNyb0V4cGFuZGVyOjptYXRjaF9yZXBldGl0aW9uIChQYXJzZXI8TWFj cm9JbnZvY0xleGVyPiAmcGFyc2VyLA0KPj4gKyAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgQVNUOjpNYWNyb01hdGNoUmVwZXRpdGlvbiAmcmVwKQ0KPj4gK3sNCj4+ICsgIHNp emVfdCBtYXRjaF9hbW91bnQgPSAwOw0KPj4gKyAgYm9vbCByZXMgPSBmYWxzZTsNCj4+ICsN Cj4+ICsgIHN0ZDo6c3RyaW5nIGxvX3N0cjsNCj4+ICsgIHN0ZDo6c3RyaW5nIGhpX3N0cjsN Cj4+ICsgIHN3aXRjaCAocmVwLmdldF9vcCAoKSkNCj4+ICsgICAgew0KPj4gKyAgICBjYXNl IEFTVDo6TWFjcm9NYXRjaFJlcGV0aXRpb246Ok1hY3JvUmVwT3A6OkFOWToNCj4+ICsgICAg ICBsb19zdHIgPSAiMCI7DQo+PiArICAgICAgaGlfc3RyID0gIitpbmYiOw0KPj4gKyAgICAg IHJlcyA9IG1hdGNoX25fbWF0Y2hlcyAocGFyc2VyLCByZXAsIG1hdGNoX2Ftb3VudCk7DQo+ PiArICAgICAgYnJlYWs7DQo+PiArICAgIGNhc2UgQVNUOjpNYWNyb01hdGNoUmVwZXRpdGlv bjo6TWFjcm9SZXBPcDo6T05FX09SX01PUkU6DQo+PiArICAgICAgbG9fc3RyID0gIjEiOw0K Pj4gKyAgICAgIGhpX3N0ciA9ICIraW5mIjsNCj4+ICsgICAgICByZXMgPSBtYXRjaF9uX21h dGNoZXMgKHBhcnNlciwgcmVwLCBtYXRjaF9hbW91bnQsIDEpOw0KPj4gKyAgICAgIGJyZWFr Ow0KPj4gKyAgICBjYXNlIEFTVDo6TWFjcm9NYXRjaFJlcGV0aXRpb246Ok1hY3JvUmVwT3A6 OlpFUk9fT1JfT05FOg0KPj4gKyAgICAgIGxvX3N0ciA9ICIwIjsNCj4+ICsgICAgICBoaV9z dHIgPSAiMSI7DQo+PiArICAgICAgcmVzID0gbWF0Y2hfbl9tYXRjaGVzIChwYXJzZXIsIHJl cCwgbWF0Y2hfYW1vdW50LCAwLCAxKTsNCj4+ICsgICAgICBicmVhazsNCj4+ICsgICAgZGVm YXVsdDoNCj4+ICsgICAgICBnY2NfdW5yZWFjaGFibGUgKCk7DQo+PiArICAgIH0NCj4+ICsN Cj4+ICsgIGlmICghcmVzKQ0KPj4gKyAgICBydXN0X2Vycm9yX2F0IChyZXAuZ2V0X21hdGNo X2xvY3VzICgpLA0KPj4gKyAgICAgICAgICAgICAgICAgICJpbnZhbGlkIGFtb3VudCBvZiBt YXRjaGVzIGZvciBtYWNybyBpbnZvY2F0aW9uLiBFeHBlY3RlZCAiDQo+PiArICAgICAgICAg ICAgICAgICAgImJldHdlZW4gJXMgYW5kICVzLCBnb3QgJWx1IiwNCj4+ICsgICAgICAgICAg ICAgICAgICBsb19zdHIuY19zdHIgKCksIGhpX3N0ci5jX3N0ciAoKSwNCj4+ICsgICAgICAg ICAgICAgICAgICAodW5zaWduZWQgbG9uZykgbWF0Y2hfYW1vdW50KTsNCj4+ICsNCj4+ICsg IHJ1c3RfZGVidWdfbG9jIChyZXAuZ2V0X21hdGNoX2xvY3VzICgpLCAiJXMgbWF0Y2hlZCAl bHUgdGltZXMiLA0KPj4gKyAgICAgICAgICAgICAgICAgcmVzID8gInN1Y2Nlc3NmdWxseSIg OiAidW5zdWNjZXNzZnVsbHkiLA0KPj4gKyAgICAgICAgICAgICAgICAgKHVuc2lnbmVkIGxv bmcpIG1hdGNoX2Ftb3VudCk7DQo+PiArDQo+PiArICAvLyBXZSBoYXZlIHRvIGhhbmRsZSB6 ZXJvIGZyYWdtZW50cyBkaWZmZXJlbnRseTogVGhleSB3aWxsIG5vdCBoYXZlIGJlZW4NCj4+ ICsgIC8vICJtYXRjaGVkIiBidXQgdGhleSBhcmUgc3RpbGwgdmFsaWQgYW5kIHNob3VsZCBi ZSBpbnNlcnRlZCBhcyBhIHNwZWNpYWwNCj4+ICsgIC8vIGNhc2UuIFNvIHdlIGdvIHRocm91 Z2ggdGhlIHN0YWNrIG1hcCwgYW5kIGZvciBldmVyeSBmcmFnbWVudCB3aGljaCBkb2Vzbid0 DQo+PiArICAvLyBleGlzdCwgaW5zZXJ0IGEgemVyby1tYXRjaGVkIGZyYWdtZW50Lg0KPj4g KyAgYXV0byAmc3RhY2tfbWFwID0gc3ViX3N0YWNrLnBlZWsgKCk7DQo+PiArICBmb3IgKGF1 dG8gJm1hdGNoIDogcmVwLmdldF9tYXRjaGVzICgpKQ0KPj4gKyAgICB7DQo+PiArICAgICAg aWYgKG1hdGNoLT5nZXRfbWFjcm9fbWF0Y2hfdHlwZSAoKQ0KPj4gKyAgICAgICAgID09IEFT VDo6TWFjcm9NYXRjaDo6TWFjcm9NYXRjaFR5cGU6OkZyYWdtZW50KQ0KPj4gKyAgICAgICB7 DQo+PiArICAgICAgICAgYXV0byBmcmFnbWVudCA9IHN0YXRpY19jYXN0PEFTVDo6TWFjcm9N YXRjaEZyYWdtZW50ICo+IChtYXRjaC5nZXQgKCkpOw0KPj4gKyAgICAgICAgIGF1dG8gaXQg PSBzdGFja19tYXAuZmluZCAoZnJhZ21lbnQtPmdldF9pZGVudCAoKSk7DQo+PiArDQo+PiAr ICAgICAgICAgaWYgKGl0ID09IHN0YWNrX21hcC5lbmQgKCkpDQo+PiArICAgICAgICAgICBz dWJfc3RhY2suaW5zZXJ0X21hdGNoZXMgKGZyYWdtZW50LT5nZXRfaWRlbnQgKCksDQo+PiAr ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1hdGNoZWRGcmFnbWVudENv bnRhaW5lcjo6emVybyAoKSk7DQo+PiArICAgICAgIH0NCj4+ICsgICAgfQ0KPj4gKw0KPj4g KyAgcmV0dXJuIHJlczsNCj4+ICt9DQo+PiArDQo+PiArLyoqDQo+PiArICogSGVscGVyIGZ1 bmN0aW9uIHRvIHJlZmFjdG9yIGNhbGxpbmcgYSBwYXJzaW5nIGZ1bmN0aW9uIDAgb3IgbW9y ZSB0aW1lcw0KPj4gKyAqLw0KPj4gK3N0YXRpYyBBU1Q6OkFTVEZyYWdtZW50DQo+PiArcGFy c2VfbWFueSAoUGFyc2VyPE1hY3JvSW52b2NMZXhlcj4gJnBhcnNlciwgVG9rZW5JZCAmZGVs aW1pdGVyLA0KPj4gKyAgICAgICAgICAgc3RkOjpmdW5jdGlvbjxBU1Q6OlNpbmdsZUFTVE5v ZGUgKCk+IHBhcnNlX2ZuKQ0KPj4gK3sNCj4+ICsgIHN0ZDo6dmVjdG9yPEFTVDo6U2luZ2xl QVNUTm9kZT4gbm9kZXM7DQo+PiArICB3aGlsZSAodHJ1ZSkNCj4+ICsgICAgew0KPj4gKyAg ICAgIGlmIChwYXJzZXIucGVla19jdXJyZW50X3Rva2VuICgpLT5nZXRfaWQgKCkgPT0gZGVs aW1pdGVyKQ0KPj4gKyAgICAgICBicmVhazsNCj4+ICsNCj4+ICsgICAgICBhdXRvIG5vZGUg PSBwYXJzZV9mbiAoKTsNCj4+ICsgICAgICBub2Rlcy5lbXBsYWNlX2JhY2sgKHN0ZDo6bW92 ZSAobm9kZSkpOw0KPj4gKyAgICB9DQo+PiArDQo+PiArICByZXR1cm4gQVNUOjpBU1RGcmFn bWVudCAoc3RkOjptb3ZlIChub2RlcykpOw0KPj4gK30NCj4+ICsNCj4+ICsvKioNCj4+ICsg KiBUcmFuc2NyaWJlIDAgb3IgbW9yZSBpdGVtcyBmcm9tIGEgbWFjcm8gaW52b2NhdGlvbg0K Pj4gKyAqDQo+PiArICogQHBhcmFtIHBhcnNlciBQYXJzZXIgdG8gZXh0cmFjdCBpdGVtcyBm cm9tDQo+PiArICogQHBhcmFtIGRlbGltaXRlciBJZCBvZiB0aGUgdG9rZW4gb24gd2hpY2gg cGFyc2luZyBzaG91bGQgc3RvcA0KPj4gKyAqLw0KPj4gK3N0YXRpYyBBU1Q6OkFTVEZyYWdt ZW50DQo+PiArdHJhbnNjcmliZV9tYW55X2l0ZW1zIChQYXJzZXI8TWFjcm9JbnZvY0xleGVy PiAmcGFyc2VyLCBUb2tlbklkICZkZWxpbWl0ZXIpDQo+PiArew0KPj4gKyAgcmV0dXJuIHBh cnNlX21hbnkgKHBhcnNlciwgZGVsaW1pdGVyLCBbJnBhcnNlcl0gKCkgew0KPj4gKyAgICBh dXRvIGl0ZW0gPSBwYXJzZXIucGFyc2VfaXRlbSAodHJ1ZSk7DQo+PiArICAgIHJldHVybiBB U1Q6OlNpbmdsZUFTVE5vZGUgKHN0ZDo6bW92ZSAoaXRlbSkpOw0KPj4gKyAgfSk7DQo+PiAr fQ0KPj4gKw0KPj4gKy8qKg0KPj4gKyAqIFRyYW5zY3JpYmUgMCBvciBtb3JlIGV4dGVybmFs IGl0ZW1zIGZyb20gYSBtYWNybyBpbnZvY2F0aW9uDQo+PiArICoNCj4+ICsgKiBAcGFyYW0g cGFyc2VyIFBhcnNlciB0byBleHRyYWN0IGl0ZW1zIGZyb20NCj4+ICsgKiBAcGFyYW0gZGVs aW1pdGVyIElkIG9mIHRoZSB0b2tlbiBvbiB3aGljaCBwYXJzaW5nIHNob3VsZCBzdG9wDQo+ PiArICovDQo+PiArc3RhdGljIEFTVDo6QVNURnJhZ21lbnQNCj4+ICt0cmFuc2NyaWJlX21h bnlfZXh0IChQYXJzZXI8TWFjcm9JbnZvY0xleGVyPiAmcGFyc2VyLCBUb2tlbklkICZkZWxp bWl0ZXIpDQo+PiArew0KPj4gKyAgcmV0dXJuIHBhcnNlX21hbnkgKHBhcnNlciwgZGVsaW1p dGVyLCBbJnBhcnNlcl0gKCkgew0KPj4gKyAgICBhdXRvIGl0ZW0gPSBwYXJzZXIucGFyc2Vf ZXh0ZXJuYWxfaXRlbSAoKTsNCj4+ICsgICAgcmV0dXJuIEFTVDo6U2luZ2xlQVNUTm9kZSAo c3RkOjptb3ZlIChpdGVtKSk7DQo+PiArICB9KTsNCj4+ICt9DQo+PiArDQo+PiArLyoqDQo+ PiArICogVHJhbnNjcmliZSAwIG9yIG1vcmUgdHJhaXQgaXRlbXMgZnJvbSBhIG1hY3JvIGlu dm9jYXRpb24NCj4+ICsgKg0KPj4gKyAqIEBwYXJhbSBwYXJzZXIgUGFyc2VyIHRvIGV4dHJh Y3QgaXRlbXMgZnJvbQ0KPj4gKyAqIEBwYXJhbSBkZWxpbWl0ZXIgSWQgb2YgdGhlIHRva2Vu IG9uIHdoaWNoIHBhcnNpbmcgc2hvdWxkIHN0b3ANCj4+ICsgKi8NCj4+ICtzdGF0aWMgQVNU OjpBU1RGcmFnbWVudA0KPj4gK3RyYW5zY3JpYmVfbWFueV90cmFpdF9pdGVtcyAoUGFyc2Vy PE1hY3JvSW52b2NMZXhlcj4gJnBhcnNlciwNCj4+ICsgICAgICAgICAgICAgICAgICAgICAg ICAgICAgVG9rZW5JZCAmZGVsaW1pdGVyKQ0KPj4gK3sNCj4+ICsgIHJldHVybiBwYXJzZV9t YW55IChwYXJzZXIsIGRlbGltaXRlciwgWyZwYXJzZXJdICgpIHsNCj4+ICsgICAgYXV0byBp dGVtID0gcGFyc2VyLnBhcnNlX3RyYWl0X2l0ZW0gKCk7DQo+PiArICAgIHJldHVybiBBU1Q6 OlNpbmdsZUFTVE5vZGUgKHN0ZDo6bW92ZSAoaXRlbSkpOw0KPj4gKyAgfSk7DQo+PiArfQ0K Pj4gKw0KPj4gKy8qKg0KPj4gKyAqIFRyYW5zY3JpYmUgMCBvciBtb3JlIGltcGwgaXRlbXMg ZnJvbSBhIG1hY3JvIGludm9jYXRpb24NCj4+ICsgKg0KPj4gKyAqIEBwYXJhbSBwYXJzZXIg UGFyc2VyIHRvIGV4dHJhY3QgaXRlbXMgZnJvbQ0KPj4gKyAqIEBwYXJhbSBkZWxpbWl0ZXIg SWQgb2YgdGhlIHRva2VuIG9uIHdoaWNoIHBhcnNpbmcgc2hvdWxkIHN0b3ANCj4+ICsgKi8N Cj4+ICtzdGF0aWMgQVNUOjpBU1RGcmFnbWVudA0KPj4gK3RyYW5zY3JpYmVfbWFueV9pbXBs X2l0ZW1zIChQYXJzZXI8TWFjcm9JbnZvY0xleGVyPiAmcGFyc2VyLCBUb2tlbklkICZkZWxp bWl0ZXIpDQo+PiArew0KPj4gKyAgcmV0dXJuIHBhcnNlX21hbnkgKHBhcnNlciwgZGVsaW1p dGVyLCBbJnBhcnNlcl0gKCkgew0KPj4gKyAgICBhdXRvIGl0ZW0gPSBwYXJzZXIucGFyc2Vf aW5oZXJlbnRfaW1wbF9pdGVtICgpOw0KPj4gKyAgICByZXR1cm4gQVNUOjpTaW5nbGVBU1RO b2RlIChzdGQ6Om1vdmUgKGl0ZW0pKTsNCj4+ICsgIH0pOw0KPj4gK30NCj4+ICsNCj4+ICsv KioNCj4+ICsgKiBUcmFuc2NyaWJlIDAgb3IgbW9yZSB0cmFpdCBpbXBsIGl0ZW1zIGZyb20g YSBtYWNybyBpbnZvY2F0aW9uDQo+PiArICoNCj4+ICsgKiBAcGFyYW0gcGFyc2VyIFBhcnNl ciB0byBleHRyYWN0IGl0ZW1zIGZyb20NCj4+ICsgKiBAcGFyYW0gZGVsaW1pdGVyIElkIG9m IHRoZSB0b2tlbiBvbiB3aGljaCBwYXJzaW5nIHNob3VsZCBzdG9wDQo+PiArICovDQo+PiAr c3RhdGljIEFTVDo6QVNURnJhZ21lbnQNCj4+ICt0cmFuc2NyaWJlX21hbnlfdHJhaXRfaW1w bF9pdGVtcyAoUGFyc2VyPE1hY3JvSW52b2NMZXhlcj4gJnBhcnNlciwNCj4+ICsgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICBUb2tlbklkICZkZWxpbWl0ZXIpDQo+PiArew0K Pj4gKyAgcmV0dXJuIHBhcnNlX21hbnkgKHBhcnNlciwgZGVsaW1pdGVyLCBbJnBhcnNlcl0g KCkgew0KPj4gKyAgICBhdXRvIGl0ZW0gPSBwYXJzZXIucGFyc2VfdHJhaXRfaW1wbF9pdGVt ICgpOw0KPj4gKyAgICByZXR1cm4gQVNUOjpTaW5nbGVBU1ROb2RlIChzdGQ6Om1vdmUgKGl0 ZW0pKTsNCj4+ICsgIH0pOw0KPj4gK30NCj4+ICsNCj4+ICsvKioNCj4+ICsgKiBUcmFuc2Ny aWJlIDAgb3IgbW9yZSBzdGF0ZW1lbnRzIGZyb20gYSBtYWNybyBpbnZvY2F0aW9uDQo+PiAr ICoNCj4+ICsgKiBAcGFyYW0gcGFyc2VyIFBhcnNlciB0byBleHRyYWN0IHN0YXRlbWVudHMg ZnJvbQ0KPj4gKyAqIEBwYXJhbSBkZWxpbWl0ZXIgSWQgb2YgdGhlIHRva2VuIG9uIHdoaWNo IHBhcnNpbmcgc2hvdWxkIHN0b3ANCj4+ICsgKi8NCj4+ICtzdGF0aWMgQVNUOjpBU1RGcmFn bWVudA0KPj4gK3RyYW5zY3JpYmVfbWFueV9zdG10cyAoUGFyc2VyPE1hY3JvSW52b2NMZXhl cj4gJnBhcnNlciwgVG9rZW5JZCAmZGVsaW1pdGVyKQ0KPj4gK3sNCj4+ICsgIGF1dG8gcmVz dHJpY3Rpb25zID0gUGFyc2VSZXN0cmljdGlvbnMgKCk7DQo+PiArICByZXN0cmljdGlvbnMu Y29uc3VtZV9zZW1pID0gZmFsc2U7DQo+PiArDQo+PiArICAvLyBGSVhNRTogVGhpcyBpcyBp bnZhbGlkISBJdCBuZWVkcyB0byBhbHNvIGhhbmRsZSBjYXNlcyB3aGVyZSB0aGUgbWFjcm8N Cj4+ICsgIC8vIHRyYW5zY3JpYmVyIGlzIGFuIGV4cHJlc3Npb24sIGJ1dCBzaW5jZSB0aGUg bWFjcm8gY2FsbCBpcyBmb2xsb3dlZCBieQ0KPj4gKyAgLy8gYSBzZW1pY29sb24sIGl0J3Mg YSB2YWxpZCBFeHByU3RtdA0KPj4gKyAgcmV0dXJuIHBhcnNlX21hbnkgKHBhcnNlciwgZGVs aW1pdGVyLCBbJnBhcnNlciwgcmVzdHJpY3Rpb25zXSAoKSB7DQo+PiArICAgIGF1dG8gc3Rt dCA9IHBhcnNlci5wYXJzZV9zdG10IChyZXN0cmljdGlvbnMpOw0KPj4gKyAgICByZXR1cm4g QVNUOjpTaW5nbGVBU1ROb2RlIChzdGQ6Om1vdmUgKHN0bXQpKTsNCj4+ICsgIH0pOw0KPj4g K30NCj4+ICsNCj4+ICsvKioNCj4+ICsgKiBUcmFuc2NyaWJlIG9uZSBleHByZXNzaW9uIGZy b20gYSBtYWNybyBpbnZvY2F0aW9uDQo+PiArICoNCj4+ICsgKiBAcGFyYW0gcGFyc2VyIFBh cnNlciB0byBleHRyYWN0IHN0YXRlbWVudHMgZnJvbQ0KPj4gKyAqLw0KPj4gK3N0YXRpYyBB U1Q6OkFTVEZyYWdtZW50DQo+PiArdHJhbnNjcmliZV9leHByZXNzaW9uIChQYXJzZXI8TWFj cm9JbnZvY0xleGVyPiAmcGFyc2VyKQ0KPj4gK3sNCj4+ICsgIGF1dG8gZXhwciA9IHBhcnNl ci5wYXJzZV9leHByICgpOw0KPj4gKw0KPj4gKyAgcmV0dXJuIEFTVDo6QVNURnJhZ21lbnQg KHtzdGQ6Om1vdmUgKGV4cHIpfSk7DQo+PiArfQ0KPj4gKw0KPj4gKy8qKg0KPj4gKyAqIFRy YW5zY3JpYmUgb25lIHR5cGUgZnJvbSBhIG1hY3JvIGludm9jYXRpb24NCj4+ICsgKg0KPj4g KyAqIEBwYXJhbSBwYXJzZXIgUGFyc2VyIHRvIGV4dHJhY3Qgc3RhdGVtZW50cyBmcm9tDQo+ PiArICovDQo+PiArc3RhdGljIEFTVDo6QVNURnJhZ21lbnQNCj4+ICt0cmFuc2NyaWJlX3R5 cGUgKFBhcnNlcjxNYWNyb0ludm9jTGV4ZXI+ICZwYXJzZXIpDQo+PiArew0KPj4gKyAgYXV0 byB0eXBlID0gcGFyc2VyLnBhcnNlX3R5cGUgKCk7DQo+PiArDQo+PiArICByZXR1cm4gQVNU OjpBU1RGcmFnbWVudCAoe3N0ZDo6bW92ZSAodHlwZSl9KTsNCj4+ICt9DQo+PiArDQo+PiAr c3RhdGljIEFTVDo6QVNURnJhZ21lbnQNCj4+ICt0cmFuc2NyaWJlX29uX2RlbGltaXRlciAo UGFyc2VyPE1hY3JvSW52b2NMZXhlcj4gJnBhcnNlciwgYm9vbCBzZW1pY29sb24sDQo+PiAr ICAgICAgICAgICAgICAgICAgICAgICAgQVNUOjpEZWxpbVR5cGUgZGVsaW1pdGVyLCBUb2tl bklkIGxhc3RfdG9rZW5faWQpDQo+PiArew0KPj4gKyAgaWYgKHNlbWljb2xvbiB8fCBkZWxp bWl0ZXIgPT0gQVNUOjpEZWxpbVR5cGU6OkNVUkxZKQ0KPj4gKyAgICByZXR1cm4gdHJhbnNj cmliZV9tYW55X3N0bXRzIChwYXJzZXIsIGxhc3RfdG9rZW5faWQpOw0KPj4gKyAgZWxzZQ0K Pj4gKyAgICByZXR1cm4gdHJhbnNjcmliZV9leHByZXNzaW9uIChwYXJzZXIpOw0KPj4gK30g Ly8gbmFtZXNwYWNlIFJ1c3QNCj4+ICsNCj4+ICtzdGF0aWMgQVNUOjpBU1RGcmFnbWVudA0K Pj4gK3RyYW5zY3JpYmVfY29udGV4dCAoTWFjcm9FeHBhbmRlcjo6Q29udGV4dFR5cGUgY3R4 LA0KPj4gKyAgICAgICAgICAgICAgICAgICBQYXJzZXI8TWFjcm9JbnZvY0xleGVyPiAmcGFy c2VyLCBib29sIHNlbWljb2xvbiwNCj4+ICsgICAgICAgICAgICAgICAgICAgQVNUOjpEZWxp bVR5cGUgZGVsaW1pdGVyLCBUb2tlbklkIGxhc3RfdG9rZW5faWQpDQo+PiArew0KPj4gKyAg Ly8gVGhlIGZsb3ctY2hhcnQgaW4gb3JkZXIgdG8gY2hvb3NlIGEgcGFyc2luZyBmdW5jdGlv biBpcyBhcyBmb2xsb3dzOg0KPj4gKyAgLy8NCj4+ICsgIC8vIFtzd2l0Y2ggc3BlY2lhbCBj b250ZXh0XQ0KPj4gKyAgLy8gICAgIC0tIEl0ZW0gLS0+IHBhcnNlci5wYXJzZV9pdGVtKCk7 DQo+PiArICAvLyAgICAgLS0gVHJhaXQgLS0+IHBhcnNlci5wYXJzZV90cmFpdF9pdGVtKCk7 DQo+PiArICAvLyAgICAgLS0gSW1wbCAtLT4gcGFyc2VyLnBhcnNlX2ltcGxfaXRlbSgpOw0K Pj4gKyAgLy8gICAgIC0tIEV4dGVybiAtLT4gcGFyc2VyLnBhcnNlX2V4dGVybl9pdGVtKCk7 DQo+PiArICAvLyAgICAgLS0gTm9uZSAtLT4gW2hhcyBzZW1pY29sb24/XQ0KPj4gKyAgLy8g ICAgICAgICAgICAgICAgIC0tIFllcyAtLT4gcGFyc2VyLnBhcnNlX3N0bXQoKTsNCj4+ICsg IC8vICAgICAgICAgICAgICAgICAtLSBObyAtLT4gW3N3aXRjaCBpbnZvY2F0aW9uLmRlbGlt aXRlcigpXQ0KPj4gKyAgLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tIHsgfSAt LT4gcGFyc2VyLnBhcnNlX3N0bXQoKTsNCj4+ICsgIC8vICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAtLSBfIC0tPiBwYXJzZXIucGFyc2VfZXhwcigpOyAvLyBvbmNlIQ0KPj4gKw0K Pj4gKyAgLy8gSWYgdGhlcmUgaXMgYSBzZW1pY29sb24gT1Igd2UgYXJlIGV4cGFuZGluZyBh IE1hY3JvSW52b2NhdGlvblNlbWksIHRoZW4NCj4+ICsgIC8vIHdlIGNhbiBwYXJzZSBtdWx0 aXBsZSBpdGVtcy4gT3RoZXJ3aXNlLCBwYXJzZSAqb25lKiBleHByZXNzaW9uDQo+PiArDQo+ PiArICBzd2l0Y2ggKGN0eCkNCj4+ICsgICAgew0KPj4gKyAgICBjYXNlIE1hY3JvRXhwYW5k ZXI6OkNvbnRleHRUeXBlOjpJVEVNOg0KPj4gKyAgICAgIHJldHVybiB0cmFuc2NyaWJlX21h bnlfaXRlbXMgKHBhcnNlciwgbGFzdF90b2tlbl9pZCk7DQo+PiArICAgICAgYnJlYWs7DQo+ PiArICAgIGNhc2UgTWFjcm9FeHBhbmRlcjo6Q29udGV4dFR5cGU6OlRSQUlUOg0KPj4gKyAg ICAgIHJldHVybiB0cmFuc2NyaWJlX21hbnlfdHJhaXRfaXRlbXMgKHBhcnNlciwgbGFzdF90 b2tlbl9pZCk7DQo+PiArICAgICAgYnJlYWs7DQo+PiArICAgIGNhc2UgTWFjcm9FeHBhbmRl cjo6Q29udGV4dFR5cGU6OklNUEw6DQo+PiArICAgICAgcmV0dXJuIHRyYW5zY3JpYmVfbWFu eV9pbXBsX2l0ZW1zIChwYXJzZXIsIGxhc3RfdG9rZW5faWQpOw0KPj4gKyAgICAgIGJyZWFr Ow0KPj4gKyAgICBjYXNlIE1hY3JvRXhwYW5kZXI6OkNvbnRleHRUeXBlOjpUUkFJVF9JTVBM Og0KPj4gKyAgICAgIHJldHVybiB0cmFuc2NyaWJlX21hbnlfdHJhaXRfaW1wbF9pdGVtcyAo cGFyc2VyLCBsYXN0X3Rva2VuX2lkKTsNCj4+ICsgICAgICBicmVhazsNCj4+ICsgICAgY2Fz ZSBNYWNyb0V4cGFuZGVyOjpDb250ZXh0VHlwZTo6RVhURVJOOg0KPj4gKyAgICAgIHJldHVy biB0cmFuc2NyaWJlX21hbnlfZXh0IChwYXJzZXIsIGxhc3RfdG9rZW5faWQpOw0KPj4gKyAg ICAgIGJyZWFrOw0KPj4gKyAgICBjYXNlIE1hY3JvRXhwYW5kZXI6OkNvbnRleHRUeXBlOjpU WVBFOg0KPj4gKyAgICAgIHJldHVybiB0cmFuc2NyaWJlX3R5cGUgKHBhcnNlcik7DQo+PiAr ICAgICAgYnJlYWs7DQo+PiArICAgIGRlZmF1bHQ6DQo+PiArICAgICAgcmV0dXJuIHRyYW5z Y3JpYmVfb25fZGVsaW1pdGVyIChwYXJzZXIsIHNlbWljb2xvbiwgZGVsaW1pdGVyLA0KPj4g KyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXN0X3Rva2VuX2lkKTsN Cj4+ICsgICAgfQ0KPj4gK30NCj4+ICsNCj4+ICtzdGF0aWMgc3RkOjpzdHJpbmcNCj4+ICt0 b2tlbnNfdG9fc3RyIChzdGQ6OnZlY3RvcjxzdGQ6OnVuaXF1ZV9wdHI8QVNUOjpUb2tlbj4+ ICZ0b2tlbnMpDQo+PiArew0KPj4gKyAgc3RkOjpzdHJpbmcgc3RyOw0KPj4gKyAgaWYgKCF0 b2tlbnMuZW1wdHkgKCkpDQo+PiArICAgIHsNCj4+ICsgICAgICBzdHIgKz0gdG9rZW5zWzBd LT5hc19zdHJpbmcgKCk7DQo+PiArICAgICAgZm9yIChzaXplX3QgaSA9IDE7IGkgPCB0b2tl bnMuc2l6ZSAoKTsgaSsrKQ0KPj4gKyAgICAgICBzdHIgKz0gIiAiICsgdG9rZW5zW2ldLT5h c19zdHJpbmcgKCk7DQo+PiArICAgIH0NCj4+ICsNCj4+ICsgIHJldHVybiBzdHI7DQo+PiAr fQ0KPj4gKw0KPj4gK0FTVDo6QVNURnJhZ21lbnQNCj4+ICtNYWNyb0V4cGFuZGVyOjp0cmFu c2NyaWJlX3J1bGUgKA0KPj4gKyAgQVNUOjpNYWNyb1J1bGUgJm1hdGNoX3J1bGUsIEFTVDo6 RGVsaW1Ub2tlblRyZWUgJmludm9jX3Rva2VuX3RyZWUsDQo+PiArICBzdGQ6Om1hcDxzdGQ6 OnN0cmluZywgTWF0Y2hlZEZyYWdtZW50Q29udGFpbmVyPiAmbWF0Y2hlZF9mcmFnbWVudHMs DQo+PiArICBib29sIHNlbWljb2xvbiwgQ29udGV4dFR5cGUgY3R4KQ0KPj4gK3sNCj4+ICsg IC8vIHdlIGNhbiBtYW5pcHVsYXRlIHRoZSB0b2tlbiB0cmVlIHRvIHN1YnN0aXR1dGUgdGhl IGRvbGxhciBpZGVudGlmaWVycyBzbw0KPj4gKyAgLy8gdGhhdCB3aGVuIHdlIGNhbGwgcGFy c2UgaXRzIGFscmVhZHkgc3Vic3RpdHV0ZWQgZm9yIHVzDQo+PiArICBBU1Q6Ok1hY3JvVHJh bnNjcmliZXIgJnRyYW5zY3JpYmVyID0gbWF0Y2hfcnVsZS5nZXRfdHJhbnNjcmliZXIgKCk7 DQo+PiArICBBU1Q6OkRlbGltVG9rZW5UcmVlICZ0cmFuc2NyaWJlX3RyZWUgPSB0cmFuc2Ny aWJlci5nZXRfdG9rZW5fdHJlZSAoKTsNCj4+ICsNCj4+ICsgIGF1dG8gaW52b2Nfc3RyZWFt ID0gaW52b2NfdG9rZW5fdHJlZS50b190b2tlbl9zdHJlYW0gKCk7DQo+PiArICBhdXRvIG1h Y3JvX3J1bGVfdG9rZW5zID0gdHJhbnNjcmliZV90cmVlLnRvX3Rva2VuX3N0cmVhbSAoKTsN Cj4+ICsNCj4+ICsgIGF1dG8gc3Vic3RpdHV0ZV9jb250ZXh0DQo+PiArICAgID0gU3Vic3Rp dHV0ZUN0eCAoaW52b2Nfc3RyZWFtLCBtYWNyb19ydWxlX3Rva2VucywgbWF0Y2hlZF9mcmFn bWVudHMpOw0KPj4gKyAgc3RkOjp2ZWN0b3I8c3RkOjp1bmlxdWVfcHRyPEFTVDo6VG9rZW4+ PiBzdWJzdGl0dXRlZF90b2tlbnMNCj4+ICsgICAgPSBzdWJzdGl0dXRlX2NvbnRleHQuc3Vi c3RpdHV0ZV90b2tlbnMgKCk7DQo+PiArDQo+PiArICBydXN0X2RlYnVnICgic3Vic3RpdHV0 ZWQgdG9rZW5zOiAlcyIsDQo+PiArICAgICAgICAgICAgIHRva2Vuc190b19zdHIgKHN1YnN0 aXR1dGVkX3Rva2VucykuY19zdHIgKCkpOw0KPj4gKw0KPj4gKyAgLy8gcGFyc2UgaXQgdG8g YW4gQVNURnJhZ21lbnQNCj4+ICsgIE1hY3JvSW52b2NMZXhlciBsZXggKHN0ZDo6bW92ZSAo c3Vic3RpdHV0ZWRfdG9rZW5zKSk7DQo+PiArICBQYXJzZXI8TWFjcm9JbnZvY0xleGVyPiBw YXJzZXIgKGxleCk7DQo+PiArDQo+PiArICBhdXRvIGxhc3RfdG9rZW5faWQgPSBUb2tlbklk OjpSSUdIVF9DVVJMWTsNCj4+ICsNCj4+ICsgIC8vIHRoaXMgaXMgdXNlZCBzbyB3ZSBjYW4g Y2hlY2sgdGhhdCB3ZSBkZWxpbWl0IHRoZSBzdHJlYW0gY29ycmVjdGx5Lg0KPj4gKyAgc3dp dGNoICh0cmFuc2NyaWJlX3RyZWUuZ2V0X2RlbGltX3R5cGUgKCkpDQo+PiArICAgIHsNCj4+ ICsgICAgY2FzZSBBU1Q6OkRlbGltVHlwZTo6UEFSRU5TOg0KPj4gKyAgICAgIGxhc3RfdG9r ZW5faWQgPSBUb2tlbklkOjpSSUdIVF9QQVJFTjsNCj4+ICsgICAgICBydXN0X2Fzc2VydCAo cGFyc2VyLnNraXBfdG9rZW4gKExFRlRfUEFSRU4pKTsNCj4+ICsgICAgICBicmVhazsNCj4+ ICsNCj4+ICsgICAgY2FzZSBBU1Q6OkRlbGltVHlwZTo6Q1VSTFk6DQo+PiArICAgICAgcnVz dF9hc3NlcnQgKHBhcnNlci5za2lwX3Rva2VuIChMRUZUX0NVUkxZKSk7DQo+PiArICAgICAg YnJlYWs7DQo+PiArDQo+PiArICAgIGNhc2UgQVNUOjpEZWxpbVR5cGU6OlNRVUFSRToNCj4+ ICsgICAgICBsYXN0X3Rva2VuX2lkID0gVG9rZW5JZDo6UklHSFRfU1FVQVJFOw0KPj4gKyAg ICAgIHJ1c3RfYXNzZXJ0IChwYXJzZXIuc2tpcF90b2tlbiAoTEVGVF9TUVVBUkUpKTsNCj4+ ICsgICAgICBicmVhazsNCj4+ICsgICAgfQ0KPj4gKw0KPj4gKyAgLy8gc2VlIGh0dHBzOi8v Z2l0aHViLmNvbS9SdXN0LUdDQy9nY2Nycy9pc3N1ZXMvMjINCj4+ICsgIC8vIFRMO0RSOg0K Pj4gKyAgLy8gICAtIFRyZWF0IGFsbCBtYWNybyBpbnZvY2F0aW9ucyB3aXRoIHBhcmVudGhl c2VzLCAoKSwgb3Igc3F1YXJlIGJyYWNrZXRzLA0KPj4gKyAgLy8gICBbXSwgYXMgZXhwcmVz c2lvbnMuDQo+PiArICAvLyAgIC0gSWYgdGhlIG1hY3JvIGludm9jYXRpb24gaGFzIGN1cmx5 IGJyYWNrZXRzLCB7fSwgaXQgbWF5IGJlIHBhcnNlZCBhcyBhDQo+PiArICAvLyAgIHN0YXRl bWVudCBkZXBlbmRpbmcgb24gdGhlIGNvbnRleHQuDQo+PiArICAvLyAgIC0gSWYgdGhlIG1h Y3JvIGludm9jYXRpb24gaGFzIGEgc2VtaWNvbG9uIGF0IHRoZSBlbmQsIGl0IG11c3QgYmUg cGFyc2VkDQo+PiArICAvLyAgIGFzIGEgc3RhdGVtZW50IChlaXRoZXIgdmlhIEV4cHJlc3Np b25TdGF0ZW1lbnQgb3INCj4+ICsgIC8vICAgTWFjcm9JbnZvY2F0aW9uV2l0aFNlbWkpDQo+ PiArDQo+PiArICBhdXRvIGZyYWdtZW50DQo+PiArICAgID0gdHJhbnNjcmliZV9jb250ZXh0 IChjdHgsIHBhcnNlciwgc2VtaWNvbG9uLA0KPj4gKyAgICAgICAgICAgICAgICAgICAgICAg ICBpbnZvY190b2tlbl90cmVlLmdldF9kZWxpbV90eXBlICgpLCBsYXN0X3Rva2VuX2lkKTsN Cj4+ICsNCj4+ICsgIC8vIGVtaXQgYW55IGVycm9ycw0KPj4gKyAgaWYgKHBhcnNlci5oYXNf ZXJyb3JzICgpKQ0KPj4gKyAgICB7DQo+PiArICAgICAgZm9yIChhdXRvICZlcnIgOiBwYXJz ZXIuZ2V0X2Vycm9ycyAoKSkNCj4+ICsgICAgICAgcnVzdF9lcnJvcl9hdCAoZXJyLmxvY3Vz LCAiJXMiLCBlcnIubWVzc2FnZS5jX3N0ciAoKSk7DQo+PiArICAgICAgcmV0dXJuIEFTVDo6 QVNURnJhZ21lbnQ6OmNyZWF0ZV9lcnJvciAoKTsNCj4+ICsgICAgfQ0KPj4gKw0KPj4gKyAg Ly8gYXJlIGFsbCB0aGUgdG9rZW5zIHVzZWQ/DQo+PiArICBib29sIGRpZF9kZWxpbWl0ID0g cGFyc2VyLnNraXBfdG9rZW4gKGxhc3RfdG9rZW5faWQpOw0KPj4gKw0KPj4gKyAgYm9vbCBy ZWFjaGVkX2VuZF9vZl9zdHJlYW0gPSBkaWRfZGVsaW1pdCAmJiBwYXJzZXIuc2tpcF90b2tl biAoRU5EX09GX0ZJTEUpOw0KPj4gKyAgaWYgKCFyZWFjaGVkX2VuZF9vZl9zdHJlYW0pDQo+ PiArICAgIHsNCj4+ICsgICAgICBjb25zdF9Ub2tlblB0ciBjdXJyZW50X3Rva2VuID0gcGFy c2VyLnBlZWtfY3VycmVudF90b2tlbiAoKTsNCj4+ICsgICAgICBydXN0X2Vycm9yX2F0IChj dXJyZW50X3Rva2VuLT5nZXRfbG9jdXMgKCksDQo+PiArICAgICAgICAgICAgICAgICAgICAi dG9rZW5zIGhlcmUgYW5kIGFmdGVyIGFyZSB1bnBhcnNlZCIpOw0KPj4gKyAgICB9DQo+PiAr DQo+PiArICByZXR1cm4gZnJhZ21lbnQ7DQo+PiArfQ0KPj4gK30gLy8gbmFtZXNwYWNlIFJ1 c3QNCj4+IGRpZmYgLS1naXQgYS9nY2MvcnVzdC9leHBhbmQvcnVzdC1tYWNyby1leHBhbmQu aCBiL2djYy9ydXN0L2V4cGFuZC9ydXN0LW1hY3JvLWV4cGFuZC5oDQo+PiBuZXcgZmlsZSBt b2RlIDEwMDY0NA0KPj4gaW5kZXggMDAwMDAwMDAwMDAuLjk0ZDY3MDJlY2I4DQo+PiAtLS0g L2Rldi9udWxsDQo+PiArKysgYi9nY2MvcnVzdC9leHBhbmQvcnVzdC1tYWNyby1leHBhbmQu aA0KPj4gQEAgLTAsMCArMSwzNjYgQEANCj4+ICsvLyBDb3B5cmlnaHQgKEMpIDIwMjAtMjAy MiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4NCj4+ICsNCj4+ICsvLyBUaGlzIGZp bGUgaXMgcGFydCBvZiBHQ0MuDQo+PiArDQo+PiArLy8gR0NDIGlzIGZyZWUgc29mdHdhcmU7 IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQgdW5kZXINCj4+ICsv LyB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxp c2hlZCBieSB0aGUgRnJlZQ0KPj4gKy8vIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2 ZXJzaW9uIDMsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyDQo+PiArLy8gdmVyc2lv bi4NCj4+ICsNCj4+ICsvLyBHQ0MgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBp dCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQgQU5ZDQo+PiArLy8gV0FSUkFOVFk7IHdp dGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IN Cj4+ICsvLyBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05V IEdlbmVyYWwgUHVibGljIExpY2Vuc2UNCj4+ICsvLyBmb3IgbW9yZSBkZXRhaWxzLg0KPj4g Kw0KPj4gKy8vIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBH ZW5lcmFsIFB1YmxpYyBMaWNlbnNlDQo+PiArLy8gYWxvbmcgd2l0aCBHQ0M7IHNlZSB0aGUg ZmlsZSBDT1BZSU5HMy4gIElmIG5vdCBzZWUNCj4+ICsvLyA8aHR0cDovL3d3dy5nbnUub3Jn L2xpY2Vuc2VzLz4uDQo+PiArDQo+PiArI2lmbmRlZiBSVVNUX01BQ1JPX0VYUEFORF9IDQo+ PiArI2RlZmluZSBSVVNUX01BQ1JPX0VYUEFORF9IDQo+PiArDQo+PiArI2luY2x1ZGUgInJ1 c3QtYnVmZmVyZWQtcXVldWUuaCINCj4+ICsjaW5jbHVkZSAicnVzdC1wYXJzZS5oIg0KPj4g KyNpbmNsdWRlICJydXN0LXRva2VuLmgiDQo+PiArI2luY2x1ZGUgInJ1c3QtYXN0LmgiDQo+ PiArI2luY2x1ZGUgInJ1c3QtbWFjcm8uaCINCj4+ICsjaW5jbHVkZSAicnVzdC1oaXItbWFw LmgiDQo+PiArI2luY2x1ZGUgInJ1c3QtbmFtZS1yZXNvbHZlci5oIg0KPj4gKyNpbmNsdWRl ICJydXN0LW1hY3JvLWludm9jLWxleGVyLmgiDQo+PiArDQo+PiArLy8gUHJvdmlkZXMgb2Jq ZWN0cyBhbmQgbWV0aG9kIHByb3RvdHlwZXMgZm9yIG1hY3JvIGV4cGFuc2lvbg0KPj4gKw0K Pj4gK25hbWVzcGFjZSBSdXN0IHsNCj4+ICsvLyBmb3J3YXJkIGRlY2xzIGZvciBBU1QNCj4+ ICtuYW1lc3BhY2UgQVNUIHsNCj4+ICtjbGFzcyBNYWNyb0ludm9jYXRpb247DQo+PiArfQ0K Pj4gKw0KPj4gKy8vIE9iamVjdCB1c2VkIHRvIHN0b3JlIGNvbmZpZ3VyYXRpb24gZGF0YSBm b3IgbWFjcm8gZXhwYW5zaW9uLg0KPj4gKy8vIE5PVEU6IEtlZXAgYWxsIHRoZXNlIGl0ZW1z IGNvbXBseWluZyB3aXRoIHRoZSBsYXRlc3QgcnVzdGMuDQo+PiArc3RydWN0IEV4cGFuc2lv bkNmZw0KPj4gK3sNCj4+ICsgIC8vIGZlYXR1cmVzPw0KPj4gKyAgLy8gVE9ETzogQWRkIGBm ZWF0dXJlcycgd2hlbiB3ZSBoYXZlIGl0Lg0KPj4gKyAgdW5zaWduZWQgaW50IHJlY3Vyc2lv bl9saW1pdCA9IDEwMjQ7DQo+PiArICBib29sIHRyYWNlX21hYyA9IGZhbHNlOyAgIC8vIHRy YWNlIG1hY3JvDQo+PiArICBib29sIHNob3VsZF90ZXN0ID0gZmFsc2U7IC8vIHN0cmlwICNb dGVzdF0gbm9kZXMgaWYgZmFsc2UNCj4+ICsgIGJvb2wga2VlcF9tYWNzID0gZmFsc2U7ICAg Ly8ga2VlcCBtYWNybyBkZWZpbml0aW9ucw0KPj4gKyAgc3RkOjpzdHJpbmcgY3JhdGVfbmFt ZSA9ICIiOw0KPj4gK307DQo+PiArDQo+PiArc3RydWN0IE1hdGNoZWRGcmFnbWVudA0KPj4g K3sNCj4+ICsgIHN0ZDo6c3RyaW5nIGZyYWdtZW50X2lkZW50Ow0KPj4gKyAgc2l6ZV90IHRv a2VuX29mZnNldF9iZWdpbjsNCj4+ICsgIHNpemVfdCB0b2tlbl9vZmZzZXRfZW5kOw0KPj4g Kw0KPj4gKyAgTWF0Y2hlZEZyYWdtZW50IChzdGQ6OnN0cmluZyBpZGVudGlmaWVyLCBzaXpl X3QgdG9rZW5fb2Zmc2V0X2JlZ2luLA0KPj4gKyAgICAgICAgICAgICAgICAgIHNpemVfdCB0 b2tlbl9vZmZzZXRfZW5kKQ0KPj4gKyAgICA6IGZyYWdtZW50X2lkZW50IChpZGVudGlmaWVy KSwgdG9rZW5fb2Zmc2V0X2JlZ2luICh0b2tlbl9vZmZzZXRfYmVnaW4pLA0KPj4gKyAgICAg IHRva2VuX29mZnNldF9lbmQgKHRva2VuX29mZnNldF9lbmQpDQo+PiArICB7fQ0KPj4gKw0K Pj4gKyAgLyoqDQo+PiArICAgKiBFbXB0eSBjb25zdHJ1Y3RvciBmb3IgdW5pbml0aWFsaXpl ZCBmcmFnbWVudHMNCj4+ICsgICAqLw0KPj4gKyAgTWF0Y2hlZEZyYWdtZW50ICgpIDogTWF0 Y2hlZEZyYWdtZW50ICgiIiwgMCwgMCkge30NCj4+ICsNCj4+ICsgIHN0ZDo6c3RyaW5nIGFz X3N0cmluZyAoKSBjb25zdA0KPj4gKyAgew0KPj4gKyAgICByZXR1cm4gZnJhZ21lbnRfaWRl bnQgKyAiPSIgKyBzdGQ6OnRvX3N0cmluZyAodG9rZW5fb2Zmc2V0X2JlZ2luKSArICI6Ig0K Pj4gKyAgICAgICAgICArIHN0ZDo6dG9fc3RyaW5nICh0b2tlbl9vZmZzZXRfZW5kKTsNCj4+ ICsgIH0NCj4+ICt9Ow0KPj4gKw0KPj4gK2NsYXNzIE1hdGNoZWRGcmFnbWVudENvbnRhaW5l cg0KPj4gK3sNCj4+ICtwdWJsaWM6DQo+PiArICAvLyBEb2VzIHRoZSBjb250YWluZXIgcmVm ZXIgdG8gYSBzaW1wbGUgbWV0YXZhcmlhYmxlLCBkaWZmZXJlbnQgZnJvbSBhDQo+PiArICAv LyByZXBldGl0aW9uIHJlcGVhdGVkIG9uY2UNCj4+ICsgIGVudW0gY2xhc3MgS2luZA0KPj4g KyAgew0KPj4gKyAgICBNZXRhVmFyLA0KPj4gKyAgICBSZXBldGl0aW9uLA0KPj4gKyAgfTsN Cj4+ICsNCj4+ICsgIE1hdGNoZWRGcmFnbWVudENvbnRhaW5lciAoc3RkOjp2ZWN0b3I8TWF0 Y2hlZEZyYWdtZW50PiBmcmFnbWVudHMsDQo+PiArICAgICAgICAgICAgICAgICAgICAgICAg ICAgS2luZCBraW5kID0gS2luZDo6UmVwZXRpdGlvbikNCj4+ICsgICAgOiBmcmFnbWVudHMg KGZyYWdtZW50cyksIGtpbmQgKGtpbmQpDQo+PiArICB7fQ0KPj4gKw0KPj4gKyAgLyoqDQo+ PiArICAgKiBDcmVhdGUgYSB2YWxpZCBmcmFnbWVudCBtYXRjaGVkIHplcm8gdGltZXMuIFRo aXMgaXMgdXNlZnVsIGZvciByZXBldGl0aW9ucw0KPj4gKyAgICogd2hpY2ggYWxsb3cgdGhl IGFic2VuY2Ugb2YgYSBmcmFnbWVudCwgc3VjaCBhcyAqIGFuZCA/DQo+PiArICAgKi8NCj4+ ICsgIHN0YXRpYyBNYXRjaGVkRnJhZ21lbnRDb250YWluZXIgemVybyAoKQ0KPj4gKyAgew0K Pj4gKyAgICByZXR1cm4gTWF0Y2hlZEZyYWdtZW50Q29udGFpbmVyICh7fSk7DQo+PiArICB9 DQo+PiArDQo+PiArICAvKioNCj4+ICsgICAqIENyZWF0ZSBhIHZhbGlkIGZyYWdtZW50IG1h dGNoZWQgb25lIHRpbWUNCj4+ICsgICAqLw0KPj4gKyAgc3RhdGljIE1hdGNoZWRGcmFnbWVu dENvbnRhaW5lciBtZXRhdmFyIChNYXRjaGVkRnJhZ21lbnQgZnJhZ21lbnQpDQo+PiArICB7 DQo+PiArICAgIHJldHVybiBNYXRjaGVkRnJhZ21lbnRDb250YWluZXIgKHtmcmFnbWVudH0s IEtpbmQ6Ok1ldGFWYXIpOw0KPj4gKyAgfQ0KPj4gKw0KPj4gKyAgLyoqDQo+PiArICAgKiBB ZGQgYSBtYXRjaGVkIGZyYWdtZW50IHRvIHRoZSBjb250YWluZXINCj4+ICsgICAqLw0KPj4g KyAgdm9pZCBhZGRfZnJhZ21lbnQgKE1hdGNoZWRGcmFnbWVudCBmcmFnbWVudCkNCj4+ICsg IHsNCj4+ICsgICAgcnVzdF9hc3NlcnQgKCFpc19zaW5nbGVfZnJhZ21lbnQgKCkpOw0KPj4g Kw0KPj4gKyAgICBmcmFnbWVudHMuZW1wbGFjZV9iYWNrIChmcmFnbWVudCk7DQo+PiArICB9 DQo+PiArDQo+PiArICBzaXplX3QgZ2V0X21hdGNoX2Ftb3VudCAoKSBjb25zdCB7IHJldHVy biBmcmFnbWVudHMuc2l6ZSAoKTsgfQ0KPj4gKyAgY29uc3Qgc3RkOjp2ZWN0b3I8TWF0Y2hl ZEZyYWdtZW50PiAmZ2V0X2ZyYWdtZW50cyAoKSBjb25zdA0KPj4gKyAgew0KPj4gKyAgICBy ZXR1cm4gZnJhZ21lbnRzOw0KPj4gKyAgfQ0KPj4gKyAgLy8gY29uc3Qgc3RkOjpzdHJpbmcg JmdldF9mcmFnbWVudF9uYW1lICgpIGNvbnN0IHsgcmV0dXJuIGZyYWdtZW50X25hbWU7IH0N Cj4+ICsNCj4+ICsgIGJvb2wgaXNfc2luZ2xlX2ZyYWdtZW50ICgpIGNvbnN0DQo+PiArICB7 DQo+PiArICAgIHJldHVybiBnZXRfbWF0Y2hfYW1vdW50ICgpID09IDEgJiYga2luZCA9PSBL aW5kOjpNZXRhVmFyOw0KPj4gKyAgfQ0KPj4gKw0KPj4gKyAgY29uc3QgTWF0Y2hlZEZyYWdt ZW50IGdldF9zaW5nbGVfZnJhZ21lbnQgKCkgY29uc3QNCj4+ICsgIHsNCj4+ICsgICAgcnVz dF9hc3NlcnQgKGlzX3NpbmdsZV9mcmFnbWVudCAoKSk7DQo+PiArDQo+PiArICAgIHJldHVy biBmcmFnbWVudHNbMF07DQo+PiArICB9DQo+PiArDQo+PiArICBjb25zdCBLaW5kICZnZXRf a2luZCAoKSBjb25zdCB7IHJldHVybiBraW5kOyB9DQo+PiArDQo+PiArcHJpdmF0ZToNCj4+ ICsgIC8qKg0KPj4gKyAgICogRnJhZ21lbnRzIG1hdGNoZWQgYG1hdGNoX2Ftb3VudGAgdGlt ZXMuIFRoaXMgY2FuIGJlIGFuIGVtcHR5IHZlY3Rvcg0KPj4gKyAgICogaW4gY2FzZSBoYXZp bmcgemVybyBtYXRjaGVzIGlzIGFsbG93ZWQgKGkuZSA/IG9yICogb3BlcmF0b3JzKQ0KPj4g KyAgICovDQo+PiArICBzdGQ6OnZlY3RvcjxNYXRjaGVkRnJhZ21lbnQ+IGZyYWdtZW50czsN Cj4+ICsgIEtpbmQga2luZDsNCj4+ICt9Ow0KPj4gKw0KPj4gK2NsYXNzIFN1YnN0aXR1dGlv blNjb3BlDQo+PiArew0KPj4gK3B1YmxpYzoNCj4+ICsgIFN1YnN0aXR1dGlvblNjb3BlICgp IDogc3RhY2sgKCkge30NCj4+ICsNCj4+ICsgIHZvaWQgcHVzaCAoKSB7IHN0YWNrLnB1c2hf YmFjayAoe30pOyB9DQo+PiArDQo+PiArICBzdGQ6Om1hcDxzdGQ6OnN0cmluZywgTWF0Y2hl ZEZyYWdtZW50Q29udGFpbmVyPiBwb3AgKCkNCj4+ICsgIHsNCj4+ICsgICAgYXV0byB0b3Ag PSBzdGFjay5iYWNrICgpOw0KPj4gKyAgICBzdGFjay5wb3BfYmFjayAoKTsNCj4+ICsgICAg cmV0dXJuIHRvcDsNCj4+ICsgIH0NCj4+ICsNCj4+ICsgIHN0ZDo6bWFwPHN0ZDo6c3RyaW5n LCBNYXRjaGVkRnJhZ21lbnRDb250YWluZXI+ICZwZWVrICgpDQo+PiArICB7DQo+PiArICAg IHJldHVybiBzdGFjay5iYWNrICgpOw0KPj4gKyAgfQ0KPj4gKw0KPj4gKyAgLyoqDQo+PiAr ICAgKiBJbnNlcnQgYSBuZXcgbWF0Y2hlZCBtZXRhdmFyIGludG8gdGhlIGN1cnJlbnQgc3Vi c3RpdHV0aW9uIG1hcA0KPj4gKyAgICovDQo+PiArICB2b2lkIGluc2VydF9tZXRhdmFyIChN YXRjaGVkRnJhZ21lbnQgZnJhZ21lbnQpDQo+PiArICB7DQo+PiArICAgIGF1dG8gJmN1cnJl bnRfbWFwID0gc3RhY2suYmFjayAoKTsNCj4+ICsgICAgYXV0byBpdCA9IGN1cnJlbnRfbWFw LmZpbmQgKGZyYWdtZW50LmZyYWdtZW50X2lkZW50KTsNCj4+ICsNCj4+ICsgICAgaWYgKGl0 ID09IGN1cnJlbnRfbWFwLmVuZCAoKSkNCj4+ICsgICAgICBjdXJyZW50X21hcC5pbnNlcnQg KHtmcmFnbWVudC5mcmFnbWVudF9pZGVudCwNCj4+ICsgICAgICAgICAgICAgICAgICAgICAg ICAgIE1hdGNoZWRGcmFnbWVudENvbnRhaW5lcjo6bWV0YXZhciAoZnJhZ21lbnQpfSk7DQo+ PiArICAgIGVsc2UNCj4+ICsgICAgICBnY2NfdW5yZWFjaGFibGUgKCk7DQo+PiArICB9DQo+ PiArDQo+PiArICAvKioNCj4+ICsgICAqIEFwcGVuZCBhIG5ldyBtYXRjaGVkIGZyYWdtZW50 IHRvIGEgcmVwZXRpdGlvbiBpbnRvIHRoZSBjdXJyZW50IHN1YnN0aXR1dGlvbg0KPj4gKyAg ICogbWFwDQo+PiArICAgKi8NCj4+ICsgIHZvaWQgYXBwZW5kX2ZyYWdtZW50IChNYXRjaGVk RnJhZ21lbnQgZnJhZ21lbnQpDQo+PiArICB7DQo+PiArICAgIGF1dG8gJmN1cnJlbnRfbWFw ID0gc3RhY2suYmFjayAoKTsNCj4+ICsgICAgYXV0byBpdCA9IGN1cnJlbnRfbWFwLmZpbmQg KGZyYWdtZW50LmZyYWdtZW50X2lkZW50KTsNCj4+ICsNCj4+ICsgICAgaWYgKGl0ID09IGN1 cnJlbnRfbWFwLmVuZCAoKSkNCj4+ICsgICAgICBjdXJyZW50X21hcC5pbnNlcnQgKA0KPj4g KyAgICAgICB7ZnJhZ21lbnQuZnJhZ21lbnRfaWRlbnQsIE1hdGNoZWRGcmFnbWVudENvbnRh aW5lciAoe2ZyYWdtZW50fSl9KTsNCj4+ICsgICAgZWxzZQ0KPj4gKyAgICAgIGl0LT5zZWNv bmQuYWRkX2ZyYWdtZW50IChmcmFnbWVudCk7DQo+PiArICB9DQo+PiArDQo+PiArICB2b2lk IGluc2VydF9tYXRjaGVzIChzdGQ6OnN0cmluZyBrZXksIE1hdGNoZWRGcmFnbWVudENvbnRh aW5lciBtYXRjaGVzKQ0KPj4gKyAgew0KPj4gKyAgICBhdXRvICZjdXJyZW50X21hcCA9IHN0 YWNrLmJhY2sgKCk7DQo+PiArICAgIGF1dG8gaXQgPSBjdXJyZW50X21hcC5maW5kIChrZXkp Ow0KPj4gKyAgICBydXN0X2Fzc2VydCAoaXQgPT0gY3VycmVudF9tYXAuZW5kICgpKTsNCj4+ ICsNCj4+ICsgICAgY3VycmVudF9tYXAuaW5zZXJ0ICh7a2V5LCBtYXRjaGVzfSk7DQo+PiAr ICB9DQo+PiArDQo+PiArcHJpdmF0ZToNCj4+ICsgIHN0ZDo6dmVjdG9yPHN0ZDo6bWFwPHN0 ZDo6c3RyaW5nLCBNYXRjaGVkRnJhZ21lbnRDb250YWluZXI+PiBzdGFjazsNCj4+ICt9Ow0K Pj4gKw0KPj4gKy8vIE9iamVjdCB1c2VkIHRvIHN0b3JlIHNoYXJlZCBkYXRhIChiZXR3ZWVu IGZ1bmN0aW9ucykgZm9yIG1hY3JvIGV4cGFuc2lvbi4NCj4+ICtzdHJ1Y3QgTWFjcm9FeHBh bmRlcg0KPj4gK3sNCj4+ICsgIGVudW0gQ29udGV4dFR5cGUNCj4+ICsgIHsNCj4+ICsgICAg SVRFTSwNCj4+ICsgICAgQkxPQ0ssDQo+PiArICAgIEVYVEVSTiwNCj4+ICsgICAgVFlQRSwN Cj4+ICsgICAgVFJBSVQsDQo+PiArICAgIElNUEwsDQo+PiArICAgIFRSQUlUX0lNUEwsDQo+ PiArICB9Ow0KPj4gKw0KPj4gKyAgRXhwYW5zaW9uQ2ZnIGNmZzsNCj4+ICsgIHVuc2lnbmVk IGludCBleHBhbnNpb25fZGVwdGggPSAwOw0KPj4gKw0KPj4gKyAgTWFjcm9FeHBhbmRlciAo QVNUOjpDcmF0ZSAmY3JhdGUsIEV4cGFuc2lvbkNmZyBjZmcsIFNlc3Npb24gJnNlc3Npb24p DQo+PiArICAgIDogY2ZnIChjZmcpLCBjcmF0ZSAoY3JhdGUpLCBzZXNzaW9uIChzZXNzaW9u KSwNCj4+ICsgICAgICBzdWJfc3RhY2sgKFN1YnN0aXR1dGlvblNjb3BlICgpKSwNCj4+ICsg ICAgICBleHBhbmRlZF9mcmFnbWVudCAoQVNUOjpBU1RGcmFnbWVudDo6Y3JlYXRlX2Vycm9y ICgpKSwNCj4+ICsgICAgICByZXNvbHZlciAoUmVzb2x2ZXI6OlJlc29sdmVyOjpnZXQgKCkp LA0KPj4gKyAgICAgIG1hcHBpbmdzIChBbmFseXNpczo6TWFwcGluZ3M6OmdldCAoKSkNCj4+ ICsgIHt9DQo+PiArDQo+PiArICB+TWFjcm9FeHBhbmRlciAoKSA9IGRlZmF1bHQ7DQo+PiAr DQo+PiArICAvLyBFeHBhbmRzIGFsbCBtYWNyb3MgaW4gdGhlIGNyYXRlIHBhc3NlZCBpbi4N Cj4+ICsgIHZvaWQgZXhwYW5kX2NyYXRlICgpOw0KPj4gKw0KPj4gKyAgLyogRXhwYW5kcyBh IG1hY3JvIGludm9jYXRpb24gLSBwb3NzaWJseSBtYWtlIGJvdGgNCj4+ICsgICAqIGhhdmUg c2ltaWxhciBkdWNrLXR5cGVkIGludGVyZmFjZSBhbmQgdXNlIHRlbXBsYXRlcz8qLw0KPj4g KyAgLy8gc2hvdWxkIHRoaXMgYmUgcHVibGljIG9yIHByaXZhdGU/DQo+PiArICB2b2lkIGV4 cGFuZF9pbnZvYyAoQVNUOjpNYWNyb0ludm9jYXRpb24gJmludm9jLCBib29sIGhhc19zZW1p Y29sb24pOw0KPj4gKw0KPj4gKyAgLy8gRXhwYW5kcyBhIHNpbmdsZSBkZWNsYXJhdGl2ZSBt YWNyby4NCj4+ICsgIEFTVDo6QVNURnJhZ21lbnQgZXhwYW5kX2RlY2xfbWFjcm8gKExvY2F0 aW9uIGxvY3VzLA0KPj4gKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBB U1Q6Ok1hY3JvSW52b2NEYXRhICZpbnZvYywNCj4+ICsgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgQVNUOjpNYWNyb1J1bGVzRGVmaW5pdGlvbiAmcnVsZXNfZGVmLA0K Pj4gKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIHNlbWljb2xv bik7DQo+PiArDQo+PiArICB2b2lkIGV4cGFuZF9jZmdfYXR0cnMgKEFTVDo6QXR0clZlYyAm YXR0cnMpOw0KPj4gKyAgYm9vbCBmYWlsc19jZmcgKGNvbnN0IEFTVDo6QXR0clZlYyAmYXR0 cikgY29uc3Q7DQo+PiArICBib29sIGZhaWxzX2NmZ193aXRoX2V4cGFuZCAoQVNUOjpBdHRy VmVjICZhdHRycykgY29uc3Q7DQo+PiArDQo+PiArICBib29sIGRlcHRoX2V4Y2VlZHNfcmVj dXJzaW9uX2xpbWl0ICgpIGNvbnN0Ow0KPj4gKw0KPj4gKyAgYm9vbCB0cnlfbWF0Y2hfcnVs ZSAoQVNUOjpNYWNyb1J1bGUgJm1hdGNoX3J1bGUsDQo+PiArICAgICAgICAgICAgICAgICAg ICAgIEFTVDo6RGVsaW1Ub2tlblRyZWUgJmludm9jX3Rva2VuX3RyZWUpOw0KPj4gKw0KPj4g KyAgQVNUOjpBU1RGcmFnbWVudCB0cmFuc2NyaWJlX3J1bGUgKA0KPj4gKyAgICBBU1Q6Ok1h Y3JvUnVsZSAmbWF0Y2hfcnVsZSwgQVNUOjpEZWxpbVRva2VuVHJlZSAmaW52b2NfdG9rZW5f dHJlZSwNCj4+ICsgICAgc3RkOjptYXA8c3RkOjpzdHJpbmcsIE1hdGNoZWRGcmFnbWVudENv bnRhaW5lcj4gJm1hdGNoZWRfZnJhZ21lbnRzLA0KPj4gKyAgICBib29sIHNlbWljb2xvbiwg Q29udGV4dFR5cGUgY3R4KTsNCj4+ICsNCj4+ICsgIGJvb2wgbWF0Y2hfZnJhZ21lbnQgKFBh cnNlcjxNYWNyb0ludm9jTGV4ZXI+ICZwYXJzZXIsDQo+PiArICAgICAgICAgICAgICAgICAg ICAgIEFTVDo6TWFjcm9NYXRjaEZyYWdtZW50ICZmcmFnbWVudCk7DQo+PiArDQo+PiArICBi b29sIG1hdGNoX3Rva2VuIChQYXJzZXI8TWFjcm9JbnZvY0xleGVyPiAmcGFyc2VyLCBBU1Q6 OlRva2VuICZ0b2tlbik7DQo+PiArDQo+PiArICBib29sIG1hdGNoX3JlcGV0aXRpb24gKFBh cnNlcjxNYWNyb0ludm9jTGV4ZXI+ICZwYXJzZXIsDQo+PiArICAgICAgICAgICAgICAgICAg ICAgICAgQVNUOjpNYWNyb01hdGNoUmVwZXRpdGlvbiAmcmVwKTsNCj4+ICsNCj4+ICsgIGJv b2wgbWF0Y2hfbWF0Y2hlciAoUGFyc2VyPE1hY3JvSW52b2NMZXhlcj4gJnBhcnNlciwNCj4+ ICsgICAgICAgICAgICAgICAgICAgICBBU1Q6Ok1hY3JvTWF0Y2hlciAmbWF0Y2hlcik7DQo+ PiArDQo+PiArICAvKioNCj4+ICsgICAqIE1hdGNoIGFueSBhbW91bnQgb2YgbWF0Y2hlcw0K Pj4gKyAgICoNCj4+ICsgICAqIEBwYXJhbSBwYXJzZXIgUGFyc2VyIHRvIHVzZSBmb3IgbWF0 Y2hpbmcNCj4+ICsgICAqIEBwYXJhbSByZXAgUmVwZXRpdGlvbiB0byB0cnkgYW5kIG1hdGNo DQo+PiArICAgKiBAcGFyYW0gbWF0Y2hfYW1vdW50IFJlZmVyZW5jZSBpbiB3aGljaCB0byBz dG9yZSB0aGUgYW1tb3VudCBvZiBzdWNjZXNmdWwNCj4+ICsgICAqIGFuZCB2YWxpZCBtYXRj aGVzDQo+PiArICAgKg0KPj4gKyAgICogQHBhcmFtIGxvX2JvdW5kIExvd2VyIGJvdW5kIG9m IHRoZSBtYXRjaGVyLiBXaGVuIHNwZWNpZmllZCwgdGhlIG1hdGNoZXINCj4+ICsgICAqIHdp bGwgb25seSBzdWNjZWVkIGlmIGl0IHBhcnNlcyBhdCAqbGVhc3QqIGBsb19ib3VuZGAgZnJh Z21lbnRzLiBJZg0KPj4gKyAgICogdW5zcGVjaWZpZWQsIHRoZSBtYXRjaGVyIGNvdWxkIHN1 Y2NlZWQgd2hlbiBwYXJzaW5nIDAgZnJhZ21lbnRzLg0KPj4gKyAgICoNCj4+ICsgICAqIEBw YXJhbSBoaV9ib3VuZCBIaWdoZXIgYm91bmQgb2YgdGhlIG1hdGNoZXIuIFdoZW4gc3BlY2lm aWVkLCB0aGUgbWF0Y2hlcg0KPj4gKyAgICogd2lsbCBvbmx5IHN1Y2NlZWQgaWYgaXQgcGFy c2VzICpsZXNzIHRoYW4qIGBoaV9ib3VuZGAgZnJhZ21lbnRzLiBJZg0KPj4gKyAgICogdW5z cGVjaWZpZWQsIHRoZSBtYXRjaGVyIGNvdWxkIHN1Y2NlZWQgd2hlbiBwYXJzaW5nIGFuIGlu ZmluaXR5IG9mDQo+PiArICAgKiBmcmFnbWVudHMuDQo+PiArICAgKg0KPj4gKyAgICogQHJl dHVybiB0cnVlIGlmIG1hdGNoaW5nIHdhcyBzdWNjZXNzZnVsIGFuZCB3aXRoaW4gdGhlIGdp dmVuIGxpbWl0cywgZmFsc2UNCj4+ICsgICAqIG90aGVyd2lzZQ0KPj4gKyAgICovDQo+PiAr ICBib29sIG1hdGNoX25fbWF0Y2hlcyAoUGFyc2VyPE1hY3JvSW52b2NMZXhlcj4gJnBhcnNl ciwNCj4+ICsgICAgICAgICAgICAgICAgICAgICAgIEFTVDo6TWFjcm9NYXRjaFJlcGV0aXRp b24gJnJlcCwgc2l6ZV90ICZtYXRjaF9hbW91bnQsDQo+PiArICAgICAgICAgICAgICAgICAg ICAgICBzaXplX3QgbG9fYm91bmQgPSAwLCBzaXplX3QgaGlfYm91bmQgPSAwKTsNCj4+ICsN Cj4+ICsgIHZvaWQgcHVzaF9jb250ZXh0IChDb250ZXh0VHlwZSB0KSB7IGNvbnRleHQucHVz aF9iYWNrICh0KTsgfQ0KPj4gKw0KPj4gKyAgQ29udGV4dFR5cGUgcG9wX2NvbnRleHQgKCkN Cj4+ICsgIHsNCj4+ICsgICAgcnVzdF9hc3NlcnQgKCFjb250ZXh0LmVtcHR5ICgpKTsNCj4+ ICsNCj4+ICsgICAgQ29udGV4dFR5cGUgdCA9IGNvbnRleHQuYmFjayAoKTsNCj4+ICsgICAg Y29udGV4dC5wb3BfYmFjayAoKTsNCj4+ICsNCj4+ICsgICAgcmV0dXJuIHQ7DQo+PiArICB9 DQo+PiArDQo+PiArICBDb250ZXh0VHlwZSBwZWVrX2NvbnRleHQgKCkgeyByZXR1cm4gY29u dGV4dC5iYWNrICgpOyB9DQo+PiArDQo+PiArICB2b2lkIHNldF9leHBhbmRlZF9mcmFnbWVu dCAoQVNUOjpBU1RGcmFnbWVudCAmJmZyYWdtZW50KQ0KPj4gKyAgew0KPj4gKyAgICBleHBh bmRlZF9mcmFnbWVudCA9IHN0ZDo6bW92ZSAoZnJhZ21lbnQpOw0KPj4gKyAgfQ0KPj4gKw0K Pj4gKyAgQVNUOjpBU1RGcmFnbWVudCB0YWtlX2V4cGFuZGVkX2ZyYWdtZW50IChBU1Q6OkFT VFZpc2l0b3IgJnZpcykNCj4+ICsgIHsNCj4+ICsgICAgQVNUOjpBU1RGcmFnbWVudCBvbGRf ZnJhZ21lbnQgPSBzdGQ6Om1vdmUgKGV4cGFuZGVkX2ZyYWdtZW50KTsNCj4+ICsgICAgYXV0 byBhY2N1bXVsYXRvciA9IHN0ZDo6dmVjdG9yPEFTVDo6U2luZ2xlQVNUTm9kZT4gKCk7DQo+ PiArICAgIGV4cGFuZGVkX2ZyYWdtZW50ID0gQVNUOjpBU1RGcmFnbWVudDo6Y3JlYXRlX2Vy cm9yICgpOw0KPj4gKw0KPj4gKyAgICBmb3IgKGF1dG8gJm5vZGUgOiBvbGRfZnJhZ21lbnQu Z2V0X25vZGVzICgpKQ0KPj4gKyAgICAgIHsNCj4+ICsgICAgICAgZXhwYW5zaW9uX2RlcHRo Kys7DQo+PiArICAgICAgIG5vZGUuYWNjZXB0X3ZpcyAodmlzKTsNCj4+ICsgICAgICAgLy8g d2UnbGwgZGVjaWRlIHRoZSBuZXh0IG1vdmUgYWNjb3JkaW5nIHRvIHRoZSBvdXRjb21lIG9m IHRoZSBtYWNybw0KPj4gKyAgICAgICAvLyBleHBhbnNpb24NCj4+ICsgICAgICAgaWYgKGV4 cGFuZGVkX2ZyYWdtZW50LmlzX2Vycm9yICgpKQ0KPj4gKyAgICAgICAgIGFjY3VtdWxhdG9y LnB1c2hfYmFjayAobm9kZSk7IC8vIGlmIGV4cGFuc2lvbiBmYWlscywgdGhlcmUgbWlnaHQg YmUgYQ0KPj4gKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIG5v bi1tYWNybyBleHByZXNzaW9uIHdlIG5lZWQgdG8ga2VlcA0KPj4gKyAgICAgICBlbHNlDQo+ PiArICAgICAgICAgew0KPj4gKyAgICAgICAgICAgLy8gaWYgZXhwYW5zaW9uIHN1Y2NlZWRl ZCwgdGhlbiB3ZSBuZWVkIHRvIG1lcmdlIHRoZSBmcmFnbWVudCB3aXRoDQo+PiArICAgICAg ICAgICAvLyB0aGUgY29udGVudHMgaW4gdGhlIGFjY3VtdWxhdG9yLCBzbyB0aGF0IG91ciBm aW5hbCBleHBhbnNpb24NCj4+ICsgICAgICAgICAgIC8vIHJlc3VsdCB3aWxsIGNvbnRhaW4g bm9uLW1hY3JvIG5vZGVzIGFzIGl0IHNob3VsZA0KPj4gKyAgICAgICAgICAgYXV0byBuZXdf bm9kZXMgPSBleHBhbmRlZF9mcmFnbWVudC5nZXRfbm9kZXMgKCk7DQo+PiArICAgICAgICAg ICBzdGQ6Om1vdmUgKG5ld19ub2Rlcy5iZWdpbiAoKSwgbmV3X25vZGVzLmVuZCAoKSwNCj4+ ICsgICAgICAgICAgICAgICAgICAgICAgc3RkOjpiYWNrX2luc2VydGVyIChhY2N1bXVsYXRv cikpOw0KPj4gKyAgICAgICAgICAgZXhwYW5kZWRfZnJhZ21lbnQgPSBBU1Q6OkFTVEZyYWdt ZW50IChhY2N1bXVsYXRvcik7DQo+PiArICAgICAgICAgfQ0KPj4gKyAgICAgICBleHBhbnNp b25fZGVwdGgtLTsNCj4+ICsgICAgICB9DQo+PiArDQo+PiArICAgIHJldHVybiBvbGRfZnJh Z21lbnQ7DQo+PiArICB9DQo+PiArDQo+PiArcHJpdmF0ZToNCj4+ICsgIEFTVDo6Q3JhdGUg JmNyYXRlOw0KPj4gKyAgU2Vzc2lvbiAmc2Vzc2lvbjsNCj4+ICsgIFN1YnN0aXR1dGlvblNj b3BlIHN1Yl9zdGFjazsNCj4+ICsgIHN0ZDo6dmVjdG9yPENvbnRleHRUeXBlPiBjb250ZXh0 Ow0KPj4gKyAgQVNUOjpBU1RGcmFnbWVudCBleHBhbmRlZF9mcmFnbWVudDsNCj4+ICsNCj4+ ICtwdWJsaWM6DQo+PiArICBSZXNvbHZlcjo6UmVzb2x2ZXIgKnJlc29sdmVyOw0KPj4gKyAg QW5hbHlzaXM6Ok1hcHBpbmdzICptYXBwaW5nczsNCj4+ICt9Ow0KPj4gKw0KPj4gK30gLy8g bmFtZXNwYWNlIFJ1c3QNCj4+ICsNCj4+ICsjZW5kaWYNCj4+IGRpZmYgLS1naXQgYS9nY2Mv cnVzdC9leHBhbmQvcnVzdC1tYWNyby1pbnZvYy1sZXhlci5jYyBiL2djYy9ydXN0L2V4cGFu ZC9ydXN0LW1hY3JvLWludm9jLWxleGVyLmNjDQo+PiBuZXcgZmlsZSBtb2RlIDEwMDY0NA0K Pj4gaW5kZXggMDAwMDAwMDAwMDAuLjhhNDNkMjllMGQxDQo+PiAtLS0gL2Rldi9udWxsDQo+ PiArKysgYi9nY2MvcnVzdC9leHBhbmQvcnVzdC1tYWNyby1pbnZvYy1sZXhlci5jYw0KPj4g QEAgLTAsMCArMSwyOSBAQA0KPj4gKyNpbmNsdWRlICJydXN0LW1hY3JvLWludm9jLWxleGVy LmgiDQo+PiArDQo+PiArbmFtZXNwYWNlIFJ1c3Qgew0KPj4gKw0KPj4gK2NvbnN0X1Rva2Vu UHRyDQo+PiArTWFjcm9JbnZvY0xleGVyOjpwZWVrX3Rva2VuIChpbnQgbikNCj4+ICt7DQo+ PiArICBpZiAoKG9mZnMgKyBuKSA+PSB0b2tlbl9zdHJlYW0uc2l6ZSAoKSkNCj4+ICsgICAg cmV0dXJuIFRva2VuOjptYWtlIChFTkRfT0ZfRklMRSwgTG9jYXRpb24gKCkpOw0KPj4gKw0K Pj4gKyAgcmV0dXJuIHRva2VuX3N0cmVhbS5hdCAob2ZmcyArIG4pLT5nZXRfdG9rX3B0ciAo KTsNCj4+ICt9DQo+PiArDQo+PiArLy8gQWR2YW5jZXMgY3VycmVudCB0b2tlbiB0byBuICsg MSB0b2tlbnMgYWhlYWQgb2YgY3VycmVudCBwb3NpdGlvbi4NCj4+ICt2b2lkDQo+PiArTWFj cm9JbnZvY0xleGVyOjpza2lwX3Rva2VuIChpbnQgbikNCj4+ICt7DQo+PiArICBvZmZzICs9 IChuICsgMSk7DQo+PiArfQ0KPj4gKw0KPj4gK3ZvaWQNCj4+ICtNYWNyb0ludm9jTGV4ZXI6 OnNwbGl0X2N1cnJlbnRfdG9rZW4gKFRva2VuSWQgbmV3X2xlZnQgX19hdHRyaWJ1dGVfXyAo KHVudXNlZCkpLA0KPj4gKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBU b2tlbklkIG5ld19yaWdodA0KPj4gKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICBfX2F0dHJpYnV0ZV9fICgodW51c2VkKSkpDQo+PiArew0KPj4gKyAgLy8gRklYTUUN Cj4+ICsgIGdjY191bnJlYWNoYWJsZSAoKTsNCj4+ICt9DQo+PiArfSAvLyBuYW1lc3BhY2Ug UnVzdA0KPj4gZGlmZiAtLWdpdCBhL2djYy9ydXN0L2V4cGFuZC9ydXN0LW1hY3JvLWludm9j LWxleGVyLmggYi9nY2MvcnVzdC9leHBhbmQvcnVzdC1tYWNyby1pbnZvYy1sZXhlci5oDQo+ PiBuZXcgZmlsZSBtb2RlIDEwMDY0NA0KPj4gaW5kZXggMDAwMDAwMDAwMDAuLjBmZDQ1NTRk MDJmDQo+PiAtLS0gL2Rldi9udWxsDQo+PiArKysgYi9nY2MvcnVzdC9leHBhbmQvcnVzdC1t YWNyby1pbnZvYy1sZXhlci5oDQo+PiBAQCAtMCwwICsxLDY0IEBADQo+PiArLy8gQ29weXJp Z2h0IChDKSAyMDIwLTIwMjIgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuDQo+PiAr DQo+PiArLy8gVGhpcyBmaWxlIGlzIHBhcnQgb2YgR0NDLg0KPj4gKw0KPj4gKy8vIEdDQyBp cyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5 IGl0IHVuZGVyDQo+PiArLy8gdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMg TGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUNCj4+ICsvLyBTb2Z0d2FyZSBGb3Vu ZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRl cg0KPj4gKy8vIHZlcnNpb24uDQo+PiArDQo+PiArLy8gR0NDIGlzIGRpc3RyaWJ1dGVkIGlu IHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUIEFOWQ0KPj4g Ky8vIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVS Q0hBTlRBQklMSVRZIG9yDQo+PiArLy8gRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBP U0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlDQo+PiArLy8gZm9yIG1v cmUgZGV0YWlscy4NCj4+ICsNCj4+ICsvLyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBj b3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQ0KPj4gKy8vIGFsb25nIHdp dGggR0NDOyBzZWUgdGhlIGZpbGUgQ09QWUlORzMuICBJZiBub3Qgc2VlDQo+PiArLy8gPGh0 dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+Lg0KPj4gKw0KPj4gKyNpZm5kZWYgUlVTVF9N QUNST19JTlZPQ19MRVhFUl9IDQo+PiArI2RlZmluZSBSVVNUX01BQ1JPX0lOVk9DX0xFWEVS X0gNCj4+ICsNCj4+ICsjaW5jbHVkZSAicnVzdC1hc3QuaCINCj4+ICsNCj4+ICtuYW1lc3Bh Y2UgUnVzdCB7DQo+PiArY2xhc3MgTWFjcm9JbnZvY0xleGVyDQo+PiArew0KPj4gK3B1Ymxp YzoNCj4+ICsgIE1hY3JvSW52b2NMZXhlciAoc3RkOjp2ZWN0b3I8c3RkOjp1bmlxdWVfcHRy PEFTVDo6VG9rZW4+PiBzdHJlYW0pDQo+PiArICAgIDogb2ZmcyAoMCksIHRva2VuX3N0cmVh bSAoc3RkOjptb3ZlIChzdHJlYW0pKQ0KPj4gKyAge30NCj4+ICsNCj4+ICsgIC8vIFJldHVy bnMgdG9rZW4gbiB0b2tlbnMgYWhlYWQgb2YgY3VycmVudCBwb3NpdGlvbi4NCj4+ICsgIGNv bnN0X1Rva2VuUHRyIHBlZWtfdG9rZW4gKGludCBuKTsNCj4+ICsNCj4+ICsgIC8vIFBlZWtz IHRoZSBjdXJyZW50IHRva2VuLg0KPj4gKyAgY29uc3RfVG9rZW5QdHIgcGVla190b2tlbiAo KSB7IHJldHVybiBwZWVrX3Rva2VuICgwKTsgfQ0KPj4gKw0KPj4gKyAgLy8gQWR2YW5jZXMg Y3VycmVudCB0b2tlbiB0byBuICsgMSB0b2tlbnMgYWhlYWQgb2YgY3VycmVudCBwb3NpdGlv bi4NCj4+ICsgIHZvaWQgc2tpcF90b2tlbiAoaW50IG4pOw0KPj4gKw0KPj4gKyAgLy8gU2tp cHMgdGhlIGN1cnJlbnQgdG9rZW4uDQo+PiArICB2b2lkIHNraXBfdG9rZW4gKCkgeyBza2lw X3Rva2VuICgwKTsgfQ0KPj4gKw0KPj4gKyAgLy8gU3BsaXRzIHRoZSBjdXJyZW50IHRva2Vu IGludG8gdHdvLiBJbnRlbmRlZCBmb3IgdXNlIHdpdGggbmVzdGVkIGdlbmVyaWNzDQo+PiAr ICAvLyBjbG9zZXMgKGkuZS4gVDxVPFg+PiB3aGVyZSA+PiBpcyB3cm9uZ2x5IGxleGVkIGFz IG9uZSB0b2tlbikuIE5vdGUgdGhhdA0KPj4gKyAgLy8gdGhpcyB3aWxsIG9ubHkgd29yayB3 aXRoICJzaW1wbGUiIHRva2VucyBsaWtlIHB1bmN0dWF0aW9uLg0KPj4gKyAgdm9pZCBzcGxp dF9jdXJyZW50X3Rva2VuIChUb2tlbklkIG5ld19sZWZ0LCBUb2tlbklkIG5ld19yaWdodCk7 DQo+PiArDQo+PiArICBzdGQ6OnN0cmluZyBnZXRfZmlsZW5hbWUgKCkgY29uc3QNCj4+ICsg IHsNCj4+ICsgICAgLy8gRklYTUUNCj4+ICsgICAgZ2NjX3VucmVhY2hhYmxlICgpOw0KPj4g KyAgICByZXR1cm4gIkZJWE1FIjsNCj4+ICsgIH0NCj4+ICsNCj4+ICsgIHNpemVfdCBnZXRf b2ZmcyAoKSBjb25zdCB7IHJldHVybiBvZmZzOyB9DQo+PiArDQo+PiArcHJpdmF0ZToNCj4+ ICsgIHNpemVfdCBvZmZzOw0KPj4gKyAgc3RkOjp2ZWN0b3I8c3RkOjp1bmlxdWVfcHRyPEFT VDo6VG9rZW4+PiB0b2tlbl9zdHJlYW07DQo+PiArfTsNCj4+ICt9IC8vIG5hbWVzcGFjZSBS dXN0DQo+PiArDQo+PiArI2VuZGlmIC8vIFJVU1RfTUFDUk9fSU5WT0NfTEVYRVJfSA0KPj4g ZGlmZiAtLWdpdCBhL2djYy9ydXN0L2V4cGFuZC9ydXN0LW1hY3JvLXN1YnN0aXR1dGUtY3R4 LmNjIGIvZ2NjL3J1c3QvZXhwYW5kL3J1c3QtbWFjcm8tc3Vic3RpdHV0ZS1jdHguY2MNCj4+ IG5ldyBmaWxlIG1vZGUgMTAwNjQ0DQo+PiBpbmRleCAwMDAwMDAwMDAwMC4uOTU5MmQyZDJh OWUNCj4+IC0tLSAvZGV2L251bGwNCj4+ICsrKyBiL2djYy9ydXN0L2V4cGFuZC9ydXN0LW1h Y3JvLXN1YnN0aXR1dGUtY3R4LmNjDQo+PiBAQCAtMCwwICsxLDMxMiBAQA0KPj4gKyNpbmNs dWRlICJydXN0LW1hY3JvLXN1YnN0aXR1dGUtY3R4LmgiDQo+PiArDQo+PiArbmFtZXNwYWNl IFJ1c3Qgew0KPj4gKw0KPj4gK3N0ZDo6dmVjdG9yPHN0ZDo6dW5pcXVlX3B0cjxBU1Q6OlRv a2VuPj4NCj4+ICtTdWJzdGl0dXRlQ3R4OjpzdWJzdGl0dXRlX21ldGF2YXIgKHN0ZDo6dW5p cXVlX3B0cjxBU1Q6OlRva2VuPiAmbWV0YXZhcikNCj4+ICt7DQo+PiArICBhdXRvIG1ldGF2 YXJfbmFtZSA9IG1ldGF2YXItPmdldF9zdHIgKCk7DQo+PiArDQo+PiArICBzdGQ6OnZlY3Rv cjxzdGQ6OnVuaXF1ZV9wdHI8QVNUOjpUb2tlbj4+IGV4cGFuZGVkOw0KPj4gKyAgYXV0byBp dCA9IGZyYWdtZW50cy5maW5kIChtZXRhdmFyX25hbWUpOw0KPj4gKyAgaWYgKGl0ID09IGZy YWdtZW50cy5lbmQgKCkpDQo+PiArICAgIHsNCj4+ICsgICAgICAvLyBSZXR1cm4gYSBjb3B5 IG9mIHRoZSBvcmlnaW5hbCB0b2tlbg0KPj4gKyAgICAgIGV4cGFuZGVkLnB1c2hfYmFjayAo bWV0YXZhci0+Y2xvbmVfdG9rZW4gKCkpOw0KPj4gKyAgICB9DQo+PiArICBlbHNlDQo+PiAr ICAgIHsNCj4+ICsgICAgICAvLyBJZiB3ZSBhcmUgZXhwYW5kaW5nIGEgbWV0YXZhciB3aGlj aCBoYXMgYSBsb2Ygb2YgbWF0Y2hlcywgd2UgYXJlDQo+PiArICAgICAgLy8gY3VycmVudGx5 IGV4cGFuZGluZyBhIHJlcGV0aXRpb24gbWV0YXZhciAtIG5vdCBhIHNpbXBsZSBtZXRhdmFy LiBXZQ0KPj4gKyAgICAgIC8vIG5lZWQgdG8gZXJyb3Igb3V0IGFuZCBpbmZvcm0gdGhlIHVz ZXIuDQo+PiArICAgICAgLy8gQXNzb2NpYXRlZCB0ZXN0IGNhc2UgZm9yIGFuIGV4YW1wbGU6 IGNvbXBpbGUvbWFjcm8taXNzdWUxMjI0LnJzDQo+PiArICAgICAgaWYgKGl0LT5zZWNvbmQu Z2V0X21hdGNoX2Ftb3VudCAoKSAhPSAxKQ0KPj4gKyAgICAgICB7DQo+PiArICAgICAgICAg cnVzdF9lcnJvcl9hdCAobWV0YXZhci0+Z2V0X2xvY3VzICgpLA0KPj4gKyAgICAgICAgICAg ICAgICAgICAgICAgICJtZXRhdmFyaWFibGUgaXMgc3RpbGwgcmVwZWF0aW5nIGF0IHRoaXMg ZGVwdGgiKTsNCj4+ICsgICAgICAgICBydXN0X2luZm9ybSAoDQo+PiArICAgICAgICAgICBt ZXRhdmFyLT5nZXRfbG9jdXMgKCksDQo+PiArICAgICAgICAgICAieW91IHByb2JhYmx5IGZv cmdvdCB0aGUgcmVwZXRpdGlvbiBvcGVyYXRvcjogJTwlcyVzJXMlPiIsICIkKCIsDQo+PiAr ICAgICAgICAgICBtZXRhdmFyLT5hc19zdHJpbmcgKCkuY19zdHIgKCksICIpKiIpOw0KPj4g KyAgICAgICAgIHJldHVybiBleHBhbmRlZDsNCj4+ICsgICAgICAgfQ0KPj4gKw0KPj4gKyAg ICAgIC8vIFdlIG9ubHkgY2FyZSBhYm91dCB0aGUgdmVjdG9yIHdoZW4gZXhwYW5kaW5nIHJl cGV0aXRpb25zLg0KPj4gKyAgICAgIC8vIEp1c3QgYWNjZXNzIHRoZSBmaXJzdCBlbGVtZW50 IG9mIHRoZSB2ZWN0b3IuDQo+PiArICAgICAgYXV0byAmZnJhZyA9IGl0LT5zZWNvbmQuZ2V0 X3NpbmdsZV9mcmFnbWVudCAoKTsNCj4+ICsgICAgICBmb3IgKHNpemVfdCBvZmZzID0gZnJh Zy50b2tlbl9vZmZzZXRfYmVnaW47IG9mZnMgPCBmcmFnLnRva2VuX29mZnNldF9lbmQ7DQo+ PiArICAgICAgICAgIG9mZnMrKykNCj4+ICsgICAgICAgew0KPj4gKyAgICAgICAgIGF1dG8g JnRvayA9IGlucHV0LmF0IChvZmZzKTsNCj4+ICsgICAgICAgICBleHBhbmRlZC5wdXNoX2Jh Y2sgKHRvay0+Y2xvbmVfdG9rZW4gKCkpOw0KPj4gKyAgICAgICB9DQo+PiArICAgIH0NCj4+ ICsNCj4+ICsgIHJldHVybiBleHBhbmRlZDsNCj4+ICt9DQo+PiArDQo+PiArYm9vbA0KPj4g K1N1YnN0aXR1dGVDdHg6OmNoZWNrX3JlcGV0aXRpb25fYW1vdW50IChzaXplX3QgcGF0dGVy bl9zdGFydCwNCj4+ICsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBz aXplX3QgcGF0dGVybl9lbmQsDQo+PiArICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgc2l6ZV90ICZleHBlY3RlZF9yZXBldGl0aW9uX2Ftb3VudCkNCj4+ICt7DQo+ PiArICBib29sIGZpcnN0X2ZyYWdtZW50X2ZvdW5kID0gZmFsc2U7DQo+PiArICBib29sIGlz X3ZhbGlkID0gdHJ1ZTsNCj4+ICsNCj4+ICsgIGZvciAoc2l6ZV90IGkgPSBwYXR0ZXJuX3N0 YXJ0OyBpIDwgcGF0dGVybl9lbmQ7IGkrKykNCj4+ICsgICAgew0KPj4gKyAgICAgIGlmICht YWNyby5hdCAoaSktPmdldF9pZCAoKSA9PSBET0xMQVJfU0lHTikNCj4+ICsgICAgICAgew0K Pj4gKyAgICAgICAgIGF1dG8gJmZyYWdfdG9rZW4gPSBtYWNyby5hdCAoaSArIDEpOw0KPj4g KyAgICAgICAgIGlmIChmcmFnX3Rva2VuLT5nZXRfaWQgKCkgPT0gSURFTlRJRklFUikNCj4+ ICsgICAgICAgICAgIHsNCj4+ICsgICAgICAgICAgICAgYXV0byBpdCA9IGZyYWdtZW50cy5m aW5kIChmcmFnX3Rva2VuLT5nZXRfc3RyICgpKTsNCj4+ICsgICAgICAgICAgICAgaWYgKGl0 ID09IGZyYWdtZW50cy5lbmQgKCkpDQo+PiArICAgICAgICAgICAgICAgew0KPj4gKyAgICAg ICAgICAgICAgICAgLy8gSWYgdGhlIHJlcGV0aXRpb24gaXMgbm90IGFueXRoaW5nIHdlIGtu b3cgKGllIG5vIGRlY2xhcmVkDQo+PiArICAgICAgICAgICAgICAgICAvLyBtZXRhdmFycywg b3IgbWV0YXZhcnMgd2hpY2ggYXJlbid0IHByZXNlbnQgaW4gdGhlDQo+PiArICAgICAgICAg ICAgICAgICAvLyBmcmFnbWVudCksIHdlIGNhbiBqdXN0IGVycm9yIG91dC4gTm8gbmVlZCB0 byBwYXN0ZSB0aGUNCj4+ICsgICAgICAgICAgICAgICAgIC8vIHRva2VucyBhcyBpZiBub3Ro aW5nIGhhZCBoYXBwZW5lZC4NCj4+ICsgICAgICAgICAgICAgICAgIHJ1c3RfZXJyb3JfYXQg KGZyYWdfdG9rZW4tPmdldF9sb2N1cyAoKSwNCj4+ICsgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICJtZXRhdmFyICVzIHVzZWQgaW4gcmVwZXRpdGlvbiBkb2VzIG5vdCBleGlz dCIsDQo+PiArICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmcmFnX3Rva2VuLT5n ZXRfc3RyICgpLmNfc3RyICgpKTsNCj4+ICsNCj4+ICsgICAgICAgICAgICAgICAgIGlzX3Zh bGlkID0gZmFsc2U7DQo+PiArICAgICAgICAgICAgICAgfQ0KPj4gKw0KPj4gKyAgICAgICAg ICAgICBhdXRvICZmcmFnbWVudCA9IGl0LT5zZWNvbmQ7DQo+PiArDQo+PiArICAgICAgICAg ICAgIHNpemVfdCByZXBlYXRfYW1vdW50ID0gZnJhZ21lbnQuZ2V0X21hdGNoX2Ftb3VudCAo KTsNCj4+ICsgICAgICAgICAgICAgaWYgKCFmaXJzdF9mcmFnbWVudF9mb3VuZCkNCj4+ICsg ICAgICAgICAgICAgICB7DQo+PiArICAgICAgICAgICAgICAgICBmaXJzdF9mcmFnbWVudF9m b3VuZCA9IHRydWU7DQo+PiArICAgICAgICAgICAgICAgICBleHBlY3RlZF9yZXBldGl0aW9u X2Ftb3VudCA9IHJlcGVhdF9hbW91bnQ7DQo+PiArICAgICAgICAgICAgICAgfQ0KPj4gKyAg ICAgICAgICAgICBlbHNlDQo+PiArICAgICAgICAgICAgICAgew0KPj4gKyAgICAgICAgICAg ICAgICAgaWYgKHJlcGVhdF9hbW91bnQgIT0gZXhwZWN0ZWRfcmVwZXRpdGlvbl9hbW91bnQN Cj4+ICsgICAgICAgICAgICAgICAgICAgICAmJiAhZnJhZ21lbnQuaXNfc2luZ2xlX2ZyYWdt ZW50ICgpKQ0KPj4gKyAgICAgICAgICAgICAgICAgICB7DQo+PiArICAgICAgICAgICAgICAg ICAgICAgcnVzdF9lcnJvcl9hdCAoDQo+PiArICAgICAgICAgICAgICAgICAgICAgICBmcmFn X3Rva2VuLT5nZXRfbG9jdXMgKCksDQo+PiArICAgICAgICAgICAgICAgICAgICAgICAiZGlm ZmVyZW50IGFtb3VudCBvZiBtYXRjaGVzIHVzZWQgaW4gbWVyZ2VkICINCj4+ICsgICAgICAg ICAgICAgICAgICAgICAgICJyZXBldGl0aW9uczogZXhwZWN0ZWQgJWx1LCBnb3QgJWx1IiwN Cj4+ICsgICAgICAgICAgICAgICAgICAgICAgICh1bnNpZ25lZCBsb25nKSBleHBlY3RlZF9y ZXBldGl0aW9uX2Ftb3VudCwNCj4+ICsgICAgICAgICAgICAgICAgICAgICAgICh1bnNpZ25l ZCBsb25nKSByZXBlYXRfYW1vdW50KTsNCj4+ICsgICAgICAgICAgICAgICAgICAgICBpc192 YWxpZCA9IGZhbHNlOw0KPj4gKyAgICAgICAgICAgICAgICAgICB9DQo+PiArICAgICAgICAg ICAgICAgfQ0KPj4gKyAgICAgICAgICAgfQ0KPj4gKyAgICAgICB9DQo+PiArICAgIH0NCj4+ ICsNCj4+ICsgIHJldHVybiBpc192YWxpZDsNCj4+ICt9DQo+PiArDQo+PiArc3RkOjp2ZWN0 b3I8c3RkOjp1bmlxdWVfcHRyPEFTVDo6VG9rZW4+Pg0KPj4gK1N1YnN0aXR1dGVDdHg6OnN1 YnN0aXR1dGVfcmVwZXRpdGlvbiAoDQo+PiArICBzaXplX3QgcGF0dGVybl9zdGFydCwgc2l6 ZV90IHBhdHRlcm5fZW5kLA0KPj4gKyAgc3RkOjp1bmlxdWVfcHRyPEFTVDo6VG9rZW4+IHNl cGFyYXRvcl90b2tlbikNCj4+ICt7DQo+PiArICBydXN0X2Fzc2VydCAocGF0dGVybl9lbmQg PCBtYWNyby5zaXplICgpKTsNCj4+ICsNCj4+ICsgIHNpemVfdCByZXBlYXRfYW1vdW50ID0g MDsNCj4+ICsgIGlmICghY2hlY2tfcmVwZXRpdGlvbl9hbW91bnQgKHBhdHRlcm5fc3RhcnQs IHBhdHRlcm5fZW5kLCByZXBlYXRfYW1vdW50KSkNCj4+ICsgICAgcmV0dXJuIHt9Ow0KPj4g Kw0KPj4gKyAgcnVzdF9kZWJ1ZyAoInJlcGV0aXRpb24gYW1vdW50IHRvIHVzZTogJWx1Iiwg KHVuc2lnbmVkIGxvbmcpIHJlcGVhdF9hbW91bnQpOw0KPj4gKyAgc3RkOjp2ZWN0b3I8c3Rk Ojp1bmlxdWVfcHRyPEFTVDo6VG9rZW4+PiBleHBhbmRlZDsNCj4+ICsgIHN0ZDo6dmVjdG9y PHN0ZDo6dW5pcXVlX3B0cjxBU1Q6OlRva2VuPj4gbmV3X21hY3JvOw0KPj4gKw0KPj4gKyAg Ly8gV2Ugd2FudCB0byBnZW5lcmF0ZSBhICJuZXcgbWFjcm8iIHRvIHN1YnN0aXR1dGUgd2l0 aC4gVGhpcyBuZXcgbWFjcm8NCj4+ICsgIC8vIHNob3VsZCBjb250YWluIG9ubHkgdGhlIHRv a2VucyBpbnNpZGUgdGhlIHBhdHRlcm4NCj4+ICsgIGZvciAoc2l6ZV90IHRva19pZHggPSBw YXR0ZXJuX3N0YXJ0OyB0b2tfaWR4IDwgcGF0dGVybl9lbmQ7IHRva19pZHgrKykNCj4+ICsg ICAgbmV3X21hY3JvLmVtcGxhY2VfYmFjayAobWFjcm8uYXQgKHRva19pZHgpLT5jbG9uZV90 b2tlbiAoKSk7DQo+PiArDQo+PiArICAvLyBUaGVuLCB3ZSB3YW50IHRvIGNyZWF0ZSBhIHN1 YnNldCBvZiB0aGUgbWF0Y2hlcyBzbyB0aGF0DQo+PiArICAvLyBgc3Vic3RpdHV0ZV90b2tl bnMoKWAgY2FuIG9ubHkgc2VlIG9uZSBmcmFnbWVudCBwZXIgbWV0YXZhci4gTGV0J3Mgc2F5 IHdlDQo+PiArICAvLyBoYXZlIHRoZSBmb2xsb3dpbmcgdXNlciBpbnB1dDogKDEgMTQ1ICdo JykNCj4+ICsgIC8vIG9uIHRoZSBmb2xsb3dpbmcgbWF0Y2ggYXJtOiAoJCgkbGl0OmxpdGVy YWwpKikNCj4+ICsgIC8vIHdoaWNoIGNhdXNlcyB0aGUgZm9sbG93aW5nIG1hdGNoZXM6IHsg ImxpdCI6IFsxLCAxNDUsICdoJ10gfQ0KPj4gKyAgLy8NCj4+ICsgIC8vIFRoZSBwYXR0ZXJu IChuZXdfbWFjcm8pIGlzIGAkbGl0OmxpdGVyYWxgDQo+PiArICAvLyBUaGUgZmlyc3QgdGlt ZSB3ZSBleHBhbmQgaXQsIHdlIHdhbnQgJGxpdCB0byBoYXZlIHRoZSBmb2xsb3dpbmcgdG9r ZW46IDENCj4+ICsgIC8vIFRoZSBzZWNvbmQgdGltZSwgMTQ1DQo+PiArICAvLyBUaGUgdGhp cmQgYW5kIGZpbmFsIHRpbWUsICdoJw0KPj4gKyAgLy8NCj4+ICsgIC8vIEluIG9yZGVyIHRv IGRvIHNvIHdlIG11c3QgY3JlYXRlICJzdWIgbWFwcyIsIHdoaWNoIG9ubHkgY29udGFpbiBw YXJ0cyBvZg0KPj4gKyAgLy8gdGhlIG9yaWdpbmFsIG1hdGNoZXMNCj4+ICsgIC8vIHN1Yi1t YXBzOiBbIHsgImxpdCI6IDEgfSwgeyAibGl0IjogMTQ1IH0sIHsgImxpdCI6ICdoJyB9IF0N Cj4+ICsgIC8vDQo+PiArICAvLyBhbmQgZ2l2ZSB0aGVtIHRvIGBzdWJzdGl0dXRlX3Rva2Vu c2Agb25lIGJ5IG9uZS4NCj4+ICsNCj4+ICsgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgcmVw ZWF0X2Ftb3VudDsgaSsrKQ0KPj4gKyAgICB7DQo+PiArICAgICAgc3RkOjptYXA8c3RkOjpz dHJpbmcsIE1hdGNoZWRGcmFnbWVudENvbnRhaW5lcj4gc3ViX21hcDsNCj4+ICsgICAgICBm b3IgKGF1dG8gJmt2X21hdGNoIDogZnJhZ21lbnRzKQ0KPj4gKyAgICAgICB7DQo+PiArICAg ICAgICAgTWF0Y2hlZEZyYWdtZW50IHN1Yl9mcmFnbWVudDsNCj4+ICsNCj4+ICsgICAgICAg ICAvLyBGSVhNRTogSGFjazogSWYgYSBmcmFnbWVudCBpcyBub3QgcmVwZWF0ZWQsIGhvdyBk b2VzIGl0IGZpdCBpbiB0aGUNCj4+ICsgICAgICAgICAvLyBzdWJtYXA/IERvIHdlIHJlYWxs eSB3YW50IHRvIGV4cGFuZCBpdD8gSXMgdGhpcyBub3JtYWwgYmVoYXZpb3I/DQo+PiArICAg ICAgICAgaWYgKGt2X21hdGNoLnNlY29uZC5pc19zaW5nbGVfZnJhZ21lbnQgKCkpDQo+PiAr ICAgICAgICAgICBzdWJfZnJhZ21lbnQgPSBrdl9tYXRjaC5zZWNvbmQuZ2V0X3NpbmdsZV9m cmFnbWVudCAoKTsNCj4+ICsgICAgICAgICBlbHNlDQo+PiArICAgICAgICAgICBzdWJfZnJh Z21lbnQgPSBrdl9tYXRjaC5zZWNvbmQuZ2V0X2ZyYWdtZW50cyAoKVtpXTsNCj4+ICsNCj4+ ICsgICAgICAgICBzdWJfbWFwLmluc2VydCAoDQo+PiArICAgICAgICAgICB7a3ZfbWF0Y2gu Zmlyc3QsIE1hdGNoZWRGcmFnbWVudENvbnRhaW5lcjo6bWV0YXZhciAoc3ViX2ZyYWdtZW50 KX0pOw0KPj4gKyAgICAgICB9DQo+PiArDQo+PiArICAgICAgYXV0byBzdWJzdGl0dXRlX2Nv bnRleHQgPSBTdWJzdGl0dXRlQ3R4IChpbnB1dCwgbmV3X21hY3JvLCBzdWJfbWFwKTsNCj4+ ICsgICAgICBhdXRvIG5ld190b2tlbnMgPSBzdWJzdGl0dXRlX2NvbnRleHQuc3Vic3RpdHV0 ZV90b2tlbnMgKCk7DQo+PiArDQo+PiArICAgICAgLy8gU2tpcCB0aGUgZmlyc3QgcmVwZXRp dGlvbiwgYnV0IGFkZCB0aGUgc2VwYXJhdG9yIHRvIHRoZSBleHBhbmRlZA0KPj4gKyAgICAg IC8vIHRva2VucyBpZiBpdCBpcyBwcmVzZW50DQo+PiArICAgICAgaWYgKGkgIT0gMCAmJiBz ZXBhcmF0b3JfdG9rZW4pDQo+PiArICAgICAgIGV4cGFuZGVkLmVtcGxhY2VfYmFjayAoc2Vw YXJhdG9yX3Rva2VuLT5jbG9uZV90b2tlbiAoKSk7DQo+PiArDQo+PiArICAgICAgZm9yIChh dXRvICZuZXdfdG9rZW4gOiBuZXdfdG9rZW5zKQ0KPj4gKyAgICAgICBleHBhbmRlZC5lbXBs YWNlX2JhY2sgKG5ld190b2tlbi0+Y2xvbmVfdG9rZW4gKCkpOw0KPj4gKyAgICB9DQo+PiAr DQo+PiArICAvLyBGSVhNRTogV2UgYWxzbyBuZWVkIHRvIG1ha2Ugc3VyZSB0aGF0IGFsbCBz dWJzZXF1ZW50IGZyYWdtZW50cw0KPj4gKyAgLy8gY29udGFpbiB0aGUgc2FtZSBhbW91bnQg b2YgcmVwZXRpdGlvbnMgYXMgdGhlIGZpcnN0IG9uZQ0KPj4gKw0KPj4gKyAgcmV0dXJuIGV4 cGFuZGVkOw0KPj4gK30NCj4+ICsNCj4+ICtzdGF0aWMgYm9vbA0KPj4gK2lzX3JlcF9vcCAo c3RkOjp1bmlxdWVfcHRyPEFTVDo6VG9rZW4+ICZ0b2spDQo+PiArew0KPj4gKyAgYXV0byBp ZCA9IHRvay0+Z2V0X2lkICgpOw0KPj4gKyAgcmV0dXJuIGlkID09IFFVRVNUSU9OX01BUksg fHwgaWQgPT0gQVNURVJJU0sgfHwgaWQgPT0gUExVUzsNCj4+ICt9DQo+PiArDQo+PiArc3Rk OjpwYWlyPHN0ZDo6dmVjdG9yPHN0ZDo6dW5pcXVlX3B0cjxBU1Q6OlRva2VuPj4sIHNpemVf dD4NCj4+ICtTdWJzdGl0dXRlQ3R4OjpzdWJzdGl0dXRlX3Rva2VuIChzaXplX3QgdG9rZW5f aWR4KQ0KPj4gK3sNCj4+ICsgIGF1dG8gJnRva2VuID0gbWFjcm8uYXQgKHRva2VuX2lkeCk7 DQo+PiArICBzd2l0Y2ggKHRva2VuLT5nZXRfaWQgKCkpDQo+PiArICAgIHsNCj4+ICsgICAg Y2FzZSBJREVOVElGSUVSOg0KPj4gKyAgICAgIHJ1c3RfZGVidWcgKCJleHBhbmRpbmcgbWV0 YXZhcjogJXMiLCB0b2tlbi0+Z2V0X3N0ciAoKS5jX3N0ciAoKSk7DQo+PiArICAgICAgcmV0 dXJuIHtzdWJzdGl0dXRlX21ldGF2YXIgKHRva2VuKSwgMX07DQo+PiArICAgICAgY2FzZSBM RUZUX1BBUkVOOiB7DQo+PiArICAgICAgIC8vIFdlIG5lZWQgdG8gcGFyc2UgdXAgdW50aWwg dGhlIGNsb3NpbmcgZGVsaW1pdGVyIGFuZCBleHBhbmQgdGhpcw0KPj4gKyAgICAgICAvLyBm cmFnbWVudC0+biB0aW1lcy4NCj4+ICsgICAgICAgcnVzdF9kZWJ1ZyAoImV4cGFuZGluZyBy ZXBldGl0aW9uIik7DQo+PiArDQo+PiArICAgICAgIC8vIFdlJ3JlIGluIGEgY29udGV4dCB3 aGVyZSBtYWNybyByZXBldGl0aW9ucyBoYXZlIGFscmVhZHkgYmVlbg0KPj4gKyAgICAgICAv LyBwYXJzZWQgYW5kIHZhbGlkYXRlZDogVGhpcyBtZWFucyB0aGF0DQo+PiArICAgICAgIC8v IDEvIFRoZXJlIHdpbGwgYmUgbm8gZGVsaW1pdGVycyBhcyB0aGF0IGlzIGFuIGVycm9yDQo+ PiArICAgICAgIC8vIDIvIFRoZXJlIGFyZSBubyBmcmFnbWVudCBzcGVjaWZpZXJzIGFueW1v cmUsIHdoaWNoIHByZXZlbnRzIHVzDQo+PiArICAgICAgIC8vIGZyb20gcmV1c2luZyBwYXJz ZXIgZnVuY3Rpb25zLg0KPj4gKyAgICAgICAvLw0KPj4gKyAgICAgICAvLyBSZXBldGl0aW9u IHBhdHRlcm5zIGFyZSBhbHNvIHNwZWNpYWwgaW4gdGhhdCB0aGV5IGNhbm5vdCBjb250YWlu DQo+PiArICAgICAgIC8vICJyb2d1ZSIgZGVsaW1pdGVyczogRm9yIGV4YW1wbGUsIHRoaXMg aXMgaW52YWxpZCwgYXMgdGhleSBhcmUNCj4+ICsgICAgICAgLy8gcGFyc2VkIGFzIE1hY3Jv TWF0Y2hlcyBhbmQgbXVzdCBjb250YWluIGEgY29ycmVjdCBhbW91bnQgb2YNCj4+ICsgICAg ICAgLy8gZGVsaW1pdGVycy4NCj4+ICsgICAgICAgLy8gYCQoJGU6ZXhwciApIClgDQo+PiAr ICAgICAgIC8vICAgICAgICAgICAgXiByb2d1ZSBjbG9zaW5nIHBhcmVudGhlc2lzDQo+PiAr ICAgICAgIC8vDQo+PiArICAgICAgIC8vIFdpdGggYWxsIG9mIHRoYXQgaW4gbWluZCwgd2Ug Y2FuIHNpbXBseSBza2lwIGFoZWFkIGZyb20gb25lDQo+PiArICAgICAgIC8vIHBhcmVudGhl c2lzIHRvIHRoZSBvdGhlciB0byBmaW5kIHRoZSBwYXR0ZXJuIHRvIGV4cGFuZC4gT2YgY291 cnNlLA0KPj4gKyAgICAgICAvLyBwYWlycyBvZiBkZWxpbWl0ZXJzLCBpbmNsdWRpbmcgcGFy ZW50aGVzZXMsIGFyZSBhbGxvd2VkLg0KPj4gKyAgICAgICAvLyBgJCgkZTpleHByICggKSAp YA0KPj4gKyAgICAgICAvLyBQYXJlbnRoZXNlcyBhcmUgdGhlIHNvbGUgZGVsaW1pdGVyIGZv ciB3aGljaCB3ZSBuZWVkIGEgc3BlY2lhbA0KPj4gKyAgICAgICAvLyBiZWhhdmlvciBzaW5j ZSB0aGV5IGRlbGltaXQgdGhlIHJlcGV0aXRpb24gcGF0dGVybg0KPj4gKw0KPj4gKyAgICAg ICBzaXplX3QgcGF0dGVybl9zdGFydCA9IHRva2VuX2lkeCArIDE7DQo+PiArICAgICAgIHNp emVfdCBwYXR0ZXJuX2VuZCA9IHBhdHRlcm5fc3RhcnQ7DQo+PiArICAgICAgIGF1dG8gcGFy ZW50aGVzZXNfc3RhY2sgPSAwOw0KPj4gKyAgICAgICBmb3IgKHNpemVfdCBpZHggPSBwYXR0 ZXJuX3N0YXJ0OyBpZHggPCBtYWNyby5zaXplICgpOyBpZHgrKykNCj4+ICsgICAgICAgICB7 DQo+PiArICAgICAgICAgICBpZiAobWFjcm8uYXQgKGlkeCktPmdldF9pZCAoKSA9PSBMRUZU X1BBUkVOKQ0KPj4gKyAgICAgICAgICAgICB7DQo+PiArICAgICAgICAgICAgICAgcGFyZW50 aGVzZXNfc3RhY2srKzsNCj4+ICsgICAgICAgICAgICAgfQ0KPj4gKyAgICAgICAgICAgZWxz ZSBpZiAobWFjcm8uYXQgKGlkeCktPmdldF9pZCAoKSA9PSBSSUdIVF9QQVJFTikNCj4+ICsg ICAgICAgICAgICAgew0KPj4gKyAgICAgICAgICAgICAgIGlmIChwYXJlbnRoZXNlc19zdGFj ayA9PSAwKQ0KPj4gKyAgICAgICAgICAgICAgICAgew0KPj4gKyAgICAgICAgICAgICAgICAg ICBwYXR0ZXJuX2VuZCA9IGlkeDsNCj4+ICsgICAgICAgICAgICAgICAgICAgYnJlYWs7DQo+ PiArICAgICAgICAgICAgICAgICB9DQo+PiArICAgICAgICAgICAgICAgcGFyZW50aGVzZXNf c3RhY2stLTsNCj4+ICsgICAgICAgICAgICAgfQ0KPj4gKyAgICAgICAgIH0NCj4+ICsNCj4+ ICsgICAgICAgLy8gVW5yZWFjaGFibGUgY2FzZSwgYnV0IGxldCdzIG1ha2Ugc3VyZSB3ZSBk b24ndCBldmVyIHJ1biBpbnRvIGl0DQo+PiArICAgICAgIHJ1c3RfYXNzZXJ0IChwYXR0ZXJu X2VuZCAhPSBwYXR0ZXJuX3N0YXJ0KTsNCj4+ICsNCj4+ICsgICAgICAgc3RkOjp1bmlxdWVf cHRyPEFTVDo6VG9rZW4+IHNlcGFyYXRvcl90b2tlbiA9IG51bGxwdHI7DQo+PiArICAgICAg IGlmIChwYXR0ZXJuX2VuZCArIDEgPD0gbWFjcm8uc2l6ZSAoKSkNCj4+ICsgICAgICAgICB7 DQo+PiArICAgICAgICAgICBhdXRvICZwb3N0X3BhdHRlcm5fdG9rZW4gPSBtYWNyby5hdCAo cGF0dGVybl9lbmQgKyAxKTsNCj4+ICsgICAgICAgICAgIGlmICghaXNfcmVwX29wIChwb3N0 X3BhdHRlcm5fdG9rZW4pKQ0KPj4gKyAgICAgICAgICAgICBzZXBhcmF0b3JfdG9rZW4gPSBw b3N0X3BhdHRlcm5fdG9rZW4tPmNsb25lX3Rva2VuICgpOw0KPj4gKyAgICAgICAgIH0NCj4+ ICsNCj4+ICsgICAgICAgLy8gQW1vdW50IG9mIHRva2VucyB0byBza2lwDQo+PiArICAgICAg IGF1dG8gdG9fc2tpcCA9IDA7DQo+PiArICAgICAgIC8vIFBhcmVudGhlc2VzDQo+PiArICAg ICAgIHRvX3NraXAgKz0gMjsNCj4+ICsgICAgICAgLy8gUmVwZXRpdGlvbiBvcGVyYXRvcg0K Pj4gKyAgICAgICB0b19za2lwICs9IDE7DQo+PiArICAgICAgIC8vIFNlcGFyYXRvcg0KPj4g KyAgICAgICBpZiAoc2VwYXJhdG9yX3Rva2VuKQ0KPj4gKyAgICAgICAgIHRvX3NraXAgKz0g MTsNCj4+ICsNCj4+ICsgICAgICAgcmV0dXJuIHtzdWJzdGl0dXRlX3JlcGV0aXRpb24gKHBh dHRlcm5fc3RhcnQsIHBhdHRlcm5fZW5kLA0KPj4gKyAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgc3RkOjptb3ZlIChzZXBhcmF0b3JfdG9rZW4pKSwNCj4+ICsgICAg ICAgICAgICAgICBwYXR0ZXJuX2VuZCAtIHBhdHRlcm5fc3RhcnQgKyB0b19za2lwfTsNCj4+ ICsgICAgICB9DQo+PiArICAgICAgLy8gVE9ETzogV2UgbmVlZCB0byBjaGVjayBpZiB0aGUg JCB3YXMgYWxvbmUuIEluIHRoYXQgY2FzZSwgZG8NCj4+ICsgICAgICAvLyBub3QgZXJyb3Ig b3V0OiBTaW1wbHkgYWN0IGFzIGlmIHRoZXJlIHdhcyBhbiBlbXB0eSBpZGVudGlmaWVyDQo+ PiArICAgICAgLy8gd2l0aCBubyBhc3NvY2lhdGVkIGZyYWdtZW50IGFuZCBwYXN0ZSB0aGUg ZG9sbGFyIHNpZ24gaW4gdGhlDQo+PiArICAgICAgLy8gdHJhbnNjcmlwdGlvbi4gVW5zdXJl IGhvdyB0byBkbyB0aGF0IHNpbmNlIHdlIGFsd2F5cyBoYXZlIGF0DQo+PiArICAgICAgLy8g bGVhc3QgdGhlIGNsb3NpbmcgY3VybHkgYnJhY2UgYWZ0ZXIgYW4gZW1wdHkgJC4uLg0KPj4g KyAgICBkZWZhdWx0Og0KPj4gKyAgICAgIHJ1c3RfZXJyb3JfYXQgKHRva2VuLT5nZXRfbG9j dXMgKCksDQo+PiArICAgICAgICAgICAgICAgICAgICAidW5leHBlY3RlZCB0b2tlbiBpbiBt YWNybyB0cmFuc2NyaWJlOiBleHBlY3RlZCAiDQo+PiArICAgICAgICAgICAgICAgICAgICAi JTwoJT4gb3IgaWRlbnRpZmllciBhZnRlciAlPCQlPiwgZ290ICU8JXMlPiIsDQo+PiArICAg ICAgICAgICAgICAgICAgICBnZXRfdG9rZW5fZGVzY3JpcHRpb24gKHRva2VuLT5nZXRfaWQg KCkpKTsNCj4+ICsgICAgfQ0KPj4gKw0KPj4gKyAgLy8gRklYTUU6IGdjY191bnJlYWNoYWJs ZSgpIGVycm9yIGNhc2U/DQo+PiArICByZXR1cm4ge3N0ZDo6dmVjdG9yPHN0ZDo6dW5pcXVl X3B0cjxBU1Q6OlRva2VuPj4gKCksIDB9Ow0KPj4gK30NCj4+ICsNCj4+ICtzdGQ6OnZlY3Rv cjxzdGQ6OnVuaXF1ZV9wdHI8QVNUOjpUb2tlbj4+DQo+PiArU3Vic3RpdHV0ZUN0eDo6c3Vi c3RpdHV0ZV90b2tlbnMgKCkNCj4+ICt7DQo+PiArICBzdGQ6OnZlY3RvcjxzdGQ6OnVuaXF1 ZV9wdHI8QVNUOjpUb2tlbj4+IHJlcGxhY2VkX3Rva2VuczsNCj4+ICsgIHJ1c3RfZGVidWcg KCJleHBhbmRpbmcgdG9rZW5zIik7DQo+PiArDQo+PiArICBmb3IgKHNpemVfdCBpID0gMDsg aSA8IG1hY3JvLnNpemUgKCk7IGkrKykNCj4+ICsgICAgew0KPj4gKyAgICAgIGF1dG8gJnRv ayA9IG1hY3JvLmF0IChpKTsNCj4+ICsgICAgICBpZiAodG9rLT5nZXRfaWQgKCkgPT0gRE9M TEFSX1NJR04pDQo+PiArICAgICAgIHsNCj4+ICsgICAgICAgICAvLyBBYWFhYWgsIGlmIG9u bHkgd2UgaGFkIEMrKzE3IDopDQo+PiArICAgICAgICAgLy8gYXV0byBbZXhwYW5kZWQsIHRv a190b19za2lwXSA9IC4uLg0KPj4gKyAgICAgICAgIGF1dG8gcCA9IHN1YnN0aXR1dGVfdG9r ZW4gKGkgKyAxKTsNCj4+ICsgICAgICAgICBhdXRvIGV4cGFuZGVkID0gc3RkOjptb3ZlIChw LmZpcnN0KTsNCj4+ICsgICAgICAgICBhdXRvIHRva190b19za2lwID0gcC5zZWNvbmQ7DQo+ PiArDQo+PiArICAgICAgICAgaSArPSB0b2tfdG9fc2tpcDsNCj4+ICsNCj4+ICsgICAgICAg ICBmb3IgKGF1dG8gJnRva2VuIDogZXhwYW5kZWQpDQo+PiArICAgICAgICAgICByZXBsYWNl ZF90b2tlbnMuZW1wbGFjZV9iYWNrICh0b2tlbi0+Y2xvbmVfdG9rZW4gKCkpOw0KPj4gKyAg ICAgICB9DQo+PiArICAgICAgZWxzZQ0KPj4gKyAgICAgICB7DQo+PiArICAgICAgICAgcmVw bGFjZWRfdG9rZW5zLmVtcGxhY2VfYmFjayAodG9rLT5jbG9uZV90b2tlbiAoKSk7DQo+PiAr ICAgICAgIH0NCj4+ICsgICAgfQ0KPj4gKw0KPj4gKyAgcmV0dXJuIHJlcGxhY2VkX3Rva2Vu czsNCj4+ICt9DQo+PiArDQo+PiArfSAvLyBuYW1lc3BhY2UgUnVzdA0KPj4gZGlmZiAtLWdp dCBhL2djYy9ydXN0L2V4cGFuZC9ydXN0LW1hY3JvLXN1YnN0aXR1dGUtY3R4LmggYi9nY2Mv cnVzdC9leHBhbmQvcnVzdC1tYWNyby1zdWJzdGl0dXRlLWN0eC5oDQo+PiBuZXcgZmlsZSBt b2RlIDEwMDY0NA0KPj4gaW5kZXggMDAwMDAwMDAwMDAuLjgxZGNhYjc2NDNiDQo+PiAtLS0g L2Rldi9udWxsDQo+PiArKysgYi9nY2MvcnVzdC9leHBhbmQvcnVzdC1tYWNyby1zdWJzdGl0 dXRlLWN0eC5oDQo+PiBAQCAtMCwwICsxLDkzIEBADQo+PiArLy8gQ29weXJpZ2h0IChDKSAy MDIwLTIwMjIgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuDQo+PiArDQo+PiArLy8g VGhpcyBmaWxlIGlzIHBhcnQgb2YgR0NDLg0KPj4gKw0KPj4gKy8vIEdDQyBpcyBmcmVlIHNv ZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0IHVuZGVy DQo+PiArLy8gdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBh cyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUNCj4+ICsvLyBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBl aXRoZXIgdmVyc2lvbiAzLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlcg0KPj4gKy8v IHZlcnNpb24uDQo+PiArDQo+PiArLy8gR0NDIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3Bl IHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUIEFOWQ0KPj4gKy8vIFdBUlJB TlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklM SVRZIG9yDQo+PiArLy8gRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUg dGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlDQo+PiArLy8gZm9yIG1vcmUgZGV0YWls cy4NCj4+ICsNCj4+ICsvLyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRo ZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQ0KPj4gKy8vIGFsb25nIHdpdGggR0NDOyBz ZWUgdGhlIGZpbGUgQ09QWUlORzMuICBJZiBub3Qgc2VlDQo+PiArLy8gPGh0dHA6Ly93d3cu Z251Lm9yZy9saWNlbnNlcy8+Lg0KPj4gKw0KPj4gKyNpbmNsdWRlICJydXN0LWFzdC5oIg0K Pj4gKyNpbmNsdWRlICJydXN0LW1hY3JvLWV4cGFuZC5oIg0KPj4gKw0KPj4gK25hbWVzcGFj ZSBSdXN0IHsNCj4+ICtjbGFzcyBTdWJzdGl0dXRlQ3R4DQo+PiArew0KPj4gKyAgc3RkOjp2 ZWN0b3I8c3RkOjp1bmlxdWVfcHRyPEFTVDo6VG9rZW4+PiAmaW5wdXQ7DQo+PiArICBzdGQ6 OnZlY3RvcjxzdGQ6OnVuaXF1ZV9wdHI8QVNUOjpUb2tlbj4+ICZtYWNybzsNCj4+ICsgIHN0 ZDo6bWFwPHN0ZDo6c3RyaW5nLCBNYXRjaGVkRnJhZ21lbnRDb250YWluZXI+ICZmcmFnbWVu dHM7DQo+PiArDQo+PiArICAvKioNCj4+ICsgICAqIEZpbmQgdGhlIHJlcGV0aXRpb24gYW1v dW50IHRvIHVzZSB3aGVuIGV4cGFuZGluZyBhIHJlcGV0aXRpb24sIGFuZA0KPj4gKyAgICog Y2hlY2sgdGhhdCBhbGwgZnJhZ21lbnRzIHVzZWQgcmVzcGVjdCB0aGF0IHJlcGV0aXRpb24g YW1vdW50DQo+PiArICAgKg0KPj4gKyAgICogQHBhcmFtIHBhdHRlcm5fc3RhcnQgU3RhcnQg b2YgdGhlIHJlcGV0aXRpb24gcGF0dGVybg0KPj4gKyAgICogQHBhcmFtIHBhdHRlcm5fZW5k IEVuZCBvZiB0aGUgcmVwZXRpdGlvbiBwYXR0ZXJuDQo+PiArICAgKiBAcGFyYW0gcmVwZWF0 X2Ftb3VudCBSZWZlcmVuY2UgdG8gZmlsbCB3aXRoIHRoZSBtYXRjaGVkIHJlcGV0aXRpb24g YW1vdW50DQo+PiArICAgKi8NCj4+ICsgIGJvb2wgY2hlY2tfcmVwZXRpdGlvbl9hbW91bnQg KHNpemVfdCBwYXR0ZXJuX3N0YXJ0LCBzaXplX3QgcGF0dGVybl9lbmQsDQo+PiArICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCAmcmVwZWF0X2Ftb3VudCk7DQo+PiAr DQo+PiArcHVibGljOg0KPj4gKyAgU3Vic3RpdHV0ZUN0eCAoc3RkOjp2ZWN0b3I8c3RkOjp1 bmlxdWVfcHRyPEFTVDo6VG9rZW4+PiAmaW5wdXQsDQo+PiArICAgICAgICAgICAgICAgIHN0 ZDo6dmVjdG9yPHN0ZDo6dW5pcXVlX3B0cjxBU1Q6OlRva2VuPj4gJm1hY3JvLA0KPj4gKyAg ICAgICAgICAgICAgICBzdGQ6Om1hcDxzdGQ6OnN0cmluZywgTWF0Y2hlZEZyYWdtZW50Q29u dGFpbmVyPiAmZnJhZ21lbnRzKQ0KPj4gKyAgICA6IGlucHV0IChpbnB1dCksIG1hY3JvICht YWNybyksIGZyYWdtZW50cyAoZnJhZ21lbnRzKQ0KPj4gKyAge30NCj4+ICsNCj4+ICsgIC8q Kg0KPj4gKyAgICogU3Vic3RpdHV0ZSBhIG1ldGF2YXJpYWJsZSBieSBpdHMgZ2l2ZW4gZnJh Z21lbnQgaW4gYSB0cmFuc2NyaWJpbmcgY29udGV4dCwNCj4+ICsgICAqIGkuZS4gcmVwbGFj aW5nICR2YXIgd2l0aCB0aGUgYXNzb2NpYXRlZCBmcmFnbWVudC4NCj4+ICsgICAqDQo+PiAr ICAgKiBAcGFyYW0gbWV0YXZhciBNZXRhdmFyaWFibGUgdG8gdHJ5IGFuZCByZXBsYWNlDQo+ PiArICAgKg0KPj4gKyAgICogQHJldHVybiBBIHRva2VuIGNvbnRhaW5pbmcgdGhlIGFzc29j aWF0ZWQgZnJhZ21lbnQgZXhwYW5kZWQgaW50byB0b2tlbnMgaWYNCj4+ICsgICAqIGFueSwg b3IgdGhlIGNsb25lZCB0b2tlbiBpZiBubyBmcmFnbWVudCB3YXMgYXNzb2NpYXRlZA0KPj4g KyAgICovDQo+PiArICBzdGQ6OnZlY3RvcjxzdGQ6OnVuaXF1ZV9wdHI8QVNUOjpUb2tlbj4+ DQo+PiArICBzdWJzdGl0dXRlX21ldGF2YXIgKHN0ZDo6dW5pcXVlX3B0cjxBU1Q6OlRva2Vu PiAmbWV0YXZhcik7DQo+PiArDQo+PiArICAvKioNCj4+ICsgICAqIFN1YnN0aXR1dGUgYSBt YWNybyByZXBldGl0aW9uIGJ5IGl0cyBnaXZlbiBmcmFnbWVudHMNCj4+ICsgICAqDQo+PiAr ICAgKiBAcGFyYW0gcGF0dGVybl9zdGFydCBTdGFydCBpbmRleCBvZiB0aGUgcGF0dGVybiB0 b2tlbnMNCj4+ICsgICAqIEBwYXJhbSBwYXR0ZXJuX2VuZCBFbmQgaW5kZXggb2YgdGhlIHBh dHRlcm5zIHRva2Vucw0KPj4gKyAgICogQHBhcmFtIHNlcGFyYXRvciBPcHRpb25hbCBzZXBh cmF0b3IgdG8gaW5jbHVkZSB3aGVuIGV4cGFuZGluZyB0b2tlbnMNCj4+ICsgICAqDQo+PiAr ICAgKiBAcmV0dXJuIEEgdmVjdG9yIGNvbnRhaW5pbmcgdGhlIHJlcGVhdGVkIHBhdHRlcm4N Cj4+ICsgICAqLw0KPj4gKyAgc3RkOjp2ZWN0b3I8c3RkOjp1bmlxdWVfcHRyPEFTVDo6VG9r ZW4+Pg0KPj4gKyAgc3Vic3RpdHV0ZV9yZXBldGl0aW9uIChzaXplX3QgcGF0dGVybl9zdGFy dCwgc2l6ZV90IHBhdHRlcm5fZW5kLA0KPj4gKyAgICAgICAgICAgICAgICAgICAgICAgIHN0 ZDo6dW5pcXVlX3B0cjxBU1Q6OlRva2VuPiBzZXBhcmF0b3IpOw0KPj4gKw0KPj4gKyAgLyoq DQo+PiArICAgKiBTdWJzdGl0dXRlIGEgZ2l2ZW4gdG9rZW4gYnkgaXRzIGFwcHJvcHJpYXRl IHJlcHJlc2VudGF0aW9uDQo+PiArICAgKg0KPj4gKyAgICogQHBhcmFtIHRva2VuX2lkeCBD dXJyZW50IHRva2VuIHRvIHRyeSBhbmQgc3Vic3RpdHV0ZQ0KPj4gKyAgICoNCj4+ICsgICAq IEByZXR1cm4gQSB0b2tlbiBjb250YWluaW5nIHRoZSBhc3NvY2lhdGVkIGZyYWdtZW50IGV4 cGFuZGVkIGludG8gdG9rZW5zIGlmDQo+PiArICAgKiBhbnksIG9yIHRoZSBjbG9uZWQgdG9r ZW4gaWYgbm8gZnJhZ21lbnQgd2FzIGFzc29jaWF0ZWQsIGFzIHdlbGwgYXMgdGhlDQo+PiAr ICAgKiBhbW91bnQgb2YgdG9rZW5zIHRoYXQgc2hvdWxkIGJlIHNraXBwZWQgYmVmb3JlIHRo ZSBuZXh0IGludm9jYXRpb24uIFNpbmNlDQo+PiArICAgKiB0aGlzIGZ1bmN0aW9uIG1heSBj b25zdW1lIG1vcmUgdGhhbiBqdXN0IG9uZSB0b2tlbiwgaXQgaXMgaW1wb3J0YW50IHRvIHNr aXANCj4+ICsgICAqIGFoZWFkIG9mIHRoZSBpbnB1dCB0byBhdm9pZCBtaXMtc3Vic3RpdHV0 aW9ucw0KPj4gKyAgICovDQo+PiArICBzdGQ6OnBhaXI8c3RkOjp2ZWN0b3I8c3RkOjp1bmlx dWVfcHRyPEFTVDo6VG9rZW4+Piwgc2l6ZV90Pg0KPj4gKyAgc3Vic3RpdHV0ZV90b2tlbiAo c2l6ZV90IHRva2VuX2lkeCk7DQo+PiArDQo+PiArICAvKioNCj4+ICsgICAqIFN1YnN0aXR1 dGUgYWxsIHRva2VucyBieSB0aGVpciBhcHByb3ByaWF0ZSByZXByZXNlbnRhdGlvbg0KPj4g KyAgICoNCj4+ICsgICAqIEByZXR1cm4gQSB2ZWN0b3IgY29udGFpbmluZyB0aGUgc3Vic3Rp dHV0ZWQgdG9rZW5zDQo+PiArICAgKi8NCj4+ICsgIHN0ZDo6dmVjdG9yPHN0ZDo6dW5pcXVl X3B0cjxBU1Q6OlRva2VuPj4gc3Vic3RpdHV0ZV90b2tlbnMgKCk7DQo+PiArfTsNCj4+ICt9 IC8vIG5hbWVzcGFjZSBSdXN0DQo+PiAtLQ0KPj4gMi4zNy4yDQo+Pg0KDQoNCktpbmRseSwN Cg0KQXJ0aHVyDQo= --------------MtVlL2u4eFsHe3HNt0Y1s039 Content-Type: application/pgp-keys; name="OpenPGP_0x1B3465B044AD9C65.asc" Content-Disposition: attachment; filename="OpenPGP_0x1B3465B044AD9C65.asc" Content-Description: OpenPGP public key Content-Transfer-Encoding: quoted-printable -----BEGIN PGP PUBLIC KEY BLOCK----- xsFNBGIMH/sBEAC/+yKgi+y9knsqZUNIqlF85v9Lv0lZ2jOUgFgD5R10gz8j39vI YxM/DWA8BGudqx/s0V3T2arTIJ9u9StA6846SD4lCmdFBUkE0ylOl9UjYrZpoNOY F85TrhwDBB8LxNzopJxrQIv/WqU2pfs4+QyZuzNPWkGv1b06dDqY1hr7jUxJzAhR klGMyd6kPzr4lJUJLvIPxjQ1Y+NXAiLrm7n7HqXeHxGBHFwxTRKMb720fcP8pkNQ KZNoZBAhNr/665yIH3fV1+D/xsjbVkowBJn5MG3iburNfps50fMNNkBZgzIBRjBx dyJ7iJmpZRQkdLSEf/gpWEc/vUVs8OIdqT60vuFoueuQUyntFuvGWyCP/o71+eaM dG1Xx8TROJM9usU+Zz3V8GwpPSUUiAI/tDhR/ANtrrJ7jbuhw/9fm7HLovGniQcp N2INgY/Ema3dmU7EWnFqeGymP8R3MQY1Ge8xqlNL1KGrp45ZHp623XgH+IDkvy1n e7RU+WuOPxKKWGeN9LfHNGfTX3ZvFCCxlnbU6KwwoeiLBVdkY1zbgA5LPIPrPtzQ vSPTivQswMkCEVrqLkBYnAXGiavx8V63HltdohJMvkE0wkH3XmsTgrbtqxADlHHz 7WZbBWx9G6OElEThcuT/H/pR9dxr83+qbkUpyIYxW3zP/kpz97oOElSyEQARAQAB zShBcnRodXIgQ29oZW4gPGFydGh1ci5jb2hlbkBlbWJlY29zbS5jb20+wsGOBBMB CAA4FiEEhx8wPNj7cw6CrvzGGzRlsEStnGUFAmIMH/sCGwMFCwkIBwIGFQoJCAsC BBYCAwECHgECF4AACgkQGzRlsEStnGW7GhAApgjuTe1IRIGxhF8o2VLRYYOHugSI 6tNBPpnOjRBbt/Uj5xECBLDtIx+/GR+fUSZ/wRj7hIpbSoClfnCwQ5/Z0055MY8T 9UsCwElOPluzCNmrmRPL2snMsAhhMxDVVtX5xvF25It0qRQJLVKWiJPoPsQbl3ou aQhPbr2zeIAa74BlWn03zbUJdTXcdjd8+ZBnSGntqwV/hP/g1NwZzuxhroOq1Uaf PFd3RKwcuIRUkr5JE1ymNP4R8u3GU4/gwGr9s69wIEsBohPowgYGt84ZvLZpt84y Ufsf9CH4OE4/+x1QGumD1b9VcIv5/vZsg7Z8EXKibb6X5TM2vtCcNAHv+0KsERZy LHXn+GOjPQgISzPEcxYkeGNtEnf6IhsIfZyeUe2ZiMPz48Tok9w7r0XfhMCj2SMF jbAFfsufsglDnGO7CRuCBXtYJYZInmf5XzaQ8FfMRPs9jZeD6SFZjFH00E1o5GLs Y9le5euxLo1aLqDNqMp6I8R70rK65c7zRAnQ9CO8watmXsBMuJ0Y6Jmf/noFXn8S GVA9b7j+uumum1zToTSmPwhn83X3KwoXTmQ9RD1eiEBJDT9/phSTVDTqhsu8GJVz OIRVXKHxRZLZJo1pGt3YzbDlTshXAV4Ln5YsJIgyAuLU6vmH50QoZhuJK3xMnUaM RdxgyqZe5ACmWXXOwU0EYgwf+wEQAL5Bd4WYiqpsBgW1k/Tozz4cThT+CueIqitD 5lhTzEJ73SyrAmUiZrkSmR2Vc6G1mJEqozkmeXHjjQ8gMbz6HZBmacnJhWObf1aU THjowIsyT0hJJVag1Exq16lBUZCelNG0Jb07TnVWTi/2xHRTLsNVzTQpKnWC3OoA y6M9KwNp5I0hk2cJaFrMjz7/Q16kx8vOov28UcsNDhbq25W64fdEYZApNZI1sKk3 3tAQj4t0BxHtG1Hb6EwxbPmVZpL07fmLLVWe3nI5znekXq8AHlUcPGpb4EjUIsmK 8+VnGF3f0cDeSupJWSaHiuufc/jONsM8ZiuYJ6i9Lr8IvgeTUZMXVrjwuIDaMLn5 F24dmNSheuwLukQTTiB9LKfUyKZzkFb8Opiqzjng+psvkECIVwk5xaZgraKtivyq +RHGrhSzkJv17QLb7rEiMjKl+20v3xCYl8ogR/7O/slPZMisDV5QOEZEMrWfVYZC W5UIO+vXekTweJxVzPfrkUSpzce67iyeTzzNNwPlFnS/6eB1+IKKAtuxEhbOokBs Yf+WnY7xdLGCLyVTXdg99oXZ9AJUUJL3dy9eIggZciQSzkhfeKykoUDmHUAAbWTA xWLwkJ/QBku/Ay5ffRQ9ukhngdu8PsyPGwsOORNIVYbKU0hMtqU7UjOzhVviQufJ Y2C4KCp5ABEBAAHCwXYEGAEIACAWIQSHHzA82PtzDoKu/MYbNGWwRK2cZQUCYgwf +wIbDAAKCRAbNGWwRK2cZQJ6D/95URtl/eu1akFC1VNqdghWrOAJiL8Jgk53cXug 3GXoh8qjDYXT7S6zC6Gyq2nqhGy5JdNmZRdhFCIqZAg2DyBY/1gJEM0yLXEhWZy8 AxuUaadAuUG8erdngXD2az4glSKhjAM5oxRXkWB3P9lr5I2n0Yx7tPlFusfIInV/ 3RKOYezPS9seoJS31hb6dvYsf3/RGF5Fau3+sm4urTn7zqhqBYgqBmih8sgsifXA zsJ+tO33Cd10SPZmKlKlZWxouTL4Nky6e2DJHX7phX1DIZBmJBIUvkK6uA7mdJ1y zQonNJq8nABtXBioO+YnP3msZPutEJzGnBjRSpJr0FULqeIX5JTPqa023Kj2zvnF fqKrT6rgMUomNjQxCryix+EoBUvHcHAyWPQuYb38eV15GqcCjEezziKqTXPBETXk M3rq8+STsSwxn6wz6gwgC1sbj+IXUY2jGzq8fS/99uferADYXEnzKheU5Q4gWv2X Q/juSJh6AuxTdlr7+5ndAmVUh8U0p47S5ErJnHt1H4pLxIoR7VM9YiIZHn833Xms 2QT2JVIVzL+opHU5XdoXPgd58b8Sxd2j1Fj8LevvZ4isfpr6ZHQ3S0sdOZFtg+Sd nri0Eg+Zg28sczMMKT0W+wb/dpZCA8p3ONJE5hWUhtUpNuhV7j8A4PBVzNHOqPWx 7FJmBg=3D=3D =3DQnyj -----END PGP PUBLIC KEY BLOCK----- --------------MtVlL2u4eFsHe3HNt0Y1s039-- --------------AYvxY90qpRvCapR3Ckc3WwUJ-- --------------cYS53IAKj3fwWfg4hnQnQ018 Content-Type: application/pgp-signature; name="OpenPGP_signature.asc" Content-Description: OpenPGP digital signature Content-Disposition: attachment; filename="OpenPGP_signature" -----BEGIN PGP SIGNATURE----- wsF5BAABCAAjFiEEhx8wPNj7cw6CrvzGGzRlsEStnGUFAmNzeZoFAwAAAAAACgkQGzRlsEStnGUu AQ/+KiOI1XNxsUuVou3LtoAN4zvHnfwLbztMemYFTWeWjubcxtChMcR0Q76NOKJxqJMisuq3W0KG MTlCbxEF41N8Y2o7uTuytBIIaIHtozhZUuN4eyBBKwvcB1vR2clKvySquvsLjB+wqfWgQGM1iix5 ytrNLEp0ZWNmENCHo4hKsWbqAf+qh+IVyAvp0KYJFX2qij3TKaYdyBTbJ9/ubw0806rt2/g4YnFI Rh2Esn3jG3Hb5hEi4pypdhHRzz3/5vbvRq34llC+nyLxaSsSwNXKkH5cawvvk3j1hol5aSC4HQ1a a0ijYjaCimoU0QZWfqm6dAAtfxy/NH6rQrZnR+c/0WDGFCHxPrboBareUW60GElgNaj6qqGA2eyM xQjIdQLwg+8lpFCXq78S3qoU3/IDM6POKSqZnQ2t0ha5FyQB/bvPEeBLAtnXoIUU7suETNAmR3+8 4MaQmWDkJC7QAKbE/gFzqivnqn+fCa0zFtm7AhhMIoXU8EtPEXO4QQiLiZGEohQzSm2XPTE1I+oW aVMJkESqi3JIrjl17YvfLnX3xbr0QRUTNiljaNiNWRSuY2NpABriXmTxyOD0MjbnjlaLIgb2SL73 kK346ahiVFP1F8unZAgx55eYr+9O1S0gYOHoSoKSzLqBOxRVO/8/AAvPRdHJDjk3jzK0P6W3Rbgv brk= =DEj3 -----END PGP SIGNATURE----- --------------cYS53IAKj3fwWfg4hnQnQ018--