From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from sender4-pp-o90.zoho.com (sender4-pp-o90.zoho.com [136.143.188.90]) by sourceware.org (Postfix) with ESMTPS id 26A1E3858C51; Sat, 9 Apr 2022 17:50:37 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.4.1 sourceware.org 26A1E3858C51 ARC-Seal: i=1; a=rsa-sha256; t=1649526631; cv=none; d=zohomail.com; s=zohoarc; b=LVXSlTWeLAiPGXsQHgl9BnCYlP0XIAM3bg1dME1pmf2F0xBd6f9SPeBoTXiXwDVfCIQFHjVMa8ojoSJWFcFXoMLaEexnkY19cMKxx4waYd6DQ5w4AHsCKFwG/xVl3j8zazlT5BebM7dZ6qMxpnqQDyz35ycqNyD1CC+zzCMkeJM= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1649526631; h=Content-Type:Date:From:In-Reply-To:MIME-Version:Message-ID:References:Subject:To; bh=tojCa9+a9gJMi/9ZcBJSOaiFC/0KLRLhJl+/g2JIfvI=; b=D+vTiZGsDjGALBpMUSGoSWNgPysNpNb5PJMxMDXW5WMsEoTozMdh0ylY+k3tGFWVscOAKy9JiBcoESZIfA1EoEvUQb5MWKxhkXzlDEZMQsV1kUOPkDGIGsK0D0jnU2OfGmJw0SHOQlpAhuDeKz4/4IND3Ggf7QeHqJgYYZGyd8E= ARC-Authentication-Results: i=1; mx.zohomail.com; dkim=pass header.i=zoho.com; spf=pass smtp.mailfrom=bouanto@zoho.com; dmarc=pass header.from= Received: from [192.168.1.174] (38.87.11.6 [38.87.11.6]) by mx.zohomail.com with SMTPS id 1649526628420805.9232696691419; Sat, 9 Apr 2022 10:50:28 -0700 (PDT) Message-ID: <7c11cc644be07afa0753dbabc2fb607c8af48af6.camel@zoho.com> Subject: Re: [PATCH] libgccjit: Add support for setting the alignment [PR104293] From: Antoni Boucher To: David Malcolm , gcc-patches@gcc.gnu.org, jit@gcc.gnu.org Date: Sat, 09 Apr 2022 13:50:26 -0400 In-Reply-To: <1a077e6549786d9aedb1cf353f176b0207520c6e.camel@redhat.com> References: <7f32bff12738484e3f5d97cfc481996fd7570b01.camel@zoho.com> <1a077e6549786d9aedb1cf353f176b0207520c6e.camel@redhat.com> Content-Type: multipart/mixed; boundary="=-Lox0ipxD7xan406mk4S3" User-Agent: Evolution 3.42.4 MIME-Version: 1.0 X-Zoho-Virus-Status: 1 X-ZohoMailClient: External X-Spam-Status: No, score=-10.6 required=5.0 tests=BAYES_00, BODY_8BITS, DKIM_SIGNED, DKIM_VALID, DKIM_VALID_AU, DKIM_VALID_EF, FREEMAIL_FROM, GIT_PATCH_0, RCVD_IN_DNSWL_NONE, RCVD_IN_MSPIKE_H5, RCVD_IN_MSPIKE_WL, SPF_HELO_NONE, SPF_PASS, TXREP, T_SCC_BODY_TEXT_LINE autolearn=ham autolearn_force=no version=3.4.4 X-Spam-Checker-Version: SpamAssassin 3.4.4 (2020-01-24) on server2.sourceware.org X-BeenThere: jit@gcc.gnu.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: Jit mailing list List-Unsubscribe: , List-Archive: List-Help: List-Subscribe: , X-List-Received-Date: Sat, 09 Apr 2022 17:50:40 -0000 --=-Lox0ipxD7xan406mk4S3 Content-Type: text/plain; charset="UTF-8" Content-Transfer-Encoding: quoted-printable Here's the updated patch. On Fri, 2022-04-08 at 15:01 -0400, David Malcolm wrote: > On Sun, 2022-01-30 at 20:38 -0500, Antoni Boucher via Gcc-patches > wrote: > > Hi. > > This patch adds support for setting the alignment of variables in > > libgccjit. >=20 > Thanks.=C2=A0 Sorry about the delay in reviewing it. >=20 > >=20 > > I was wondering if I should change it so that it takes/returns > > bytes > > instead of bits. > > What do you think? >=20 > I'm not sure, but given that C refers to bytes for this: > =C2=A0 https://en.cppreference.com/w/c/language/object#Alignment > =C2=A0 https://en.cppreference.com/w/c/language/_Alignof > ...I think bytes is the better choice, to maximize similarity with C. Ok, I updated it to use bytes. >=20 > Does anything support/need a fraction-of-a-byte alignment?=C2=A0 If so, > then > bits would be the way to go. >=20 >=20 > > diff --git a/gcc/jit/docs/topics/compatibility.rst > > b/gcc/jit/docs/topics/compatibility.rst > > index 16cebe31a10..1957399dceb 100644 > > --- a/gcc/jit/docs/topics/compatibility.rst > > +++ b/gcc/jit/docs/topics/compatibility.rst > > @@ -302,3 +302,13 @@ thread-local storage model of a variable: > > =C2=A0section of a variable: > > =C2=A0 > > =C2=A0=C2=A0 * :func:`gcc_jit_lvalue_set_link_section` > > + > > +.. _LIBGCCJIT_ABI_24: > > + > > +``LIBGCCJIT_ABI_24`` > > +----------------------- > > +``LIBGCCJIT_ABI_24`` covers the addition of functions to get and > > set the > > +alignement of a variable: > > + > > +=C2=A0 * :func:`gcc_jit_lvalue_set_alignment` > > +=C2=A0 * :func:`gcc_jit_lvalue_get_alignment` > > diff --git a/gcc/jit/docs/topics/expressions.rst > > b/gcc/jit/docs/topics/expressions.rst > > index 791a20398ca..0f5f5376d8c 100644 > > --- a/gcc/jit/docs/topics/expressions.rst > > +++ b/gcc/jit/docs/topics/expressions.rst > > @@ -738,6 +738,45 @@ where the rvalue is computed by reading from > > the storage area. > > =C2=A0 > > =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 #ifdef LIBGCCJIT_HAVE_gcc_jit_lval= ue_set_link_section > > =C2=A0 > > +.. function:: void > > +=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2= =A0=C2=A0 gcc_jit_lvalue_set_alignment (gcc_jit_lvalue > > *lvalue, > > +=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2= =A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2= =A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 int alignment) > > + > > +=C2=A0=C2=A0 Set the alignment of a variable. > > +=C2=A0=C2=A0 The parameter ``alignment`` is in bits. Analogous to: > > + > > +=C2=A0=C2=A0 .. code-block:: c > > + > > +=C2=A0=C2=A0=C2=A0=C2=A0 int variable __attribute__((aligned (16))); > > + > > +=C2=A0=C2=A0 in C, but in bits instead of bytes. >=20 > If we're doing it in bytes, this will need updating, of course. >=20 > Maybe rename the int param from "alignment" to "bytes" to make this > clearer. >=20 > Probably should be unsigned as well. >=20 > > + > > +=C2=A0=C2=A0 This entrypoint was added in :ref:`LIBGCCJIT_ABI_24`; you= can > > test for > > +=C2=A0=C2=A0 its presence using > > + > > +=C2=A0=C2=A0 .. code-block:: c > > + > > +=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 #ifdef LIBGCCJIT_HAVE_ALIGNMENT > > + > > +.. function:: int > > +=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2= =A0=C2=A0 gcc_jit_lvalue_get_alignment (gcc_jit_lvalue > > *lvalue) > > + > > +=C2=A0=C2=A0 Return the alignment of a variable set by > > ``gcc_jit_lvalue_set_alignment``, in bits. > > +=C2=A0=C2=A0 Return 0 if the alignment was not set. Analogous to: > > + > > +=C2=A0=C2=A0 .. code-block:: c > > + > > +=C2=A0=C2=A0=C2=A0=C2=A0 _Alignof (variable) > > + > > +=C2=A0=C2=A0 in C, but in bits instead of bytes. >=20 > Likewise this will need updating. >=20 > > + > > +=C2=A0=C2=A0 This entrypoint was added in :ref:`LIBGCCJIT_ABI_24`; you= can > > test for > > +=C2=A0=C2=A0 its presence using > > + > > +=C2=A0=C2=A0 .. code-block:: c > > + > > +=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 #ifdef LIBGCCJIT_HAVE_ALIGNMENT > > + > > =C2=A0Global variables > > =C2=A0**************** > >=20 >=20 > [...snip...] >=20 > > diff --git a/gcc/jit/libgccjit.cc b/gcc/jit/libgccjit.cc > > index 4c352e8c93d..e03f15ec9c8 100644 > > --- a/gcc/jit/libgccjit.cc > > +++ b/gcc/jit/libgccjit.cc > > @@ -2649,6 +2649,31 @@ gcc_jit_lvalue_set_link_section > > (gcc_jit_lvalue *lvalue, > > =C2=A0=C2=A0 lvalue->set_link_section (section_name); > > =C2=A0} > > =C2=A0 > > +/* Public entrypoint.=C2=A0 See description in libgccjit.h. > > + > > +=C2=A0=C2=A0 After error-checking, the real work is done by the > > +=C2=A0=C2=A0 gcc::jit::recording::lvalue::get_link_section method in j= it- > > recording.cc.=C2=A0 */ >=20 > Comment refers to wrong function. >=20 > > + > > +int > > +gcc_jit_lvalue_get_alignment (gcc_jit_lvalue *lvalue) > > +{ > > +=C2=A0 RETURN_VAL_IF_FAIL (lvalue, 0, NULL, NULL, "NULL lvalue"); > > +=C2=A0 return lvalue->get_alignment (); > > +} >=20 > Should this return unsigned? >=20 > > + > > +/* Public entrypoint.=C2=A0 See description in libgccjit.h. > > + > > +=C2=A0=C2=A0 After error-checking, the real work is done by the > > +=C2=A0=C2=A0 gcc::jit::recording::lvalue::set_alignment method in jit- > > recording.cc.=C2=A0 */ > > + > > +void > > +gcc_jit_lvalue_set_alignment (gcc_jit_lvalue *lvalue, > > +=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2= =A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= =C2=A0=C2=A0=C2=A0=C2=A0 int alignment) > > +{ > > +=C2=A0 RETURN_IF_FAIL (lvalue, NULL, NULL, "NULL lvalue"); >=20 > Should the alignment be unsigned?=C2=A0 What if the user passes in > negative? >=20 > Does it have to be a power of two?=C2=A0 If so, ideally we should reject > non-power-of-two here. >=20 > > +=C2=A0 lvalue->set_alignment (alignment); > > +} > > + >=20 > [...snip...] >=20 > > diff --git a/gcc/jit/libgccjit.map b/gcc/jit/libgccjit.map > > index f373fd39ac7..df51e4fdd8c 100644 > > --- a/gcc/jit/libgccjit.map > > +++ b/gcc/jit/libgccjit.map > > @@ -243,3 +243,21 @@ LIBGCCJIT_ABI_19 { > > =C2=A0=C2=A0=C2=A0=C2=A0 gcc_jit_context_new_union_constructor; > > =C2=A0=C2=A0=C2=A0=C2=A0 gcc_jit_global_set_initializer_rvalue; > > =C2=A0} LIBGCCJIT_ABI_18; > > + > > +LIBGCCJIT_ABI_20 { > > +} LIBGCCJIT_ABI_19; > > + > > +LIBGCCJIT_ABI_21 { > > +} LIBGCCJIT_ABI_20; > > + > > +LIBGCCJIT_ABI_22 { > > +} LIBGCCJIT_ABI_21; > > + > > +LIBGCCJIT_ABI_23 { > > +} LIBGCCJIT_ABI_22; > > + > > +LIBGCCJIT_ABI_24 { > > +=C2=A0 global: > > +=C2=A0=C2=A0=C2=A0 gcc_jit_lvalue_set_alignment; > > +=C2=A0=C2=A0=C2=A0 gcc_jit_lvalue_get_alignment; > > +} LIBGCCJIT_ABI_23; >=20 > BTW, how much of a problem would it be to you if we changed the order > of some of these? That's not an issue: I have no problem changing the order. >=20 > At this point the API numbering may be getting in the way of getting > some of the simpler changes into trunk. >=20 > > diff --git a/gcc/testsuite/jit.dg/all-non-failing-tests.h > b/gcc/testsuite/jit.dg/all-non-failing-tests.h > > index 29afe064db6..72c46e81e51 100644 > > --- a/gcc/testsuite/jit.dg/all-non-failing-tests.h > > +++ b/gcc/testsuite/jit.dg/all-non-failing-tests.h > > @@ -306,6 +306,9 @@ > > =C2=A0#undef create_code > > =C2=A0#undef verify_code > > =C2=A0 > > +/* test-setting-alignment.c: This can't be in the testcases array > > as it > > +=C2=A0=C2=A0 doesn't have a verify_code implementation.=C2=A0 */ >=20 > My first though was that with an empty verify_code implementation it > might work, but I see that the test overrides the regular options to > avoid -O3, so it can't be part of the combined tests. >=20 > > + > > =C2=A0/* test-string-literal.c */ > > =C2=A0#define create_code create_code_string_literal > > =C2=A0#define verify_code verify_code_string_literal > > diff --git a/gcc/testsuite/jit.dg/test-setting-alignment.c > > b/gcc/testsuite/jit.dg/test-setting-alignment.c > > new file mode 100644 > > index 00000000000..e87afbeacd3 > > --- /dev/null > > +++ b/gcc/testsuite/jit.dg/test-setting-alignment.c > > @@ -0,0 +1,64 @@ > > +#include > > +#include > > + > > +#include "libgccjit.h" > > + > > +/* We don't want set_options() in harness.h to set -O3 so our > > little local > > +=C2=A0=C2=A0 is optimized away. */ > > +#define TEST_ESCHEWS_SET_OPTIONS > > +static void set_options (gcc_jit_context *ctxt, const char *argv0) > > +{ > > +} > > + > > +#define TEST_COMPILING_TO_FILE > > +#define OUTPUT_KIND=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 GCC_JIT_OUTPUT_KIND_= ASSEMBLER > > +#define OUTPUT_FILENAME=C2=A0 "output-of-test-setting-alignment.c.s" > > +#include "harness.h" > > + > > +void > > +create_code (gcc_jit_context *ctxt, void *user_data) > > +{ > > +=C2=A0 /* Let's try to inject the equivalent of: > > +=C2=A0=C2=A0=C2=A0=C2=A0 int foo __attribute__((aligned (8))); > > + > > +=C2=A0=C2=A0=C2=A0=C2=A0 int main (void) { > > +=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 int bar __attribute__((alig= ned (16))); > > +=C2=A0=C2=A0=C2=A0=C2=A0 } > > +=C2=A0 */ > > +=C2=A0 gcc_jit_type *int_type =3D > > +=C2=A0=C2=A0=C2=A0 gcc_jit_context_get_type (ctxt, GCC_JIT_TYPE_INT); > > +=C2=A0 gcc_jit_lvalue *foo =3D > > +=C2=A0=C2=A0=C2=A0 gcc_jit_context_new_global ( > > +=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 ctxt, NULL, GCC_JIT_GLOBAL_EXPORTED, in= t_type, "foo"); > > +=C2=A0 gcc_jit_lvalue_set_alignment(foo, 64); > > + > > +=C2=A0 gcc_jit_field *field =3D gcc_jit_context_new_field (ctxt, > > +=C2=A0=C2=A0=C2=A0 NULL, > > +=C2=A0=C2=A0=C2=A0 int_type, > > +=C2=A0=C2=A0=C2=A0 "a"); > > +=C2=A0 gcc_jit_struct *struct_type =3D > > +=C2=A0=C2=A0=C2=A0 gcc_jit_context_new_struct_type(ctxt, NULL, "Type",= 1, > > &field); > > +=C2=A0 gcc_jit_function *func_main =3D > > +=C2=A0=C2=A0=C2=A0 gcc_jit_context_new_function (ctxt, NULL, > > +=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2= =A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 GCC_JIT_FUNCTION_EXPORTED, > > +=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2= =A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 int_type, > > +=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2= =A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 "main", > > +=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2= =A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 0, NULL, > > +=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2= =A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 0); > > +=C2=A0 /*gcc_jit_rvalue *zero =3D gcc_jit_context_zero (ctxt, > > int_type);*/ > > +=C2=A0 gcc_jit_lvalue *bar =3D > > +=C2=A0=C2=A0=C2=A0 gcc_jit_function_new_local ( > > +=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 func_main, NULL, > > +=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 gcc_jit_struct_as_type (struct_type), > > +=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 "bar"); > > +=C2=A0 gcc_jit_lvalue_set_alignment(bar, 128); > > +=C2=A0 gcc_jit_block *block =3D gcc_jit_function_new_block (func_main, > > NULL); > > +=C2=A0 /*gcc_jit_block_add_assignment (block, NULL, bar, zero);*/ > > +=C2=A0 gcc_jit_rvalue *return_value =3D > > +=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 gcc_jit_lvalue_as_rvalue (gcc_jit_lvalu= e_access_field (bar, > > NULL, field)); > > +=C2=A0 gcc_jit_block_end_with_return (block, NULL, return_value); > > +} > > + > > +/* { dg-final { jit-verify-output-file-was-created "" } } */ > > +/* { dg-final { jit-verify-assembler-output ".comm=C2=A0=C2=A0=C2=A0= =C2=A0=C2=A0foo,4,8" } > > } */ > > +/* { dg-final { jit-verify-assembler-output "movl=C2=A0=C2=A0=C2=A0=C2= =A0=C2=A0=C2=A0- > > 16\\\(%rbp), %eax" } } */ >=20 > The expected output from the test is x86 specific, so it needs > something like: >=20 > =C2=A0 /* { dg-do compile { target x86_64-*-* } } */ >=20 > at the top. >=20 > Also, there's no test coverage for gcc_jit_lvalue_get_alignment. >=20 >=20 > Hope the above is constructive; thanks again for the patch >=20 > Dave >=20 >=20 --=-Lox0ipxD7xan406mk4S3 Content-Disposition: attachment; filename*0=0001-libgccjit-Add-support-for-setting-the-alignment-PR10.pat; filename*1=ch Content-Type: text/x-patch; name="0001-libgccjit-Add-support-for-setting-the-alignment-PR10.patch"; charset="UTF-8" Content-Transfer-Encoding: base64 RnJvbSA3NTkzNmZiZjE5Y2E2NmJiM2U3MTBlMDQ2YmFiZjBiM2NiYzZmNzM4IE1vbiBTZXAgMTcg MDA6MDA6MDAgMjAwMQpGcm9tOiBBbnRvbmkgQm91Y2hlciA8Ym91YW50b0B6b2hvLmNvbT4KRGF0 ZTogVHVlLCAyNSBKYW4gMjAyMiAyMToxMjozMiAtMDUwMApTdWJqZWN0OiBbUEFUQ0hdIGxpYmdj Y2ppdDogQWRkIHN1cHBvcnQgZm9yIHNldHRpbmcgdGhlIGFsaWdubWVudCBbUFIxMDQyOTNdCgoy MDIyLTA0LTA5ICBBbnRvbmkgQm91Y2hlciA8Ym91YW50b0B6b2hvLmNvbT4KCmdjYy9qaXQvCglQ UiBqaXQvMTA0MjkzCgkqIGRvY3MvdG9waWNzL2NvbXBhdGliaWxpdHkucnN0IChMSUJHQ0NKSVRf QUJJXzI0KTogTmV3IEFCSSB0YWcuCgkqIGRvY3MvdG9waWNzL2V4cHJlc3Npb25zLnJzdDogQWRk IGRvY3VtZW50YXRpb24gZm9yIHRoZQoJZnVuY3Rpb25zIGdjY19qaXRfbHZhbHVlX3NldF9hbGln bm1lbnQgYW5kCglnY2Nfaml0X2x2YWx1ZV9nZXRfYWxpZ25tZW50LgoJKiBqaXQtcGxheWJhY2su aDogTmV3IGZ1bmN0aW9uIChzZXRfYWxpZ25tZW50KS4KCSogaml0LXJlY29yZGluZy5jYzogTmV3 IGZ1bmN0aW9uIChzZXRfYWxpZ25tZW50KS4KCSogaml0LXJlY29yZGluZy5oOiBOZXcgZnVuY3Rp b25zIChzZXRfYWxpZ25tZW50LCBnZXRfYWxpZ25tZW50KQoJYW5kIG5ldyBmaWVsZCAobV9hbGln bm1lbnQpLgoJKiBsaWJnY2NqaXQuY2M6IE5ldyBmdW5jdGlvbnMgKGdjY19qaXRfbHZhbHVlX2dl dF9hbGlnbm1lbnQsCglnY2Nfaml0X2x2YWx1ZV9zZXRfYWxpZ25tZW50KQoJKiBsaWJnY2NqaXQu aDogTmV3IGZ1bmN0aW9ucyAoZ2NjX2ppdF9sdmFsdWVfZ2V0X2FsaWdubWVudCwKCWdjY19qaXRf bHZhbHVlX3NldF9hbGlnbm1lbnQpCgkqIGxpYmdjY2ppdC5tYXAgKExJQkdDQ0pJVF9BQklfMjQp OiBOZXcgQUJJIHRhZy4KCmdjYy90ZXN0c3VpdGUvCglQUiBqaXQvMTA0MjkzCgkqIGppdC5kZy9h bGwtbm9uLWZhaWxpbmctdGVzdHMuaDogTWVudGlvbgoJdGVzdC1zZXR0aW5nLWFsaWdubWVudC4K CSogaml0LmRnL3Rlc3Qtc2V0dGluZy1hbGlnbm1lbnQuYzogTmV3IHRlc3QuCi0tLQogZ2NjL2pp dC9kb2NzL3RvcGljcy9jb21wYXRpYmlsaXR5LnJzdCAgICAgICAgIHwgMTAgKysrCiBnY2Mvaml0 L2RvY3MvdG9waWNzL2V4cHJlc3Npb25zLnJzdCAgICAgICAgICAgfCAzOSArKysrKysrKysrKwog Z2NjL2ppdC9qaXQtcGxheWJhY2suaCAgICAgICAgICAgICAgICAgICAgICAgIHwgIDcgKysKIGdj Yy9qaXQvaml0LXJlY29yZGluZy5jYyAgICAgICAgICAgICAgICAgICAgICB8IDE3ICsrKystCiBn Y2Mvaml0L2ppdC1yZWNvcmRpbmcuaCAgICAgICAgICAgICAgICAgICAgICAgfCAgNiArLQogZ2Nj L2ppdC9saWJnY2NqaXQuY2MgICAgICAgICAgICAgICAgICAgICAgICAgIHwgMjYgKysrKysrKysK IGdjYy9qaXQvbGliZ2Njaml0LmggICAgICAgICAgICAgICAgICAgICAgICAgICB8IDE5ICsrKysr KwogZ2NjL2ppdC9saWJnY2NqaXQubWFwICAgICAgICAgICAgICAgICAgICAgICAgIHwgMTggKysr KysKIGdjYy90ZXN0c3VpdGUvaml0LmRnL2FsbC1ub24tZmFpbGluZy10ZXN0cy5oICB8ICAzICsK IGdjYy90ZXN0c3VpdGUvaml0LmRnL3Rlc3Qtc2V0dGluZy1hbGlnbm1lbnQuYyB8IDY2ICsrKysr KysrKysrKysrKysrKysKIDEwIGZpbGVzIGNoYW5nZWQsIDIwOCBpbnNlcnRpb25zKCspLCAzIGRl bGV0aW9ucygtKQogY3JlYXRlIG1vZGUgMTAwNjQ0IGdjYy90ZXN0c3VpdGUvaml0LmRnL3Rlc3Qt c2V0dGluZy1hbGlnbm1lbnQuYwoKZGlmZiAtLWdpdCBhL2djYy9qaXQvZG9jcy90b3BpY3MvY29t cGF0aWJpbGl0eS5yc3QgYi9nY2Mvaml0L2RvY3MvdG9waWNzL2NvbXBhdGliaWxpdHkucnN0Cmlu ZGV4IDE2Y2ViZTMxYTEwLi4xOTU3Mzk5ZGNlYiAxMDA2NDQKLS0tIGEvZ2NjL2ppdC9kb2NzL3Rv cGljcy9jb21wYXRpYmlsaXR5LnJzdAorKysgYi9nY2Mvaml0L2RvY3MvdG9waWNzL2NvbXBhdGli aWxpdHkucnN0CkBAIC0zMDIsMyArMzAyLDEzIEBAIHRocmVhZC1sb2NhbCBzdG9yYWdlIG1vZGVs IG9mIGEgdmFyaWFibGU6CiBzZWN0aW9uIG9mIGEgdmFyaWFibGU6CiAKICAgKiA6ZnVuYzpgZ2Nj X2ppdF9sdmFsdWVfc2V0X2xpbmtfc2VjdGlvbmAKKworLi4gX0xJQkdDQ0pJVF9BQklfMjQ6CisK K2BgTElCR0NDSklUX0FCSV8yNGBgCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorYGBMSUJHQ0NK SVRfQUJJXzI0YGAgY292ZXJzIHRoZSBhZGRpdGlvbiBvZiBmdW5jdGlvbnMgdG8gZ2V0IGFuZCBz ZXQgdGhlCithbGlnbmVtZW50IG9mIGEgdmFyaWFibGU6CisKKyAgKiA6ZnVuYzpgZ2NjX2ppdF9s dmFsdWVfc2V0X2FsaWdubWVudGAKKyAgKiA6ZnVuYzpgZ2NjX2ppdF9sdmFsdWVfZ2V0X2FsaWdu bWVudGAKZGlmZiAtLWdpdCBhL2djYy9qaXQvZG9jcy90b3BpY3MvZXhwcmVzc2lvbnMucnN0IGIv Z2NjL2ppdC9kb2NzL3RvcGljcy9leHByZXNzaW9ucy5yc3QKaW5kZXggNzkxYTIwMzk4Y2EuLjY2 NGIyN2RjODFiIDEwMDY0NAotLS0gYS9nY2Mvaml0L2RvY3MvdG9waWNzL2V4cHJlc3Npb25zLnJz dAorKysgYi9nY2Mvaml0L2RvY3MvdG9waWNzL2V4cHJlc3Npb25zLnJzdApAQCAtNzM4LDYgKzcz OCw0NSBAQCB3aGVyZSB0aGUgcnZhbHVlIGlzIGNvbXB1dGVkIGJ5IHJlYWRpbmcgZnJvbSB0aGUg c3RvcmFnZSBhcmVhLgogCiAgICAgICAjaWZkZWYgTElCR0NDSklUX0hBVkVfZ2NjX2ppdF9sdmFs dWVfc2V0X2xpbmtfc2VjdGlvbgogCisuLiBmdW5jdGlvbjo6IHZvaWQKKyAgICAgICAgICAgICAg Z2NjX2ppdF9sdmFsdWVfc2V0X2FsaWdubWVudCAoZ2NjX2ppdF9sdmFsdWUgKmx2YWx1ZSwKKyAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgYnl0ZXMp CisKKyAgIFNldCB0aGUgYWxpZ25tZW50IG9mIGEgdmFyaWFibGUuCisgICBBbmFsb2dvdXMgdG86 CisKKyAgIC4uIGNvZGUtYmxvY2s6OiBjCisKKyAgICAgaW50IHZhcmlhYmxlIF9fYXR0cmlidXRl X18oKGFsaWduZWQgKDE2KSkpOworCisgICBpbiBDLgorCisgICBUaGlzIGVudHJ5cG9pbnQgd2Fz IGFkZGVkIGluIDpyZWY6YExJQkdDQ0pJVF9BQklfMjRgOyB5b3UgY2FuIHRlc3QgZm9yCisgICBp dHMgcHJlc2VuY2UgdXNpbmcKKworICAgLi4gY29kZS1ibG9jazo6IGMKKworICAgICAgI2lmZGVm IExJQkdDQ0pJVF9IQVZFX0FMSUdOTUVOVAorCisuLiBmdW5jdGlvbjo6IHVuc2lnbmVkCisgICAg ICAgICAgICAgIGdjY19qaXRfbHZhbHVlX2dldF9hbGlnbm1lbnQgKGdjY19qaXRfbHZhbHVlICps dmFsdWUpCisKKyAgIFJldHVybiB0aGUgYWxpZ25tZW50IG9mIGEgdmFyaWFibGUgc2V0IGJ5IGBg Z2NjX2ppdF9sdmFsdWVfc2V0X2FsaWdubWVudGBgLgorICAgUmV0dXJuIDAgaWYgdGhlIGFsaWdu bWVudCB3YXMgbm90IHNldC4gQW5hbG9nb3VzIHRvOgorCisgICAuLiBjb2RlLWJsb2NrOjogYwor CisgICAgIF9BbGlnbm9mICh2YXJpYWJsZSkKKworICAgaW4gQy4KKworICAgVGhpcyBlbnRyeXBv aW50IHdhcyBhZGRlZCBpbiA6cmVmOmBMSUJHQ0NKSVRfQUJJXzI0YDsgeW91IGNhbiB0ZXN0IGZv cgorICAgaXRzIHByZXNlbmNlIHVzaW5nCisKKyAgIC4uIGNvZGUtYmxvY2s6OiBjCisKKyAgICAg ICNpZmRlZiBMSUJHQ0NKSVRfSEFWRV9BTElHTk1FTlQKKwogR2xvYmFsIHZhcmlhYmxlcwogKioq KioqKioqKioqKioqKgogCmRpZmYgLS1naXQgYS9nY2Mvaml0L2ppdC1wbGF5YmFjay5oIGIvZ2Nj L2ppdC9qaXQtcGxheWJhY2suaAppbmRleCBjOTNkNzA1NWQ0My4uZDExMDUzZjY2ZDkgMTAwNjQ0 Ci0tLSBhL2djYy9qaXQvaml0LXBsYXliYWNrLmgKKysrIGIvZ2NjL2ppdC9qaXQtcGxheWJhY2su aApAQCAtNzAxLDYgKzcwMSwxMyBAQCBwdWJsaWM6CiAgICAgc2V0X2RlY2xfc2VjdGlvbl9uYW1l IChhc190cmVlICgpLCBuYW1lKTsKICAgfQogCisgIHZvaWQKKyAgc2V0X2FsaWdubWVudCAoaW50 IGFsaWdubWVudCkKKyAgeworICAgICAgU0VUX0RFQ0xfQUxJR04gKGFzX3RyZWUgKCksIGFsaWdu bWVudCAqIEJJVFNfUEVSX1VOSVQpOworICAgICAgREVDTF9VU0VSX0FMSUdOIChhc190cmVlICgp KSA9IDE7CisgIH0KKwogcHJpdmF0ZToKICAgYm9vbCBtYXJrX2FkZHJlc3NhYmxlIChsb2NhdGlv biAqbG9jKTsKIH07CmRpZmYgLS1naXQgYS9nY2Mvaml0L2ppdC1yZWNvcmRpbmcuY2MgYi9nY2Mv aml0L2ppdC1yZWNvcmRpbmcuY2MKaW5kZXggMWUzZmFkZmFjZDcuLmJhYzQzZTU3YjRhIDEwMDY0 NAotLS0gYS9nY2Mvaml0L2ppdC1yZWNvcmRpbmcuY2MKKysrIGIvZ2NjL2ppdC9qaXQtcmVjb3Jk aW5nLmNjCkBAIC0zODA3LDYgKzM4MDcsMTEgQEAgdm9pZCByZWNvcmRpbmc6Omx2YWx1ZTo6c2V0 X2xpbmtfc2VjdGlvbiAoY29uc3QgY2hhciAqbmFtZSkKICAgbV9saW5rX3NlY3Rpb24gPSBuZXdf c3RyaW5nIChuYW1lKTsKIH0KIAordm9pZCByZWNvcmRpbmc6Omx2YWx1ZTo6c2V0X2FsaWdubWVu dCAodW5zaWduZWQgYnl0ZXMpCit7CisgIG1fYWxpZ25tZW50ID0gYnl0ZXM7Cit9CisKIC8qIFRo ZSBpbXBsZW1lbnRhdGlvbiBvZiBjbGFzcyBnY2M6OmppdDo6cmVjb3JkaW5nOjpwYXJhbS4gICov CiAKIC8qIEltcGxlbWVudGF0aW9uIG9mIHB1cmUgdmlydHVhbCBob29rIHJlY29yZGluZzo6bWVt ZW50bzo6cmVwbGF5X2ludG8KQEAgLTQ2NzMsNiArNDY3OCw5IEBAIHJlY29yZGluZzo6Z2xvYmFs OjpyZXBsYXlfaW50byAocmVwbGF5ZXIgKnIpCiAgIGlmIChtX2xpbmtfc2VjdGlvbiAhPSBOVUxM KQogICAgIGdsb2JhbC0+c2V0X2xpbmtfc2VjdGlvbiAobV9saW5rX3NlY3Rpb24tPmNfc3RyICgp KTsKIAorICBpZiAobV9hbGlnbm1lbnQgIT0gMCkKKyAgICBnbG9iYWwtPnNldF9hbGlnbm1lbnQg KG1fYWxpZ25tZW50KTsKKwogICBzZXRfcGxheWJhY2tfb2JqIChnbG9iYWwpOwogfQogCkBAIC02 MzQzLDExICs2MzUxLDE2IEBAIHJlY29yZGluZzo6ZnVuY3Rpb25fcG9pbnRlcjo6d3JpdGVfcmVw cm9kdWNlciAocmVwcm9kdWNlciAmcikKIHZvaWQKIHJlY29yZGluZzo6bG9jYWw6OnJlcGxheV9p bnRvIChyZXBsYXllciAqcikKIHsKLSAgc2V0X3BsYXliYWNrX29iaiAoCisgIHBsYXliYWNrOjps dmFsdWUgKmxvY2FsID0KICAgICBtX2Z1bmMtPnBsYXliYWNrX2Z1bmN0aW9uICgpCiAgICAgICAt Pm5ld19sb2NhbCAocGxheWJhY2tfbG9jYXRpb24gKHIsIG1fbG9jKSwKIAkJICAgbV90eXBlLT5w bGF5YmFja190eXBlICgpLAotCQkgICBwbGF5YmFja19zdHJpbmcgKG1fbmFtZSkpKTsKKwkJICAg cGxheWJhY2tfc3RyaW5nIChtX25hbWUpKTsKKworICBpZiAobV9hbGlnbm1lbnQgIT0gMCkKKyAg ICBsb2NhbC0+c2V0X2FsaWdubWVudCAobV9hbGlnbm1lbnQpOworCisgIHNldF9wbGF5YmFja19v YmogKGxvY2FsKTsKIH0KIAogLyogT3ZlcnJpZGUgdGhlIGRlZmF1bHQgaW1wbGVtZW50YXRpb24g b2YKZGlmZiAtLWdpdCBhL2djYy9qaXQvaml0LXJlY29yZGluZy5oIGIvZ2NjL2ppdC9qaXQtcmVj b3JkaW5nLmgKaW5kZXggODQ2ZDY1Y2IyMDIuLjM1MzVmNTI4ODg3IDEwMDY0NAotLS0gYS9nY2Mv aml0L2ppdC1yZWNvcmRpbmcuaAorKysgYi9nY2Mvaml0L2ppdC1yZWNvcmRpbmcuaApAQCAtMTE0 OCw3ICsxMTQ4LDggQEAgcHVibGljOgogCSAgdHlwZSAqdHlwZV8pCiAgICAgOiBydmFsdWUgKGN0 eHQsIGxvYywgdHlwZV8pLAogICAgIG1fdGxzX21vZGVsIChHQ0NfSklUX1RMU19NT0RFTF9OT05F KSwKLSAgICBtX2xpbmtfc2VjdGlvbiAoTlVMTCkKKyAgICBtX2xpbmtfc2VjdGlvbiAoTlVMTCks CisgICAgbV9hbGlnbm1lbnQgKDApCiAgICAge30KIAogICBwbGF5YmFjazo6bHZhbHVlICoKQEAg LTExNzIsMTAgKzExNzMsMTMgQEAgcHVibGljOgogICB2aXJ0dWFsIGJvb2wgaXNfZ2xvYmFsICgp IGNvbnN0IHsgcmV0dXJuIGZhbHNlOyB9CiAgIHZvaWQgc2V0X3Rsc19tb2RlbCAoZW51bSBnY2Nf aml0X3Rsc19tb2RlbCBtb2RlbCk7CiAgIHZvaWQgc2V0X2xpbmtfc2VjdGlvbiAoY29uc3QgY2hh ciAqbmFtZSk7CisgIHZvaWQgc2V0X2FsaWdubWVudCAodW5zaWduZWQgYnl0ZXMpOworICB1bnNp Z25lZCBnZXRfYWxpZ25tZW50ICgpIHsgcmV0dXJuIG1fYWxpZ25tZW50OyB9CiAKIHByb3RlY3Rl ZDoKICAgZW51bSBnY2Nfaml0X3Rsc19tb2RlbCBtX3Rsc19tb2RlbDsKICAgc3RyaW5nICptX2xp bmtfc2VjdGlvbjsKKyAgdW5zaWduZWQgbV9hbGlnbm1lbnQ7CiB9OwogCiBjbGFzcyBwYXJhbSA6 IHB1YmxpYyBsdmFsdWUKZGlmZiAtLWdpdCBhL2djYy9qaXQvbGliZ2Njaml0LmNjIGIvZ2NjL2pp dC9saWJnY2NqaXQuY2MKaW5kZXggNGMzNTJlOGM5M2QuLjBjNTkyZGFlZWU5IDEwMDY0NAotLS0g YS9nY2Mvaml0L2xpYmdjY2ppdC5jYworKysgYi9nY2Mvaml0L2xpYmdjY2ppdC5jYwpAQCAtMjY0 OSw2ICsyNjQ5LDMyIEBAIGdjY19qaXRfbHZhbHVlX3NldF9saW5rX3NlY3Rpb24gKGdjY19qaXRf bHZhbHVlICpsdmFsdWUsCiAgIGx2YWx1ZS0+c2V0X2xpbmtfc2VjdGlvbiAoc2VjdGlvbl9uYW1l KTsKIH0KIAorLyogUHVibGljIGVudHJ5cG9pbnQuICBTZWUgZGVzY3JpcHRpb24gaW4gbGliZ2Nj aml0LmguCisKKyAgIEFmdGVyIGVycm9yLWNoZWNraW5nLCB0aGUgcmVhbCB3b3JrIGlzIGRvbmUg YnkgdGhlCisgICBnY2M6OmppdDo6cmVjb3JkaW5nOjpsdmFsdWU6OmdldF9hbGlnbm1lbnQgbWV0 aG9kIGluIGppdC1yZWNvcmRpbmcuY2MuICAqLworCit1bnNpZ25lZAorZ2NjX2ppdF9sdmFsdWVf Z2V0X2FsaWdubWVudCAoZ2NjX2ppdF9sdmFsdWUgKmx2YWx1ZSkKK3sKKyAgUkVUVVJOX1ZBTF9J Rl9GQUlMIChsdmFsdWUsIDAsIE5VTEwsIE5VTEwsICJOVUxMIGx2YWx1ZSIpOworICByZXR1cm4g bHZhbHVlLT5nZXRfYWxpZ25tZW50ICgpOworfQorCisvKiBQdWJsaWMgZW50cnlwb2ludC4gIFNl ZSBkZXNjcmlwdGlvbiBpbiBsaWJnY2NqaXQuaC4KKworICAgQWZ0ZXIgZXJyb3ItY2hlY2tpbmcs IHRoZSByZWFsIHdvcmsgaXMgZG9uZSBieSB0aGUKKyAgIGdjYzo6aml0OjpyZWNvcmRpbmc6Omx2 YWx1ZTo6c2V0X2FsaWdubWVudCBtZXRob2QgaW4gaml0LXJlY29yZGluZy5jYy4gICovCisKK3Zv aWQKK2djY19qaXRfbHZhbHVlX3NldF9hbGlnbm1lbnQgKGdjY19qaXRfbHZhbHVlICpsdmFsdWUs CisJCQkgICAgICB1bnNpZ25lZCBieXRlcykKK3sKKyAgUkVUVVJOX0lGX0ZBSUwgKGx2YWx1ZSwg TlVMTCwgTlVMTCwgIk5VTEwgbHZhbHVlIik7CisgIFJFVFVSTl9JRl9GQUlMICgoYnl0ZXMgJiAo Ynl0ZXMgLSAxKSkgPT0gMCwgTlVMTCwgTlVMTCwgImFsaWduZW1lbnQgaXMgbm90IGEgcG93ZXIg b2YgMiIpOworICBsdmFsdWUtPnNldF9hbGlnbm1lbnQgKGJ5dGVzKTsKK30KKwogLyogUHVibGlj IGVudHJ5cG9pbnQuICBTZWUgZGVzY3JpcHRpb24gaW4gbGliZ2Njaml0LmguCiAKICAgIEFmdGVy IGVycm9yLWNoZWNraW5nLCB0aGUgcmVhbCB3b3JrIGlzIGRvbmUgYnkgdGhlCmRpZmYgLS1naXQg YS9nY2Mvaml0L2xpYmdjY2ppdC5oIGIvZ2NjL2ppdC9saWJnY2NqaXQuaAppbmRleCAyYTVmZmFj YjFmZS4uMjYzYjk4NzI4YjAgMTAwNjQ0Ci0tLSBhL2djYy9qaXQvbGliZ2Njaml0LmgKKysrIGIv Z2NjL2ppdC9saWJnY2NqaXQuaApAQCAtMTI3Nyw2ICsxMjc3LDI1IEBAIGV4dGVybiB2b2lkCiBn Y2Nfaml0X2x2YWx1ZV9zZXRfbGlua19zZWN0aW9uIChnY2Nfaml0X2x2YWx1ZSAqbHZhbHVlLAog CQkJICAgIGNvbnN0IGNoYXIgKnNlY3Rpb25fbmFtZSk7CiAKKyNkZWZpbmUgTElCR0NDSklUX0hB VkVfQUxJR05NRU5UCisKKy8qIFNldCB0aGUgYWxpZ25tZW50IG9mIGEgdmFyaWFibGUuCisKKyAg IFRoaXMgQVBJIGVudHJ5cG9pbnQgd2FzIGFkZGVkIGluIExJQkdDQ0pJVF9BQklfMjQ7IHlvdSBj YW4gdGVzdCBmb3IgaXRzCisgICBwcmVzZW5jZSB1c2luZworICAgICAjaWZkZWYgTElCR0NDSklU X0hBVkVfQUxJR05NRU5UICAqLworZXh0ZXJuIHZvaWQKK2djY19qaXRfbHZhbHVlX3NldF9hbGln bm1lbnQgKGdjY19qaXRfbHZhbHVlICpsdmFsdWUsCisJCQkgICAgICB1bnNpZ25lZCBieXRlcyk7 CisKKy8qIEdldCB0aGUgYWxpZ25tZW50IG9mIGEgdmFyaWFibGUuCisKKyAgIFRoaXMgQVBJIGVu dHJ5cG9pbnQgd2FzIGFkZGVkIGluIExJQkdDQ0pJVF9BQklfMjQ7IHlvdSBjYW4gdGVzdCBmb3Ig aXRzCisgICBwcmVzZW5jZSB1c2luZworICAgICAjaWZkZWYgTElCR0NDSklUX0hBVkVfQUxJR05N RU5UICAqLworZXh0ZXJuIHVuc2lnbmVkCitnY2Nfaml0X2x2YWx1ZV9nZXRfYWxpZ25tZW50IChn Y2Nfaml0X2x2YWx1ZSAqbHZhbHVlKTsKKwogZXh0ZXJuIGdjY19qaXRfbHZhbHVlICoKIGdjY19q aXRfZnVuY3Rpb25fbmV3X2xvY2FsIChnY2Nfaml0X2Z1bmN0aW9uICpmdW5jLAogCQkJICAgIGdj Y19qaXRfbG9jYXRpb24gKmxvYywKZGlmZiAtLWdpdCBhL2djYy9qaXQvbGliZ2Njaml0Lm1hcCBi L2djYy9qaXQvbGliZ2Njaml0Lm1hcAppbmRleCBmMzczZmQzOWFjNy4uZGY1MWU0ZmRkOGMgMTAw NjQ0Ci0tLSBhL2djYy9qaXQvbGliZ2Njaml0Lm1hcAorKysgYi9nY2Mvaml0L2xpYmdjY2ppdC5t YXAKQEAgLTI0MywzICsyNDMsMjEgQEAgTElCR0NDSklUX0FCSV8xOSB7CiAgICAgZ2NjX2ppdF9j b250ZXh0X25ld191bmlvbl9jb25zdHJ1Y3RvcjsKICAgICBnY2Nfaml0X2dsb2JhbF9zZXRfaW5p dGlhbGl6ZXJfcnZhbHVlOwogfSBMSUJHQ0NKSVRfQUJJXzE4OworCitMSUJHQ0NKSVRfQUJJXzIw IHsKK30gTElCR0NDSklUX0FCSV8xOTsKKworTElCR0NDSklUX0FCSV8yMSB7Cit9IExJQkdDQ0pJ VF9BQklfMjA7CisKK0xJQkdDQ0pJVF9BQklfMjIgeworfSBMSUJHQ0NKSVRfQUJJXzIxOworCitM SUJHQ0NKSVRfQUJJXzIzIHsKK30gTElCR0NDSklUX0FCSV8yMjsKKworTElCR0NDSklUX0FCSV8y NCB7CisgIGdsb2JhbDoKKyAgICBnY2Nfaml0X2x2YWx1ZV9zZXRfYWxpZ25tZW50OworICAgIGdj Y19qaXRfbHZhbHVlX2dldF9hbGlnbm1lbnQ7Cit9IExJQkdDQ0pJVF9BQklfMjM7CmRpZmYgLS1n aXQgYS9nY2MvdGVzdHN1aXRlL2ppdC5kZy9hbGwtbm9uLWZhaWxpbmctdGVzdHMuaCBiL2djYy90 ZXN0c3VpdGUvaml0LmRnL2FsbC1ub24tZmFpbGluZy10ZXN0cy5oCmluZGV4IDI5YWZlMDY0ZGI2 Li43MmM0NmU4MWU1MSAxMDA2NDQKLS0tIGEvZ2NjL3Rlc3RzdWl0ZS9qaXQuZGcvYWxsLW5vbi1m YWlsaW5nLXRlc3RzLmgKKysrIGIvZ2NjL3Rlc3RzdWl0ZS9qaXQuZGcvYWxsLW5vbi1mYWlsaW5n LXRlc3RzLmgKQEAgLTMwNiw2ICszMDYsOSBAQAogI3VuZGVmIGNyZWF0ZV9jb2RlCiAjdW5kZWYg dmVyaWZ5X2NvZGUKIAorLyogdGVzdC1zZXR0aW5nLWFsaWdubWVudC5jOiBUaGlzIGNhbid0IGJl IGluIHRoZSB0ZXN0Y2FzZXMgYXJyYXkgYXMgaXQKKyAgIGRvZXNuJ3QgaGF2ZSBhIHZlcmlmeV9j b2RlIGltcGxlbWVudGF0aW9uLiAgKi8KKwogLyogdGVzdC1zdHJpbmctbGl0ZXJhbC5jICovCiAj ZGVmaW5lIGNyZWF0ZV9jb2RlIGNyZWF0ZV9jb2RlX3N0cmluZ19saXRlcmFsCiAjZGVmaW5lIHZl cmlmeV9jb2RlIHZlcmlmeV9jb2RlX3N0cmluZ19saXRlcmFsCmRpZmYgLS1naXQgYS9nY2MvdGVz dHN1aXRlL2ppdC5kZy90ZXN0LXNldHRpbmctYWxpZ25tZW50LmMgYi9nY2MvdGVzdHN1aXRlL2pp dC5kZy90ZXN0LXNldHRpbmctYWxpZ25tZW50LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXgg MDAwMDAwMDAwMDAuLjg0ODlkZjljNmI5Ci0tLSAvZGV2L251bGwKKysrIGIvZ2NjL3Rlc3RzdWl0 ZS9qaXQuZGcvdGVzdC1zZXR0aW5nLWFsaWdubWVudC5jCkBAIC0wLDAgKzEsNjYgQEAKKy8qIHsg ZGctZG8gY29tcGlsZSB7IHRhcmdldCB4ODZfNjQtKi0qIH0gfSAqLworCisjaW5jbHVkZSA8c3Rk bGliLmg+CisjaW5jbHVkZSA8c3RkaW8uaD4KKworI2luY2x1ZGUgImxpYmdjY2ppdC5oIgorCisv KiBXZSBkb24ndCB3YW50IHNldF9vcHRpb25zKCkgaW4gaGFybmVzcy5oIHRvIHNldCAtTzMgc28g b3VyIGxpdHRsZSBsb2NhbAorICAgaXMgb3B0aW1pemVkIGF3YXkuICovCisjZGVmaW5lIFRFU1Rf RVNDSEVXU19TRVRfT1BUSU9OUworc3RhdGljIHZvaWQgc2V0X29wdGlvbnMgKGdjY19qaXRfY29u dGV4dCAqY3R4dCwgY29uc3QgY2hhciAqYXJndjApCit7Cit9CisKKyNkZWZpbmUgVEVTVF9DT01Q SUxJTkdfVE9fRklMRQorI2RlZmluZSBPVVRQVVRfS0lORCAgICAgIEdDQ19KSVRfT1VUUFVUX0tJ TkRfQVNTRU1CTEVSCisjZGVmaW5lIE9VVFBVVF9GSUxFTkFNRSAgIm91dHB1dC1vZi10ZXN0LXNl dHRpbmctYWxpZ25tZW50LmMucyIKKyNpbmNsdWRlICJoYXJuZXNzLmgiCisKK3ZvaWQKK2NyZWF0 ZV9jb2RlIChnY2Nfaml0X2NvbnRleHQgKmN0eHQsIHZvaWQgKnVzZXJfZGF0YSkKK3sKKyAgLyog TGV0J3MgdHJ5IHRvIGluamVjdCB0aGUgZXF1aXZhbGVudCBvZjoKKyAgICAgaW50IGZvbyBfX2F0 dHJpYnV0ZV9fKChhbGlnbmVkICg4KSkpOworCisgICAgIGludCBtYWluICh2b2lkKSB7CisgICAg ICAgIGludCBiYXIgX19hdHRyaWJ1dGVfXygoYWxpZ25lZCAoMTYpKSk7CisgICAgIH0KKyAgKi8K KyAgZ2NjX2ppdF90eXBlICppbnRfdHlwZSA9CisgICAgZ2NjX2ppdF9jb250ZXh0X2dldF90eXBl IChjdHh0LCBHQ0NfSklUX1RZUEVfSU5UKTsKKyAgZ2NjX2ppdF9sdmFsdWUgKmZvbyA9CisgICAg Z2NjX2ppdF9jb250ZXh0X25ld19nbG9iYWwgKAorICAgICAgY3R4dCwgTlVMTCwgR0NDX0pJVF9H TE9CQUxfRVhQT1JURUQsIGludF90eXBlLCAiZm9vIik7CisgIGdjY19qaXRfbHZhbHVlX3NldF9h bGlnbm1lbnQoZm9vLCA4KTsKKworICBnY2Nfaml0X2ZpZWxkICpmaWVsZCA9IGdjY19qaXRfY29u dGV4dF9uZXdfZmllbGQgKGN0eHQsCisgICAgTlVMTCwKKyAgICBpbnRfdHlwZSwKKyAgICAiYSIp OworICBnY2Nfaml0X3N0cnVjdCAqc3RydWN0X3R5cGUgPQorICAgIGdjY19qaXRfY29udGV4dF9u ZXdfc3RydWN0X3R5cGUoY3R4dCwgTlVMTCwgIlR5cGUiLCAxLCAmZmllbGQpOworICBnY2Nfaml0 X2Z1bmN0aW9uICpmdW5jX21haW4gPQorICAgIGdjY19qaXRfY29udGV4dF9uZXdfZnVuY3Rpb24g KGN0eHQsIE5VTEwsCisJCQkJICBHQ0NfSklUX0ZVTkNUSU9OX0VYUE9SVEVELAorCQkJCSAgaW50 X3R5cGUsCisJCQkJICAibWFpbiIsCisJCQkJICAwLCBOVUxMLAorCQkJCSAgMCk7CisgIGdjY19q aXRfbHZhbHVlICpiYXIgPQorICAgIGdjY19qaXRfZnVuY3Rpb25fbmV3X2xvY2FsICgKKyAgICAg IGZ1bmNfbWFpbiwgTlVMTCwKKyAgICAgIGdjY19qaXRfc3RydWN0X2FzX3R5cGUgKHN0cnVjdF90 eXBlKSwKKyAgICAgICJiYXIiKTsKKyAgQ0hFQ0tfVkFMVUUgKGdjY19qaXRfbHZhbHVlX2dldF9h bGlnbm1lbnQgKGJhciksIDApOworICBnY2Nfaml0X2x2YWx1ZV9zZXRfYWxpZ25tZW50IChiYXIs IDE2KTsKKyAgQ0hFQ0tfVkFMVUUgKGdjY19qaXRfbHZhbHVlX2dldF9hbGlnbm1lbnQgKGJhciks IDE2KTsKKyAgZ2NjX2ppdF9ibG9jayAqYmxvY2sgPSBnY2Nfaml0X2Z1bmN0aW9uX25ld19ibG9j ayAoZnVuY19tYWluLCBOVUxMKTsKKyAgZ2NjX2ppdF9ydmFsdWUgKnJldHVybl92YWx1ZSA9Cisg ICAgICBnY2Nfaml0X2x2YWx1ZV9hc19ydmFsdWUgKGdjY19qaXRfbHZhbHVlX2FjY2Vzc19maWVs ZCAoYmFyLCBOVUxMLCBmaWVsZCkpOworICBnY2Nfaml0X2Jsb2NrX2VuZF93aXRoX3JldHVybiAo YmxvY2ssIE5VTEwsIHJldHVybl92YWx1ZSk7Cit9CisKKy8qIHsgZGctZmluYWwgeyBqaXQtdmVy aWZ5LW91dHB1dC1maWxlLXdhcy1jcmVhdGVkICIiIH0gfSAqLworLyogeyBkZy1maW5hbCB7IGpp dC12ZXJpZnktYXNzZW1ibGVyLW91dHB1dCAiLmNvbW0JZm9vLDQsOCIgfSB9ICovCisvKiB7IGRn LWZpbmFsIHsgaml0LXZlcmlmeS1hc3NlbWJsZXItb3V0cHV0ICJtb3ZsCS0xNlxcXCglcmJwXFxc KSwgJWVheCIgfSB9ICovCi0tIAoyLjI2LjIuNy5nMTlkYjljZmI2OC5kaXJ0eQoK --=-Lox0ipxD7xan406mk4S3--