Received: from malur.postgresql.org ([217.196.149.56]) by arkaria.postgresql.org with esmtps (TLS1.3) tls TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384 (Exim 4.96) (envelope-from ) id 1weCFo-004dFL-00 for pgsql-hackers@arkaria.postgresql.org; Mon, 29 Jun 2026 13:42:28 +0000 Received: from localhost ([127.0.0.1] helo=malur.postgresql.org) by malur.postgresql.org with esmtp (Exim 4.96) (envelope-from ) id 1weCFl-003N2Q-2F for pgsql-hackers@arkaria.postgresql.org; Mon, 29 Jun 2026 13:42:25 +0000 Received: from magus.postgresql.org ([2a02:c0:301:0:ffff::29]) by malur.postgresql.org with esmtps (TLS1.3) tls TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384 (Exim 4.96) (envelope-from ) id 1weCFl-003N2H-0v for pgsql-hackers@lists.postgresql.org; Mon, 29 Jun 2026 13:42:25 +0000 Received: from mail-ed1-x534.google.com ([2a00:1450:4864:20::534]) by magus.postgresql.org with esmtps (TLS1.3) tls TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256 (Exim 4.98.2) (envelope-from ) id 1weCFh-00000000nHo-49fb for pgsql-hackers@lists.postgresql.org; Mon, 29 Jun 2026 13:42:24 +0000 Received: by mail-ed1-x534.google.com with SMTP id 4fb4d7f45d1cf-6983f20a8bfso4473170a12.1 for ; Mon, 29 Jun 2026 06:42:21 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1782740540; cv=none; d=google.com; s=arc-20260327; b=NmqHlz3chLr6nplNfV2yXFaqFc2l+icfd/17fHmtqWt3rL0IHTTpv6G6g2br+wmLW6 Hkmo18Xdx29X8tZdvimKgIYeSxVQF4jUjZY9v/N+oNr7NwMgTF+jkp914+KutvMiziM5 j1YfGsIuUAdXl9ZX/Slhzjhi1178BZUuvwHoDw91cIPa5ww3s1/Zrq5qtsf8MMPOS0/e dGf/U8Ojnrj7lDH4DHea48/YQtAR8oco+4tE+W+VoevUYyRLQ3JCvjW/fPZbkYNYaz6H QtCEnfWx2pZjNm5DMwxiHWpx48QEi5Vkysf2dE6L9yTC8hu9O4uAhKBENEb7wZFewFiN Nr3w== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20260327; h=cc:to:subject:message-id:date:from:in-reply-to:references :mime-version:dkim-signature; bh=9EOK+HJOV7rGzDaQXRKlEKT4FnMO/lbXlMK56rFCBt0=; fh=fDIs+o2eXbNiIo93Mzm29JuUOCmHDRwDohoi7xnxuvs=; b=YKOt19M2blfMzB+L4xUn+d7Jb95/mhrnYc4Uz58QxbDQipLJ95JL1z51IesI4FhUyb cgx2N/10wdWko2Dpp+728Z7gR/RTpe/oikSmk4A0eY5D/VpW/VJCiM3cEb5e19PQiH/6 wUhKAb8n3JiMy9F3hcxno8Iwg78OmKzjNAyipB7XGqFvuhnsPAZ+Z9JwV6vHwCI6S10q KpplZurB/M9BHHXoZQ9g6rACMxxo6eTgvVk0E/uqUeZbze1a/USIWBb9eBw4ss0TIvco rDtM2h42jT86R8uvykUA2FvjfK2hthaiYEew7zhIwiJWiVzv82wij0MgvRIFc1D4MgrY rftA==; darn=lists.postgresql.org ARC-Authentication-Results: i=1; mx.google.com; arc=none DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=enterprisedb.com; s=google; t=1782740540; x=1783345340; darn=lists.postgresql.org; h=cc:to:subject:message-id:date:from:in-reply-to:references :mime-version:from:to:cc:subject:date:message-id:reply-to; bh=9EOK+HJOV7rGzDaQXRKlEKT4FnMO/lbXlMK56rFCBt0=; b=eYyU10FJzdP+PcC5URsrJgf3o2nkCn9MhxBPyVvOUEA13LqpN/RK7ldbMw1Vsmcrya Ne4Xp8Yo5QlzFsrRoI3gB2+TeLLrjhyb/gQbuJ3GotjP954tv5R5wfIelzDqs4ILSDi+ UwvzJ9VTtmsD34ohyUY48fclLbHmW4qKxreL5aYi0Tlkno4iBneBrbFgwgvRR9LUX2wo qX4slptPHw+L8nU3Tz95ynYJAZLRvfXDUhbg3+cIq6CmuKmZ0vaztEgPRRiCws6Cf0p/ 18L/eZypClRhtqQYLasZ5J9rb5Ia5Y0VPJK/ZsTUO8kr0prkt+7ITp2oZG4/qoE+lqcR jzjQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1782740540; x=1783345340; h=cc:to:subject:message-id:date:from:in-reply-to:references :mime-version:x-gm-gg:x-gm-message-state:from:to:cc:subject:date :message-id:reply-to; bh=9EOK+HJOV7rGzDaQXRKlEKT4FnMO/lbXlMK56rFCBt0=; b=aDnUBm4uW1VrlDcFN9veXL0+nDQIPbf1bFqWXfIl37xdVx7kNMfcrfR05orLDYcqsM c8LVYfRpbqX89RipfzdkhCo9mz3ginAfEU7lTdL8+Rzga2aQTezXlozCFO5wz5FAZd5r GrbYk8IvGJji41jXt5XIgHJphOjxwhCUkTBLPs17KtPVXGbANE4jSeutrI+4Vt/0cxzl FNbPli+/CPpgytYFkEvTTsiQ+wYhOVuzgpWoqvXupZLE/6r5gJHGsTYrVD5YQrCJTrjF H1hIf68pcq/Ha1nRUtkK/hShmXhHvEaCAh07UnvGo4nyz+WH90X/cD4v5RQzVjZoDLsf L1Hg== X-Forwarded-Encrypted: i=1; AHgh+RpbracKuCYy+bCqU3pTS8cfPEe2ugjSd6TiMcwCHv3586shYfuYvzR44gfU6NNQMFPOLXkoBFQNDFfq3dGa@lists.postgresql.org X-Gm-Message-State: AOJu0YzfjevUwcGgwgSIx0etpPR2GCt0L+4AsrVXsXpjH68VzGSSa+4H +akyZ6f8C54kxkL+BOA6vvmplQhrLKnvSt8pIdGoFlA7vhC+QPvm4BM4+bV9/fssyM9CqAJc7Ow DDmZs1Jc90pgkx8XJTpbv2H3A+VKJkOAgtY1qDtnf X-Gm-Gg: AfdE7ckc7fz/OJVx2IbvqyWObwm9Wm1UyrmeD0Ml7/SABcMY+XJTbSsrA9ujfJEGoGH +4/yNjhi/KXGkr/89JWabZOvoSG1m2e7Xq/EP9Mce6f8LYGGkJttTNbrM7pwMCSZLxmtDRe0W7v cpmZpxKpjBGtzkYBv5L89B2eVmatclcWNseBzwT4J7zAn6U3rUJ8PEn7h6pS5Erel+j5ZX3Uaic JHtybDqpEztGNXfg3xf1Sf8h7TKUKALkiFpN4gQjRLmDvReWuYSpsx3dvhRH4l9uxwPAIwk5Zb6 SNPYWX+s X-Received: by 2002:a17:906:7c48:b0:bfa:f563:9294 with SMTP id a640c23a62f3a-c12813bb0a6mr26827866b.18.1782740540028; Mon, 29 Jun 2026 06:42:20 -0700 (PDT) MIME-Version: 1.0 References: <177997571870.313758.10720313850275742354.pgcf@coridan.postgresql.org> In-Reply-To: From: Akshay Joshi Date: Mon, 29 Jun 2026 19:12:06 +0530 X-Gm-Features: AVVi8CfxgQoL_bgSJU-3qFGfsRKsI0CvngamFdCqni8yCjkWVharhZlPndAsE5A Message-ID: Subject: Re: [PATCH] Add pg_get_policy_ddl() function to reconstruct CREATE POLICY statement To: solai v Cc: Ilmar Y , pgsql-hackers@lists.postgresql.org Content-Type: multipart/mixed; boundary="0000000000009dcbdf065564a08b" List-Id: List-Help: List-Subscribe: List-Post: List-Owner: List-Archive: Archived-At: Precedence: bulk --0000000000009dcbdf065564a08b Content-Type: multipart/alternative; boundary="0000000000009dcbde065564a089" --0000000000009dcbde065564a089 Content-Type: text/plain; charset="UTF-8" Content-Transfer-Encoding: quoted-printable Rebased *v13* patch is now ready for review and commit. On Mon, Jun 22, 2026 at 6:49=E2=80=AFPM Akshay Joshi wrote: > *Chao Li* found an issue in my other patch for *pg_get_table_ddl.* Specif= ically, > the existing pattern in pg_proc.dat for variadic-text functions (e.g., > jsonb_delete, json_extract_path) uses *_text* instead of *text* at the > variadic position in both proargtypes and proallargtypes, with provariadi= c > =3D> 'text'. This is the convention documented by the sanity check in > src/test/regress/sql/opr_sanity.sql. > > I realized the same issue was present in this patch as well, so I have > fixed it and added corresponding test cases. > > The v12 patch is now ready for review and commit. > > On Mon, Jun 22, 2026 at 6:34=E2=80=AFPM Akshay Joshi < > akshay.joshi@enterprisedb.com> wrote: > >> >> >> On Mon, Jun 8, 2026 at 6:10=E2=80=AFPM solai v wr= ote: >> >>> Hi all, >>> >>> >>> On Mon, Jun 8, 2026 at 5:32=E2=80=AFPM Japin Li w= rote: >>> > >>> > On Fri, 29 May 2026 at 12:20, Akshay Joshi < >>> akshay.joshi@enterprisedb.com> wrote: >>> > > Thanks for the reviews. >>> > > >>> > > My original patch (v9) was actually correct. After considering >>> Japin's review comment, I initially thought the extra >>> > > parentheses weren't necessary, but they are indeed required for >>> handling boolean values properly in non-pretty mode too, >>> > > so I kept them in USING (%s) / WITH CHECK (%s) for both modes. >>> > > >>> > >>> > My bad! I had not considered this situation. >>> > >>> > > `pg_get_expr()` only adds outer parentheses for composite >>> expressions (via the deparsers for `OpExpr`, `BoolExpr`, etc.). >>> > > For atomic top-level nodes like `Const`, `Var`, `current_user`, >>> `NULL`, etc. >>> > > For example: >>> > > >>> > > CREATE POLICY p ON t USING (true); >>> > > SELECT pg_get_policy_ddl('t', 'p'); -- previously: ... USING >>> true; (syntax error) >>> > > >>> > > This is exactly why `pg_dump` always wraps the expression >>> unconditionally; see `src/bin/pg_dump/pg_dump.c`:4473-4477: >>> > > >>> > > if (polinfo->polqual !=3D NULL) >>> > > appendPQExpBuffer(query, " USING (%s)", polinfo->polqual); >>> > > if (polinfo->polwithcheck !=3D NULL) >>> > > appendPQExpBuffer(query, " WITH CHECK (%s)", >>> polinfo->polwithcheck); >>> > > >>> > > I've also added a round-trip regression test with `USING (true)` / >>> `WITH CHECK (false)` that captures the generated DDL, >>> > > drops the policies, re-executes the DDL, and verifies the policies >>> are recreated. >>> > > >>> > > v11 Patch attached for review. >>> > > >>> > > On Thu, May 28, 2026 at 7:12=E2=80=AFPM Ilmar Y wrote: >>> > > >>> > > The following review has been posted through the commitfest >>> application: >>> > > make installcheck-world: not tested >>> > > Implements feature: tested, failed >>> > > Spec compliant: not tested >>> > > Documentation: not tested >>> > > >>> > > Hi, >>> > > >>> > > I looked at v10, focused on whether the generated CREATE POLICY >>> statement >>> > > can be executed again. >>> > > >>> > > The patch applies cleanly on current master at >>> > > 8a86aa313a714adc56c74e4b08793e4e6102b5ca. >>> > > >>> > > git diff --check reports no issues. >>> > > >>> > > I built with: >>> > > >>> > > ./configure --prefix=3D"$PWD/pg-install" --without-readline >>> --without-zlib --without-icu >>> > > make -s -j8 >>> > > make -s install >>> > > >>> > > make -C src/test/regress check TESTS=3Drowsecurity >>> > > >>> > > ended up running the full parallel_schedule in this makefile; all >>> 245 tests >>> > > passed, including rowsecurity. >>> > > >>> > > I found one correctness issue in the generated non-pretty DDL. Th= e >>> code >>> > > assumes that pg_get_expr_ext(..., false) already returns the >>> parentheses >>> > > required by CREATE POLICY syntax, but that is not true for simple >>> boolean >>> > > constants. >>> > > >>> > > For example: >>> > > >>> > > CREATE TABLE t(a int); >>> > > CREATE POLICY p_true ON t USING (true); >>> > > SELECT ddl FROM pg_get_policy_ddl('t', 'p_true', 'pretty', 'false'= ) >>> AS ddl; >>> > > >>> > > returns: >>> > > >>> > > CREATE POLICY p_true ON public.t USING true; >>> > > >>> > > If I drop the policy and execute that generated statement, it fail= s: >>> > > >>> > > ERROR: syntax error at or near "true" >>> > > LINE 1: CREATE POLICY p_true ON public.t USING true; >>> > > ^ >>> > > >>> > > The same issue reproduces for WITH CHECK: >>> > > >>> > > CREATE POLICY p_check ON t FOR INSERT WITH CHECK (false); >>> > > >>> > > is reconstructed as: >>> > > >>> > > CREATE POLICY p_check ON public.t FOR INSERT WITH CHECK false; >>> > > >>> > > and executing it fails at "false". >>> > > >>> > > So I think USING and WITH CHECK need to be parenthesized in >>> non-pretty mode >>> > > too, or the tests should include a round-trip execution check for >>> generated >>> > > DDL with simple boolean expressions. >>> > > >>> > > I used two small SQL reproducers for the manual checks; the >>> complete repro is >>> > > included above. >>> > > >>> > > I have not reviewed the broader pg_get_*_ddl API design or every >>> possible >>> > > policy expression form. >>> > > >>> > > Regards, >>> > > Ilmar Yunusov >>> > > >>> > > The new status of this patch is: Waiting on Author >>> > >>> >>> >>> I reviewed and tested the V11 pg_get_policy_ddl() patch. I verified >>> the basic functionality by creating various row-level security >>> policies and checking the reconstructed DDL returned by >>> pg_get_policy_ddl(). The function correctly reconstructed policies for >>> different command types (SELECT, INSERT, UPDATE, DELETE), PERMISSIVE >>> and RESTRICTIVE policies, multiple role lists, quoted identifiers, >>> USING clauses, and WITH CHECK clauses. >>> I also tested more complex cases involving subqueries. Policies >>> containing EXISTS subqueries in both USING and WITH CHECK clauses were >>> reconstructed successfully. Nested subqueries were also handled >>> correctly, and I did not encounter any issues related to expression >>> reconstruction or variable handling. I verified NULL input handling as >>> well. Passing NULL values for the table name or policy name returned >>> no rows as expected. Invalid relation names resulted in the expected >>> regclass resolution error. One observation from testing is that the >>> generated DDL omits default clauses such as FOR ALL and TO PUBLIC. For >>> example, a policy created with FOR ALL TO PUBLIC is reconstructed >>> without those clauses, while still producing semantically equivalent >>> DDL. I'm not sure whether this is intentional or if the function is >>> expected to reproduce all clauses explicitly, but it may be worth >>> discussing. >>> Overall, the patch worked as expected in all scenarios I tested, and I >>> did not find any functional issues. >>> >> >> Thanks for the review. The omission of FOR ALL and TO PUBLIC is >> intentional and matches the long-standing convention used by >> pg_get_indexdef, pg_get_constraintdef, pg_get_viewdef, etc.: emit a clau= se >> only when it differs from the parser's default. The result is semantical= ly >> equivalent to the CREATE POLICY DDL. >> >>> >>> >>> Regards, >>> Solai >>> >> --0000000000009dcbde065564a089 Content-Type: text/html; charset="UTF-8" Content-Transfer-Encoding: quoted-printable
Rebased v13 patch is now ready for review and commi= t.

On Mon, Jun 22, 2026 at 6:49=E2=80=AFPM Akshay Josh= i <akshay.joshi@enterpr= isedb.com> wrote:
Chao Li found an issue in my other patch= for pg_get_table_ddl.=C2=A0Specifically, the existing pattern in pg= _proc.dat for variadic-text functions (e.g., jsonb_delete, json_extract_pat= h) uses _text=C2=A0instead of text at the variadic position i= n both proargtypes and proallargtypes, with provariadic =3D> 'text&#= 39;. This is the convention documented by the sanity check in src/test/regr= ess/sql/opr_sanity.sql.

I realized the same issue was present in thi= s patch as well, so I have fixed it and added corresponding test cases.
=
The v12 patch is now ready for review and commit.

On Mon, Jun 22, 2026= at 6:34=E2=80=AFPM Akshay Joshi <akshay.joshi@enterprisedb.com> wrote:
=


On Mon, Jun 8, 2026 at 6:10=E2=80=AFPM solai v <solai.cdac@gmail.com= > wrote:
= Hi all,


On Mon, Jun 8, 2026 at 5:32=E2=80=AFPM Japin Li <japinli@hotmail.com> wrote:
>
> On Fri, 29 May 2026 at 12:20, Akshay Joshi <akshay.joshi@enterprisedb.com> wrote:
> > Thanks for the reviews.
> >
> > My original patch (v9) was actually correct. After considering Ja= pin's review comment, I initially thought the extra
> > parentheses weren't necessary, but they are indeed required f= or handling boolean values properly in non-pretty mode too,
> > so I kept them in USING (%s) / WITH CHECK (%s) for both modes. > >
>
> My bad!=C2=A0 I had not considered this situation.
>
> > `pg_get_expr()` only adds outer parentheses for composite express= ions (via the deparsers for `OpExpr`, `BoolExpr`, etc.).
> > For atomic top-level nodes like `Const`, `Var`, `current_user`, `= NULL`, etc.
> > For example:
> >
> >=C2=A0 =C2=A0 =C2=A0CREATE POLICY p ON t USING (true);
> >=C2=A0 =C2=A0 =C2=A0SELECT pg_get_policy_ddl('t', 'p&#= 39;);=C2=A0 -- previously: ... USING true;=C2=A0 (syntax error)
> >
> > This is exactly why `pg_dump` always wraps the expression uncondi= tionally; see `src/bin/pg_dump/pg_dump.c`:4473-4477:
> >
> >=C2=A0 =C2=A0 =C2=A0if (polinfo->polqual !=3D NULL)
> >=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0appendPQExpBuffer(query, " = USING (%s)", polinfo->polqual);
> >=C2=A0 =C2=A0 =C2=A0if (polinfo->polwithcheck !=3D NULL)
> >=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0appendPQExpBuffer(query, " = WITH CHECK (%s)", polinfo->polwithcheck);
> >
> > I've also added a round-trip regression test with `USING (tru= e)` / `WITH CHECK (false)` that captures the generated DDL,
> > drops the policies, re-executes the DDL, and verifies the policie= s are recreated.
> >
> > v11 Patch attached for review.
> >
> > On Thu, May 28, 2026 at 7:12=E2=80=AFPM Ilmar Y <
tanswis42@gmail.com> wro= te:
> >
> >=C2=A0 The following review has been posted through the commitfest= application:
> >=C2=A0 make installcheck-world:=C2=A0 not tested
> >=C2=A0 Implements feature:=C2=A0 =C2=A0 =C2=A0 =C2=A0tested, faile= d
> >=C2=A0 Spec compliant:=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0not= tested
> >=C2=A0 Documentation:=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 not= tested
> >
> >=C2=A0 Hi,
> >
> >=C2=A0 I looked at v10, focused on whether the generated CREATE PO= LICY statement
> >=C2=A0 can be executed again.
> >
> >=C2=A0 The patch applies cleanly on current master at
> >=C2=A0 8a86aa313a714adc56c74e4b08793e4e6102b5ca.
> >
> >=C2=A0 git diff --check reports no issues.
> >
> >=C2=A0 I built with:
> >
> >=C2=A0 ./configure --prefix=3D"$PWD/pg-install" --withou= t-readline --without-zlib --without-icu
> >=C2=A0 make -s -j8
> >=C2=A0 make -s install
> >
> >=C2=A0 make -C src/test/regress check TESTS=3Drowsecurity
> >
> >=C2=A0 ended up running the full parallel_schedule in this makefil= e; all 245 tests
> >=C2=A0 passed, including rowsecurity.
> >
> >=C2=A0 I found one correctness issue in the generated non-pretty D= DL.=C2=A0 The code
> >=C2=A0 assumes that pg_get_expr_ext(..., false) already returns th= e parentheses
> >=C2=A0 required by CREATE POLICY syntax, but that is not true for = simple boolean
> >=C2=A0 constants.
> >
> >=C2=A0 For example:
> >
> >=C2=A0 CREATE TABLE t(a int);
> >=C2=A0 CREATE POLICY p_true ON t USING (true);
> >=C2=A0 SELECT ddl FROM pg_get_policy_ddl('t', 'p_true&= #39;, 'pretty', 'false') AS ddl;
> >
> >=C2=A0 returns:
> >
> >=C2=A0 CREATE POLICY p_true ON public.t USING true;
> >
> >=C2=A0 If I drop the policy and execute that generated statement, = it fails:
> >
> >=C2=A0 ERROR:=C2=A0 syntax error at or near "true"
> >=C2=A0 LINE 1: CREATE POLICY p_true ON public.t USING true;
> >=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 The same issue reproduces for WITH CHECK:
> >
> >=C2=A0 CREATE POLICY p_check ON t FOR INSERT WITH CHECK (false); > >
> >=C2=A0 is reconstructed as:
> >
> >=C2=A0 CREATE POLICY p_check ON public.t FOR INSERT WITH CHECK fal= se;
> >
> >=C2=A0 and executing it fails at "false".
> >
> >=C2=A0 So I think USING and WITH CHECK need to be parenthesized in= non-pretty mode
> >=C2=A0 too, or the tests should include a round-trip execution che= ck for generated
> >=C2=A0 DDL with simple boolean expressions.
> >
> >=C2=A0 I used two small SQL reproducers for the manual checks; the= complete repro is
> >=C2=A0 included above.
> >
> >=C2=A0 I have not reviewed the broader pg_get_*_ddl API design or = every possible
> >=C2=A0 policy expression form.
> >
> >=C2=A0 Regards,
> >=C2=A0 Ilmar Yunusov
> >
> >=C2=A0 The new status of this patch is: Waiting on Author
>


I reviewed and tested the V11 pg_get_policy_ddl() patch. I verified
the basic functionality by creating various row-level security
policies and checking the reconstructed DDL returned by
pg_get_policy_ddl(). The function correctly reconstructed policies for
different command types (SELECT, INSERT, UPDATE, DELETE), PERMISSIVE
and RESTRICTIVE policies, multiple role lists, quoted identifiers,
USING clauses, and WITH CHECK clauses.
I also tested more complex cases involving subqueries. Policies
containing EXISTS subqueries in both USING and WITH CHECK clauses were
reconstructed successfully. Nested subqueries were also handled
correctly, and I did not encounter any issues related to expression
reconstruction or variable handling. I verified NULL input handling as
well. Passing NULL values for the table name or policy name returned
no rows as expected. Invalid relation names resulted in the expected
regclass resolution error. One observation from testing is that the
generated DDL omits default clauses such as FOR ALL and TO PUBLIC. For
example, a policy created with FOR ALL TO PUBLIC is reconstructed
without those clauses, while still producing semantically equivalent
DDL. I'm not sure whether this is intentional or if the function is
expected to reproduce all clauses explicitly, but it may be worth
discussing.
Overall, the patch worked as expected in all scenarios I tested, and I
did not find any functional issues.

Thanks for the review. The omissi= on of FOR ALL and TO PUBLIC is intentional and matches the long-standing co= nvention used by pg_get_indexdef, pg_get_constraintdef, pg_get_viewdef, etc= .: emit a clause only when it differs from the parser's default. The re= sult is semantically equivalent to the CREATE POLICY DDL.=C2=A0


Regards,
Solai
--0000000000009dcbde065564a089-- --0000000000009dcbdf065564a08b Content-Type: application/octet-stream; name="v13-0001-Add-pg_get_policy_ddl-to-reconstruct-CREATE.patch" Content-Disposition: attachment; filename="v13-0001-Add-pg_get_policy_ddl-to-reconstruct-CREATE.patch" Content-Transfer-Encoding: base64 Content-ID: X-Attachment-Id: f_mqz9o2rf0 RnJvbSAyYmM4NDEwMDcwN2MxM2UwOWIyMTIyYWUwZGFlNTMxYmMzNDg3OTgyIE1vbiBTZXAgMTcg MDA6MDA6MDAgMjAwMQpGcm9tOiBBa3NoYXkgSm9zaGkgPGFrc2hheS5qb3NoaUBlbnRlcnByaXNl ZGIuY29tPgpEYXRlOiBGcmksIDIyIE1heSAyMDI2IDE4OjE4OjA3ICswNTMwClN1YmplY3Q6IFtQ QVRDSCB2MTNdIEFkZCBwZ19nZXRfcG9saWN5X2RkbCgpIHRvIHJlY29uc3RydWN0IENSRUFURSBQ T0xJQ1kKIHN0YXRlbWVudHMKClRoaXMgcGF0Y2ggaW50cm9kdWNlcyBhIG5ldyBzeXN0ZW0gZnVu Y3Rpb246CgogIHBnX2dldF9wb2xpY3lfZGRsKHRhYmxlIHJlZ2NsYXNzLAogICAgICAgICAgICAg ICAgICAgIHBvbGljeV9uYW1lIG5hbWUsCiAgICAgICAgICAgICAgICAgICAgVkFSSUFESUMgb3B0 aW9ucyB0ZXh0W10pCiAgUkVUVVJOUyBTRVRPRiB0ZXh0Cgp3aGljaCByZWNvbnN0cnVjdHMgdGhl IENSRUFURSBQT0xJQ1kgc3RhdGVtZW50IGZvciB0aGUgbmFtZWQgcm93LWxldmVsCnNlY3VyaXR5 IHBvbGljeSBvbiB0aGUgc3BlY2lmaWVkIHRhYmxlLiAgQWx0aG91Z2ggYSBzaW5nbGUgc3RhdGVt ZW50IGlzCnByb2R1Y2VkLCB0aGUgZnVuY3Rpb24gcmV0dXJucyBhIFNFVE9GIHRleHQgcmVzdWx0 IHNvIGl0cyBjYWxsaW5nCmNvbnZlbnRpb24gbWF0Y2hlcyB0aGUgcmVzdCBvZiB0aGUgcGdfZ2V0 XypfZGRsIGZhbWlseS4KClRoZSByZWNvbnN0cnVjdGVkIERETCBpbmNsdWRlcyB0aGUgcG9saWN5 J3MgcGVybWlzc2l2ZW5lc3MgKEFTClJFU1RSSUNUSVZFKSwgY29tbWFuZCAoRk9SIFNFTEVDVC9J TlNFUlQvVVBEQVRFL0RFTEVURSksIHJvbGUgbGlzdCAoVE8KPHJvbGVzPiksIFVTSU5HIHF1YWxp ZmljYXRpb24sIGFuZCBXSVRIIENIRUNLIGV4cHJlc3Npb24uICBDbGF1c2VzCndob3NlIHZhbHVl IGVxdWFscyB0aGUgcGFyc2VyJ3MgZGVmYXVsdCAtLSBQRVJNSVNTSVZFLCBGT1IgQUxMLCBhbmQK VE8gUFVCTElDIC0tIGFyZSBvbWl0dGVkIGZyb20gdGhlIG91dHB1dCwgbWF0Y2hpbmcgdGhlIGNv bnZlbnRpb24gdXNlZApieSBwZ19nZXRfaW5kZXhkZWYsIHBnX2dldF9jb25zdHJhaW50ZGVmLCBw Z19nZXRfdmlld2RlZiwgYW5kIHNpbWlsYXIKZnVuY3Rpb25zLiAgVGhlIHJlc3VsdCBpcyB0aGVy ZWZvcmUgc2VtYW50aWNhbGx5IGVxdWl2YWxlbnQgdG8gdGhlCm9yaWdpbmFsIERETCwgbm90IGxl eGljYWxseSBpZGVudGljYWwuCgpPcHRpb25zIGFyZSBwYXNzZWQgYXMgYWx0ZXJuYXRpbmcgbmFt ZS92YWx1ZSB0ZXh0IHBhaXJzIHZpYSB0aGUKVkFSSUFESUMgYXJndW1lbnQ7IHRoZSBzdXBwb3J0 ZWQgb3B0aW9uIGlzOgoKICBwcmV0dHkgKGJvb2xlYW4pIC0tIGZvcm1hdCB0aGUgb3V0cHV0IGZv ciByZWFkYWJpbGl0eS4KCk5VTEwgaW5wdXRzIGZvciB0aGUgdGFibGUgb3IgcG9saWN5IG5hbWUg eWllbGQgbm8gcm93cy4gIEFuIGludmFsaWQKcmVsYXRpb24gbmFtZSBzdXJmYWNlcyB0aGUgcmVn Y2xhc3MgcmVzb2x1dGlvbiBlcnJvcjsgYSBub24tZXhpc3RlbnQKcG9saWN5IHJhaXNlcyBhbiBl eHBsaWNpdCAicG9saWN5IC4uLiBkb2VzIG5vdCBleGlzdCIgZXJyb3IuICBPcHRpb24KcGFyc2lu ZyByZWplY3RzIHVucmVjb2duaXplZCBuYW1lcywgaW52YWxpZCBib29sZWFuIHZhbHVlcywgZHVw bGljYXRlCm9wdGlvbnMsIGFuZCBhbiBvZGQgbnVtYmVyIG9mIHZhcmlhZGljIGFyZ3VtZW50cy4K ClVzYWdlIGV4YW1wbGVzOgoKICAtLSBjb21wYWN0IGZvcm0gKGRlZmF1bHQpCiAgU0VMRUNUICog RlJPTSBwZ19nZXRfcG9saWN5X2RkbCgncmxzX3RhYmxlJywgJ3BvbDEnKTsKICBTRUxFQ1QgKiBG Uk9NIHBnX2dldF9wb2xpY3lfZGRsKDE2NTY0LCAncG9sMScpOwoKICAtLSBwcmV0dHktcHJpbnRl ZCBmb3JtCiAgU0VMRUNUICogRlJPTSBwZ19nZXRfcG9saWN5X2RkbCgncmxzX3RhYmxlJywgJ3Bv bDEnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3ByZXR0eScsICd0cnVlJyk7 CgogIC0tIG9wdGlvbnMgc3VwcGxpZWQgYXMgYSBjb25zdHJ1Y3RlZCBhcnJheQogIFNFTEVDVCAq IEZST00gcGdfZ2V0X3BvbGljeV9kZGwoJ3Jsc190YWJsZScsICdwb2wxJywKICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgIFZBUklBRElDIEFSUkFZWydwcmV0dHknLCd0cnVlJ10pOwoK UmVncmVzc2lvbiBjb3ZlcmFnZSBpcyBhZGRlZCB0byBzcmMvdGVzdC9yZWdyZXNzL3NxbC9yb3dz ZWN1cml0eS5zcWwKYW5kIGV4ZXJjaXNlcyBQRVJNSVNTSVZFL1JFU1RSSUNUSVZFIHBvbGljaWVz LCBhbGwgRk9SIGNvbW1hbmQKdmFyaWFudHMsIG11bHRpLXJvbGUgVE8gbGlzdHMsIHN1YnF1ZXJ5 IGV4cHJlc3Npb25zIGluIFVTSU5HIGFuZApXSVRIIENIRUNLLCBwcmV0dHkgYW5kIG5vbi1wcmV0 dHkgb3V0cHV0LCBOVUxMIGFuZCBlcnJvciBwYXRocywgdGhlClZBUklBRElDIEFSUkFZWy4uLl0g Y2FsbCBzeW50YXgsIGFuZCBhIHJvdW5kLXRyaXAgdGVzdCB0aGF0IGRyb3BzCmFuZCByZS1leGVj dXRlcyB0aGUgZ2VuZXJhdGVkIERETC4KCkF1dGhvcjogQWtzaGF5IEpvc2hpIDxha3NoYXkuam9z aGlAZW50ZXJwcmlzZWRiLmNvbT4KLS0tCiBkb2Mvc3JjL3NnbWwvZnVuYy9mdW5jLWluZm8uc2dt bCAgICAgICAgICB8ICAyMCArKwogc3JjL2JhY2tlbmQvdXRpbHMvYWR0L2RkbHV0aWxzLmMgICAg ICAgICAgfCAyNjIgKysrKysrKysrKysrKysrKysrKysrCiBzcmMvaW5jbHVkZS9jYXRhbG9nL3Bn X3Byb2MuZGF0ICAgICAgICAgICB8ICAgOCArCiBzcmMvdGVzdC9yZWdyZXNzL2V4cGVjdGVkL3Jv d3NlY3VyaXR5Lm91dCB8IDI3MSArKysrKysrKysrKysrKysrKysrKysrCiBzcmMvdGVzdC9yZWdy ZXNzL3NxbC9yb3dzZWN1cml0eS5zcWwgICAgICB8IDEyNiArKysrKysrKysrCiA1IGZpbGVzIGNo YW5nZWQsIDY4NyBpbnNlcnRpb25zKCspCgpkaWZmIC0tZ2l0IGEvZG9jL3NyYy9zZ21sL2Z1bmMv ZnVuYy1pbmZvLnNnbWwgYi9kb2Mvc3JjL3NnbWwvZnVuYy9mdW5jLWluZm8uc2dtbAppbmRleCA2 OWVmMzg1N2NmYS4uZWRhOTRkOGJlNTggMTAwNjQ0Ci0tLSBhL2RvYy9zcmMvc2dtbC9mdW5jL2Z1 bmMtaW5mby5zZ21sCisrKyBiL2RvYy9zcmMvc2dtbC9mdW5jL2Z1bmMtaW5mby5zZ21sCkBAIC0z OTYwLDYgKzM5NjAsMjYgQEAgYWNsICAgICAgfCB7cG9zdGdyZXM9YXJ3ZER4dG0vcG9zdGdyZXMs Zm9vPXIvcG9zdGdyZXN9CiAgICAgICAgIGlzIGZhbHNlLCB0aGUgPGxpdGVyYWw+T1dORVI8L2xp dGVyYWw+IGNsYXVzZSBpcyBvbWl0dGVkLgogICAgICAgIDwvcGFyYT48L2VudHJ5PgogICAgICAg PC9yb3c+CisgICAgICA8cm93PgorICAgICAgIDxlbnRyeSByb2xlPSJmdW5jX3RhYmxlX2VudHJ5 Ij48cGFyYSByb2xlPSJmdW5jX3NpZ25hdHVyZSI+CisgICAgICAgIDxpbmRleHRlcm0+CisgICAg ICAgICA8cHJpbWFyeT5wZ19nZXRfcG9saWN5X2RkbDwvcHJpbWFyeT4KKyAgICAgICAgPC9pbmRl eHRlcm0+CisgICAgICAgIDxmdW5jdGlvbj5wZ19nZXRfcG9saWN5X2RkbDwvZnVuY3Rpb24+Cisg ICAgICAgICggPHBhcmFtZXRlcj50YWJsZTwvcGFyYW1ldGVyPiA8dHlwZT5yZWdjbGFzczwvdHlw ZT4sCisgICAgICAgIDxwYXJhbWV0ZXI+cG9saWN5X25hbWU8L3BhcmFtZXRlcj4gPHR5cGU+bmFt ZTwvdHlwZT4KKyAgICAgICAgPG9wdGlvbmFsPiwgPGxpdGVyYWw+VkFSSUFESUM8L2xpdGVyYWw+ IDxwYXJhbWV0ZXI+b3B0aW9uczwvcGFyYW1ldGVyPgorICAgICAgICA8dHlwZT50ZXh0PC90eXBl PiA8L29wdGlvbmFsPiApCisgICAgICAgIDxyZXR1cm52YWx1ZT5zZXRvZiB0ZXh0PC9yZXR1cm52 YWx1ZT4KKyAgICAgICA8L3BhcmE+CisgICAgICAgPHBhcmE+CisgICAgICAgIFJlY29uc3RydWN0 cyB0aGUgPGNvbW1hbmQ+Q1JFQVRFIFBPTElDWTwvY29tbWFuZD4gc3RhdGVtZW50IGZvciB0aGUK KyAgICAgICAgbmFtZWQgcm93LWxldmVsIHNlY3VyaXR5IHBvbGljeSBvbiB0aGUgc3BlY2lmaWVk IHRhYmxlLiAgVGhlIHJlc3VsdAorICAgICAgICBpcyByZXR1cm5lZCBhcyBhIHNpbmdsZSByb3cu CisgICAgICAgIFRoZSBmb2xsb3dpbmcgb3B0aW9uIGlzIHN1cHBvcnRlZDogPGxpdGVyYWw+cHJl dHR5PC9saXRlcmFsPgorICAgICAgICAoYm9vbGVhbikgZm9yIGZvcm1hdHRlZCBvdXRwdXQuCisg ICAgICAgPC9wYXJhPjwvZW50cnk+CisgICAgICA8L3Jvdz4KICAgICAgPC90Ym9keT4KICAgICA8 L3Rncm91cD4KICAgIDwvdGFibGU+CmRpZmYgLS1naXQgYS9zcmMvYmFja2VuZC91dGlscy9hZHQv ZGRsdXRpbHMuYyBiL3NyYy9iYWNrZW5kL3V0aWxzL2FkdC9kZGx1dGlscy5jCmluZGV4IGE3MGYx YzI4NjU1Li42NzMyMjI2YzZiZCAxMDA2NDQKLS0tIGEvc3JjL2JhY2tlbmQvdXRpbHMvYWR0L2Rk bHV0aWxzLmMKKysrIGIvc3JjL2JhY2tlbmQvdXRpbHMvYWR0L2RkbHV0aWxzLmMKQEAgLTI2LDYg KzI2LDcgQEAKICNpbmNsdWRlICJjYXRhbG9nL3BnX2NvbGxhdGlvbi5oIgogI2luY2x1ZGUgImNh dGFsb2cvcGdfZGF0YWJhc2UuaCIKICNpbmNsdWRlICJjYXRhbG9nL3BnX2RiX3JvbGVfc2V0dGlu Zy5oIgorI2luY2x1ZGUgImNhdGFsb2cvcGdfcG9saWN5LmgiCiAjaW5jbHVkZSAiY2F0YWxvZy9w Z190YWJsZXNwYWNlLmgiCiAjaW5jbHVkZSAiY29tbWFuZHMvdGFibGVzcGFjZS5oIgogI2luY2x1 ZGUgImNvbW1vbi9yZWxwYXRoLmgiCkBAIC01Niw2ICs1Nyw5IEBAIHN0YXRpYyBMaXN0ICpwZ19n ZXRfdGFibGVzcGFjZV9kZGxfaW50ZXJuYWwoT2lkIHRzaWQsIGJvb2wgcHJldHR5LCBib29sIG5v X293bmVyCiBzdGF0aWMgRGF0dW0gcGdfZ2V0X3RhYmxlc3BhY2VfZGRsX3NyZihGdW5jdGlvbkNh bGxJbmZvIGZjaW5mbywgT2lkIHRzaWQpOwogc3RhdGljIExpc3QgKnBnX2dldF9kYXRhYmFzZV9k ZGxfaW50ZXJuYWwoT2lkIGRiaWQsIGJvb2wgcHJldHR5LAogCQkJCQkJCQkJCSAgYm9vbCBub19v d25lciwgYm9vbCBub190YWJsZXNwYWNlKTsKK3N0YXRpYyBMaXN0ICpwZ19nZXRfcG9saWN5X2Rk bF9pbnRlcm5hbChPaWQgdGFibGVJRCwgY29uc3QgY2hhciAqcG9saWN5TmFtZSwKKwkJCQkJCQkJ CQlib29sIHByZXR0eSk7CitzdGF0aWMgY29uc3QgY2hhciAqZ2V0X3BvbGljeV9jbWRfbmFtZShj aGFyIGNtZCk7CiAKIAogLyoKQEAgLTk3NSwzICs5NzksMjYxIEBAIHBnX2dldF9kYXRhYmFzZV9k ZGwoUEdfRlVOQ1RJT05fQVJHUykKIAkJU1JGX1JFVFVSTl9ET05FKGZ1bmNjdHgpOwogCX0KIH0K KworLyoKKyAqIGdldF9wb2xpY3lfY21kX25hbWUKKyAqCQlNYXAgYSBwZ19wb2xpY3kucG9sY21k IGNoYXIgdG8gaXRzIFNRTCBrZXl3b3JkLgorICovCitzdGF0aWMgY29uc3QgY2hhciAqCitnZXRf cG9saWN5X2NtZF9uYW1lKGNoYXIgY21kKQoreworCXN3aXRjaCAoY21kKQorCXsKKwkJY2FzZSAn Kic6CisJCQlyZXR1cm4gIkFMTCI7CisJCWNhc2UgQUNMX1NFTEVDVF9DSFI6CisJCQlyZXR1cm4g IlNFTEVDVCI7CisJCWNhc2UgQUNMX0lOU0VSVF9DSFI6CisJCQlyZXR1cm4gIklOU0VSVCI7CisJ CWNhc2UgQUNMX1VQREFURV9DSFI6CisJCQlyZXR1cm4gIlVQREFURSI7CisJCWNhc2UgQUNMX0RF TEVURV9DSFI6CisJCQlyZXR1cm4gIkRFTEVURSI7CisJCWRlZmF1bHQ6CisJCQllbG9nKEVSUk9S LCAidW5yZWNvZ25pemVkIHBvbGljeSBjb21tYW5kOiAlZCIsIChpbnQpIGNtZCk7CisJfQorfQor CisvKgorICogcGdfZ2V0X3BvbGljeV9kZGxfaW50ZXJuYWwKKyAqCQlHZW5lcmF0ZSB0aGUgRERM IHN0YXRlbWVudCB0byByZWNyZWF0ZSBhIHJvdy1sZXZlbCBzZWN1cml0eSBwb2xpY3kuCisgKgor ICogUmV0dXJucyBhIExpc3QgY29udGFpbmluZyBhIHNpbmdsZSBwYWxsb2MnZCBzdHJpbmcgd2l0 aCB0aGUgQ1JFQVRFIFBPTElDWQorICogc3RhdGVtZW50LiAgUmV0dXJuaW5nIGEgTGlzdCBrZWVw cyB0aGUgY2FsbGluZyBjb252ZW50aW9uIGNvbnNpc3RlbnQgd2l0aAorICogdGhlIHJlc3Qgb2Yg dGhlIHBnX2dldF8qX2RkbCBmYW1pbHkgZXZlbiB0aG91Z2ggb25seSBvbmUgcm93IGlzIHByb2R1 Y2VkLgorICovCitzdGF0aWMgTGlzdCAqCitwZ19nZXRfcG9saWN5X2RkbF9pbnRlcm5hbChPaWQg dGFibGVJRCwgY29uc3QgY2hhciAqcG9saWN5TmFtZSwgYm9vbCBwcmV0dHkpCit7CisJUmVsYXRp b24JcGdQb2xpY3lSZWw7CisJSGVhcFR1cGxlCXR1cGxlUG9saWN5OworCUZvcm1fcGdfcG9saWN5 IHBvbGljeUZvcm07CisJU2NhbktleURhdGEgc2tleVsyXTsKKwlTeXNTY2FuRGVzYyBzc2NhbjsK KwlTdHJpbmdJbmZvRGF0YSBidWY7CisJRGF0dW0JCXZhbHVlRGF0dW07CisJYm9vbAkJYXR0cklz TnVsbDsKKwljaGFyCSAgICp0YXJnZXRUYWJsZTsKKwlMaXN0CSAgICpzdGF0ZW1lbnRzID0gTklM OworCisJLyogVmFsaWRhdGUgdGhhdCB0aGUgcmVsYXRpb24gZXhpc3RzICovCisJeworCQljaGFy CSAgICpyZWxuYW1lID0gZ2V0X3JlbF9uYW1lKHRhYmxlSUQpOworCQljaGFyCSAgICpuc3BuYW1l OworCisJCWlmIChyZWxuYW1lID09IE5VTEwpCisJCQllcmVwb3J0KEVSUk9SLAorCQkJCQkoZXJy Y29kZShFUlJDT0RFX1VOREVGSU5FRF9UQUJMRSksCisJCQkJCSBlcnJtc2coInJlbGF0aW9uIHdp dGggT0lEICV1IGRvZXMgbm90IGV4aXN0IiwgdGFibGVJRCkpKTsKKworCQluc3BuYW1lID0gZ2V0 X25hbWVzcGFjZV9uYW1lKGdldF9yZWxfbmFtZXNwYWNlKHRhYmxlSUQpKTsKKwkJaWYgKG5zcG5h bWUgPT0gTlVMTCkKKwkJCWVyZXBvcnQoRVJST1IsCisJCQkJCShlcnJjb2RlKEVSUkNPREVfVU5E RUZJTkVEX1NDSEVNQSksCisJCQkJCSBlcnJtc2coInNjaGVtYSBmb3IgcmVsYXRpb24gd2l0aCBP SUQgJXUgZG9lcyBub3QgZXhpc3QiLAorCQkJCQkJCXRhYmxlSUQpKSk7CisKKwkJdGFyZ2V0VGFi bGUgPSBxdW90ZV9xdWFsaWZpZWRfaWRlbnRpZmllcihuc3BuYW1lLCByZWxuYW1lKTsKKwkJcGZy ZWUocmVsbmFtZSk7CisJCXBmcmVlKG5zcG5hbWUpOworCX0KKworCXBnUG9saWN5UmVsID0gdGFi bGVfb3BlbihQb2xpY3lSZWxhdGlvbklkLCBBY2Nlc3NTaGFyZUxvY2spOworCisJLyogU2V0IGtl eSAtIHBvbGljeSdzIHJlbGF0aW9uIGlkLiAqLworCVNjYW5LZXlJbml0KCZza2V5WzBdLAorCQkJ CUFudW1fcGdfcG9saWN5X3BvbHJlbGlkLAorCQkJCUJURXF1YWxTdHJhdGVneU51bWJlciwgRl9P SURFUSwKKwkJCQlPYmplY3RJZEdldERhdHVtKHRhYmxlSUQpKTsKKworCS8qIFNldCBrZXkgLSBw b2xpY3kncyBuYW1lLiAqLworCVNjYW5LZXlJbml0KCZza2V5WzFdLAorCQkJCUFudW1fcGdfcG9s aWN5X3BvbG5hbWUsCisJCQkJQlRFcXVhbFN0cmF0ZWd5TnVtYmVyLCBGX05BTUVFUSwKKwkJCQlD U3RyaW5nR2V0RGF0dW0ocG9saWN5TmFtZSkpOworCisJc3NjYW4gPSBzeXN0YWJsZV9iZWdpbnNj YW4ocGdQb2xpY3lSZWwsCisJCQkJCQkJICAgUG9saWN5UG9scmVsaWRQb2xuYW1lSW5kZXhJZCwg dHJ1ZSwgTlVMTCwgMiwKKwkJCQkJCQkgICBza2V5KTsKKworCXR1cGxlUG9saWN5ID0gc3lzdGFi bGVfZ2V0bmV4dChzc2Nhbik7CisJaWYgKCFIZWFwVHVwbGVJc1ZhbGlkKHR1cGxlUG9saWN5KSkK KwkJZXJlcG9ydChFUlJPUiwKKwkJCQkoZXJyY29kZShFUlJDT0RFX1VOREVGSU5FRF9PQkpFQ1Qp LAorCQkJCSBlcnJtc2coInBvbGljeSBcIiVzXCIgZm9yIHRhYmxlIFwiJXNcIiBkb2VzIG5vdCBl eGlzdCIsCisJCQkJCQlwb2xpY3lOYW1lLCB0YXJnZXRUYWJsZSkpKTsKKworCXBvbGljeUZvcm0g PSAoRm9ybV9wZ19wb2xpY3kpIEdFVFNUUlVDVCh0dXBsZVBvbGljeSk7CisKKwlpbml0U3RyaW5n SW5mbygmYnVmKTsKKworCS8qIEJ1aWxkIHRoZSBDUkVBVEUgUE9MSUNZIHN0YXRlbWVudCAqLwor CWFwcGVuZFN0cmluZ0luZm8oJmJ1ZiwgIkNSRUFURSBQT0xJQ1kgJXMgT04gJXMiLAorCQkJCQkg cXVvdGVfaWRlbnRpZmllcihwb2xpY3lOYW1lKSwKKwkJCQkJIHRhcmdldFRhYmxlKTsKKworCS8q CisJICogRW1pdCBBUyBSRVNUUklDVElWRSBvbmx5IHdoZW4gaXQgZGlmZmVycyBmcm9tIHRoZSBk ZWZhdWx0IChQRVJNSVNTSVZFKS4KKwkgKi8KKwlpZiAoIXBvbGljeUZvcm0tPnBvbHBlcm1pc3Np dmUpCisJCWFwcGVuZF9kZGxfb3B0aW9uKCZidWYsIHByZXR0eSwgNCwgIkFTIFJFU1RSSUNUSVZF Iik7CisKKwkvKgorCSAqIEVtaXQgRk9SIDxjbWQ+IG9ubHkgd2hlbiBpdCBkaWZmZXJzIGZyb20g dGhlIGRlZmF1bHQgKEFMTCwgZW5jb2RlZCBhcworCSAqICcqJykuCisJICovCisJaWYgKHBvbGlj eUZvcm0tPnBvbGNtZCAhPSAnKicpCisJCWFwcGVuZF9kZGxfb3B0aW9uKCZidWYsIHByZXR0eSwg NCwgIkZPUiAlcyIsCisJCQkJCQkgIGdldF9wb2xpY3lfY21kX25hbWUocG9saWN5Rm9ybS0+cG9s Y21kKSk7CisKKwkvKgorCSAqIEVtaXQgVE8gPHJvbGVzPiBvbmx5IHdoZW4gaXQgZGlmZmVycyBm cm9tIHRoZSBkZWZhdWx0IChQVUJMSUMpLiAgUFVCTElDCisJICogaXMgZW5jb2RlZCBpbiBwb2xy b2xlcyBhcyBhIHNpbmdsZSBJbnZhbGlkT2lkIGVsZW1lbnQsIHNvIHdlIG9taXQgdGhlCisJICog Y2xhdXNlIHdoZW5ldmVyIGV2ZXJ5IGVudHJ5IGlzIEludmFsaWRPaWQuCisJICovCisJdmFsdWVE YXR1bSA9IGhlYXBfZ2V0YXR0cih0dXBsZVBvbGljeSwKKwkJCQkJCQkgIEFudW1fcGdfcG9saWN5 X3BvbHJvbGVzLAorCQkJCQkJCSAgUmVsYXRpb25HZXREZXNjcihwZ1BvbGljeVJlbCksCisJCQkJ CQkJICAmYXR0cklzTnVsbCk7CisJaWYgKCFhdHRySXNOdWxsKQorCXsKKwkJQXJyYXlUeXBlICAq cG9saWN5X3JvbGVzID0gRGF0dW1HZXRBcnJheVR5cGVQQ29weSh2YWx1ZURhdHVtKTsKKwkJaW50 CQkJbml0ZW1zID0gQVJSX0RJTVMocG9saWN5X3JvbGVzKVswXTsKKwkJT2lkCQkgICAqcm9sZXMg PSAoT2lkICopIEFSUl9EQVRBX1BUUihwb2xpY3lfcm9sZXMpOworCQlTdHJpbmdJbmZvRGF0YSBy b2xlX25hbWVzOworCisJCWluaXRTdHJpbmdJbmZvKCZyb2xlX25hbWVzKTsKKworCQlmb3IgKGlu dCBpID0gMDsgaSA8IG5pdGVtczsgaSsrKQorCQl7CisJCQlpZiAoT2lkSXNWYWxpZChyb2xlc1tp XSkpCisJCQl7CisJCQkJY2hhcgkgICAqcm9sZW5hbWUgPSBHZXRVc2VyTmFtZUZyb21JZChyb2xl c1tpXSwgZmFsc2UpOworCisJCQkJaWYgKHJvbGVfbmFtZXMubGVuID4gMCkKKwkJCQkJYXBwZW5k U3RyaW5nSW5mb1N0cmluZygmcm9sZV9uYW1lcywgIiwgIik7CisJCQkJYXBwZW5kU3RyaW5nSW5m b1N0cmluZygmcm9sZV9uYW1lcywgcXVvdGVfaWRlbnRpZmllcihyb2xlbmFtZSkpOworCQkJfQor CQl9CisKKwkJaWYgKHJvbGVfbmFtZXMubGVuID4gMCkKKwkJCWFwcGVuZF9kZGxfb3B0aW9uKCZi dWYsIHByZXR0eSwgNCwgIlRPICVzIiwgcm9sZV9uYW1lcy5kYXRhKTsKKworCQlwZnJlZShyb2xl X25hbWVzLmRhdGEpOworCQlwZnJlZShwb2xpY3lfcm9sZXMpOworCX0KKworCS8qIFVTSU5HIGV4 cHJlc3Npb24gKi8KKwl2YWx1ZURhdHVtID0gaGVhcF9nZXRhdHRyKHR1cGxlUG9saWN5LAorCQkJ CQkJCSAgQW51bV9wZ19wb2xpY3lfcG9scXVhbCwKKwkJCQkJCQkgIFJlbGF0aW9uR2V0RGVzY3Io cGdQb2xpY3lSZWwpLAorCQkJCQkJCSAgJmF0dHJJc051bGwpOworCWlmICghYXR0cklzTnVsbCkK Kwl7CisJCURhdHVtCQlleHByOworCisJCWV4cHIgPSBEaXJlY3RGdW5jdGlvbkNhbGwzKHBnX2dl dF9leHByX2V4dCwKKwkJCQkJCQkJICAgdmFsdWVEYXR1bSwKKwkJCQkJCQkJICAgT2JqZWN0SWRH ZXREYXR1bShwb2xpY3lGb3JtLT5wb2xyZWxpZCksCisJCQkJCQkJCSAgIEJvb2xHZXREYXR1bShw cmV0dHkpKTsKKwkJYXBwZW5kX2RkbF9vcHRpb24oJmJ1ZiwgcHJldHR5LCA0LCAiVVNJTkcgKCVz KSIsCisJCQkJCQkgIFRleHREYXR1bUdldENTdHJpbmcoZXhwcikpOworCX0KKworCS8qIFdJVEgg Q0hFQ0sgZXhwcmVzc2lvbiAqLworCXZhbHVlRGF0dW0gPSBoZWFwX2dldGF0dHIodHVwbGVQb2xp Y3ksCisJCQkJCQkJICBBbnVtX3BnX3BvbGljeV9wb2x3aXRoY2hlY2ssCisJCQkJCQkJICBSZWxh dGlvbkdldERlc2NyKHBnUG9saWN5UmVsKSwKKwkJCQkJCQkgICZhdHRySXNOdWxsKTsKKwlpZiAo IWF0dHJJc051bGwpCisJeworCQlEYXR1bQkJZXhwcjsKKworCQlleHByID0gRGlyZWN0RnVuY3Rp b25DYWxsMyhwZ19nZXRfZXhwcl9leHQsCisJCQkJCQkJCSAgIHZhbHVlRGF0dW0sCisJCQkJCQkJ CSAgIE9iamVjdElkR2V0RGF0dW0ocG9saWN5Rm9ybS0+cG9scmVsaWQpLAorCQkJCQkJCQkgICBC b29sR2V0RGF0dW0ocHJldHR5KSk7CisJCWFwcGVuZF9kZGxfb3B0aW9uKCZidWYsIHByZXR0eSwg NCwgIldJVEggQ0hFQ0sgKCVzKSIsCisJCQkJCQkgIFRleHREYXR1bUdldENTdHJpbmcoZXhwcikp OworCX0KKworCWFwcGVuZFN0cmluZ0luZm9DaGFyKCZidWYsICc7Jyk7CisKKwlzdGF0ZW1lbnRz ID0gbGFwcGVuZChzdGF0ZW1lbnRzLCBwc3RyZHVwKGJ1Zi5kYXRhKSk7CisKKwlzeXN0YWJsZV9l bmRzY2FuKHNzY2FuKTsKKwl0YWJsZV9jbG9zZShwZ1BvbGljeVJlbCwgQWNjZXNzU2hhcmVMb2Nr KTsKKwlwZnJlZShidWYuZGF0YSk7CisKKwlyZXR1cm4gc3RhdGVtZW50czsKK30KKworLyoKKyAq IHBnX2dldF9wb2xpY3lfZGRsCisgKgkJUmV0dXJuIERETCB0byByZWNyZWF0ZSBhIHJvdy1sZXZl bCBzZWN1cml0eSBwb2xpY3kgYXMgYSBzaW5nbGUgdGV4dCByb3cuCisgKi8KK0RhdHVtCitwZ19n ZXRfcG9saWN5X2RkbChQR19GVU5DVElPTl9BUkdTKQoreworCUZ1bmNDYWxsQ29udGV4dCAqZnVu Y2N0eDsKKwlMaXN0CSAgICpzdGF0ZW1lbnRzOworCisJaWYgKFNSRl9JU19GSVJTVENBTEwoKSkK Kwl7CisJCU1lbW9yeUNvbnRleHQgb2xkY29udGV4dDsKKwkJT2lkCQkJdGFibGVJRDsKKwkJTmFt ZQkJcG9saWN5TmFtZTsKKwkJRGRsT3B0aW9uCW9wdHNbXSA9IHsKKwkJCXsicHJldHR5IiwgRERM X09QVF9CT09MfSwKKwkJfTsKKworCQlmdW5jY3R4ID0gU1JGX0ZJUlNUQ0FMTF9JTklUKCk7CisJ CW9sZGNvbnRleHQgPSBNZW1vcnlDb250ZXh0U3dpdGNoVG8oZnVuY2N0eC0+bXVsdGlfY2FsbF9t ZW1vcnlfY3R4KTsKKworCQlpZiAoUEdfQVJHSVNOVUxMKDApIHx8IFBHX0FSR0lTTlVMTCgxKSkK KwkJeworCQkJTWVtb3J5Q29udGV4dFN3aXRjaFRvKG9sZGNvbnRleHQpOworCQkJU1JGX1JFVFVS Tl9ET05FKGZ1bmNjdHgpOworCQl9CisKKwkJdGFibGVJRCA9IFBHX0dFVEFSR19PSUQoMCk7CisJ CXBvbGljeU5hbWUgPSBQR19HRVRBUkdfTkFNRSgxKTsKKworCQlwYXJzZV9kZGxfb3B0aW9ucyhm Y2luZm8sIDIsIG9wdHMsIGxlbmd0aG9mKG9wdHMpKTsKKworCQlzdGF0ZW1lbnRzID0gcGdfZ2V0 X3BvbGljeV9kZGxfaW50ZXJuYWwodGFibGVJRCwKKwkJCQkJCQkJCQkJCU5hbWVTdHIoKnBvbGlj eU5hbWUpLAorCQkJCQkJCQkJCQkJb3B0c1swXS5pc3NldCAmJiBvcHRzWzBdLmJvb2x2YWwpOwor CQlmdW5jY3R4LT51c2VyX2ZjdHggPSBzdGF0ZW1lbnRzOworCQlmdW5jY3R4LT5tYXhfY2FsbHMg PSBsaXN0X2xlbmd0aChzdGF0ZW1lbnRzKTsKKworCQlNZW1vcnlDb250ZXh0U3dpdGNoVG8ob2xk Y29udGV4dCk7CisJfQorCisJZnVuY2N0eCA9IFNSRl9QRVJDQUxMX1NFVFVQKCk7CisJc3RhdGVt ZW50cyA9IChMaXN0ICopIGZ1bmNjdHgtPnVzZXJfZmN0eDsKKworCWlmIChmdW5jY3R4LT5jYWxs X2NudHIgPCBmdW5jY3R4LT5tYXhfY2FsbHMpCisJeworCQljaGFyCSAgICpzdG10OworCisJCXN0 bXQgPSBsaXN0X250aChzdGF0ZW1lbnRzLCBmdW5jY3R4LT5jYWxsX2NudHIpOworCisJCVNSRl9S RVRVUk5fTkVYVChmdW5jY3R4LCBDU3RyaW5nR2V0VGV4dERhdHVtKHN0bXQpKTsKKwl9CisJZWxz ZQorCXsKKwkJbGlzdF9mcmVlX2RlZXAoc3RhdGVtZW50cyk7CisJCVNSRl9SRVRVUk5fRE9ORShm dW5jY3R4KTsKKwl9Cit9CmRpZmYgLS1naXQgYS9zcmMvaW5jbHVkZS9jYXRhbG9nL3BnX3Byb2Mu ZGF0IGIvc3JjL2luY2x1ZGUvY2F0YWxvZy9wZ19wcm9jLmRhdAppbmRleCA0MDJkODY5NzEwYi4u ODBiMDNiYzkwODUgMTAwNjQ0Ci0tLSBhL3NyYy9pbmNsdWRlL2NhdGFsb2cvcGdfcHJvYy5kYXQK KysrIGIvc3JjL2luY2x1ZGUvY2F0YWxvZy9wZ19wcm9jLmRhdApAQCAtODYxNCw2ICs4NjE0LDE0 IEBACiAgIHByb3JldHR5cGUgPT4gJ3RleHQnLCBwcm9hcmd0eXBlcyA9PiAncmVnZGF0YWJhc2Ug Ym9vbCBib29sIGJvb2wnLAogICBwcm9hcmduYW1lcyA9PiAne2RhdGFiYXNlLHByZXR0eSxvd25l cix0YWJsZXNwYWNlfScsCiAgIHByb2FyZ2RlZmF1bHRzID0+ICd7ZmFsc2UsdHJ1ZSx0cnVlfScs IHByb3NyYyA9PiAncGdfZ2V0X2RhdGFiYXNlX2RkbCcgfSwKK3sgb2lkID0+ICc2NTE3JywgZGVz Y3IgPT4gJ2dldCBEREwgdG8gcmVjcmVhdGUgYSByb3ctbGV2ZWwgc2VjdXJpdHkgcG9saWN5JywK KyAgcHJvbmFtZSA9PiAncGdfZ2V0X3BvbGljeV9kZGwnLCBwcm9yb3dzID0+ICcxJywgcHJvdmFy aWFkaWMgPT4gJ3RleHQnLAorICBwcm9pc3N0cmljdCA9PiAnZicsIHByb3JldHNldCA9PiAndCcs IHByb3ZvbGF0aWxlID0+ICdzJywKKyAgcHJvbmFyZ2RlZmF1bHRzID0+ICcxJywgcHJvcmV0dHlw ZSA9PiAndGV4dCcsCisgIHByb2FyZ3R5cGVzID0+ICdyZWdjbGFzcyBuYW1lIF90ZXh0JywKKyAg cHJvYWxsYXJndHlwZXMgPT4gJ3tyZWdjbGFzcyxuYW1lLF90ZXh0fScsCisgIHByb2FyZ21vZGVz ID0+ICd7aSxpLHZ9JywgcHJvYXJnZGVmYXVsdHMgPT4gJ3tOVUxMfScsCisgIHByb3NyYyA9PiAn cGdfZ2V0X3BvbGljeV9kZGwnIH0sCiB7IG9pZCA9PiAnMjUwOScsCiAgIGRlc2NyID0+ICdkZXBh cnNlIGFuIGVuY29kZWQgZXhwcmVzc2lvbiB3aXRoIHByZXR0eS1wcmludCBvcHRpb24nLAogICBw cm9uYW1lID0+ICdwZ19nZXRfZXhwcicsIHByb3ZvbGF0aWxlID0+ICdzJywgcHJvcmV0dHlwZSA9 PiAndGV4dCcsCmRpZmYgLS1naXQgYS9zcmMvdGVzdC9yZWdyZXNzL2V4cGVjdGVkL3Jvd3NlY3Vy aXR5Lm91dCBiL3NyYy90ZXN0L3JlZ3Jlc3MvZXhwZWN0ZWQvcm93c2VjdXJpdHkub3V0CmluZGV4 IDNhNWU4MmMzNWJkLi5jN2RlNmU0N2MxZCAxMDA2NDQKLS0tIGEvc3JjL3Rlc3QvcmVncmVzcy9l eHBlY3RlZC9yb3dzZWN1cml0eS5vdXQKKysrIGIvc3JjL3Rlc3QvcmVncmVzcy9leHBlY3RlZC9y b3dzZWN1cml0eS5vdXQKQEAgLTUxOTUsNiArNTE5NSwyNzcgQEAgcmVzZXQgcmxzX3Rlc3QuYmxh aDsKIGRyb3AgZnVuY3Rpb24gcmxzX2YodGV4dCk7CiBkcm9wIHRhYmxlIHJsc190LCB0ZXN0X3Q7 CiAtLQorLS0gVGVzdCBmb3IgcGdfZ2V0X3BvbGljeV9kZGwodGFibGUsIHBvbGljeV9uYW1lLCBW QVJJQURJQyBvcHRpb25zKSBmdW5jdGlvbi4KKy0tCitDUkVBVEUgVEFCTEUgcmxzX3RibF8xICgK KyAgICBkaWQgICAgICAgICBpbnQgcHJpbWFyeSBrZXksCisgICAgY2lkICAgICAgICAgaW50LAor ICAgIGRsZXZlbCAgICAgIGludCBub3QgbnVsbCwKKyAgICBkYXV0aG9yICAgICBuYW1lLAorICAg IGR0aXRsZSAgICAgIHRleHQKKyk7CitHUkFOVCBBTEwgT04gcmxzX3RibF8xIFRPIHB1YmxpYzsK K0NSRUFURSBUQUJMRSBybHNfdGJsXzIgKAorICAgIHBndXNlciAgICAgIG5hbWUgcHJpbWFyeSBr ZXksCisgICAgc2VjbHYgICAgICAgaW50CispOworR1JBTlQgU0VMRUNUIE9OIHJsc190YmxfMiBU TyBwdWJsaWM7CistLSBUZXN0IFBFUk1JU1NJVkUgYW5kIFJFU1RSSUNUSVZFCitDUkVBVEUgUE9M SUNZIHJsc19wMSBPTiBybHNfdGJsXzEgQVMgUEVSTUlTU0lWRQorICAgIFVTSU5HIChkbGV2ZWwg PD0gKFNFTEVDVCBzZWNsdiBGUk9NIHJsc190YmxfMiBXSEVSRSBwZ3VzZXIgPSBjdXJyZW50X3Vz ZXIpKTsKK0NSRUFURSBQT0xJQ1kgcmxzX3AyIE9OIHJsc190YmxfMSBBUyBSRVNUUklDVElWRSBV U0lORyAoY2lkIDw+IDQ0IEFORCBjaWQgPCA1MCk7CistLSBUZXN0IEZPUiBBTEwgfCBTRUxFQ1Qg fCBJTlNFUlQgfCBVUERBVEUgfCBERUxFVEUKK0NSRUFURSBQT0xJQ1kgcmxzX3AzIE9OIHJsc190 YmxfMSBGT1IgQUxMIFVTSU5HIChkYXV0aG9yID0gY3VycmVudF91c2VyKTsKK0NSRUFURSBQT0xJ Q1kgcmxzX3A0IE9OIHJsc190YmxfMSBGT1IgU0VMRUNUIFVTSU5HIChjaWQgJSAyID0gMCk7CitD UkVBVEUgUE9MSUNZIHJsc19wNSBPTiBybHNfdGJsXzEgRk9SIElOU0VSVCBXSVRIIENIRUNLIChj aWQgJSAyID0gMSk7CitDUkVBVEUgUE9MSUNZIHJsc19wNiBPTiBybHNfdGJsXzEgRk9SIFVQREFU RSBVU0lORyAoY2lkICUgMiA9IDApOworQ1JFQVRFIFBPTElDWSBybHNfcDcgT04gcmxzX3RibF8x IEZPUiBERUxFVEUgVVNJTkcgKGNpZCA8IDgpOworLS0gVGVzdCBUTyB7IHJvbGVfbmFtZSAuLi4g fQorQ1JFQVRFIFBPTElDWSBybHNfcDggT04gcmxzX3RibF8xIFRPIHJlZ3Jlc3NfcmxzX2RhdmUs IHJlZ3Jlc3NfcmxzX2FsaWNlIFVTSU5HICh0cnVlKTsKK0NSRUFURSBQT0xJQ1kgcmxzX3A5IE9O IHJsc190YmxfMSBUTyByZWdyZXNzX3Jsc19leGVtcHRfdXNlciBXSVRIIENIRUNLIChjaWQgPSAo U0VMRUNUIHNlY2x2IEZST00gcmxzX3RibF8yKSk7CistLSBOVUxMIGlucHV0cyBzaG91bGQgcmV0 dXJuIG5vIHJvd3MKK1NFTEVDVCBjb3VudCgqKSBGUk9NIHBnX2dldF9wb2xpY3lfZGRsKE5VTEws ICdybHNfcDEnKTsKKyBjb3VudCAKKy0tLS0tLS0KKyAgICAgMAorKDEgcm93KQorCitTRUxFQ1Qg Y291bnQoKikgRlJPTSBwZ19nZXRfcG9saWN5X2RkbCgncmxzX3RibF8xJywgTlVMTCk7CisgY291 bnQgCistLS0tLS0tCisgICAgIDAKKygxIHJvdykKKworU0VMRUNUIGNvdW50KCopIEZST00gcGdf Z2V0X3BvbGljeV9kZGwoTlVMTCwgTlVMTCk7CisgY291bnQgCistLS0tLS0tCisgICAgIDAKKygx IHJvdykKKworLS0gVGFibGUgZG9lcyBub3QgZXhpc3QKK1NFTEVDVCAqIEZST00gcGdfZ2V0X3Bv bGljeV9kZGwoJ25vbmV4aXN0ZW50X3RibCcsICdybHNfcDEnKTsKK0VSUk9SOiAgcmVsYXRpb24g Im5vbmV4aXN0ZW50X3RibCIgZG9lcyBub3QgZXhpc3QKK0xJTkUgMTogU0VMRUNUICogRlJPTSBw Z19nZXRfcG9saWN5X2RkbCgnbm9uZXhpc3RlbnRfdGJsJywgJ3Jsc19wMScpLi4uCisgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXgorLS0gUG9saWN5IGRvZXMgbm90IGV4 aXN0CitTRUxFQ1QgKiBGUk9NIHBnX2dldF9wb2xpY3lfZGRsKCdybHNfdGJsXzEnLCAnbm9uZXhp c3RlbnRfcG9sJyk7CitFUlJPUjogIHBvbGljeSAibm9uZXhpc3RlbnRfcG9sIiBmb3IgdGFibGUg InJlZ3Jlc3NfcmxzX3NjaGVtYS5ybHNfdGJsXzEiIGRvZXMgbm90IGV4aXN0CistLSBJbnZhbGlk IG9wdGlvbiBuYW1lCitTRUxFQ1QgKiBGUk9NIHBnX2dldF9wb2xpY3lfZGRsKCdybHNfdGJsXzEn LCAncmxzX3AxJywgJ2JhZG9wdCcsICd0cnVlJyk7CitFUlJPUjogIHVucmVjb2duaXplZCBvcHRp b246ICJiYWRvcHQiCistLSBJbnZhbGlkIGJvb2xlYW4gdmFsdWUgZm9yIG9wdGlvbgorU0VMRUNU ICogRlJPTSBwZ19nZXRfcG9saWN5X2RkbCgncmxzX3RibF8xJywgJ3Jsc19wMScsICdwcmV0dHkn LCAnbWF5YmUnKTsKK0VSUk9SOiAgaW52YWxpZCB2YWx1ZSBmb3IgYm9vbGVhbiBvcHRpb24gInBy ZXR0eSI6IG1heWJlCistLSBEdXBsaWNhdGUgb3B0aW9uCitTRUxFQ1QgKiBGUk9NIHBnX2dldF9w b2xpY3lfZGRsKCdybHNfdGJsXzEnLCAncmxzX3AxJywgJ3ByZXR0eScsICd0cnVlJywgJ3ByZXR0 eScsICdmYWxzZScpOworRVJST1I6ICBvcHRpb24gInByZXR0eSIgaXMgc3BlY2lmaWVkIG1vcmUg dGhhbiBvbmNlCistLSBXaXRob3V0IHByZXR0eSBmb3JtYXR0aW5nIChkZWZhdWx0KQorU0VMRUNU ICogRlJPTSBwZ19nZXRfcG9saWN5X2RkbCgncmxzX3RibF8xJywgJ3Jsc19wMScpOworICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBnX2dldF9wb2xpY3lfZGRsICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLQorIENSRUFURSBQT0xJQ1kgcmxzX3AxIE9OIHJlZ3Jlc3Nfcmxz X3NjaGVtYS5ybHNfdGJsXzEgVVNJTkcgKChkbGV2ZWwgPD0gKCBTRUxFQ1QgcmxzX3RibF8yLnNl Y2x2KworICAgIEZST00gcmxzX3RibF8yICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKworICAgV0hFUkUg KHJsc190YmxfMi5wZ3VzZXIgPSBDVVJSRU5UX1VTRVIpKSkpOworKDEgcm93KQorCitTRUxFQ1Qg KiBGUk9NIHBnX2dldF9wb2xpY3lfZGRsKCdybHNfdGJsXzEnLCAncmxzX3AyJyk7CisgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwZ19nZXRfcG9saWN5X2RkbCAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyBDUkVBVEUgUE9MSUNZIHJs c19wMiBPTiByZWdyZXNzX3Jsc19zY2hlbWEucmxzX3RibF8xIEFTIFJFU1RSSUNUSVZFIFVTSU5H ICgoKGNpZCA8PiA0NCkgQU5EIChjaWQgPCA1MCkpKTsKKygxIHJvdykKKworU0VMRUNUICogRlJP TSBwZ19nZXRfcG9saWN5X2RkbCgncmxzX3RibF8xJywgJ3Jsc19wMycpOworICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICBwZ19nZXRfcG9saWN5X2RkbCAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgIAorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIENS RUFURSBQT0xJQ1kgcmxzX3AzIE9OIHJlZ3Jlc3NfcmxzX3NjaGVtYS5ybHNfdGJsXzEgVVNJTkcg KChkYXV0aG9yID0gQ1VSUkVOVF9VU0VSKSk7CisoMSByb3cpCisKK1NFTEVDVCAqIEZST00gcGdf Z2V0X3BvbGljeV9kZGwoJ3Jsc190YmxfMScsICdybHNfcDQnKTsKKyAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgIHBnX2dldF9wb2xpY3lfZGRsICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgIAorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgQ1JF QVRFIFBPTElDWSBybHNfcDQgT04gcmVncmVzc19ybHNfc2NoZW1hLnJsc190YmxfMSBGT1IgU0VM RUNUIFVTSU5HICgoKGNpZCAlIDIpID0gMCkpOworKDEgcm93KQorCitTRUxFQ1QgKiBGUk9NIHBn X2dldF9wb2xpY3lfZGRsKCdybHNfdGJsXzEnLCAncmxzX3A1Jyk7CisgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICBwZ19nZXRfcG9saWN5X2RkbCAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgIAorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0KKyBDUkVBVEUgUE9MSUNZIHJsc19wNSBPTiByZWdyZXNzX3Jsc19zY2hlbWEucmxzX3Ri bF8xIEZPUiBJTlNFUlQgV0lUSCBDSEVDSyAoKChjaWQgJSAyKSA9IDEpKTsKKygxIHJvdykKKwor U0VMRUNUICogRlJPTSBwZ19nZXRfcG9saWN5X2RkbCgncmxzX3RibF8xJywgJ3Jsc19wNicsICdw cmV0dHknLCAnZmFsc2UnKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBn X2dldF9wb2xpY3lfZGRsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgQ1JFQVRFIFBPTElDWSBybHNfcDYgT04g cmVncmVzc19ybHNfc2NoZW1hLnJsc190YmxfMSBGT1IgVVBEQVRFIFVTSU5HICgoKGNpZCAlIDIp ID0gMCkpOworKDEgcm93KQorCitTRUxFQ1QgKiBGUk9NIHBnX2dldF9wb2xpY3lfZGRsKCdybHNf dGJsXzEnLCAncmxzX3A3JywgJ3ByZXR0eScsICdmYWxzZScpOworICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgcGdfZ2V0X3BvbGljeV9kZGwgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyBDUkVBVEUgUE9MSUNZIHJs c19wNyBPTiByZWdyZXNzX3Jsc19zY2hlbWEucmxzX3RibF8xIEZPUiBERUxFVEUgVVNJTkcgKChj aWQgPCA4KSk7CisoMSByb3cpCisKK1NFTEVDVCAqIEZST00gcGdfZ2V0X3BvbGljeV9kZGwoJ3Js c190YmxfMScsICdybHNfcDgnLCAncHJldHR5JywgJ2ZhbHNlJyk7CisgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwZ19nZXRfcG9saWN5X2RkbCAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyBDUkVBVEUgUE9MSUNZIHJsc19wOCBPTiBy ZWdyZXNzX3Jsc19zY2hlbWEucmxzX3RibF8xIFRPIHJlZ3Jlc3NfcmxzX2RhdmUsIHJlZ3Jlc3Nf cmxzX2FsaWNlIFVTSU5HICh0cnVlKTsKKygxIHJvdykKKworU0VMRUNUICogRlJPTSBwZ19nZXRf cG9saWN5X2RkbCgncmxzX3RibF8xJywgJ3Jsc19wOScsICdwcmV0dHknLCAnZmFsc2UnKTsKKyAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBnX2dl dF9wb2xpY3lfZGRsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIENSRUFURSBQT0xJQ1kgcmxzX3A5IE9OIHJlZ3Jlc3Nf cmxzX3NjaGVtYS5ybHNfdGJsXzEgVE8gcmVncmVzc19ybHNfZXhlbXB0X3VzZXIgV0lUSCBDSEVD SyAoKGNpZCA9ICggU0VMRUNUIHJsc190YmxfMi5zZWNsdisKKyAgICBGUk9NIHJsc190YmxfMikp KTsKKygxIHJvdykKKworLS0gV2l0aCBwcmV0dHkgZm9ybWF0dGluZworXHBzZXQgZm9ybWF0IHVu YWxpZ25lZAorU0VMRUNUICogRlJPTSBwZ19nZXRfcG9saWN5X2RkbCgncmxzX3RibF8xJywgJ3Js c19wMScsICdwcmV0dHknLCAndHJ1ZScpOworcGdfZ2V0X3BvbGljeV9kZGwKK0NSRUFURSBQT0xJ Q1kgcmxzX3AxIE9OIHJlZ3Jlc3NfcmxzX3NjaGVtYS5ybHNfdGJsXzEKKyAgICBVU0lORyAoZGxl dmVsIDw9ICgoIFNFTEVDVCBybHNfdGJsXzIuc2VjbHYKKyAgIEZST00gcmxzX3RibF8yCisgIFdI RVJFIHJsc190YmxfMi5wZ3VzZXIgPSBDVVJSRU5UX1VTRVIpKSk7CisoMSByb3cpCitTRUxFQ1Qg KiBGUk9NIHBnX2dldF9wb2xpY3lfZGRsKCdybHNfdGJsXzEnLCAncmxzX3AyJywgJ3ByZXR0eScs ICd0cnVlJyk7CitwZ19nZXRfcG9saWN5X2RkbAorQ1JFQVRFIFBPTElDWSBybHNfcDIgT04gcmVn cmVzc19ybHNfc2NoZW1hLnJsc190YmxfMQorICAgIEFTIFJFU1RSSUNUSVZFCisgICAgVVNJTkcg KGNpZCA8PiA0NCBBTkQgY2lkIDwgNTApOworKDEgcm93KQorU0VMRUNUICogRlJPTSBwZ19nZXRf cG9saWN5X2RkbCgncmxzX3RibF8xJywgJ3Jsc19wMycsICdwcmV0dHknLCAndHJ1ZScpOworcGdf Z2V0X3BvbGljeV9kZGwKK0NSRUFURSBQT0xJQ1kgcmxzX3AzIE9OIHJlZ3Jlc3NfcmxzX3NjaGVt YS5ybHNfdGJsXzEKKyAgICBVU0lORyAoZGF1dGhvciA9IENVUlJFTlRfVVNFUik7CisoMSByb3cp CitTRUxFQ1QgKiBGUk9NIHBnX2dldF9wb2xpY3lfZGRsKCdybHNfdGJsXzEnLCAncmxzX3A0Jywg J3ByZXR0eScsICd0cnVlJyk7CitwZ19nZXRfcG9saWN5X2RkbAorQ1JFQVRFIFBPTElDWSBybHNf cDQgT04gcmVncmVzc19ybHNfc2NoZW1hLnJsc190YmxfMQorICAgIEZPUiBTRUxFQ1QKKyAgICBV U0lORyAoKGNpZCAlIDIpID0gMCk7CisoMSByb3cpCitTRUxFQ1QgKiBGUk9NIHBnX2dldF9wb2xp Y3lfZGRsKCdybHNfdGJsXzEnLCAncmxzX3A1JywgJ3ByZXR0eScsICd0cnVlJyk7CitwZ19nZXRf cG9saWN5X2RkbAorQ1JFQVRFIFBPTElDWSBybHNfcDUgT04gcmVncmVzc19ybHNfc2NoZW1hLnJs c190YmxfMQorICAgIEZPUiBJTlNFUlQKKyAgICBXSVRIIENIRUNLICgoY2lkICUgMikgPSAxKTsK KygxIHJvdykKK1NFTEVDVCAqIEZST00gcGdfZ2V0X3BvbGljeV9kZGwoJ3Jsc190YmxfMScsICdy bHNfcDYnLCAncHJldHR5JywgJ3RydWUnKTsKK3BnX2dldF9wb2xpY3lfZGRsCitDUkVBVEUgUE9M SUNZIHJsc19wNiBPTiByZWdyZXNzX3Jsc19zY2hlbWEucmxzX3RibF8xCisgICAgRk9SIFVQREFU RQorICAgIFVTSU5HICgoY2lkICUgMikgPSAwKTsKKygxIHJvdykKK1NFTEVDVCAqIEZST00gcGdf Z2V0X3BvbGljeV9kZGwoJ3Jsc190YmxfMScsICdybHNfcDcnLCAncHJldHR5JywgJ3RydWUnKTsK K3BnX2dldF9wb2xpY3lfZGRsCitDUkVBVEUgUE9MSUNZIHJsc19wNyBPTiByZWdyZXNzX3Jsc19z Y2hlbWEucmxzX3RibF8xCisgICAgRk9SIERFTEVURQorICAgIFVTSU5HIChjaWQgPCA4KTsKKygx IHJvdykKK1NFTEVDVCAqIEZST00gcGdfZ2V0X3BvbGljeV9kZGwoJ3Jsc190YmxfMScsICdybHNf cDgnLCAncHJldHR5JywgJ3RydWUnKTsKK3BnX2dldF9wb2xpY3lfZGRsCitDUkVBVEUgUE9MSUNZ IHJsc19wOCBPTiByZWdyZXNzX3Jsc19zY2hlbWEucmxzX3RibF8xCisgICAgVE8gcmVncmVzc19y bHNfZGF2ZSwgcmVncmVzc19ybHNfYWxpY2UKKyAgICBVU0lORyAodHJ1ZSk7CisoMSByb3cpCitT RUxFQ1QgKiBGUk9NIHBnX2dldF9wb2xpY3lfZGRsKCdybHNfdGJsXzEnLCAncmxzX3A5JywgJ3By ZXR0eScsICd0cnVlJyk7CitwZ19nZXRfcG9saWN5X2RkbAorQ1JFQVRFIFBPTElDWSBybHNfcDkg T04gcmVncmVzc19ybHNfc2NoZW1hLnJsc190YmxfMQorICAgIFRPIHJlZ3Jlc3NfcmxzX2V4ZW1w dF91c2VyCisgICAgV0lUSCBDSEVDSyAoY2lkID0gKCggU0VMRUNUIHJsc190YmxfMi5zZWNsdgor ICAgRlJPTSBybHNfdGJsXzIpKSk7CisoMSByb3cpCitccHNldCBmb3JtYXQgYWxpZ25lZAorLS0g UGFzcyBvcHRpb25zIHZpYSBWQVJJQURJQyBBUlJBWVsuLi5dIHN5bnRheAorU0VMRUNUICogRlJP TSBwZ19nZXRfcG9saWN5X2RkbCgncmxzX3RibF8xJywgJ3Jsc19wMScsCisgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgIFZBUklBRElDIEFSUkFZWydwcmV0dHknLCdmYWxzZSddKTsKKyAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwZ19nZXRfcG9saWN5X2RkbCAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKy0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyBDUkVBVEUgUE9MSUNZIHJsc19wMSBPTiByZWdyZXNz X3Jsc19zY2hlbWEucmxzX3RibF8xIFVTSU5HICgoZGxldmVsIDw9ICggU0VMRUNUIHJsc190Ymxf Mi5zZWNsdisKKyAgICBGUk9NIHJsc190YmxfMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsKKyAgIFdI RVJFIChybHNfdGJsXzIucGd1c2VyID0gQ1VSUkVOVF9VU0VSKSkpKTsKKygxIHJvdykKKworU0VM RUNUICogRlJPTSBwZ19nZXRfcG9saWN5X2RkbCgncmxzX3RibF8xJywgJ3Jsc19wMycsCisgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZBUklBRElDIEFSUkFZWydwcmV0dHknLCdmYWxz ZSddKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGdfZ2V0X3BvbGljeV9k ZGwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKy0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0KKyBDUkVBVEUgUE9MSUNZIHJsc19wMyBPTiByZWdyZXNzX3Jsc19zY2hl bWEucmxzX3RibF8xIFVTSU5HICgoZGF1dGhvciA9IENVUlJFTlRfVVNFUikpOworKDEgcm93KQor CitccHNldCBmb3JtYXQgdW5hbGlnbmVkCitTRUxFQ1QgKiBGUk9NIHBnX2dldF9wb2xpY3lfZGRs KCdybHNfdGJsXzEnLCAncmxzX3AxJywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg VkFSSUFESUMgQVJSQVlbJ3ByZXR0eScsJ3RydWUnXSk7CitwZ19nZXRfcG9saWN5X2RkbAorQ1JF QVRFIFBPTElDWSBybHNfcDEgT04gcmVncmVzc19ybHNfc2NoZW1hLnJsc190YmxfMQorICAgIFVT SU5HIChkbGV2ZWwgPD0gKCggU0VMRUNUIHJsc190YmxfMi5zZWNsdgorICAgRlJPTSBybHNfdGJs XzIKKyAgV0hFUkUgcmxzX3RibF8yLnBndXNlciA9IENVUlJFTlRfVVNFUikpKTsKKygxIHJvdykK K1NFTEVDVCAqIEZST00gcGdfZ2V0X3BvbGljeV9kZGwoJ3Jsc190YmxfMScsICdybHNfcDMnLAor ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWQVJJQURJQyBBUlJBWVsncHJldHR5Jywn dHJ1ZSddKTsKK3BnX2dldF9wb2xpY3lfZGRsCitDUkVBVEUgUE9MSUNZIHJsc19wMyBPTiByZWdy ZXNzX3Jsc19zY2hlbWEucmxzX3RibF8xCisgICAgVVNJTkcgKGRhdXRob3IgPSBDVVJSRU5UX1VT RVIpOworKDEgcm93KQorXHBzZXQgZm9ybWF0IGFsaWduZWQKKy0tIEVtcHR5IFZBUklBRElDIGFy cmF5IGJlaGF2ZXMgYXMgZGVmYXVsdCAobm8gb3B0aW9ucykKK1NFTEVDVCAqIEZST00gcGdfZ2V0 X3BvbGljeV9kZGwoJ3Jsc190YmxfMScsICdybHNfcDEnLAorICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICBWQVJJQURJQyBBUlJBWVtdOjp0ZXh0W10pOworICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgIHBnX2dldF9wb2xpY3lfZGRsICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgIAorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLQorIENSRUFURSBQT0xJQ1kgcmxzX3AxIE9OIHJlZ3Jlc3NfcmxzX3NjaGVtYS5ybHNf dGJsXzEgVVNJTkcgKChkbGV2ZWwgPD0gKCBTRUxFQ1QgcmxzX3RibF8yLnNlY2x2KworICAgIEZS T00gcmxzX3RibF8yICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKworICAgV0hFUkUgKHJsc190YmxfMi5w Z3VzZXIgPSBDVVJSRU5UX1VTRVIpKSkpOworKDEgcm93KQorCistLSBVbnJlY29nbml6ZWQgb3B0 aW9uIHZpYSBWQVJJQURJQyBBUlJBWQorU0VMRUNUICogRlJPTSBwZ19nZXRfcG9saWN5X2RkbCgn cmxzX3RibF8xJywgJ3Jsc19wMScsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZB UklBRElDIEFSUkFZWydiYWRvcHQnLCd0cnVlJ10pOworRVJST1I6ICB1bnJlY29nbml6ZWQgb3B0 aW9uOiAiYmFkb3B0IgorLS0gSW52YWxpZCBib29sZWFuIHZhbHVlIHZpYSBWQVJJQURJQyBBUlJB WQorU0VMRUNUICogRlJPTSBwZ19nZXRfcG9saWN5X2RkbCgncmxzX3RibF8xJywgJ3Jsc19wMScs CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZBUklBRElDIEFSUkFZWydwcmV0dHkn LCdtYXliZSddKTsKK0VSUk9SOiAgaW52YWxpZCB2YWx1ZSBmb3IgYm9vbGVhbiBvcHRpb24gInBy ZXR0eSI6IG1heWJlCistLSBPZGQgbnVtYmVyIG9mIGVsZW1lbnRzIHZpYSBWQVJJQURJQyBBUlJB WQorU0VMRUNUICogRlJPTSBwZ19nZXRfcG9saWN5X2RkbCgncmxzX3RibF8xJywgJ3Jsc19wMScs CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZBUklBRElDIEFSUkFZWydwcmV0dHkn XSk7CitFUlJPUjogIHZhcmlhZGljIGFyZ3VtZW50cyBtdXN0IGJlIG5hbWUvdmFsdWUgcGFpcnMK K0hJTlQ6ICBQcm92aWRlIGFuIGV2ZW4gbnVtYmVyIG9mIHZhcmlhZGljIGFyZ3VtZW50cyB0aGF0 IGNhbiBiZSBkaXZpZGVkIGludG8gcGFpcnMuCistLSBSb3VuZC10cmlwOiB0aGUgZ2VuZXJhdGVk IERETCBtdXN0IGJlIHJlLWV4ZWN1dGFibGUsIGluY2x1ZGluZyBmb3IgYXRvbWljCistLSBib29s ZWFuIGV4cHJlc3Npb25zIHRoYXQgcGdfZ2V0X2V4cHIoKSBkb2VzIG5vdCBwYXJlbnRoZXNpemUu CitDUkVBVEUgVEFCTEUgcmxzX3J0IChhIGludCk7CitDUkVBVEUgUE9MSUNZIHJ0X3RydWUgT04g cmxzX3J0IFVTSU5HICh0cnVlKTsKK0NSRUFURSBQT0xJQ1kgcnRfZmFsc2UgT04gcmxzX3J0IEZP UiBJTlNFUlQgV0lUSCBDSEVDSyAoZmFsc2UpOworQ1JFQVRFIFRFTVAgVEFCTEUgcnRfZGRsIEFT CisgICAgU0VMRUNUIHBnX2dldF9wb2xpY3lfZGRsKCdybHNfcnQnLCAncnRfdHJ1ZScpIEFTIGRk bAorICAgIFVOSU9OIEFMTAorICAgIFNFTEVDVCBwZ19nZXRfcG9saWN5X2RkbCgncmxzX3J0Jywg J3J0X2ZhbHNlJyk7CitEUk9QIFBPTElDWSBydF90cnVlIE9OIHJsc19ydDsKK0RST1AgUE9MSUNZ IHJ0X2ZhbHNlIE9OIHJsc19ydDsKK1NFTEVDVCBkZGwgRlJPTSBydF9kZGwgT1JERVIgQlkgZGRs IFxnZXhlYworQ1JFQVRFIFBPTElDWSBydF9mYWxzZSBPTiByZWdyZXNzX3Jsc19zY2hlbWEucmxz X3J0IEZPUiBJTlNFUlQgV0lUSCBDSEVDSyAoZmFsc2UpOworQ1JFQVRFIFBPTElDWSBydF90cnVl IE9OIHJlZ3Jlc3NfcmxzX3NjaGVtYS5ybHNfcnQgVVNJTkcgKHRydWUpOworU0VMRUNUIHBvbG5h bWUgRlJPTSBwZ19wb2xpY3kgV0hFUkUgcG9scmVsaWQgPSAncmxzX3J0Jzo6cmVnY2xhc3MgT1JE RVIgQlkgcG9sbmFtZTsKKyBwb2xuYW1lICAKKy0tLS0tLS0tLS0KKyBydF9mYWxzZQorIHJ0X3Ry dWUKKygyIHJvd3MpCisKK0RST1AgVEFCTEUgcmxzX3J0OworLS0gQ2xlYW4gdXAgb2JqZWN0cyBj cmVhdGVkIGZvciB0ZXN0aW5nIHBnX2dldF9wb2xpY3lfZGRsIGZ1bmN0aW9uLgorRFJPUCBQT0xJ Q1kgcmxzX3AxIE9OIHJsc190YmxfMTsKK0RST1AgUE9MSUNZIHJsc19wMiBPTiBybHNfdGJsXzE7 CitEUk9QIFBPTElDWSBybHNfcDMgT04gcmxzX3RibF8xOworRFJPUCBQT0xJQ1kgcmxzX3A0IE9O IHJsc190YmxfMTsKK0RST1AgUE9MSUNZIHJsc19wNSBPTiBybHNfdGJsXzE7CitEUk9QIFBPTElD WSBybHNfcDYgT04gcmxzX3RibF8xOworRFJPUCBQT0xJQ1kgcmxzX3A3IE9OIHJsc190YmxfMTsK K0RST1AgUE9MSUNZIHJsc19wOCBPTiBybHNfdGJsXzE7CitEUk9QIFBPTElDWSBybHNfcDkgT04g cmxzX3RibF8xOworRFJPUCBUQUJMRSBybHNfdGJsXzE7CitEUk9QIFRBQkxFIHJsc190YmxfMjsK Ky0tCiAtLSBDbGVhbiB1cCBvYmplY3RzCiAtLQogUkVTRVQgU0VTU0lPTiBBVVRIT1JJWkFUSU9O OwpkaWZmIC0tZ2l0IGEvc3JjL3Rlc3QvcmVncmVzcy9zcWwvcm93c2VjdXJpdHkuc3FsIGIvc3Jj L3Rlc3QvcmVncmVzcy9zcWwvcm93c2VjdXJpdHkuc3FsCmluZGV4IDZiMzU2NjI3MWRmLi4yZThm MTFlNjNhMiAxMDA2NDQKLS0tIGEvc3JjL3Rlc3QvcmVncmVzcy9zcWwvcm93c2VjdXJpdHkuc3Fs CisrKyBiL3NyYy90ZXN0L3JlZ3Jlc3Mvc3FsL3Jvd3NlY3VyaXR5LnNxbApAQCAtMjU5OCw2ICsy NTk4LDEzMiBAQCByZXNldCBybHNfdGVzdC5ibGFoOwogZHJvcCBmdW5jdGlvbiBybHNfZih0ZXh0 KTsKIGRyb3AgdGFibGUgcmxzX3QsIHRlc3RfdDsKIAorLS0KKy0tIFRlc3QgZm9yIHBnX2dldF9w b2xpY3lfZGRsKHRhYmxlLCBwb2xpY3lfbmFtZSwgVkFSSUFESUMgb3B0aW9ucykgZnVuY3Rpb24u CistLQorQ1JFQVRFIFRBQkxFIHJsc190YmxfMSAoCisgICAgZGlkICAgICAgICAgaW50IHByaW1h cnkga2V5LAorICAgIGNpZCAgICAgICAgIGludCwKKyAgICBkbGV2ZWwgICAgICBpbnQgbm90IG51 bGwsCisgICAgZGF1dGhvciAgICAgbmFtZSwKKyAgICBkdGl0bGUgICAgICB0ZXh0CispOworR1JB TlQgQUxMIE9OIHJsc190YmxfMSBUTyBwdWJsaWM7CitDUkVBVEUgVEFCTEUgcmxzX3RibF8yICgK KyAgICBwZ3VzZXIgICAgICBuYW1lIHByaW1hcnkga2V5LAorICAgIHNlY2x2ICAgICAgIGludAor KTsKK0dSQU5UIFNFTEVDVCBPTiBybHNfdGJsXzIgVE8gcHVibGljOworCistLSBUZXN0IFBFUk1J U1NJVkUgYW5kIFJFU1RSSUNUSVZFCitDUkVBVEUgUE9MSUNZIHJsc19wMSBPTiBybHNfdGJsXzEg QVMgUEVSTUlTU0lWRQorICAgIFVTSU5HIChkbGV2ZWwgPD0gKFNFTEVDVCBzZWNsdiBGUk9NIHJs c190YmxfMiBXSEVSRSBwZ3VzZXIgPSBjdXJyZW50X3VzZXIpKTsKK0NSRUFURSBQT0xJQ1kgcmxz X3AyIE9OIHJsc190YmxfMSBBUyBSRVNUUklDVElWRSBVU0lORyAoY2lkIDw+IDQ0IEFORCBjaWQg PCA1MCk7CisKKy0tIFRlc3QgRk9SIEFMTCB8IFNFTEVDVCB8IElOU0VSVCB8IFVQREFURSB8IERF TEVURQorQ1JFQVRFIFBPTElDWSBybHNfcDMgT04gcmxzX3RibF8xIEZPUiBBTEwgVVNJTkcgKGRh dXRob3IgPSBjdXJyZW50X3VzZXIpOworQ1JFQVRFIFBPTElDWSBybHNfcDQgT04gcmxzX3RibF8x IEZPUiBTRUxFQ1QgVVNJTkcgKGNpZCAlIDIgPSAwKTsKK0NSRUFURSBQT0xJQ1kgcmxzX3A1IE9O IHJsc190YmxfMSBGT1IgSU5TRVJUIFdJVEggQ0hFQ0sgKGNpZCAlIDIgPSAxKTsKK0NSRUFURSBQ T0xJQ1kgcmxzX3A2IE9OIHJsc190YmxfMSBGT1IgVVBEQVRFIFVTSU5HIChjaWQgJSAyID0gMCk7 CitDUkVBVEUgUE9MSUNZIHJsc19wNyBPTiBybHNfdGJsXzEgRk9SIERFTEVURSBVU0lORyAoY2lk IDwgOCk7CisKKy0tIFRlc3QgVE8geyByb2xlX25hbWUgLi4uIH0KK0NSRUFURSBQT0xJQ1kgcmxz X3A4IE9OIHJsc190YmxfMSBUTyByZWdyZXNzX3Jsc19kYXZlLCByZWdyZXNzX3Jsc19hbGljZSBV U0lORyAodHJ1ZSk7CitDUkVBVEUgUE9MSUNZIHJsc19wOSBPTiBybHNfdGJsXzEgVE8gcmVncmVz c19ybHNfZXhlbXB0X3VzZXIgV0lUSCBDSEVDSyAoY2lkID0gKFNFTEVDVCBzZWNsdiBGUk9NIHJs c190YmxfMikpOworCistLSBOVUxMIGlucHV0cyBzaG91bGQgcmV0dXJuIG5vIHJvd3MKK1NFTEVD VCBjb3VudCgqKSBGUk9NIHBnX2dldF9wb2xpY3lfZGRsKE5VTEwsICdybHNfcDEnKTsKK1NFTEVD VCBjb3VudCgqKSBGUk9NIHBnX2dldF9wb2xpY3lfZGRsKCdybHNfdGJsXzEnLCBOVUxMKTsKK1NF TEVDVCBjb3VudCgqKSBGUk9NIHBnX2dldF9wb2xpY3lfZGRsKE5VTEwsIE5VTEwpOworCistLSBU YWJsZSBkb2VzIG5vdCBleGlzdAorU0VMRUNUICogRlJPTSBwZ19nZXRfcG9saWN5X2RkbCgnbm9u ZXhpc3RlbnRfdGJsJywgJ3Jsc19wMScpOworLS0gUG9saWN5IGRvZXMgbm90IGV4aXN0CitTRUxF Q1QgKiBGUk9NIHBnX2dldF9wb2xpY3lfZGRsKCdybHNfdGJsXzEnLCAnbm9uZXhpc3RlbnRfcG9s Jyk7CisKKy0tIEludmFsaWQgb3B0aW9uIG5hbWUKK1NFTEVDVCAqIEZST00gcGdfZ2V0X3BvbGlj eV9kZGwoJ3Jsc190YmxfMScsICdybHNfcDEnLCAnYmFkb3B0JywgJ3RydWUnKTsKKy0tIEludmFs aWQgYm9vbGVhbiB2YWx1ZSBmb3Igb3B0aW9uCitTRUxFQ1QgKiBGUk9NIHBnX2dldF9wb2xpY3lf ZGRsKCdybHNfdGJsXzEnLCAncmxzX3AxJywgJ3ByZXR0eScsICdtYXliZScpOworLS0gRHVwbGlj YXRlIG9wdGlvbgorU0VMRUNUICogRlJPTSBwZ19nZXRfcG9saWN5X2RkbCgncmxzX3RibF8xJywg J3Jsc19wMScsICdwcmV0dHknLCAndHJ1ZScsICdwcmV0dHknLCAnZmFsc2UnKTsKKworLS0gV2l0 aG91dCBwcmV0dHkgZm9ybWF0dGluZyAoZGVmYXVsdCkKK1NFTEVDVCAqIEZST00gcGdfZ2V0X3Bv bGljeV9kZGwoJ3Jsc190YmxfMScsICdybHNfcDEnKTsKK1NFTEVDVCAqIEZST00gcGdfZ2V0X3Bv bGljeV9kZGwoJ3Jsc190YmxfMScsICdybHNfcDInKTsKK1NFTEVDVCAqIEZST00gcGdfZ2V0X3Bv bGljeV9kZGwoJ3Jsc190YmxfMScsICdybHNfcDMnKTsKK1NFTEVDVCAqIEZST00gcGdfZ2V0X3Bv bGljeV9kZGwoJ3Jsc190YmxfMScsICdybHNfcDQnKTsKK1NFTEVDVCAqIEZST00gcGdfZ2V0X3Bv bGljeV9kZGwoJ3Jsc190YmxfMScsICdybHNfcDUnKTsKK1NFTEVDVCAqIEZST00gcGdfZ2V0X3Bv bGljeV9kZGwoJ3Jsc190YmxfMScsICdybHNfcDYnLCAncHJldHR5JywgJ2ZhbHNlJyk7CitTRUxF Q1QgKiBGUk9NIHBnX2dldF9wb2xpY3lfZGRsKCdybHNfdGJsXzEnLCAncmxzX3A3JywgJ3ByZXR0 eScsICdmYWxzZScpOworU0VMRUNUICogRlJPTSBwZ19nZXRfcG9saWN5X2RkbCgncmxzX3RibF8x JywgJ3Jsc19wOCcsICdwcmV0dHknLCAnZmFsc2UnKTsKK1NFTEVDVCAqIEZST00gcGdfZ2V0X3Bv bGljeV9kZGwoJ3Jsc190YmxfMScsICdybHNfcDknLCAncHJldHR5JywgJ2ZhbHNlJyk7CisKKy0t IFdpdGggcHJldHR5IGZvcm1hdHRpbmcKK1xwc2V0IGZvcm1hdCB1bmFsaWduZWQKK1NFTEVDVCAq IEZST00gcGdfZ2V0X3BvbGljeV9kZGwoJ3Jsc190YmxfMScsICdybHNfcDEnLCAncHJldHR5Jywg J3RydWUnKTsKK1NFTEVDVCAqIEZST00gcGdfZ2V0X3BvbGljeV9kZGwoJ3Jsc190YmxfMScsICdy bHNfcDInLCAncHJldHR5JywgJ3RydWUnKTsKK1NFTEVDVCAqIEZST00gcGdfZ2V0X3BvbGljeV9k ZGwoJ3Jsc190YmxfMScsICdybHNfcDMnLCAncHJldHR5JywgJ3RydWUnKTsKK1NFTEVDVCAqIEZS T00gcGdfZ2V0X3BvbGljeV9kZGwoJ3Jsc190YmxfMScsICdybHNfcDQnLCAncHJldHR5JywgJ3Ry dWUnKTsKK1NFTEVDVCAqIEZST00gcGdfZ2V0X3BvbGljeV9kZGwoJ3Jsc190YmxfMScsICdybHNf cDUnLCAncHJldHR5JywgJ3RydWUnKTsKK1NFTEVDVCAqIEZST00gcGdfZ2V0X3BvbGljeV9kZGwo J3Jsc190YmxfMScsICdybHNfcDYnLCAncHJldHR5JywgJ3RydWUnKTsKK1NFTEVDVCAqIEZST00g cGdfZ2V0X3BvbGljeV9kZGwoJ3Jsc190YmxfMScsICdybHNfcDcnLCAncHJldHR5JywgJ3RydWUn KTsKK1NFTEVDVCAqIEZST00gcGdfZ2V0X3BvbGljeV9kZGwoJ3Jsc190YmxfMScsICdybHNfcDgn LCAncHJldHR5JywgJ3RydWUnKTsKK1NFTEVDVCAqIEZST00gcGdfZ2V0X3BvbGljeV9kZGwoJ3Js c190YmxfMScsICdybHNfcDknLCAncHJldHR5JywgJ3RydWUnKTsKK1xwc2V0IGZvcm1hdCBhbGln bmVkCisKKy0tIFBhc3Mgb3B0aW9ucyB2aWEgVkFSSUFESUMgQVJSQVlbLi4uXSBzeW50YXgKK1NF TEVDVCAqIEZST00gcGdfZ2V0X3BvbGljeV9kZGwoJ3Jsc190YmxfMScsICdybHNfcDEnLAorICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWQVJJQURJQyBBUlJBWVsncHJldHR5JywnZmFs c2UnXSk7CitTRUxFQ1QgKiBGUk9NIHBnX2dldF9wb2xpY3lfZGRsKCdybHNfdGJsXzEnLCAncmxz X3AzJywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVkFSSUFESUMgQVJSQVlbJ3By ZXR0eScsJ2ZhbHNlJ10pOworXHBzZXQgZm9ybWF0IHVuYWxpZ25lZAorU0VMRUNUICogRlJPTSBw Z19nZXRfcG9saWN5X2RkbCgncmxzX3RibF8xJywgJ3Jsc19wMScsCisgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgIFZBUklBRElDIEFSUkFZWydwcmV0dHknLCd0cnVlJ10pOworU0VMRUNU ICogRlJPTSBwZ19nZXRfcG9saWN5X2RkbCgncmxzX3RibF8xJywgJ3Jsc19wMycsCisgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgIFZBUklBRElDIEFSUkFZWydwcmV0dHknLCd0cnVlJ10p OworXHBzZXQgZm9ybWF0IGFsaWduZWQKKy0tIEVtcHR5IFZBUklBRElDIGFycmF5IGJlaGF2ZXMg YXMgZGVmYXVsdCAobm8gb3B0aW9ucykKK1NFTEVDVCAqIEZST00gcGdfZ2V0X3BvbGljeV9kZGwo J3Jsc190YmxfMScsICdybHNfcDEnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBW QVJJQURJQyBBUlJBWVtdOjp0ZXh0W10pOworLS0gVW5yZWNvZ25pemVkIG9wdGlvbiB2aWEgVkFS SUFESUMgQVJSQVkKK1NFTEVDVCAqIEZST00gcGdfZ2V0X3BvbGljeV9kZGwoJ3Jsc190YmxfMScs ICdybHNfcDEnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWQVJJQURJQyBBUlJB WVsnYmFkb3B0JywndHJ1ZSddKTsKKy0tIEludmFsaWQgYm9vbGVhbiB2YWx1ZSB2aWEgVkFSSUFE SUMgQVJSQVkKK1NFTEVDVCAqIEZST00gcGdfZ2V0X3BvbGljeV9kZGwoJ3Jsc190YmxfMScsICdy bHNfcDEnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWQVJJQURJQyBBUlJBWVsn cHJldHR5JywnbWF5YmUnXSk7CistLSBPZGQgbnVtYmVyIG9mIGVsZW1lbnRzIHZpYSBWQVJJQURJ QyBBUlJBWQorU0VMRUNUICogRlJPTSBwZ19nZXRfcG9saWN5X2RkbCgncmxzX3RibF8xJywgJ3Js c19wMScsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZBUklBRElDIEFSUkFZWydw cmV0dHknXSk7CisKKy0tIFJvdW5kLXRyaXA6IHRoZSBnZW5lcmF0ZWQgRERMIG11c3QgYmUgcmUt ZXhlY3V0YWJsZSwgaW5jbHVkaW5nIGZvciBhdG9taWMKKy0tIGJvb2xlYW4gZXhwcmVzc2lvbnMg dGhhdCBwZ19nZXRfZXhwcigpIGRvZXMgbm90IHBhcmVudGhlc2l6ZS4KK0NSRUFURSBUQUJMRSBy bHNfcnQgKGEgaW50KTsKK0NSRUFURSBQT0xJQ1kgcnRfdHJ1ZSBPTiBybHNfcnQgVVNJTkcgKHRy dWUpOworQ1JFQVRFIFBPTElDWSBydF9mYWxzZSBPTiBybHNfcnQgRk9SIElOU0VSVCBXSVRIIENI RUNLIChmYWxzZSk7CitDUkVBVEUgVEVNUCBUQUJMRSBydF9kZGwgQVMKKyAgICBTRUxFQ1QgcGdf Z2V0X3BvbGljeV9kZGwoJ3Jsc19ydCcsICdydF90cnVlJykgQVMgZGRsCisgICAgVU5JT04gQUxM CisgICAgU0VMRUNUIHBnX2dldF9wb2xpY3lfZGRsKCdybHNfcnQnLCAncnRfZmFsc2UnKTsKK0RS T1AgUE9MSUNZIHJ0X3RydWUgT04gcmxzX3J0OworRFJPUCBQT0xJQ1kgcnRfZmFsc2UgT04gcmxz X3J0OworU0VMRUNUIGRkbCBGUk9NIHJ0X2RkbCBPUkRFUiBCWSBkZGwgXGdleGVjCitTRUxFQ1Qg cG9sbmFtZSBGUk9NIHBnX3BvbGljeSBXSEVSRSBwb2xyZWxpZCA9ICdybHNfcnQnOjpyZWdjbGFz cyBPUkRFUiBCWSBwb2xuYW1lOworRFJPUCBUQUJMRSBybHNfcnQ7CisKKy0tIENsZWFuIHVwIG9i amVjdHMgY3JlYXRlZCBmb3IgdGVzdGluZyBwZ19nZXRfcG9saWN5X2RkbCBmdW5jdGlvbi4KK0RS T1AgUE9MSUNZIHJsc19wMSBPTiBybHNfdGJsXzE7CitEUk9QIFBPTElDWSBybHNfcDIgT04gcmxz X3RibF8xOworRFJPUCBQT0xJQ1kgcmxzX3AzIE9OIHJsc190YmxfMTsKK0RST1AgUE9MSUNZIHJs c19wNCBPTiBybHNfdGJsXzE7CitEUk9QIFBPTElDWSBybHNfcDUgT04gcmxzX3RibF8xOworRFJP UCBQT0xJQ1kgcmxzX3A2IE9OIHJsc190YmxfMTsKK0RST1AgUE9MSUNZIHJsc19wNyBPTiBybHNf dGJsXzE7CitEUk9QIFBPTElDWSBybHNfcDggT04gcmxzX3RibF8xOworRFJPUCBQT0xJQ1kgcmxz X3A5IE9OIHJsc190YmxfMTsKK0RST1AgVEFCTEUgcmxzX3RibF8xOworRFJPUCBUQUJMRSBybHNf dGJsXzI7CisKIC0tCiAtLSBDbGVhbiB1cCBvYmplY3RzCiAtLQotLSAKMi41MS4wCgo= --0000000000009dcbdf065564a08b--