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 1w8xT6-0013AS-1e for pgsql-hackers@arkaria.postgresql.org; Sat, 04 Apr 2026 09:39:04 +0000 Received: from localhost ([127.0.0.1] helo=malur.postgresql.org) by malur.postgresql.org with esmtp (Exim 4.96) (envelope-from ) id 1w8xT3-00Fsio-2I for pgsql-hackers@arkaria.postgresql.org; Sat, 04 Apr 2026 09:39:02 +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 1w8xT3-00Fsig-0f for pgsql-hackers@lists.postgresql.org; Sat, 04 Apr 2026 09:39:01 +0000 Received: from mail-ed1-x531.google.com ([2a00:1450:4864:20::531]) by magus.postgresql.org with esmtps (TLS1.3) tls TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256 (Exim 4.98.2) (envelope-from ) id 1w8xT0-00000000XFy-0NqR for pgsql-hackers@lists.postgresql.org; Sat, 04 Apr 2026 09:39:00 +0000 Received: by mail-ed1-x531.google.com with SMTP id 4fb4d7f45d1cf-66c304dbfd2so1177146a12.0 for ; Sat, 04 Apr 2026 02:38:58 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1775295537; cv=none; d=google.com; s=arc-20240605; b=jTP9vtFccyRt772SmG8DpZAaR92D/Yy9yywFc74duntqf6Dg1QSWWodiOsh/j/vT6O tnbdeh1qnBjhZUwu94TT1rKvKSlwKvemTmB69cZ6VJJqw0cLY4bZBrOQgy4p3/sGJKHW OZ0jsA3eJ52IemZsxFasiBVgx/oUX9CkJEn7sdqbNJ9mawLLJ/k5ZaEOIKOAMPMzy0VK ElDSt+eYQK9AIWqNyQTJ80SJemRjhjhanyJugjJPKrDTx0PDWNe8bvGzWc/qRiYpMeXM zXDBc4yWKR8G8OeWks3BvWqMzr1OOs+jtG1EXqDZGh4bDs/wESyxsdUXu9Z4TfXHFyen HCJw== 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=OjCL/ZLcbXvvpb858e/KD7jdAluigDW+djW3j+Zo/fk=; fh=C1+lIqWjIlktG8y34pYS2L6k4IhXDzvRou+xOGnMz2Q=; b=h1P9T8XLMDitD+oAmgpqOS370WXflavagjYv85xDRYCk6wsmua4Kh1uC/RRWkjnOet daTmrH+wWawR+HSVq5PtxuyP59BhnBZ6iB+jofUvOtajQ0ARXz+7JZHzss8LK7kSSv/8 81qEmRq7ZNv05jsRQBDZ0aM/2c10s8fNxL/xih1OptN0MTg6mK8zReFyud6/P3l4UKGq mRJUGvhRcejWP4aQcj+0MYWz6crOEXFImB2itEi+1cyTurWG0rnFrT0W88tDHH/DD5Lj 2G9foHY8bqSdWHYqBo+fMTRML+hgFvMoBiikRagCaPKU73jZjE/EymcTysE6kxCjzTmi 2saQ==; 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=1775295537; x=1775900337; 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=OjCL/ZLcbXvvpb858e/KD7jdAluigDW+djW3j+Zo/fk=; b=pAvG56MvwxtoOmfV631ablAi1zSKVDMfuAKghJ7471iZsgy4RcH7LeTteQgRzqYbMs rd70mu0QSqZJzvLGr8zZlVvmfUbyXG8x1jQFLkWVCccJ7dGfDMbGx/ik/9Ui1zZpgNJ/ PhLxosLYzF1n5oy/zVRY52MNlUTSA6zEhwfhUywF3on+7c5sS/dfqyeGsdhuCd+u0+4Z JRqztCmuFHw/KudwNLxm4nKSAjzAPyUiNB6CIHFNscfbCeFHFK2Kkc3s/1EERJpo97eg CTiwZ5hguJZAVDGUYHZoyLx9Nu93QSc1K8FSSWmVycfrdFPUr31PbVOkKwuLPisjT3gV LHlg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1775295537; x=1775900337; 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=OjCL/ZLcbXvvpb858e/KD7jdAluigDW+djW3j+Zo/fk=; b=V/cailGjHDroWldWxIPQEd26dh0w8yTdXDHQXh2n8QxyETUYuNrL+jqqkrKjVmlxEr 3S80L/Wm0ziTZjFu/pD8pE3Drl/Vhl6rs+QZL7IRKlo7fWVdPC9R/JYOhjJDyQ8gE6If nqRHHgrCxJZjV//P37TuVlY7H5Svf0Pc+C1lQOxK9PE5qaGe0ceqRV7dlINyreh+Pvpx bdI6MTvmMB9vrBSwRzBI6Sga6Dyf1Z3ewZ9rSpBsLzIX/RC09qnD7XZu8UGIFuQ3M80G 7eYODeQs6e4QhCmbAjOATgKugaUHzWvpNZlRetCvOz5/BW0TmSIRBQUvk66pfTgMl88J CgEA== X-Gm-Message-State: AOJu0Yztu75RyYSu1vLgPGUibjWH+Ox0/CxO+r50pr5YytAzk3nixov8 WXeYr0HXEWevXBHbs3W1bNXfLnCTmKYKkfKfdZZ1BSobNJRSUDYyp2SujTPQcVVs9IMLvbx8HER XfNCsu2mhmkILQ4Ww2CrarJwazyZEbVGiJg== X-Gm-Gg: AeBDiesb+u5+bQr/IJmooYeIrnixGIuM7Cjtrbko3IxRGbFnyMPzeiniDyvn5l7f6ZK wdckvPQze8u2Xre1kL/mNbGyy/cnCnNl08FX7pc49MnXx9FFPrTH1cjBbW1YYnbD57WHxvpg/YZ RjncY1pKLaNJh9Y5/BgvJnsczWqfe91Ujv6YTNQEGhSri7tLG4SzCltbkOns49IolWyPZWsATQJ xPISt1tyPGe3TtQK1QOxf3Qmeh+3Mw0+cBSehWe1uwbta4nh98bz5ntiT0B/fft4sMS4T+zlcWL 5Xdj9WdtW1LHFMUDqHokG0TM/0Qfhv5IENcM6FnaUzErtFx0UXHZNE+eazDEmINHd0U3dDWMtHw VxgfXx7MB9r8KkGy+AIl99VMJ5o7LupH0cOU+Kvn7dJG9RsXYDZrCcyWNisJ/q2c4VsJ2B7aXYy BtqWAtqT4/12absNw= X-Received: by 2002:a05:6402:51ce:b0:66e:6f38:47ef with SMTP id 4fb4d7f45d1cf-66e6f384fc7mr1000841a12.8.1775295536596; Sat, 04 Apr 2026 02:38:56 -0700 (PDT) MIME-Version: 1.0 References: In-Reply-To: From: Florents Tselai Date: Sat, 4 Apr 2026 12:38:18 +0300 X-Gm-Features: AQROBzDGXFXOT4lDBmhxu3AppH_ufDowLs4p45LShqra1EuSLao2Kbrx_5ehMEc Message-ID: Subject: Re: Patch: Add tsmatch JSONPath operator for granular Full Text Search To: Chao Li Cc: pgsql-hackers Content-Type: multipart/mixed; boundary="000000000000d4c5b0064e9f33e4" List-Id: List-Help: List-Subscribe: List-Post: List-Owner: List-Archive: Archived-At: Precedence: bulk --000000000000d4c5b0064e9f33e4 Content-Type: multipart/alternative; boundary="000000000000d4c5ac064e9f33e2" --000000000000d4c5ac064e9f33e2 Content-Type: text/plain; charset="UTF-8" Content-Transfer-Encoding: quoted-printable 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 w= rote: > >> >> >> > 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-in= g >> 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-place >> 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 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" flag (similar t= o >> 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, >> + JsonPathString >> *tsquery, >> + JsonPathString >> *tsconfig, >> + JsonPathString >> *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 fir= st >> 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 te= rms >> 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 i= t 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 with= 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 ha= s 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->initialized= 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_parser >> 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" tsqparse= r >> "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 problem >> 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 af= ter >> 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 fail > 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 > > > --000000000000d4c5ac064e9f33e2 Content-Type: text/html; charset="UTF-8" Content-Transfer-Encoding: quoted-printable
Here's a v5 which is v4=C2=A0+ pgindent=C2=A0


<= div dir=3D"ltr">



On Fri, Apr 3, 2026 at 12:56=E2=80=AFPM Flore= nts 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


--000000000000d4c5ac064e9f33e2-- --000000000000d4c5b0064e9f33e4 Content-Type: application/octet-stream; name="v5-0001-Add-tsmatch-JSONPath-operator-for-granular-Full-T.patch" Content-Disposition: attachment; filename="v5-0001-Add-tsmatch-JSONPath-operator-for-granular-Full-T.patch" Content-Transfer-Encoding: base64 Content-ID: X-Attachment-Id: f_mnk53dsi0 RnJvbSA0YjkwMTk5NjEyZDA1ODc1M2JkN2RjZDM5ZmFjOTcxNmYxYTRiYzQ0IE1vbiBTZXAgMTcg MDA6MDA6MDAgMjAwMQpGcm9tOiBGbG9yZW50cyBUc2VsYWkgPGZsb3JlbnRzLnRzZWxhaUBnbWFp bC5jb20+CkRhdGU6IFNhdCwgNCBBcHIgMjAyNiAxMjowNDoyNSArMDMwMApTdWJqZWN0OiBbUEFU Q0ggdjVdIEFkZCB0c21hdGNoIEpTT05QYXRoIG9wZXJhdG9yIGZvciBncmFudWxhciBGdWxsIFRl 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 bi5zZ21sICAgICAgICAgICAgIHwgIDM0ICsrKysrCiBzcmMvYmFja2VuZC91dGlscy9hZHQvanNv bnBhdGguYyAgICAgICAgICAgICB8IDEzMSArKysrKysrKysrKysrKystCiBzcmMvYmFja2VuZC91 dGlscy9hZHQvanNvbnBhdGhfZXhlYy5jICAgICAgICB8IDE1MyArKysrKysrKysrKysrKysrKyst CiBzcmMvYmFja2VuZC91dGlscy9hZHQvanNvbnBhdGhfZ3JhbS55ICAgICAgICB8IDExNSArKysr KysrKysrKysrLQogc3JjL2JhY2tlbmQvdXRpbHMvYWR0L2pzb25wYXRoX3NjYW4ubCAgICAgICAg fCAgIDMgKwogc3JjL2luY2x1ZGUvdXRpbHMvanNvbnBhdGguaCAgICAgICAgICAgICAgICAgfCAg MTkgKysrCiBzcmMvdGVzdC9yZWdyZXNzL2V4cGVjdGVkL2pzb25iX2pzb25wYXRoLm91dCB8ICA1 OCArKysrKysrCiBzcmMvdGVzdC9yZWdyZXNzL2V4cGVjdGVkL2pzb25wYXRoLm91dCAgICAgICB8 ICA2MCArKysrKysrKwogc3JjL3Rlc3QvcmVncmVzcy9zcWwvanNvbmJfanNvbnBhdGguc3FsICAg ICAgfCAgMTMgKysKIHNyYy90ZXN0L3JlZ3Jlc3Mvc3FsL2pzb25wYXRoLnNxbCAgICAgICAgICAg IHwgIDE5ICsrKwogMTAgZmlsZXMgY2hhbmdlZCwgNjAxIGluc2VydGlvbnMoKyksIDQgZGVsZXRp b25zKC0pCgpkaWZmIC0tZ2l0IGEvZG9jL3NyYy9zZ21sL2Z1bmMvZnVuYy1qc29uLnNnbWwgYi9k b2Mvc3JjL3NnbWwvZnVuYy9mdW5jLWpzb24uc2dtbAppbmRleCA0Y2QzMzhmZTZlMy4uZWRmNjdm YzY5NGUgMTAwNjQ0Ci0tLSBhL2RvYy9zcmMvc2dtbC9mdW5jL2Z1bmMtanNvbi5zZ21sCisrKyBi L2RvYy9zcmMvc2dtbC9mdW5jL2Z1bmMtanNvbi5zZ21sCkBAIC0zMjQ3LDYgKzMyNDcsNDAgQEAg RVJST1I6ICBqc29ucGF0aCBtZW1iZXIgYWNjZXNzb3IgY2FuIG9ubHkgYmUgYXBwbGllZCB0byBh biBvYmplY3QKICAgICAgICAgPHJldHVybnZhbHVlPltdPC9yZXR1cm52YWx1ZT4KICAgICAgICA8 L3BhcmE+PC9lbnRyeT4KICAgICAgIDwvcm93PgorICAgICAgPHJvdz4KKyAgICAgICA8ZW50cnkg cm9sZT0iZnVuY190YWJsZV9lbnRyeSI+PHBhcmEgcm9sZT0iZnVuY19zaWduYXR1cmUiPgorICAg ICAgICA8cmVwbGFjZWFibGU+anNvbl9zdHJpbmc8L3JlcGxhY2VhYmxlPiA8bGl0ZXJhbD50c21h dGNoPC9saXRlcmFsPiA8cmVwbGFjZWFibGU+cXVlcnk8L3JlcGxhY2VhYmxlPgorICAgICAgICA8 b3B0aW9uYWw+IDxsaXRlcmFsPnRzY29uZmlnPC9saXRlcmFsPiA8cmVwbGFjZWFibGU+Y29uZmln X25hbWU8L3JlcGxhY2VhYmxlPiA8L29wdGlvbmFsPgorICAgICAgICA8b3B0aW9uYWw+IDxsaXRl cmFsPnRzcXBhcnNlcjwvbGl0ZXJhbD4gPHJlcGxhY2VhYmxlPnBhcnNlcl9tb2RlPC9yZXBsYWNl YWJsZT4gPC9vcHRpb25hbD4KKyAgICAgICAgPHJldHVybnZhbHVlPmJvb2xlYW48L3JldHVybnZh bHVlPgorICAgICAgIDwvcGFyYT4KKyAgICAgICAgPHBhcmE+CisgICAgICAgICBUZXN0cyB3aGV0 aGVyIHRoZSBKU09OIHN0cmluZyAoZmlyc3Qgb3BlcmFuZCkgbWF0Y2hlcyB0aGUgZnVsbC10ZXh0 IHNlYXJjaCBxdWVyeQorICAgICAgICAgKHNlY29uZCBvcGVyYW5kKS4gVGhlIG1hdGNoaW5nIGJl aGF2aW9yIGNhbiBiZSBjdXN0b21pemVkIHVzaW5nIHRoZSBvcHRpb25hbAorICAgICAgICAgPGxp dGVyYWw+dHNjb25maWc8L2xpdGVyYWw+IGFuZCA8bGl0ZXJhbD50c3FwYXJzZXI8L2xpdGVyYWw+ IGNsYXVzZXMuCisgICAgICAgICBJZiA8bGl0ZXJhbD50c2NvbmZpZzwvbGl0ZXJhbD4gaXMgb21p dHRlZCwgdGhlIGN1cnJlbnQgc2Vzc2lvbidzIGRlZmF1bHQgdGV4dCBzZWFyY2ggY29uZmlndXJh dGlvbgorICAgICAgICAgaXMgdXNlZCAoc2VlIDx4cmVmIGxpbmtlbmQ9Imd1Yy1kZWZhdWx0LXRl eHQtc2VhcmNoLWNvbmZpZyIvPikuCisgICAgICAgICBUaGUgPGxpdGVyYWw+dHNxcGFyc2VyPC9s aXRlcmFsPiBjbGF1c2UgZGV0ZXJtaW5lcyBob3cgdGhlIHF1ZXJ5IHN0cmluZyBpcyBwYXJzZWQK KyAgICAgICAgIChzZWUgPHhyZWYgbGlua2VuZD0idGV4dHNlYXJjaC1wYXJzaW5nLXF1ZXJpZXMi Lz4pLgorICAgICAgICAgVmFsaWQgb3B0aW9ucyBhcmUgPGxpdGVyYWw+InBsIjwvbGl0ZXJhbD4g KDxmdW5jdGlvbj5wbGFpbnRvX3RzcXVlcnk8L2Z1bmN0aW9uPiksCisgICAgICAgICA8bGl0ZXJh bD4icGgiPC9saXRlcmFsPiAoPGZ1bmN0aW9uPnBocmFzZXRvX3RzcXVlcnk8L2Z1bmN0aW9uPiks IGFuZAorICAgICAgICAgPGxpdGVyYWw+InciPC9saXRlcmFsPiAoPGZ1bmN0aW9uPndlYnNlYXJj aF90b190c3F1ZXJ5PC9mdW5jdGlvbj4pLgorICAgICAgICAgSWYgPGxpdGVyYWw+dHNxcGFyc2Vy PC9saXRlcmFsPiBpcyBvbWl0dGVkLCB0aGUgcXVlcnkgaXMgcGFyc2VkIHVzaW5nIDxmdW5jdGlv bj50b190c3F1ZXJ5PC9mdW5jdGlvbj4uCisgICAgICAgIDwvcGFyYT4KKyAgICAgICAgPHBhcmE+ CisgICAgICAgICA8bGl0ZXJhbD5qc29uYl9wYXRoX3F1ZXJ5X2FycmF5KCdbInJ1bm5pbmciLCAi cnVucyIsICJyYW4iLCAiam9nZ2luZyJdJywgJyRbKl0gPyAoQCB0c21hdGNoICJydW4iIHRzY29u ZmlnICJlbmdsaXNoIiknKTwvbGl0ZXJhbD4KKyAgICAgICAgIDxyZXR1cm52YWx1ZT5bInJ1bm5p bmciLCAicnVucyJdPC9yZXR1cm52YWx1ZT4KKyAgICAgICAgPC9wYXJhPgorICAgICAgICA8cGFy YT4KKyAgICAgICAgIDxsaXRlcmFsPmpzb25iX3BhdGhfcXVlcnlfYXJyYXkoJ1siZmFzdCBjYXIi LCAic2xvdyBjYXIiLCAiZmFzdCBhbmQgZnVyaW91cyJdJywgJyRbKl0gPyAoQCB0c21hdGNoICJm YXN0ICZhbXA7IGNhciIpJyk8L2xpdGVyYWw+CisgICAgICAgICA8cmV0dXJudmFsdWU+WyJmYXN0 IGNhciJdPC9yZXR1cm52YWx1ZT4KKyAgICAgICAgPC9wYXJhPgorICAgICAgICA8cGFyYT4KKyAg ICAgICAgIDxsaXRlcmFsPmpzb25iX3BhdGhfcXVlcnlfYXJyYXkoJ1siZmFzdCBjYXIiLCAic2xv dyBjYXIiLCAiZmFzdCBhbmQgZnVyaW91cyJdJywgJyRbKl0gPyAoQCB0c21hdGNoICJmYXN0IGNh ciIgdHNxcGFyc2VyICJ3IiknKTwvbGl0ZXJhbD4KKyAgICAgICAgIDxyZXR1cm52YWx1ZT5bImZh c3QgY2FyIl08L3JldHVybnZhbHVlPgorICAgICAgICA8L3BhcmE+CisgICAgICAgPC9lbnRyeT4K KyAgICAgIDwvcm93PgogICAgICA8L3Rib2R5PgogICAgIDwvdGdyb3VwPgogICAgPC90YWJsZT4K ZGlmZiAtLWdpdCBhL3NyYy9iYWNrZW5kL3V0aWxzL2FkdC9qc29ucGF0aC5jIGIvc3JjL2JhY2tl bmQvdXRpbHMvYWR0L2pzb25wYXRoLmMKaW5kZXggN2JmYzE4Yzk4ODguLjVhYmI2ZjQzM2Y3IDEw MDY0NAotLS0gYS9zcmMvYmFja2VuZC91dGlscy9hZHQvanNvbnBhdGguYworKysgYi9zcmMvYmFj a2VuZC91dGlscy9hZHQvanNvbnBhdGguYwpAQCAtMzUxLDYgKzM1MSw1NSBAQCBmbGF0dGVuSnNv blBhdGhQYXJzZUl0ZW0oU3RyaW5nSW5mbyBidWYsIGludCAqcmVzdWx0LCBzdHJ1Y3QgTm9kZSAq ZXNjb250ZXh0LAogCQkJCSooaW50MzIgKikgKGJ1Zi0+ZGF0YSArIG9mZnMpID0gY2hsZCAtIHBv czsKIAkJCX0KIAkJCWJyZWFrOworCQljYXNlIGpwaVRzTWF0Y2g6CisJCQl7CisJCQkJaW50MzIJ CWV4cHJfb2ZmOworCQkJCWludDMyCQl0c2NvbmZpZ19vZmY7CisJCQkJdWludDMyCQl0c3FwYXJz ZXJfbGVuX3ZhbCA9IGl0ZW0tPnZhbHVlLnRzbWF0Y2gudHNxcGFyc2VyID8gaXRlbS0+dmFsdWUu dHNtYXRjaC50c3FwYXJzZXJfbGVuIDogMDsKKworCQkJCWV4cHJfb2ZmID0gcmVzZXJ2ZVNwYWNl Rm9ySXRlbVBvaW50ZXIoYnVmKTsKKwkJCQl0c2NvbmZpZ19vZmYgPSByZXNlcnZlU3BhY2VGb3JJ dGVtUG9pbnRlcihidWYpOworCisJCQkJLyoKKwkJCQkgKiBXcml0ZSBhbGwgaW50ZWdlcnMgRklS U1Qgc28gdGhleSBhcmUgbmF0dXJhbGx5IDQtYnl0ZQorCQkJCSAqIGFsaWduZWQKKwkJCQkgKi8K KwkJCQlhcHBlbmRCaW5hcnlTdHJpbmdJbmZvKGJ1ZiwgJml0ZW0tPnZhbHVlLnRzbWF0Y2gudHNx dWVyeV9sZW4sIHNpemVvZih1aW50MzIpKTsKKwkJCQlhcHBlbmRCaW5hcnlTdHJpbmdJbmZvKGJ1 ZiwgJnRzcXBhcnNlcl9sZW5fdmFsLCBzaXplb2YodWludDMyKSk7CisKKwkJCQkvKiBOb3cgYXBw ZW5kIHRoZSBzdHJpbmdzIGF0IHRoZSBlbmQgKi8KKwkJCQlhcHBlbmRCaW5hcnlTdHJpbmdJbmZv KGJ1ZiwgaXRlbS0+dmFsdWUudHNtYXRjaC50c3F1ZXJ5LCBpdGVtLT52YWx1ZS50c21hdGNoLnRz cXVlcnlfbGVuKTsKKwkJCQlhcHBlbmRTdHJpbmdJbmZvQ2hhcihidWYsICdcMCcpOworCisJCQkJ aWYgKGl0ZW0tPnZhbHVlLnRzbWF0Y2gudHNxcGFyc2VyKQorCQkJCXsKKwkJCQkJYXBwZW5kQmlu YXJ5U3RyaW5nSW5mbyhidWYsIGl0ZW0tPnZhbHVlLnRzbWF0Y2gudHNxcGFyc2VyLCB0c3FwYXJz ZXJfbGVuX3ZhbCk7CisJCQkJCWFwcGVuZFN0cmluZ0luZm9DaGFyKGJ1ZiwgJ1wwJyk7CisJCQkJ fQorCisJCQkJaWYgKCFmbGF0dGVuSnNvblBhdGhQYXJzZUl0ZW0oYnVmLCAmY2hsZCwgZXNjb250 ZXh0LAorCQkJCQkJCQkJCQkgIGl0ZW0tPnZhbHVlLnRzbWF0Y2guZG9jLAorCQkJCQkJCQkJCQkg IG5lc3RpbmdMZXZlbCwKKwkJCQkJCQkJCQkJICBpbnNpZGVBcnJheVN1YnNjcmlwdCkpCisJCQkJ CXJldHVybiBmYWxzZTsKKwkJCQkqKGludDMyICopIChidWYtPmRhdGEgKyBleHByX29mZikgPSBj aGxkIC0gcG9zOworCisJCQkJLyogVFNDb25maWcgKE9wdGlvbmFsKSAqLworCQkJCWlmIChpdGVt LT52YWx1ZS50c21hdGNoLnRzY29uZmlnKQorCQkJCXsKKwkJCQkJaWYgKCFmbGF0dGVuSnNvblBh dGhQYXJzZUl0ZW0oYnVmLCAmY2hsZCwgZXNjb250ZXh0LAorCQkJCQkJCQkJCQkJICBpdGVtLT52 YWx1ZS50c21hdGNoLnRzY29uZmlnLAorCQkJCQkJCQkJCQkJICBuZXN0aW5nTGV2ZWwsCisJCQkJ CQkJCQkJCQkgIGluc2lkZUFycmF5U3Vic2NyaXB0KSkKKwkJCQkJCXJldHVybiBmYWxzZTsKKwkJ CQkJKihpbnQzMiAqKSAoYnVmLT5kYXRhICsgdHNjb25maWdfb2ZmKSA9IGNobGQgLSBwb3M7CisJ CQkJfQorCQkJCWVsc2UKKwkJCQl7CisJCQkJCSooaW50MzIgKikgKGJ1Zi0+ZGF0YSArIHRzY29u ZmlnX29mZikgPSAwOworCQkJCX0KKwkJCX0KKwkJCWJyZWFrOwogCQljYXNlIGpwaUZpbHRlcjoK IAkJCWFyZ05lc3RpbmdMZXZlbCsrOwogCQkJcGdfZmFsbHRocm91Z2g7CkBAIC03NjcsNiArODE2 LDU4IEBAIHByaW50SnNvblBhdGhJdGVtKFN0cmluZ0luZm8gYnVmLCBKc29uUGF0aEl0ZW0gKnYs IGJvb2wgaW5LZXksCiAJCQkJYXBwZW5kU3RyaW5nSW5mb0NoYXIoYnVmLCAnIicpOwogCQkJfQog CisJCQlpZiAocHJpbnRCcmFja2V0ZXMpCisJCQkJYXBwZW5kU3RyaW5nSW5mb0NoYXIoYnVmLCAn KScpOworCQkJYnJlYWs7CisJCWNhc2UganBpVHNNYXRjaDoKKwkJCWlmIChwcmludEJyYWNrZXRl cykKKwkJCQlhcHBlbmRTdHJpbmdJbmZvQ2hhcihidWYsICcoJyk7CisKKwkJCWpzcEluaXRCeUJ1 ZmZlcigmZWxlbSwgdi0+YmFzZSwgdi0+Y29udGVudC50c21hdGNoLmRvYyk7CisJCQlwcmludEpz b25QYXRoSXRlbShidWYsICZlbGVtLCBmYWxzZSwKKwkJCQkJCQkgIG9wZXJhdGlvblByaW9yaXR5 KGVsZW0udHlwZSkgPD0KKwkJCQkJCQkgIG9wZXJhdGlvblByaW9yaXR5KHYtPnR5cGUpKTsKKwor CQkJYXBwZW5kU3RyaW5nSW5mb1N0cmluZyhidWYsICIgdHNtYXRjaCAiKTsKKworCQkJZXNjYXBl X2pzb25fd2l0aF9sZW4oYnVmLAorCQkJCQkJCQkgdi0+Y29udGVudC50c21hdGNoLnRzcXVlcnks CisJCQkJCQkJCSB2LT5jb250ZW50LnRzbWF0Y2gudHNxdWVyeV9sZW4pOworCisJCQkvKiBQcmlu dCBUU0NvbmZpZyBpZiBwcmVzZW50ICovCisJCQlpZiAodi0+Y29udGVudC50c21hdGNoLnRzY29u ZmlnKQorCQkJeworCQkJCUpzb25QYXRoSXRlbSBjb25maWdfaXRlbTsKKwkJCQlpbnQzMgkJY29u ZmlnX2xlbjsKKwkJCQljaGFyCSAgICpjb25maWdfc3RyOworCisJCQkJYXBwZW5kU3RyaW5nSW5m b1N0cmluZyhidWYsICIgdHNjb25maWcgIik7CisJCQkJanNwSW5pdEJ5QnVmZmVyKCZjb25maWdf aXRlbSwgdi0+YmFzZSwgdi0+Y29udGVudC50c21hdGNoLnRzY29uZmlnKTsKKwkJCQljb25maWdf c3RyID0ganNwR2V0U3RyaW5nKCZjb25maWdfaXRlbSwgJmNvbmZpZ19sZW4pOworCQkJCWFwcGVu ZFN0cmluZ0luZm9DaGFyKGJ1ZiwgJyInKTsKKwkJCQlhcHBlbmRCaW5hcnlTdHJpbmdJbmZvKGJ1 ZiwgY29uZmlnX3N0ciwgY29uZmlnX2xlbik7CisJCQkJYXBwZW5kU3RyaW5nSW5mb0NoYXIoYnVm LCAnIicpOworCQkJfQorCisJCQlpZiAodi0+Y29udGVudC50c21hdGNoLnRzcXBhcnNlcl9sZW4g PiAwKQorCQkJeworCQkJCWFwcGVuZFN0cmluZ0luZm9TdHJpbmcoYnVmLCAiIHRzcXBhcnNlciAi KTsKKwkJCQlhcHBlbmRTdHJpbmdJbmZvQ2hhcihidWYsICciJyk7CisKKwkJCQkvKgorCQkJCSAq IFVzZSBzaW1wbGUgYmluYXJ5IGFwcGVuZCBzaW5jZSBmbGFncyBsaWtlICJwbCIgZG9uJ3QgbmVl ZAorCQkJCSAqIEpTT04gZXNjYXBpbmcKKwkJCQkgKi8KKwkJCQlhcHBlbmRCaW5hcnlTdHJpbmdJ bmZvKGJ1ZiwKKwkJCQkJCQkJCSAgIHYtPmNvbnRlbnQudHNtYXRjaC50c3FwYXJzZXIsCisJCQkJ CQkJCQkgICB2LT5jb250ZW50LnRzbWF0Y2gudHNxcGFyc2VyX2xlbik7CisJCQkJYXBwZW5kU3Ry aW5nSW5mb0NoYXIoYnVmLCAnIicpOworCQkJfQorCisJCQlpZiAocHJpbnRCcmFja2V0ZXMpCisJ CQkJYXBwZW5kU3RyaW5nSW5mb0NoYXIoYnVmLCAnKScpOworCQkJYnJlYWs7CisKIAkJCWlmIChw cmludEJyYWNrZXRlcykKIAkJCQlhcHBlbmRTdHJpbmdJbmZvQ2hhcihidWYsICcpJyk7CiAJCQli cmVhazsKQEAgLTk3Niw2ICsxMDc3LDggQEAganNwT3BlcmF0aW9uTmFtZShKc29uUGF0aEl0ZW1U eXBlIHR5cGUpCiAJCQlyZXR1cm4gInRpbWVzdGFtcCI7CiAJCWNhc2UganBpVGltZXN0YW1wVHo6 CiAJCQlyZXR1cm4gInRpbWVzdGFtcF90eiI7CisJCWNhc2UganBpVHNNYXRjaDoKKwkJCXJldHVy biAidHNtYXRjaCI7CiAJCWNhc2UganBpU3RyUmVwbGFjZToKIAkJCXJldHVybiAicmVwbGFjZSI7 CiAJCWNhc2UganBpU3RyTG93ZXI6CkBAIC0xMTU4LDYgKzEyNjEsMjcgQEAganNwSW5pdEJ5QnVm ZmVyKEpzb25QYXRoSXRlbSAqdiwgY2hhciAqYmFzZSwgaW50MzIgcG9zKQogCQkJcmVhZF9pbnQz Mih2LT5jb250ZW50Lmxpa2VfcmVnZXgucGF0dGVybmxlbiwgYmFzZSwgcG9zKTsKIAkJCXYtPmNv bnRlbnQubGlrZV9yZWdleC5wYXR0ZXJuID0gYmFzZSArIHBvczsKIAkJCWJyZWFrOworCQljYXNl IGpwaVRzTWF0Y2g6CisJCQkvKiBGSVg6IFJlYWQgYWxsIGludGVnZXJzIGZpcnN0ICovCisJCQly ZWFkX2ludDMyKHYtPmNvbnRlbnQudHNtYXRjaC5kb2MsIGJhc2UsIHBvcyk7CisJCQlyZWFkX2lu dDMyKHYtPmNvbnRlbnQudHNtYXRjaC50c2NvbmZpZywgYmFzZSwgcG9zKTsKKwkJCXJlYWRfaW50 MzIodi0+Y29udGVudC50c21hdGNoLnRzcXVlcnlfbGVuLCBiYXNlLCBwb3MpOworCQkJcmVhZF9p bnQzMih2LT5jb250ZW50LnRzbWF0Y2gudHNxcGFyc2VyX2xlbiwgYmFzZSwgcG9zKTsKKworCQkJ LyogU2V0IHBvaW50ZXJzIHRvIHRoZSBzdHJpbmdzIGluIHRoZSBidWZmZXIgKi8KKwkJCXYtPmNv bnRlbnQudHNtYXRjaC50c3F1ZXJ5ID0gYmFzZSArIHBvczsKKwkJCXBvcyArPSB2LT5jb250ZW50 LnRzbWF0Y2gudHNxdWVyeV9sZW4gKyAxOworCisJCQlpZiAodi0+Y29udGVudC50c21hdGNoLnRz cXBhcnNlcl9sZW4gPiAwKQorCQkJeworCQkJCXYtPmNvbnRlbnQudHNtYXRjaC50c3FwYXJzZXIg PSBiYXNlICsgcG9zOworCQkJCXBvcyArPSB2LT5jb250ZW50LnRzbWF0Y2gudHNxcGFyc2VyX2xl biArIDE7CisJCQl9CisJCQllbHNlCisJCQl7CisJCQkJdi0+Y29udGVudC50c21hdGNoLnRzcXBh cnNlciA9IE5VTEw7CisJCQl9CisJCQlicmVhazsKIAkJZGVmYXVsdDoKIAkJCWVsb2coRVJST1Is ICJ1bnJlY29nbml6ZWQganNvbnBhdGggaXRlbSB0eXBlOiAlZCIsIHYtPnR5cGUpOwogCX0KQEAg LTEyMzEsNiArMTM1NSw3IEBAIGpzcEdldE5leHQoSnNvblBhdGhJdGVtICp2LCBKc29uUGF0aEl0 ZW0gKmEpCiAJCQkgICB2LT50eXBlID09IGpwaUxhc3QgfHwKIAkJCSAgIHYtPnR5cGUgPT0ganBp U3RhcnRzV2l0aCB8fAogCQkJICAgdi0+dHlwZSA9PSBqcGlMaWtlUmVnZXggfHwKKwkJCSAgIHYt PnR5cGUgPT0ganBpVHNNYXRjaCB8fAogCQkJICAgdi0+dHlwZSA9PSBqcGlCaWdpbnQgfHwKIAkJ CSAgIHYtPnR5cGUgPT0ganBpQm9vbGVhbiB8fAogCQkJICAgdi0+dHlwZSA9PSBqcGlEYXRlIHx8 CkBAIC0xNTc1LDcgKzE3MDAsMTEgQEAganNwSXNNdXRhYmxlV2Fsa2VyKEpzb25QYXRoSXRlbSAq anBpLCBzdHJ1Y3QgSnNvblBhdGhNdXRhYmxlQ29udGV4dCAqY3h0KQogCQkJCWpzcEluaXRCeUJ1 ZmZlcigmYXJnLCBqcGktPmJhc2UsIGpwaS0+Y29udGVudC5saWtlX3JlZ2V4LmV4cHIpOwogCQkJ CWpzcElzTXV0YWJsZVdhbGtlcigmYXJnLCBjeHQpOwogCQkJCWJyZWFrOwotCisJCQljYXNlIGpw aVRzTWF0Y2g6CisJCQkJQXNzZXJ0KHN0YXR1cyA9PSBqcGRzTm9uRGF0ZVRpbWUpOworCQkJCWpz cEluaXRCeUJ1ZmZlcigmYXJnLCBqcGktPmJhc2UsIGpwaS0+Y29udGVudC50c21hdGNoLmRvYyk7 CisJCQkJanNwSXNNdXRhYmxlV2Fsa2VyKCZhcmcsIGN4dCk7CisJCQkJYnJlYWs7CiAJCQkJLyog bGl0ZXJhbHMgKi8KIAkJCWNhc2UganBpTnVsbDoKIAkJCWNhc2UganBpU3RyaW5nOgpkaWZmIC0t Z2l0IGEvc3JjL2JhY2tlbmQvdXRpbHMvYWR0L2pzb25wYXRoX2V4ZWMuYyBiL3NyYy9iYWNrZW5k L3V0aWxzL2FkdC9qc29ucGF0aF9leGVjLmMKaW5kZXggNzcwODQwYTA2MTEuLmI5NWVlNjMwZjJh IDEwMDY0NAotLS0gYS9zcmMvYmFja2VuZC91dGlscy9hZHQvanNvbnBhdGhfZXhlYy5jCisrKyBi L3NyYy9iYWNrZW5kL3V0aWxzL2FkdC9qc29ucGF0aF9leGVjLmMKQEAgLTY1LDYgKzY1LDcgQEAK ICNpbmNsdWRlICJtaXNjYWRtaW4uaCIKICNpbmNsdWRlICJub2Rlcy9taXNjbm9kZXMuaCIKICNp bmNsdWRlICJub2Rlcy9ub2RlRnVuY3MuaCIKKyNpbmNsdWRlICJub2Rlcy9wZ19saXN0LmgiCiAj aW5jbHVkZSAicmVnZXgvcmVnZXguaCIKICNpbmNsdWRlICJ1dGlscy9idWlsdGlucy5oIgogI2lu Y2x1ZGUgInV0aWxzL2RhdGUuaCIKQEAgLTExNCw2ICsxMTUsNyBAQCB0eXBlZGVmIHN0cnVjdCBK c29uUGF0aEV4ZWNDb250ZXh0CiAJYm9vbAkJdGhyb3dFcnJvcnM7CS8qIHdpdGggImZhbHNlIiBh bGwgc3VwcHJlc3NpYmxlIGVycm9ycyBhcmUKIAkJCQkJCQkJICogc3VwcHJlc3NlZCAqLwogCWJv b2wJCXVzZVR6OworCUxpc3QJICAgKnRzbWF0Y2hfY2FjaGU7CS8qIFBlcnNpc3RzIGNvbXBpbGVk IEZUUyBxdWVyaWVzICovCiB9IEpzb25QYXRoRXhlY0NvbnRleHQ7CiAKIC8qIENvbnRleHQgZm9y IExJS0VfUkVHRVggZXhlY3V0aW9uLiAqLwpAQCAtMTIzLDYgKzEyNSwyMCBAQCB0eXBlZGVmIHN0 cnVjdCBKc29uTGlrZVJlZ2V4Q29udGV4dAogCWludAkJCWNmbGFnczsKIH0gSnNvbkxpa2VSZWdl eENvbnRleHQ7CiAKK3R5cGVkZWYgc3RydWN0IEpzb25Uc01hdGNoQ29udGV4dAoreworCURhdHVt CQlxdWVyeURhdHVtOwkJLyogQ2FjaGUgdGhlIGNvbXBpbGVkIGJpbmFyeSBUU1F1ZXJ5ICovCisJ T2lkCQkJdHNjb25maWdJZDsJCS8qIENhY2hlIHRoZSBkaWN0aW9uYXJ5IE9JRCAqLworCWJvb2wJ CWluaXRpYWxpemVkOwkvKiBGbGFnIHRvIHJ1biBzZXR1cCBvbmx5IG9uY2UgKi8KK30JCQlKc29u VHNNYXRjaENvbnRleHQ7CisKK3R5cGVkZWYgc3RydWN0IEpzb25Uc01hdGNoQ2FjaGVFbnRyeQor eworCXZvaWQJICAgKmpzcF9wdHI7CQkvKiBDYWNoZSBrZXk6IHBvaW50ZXIgdG8gdGhlIEFTVCBu b2RlICovCisJRGF0dW0JCXF1ZXJ5RGF0dW07CQkvKiBDYWNoZWQgY29tcGlsZWQgcXVlcnkgKi8K KwlPaWQJCQl0c2NvbmZpZ0lkOwkJLyogQ2FjaGVkIGRpY3Rpb25hcnkgT0lEICovCit9CQkJSnNv blRzTWF0Y2hDYWNoZUVudHJ5OworCiAvKiBSZXN1bHQgb2YganNvbnBhdGggcHJlZGljYXRlIGV2 YWx1YXRpb24gKi8KIHR5cGVkZWYgZW51bSBKc29uUGF0aEJvb2wKIHsKQEAgLTMzNSw2ICszNTEs NyBAQCBzdGF0aWMgSnNvblBhdGhFeGVjUmVzdWx0IGV4ZWN1dGVLZXlWYWx1ZU1ldGhvZChKc29u UGF0aEV4ZWNDb250ZXh0ICpjeHQsCiAJCQkJCQkJCQkJCQlKc29uUGF0aEl0ZW0gKmpzcCwgSnNv bmJWYWx1ZSAqamIsIEpzb25WYWx1ZUxpc3QgKmZvdW5kKTsKIHN0YXRpYyBKc29uUGF0aEV4ZWNS ZXN1bHQgYXBwZW5kQm9vbFJlc3VsdChKc29uUGF0aEV4ZWNDb250ZXh0ICpjeHQsCiAJCQkJCQkJ CQkJICAgSnNvblBhdGhJdGVtICpqc3AsIEpzb25WYWx1ZUxpc3QgKmZvdW5kLCBKc29uUGF0aEJv b2wgcmVzKTsKK3N0YXRpYyBKc29uUGF0aEJvb2wgZXhlY3V0ZVRzTWF0Y2goSnNvblBhdGhJdGVt ICpqc3AsIEpzb25iVmFsdWUgKnN0ciwgSnNvbmJWYWx1ZSAqcmFyZywgdm9pZCAqcGFyYW0pOwog c3RhdGljIHZvaWQgZ2V0SnNvblBhdGhJdGVtKEpzb25QYXRoRXhlY0NvbnRleHQgKmN4dCwgSnNv blBhdGhJdGVtICppdGVtLAogCQkJCQkJCUpzb25iVmFsdWUgKnZhbHVlKTsKIHN0YXRpYyBKc29u YlZhbHVlICpHZXRKc29uUGF0aFZhcih2b2lkICpjeHQsIGNoYXIgKnZhck5hbWUsIGludCB2YXJO YW1lTGVuLApAQCAtNzQwLDYgKzc1Nyw3IEBAIGV4ZWN1dGVKc29uUGF0aChKc29uUGF0aCAqcGF0 aCwgdm9pZCAqdmFycywgSnNvblBhdGhHZXRWYXJDYWxsYmFjayBnZXRWYXIsCiAJY3h0LmlubmVy bW9zdEFycmF5U2l6ZSA9IC0xOwogCWN4dC50aHJvd0Vycm9ycyA9IHRocm93RXJyb3JzOwogCWN4 dC51c2VUeiA9IHVzZVR6OworCWN4dC50c21hdGNoX2NhY2hlID0gTklMOwogCiAJaWYgKGpzcFN0 cmljdEFic2VuY2VPZkVycm9ycygmY3h0KSAmJiAhcmVzdWx0KQogCXsKQEAgLTg0MCw2ICs4NTgs NyBAQCBleGVjdXRlSXRlbU9wdFVud3JhcFRhcmdldChKc29uUGF0aEV4ZWNDb250ZXh0ICpjeHQs IEpzb25QYXRoSXRlbSAqanNwLAogCQljYXNlIGpwaUV4aXN0czoKIAkJY2FzZSBqcGlTdGFydHNX aXRoOgogCQljYXNlIGpwaUxpa2VSZWdleDoKKwkJY2FzZSBqcGlUc01hdGNoOgogCQkJewogCQkJ CUpzb25QYXRoQm9vbCBzdCA9IGV4ZWN1dGVCb29sSXRlbShjeHQsIGpzcCwgamIsIHRydWUpOwog CkBAIC0xOTE0LDYgKzE5MzMsMTggQEAgZXhlY3V0ZUJvb2xJdGVtKEpzb25QYXRoRXhlY0NvbnRl eHQgKmN4dCwgSnNvblBhdGhJdGVtICpqc3AsCiAJCQkJcmV0dXJuIGV4ZWN1dGVQcmVkaWNhdGUo Y3h0LCBqc3AsICZsYXJnLCBOVUxMLCBqYiwgZmFsc2UsCiAJCQkJCQkJCQkJZXhlY3V0ZUxpa2VS ZWdleCwgJmxyY3h0KTsKIAkJCX0KKwkJY2FzZSBqcGlUc01hdGNoOgorCQkJeworCQkJCWpzcElu aXRCeUJ1ZmZlcigmbGFyZywganNwLT5iYXNlLAorCQkJCQkJCQlqc3AtPmNvbnRlbnQudHNtYXRj aC5kb2MpOworCisJCQkJLyoKKwkJCQkgKiBQYXNzICdjeHQnIGFzIHRoZSBwYXJhbSBzbyBleGVj dXRlVHNNYXRjaCBjYW4gYWNjZXNzIHRoZQorCQkJCSAqIGNhY2hlIGxpc3QKKwkJCQkgKi8KKwkJ CQlyZXR1cm4gZXhlY3V0ZVByZWRpY2F0ZShjeHQsIGpzcCwgJmxhcmcsIE5VTEwsIGpiLCBmYWxz ZSwKKwkJCQkJCQkJCQlleGVjdXRlVHNNYXRjaCwgY3h0KTsKKwkJCX0KIAogCQljYXNlIGpwaUV4 aXN0czoKIAkJCWpzcEdldEFyZyhqc3AsICZsYXJnKTsKQEAgLTE5NTIsNyArMTk4Myw2IEBAIGV4 ZWN1dGVCb29sSXRlbShKc29uUGF0aEV4ZWNDb250ZXh0ICpjeHQsIEpzb25QYXRoSXRlbSAqanNw LAogCiAJCQkJcmV0dXJuIHJlcyA9PSBqcGVyT2sgPyBqcGJUcnVlIDoganBiRmFsc2U7CiAJCQl9 Ci0KIAkJZGVmYXVsdDoKIAkJCWVsb2coRVJST1IsICJpbnZhbGlkIGJvb2xlYW4ganNvbnBhdGgg aXRlbSB0eXBlOiAlZCIsIGpzcC0+dHlwZSk7CiAJCQlyZXR1cm4ganBiVW5rbm93bjsKQEAgLTMx ODUsNiArMzIxNSwxMjcgQEAgZXhlY3V0ZUtleVZhbHVlTWV0aG9kKEpzb25QYXRoRXhlY0NvbnRl eHQgKmN4dCwgSnNvblBhdGhJdGVtICpqc3AsCiAKIAlyZXR1cm4gcmVzOwogfQorI2luY2x1ZGUg InRzZWFyY2gvdHNfdXRpbHMuaCIKKyNpbmNsdWRlICJ0c2VhcmNoL3RzX2NhY2hlLmgiCisjaW5j bHVkZSAidXRpbHMvcmVncHJvYy5oIgorI2luY2x1ZGUgImNhdGFsb2cvbmFtZXNwYWNlLmgiCisK K3N0YXRpYyBKc29uUGF0aEJvb2wKK2V4ZWN1dGVUc01hdGNoKEpzb25QYXRoSXRlbSAqanNwLCBK c29uYlZhbHVlICpzdHIsIEpzb25iVmFsdWUgKnJhcmcsCisJCQkgICB2b2lkICpwYXJhbSkKK3sK KwlKc29uUGF0aEV4ZWNDb250ZXh0ICpjeHQgPSAoSnNvblBhdGhFeGVjQ29udGV4dCAqKSBwYXJh bTsKKwlKc29uVHNNYXRjaENhY2hlRW50cnkgKmNhY2hlID0gTlVMTDsKKwlMaXN0Q2VsbCAgICps YzsKKwl0ZXh0CSAgICpkb2NfdGV4dDsKKwlEYXR1bQkJdHN2ZWN0b3JfZGF0dW07CisJYm9vbAkJ bWF0Y2g7CisKKwlpZiAoIShzdHIgPSBnZXRTY2FsYXIoc3RyLCBqYnZTdHJpbmcpKSkKKwkJcmV0 dXJuIGpwYlVua25vd247CisKKwkvKiBDaGVjayBpZiB3ZSBhbHJlYWR5IGNvbXBpbGVkIHRoZSBx dWVyeSBmb3IgdGhpcyBzcGVjaWZpYyBBU1Qgbm9kZSAqLworCWZvcmVhY2gobGMsIGN4dC0+dHNt YXRjaF9jYWNoZSkKKwl7CisJCUpzb25Uc01hdGNoQ2FjaGVFbnRyeSAqZW50cnkgPSAoSnNvblRz TWF0Y2hDYWNoZUVudHJ5ICopIGxmaXJzdChsYyk7CisKKwkJaWYgKGVudHJ5LT5qc3BfcHRyID09 ICh2b2lkICopIGpzcCkKKwkJeworCQkJY2FjaGUgPSBlbnRyeTsKKwkJCWJyZWFrOworCQl9CisJ fQorCisJLyogSWYgbm90IGZvdW5kLCBwYXJzZSwgY29tcGlsZSwgYW5kIGNhY2hlIGl0ICovCisJ aWYgKGNhY2hlID09IE5VTEwpCisJeworCQl0ZXh0CSAgICpxdWVyeV90ZXh0OworCQljaGFyCSAg ICpwYXJzZXJfbW9kZTsKKwkJdWludDMyCQlwYXJzZXJfbGVuOworCisJCS8qIEFsbG9jYXRlIG5l dyBjYWNoZSBlbnRyeSBpbiB0aGUgZXhlY3V0aW9uIG1lbW9yeSBjb250ZXh0ICovCisJCWNhY2hl ID0gcGFsbG9jMChzaXplb2YoSnNvblRzTWF0Y2hDYWNoZUVudHJ5KSk7CisJCWNhY2hlLT5qc3Bf cHRyID0gKHZvaWQgKikganNwOworCisJCWlmIChqc3AtPmNvbnRlbnQudHNtYXRjaC50c2NvbmZp ZyAhPSAwKQorCQl7CisJCQlKc29uUGF0aEl0ZW0gY29uZmlnX2l0ZW07CisJCQlpbnQzMgkJY29u ZmlnX2xlbjsKKwkJCWNoYXIJICAgKmNvbmZpZ19zdHI7CisJCQljaGFyCSAgICpzYWZlX2NvbmZp Z19zdHI7CisKKwkJCWpzcEluaXRCeUJ1ZmZlcigmY29uZmlnX2l0ZW0sIGpzcC0+YmFzZSwganNw LT5jb250ZW50LnRzbWF0Y2gudHNjb25maWcpOworCQkJY29uZmlnX3N0ciA9IGpzcEdldFN0cmlu ZygmY29uZmlnX2l0ZW0sICZjb25maWdfbGVuKTsKKworCQkJLyogTnVsbC10ZXJtaW5hdGUgZm9y IHNhZmUgY2F0YWxvZyBsb29rdXAgKi8KKwkJCXNhZmVfY29uZmlnX3N0ciA9IHBuc3RyZHVwKGNv bmZpZ19zdHIsIGNvbmZpZ19sZW4pOworCQkJY2FjaGUtPnRzY29uZmlnSWQgPSBnZXRfdHNfY29u ZmlnX29pZChzdHJpbmdUb1F1YWxpZmllZE5hbWVMaXN0KHNhZmVfY29uZmlnX3N0ciwgTlVMTCks IHRydWUpOworCQkJcGZyZWUoc2FmZV9jb25maWdfc3RyKTsKKwkJfQorCQllbHNlCisJCXsKKwkJ CWNhY2hlLT50c2NvbmZpZ0lkID0gZ2V0VFNDdXJyZW50Q29uZmlnKHRydWUpOworCQl9CisKKwkJ LyogUHJlcGFyZSBRdWVyeSBUZXh0ICovCisJCXF1ZXJ5X3RleHQgPSBjc3RyaW5nX3RvX3RleHRf d2l0aF9sZW4oanNwLT5jb250ZW50LnRzbWF0Y2gudHNxdWVyeSwKKwkJCQkJCQkJCQkJICBqc3At PmNvbnRlbnQudHNtYXRjaC50c3F1ZXJ5X2xlbik7CisKKwkJLyogU2VsZWN0IFBhcnNlciBhbmQg Q29tcGlsZSBRdWVyeSAqLworCQlwYXJzZXJfbW9kZSA9IGpzcC0+Y29udGVudC50c21hdGNoLnRz cXBhcnNlcjsKKwkJcGFyc2VyX2xlbiA9IGpzcC0+Y29udGVudC50c21hdGNoLnRzcXBhcnNlcl9s ZW47CisKKwkJaWYgKHBhcnNlcl9sZW4gPiAwKQorCQl7CisJCQlpZiAocGdfc3RybmNhc2VjbXAo cGFyc2VyX21vZGUsICJwbCIsIHBhcnNlcl9sZW4pID09IDApCisJCQl7CisJCQkJY2FjaGUtPnF1 ZXJ5RGF0dW0gPSBEaXJlY3RGdW5jdGlvbkNhbGwyKHBsYWludG9fdHNxdWVyeV9ieWlkLAorCQkJ CQkJCQkJCQkJCQlPYmplY3RJZEdldERhdHVtKGNhY2hlLT50c2NvbmZpZ0lkKSwKKwkJCQkJCQkJ CQkJCQkJUG9pbnRlckdldERhdHVtKHF1ZXJ5X3RleHQpKTsKKwkJCX0KKwkJCWVsc2UgaWYgKHBn X3N0cm5jYXNlY21wKHBhcnNlcl9tb2RlLCAicGgiLCBwYXJzZXJfbGVuKSA9PSAwKQorCQkJewor CQkJCWNhY2hlLT5xdWVyeURhdHVtID0gRGlyZWN0RnVuY3Rpb25DYWxsMihwaHJhc2V0b190c3F1 ZXJ5X2J5aWQsCisJCQkJCQkJCQkJCQkJCU9iamVjdElkR2V0RGF0dW0oY2FjaGUtPnRzY29uZmln SWQpLAorCQkJCQkJCQkJCQkJCQlQb2ludGVyR2V0RGF0dW0ocXVlcnlfdGV4dCkpOworCQkJfQor CQkJZWxzZSBpZiAocGdfc3RybmNhc2VjbXAocGFyc2VyX21vZGUsICJ3IiwgcGFyc2VyX2xlbikg PT0gMCkKKwkJCXsKKwkJCQljYWNoZS0+cXVlcnlEYXR1bSA9IERpcmVjdEZ1bmN0aW9uQ2FsbDIo d2Vic2VhcmNoX3RvX3RzcXVlcnlfYnlpZCwKKwkJCQkJCQkJCQkJCQkJT2JqZWN0SWRHZXREYXR1 bShjYWNoZS0+dHNjb25maWdJZCksCisJCQkJCQkJCQkJCQkJCVBvaW50ZXJHZXREYXR1bShxdWVy eV90ZXh0KSk7CisJCQl9CisJCQllbHNlCisJCQl7CisJCQkJcGdfdW5yZWFjaGFibGUoKTsKKwkJ CX0KKwkJfQorCQllbHNlCisJCXsKKwkJCWNhY2hlLT5xdWVyeURhdHVtID0gRGlyZWN0RnVuY3Rp b25DYWxsMih0b190c3F1ZXJ5X2J5aWQsCisJCQkJCQkJCQkJCQkJT2JqZWN0SWRHZXREYXR1bShj YWNoZS0+dHNjb25maWdJZCksCisJCQkJCQkJCQkJCQkJUG9pbnRlckdldERhdHVtKHF1ZXJ5X3Rl eHQpKTsKKwkJfQorCisJCS8qIEFwcGVuZCB0aGUgbmV3bHkgY29tcGlsZWQgY2FjaGUgZW50cnkg dG8gdGhlIGNvbnRleHQncyBsaXN0ICovCisJCWN4dC0+dHNtYXRjaF9jYWNoZSA9IGxhcHBlbmQo Y3h0LT50c21hdGNoX2NhY2hlLCBjYWNoZSk7CisJfQorCisJLyogUnVudGltZSBFeGVjdXRpb24g KFVzaW5nIHRoZSBjYWNoZWQgcXVlcnkpICovCisJZG9jX3RleHQgPSBjc3RyaW5nX3RvX3RleHRf d2l0aF9sZW4oc3RyLT52YWwuc3RyaW5nLnZhbCwKKwkJCQkJCQkJCQlzdHItPnZhbC5zdHJpbmcu bGVuKTsKKworCXRzdmVjdG9yX2RhdHVtID0gRGlyZWN0RnVuY3Rpb25DYWxsMih0b190c3ZlY3Rv cl9ieWlkLAorCQkJCQkJCQkJCSBPYmplY3RJZEdldERhdHVtKGNhY2hlLT50c2NvbmZpZ0lkKSwK KwkJCQkJCQkJCQkgUG9pbnRlckdldERhdHVtKGRvY190ZXh0KSk7CisKKwltYXRjaCA9IERhdHVt R2V0Qm9vbChEaXJlY3RGdW5jdGlvbkNhbGwyKHRzX21hdGNoX3ZxLAorCQkJCQkJCQkJCQkgdHN2 ZWN0b3JfZGF0dW0sCisJCQkJCQkJCQkJCSBjYWNoZS0+cXVlcnlEYXR1bSkpOworCisJcmV0dXJu IG1hdGNoID8ganBiVHJ1ZSA6IGpwYkZhbHNlOworfQorCiAKIC8qCiAgKiBDb252ZXJ0IGJvb2xl YW4gZXhlY3V0aW9uIHN0YXR1cyAncmVzJyB0byBhIGJvb2xlYW4gSlNPTiBpdGVtIGFuZCBleGVj dXRlCmRpZmYgLS1naXQgYS9zcmMvYmFja2VuZC91dGlscy9hZHQvanNvbnBhdGhfZ3JhbS55IGIv c3JjL2JhY2tlbmQvdXRpbHMvYWR0L2pzb25wYXRoX2dyYW0ueQppbmRleCBmODI2Njk3ZDA5OC4u MDBlZDcyYjFkODQgMTAwNjQ0Ci0tLSBhL3NyYy9iYWNrZW5kL3V0aWxzL2FkdC9qc29ucGF0aF9n cmFtLnkKKysrIGIvc3JjL2JhY2tlbmQvdXRpbHMvYWR0L2pzb25wYXRoX2dyYW0ueQpAQCAtNDMs NyArNDMsMTIgQEAgc3RhdGljIGJvb2wgbWFrZUl0ZW1MaWtlUmVnZXgoSnNvblBhdGhQYXJzZUl0 ZW0gKmV4cHIsCiAJCQkJCQkJICBKc29uUGF0aFN0cmluZyAqZmxhZ3MsCiAJCQkJCQkJICBKc29u UGF0aFBhcnNlSXRlbSAqKiByZXN1bHQsCiAJCQkJCQkJICBzdHJ1Y3QgTm9kZSAqZXNjb250ZXh0 KTsKLQorc3RhdGljIGJvb2wgbWFrZUl0ZW1Uc01hdGNoKEpzb25QYXRoUGFyc2VJdGVtICpkb2Ms CisJCQkJCQkJICBKc29uUGF0aFN0cmluZyAqdHNxdWVyeSwKKwkJCQkJCQkgIEpzb25QYXRoU3Ry aW5nICp0c2NvbmZpZywKKwkJCQkJCQkgIEpzb25QYXRoU3RyaW5nICp0c3F1ZXJ5X3BhcnNlciwK KwkJCQkJCQkgIEpzb25QYXRoUGFyc2VJdGVtICoqIHJlc3VsdCwKKwkJCQkJCQkgIHN0cnVjdCBO b2RlICplc2NvbnRleHQpOwogLyoKICAqIEJpc29uIGRvZXNuJ3QgYWxsb2NhdGUgYW55dGhpbmcg dGhhdCBuZWVkcyB0byBsaXZlIGFjcm9zcyBwYXJzZXIgY2FsbHMsCiAgKiBzbyB3ZSBjYW4gZWFz aWx5IGhhdmUgaXQgdXNlIHBhbGxvYyBpbnN0ZWFkIG9mIG1hbGxvYy4gIFRoaXMgcHJldmVudHMK QEAgLTczLDYgKzc4LDEzIEBAIHN0YXRpYyBib29sIG1ha2VJdGVtTGlrZVJlZ2V4KEpzb25QYXRo UGFyc2VJdGVtICpleHByLAogCUpzb25QYXRoUGFyc2VJdGVtICAqdmFsdWU7CiAJSnNvblBhdGhQ YXJzZVJlc3VsdCAqcmVzdWx0OwogCUpzb25QYXRoSXRlbVR5cGUJb3B0eXBlOworCXN0cnVjdAor CXsKKwkJYm9vbCAgICAgICAgICAgIGhhc190c2NvbmZpZzsKKwkJSnNvblBhdGhTdHJpbmcgIHRz Y29uZmlnOworCQlib29sICAgICAgICAgICAgaGFzX3RzcXBhcnNlcjsKKwkJSnNvblBhdGhTdHJp bmcgIHRzcXBhcnNlcjsKKwl9ICAgICAgICAgICAgICAgdHNtYXRjaF9vcHRzOwogCWJvb2wJCQkJ Ym9vbGVhbjsKIAlpbnQJCQkJCWludGVnZXI7CiB9CkBAIC04MSw3ICs5Myw3IEBAIHN0YXRpYyBi b29sIG1ha2VJdGVtTGlrZVJlZ2V4KEpzb25QYXRoUGFyc2VJdGVtICpleHByLAogJXRva2VuCTxz dHI+CQlJREVOVF9QIFNUUklOR19QIE5VTUVSSUNfUCBJTlRfUCBWQVJJQUJMRV9QCiAldG9rZW4J PHN0cj4JCU9SX1AgQU5EX1AgTk9UX1AKICV0b2tlbgk8c3RyPgkJTEVTU19QIExFU1NFUVVBTF9Q IEVRVUFMX1AgTk9URVFVQUxfUCBHUkVBVEVSRVFVQUxfUCBHUkVBVEVSX1AKLSV0b2tlbgk8c3Ry PgkJQU5ZX1AgU1RSSUNUX1AgTEFYX1AgTEFTVF9QIFNUQVJUU19QIFdJVEhfUCBMSUtFX1JFR0VY X1AgRkxBR19QCisldG9rZW4JPHN0cj4JCUFOWV9QIFNUUklDVF9QIExBWF9QIExBU1RfUCBTVEFS VFNfUCBXSVRIX1AgTElLRV9SRUdFWF9QIEZMQUdfUCBUU01BVENIX1AgVFNDT05GSUdfUCBUU1FV RVJZUEFSU0VSX1AKICV0b2tlbgk8c3RyPgkJQUJTX1AgU0laRV9QIFRZUEVfUCBGTE9PUl9QIERP VUJMRV9QIENFSUxJTkdfUCBLRVlWQUxVRV9QCiAldG9rZW4JPHN0cj4JCURBVEVUSU1FX1AKICV0 b2tlbgk8c3RyPgkJQklHSU5UX1AgQk9PTEVBTl9QIERBVEVfUCBERUNJTUFMX1AgSU5URUdFUl9Q IE5VTUJFUl9QCkBAIC0xMDksNiArMTIxLDggQEAgc3RhdGljIGJvb2wgbWFrZUl0ZW1MaWtlUmVn ZXgoSnNvblBhdGhQYXJzZUl0ZW0gKmV4cHIsCiAKICV0eXBlCTxpbnRlZ2VyPglhbnlfbGV2ZWwK IAorJXR5cGUgIDx0c21hdGNoX29wdHM+ICB0c21hdGNoX29wdHMKKwogJWxlZnQJT1JfUAogJWxl ZnQJQU5EX1AKICVyaWdodAlOT1RfUApAQCAtMTg5LDcgKzIwMyw0NCBAQCBwcmVkaWNhdGU6CiAJ CQlZWUFCT1JUOwogCQkkJCA9IGpwcGl0ZW07CiAJfQorCXwgZXhwciBUU01BVENIX1AgU1RSSU5H X1AgdHNtYXRjaF9vcHRzCisJICAgeworCQkgIEpzb25QYXRoUGFyc2VJdGVtICpqcHBpdGVtOwor CisJCSAgbWFrZUl0ZW1Uc01hdGNoKCQxLCAmJDMsCisJCQkJCQkgICQ0Lmhhc190c2NvbmZpZyA/ ICYkNC50c2NvbmZpZyA6IE5VTEwsCisJCQkJCQkgICQ0Lmhhc190c3FwYXJzZXIgPyAmJDQudHNx cGFyc2VyIDogTlVMTCwKKwkJCQkJCSAgJmpwcGl0ZW0sIGVzY29udGV4dCk7CisKKwkJICAkJCA9 IGpwcGl0ZW07CisJICAgfQogCTsKKwl0c21hdGNoX29wdHM6CisJCS8qIEVNUFRZICovCisJCXsK KwkJCSQkLmhhc190c2NvbmZpZyA9IGZhbHNlOworCQkJJCQuaGFzX3RzcXBhcnNlciA9IGZhbHNl OworCQl9CisJCXwgVFNDT05GSUdfUCBTVFJJTkdfUAorCQl7CisJCQkkJC5oYXNfdHNjb25maWcg PSB0cnVlOworCQkJJCQudHNjb25maWcgPSAkMjsKKwkJCSQkLmhhc190c3FwYXJzZXIgPSBmYWxz ZTsKKwkJfQorCQl8IFRTUVVFUllQQVJTRVJfUCBTVFJJTkdfUAorCQl7CisJCQkkJC5oYXNfdHNj b25maWcgPSBmYWxzZTsKKwkJCSQkLmhhc190c3FwYXJzZXIgPSB0cnVlOworCQkJJCQudHNxcGFy c2VyID0gJDI7CisJCX0KKwkJfCBUU0NPTkZJR19QIFNUUklOR19QIFRTUVVFUllQQVJTRVJfUCBT VFJJTkdfUAorCQl7CisJCQkkJC5oYXNfdHNjb25maWcgPSB0cnVlOworCQkJJCQudHNjb25maWcg PSAkMjsKKwkJCSQkLmhhc190c3FwYXJzZXIgPSB0cnVlOworCQkJJCQudHNxcGFyc2VyID0gJDQ7 CisJCX0KKwkJOwogCiBzdGFydHNfd2l0aF9pbml0aWFsOgogCVNUUklOR19QCQkJCQkJeyAkJCA9 IG1ha2VJdGVtU3RyaW5nKCYkMSk7IH0KQEAgLTM3Nyw2ICs0MjgsOSBAQCBrZXlfbmFtZToKIAl8 IFRJTUVfVFpfUAogCXwgVElNRVNUQU1QX1AKIAl8IFRJTUVTVEFNUF9UWl9QCisJfCBUU0NPTkZJ R19QCisJfCBUU01BVENIX1AKKwl8IFRTUVVFUllQQVJTRVJfUAogCXwgU1RSX0xPV0VSX1AKIAl8 IFNUUl9VUFBFUl9QCiAJfCBTVFJfSU5JVENBUF9QCkBAIC03MTUsMyArNzY5LDYwIEBAIGpzcENv bnZlcnRSZWdleEZsYWdzKHVpbnQzMiB4ZmxhZ3MsIGludCAqcmVzdWx0LCBzdHJ1Y3QgTm9kZSAq ZXNjb250ZXh0KQogCiAJcmV0dXJuIHRydWU7CiB9CisKK3N0YXRpYyBib29sCittYWtlSXRlbVRz TWF0Y2goSnNvblBhdGhQYXJzZUl0ZW0gKmRvYywKKwkJCSBKc29uUGF0aFN0cmluZyAqdHNxdWVy eSwKKwkJCSBKc29uUGF0aFN0cmluZyAqdHNjb25maWcsCisJCQkgSnNvblBhdGhTdHJpbmcgKnRz cXVlcnlfcGFyc2VyLAorCQkJIEpzb25QYXRoUGFyc2VJdGVtICoqcmVzdWx0LAorCQkJIHN0cnVj dCBOb2RlICplc2NvbnRleHQpCit7CisJSnNvblBhdGhQYXJzZUl0ZW0gKnYgPSBtYWtlSXRlbVR5 cGUoanBpVHNNYXRjaCk7CisKKwl2LT52YWx1ZS50c21hdGNoLmRvYyA9IGRvYzsKKworCXYtPnZh bHVlLnRzbWF0Y2gudHNxdWVyeSA9IHRzcXVlcnktPnZhbDsKKwl2LT52YWx1ZS50c21hdGNoLnRz cXVlcnlfbGVuID0gdHNxdWVyeS0+bGVuOworCisJLyogSGFuZGxlIHRoZSBDb25maWd1cmF0aW9u IChTdG9yZWQgYXMgYSBOb2RlKSAqLworCWlmICh0c2NvbmZpZykKKwl7CisJICAgSnNvblBhdGhQ YXJzZUl0ZW0gKmNvbmYgPSBtYWtlSXRlbVR5cGUoanBpU3RyaW5nKTsKKwkgICBjb25mLT52YWx1 ZS5zdHJpbmcudmFsID0gdHNjb25maWctPnZhbDsKKwkgICBjb25mLT52YWx1ZS5zdHJpbmcubGVu ID0gdHNjb25maWctPmxlbjsKKwkgICB2LT52YWx1ZS50c21hdGNoLnRzY29uZmlnID0gY29uZjsK Kwl9CisJZWxzZQorCXsKKwkgICB2LT52YWx1ZS50c21hdGNoLnRzY29uZmlnID0gTlVMTDsKKwl9 CisKKwkvKiBIYW5kbGUgdGhlIFRTUXVlcnkgUGFyc2VyIEZsYWcgKi8KKwlpZiAodHNxdWVyeV9w YXJzZXIpCisJeworCQkvKiBDaGVjayBmb3IgInBsIiwgInBoIiwgInciIGhlcmUgdG8gdGhyb3cg YSBzeW50YXggZXJyb3IgaW1tZWRpYXRlbHkgKi8KKwkJaWYgKHBnX3N0cm5jYXNlY21wKHRzcXVl cnlfcGFyc2VyLT52YWwsICJwbCIsIHRzcXVlcnlfcGFyc2VyLT5sZW4pICE9IDAgJiYKKwkJCXBn X3N0cm5jYXNlY21wKHRzcXVlcnlfcGFyc2VyLT52YWwsICJwaCIsIHRzcXVlcnlfcGFyc2VyLT5s ZW4pICE9IDAgJiYKKwkJCXBnX3N0cm5jYXNlY21wKHRzcXVlcnlfcGFyc2VyLT52YWwsICJ3Iiwg IHRzcXVlcnlfcGFyc2VyLT5sZW4pICE9IDApCisJCXsKKwkJCSBlcmVwb3J0KEVSUk9SLAorCQkJ CQkgKGVycmNvZGUoRVJSQ09ERV9TWU5UQVhfRVJST1IpLAorCQkJCQkgIGVycm1zZygiaW52YWxp ZCB0c3F1ZXJ5X3BhcnNlciB2YWx1ZTogXCIlLipzXCIiLAorCQkJCQkJCShpbnQpIHRzcXVlcnlf cGFyc2VyLT5sZW4sIHRzcXVlcnlfcGFyc2VyLT52YWwpLAorCQkJCQkgIGVycmhpbnQoIlZhbGlk IHZhbHVlcyBhcmUgXCJwbFwiLCBcInBoXCIsIGFuZCBcIndcIi4iKSkpOworCQl9CisKKwkJdi0+ dmFsdWUudHNtYXRjaC50c3FwYXJzZXIgPSB0c3F1ZXJ5X3BhcnNlci0+dmFsOworCQl2LT52YWx1 ZS50c21hdGNoLnRzcXBhcnNlcl9sZW4gPSB0c3F1ZXJ5X3BhcnNlci0+bGVuOworCX0KKwllbHNl CisJeworCQl2LT52YWx1ZS50c21hdGNoLnRzcXBhcnNlciA9IE5VTEw7CisJCXYtPnZhbHVlLnRz bWF0Y2gudHNxcGFyc2VyX2xlbiA9IDA7CisJfQorCisJLyogU3VjY2VzcyAqLworCSpyZXN1bHQg PSB2OworCXJldHVybiB0cnVlOworfQpkaWZmIC0tZ2l0IGEvc3JjL2JhY2tlbmQvdXRpbHMvYWR0 L2pzb25wYXRoX3NjYW4ubCBiL3NyYy9iYWNrZW5kL3V0aWxzL2FkdC9qc29ucGF0aF9zY2FuLmwK aW5kZXggZTRmYWRjYzJlNjkuLjkyYjNlOWJlOTI2IDEwMDY0NAotLS0gYS9zcmMvYmFja2VuZC91 dGlscy9hZHQvanNvbnBhdGhfc2Nhbi5sCisrKyBiL3NyYy9iYWNrZW5kL3V0aWxzL2FkdC9qc29u cGF0aF9zY2FuLmwKQEAgLTQzNCwxMCArNDM0LDEzIEBAIHN0YXRpYyBjb25zdCBKc29uUGF0aEtl eXdvcmQga2V5d29yZHNbXSA9IHsKIAl7NywgZmFsc2UsIElOVEVHRVJfUCwgImludGVnZXIifSwK IAl7NywgZmFsc2UsIFNUUl9SRVBMQUNFX1AsICJyZXBsYWNlIn0sCiAJezcsIGZhbHNlLCBUSU1F X1RaX1AsICJ0aW1lX3R6In0sCisJezcsIGZhbHNlLCBUU01BVENIX1AsICJ0c21hdGNoIn0sCiAJ ezcsIGZhbHNlLCBVTktOT1dOX1AsICJ1bmtub3duIn0sCiAJezgsIGZhbHNlLCBEQVRFVElNRV9Q LCAiZGF0ZXRpbWUifSwKIAl7OCwgZmFsc2UsIEtFWVZBTFVFX1AsICJrZXl2YWx1ZSJ9LAorCXs4 LCBmYWxzZSwgVFNDT05GSUdfUCwgInRzY29uZmlnIn0sCiAJezksIGZhbHNlLCBUSU1FU1RBTVBf UCwgInRpbWVzdGFtcCJ9LAorCXs5LCBmYWxzZSwgVFNRVUVSWVBBUlNFUl9QLCAidHNxcGFyc2Vy In0sCiAJezEwLCBmYWxzZSwgTElLRV9SRUdFWF9QLCAibGlrZV9yZWdleCJ9LAogCXsxMCwgZmFs c2UsIFNUUl9TUExJVF9QQVJUX1AsICJzcGxpdF9wYXJ0In0sCiAJezEyLCBmYWxzZSwgVElNRVNU QU1QX1RaX1AsICJ0aW1lc3RhbXBfdHoifSwKZGlmZiAtLWdpdCBhL3NyYy9pbmNsdWRlL3V0aWxz L2pzb25wYXRoLmggYi9zcmMvaW5jbHVkZS91dGlscy9qc29ucGF0aC5oCmluZGV4IDhkMjcyMDZl MjQyLi44OTc1M2JmOGJjNyAxMDA2NDQKLS0tIGEvc3JjL2luY2x1ZGUvdXRpbHMvanNvbnBhdGgu aAorKysgYi9zcmMvaW5jbHVkZS91dGlscy9qc29ucGF0aC5oCkBAIC0xMDQsNiArMTA0LDcgQEAg dHlwZWRlZiBlbnVtIEpzb25QYXRoSXRlbVR5cGUKIAlqcGlMYXN0LAkJCQkJLyogTEFTVCBhcnJh eSBzdWJzY3JpcHQgKi8KIAlqcGlTdGFydHNXaXRoLAkJCQkvKiBTVEFSVFMgV0lUSCBwcmVkaWNh dGUgKi8KIAlqcGlMaWtlUmVnZXgsCQkJCS8qIExJS0VfUkVHRVggcHJlZGljYXRlICovCisJanBp VHNNYXRjaCwJCQkJCS8qIFRTTUFUQ0ggcHJlZGljYXRlICovCiAJanBpQmlnaW50LAkJCQkJLyog LmJpZ2ludCgpIGl0ZW0gbWV0aG9kICovCiAJanBpQm9vbGVhbiwJCQkJCS8qIC5ib29sZWFuKCkg aXRlbSBtZXRob2QgKi8KIAlqcGlEYXRlLAkJCQkJLyogLmRhdGUoKSBpdGVtIG1ldGhvZCAqLwpA QCAtMTk2LDYgKzE5NywxNSBAQCB0eXBlZGVmIHN0cnVjdCBKc29uUGF0aEl0ZW0KIAkJCWludDMy CQlwYXR0ZXJubGVuOwogCQkJdWludDMyCQlmbGFnczsKIAkJfQkJCWxpa2VfcmVnZXg7CisJCXN0 cnVjdAorCQl7CisJCQlpbnQzMgkJZG9jOworCQkJY2hhcgkgICAqdHNxdWVyeTsKKwkJCXVpbnQz MgkJdHNxdWVyeV9sZW47CisJCQlpbnQzMgkJdHNjb25maWc7CisJCQljaGFyCSAgICp0c3FwYXJz ZXI7CisJCQl1aW50MzIJCXRzcXBhcnNlcl9sZW47CisJCX0JCQl0c21hdGNoOwogCX0JCQljb250 ZW50OwogfSBKc29uUGF0aEl0ZW07CiAKQEAgLTI3NCw2ICsyODQsMTUgQEAgc3RydWN0IEpzb25Q YXRoUGFyc2VJdGVtCiAJCQl1aW50MzIJCWxlbjsKIAkJCWNoYXIJICAgKnZhbDsJLyogY291bGQg bm90IGJlIG5vdCBudWxsLXRlcm1pbmF0ZWQgKi8KIAkJfQkJCXN0cmluZzsKKwkJc3RydWN0CisJ CXsKKwkJCUpzb25QYXRoUGFyc2VJdGVtICpkb2M7CisJCQljaGFyCSAgICp0c3F1ZXJ5OworCQkJ dWludDMyCQl0c3F1ZXJ5X2xlbjsKKwkJCUpzb25QYXRoUGFyc2VJdGVtICp0c2NvbmZpZzsKKwkJ CWNoYXIJICAgKnRzcXBhcnNlcjsKKwkJCXVpbnQzMgkJdHNxcGFyc2VyX2xlbjsKKwkJfQkJCXRz bWF0Y2g7CiAJfQkJCXZhbHVlOwogfTsKIApkaWZmIC0tZ2l0IGEvc3JjL3Rlc3QvcmVncmVzcy9l eHBlY3RlZC9qc29uYl9qc29ucGF0aC5vdXQgYi9zcmMvdGVzdC9yZWdyZXNzL2V4cGVjdGVkL2pz b25iX2pzb25wYXRoLm91dAppbmRleCBhZmE2YzRjYjUyOS4uYWM3OGJlY2MzMDUgMTAwNjQ0Ci0t LSBhL3NyYy90ZXN0L3JlZ3Jlc3MvZXhwZWN0ZWQvanNvbmJfanNvbnBhdGgub3V0CisrKyBiL3Ny Yy90ZXN0L3JlZ3Jlc3MvZXhwZWN0ZWQvanNvbmJfanNvbnBhdGgub3V0CkBAIC00ODkxLDMgKzQ4 OTEsNjEgQEAgT1JERVIgQlkgczEubnVtLCBzMi5udW07CiAgeyJzIjogIkIifSAgICB8IHsicyI6 ICJCIn0gICAgfCBmYWxzZSB8IHRydWUgIHwgdHJ1ZSAgfCB0cnVlICB8IGZhbHNlCiAoMTQ0IHJv d3MpCiAKK3NlbGVjdCBqc29uYl9wYXRoX3F1ZXJ5KCdbbnVsbCwgMSwgInJ1bm5pbmciLCAicnVu cyIsICJyYW4iLCAicnVuIiwgInJ1bm5lciIsICJqb2dnaW5nIl0nLCAnbGF4ICRbKl0gPyAoQCB0 c21hdGNoICJmbHkiIHRzY29uZmlnICJlbmdsaXNoIiknKTsKKyBqc29uYl9wYXRoX3F1ZXJ5IAor LS0tLS0tLS0tLS0tLS0tLS0tCisoMCByb3dzKQorCitzZWxlY3QganNvbmJfcGF0aF9xdWVyeSgn W251bGwsIDEsICJydW5uaW5nIiwgInJ1bnMiLCAicmFuIiwgInJ1biIsICJydW5uZXIiLCAiam9n Z2luZyJdJywgJ2xheCAkWypdID8gKEAgdHNtYXRjaCAicnVuIiB0c2NvbmZpZyAiZW5nbGlzaCIp Jyk7CisganNvbmJfcGF0aF9xdWVyeSAKKy0tLS0tLS0tLS0tLS0tLS0tLQorICJydW5uaW5nIgor ICJydW5zIgorICJydW4iCisoMyByb3dzKQorCitzZWxlY3QganNvbmJfcGF0aF9xdWVyeSgnW251 bGwsIDEsICJydW5uaW5nIiwgInJ1bnMiLCAicmFuIiwgInJ1biIsICJydW5uZXIiLCAiam9nZ2lu ZyJdJywgJ2xheCAkWypdID8gKEAgdHNtYXRjaCAicnVuIiB0c2NvbmZpZyAic2ltcGxlIiknKTsK KyBqc29uYl9wYXRoX3F1ZXJ5IAorLS0tLS0tLS0tLS0tLS0tLS0tCisgInJ1biIKKygxIHJvdykK Kworc2VsZWN0IGpzb25iX3BhdGhfcXVlcnkoJ1tudWxsLCAxLCAiUG9zdGdyZVNRTCIsICJwb3N0 Z3JlcyIsICJQT1NUR1JFUyIsICJkYXRhYmFzZSJdJywgJ2xheCAkWypdID8gKEAgdHNtYXRjaCAi UG9zdGdyZXMiIHRzY29uZmlnICJlbmdsaXNoIiknKTsKKyBqc29uYl9wYXRoX3F1ZXJ5IAorLS0t LS0tLS0tLS0tLS0tLS0tCisgInBvc3RncmVzIgorICJQT1NUR1JFUyIKKygyIHJvd3MpCisKK3Nl bGVjdCBqc29uYl9wYXRoX3F1ZXJ5KCdbbnVsbCwgMSwgIlBvc3RncmVTUUwiLCAicG9zdGdyZXMi LCAiUE9TVEdSRVMiLCAiZGF0YWJhc2UiXScsICdsYXggJFsqXSA/IChAIHRzbWF0Y2ggIlBvc3Rn cmVzIiB0c2NvbmZpZyAic2ltcGxlIiknKTsKKyBqc29uYl9wYXRoX3F1ZXJ5IAorLS0tLS0tLS0t LS0tLS0tLS0tCisgInBvc3RncmVzIgorICJQT1NUR1JFUyIKKygyIHJvd3MpCisKKy0tIGluIHRo ZSBkZWZhdWx0IHRzcXBhcnNlciAodG9fdHNxdWVyeSkgc3BhY2VzIGFyZSBub3QgYWxsb3dlZCwg c28gdGhpcyBzaG91bGQgZmFpbCBmb3Igc3ludGF4CitzZWxlY3QganNvbmJfcGF0aF9xdWVyeSgn WyJmYXN0IGNhciIsICJzdXBlciBmYXN0IGNhciIsICJmYXN0IGFuZCBmdXJpb3VzIiwgInNsb3cg Y2FyIl0nLCAnbGF4ICRbKl0gPyAoQCB0c21hdGNoICJmYXN0IGNhciIgdHNjb25maWcgImVuZ2xp c2giKScpOworRVJST1I6ICBzeW50YXggZXJyb3IgaW4gdHNxdWVyeTogImZhc3QgY2FyIgorLS0g aWYgd2Ugc3BlY2lmeSAidyIgaG93ZXZlciBpdCBzaG91bGQgYmUgb2sKK3NlbGVjdCBqc29uYl9w YXRoX3F1ZXJ5KCdbImZhc3QgY2FyIiwgInN1cGVyIGZhc3QgY2FyIiwgImZhc3QgYW5kIGZ1cmlv dXMiLCAic2xvdyBjYXIiXScsICdsYXggJFsqXSA/IChAIHRzbWF0Y2ggImZhc3QgY2FyIiB0c2Nv bmZpZyAiZW5nbGlzaCIgdHNxcGFyc2VyICJ3IiknKTsKKyBqc29uYl9wYXRoX3F1ZXJ5IAorLS0t LS0tLS0tLS0tLS0tLS0tCisgImZhc3QgY2FyIgorICJzdXBlciBmYXN0IGNhciIKKygyIHJvd3Mp CisKKy0tIGl0IHNob3VsZCBhbHNvIGJlIG9rIGlmIHdlIGNoYW5nZSB0byBhIHZhbGlkIHRvX3Rz cXVlcnkKK3NlbGVjdCBqc29uYl9wYXRoX3F1ZXJ5KCdbImZhc3QgY2FyIiwgInN1cGVyIGZhc3Qg Y2FyIiwgImZhc3QgYW5kIGZ1cmlvdXMiLCAic2xvdyBjYXIiXScsICdsYXggJFsqXSA/IChAIHRz bWF0Y2ggImZhc3QgJiBjYXIiIHRzY29uZmlnICJlbmdsaXNoIiknKTsKKyBqc29uYl9wYXRoX3F1 ZXJ5IAorLS0tLS0tLS0tLS0tLS0tLS0tCisgImZhc3QgY2FyIgorICJzdXBlciBmYXN0IGNhciIK KygyIHJvd3MpCisKK3NlbGVjdCBqc29uYl9wYXRoX3F1ZXJ5KCdbImZhdCBjYXQiLCAiY2F0IGZh dCIsICJmYXQgcmF0cyJdJywgJ2xheCAkWypdID8gKEAgdHNtYXRjaCAiZmF0ICYgcmF0IiB0c2Nv bmZpZyAiZW5nbGlzaCIpJyk7CisganNvbmJfcGF0aF9xdWVyeSAKKy0tLS0tLS0tLS0tLS0tLS0t LQorICJmYXQgcmF0cyIKKygxIHJvdykKKwpkaWZmIC0tZ2l0IGEvc3JjL3Rlc3QvcmVncmVzcy9l eHBlY3RlZC9qc29ucGF0aC5vdXQgYi9zcmMvdGVzdC9yZWdyZXNzL2V4cGVjdGVkL2pzb25wYXRo Lm91dAppbmRleCBlYTk3MWU3OTg1NC4uNjAwY2Y1NzJmMDggMTAwNjQ0Ci0tLSBhL3NyYy90ZXN0 L3JlZ3Jlc3MvZXhwZWN0ZWQvanNvbnBhdGgub3V0CisrKyBiL3NyYy90ZXN0L3JlZ3Jlc3MvZXhw ZWN0ZWQvanNvbnBhdGgub3V0CkBAIC0xNDgwLDMgKzE0ODAsNjMgQEAgRlJPTSB1bm5lc3QoQVJS QVlbJyQgPyAoQCBsaWtlX3JlZ2V4ICJwYXR0ZXJuIiBmbGFnICJzbWl4cSIpJzo6dGV4dCwKICAx YSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IGYgIHwgNDI2MDEgICAg ICAgICAgfCB0cmFpbGluZyBqdW5rIGFmdGVyIG51bWVyaWMgbGl0ZXJhbCBhdCBvciBuZWFyICIx YSIgb2YganNvbnBhdGggaW5wdXQgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICB8IAogKDUgcm93cykKIAorLS0gdHNtYXRjaCAoRnVsbCBU ZXh0IFNlYXJjaCkKKy0tIGJhc2ljIHN1Y2Nlc3MKK3NlbGVjdCAnJCA/IChAIHRzbWF0Y2ggInNp bXBsZSIpJzo6anNvbnBhdGg7CisgICAgICAgIGpzb25wYXRoICAgICAgICAKKy0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLQorICQ/KEAgdHNtYXRjaCAic2ltcGxlIikKKygxIHJvdykKKworc2VsZWN0 ICckID8gKEAgdHNtYXRjaCAicnVubmluZyIgdHNjb25maWcgImVuZ2xpc2giKSc6Ompzb25wYXRo OworICAgICAgICAgICAgICAgICAganNvbnBhdGggICAgICAgICAgICAgICAgICAKKy0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgJD8oQCB0c21hdGNoICJydW5u aW5nIiB0c2NvbmZpZyAiZW5nbGlzaCIpCisoMSByb3cpCisKKy0tIHcvb3V0IHRzY29uZmlnIGFu ZCB0c3FwYXJzZXIKK3NlbGVjdCAnJCA/IChAIHRzbWF0Y2ggImZhc3QgJiBmdXJpb3VzIiB0c2Nv bmZpZyAic2ltcGxlIiknOjpqc29ucGF0aDsKKyAgICAgICAgICAgICAgICAgICAgIGpzb25wYXRo ICAgICAgICAgICAgICAgICAgICAgCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLQorICQ/KEAgdHNtYXRjaCAiZmFzdCAmIGZ1cmlvdXMiIHRzY29uZmln ICJzaW1wbGUiKQorKDEgcm93KQorCitzZWxlY3QgJyQgPyAoQCB0c21hdGNoICJmYXN0ICYgZnVy aW91cyIgdHNjb25maWcgInNpbXBsZSIgdHNxcGFyc2VyICJ3IiknOjpqc29ucGF0aDsKKyAgICAg ICAgICAgICAgICAgICAgICAgICAgICBqc29ucGF0aCAgICAgICAgICAgICAgICAgICAgICAgICAg ICAKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0KKyAkPyhAIHRzbWF0Y2ggImZhc3QgJiBmdXJpb3VzIiB0c2NvbmZpZyAic2lt cGxlIiB0c3FwYXJzZXIgInciKQorKDEgcm93KQorCistLSB0c2NvbmZpZyBtdXN0IGJlIHNwZWNp ZmllZCBmaXJzdCBhbmQgdGhlbiB0c3FwYXJzZXIKK3NlbGVjdCAnJCA/IChAIHRzbWF0Y2ggImZh c3QgJiBmdXJpb3VzIiB0c3FwYXJzZXIgInciIHRzY29uZmlnICJzaW1wbGUiICknOjpqc29ucGF0 aDsKK0VSUk9SOiAgc3ludGF4IGVycm9yIGF0IG9yIG5lYXIgIiAiIG9mIGpzb25wYXRoIGlucHV0 CitMSU5FIDE6IHNlbGVjdCAnJCA/IChAIHRzbWF0Y2ggImZhc3QgJiBmdXJpb3VzIiB0c3FwYXJz ZXIgInciIHRzY29uZi4uLgorICAgICAgICAgICAgICAgXgorc2VsZWN0ICckID8gKEAgdHNtYXRj aCAiZmFzdCAmIGZ1cmlvdXMiIHRzcXBhcnNlciAidyIpJzo6anNvbnBhdGg7CisgICAgICAgICAg ICAgICAgICAganNvbnBhdGggICAgICAgICAgICAgICAgICAgCistLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgJD8oQCB0c21hdGNoICJmYXN0ICYgZnVyaW91 cyIgdHNxcGFyc2VyICJ3IikKKygxIHJvdykKKworc2VsZWN0ICckWypdID8gKEAudGl0bGUgdHNt YXRjaCAiZ29kIiAmJiBALnJhdGluZyA+IDUpJzo6anNvbnBhdGg7CisgICAgICAgICAgICAgICAg ICAgICBqc29ucGF0aCAgICAgICAgICAgICAgICAgICAgIAorLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAkWypdPyhALiJ0aXRsZSIgdHNtYXRjaCAi Z29kIiAmJiBALiJyYXRpbmciID4gNSkKKygxIHJvdykKKworc2VsZWN0ICckID8gKEAgdHNtYXRj aCAkcGF0dGVybiknOjpqc29ucGF0aDsKK0VSUk9SOiAgc3ludGF4IGVycm9yIGF0IG9yIG5lYXIg IiRwYXR0ZXJuIiBvZiBqc29ucGF0aCBpbnB1dAorTElORSAxOiBzZWxlY3QgJyQgPyAoQCB0c21h dGNoICRwYXR0ZXJuKSc6Ompzb25wYXRoOworICAgICAgICAgICAgICAgXgorLS0gb25seSBzdHJp bmcgbGl0ZXJhbHMgKG5vIHZhcmlhYmxlcykgYXJlIGFsbG93ZWQgZm9yIHRzcXVlcnkKK3NlbGVj dCAnJCA/IChAIHRzbWF0Y2ggJHZhciB0c2NvbmZpZyAiZW5nbGlzaCIpJzo6anNvbnBhdGg7CitF UlJPUjogIHN5bnRheCBlcnJvciBhdCBvciBuZWFyICIkdmFyIiBvZiBqc29ucGF0aCBpbnB1dAor TElORSAxOiBzZWxlY3QgJyQgPyAoQCB0c21hdGNoICR2YXIgdHNjb25maWcgImVuZ2xpc2giKSc6 Ompzb25wYXRoOworICAgICAgICAgICAgICAgXgorLS0gaWYgYSB0c2NvbmZpZyBkb2Vzbid0IGV4 aXN0IGl0IHNob3VsZCBwYXJzZSBub25ldGhlbGVzcyAoZXhlY3V0b3Igd2lsbCBmYWlsIGl0KQor c2VsZWN0ICckID8gKEAgdHNtYXRjaCAicnVubmluZyIgdHNjb25maWcgIndyb25nY29uZmlnIikn Ojpqc29ucGF0aDsKKyAgICAgICAgICAgICAgICAgICAganNvbnBhdGggICAgICAgICAgICAgICAg ICAgIAorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisg JD8oQCB0c21hdGNoICJydW5uaW5nIiB0c2NvbmZpZyAid3Jvbmdjb25maWciKQorKDEgcm93KQor CmRpZmYgLS1naXQgYS9zcmMvdGVzdC9yZWdyZXNzL3NxbC9qc29uYl9qc29ucGF0aC5zcWwgYi9z cmMvdGVzdC9yZWdyZXNzL3NxbC9qc29uYl9qc29ucGF0aC5zcWwKaW5kZXggZDNhMzhjNTc3OTEu Ljg2OTgwMjFiYTJiIDEwMDY0NAotLS0gYS9zcmMvdGVzdC9yZWdyZXNzL3NxbC9qc29uYl9qc29u cGF0aC5zcWwKKysrIGIvc3JjL3Rlc3QvcmVncmVzcy9zcWwvanNvbmJfanNvbnBhdGguc3FsCkBA IC0xMjUzLDMgKzEyNTMsMTYgQEAgU0VMRUNUCiAJanNvbmJfcGF0aF9xdWVyeV9maXJzdChzMS5q LCAnJC5zID4gJHMnLCB2YXJzID0+IHMyLmopIGd0CiBGUk9NIHN0ciBzMSwgc3RyIHMyCiBPUkRF UiBCWSBzMS5udW0sIHMyLm51bTsKKworc2VsZWN0IGpzb25iX3BhdGhfcXVlcnkoJ1tudWxsLCAx LCAicnVubmluZyIsICJydW5zIiwgInJhbiIsICJydW4iLCAicnVubmVyIiwgImpvZ2dpbmciXScs ICdsYXggJFsqXSA/IChAIHRzbWF0Y2ggImZseSIgdHNjb25maWcgImVuZ2xpc2giKScpOworc2Vs ZWN0IGpzb25iX3BhdGhfcXVlcnkoJ1tudWxsLCAxLCAicnVubmluZyIsICJydW5zIiwgInJhbiIs ICJydW4iLCAicnVubmVyIiwgImpvZ2dpbmciXScsICdsYXggJFsqXSA/IChAIHRzbWF0Y2ggInJ1 biIgdHNjb25maWcgImVuZ2xpc2giKScpOworc2VsZWN0IGpzb25iX3BhdGhfcXVlcnkoJ1tudWxs LCAxLCAicnVubmluZyIsICJydW5zIiwgInJhbiIsICJydW4iLCAicnVubmVyIiwgImpvZ2dpbmci XScsICdsYXggJFsqXSA/IChAIHRzbWF0Y2ggInJ1biIgdHNjb25maWcgInNpbXBsZSIpJyk7Citz ZWxlY3QganNvbmJfcGF0aF9xdWVyeSgnW251bGwsIDEsICJQb3N0Z3JlU1FMIiwgInBvc3RncmVz IiwgIlBPU1RHUkVTIiwgImRhdGFiYXNlIl0nLCAnbGF4ICRbKl0gPyAoQCB0c21hdGNoICJQb3N0 Z3JlcyIgdHNjb25maWcgImVuZ2xpc2giKScpOworc2VsZWN0IGpzb25iX3BhdGhfcXVlcnkoJ1tu dWxsLCAxLCAiUG9zdGdyZVNRTCIsICJwb3N0Z3JlcyIsICJQT1NUR1JFUyIsICJkYXRhYmFzZSJd JywgJ2xheCAkWypdID8gKEAgdHNtYXRjaCAiUG9zdGdyZXMiIHRzY29uZmlnICJzaW1wbGUiKScp OworLS0gaW4gdGhlIGRlZmF1bHQgdHNxcGFyc2VyICh0b190c3F1ZXJ5KSBzcGFjZXMgYXJlIG5v dCBhbGxvd2VkLCBzbyB0aGlzIHNob3VsZCBmYWlsIGZvciBzeW50YXgKK3NlbGVjdCBqc29uYl9w YXRoX3F1ZXJ5KCdbImZhc3QgY2FyIiwgInN1cGVyIGZhc3QgY2FyIiwgImZhc3QgYW5kIGZ1cmlv dXMiLCAic2xvdyBjYXIiXScsICdsYXggJFsqXSA/IChAIHRzbWF0Y2ggImZhc3QgY2FyIiB0c2Nv bmZpZyAiZW5nbGlzaCIpJyk7CistLSBpZiB3ZSBzcGVjaWZ5ICJ3IiBob3dldmVyIGl0IHNob3Vs ZCBiZSBvaworc2VsZWN0IGpzb25iX3BhdGhfcXVlcnkoJ1siZmFzdCBjYXIiLCAic3VwZXIgZmFz dCBjYXIiLCAiZmFzdCBhbmQgZnVyaW91cyIsICJzbG93IGNhciJdJywgJ2xheCAkWypdID8gKEAg dHNtYXRjaCAiZmFzdCBjYXIiIHRzY29uZmlnICJlbmdsaXNoIiB0c3FwYXJzZXIgInciKScpOwor LS0gaXQgc2hvdWxkIGFsc28gYmUgb2sgaWYgd2UgY2hhbmdlIHRvIGEgdmFsaWQgdG9fdHNxdWVy eQorc2VsZWN0IGpzb25iX3BhdGhfcXVlcnkoJ1siZmFzdCBjYXIiLCAic3VwZXIgZmFzdCBjYXIi LCAiZmFzdCBhbmQgZnVyaW91cyIsICJzbG93IGNhciJdJywgJ2xheCAkWypdID8gKEAgdHNtYXRj aCAiZmFzdCAmIGNhciIgdHNjb25maWcgImVuZ2xpc2giKScpOworc2VsZWN0IGpzb25iX3BhdGhf cXVlcnkoJ1siZmF0IGNhdCIsICJjYXQgZmF0IiwgImZhdCByYXRzIl0nLCAnbGF4ICRbKl0gPyAo QCB0c21hdGNoICJmYXQgJiByYXQiIHRzY29uZmlnICJlbmdsaXNoIiknKTsKZGlmZiAtLWdpdCBh L3NyYy90ZXN0L3JlZ3Jlc3Mvc3FsL2pzb25wYXRoLnNxbCBiL3NyYy90ZXN0L3JlZ3Jlc3Mvc3Fs L2pzb25wYXRoLnNxbAppbmRleCA0NDE3OGQ4YjQ1YS4uZGM0MjhmZmU1OWIgMTAwNjQ0Ci0tLSBh L3NyYy90ZXN0L3JlZ3Jlc3Mvc3FsL2pzb25wYXRoLnNxbAorKysgYi9zcmMvdGVzdC9yZWdyZXNz L3NxbC9qc29ucGF0aC5zcWwKQEAgLTMwNiwzICszMDYsMjIgQEAgRlJPTSB1bm5lc3QoQVJSQVlb JyQgPyAoQCBsaWtlX3JlZ2V4ICJwYXR0ZXJuIiBmbGFnICJzbWl4cSIpJzo6dGV4dCwKICAgICAg ICAgICAgICAgICAgICcwMCcsCiAgICAgICAgICAgICAgICAgICAnMWEnXSkgc3RyLAogICAgICBM QVRFUkFMIHBnX2lucHV0X2Vycm9yX2luZm8oc3RyLCAnanNvbnBhdGgnKSBhcyBlcnJpbmZvOwor CistLSB0c21hdGNoIChGdWxsIFRleHQgU2VhcmNoKQorCistLSBiYXNpYyBzdWNjZXNzCitzZWxl Y3QgJyQgPyAoQCB0c21hdGNoICJzaW1wbGUiKSc6Ompzb25wYXRoOworc2VsZWN0ICckID8gKEAg dHNtYXRjaCAicnVubmluZyIgdHNjb25maWcgImVuZ2xpc2giKSc6Ompzb25wYXRoOworLS0gdy9v dXQgdHNjb25maWcgYW5kIHRzcXBhcnNlcgorc2VsZWN0ICckID8gKEAgdHNtYXRjaCAiZmFzdCAm IGZ1cmlvdXMiIHRzY29uZmlnICJzaW1wbGUiKSc6Ompzb25wYXRoOworc2VsZWN0ICckID8gKEAg dHNtYXRjaCAiZmFzdCAmIGZ1cmlvdXMiIHRzY29uZmlnICJzaW1wbGUiIHRzcXBhcnNlciAidyIp Jzo6anNvbnBhdGg7CistLSB0c2NvbmZpZyBtdXN0IGJlIHNwZWNpZmllZCBmaXJzdCBhbmQgdGhl biB0c3FwYXJzZXIKK3NlbGVjdCAnJCA/IChAIHRzbWF0Y2ggImZhc3QgJiBmdXJpb3VzIiB0c3Fw YXJzZXIgInciIHRzY29uZmlnICJzaW1wbGUiICknOjpqc29ucGF0aDsKK3NlbGVjdCAnJCA/IChA IHRzbWF0Y2ggImZhc3QgJiBmdXJpb3VzIiB0c3FwYXJzZXIgInciKSc6Ompzb25wYXRoOworc2Vs ZWN0ICckWypdID8gKEAudGl0bGUgdHNtYXRjaCAiZ29kIiAmJiBALnJhdGluZyA+IDUpJzo6anNv bnBhdGg7CitzZWxlY3QgJyQgPyAoQCB0c21hdGNoICRwYXR0ZXJuKSc6Ompzb25wYXRoOworCist LSBvbmx5IHN0cmluZyBsaXRlcmFscyAobm8gdmFyaWFibGVzKSBhcmUgYWxsb3dlZCBmb3IgdHNx dWVyeQorc2VsZWN0ICckID8gKEAgdHNtYXRjaCAkdmFyIHRzY29uZmlnICJlbmdsaXNoIiknOjpq c29ucGF0aDsKKy0tIGlmIGEgdHNjb25maWcgZG9lc24ndCBleGlzdCBpdCBzaG91bGQgcGFyc2Ug bm9uZXRoZWxlc3MgKGV4ZWN1dG9yIHdpbGwgZmFpbCBpdCkKK3NlbGVjdCAnJCA/IChAIHRzbWF0 Y2ggInJ1bm5pbmciIHRzY29uZmlnICJ3cm9uZ2NvbmZpZyIpJzo6anNvbnBhdGg7Ci0tIAoyLjUz LjAKCg== --000000000000d4c5b0064e9f33e4--