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 1w9Jam-001LEU-0p for pgsql-hackers@arkaria.postgresql.org; Sun, 05 Apr 2026 09:16: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 1w9Jak-002A8i-1s for pgsql-hackers@arkaria.postgresql.org; Sun, 05 Apr 2026 09:16:27 +0000 Received: from makus.postgresql.org ([2001:4800:3e1:1::229]) by malur.postgresql.org with esmtps (TLS1.3) tls TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384 (Exim 4.96) (envelope-from ) id 1w9Jaj-002A8W-2j for pgsql-hackers@lists.postgresql.org; Sun, 05 Apr 2026 09:16:26 +0000 Received: from mail-ed1-x52b.google.com ([2a00:1450:4864:20::52b]) by makus.postgresql.org with esmtps (TLS1.3) tls TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256 (Exim 4.98.2) (envelope-from ) id 1w9Jag-00000000ejk-2zv3 for pgsql-hackers@lists.postgresql.org; Sun, 05 Apr 2026 09:16:25 +0000 Received: by mail-ed1-x52b.google.com with SMTP id 4fb4d7f45d1cf-66ee071fe35so136907a12.3 for ; Sun, 05 Apr 2026 02:16:22 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1775380580; cv=none; d=google.com; s=arc-20240605; b=ZVL+IX4j+1aD8lDv40YHYBNvptX4gapEGAZrnsIGcF49Du5NE4qV7NxzC0MbLmdj1e HqQ0uG7+44opvi9poSjuwpmrVoH9CFQClNJij+K26UCZ9Ar2vmzA92xEgxuYoqdnJKL9 NFF9f6/HmtqT1SqIC4TsFH1j9DsIuukMGj6Rtfn+TPzBf3ZOCrMh2PjudKitDLDzb1M5 YHjDBt/zIKA1cjCMe+4vX+TMWa5j2gFjgaJsDHMEqFC/yeXDf1WnAUqW7TWUmnPEas+x g9VVw9Ba6mx3eLxlH9DycVzLmKQpTQq7lHbbwy7xOYhKLkawpj9iK0h9ODtYpNUZwvvI pi4g== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20240605; h=cc:to:subject:message-id:date:from:in-reply-to:references :mime-version:dkim-signature; bh=KorUcoV9GYfBVQjZIpdFP4Hphp3Fzor4YVyYUFlczf0=; fh=JkZo9gzFFU/VfyVJm6/qy9vGLC1US6acBzD5bAl/nHM=; b=ByGI0NGXCzu4yaHbDftIeF6bbjC8KWD0XNC5UBU+uqSED8ECm2lgV1cdhzjgS/+5lj 6oYFTePRkYCA9NNbfdsDJ93/oiBfjde85Cqf226PhsxL3UF7g5FcxrG+OtvUUcFHV4VT KevCtnnZEkMcdperMVoXqRwOdjeapMYpgnwUS39eJXoAGG8dzBcLTYdzbPH908fY+QyG MLXaLC7XE+PbNQ+GNrqGNDBhSegqAB5JukWQ9mXmkc2d7MDW68iCo2WUE1IujHq57edy zAYIryZTcFoTCMt7vkip2N0cGjCKZmJpm10FdHqBrzz+QSrt9yqZ2P9WfrF9JNv3dnn9 CDFw==; 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=gmail.com; s=20251104; t=1775380580; x=1775985380; 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=KorUcoV9GYfBVQjZIpdFP4Hphp3Fzor4YVyYUFlczf0=; b=CKbanYRR7tUtCO1YYKTXmKE5bjNYO4igdNBs2KzOK33Bn+txI6w00yYS5xx0ReAVKb digBX2FlXocVH8bDbNKMf2w17SXWNYkvZEgS1vGBwHDERxsxba+eHJYNkl93KhW4lTUM 3dLJXNrUfSX8ezGto6SwJ06xeW+d7yfIFGBmlQLv19XzmbEI5SSaXbbnhZ6oBhNTSK7q xdWzBFcLIlVMeEKwZZFbm+TEVXvj4/Bl+isFtSwo9gtVLfPvRd8sV0O3kF6vWQa5MYXQ 7vwLxwLjgKHmyeXBz8zv28kfnF1ZvF3vg9HtftC77GHRS9fY1AnRkn4vwkrvSQsROMRq 8hsw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1775380580; x=1775985380; 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=KorUcoV9GYfBVQjZIpdFP4Hphp3Fzor4YVyYUFlczf0=; b=Htja1jJubLjIX3gCIGx+Sj8MIZ/1U8kPn5AlYLDEmkrwROhPnLGytCfyw6MkQ2gg2s UQ9XrybfWbiORYpRRyCawUTmEhaevk9XcNjU38fOnq2nq9CgUG9PVVkGuJaeN1j/E2PC j0AfmC8MVCtsuYWbWdQsBYra01ovgnxITPky30yCwnAjG4A0itXp2aWVoSsu8xWxxjxU 9h8YNFWFduoGSgRvRaFn1pMw8tg+IZgAfsBWex0G9FMg1H/eqHb/JRrZOQaepMBd6AOF L6d7fWFWcvorcwwJolXaYzNUrjapcmtiepm452xBpCq9tj2QibUZGOQNH7XcoD5DSkS/ cs2A== X-Gm-Message-State: AOJu0Yy3Fb4C9sntM6NeJ8CenVS6BLhMVdfvc1pBoejQFbA0n6LISZBq rfnm1z46iblFTIwSnm+IYT0zYZHTXUlKVACs1Xf2L7C8prDPoE9PkX/oZAzl+TwRmrCwDjhFGoF HMARF2GZCKDkf4s+t2QX5Jx5M21OqsIA= X-Gm-Gg: AeBDietPFsCz9WW6iEjFYV/8LYSoNqUcXOtLJpx4U9RX0mACwqfYpT6wAZX7xMNJI3r ukQ6YoBYSY264EW3t0RZUuLa5ezwfLjfSoF1/dsuHVZZjTVet4tX0VXWVfkhdR7hO1r4Z827DqI c6gUo+8uufk4gb4rwyT9d/PMpG1nhJudvgYz3OsTPO5p0EWAIj6WPkHaNzlMt48t3pplo7cbwcz 4Kmmq+pfPyeRrNntLgpp1HlFvSZqMOd1hQSCgHnbSraek0clx4fFuGNDZpUM92ourPT/iIWOGam Vxl6bbQw6xDNzTe2AJ20hB6ALU5SQ5OduTu3d+iju8rl1e9DY5usOT9g1buUq+uZIuk0pzB6BWR W/Y0w7OxPFgoNkFrhqjLUKSPVK/KZz3gu/z1huHN/43Yy/QAaj+FJHYfGLHYYtk7zyhWjhdToR6 Zcy+I8TuWUP/MyS4c= X-Received: by 2002:a05:6402:2749:b0:66b:f7a0:5719 with SMTP id 4fb4d7f45d1cf-66e3f85eb16mr4444602a12.27.1775380579758; Sun, 05 Apr 2026 02:16:19 -0700 (PDT) MIME-Version: 1.0 References: In-Reply-To: From: Florents Tselai Date: Sun, 5 Apr 2026 12:15:42 +0300 X-Gm-Features: AQROBzDQHv2JsHmUCywN_PpYMEEjAyTF8wN67tHkDx86UyvRJZeSCei9j4Voycc Message-ID: Subject: Re: Patch: Add tsmatch JSONPath operator for granular Full Text Search To: Chao Li Cc: pgsql-hackers , Andrew Dunstan Content-Type: multipart/mixed; boundary="000000000000cc9458064eb3008c" List-Id: List-Help: List-Subscribe: List-Post: List-Owner: List-Archive: Archived-At: Precedence: bulk --000000000000cc9458064eb3008c Content-Type: multipart/alternative; boundary="000000000000cc9457064eb3008a" --000000000000cc9457064eb3008a Content-Type: text/plain; charset="UTF-8" Content-Transfer-Encoding: quoted-printable On Sat, Apr 4, 2026 at 12:38=E2=80=AFPM Florents Tselai wrote: > Here's a v5 which is v4 + pgindent > > > > > On Fri, Apr 3, 2026 at 12:56=E2=80=AFPM Florents Tselai > wrote: > >> >> >> >> On Mon, Mar 2, 2026 at 5:44=E2=80=AFAM Chao Li = wrote: >> >>> >>> >>> > On Feb 27, 2026, at 13:59, Florents Tselai >>> wrote: >>> > >>> > >>> > >>> > On Thu, Feb 26, 2026 at 8:48=E2=80=AFAM Chao Li >>> wrote: >>> > >>> > >>> > > On Feb 1, 2026, at 19:02, Florents Tselai >>> wrote: >>> > > >>> > > >>> > > >>> > > >>> > > On Mon, Jan 26, 2026 at 7:22=E2=80=AFPM Florents Tselai < >>> florents.tselai@gmail.com> wrote: >>> > > Hi, >>> > > >>> > > in real-life I work a lot with json & fts search, here's a feature >>> I've always wished I had, >>> > > but never tackle it. Until yesterday that is. >>> > > >>> > > SELECT jsonb_path_query(doc, '$.comments[*] ? (@.user =3D=3D "Alice= " && >>> @.body tsmatch "performance")'); >>> > > >>> > > This patch introduces a tsmatch boolean operator to the JSONPath >>> engine. >>> > > By integrating FTS natively into path expressions, >>> > > this operator allows for high-precision filtering of nested JSONB >>> structures=E2=80=94 >>> > > solving issues with structural ambiguity and query complexity. >>> > > >>> > > Currently, users must choose between two suboptimal paths for >>> FTS-ing nested JSON: >>> > > - Imprecise Global Indexing >>> > > jsonb_to_tsvector aggregates text into a flat vector. >>> > > This ignores JSON boundaries, leading to false positives when the >>> same key (e.g., "body") >>> > > appears in different contexts (e.g., a "Product Description" vs. a >>> "Customer Review"). >>> > > >>> > > - Complex SQL Workarounds >>> > > Achieving 100% precision requires unnesting the document via >>> jsonb_array_elements and LATERAL joins. >>> > > This leads to verbose SQL and high memory overhead from generating >>> intermediate heap tuples. >>> > > >>> > > One of the most significant advantages of tsmatch is its ability to >>> participate in multi-condition predicates >>> > > within the same JSON object - something jsonb_to_tsvector cannot do= . >>> > > >>> > > SELECT jsonb_path_query(doc, '$.comments[*] ? (@.user =3D=3D "Alice= " && >>> @.body tsmatch "performance")'); >>> > > >>> > > In a flat vector, the association between "Alice" and "performance" >>> is lost. >>> > > tsmatch preserves this link by evaluating the FTS predicate in-plac= e >>> during path traversal. >>> > > >>> > > While the SQL/JSON standard (ISO/IEC 9075-2) does not explicitly >>> define an FTS operator, >>> > > tsmatch is architecturally modeled after the standard-defined >>> like_regex. >>> > > >>> > > The implementation follows the like_regex precedent: >>> > > it is a non-indexable predicate that relies on GIN path-matching fo= r >>> pruning and heap re-checks for precision. >>> > > Caching is scoped to the JsonPathExecContext, >>> > > ensuring 'compile-once' efficiency per execution without violating >>> the stability requirements of prepared statements. >>> > > >>> > > This initial implementation uses plainto_tsquery. >>> > > However, the grammar is designed to support a "mode" flag (similar >>> to like_regex flags) >>> > > in future iterations to toggle between to_tsquery, >>> websearch_to_tsquery, and phraseto_tsquery. >>> > > >>> > > Here's a v2, that implements the tsqparser clause >>> > > >>> > > So this should now work too >>> > > >>> > > select jsonb_path_query_array('["fast car", "slow car", "fast and >>> furious"]', '$[*] ? (@ tsmatch "fast car" tsqparser "w") >>> >>> > >>> > Hi Florents, >>> > >>> > Grant pinged me about this. I can review it in coming days. Can you >>> please rebase it? I failed to apply to current master. Also, the CF >>> reported a failure test case, please take a look. >>> > >>> > Hi Evan, >>> > thanks for having a look. The conflict was due to the intro of >>> pg_fallthrough. Not related to this patch . >>> > >>> > I noticed the failure too, but I'm having a hard time reproducing it >>> tbh. >>> > This fails for Debian Trixie with Meson. The same with Autoconf >>> passes... >>> > >>> > https://github.com/Florents-Tselai/postgres/runs/65098077968 >>> > >>> > >>> > >>> > >>> > >>> >>> I have reviewed v3 and traced a few test cases. Here comes my review >>> comments: >>> >>> 1 >>> ``` >>> + string tsmatch >>> string >>> + tsconfig >>> string >>> + tsqparser >>> string >>> ``` >>> >>> For all =E2=80=9Creplaceable=E2=80=9D, instead of =E2=80=9Cstring=E2=80= =9D, would it be better to use >>> something more descriptive? For example: >>> ``` >>> json_string tsmatch >>> query >>> tsconfig >>> config_name >>> tsqparser >>> parser_mode >>> ``` >>> >>> 2 - jsonpath_gram.y >>> ``` >>> +static bool makeItemTsMatch(JsonPathParseItem *doc, >>> + JsonPathStrin= g >>> *tsquery, >>> + JsonPathStrin= g >>> *tsconfig, >>> + JsonPathStrin= g >>> *tsquery_parser, >>> + >>> JsonPathParseItem ** result, >>> + struct Node >>> *escontext); >>> ``` >>> >>> Format Nit: Looking at the existing code, the J in the second and >>> following lines, should be placed in the same column as the J in the fi= rst >>> line. >>> >>> 3 - jsonpath_gram.y >>> ``` >>> + | expr TSMATCH_P STRING_P >>> + { >>> + JsonPathParseItem *jppitem; >>> + /* Pass NULL for tsconfig (3rd) and NULL for >>> tsquery_parser (4th) */ >>> + if (! makeItemTsMatch($1, &$3, NULL, NULL, &jppitem, >>> escontext)) >>> + YYABORT; >>> + $$ =3D jppitem; >>> + } >>> + | expr TSMATCH_P STRING_P TSCONFIG_P STRING_P >>> + { >>> + JsonPathParseItem *jppitem; >>> + /* Pass NULL for tsquery_parser (4th) */ >>> + if (! makeItemTsMatch($1, &$3, &$5, NULL, &jppitem, >>> escontext)) >>> + YYABORT; >>> + $$ =3D jppitem; >>> + } >>> + | expr TSMATCH_P STRING_P TSQUERYPARSER_P STRING_P >>> + { >>> + JsonPathParseItem *jppitem; >>> + /* Pass NULL for tsconfig (3rd) */ >>> + if (! makeItemTsMatch($1, &$3, NULL, &$5, &jppitem, >>> escontext)) >>> + YYABORT; >>> + $$ =3D jppitem; >>> + } >>> + | expr TSMATCH_P STRING_P TSCONFIG_P STRING_P TSQUERYPARSER_P >>> STRING_P >>> + { >>> + JsonPathParseItem *jppitem; >>> + if (! makeItemTsMatch($1, &$3, &$5, &$7, &jppitem, >>> escontext)) >>> + YYABORT; >>> + $$ =3D jppitem; >>> + } >>> ``` >>> >>> Feels a little redundant, repeatedly calls makeItemTsMatch. See the >>> attached diff for a simplification. But my version is a bit longer in t= erms >>> of number of lines. So, up to you. >>> >>> 4 - jsonpath_gram.y >>> ``` >>> +static bool >>> +makeItemTsMatch(JsonPathParseItem *doc, >>> + JsonPathString *tsquery, >>> + JsonPathString *tsconfig, >>> + JsonPathString *tsquery_parser, >>> + JsonPathParseItem **result, >>> + struct Node *escontext) >>> ``` >>> >>> makeItemTsMatch doesn=E2=80=99t need to return a bool. Actually, now it= never >>> returns false, instead, it just ereport(ERROR). >>> >>> 5 - jsonpath.h >>> ``` >>> + struct >>> + { >>> + int32 doc; >>> + char *tsquery; >>> + uint32 tsquerylen; >>> + int32 tsconfig; >>> + char *tsqparser; >>> + uint32 tsqparser_len; >>> + } tsmatch; >>> >>> + struct >>> + { >>> + JsonPathParseItem *doc; >>> + char *tsquery; >>> + uint32 tsquerylen; >>> + JsonPathParseItem *tsconfig; >>> + char *tsqparser; >>> + uint32 tsqparser_len; >>> + } tsmatch; >>> } value; >>> ``` >>> >>> tsquerylen doesn=E2=80=99t have _ before len, and tsqparser_len, would = it be >>> better to make naming conventions consistent in the same structure? >>> >>> 6 - jsonpath_exec.c >>> ``` >>> #include "tsearch/ts_utils.h" >>> #include "tsearch/ts_cache.h" >>> #include "utils/regproc.h" >>> #include "catalog/namespace.h" >>> >>> static JsonPathBool >>> executeTsMatch(JsonPathItem *jsp, JsonbValue *str, JsonbValue *rarg, >>> void *param) >>> ``` >>> >>> Why don=E2=80=99t put these includes to the header section together wit= h other >>> includes? >>> >>> 7 - jsonpath_exec.c >>> ``` >>> + else >>> + { >>> + /* >>> + * Fallback or Error for unknown flags >>> (should be caught by >>> + * parser) >>> + */ >>> + ereport(ERROR, >>> + >>> (errcode(ERRCODE_SYNTAX_ERROR), >>> + errmsg("unrecognized >>> tsqparser flag"))); >>> + } >>> ``` >>> >>> This =E2=80=9Celse=E2=80=9D should never be entered as the same check h= as been done by >>> makeItemTsMatch. So, maybe just use an Assert here, or pg_unreachable()= . >>> >>> 8 - jsonpath_exec.c >>> ``` >>> + /* Setup Context (Run ONLY once per predicate) */ >>> + if (!cxt->initialized) >>> ``` >>> >>> While tracing this SQL: >>> ``` >>> evantest=3D# SELECT '{"tags": ["running", "jogging"]}'::jsonb >>> evantest-# @@ '$.tags[*] ? (@ tsmatch "run" tsconfig "english")'; >>> ?column? >>> ---------- >>> >>> (1 row) >>> ``` >>> >>> I noticed that, when process =E2=80=9Cjogging=E2=80=9D, cxt->initialize= d is still false, >>> meaning that, the cxt is not reused across array items. Given the same >>> tsconfig should apply to all array items, I think cxt should be reused. >>> >>> 9 - jsonpath_exec.c >>> ``` >>> + /* Select Parser and Compile Query */ >>> + parser_mode =3D jsp->content.tsmatch.tsqparser; >>> + parser_len =3D jsp->content.tsmatch.tsqparser_len; >>> + >>> + if (parser_len > 0) >>> + { >>> + /* Dispatch based on flag */ >>> + if (pg_strncasecmp(parser_mode, "pl", >>> parser_len) =3D=3D 0) >>> ``` >>> >>> Nit: parser_mode is only used inside if (parser_len > 0), it can be >>> defined inside the =E2=80=9Cif=E2=80=9D. >>> >>> 10 - jsonpath_gram.y >>> ``` >>> + ereport(ERROR, >>> + (errcode(ERRCODE_SYNTAX_ERROR)= , >>> + errmsg("invalid tsquery_parse= r >>> value: \"%s\"", tsquery_parser->val), >>> + errhint("Valid values are >>> \"pl\", \"ph\", and \"w\"."))); >>> ``` >>> >>> When tested a case with an invalid parser, I got: >>> ``` >>> evantest=3D# SELECT '{"tags": ["running", "jogging"]}'::jsonb >>> >>> @? '$.tags[*] ? (@ tsmatch "run" tsconfig "english" tsqpars= er >>> "pss")'; >>> ERROR: invalid tsquery_parser value: "pss = @" >>> LINE 2: @? '$.tags[*] ? (@ tsmatch "run" tsconfig "english" tsqpar... >>> ^ >>> HINT: Valid values are "pl", "ph", and "w". >>> ``` >>> >>> You can see the it shows a bad looking invalid value. I think that=E2= =80=99s >>> because tsquery_parser->val is not NULL terminated. I fixed this proble= m >>> with: >>> ``` >>> errmsg("invalid tsquery_parser value: \"%.*s\"", (int) >>> tsquery_parser->len, tsquery_parser->val), >>> ``` >>> >>> This change is also included in the attached diff file. >>> >>> 11 - jsonpath.c >>> ``` >>> + if (printBracketes) >>> + appendStringInfoChar(buf, ')'); >>> + break; >>> + >>> if (printBracketes) >>> appendStringInfoChar(buf, ')'); >>> ``` >>> >>> Duplicate code. Looks like a copy-pasto. >>> >>> 12 - jsonpath.c >>> ``` >>> + /* Write the Main Query String */ >>> + appendBinaryStringInfo(buf, >>> + >>> &item->value.tsmatch.tsquerylen, >>> + >>> sizeof(item->value.tsmatch.tsquerylen)); >>> + appendBinaryStringInfo(buf, >>> + >>> item->value.tsmatch.tsquery, >>> + >>> item->value.tsmatch.tsquerylen); >>> + appendStringInfoChar(buf, '\0'); >>> ``` >>> >>> I don=E2=80=99t think we need to manually append =E2=80=98\0=E2=80=99 a= fter >>> appendBinaryStringInfo. Looking at the header comment of >>> appendBinaryStringInfo, it says that a trailing null will be added. >>> ``` >>> /* >>> * appendBinaryStringInfo >>> * >>> * Append arbitrary binary data to a StringInfo, allocating more space >>> * if necessary. Ensures that a trailing null byte is present. >>> */ >>> void >>> appendBinaryStringInfo(StringInfo str, const void *data, int datalen) >>> ``` >>> >> >> Here's a v4 which incorporates most of Evan's comments & feedback >> - shifted tsquery compilation logic to use persistent cache within >> JsonPathExecContext >> - Fixed a binary serialization alignment issue which caused Dixie to fai= l >> earlier >> - I've refactor and simplified the grammar per Evan's input by adding a >> tsmatch_opts rule. >> - Also updated the docs per Evan's comments >> >> >> Andrew was kind enough to give some comments off-list. Here's a v6 - Fixed soft-error path in makeItemTsMatch - ereport replaced with errsave, return value now checked at the grammar call site with YYABORT - Fixed pg_strncasecmp prefix match bug in parser-mode validation - "p" was being accepted as "pl" - Fixed get_ts_config_oid to throw on unknown tsconfig instead of passing InvalidOid downstream - Grammar restructured to make tsconfig and tsqparser order-independent - Removed unused JsonTsMatchContext struct and some misplaced #includes --000000000000cc9457064eb3008a Content-Type: text/html; charset="UTF-8" Content-Transfer-Encoding: quoted-printable

<= /div>


<= /div>


On Sat, Apr 4, 2026 at 12:38=E2=80=AFPM Fl= orents Tselai <florents.tselai@gmail.com> wrote:
=
Here's a v5 which is v4=C2=A0+ pgindent=C2=A0




On Fri, Apr 3, 2026 at 12:56= =E2=80=AFPM Florents Tselai <florents.tselai@gmail.com> wrote:


On Mon, Mar 2, 2026 at 5:44=E2=80=AFAM Chao Li <li.evan.chao@gmail.com> wrote:=


> On Feb 27, 2026, at 13:59, Florents Tselai <florents.tselai@gmail.com> w= rote:
>
>
>
> On Thu, Feb 26, 2026 at 8:48=E2=80=AFAM Chao Li <li.evan.chao@gmail.com> wr= ote:
>
>
> > On Feb 1, 2026, at 19:02, Florents Tselai <florents.tselai@gmail.com&g= t; wrote:
> >
> >
> >
> >
> > On Mon, Jan 26, 2026 at 7:22=E2=80=AFPM Florents Tselai <florents.tselai@g= mail.com> wrote:
> > Hi,
> >
> > in real-life I work a lot with json & fts search, here's = a feature I've always wished I had,
> > but never tackle it. Until yesterday that is.
> >
> > SELECT jsonb_path_query(doc, '$.comments[*] ? (@.user =3D=3D = "Alice" && @.body tsmatch "performance")');=
> >
> > This patch introduces a tsmatch boolean operator to the JSONPath = engine.
> > By integrating FTS natively into path expressions,
> > this operator allows for high-precision filtering of nested JSONB= structures=E2=80=94
> > solving issues with structural ambiguity and query complexity. > >
> > Currently, users must choose between two suboptimal paths for FTS= -ing nested JSON:
> > - Imprecise Global Indexing
> > jsonb_to_tsvector aggregates text into a flat vector.
> > This ignores JSON boundaries, leading to false positives when the= same key (e.g., "body")
> > appears in different contexts (e.g., a "Product Description&= quot; vs. a "Customer Review").
> >
> > - Complex SQL Workarounds
> > Achieving 100% precision requires unnesting the document via json= b_array_elements and LATERAL joins.
> > This leads to verbose SQL and high memory overhead from generatin= g intermediate heap tuples.
> >
> > One of the most significant advantages of tsmatch is its ability = to participate in multi-condition predicates
> > within the same JSON object - something jsonb_to_tsvector cannot = do.
> >
> > SELECT jsonb_path_query(doc, '$.comments[*] ? (@.user =3D=3D = "Alice" && @.body tsmatch "performance")');=
> >
> > In a flat vector, the association between "Alice" and &= quot;performance" is lost.
> > tsmatch preserves this link by evaluating the FTS predicate in-pl= ace during path traversal.
> >
> > While the SQL/JSON standard (ISO/IEC 9075-2) does not explicitly = define an FTS operator,
> > tsmatch is architecturally modeled after the standard-defined lik= e_regex.
> >
> > The implementation follows the like_regex precedent:
> > it is a non-indexable predicate that relies on GIN path-matching = for pruning and heap re-checks for precision.
> > Caching is scoped to the JsonPathExecContext,
> > ensuring 'compile-once' efficiency per execution without = violating the stability requirements of prepared statements.
> >
> > This initial implementation uses plainto_tsquery.
> > However, the grammar is designed to support a "mode" fl= ag (similar to like_regex flags)
> > in future iterations to toggle between to_tsquery, websearch_to_t= squery, and phraseto_tsquery.
> >
> > Here's a v2, that implements the tsqparser clause
> >
> > So this should now work too
> >
> > select jsonb_path_query_array('["fast car", "s= low car", "fast and furious"]', '$[*] ? (@ tsmatch &= quot;fast car" tsqparser "w") <v2-0001-Add-tsmatch-JSONPa= th-operator-for-granular-Full-T.patch>
>
> Hi Florents,
>
> Grant pinged me about this. I can review it in coming days. Can you pl= ease rebase it? I failed to apply to current master. Also, the CF reported = a failure test case, please take a look.
>
>=C2=A0 Hi Evan,
> thanks for having a look. The conflict was due to the intro of pg_fall= through. Not related to this patch .
>
> I noticed the failure too, but I'm having a hard time reproducing = it tbh.
> This fails for Debian Trixie with Meson. The same with Autoconf passes= ...
>
> https://github.com/Florents-Tselai/= postgres/runs/65098077968
>
>
>
>
> <v3-0001-Add-tsmatch-JSONPath-operator-for-granular-Full-T.patch>= ;

I have reviewed v3 and traced a few test cases. Here comes my review commen= ts:

1
```
+=C2=A0 =C2=A0 =C2=A0 =C2=A0 <replaceable>string</replaceable> = <literal>tsmatch</literal> <replaceable>string</replac= eable>
+=C2=A0 =C2=A0 =C2=A0 =C2=A0 <optional> <literal>tsconfig</l= iteral> <replaceable>string</replaceable> </optional><= br> +=C2=A0 =C2=A0 =C2=A0 =C2=A0 <optional> <literal>tsqparser</= literal> <replaceable>string</replaceable> </optional>=
```

For all =E2=80=9Creplaceable=E2=80=9D, instead of =E2=80=9Cstring=E2=80=9D,= would it be better to use something more descriptive? For example:
```
<replaceable>json_string</replaceable> <literal>tsmatch&l= t;/literal> <replaceable>query</replaceable>
<optional> <literal>tsconfig</literal> <replaceable>= ;config_name</replaceable> </optional>
<optional> <literal>tsqparser</literal> <replaceable&g= t;parser_mode</replaceable> </optional>
```

2 - jsonpath_gram.y
```
+static bool makeItemTsMatch(JsonPathParseItem *doc,
+=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=A0JsonPathString *tsqu= ery,
+=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=A0JsonPathString *tsco= nfig,
+=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=A0JsonPathString *tsqu= ery_parser,
+=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=A0JsonPathParseItem **= result,
+=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=A0struct Node *esconte= xt);
```

Format Nit: Looking at the existing code, the J in the second and following= lines, should be placed in the same column as the J in the first line.

3 - jsonpath_gram.y
```
+=C2=A0 =C2=A0 =C2=A0 =C2=A0| expr TSMATCH_P STRING_P
+=C2=A0 =C2=A0 =C2=A0 =C2=A0{
+=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0JsonPathParseItem *= jppitem;
+=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0/* Pass NULL for ts= config (3rd) and NULL for tsquery_parser (4th) */
+=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0if (! makeItemTsMat= ch($1, &$3, NULL, NULL, &jppitem, escontext))
+=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 YYABORT; +=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0$$ =3D jppitem;
+=C2=A0 =C2=A0 =C2=A0 =C2=A0}
+=C2=A0 =C2=A0 =C2=A0 =C2=A0| expr TSMATCH_P STRING_P TSCONFIG_P STRING_P +=C2=A0 =C2=A0 =C2=A0 =C2=A0{
+=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0JsonPathParseItem *= jppitem;
+=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0/* Pass NULL for ts= query_parser (4th) */
+=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0if (! makeItemTsMat= ch($1, &$3, &$5, NULL, &jppitem, escontext))
+=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 YYABORT; +=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0$$ =3D jppitem;
+=C2=A0 =C2=A0 =C2=A0 =C2=A0}
+=C2=A0 =C2=A0 =C2=A0 =C2=A0| expr TSMATCH_P STRING_P TSQUERYPARSER_P STRIN= G_P
+=C2=A0 =C2=A0 =C2=A0 =C2=A0{
+=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0JsonPathParseItem *= jppitem;
+=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0/* Pass NULL for ts= config (3rd) */
+=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0if (! makeItemTsMat= ch($1, &$3, NULL, &$5, &jppitem, escontext))
+=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 YYABORT; +=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0$$ =3D jppitem;
+=C2=A0 =C2=A0 =C2=A0 =C2=A0}
+=C2=A0 =C2=A0 =C2=A0 =C2=A0| expr TSMATCH_P STRING_P TSCONFIG_P STRING_P T= SQUERYPARSER_P STRING_P
+=C2=A0 =C2=A0 =C2=A0 =C2=A0{
+=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0JsonPathParseItem *= jppitem;
+=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0if (! makeItemTsMat= ch($1, &$3, &$5, &$7, &jppitem, escontext))
+=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 YYABORT; +=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0$$ =3D jppitem;
+=C2=A0 =C2=A0 =C2=A0 =C2=A0}
```

Feels a little redundant, repeatedly calls makeItemTsMatch. See the attache= d diff for a simplification. But my version is a bit longer in terms of num= ber of lines. So, up to you.

4 - jsonpath_gram.y
```
+static bool
+makeItemTsMatch(JsonPathParseItem *doc,
+=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2= =A0 =C2=A0 JsonPathString *tsquery,
+=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2= =A0 =C2=A0 JsonPathString *tsconfig,
+=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2= =A0 =C2=A0 JsonPathString *tsquery_parser,
+=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2= =A0 =C2=A0 JsonPathParseItem **result,
+=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2= =A0 =C2=A0 struct Node *escontext)
```

makeItemTsMatch doesn=E2=80=99t need to return a bool. Actually, now it nev= er returns false, instead, it just ereport(ERROR).

5 - jsonpath.h
```
+=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0struct
+=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=A0int32=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0doc;
+=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2= =A0 =C2=A0char=C2=A0 =C2=A0 =C2=A0 =C2=A0*tsquery;
+=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2= =A0 =C2=A0uint32=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 tsquerylen;
+=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2= =A0 =C2=A0int32=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0tsconfig;
+=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2= =A0 =C2=A0char=C2=A0 =C2=A0 =C2=A0 =C2=A0*tsqparser;
+=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2= =A0 =C2=A0uint32=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 tsqparser_len;
+=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=A0tsmatch;<= br>
+=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0struct
+=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=A0JsonPathParseItem *doc;
+=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2= =A0 =C2=A0char=C2=A0 =C2=A0 =C2=A0 =C2=A0*tsquery;
+=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2= =A0 =C2=A0uint32=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 tsquerylen;
+=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2= =A0 =C2=A0JsonPathParseItem *tsconfig;
+=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2= =A0 =C2=A0char=C2=A0 =C2=A0 =C2=A0 =C2=A0*tsqparser;
+=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2= =A0 =C2=A0uint32=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 tsqparser_len;
+=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=A0tsmatch;<= br> =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=A0value;
```

tsquerylen doesn=E2=80=99t have _ before len, and tsqparser_len, would it b= e better to make naming conventions consistent in the same structure?

6 - jsonpath_exec.c
```
#include "tsearch/ts_utils.h"
#include "tsearch/ts_cache.h"
#include "utils/regproc.h"
#include "catalog/namespace.h"

static JsonPathBool
executeTsMatch(JsonPathItem *jsp, JsonbValue *str, JsonbValue *rarg,
void *param)
```

Why don=E2=80=99t put these includes to the header section together with ot= her includes?

7 - jsonpath_exec.c
```
+=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2= =A0 =C2=A0else
+=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 =C2=A0 * Fallback or Error for unknown flag= s (should be caught by
+=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 * parser)
+=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=A0ereport(ERROR,
+=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(errcode(ERRCODE_SYNTAX_ERROR),
+=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 errmsg("unrecognized tsqparser flag")));
+=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2= =A0 =C2=A0}
```

This =E2=80=9Celse=E2=80=9D should never be entered as the same check has b= een done by makeItemTsMatch. So, maybe just use an Assert here, or pg_unrea= chable().

8 -=C2=A0 jsonpath_exec.c
```
+=C2=A0 =C2=A0 =C2=A0 =C2=A0/* Setup Context (Run ONLY once per predicate) = */
+=C2=A0 =C2=A0 =C2=A0 =C2=A0if (!cxt->initialized)
```

While tracing this SQL:
```
evantest=3D# SELECT '{"tags": ["running", "jog= ging"]}'::jsonb
evantest-#=C2=A0 =C2=A0@@ '$.tags[*] ? (@ tsmatch "run" tscon= fig "english")';
=C2=A0?column?
----------

(1 row)
```

I noticed that, when process =E2=80=9Cjogging=E2=80=9D, cxt->initialized= is still false, meaning that, the cxt is not reused across array items. Gi= ven the same tsconfig should apply to all array items, I think cxt should b= e reused.

9 -=C2=A0 jsonpath_exec.c
```
+=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0/* Select Parser an= d Compile Query */
+=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0parser_mode =3D jsp= ->content.tsmatch.tsqparser;
+=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0parser_len =3D jsp-= >content.tsmatch.tsqparser_len;
+
+=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0if (parser_len >= 0)
+=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/* Dispatch based on flag */
+=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2= =A0 =C2=A0if (pg_strncasecmp(parser_mode, "pl", parser_len) =3D= =3D 0)
```

Nit: parser_mode is only used inside if (parser_len > 0), it can be defi= ned inside the =E2=80=9Cif=E2=80=9D.

10 - jsonpath_gram.y
```
+=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2= =A0 =C2=A0 ereport(ERROR,
+=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 (errcode= (ERRCODE_SYNTAX_ERROR),
+=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=A0er= rmsg("invalid tsquery_parser value: \"%s\"", tsquery_pa= rser->val),
+=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=A0er= rhint("Valid values are \"pl\", \"ph\", and \"= ;w\".")));
```

When tested a case with an invalid parser, I got:
```
evantest=3D# SELECT '{"tags": ["running", "jog= ging"]}'::jsonb=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 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 = =C2=A0 =C2=A0 @? '$.tags[*] ? (@ tsmatch "run" tsconfig "= ;english" tsqparser "pss")';
ERROR:=C2=A0 invalid tsquery_parser value: "pss=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@"
LINE 2:=C2=A0 =C2=A0@? '$.tags[*] ? (@ tsmatch "run" tsconfig= "english" tsqpar...
=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0^
HINT:=C2=A0 Valid values are "pl", "ph", and "w&qu= ot;.
```

You can see the it shows a bad looking invalid value. I think that=E2=80=99= s because tsquery_parser->val is not NULL terminated. I fixed this probl= em with:
```
errmsg("invalid tsquery_parser value: \"%.*s\"", (int) = tsquery_parser->len, tsquery_parser->val),
```

This change is also included in the attached diff file.

11 - jsonpath.c
```
+=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2= =A0 =C2=A0if (printBracketes)
+=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=A0appendStringInfoChar(buf, ')'= );
+=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2= =A0 =C2=A0break;
+
=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2= =A0 =C2=A0 if (printBracketes)
=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 appendStringInfoChar(buf, ')'= ;);
```

Duplicate code. Looks like a copy-pasto.

12 - jsonpath.c
```
+=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/* Write the Main Query String */
+=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=A0appendBinaryStringInfo(buf,
+=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 &item->value.tsmatch.tsqueryl= en,
+=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 sizeof(item->value.tsmatch.tsquer= ylen));
+=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=A0appendBinaryStringInfo(buf,
+=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 item->value.tsmatch.tsquery,
+=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 item->value.tsmatch.tsquerylen);<= br> +=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=A0appendStringInfoChar(buf, '\0'= ;);
```

I don=E2=80=99t think we need to manually append =E2=80=98\0=E2=80=99 after= appendBinaryStringInfo. Looking at the header comment of appendBinaryStrin= gInfo, it says that a trailing null will be added.
```
/*
* appendBinaryStringInfo
*
* Append arbitrary binary data to a StringInfo, allocating more space
* if necessary. Ensures that a trailing null byte is present.
*/
void
appendBinaryStringInfo(StringInfo str, const void *data, int datalen)
```

Here's a v4 which incorporates = most of Evan's comments & feedback
- shifted tsquery comp= ilation logic to use persistent cache within JsonPathExecContext
= - Fixed a binary serialization alignment issue which caused Dixie to fail e= arlier
- I've refactor and simplified the grammar per Evan= 9;s input by adding a tsmatch_opts rule.
- Also updated the docs = per Evan's comments=C2=A0



Andrew was kind enoug= h to give some comments off-list.

Here's a v6<= /div>

- Fixed soft-error path in makeItemTsMatch - erepo= rt replaced with errsave, return value now checked at the grammar call site= with YYABORT=C2=A0
- Fixed pg_strncasecmp prefix match bug in pa= rser-mode validation - "p" was being accepted as "pl"= =C2=A0
- Fixed get_ts_config_oid to throw on unknown tsconfig ins= tead of passing InvalidOid downstream=C2=A0
- Grammar restructure= d to make tsconfig and tsqparser order-independent=C2=A0
- Remove= d unused JsonTsMatchContext struct and some misplaced #includes
--000000000000cc9457064eb3008a-- --000000000000cc9458064eb3008c Content-Type: application/octet-stream; name="v6-0001-Add-tsmatch-JSONPath-operator-for-granular-Full-T.patch" Content-Disposition: attachment; filename="v6-0001-Add-tsmatch-JSONPath-operator-for-granular-Full-T.patch" Content-Transfer-Encoding: base64 Content-ID: X-Attachment-Id: f_mnljq5bw0 RnJvbSA0MDk0NzgzNGQ1ODEzMWMwYjkyOGQ0YmJlNzlmZTg4NWQ0ODJmY2NjIE1vbiBTZXAgMTcg MDA6MDA6MDAgMjAwMQpGcm9tOiBGbG9yZW50cyBUc2VsYWkgPGZsb3JlbnRzLnRzZWxhaUBnbWFp bC5jb20+CkRhdGU6IFN1biwgNSBBcHIgMjAyNiAxMTo1MjowMyArMDMwMApTdWJqZWN0OiBbUEFU Q0ggdjZdIEFkZCB0c21hdGNoIEpTT05QYXRoIG9wZXJhdG9yIGZvciBncmFudWxhciBGdWxsIFRl eHQKIFNlYXJjaApNSU1FLVZlcnNpb246IDEuMApDb250ZW50LVR5cGU6IHRleHQvcGxhaW47IGNo YXJzZXQ9VVRGLTgKQ29udGVudC1UcmFuc2Zlci1FbmNvZGluZzogOGJpdAoKVGhpcyBwYXRjaCBp bnRyb2R1Y2VzIHRoZSB0c21hdGNoIGJvb2xlYW4gb3BlcmF0b3IgdG8gdGhlIEpTT05QYXRoIGVu Z2luZS4KIEJ5IGludGVncmF0aW5nIEZUUyBuYXRpdmVseSBpbnRvIHBhdGggZXhwcmVzc2lvbnMs IHRoaXMgb3BlcmF0b3IgYWxsb3dzCiBmb3IgaGlnaC1wcmVjaXNpb24gZmlsdGVyaW5nIG9mIG5l c3RlZCBKU09OQiBzdHJ1Y3R1cmVz4oCUc29sdmluZyBpc3N1ZXMKIHdpdGggc3RydWN0dXJhbCBh bWJpZ3VpdHkgYW5kIHF1ZXJ5IGNvbXBsZXhpdHkuCgogQ3VycmVudGx5LCB1c2VycyBtdXN0IGNo b29zZSBiZXR3ZWVuIHR3byBzdWJvcHRpbWFsIHBhdGhzIGZvciBzZWFyY2hpbmcKIG5lc3RlZCBK U09OOgoKIDEuIEltcHJlY2lzZSBHbG9iYWwgSW5kZXhpbmcKICAgIGpzb25iX3RvX3RzdmVjdG9y IGFnZ3JlZ2F0ZXMgdGV4dCBpbnRvIGEgZmxhdCB2ZWN0b3IuIFRoaXMgaWdub3JlcwogICAgSlNP TiBib3VuZGFyaWVzLCBsZWFkaW5nIHRvIGZhbHNlIHBvc2l0aXZlcyB3aGVuIHRoZSBzYW1lIGtl eQogICAgKGUuZy4sICJib2R5IikgYXBwZWFycyBpbiBkaWZmZXJlbnQgY29udGV4dHMgKGUuZy4s IGEgIlByb2R1Y3QKICAgIERlc2NyaXB0aW9uIiB2cy4gYSAiQ3VzdG9tZXIgUmV2aWV3IikuCgog Mi4gQ29tcGxleCBTUUwgV29ya2Fyb3VuZHMKICAgIEFjaGlldmluZyAxMDAlIHByZWNpc2lvbiBy ZXF1aXJlcyAiZXhwbG9kaW5nIiB0aGUgZG9jdW1lbnQgdmlhCiAgICBqc29uYl9hcnJheV9lbGVt ZW50cyBhbmQgTEFURVJBTCBqb2lucy4gVGhpcyBsZWFkcyB0byB2ZXJib3NlIFNRTAogICAgYW5k IGhpZ2ggbWVtb3J5IG92ZXJoZWFkIGZyb20gZ2VuZXJhdGluZyBpbnRlcm1lZGlhdGUgaGVhcCB0 dXBsZXMuCgogT25lIG9mIHRoZSBtb3N0IHNpZ25pZmljYW50IGFkdmFudGFnZXMgb2YgdHNtYXRj aCBpcyBpdHMgYWJpbGl0eSB0bwogcGFydGljaXBhdGUgaW4gbXVsdGktY29uZGl0aW9uIHByZWRp Y2F0ZXMgd2l0aGluIHRoZSBzYW1lIEpTT04gb2JqZWN04oCUCiBzb21ldGhpbmcganNvbmJfdG9f dHN2ZWN0b3IgY2Fubm90IGRvLgoKICAgU0VMRUNUIGpzb25iX3BhdGhfcXVlcnkoZG9jLCAnJC5j b21tZW50c1sqXSA/IChALnVzZXIgPT0gIkFsaWNlIiAmJiBALmJvZHkgdHNtYXRjaCAicGVyZm9y bWFuY2UiKScpOwoKIEluIGEgZmxhdCB2ZWN0b3IsIHRoZSBhc3NvY2lhdGlvbiBiZXR3ZWVuICJB bGljZSIgYW5kICJwZXJmb3JtYW5jZSIgaXMKIGxvc3QuIHRzbWF0Y2ggcHJlc2VydmVzIHRoaXMg bGluayBieSBldmFsdWF0aW5nIHRoZSBGVFMgcHJlZGljYXRlCiBpbi1wbGFjZSBkdXJpbmcgcGF0 aCB0cmF2ZXJzYWwuCgogV2hpbGUgdGhlIFNRTC9KU09OIHN0YW5kYXJkIChJU08vSUVDIDkwNzUt MikgZG9lcyBub3QgZXhwbGljaXRseSBkZWZpbmUKIGFuIEZUUyBvcGVyYXRvciwgdHNtYXRjaCBp cyBhcmNoaXRlY3R1cmFsbHkgbW9kZWxlZCBhZnRlciB0aGUKIHN0YW5kYXJkLWRlZmluZWQgbGlr ZV9yZWdleC4KCiBUaGUgb3BlcmF0b3Igc3VwcG9ydHMgb3B0aW9uYWwgY29uZmlndXJhdGlvbiBm b3IgYm90aCB0aGUgZGljdGlvbmFyeSBhbmQKIHRoZSBxdWVyeSBwYXJzZXI6CgogICBAIHRzbWF0 Y2ggInF1ZXJ5IiBbIHRzY29uZmlnICJyZWdjb25maWciIF0gWyB0c3FwYXJzZXIgIm1vZGUiIF0K CiBTdXBwb3J0ZWQgcGFyc2VyIG1vZGVzIGFyZToKICAtICJwbCI6IHBsYWludG9fdHNxdWVyeSAo bm8gb3BlcmF0b3JzIHJlcXVpcmVkKQogIC0gInBoIjogcGhyYXNldG9fdHNxdWVyeQogIC0gInci OiAgd2Vic2VhcmNoX3RvX3RzcXVlcnkKICAtIE9taXR0ZWQ6IERlZmF1bHRzIHRvIHRvX3RzcXVl cnkgKHN0cmljdCBtb2RlKQoKIFRoZSBpbXBsZW1lbnRhdGlvbiByZWxpZXMgb24gR0lOIHBhdGgt bWF0Y2hpbmcgZm9yIGluZGV4IHBydW5pbmcgYW5kCiBoZWFwIHJlLWNoZWNrcyBmb3IgcHJlY2lz aW9uLiBDYWNoaW5nIGlzIHNjb3BlZCB0byB0aGUKIEpzb25QYXRoRXhlY0NvbnRleHQsIGVuc3Vy aW5nICdjb21waWxlLW9uY2UnIGVmZmljaWVuY3kgZm9yIHRoZQogdHNxdWVyeSBhbmQgT0lEIGxv b2t1cCBwZXIgZXhlY3V0aW9uLCByZXNwZWN0aW5nIHRoZSBzdGFiaWxpdHkKIHJlcXVpcmVtZW50 cyBvZiBwcmVwYXJlZCBzdGF0ZW1lbnRzLgotLS0KIGRvYy9zcmMvc2dtbC9mdW5jL2Z1bmMtanNv bi5zZ21sICAgICAgICAgICAgIHwgIDM1ICsrKysrCiBzcmMvYmFja2VuZC91dGlscy9hZHQvanNv bnBhdGguYyAgICAgICAgICAgICB8IDEyOCArKysrKysrKysrKysrKystCiBzcmMvYmFja2VuZC91 dGlscy9hZHQvanNvbnBhdGhfZXhlYy5jICAgICAgICB8IDE0NyArKysrKysrKysrKysrKysrKyst CiBzcmMvYmFja2VuZC91dGlscy9hZHQvanNvbnBhdGhfZ3JhbS55ICAgICAgICB8IDExNyArKysr KysrKysrKysrKy0KIHNyYy9iYWNrZW5kL3V0aWxzL2FkdC9qc29ucGF0aF9zY2FuLmwgICAgICAg IHwgICAzICsKIHNyYy9pbmNsdWRlL3V0aWxzL2pzb25wYXRoLmggICAgICAgICAgICAgICAgIHwg IDE5ICsrKwogc3JjL3Rlc3QvcmVncmVzcy9leHBlY3RlZC9qc29uYl9qc29ucGF0aC5vdXQgfCAg NTggKysrKysrKysKIHNyYy90ZXN0L3JlZ3Jlc3MvZXhwZWN0ZWQvanNvbnBhdGgub3V0ICAgICAg IHwgIDYyICsrKysrKysrCiBzcmMvdGVzdC9yZWdyZXNzL3NxbC9qc29uYl9qc29ucGF0aC5zcWwg ICAgICB8ICAxMyArKwogc3JjL3Rlc3QvcmVncmVzcy9zcWwvanNvbnBhdGguc3FsICAgICAgICAg ICAgfCAgMTkgKysrCiAxMCBmaWxlcyBjaGFuZ2VkLCA1OTcgaW5zZXJ0aW9ucygrKSwgNCBkZWxl dGlvbnMoLSkKCmRpZmYgLS1naXQgYS9kb2Mvc3JjL3NnbWwvZnVuYy9mdW5jLWpzb24uc2dtbCBi L2RvYy9zcmMvc2dtbC9mdW5jL2Z1bmMtanNvbi5zZ21sCmluZGV4IDRjZDMzOGZlNmUzLi45Yzg5 MDU2NjhhYyAxMDA2NDQKLS0tIGEvZG9jL3NyYy9zZ21sL2Z1bmMvZnVuYy1qc29uLnNnbWwKKysr IGIvZG9jL3NyYy9zZ21sL2Z1bmMvZnVuYy1qc29uLnNnbWwKQEAgLTMyNDcsNiArMzI0Nyw0MSBA QCBFUlJPUjogIGpzb25wYXRoIG1lbWJlciBhY2Nlc3NvciBjYW4gb25seSBiZSBhcHBsaWVkIHRv IGFuIG9iamVjdAogICAgICAgICA8cmV0dXJudmFsdWU+W108L3JldHVybnZhbHVlPgogICAgICAg IDwvcGFyYT48L2VudHJ5PgogICAgICAgPC9yb3c+CisgICAgICA8cm93PgorICAgICAgIDxlbnRy eSByb2xlPSJmdW5jX3RhYmxlX2VudHJ5Ij48cGFyYSByb2xlPSJmdW5jX3NpZ25hdHVyZSI+Cisg ICAgICAgIDxyZXBsYWNlYWJsZT5qc29uX3N0cmluZzwvcmVwbGFjZWFibGU+IDxsaXRlcmFsPnRz bWF0Y2g8L2xpdGVyYWw+IDxyZXBsYWNlYWJsZT5xdWVyeTwvcmVwbGFjZWFibGU+CisgICAgICAg IDxvcHRpb25hbD4gPGxpdGVyYWw+dHNjb25maWc8L2xpdGVyYWw+IDxyZXBsYWNlYWJsZT5jb25m aWdfbmFtZTwvcmVwbGFjZWFibGU+IDwvb3B0aW9uYWw+CisgICAgICAgIDxvcHRpb25hbD4gPGxp dGVyYWw+dHNxcGFyc2VyPC9saXRlcmFsPiA8cmVwbGFjZWFibGU+cGFyc2VyX21vZGU8L3JlcGxh Y2VhYmxlPiA8L29wdGlvbmFsPgorICAgICAgICA8cmV0dXJudmFsdWU+Ym9vbGVhbjwvcmV0dXJu dmFsdWU+CisgICAgICAgPC9wYXJhPgorICAgICAgICA8cGFyYT4KKyAgICAgICAgIFRlc3RzIHdo ZXRoZXIgdGhlIEpTT04gc3RyaW5nIChmaXJzdCBvcGVyYW5kKSBtYXRjaGVzIHRoZSBmdWxsLXRl eHQgc2VhcmNoIHF1ZXJ5CisgICAgICAgICAoc2Vjb25kIG9wZXJhbmQpLiBUaGUgbWF0Y2hpbmcg YmVoYXZpb3IgY2FuIGJlIGN1c3RvbWl6ZWQgdXNpbmcgdGhlIG9wdGlvbmFsCisgICAgICAgICA8 bGl0ZXJhbD50c2NvbmZpZzwvbGl0ZXJhbD4gYW5kIDxsaXRlcmFsPnRzcXBhcnNlcjwvbGl0ZXJh bD4gY2xhdXNlcy4KKyAgICAgICAgIElmIDxsaXRlcmFsPnRzY29uZmlnPC9saXRlcmFsPiBpcyBv bWl0dGVkLCB0aGUgY3VycmVudCBzZXNzaW9uJ3MgZGVmYXVsdCB0ZXh0IHNlYXJjaCBjb25maWd1 cmF0aW9uCisgICAgICAgICBpcyB1c2VkIChzZWUgPHhyZWYgbGlua2VuZD0iZ3VjLWRlZmF1bHQt dGV4dC1zZWFyY2gtY29uZmlnIi8+KS4KKyAgICAgICAgIFRoZSA8bGl0ZXJhbD50c3FwYXJzZXI8 L2xpdGVyYWw+IGNsYXVzZSBkZXRlcm1pbmVzIGhvdyB0aGUgcXVlcnkgc3RyaW5nIGlzIHBhcnNl ZAorICAgICAgICAgKHNlZSA8eHJlZiBsaW5rZW5kPSJ0ZXh0c2VhcmNoLXBhcnNpbmctcXVlcmll cyIvPikuCisgICAgICAgICBWYWxpZCBvcHRpb25zIGFyZSA8bGl0ZXJhbD4icGwiPC9saXRlcmFs PiAoPGZ1bmN0aW9uPnBsYWludG9fdHNxdWVyeTwvZnVuY3Rpb24+KSwKKyAgICAgICAgIDxsaXRl cmFsPiJwaCI8L2xpdGVyYWw+ICg8ZnVuY3Rpb24+cGhyYXNldG9fdHNxdWVyeTwvZnVuY3Rpb24+ KSwgYW5kCisgICAgICAgICA8bGl0ZXJhbD4idyI8L2xpdGVyYWw+ICg8ZnVuY3Rpb24+d2Vic2Vh cmNoX3RvX3RzcXVlcnk8L2Z1bmN0aW9uPikuCisgICAgICAgICBJZiA8bGl0ZXJhbD50c3FwYXJz ZXI8L2xpdGVyYWw+IGlzIG9taXR0ZWQsIHRoZSBxdWVyeSBpcyBwYXJzZWQgdXNpbmcgPGZ1bmN0 aW9uPnRvX3RzcXVlcnk8L2Z1bmN0aW9uPi4KKyAgICAgICAgIDxsaXRlcmFsPnRzY29uZmlnPC9s aXRlcmFsPiBhbmQgPGxpdGVyYWw+dHNxcGFyc2VyPC9saXRlcmFsPiBjYW4gYXBwZWFyIGluIGFu eSBvcmRlci4KKyAgICAgICAgPC9wYXJhPgorICAgICAgICA8cGFyYT4KKyAgICAgICAgIDxsaXRl cmFsPmpzb25iX3BhdGhfcXVlcnlfYXJyYXkoJ1sicnVubmluZyIsICJydW5zIiwgInJhbiIsICJq b2dnaW5nIl0nLCAnJFsqXSA/IChAIHRzbWF0Y2ggInJ1biIgdHNjb25maWcgImVuZ2xpc2giKScp PC9saXRlcmFsPgorICAgICAgICAgPHJldHVybnZhbHVlPlsicnVubmluZyIsICJydW5zIl08L3Jl dHVybnZhbHVlPgorICAgICAgICA8L3BhcmE+CisgICAgICAgIDxwYXJhPgorICAgICAgICAgPGxp dGVyYWw+anNvbmJfcGF0aF9xdWVyeV9hcnJheSgnWyJmYXN0IGNhciIsICJzbG93IGNhciIsICJm YXN0IGFuZCBmdXJpb3VzIl0nLCAnJFsqXSA/IChAIHRzbWF0Y2ggImZhc3QgJmFtcDsgY2FyIikn KTwvbGl0ZXJhbD4KKyAgICAgICAgIDxyZXR1cm52YWx1ZT5bImZhc3QgY2FyIl08L3JldHVybnZh bHVlPgorICAgICAgICA8L3BhcmE+CisgICAgICAgIDxwYXJhPgorICAgICAgICAgPGxpdGVyYWw+ anNvbmJfcGF0aF9xdWVyeV9hcnJheSgnWyJmYXN0IGNhciIsICJzbG93IGNhciIsICJmYXN0IGFu ZCBmdXJpb3VzIl0nLCAnJFsqXSA/IChAIHRzbWF0Y2ggImZhc3QgY2FyIiB0c3FwYXJzZXIgInci KScpPC9saXRlcmFsPgorICAgICAgICAgPHJldHVybnZhbHVlPlsiZmFzdCBjYXIiXTwvcmV0dXJu dmFsdWU+CisgICAgICAgIDwvcGFyYT4KKyAgICAgICA8L2VudHJ5PgorICAgICAgPC9yb3c+CiAg ICAgIDwvdGJvZHk+CiAgICAgPC90Z3JvdXA+CiAgICA8L3RhYmxlPgpkaWZmIC0tZ2l0IGEvc3Jj L2JhY2tlbmQvdXRpbHMvYWR0L2pzb25wYXRoLmMgYi9zcmMvYmFja2VuZC91dGlscy9hZHQvanNv bnBhdGguYwppbmRleCA3YmZjMThjOTg4OC4uZTU1MWQ2NWRjMjUgMTAwNjQ0Ci0tLSBhL3NyYy9i YWNrZW5kL3V0aWxzL2FkdC9qc29ucGF0aC5jCisrKyBiL3NyYy9iYWNrZW5kL3V0aWxzL2FkdC9q c29ucGF0aC5jCkBAIC0zNTEsNiArMzUxLDU1IEBAIGZsYXR0ZW5Kc29uUGF0aFBhcnNlSXRlbShT dHJpbmdJbmZvIGJ1ZiwgaW50ICpyZXN1bHQsIHN0cnVjdCBOb2RlICplc2NvbnRleHQsCiAJCQkJ KihpbnQzMiAqKSAoYnVmLT5kYXRhICsgb2ZmcykgPSBjaGxkIC0gcG9zOwogCQkJfQogCQkJYnJl YWs7CisJCWNhc2UganBpVHNNYXRjaDoKKwkJCXsKKwkJCQlpbnQzMgkJZXhwcl9vZmY7CisJCQkJ aW50MzIJCXRzY29uZmlnX29mZjsKKwkJCQl1aW50MzIJCXRzcXBhcnNlcl9sZW5fdmFsID0gaXRl bS0+dmFsdWUudHNtYXRjaC50c3FwYXJzZXIgPyBpdGVtLT52YWx1ZS50c21hdGNoLnRzcXBhcnNl cl9sZW4gOiAwOworCisJCQkJZXhwcl9vZmYgPSByZXNlcnZlU3BhY2VGb3JJdGVtUG9pbnRlcihi dWYpOworCQkJCXRzY29uZmlnX29mZiA9IHJlc2VydmVTcGFjZUZvckl0ZW1Qb2ludGVyKGJ1Zik7 CisKKwkJCQkvKgorCQkJCSAqIFdyaXRlIGFsbCBpbnRlZ2VycyBGSVJTVCBzbyB0aGV5IGFyZSBu YXR1cmFsbHkgNC1ieXRlCisJCQkJICogYWxpZ25lZAorCQkJCSAqLworCQkJCWFwcGVuZEJpbmFy eVN0cmluZ0luZm8oYnVmLCAmaXRlbS0+dmFsdWUudHNtYXRjaC50c3F1ZXJ5X2xlbiwgc2l6ZW9m KHVpbnQzMikpOworCQkJCWFwcGVuZEJpbmFyeVN0cmluZ0luZm8oYnVmLCAmdHNxcGFyc2VyX2xl bl92YWwsIHNpemVvZih1aW50MzIpKTsKKworCQkJCS8qIE5vdyBhcHBlbmQgdGhlIHN0cmluZ3Mg YXQgdGhlIGVuZCAqLworCQkJCWFwcGVuZEJpbmFyeVN0cmluZ0luZm8oYnVmLCBpdGVtLT52YWx1 ZS50c21hdGNoLnRzcXVlcnksIGl0ZW0tPnZhbHVlLnRzbWF0Y2gudHNxdWVyeV9sZW4pOworCQkJ CWFwcGVuZFN0cmluZ0luZm9DaGFyKGJ1ZiwgJ1wwJyk7CisKKwkJCQlpZiAoaXRlbS0+dmFsdWUu dHNtYXRjaC50c3FwYXJzZXIpCisJCQkJeworCQkJCQlhcHBlbmRCaW5hcnlTdHJpbmdJbmZvKGJ1 ZiwgaXRlbS0+dmFsdWUudHNtYXRjaC50c3FwYXJzZXIsIHRzcXBhcnNlcl9sZW5fdmFsKTsKKwkJ CQkJYXBwZW5kU3RyaW5nSW5mb0NoYXIoYnVmLCAnXDAnKTsKKwkJCQl9CisKKwkJCQlpZiAoIWZs YXR0ZW5Kc29uUGF0aFBhcnNlSXRlbShidWYsICZjaGxkLCBlc2NvbnRleHQsCisJCQkJCQkJCQkJ CSAgaXRlbS0+dmFsdWUudHNtYXRjaC5kb2MsCisJCQkJCQkJCQkJCSAgbmVzdGluZ0xldmVsLAor CQkJCQkJCQkJCQkgIGluc2lkZUFycmF5U3Vic2NyaXB0KSkKKwkJCQkJcmV0dXJuIGZhbHNlOwor CQkJCSooaW50MzIgKikgKGJ1Zi0+ZGF0YSArIGV4cHJfb2ZmKSA9IGNobGQgLSBwb3M7CisKKwkJ CQkvKiBUU0NvbmZpZyAoT3B0aW9uYWwpICovCisJCQkJaWYgKGl0ZW0tPnZhbHVlLnRzbWF0Y2gu dHNjb25maWcpCisJCQkJeworCQkJCQlpZiAoIWZsYXR0ZW5Kc29uUGF0aFBhcnNlSXRlbShidWYs ICZjaGxkLCBlc2NvbnRleHQsCisJCQkJCQkJCQkJCQkgIGl0ZW0tPnZhbHVlLnRzbWF0Y2gudHNj b25maWcsCisJCQkJCQkJCQkJCQkgIG5lc3RpbmdMZXZlbCwKKwkJCQkJCQkJCQkJCSAgaW5zaWRl QXJyYXlTdWJzY3JpcHQpKQorCQkJCQkJcmV0dXJuIGZhbHNlOworCQkJCQkqKGludDMyICopIChi dWYtPmRhdGEgKyB0c2NvbmZpZ19vZmYpID0gY2hsZCAtIHBvczsKKwkJCQl9CisJCQkJZWxzZQor CQkJCXsKKwkJCQkJKihpbnQzMiAqKSAoYnVmLT5kYXRhICsgdHNjb25maWdfb2ZmKSA9IDA7CisJ CQkJfQorCQkJfQorCQkJYnJlYWs7CiAJCWNhc2UganBpRmlsdGVyOgogCQkJYXJnTmVzdGluZ0xl dmVsKys7CiAJCQlwZ19mYWxsdGhyb3VnaDsKQEAgLTc2Niw2ICs4MTUsNTUgQEAgcHJpbnRKc29u UGF0aEl0ZW0oU3RyaW5nSW5mbyBidWYsIEpzb25QYXRoSXRlbSAqdiwgYm9vbCBpbktleSwKIAog CQkJCWFwcGVuZFN0cmluZ0luZm9DaGFyKGJ1ZiwgJyInKTsKIAkJCX0KKwkJCWJyZWFrOworCQlj YXNlIGpwaVRzTWF0Y2g6CisJCQlpZiAocHJpbnRCcmFja2V0ZXMpCisJCQkJYXBwZW5kU3RyaW5n SW5mb0NoYXIoYnVmLCAnKCcpOworCisJCQlqc3BJbml0QnlCdWZmZXIoJmVsZW0sIHYtPmJhc2Us IHYtPmNvbnRlbnQudHNtYXRjaC5kb2MpOworCQkJcHJpbnRKc29uUGF0aEl0ZW0oYnVmLCAmZWxl bSwgZmFsc2UsCisJCQkJCQkJICBvcGVyYXRpb25Qcmlvcml0eShlbGVtLnR5cGUpIDw9CisJCQkJ CQkJICBvcGVyYXRpb25Qcmlvcml0eSh2LT50eXBlKSk7CisKKwkJCWFwcGVuZFN0cmluZ0luZm9T dHJpbmcoYnVmLCAiIHRzbWF0Y2ggIik7CisKKwkJCWVzY2FwZV9qc29uX3dpdGhfbGVuKGJ1ZiwK KwkJCQkJCQkJIHYtPmNvbnRlbnQudHNtYXRjaC50c3F1ZXJ5LAorCQkJCQkJCQkgdi0+Y29udGVu dC50c21hdGNoLnRzcXVlcnlfbGVuKTsKKworCQkJLyogUHJpbnQgVFNDb25maWcgaWYgcHJlc2Vu dCAqLworCQkJaWYgKHYtPmNvbnRlbnQudHNtYXRjaC50c2NvbmZpZykKKwkJCXsKKwkJCQlKc29u UGF0aEl0ZW0gY29uZmlnX2l0ZW07CisJCQkJaW50MzIJCWNvbmZpZ19sZW47CisJCQkJY2hhcgkg ICAqY29uZmlnX3N0cjsKKworCQkJCWFwcGVuZFN0cmluZ0luZm9TdHJpbmcoYnVmLCAiIHRzY29u ZmlnICIpOworCQkJCWpzcEluaXRCeUJ1ZmZlcigmY29uZmlnX2l0ZW0sIHYtPmJhc2UsIHYtPmNv bnRlbnQudHNtYXRjaC50c2NvbmZpZyk7CisJCQkJY29uZmlnX3N0ciA9IGpzcEdldFN0cmluZygm Y29uZmlnX2l0ZW0sICZjb25maWdfbGVuKTsKKwkJCQlhcHBlbmRTdHJpbmdJbmZvQ2hhcihidWYs ICciJyk7CisJCQkJYXBwZW5kQmluYXJ5U3RyaW5nSW5mbyhidWYsIGNvbmZpZ19zdHIsIGNvbmZp Z19sZW4pOworCQkJCWFwcGVuZFN0cmluZ0luZm9DaGFyKGJ1ZiwgJyInKTsKKwkJCX0KKworCQkJ aWYgKHYtPmNvbnRlbnQudHNtYXRjaC50c3FwYXJzZXJfbGVuID4gMCkKKwkJCXsKKwkJCQlhcHBl bmRTdHJpbmdJbmZvU3RyaW5nKGJ1ZiwgIiB0c3FwYXJzZXIgIik7CisJCQkJYXBwZW5kU3RyaW5n SW5mb0NoYXIoYnVmLCAnIicpOworCisJCQkJLyoKKwkJCQkgKiBVc2Ugc2ltcGxlIGJpbmFyeSBh cHBlbmQgc2luY2UgZmxhZ3MgbGlrZSAicGwiIGRvbid0IG5lZWQKKwkJCQkgKiBKU09OIGVzY2Fw aW5nCisJCQkJICovCisJCQkJYXBwZW5kQmluYXJ5U3RyaW5nSW5mbyhidWYsCisJCQkJCQkJCQkg ICB2LT5jb250ZW50LnRzbWF0Y2gudHNxcGFyc2VyLAorCQkJCQkJCQkJICAgdi0+Y29udGVudC50 c21hdGNoLnRzcXBhcnNlcl9sZW4pOworCQkJCWFwcGVuZFN0cmluZ0luZm9DaGFyKGJ1ZiwgJyIn KTsKKwkJCX0KKworCQkJaWYgKHByaW50QnJhY2tldGVzKQorCQkJCWFwcGVuZFN0cmluZ0luZm9D aGFyKGJ1ZiwgJyknKTsKKwkJCWJyZWFrOwogCiAJCQlpZiAocHJpbnRCcmFja2V0ZXMpCiAJCQkJ YXBwZW5kU3RyaW5nSW5mb0NoYXIoYnVmLCAnKScpOwpAQCAtOTc2LDYgKzEwNzQsOCBAQCBqc3BP cGVyYXRpb25OYW1lKEpzb25QYXRoSXRlbVR5cGUgdHlwZSkKIAkJCXJldHVybiAidGltZXN0YW1w IjsKIAkJY2FzZSBqcGlUaW1lc3RhbXBUejoKIAkJCXJldHVybiAidGltZXN0YW1wX3R6IjsKKwkJ Y2FzZSBqcGlUc01hdGNoOgorCQkJcmV0dXJuICJ0c21hdGNoIjsKIAkJY2FzZSBqcGlTdHJSZXBs YWNlOgogCQkJcmV0dXJuICJyZXBsYWNlIjsKIAkJY2FzZSBqcGlTdHJMb3dlcjoKQEAgLTExNTgs NiArMTI1OCwyNyBAQCBqc3BJbml0QnlCdWZmZXIoSnNvblBhdGhJdGVtICp2LCBjaGFyICpiYXNl LCBpbnQzMiBwb3MpCiAJCQlyZWFkX2ludDMyKHYtPmNvbnRlbnQubGlrZV9yZWdleC5wYXR0ZXJu bGVuLCBiYXNlLCBwb3MpOwogCQkJdi0+Y29udGVudC5saWtlX3JlZ2V4LnBhdHRlcm4gPSBiYXNl ICsgcG9zOwogCQkJYnJlYWs7CisJCWNhc2UganBpVHNNYXRjaDoKKwkJCS8qIEZJWDogUmVhZCBh bGwgaW50ZWdlcnMgZmlyc3QgKi8KKwkJCXJlYWRfaW50MzIodi0+Y29udGVudC50c21hdGNoLmRv YywgYmFzZSwgcG9zKTsKKwkJCXJlYWRfaW50MzIodi0+Y29udGVudC50c21hdGNoLnRzY29uZmln LCBiYXNlLCBwb3MpOworCQkJcmVhZF9pbnQzMih2LT5jb250ZW50LnRzbWF0Y2gudHNxdWVyeV9s ZW4sIGJhc2UsIHBvcyk7CisJCQlyZWFkX2ludDMyKHYtPmNvbnRlbnQudHNtYXRjaC50c3FwYXJz ZXJfbGVuLCBiYXNlLCBwb3MpOworCisJCQkvKiBTZXQgcG9pbnRlcnMgdG8gdGhlIHN0cmluZ3Mg aW4gdGhlIGJ1ZmZlciAqLworCQkJdi0+Y29udGVudC50c21hdGNoLnRzcXVlcnkgPSBiYXNlICsg cG9zOworCQkJcG9zICs9IHYtPmNvbnRlbnQudHNtYXRjaC50c3F1ZXJ5X2xlbiArIDE7CisKKwkJ CWlmICh2LT5jb250ZW50LnRzbWF0Y2gudHNxcGFyc2VyX2xlbiA+IDApCisJCQl7CisJCQkJdi0+ Y29udGVudC50c21hdGNoLnRzcXBhcnNlciA9IGJhc2UgKyBwb3M7CisJCQkJcG9zICs9IHYtPmNv bnRlbnQudHNtYXRjaC50c3FwYXJzZXJfbGVuICsgMTsKKwkJCX0KKwkJCWVsc2UKKwkJCXsKKwkJ CQl2LT5jb250ZW50LnRzbWF0Y2gudHNxcGFyc2VyID0gTlVMTDsKKwkJCX0KKwkJCWJyZWFrOwog CQlkZWZhdWx0OgogCQkJZWxvZyhFUlJPUiwgInVucmVjb2duaXplZCBqc29ucGF0aCBpdGVtIHR5 cGU6ICVkIiwgdi0+dHlwZSk7CiAJfQpAQCAtMTIzMSw2ICsxMzUyLDcgQEAganNwR2V0TmV4dChK c29uUGF0aEl0ZW0gKnYsIEpzb25QYXRoSXRlbSAqYSkKIAkJCSAgIHYtPnR5cGUgPT0ganBpTGFz dCB8fAogCQkJICAgdi0+dHlwZSA9PSBqcGlTdGFydHNXaXRoIHx8CiAJCQkgICB2LT50eXBlID09 IGpwaUxpa2VSZWdleCB8fAorCQkJICAgdi0+dHlwZSA9PSBqcGlUc01hdGNoIHx8CiAJCQkgICB2 LT50eXBlID09IGpwaUJpZ2ludCB8fAogCQkJICAgdi0+dHlwZSA9PSBqcGlCb29sZWFuIHx8CiAJ CQkgICB2LT50eXBlID09IGpwaURhdGUgfHwKQEAgLTE1NzUsNyArMTY5NywxMSBAQCBqc3BJc011 dGFibGVXYWxrZXIoSnNvblBhdGhJdGVtICpqcGksIHN0cnVjdCBKc29uUGF0aE11dGFibGVDb250 ZXh0ICpjeHQpCiAJCQkJanNwSW5pdEJ5QnVmZmVyKCZhcmcsIGpwaS0+YmFzZSwganBpLT5jb250 ZW50Lmxpa2VfcmVnZXguZXhwcik7CiAJCQkJanNwSXNNdXRhYmxlV2Fsa2VyKCZhcmcsIGN4dCk7 CiAJCQkJYnJlYWs7Ci0KKwkJCWNhc2UganBpVHNNYXRjaDoKKwkJCQlBc3NlcnQoc3RhdHVzID09 IGpwZHNOb25EYXRlVGltZSk7CisJCQkJanNwSW5pdEJ5QnVmZmVyKCZhcmcsIGpwaS0+YmFzZSwg anBpLT5jb250ZW50LnRzbWF0Y2guZG9jKTsKKwkJCQlqc3BJc011dGFibGVXYWxrZXIoJmFyZywg Y3h0KTsKKwkJCQlicmVhazsKIAkJCQkvKiBsaXRlcmFscyAqLwogCQkJY2FzZSBqcGlOdWxsOgog CQkJY2FzZSBqcGlTdHJpbmc6CmRpZmYgLS1naXQgYS9zcmMvYmFja2VuZC91dGlscy9hZHQvanNv bnBhdGhfZXhlYy5jIGIvc3JjL2JhY2tlbmQvdXRpbHMvYWR0L2pzb25wYXRoX2V4ZWMuYwppbmRl eCA3NzA4NDBhMDYxMS4uZGU4OTM3ZmRiMDggMTAwNjQ0Ci0tLSBhL3NyYy9iYWNrZW5kL3V0aWxz L2FkdC9qc29ucGF0aF9leGVjLmMKKysrIGIvc3JjL2JhY2tlbmQvdXRpbHMvYWR0L2pzb25wYXRo X2V4ZWMuYwpAQCAtNTksMTMgKzU5LDE3IEBACiAKICNpbmNsdWRlICJwb3N0Z3Jlcy5oIgogCisj aW5jbHVkZSAiY2F0YWxvZy9uYW1lc3BhY2UuaCIKICNpbmNsdWRlICJjYXRhbG9nL3BnX2NvbGxh dGlvbi5oIgogI2luY2x1ZGUgImNhdGFsb2cvcGdfdHlwZS5oIgogI2luY2x1ZGUgImZ1bmNhcGku aCIKICNpbmNsdWRlICJtaXNjYWRtaW4uaCIKICNpbmNsdWRlICJub2Rlcy9taXNjbm9kZXMuaCIK ICNpbmNsdWRlICJub2Rlcy9ub2RlRnVuY3MuaCIKKyNpbmNsdWRlICJub2Rlcy9wZ19saXN0Lmgi CiAjaW5jbHVkZSAicmVnZXgvcmVnZXguaCIKKyNpbmNsdWRlICJ0c2VhcmNoL3RzX2NhY2hlLmgi CisjaW5jbHVkZSAidHNlYXJjaC90c191dGlscy5oIgogI2luY2x1ZGUgInV0aWxzL2J1aWx0aW5z LmgiCiAjaW5jbHVkZSAidXRpbHMvZGF0ZS5oIgogI2luY2x1ZGUgInV0aWxzL2RhdGV0aW1lLmgi CkBAIC03NCw2ICs3OCw3IEBACiAjaW5jbHVkZSAidXRpbHMvanNvbi5oIgogI2luY2x1ZGUgInV0 aWxzL2pzb25wYXRoLmgiCiAjaW5jbHVkZSAidXRpbHMvbWVtdXRpbHMuaCIKKyNpbmNsdWRlICJ1 dGlscy9yZWdwcm9jLmgiCiAjaW5jbHVkZSAidXRpbHMvdGltZXN0YW1wLmgiCiAKIC8qCkBAIC0x MTQsNiArMTE5LDcgQEAgdHlwZWRlZiBzdHJ1Y3QgSnNvblBhdGhFeGVjQ29udGV4dAogCWJvb2wJ CXRocm93RXJyb3JzOwkvKiB3aXRoICJmYWxzZSIgYWxsIHN1cHByZXNzaWJsZSBlcnJvcnMgYXJl CiAJCQkJCQkJCSAqIHN1cHByZXNzZWQgKi8KIAlib29sCQl1c2VUejsKKwlMaXN0CSAgICp0c21h dGNoX2NhY2hlOwkvKiBQZXJzaXN0cyBjb21waWxlZCBGVFMgcXVlcmllcyAqLwogfSBKc29uUGF0 aEV4ZWNDb250ZXh0OwogCiAvKiBDb250ZXh0IGZvciBMSUtFX1JFR0VYIGV4ZWN1dGlvbi4gKi8K QEAgLTEyMyw2ICsxMjksMTQgQEAgdHlwZWRlZiBzdHJ1Y3QgSnNvbkxpa2VSZWdleENvbnRleHQK IAlpbnQJCQljZmxhZ3M7CiB9IEpzb25MaWtlUmVnZXhDb250ZXh0OwogCisvKiBDb250ZXh0IGZv ciB0c21hdGNoIGV4ZWN1dGlvbi4gKi8KK3R5cGVkZWYgc3RydWN0IEpzb25Uc01hdGNoQ2FjaGVF bnRyeQoreworCXZvaWQJICAgKmpzcF9wdHI7CQkvKiBDYWNoZSBrZXk6IHBvaW50ZXIgdG8gdGhl IEFTVCBub2RlICovCisJRGF0dW0JCXF1ZXJ5RGF0dW07CQkvKiBDYWNoZWQgY29tcGlsZWQgcXVl cnkgKi8KKwlPaWQJCQl0c2NvbmZpZ0lkOwkJLyogQ2FjaGVkIGRpY3Rpb25hcnkgT0lEICovCit9 CQkJSnNvblRzTWF0Y2hDYWNoZUVudHJ5OworCiAvKiBSZXN1bHQgb2YganNvbnBhdGggcHJlZGlj YXRlIGV2YWx1YXRpb24gKi8KIHR5cGVkZWYgZW51bSBKc29uUGF0aEJvb2wKIHsKQEAgLTMzNSw2 ICszNDksNyBAQCBzdGF0aWMgSnNvblBhdGhFeGVjUmVzdWx0IGV4ZWN1dGVLZXlWYWx1ZU1ldGhv ZChKc29uUGF0aEV4ZWNDb250ZXh0ICpjeHQsCiAJCQkJCQkJCQkJCQlKc29uUGF0aEl0ZW0gKmpz cCwgSnNvbmJWYWx1ZSAqamIsIEpzb25WYWx1ZUxpc3QgKmZvdW5kKTsKIHN0YXRpYyBKc29uUGF0 aEV4ZWNSZXN1bHQgYXBwZW5kQm9vbFJlc3VsdChKc29uUGF0aEV4ZWNDb250ZXh0ICpjeHQsCiAJ CQkJCQkJCQkJICAgSnNvblBhdGhJdGVtICpqc3AsIEpzb25WYWx1ZUxpc3QgKmZvdW5kLCBKc29u UGF0aEJvb2wgcmVzKTsKK3N0YXRpYyBKc29uUGF0aEJvb2wgZXhlY3V0ZVRzTWF0Y2goSnNvblBh dGhJdGVtICpqc3AsIEpzb25iVmFsdWUgKnN0ciwgSnNvbmJWYWx1ZSAqcmFyZywgdm9pZCAqcGFy YW0pOwogc3RhdGljIHZvaWQgZ2V0SnNvblBhdGhJdGVtKEpzb25QYXRoRXhlY0NvbnRleHQgKmN4 dCwgSnNvblBhdGhJdGVtICppdGVtLAogCQkJCQkJCUpzb25iVmFsdWUgKnZhbHVlKTsKIHN0YXRp YyBKc29uYlZhbHVlICpHZXRKc29uUGF0aFZhcih2b2lkICpjeHQsIGNoYXIgKnZhck5hbWUsIGlu dCB2YXJOYW1lTGVuLApAQCAtNzQwLDYgKzc1NSw3IEBAIGV4ZWN1dGVKc29uUGF0aChKc29uUGF0 aCAqcGF0aCwgdm9pZCAqdmFycywgSnNvblBhdGhHZXRWYXJDYWxsYmFjayBnZXRWYXIsCiAJY3h0 LmlubmVybW9zdEFycmF5U2l6ZSA9IC0xOwogCWN4dC50aHJvd0Vycm9ycyA9IHRocm93RXJyb3Jz OwogCWN4dC51c2VUeiA9IHVzZVR6OworCWN4dC50c21hdGNoX2NhY2hlID0gTklMOwogCiAJaWYg KGpzcFN0cmljdEFic2VuY2VPZkVycm9ycygmY3h0KSAmJiAhcmVzdWx0KQogCXsKQEAgLTg0MCw2 ICs4NTYsNyBAQCBleGVjdXRlSXRlbU9wdFVud3JhcFRhcmdldChKc29uUGF0aEV4ZWNDb250ZXh0 ICpjeHQsIEpzb25QYXRoSXRlbSAqanNwLAogCQljYXNlIGpwaUV4aXN0czoKIAkJY2FzZSBqcGlT dGFydHNXaXRoOgogCQljYXNlIGpwaUxpa2VSZWdleDoKKwkJY2FzZSBqcGlUc01hdGNoOgogCQkJ ewogCQkJCUpzb25QYXRoQm9vbCBzdCA9IGV4ZWN1dGVCb29sSXRlbShjeHQsIGpzcCwgamIsIHRy dWUpOwogCkBAIC0xOTE0LDYgKzE5MzEsMTggQEAgZXhlY3V0ZUJvb2xJdGVtKEpzb25QYXRoRXhl Y0NvbnRleHQgKmN4dCwgSnNvblBhdGhJdGVtICpqc3AsCiAJCQkJcmV0dXJuIGV4ZWN1dGVQcmVk aWNhdGUoY3h0LCBqc3AsICZsYXJnLCBOVUxMLCBqYiwgZmFsc2UsCiAJCQkJCQkJCQkJZXhlY3V0 ZUxpa2VSZWdleCwgJmxyY3h0KTsKIAkJCX0KKwkJY2FzZSBqcGlUc01hdGNoOgorCQkJeworCQkJ CWpzcEluaXRCeUJ1ZmZlcigmbGFyZywganNwLT5iYXNlLAorCQkJCQkJCQlqc3AtPmNvbnRlbnQu dHNtYXRjaC5kb2MpOworCisJCQkJLyoKKwkJCQkgKiBQYXNzICdjeHQnIGFzIHRoZSBwYXJhbSBz byBleGVjdXRlVHNNYXRjaCBjYW4gYWNjZXNzIHRoZQorCQkJCSAqIGNhY2hlIGxpc3QKKwkJCQkg Ki8KKwkJCQlyZXR1cm4gZXhlY3V0ZVByZWRpY2F0ZShjeHQsIGpzcCwgJmxhcmcsIE5VTEwsIGpi LCBmYWxzZSwKKwkJCQkJCQkJCQlleGVjdXRlVHNNYXRjaCwgY3h0KTsKKwkJCX0KIAogCQljYXNl IGpwaUV4aXN0czoKIAkJCWpzcEdldEFyZyhqc3AsICZsYXJnKTsKQEAgLTE5NTIsNyArMTk4MSw2 IEBAIGV4ZWN1dGVCb29sSXRlbShKc29uUGF0aEV4ZWNDb250ZXh0ICpjeHQsIEpzb25QYXRoSXRl bSAqanNwLAogCiAJCQkJcmV0dXJuIHJlcyA9PSBqcGVyT2sgPyBqcGJUcnVlIDoganBiRmFsc2U7 CiAJCQl9Ci0KIAkJZGVmYXVsdDoKIAkJCWVsb2coRVJST1IsICJpbnZhbGlkIGJvb2xlYW4ganNv bnBhdGggaXRlbSB0eXBlOiAlZCIsIGpzcC0+dHlwZSk7CiAJCQlyZXR1cm4ganBiVW5rbm93bjsK QEAgLTMxODYsNiArMzIxNCwxMjMgQEAgZXhlY3V0ZUtleVZhbHVlTWV0aG9kKEpzb25QYXRoRXhl Y0NvbnRleHQgKmN4dCwgSnNvblBhdGhJdGVtICpqc3AsCiAJcmV0dXJuIHJlczsKIH0KIAorc3Rh dGljIEpzb25QYXRoQm9vbAorZXhlY3V0ZVRzTWF0Y2goSnNvblBhdGhJdGVtICpqc3AsIEpzb25i VmFsdWUgKnN0ciwgSnNvbmJWYWx1ZSAqcmFyZywKKwkJCSAgIHZvaWQgKnBhcmFtKQoreworCUpz b25QYXRoRXhlY0NvbnRleHQgKmN4dCA9IChKc29uUGF0aEV4ZWNDb250ZXh0ICopIHBhcmFtOwor CUpzb25Uc01hdGNoQ2FjaGVFbnRyeSAqY2FjaGUgPSBOVUxMOworCUxpc3RDZWxsICAgKmxjOwor CXRleHQJICAgKmRvY190ZXh0OworCURhdHVtCQl0c3ZlY3Rvcl9kYXR1bTsKKwlib29sCQltYXRj aDsKKworCWlmICghKHN0ciA9IGdldFNjYWxhcihzdHIsIGpidlN0cmluZykpKQorCQlyZXR1cm4g anBiVW5rbm93bjsKKworCS8qIENoZWNrIGlmIHdlIGFscmVhZHkgY29tcGlsZWQgdGhlIHF1ZXJ5 IGZvciB0aGlzIHNwZWNpZmljIEFTVCBub2RlICovCisJZm9yZWFjaChsYywgY3h0LT50c21hdGNo X2NhY2hlKQorCXsKKwkJSnNvblRzTWF0Y2hDYWNoZUVudHJ5ICplbnRyeSA9IChKc29uVHNNYXRj aENhY2hlRW50cnkgKikgbGZpcnN0KGxjKTsKKworCQlpZiAoZW50cnktPmpzcF9wdHIgPT0gKHZv aWQgKikganNwKQorCQl7CisJCQljYWNoZSA9IGVudHJ5OworCQkJYnJlYWs7CisJCX0KKwl9CisK KwkvKiBJZiBub3QgZm91bmQsIHBhcnNlLCBjb21waWxlLCBhbmQgY2FjaGUgaXQgKi8KKwlpZiAo Y2FjaGUgPT0gTlVMTCkKKwl7CisJCXRleHQJICAgKnF1ZXJ5X3RleHQ7CisJCWNoYXIJICAgKnBh cnNlcl9tb2RlOworCQl1aW50MzIJCXBhcnNlcl9sZW47CisKKwkJLyogQWxsb2NhdGUgbmV3IGNh Y2hlIGVudHJ5IGluIHRoZSBleGVjdXRpb24gbWVtb3J5IGNvbnRleHQgKi8KKwkJY2FjaGUgPSBw YWxsb2MwKHNpemVvZihKc29uVHNNYXRjaENhY2hlRW50cnkpKTsKKwkJY2FjaGUtPmpzcF9wdHIg PSAodm9pZCAqKSBqc3A7CisKKwkJaWYgKGpzcC0+Y29udGVudC50c21hdGNoLnRzY29uZmlnICE9 IDApCisJCXsKKwkJCUpzb25QYXRoSXRlbSBjb25maWdfaXRlbTsKKwkJCWludDMyCQljb25maWdf bGVuOworCQkJY2hhcgkgICAqY29uZmlnX3N0cjsKKwkJCWNoYXIJICAgKnNhZmVfY29uZmlnX3N0 cjsKKworCQkJanNwSW5pdEJ5QnVmZmVyKCZjb25maWdfaXRlbSwganNwLT5iYXNlLCBqc3AtPmNv bnRlbnQudHNtYXRjaC50c2NvbmZpZyk7CisJCQljb25maWdfc3RyID0ganNwR2V0U3RyaW5nKCZj b25maWdfaXRlbSwgJmNvbmZpZ19sZW4pOworCisJCQkvKiBOdWxsLXRlcm1pbmF0ZSBmb3Igc2Fm ZSBjYXRhbG9nIGxvb2t1cCAqLworCQkJc2FmZV9jb25maWdfc3RyID0gcG5zdHJkdXAoY29uZmln X3N0ciwgY29uZmlnX2xlbik7CisJCQljYWNoZS0+dHNjb25maWdJZCA9IGdldF90c19jb25maWdf b2lkKHN0cmluZ1RvUXVhbGlmaWVkTmFtZUxpc3Qoc2FmZV9jb25maWdfc3RyLCBOVUxMKSwgZmFs c2UpOworCQkJcGZyZWUoc2FmZV9jb25maWdfc3RyKTsKKwkJfQorCQllbHNlCisJCXsKKwkJCWNh Y2hlLT50c2NvbmZpZ0lkID0gZ2V0VFNDdXJyZW50Q29uZmlnKHRydWUpOworCQl9CisKKwkJLyog UHJlcGFyZSBRdWVyeSBUZXh0ICovCisJCXF1ZXJ5X3RleHQgPSBjc3RyaW5nX3RvX3RleHRfd2l0 aF9sZW4oanNwLT5jb250ZW50LnRzbWF0Y2gudHNxdWVyeSwKKwkJCQkJCQkJCQkJICBqc3AtPmNv bnRlbnQudHNtYXRjaC50c3F1ZXJ5X2xlbik7CisKKwkJLyogU2VsZWN0IFBhcnNlciBhbmQgQ29t cGlsZSBRdWVyeSAqLworCQlwYXJzZXJfbW9kZSA9IGpzcC0+Y29udGVudC50c21hdGNoLnRzcXBh cnNlcjsKKwkJcGFyc2VyX2xlbiA9IGpzcC0+Y29udGVudC50c21hdGNoLnRzcXBhcnNlcl9sZW47 CisKKwkJaWYgKHBhcnNlcl9sZW4gPiAwKQorCQl7CisJCQlpZiAocGFyc2VyX2xlbiA9PSAyICYm IHBnX3N0cm5jYXNlY21wKHBhcnNlcl9tb2RlLCAicGwiLCAyKSA9PSAwKQorCQkJeworCQkJCWNh Y2hlLT5xdWVyeURhdHVtID0gRGlyZWN0RnVuY3Rpb25DYWxsMihwbGFpbnRvX3RzcXVlcnlfYnlp ZCwKKwkJCQkJCQkJCQkJCQkJT2JqZWN0SWRHZXREYXR1bShjYWNoZS0+dHNjb25maWdJZCksCisJ CQkJCQkJCQkJCQkJCVBvaW50ZXJHZXREYXR1bShxdWVyeV90ZXh0KSk7CisJCQl9CisJCQllbHNl IGlmIChwYXJzZXJfbGVuID09IDIgJiYgcGdfc3RybmNhc2VjbXAocGFyc2VyX21vZGUsICJwaCIs IDIpID09IDApCisJCQl7CisJCQkJY2FjaGUtPnF1ZXJ5RGF0dW0gPSBEaXJlY3RGdW5jdGlvbkNh bGwyKHBocmFzZXRvX3RzcXVlcnlfYnlpZCwKKwkJCQkJCQkJCQkJCQkJT2JqZWN0SWRHZXREYXR1 bShjYWNoZS0+dHNjb25maWdJZCksCisJCQkJCQkJCQkJCQkJCVBvaW50ZXJHZXREYXR1bShxdWVy eV90ZXh0KSk7CisJCQl9CisJCQllbHNlIGlmIChwYXJzZXJfbGVuID09IDEgJiYgcGdfc3RybmNh c2VjbXAocGFyc2VyX21vZGUsICJ3IiwgMSkgPT0gMCkKKwkJCXsKKwkJCQljYWNoZS0+cXVlcnlE YXR1bSA9IERpcmVjdEZ1bmN0aW9uQ2FsbDIod2Vic2VhcmNoX3RvX3RzcXVlcnlfYnlpZCwKKwkJ CQkJCQkJCQkJCQkJT2JqZWN0SWRHZXREYXR1bShjYWNoZS0+dHNjb25maWdJZCksCisJCQkJCQkJ CQkJCQkJCVBvaW50ZXJHZXREYXR1bShxdWVyeV90ZXh0KSk7CisJCQl9CisJCQllbHNlCisJCQl7 CisJCQkJcGdfdW5yZWFjaGFibGUoKTsKKwkJCX0KKwkJfQorCQllbHNlCisJCXsKKwkJCWNhY2hl LT5xdWVyeURhdHVtID0gRGlyZWN0RnVuY3Rpb25DYWxsMih0b190c3F1ZXJ5X2J5aWQsCisJCQkJ CQkJCQkJCQkJT2JqZWN0SWRHZXREYXR1bShjYWNoZS0+dHNjb25maWdJZCksCisJCQkJCQkJCQkJ CQkJUG9pbnRlckdldERhdHVtKHF1ZXJ5X3RleHQpKTsKKwkJfQorCisJCS8qIEFwcGVuZCB0aGUg bmV3bHkgY29tcGlsZWQgY2FjaGUgZW50cnkgdG8gdGhlIGNvbnRleHQncyBsaXN0ICovCisJCWN4 dC0+dHNtYXRjaF9jYWNoZSA9IGxhcHBlbmQoY3h0LT50c21hdGNoX2NhY2hlLCBjYWNoZSk7CisJ fQorCisJLyogUnVudGltZSBFeGVjdXRpb24gKFVzaW5nIHRoZSBjYWNoZWQgcXVlcnkpICovCisJ ZG9jX3RleHQgPSBjc3RyaW5nX3RvX3RleHRfd2l0aF9sZW4oc3RyLT52YWwuc3RyaW5nLnZhbCwK KwkJCQkJCQkJCQlzdHItPnZhbC5zdHJpbmcubGVuKTsKKworCXRzdmVjdG9yX2RhdHVtID0gRGly ZWN0RnVuY3Rpb25DYWxsMih0b190c3ZlY3Rvcl9ieWlkLAorCQkJCQkJCQkJCSBPYmplY3RJZEdl dERhdHVtKGNhY2hlLT50c2NvbmZpZ0lkKSwKKwkJCQkJCQkJCQkgUG9pbnRlckdldERhdHVtKGRv Y190ZXh0KSk7CisKKwltYXRjaCA9IERhdHVtR2V0Qm9vbChEaXJlY3RGdW5jdGlvbkNhbGwyKHRz X21hdGNoX3ZxLAorCQkJCQkJCQkJCQkgdHN2ZWN0b3JfZGF0dW0sCisJCQkJCQkJCQkJCSBjYWNo ZS0+cXVlcnlEYXR1bSkpOworCisJcmV0dXJuIG1hdGNoID8ganBiVHJ1ZSA6IGpwYkZhbHNlOwor fQorCisKIC8qCiAgKiBDb252ZXJ0IGJvb2xlYW4gZXhlY3V0aW9uIHN0YXR1cyAncmVzJyB0byBh IGJvb2xlYW4gSlNPTiBpdGVtIGFuZCBleGVjdXRlCiAgKiBuZXh0IGpzb25wYXRoLgpkaWZmIC0t Z2l0IGEvc3JjL2JhY2tlbmQvdXRpbHMvYWR0L2pzb25wYXRoX2dyYW0ueSBiL3NyYy9iYWNrZW5k L3V0aWxzL2FkdC9qc29ucGF0aF9ncmFtLnkKaW5kZXggZjgyNjY5N2QwOTguLjlmM2FhMGNiZTE0 IDEwMDY0NAotLS0gYS9zcmMvYmFja2VuZC91dGlscy9hZHQvanNvbnBhdGhfZ3JhbS55CisrKyBi L3NyYy9iYWNrZW5kL3V0aWxzL2FkdC9qc29ucGF0aF9ncmFtLnkKQEAgLTQzLDcgKzQzLDEyIEBA IHN0YXRpYyBib29sIG1ha2VJdGVtTGlrZVJlZ2V4KEpzb25QYXRoUGFyc2VJdGVtICpleHByLAog CQkJCQkJCSAgSnNvblBhdGhTdHJpbmcgKmZsYWdzLAogCQkJCQkJCSAgSnNvblBhdGhQYXJzZUl0 ZW0gKiogcmVzdWx0LAogCQkJCQkJCSAgc3RydWN0IE5vZGUgKmVzY29udGV4dCk7Ci0KK3N0YXRp YyBib29sIG1ha2VJdGVtVHNNYXRjaChKc29uUGF0aFBhcnNlSXRlbSAqZG9jLAorCQkJCQkJCSAg SnNvblBhdGhTdHJpbmcgKnRzcXVlcnksCisJCQkJCQkJICBKc29uUGF0aFN0cmluZyAqdHNjb25m aWcsCisJCQkJCQkJICBKc29uUGF0aFN0cmluZyAqdHNxdWVyeV9wYXJzZXIsCisJCQkJCQkJICBK c29uUGF0aFBhcnNlSXRlbSAqKiByZXN1bHQsCisJCQkJCQkJICBzdHJ1Y3QgTm9kZSAqZXNjb250 ZXh0KTsKIC8qCiAgKiBCaXNvbiBkb2Vzbid0IGFsbG9jYXRlIGFueXRoaW5nIHRoYXQgbmVlZHMg dG8gbGl2ZSBhY3Jvc3MgcGFyc2VyIGNhbGxzLAogICogc28gd2UgY2FuIGVhc2lseSBoYXZlIGl0 IHVzZSBwYWxsb2MgaW5zdGVhZCBvZiBtYWxsb2MuICBUaGlzIHByZXZlbnRzCkBAIC03Myw2ICs3 OCwxMyBAQCBzdGF0aWMgYm9vbCBtYWtlSXRlbUxpa2VSZWdleChKc29uUGF0aFBhcnNlSXRlbSAq ZXhwciwKIAlKc29uUGF0aFBhcnNlSXRlbSAgKnZhbHVlOwogCUpzb25QYXRoUGFyc2VSZXN1bHQg KnJlc3VsdDsKIAlKc29uUGF0aEl0ZW1UeXBlCW9wdHlwZTsKKwlzdHJ1Y3QKKwl7CisJCWJvb2wg ICAgICAgICAgICBoYXNfdHNjb25maWc7CisJCUpzb25QYXRoU3RyaW5nICB0c2NvbmZpZzsKKwkJ Ym9vbCAgICAgICAgICAgIGhhc190c3FwYXJzZXI7CisJCUpzb25QYXRoU3RyaW5nICB0c3FwYXJz ZXI7CisJfSAgICAgICAgICAgICAgIHRzbWF0Y2hfb3B0czsKIAlib29sCQkJCWJvb2xlYW47CiAJ aW50CQkJCQlpbnRlZ2VyOwogfQpAQCAtODEsNyArOTMsNyBAQCBzdGF0aWMgYm9vbCBtYWtlSXRl bUxpa2VSZWdleChKc29uUGF0aFBhcnNlSXRlbSAqZXhwciwKICV0b2tlbgk8c3RyPgkJSURFTlRf UCBTVFJJTkdfUCBOVU1FUklDX1AgSU5UX1AgVkFSSUFCTEVfUAogJXRva2VuCTxzdHI+CQlPUl9Q IEFORF9QIE5PVF9QCiAldG9rZW4JPHN0cj4JCUxFU1NfUCBMRVNTRVFVQUxfUCBFUVVBTF9QIE5P VEVRVUFMX1AgR1JFQVRFUkVRVUFMX1AgR1JFQVRFUl9QCi0ldG9rZW4JPHN0cj4JCUFOWV9QIFNU UklDVF9QIExBWF9QIExBU1RfUCBTVEFSVFNfUCBXSVRIX1AgTElLRV9SRUdFWF9QIEZMQUdfUAor JXRva2VuCTxzdHI+CQlBTllfUCBTVFJJQ1RfUCBMQVhfUCBMQVNUX1AgU1RBUlRTX1AgV0lUSF9Q IExJS0VfUkVHRVhfUCBGTEFHX1AgVFNNQVRDSF9QIFRTQ09ORklHX1AgVFNRVUVSWVBBUlNFUl9Q CiAldG9rZW4JPHN0cj4JCUFCU19QIFNJWkVfUCBUWVBFX1AgRkxPT1JfUCBET1VCTEVfUCBDRUlM SU5HX1AgS0VZVkFMVUVfUAogJXRva2VuCTxzdHI+CQlEQVRFVElNRV9QCiAldG9rZW4JPHN0cj4J CUJJR0lOVF9QIEJPT0xFQU5fUCBEQVRFX1AgREVDSU1BTF9QIElOVEVHRVJfUCBOVU1CRVJfUApA QCAtMTA5LDYgKzEyMSw4IEBAIHN0YXRpYyBib29sIG1ha2VJdGVtTGlrZVJlZ2V4KEpzb25QYXRo UGFyc2VJdGVtICpleHByLAogCiAldHlwZQk8aW50ZWdlcj4JYW55X2xldmVsCiAKKyV0eXBlICA8 dHNtYXRjaF9vcHRzPiAgdHNtYXRjaF9vcHRzCisKICVsZWZ0CU9SX1AKICVsZWZ0CUFORF9QCiAl cmlnaHQJTk9UX1AKQEAgLTE4OSw2ICsyMDMsMTcgQEAgcHJlZGljYXRlOgogCQkJWVlBQk9SVDsK IAkJJCQgPSBqcHBpdGVtOwogCX0KKwl8IGV4cHIgVFNNQVRDSF9QIFNUUklOR19QIHRzbWF0Y2hf b3B0cworICAgIHsKKwkJSnNvblBhdGhQYXJzZUl0ZW0gKmpwcGl0ZW07CisKKwkJaWYgKCFtYWtl SXRlbVRzTWF0Y2goJDEsICYkMywKKwkJCQkkNC5oYXNfdHNjb25maWcgPyAmJDQudHNjb25maWcg OiBOVUxMLAorCQkJCSQ0Lmhhc190c3FwYXJzZXIgPyAmJDQudHNxcGFyc2VyIDogTlVMTCwKKwkJ CQkmanBwaXRlbSwgZXNjb250ZXh0KSkKKwkJCVlZQUJPUlQ7CisJCSQkID0ganBwaXRlbTsKKyAg ICB9CiAJOwogCiBzdGFydHNfd2l0aF9pbml0aWFsOgpAQCAtMzM3LDYgKzM2MiwzMyBAQCBzdHJf c3RyX2FyZ3M6CiAJc3RyX2VsZW0gJywnIHN0cl9lbGVtIAkJCXsgJCQgPSBsaXN0X21ha2UyKCQx LCAkMyk7IH0KIAk7CiAKK3RzbWF0Y2hfb3B0czoKKwkvKiBFTVBUWSAqLworCXsKKwkJJCQuaGFz X3RzY29uZmlnID0gZmFsc2U7CisJCSQkLmhhc190c3FwYXJzZXIgPSBmYWxzZTsKKwl9CisJfCB0 c21hdGNoX29wdHMgVFNDT05GSUdfUCBTVFJJTkdfUAorCXsKKwkJJCQgPSAkMTsKKwkJaWYgKCQk Lmhhc190c2NvbmZpZykKKwkJCWVyZXBvcnQoRVJST1IsCisJCQkJCShlcnJjb2RlKEVSUkNPREVf U1lOVEFYX0VSUk9SKSwKKwkJCQkJIGVycm1zZygiZHVwbGljYXRlIHRzY29uZmlnIG9wdGlvbiBp biB0c21hdGNoIikpKTsKKwkJJCQuaGFzX3RzY29uZmlnID0gdHJ1ZTsKKwkJJCQudHNjb25maWcg PSAkMzsKKwl9CisJfCB0c21hdGNoX29wdHMgVFNRVUVSWVBBUlNFUl9QIFNUUklOR19QCisJewor CQkkJCA9ICQxOworCQlpZiAoJCQuaGFzX3RzcXBhcnNlcikKKwkJCWVyZXBvcnQoRVJST1IsCisJ CQkJCShlcnJjb2RlKEVSUkNPREVfU1lOVEFYX0VSUk9SKSwKKwkJCQkJIGVycm1zZygiZHVwbGlj YXRlIHRzcXBhcnNlciBvcHRpb24gaW4gdHNtYXRjaCIpKSk7CisJCSQkLmhhc190c3FwYXJzZXIg PSB0cnVlOworCQkkJC50c3FwYXJzZXIgPSAkMzsKKwl9CisJOwoga2V5OgogCWtleV9uYW1lCQkJ CQkJeyAkJCA9IG1ha2VJdGVtS2V5KCYkMSk7IH0KIAk7CkBAIC0zNzcsNiArNDI5LDkgQEAga2V5 X25hbWU6CiAJfCBUSU1FX1RaX1AKIAl8IFRJTUVTVEFNUF9QCiAJfCBUSU1FU1RBTVBfVFpfUAor CXwgVFNDT05GSUdfUAorCXwgVFNNQVRDSF9QCisJfCBUU1FVRVJZUEFSU0VSX1AKIAl8IFNUUl9M T1dFUl9QCiAJfCBTVFJfVVBQRVJfUAogCXwgU1RSX0lOSVRDQVBfUApAQCAtNzE1LDMgKzc3MCw2 MSBAQCBqc3BDb252ZXJ0UmVnZXhGbGFncyh1aW50MzIgeGZsYWdzLCBpbnQgKnJlc3VsdCwgc3Ry dWN0IE5vZGUgKmVzY29udGV4dCkKIAogCXJldHVybiB0cnVlOwogfQorCitzdGF0aWMgYm9vbAor bWFrZUl0ZW1Uc01hdGNoKEpzb25QYXRoUGFyc2VJdGVtICpkb2MsCisJCQkgSnNvblBhdGhTdHJp bmcgKnRzcXVlcnksCisJCQkgSnNvblBhdGhTdHJpbmcgKnRzY29uZmlnLAorCQkJIEpzb25QYXRo U3RyaW5nICp0c3F1ZXJ5X3BhcnNlciwKKwkJCSBKc29uUGF0aFBhcnNlSXRlbSAqKnJlc3VsdCwK KwkJCSBzdHJ1Y3QgTm9kZSAqZXNjb250ZXh0KQoreworCUpzb25QYXRoUGFyc2VJdGVtICp2ID0g bWFrZUl0ZW1UeXBlKGpwaVRzTWF0Y2gpOworCisJdi0+dmFsdWUudHNtYXRjaC5kb2MgPSBkb2M7 CisKKwl2LT52YWx1ZS50c21hdGNoLnRzcXVlcnkgPSB0c3F1ZXJ5LT52YWw7CisJdi0+dmFsdWUu dHNtYXRjaC50c3F1ZXJ5X2xlbiA9IHRzcXVlcnktPmxlbjsKKworCS8qIEhhbmRsZSB0aGUgQ29u ZmlndXJhdGlvbiAoU3RvcmVkIGFzIGEgTm9kZSkgKi8KKwlpZiAodHNjb25maWcpCisJeworCSAg IEpzb25QYXRoUGFyc2VJdGVtICpjb25mID0gbWFrZUl0ZW1UeXBlKGpwaVN0cmluZyk7CisJICAg Y29uZi0+dmFsdWUuc3RyaW5nLnZhbCA9IHRzY29uZmlnLT52YWw7CisJICAgY29uZi0+dmFsdWUu c3RyaW5nLmxlbiA9IHRzY29uZmlnLT5sZW47CisJICAgdi0+dmFsdWUudHNtYXRjaC50c2NvbmZp ZyA9IGNvbmY7CisJfQorCWVsc2UKKwl7CisJICAgdi0+dmFsdWUudHNtYXRjaC50c2NvbmZpZyA9 IE5VTEw7CisJfQorCisJLyogSGFuZGxlIHRoZSBUU1F1ZXJ5IFBhcnNlciBGbGFnICovCisJaWYg KHRzcXVlcnlfcGFyc2VyKQorCXsKKwkJLyogQ2hlY2sgZm9yICJwbCIsICJwaCIsICJ3IiBoZXJl IHRvIHRocm93IGEgc3ludGF4IGVycm9yIGltbWVkaWF0ZWx5ICovCisJCWlmICghKHRzcXVlcnlf cGFyc2VyLT5sZW4gPT0gMiAmJiBwZ19zdHJuY2FzZWNtcCh0c3F1ZXJ5X3BhcnNlci0+dmFsLCAi cGwiLCAyKSA9PSAwKSAmJgorICAgICAgICAgICAgISh0c3F1ZXJ5X3BhcnNlci0+bGVuID09IDIg JiYgcGdfc3RybmNhc2VjbXAodHNxdWVyeV9wYXJzZXItPnZhbCwgInBoIiwgMikgPT0gMCkgJiYK KyAgICAgICAgICAgICEodHNxdWVyeV9wYXJzZXItPmxlbiA9PSAxICYmIHBnX3N0cm5jYXNlY21w KHRzcXVlcnlfcGFyc2VyLT52YWwsICJ3IiwgIDEpID09IDApKQorCQl7CisJCQllcnJzYXZlKGVz Y29udGV4dCwKKwkJCQkJKGVycmNvZGUoRVJSQ09ERV9TWU5UQVhfRVJST1IpLAorCQkJCQkJZXJy bXNnKCJpbnZhbGlkIHRzcXVlcnlfcGFyc2VyIHZhbHVlOiBcIiUuKnNcIiIsCisJCQkJCQkJKGlu dCkgdHNxdWVyeV9wYXJzZXItPmxlbiwgdHNxdWVyeV9wYXJzZXItPnZhbCksCisJCQkJCQllcnJo aW50KCJWYWxpZCB2YWx1ZXMgYXJlIFwicGxcIiwgXCJwaFwiLCBhbmQgXCJ3XCIuIikpKTsKKyAg ICAJCXJldHVybiBmYWxzZTsKKwkJfQorCisJCXYtPnZhbHVlLnRzbWF0Y2gudHNxcGFyc2VyID0g dHNxdWVyeV9wYXJzZXItPnZhbDsKKwkJdi0+dmFsdWUudHNtYXRjaC50c3FwYXJzZXJfbGVuID0g dHNxdWVyeV9wYXJzZXItPmxlbjsKKwl9CisJZWxzZQorCXsKKwkJdi0+dmFsdWUudHNtYXRjaC50 c3FwYXJzZXIgPSBOVUxMOworCQl2LT52YWx1ZS50c21hdGNoLnRzcXBhcnNlcl9sZW4gPSAwOwor CX0KKworCS8qIFN1Y2Nlc3MgKi8KKwkqcmVzdWx0ID0gdjsKKwlyZXR1cm4gdHJ1ZTsKK30KZGlm ZiAtLWdpdCBhL3NyYy9iYWNrZW5kL3V0aWxzL2FkdC9qc29ucGF0aF9zY2FuLmwgYi9zcmMvYmFj a2VuZC91dGlscy9hZHQvanNvbnBhdGhfc2Nhbi5sCmluZGV4IGU0ZmFkY2MyZTY5Li45MmIzZTli ZTkyNiAxMDA2NDQKLS0tIGEvc3JjL2JhY2tlbmQvdXRpbHMvYWR0L2pzb25wYXRoX3NjYW4ubAor KysgYi9zcmMvYmFja2VuZC91dGlscy9hZHQvanNvbnBhdGhfc2Nhbi5sCkBAIC00MzQsMTAgKzQz NCwxMyBAQCBzdGF0aWMgY29uc3QgSnNvblBhdGhLZXl3b3JkIGtleXdvcmRzW10gPSB7CiAJezcs IGZhbHNlLCBJTlRFR0VSX1AsICJpbnRlZ2VyIn0sCiAJezcsIGZhbHNlLCBTVFJfUkVQTEFDRV9Q LCAicmVwbGFjZSJ9LAogCXs3LCBmYWxzZSwgVElNRV9UWl9QLCAidGltZV90eiJ9LAorCXs3LCBm YWxzZSwgVFNNQVRDSF9QLCAidHNtYXRjaCJ9LAogCXs3LCBmYWxzZSwgVU5LTk9XTl9QLCAidW5r bm93biJ9LAogCXs4LCBmYWxzZSwgREFURVRJTUVfUCwgImRhdGV0aW1lIn0sCiAJezgsIGZhbHNl LCBLRVlWQUxVRV9QLCAia2V5dmFsdWUifSwKKwl7OCwgZmFsc2UsIFRTQ09ORklHX1AsICJ0c2Nv bmZpZyJ9LAogCXs5LCBmYWxzZSwgVElNRVNUQU1QX1AsICJ0aW1lc3RhbXAifSwKKwl7OSwgZmFs c2UsIFRTUVVFUllQQVJTRVJfUCwgInRzcXBhcnNlciJ9LAogCXsxMCwgZmFsc2UsIExJS0VfUkVH RVhfUCwgImxpa2VfcmVnZXgifSwKIAl7MTAsIGZhbHNlLCBTVFJfU1BMSVRfUEFSVF9QLCAic3Bs aXRfcGFydCJ9LAogCXsxMiwgZmFsc2UsIFRJTUVTVEFNUF9UWl9QLCAidGltZXN0YW1wX3R6In0s CmRpZmYgLS1naXQgYS9zcmMvaW5jbHVkZS91dGlscy9qc29ucGF0aC5oIGIvc3JjL2luY2x1ZGUv dXRpbHMvanNvbnBhdGguaAppbmRleCA4ZDI3MjA2ZTI0Mi4uODk3NTNiZjhiYzcgMTAwNjQ0Ci0t LSBhL3NyYy9pbmNsdWRlL3V0aWxzL2pzb25wYXRoLmgKKysrIGIvc3JjL2luY2x1ZGUvdXRpbHMv anNvbnBhdGguaApAQCAtMTA0LDYgKzEwNCw3IEBAIHR5cGVkZWYgZW51bSBKc29uUGF0aEl0ZW1U eXBlCiAJanBpTGFzdCwJCQkJCS8qIExBU1QgYXJyYXkgc3Vic2NyaXB0ICovCiAJanBpU3RhcnRz V2l0aCwJCQkJLyogU1RBUlRTIFdJVEggcHJlZGljYXRlICovCiAJanBpTGlrZVJlZ2V4LAkJCQkv KiBMSUtFX1JFR0VYIHByZWRpY2F0ZSAqLworCWpwaVRzTWF0Y2gsCQkJCQkvKiBUU01BVENIIHBy ZWRpY2F0ZSAqLwogCWpwaUJpZ2ludCwJCQkJCS8qIC5iaWdpbnQoKSBpdGVtIG1ldGhvZCAqLwog CWpwaUJvb2xlYW4sCQkJCQkvKiAuYm9vbGVhbigpIGl0ZW0gbWV0aG9kICovCiAJanBpRGF0ZSwJ CQkJCS8qIC5kYXRlKCkgaXRlbSBtZXRob2QgKi8KQEAgLTE5Niw2ICsxOTcsMTUgQEAgdHlwZWRl ZiBzdHJ1Y3QgSnNvblBhdGhJdGVtCiAJCQlpbnQzMgkJcGF0dGVybmxlbjsKIAkJCXVpbnQzMgkJ ZmxhZ3M7CiAJCX0JCQlsaWtlX3JlZ2V4OworCQlzdHJ1Y3QKKwkJeworCQkJaW50MzIJCWRvYzsK KwkJCWNoYXIJICAgKnRzcXVlcnk7CisJCQl1aW50MzIJCXRzcXVlcnlfbGVuOworCQkJaW50MzIJ CXRzY29uZmlnOworCQkJY2hhcgkgICAqdHNxcGFyc2VyOworCQkJdWludDMyCQl0c3FwYXJzZXJf bGVuOworCQl9CQkJdHNtYXRjaDsKIAl9CQkJY29udGVudDsKIH0gSnNvblBhdGhJdGVtOwogCkBA IC0yNzQsNiArMjg0LDE1IEBAIHN0cnVjdCBKc29uUGF0aFBhcnNlSXRlbQogCQkJdWludDMyCQls ZW47CiAJCQljaGFyCSAgICp2YWw7CS8qIGNvdWxkIG5vdCBiZSBub3QgbnVsbC10ZXJtaW5hdGVk ICovCiAJCX0JCQlzdHJpbmc7CisJCXN0cnVjdAorCQl7CisJCQlKc29uUGF0aFBhcnNlSXRlbSAq ZG9jOworCQkJY2hhcgkgICAqdHNxdWVyeTsKKwkJCXVpbnQzMgkJdHNxdWVyeV9sZW47CisJCQlK c29uUGF0aFBhcnNlSXRlbSAqdHNjb25maWc7CisJCQljaGFyCSAgICp0c3FwYXJzZXI7CisJCQl1 aW50MzIJCXRzcXBhcnNlcl9sZW47CisJCX0JCQl0c21hdGNoOwogCX0JCQl2YWx1ZTsKIH07CiAK ZGlmZiAtLWdpdCBhL3NyYy90ZXN0L3JlZ3Jlc3MvZXhwZWN0ZWQvanNvbmJfanNvbnBhdGgub3V0 IGIvc3JjL3Rlc3QvcmVncmVzcy9leHBlY3RlZC9qc29uYl9qc29ucGF0aC5vdXQKaW5kZXggYWZh NmM0Y2I1MjkuLmFjNzhiZWNjMzA1IDEwMDY0NAotLS0gYS9zcmMvdGVzdC9yZWdyZXNzL2V4cGVj dGVkL2pzb25iX2pzb25wYXRoLm91dAorKysgYi9zcmMvdGVzdC9yZWdyZXNzL2V4cGVjdGVkL2pz b25iX2pzb25wYXRoLm91dApAQCAtNDg5MSwzICs0ODkxLDYxIEBAIE9SREVSIEJZIHMxLm51bSwg czIubnVtOwogIHsicyI6ICJCIn0gICAgfCB7InMiOiAiQiJ9ICAgIHwgZmFsc2UgfCB0cnVlICB8 IHRydWUgIHwgdHJ1ZSAgfCBmYWxzZQogKDE0NCByb3dzKQogCitzZWxlY3QganNvbmJfcGF0aF9x dWVyeSgnW251bGwsIDEsICJydW5uaW5nIiwgInJ1bnMiLCAicmFuIiwgInJ1biIsICJydW5uZXIi LCAiam9nZ2luZyJdJywgJ2xheCAkWypdID8gKEAgdHNtYXRjaCAiZmx5IiB0c2NvbmZpZyAiZW5n bGlzaCIpJyk7CisganNvbmJfcGF0aF9xdWVyeSAKKy0tLS0tLS0tLS0tLS0tLS0tLQorKDAgcm93 cykKKworc2VsZWN0IGpzb25iX3BhdGhfcXVlcnkoJ1tudWxsLCAxLCAicnVubmluZyIsICJydW5z IiwgInJhbiIsICJydW4iLCAicnVubmVyIiwgImpvZ2dpbmciXScsICdsYXggJFsqXSA/IChAIHRz bWF0Y2ggInJ1biIgdHNjb25maWcgImVuZ2xpc2giKScpOworIGpzb25iX3BhdGhfcXVlcnkgCist LS0tLS0tLS0tLS0tLS0tLS0KKyAicnVubmluZyIKKyAicnVucyIKKyAicnVuIgorKDMgcm93cykK Kworc2VsZWN0IGpzb25iX3BhdGhfcXVlcnkoJ1tudWxsLCAxLCAicnVubmluZyIsICJydW5zIiwg InJhbiIsICJydW4iLCAicnVubmVyIiwgImpvZ2dpbmciXScsICdsYXggJFsqXSA/IChAIHRzbWF0 Y2ggInJ1biIgdHNjb25maWcgInNpbXBsZSIpJyk7CisganNvbmJfcGF0aF9xdWVyeSAKKy0tLS0t LS0tLS0tLS0tLS0tLQorICJydW4iCisoMSByb3cpCisKK3NlbGVjdCBqc29uYl9wYXRoX3F1ZXJ5 KCdbbnVsbCwgMSwgIlBvc3RncmVTUUwiLCAicG9zdGdyZXMiLCAiUE9TVEdSRVMiLCAiZGF0YWJh c2UiXScsICdsYXggJFsqXSA/IChAIHRzbWF0Y2ggIlBvc3RncmVzIiB0c2NvbmZpZyAiZW5nbGlz aCIpJyk7CisganNvbmJfcGF0aF9xdWVyeSAKKy0tLS0tLS0tLS0tLS0tLS0tLQorICJwb3N0Z3Jl cyIKKyAiUE9TVEdSRVMiCisoMiByb3dzKQorCitzZWxlY3QganNvbmJfcGF0aF9xdWVyeSgnW251 bGwsIDEsICJQb3N0Z3JlU1FMIiwgInBvc3RncmVzIiwgIlBPU1RHUkVTIiwgImRhdGFiYXNlIl0n LCAnbGF4ICRbKl0gPyAoQCB0c21hdGNoICJQb3N0Z3JlcyIgdHNjb25maWcgInNpbXBsZSIpJyk7 CisganNvbmJfcGF0aF9xdWVyeSAKKy0tLS0tLS0tLS0tLS0tLS0tLQorICJwb3N0Z3JlcyIKKyAi UE9TVEdSRVMiCisoMiByb3dzKQorCistLSBpbiB0aGUgZGVmYXVsdCB0c3FwYXJzZXIgKHRvX3Rz cXVlcnkpIHNwYWNlcyBhcmUgbm90IGFsbG93ZWQsIHNvIHRoaXMgc2hvdWxkIGZhaWwgZm9yIHN5 bnRheAorc2VsZWN0IGpzb25iX3BhdGhfcXVlcnkoJ1siZmFzdCBjYXIiLCAic3VwZXIgZmFzdCBj YXIiLCAiZmFzdCBhbmQgZnVyaW91cyIsICJzbG93IGNhciJdJywgJ2xheCAkWypdID8gKEAgdHNt YXRjaCAiZmFzdCBjYXIiIHRzY29uZmlnICJlbmdsaXNoIiknKTsKK0VSUk9SOiAgc3ludGF4IGVy cm9yIGluIHRzcXVlcnk6ICJmYXN0IGNhciIKKy0tIGlmIHdlIHNwZWNpZnkgInciIGhvd2V2ZXIg aXQgc2hvdWxkIGJlIG9rCitzZWxlY3QganNvbmJfcGF0aF9xdWVyeSgnWyJmYXN0IGNhciIsICJz dXBlciBmYXN0IGNhciIsICJmYXN0IGFuZCBmdXJpb3VzIiwgInNsb3cgY2FyIl0nLCAnbGF4ICRb Kl0gPyAoQCB0c21hdGNoICJmYXN0IGNhciIgdHNjb25maWcgImVuZ2xpc2giIHRzcXBhcnNlciAi dyIpJyk7CisganNvbmJfcGF0aF9xdWVyeSAKKy0tLS0tLS0tLS0tLS0tLS0tLQorICJmYXN0IGNh ciIKKyAic3VwZXIgZmFzdCBjYXIiCisoMiByb3dzKQorCistLSBpdCBzaG91bGQgYWxzbyBiZSBv ayBpZiB3ZSBjaGFuZ2UgdG8gYSB2YWxpZCB0b190c3F1ZXJ5CitzZWxlY3QganNvbmJfcGF0aF9x dWVyeSgnWyJmYXN0IGNhciIsICJzdXBlciBmYXN0IGNhciIsICJmYXN0IGFuZCBmdXJpb3VzIiwg InNsb3cgY2FyIl0nLCAnbGF4ICRbKl0gPyAoQCB0c21hdGNoICJmYXN0ICYgY2FyIiB0c2NvbmZp ZyAiZW5nbGlzaCIpJyk7CisganNvbmJfcGF0aF9xdWVyeSAKKy0tLS0tLS0tLS0tLS0tLS0tLQor ICJmYXN0IGNhciIKKyAic3VwZXIgZmFzdCBjYXIiCisoMiByb3dzKQorCitzZWxlY3QganNvbmJf cGF0aF9xdWVyeSgnWyJmYXQgY2F0IiwgImNhdCBmYXQiLCAiZmF0IHJhdHMiXScsICdsYXggJFsq XSA/IChAIHRzbWF0Y2ggImZhdCAmIHJhdCIgdHNjb25maWcgImVuZ2xpc2giKScpOworIGpzb25i X3BhdGhfcXVlcnkgCistLS0tLS0tLS0tLS0tLS0tLS0KKyAiZmF0IHJhdHMiCisoMSByb3cpCisK ZGlmZiAtLWdpdCBhL3NyYy90ZXN0L3JlZ3Jlc3MvZXhwZWN0ZWQvanNvbnBhdGgub3V0IGIvc3Jj L3Rlc3QvcmVncmVzcy9leHBlY3RlZC9qc29ucGF0aC5vdXQKaW5kZXggZWE5NzFlNzk4NTQuLmJh NDM3MDg1NDA1IDEwMDY0NAotLS0gYS9zcmMvdGVzdC9yZWdyZXNzL2V4cGVjdGVkL2pzb25wYXRo Lm91dAorKysgYi9zcmMvdGVzdC9yZWdyZXNzL2V4cGVjdGVkL2pzb25wYXRoLm91dApAQCAtMTQ4 MCwzICsxNDgwLDY1IEBAIEZST00gdW5uZXN0KEFSUkFZWyckID8gKEAgbGlrZV9yZWdleCAicGF0 dGVybiIgZmxhZyAic21peHEiKSc6OnRleHQsCiAgMWEgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgfCBmICB8IDQyNjAxICAgICAgICAgIHwgdHJhaWxpbmcganVuayBhZnRl ciBudW1lcmljIGxpdGVyYWwgYXQgb3IgbmVhciAiMWEiIG9mIGpzb25wYXRoIGlucHV0IHwgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAK ICg1IHJvd3MpCiAKKy0tIHRzbWF0Y2ggKEZ1bGwgVGV4dCBTZWFyY2gpCistLSBiYXNpYyBzdWNj ZXNzCitzZWxlY3QgJyQgPyAoQCB0c21hdGNoICJzaW1wbGUiKSc6Ompzb25wYXRoOworICAgICAg ICBqc29ucGF0aCAgICAgICAgCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAkPyhAIHRzbWF0 Y2ggInNpbXBsZSIpCisoMSByb3cpCisKK3NlbGVjdCAnJCA/IChAIHRzbWF0Y2ggInJ1bm5pbmci IHRzY29uZmlnICJlbmdsaXNoIiknOjpqc29ucGF0aDsKKyAgICAgICAgICAgICAgICAgIGpzb25w YXRoICAgICAgICAgICAgICAgICAgCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLQorICQ/KEAgdHNtYXRjaCAicnVubmluZyIgdHNjb25maWcgImVuZ2xpc2giKQor KDEgcm93KQorCistLSB3L291dCB0c2NvbmZpZyBhbmQgdHNxcGFyc2VyCitzZWxlY3QgJyQgPyAo QCB0c21hdGNoICJmYXN0ICYgZnVyaW91cyIgdHNjb25maWcgInNpbXBsZSIpJzo6anNvbnBhdGg7 CisgICAgICAgICAgICAgICAgICAgICBqc29ucGF0aCAgICAgICAgICAgICAgICAgICAgIAorLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAkPyhAIHRz bWF0Y2ggImZhc3QgJiBmdXJpb3VzIiB0c2NvbmZpZyAic2ltcGxlIikKKygxIHJvdykKKworc2Vs ZWN0ICckID8gKEAgdHNtYXRjaCAiZmFzdCAmIGZ1cmlvdXMiIHRzY29uZmlnICJzaW1wbGUiIHRz cXBhcnNlciAidyIpJzo6anNvbnBhdGg7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAganNv bnBhdGggICAgICAgICAgICAgICAgICAgICAgICAgICAgCistLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgJD8oQCB0c21hdGNo ICJmYXN0ICYgZnVyaW91cyIgdHNjb25maWcgInNpbXBsZSIgdHNxcGFyc2VyICJ3IikKKygxIHJv dykKKworLS0gdHNjb25maWcgYW5kIHRzcXBhcnNlciBjYW4gYXBwZWFyIGluIGFueSBvcmRlcgor c2VsZWN0ICckID8gKEAgdHNtYXRjaCAiZmFzdCAmIGZ1cmlvdXMiIHRzcXBhcnNlciAidyIgdHNj b25maWcgInNpbXBsZSIgKSc6Ompzb25wYXRoOworICAgICAgICAgICAgICAgICAgICAgICAgICAg IGpzb25wYXRoICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICQ/KEAgdHNt YXRjaCAiZmFzdCAmIGZ1cmlvdXMiIHRzY29uZmlnICJzaW1wbGUiIHRzcXBhcnNlciAidyIpCiso MSByb3cpCisKK3NlbGVjdCAnJCA/IChAIHRzbWF0Y2ggImZhc3QgJiBmdXJpb3VzIiB0c3FwYXJz ZXIgInciKSc6Ompzb25wYXRoOworICAgICAgICAgICAgICAgICAgIGpzb25wYXRoICAgICAgICAg ICAgICAgICAgIAorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LQorICQ/KEAgdHNtYXRjaCAiZmFzdCAmIGZ1cmlvdXMiIHRzcXBhcnNlciAidyIpCisoMSByb3cp CisKK3NlbGVjdCAnJFsqXSA/IChALnRpdGxlIHRzbWF0Y2ggImdvZCIgJiYgQC5yYXRpbmcgPiA1 KSc6Ompzb25wYXRoOworICAgICAgICAgICAgICAgICAgICAganNvbnBhdGggICAgICAgICAgICAg ICAgICAgICAKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tCisgJFsqXT8oQC4idGl0bGUiIHRzbWF0Y2ggImdvZCIgJiYgQC4icmF0aW5nIiA+IDUpCiso MSByb3cpCisKK3NlbGVjdCAnJCA/IChAIHRzbWF0Y2ggJHBhdHRlcm4pJzo6anNvbnBhdGg7CitF UlJPUjogIHN5bnRheCBlcnJvciBhdCBvciBuZWFyICIkcGF0dGVybiIgb2YganNvbnBhdGggaW5w dXQKK0xJTkUgMTogc2VsZWN0ICckID8gKEAgdHNtYXRjaCAkcGF0dGVybiknOjpqc29ucGF0aDsK KyAgICAgICAgICAgICAgIF4KKy0tIG9ubHkgc3RyaW5nIGxpdGVyYWxzIChubyB2YXJpYWJsZXMp IGFyZSBhbGxvd2VkIGZvciB0c3F1ZXJ5CitzZWxlY3QgJyQgPyAoQCB0c21hdGNoICR2YXIgdHNj b25maWcgImVuZ2xpc2giKSc6Ompzb25wYXRoOworRVJST1I6ICBzeW50YXggZXJyb3IgYXQgb3Ig bmVhciAiJHZhciIgb2YganNvbnBhdGggaW5wdXQKK0xJTkUgMTogc2VsZWN0ICckID8gKEAgdHNt YXRjaCAkdmFyIHRzY29uZmlnICJlbmdsaXNoIiknOjpqc29ucGF0aDsKKyAgICAgICAgICAgICAg IF4KKy0tIGlmIGEgdHNjb25maWcgZG9lc24ndCBleGlzdCBpdCBzaG91bGQgcGFyc2Ugbm9uZXRo ZWxlc3MgKGV4ZWN1dG9yIHdpbGwgZmFpbCBpdCkKK3NlbGVjdCAnJCA/IChAIHRzbWF0Y2ggInJ1 bm5pbmciIHRzY29uZmlnICJ3cm9uZ2NvbmZpZyIpJzo6anNvbnBhdGg7CisgICAgICAgICAgICAg ICAgICAgIGpzb25wYXRoICAgICAgICAgICAgICAgICAgICAKKy0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICQ/KEAgdHNtYXRjaCAicnVubmluZyIgdHNj b25maWcgIndyb25nY29uZmlnIikKKygxIHJvdykKKwpkaWZmIC0tZ2l0IGEvc3JjL3Rlc3QvcmVn cmVzcy9zcWwvanNvbmJfanNvbnBhdGguc3FsIGIvc3JjL3Rlc3QvcmVncmVzcy9zcWwvanNvbmJf anNvbnBhdGguc3FsCmluZGV4IGQzYTM4YzU3NzkxLi44Njk4MDIxYmEyYiAxMDA2NDQKLS0tIGEv c3JjL3Rlc3QvcmVncmVzcy9zcWwvanNvbmJfanNvbnBhdGguc3FsCisrKyBiL3NyYy90ZXN0L3Jl Z3Jlc3Mvc3FsL2pzb25iX2pzb25wYXRoLnNxbApAQCAtMTI1MywzICsxMjUzLDE2IEBAIFNFTEVD VAogCWpzb25iX3BhdGhfcXVlcnlfZmlyc3QoczEuaiwgJyQucyA+ICRzJywgdmFycyA9PiBzMi5q KSBndAogRlJPTSBzdHIgczEsIHN0ciBzMgogT1JERVIgQlkgczEubnVtLCBzMi5udW07CisKK3Nl bGVjdCBqc29uYl9wYXRoX3F1ZXJ5KCdbbnVsbCwgMSwgInJ1bm5pbmciLCAicnVucyIsICJyYW4i LCAicnVuIiwgInJ1bm5lciIsICJqb2dnaW5nIl0nLCAnbGF4ICRbKl0gPyAoQCB0c21hdGNoICJm bHkiIHRzY29uZmlnICJlbmdsaXNoIiknKTsKK3NlbGVjdCBqc29uYl9wYXRoX3F1ZXJ5KCdbbnVs bCwgMSwgInJ1bm5pbmciLCAicnVucyIsICJyYW4iLCAicnVuIiwgInJ1bm5lciIsICJqb2dnaW5n Il0nLCAnbGF4ICRbKl0gPyAoQCB0c21hdGNoICJydW4iIHRzY29uZmlnICJlbmdsaXNoIiknKTsK K3NlbGVjdCBqc29uYl9wYXRoX3F1ZXJ5KCdbbnVsbCwgMSwgInJ1bm5pbmciLCAicnVucyIsICJy YW4iLCAicnVuIiwgInJ1bm5lciIsICJqb2dnaW5nIl0nLCAnbGF4ICRbKl0gPyAoQCB0c21hdGNo ICJydW4iIHRzY29uZmlnICJzaW1wbGUiKScpOworc2VsZWN0IGpzb25iX3BhdGhfcXVlcnkoJ1tu dWxsLCAxLCAiUG9zdGdyZVNRTCIsICJwb3N0Z3JlcyIsICJQT1NUR1JFUyIsICJkYXRhYmFzZSJd JywgJ2xheCAkWypdID8gKEAgdHNtYXRjaCAiUG9zdGdyZXMiIHRzY29uZmlnICJlbmdsaXNoIikn KTsKK3NlbGVjdCBqc29uYl9wYXRoX3F1ZXJ5KCdbbnVsbCwgMSwgIlBvc3RncmVTUUwiLCAicG9z dGdyZXMiLCAiUE9TVEdSRVMiLCAiZGF0YWJhc2UiXScsICdsYXggJFsqXSA/IChAIHRzbWF0Y2gg IlBvc3RncmVzIiB0c2NvbmZpZyAic2ltcGxlIiknKTsKKy0tIGluIHRoZSBkZWZhdWx0IHRzcXBh cnNlciAodG9fdHNxdWVyeSkgc3BhY2VzIGFyZSBub3QgYWxsb3dlZCwgc28gdGhpcyBzaG91bGQg ZmFpbCBmb3Igc3ludGF4CitzZWxlY3QganNvbmJfcGF0aF9xdWVyeSgnWyJmYXN0IGNhciIsICJz dXBlciBmYXN0IGNhciIsICJmYXN0IGFuZCBmdXJpb3VzIiwgInNsb3cgY2FyIl0nLCAnbGF4ICRb Kl0gPyAoQCB0c21hdGNoICJmYXN0IGNhciIgdHNjb25maWcgImVuZ2xpc2giKScpOworLS0gaWYg d2Ugc3BlY2lmeSAidyIgaG93ZXZlciBpdCBzaG91bGQgYmUgb2sKK3NlbGVjdCBqc29uYl9wYXRo X3F1ZXJ5KCdbImZhc3QgY2FyIiwgInN1cGVyIGZhc3QgY2FyIiwgImZhc3QgYW5kIGZ1cmlvdXMi LCAic2xvdyBjYXIiXScsICdsYXggJFsqXSA/IChAIHRzbWF0Y2ggImZhc3QgY2FyIiB0c2NvbmZp ZyAiZW5nbGlzaCIgdHNxcGFyc2VyICJ3IiknKTsKKy0tIGl0IHNob3VsZCBhbHNvIGJlIG9rIGlm IHdlIGNoYW5nZSB0byBhIHZhbGlkIHRvX3RzcXVlcnkKK3NlbGVjdCBqc29uYl9wYXRoX3F1ZXJ5 KCdbImZhc3QgY2FyIiwgInN1cGVyIGZhc3QgY2FyIiwgImZhc3QgYW5kIGZ1cmlvdXMiLCAic2xv dyBjYXIiXScsICdsYXggJFsqXSA/IChAIHRzbWF0Y2ggImZhc3QgJiBjYXIiIHRzY29uZmlnICJl bmdsaXNoIiknKTsKK3NlbGVjdCBqc29uYl9wYXRoX3F1ZXJ5KCdbImZhdCBjYXQiLCAiY2F0IGZh dCIsICJmYXQgcmF0cyJdJywgJ2xheCAkWypdID8gKEAgdHNtYXRjaCAiZmF0ICYgcmF0IiB0c2Nv bmZpZyAiZW5nbGlzaCIpJyk7CmRpZmYgLS1naXQgYS9zcmMvdGVzdC9yZWdyZXNzL3NxbC9qc29u cGF0aC5zcWwgYi9zcmMvdGVzdC9yZWdyZXNzL3NxbC9qc29ucGF0aC5zcWwKaW5kZXggNDQxNzhk OGI0NWEuLmQxMTFjZWU2MjY0IDEwMDY0NAotLS0gYS9zcmMvdGVzdC9yZWdyZXNzL3NxbC9qc29u cGF0aC5zcWwKKysrIGIvc3JjL3Rlc3QvcmVncmVzcy9zcWwvanNvbnBhdGguc3FsCkBAIC0zMDYs MyArMzA2LDIyIEBAIEZST00gdW5uZXN0KEFSUkFZWyckID8gKEAgbGlrZV9yZWdleCAicGF0dGVy biIgZmxhZyAic21peHEiKSc6OnRleHQsCiAgICAgICAgICAgICAgICAgICAnMDAnLAogICAgICAg ICAgICAgICAgICAgJzFhJ10pIHN0ciwKICAgICAgTEFURVJBTCBwZ19pbnB1dF9lcnJvcl9pbmZv KHN0ciwgJ2pzb25wYXRoJykgYXMgZXJyaW5mbzsKKworLS0gdHNtYXRjaCAoRnVsbCBUZXh0IFNl YXJjaCkKKworLS0gYmFzaWMgc3VjY2Vzcworc2VsZWN0ICckID8gKEAgdHNtYXRjaCAic2ltcGxl IiknOjpqc29ucGF0aDsKK3NlbGVjdCAnJCA/IChAIHRzbWF0Y2ggInJ1bm5pbmciIHRzY29uZmln ICJlbmdsaXNoIiknOjpqc29ucGF0aDsKKy0tIHcvb3V0IHRzY29uZmlnIGFuZCB0c3FwYXJzZXIK K3NlbGVjdCAnJCA/IChAIHRzbWF0Y2ggImZhc3QgJiBmdXJpb3VzIiB0c2NvbmZpZyAic2ltcGxl IiknOjpqc29ucGF0aDsKK3NlbGVjdCAnJCA/IChAIHRzbWF0Y2ggImZhc3QgJiBmdXJpb3VzIiB0 c2NvbmZpZyAic2ltcGxlIiB0c3FwYXJzZXIgInciKSc6Ompzb25wYXRoOworLS0gdHNjb25maWcg YW5kIHRzcXBhcnNlciBjYW4gYXBwZWFyIGluIGFueSBvcmRlcgorc2VsZWN0ICckID8gKEAgdHNt YXRjaCAiZmFzdCAmIGZ1cmlvdXMiIHRzcXBhcnNlciAidyIgdHNjb25maWcgInNpbXBsZSIgKSc6 Ompzb25wYXRoOworc2VsZWN0ICckID8gKEAgdHNtYXRjaCAiZmFzdCAmIGZ1cmlvdXMiIHRzcXBh cnNlciAidyIpJzo6anNvbnBhdGg7CitzZWxlY3QgJyRbKl0gPyAoQC50aXRsZSB0c21hdGNoICJn b2QiICYmIEAucmF0aW5nID4gNSknOjpqc29ucGF0aDsKK3NlbGVjdCAnJCA/IChAIHRzbWF0Y2gg JHBhdHRlcm4pJzo6anNvbnBhdGg7CisKKy0tIG9ubHkgc3RyaW5nIGxpdGVyYWxzIChubyB2YXJp YWJsZXMpIGFyZSBhbGxvd2VkIGZvciB0c3F1ZXJ5CitzZWxlY3QgJyQgPyAoQCB0c21hdGNoICR2 YXIgdHNjb25maWcgImVuZ2xpc2giKSc6Ompzb25wYXRoOworLS0gaWYgYSB0c2NvbmZpZyBkb2Vz bid0IGV4aXN0IGl0IHNob3VsZCBwYXJzZSBub25ldGhlbGVzcyAoZXhlY3V0b3Igd2lsbCBmYWls IGl0KQorc2VsZWN0ICckID8gKEAgdHNtYXRjaCAicnVubmluZyIgdHNjb25maWcgIndyb25nY29u ZmlnIiknOjpqc29ucGF0aDsKLS0gCjIuNTMuMAoK --000000000000cc9458064eb3008c--