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 1vdDmu-00FW0t-0O for pgsql-hackers@arkaria.postgresql.org; Tue, 06 Jan 2026 20:36:21 +0000 Received: from localhost ([127.0.0.1] helo=malur.postgresql.org) by malur.postgresql.org with esmtp (Exim 4.96) (envelope-from ) id 1vdDms-00AVo2-2c for pgsql-hackers@arkaria.postgresql.org; Tue, 06 Jan 2026 20:36:19 +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 1vdDmr-00AVnt-30 for pgsql-hackers@lists.postgresql.org; Tue, 06 Jan 2026 20:36:19 +0000 Received: from mail-oo1-xc29.google.com ([2607:f8b0:4864:20::c29]) by makus.postgresql.org with esmtps (TLS1.3) tls TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256 (Exim 4.96) (envelope-from ) id 1vdDmo-004adx-1z for pgsql-hackers@lists.postgresql.org; Tue, 06 Jan 2026 20:36:17 +0000 Received: by mail-oo1-xc29.google.com with SMTP id 006d021491bc7-65745a436f7so784686eaf.3 for ; Tue, 06 Jan 2026 12:36:14 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1767731773; x=1768336573; darn=lists.postgresql.org; h=to:subject:message-id:date:from:mime-version:from:to:cc:subject :date:message-id:reply-to; bh=UUfiAWa06iJmw9Yjc4DcOGoU4pByXaxz1HSVftEHT68=; b=hPFTkJS3z7qSn3to51+zFQEyxYyPs/yt1LKJdyjp4sflL0kMyPHTvQIBq8TIFeJZOF VOHsi6E+KCaNceG+mHgt68jXB7OJP85P5rwiXcG86fW8gTFHjv/6sjQTFWvbHRgEDSES YjT8me0osHkTMBqMpWIJFnJ/7/dMuSidiT5pcFxzBheJMDfazWnfmj8YfnDWzZ2upgrf +p2okPxJMCObt0y77ULYYI2sPYAkeJe/tSRebQ8zo7NFLLPu3wdVPJ8VnIR4ayUaWH5S 1eCqatJe0GTMqz3j7aKtp+aOQKHpc59jj1TAwQsLnMXWlGoQYUW4ZEn0lR0uULYlihb4 i4iw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1767731773; x=1768336573; h=to:subject:message-id:date:from:mime-version:x-gm-gg :x-gm-message-state:from:to:cc:subject:date:message-id:reply-to; bh=UUfiAWa06iJmw9Yjc4DcOGoU4pByXaxz1HSVftEHT68=; b=Xml3PUJNIuLSe8i2Og1tEvK70ZEAygyyvG/O1/L6qfxE3fNKiSJeqZ25AR82067Vs1 ml2MjiqXxzBOLY8bAnHK7v50RBIUMCFItGTVAA9MqOGXjbVxaQDWel+CHB6ZsvkXTafP +jzlJEglZ3FdaftkQod3IOx576VllIbihrqp5ib8pi2repc/ypFmBkcdT0MWvYfFAr6G 6Z+w5Y3GwwYieRMpS9sgwopidc84QocWXxA3HI/UX/8XuBuzCjj3+/rpez/jcFNdEY+s raqBUSZ70AfeImMm+GKJL3ewp/pjrAoURPejA27mwpf07Cvm0JPf8+4/S4LS/7f55ceP O9Dg== X-Gm-Message-State: AOJu0Yy9cX3bJl92WrN1WQ1OoAGd9uacGfD9QJYpJ3WYb6oM6gLIMe0o 1BlTE9Cy6BEyLu2TTEjlKklgFoA+5EVfP2GDlTq15YGjKXln9kXyZH7hNMJIZuxSrTyTNyhOo8y Zub30+w53kGSrSA4SjzLani0rF7yoymCafg== X-Gm-Gg: AY/fxX5rzgyV2q//tdee5XLPG2pjpGMBE/g+inybTd0HxYrGY93egQ6/rOHb9wYpYMS pWYc9eJTRuppSjnkGbfnhUlf8IE9r5rs75Xwi90QNirmq5jJjgkcqJvhIEDwEiefodoectD3lHM YwV5/jQk1vBosbZY1GHywmw4lBG6UHms9plXxFLbcmMytTr/vlDRh1RHmM5t+qFjNC3JInRjkPj NjUR+7JULIdeaCYJaKpTn5xo3BW9dHn7PB4Fb2dBmAE08Nfk5eIaCsNfci+s8Vf68faZR71/0r2 WWcDXaULraT9MVZ1TB95l5rsXzr8BA== X-Google-Smtp-Source: AGHT+IG6FoPZHXR/7kEEDq8hE9Rjl6WQHQCI9VobbVz0DZf9cOYhMbEM+PxqmADNuA1slul8mAOB0bUn+jtRuFCiaEY= X-Received: by 2002:a05:6820:620:b0:659:9a49:8f5d with SMTP id 006d021491bc7-65f54ef7f5fmr53734eaf.34.1767731772783; Tue, 06 Jan 2026 12:36:12 -0800 (PST) MIME-Version: 1.0 From: Greg Sabino Mullane Date: Tue, 6 Jan 2026 15:35:38 -0500 X-Gm-Features: AQt7F2rq27P2eOeHDgyWC9yUvD6LDYcQ2d8iwrlnE_ozASCTSH2G4xia20hBvro Message-ID: Subject: [PATCH] Provide support for trailing commas To: "pgsql-hackers@lists.postgresql.org" Content-Type: multipart/mixed; boundary="0000000000006041100647be2069" List-Id: List-Help: List-Subscribe: List-Post: List-Owner: List-Archive: Archived-At: Precedence: bulk --0000000000006041100647be2069 Content-Type: multipart/alternative; boundary="00000000000060410f0647be2067" --00000000000060410f0647be2067 Content-Type: text/plain; charset="UTF-8" tl;dr Provide support for trailing commas, where possible and practical. (Disclaimer: No LLM or AI was used to craft this patch or this email) Happy New Year! Please find attached a patch to provide comprehensive trailing comma support, where we allow (when possible) a comma that does NOT come before the next item in a list. To wit: SELECT 1,2,3, FROM pg_class, ORDER BY greatest(relpages,1,); This is not as trivial a task as it seems, as those who have dabbled with our parser (or parsers in general) may suspect. At the end of the day, however, 99% of the places in which we use a comma for a list of items now have support for trailing commas. Most of this email is an item by item breakdown of each occurance of commas with the gram.y file (in order), how it was solved, and a quick example showing the newly supported syntax. The overall approach is to break the existing lists into two lists, the new one with a suffix of "_items", and put the optional trailing comma at the end of that new list. For example, here's how I solved utility_option_list. It used to look like this: utility_option_list: utility_option_elem { $$ = list_make1($1); } | utility_option_list ',' utility_option_elem { $$ = lappend($1, $3); } ; Now it looks like this: utility_option_list: utility_option_list_items opt_trailing_comma { $$ = $1; } ; utility_option_list_items: utility_option_elem { $$ = list_make1($1); } | utility_option_list_items ',' utility_option_elem { $$ = lappend($1, $3); } ; Where opt_trailing_comma is: opt_trailing_comma: ',' { $$ = NULL; } | /* EMPTY */ { $$ = NULL; } ; That system satisfies most of the grammar, but there were some problematic spots that caused the ol' shift/reduce conflict that is the bane of those editing gram.y. First, I made our commas a little more special with: %left ',' Second, I added some new items to the %nonassoc lists. They are detailed below as added, but the basic need is because lists of things in Postgres often have some optional modifiers. For example, TRUNCATE takes a list of table to truncate, but also allows the CASCADE keyword. Further, we do not prevent people from creating a table named "cascade", so this command will truncate two tables: TRUNCATE TABLE foobar, cascade; This command will truncate one table, and cascade to other tables as needed: TRUNCATE TBALE foobar cascade; Trailing comma allows us to call a list of tables, and end with a comma: TRUNCATE TBALE foobar, foobaz, ; However, we now have some ambiguity (i.e. shift/reduce conflicts) because "TRUNCATE TABLE foobar, cascade;" can now indicate truncating two tables, or one table (with a trailing comma), plus the cascade keyword. This is solved by this patch in favor of the latter interpretation. In other words, when there is a trailing comma, the list is not greedy. Luckily, the number of places needing such tweaks is small. There are a few places where trailing comma support was warranted too technically difficult and/or not worth the trouble - they are all documented below. Each section below includes an approximate line number, simply to help reviewers find the location easier, as it is a big file. I've not consolidated all of the test cases into a single regression test, but am open to the idea (I'm not convinced it is needed). Cheers, Greg ======= * utility_option_list Status: fully supported Line: 1160 Used by: CHECKPOINT, REINDEX, CLUSTER, VACUUM, ANALYZE, EXPLAIN Test cases (should fail on head, but work with this patch): EXPLAIN (verbose, format yaml, ) select 1; ANALYZE (skip_locked,verbose,) pg_class; ======= * var_list Status: not supported Line: 1854 Used by generic_set, but there a lot of shift/reduce conflicts. For example: alter function foo() set search_path = public, abc immutable; alter function foo() set search_path = public, abc, immutable; If we allow trailing commas, would immutable be the name of the schema or the SET modifier? In theory we could create a new list to allow trailing commas on simpler items, e.g.: alter system set log_destination = stderr,csvlog,; But I feel like this is going too far, so I left this one alone. ======= * alter_table_cmds Status: fully supported Line: 2386 Used by ALTER TABLE to support multiple actions. Also ALTER INDEX, ALTER SEQUENCE, ALTER VIEW, ALTER MATERIALIZED VIEW, ALTER FOREIGN TABLE Test case: CREATE TABLE t(id int); ALTER TABLE t ADD foo INT, ADD bar INT,; ======= * reloption_list Status: fully supported Line: 3192 Used by: reloptions and opt_reloptions to support SET() items for ALTER TABLE, CREATE INDEX, CREATE VIEW, and a few others. Test cases: ALTER TABLE foo SET (fillfactor=50,); CREATE INDEX i1 ON t(id) WITH (fillfactor=50, deduplicate_items=off,); ======= * hash_partbound Status: fully supported Line: 3363 Used by: partitioning FOR VALUES WITH () Test cases: CREATE TABLE p(id INT) PARTITION BY hash(id); CREATE TABLE c PARTITION OF p FOR VALUES WITH (remainder 1, modulus 4,); ======= * alter_type_cmds Status: fully supported Line: 3394 Used by: ALTER TYPE foo xxx TEST CASE: CREATE TYPE mytype AS (id int); ALTER TYPE mytype ADD attribute id2 int, ADD attribute id3 int, ; ======= * copy_generic_opt_list Line: 3678 Used by: COPY ... WITH () Test case: COPY pg_language(oid,lanname) TO stdout WITH (header, format csv,); ======= * copy_generic_opt_arg_list Status: fully supported Line: 3705 Used by: COPY WITH ( force_quote( [, ...] ) ) Test case: COPY pg_language(oid, lanname) TO stdout WITH (format csv, force_quote(oid,lanname, ) ); ======= * TableElementList Status: fully supported Line: 3898 Test case: CREATE TEMP TABLE foo(id int,); ======= * TypedTableElementList Status: fully supported Line: 3908 Test case: CREATE TYPE abc AS (id int, id2 int); CREATE TABLE mytype OF abc (id default 1, id2 default 3,); ======= * columnList Status: partially supported Line: 4542 In order: 1. UNIQUE constraints and PRIMARY KEY Needed to modify opt_without_overlaps to add the optional comma directly: opt_without_overlaps: ',' { $$ = false; } | WITHOUT OVERLAPS { $$ = true; } | ',' WITHOUT OVERLAPS { $$ = true; } | /*EMPTY*/ { $$ = false; } ; Test case: CREATE TEMP TABLE t (c1 int4range, c2 int4range); ALTER TABLE t ADD CONSTRAINT test1 UNIQUE (c1, c2); ALTER TABLE t ADD CONSTRAINT test2 UNIQUE (c1, c2,); ALTER TABLE t ADD CONSTRAINT test3 UNIQUE (c1, c2 WITHOUT OVERLAPS); ALTER TABLE t ADD CONSTRAINT test4 UNIQUE (c1, c2, WITHOUT OVERLAPS); ALTER TABLE t ADD PRIMARY KEY (c1, c2, ); 2. FOREIGN KEY As above, but we modify optionalPeriodName to allow a leading comma. Also add %nonassoc PERIOD optionalPeriodName: ',' { $$ = NULL; } | PERIOD columnElem { $$ = $3; } | ',' PERIOD columnElem { $$ = $3; } | /*EMPTY*/ { $$ = NULL; } ; Test case: CREATE TEMP TABLE t (id INT PRIMARY KEY); CREATE TEMP TABLE t2 (id INT, CONSTRAINT tempo1 FOREIGN KEY(id,) REFERENCES t (id,)); CREATE temp TABLE t3 (id INT4RANGE, valid_at DATERANGE, CONSTRAINT t3_pk PRIMARY KEY (id, valid_at, WITHOUT OVERLAPS)); CREATE temp TABLE t4 (id INT4RANGE, valid_at DATERANGE, CONSTRAINT t4_fk FOREIGN KEY (id, PERIOD valid_at) REFERENCES t3 (id, PERIOD valid_at)); 3. opt_column_list Many sub-items for this 3.1 CopyStmt Test case: COPY pg_language (lanowner,) TO stdout; 3.2 copy_opt_item FORCE_QUOTE Test case: COPY pg_language (lanowner) TO stdout WITH (format csv, FORCE_QUOTE (lanowner,) ); 3.3 copy_opt_item FORCE_NULL Test case: CREATE TEMP TABLE T (foo TEXT); COPY t FROM program 'echo abc' WITH (format csv, FORCE_NULL (foo, ) ); 3.4 ColConstraintElem REFERENCES Test case: CREATE TEMP TABLE t (id INT PRIMARY KEY); CREATE TEMP TABLE t2 (id INT CONSTRAINT tempo REFERENCES t (id,)); 3.5 key_action (e.g. SET NULL) Test case: CREATE TEMP TABLE t (id INT PRIMARY KEY); CREATE TEMP TABLE t2 (id INT CONSTRAINT tempo REFERENCES t (id) ON DELETE SET NULL (id,) ); 3.6 create_as_target Test case: CREATE TEMP TABLE t (id,) AS select 123; 3.7 create_mv_target: Test case: CREATE MATERIALIZED VIEW t(id,) AS select 123; DROP MATERIALIZED VIEW t; 3.8 privileges Test case: CREATE TEMP TABLE t (id INT); GRANT SELECT (id, ) ON TABLE t TO public; 3.9 PublicationObjSpec Test case: CREATE TABLE t(id INT); CREATE TABLE t2(id INT); CREATE PUBLICATION p FOR TABLE t(id,); DROP PUBLICATION p; CREATE PUBLICATION p FOR TABLE t *, ONLY t2 (id,); DROP PUBLICATION p; DROP TABLE t; 3.10 ViewStmt: Test case: CREATE TEMP VIEW t (id, ) AS select 123; 4. opt_column_and_period_list: '(' columnList optionalPeriodName ')' Test case: see #3 "FOREIGN KEY" above 5. opt_c_include: INCLUDE '(' columnListOptionalComma ')' Test case: CREATE TEMP TABLE t (id INT, id2 INT); ALTER TABLE t ADD CONSTRAINT u1 UNIQUE (id) INCLUDE (id2,); 6. TriggerOneEvent Test case: CREATE TEMP TABLE t (id int, id2 int); CREATE FUNCTION f() returns trigger language plpgsql as 'begin return new; end'; CREATE TRIGGER tr1 after UPDATE OF id, ON t for each row execute function f(); drop function f() cascade; 7. privileges for columns Test case: CREATE TEMP TABLE t(id int); GRANT ALL (id, ) on table t to public; 8. ViewStmt Test case: CREATE recursive VIEW v (id,) as select 123; 9. opt_search_clause Test case: WITH RECURSIVE x AS (select 123 as id union all select * from x) SEARCH DEPTH FIRST BY id, SET foo select * from x limit 1; Also added a "depth_or_breadth" to refactor the opt_search_clause first 10. opt_cycle_clause Test case: WITH RECURSIVE x AS (select 123 as id union all select * from x) CYCLE id, SET id2 to 3 default 1 using id3 select * from x limit 1; End of columnList! ======= * ExclusionConstraintList Status: fully supported Line: 4585 Used by: EXCLUDE Done by: adding ExclusionConstraintListItems Test case: CREATE TEMP TABLE tt(id int, EXCLUDE (id WITH =), ); ======= * part_params Status: fully supported Line: 4739 Used by: PartitionSpect etc. - only when creating partitioned tables Done by: adding part_params_items Test case: CREATE TEMP TABLE t(id int) PARTITION BY hash (id,); ======= * stats_params Status: fully supported Line: 4859 Used by: create statistics Done by: adding stats_params_items Test case: CREATE TEMP TABLE t1(id int, id2 int); CREATE STATISTICS ON id, id2, FROM t1; ======= * NumericOnly_list Status: not supported Line; 5188 Only used to set permissions on large objects, not worth the effort ======= * generic_option_list Status: fully supported Line: 5628 Used by: create_generic_options for FDW items, e.g. CREATE FOREIGN DATA WRAPPER CREATE SERVER CREATE FOREIGN TABLE IMPORT FOREIGN SCHEMA CREATE USER MAPPING Done by: adding generic_option_list_items Test case: CREATE EXTENSION if not exists postgres_fdw; DROP SERVER if exists testserver CASCADE; CREATE SERVER testserver foreign data wrapper postgres_fdw OPTIONS (dbname 'foo',); CREATE USER MAPPING for postgres SERVER testserver OPTIONS (user 'alice', ); CREATE FOREIGN TABLE foo(c1 int) SERVER testserver OPTIONS (schema_name 'bob',); DROP SERVER testserver CASCADE; ======= * alter_generic_option_list Status: fully supported Line: 5644 Used by: similar to above, but modifying FDW-related objects Done by: adding alter_generic_option_list_items Test case: CREATE EXTENSION if not exists postgres_fdw; DROP SERVER if exists testserver CASCADE; CREATE SERVER testserver foreign data wrapper postgres_fdw OPTIONS (dbname 'foo'); ALTER SERVER testserver OPTIONS (SET dbname 'foo2', ); DROP SERVER testserver CASCADE; ======= * TriggerFuncArgs Status: fully supported Line: 6329 Used by: arguments to functions, naturally Done by: adding TriggerFuncArgsItems Test case: CREATE TEMP TABLE t (id int); DROP FUNCTION if exists footrig() CASCADE; CREATE FUNCTION footrig() returns trigger language plpgsql as 'begin return new; end'; CREATE TRIGGER tr after insert on t for each row execute function footrig(1,2,); ======= * event_trigger_value_list: Line: 6438 Status: fully supported Used by: tags for event trigger creations Done by: adding event_trigger_value_list_items Test case: DROP FUNCTION if exists foo() CASCADE; CREATE FUNCTION foo() returns event_trigger language plpgsql as 'begin return;end'; CREATE EVENT TRIGGER tfoo on sql_drop when tag in ('DROP TABLE',) execute function foo(); DROP FUNCTION foo() CASCADE; ======= * def_list Status: fully supported Line: 6661 Used by: "definition": create aggregate, operator, collation, type, search * alter publication, alter subscription alter search dictionary "opt_definition": column constraint unique, primary key, exclude create publication, create subscription, alter subscription Done by: adding def_list_items Test case: DROP OPERATOR if exists === (date,date); CREATE OPERATOR === ( leftarg=date, rightarg=date, function=date_eq, ); DROP OPERATOR === (date,date); CREATE TEMP TABLE t (id int, UNIQUE(id) WITH (fillfactor=42, ) ); DROP PUBLICATION if exists foo; CREATE PUBLICATION foo WITH (publish = 'insert', ); DROP PUBLICATION foo; ======= * old_aggr_list Status: not supported Line: 6680 Extremely old syntax for CREATE AGGREGATE, no need to support this. ======= * enum_val_list Status: fully supported Line: 6707 Used by: enums! Done by: adding enum_val_list_items Test case: CREATE TYPE fooe AS ENUM ('foo', 'bar', ); DROP TYPE fooe; ======= * opcast_item_list Status: fully supported Line: 6830 Used by: create operator class and alter operator family (add) Done by: adding opcast_item_list_items Test case: DROP OPERATOR CLASS if exists oc USING gist; CREATE OPERATOR CLASS oc FOR TYPE int USING gist AS function 1 pi(), ; DROP OPERATOR CLASS oc USING gist; DROP OPERATOR FAMILY if exists ofam USING gist; CREATE OPERATOR FAMILY ofam USING gist; ALTER OPERATOR FAMILY ofam USING gist ADD operator 1 = (int, int), ; DROP OPERATOR FAMILY ofam USING gist; ======= * opclass_drop_list Status: fully supported Line: 6936 Used by: alter operator family (drop) Done by: adding opclass_drop_list_items Test case: DROP OPERATOR FAMILY if exists ofam USING gin; CREATE OPERATOR FAMILY ofam USING gin; ALTER OPERATOR FAMILY ofam USING gin ADD operator 1 = (int, int); ALTER OPERATOR FAMILY ofam USING gin DROP operator 1 (int, int), ; DROP OPERATOR FAMILY ofam USING gin; ======= * any_name_list Status: fully supported Line: 7236 Used by: privileges, text search configuration, DROP 1. privilege_target Test case: CREATE DOMAIN testd1 AS int; CREATE DOMAIN testd2 AS int; GRANT usage ON DOMAIN testd1, testd2, TO public; DROP DOMAIN testd1, testd2; 2. privilege_target Test case: CREATE TEMP TABLE foo1 (id int); CREATE TEMP TABLE foo2 (id int); GRANT usage ON TYPE foo1, foo2, TO public; 3. AlterTSConfigurationStmt Test case: CREATE TEXT SEARCH CONFIGURATION tsc ( copy = simple ); ALTER TEXT SEARCH CONFIGURATION tsc ADD MAPPING FOR tag, blank, WITH simple; DROP TEXT SEARCH CONFIGURATION tsc; 4. DropStmt Test Case: CREATE TEMP TABLE foo(id int); DROP TABLE foo, cascade; ======= * type_name_list Status: fully supported Line: 7251 Used by: multiple "type" items Done by: adding type_name_list_items CREATE TEMP TABLE foo1 (id int); CREATE TYPE foo AS (id int); DROP TYPE foo, cascade; ======= * privilege_list Status: fully supported Line: 7894 Used by: all grant and revoke variants Done by: adding privilege_list_items Test case: CREATE TEMP TABLE t1 (id int); GRANT select, insert, ON t1 TO public; REVOKE select, insert, ON t1 FROM public; ======= * parameter_name_list Status: fully supported Line: 7940 Used by: permissions on parameters Done by: adding parameter_name_list_items Test case: GRANT SET ON PARAMETER work_mem, TO public; ======= * grantee_list Status: fully supported Line: 8158 Used by: GRANT to a list of roles Done by: adding grantee_list_items, %nonassoc GRANTED Test case: CREATE USER alice; CREATE TEMP TABLE t1 (id int); GRANT select ON TABLE t1 TO alice, alice,; GRANT select ON TABLE t1 TO alice, alice, WITH GRANT OPTION; GRANT select ON TABLE t1 TO alice, alice, GRANTED BY current_user; Because GRANT has two optional items at the end of it: opt_grant_grant_option opt_granted_by We need to ensure that 'WITH' and 'GRANTED' have some extra stickiness. The former already has it, but GRANTED was added to the %nonassoc list around line 898 ======= * grant_role_opt_list Status: fully supported Line: 8235 Used by: options when adding one role to another Done by: adding grant_role_opt_list_items, %nonassoc GRANTED Test case: CREATE USER alice; CREATE ROLE commarole; GRANT commarole TO alice WITH admin true, inherit false,; GRANT commarole TO alice WITH admin option, inherit true, GRANTED BY current_user; ======= * index_params Status: fully supported Line: 8439 Used by: list of columns when creating an index Done by: adding index_params_items Test case: CREATE TEMP TABLE t (id int); CREATE INDEX ti1 ON t USING btree (id,); ======= * index_including_params Status: fully supported Line: 8502 Used by: list of columns for covering indexes Done by: adding index_including_params_items Test case: CREATE TEMP TABLE t (id int, email text); CREATE INDEX ti1 ON t (id) INCLUDE (email, ); ======= * func_args_list Status: fully supported Line: 8603 Used by: certain places where we need to reference a function by its args Done by: adding func_args_list_items Test case: CREATE FUNCTION commatest(int) returns int language sql as 'select 1'; COMMENT ON FUNCTION commatest(int,) IS 'Welcome, extra commas!'; DROP FUNCTION commatest(int, ); ======= * function_with_argtypes_list Status: fully supported Line: 8613 Used by: dropping multiple functions at once, assigning privs to multiples Done by: adding function_with_argtypes_list_items, %nonassoc CASCADE RESTRICT Test case: CREATE FUNCTION commatest(int) returns int language sql as 'select 1'; DROP FUNCTION commatest(int),; DROP FUNCTION if exists commatest(int), CASCADE; ======= * func_args_with_defaults_list: Status: fully supported Line: 8665 Used by: list of args when doing a create function only Done by: adding func_args_with_defaults_list_items Test case: CREATE FUNCTION commatest(int, int, ) returns int language sql as ' select 42 '; ======= * aggr_args_list Status: fully supported Line: 8864 Used by: aggregate declaration Done by: adding aggr_args_list_items Test case: CREATE AGGREGATE foo (int, ) (sfunc=gcd, stype=int); DROP AGGREGATE foo(int,); ======= * aggregate_with_argtypes_list Status: fully supported Line: 8881 Used by: operations on multiple aggregates at once Done by: adding aggregate_with_argtypes_list_items, %nonassoc CASCADE RESTRICT Test case: CREATE AGGREGATE foo1 (int) (sfunc=gcd, stype=int); CREATE AGGREGATE foo2 (int) (sfunc=gcd, stype=int); DROP AGGREGATE foo1(int), foo2(int), ; ======= * func_as Status: not supported Line: 9044 Putting this in for completelness, no trailing comma support is needed, as there are only two items ======= * transform_type_list Status: fully supported Line: 9053 Used by: functions that transform types Done by: adding transform_type_list_items Test case: CREATE TRANSFORM FOR int LANGUAGE sql (from sql with function time_support(internal) ); CREATE FUNCTION foo() returns int language sql transform for type int, for type int4, as 'select 1'; DROP TRANSFORM FOR int language sql cascade; ======= * table_func_column_list Status: fully supported Line: 9076 Used by: list of columns for a table-returning function Done by: adding table_func_column_list_items Test case: CREATE FUNCTION foo() RETURNS table(x int,) language sql as 'select 1'; DROP FUNCTION foo(); ======= * oper_argtypes Status: not supported Line: 9323 Used by: arguments to operators ("left" and "right") No support for trailing commas needed, unless we want to get really pedantic ======= * operator_with_argtypes_list Status: fully supported Line: 9293 Used by: dropping multiple operators at once Done by: adding operator_with_argtypes_list_items, %nonassoc CASCADE RESTRICT Test case: CREATE OPERATOR === ( leftarg=date, rightarg=date, function=date_eq); CREATE OPERATOR ==== ( leftarg=date, rightarg=date, function=date_eq); DROP OPERATOR === (date,date), ==== (date, date), ; ======= * operator_def_list Status: fully supported Line: 10521 Used by: modifying an existing operator Done by: adding operator_def_list_items Test case: CREATE OPERATOR === ( leftarg=date, rightarg=date, function=date_eq); ALTER OPERATOR === (date, date) SET (hashes, ); DROP OPERATOR === (date, date); ======= * pub_obj_list Status: fully supported Line: 10929 Used by: create and alter publications Done by: adding pub_obj_list_items Test case: CREATE TABLE foo1 (id int); CREATE TABLE foo2 (id int); CREATE PUBLICATION p FOR TABLE foo1, table foo2, ; DROP PUBLICATION p; DROP TABLE foo1, foo2; ======= * pub_obj_type_list Status: fully supported Line: 10950 Used by: create publication (as of v19 only) Done by: adding pub_obj_type_list_items (also cleaned up nearby indentation issue) Test case: CREATE PUBLICATION p FOR ALL TABLES, ALL SEQUENCES; DROP PUBLICATION p; ======= * notify_payload Status: not supported Line: 11335 Used by: notify with a channel plus a payload Seems not needed, given that this is not really a list of items per se, just an optional payload. ======= * transaction_mode_list Status: fully supported Line: 11462 Used by: set transaction Done by: adding transaction_mode_list_items Test case: BEGIN WORK deferrable, isolation level serializable, ; ROLLBACK; ======= * drop_option_list Status: fully supported Line: 11756 Used by: drop database only Done by: adding drop_option_list_items Test case: DROP DATABASE bob with (force,force,); Only option right now is "force" but this is for future-proofing things. ======= * vacuum_relation_list Status: fully supported Line: 12199 Used by: vacuum multiple things at once Done by: adding vacuum_relation_list_items Test case: VACUUM pg_am, pg_proc, ; ======= * insert_column_list Status: fully supported Line: 12480 Used by: your basic insert statement Done by: adding insert_column_list_items Test case: CREATE TEMP TABLE t (id int); INSERT INTO t(id,) VALUES (1); ======= * returning_options Status: not supported Line: 12641 Used by: insert that uses RETURNING WITH Does not seem worth it, as we only support OLD and NEW ======= * set_clause_list Status: fully supported Line: 12686 Used by: UPDATE .. SET Done by: adding set_clause_list_items Test case: CREATE TEMP TABLE t (id int); UPDATE t SET id = 1, WHERE id <> 0; ======= * set_target_list Status: fully supported Line: 12731 Used by: SET a bunch of things at once inside parens Done by: adding set_target_list_items Test case: CREATE TEMP TABLE t (id int); UPDATE t SET (id,) = ROW(1); ======= * cte_list Status: not supported Line: 13287 Used by: chaining multiple CTEs together This one is not likely to be supported, there is way too much ambiguity. ======= * sortby_list Status: partially supported Line: 13407 Used by: ORDER BY and json_array_aggregate_order_by_clause_opt Done by: adding sortby_list_items and a new sortby_list_no_trailing_comma Test case: SELECT * FROM pg_language ORDER BY 1,2,3, LIMIT 1; This one needed to be split into two versions, as the "normal" ORDER BY did just fine with adding a comma at the end of the list. The json aggregate however, spit up shift/reduce errors. That's a rather niche usage of ORDER BY, so at the end of the day, I decided to support the 99% usage and leave the json one alone. ======= * group_by_list Status: fully supported Line: 13782 Used by: group by, of course Done by: adding group_by_list_items Test case: SELECT datname, count(*) FROM pg_database GROUP BY 1, ; ======= * from_list Status: fully supported Line: 13786 Used by: list of tables in a from clause Done by: adding from_list_items Test case: SELECT count(*) FROM pg_am, pg_proc, ; ======= * relation_expr_list Status: fully supported Line: 14144 Used by: import foreign schema, truncate tables, lock tables Done by: adding relation_expr_list_items, %nonassoc RESTART CONTINUE_P Not completely happy about having to add two more keywords just to support TRUNCATE, but TRUNCATE is a rather important command, so I think it is worth it. Test case: CREATE TEMP TABLE t1 (id int); CREATE TEMP TABLE t2 (id int); TRUNCATE TABLE t1, t2, ; TRUNCATE TABLE t1, t2, CONTINUE IDENTITY; LOCK TABLE pg_am, pg_proc, NOWAIT; There is a little bit of ambiguity there as there is a very weak use case for doing what that LOCK TABLE above used to do: apply the default lock mode to three tables, one of which is named "nowait". But "nowait" is a dumb name for a table, so I think caveat emptor applies here. The same thing applies to some of the other examples, e.g. having a table named "CASCADE") ======= * rowsfrom_list Status: fully supported Line: 14243 Used by: rows from a list - see below Done by: adding rowsfrom_list_items Test case: SELECT * FROM ROWS FROM ( abs(1), abs(2), ); ======= * TableFuncElementList Status: fully supported Line: 14283 Used by: aliases for functions with declared list of columns Done by: adding TableFuncElementListItems Test case: SELECT * FROM jsonb_to_record('{"foo": 10}') AS x (foo int, ); ======= * xmltable_column_list Status: fully supported Line: 14343 Used by: The weird xmltable function Done by: adding xmltable_column_list_items Test case: WITH xmldata(data) AS (VALUES (''::xml)) SELECT xmltable.* FROM XMLTABLE(xmlnamespaces('https://xmlsux' AS x), '/x:aa/x:item' passing (select data from xmldata) COLUMNS foo int path '@foo', ); ======= * xml_namespace_list Status: fully supported Line: 14460 Used by: xml stuff Done by: adding xml_namespace_list_items Test case: WITH xmldata(data) AS (VALUES (''::xml)) SELECT xmltable.* FROM XMLTABLE(xmlnamespaces('https://xmlsux' AS x, ), '/x:aa/x:item' passing (select data from xmldata) COLUMNS foo int path '@foo' ); ======= * json_table_column_definition_list: Status: fully supported Line: 14518 Used by: Done by: adding json_table_column_definition_list_items Test case: SELECT * from json_table('{"id": 123}', '$[*]' columns (id int path '$.id',)); ======= * xml_attribute_list Status: fully supported Line: 16480 Used by: XML stuff Done by: adding xml_attribute_list_items Test case: SELECT xmlforest(1 as is, ); ======= * window_definition_list Status: fully supported Line: 16832 Used by: Done by: Test case: SELECT 1 from pg_database window foo as (partition by oid), ; ======= * expr_list Status: partially supported Line: 16903 Used by: lots of things - will break down each one Done by: adding expr_list_items, plus expr_list_no_trailing_comma 1. list and range partition definitions Supported. Test case: CREATE TEMP TABLE t1 (id int) partition by list (id); CREATE TEMP TABLE t2 partition of t1 for values in (1,2,); CREATE TEMP TABLE t3 (id int, id2 int) partition by range (id, id2); CREATE TEMP TABLE t4 partition of t3 for values from (1,2,) to (6,7,); 2. execute parameters Supported. Test case: PREPARE foo as select $1; EXECUTE foo (1, ); DEALLOCATE foo; 3. merge values Supported. Test case: CREATE TEMP TABLE t (id int); MERGE INTO t USING (values (1)) on (true) when not matched then insert (id) values (42,); 4. distinct on Supported. Test case: SELECT distinct on (prolang,) prolang from pg_proc; 5. rollup and cube Supported. Test case: SELECT relkind, relnamespace, count(*) from pg_class group by rollup(1,2,); SELECT relkind, relnamespace, count(*) from pg_class group by cube(1,2,); 6. values Supported. Test case: SELECT * FROM (values(1,2,), (3,4,) ); 7. tablesample Supported. Test case: SELECT relname from pg_class tablesample bernoulli (1,); Yes, I know bernoulli only accepts a single arg anyway. 8. generic type modifiers Supported. Test case: SELECT 123::numeric(10, ); 9. bit type with a length Supported. Test case: SELECT 42::bit(8,); 10. general expression foo in (list) and not in (list) Supported. Test case: SELECT 1 IN (1,2,3,); SELECT 1 NOT IN (1,2,3,); 11. grouping Supported. Test case: SELECT relkind, GROUPING(relkind,), count(*) from pg_class group by 1; 12. coalesce, greatest, least Supported. Test case: SELECT COALESCE(1,2, ); SELECT GREATEST(42, 24,); SELECT LEAST(42, 24,); 13. xmlconcat, xmlelement Supported. Test case: SELECT XMLCONCAT('1'::xml, '2'::xml, ); SELECT XMLELEMENT(name foo, 'fizz', 'buzz',); 14. partition by inside a window Supported. Test case: SELECT lag(oid) over(PARTITION BY 1,2,) from pg_am; 15. ROW PARTIALLY supported. ROW is a tricky case. In the end, I was only able to reliably get the explicit_row to work with a hard-coded comma variant. On the other hand, that's a pretty common form, so I'm happy overall. Test case: SELECT ROW(1,2,3,); /* Still fails: SELECT (1,2,3,); */ 16. array lists Supported. Test case: SELECT ARRAY[1,2,3,]; 17. trim list Supported. Test case: SELECT TRIM(both from 'abba', 'a', ); Not particularly useful, but it's kinda built-in with the expr_list. This is the end of expr_list! ======= * func_arg_list Not to be confused with func_args_list, way back around line 8600! Status: partially supported Line: 17036 Used by: arguments to functions Done by: func_arg_list_items, func_arg_list_no_trailing_comma Test case: /* Works for simple variants: */ CREATE PROCEDURE foo(int) language sql as 'select 1'; CALL foo(1,); CALL foo(ALL 1,); DROP PROCEDURE foo(int); This is only partly supported, due to the weird way in which we can call functions, but I think the main cases are covered well enough. ======= * type_list Status: fully supported Line: 16954 Used by: prepare arguments Done by: adding type_list_items Test case: PREPARE foo(int,) AS select $1; ======= * array_expr_list Status: fully supported Line: 16972 Used by: multiple array items Done by: adding array_expr_list_items Test case: SELECT ARRAY[ [1],[2], ]; ======= * json_arguments Status: not supported Line: 17334 Test case: SELECT JSON_VALUE(jsonb '[]', '$' PASSING 1 as x, 2 as y,); Only used in a relatively obscure command; lots of shift/reduce conflicts; not worth the effort ======= * json_name_and_value_list Status: not supported Line: 17496 Test case: SELECT json_object(1:2,3:4,); As above, too many shift/reduce conflicts as there are many post-comma opttions. ======= * json_value_expr_list: Status: not supported Line: 17529 Test case: SELECT json_array(1,2,3,); Continuing our json trend, we cannot support this one either ======= * target_list Status: fully supported Line: 17456 Used by: select a list of things Done by: adding target_list_items Test case: SELECT 1,2,3, ; ======= * qualified_name_list Status: fully supported Line: 17507 Used by: Done by: adding qualified_name_list_items, %nonassoc DEFERRED IMMEDIATE SKIP NOWAIT This important clause was a little tricky and requires some %nonassoc magic 1. set constraints (see ConstraintsSetStmt) The full syntax is: SET CONSTRAINTS constraints_set_list constraints_set_mode where contraints_set_list contains our qualified name list, and the mode can be DEFERRED or IMMEDIATE. So we add those two as %nonassoc Test case: CREATE TEMP TABLE foo(x int, y int); ALTER TABLE foo add constraint xplus check(x > 0), add constraint yplus check(y > 0); BEGIN; SET CONSTRAINTS xplus, yplus, immediate; ROLLBACK; 2. table inheritance list (see CreateStmt) Test case: CREATE TEMP TABLE foo() INHERITS (pg_proc, ); 3. grant/revoke list of items (see privilege_target) Test case: GRANT select on table pg_class, to public; 4. Locking multiple objects (see for_locking_item) Test case: SELECT 1 from pg_database, pg_am for update of pg_database nowait limit 1; SELECT 1 from pg_database, pg_am for update of pg_database, nowait limit 1; SELECT 1 from pg_database, pg_am for update of pg_database, pg_am nowait limit 1; SELECT 1 from pg_database, pg_am for update of pg_database, pg_am, nowait limit 1; Since the list here is followed by some optional items, we needed to add those to %nonassoc: SKIP NOWAIT ======= * name_list Status: fully supported Line: 17701 Used by: tons of things that need, well, a list of names Done by: adding name_list_items, %nonassoc RESTRICT CASCADE REVOKE REPLACE Test case: GRANT USAGE on schema public, TO public; ======= * role_list Status: fully supported Line: 17753 Used by: list of roles (e.g. to grant multiple roles at once) Done by: adding role_list_items, plus large %nonassoc list: CONNECTION INHERIT ENCRYPTED ADMIN PASSWORD ROLE SYSID UNENCRYPTED VALID Test case: GRANT pg_monitor TO alice, ; I don't like adding so many %nonassoc for just this one simple case, but I think it is warranted as a list of role is pretty common. That's the end of the list! Congratulations on reaching this far, even if you simply scrolled to the bottom without reading everything! :) The total number of changes was not too bad, just spread out a lot: $ git log --oneline -1 --shortstat 95a599b62a7 (HEAD -> comma,commma,commma,comma,chameleon, master) Provide support for trailing commas, where possible and practical. 1 file changed, 564 insertions(+), 305 deletions(-) --00000000000060410f0647be2067 Content-Type: text/html; charset="UTF-8" Content-Transfer-Encoding: quoted-printable
tl;dr Provide support for trailing c= ommas, where possible and practical.

(Disclaimer: No LLM or AI was u= sed to craft this patch or this email)

Happy New Year! Please find a= ttached a patch to provide comprehensive trailing comma support, where we a= llow (when possible) a comma that does NOT come before the next item in a l= ist. To wit:

SELECT 1,2,3, FROM pg_class, ORDER BY greatest(relpages= ,1,);

This is not as trivial a task as it seems, as those who have d= abbled with our parser (or parsers in general) may suspect. At the end of t= he day, however, 99% of the places in which we use a comma for a list of it= ems now have support for trailing commas.

Most of this email is an i= tem by item breakdown of each occurance of commas with the gram.y file (in = order), how it was solved, and a quick example showing the newly supported = syntax.

The overall approach is to break the existing lists into two= lists, the new one with a suffix of "_items", and put the option= al trailing comma at the end of that new list. For example, here's how = I solved utility_option_list. It used to look like this:

utility_opt= ion_list:
=C2=A0 utility_option_elem =C2=A0{ $$ =3D list_make1($1); }=C2=A0 | utility_option_list ',' utility_option_elem =C2=A0{ $$ = =3D lappend($1, $3); }
;

Now it looks like this:

utility_o= ption_list:
=C2=A0 utility_option_list_items opt_trailing_comma =C2=A0{ = $$ =3D $1; }
;

utility_option_list_items:
=C2=A0 utility_optio= n_elem =C2=A0{ $$ =3D list_make1($1); }
=C2=A0 | utility_option_list_ite= ms ',' utility_option_elem =C2=A0{ $$ =3D lappend($1, $3); }
;
Where opt_trailing_comma is:

opt_trailing_comma:
=C2=A0 = 9;,' =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0{ $$ =3D NULL; }
=C2= =A0 | /* EMPTY */ =C2=A0{ $$ =3D NULL; }
;

That system satisfies = most of the grammar, but there were some problematic spots that caused the = ol' shift/reduce conflict that is the bane of those editing gram.y.
First, I made our commas a little more special with:

%left =C2= =A0','

Second, I added some new items to the %nonassoc lists= . They are detailed below as added, but the basic need is because lists of = things in Postgres often have some optional modifiers. For example, TRUNCAT= E takes a list of table to truncate, but also allows the CASCADE keyword. F= urther, we do not prevent people from creating a table named "cascade&= quot;, so this command will truncate two tables:

TRUNCATE TABLE foob= ar, cascade;

This command will truncate one table, and cascade to ot= her tables as needed:

TRUNCATE TBALE foobar cascade;

Trailing= comma allows us to call a list of tables, and end with a comma:

TRU= NCATE TBALE foobar, foobaz, ;

However, we now have some ambiguity (i= .e. shift/reduce conflicts) because "TRUNCATE TABLE foobar, cascade;&q= uot; can now indicate truncating two tables, or one table (with a trailing = comma), plus the cascade keyword. This is solved by this patch in favor of = the latter interpretation. In other words, when there is a trailing comma, = the list is not greedy.

Luckily, the number of places needing such t= weaks is small. There are a few places where trailing comma support was war= ranted too technically difficult and/or not worth the trouble - they are al= l documented below.

Each section below includes an approximate line = number, simply to help reviewers find the location easier, as it is a big f= ile. I've not consolidated all of the test cases into a single regressi= on test, but am open to the idea (I'm not convinced it is needed).
<= br>Cheers,
Greg


=3D=3D=3D=3D=3D=3D=3D
* utility_option_lis= t

Status: fully supported

Line: 1160

Used by: CHECKPOI= NT, REINDEX, CLUSTER, VACUUM, ANALYZE, EXPLAIN

Test cases (should fa= il on head, but work with this patch):

=C2=A0 EXPLAIN (verbose, form= at yaml, ) select 1;

=C2=A0 ANALYZE (skip_locked,verbose,) pg_class;=


=3D=3D=3D=3D=3D=3D=3D
* var_list

Status: not supporte= d

Line: 1854

Used by generic_set, but there a lot of shift/re= duce conflicts. For example:

alter function foo() set search_path = =3D public, abc immutable;

alter function foo() set search_path =3D = public, abc, immutable;

If we allow trailing commas, would immutable= be the name of the schema or the SET modifier?

In theory we could c= reate a new list to allow trailing commas on simpler items, e.g.:

al= ter system set log_destination =3D stderr,csvlog,;

But I feel like t= his is going too far, so I left this one alone.


=3D=3D=3D=3D=3D= =3D=3D
* alter_table_cmds

Status: fully supported

Line: 23= 86

Used by ALTER TABLE to support multiple actions.
Also ALTER IN= DEX, ALTER SEQUENCE, ALTER VIEW, ALTER MATERIALIZED VIEW, ALTER FOREIGN TAB= LE

Test case:

=C2=A0 CREATE TABLE t(id int);
=C2=A0 ALTER = TABLE t ADD foo INT, ADD bar INT,;


=3D=3D=3D=3D=3D=3D=3D
* re= loption_list

Status: fully supported

Line: 3192

Used b= y: reloptions and opt_reloptions to support SET() items for ALTER TABLE, CREATE INDEX, CREATE VIEW, and a few others.

Test cases:

= =C2=A0 ALTER TABLE foo SET (fillfactor=3D50,);

=C2=A0 CREATE INDEX i= 1 ON t(id) WITH (fillfactor=3D50, deduplicate_items=3Doff,);


=3D= =3D=3D=3D=3D=3D=3D
* hash_partbound

Status: fully supported
Line: 3363

Used by: partitioning FOR VALUES WITH ()

Test ca= ses:

=C2=A0 CREATE TABLE p(id INT) PARTITION BY hash(id);

=C2= =A0 CREATE TABLE c PARTITION OF p FOR VALUES WITH (remainder 1, modulus 4,)= ;


=3D=3D=3D=3D=3D=3D=3D
* alter_type_cmds

Status: full= y supported

Line: 3394

Used by: ALTER TYPE foo xxx

TES= T CASE:

=C2=A0 CREATE TYPE mytype AS (id int);
=C2=A0 ALTER TYPE = mytype ADD attribute id2 int, ADD attribute id3 int, ;


=3D=3D=3D= =3D=3D=3D=3D
* copy_generic_opt_list

Line: 3678

Used by: C= OPY ... WITH ()

Test case:

=C2=A0 COPY pg_language(oid,lannam= e) TO stdout WITH (header, format csv,);


=3D=3D=3D=3D=3D=3D=3D* copy_generic_opt_arg_list

Status: fully supported

Line: 3= 705

Used by: COPY WITH ( force_quote( [, ...] ) )

Test case:<= br>
=C2=A0 COPY pg_language(oid, lanname) TO stdout WITH (format csv, fo= rce_quote(oid,lanname, ) );


=3D=3D=3D=3D=3D=3D=3D
* TableElem= entList

Status: fully supported

Line: 3898

Test case:<= br>
=C2=A0 CREATE TEMP TABLE foo(id int,);


=3D=3D=3D=3D=3D=3D= =3D
* TypedTableElementList

Status: fully supported

Line: = 3908

Test case:

=C2=A0 CREATE TYPE abc AS (id int, id2 int);<= br>=C2=A0 CREATE TABLE mytype OF abc (id default 1, id2 default 3,);

=3D=3D=3D=3D=3D=3D=3D
* columnList

Status: partially support= ed

Line: 4542

In order:

1. UNIQUE constraints and PRIM= ARY KEY

Needed to modify opt_without_overlaps to add the optional co= mma directly:

opt_without_overlaps:
=C2=A0 =C2=A0',' =C2= =A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0{ $$ =3D = false; }
=C2=A0 =C2=A0| WITHOUT OVERLAPS =C2=A0 =C2=A0 { $$ =3D true; }<= br>=C2=A0 =C2=A0| ',' WITHOUT OVERLAPS { $$ =3D true; }
=C2=A0 = =C2=A0| /*EMPTY*/ =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0{ $$ =3D false; = }
=C2=A0 =C2=A0;

Test case:

=C2=A0 CREATE TEMP TABLE t (c1= int4range, c2 int4range);
=C2=A0 ALTER TABLE t ADD CONSTRAINT test1 UNI= QUE (c1, c2);
=C2=A0 ALTER TABLE t ADD CONSTRAINT test2 UNIQUE (c1, c2,)= ;
=C2=A0 ALTER TABLE t ADD CONSTRAINT test3 UNIQUE (c1, c2 WITHOUT OVERL= APS);
=C2=A0 ALTER TABLE t ADD CONSTRAINT test4 UNIQUE (c1, c2, WITHOUT = OVERLAPS);
=C2=A0 ALTER TABLE t ADD PRIMARY KEY (c1, c2, );


2= . FOREIGN KEY

As above, but we modify optionalPeriodName to allow a = leading comma.

Also add %nonassoc PERIOD

optionalPeriodName:<= 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{ $$ =3D NULL; }
=C2=A0 =C2=A0| PERIOD co= lumnElem =C2=A0 =C2=A0 =C2=A0{ $$ =3D $3; }
=C2=A0 =C2=A0| ',' P= ERIOD columnElem =C2=A0{ $$ =3D $3; }
=C2=A0 =C2=A0| /*EMPTY*/ =C2=A0 = =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0{ $$ =3D NULL; }
=C2=A0 ;
Test case:

=C2=A0 CREATE TEMP TABLE t (id INT PRIMARY KEY);
=C2= =A0 CREATE TEMP TABLE t2 (id INT,
=C2=A0 =C2=A0 CONSTRAINT tempo1 FOREI= GN KEY(id,) REFERENCES t (id,));

=C2=A0 CREATE temp TABLE t3 (id INT= 4RANGE, valid_at DATERANGE,
=C2=A0 =C2=A0 CONSTRAINT t3_pk PRIMARY KEY (= id, valid_at, WITHOUT OVERLAPS));

=C2=A0 CREATE temp TABLE t4 (id IN= T4RANGE, valid_at DATERANGE,
=C2=A0 =C2=A0 CONSTRAINT t4_fk FOREIGN KEY = (id, PERIOD valid_at)
=C2=A0 =C2=A0 REFERENCES t3 (id, PERIOD valid_at))= ;

3. opt_column_list

Many sub-items for this

3.1 CopyS= tmt

Test case:

=C2=A0 COPY pg_language (lanowner,) TO stdout;=


3.2 copy_opt_item FORCE_QUOTE

Test case:

=C2=A0 = =C2=A0COPY pg_language (lanowner) TO stdout WITH (format csv, FORCE_QUOTE (= lanowner,) );


3.3 copy_opt_item FORCE_NULL

Test case:
=
=C2=A0 CREATE TEMP TABLE T (foo TEXT);
=C2=A0 COPY t FROM program &#= 39;echo abc' WITH (format csv, FORCE_NULL (foo, ) );

3.4 ColCons= traintElem REFERENCES

Test case:

=C2=A0 CREATE TEMP TABLE t (= id INT PRIMARY KEY);
=C2=A0 CREATE TEMP TABLE t2 (id INT CONSTRAINT temp= o REFERENCES t (id,));

3.5 key_action (e.g. SET NULL)

Test ca= se:

=C2=A0 CREATE TEMP TABLE t (id INT PRIMARY KEY);
=C2=A0 CREAT= E TEMP TABLE t2 (id INT CONSTRAINT tempo REFERENCES t (id) ON DELETE SET NU= LL (id,) );

3.6 create_as_target

Test case:

=C2=A0 CRE= ATE TEMP TABLE t (id,) AS select 123;

3.7 create_mv_target:

T= est case:

=C2=A0 CREATE MATERIALIZED VIEW t(id,) AS select 123;
= =C2=A0 DROP MATERIALIZED VIEW t;

3.8 privileges

Test case:
=C2=A0 CREATE TEMP TABLE t (id INT);
=C2=A0 GRANT SELECT (id, ) ON = TABLE t TO public;

3.9 PublicationObjSpec

Test case:

= =C2=A0 CREATE TABLE t(id INT);
=C2=A0 CREATE TABLE t2(id INT);
=C2=A0= CREATE PUBLICATION p FOR TABLE t(id,);
=C2=A0 DROP PUBLICATION p;
= =C2=A0 CREATE PUBLICATION p FOR TABLE t *, ONLY t2 (id,);
=C2=A0 DROP PU= BLICATION p;
=C2=A0 DROP TABLE t;

3.10 ViewStmt:

Test case= :

=C2=A0 CREATE TEMP VIEW t (id, ) AS select 123;

4. opt_colu= mn_and_period_list: =C2=A0'(' columnList optionalPeriodName ')&= #39;

Test case: see #3 "FOREIGN KEY" above

5. opt_c= _include: INCLUDE '(' columnListOptionalComma ')'

Te= st case:

=C2=A0 CREATE TEMP TABLE t (id INT, id2 INT);
=C2=A0 ALT= ER TABLE t ADD CONSTRAINT u1 UNIQUE (id) INCLUDE (id2,);

6. TriggerO= neEvent

Test case:

=C2=A0 CREATE TEMP TABLE t (id int, id2 in= t);
=C2=A0 CREATE FUNCTION f() returns trigger language plpgsql as '= begin return new; end';
=C2=A0 CREATE TRIGGER tr1 after UPDATE OF id= , ON t for each row execute function f();
=C2=A0 drop function f() casca= de;


7. privileges for columns

Test case:

=C2=A0 CR= EATE TEMP TABLE t(id int);
=C2=A0 GRANT ALL (id, ) on table t to public;=


8. ViewStmt

Test case:

=C2=A0 CREATE recursive VI= EW v (id,) as select 123;


9. opt_search_clause

Test case:=

=C2=A0 WITH RECURSIVE x AS (select 123 as id union all select * fro= m x)
=C2=A0 =C2=A0 SEARCH DEPTH FIRST BY id, SET foo select * from x lim= it 1;

Also added a "depth_or_breadth" to refactor the opt_= search_clause first


10. opt_cycle_clause

Test case:
=C2=A0 WITH RECURSIVE x AS (select 123 as id union all select * from x)=C2=A0 =C2=A0 CYCLE id, SET id2 to 3 default 1 using id3 select * from x = limit 1;


End of columnList!


=3D=3D=3D=3D=3D=3D=3D
= * ExclusionConstraintList

Status: fully supported

Line: 4585<= br>
Used by: EXCLUDE

Done by: adding ExclusionConstraintListItems=

Test case:

=C2=A0 CREATE TEMP TABLE tt(id int, EXCLUDE (id W= ITH =3D), );


=3D=3D=3D=3D=3D=3D=3D
* part_params

Statu= s: fully supported

Line: 4739

Used by: PartitionSpect etc. - = only when creating partitioned tables

Done by: adding part_params_it= ems

Test case:

=C2=A0 CREATE TEMP TABLE t(id int) PARTITION = BY hash (id,);


=3D=3D=3D=3D=3D=3D=3D
* stats_params

St= atus: fully supported

Line: 4859

Used by: create statistics
Done by: adding stats_params_items

Test case:

=C2=A0 CR= EATE TEMP TABLE t1(id int, id2 int);
=C2=A0 CREATE STATISTICS ON id, id2= , FROM t1;


=3D=3D=3D=3D=3D=3D=3D
* NumericOnly_list

St= atus: not supported

Line; 5188

Only used to set permissions o= n large objects, not worth the effort


=3D=3D=3D=3D=3D=3D=3D
*= generic_option_list

Status: fully supported

Line: 5628
Used by: create_generic_options for FDW items, e.g.
=C2=A0 CREATE FORE= IGN DATA WRAPPER
=C2=A0 CREATE SERVER
=C2=A0 CREATE FOREIGN TABLE
= =C2=A0 IMPORT FOREIGN SCHEMA
=C2=A0 CREATE USER MAPPING

Done by: = adding generic_option_list_items

Test case:

=C2=A0 CREATE EXT= ENSION if not exists postgres_fdw;
=C2=A0 DROP SERVER if exists testserv= er CASCADE;
=C2=A0 CREATE SERVER testserver foreign data wrapper postgre= s_fdw OPTIONS (dbname 'foo',);
=C2=A0 CREATE USER MAPPING for po= stgres SERVER testserver OPTIONS (user 'alice', );
=C2=A0 CREATE= FOREIGN TABLE foo(c1 int) SERVER testserver OPTIONS (schema_name 'bob&= #39;,);
=C2=A0 DROP SERVER testserver CASCADE;


=3D=3D=3D=3D= =3D=3D=3D
* alter_generic_option_list

Status: fully supported
=
Line: 5644

Used by: similar to above, but modifying FDW-related = objects

Done by: adding alter_generic_option_list_items

Test = case:

=C2=A0 CREATE EXTENSION if not exists postgres_fdw;
=C2=A0 = DROP SERVER if exists testserver CASCADE;
=C2=A0 CREATE SERVER testserve= r foreign data wrapper postgres_fdw OPTIONS (dbname 'foo');

= =C2=A0 ALTER SERVER testserver OPTIONS (SET dbname 'foo2', );
=C2=A0 DROP SERVER testserver CASCADE;

=3D=3D=3D=3D=3D=3D=3D
* = TriggerFuncArgs

Status: fully supported

Line: 6329

Use= d by: arguments to functions, naturally

Done by: adding TriggerFuncA= rgsItems

Test case:

=C2=A0 CREATE TEMP TABLE t (id int);
= =C2=A0 DROP FUNCTION if exists footrig() CASCADE;
=C2=A0 CREATE FUNCTION= footrig() returns trigger language plpgsql as 'begin return new; end&#= 39;;
=C2=A0 CREATE TRIGGER tr after insert on t for each row execute fun= ction footrig(1,2,);


=3D=3D=3D=3D=3D=3D=3D
* event_trigger_va= lue_list:

Line: 6438

Status: fully supported

Used by: = tags for event trigger creations

Done by: adding event_trigger_value= _list_items

Test case:

=C2=A0 DROP FUNCTION if exists foo() C= ASCADE;
=C2=A0 CREATE FUNCTION foo() returns event_trigger language plpg= sql as 'begin return;end';
=C2=A0 CREATE EVENT TRIGGER tfoo on s= ql_drop when tag in ('DROP TABLE',) execute function foo();
=C2= =A0 DROP FUNCTION foo() CASCADE;


=3D=3D=3D=3D=3D=3D=3D
* def_= list

Status: fully supported

Line: 6661

Used by:
= =C2=A0 "definition":
=C2=A0 =C2=A0 create aggregate, operator,= collation, type, search *
=C2=A0 =C2=A0 alter publication, alter subscr= iption
=C2=A0 =C2=A0 alter search dictionary
=C2=A0 "opt_definit= ion":
=C2=A0 =C2=A0 column constraint unique, primary key, exclude<= br>=C2=A0 =C2=A0 create publication, create subscription, alter subscriptio= n

Done by: adding def_list_items

Test case:

=C2=A0 DRO= P OPERATOR if exists =3D=3D=3D (date,date);
=C2=A0 CREATE OPERATOR =3D= =3D=3D ( leftarg=3Ddate, rightarg=3Ddate, function=3Ddate_eq, );
=C2=A0 = DROP OPERATOR =3D=3D=3D (date,date);

=C2=A0 CREATE TEMP TABLE t (id = int, UNIQUE(id) WITH (fillfactor=3D42, ) );

=C2=A0 DROP PUBLICATION = if exists foo;
=C2=A0 CREATE PUBLICATION foo WITH (publish =3D 'inse= rt', );
=C2=A0 DROP PUBLICATION foo;


=3D=3D=3D=3D=3D=3D= =3D
* old_aggr_list

Status: not supported

Line: 6680
Extremely old syntax for CREATE AGGREGATE, no need to support this.

=3D=3D=3D=3D=3D=3D=3D
* enum_val_list

Status: fully support= ed

Line: 6707

Used by: enums!

Done by: adding enum_val= _list_items

Test case:

=C2=A0 CREATE TYPE fooe AS ENUM ('= foo', 'bar', );
=C2=A0 DROP TYPE fooe;


=3D=3D=3D= =3D=3D=3D=3D
* opcast_item_list

Status: fully supported

Li= ne: 6830

Used by: create operator class and alter operator family (a= dd)

Done by: adding opcast_item_list_items

Test case:

= =C2=A0 DROP OPERATOR CLASS if exists oc USING gist;
=C2=A0 CREATE OPERAT= OR CLASS oc FOR TYPE int USING gist AS function 1 pi(), ;
=C2=A0 DROP OP= ERATOR CLASS oc USING gist;

=C2=A0 DROP OPERATOR FAMILY if exists of= am USING gist;
=C2=A0 CREATE OPERATOR FAMILY ofam USING gist;
=C2=A0 = ALTER OPERATOR FAMILY ofam USING gist ADD operator 1 =3D (int, int), ;
= =C2=A0 DROP OPERATOR FAMILY ofam USING gist;


=3D=3D=3D=3D=3D=3D= =3D
* opclass_drop_list

Status: fully supported

Line: 6936=

Used by: alter operator family (drop)

Done by: adding opclas= s_drop_list_items

Test case:

=C2=A0 DROP OPERATOR FAMILY if e= xists ofam USING gin;
=C2=A0 CREATE OPERATOR FAMILY ofam USING gin;
= =C2=A0 ALTER OPERATOR FAMILY ofam USING gin ADD operator 1 =3D (int, int);<= br>=C2=A0 ALTER OPERATOR FAMILY ofam USING gin DROP operator 1 (int, int), = ;
=C2=A0 DROP OPERATOR FAMILY ofam USING gin;


=3D=3D=3D=3D=3D= =3D=3D
* any_name_list

Status: fully supported

Line: 7236<= br>
Used by: privileges, text search configuration, DROP

1. privi= lege_target

Test case:

=C2=A0 CREATE DOMAIN testd1 AS int;=C2=A0 CREATE DOMAIN testd2 AS int;
=C2=A0 GRANT usage ON DOMAIN testd1= , testd2, TO public;
=C2=A0 DROP DOMAIN testd1, testd2;


2. pr= ivilege_target

Test case:

=C2=A0 CREATE TEMP TABLE foo1 (id i= nt);
=C2=A0 CREATE TEMP TABLE foo2 (id int);
=C2=A0 GRANT usage ON TY= PE foo1, foo2, TO public;

3. AlterTSConfigurationStmt

Test ca= se:

=C2=A0 CREATE TEXT SEARCH CONFIGURATION tsc ( copy =3D simple );=
=C2=A0 ALTER TEXT SEARCH CONFIGURATION tsc ADD MAPPING FOR tag, blank, = =C2=A0WITH simple;
=C2=A0 DROP TEXT SEARCH CONFIGURATION tsc;

4. = DropStmt

Test Case:

=C2=A0 CREATE TEMP TABLE foo(id int);
= =C2=A0 DROP TABLE foo, cascade;

=3D=3D=3D=3D=3D=3D=3D
* type_name= _list

Status: fully supported

Line: 7251

Used by: mult= iple "type" items

Done by: adding type_name_list_items
=
=C2=A0 CREATE TEMP TABLE foo1 (id int);
=C2=A0 CREATE TYPE foo AS (i= d int);
=C2=A0 DROP TYPE foo, cascade;


=3D=3D=3D=3D=3D=3D=3D<= br>* privilege_list

Status: fully supported

Line: 7894
Used by: all grant and revoke variants

Done by: adding privilege_li= st_items

Test case:

=C2=A0 CREATE TEMP TABLE t1 (id int);
= =C2=A0 GRANT select, insert, ON t1 TO public;
=C2=A0 REVOKE select, inse= rt, ON t1 FROM public;


=3D=3D=3D=3D=3D=3D=3D
* parameter_name= _list

Status: fully supported

Line: 7940

Used by: perm= issions on parameters

Done by: adding parameter_name_list_items
<= br>Test case:

=C2=A0 GRANT SET ON PARAMETER work_mem, TO public;
=

=3D=3D=3D=3D=3D=3D=3D
* grantee_list

Status: fully suppor= ted

Line: 8158

Used by: GRANT to a list of roles

Done = by: adding grantee_list_items, %nonassoc GRANTED

Test case:

= =C2=A0 CREATE USER alice;
=C2=A0 CREATE TEMP TABLE t1 (id int);
=C2= =A0 GRANT select ON TABLE t1 TO alice, alice,;
=C2=A0 GRANT select ON TA= BLE t1 TO alice, alice, WITH GRANT OPTION;
=C2=A0 GRANT select ON TABLE = t1 TO alice, alice, GRANTED BY current_user;

Because GRANT has two o= ptional items at the end of it:
opt_grant_grant_option opt_granted_by
We need to ensure that 'WITH' and 'GRANTED' have some = extra stickiness. The former
already has it, but GRANTED was added to t= he %nonassoc list around line 898


=3D=3D=3D=3D=3D=3D=3D
* gra= nt_role_opt_list

Status: fully supported

Line: 8235

Us= ed by: options when adding one role to another

Done by: adding grant= _role_opt_list_items, %nonassoc GRANTED

Test case:

=C2=A0 CRE= ATE USER alice;
=C2=A0 CREATE ROLE commarole;
=C2=A0 GRANT commarole = TO alice WITH admin true, inherit false,;
=C2=A0 GRANT commarole TO alic= e WITH admin option, inherit true, GRANTED BY current_user;


=3D= =3D=3D=3D=3D=3D=3D
* index_params

Status: fully supported

= Line: 8439

Used by: list of columns when creating an index

Do= ne by: adding index_params_items

Test case:

=C2=A0 CREATE TEM= P TABLE t (id int);
=C2=A0 CREATE INDEX ti1 ON t USING btree (id,);
<= br>
=3D=3D=3D=3D=3D=3D=3D
* index_including_params

Status: ful= ly supported

Line: 8502

Used by: list of columns for covering= indexes

Done by: adding index_including_params_items

Test ca= se:

=C2=A0 CREATE TEMP TABLE t (id int, email text);
=C2=A0 CREAT= E INDEX ti1 ON t (id) INCLUDE (email, );


=3D=3D=3D=3D=3D=3D=3D* func_args_list

Status: fully supported

Line: 8603

= Used by: certain places where we need to reference a function by its args
Done by: adding func_args_list_items

Test case:

=C2=A0 = CREATE FUNCTION commatest(int) returns int language sql as 'select 1= 9;;
=C2=A0 COMMENT ON FUNCTION commatest(int,) IS 'Welcome, extra co= mmas!';
=C2=A0 DROP FUNCTION commatest(int, );


=3D=3D=3D= =3D=3D=3D=3D
* function_with_argtypes_list

Status: fully supporte= d

Line: 8613

Used by: dropping multiple functions at once, as= signing privs to multiples

Done by: adding function_with_argtypes_li= st_items, %nonassoc CASCADE RESTRICT

Test case:

=C2=A0 CREATE= FUNCTION commatest(int) returns int language sql as 'select 1';=C2=A0 DROP FUNCTION commatest(int),;
=C2=A0 DROP FUNCTION if exists co= mmatest(int), CASCADE;


=3D=3D=3D=3D=3D=3D=3D
* func_args_with= _defaults_list:

Status: fully supported

Line: 8665

Use= d by: list of args when doing a create function only

Done by: adding= func_args_with_defaults_list_items

Test case:

=C2=A0 CREATE = FUNCTION commatest(int, int, ) returns int language sql as ' select 42 = ';


=3D=3D=3D=3D=3D=3D=3D
* aggr_args_list

Status: = fully supported

Line: 8864

Used by: aggregate declaration
=
Done by: adding aggr_args_list_items

Test case:

=C2=A0 CR= EATE AGGREGATE foo (int, ) (sfunc=3Dgcd, stype=3Dint);
=C2=A0 DROP AGGRE= GATE foo(int,);


=3D=3D=3D=3D=3D=3D=3D
* aggregate_with_argtyp= es_list

Status: fully supported

Line: 8881

Used by: op= erations on multiple aggregates at once

Done by: adding aggregate_wi= th_argtypes_list_items, %nonassoc CASCADE RESTRICT

Test case:
=C2=A0 CREATE AGGREGATE foo1 (int) (sfunc=3Dgcd, stype=3Dint);
=C2=A0 C= REATE AGGREGATE foo2 (int) (sfunc=3Dgcd, stype=3Dint);
=C2=A0 DROP AGGRE= GATE foo1(int), foo2(int), ;


=3D=3D=3D=3D=3D=3D=3D
* func_as<= br>
Status: not supported

Line: 9044

Putting this in for c= ompletelness, no trailing comma support is needed, as there are only two it= ems


=3D=3D=3D=3D=3D=3D=3D
* transform_type_list

Status= : fully supported

Line: 9053

Used by: functions that transfor= m types

Done by: adding transform_type_list_items

Test case:<= br>
=C2=A0 CREATE TRANSFORM FOR int LANGUAGE sql (from sql with function= time_support(internal) );
=C2=A0 CREATE FUNCTION foo() returns int lang= uage sql
=C2=A0 =C2=A0 transform for type int, for type int4, as 'se= lect 1';
=C2=A0 DROP TRANSFORM FOR int language sql cascade;

=
=3D=3D=3D=3D=3D=3D=3D
* table_func_column_list

Status: fully = supported

Line: 9076

Used by: list of columns for a table-ret= urning function

Done by: adding table_func_column_list_items

= Test case:

=C2=A0 CREATE FUNCTION foo() RETURNS table(x int,) langua= ge sql as 'select 1';
=C2=A0 DROP FUNCTION foo();


=3D= =3D=3D=3D=3D=3D=3D
* oper_argtypes

Status: not supported

L= ine: 9323

Used by: arguments to operators ("left" and &quo= t;right")

No support for trailing commas needed, unless we want= to get really pedantic


=3D=3D=3D=3D=3D=3D=3D
* operator_with= _argtypes_list

Status: fully supported

Line: 9293

Used= by: dropping multiple operators at once

Done by: adding operator_wi= th_argtypes_list_items, %nonassoc CASCADE RESTRICT

Test case:
=C2=A0 CREATE OPERATOR =3D=3D=3D ( leftarg=3Ddate, rightarg=3Ddate, functi= on=3Ddate_eq);
=C2=A0 CREATE OPERATOR =3D=3D=3D=3D ( leftarg=3Ddate, rig= htarg=3Ddate, function=3Ddate_eq);
=C2=A0 DROP OPERATOR =3D=3D=3D (date,= date), =3D=3D=3D=3D (date, date), ;


=3D=3D=3D=3D=3D=3D=3D
* o= perator_def_list

Status: fully supported

Line: 10521

U= sed by: modifying an existing operator

Done by: adding operator_def_= list_items

Test case:

=C2=A0 CREATE OPERATOR =3D=3D=3D ( left= arg=3Ddate, rightarg=3Ddate, function=3Ddate_eq);
=C2=A0 ALTER OPERATOR = =3D=3D=3D (date, date) SET (hashes, );
=C2=A0 DROP OPERATOR =3D=3D=3D (d= ate, date);


=3D=3D=3D=3D=3D=3D=3D
* pub_obj_list

Statu= s: fully supported

Line: 10929

Used by: create and alter publ= ications

Done by: adding pub_obj_list_items

Test case:
=C2=A0 CREATE TABLE foo1 (id int);
=C2=A0 CREATE TABLE foo2 (id int);=C2=A0 CREATE PUBLICATION p FOR TABLE foo1, table foo2, ;
=C2=A0 DROP = PUBLICATION p;
=C2=A0 DROP TABLE foo1, foo2;


=3D=3D=3D=3D=3D= =3D=3D
* pub_obj_type_list

Status: fully supported

Line: 1= 0950

Used by: create publication (as of v19 only)

Done by: ad= ding pub_obj_type_list_items (also cleaned up nearby indentation issue)
=
Test case:

=C2=A0 CREATE PUBLICATION p FOR ALL TABLES, ALL SEQUE= NCES;
=C2=A0 DROP PUBLICATION p;


=3D=3D=3D=3D=3D=3D=3D
* n= otify_payload

Status: not supported

Line: 11335

Used b= y: notify with a channel plus a payload

Seems not needed, given that= this is not really a list of items per se, just an optional payload.

=3D=3D=3D=3D=3D=3D=3D
* transaction_mode_list

Status: fully= supported

Line: 11462

Used by: set transaction

Done b= y: adding transaction_mode_list_items

Test case:

=C2=A0 BEGIN= WORK deferrable, isolation level serializable, ; ROLLBACK;


=3D= =3D=3D=3D=3D=3D=3D
* drop_option_list

Status: fully supported
=
Line: 11756

Used by: drop database only

Done by: adding d= rop_option_list_items

Test case:

=C2=A0 DROP DATABASE bob wit= h (force,force,);

Only option right now is "force" but thi= s is for future-proofing things.


=3D=3D=3D=3D=3D=3D=3D
* vacu= um_relation_list

Status: fully supported

Line: 12199

U= sed by: vacuum multiple things at once

Done by: adding vacuum_relati= on_list_items

Test case:

=C2=A0 VACUUM pg_am, pg_proc, ;
<= br>
=3D=3D=3D=3D=3D=3D=3D
* insert_column_list

Status: fully s= upported

Line: 12480

Used by: your basic insert statement
=
Done by: adding insert_column_list_items

Test case:

=C2= =A0 CREATE TEMP TABLE t (id int);
=C2=A0 INSERT INTO t(id,) VALUES (1);<= br>

=3D=3D=3D=3D=3D=3D=3D
* returning_options

Status: not = supported

Line: 12641

Used by: insert that uses RETURNING WIT= H

Does not seem worth it, as we only support OLD and NEW


= =3D=3D=3D=3D=3D=3D=3D
* set_clause_list

Status: fully supported
Line: 12686

Used by: UPDATE .. SET

Done by: adding set_= clause_list_items

Test case:

=C2=A0 CREATE TEMP TABLE t (id i= nt);
=C2=A0 UPDATE t SET id =3D 1, WHERE id <> 0;


=3D= =3D=3D=3D=3D=3D=3D
* set_target_list

Status: fully supported
<= br>Line: 12731

Used by: SET a bunch of things at once inside parens<= br>
Done by: adding set_target_list_items

Test case:

=C2= =A0 CREATE TEMP TABLE t (id int);
=C2=A0 UPDATE t SET (id,) =3D ROW(1);<= br>

=3D=3D=3D=3D=3D=3D=3D
* cte_list

Status: not supported=

Line: 13287

Used by: chaining multiple CTEs together

= This one is not likely to be supported, there is way too much ambiguity.

=3D=3D=3D=3D=3D=3D=3D
* sortby_list

Status: partially su= pported

Line: 13407

Used by: ORDER BY and json_array_aggregat= e_order_by_clause_opt

Done by: adding sortby_list_items and a new so= rtby_list_no_trailing_comma

Test case:

=C2=A0 SELECT * FROM p= g_language ORDER BY 1,2,3, LIMIT 1;

This one needed to be split into= two versions, as the "normal" ORDER BY did
just fine with ad= ding a comma at the end of the list. The json aggregate
however, spit u= p shift/reduce errors. That's a rather niche usage of
ORDER BY, so = at the end of the day, I decided to support the 99% usage and
leave the= json one alone.


=3D=3D=3D=3D=3D=3D=3D
* group_by_list
Status: fully supported

Line: 13782

Used by: group by, of co= urse

Done by: adding group_by_list_items

Test case:

= =C2=A0 SELECT datname, count(*) FROM pg_database GROUP BY 1, ;


= =3D=3D=3D=3D=3D=3D=3D
* from_list

Status: fully supported

= Line: 13786

Used by: list of tables in a from clause

Done by:= adding from_list_items

Test case:

=C2=A0 SELECT count(*) FRO= M pg_am, pg_proc, ;


=3D=3D=3D=3D=3D=3D=3D
* relation_expr_lis= t

Status: fully supported

Line: 14144

Used by: import = foreign schema, truncate tables, lock tables

Done by: adding relatio= n_expr_list_items, %nonassoc RESTART CONTINUE_P

Not completely happy= about having to add two more keywords just to
support TRUNCATE, but TR= UNCATE is a rather important command, so
I think it is worth it.
Test case:

=C2=A0 CREATE TEMP TABLE t1 (id int);
=C2=A0 CREATE T= EMP TABLE t2 (id int);
=C2=A0 TRUNCATE TABLE t1, t2, ;
=C2=A0 TRUNCAT= E TABLE t1, t2, CONTINUE IDENTITY;
=C2=A0 LOCK TABLE pg_am, pg_proc, NOW= AIT;

There is a little bit of ambiguity there as there is a very wea= k use case
for doing what that LOCK TABLE above used to do: apply the d= efault lock
mode to three tables, one of which is named "nowait&qu= ot;. But "nowait" is
a dumb name for a table, so I think cave= at emptor applies here. The same
thing applies to some of the other exa= mples, e.g. having a table named "CASCADE")


=3D=3D=3D= =3D=3D=3D=3D
* rowsfrom_list

Status: fully supported

Line:= 14243

Used by: rows from a list - see below

Done by: adding = rowsfrom_list_items

Test case:

=C2=A0 SELECT * FROM ROWS FROM= ( abs(1), abs(2), );


=3D=3D=3D=3D=3D=3D=3D
* TableFuncElemen= tList

Status: fully supported

Line: 14283

Used by: ali= ases for functions with declared list of columns

Done by: adding Tab= leFuncElementListItems

Test case:

=C2=A0 SELECT * FROM jsonb_= to_record('{"foo": 10}') AS x (foo int, );


=3D= =3D=3D=3D=3D=3D=3D
* xmltable_column_list

Status: fully supported=

Line: 14343

Used by: The weird xmltable function

Done= by: adding xmltable_column_list_items

Test case:

=C2=A0 WITH= xmldata(data) AS (VALUES
=C2=A0 =C2=A0 ('<aa xmlns=3D"https://xmlsux"><it= em foo=3D"42" /></aa>'::xml))
=C2=A0 SELECT xmlta= ble.* FROM XMLTABLE(xmlnamespaces('https://xmlsux' AS x),
=C2=A0 =C2=A0 '/x:aa/x:item&= #39; passing (select data from xmldata)
=C2=A0 =C2=A0 =C2=A0COLUMNS foo = int path '@foo', );


=3D=3D=3D=3D=3D=3D=3D
* xml_names= pace_list

Status: fully supported

Line: 14460

Used by:= xml stuff

Done by: adding xml_namespace_list_items

Test case= :

=C2=A0 WITH xmldata(data) AS (VALUES
=C2=A0 =C2=A0 ('<a= a xmlns=3D"https://xmlsux= "><item foo=3D"42" /></aa>'::xml))=C2=A0 SELECT xmltable.* FROM XMLTABLE(xmlnamespaces('https://xmlsux' AS x, ),
=C2=A0 =C2= =A0 '/x:aa/x:item' passing (select data from xmldata)
=C2=A0 =C2= =A0 =C2=A0COLUMNS foo int path '@foo' );


=3D=3D=3D=3D=3D= =3D=3D
* json_table_column_definition_list:

Status: fully support= ed

Line: 14518

Used by:

Done by: adding json_table_co= lumn_definition_list_items

Test case:

=C2=A0 SELECT * from js= on_table('{"id": 123}', '$[*]' columns (id int pa= th '$.id',));


=3D=3D=3D=3D=3D=3D=3D
* xml_attribute_l= ist

Status: fully supported

Line: 16480

Used by: XML s= tuff

Done by: adding xml_attribute_list_items

Test case:
<= br>=C2=A0 SELECT xmlforest(1 as is, );


=3D=3D=3D=3D=3D=3D=3D
= * window_definition_list

Status: fully supported

Line: 16832<= br>
Used by:

Done by:

Test case:

=C2=A0 SELECT 1 = from pg_database window foo as (partition by oid), ;


=3D=3D=3D= =3D=3D=3D=3D
* expr_list

Status: partially supported

Line:= 16903

Used by: lots of things - will break down each one

Don= e by: adding expr_list_items, plus expr_list_no_trailing_comma

1. li= st and range partition definitions

Supported. Test case:

=C2= =A0 CREATE TEMP TABLE t1 (id int) partition by list (id);
=C2=A0 CREATE = TEMP TABLE t2 partition of t1 for values in (1,2,);
=C2=A0 CREATE TEMP T= ABLE t3 (id int, id2 int) partition by range (id, id2);
=C2=A0 CREATE TE= MP TABLE t4 partition of t3 for values from (1,2,) to (6,7,);

2. exe= cute parameters

Supported. Test case:

=C2=A0 PREPARE foo as s= elect $1;
=C2=A0 EXECUTE foo (1, );
=C2=A0 DEALLOCATE foo;

3. = merge values

Supported. Test case:

=C2=A0 CREATE TEMP TABLE t= (id int);
=C2=A0 MERGE INTO t USING (values (1)) on (true) when not mat= ched then insert (id) values (42,);

4. distinct on

Supported.= Test case:

=C2=A0 SELECT distinct on (prolang,) prolang from pg_pro= c;

5. rollup and cube

Supported. Test case:

=C2=A0 SEL= ECT relkind, relnamespace, count(*) from pg_class group by rollup(1,2,);=C2=A0 SELECT relkind, relnamespace, count(*) from pg_class group by cube(= 1,2,);

6. values

Supported. Test case:

=C2=A0 SELECT *= FROM (values(1,2,), (3,4,) );

7. tablesample

Supported. Test= case:

=C2=A0 SELECT relname from pg_class tablesample bernoulli (1,= );

Yes, I know bernoulli only accepts a single arg anyway.

8.= generic type modifiers

Supported. Test case:

=C2=A0 SELECT 1= 23::numeric(10, );

9. bit type with a length

Supported. Test = case:

=C2=A0 SELECT 42::bit(8,);

10. general expression foo i= n (list) and not in (list)

Supported. Test case:

=C2=A0 SELEC= T 1 IN (1,2,3,);
=C2=A0 SELECT 1 NOT IN (1,2,3,);

11. grouping
Supported. Test case:

=C2=A0 SELECT relkind, GROUPING(relkind,)= , count(*) from pg_class group by 1;

12. coalesce, greatest, least
Supported. Test case:

=C2=A0 SELECT COALESCE(1,2, );
=C2=A0= SELECT GREATEST(42, 24,);
=C2=A0 SELECT LEAST(42, 24,);

13. xmlc= oncat, xmlelement

Supported. Test case:

=C2=A0 SELECT XMLCONC= AT('1'::xml, '2'::xml, );
=C2=A0 SELECT XMLELEMENT(name = foo, 'fizz', 'buzz',);

14. partition by inside a win= dow

Supported. Test case:

=C2=A0 SELECT lag(oid) over(PARTITI= ON BY 1,2,) from pg_am;

15. ROW

PARTIALLY supported. ROW is a= tricky case. In the end, I was only able to
reliably get the explicit_= row to work with a hard-coded comma variant. On the
other hand, that= 9;s a pretty common form, so I'm happy overall.

Test case:
=C2=A0 SELECT ROW(1,2,3,);
=C2=A0 /* Still fails: SELECT (1,2,3,); */<= br>
16. array lists

Supported. Test case:

=C2=A0 SELECT AR= RAY[1,2,3,];

17. trim list

Supported. Test case:

=C2= =A0 SELECT TRIM(both from 'abba', 'a', );

Not partic= ularly useful, but it's kinda built-in with the expr_list.

This = is the end of expr_list!


=3D=3D=3D=3D=3D=3D=3D
* func_arg_lis= t

Not to be confused with func_args_list, way back around line 8600!=

Status: partially supported

Line: 17036

Used by: argu= ments to functions

Done by: func_arg_list_items, func_arg_list_no_tr= ailing_comma

Test case:

=C2=A0 /* Works for simple variants: = */
=C2=A0 CREATE PROCEDURE foo(int) language sql as 'select 1';<= br>=C2=A0 CALL foo(1,);
=C2=A0 CALL foo(ALL 1,);
=C2=A0 DROP PROCEDUR= E foo(int);

This is only partly supported, due to the weird way in w= hich we can call functions,
but I think the main cases are covered well= enough.

=3D=3D=3D=3D=3D=3D=3D
* type_list

Status: fully s= upported

Line: 16954

Used by: prepare arguments

Done b= y: adding type_list_items

Test case:

=C2=A0 PREPARE foo(int,)= AS select $1;


=3D=3D=3D=3D=3D=3D=3D
* array_expr_list
Status: fully supported

Line: 16972

Used by: multiple array = items

Done by: adding array_expr_list_items

Test case:
=C2=A0 SELECT ARRAY[ [1],[2], ];


=3D=3D=3D=3D=3D=3D=3D
* jso= n_arguments

Status: not supported

Line: 17334

Test cas= e:

=C2=A0 SELECT JSON_VALUE(jsonb '[]', '$' PASSING = 1 as x, 2 as y,);

Only used in a relatively obscure command; lots of= shift/reduce conflicts; not worth the effort


=3D=3D=3D=3D=3D=3D= =3D
* json_name_and_value_list

Status: not supported

Line:= 17496

Test case:

=C2=A0 SELECT json_object(1:2,3:4,);
As above, too many shift/reduce conflicts as there are many post-comma opt= tions.

=3D=3D=3D=3D=3D=3D=3D
* json_value_expr_list:

Statu= s: not supported

Line: 17529

Test case:

=C2=A0 SELECT = json_array(1,2,3,);

Continuing our json trend, we cannot support thi= s one either


=3D=3D=3D=3D=3D=3D=3D
* target_list

Statu= s: fully supported

Line: 17456

Used by: select a list of thin= gs

Done by: adding target_list_items

Test case:

=C2=A0= SELECT 1,2,3, ;


=3D=3D=3D=3D=3D=3D=3D
* qualified_name_list<= br>
Status: fully supported

Line: 17507

Used by:

D= one by: adding qualified_name_list_items, %nonassoc DEFERRED IMMEDIATE SKIP= NOWAIT

This important clause was a little tricky and requires some = %nonassoc magic

1. set constraints (see ConstraintsSetStmt)

T= he full syntax is:
=C2=A0 SET CONSTRAINTS constraints_set_list constrai= nts_set_mode

where contraints_set_list contains our qualified name l= ist, and the mode can be
DEFERRED or IMMEDIATE. So we add those two as = %nonassoc

Test case:

=C2=A0 CREATE TEMP TABLE foo(x int, y in= t);
=C2=A0 ALTER TABLE foo add constraint xplus check(x > 0), add con= straint yplus check(y > 0);
=C2=A0 BEGIN;
=C2=A0 SET CONSTRAINTS x= plus, yplus, immediate;
=C2=A0 ROLLBACK;


2. table inheritance= list (see CreateStmt)

Test case:

=C2=A0 CREATE TEMP TABLE fo= o() INHERITS (pg_proc, );

3. grant/revoke list of items (see privile= ge_target)

Test case:

=C2=A0 GRANT select on table pg_class, = to public;

4. Locking multiple objects (see for_locking_item)
Test case:

=C2=A0 SELECT 1 from pg_database, pg_am for update of pg= _database nowait limit 1;
=C2=A0 SELECT 1 from pg_database, pg_am for up= date of pg_database, nowait limit 1;
=C2=A0 SELECT 1 from pg_database, p= g_am for update of pg_database, pg_am nowait limit 1;
=C2=A0 SELECT 1 fr= om pg_database, pg_am for update of pg_database, pg_am, nowait limit 1;
=
Since the list here is followed by some optional items, we needed
t= o add those to %nonassoc: SKIP NOWAIT


=3D=3D=3D=3D=3D=3D=3D
*= name_list

Status: fully supported

Line: 17701

Used by= : tons of things that need, well, a list of names

Done by: adding na= me_list_items, %nonassoc RESTRICT CASCADE REVOKE REPLACE

Test case:<= br>
=C2=A0 GRANT USAGE on schema public, TO public;


=3D=3D=3D= =3D=3D=3D=3D
* role_list

Status: fully supported

Line: 177= 53

Used by: list of roles (e.g. to grant multiple roles at once)
=
Done by: adding role_list_items, plus large %nonassoc list:
=C2=A0 C= ONNECTION INHERIT ENCRYPTED ADMIN PASSWORD ROLE SYSID UNENCRYPTED VALID
=
Test case:

=C2=A0 GRANT pg_monitor TO alice, ;

I don'= t like adding so many %nonassoc for just this one simple case, but I think =
it is warranted as a list of role is pretty common.


That'= ;s the end of the list! Congratulations on reaching this far, even if you <= br>simply scrolled to the bottom without reading everything! :) The total n= umber of
changes was not too bad, just spread out a lot:

$ git l= og --oneline -1 --shortstat
95a599b62a7 (HEAD -> comma,commma,commma,= comma,chameleon, master) Provide support for trailing commas, where possibl= e and practical.
=C2=A01 file changed, 564 insertions(+), 305 deletions(= -)


--00000000000060410f0647be2067-- --0000000000006041100647be2069 Content-Type: application/x-patch; name="0001-Provide-support-for-trailing-commas-where-possible-and-practical.patch" Content-Disposition: attachment; filename="0001-Provide-support-for-trailing-commas-where-possible-and-practical.patch" Content-Transfer-Encoding: base64 Content-ID: X-Attachment-Id: f_mk2vac6j0 RnJvbSA0MzU3M2U4OGFlMWM5ODMzZGFmMGZiMmFkMDdiZjY1NDkxYmM5OTAwIE1vbiBTZXAgMTcg MDA6MDA6MDAgMjAwMQpGcm9tOiBHcmVnIFNhYmlubyBNdWxsYW5lIDxncmVnQHR1cm5zdGVwLmNv bT4KRGF0ZTogVHVlLCA2IEphbiAyMDI2IDEyOjI3OjM1IC0wNTAwClN1YmplY3Q6IFtQQVRDSF0g CiBQcm92aWRlLXN1cHBvcnQtZm9yLXRyYWlsaW5nLWNvbW1hcy13aGVyZS1wb3NzaWJsZS1hbmQt cHJhY3RpY2FsCgotLS0KIHNyYy9iYWNrZW5kL3BhcnNlci9ncmFtLnkgfCA4NjggKysrKysrKysr KysrKysrKysrKysrKysrLS0tLS0tLS0tLS0tLS0KIDEgZmlsZSBjaGFuZ2VkLCA1NjMgaW5zZXJ0 aW9ucygrKSwgMzA1IGRlbGV0aW9ucygtKQoKZGlmZiAtLWdpdCBhL3NyYy9iYWNrZW5kL3BhcnNl ci9ncmFtLnkgYi9zcmMvYmFja2VuZC9wYXJzZXIvZ3JhbS55CmluZGV4IDcxM2VlNWMxMGEyLi4w MmQzYTYyMzcwMyAxMDA2NDQKLS0tIGEvc3JjL2JhY2tlbmQvcGFyc2VyL2dyYW0ueQorKysgYi9z cmMvYmFja2VuZC9wYXJzZXIvZ3JhbS55CkBAIC0zMjEsMTMgKzMyMSwxNCBAQCBzdGF0aWMgTm9k ZSAqbWFrZVJlY3Vyc2l2ZVZpZXdTZWxlY3QoY2hhciAqcmVsbmFtZSwgTGlzdCAqYWxpYXNlcywg Tm9kZSAqcXVlcnkpOwogCQkJCXNpbXBsZV9zZWxlY3QgdmFsdWVzX2NsYXVzZQogCQkJCVBMcGdT UUxfRXhwciBQTEFzc2lnblN0bXQKIAorJXR5cGUgPG5vZGU+ICAgICAgICBvcHRfdHJhaWxpbmdf Y29tbWEKICV0eXBlIDxzdHI+CQkJb3B0X3NpbmdsZV9uYW1lCiAldHlwZSA8bGlzdD4JCW9wdF9x dWFsaWZpZWRfbmFtZQogJXR5cGUgPGJvb2xlYW4+CQlvcHRfY29uY3VycmVudGx5CiAldHlwZSA8 ZGJlaGF2aW9yPglvcHRfZHJvcF9iZWhhdmlvcgogJXR5cGUgPGxpc3Q+CQlvcHRfdXRpbGl0eV9v cHRpb25fbGlzdAogJXR5cGUgPGxpc3Q+CQlvcHRfd2FpdF93aXRoX2NsYXVzZQotJXR5cGUgPGxp c3Q+CQl1dGlsaXR5X29wdGlvbl9saXN0CisldHlwZSA8bGlzdD4JCXV0aWxpdHlfb3B0aW9uX2xp c3QgdXRpbGl0eV9vcHRpb25fbGlzdF9pdGVtcwogJXR5cGUgPGRlZmVsdD4JCXV0aWxpdHlfb3B0 aW9uX2VsZW0KICV0eXBlIDxzdHI+CQkJdXRpbGl0eV9vcHRpb25fbmFtZQogJXR5cGUgPG5vZGU+ CQl1dGlsaXR5X29wdGlvbl9hcmcKQEAgLTMzNywxNCArMzM4LDE0IEBAIHN0YXRpYyBOb2RlICpt YWtlUmVjdXJzaXZlVmlld1NlbGVjdChjaGFyICpyZWxuYW1lLCBMaXN0ICphbGlhc2VzLCBOb2Rl ICpxdWVyeSk7CiAKICV0eXBlIDxub2RlPglhbHRlcl90YWJsZV9jbWQgYWx0ZXJfdHlwZV9jbWQg b3B0X2NvbGxhdGVfY2xhdXNlCiAJICAgcmVwbGljYV9pZGVudGl0eSBwYXJ0aXRpb25fY21kIGlu ZGV4X3BhcnRpdGlvbl9jbWQKLSV0eXBlIDxsaXN0PglhbHRlcl90YWJsZV9jbWRzIGFsdGVyX3R5 cGVfY21kcworJXR5cGUgPGxpc3Q+CWFsdGVyX3RhYmxlX2NtZHMgYWx0ZXJfdGFibGVfY21kc19p dGVtcyBhbHRlcl90eXBlX2NtZHMgYWx0ZXJfdHlwZV9jbWRzX2l0ZW1zCiAldHlwZSA8bGlzdD4g ICAgYWx0ZXJfaWRlbnRpdHlfY29sdW1uX29wdGlvbl9saXN0CiAldHlwZSA8ZGVmZWx0PiAgYWx0 ZXJfaWRlbnRpdHlfY29sdW1uX29wdGlvbgogJXR5cGUgPG5vZGU+CXNldF9zdGF0aXN0aWNzX3Zh bHVlCiAldHlwZSA8c3RyPgkJc2V0X2FjY2Vzc19tZXRob2RfbmFtZQogCiAldHlwZSA8bGlzdD4J Y3JlYXRlZGJfb3B0X2xpc3QgY3JlYXRlZGJfb3B0X2l0ZW1zIGNvcHlfb3B0X2xpc3QKLQkJCQl0 cmFuc2FjdGlvbl9tb2RlX2xpc3QKKwkJCQl0cmFuc2FjdGlvbl9tb2RlX2xpc3QgdHJhbnNhY3Rp b25fbW9kZV9saXN0X2l0ZW1zCiAJCQkJY3JlYXRlX2V4dGVuc2lvbl9vcHRfbGlzdCBhbHRlcl9l eHRlbnNpb25fb3B0X2xpc3QKICV0eXBlIDxkZWZlbHQ+CWNyZWF0ZWRiX29wdF9pdGVtIGNvcHlf b3B0X2l0ZW0KIAkJCQl0cmFuc2FjdGlvbl9tb2RlX2l0ZW0KQEAgLTM1Niw3ICszNTcsNyBAQCBz dGF0aWMgTm9kZSAqbWFrZVJlY3Vyc2l2ZVZpZXdTZWxlY3QoY2hhciAqcmVsbmFtZSwgTGlzdCAq YWxpYXNlcywgTm9kZSAqcXVlcnkpOwogCQkJCW9wdF9ncmFudF9ncmFudF9vcHRpb24KIAkJCQlv cHRfbm93YWl0IG9wdF9pZl9leGlzdHMgb3B0X3dpdGhfZGF0YQogCQkJCW9wdF90cmFuc2FjdGlv bl9jaGFpbgotJXR5cGUgPGxpc3Q+CWdyYW50X3JvbGVfb3B0X2xpc3QKKyV0eXBlIDxsaXN0Pgln cmFudF9yb2xlX29wdF9saXN0IGdyYW50X3JvbGVfb3B0X2xpc3RfaXRlbXMKICV0eXBlIDxkZWZl bHQ+CWdyYW50X3JvbGVfb3B0CiAldHlwZSA8bm9kZT4JZ3JhbnRfcm9sZV9vcHRfdmFsdWUKICV0 eXBlIDxpdmFsPglvcHRfbm93YWl0X29yX3NraXAKQEAgLTM2OSw3ICszNzAsNyBAQCBzdGF0aWMg Tm9kZSAqbWFrZVJlY3Vyc2l2ZVZpZXdTZWxlY3QoY2hhciAqcmVsbmFtZSwgTGlzdCAqYWxpYXNl cywgTm9kZSAqcXVlcnkpOwogJXR5cGUgPHN0cj4JCW9wdF9pbl9kYXRhYmFzZQogCiAldHlwZSA8 c3RyPgkJcGFyYW1ldGVyX25hbWUKLSV0eXBlIDxsaXN0PglPcHRTY2hlbWFFbHRMaXN0IHBhcmFt ZXRlcl9uYW1lX2xpc3QKKyV0eXBlIDxsaXN0PglPcHRTY2hlbWFFbHRMaXN0IHBhcmFtZXRlcl9u YW1lX2xpc3QgcGFyYW1ldGVyX25hbWVfbGlzdF9pdGVtcwogCiAldHlwZSA8Y2hyPgkJYW1fdHlw ZQogCkBAIC0zODIsNyArMzgzLDcgQEAgc3RhdGljIE5vZGUgKm1ha2VSZWN1cnNpdmVWaWV3U2Vs ZWN0KGNoYXIgKnJlbG5hbWUsIExpc3QgKmFsaWFzZXMsIE5vZGUgKnF1ZXJ5KTsKICV0eXBlIDxi b29sZWFuPglUcmFuc2l0aW9uUm93T3JUYWJsZSBUcmFuc2l0aW9uT2xkT3JOZXcKICV0eXBlIDxu b2RlPglUcmlnZ2VyVHJhbnNpdGlvbgogCi0ldHlwZSA8bGlzdD4JZXZlbnRfdHJpZ2dlcl93aGVu X2xpc3QgZXZlbnRfdHJpZ2dlcl92YWx1ZV9saXN0CisldHlwZSA8bGlzdD4JZXZlbnRfdHJpZ2dl cl93aGVuX2xpc3QgZXZlbnRfdHJpZ2dlcl92YWx1ZV9saXN0IGV2ZW50X3RyaWdnZXJfdmFsdWVf bGlzdF9pdGVtcwogJXR5cGUgPGRlZmVsdD4JZXZlbnRfdHJpZ2dlcl93aGVuX2l0ZW0KICV0eXBl IDxjaHI+CQllbmFibGVfdHJpZ2dlcgogCkBAIC00MDYsMTIgKzQwNywxNCBAQCBzdGF0aWMgTm9k ZSAqbWFrZVJlY3Vyc2l2ZVZpZXdTZWxlY3QoY2hhciAqcmVsbmFtZSwgTGlzdCAqYWxpYXNlcywg Tm9kZSAqcXVlcnkpOwogCiAldHlwZSA8c3RyPgkJaXNvX2xldmVsIG9wdF9lbmNvZGluZwogJXR5 cGUgPHJvbGVzcGVjPiBncmFudGVlCi0ldHlwZSA8bGlzdD4JZ3JhbnRlZV9saXN0CisldHlwZSA8 bGlzdD4JZ3JhbnRlZV9saXN0IGdyYW50ZWVfbGlzdF9pdGVtcwogJXR5cGUgPGFjY2Vzc3ByaXY+ IHByaXZpbGVnZQotJXR5cGUgPGxpc3Q+CXByaXZpbGVnZXMgcHJpdmlsZWdlX2xpc3QKKyV0eXBl IDxsaXN0Pglwcml2aWxlZ2VzIHByaXZpbGVnZV9saXN0IHByaXZpbGVnZV9saXN0X2l0ZW1zCiAl dHlwZSA8cHJpdnRhcmdldD4gcHJpdmlsZWdlX3RhcmdldAogJXR5cGUgPG9iandpdGhhcmdzPiBm dW5jdGlvbl93aXRoX2FyZ3R5cGVzIGFnZ3JlZ2F0ZV93aXRoX2FyZ3R5cGVzIG9wZXJhdG9yX3dp dGhfYXJndHlwZXMKICV0eXBlIDxsaXN0PglmdW5jdGlvbl93aXRoX2FyZ3R5cGVzX2xpc3QgYWdn cmVnYXRlX3dpdGhfYXJndHlwZXNfbGlzdCBvcGVyYXRvcl93aXRoX2FyZ3R5cGVzX2xpc3QKKyV0 eXBlIDxsaXN0PglmdW5jdGlvbl93aXRoX2FyZ3R5cGVzX2xpc3RfaXRlbXMgYWdncmVnYXRlX3dp dGhfYXJndHlwZXNfbGlzdF9pdGVtcworJXR5cGUgPGxpc3Q+CW9wZXJhdG9yX3dpdGhfYXJndHlw ZXNfbGlzdF9pdGVtcwogJXR5cGUgPGl2YWw+CWRlZmFjbF9wcml2aWxlZ2VfdGFyZ2V0CiAldHlw ZSA8ZGVmZWx0PglEZWZBQ0xPcHRpb24KICV0eXBlIDxsaXN0PglEZWZBQ0xPcHRpb25MaXN0CkBA IC00MjEsNDcgKzQyNCw1NCBAQCBzdGF0aWMgTm9kZSAqbWFrZVJlY3Vyc2l2ZVZpZXdTZWxlY3Qo Y2hhciAqcmVsbmFtZSwgTGlzdCAqYWxpYXNlcywgTm9kZSAqcXVlcnkpOwogJXR5cGUgPHNlbGVj dGxpbWl0PiBvcHRfc2VsZWN0X2xpbWl0IHNlbGVjdF9saW1pdCBsaW1pdF9jbGF1c2UKIAogJXR5 cGUgPGxpc3Q+CXBhcnNlX3RvcGxldmVsIHN0bXRtdWx0aSByb3V0aW5lX2JvZHlfc3RtdF9saXN0 Ci0JCQkJT3B0VGFibGVFbGVtZW50TGlzdCBUYWJsZUVsZW1lbnRMaXN0IE9wdEluaGVyaXQgZGVm aW5pdGlvbgotCQkJCU9wdFR5cGVkVGFibGVFbGVtZW50TGlzdCBUeXBlZFRhYmxlRWxlbWVudExp c3QKKwkJCQlPcHRUYWJsZUVsZW1lbnRMaXN0IFRhYmxlRWxlbWVudExpc3QgVGFibGVFbGVtZW50 TGlzdEl0ZW1zIE9wdEluaGVyaXQgZGVmaW5pdGlvbgorCQkJCU9wdFR5cGVkVGFibGVFbGVtZW50 TGlzdCBUeXBlZFRhYmxlRWxlbWVudExpc3QgVHlwZWRUYWJsZUVsZW1lbnRMaXN0SXRlbXMKIAkJ CQlyZWxvcHRpb25zIG9wdF9yZWxvcHRpb25zCi0JCQkJT3B0V2l0aCBvcHRfZGVmaW5pdGlvbiBm dW5jX2FyZ3MgZnVuY19hcmdzX2xpc3QKLQkJCQlmdW5jX2FyZ3Nfd2l0aF9kZWZhdWx0cyBmdW5j X2FyZ3Nfd2l0aF9kZWZhdWx0c19saXN0Ci0JCQkJYWdncl9hcmdzIGFnZ3JfYXJnc19saXN0CisJ CQkJT3B0V2l0aCBvcHRfZGVmaW5pdGlvbiBmdW5jX2FyZ3MgZnVuY19hcmdzX2xpc3QgZnVuY19h cmdzX2xpc3RfaXRlbXMKKwkJCQlmdW5jX2FyZ3Nfd2l0aF9kZWZhdWx0cyBmdW5jX2FyZ3Nfd2l0 aF9kZWZhdWx0c19saXN0IGZ1bmNfYXJnc193aXRoX2RlZmF1bHRzX2xpc3RfaXRlbXMKKwkJCQlh Z2dyX2FyZ3MgYWdncl9hcmdzX2xpc3QgYWdncl9hcmdzX2xpc3RfaXRlbXMKIAkJCQlmdW5jX2Fz IGNyZWF0ZWZ1bmNfb3B0X2xpc3Qgb3B0X2NyZWF0ZWZ1bmNfb3B0X2xpc3QgYWx0ZXJmdW5jX29w dF9saXN0CiAJCQkJb2xkX2FnZ3JfZGVmaW5pdGlvbiBvbGRfYWdncl9saXN0CiAJCQkJb3Blcl9h cmd0eXBlcyBSdWxlQWN0aW9uTGlzdCBSdWxlQWN0aW9uTXVsdGkKLQkJCQlvcHRfY29sdW1uX2xp c3QgY29sdW1uTGlzdCBvcHRfbmFtZV9saXN0Ci0JCQkJc29ydF9jbGF1c2Ugb3B0X3NvcnRfY2xh dXNlIHNvcnRieV9saXN0IGluZGV4X3BhcmFtcwotCQkJCXN0YXRzX3BhcmFtcwotCQkJCW9wdF9p bmNsdWRlIG9wdF9jX2luY2x1ZGUgaW5kZXhfaW5jbHVkaW5nX3BhcmFtcwotCQkJCW5hbWVfbGlz dCByb2xlX2xpc3QgZnJvbV9jbGF1c2UgZnJvbV9saXN0IG9wdF9hcnJheV9ib3VuZHMKLQkJCQlx dWFsaWZpZWRfbmFtZV9saXN0IGFueV9uYW1lIGFueV9uYW1lX2xpc3QgdHlwZV9uYW1lX2xpc3QK LQkJCQlhbnlfb3BlcmF0b3IgZXhwcl9saXN0IGF0dHJzCisJCQkJb3B0X2NvbHVtbl9saXN0IGNv bHVtbkxpc3QgY29sdW1uTGlzdE9wdGlvbmFsQ29tbWEgY29sdW1uTGlzdEl0ZW1zIG9wdF9uYW1l X2xpc3QKKwkJCQlzb3J0X2NsYXVzZSBvcHRfc29ydF9jbGF1c2Ugc29ydGJ5X2xpc3Qgc29ydGJ5 X2xpc3RfaXRlbXMgc29ydGJ5X2xpc3Rfbm9fdHJhaWxpbmdfY29tbWEKKwkJCQlpbmRleF9wYXJh bXMgaW5kZXhfcGFyYW1zX2l0ZW1zCisJCQkJc3RhdHNfcGFyYW1zIHN0YXRzX3BhcmFtc19pdGVt cworCQkJCW9wdF9pbmNsdWRlIG9wdF9jX2luY2x1ZGUgaW5kZXhfaW5jbHVkaW5nX3BhcmFtcyBp bmRleF9pbmNsdWRpbmdfcGFyYW1zX2l0ZW1zCisJCQkJbmFtZV9saXN0IG5hbWVfbGlzdF9pdGVt cyByb2xlX2xpc3Qgcm9sZV9saXN0X2l0ZW1zCisJCQkJZnJvbV9jbGF1c2UgZnJvbV9saXN0IGZy b21fbGlzdF9pdGVtcyBvcHRfYXJyYXlfYm91bmRzCisJCQkJcXVhbGlmaWVkX25hbWVfbGlzdCBx dWFsaWZpZWRfbmFtZV9saXN0X2l0ZW1zIGFueV9uYW1lIGFueV9uYW1lX2xpc3QgYW55X25hbWVf bGlzdF9pdGVtcworCQkJCXR5cGVfbmFtZV9saXN0IHR5cGVfbmFtZV9saXN0X2l0ZW1zCisJCQkJ YW55X29wZXJhdG9yIGV4cHJfbGlzdCBleHByX2xpc3RfaXRlbXMgZXhwcl9saXN0X25vX3RyYWls aW5nX2NvbW1hIGF0dHJzCiAJCQkJZGlzdGluY3RfY2xhdXNlIG9wdF9kaXN0aW5jdF9jbGF1c2UK LQkJCQl0YXJnZXRfbGlzdCBvcHRfdGFyZ2V0X2xpc3QgaW5zZXJ0X2NvbHVtbl9saXN0IHNldF90 YXJnZXRfbGlzdAotCQkJCW1lcmdlX3ZhbHVlc19jbGF1c2UKLQkJCQlzZXRfY2xhdXNlX2xpc3Qg c2V0X2NsYXVzZQotCQkJCWRlZl9saXN0IG9wZXJhdG9yX2RlZl9saXN0IGluZGlyZWN0aW9uIG9w dF9pbmRpcmVjdGlvbgotCQkJCXJlbG9wdGlvbl9saXN0IFRyaWdnZXJGdW5jQXJncyBvcGNsYXNz X2l0ZW1fbGlzdCBvcGNsYXNzX2Ryb3BfbGlzdAorCQkJCXRhcmdldF9saXN0IHRhcmdldF9saXN0 X2l0ZW1zIG9wdF90YXJnZXRfbGlzdCBpbnNlcnRfY29sdW1uX2xpc3QgaW5zZXJ0X2NvbHVtbl9s aXN0X2l0ZW1zCisJCQkJc2V0X3RhcmdldF9saXN0CXNldF90YXJnZXRfbGlzdF9pdGVtcyBtZXJn ZV92YWx1ZXNfY2xhdXNlCisJCQkJc2V0X2NsYXVzZV9saXN0IHNldF9jbGF1c2VfbGlzdF9pdGVt cyBzZXRfY2xhdXNlCisJCQkJZGVmX2xpc3QgZGVmX2xpc3RfaXRlbXMgb3BlcmF0b3JfZGVmX2xp c3Qgb3BlcmF0b3JfZGVmX2xpc3RfaXRlbXMKKwkJCQlpbmRpcmVjdGlvbiBvcHRfaW5kaXJlY3Rp b24KKwkJCQlyZWxvcHRpb25fbGlzdCByZWxvcHRpb25fbGlzdF9pdGVtcyBUcmlnZ2VyRnVuY0Fy Z3MgVHJpZ2dlckZ1bmNBcmdzSXRlbXMKKwkJCQlvcGNsYXNzX2l0ZW1fbGlzdCBvcGNsYXNzX2l0 ZW1fbGlzdF9pdGVtcyBvcGNsYXNzX2Ryb3BfbGlzdCBvcGNsYXNzX2Ryb3BfbGlzdF9pdGVtcwog CQkJCW9wY2xhc3NfcHVycG9zZSBvcHRfb3BmYW1pbHkgdHJhbnNhY3Rpb25fbW9kZV9saXN0X29y X2VtcHR5Ci0JCQkJT3B0VGFibGVGdW5jRWxlbWVudExpc3QgVGFibGVGdW5jRWxlbWVudExpc3Qg b3B0X3R5cGVfbW9kaWZpZXJzCisJCQkJT3B0VGFibGVGdW5jRWxlbWVudExpc3QgVGFibGVGdW5j RWxlbWVudExpc3QgVGFibGVGdW5jRWxlbWVudExpc3RJdGVtcyBvcHRfdHlwZV9tb2RpZmllcnMK IAkJCQlwcmVwX3R5cGVfY2xhdXNlCiAJCQkJZXhlY3V0ZV9wYXJhbV9jbGF1c2UgdXNpbmdfY2xh dXNlCiAJCQkJcmV0dXJuaW5nX3dpdGhfY2xhdXNlIHJldHVybmluZ19vcHRpb25zCi0JCQkJb3B0 X2VudW1fdmFsX2xpc3QgZW51bV92YWxfbGlzdCB0YWJsZV9mdW5jX2NvbHVtbl9saXN0CisJCQkJ b3B0X2VudW1fdmFsX2xpc3QgZW51bV92YWxfbGlzdCBlbnVtX3ZhbF9saXN0X2l0ZW1zCisJCQkJ dGFibGVfZnVuY19jb2x1bW5fbGlzdCB0YWJsZV9mdW5jX2NvbHVtbl9saXN0X2l0ZW1zCiAJCQkJ Y3JlYXRlX2dlbmVyaWNfb3B0aW9ucyBhbHRlcl9nZW5lcmljX29wdGlvbnMKLQkJCQlyZWxhdGlv bl9leHByX2xpc3QgZG9zdG10X29wdF9saXN0Ci0JCQkJdHJhbnNmb3JtX2VsZW1lbnRfbGlzdCB0 cmFuc2Zvcm1fdHlwZV9saXN0CisJCQkJcmVsYXRpb25fZXhwcl9saXN0IHJlbGF0aW9uX2V4cHJf bGlzdF9pdGVtcyBkb3N0bXRfb3B0X2xpc3QKKwkJCQl0cmFuc2Zvcm1fZWxlbWVudF9saXN0IHRy YW5zZm9ybV90eXBlX2xpc3QgdHJhbnNmb3JtX3R5cGVfbGlzdF9pdGVtcwogCQkJCVRyaWdnZXJU cmFuc2l0aW9ucyBUcmlnZ2VyUmVmZXJlbmNpbmcKLQkJCQl2YWN1dW1fcmVsYXRpb25fbGlzdCBv cHRfdmFjdXVtX3JlbGF0aW9uX2xpc3QKLQkJCQlkcm9wX29wdGlvbl9saXN0IHB1Yl9vYmpfbGlz dCBwdWJfYWxsX29ial90eXBlX2xpc3QKKwkJCQl2YWN1dW1fcmVsYXRpb25fbGlzdCB2YWN1dW1f cmVsYXRpb25fbGlzdF9pdGVtcyBvcHRfdmFjdXVtX3JlbGF0aW9uX2xpc3QKKwkJCQlkcm9wX29w dGlvbl9saXN0IGRyb3Bfb3B0aW9uX2xpc3RfaXRlbXMKKwkJCQlwdWJfb2JqX2xpc3QgcHViX29i al9saXN0X2l0ZW1zIHB1Yl9hbGxfb2JqX3R5cGVfbGlzdCBwdWJfYWxsX29ial90eXBlX2xpc3Rf aXRlbXMKIAogJXR5cGUgPHJldGNsYXVzZT4gcmV0dXJuaW5nX2NsYXVzZQogJXR5cGUgPG5vZGU+ CXJldHVybmluZ19vcHRpb24KICV0eXBlIDxyZXRvcHRpb25raW5kPiByZXR1cm5pbmdfb3B0aW9u X2tpbmQKICV0eXBlIDxub2RlPglvcHRfcm91dGluZV9ib2R5CiAldHlwZSA8Z3JvdXBjbGF1c2U+ IGdyb3VwX2NsYXVzZQotJXR5cGUgPGxpc3Q+CWdyb3VwX2J5X2xpc3QKKyV0eXBlIDxsaXN0Pgln cm91cF9ieV9saXN0IGdyb3VwX2J5X2xpc3RfaXRlbXMKICV0eXBlIDxub2RlPglncm91cF9ieV9p dGVtIGVtcHR5X2dyb3VwaW5nX3NldCByb2xsdXBfY2xhdXNlIGN1YmVfY2xhdXNlCiAldHlwZSA8 bm9kZT4JZ3JvdXBpbmdfc2V0c19jbGF1c2UKIApAQCAtNTM0LDE1ICs1NDQsMTYgQEAgc3RhdGlj IE5vZGUgKm1ha2VSZWN1cnNpdmVWaWV3U2VsZWN0KGNoYXIgKnJlbG5hbWUsIExpc3QgKmFsaWFz ZXMsIE5vZGUgKnF1ZXJ5KTsKIAkJCQljb2x1bW5yZWYgaGF2aW5nX2NsYXVzZSBmdW5jX3RhYmxl IHhtbHRhYmxlIGFycmF5X2V4cHIKIAkJCQlPcHRXaGVyZUNsYXVzZSBvcGVyYXRvcl9kZWZfYXJn CiAldHlwZSA8bGlzdD4Jb3B0X2NvbHVtbl9hbmRfcGVyaW9kX2xpc3QKLSV0eXBlIDxsaXN0Pgly b3dzZnJvbV9pdGVtIHJvd3Nmcm9tX2xpc3Qgb3B0X2NvbF9kZWZfbGlzdAorJXR5cGUgPGxpc3Q+ CXJvd3Nmcm9tX2l0ZW0gcm93c2Zyb21fbGlzdCByb3dzZnJvbV9saXN0X2l0ZW1zIG9wdF9jb2xf ZGVmX2xpc3QKICV0eXBlIDxib29sZWFuPiBvcHRfb3JkaW5hbGl0eSBvcHRfd2l0aG91dF9vdmVy bGFwcwotJXR5cGUgPGxpc3Q+CUV4Y2x1c2lvbkNvbnN0cmFpbnRMaXN0IEV4Y2x1c2lvbkNvbnN0 cmFpbnRFbGVtCi0ldHlwZSA8bGlzdD4JZnVuY19hcmdfbGlzdCBmdW5jX2FyZ19saXN0X29wdAor JXR5cGUgPGxpc3Q+CUV4Y2x1c2lvbkNvbnN0cmFpbnRMaXN0IEV4Y2x1c2lvbkNvbnN0cmFpbnRM aXN0SXRlbXMgRXhjbHVzaW9uQ29uc3RyYWludEVsZW0KKyV0eXBlIDxsaXN0PglmdW5jX2FyZ19s aXN0IGZ1bmNfYXJnX2xpc3Rfbm9fdHJhaWxpbmdfY29tbWEgZnVuY19hcmdfbGlzdF9pdGVtcyBm dW5jX2FyZ19saXN0X29wdAogJXR5cGUgPG5vZGU+CWZ1bmNfYXJnX2V4cHIKLSV0eXBlIDxsaXN0 Pglyb3cgZXhwbGljaXRfcm93IGltcGxpY2l0X3JvdyB0eXBlX2xpc3QgYXJyYXlfZXhwcl9saXN0 CisldHlwZSA8bGlzdD4Jcm93IGV4cGxpY2l0X3JvdyBpbXBsaWNpdF9yb3cgdHlwZV9saXN0IHR5 cGVfbGlzdF9pdGVtcyBhcnJheV9leHByX2xpc3QgYXJyYXlfZXhwcl9saXN0X2l0ZW1zCiAldHlw ZSA8bm9kZT4JY2FzZV9leHByIGNhc2VfYXJnIHdoZW5fY2xhdXNlIGNhc2VfZGVmYXVsdAogJXR5 cGUgPGxpc3Q+CXdoZW5fY2xhdXNlX2xpc3QKICV0eXBlIDxub2RlPglvcHRfc2VhcmNoX2NsYXVz ZSBvcHRfY3ljbGVfY2xhdXNlCisldHlwZSA8Ym9vbGVhbj4gZGVwdGhfb3JfYnJlYWR0aAogJXR5 cGUgPGl2YWw+CXN1Yl90eXBlIG9wdF9tYXRlcmlhbGl6ZWQKICV0eXBlIDxub2RlPglOdW1lcmlj T25seQogJXR5cGUgPGxpc3Q+CU51bWVyaWNPbmx5X2xpc3QKQEAgLTU2MiwxMyArNTczLDEzIEBA IHN0YXRpYyBOb2RlICptYWtlUmVjdXJzaXZlVmlld1NlbGVjdChjaGFyICpyZWxuYW1lLCBMaXN0 ICphbGlhc2VzLCBOb2RlICpxdWVyeSk7CiAldHlwZSA8c3RyPgkJZ2VuZXJpY19vcHRpb25fbmFt ZQogJXR5cGUgPG5vZGU+CWdlbmVyaWNfb3B0aW9uX2FyZwogJXR5cGUgPGRlZmVsdD4JZ2VuZXJp Y19vcHRpb25fZWxlbSBhbHRlcl9nZW5lcmljX29wdGlvbl9lbGVtCi0ldHlwZSA8bGlzdD4JZ2Vu ZXJpY19vcHRpb25fbGlzdCBhbHRlcl9nZW5lcmljX29wdGlvbl9saXN0CisldHlwZSA8bGlzdD4J Z2VuZXJpY19vcHRpb25fbGlzdCBnZW5lcmljX29wdGlvbl9saXN0X2l0ZW1zIGFsdGVyX2dlbmVy aWNfb3B0aW9uX2xpc3QgYWx0ZXJfZ2VuZXJpY19vcHRpb25fbGlzdF9pdGVtcwogCiAldHlwZSA8 aXZhbD4JcmVpbmRleF90YXJnZXRfcmVsYXRpb24gcmVpbmRleF90YXJnZXRfYWxsCiAKICV0eXBl IDxub2RlPgljb3B5X2dlbmVyaWNfb3B0X2FyZyBjb3B5X2dlbmVyaWNfb3B0X2FyZ19saXN0X2l0 ZW0KICV0eXBlIDxkZWZlbHQ+CWNvcHlfZ2VuZXJpY19vcHRfZWxlbQotJXR5cGUgPGxpc3Q+CWNv cHlfZ2VuZXJpY19vcHRfbGlzdCBjb3B5X2dlbmVyaWNfb3B0X2FyZ19saXN0CisldHlwZSA8bGlz dD4JY29weV9nZW5lcmljX29wdF9saXN0IGNvcHlfZ2VuZXJpY19vcHRfbGlzdF9pdGVtcyBjb3B5 X2dlbmVyaWNfb3B0X2FyZ19saXN0IGNvcHlfZ2VuZXJpY19vcHRfYXJnX2xpc3RfaXRlbXMKICV0 eXBlIDxsaXN0Pgljb3B5X29wdGlvbnMKIAogJXR5cGUgPHR5cG5hbT4JVHlwZW5hbWUgU2ltcGxl VHlwZW5hbWUgQ29uc3RUeXBlbmFtZQpAQCAtNjE4LDE1ICs2MjksMTUgQEAgc3RhdGljIE5vZGUg Km1ha2VSZWN1cnNpdmVWaWV3U2VsZWN0KGNoYXIgKnJlbG5hbWUsIExpc3QgKmFsaWFzZXMsIE5v ZGUgKnF1ZXJ5KTsKICV0eXBlIDxzdHI+CQlvcHRfcHJvdmlkZXIgc2VjdXJpdHlfbGFiZWwKIAog JXR5cGUgPHRhcmdldD4JeG1sX2F0dHJpYnV0ZV9lbAotJXR5cGUgPGxpc3Q+CXhtbF9hdHRyaWJ1 dGVfbGlzdCB4bWxfYXR0cmlidXRlcworJXR5cGUgPGxpc3Q+CXhtbF9hdHRyaWJ1dGVfbGlzdCB4 bWxfYXR0cmlidXRlX2xpc3RfaXRlbXMgeG1sX2F0dHJpYnV0ZXMKICV0eXBlIDxub2RlPgl4bWxf cm9vdF92ZXJzaW9uIG9wdF94bWxfcm9vdF9zdGFuZGFsb25lCiAldHlwZSA8bm9kZT4JeG1sZXhp c3RzX2FyZ3VtZW50CiAldHlwZSA8aXZhbD4JZG9jdW1lbnRfb3JfY29udGVudAogJXR5cGUgPGJv b2xlYW4+CXhtbF9pbmRlbnRfb3B0aW9uIHhtbF93aGl0ZXNwYWNlX29wdGlvbgotJXR5cGUgPGxp c3Q+CXhtbHRhYmxlX2NvbHVtbl9saXN0IHhtbHRhYmxlX2NvbHVtbl9vcHRpb25fbGlzdAorJXR5 cGUgPGxpc3Q+CXhtbHRhYmxlX2NvbHVtbl9saXN0IHhtbHRhYmxlX2NvbHVtbl9saXN0X2l0ZW1z IHhtbHRhYmxlX2NvbHVtbl9vcHRpb25fbGlzdAogJXR5cGUgPG5vZGU+CXhtbHRhYmxlX2NvbHVt bl9lbAogJXR5cGUgPGRlZmVsdD4JeG1sdGFibGVfY29sdW1uX29wdGlvbl9lbAotJXR5cGUgPGxp c3Q+CXhtbF9uYW1lc3BhY2VfbGlzdAorJXR5cGUgPGxpc3Q+CXhtbF9uYW1lc3BhY2VfbGlzdCB4 bWxfbmFtZXNwYWNlX2xpc3RfaXRlbXMKICV0eXBlIDx0YXJnZXQ+CXhtbF9uYW1lc3BhY2VfZWwK IAogJXR5cGUgPG5vZGU+CWZ1bmNfYXBwbGljYXRpb24gZnVuY19leHByX2NvbW1vbl9zdWJleHBy CkBAIC02MzcsNyArNjQ4LDcgQEAgc3RhdGljIE5vZGUgKm1ha2VSZWN1cnNpdmVWaWV3U2VsZWN0 KGNoYXIgKnJlbG5hbWUsIExpc3QgKmFsaWFzZXMsIE5vZGUgKnF1ZXJ5KTsKIAogJXR5cGUgPGxp c3Q+CXdpdGhpbl9ncm91cF9jbGF1c2UKICV0eXBlIDxub2RlPglmaWx0ZXJfY2xhdXNlCi0ldHlw ZSA8bGlzdD4Jd2luZG93X2NsYXVzZSB3aW5kb3dfZGVmaW5pdGlvbl9saXN0IG9wdF9wYXJ0aXRp b25fY2xhdXNlCisldHlwZSA8bGlzdD4Jd2luZG93X2NsYXVzZSB3aW5kb3dfZGVmaW5pdGlvbl9s aXN0IHdpbmRvd19kZWZpbml0aW9uX2xpc3RfaXRlbXMgb3B0X3BhcnRpdGlvbl9jbGF1c2UKICV0 eXBlIDx3aW5kZWY+CXdpbmRvd19kZWZpbml0aW9uIG92ZXJfY2xhdXNlIHdpbmRvd19zcGVjaWZp Y2F0aW9uCiAJCQkJb3B0X2ZyYW1lX2NsYXVzZSBmcmFtZV9leHRlbnQgZnJhbWVfYm91bmQKICV0 eXBlIDxpdmFsPgludWxsX3RyZWF0bWVudCBvcHRfd2luZG93X2V4Y2x1c2lvbl9jbGF1c2UKQEAg LTY0NywxMSArNjU4LDExIEBAIHN0YXRpYyBOb2RlICptYWtlUmVjdXJzaXZlVmlld1NlbGVjdChj aGFyICpyZWxuYW1lLCBMaXN0ICphbGlhc2VzLCBOb2RlICpxdWVyeSk7CiAldHlwZSA8aXZhbD4J Z2VuZXJhdGVkX3doZW4gb3ZlcnJpZGVfa2luZCBvcHRfdmlydHVhbF9vcl9zdG9yZWQKICV0eXBl IDxwYXJ0c3BlYz4JUGFydGl0aW9uU3BlYyBPcHRQYXJ0aXRpb25TcGVjCiAldHlwZSA8cGFydGVs ZW0+CXBhcnRfZWxlbQotJXR5cGUgPGxpc3Q+CQlwYXJ0X3BhcmFtcworJXR5cGUgPGxpc3Q+CQlw YXJ0X3BhcmFtcyBwYXJ0X3BhcmFtc19pdGVtcwogJXR5cGUgPHBhcnRib3VuZHNwZWM+IFBhcnRp dGlvbkJvdW5kU3BlYwogJXR5cGUgPHNpbmdsZXBhcnRzcGVjPglTaW5nbGVQYXJ0aXRpb25TcGVj CiAldHlwZSA8bGlzdD4JCXBhcnRpdGlvbnNfbGlzdAotJXR5cGUgPGxpc3Q+CQloYXNoX3BhcnRi b3VuZAorJXR5cGUgPGxpc3Q+CQloYXNoX3BhcnRib3VuZCBoYXNoX3BhcnRib3VuZF9lbGVtX2l0 ZW1zCiAldHlwZSA8ZGVmZWx0PgkJaGFzaF9wYXJ0Ym91bmRfZWxlbQogCiAldHlwZSA8bm9kZT4J anNvbl9mb3JtYXRfY2xhdXNlCkBAIC02NzIsNyArNjgzLDcgQEAgc3RhdGljIE5vZGUgKm1ha2VS ZWN1cnNpdmVWaWV3U2VsZWN0KGNoYXIgKnJlbG5hbWUsIExpc3QgKmFsaWFzZXMsIE5vZGUgKnF1 ZXJ5KTsKIAkJCQlqc29uX2FyZ3VtZW50cwogCQkJCWpzb25fYmVoYXZpb3JfY2xhdXNlX29wdAog CQkJCWpzb25fcGFzc2luZ19jbGF1c2Vfb3B0Ci0JCQkJanNvbl90YWJsZV9jb2x1bW5fZGVmaW5p dGlvbl9saXN0CisJCQkJanNvbl90YWJsZV9jb2x1bW5fZGVmaW5pdGlvbl9saXN0IGpzb25fdGFi bGVfY29sdW1uX2RlZmluaXRpb25fbGlzdF9pdGVtcwogJXR5cGUgPHN0cj4JCWpzb25fdGFibGVf cGF0aF9uYW1lX29wdAogJXR5cGUgPGl2YWw+CWpzb25fYmVoYXZpb3JfdHlwZQogCQkJCWpzb25f cHJlZGljYXRlX3R5cGVfY29uc3RyYWludApAQCAtODkxLDYgKzkwMiw5IEBAIHN0YXRpYyBOb2Rl ICptYWtlUmVjdXJzaXZlVmlld1NlbGVjdChjaGFyICpyZWxuYW1lLCBMaXN0ICphbGlhc2VzLCBO b2RlICpxdWVyeSk7CiAlbm9uYXNzb2MJVU5CT1VOREVEIE5FU1RFRCAvKiBpZGVhbGx5IHdvdWxk IGhhdmUgc2FtZSBwcmVjZWRlbmNlIGFzIElERU5UICovCiAlbm9uYXNzb2MJSURFTlQgUEFSVElU SU9OIFJBTkdFIFJPV1MgR1JPVVBTIFBSRUNFRElORyBGT0xMT1dJTkcgQ1VCRSBST0xMVVAKIAkJ CVNFVCBLRVlTIE9CSkVDVF9QIFNDQUxBUiBWQUxVRV9QIFdJVEggV0lUSE9VVCBQQVRICislbm9u YXNzb2MJREVGRVJSRUQgSU1NRURJQVRFIFNLSVAgTk9XQUlUIFJFU1RSSUNUIENBU0NBREUgUkVW T0tFIFJFUExBQ0UgUEVSSU9EIEdSQU5URUQKKyVub25hc3NvYwlSRVNUQVJUIENPTlRJTlVFX1AK KyVub25hc3NvYwlBRE1JTiBDT05ORUNUSU9OIElOSEVSSVQgRU5DUllQVEVEIFBBU1NXT1JEIFJP TEUgU1lTSUQgVU5FTkNSWVBURUQgVkFMSUQKICVsZWZ0CQlPcCBPUEVSQVRPUgkJLyogbXVsdGkt Y2hhcmFjdGVyIG9wcyBhbmQgdXNlci1kZWZpbmVkIG9wZXJhdG9ycyAqLwogJWxlZnQJCScrJyAn LScKICVsZWZ0CQknKicgJy8nICclJwpAQCAtOTAzLDYgKzkxNyw3IEBAIHN0YXRpYyBOb2RlICpt YWtlUmVjdXJzaXZlVmlld1NlbGVjdChjaGFyICpyZWxuYW1lLCBMaXN0ICphbGlhc2VzLCBOb2Rl ICpxdWVyeSk7CiAlbGVmdAkJJygnICcpJwogJWxlZnQJCVRZUEVDQVNUCiAlbGVmdAkJJy4nCisl bGVmdAkJJywnCiAvKgogICogVGhlc2UgbWlnaHQgc2VlbSB0byBiZSBsb3ctcHJlY2VkZW5jZSwg YnV0IGFjdHVhbGx5IHRoZXkgYXJlIG5vdCBwYXJ0CiAgKiBvZiB0aGUgYXJpdGhtZXRpYyBoaWVy YXJjaHkgYXQgYWxsIGluIHRoZWlyIHVzZSBhcyBKT0lOIG9wZXJhdG9ycy4KQEAgLTExMzEsNiAr MTE0NiwxMSBAQCBzdG10OgogLyoKICAqIEdlbmVyaWMgc3VwcG9ydGluZyBwcm9kdWN0aW9ucyBm b3IgRERMCiAgKi8KK29wdF90cmFpbGluZ19jb21tYToKKwkJCSAnLCcJCQkJCQkJeyAkJCA9IE5V TEw7IH0KKwkJCXwgLyogRU1QVFkgKi8JCQkJCXsgJCQgPSBOVUxMOyB9CisJCQk7CisKIG9wdF9z aW5nbGVfbmFtZToKIAkJCUNvbElkCQkJCQkJCXsgJCQgPSAkMTsgfQogCQkJfCAvKiBFTVBUWSAq LwkJCQkJeyAkJCA9IE5VTEw7IH0KQEAgLTExNTgsMTQgKzExNzgsMTIgQEAgb3B0X3V0aWxpdHlf b3B0aW9uX2xpc3Q6CiAJCTsKIAogdXRpbGl0eV9vcHRpb25fbGlzdDoKLQkJCXV0aWxpdHlfb3B0 aW9uX2VsZW0KLQkJCQl7Ci0JCQkJCSQkID0gbGlzdF9tYWtlMSgkMSk7Ci0JCQkJfQotCQkJfCB1 dGlsaXR5X29wdGlvbl9saXN0ICcsJyB1dGlsaXR5X29wdGlvbl9lbGVtCi0JCQkJewotCQkJCQkk JCA9IGxhcHBlbmQoJDEsICQzKTsKLQkJCQl9CisJCQl1dGlsaXR5X29wdGlvbl9saXN0X2l0ZW1z IG9wdF90cmFpbGluZ19jb21tYSAJCQl7ICQkID0gJDE7IH0KKwkJOworCit1dGlsaXR5X29wdGlv bl9saXN0X2l0ZW1zOgorCQkJdXRpbGl0eV9vcHRpb25fZWxlbQkJCQkJCQkJCQl7ICQkID0gbGlz dF9tYWtlMSgkMSk7IH0KKwkJCXwgdXRpbGl0eV9vcHRpb25fbGlzdF9pdGVtcyAnLCcgdXRpbGl0 eV9vcHRpb25fZWxlbQkJeyAkJCA9IGxhcHBlbmQoJDEsICQzKTsgfQogCQk7CiAKIHV0aWxpdHlf b3B0aW9uX2VsZW06CkBAIC0yMzg0LDggKzI0MDIsMTIgQEAgQWx0ZXJUYWJsZVN0bXQ6CiAJCTsK IAogYWx0ZXJfdGFibGVfY21kczoKLQkJCWFsdGVyX3RhYmxlX2NtZAkJCQkJCQl7ICQkID0gbGlz dF9tYWtlMSgkMSk7IH0KLQkJCXwgYWx0ZXJfdGFibGVfY21kcyAnLCcgYWx0ZXJfdGFibGVfY21k CXsgJCQgPSBsYXBwZW5kKCQxLCAkMyk7IH0KKwkJCWFsdGVyX3RhYmxlX2NtZHNfaXRlbXMgb3B0 X3RyYWlsaW5nX2NvbW1hCQl7ICQkID0gJDE7IH0KKwkJOworCithbHRlcl90YWJsZV9jbWRzX2l0 ZW1zOgorCQkJYWx0ZXJfdGFibGVfY21kCQkJCQkJCQkJeyAkJCA9IGxpc3RfbWFrZTEoJDEpOyB9 CisJCQl8IGFsdGVyX3RhYmxlX2NtZHNfaXRlbXMgJywnIGFsdGVyX3RhYmxlX2NtZAl7ICQkID0g bGFwcGVuZCgkMSwgJDMpOyB9CiAJCTsKIAogcGFydGl0aW9uc19saXN0OgpAQCAtMzE5MCw4ICsz MjEyLDEyIEBAIG9wdF9yZWxvcHRpb25zOgkJV0lUSCByZWxvcHRpb25zCQkJCQl7ICQkID0gJDI7 IH0KIAkJOwogCiByZWxvcHRpb25fbGlzdDoKLQkJCXJlbG9wdGlvbl9lbGVtCQkJCQkJCXsgJCQg PSBsaXN0X21ha2UxKCQxKTsgfQotCQkJfCByZWxvcHRpb25fbGlzdCAnLCcgcmVsb3B0aW9uX2Vs ZW0JCXsgJCQgPSBsYXBwZW5kKCQxLCAkMyk7IH0KKwkJCXJlbG9wdGlvbl9saXN0X2l0ZW1zIG9w dF90cmFpbGluZ19jb21tYQkJeyAkJCA9ICQxOyB9CisJCTsKKworcmVsb3B0aW9uX2xpc3RfaXRl bXM6CisJCQlyZWxvcHRpb25fZWxlbQkJCQkJCQkJeyAkJCA9IGxpc3RfbWFrZTEoJDEpOyB9CisJ CQl8IHJlbG9wdGlvbl9saXN0X2l0ZW1zICcsJyByZWxvcHRpb25fZWxlbQl7ICQkID0gbGFwcGVu ZCgkMSwkMyk7IH0KIAkJOwogCiAvKiBUaGlzIHNob3VsZCBtYXRjaCBkZWZfZWxlbSBhbmQgYWxz byBhbGxvdyBxdWFsaWZpZWQgbmFtZXMgKi8KQEAgLTMzNjEsMTQgKzMzODcsMTIgQEAgaGFzaF9w YXJ0Ym91bmRfZWxlbToKIAkJOwogCiBoYXNoX3BhcnRib3VuZDoKLQkJaGFzaF9wYXJ0Ym91bmRf ZWxlbQotCQkJewotCQkJCSQkID0gbGlzdF9tYWtlMSgkMSk7Ci0JCQl9Ci0JCXwgaGFzaF9wYXJ0 Ym91bmQgJywnIGhhc2hfcGFydGJvdW5kX2VsZW0KLQkJCXsKLQkJCQkkJCA9IGxhcHBlbmQoJDEs ICQzKTsKLQkJCX0KKwkJCWhhc2hfcGFydGJvdW5kX2VsZW1faXRlbXMgb3B0X3RyYWlsaW5nX2Nv bW1hCQl7ICQkID0gJDE7IH0KKwkJOworCitoYXNoX3BhcnRib3VuZF9lbGVtX2l0ZW1zOgorCQkJ aGFzaF9wYXJ0Ym91bmRfZWxlbQkJCQkJCQkJCXsgJCQgPSBsaXN0X21ha2UxKCQxKTsgfQorCQkJ fCBoYXNoX3BhcnRib3VuZF9lbGVtX2l0ZW1zICcsJyBoYXNoX3BhcnRib3VuZF9lbGVtCXsgJCQg PSBsYXBwZW5kKCQxLCQzKTsgfQogCQk7CiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioq KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgpAQCAtMzM5 Miw4ICszNDE2LDEyIEBAIEFsdGVyQ29tcG9zaXRlVHlwZVN0bXQ6CiAJCQk7CiAKIGFsdGVyX3R5 cGVfY21kczoKLQkJCWFsdGVyX3R5cGVfY21kCQkJCQkJCXsgJCQgPSBsaXN0X21ha2UxKCQxKTsg fQotCQkJfCBhbHRlcl90eXBlX2NtZHMgJywnIGFsdGVyX3R5cGVfY21kCXsgJCQgPSBsYXBwZW5k KCQxLCAkMyk7IH0KKwkJCWFsdGVyX3R5cGVfY21kc19pdGVtcyBvcHRfdHJhaWxpbmdfY29tbWEJ eyAkJCA9ICQxOyB9CisJCTsKKworYWx0ZXJfdHlwZV9jbWRzX2l0ZW1zOgorCQkJYWx0ZXJfdHlw ZV9jbWQJCQkJCQkJCXsgJCQgPSBsaXN0X21ha2UxKCQxKTsgfQorCQkJfCBhbHRlcl90eXBlX2Nt ZHNfaXRlbXMgJywnIGFsdGVyX3R5cGVfY21kCXsgJCQgPSBsYXBwZW5kKCQxLCAkMyk7IH0KIAkJ OwogCiBhbHRlcl90eXBlX2NtZDoKQEAgLTM2NzYsMTQgKzM3MDQsMTIgQEAgb3B0X3VzaW5nOgog CiAvKiBuZXcgQ09QWSBvcHRpb24gc3ludGF4ICovCiBjb3B5X2dlbmVyaWNfb3B0X2xpc3Q6Ci0J CQljb3B5X2dlbmVyaWNfb3B0X2VsZW0KLQkJCQl7Ci0JCQkJCSQkID0gbGlzdF9tYWtlMSgkMSk7 Ci0JCQkJfQotCQkJfCBjb3B5X2dlbmVyaWNfb3B0X2xpc3QgJywnIGNvcHlfZ2VuZXJpY19vcHRf ZWxlbQotCQkJCXsKLQkJCQkJJCQgPSBsYXBwZW5kKCQxLCAkMyk7Ci0JCQkJfQorCQkJY29weV9n ZW5lcmljX29wdF9saXN0X2l0ZW1zIG9wdF90cmFpbGluZ19jb21tYQkJCXsgJCQgPSAkMTsgfQor CQkJOworCitjb3B5X2dlbmVyaWNfb3B0X2xpc3RfaXRlbXM6CisJCQljb3B5X2dlbmVyaWNfb3B0 X2VsZW0JCQkJCQkJCQl7ICQkID0gbGlzdF9tYWtlMSgkMSk7IH0KKwkJCXwgY29weV9nZW5lcmlj X29wdF9saXN0X2l0ZW1zICcsJyBjb3B5X2dlbmVyaWNfb3B0X2VsZW0JeyAkJCA9IGxhcHBlbmQo JDEsICQzKTsgfQogCQk7CiAKIGNvcHlfZ2VuZXJpY19vcHRfZWxlbToKQEAgLTM3MDMsMTQgKzM3 MjksMTQgQEAgY29weV9nZW5lcmljX29wdF9hcmc6CiAJCTsKIAogY29weV9nZW5lcmljX29wdF9h cmdfbGlzdDoKLQkJCSAgY29weV9nZW5lcmljX29wdF9hcmdfbGlzdF9pdGVtCi0JCQkJewotCQkJ CQkkJCA9IGxpc3RfbWFrZTEoJDEpOwotCQkJCX0KLQkJCXwgY29weV9nZW5lcmljX29wdF9hcmdf bGlzdCAnLCcgY29weV9nZW5lcmljX29wdF9hcmdfbGlzdF9pdGVtCi0JCQkJewotCQkJCQkkJCA9 IGxhcHBlbmQoJDEsICQzKTsKLQkJCQl9CisJCQljb3B5X2dlbmVyaWNfb3B0X2FyZ19saXN0X2l0 ZW1zIG9wdF90cmFpbGluZ19jb21tYQl7ICQkID0gJDE7IH0KKwkJOworCitjb3B5X2dlbmVyaWNf b3B0X2FyZ19saXN0X2l0ZW1zOgorCQkJY29weV9nZW5lcmljX29wdF9hcmdfbGlzdF9pdGVtCisJ CQkJCQkJCQkJCQkJCQkJeyAkJCA9IGxpc3RfbWFrZTEoJDEpOyB9CisJCQl8IGNvcHlfZ2VuZXJp Y19vcHRfYXJnX2xpc3RfaXRlbXMgJywnIGNvcHlfZ2VuZXJpY19vcHRfYXJnX2xpc3RfaXRlbQor CQkJCQkJCQkJCQkJCQkJCXsgJCQgPSBsYXBwZW5kKCQxLCQzKTsgfQogCQk7CiAKIC8qIGJld2Fy ZSBvZiBlbWl0dGluZyBub24tc3RyaW5nIGxpc3QgZWxlbWVudHMgaGVyZTsgc2VlIGNvbW1hbmRz L2RlZmluZS5jICovCkBAIC0zODk2LDI1ICszOTIyLDIxIEBAIE9wdFR5cGVkVGFibGVFbGVtZW50 TGlzdDoKIAkJOwogCiBUYWJsZUVsZW1lbnRMaXN0OgotCQkJVGFibGVFbGVtZW50Ci0JCQkJewot CQkJCQkkJCA9IGxpc3RfbWFrZTEoJDEpOwotCQkJCX0KLQkJCXwgVGFibGVFbGVtZW50TGlzdCAn LCcgVGFibGVFbGVtZW50Ci0JCQkJewotCQkJCQkkJCA9IGxhcHBlbmQoJDEsICQzKTsKLQkJCQl9 CisJCQlUYWJsZUVsZW1lbnRMaXN0SXRlbXMgb3B0X3RyYWlsaW5nX2NvbW1hCXsgJCQgPSAkMTsg fQorCQk7CisKK1RhYmxlRWxlbWVudExpc3RJdGVtczoKKwkJCVRhYmxlRWxlbWVudAkJCQkJCQkJ eyAkJCA9IGxpc3RfbWFrZTEoJDEpOyB9CisJCQl8IFRhYmxlRWxlbWVudExpc3RJdGVtcyAnLCcg VGFibGVFbGVtZW50CXsgJCQgPSBsYXBwZW5kKCQxLCAkMyk7IH0KIAkJOwogCiBUeXBlZFRhYmxl RWxlbWVudExpc3Q6Ci0JCQlUeXBlZFRhYmxlRWxlbWVudAotCQkJCXsKLQkJCQkJJCQgPSBsaXN0 X21ha2UxKCQxKTsKLQkJCQl9Ci0JCQl8IFR5cGVkVGFibGVFbGVtZW50TGlzdCAnLCcgVHlwZWRU YWJsZUVsZW1lbnQKLQkJCQl7Ci0JCQkJCSQkID0gbGFwcGVuZCgkMSwgJDMpOwotCQkJCX0KKwkJ CVR5cGVkVGFibGVFbGVtZW50TGlzdEl0ZW1zIG9wdF90cmFpbGluZ19jb21tYQkJeyAkJCA9ICQx OyB9CisJCTsKKworVHlwZWRUYWJsZUVsZW1lbnRMaXN0SXRlbXM6CisJCQlUeXBlZFRhYmxlRWxl bWVudAkJCQkJCQkJCXsgJCQgPSBsaXN0X21ha2UxKCQxKTsgfQorCQkJfCBUeXBlZFRhYmxlRWxl bWVudExpc3RJdGVtcyAnLCcgVHlwZWRUYWJsZUVsZW1lbnQJeyAkJCA9IGxhcHBlbmQoJDEsJDMp OyB9CiAJCTsKIAogVGFibGVFbGVtZW50OgpAQCAtNDUyNiwxMiArNDU0OCwxNCBAQCBvcHRfbm9f aW5oZXJpdDoJTk8gSU5IRVJJVAkJCQkJCQl7ICAkJCA9IHRydWU7IH0KIAkJOwogCiBvcHRfd2l0 aG91dF9vdmVybGFwczoKLQkJCVdJVEhPVVQgT1ZFUkxBUFMJCQkJCQl7ICQkID0gdHJ1ZTsgfQor CQkJJywnCQkJCQkJCQkJCXsgJCQgPSBmYWxzZTsgfQorCQkJfCAnLCcgV0lUSE9VVCBPVkVSTEFQ UwkJCQkJeyAkJCA9IHRydWU7IH0KKwkJCXwgV0lUSE9VVCBPVkVSTEFQUwkJCQkJCXsgJCQgPSB0 cnVlOyB9CiAJCQl8IC8qRU1QVFkqLwkJCQkJCQkJeyAkJCA9IGZhbHNlOyB9CiAJOwogCiBvcHRf Y29sdW1uX2xpc3Q6Ci0JCQknKCcgY29sdW1uTGlzdCAnKScJCQkJCQl7ICQkID0gJDI7IH0KKwkJ CScoJyBjb2x1bW5MaXN0T3B0aW9uYWxDb21tYSAnKScJCQkJCQl7ICQkID0gJDI7IH0KIAkJCXwg LypFTVBUWSovCQkJCQkJCQl7ICQkID0gTklMOyB9CiAJCTsKIApAQCAtNDU0MCw5ICs0NTY0LDIw IEBAIGNvbHVtbkxpc3Q6CiAJCQl8IGNvbHVtbkxpc3QgJywnIGNvbHVtbkVsZW0JCQkJeyAkJCA9 IGxhcHBlbmQoJDEsICQzKTsgfQogCQk7CiAKK2NvbHVtbkxpc3RPcHRpb25hbENvbW1hOgorCQkJ Y29sdW1uTGlzdEl0ZW1zIG9wdF90cmFpbGluZ19jb21tYQkJeyAkJCA9ICQxOyB9CisJCTsKKwor Y29sdW1uTGlzdEl0ZW1zOgorCQkJY29sdW1uRWxlbQkJCQkJCQkJeyAkJCA9IGxpc3RfbWFrZTEo JDEpOyB9CisJCQl8IGNvbHVtbkxpc3RJdGVtcyAnLCcgY29sdW1uRWxlbQkJeyAkJCA9IGxhcHBl bmQoJDEsJDMpOyB9CisJCTsKKwogb3B0aW9uYWxQZXJpb2ROYW1lOgotCQkJJywnIFBFUklPRCBj b2x1bW5FbGVtIHsgJCQgPSAkMzsgfQotCQkJfCAvKkVNUFRZKi8gICAgICAgICAgICAgICB7ICQk ID0gTlVMTDsgfQorCQkJJywnCQkJCQkJeyAkJCA9IE5VTEw7IH0KKwkJCXwgUEVSSU9EIGNvbHVt bkVsZW0JCXsgJCQgPSAkMjsgfQorCQkJfCAnLCcgUEVSSU9EIGNvbHVtbkVsZW0JeyAkJCA9ICQz OyB9CisJCQl8IC8qRU1QVFkqLwkJCQl7ICQkID0gTlVMTDsgfQogCTsKIAogb3B0X2NvbHVtbl9h bmRfcGVyaW9kX2xpc3Q6CkBAIC00NTU2LDcgKzQ1OTEsNyBAQCBjb2x1bW5FbGVtOiBDb2xJZAog CQkJCX0KIAkJOwogCi1vcHRfY19pbmNsdWRlOglJTkNMVURFICcoJyBjb2x1bW5MaXN0ICcpJwkJ CXsgJCQgPSAkMzsgfQorb3B0X2NfaW5jbHVkZToJSU5DTFVERSAnKCcgY29sdW1uTGlzdE9wdGlv bmFsQ29tbWEgJyknCQkJeyAkJCA9ICQzOyB9CiAJCQkgfAkJLyogRU1QVFkgKi8JCQkJCQl7ICQk ID0gTklMOyB9CiAJCTsKIApAQCAtNDU4Myw5ICs0NjE4LDEzIEBAIGtleV9tYXRjaDogIE1BVENI IEZVTEwKIAkJOwogCiBFeGNsdXNpb25Db25zdHJhaW50TGlzdDoKLQkJCUV4Y2x1c2lvbkNvbnN0 cmFpbnRFbGVtCQkJCQl7ICQkID0gbGlzdF9tYWtlMSgkMSk7IH0KLQkJCXwgRXhjbHVzaW9uQ29u c3RyYWludExpc3QgJywnIEV4Y2x1c2lvbkNvbnN0cmFpbnRFbGVtCi0JCQkJCQkJCQkJCQkJeyAk JCA9IGxhcHBlbmQoJDEsICQzKTsgfQorCQkJRXhjbHVzaW9uQ29uc3RyYWludExpc3RJdGVtcyAJ CQkJCXsgJCQgPSAkMTsgfQorCQk7CisKK0V4Y2x1c2lvbkNvbnN0cmFpbnRMaXN0SXRlbXM6CisJ CQlFeGNsdXNpb25Db25zdHJhaW50RWxlbSAJCQkJCQl7ICQkID0gbGlzdF9tYWtlMSgkMSk7IH0K KwkJCXwgRXhjbHVzaW9uQ29uc3RyYWludExpc3RJdGVtcyAnLCcgRXhjbHVzaW9uQ29uc3RyYWlu dEVsZW0KKwkJCQkJCQkJCQkJCQkJCXsgJCQgPSBsYXBwZW5kKCQxLCAkMyk7IH0KIAkJOwogCiBF eGNsdXNpb25Db25zdHJhaW50RWxlbTogaW5kZXhfZWxlbSBXSVRIIGFueV9vcGVyYXRvcgpAQCAt NDczNyw4ICs0Nzc2LDEzIEBAIFBhcnRpdGlvblNwZWM6IFBBUlRJVElPTiBCWSBDb2xJZCAnKCcg cGFydF9wYXJhbXMgJyknCiAJCQkJfQogCQk7CiAKLXBhcnRfcGFyYW1zOglwYXJ0X2VsZW0JCQkJ CQl7ICQkID0gbGlzdF9tYWtlMSgkMSk7IH0KLQkJCXwgcGFydF9wYXJhbXMgJywnIHBhcnRfZWxl bQkJCXsgJCQgPSBsYXBwZW5kKCQxLCAkMyk7IH0KK3BhcnRfcGFyYW1zOgorCQkJcGFydF9wYXJh bXNfaXRlbXMgb3B0X3RyYWlsaW5nX2NvbW1hCXsgJCQgPSAkMTsgfQorCQk7CisKK3BhcnRfcGFy YW1zX2l0ZW1zOgorCQkJcGFydF9lbGVtCQkJCQkJCQl7ICQkID0gbGlzdF9tYWtlMSgkMSk7IH0K KwkJCXwgcGFydF9wYXJhbXNfaXRlbXMgJywnIHBhcnRfZWxlbQkJeyAkJCA9IGxhcHBlbmQoJDEs ICQzKTsgfQogCQk7CiAKIHBhcnRfZWxlbTogQ29sSWQgb3B0X2NvbGxhdGUgb3B0X3F1YWxpZmll ZF9uYW1lCkBAIC00ODU3LDggKzQ5MDEsMTMgQEAgQ3JlYXRlU3RhdHNTdG10OgogICogd3JpdHRl biB3aXRob3V0IHBhcmVucy4KICAqLwogCi1zdGF0c19wYXJhbXM6CXN0YXRzX3BhcmFtCQkJCQkJ CXsgJCQgPSBsaXN0X21ha2UxKCQxKTsgfQotCQkJfCBzdGF0c19wYXJhbXMgJywnIHN0YXRzX3Bh cmFtCQkJeyAkJCA9IGxhcHBlbmQoJDEsICQzKTsgfQorc3RhdHNfcGFyYW1zOgorCQkJc3RhdHNf cGFyYW1zX2l0ZW1zIG9wdF90cmFpbGluZ19jb21tYQl7ICQkID0gJDE7IH0KKwkJOworCitzdGF0 c19wYXJhbXNfaXRlbXM6CisJCQlzdGF0c19wYXJhbQkJCQkJCQkJeyAkJCA9IGxpc3RfbWFrZTEo JDEpOyB9CisJCQl8IHN0YXRzX3BhcmFtc19pdGVtcyAnLCcgc3RhdHNfcGFyYW0JeyAkJCA9IGxh cHBlbmQoJDEsICQzKTsgfQogCQk7CiAKIHN0YXRzX3BhcmFtOglDb2xJZApAQCAtNTYyNiwxNCAr NTY3NSwxMiBAQCBjcmVhdGVfZ2VuZXJpY19vcHRpb25zOgogCQk7CiAKIGdlbmVyaWNfb3B0aW9u X2xpc3Q6Ci0JCQlnZW5lcmljX29wdGlvbl9lbGVtCi0JCQkJewotCQkJCQkkJCA9IGxpc3RfbWFr ZTEoJDEpOwotCQkJCX0KLQkJCXwgZ2VuZXJpY19vcHRpb25fbGlzdCAnLCcgZ2VuZXJpY19vcHRp b25fZWxlbQotCQkJCXsKLQkJCQkJJCQgPSBsYXBwZW5kKCQxLCAkMyk7Ci0JCQkJfQorCQkJZ2Vu ZXJpY19vcHRpb25fbGlzdF9pdGVtcyBvcHRfdHJhaWxpbmdfY29tbWEJCXsgJCQgPSAkMTsgfQor CQk7CisKK2dlbmVyaWNfb3B0aW9uX2xpc3RfaXRlbXM6CisJCQlnZW5lcmljX29wdGlvbl9lbGVt CQkJCQkJCQkJeyAkJCA9IGxpc3RfbWFrZTEoJDEpOyB9CisJCQl8IGdlbmVyaWNfb3B0aW9uX2xp c3RfaXRlbXMgJywnIGdlbmVyaWNfb3B0aW9uX2VsZW0JeyAkJCA9IGxhcHBlbmQoJDEsICQzKTsg fQogCQk7CiAKIC8qIE9wdGlvbnMgZGVmaW5pdGlvbiBmb3IgQUxURVIgRkRXLCBTRVJWRVIgYW5k IFVTRVIgTUFQUElORyAqLwpAQCAtNTY0MiwxNCArNTY4OSwxMiBAQCBhbHRlcl9nZW5lcmljX29w dGlvbnM6CiAJCTsKIAogYWx0ZXJfZ2VuZXJpY19vcHRpb25fbGlzdDoKLQkJCWFsdGVyX2dlbmVy aWNfb3B0aW9uX2VsZW0KLQkJCQl7Ci0JCQkJCSQkID0gbGlzdF9tYWtlMSgkMSk7Ci0JCQkJfQot CQkJfCBhbHRlcl9nZW5lcmljX29wdGlvbl9saXN0ICcsJyBhbHRlcl9nZW5lcmljX29wdGlvbl9l bGVtCi0JCQkJewotCQkJCQkkJCA9IGxhcHBlbmQoJDEsICQzKTsKLQkJCQl9CisJCQlhbHRlcl9n ZW5lcmljX29wdGlvbl9saXN0X2l0ZW1zIG9wdF90cmFpbGluZ19jb21tYQkJCQl7ICQkID0gJDE7 IH0KKwkJOworCithbHRlcl9nZW5lcmljX29wdGlvbl9saXN0X2l0ZW1zOgorCQkJYWx0ZXJfZ2Vu ZXJpY19vcHRpb25fZWxlbQkJCQkJCQkJCQl7ICQkID0gbGlzdF9tYWtlMSgkMSk7IH0KKwkJCXwg YWx0ZXJfZ2VuZXJpY19vcHRpb25fbGlzdF9pdGVtcyAnLCcgYWx0ZXJfZ2VuZXJpY19vcHRpb25f ZWxlbQl7ICQkID0gbGFwcGVuZCgkMSwgJDMpOyB9CiAJCTsKIAogYWx0ZXJfZ2VuZXJpY19vcHRp b25fZWxlbToKQEAgLTYyNDEsNyArNjI4Niw3IEBAIFRyaWdnZXJPbmVFdmVudDoKIAkJCQl7ICQk ID0gbGlzdF9tYWtlMihtYWtlSW50ZWdlcihUUklHR0VSX1RZUEVfREVMRVRFKSwgTklMKTsgfQog CQkJfCBVUERBVEUKIAkJCQl7ICQkID0gbGlzdF9tYWtlMihtYWtlSW50ZWdlcihUUklHR0VSX1RZ UEVfVVBEQVRFKSwgTklMKTsgfQotCQkJfCBVUERBVEUgT0YgY29sdW1uTGlzdAorCQkJfCBVUERB VEUgT0YgY29sdW1uTGlzdE9wdGlvbmFsQ29tbWEKIAkJCQl7ICQkID0gbGlzdF9tYWtlMihtYWtl SW50ZWdlcihUUklHR0VSX1RZUEVfVVBEQVRFKSwgJDMpOyB9CiAJCQl8IFRSVU5DQVRFCiAJCQkJ eyAkJCA9IGxpc3RfbWFrZTIobWFrZUludGVnZXIoVFJJR0dFUl9UWVBFX1RSVU5DQVRFKSwgTklM KTsgfQpAQCAtNjMyNyw5ICs2MzcyLDEzIEBAIEZVTkNUSU9OX29yX1BST0NFRFVSRToKIAkJOwog CiBUcmlnZ2VyRnVuY0FyZ3M6Ci0JCQlUcmlnZ2VyRnVuY0FyZwkJCQkJCQl7ICQkID0gbGlzdF9t YWtlMSgkMSk7IH0KLQkJCXwgVHJpZ2dlckZ1bmNBcmdzICcsJyBUcmlnZ2VyRnVuY0FyZwl7ICQk ID0gbGFwcGVuZCgkMSwgJDMpOyB9Ci0JCQl8IC8qRU1QVFkqLwkJCQkJCQkJeyAkJCA9IE5JTDsg fQorCQkJVHJpZ2dlckZ1bmNBcmdzSXRlbXMgb3B0X3RyYWlsaW5nX2NvbW1hCQl7ICQkID0gJDE7 IH0KKwkJOworCitUcmlnZ2VyRnVuY0FyZ3NJdGVtczoKKwkJCVRyaWdnZXJGdW5jQXJnCQkJCQkJ CQl7ICQkID0gbGlzdF9tYWtlMSgkMSk7IH0KKwkJCXwgVHJpZ2dlckZ1bmNBcmdzSXRlbXMgJywn IFRyaWdnZXJGdW5jQXJnCXsgJCQgPSBsYXBwZW5kKCQxLCQzKTsgfQorCQkJfCAvKkVNUFRZKi8J CQkJCQkJCQl7ICQkID0gTklMOyB9CiAJCTsKIAogVHJpZ2dlckZ1bmNBcmc6CkBAIC02NDM2LDEw ICs2NDg1LDEyIEBAIGV2ZW50X3RyaWdnZXJfd2hlbl9pdGVtOgogCQk7CiAKIGV2ZW50X3RyaWdn ZXJfdmFsdWVfbGlzdDoKLQkJICBTQ09OU1QKLQkJCXsgJCQgPSBsaXN0X21ha2UxKG1ha2VTdHJp bmcoJDEpKTsgfQotCQl8IGV2ZW50X3RyaWdnZXJfdmFsdWVfbGlzdCAnLCcgU0NPTlNUCi0JCQl7 ICQkID0gbGFwcGVuZCgkMSwgbWFrZVN0cmluZygkMykpOyB9CisJCQlldmVudF90cmlnZ2VyX3Zh bHVlX2xpc3RfaXRlbXMgb3B0X3RyYWlsaW5nX2NvbW1hCXsgJCQgPSAkMTsgfQorCQk7CisKK2V2 ZW50X3RyaWdnZXJfdmFsdWVfbGlzdF9pdGVtczoKKwkJCVNDT05TVAkJCQkJCQkJCQkJCXsgJCQg PSBsaXN0X21ha2UxKG1ha2VTdHJpbmcoJDEpKTsgfQorCQkJfCBldmVudF90cmlnZ2VyX3ZhbHVl X2xpc3RfaXRlbXMgJywnIFNDT05TVAkJCXsgJCQgPSBsYXBwZW5kKCQxLCBtYWtlU3RyaW5nKCQz KSk7IH0KIAkJOwogCiBBbHRlckV2ZW50VHJpZ1N0bXQ6CkBAIC02NjU5LDggKzY3MTAsMTMgQEAg RGVmaW5lU3RtdDoKIGRlZmluaXRpb246ICcoJyBkZWZfbGlzdCAnKScJCQkJCQl7ICQkID0gJDI7 IH0KIAkJOwogCi1kZWZfbGlzdDoJZGVmX2VsZW0JCQkJCQkJCXsgJCQgPSBsaXN0X21ha2UxKCQx KTsgfQotCQkJfCBkZWZfbGlzdCAnLCcgZGVmX2VsZW0JCQkJCXsgJCQgPSBsYXBwZW5kKCQxLCAk Myk7IH0KK2RlZl9saXN0OgorCQkJIGRlZl9saXN0X2l0ZW1zIG9wdF90cmFpbGluZ19jb21tYQl7 ICQkID0gJDE7IH0KKwk7CisKK2RlZl9saXN0X2l0ZW1zOgorCQkJZGVmX2VsZW0JCQl7ICQkID0g bGlzdF9tYWtlMSgkMSk7IH0KKwkJCXwgZGVmX2xpc3RfaXRlbXMgJywnIGRlZl9lbGVtCXsgJCQg PSBsYXBwZW5kKCQxLCAkMyk7IH0KIAkJOwogCiBkZWZfZWxlbToJQ29sTGFiZWwgJz0nIGRlZl9h cmcKQEAgLTY3MDUsMTAgKzY3NjEsMTMgQEAgb3B0X2VudW1fdmFsX2xpc3Q6CiAJCXwgLypFTVBU WSovCQkJCQkJCQl7ICQkID0gTklMOyB9CiAJCTsKIAotZW51bV92YWxfbGlzdDoJU2NvbnN0Ci0J CQkJeyAkJCA9IGxpc3RfbWFrZTEobWFrZVN0cmluZygkMSkpOyB9Ci0JCQl8IGVudW1fdmFsX2xp c3QgJywnIFNjb25zdAotCQkJCXsgJCQgPSBsYXBwZW5kKCQxLCBtYWtlU3RyaW5nKCQzKSk7IH0K K2VudW1fdmFsX2xpc3Q6CisJCQllbnVtX3ZhbF9saXN0X2l0ZW1zIG9wdF90cmFpbGluZ19jb21t YQl7ICQkID0gJDE7IH0KKwkJOworCitlbnVtX3ZhbF9saXN0X2l0ZW1zOgorCQkJU2NvbnN0CQkJ CQkJCQl7ICQkID0gbGlzdF9tYWtlMShtYWtlU3RyaW5nKCQxKSk7IH0KKwkJCXwgZW51bV92YWxf bGlzdF9pdGVtcyAnLCcgU2NvbnN0CXsgJCQgPSBsYXBwZW5kKCQxLCBtYWtlU3RyaW5nKCQzKSk7 IH0KIAkJOwogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioq KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKQEAgLTY4MjgsOCArNjg4NywxMiBAQCBD cmVhdGVPcENsYXNzU3RtdDoKIAkJOwogCiBvcGNsYXNzX2l0ZW1fbGlzdDoKLQkJCW9wY2xhc3Nf aXRlbQkJCQkJCQl7ICQkID0gbGlzdF9tYWtlMSgkMSk7IH0KLQkJCXwgb3BjbGFzc19pdGVtX2xp c3QgJywnIG9wY2xhc3NfaXRlbQl7ICQkID0gbGFwcGVuZCgkMSwgJDMpOyB9CisJCQlvcGNsYXNz X2l0ZW1fbGlzdF9pdGVtcyBvcHRfdHJhaWxpbmdfY29tbWEJeyAkJCA9ICQxOyB9CisJCTsKKwor b3BjbGFzc19pdGVtX2xpc3RfaXRlbXM6CisJCQlvcGNsYXNzX2l0ZW0JCQkJCQkJCXsgJCQgPSBs aXN0X21ha2UxKCQxKTsgfQorCQkJfCBvcGNsYXNzX2l0ZW1fbGlzdF9pdGVtcyAnLCcgb3BjbGFz c19pdGVtCXsgJCQgPSBsYXBwZW5kKCQxLCAkMyk7IH0KIAkJOwogCiBvcGNsYXNzX2l0ZW06CkBA IC02OTM0LDggKzY5OTcsMTIgQEAgQWx0ZXJPcEZhbWlseVN0bXQ6CiAJCTsKIAogb3BjbGFzc19k cm9wX2xpc3Q6Ci0JCQlvcGNsYXNzX2Ryb3AJCQkJCQkJeyAkJCA9IGxpc3RfbWFrZTEoJDEpOyB9 Ci0JCQl8IG9wY2xhc3NfZHJvcF9saXN0ICcsJyBvcGNsYXNzX2Ryb3AJeyAkJCA9IGxhcHBlbmQo JDEsICQzKTsgfQorCQkJb3BjbGFzc19kcm9wX2xpc3RfaXRlbXMgb3B0X3RyYWlsaW5nX2NvbW1h CXsgJCQgPSAkMTsgfQorCQk7CisKK29wY2xhc3NfZHJvcF9saXN0X2l0ZW1zOgorCQkJb3BjbGFz c19kcm9wCQkJCQkJCQl7ICQkID0gbGlzdF9tYWtlMSgkMSk7IH0KKwkJCXwgb3BjbGFzc19kcm9w X2xpc3RfaXRlbXMgJywnIG9wY2xhc3NfZHJvcAl7ICQkID0gbGFwcGVuZCgkMSwgJDMpOyB9CiAJ CTsKIAogb3BjbGFzc19kcm9wOgpAQCAtNzIzNCw4ICs3MzAxLDEyIEBAIG9iamVjdF90eXBlX25h bWVfb25fYW55X25hbWU6CiAJCTsKIAogYW55X25hbWVfbGlzdDoKKwkJCWFueV9uYW1lX2xpc3Rf aXRlbXMgb3B0X3RyYWlsaW5nX2NvbW1hCXsgJCQgPSAkMTsgfQorCQk7CisKK2FueV9uYW1lX2xp c3RfaXRlbXM6CiAJCQlhbnlfbmFtZQkJCQkJCQkJeyAkJCA9IGxpc3RfbWFrZTEoJDEpOyB9Ci0J CQl8IGFueV9uYW1lX2xpc3QgJywnIGFueV9uYW1lCQkJeyAkJCA9IGxhcHBlbmQoJDEsICQzKTsg fQorCQkJfCBhbnlfbmFtZV9saXN0X2l0ZW1zICcsJyBhbnlfbmFtZQkJeyAkJCA9IGxhcHBlbmQo JDEsICQzKTsgfQogCQk7CiAKIGFueV9uYW1lOglDb2xJZAkJCQkJCXsgJCQgPSBsaXN0X21ha2Ux KG1ha2VTdHJpbmcoJDEpKTsgfQpAQCAtNzI0OSw4ICs3MzIwLDEyIEBAIGF0dHJzOgkJJy4nIGF0 dHJfbmFtZQogCQk7CiAKIHR5cGVfbmFtZV9saXN0OgotCQkJVHlwZW5hbWUJCQkJCQkJCXsgJCQg PSBsaXN0X21ha2UxKCQxKTsgfQotCQkJfCB0eXBlX25hbWVfbGlzdCAnLCcgVHlwZW5hbWUJCQl7 ICQkID0gbGFwcGVuZCgkMSwgJDMpOyB9CisJCQl0eXBlX25hbWVfbGlzdF9pdGVtcyBvcHRfdHJh aWxpbmdfY29tbWEJCXsgJCQgPSAkMTsgfQorCQk7CisKK3R5cGVfbmFtZV9saXN0X2l0ZW1zOgor CQkJVHlwZW5hbWUJCQkJCQkJCQl7ICQkID0gbGlzdF9tYWtlMSgkMSk7IH0KKwkJCXwgdHlwZV9u YW1lX2xpc3RfaXRlbXMgJywnIFR5cGVuYW1lCQkJeyAkJCA9IGxhcHBlbmQoJDEsICQzKTsgfQog CQk7CiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioq KioqKioqKioqKioqKioqKioqKioqKioqKioqKgpAQCAtNzg3NCw3ICs3OTQ5LDcgQEAgcHJpdmls ZWdlczogcHJpdmlsZWdlX2xpc3QKIAkJCQl7ICQkID0gTklMOyB9CiAJCQl8IEFMTCBQUklWSUxF R0VTCiAJCQkJeyAkJCA9IE5JTDsgfQotCQkJfCBBTEwgJygnIGNvbHVtbkxpc3QgJyknCisJCQl8 IEFMTCAnKCcgY29sdW1uTGlzdE9wdGlvbmFsQ29tbWEgJyknCiAJCQkJewogCQkJCQlBY2Nlc3NQ cml2ICpuID0gbWFrZU5vZGUoQWNjZXNzUHJpdik7CiAKQEAgLTc4ODIsNyArNzk1Nyw3IEBAIHBy aXZpbGVnZXM6IHByaXZpbGVnZV9saXN0CiAJCQkJCW4tPmNvbHMgPSAkMzsKIAkJCQkJJCQgPSBs aXN0X21ha2UxKG4pOwogCQkJCX0KLQkJCXwgQUxMIFBSSVZJTEVHRVMgJygnIGNvbHVtbkxpc3Qg JyknCisJCQl8IEFMTCBQUklWSUxFR0VTICcoJyBjb2x1bW5MaXN0T3B0aW9uYWxDb21tYSAnKScK IAkJCQl7CiAJCQkJCUFjY2Vzc1ByaXYgKm4gPSBtYWtlTm9kZShBY2Nlc3NQcml2KTsKIApAQCAt Nzg5Miw4ICs3OTY3LDEzIEBAIHByaXZpbGVnZXM6IHByaXZpbGVnZV9saXN0CiAJCQkJfQogCQk7 CiAKLXByaXZpbGVnZV9saXN0Oglwcml2aWxlZ2UJCQkJCQkJeyAkJCA9IGxpc3RfbWFrZTEoJDEp OyB9Ci0JCQl8IHByaXZpbGVnZV9saXN0ICcsJyBwcml2aWxlZ2UJCQl7ICQkID0gbGFwcGVuZCgk MSwgJDMpOyB9Citwcml2aWxlZ2VfbGlzdDoKKwkJCXByaXZpbGVnZV9saXN0X2l0ZW1zIG9wdF90 cmFpbGluZ19jb21tYQl7ICQkID0gJDE7IH0KKwkJOworCitwcml2aWxlZ2VfbGlzdF9pdGVtczoK KwkJCXByaXZpbGVnZQkJCQkJCQkJeyAkJCA9IGxpc3RfbWFrZTEoJDEpOyB9CisJCQl8IHByaXZp bGVnZV9saXN0X2l0ZW1zICcsJyBwcml2aWxlZ2UJeyAkJCA9IGxhcHBlbmQoJDEsICQzKTsgfQog CQk7CiAKIHByaXZpbGVnZToJU0VMRUNUIG9wdF9jb2x1bW5fbGlzdApAQCAtNzkzOCwxNCArODAx OCwxMiBAQCBwcml2aWxlZ2U6CVNFTEVDVCBvcHRfY29sdW1uX2xpc3QKIAkJOwogCiBwYXJhbWV0 ZXJfbmFtZV9saXN0OgotCQlwYXJhbWV0ZXJfbmFtZQotCQkJewotCQkJCSQkID0gbGlzdF9tYWtl MShtYWtlU3RyaW5nKCQxKSk7Ci0JCQl9Ci0JCXwgcGFyYW1ldGVyX25hbWVfbGlzdCAnLCcgcGFy YW1ldGVyX25hbWUKLQkJCXsKLQkJCQkkJCA9IGxhcHBlbmQoJDEsIG1ha2VTdHJpbmcoJDMpKTsK LQkJCX0KKwkJCXBhcmFtZXRlcl9uYW1lX2xpc3RfaXRlbXMgb3B0X3RyYWlsaW5nX2NvbW1hCXsg JCQgPSAkMTsgfQorCQk7CisKK3BhcmFtZXRlcl9uYW1lX2xpc3RfaXRlbXM6CisJCQlwYXJhbWV0 ZXJfbmFtZQkJCQkJCQkJCXsgJCQgPSBsaXN0X21ha2UxKG1ha2VTdHJpbmcoJDEpKTsgfQorCQkJ fCBwYXJhbWV0ZXJfbmFtZV9saXN0X2l0ZW1zICcsJyBwYXJhbWV0ZXJfbmFtZQl7ICQkID0gbGFw cGVuZCgkMSwgbWFrZVN0cmluZygkMykpOyB9CiAJCTsKIAogcGFyYW1ldGVyX25hbWU6CkBAIC04 MTU2LDggKzgyMzQsMTIgQEAgcHJpdmlsZWdlX3RhcmdldDoKIAogCiBncmFudGVlX2xpc3Q6CisJ CQlncmFudGVlX2xpc3RfaXRlbXMgb3B0X3RyYWlsaW5nX2NvbW1hIHsgJCQgPSAkMTsgfQorCQk7 CisKK2dyYW50ZWVfbGlzdF9pdGVtczoKIAkJCWdyYW50ZWUJCQkJCQkJCQl7ICQkID0gbGlzdF9t YWtlMSgkMSk7IH0KLQkJCXwgZ3JhbnRlZV9saXN0ICcsJyBncmFudGVlCQkJCXsgJCQgPSBsYXBw ZW5kKCQxLCAkMyk7IH0KKwkJCXwgZ3JhbnRlZV9saXN0X2l0ZW1zICcsJyBncmFudGVlCQkJCXsg JCQgPSBsYXBwZW5kKCQxLCAkMyk7IH0KIAkJOwogCiBncmFudGVlOgpAQCAtODIzMyw4ICs4MzE1 LDEyIEBAIFJldm9rZVJvbGVTdG10OgogCQk7CiAKIGdyYW50X3JvbGVfb3B0X2xpc3Q6Ci0JCQln cmFudF9yb2xlX29wdF9saXN0ICcsJyBncmFudF9yb2xlX29wdAl7ICQkID0gbGFwcGVuZCgkMSwg JDMpOyB9Ci0JCQl8IGdyYW50X3JvbGVfb3B0CQkJCQkJeyAkJCA9IGxpc3RfbWFrZTEoJDEpOyB9 CisJCQlncmFudF9yb2xlX29wdF9saXN0X2l0ZW1zIG9wdF90cmFpbGluZ19jb21tYQl7ICQkID0g JDE7IH0KKwkJOworCitncmFudF9yb2xlX29wdF9saXN0X2l0ZW1zOgorCQkJZ3JhbnRfcm9sZV9v cHQJCQkJCQkJCQl7ICQkID0gbGlzdF9tYWtlMSgkMSk7IH0KKwkJCXwgZ3JhbnRfcm9sZV9vcHRf bGlzdF9pdGVtcyAnLCcgZ3JhbnRfcm9sZV9vcHQJeyAkJCA9IGxhcHBlbmQoJDEsICQzKTsgfQog CQk7CiAKIGdyYW50X3JvbGVfb3B0OgpAQCAtODQzNywxMCArODUyMywxNCBAQCBhY2Nlc3NfbWV0 aG9kX2NsYXVzZToKIAkJCXwgLypFTVBUWSovCQkJCQkJCQl7ICQkID0gREVGQVVMVF9JTkRFWF9U WVBFOyB9CiAJCTsKIAotaW5kZXhfcGFyYW1zOglpbmRleF9lbGVtCQkJCQkJCXsgJCQgPSBsaXN0 X21ha2UxKCQxKTsgfQotCQkJfCBpbmRleF9wYXJhbXMgJywnIGluZGV4X2VsZW0JCQl7ICQkID0g bGFwcGVuZCgkMSwgJDMpOyB9CitpbmRleF9wYXJhbXM6CisJCQlpbmRleF9wYXJhbXNfaXRlbXMg b3B0X3RyYWlsaW5nX2NvbW1hCQl7ICQkID0gJDE7IH0KIAkJOwogCitpbmRleF9wYXJhbXNfaXRl bXM6CisJCQlpbmRleF9lbGVtCQkJCQkJCQkJeyAkJCA9IGxpc3RfbWFrZTEoJDEpOyB9CisJCQl8 IGluZGV4X3BhcmFtc19pdGVtcyAnLCcgaW5kZXhfZWxlbQkJCXsgJCQgPSBsYXBwZW5kKCQxLCAk Myk7IH0KKwkJOwogCiBpbmRleF9lbGVtX29wdGlvbnM6CiAJb3B0X2NvbGxhdGUgb3B0X3F1YWxp ZmllZF9uYW1lIG9wdF9hc2NfZGVzYyBvcHRfbnVsbHNfb3JkZXIKQEAgLTg1MDAsOCArODU5MCwx MyBAQCBvcHRfaW5jbHVkZToJCUlOQ0xVREUgJygnIGluZGV4X2luY2x1ZGluZ19wYXJhbXMgJykn CQkJeyAkJCA9ICQzOyB9CiAJCQkgfAkJLyogRU1QVFkgKi8JCQkJCQl7ICQkID0gTklMOyB9CiAJ CTsKIAotaW5kZXhfaW5jbHVkaW5nX3BhcmFtczoJaW5kZXhfZWxlbQkJCQkJCXsgJCQgPSBsaXN0 X21ha2UxKCQxKTsgfQotCQkJfCBpbmRleF9pbmNsdWRpbmdfcGFyYW1zICcsJyBpbmRleF9lbGVt CQl7ICQkID0gbGFwcGVuZCgkMSwgJDMpOyB9CitpbmRleF9pbmNsdWRpbmdfcGFyYW1zOgorCQkJ aW5kZXhfaW5jbHVkaW5nX3BhcmFtc19pdGVtcyBvcHRfdHJhaWxpbmdfY29tbWEJeyAkJCA9ICQx OyB9CisJCTsKKworaW5kZXhfaW5jbHVkaW5nX3BhcmFtc19pdGVtczoKKwkJCWluZGV4X2VsZW0J CQkJCQkJCQkJeyAkJCA9IGxpc3RfbWFrZTEoJDEpOyB9CisJCQl8IGluZGV4X2luY2x1ZGluZ19w YXJhbXNfaXRlbXMgJywnIGluZGV4X2VsZW0JeyAkJCA9IGxhcHBlbmQoJDEsICQzKTsgfQogCQk7 CiAKIG9wdF9jb2xsYXRlOiBDT0xMQVRFIGFueV9uYW1lCQkJCQkJeyAkJCA9ICQyOyB9CkBAIC04 NjAxLDEzICs4Njk2LDIyIEBAIGZ1bmNfYXJnczoJJygnIGZ1bmNfYXJnc19saXN0ICcpJwkJCQkJ eyAkJCA9ICQyOyB9CiAJCTsKIAogZnVuY19hcmdzX2xpc3Q6CisJCQlmdW5jX2FyZ3NfbGlzdF9p dGVtcyBvcHRfdHJhaWxpbmdfY29tbWEJeyAkJCA9ICQxOyB9CisJCTsKKworZnVuY19hcmdzX2xp c3RfaXRlbXM6CiAJCQlmdW5jX2FyZwkJCQkJCQkJeyAkJCA9IGxpc3RfbWFrZTEoJDEpOyB9Ci0J CQl8IGZ1bmNfYXJnc19saXN0ICcsJyBmdW5jX2FyZwkJCXsgJCQgPSBsYXBwZW5kKCQxLCAkMyk7 IH0KKwkJCXwgZnVuY19hcmdzX2xpc3RfaXRlbXMgJywnIGZ1bmNfYXJnCSAgIAl7ICQkID0gbGFw cGVuZCgkMSwgJDMpOyB9CiAJCTsKIAogZnVuY3Rpb25fd2l0aF9hcmd0eXBlc19saXN0OgorCQkJ ZnVuY3Rpb25fd2l0aF9hcmd0eXBlc19saXN0X2l0ZW1zIG9wdF90cmFpbGluZ19jb21tYQorCQkJ CQkJCQkJCQkJCXsgJCQgPSAkMTsgfQorCQk7CisKK2Z1bmN0aW9uX3dpdGhfYXJndHlwZXNfbGlz dF9pdGVtczoKIAkJCWZ1bmN0aW9uX3dpdGhfYXJndHlwZXMJCQkJCXsgJCQgPSBsaXN0X21ha2Ux KCQxKTsgfQotCQkJfCBmdW5jdGlvbl93aXRoX2FyZ3R5cGVzX2xpc3QgJywnIGZ1bmN0aW9uX3dp dGhfYXJndHlwZXMKKwkJCXwgZnVuY3Rpb25fd2l0aF9hcmd0eXBlc19saXN0X2l0ZW1zICcsJyBm dW5jdGlvbl93aXRoX2FyZ3R5cGVzCiAJCQkJCQkJCQkJCQkJeyAkJCA9IGxhcHBlbmQoJDEsICQz KTsgfQogCQk7CiAKQEAgLTg2NjMsOCArODc2NywxMyBAQCBmdW5jX2FyZ3Nfd2l0aF9kZWZhdWx0 czoKIAkJOwogCiBmdW5jX2FyZ3Nfd2l0aF9kZWZhdWx0c19saXN0OgotCQlmdW5jX2FyZ193aXRo X2RlZmF1bHQJCQkJCQl7ICQkID0gbGlzdF9tYWtlMSgkMSk7IH0KLQkJfCBmdW5jX2FyZ3Nfd2l0 aF9kZWZhdWx0c19saXN0ICcsJyBmdW5jX2FyZ193aXRoX2RlZmF1bHQKKwkJCWZ1bmNfYXJnc193 aXRoX2RlZmF1bHRzX2xpc3RfaXRlbXMgb3B0X3RyYWlsaW5nX2NvbW1hCisJCQkJCQkJCQkJCQkJ eyAkJCA9ICQxOyB9CisJCTsKKworZnVuY19hcmdzX3dpdGhfZGVmYXVsdHNfbGlzdF9pdGVtczoK KwkJCWZ1bmNfYXJnX3dpdGhfZGVmYXVsdAkJCQkgICAJeyAkJCA9IGxpc3RfbWFrZTEoJDEpOyB9 CisJCQl8IGZ1bmNfYXJnc193aXRoX2RlZmF1bHRzX2xpc3RfaXRlbXMgJywnIGZ1bmNfYXJnX3dp dGhfZGVmYXVsdAogCQkJCQkJCQkJCQkJCXsgJCQgPSBsYXBwZW5kKCQxLCAkMyk7IH0KIAkJOwog CkBAIC04ODYyLDggKzg5NzEsMTIgQEAgYWdncl9hcmdzOgknKCcgJyonICcpJwogCQk7CiAKIGFn Z3JfYXJnc19saXN0OgorCQkJYWdncl9hcmdzX2xpc3RfaXRlbXMgb3B0X3RyYWlsaW5nX2NvbW1h CXsgJCQgPSAkMTsgfQorCQk7CisKK2FnZ3JfYXJnc19saXN0X2l0ZW1zOgogCQkJYWdncl9hcmcJ CQkJCQkJCXsgJCQgPSBsaXN0X21ha2UxKCQxKTsgfQotCQkJfCBhZ2dyX2FyZ3NfbGlzdCAnLCcg YWdncl9hcmcJCQl7ICQkID0gbGFwcGVuZCgkMSwgJDMpOyB9CisJCQl8IGFnZ3JfYXJnc19saXN0 X2l0ZW1zICcsJyBhZ2dyX2FyZwkJeyAkJCA9IGxhcHBlbmQoJDEsICQzKTsgfQogCQk7CiAKIGFn Z3JlZ2F0ZV93aXRoX2FyZ3R5cGVzOgpAQCAtODg3OSw4ICs4OTkyLDEzIEBAIGFnZ3JlZ2F0ZV93 aXRoX2FyZ3R5cGVzOgogCQk7CiAKIGFnZ3JlZ2F0ZV93aXRoX2FyZ3R5cGVzX2xpc3Q6CisJCQlh Z2dyZWdhdGVfd2l0aF9hcmd0eXBlc19saXN0X2l0ZW1zIG9wdF90cmFpbGluZ19jb21tYQorCQkJ CQkJCQkJCQkJCXsgJCQgPSAkMTsgfQorCQk7CisKK2FnZ3JlZ2F0ZV93aXRoX2FyZ3R5cGVzX2xp c3RfaXRlbXM6CiAJCQlhZ2dyZWdhdGVfd2l0aF9hcmd0eXBlcwkJCQkJeyAkJCA9IGxpc3RfbWFr ZTEoJDEpOyB9Ci0JCQl8IGFnZ3JlZ2F0ZV93aXRoX2FyZ3R5cGVzX2xpc3QgJywnIGFnZ3JlZ2F0 ZV93aXRoX2FyZ3R5cGVzCisJCQl8IGFnZ3JlZ2F0ZV93aXRoX2FyZ3R5cGVzX2xpc3RfaXRlbXMg JywnIGFnZ3JlZ2F0ZV93aXRoX2FyZ3R5cGVzCiAJCQkJCQkJCQkJCQkJeyAkJCA9IGxhcHBlbmQo JDEsICQzKTsgfQogCQk7CiAKQEAgLTkwNTEsOCArOTE2OSwxNCBAQCByb3V0aW5lX2JvZHlfc3Rt dDoKIAkJOwogCiB0cmFuc2Zvcm1fdHlwZV9saXN0OgotCQkJRk9SIFRZUEVfUCBUeXBlbmFtZSB7 ICQkID0gbGlzdF9tYWtlMSgkMyk7IH0KLQkJCXwgdHJhbnNmb3JtX3R5cGVfbGlzdCAnLCcgRk9S IFRZUEVfUCBUeXBlbmFtZSB7ICQkID0gbGFwcGVuZCgkMSwgJDUpOyB9CisJCQl0cmFuc2Zvcm1f dHlwZV9saXN0X2l0ZW1zIG9wdF90cmFpbGluZ19jb21tYQorCQkJCQkJCQkJCQkJeyAkJCA9ICQx OyB9CisJCTsKKwordHJhbnNmb3JtX3R5cGVfbGlzdF9pdGVtczoKKwkJCUZPUiBUWVBFX1AgVHlw ZW5hbWUJCQkJCXsgJCQgPSBsaXN0X21ha2UxKCQzKTsgfQorCQkJfCB0cmFuc2Zvcm1fdHlwZV9s aXN0X2l0ZW1zICcsJyBGT1IgVFlQRV9QIFR5cGVuYW1lCisJCQkJCQkJCQkJCQl7ICQkID0gbGFw cGVuZCgkMSwgJDUpOyB9CiAJCTsKIAogb3B0X2RlZmluaXRpb246CkBAIC05MDc0LDE0ICs5MTk4 LDEzIEBAIHRhYmxlX2Z1bmNfY29sdW1uOglwYXJhbV9uYW1lIGZ1bmNfdHlwZQogCQk7CiAKIHRh YmxlX2Z1bmNfY29sdW1uX2xpc3Q6Ci0JCQl0YWJsZV9mdW5jX2NvbHVtbgotCQkJCXsKLQkJCQkJ JCQgPSBsaXN0X21ha2UxKCQxKTsKLQkJCQl9Ci0JCQl8IHRhYmxlX2Z1bmNfY29sdW1uX2xpc3Qg JywnIHRhYmxlX2Z1bmNfY29sdW1uCi0JCQkJewotCQkJCQkkJCA9IGxhcHBlbmQoJDEsICQzKTsK LQkJCQl9CisJCQl0YWJsZV9mdW5jX2NvbHVtbl9saXN0X2l0ZW1zIG9wdF90cmFpbGluZ19jb21t YQl7ICQkID0gJDE7IH0KKwkJOworCit0YWJsZV9mdW5jX2NvbHVtbl9saXN0X2l0ZW1zOgorCQkJ dGFibGVfZnVuY19jb2x1bW4JCXsgJCQgPSBsaXN0X21ha2UxKCQxKTsgfQorCQkJfCB0YWJsZV9m dW5jX2NvbHVtbl9saXN0X2l0ZW1zICcsJyB0YWJsZV9mdW5jX2NvbHVtbgorCQkJCQkJCQkJeyAk JCA9IGxhcHBlbmQoJDEsICQzKTsgfQogCQk7CiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioq KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgpAQCAt OTI5MSw4ICs5NDE0LDEzIEBAIGFueV9vcGVyYXRvcjoKIAkJOwogCiBvcGVyYXRvcl93aXRoX2Fy Z3R5cGVzX2xpc3Q6CisJCQlvcGVyYXRvcl93aXRoX2FyZ3R5cGVzX2xpc3RfaXRlbXMgb3B0X3Ry YWlsaW5nX2NvbW1hCisJCQkJCQkJCQkJCQkJeyAkJCA9ICQxOyB9CisJCTsKKworb3BlcmF0b3Jf d2l0aF9hcmd0eXBlc19saXN0X2l0ZW1zOgogCQkJb3BlcmF0b3Jfd2l0aF9hcmd0eXBlcwkJCQkJ eyAkJCA9IGxpc3RfbWFrZTEoJDEpOyB9Ci0JCQl8IG9wZXJhdG9yX3dpdGhfYXJndHlwZXNfbGlz dCAnLCcgb3BlcmF0b3Jfd2l0aF9hcmd0eXBlcworCQkJfCBvcGVyYXRvcl93aXRoX2FyZ3R5cGVz X2xpc3RfaXRlbXMgJywnIG9wZXJhdG9yX3dpdGhfYXJndHlwZXMKIAkJCQkJCQkJCQkJCQl7ICQk ID0gbGFwcGVuZCgkMSwgJDMpOyB9CiAJCTsKIApAQCAtMTA1MTksOCArMTA2NDcsMTMgQEAgQWx0 ZXJPcGVyYXRvclN0bXQ6CiAJCQkJfQogCQk7CiAKLW9wZXJhdG9yX2RlZl9saXN0OglvcGVyYXRv cl9kZWZfZWxlbQkJCQkJCQkJeyAkJCA9IGxpc3RfbWFrZTEoJDEpOyB9Ci0JCQl8IG9wZXJhdG9y X2RlZl9saXN0ICcsJyBvcGVyYXRvcl9kZWZfZWxlbQkJCQl7ICQkID0gbGFwcGVuZCgkMSwgJDMp OyB9CitvcGVyYXRvcl9kZWZfbGlzdDoKKwkJCW9wZXJhdG9yX2RlZl9saXN0X2l0ZW1zIG9wdF90 cmFpbGluZ19jb21tYQkJeyAkJCA9ICQxOyB9CisJCTsKKworb3BlcmF0b3JfZGVmX2xpc3RfaXRl bXM6CisJCQlvcGVyYXRvcl9kZWZfZWxlbQkJCQkJCQkJeyAkJCA9IGxpc3RfbWFrZTEoJDEpOyB9 CisJCQl8IG9wZXJhdG9yX2RlZl9saXN0X2l0ZW1zICcsJyBvcGVyYXRvcl9kZWZfZWxlbQl7ICQk ID0gbGFwcGVuZCgkMSwgJDMpOyB9CiAJCTsKIAogb3BlcmF0b3JfZGVmX2VsZW06IENvbExhYmVs ICc9JyBOT05FCkBAIC0xMDkyNywxMSArMTEwNjAsMTUgQEAgUHVibGljYXRpb25PYmpTcGVjOgog CQkJCX0KIAkJCQk7CiAKLXB1Yl9vYmpfbGlzdDoJUHVibGljYXRpb25PYmpTcGVjCi0JCQkJCXsg JCQgPSBsaXN0X21ha2UxKCQxKTsgfQotCQkJfCBwdWJfb2JqX2xpc3QgJywnIFB1YmxpY2F0aW9u T2JqU3BlYwotCQkJCQl7ICQkID0gbGFwcGVuZCgkMSwgJDMpOyB9Ci0JOworcHViX29ial9saXN0 OgorCQkJcHViX29ial9saXN0X2l0ZW1zIG9wdF90cmFpbGluZ19jb21tYQkJeyAkJCA9ICQxOyB9 CisJCTsKKworcHViX29ial9saXN0X2l0ZW1zOgorCQkJUHVibGljYXRpb25PYmpTcGVjCQkJCQkJ CXsgJCQgPSBsaXN0X21ha2UxKCQxKTsgfQorCQkJfCBwdWJfb2JqX2xpc3RfaXRlbXMgJywnIFB1 YmxpY2F0aW9uT2JqU3BlYwl7ICQkID0gbGFwcGVuZCgkMSwgJDMpOyB9CisJCTsKKwogCiBQdWJs aWNhdGlvbkFsbE9ialNwZWM6CiAJCQkJQUxMIFRBQkxFUwpAQCAtMTA5NDYsMTMgKzExMDgzLDE2 IEBAIFB1YmxpY2F0aW9uQWxsT2JqU3BlYzoKIAkJCQkJCSQkLT5wdWJvYmp0eXBlID0gUFVCTElD QVRJT05fQUxMX1NFUVVFTkNFUzsKIAkJCQkJCSQkLT5sb2NhdGlvbiA9IEAxOwogCQkJCQl9Ci0J CQkJCTsKKwkJOwogCi1wdWJfYWxsX29ial90eXBlX2xpc3Q6CVB1YmxpY2F0aW9uQWxsT2JqU3Bl YwotCQkJCQl7ICQkID0gbGlzdF9tYWtlMSgkMSk7IH0KLQkJCQl8IHB1Yl9hbGxfb2JqX3R5cGVf bGlzdCAnLCcgUHVibGljYXRpb25BbGxPYmpTcGVjCi0JCQkJCXsgJCQgPSBsYXBwZW5kKCQxLCAk Myk7IH0KLQk7CitwdWJfYWxsX29ial90eXBlX2xpc3Q6CisJCQlwdWJfYWxsX29ial90eXBlX2xp c3RfaXRlbXMgb3B0X3RyYWlsaW5nX2NvbW1hCQkJeyAkJCA9ICQxOyB9CisJCTsKKworcHViX2Fs bF9vYmpfdHlwZV9saXN0X2l0ZW1zOgorCQkJUHVibGljYXRpb25BbGxPYmpTcGVjCQkJCQkJCQkJ eyAkJCA9IGxpc3RfbWFrZTEoJDEpOyB9CisJCQl8IHB1Yl9hbGxfb2JqX3R5cGVfbGlzdF9pdGVt cyAnLCcgUHVibGljYXRpb25BbGxPYmpTcGVjCXsgJCQgPSBsYXBwZW5kKCQxLCAkMyk7IH0KKwkJ OwogCiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioq KioqKioqKioqKioqKioqKioqKioqKioqKioqKgpAQCAtMTE0NjAsMTQgKzExNjAwLDE0IEBAIHRy YW5zYWN0aW9uX21vZGVfaXRlbToKIAkJCQkJCQkJCSAgIG1ha2VJbnRDb25zdChmYWxzZSwgQDEp LCBAMSk7IH0KIAkJOwogCi0vKiBTeW50YXggd2l0aCBjb21tYXMgaXMgU1FMLXNwZWMsIHdpdGhv dXQgY29tbWFzIGlzIFBvc3RncmVzIGhpc3RvcmljYWwgKi8KIHRyYW5zYWN0aW9uX21vZGVfbGlz dDoKLQkJCXRyYW5zYWN0aW9uX21vZGVfaXRlbQotCQkJCQl7ICQkID0gbGlzdF9tYWtlMSgkMSk7 IH0KLQkJCXwgdHJhbnNhY3Rpb25fbW9kZV9saXN0ICcsJyB0cmFuc2FjdGlvbl9tb2RlX2l0ZW0K LQkJCQkJeyAkJCA9IGxhcHBlbmQoJDEsICQzKTsgfQotCQkJfCB0cmFuc2FjdGlvbl9tb2RlX2xp c3QgdHJhbnNhY3Rpb25fbW9kZV9pdGVtCi0JCQkJCXsgJCQgPSBsYXBwZW5kKCQxLCAkMik7IH0K KwkJCXRyYW5zYWN0aW9uX21vZGVfbGlzdF9pdGVtcyBvcHRfdHJhaWxpbmdfY29tbWEJCQl7ICQk ID0gJDE7IH0KKwkJOworCit0cmFuc2FjdGlvbl9tb2RlX2xpc3RfaXRlbXM6CisJCQl0cmFuc2Fj dGlvbl9tb2RlX2l0ZW0JCQkJCQkJCQl7ICQkID0gbGlzdF9tYWtlMSgkMSk7IH0KKwkJCXwgdHJh bnNhY3Rpb25fbW9kZV9saXN0X2l0ZW1zICcsJyB0cmFuc2FjdGlvbl9tb2RlX2l0ZW0JeyAkJCA9 IGxhcHBlbmQoJDEsICQzKTsgfQorCQkJfCB0cmFuc2FjdGlvbl9tb2RlX2xpc3RfaXRlbXMgdHJh bnNhY3Rpb25fbW9kZV9pdGVtCQl7ICQkID0gbGFwcGVuZCgkMSwgJDIpOyB9CiAJCTsKIAogdHJh bnNhY3Rpb25fbW9kZV9saXN0X29yX2VtcHR5OgpAQCAtMTE1MTksNyArMTE2NTksNyBAQCBWaWV3 U3RtdDogQ1JFQVRFIE9wdFRlbXAgVklFVyBxdWFsaWZpZWRfbmFtZSBvcHRfY29sdW1uX2xpc3Qg b3B0X3JlbG9wdGlvbnMKIAkJCQkJbi0+d2l0aENoZWNrT3B0aW9uID0gJDExOwogCQkJCQkkJCA9 IChOb2RlICopIG47CiAJCQkJfQotCQl8IENSRUFURSBPcHRUZW1wIFJFQ1VSU0lWRSBWSUVXIHF1 YWxpZmllZF9uYW1lICcoJyBjb2x1bW5MaXN0ICcpJyBvcHRfcmVsb3B0aW9ucworCQl8IENSRUFU RSBPcHRUZW1wIFJFQ1VSU0lWRSBWSUVXIHF1YWxpZmllZF9uYW1lICcoJyBjb2x1bW5MaXN0T3B0 aW9uYWxDb21tYSAnKScgb3B0X3JlbG9wdGlvbnMKIAkJCQlBUyBTZWxlY3RTdG10IG9wdF9jaGVj a19vcHRpb24KIAkJCQl7CiAJCQkJCVZpZXdTdG10ICAgKm4gPSBtYWtlTm9kZShWaWV3U3RtdCk7 CkBAIC0xMTUzOCw3ICsxMTY3OCw3IEBAIFZpZXdTdG10OiBDUkVBVEUgT3B0VGVtcCBWSUVXIHF1 YWxpZmllZF9uYW1lIG9wdF9jb2x1bW5fbGlzdCBvcHRfcmVsb3B0aW9ucwogCQkJCQkJCQkgcGFy c2VyX2VycnBvc2l0aW9uKEAxMikpKTsKIAkJCQkJJCQgPSAoTm9kZSAqKSBuOwogCQkJCX0KLQkJ fCBDUkVBVEUgT1IgUkVQTEFDRSBPcHRUZW1wIFJFQ1VSU0lWRSBWSUVXIHF1YWxpZmllZF9uYW1l ICcoJyBjb2x1bW5MaXN0ICcpJyBvcHRfcmVsb3B0aW9ucworCQl8IENSRUFURSBPUiBSRVBMQUNF IE9wdFRlbXAgUkVDVVJTSVZFIFZJRVcgcXVhbGlmaWVkX25hbWUgJygnIGNvbHVtbkxpc3RPcHRp b25hbENvbW1hICcpJyBvcHRfcmVsb3B0aW9ucwogCQkJCUFTIFNlbGVjdFN0bXQgb3B0X2NoZWNr X29wdGlvbgogCQkJCXsKIAkJCQkJVmlld1N0bXQgICAqbiA9IG1ha2VOb2RlKFZpZXdTdG10KTsK QEAgLTExNzU0LDE0ICsxMTg5NCwxMiBAQCBEcm9wZGJTdG10OiBEUk9QIERBVEFCQVNFIG5hbWUK IAkJOwogCiBkcm9wX29wdGlvbl9saXN0OgotCQkJZHJvcF9vcHRpb24KLQkJCQl7Ci0JCQkJCSQk ID0gbGlzdF9tYWtlMSgoTm9kZSAqKSAkMSk7Ci0JCQkJfQotCQkJfCBkcm9wX29wdGlvbl9saXN0 ICcsJyBkcm9wX29wdGlvbgotCQkJCXsKLQkJCQkJJCQgPSBsYXBwZW5kKCQxLCAoTm9kZSAqKSAk Myk7Ci0JCQkJfQorCQkJZHJvcF9vcHRpb25fbGlzdF9pdGVtcyBvcHRfdHJhaWxpbmdfY29tbWEJ eyAkJCA9ICQxOyB9CisJCTsKKworZHJvcF9vcHRpb25fbGlzdF9pdGVtczoKKwkJCWRyb3Bfb3B0 aW9uCQkJCQkJCQkJeyAkJCA9IGxpc3RfbWFrZTEoJDEpOyB9CisJCQl8IGRyb3Bfb3B0aW9uX2xp c3RfaXRlbXMgJywnIGRyb3Bfb3B0aW9uCXsgJCQgPSBsYXBwZW5kKCQxLCAkMyk7IH0KIAkJOwog CiAvKgpAQCAtMTIxOTcsMTAgKzEyMzM1LDEyIEBAIHZhY3V1bV9yZWxhdGlvbjoKIAkJOwogCiB2 YWN1dW1fcmVsYXRpb25fbGlzdDoKLQkJCXZhY3V1bV9yZWxhdGlvbgotCQkJCQl7ICQkID0gbGlz dF9tYWtlMSgkMSk7IH0KLQkJCXwgdmFjdXVtX3JlbGF0aW9uX2xpc3QgJywnIHZhY3V1bV9yZWxh dGlvbgotCQkJCQl7ICQkID0gbGFwcGVuZCgkMSwgJDMpOyB9CisJCQl2YWN1dW1fcmVsYXRpb25f bGlzdF9pdGVtcyBvcHRfdHJhaWxpbmdfY29tbWEJCXsgJCQgPSAkMTsgfQorCQk7CisKK3ZhY3V1 bV9yZWxhdGlvbl9saXN0X2l0ZW1zOgorCQkJdmFjdXVtX3JlbGF0aW9uCQkJCQkJCQkJCXsgJCQg PSBsaXN0X21ha2UxKCQxKTsgfQorCQkJfCB2YWN1dW1fcmVsYXRpb25fbGlzdF9pdGVtcyAnLCcg dmFjdXVtX3JlbGF0aW9uCXsgJCQgPSBsYXBwZW5kKCQxLCAkMyk7IH0KIAkJOwogCiBvcHRfdmFj dXVtX3JlbGF0aW9uX2xpc3Q6CkBAIC0xMjQ3OCwxMCArMTI2MTgsMTIgQEAgb3ZlcnJpZGVfa2lu ZDoKIAkJOwogCiBpbnNlcnRfY29sdW1uX2xpc3Q6Ci0JCQlpbnNlcnRfY29sdW1uX2l0ZW0KLQkJ CQkJeyAkJCA9IGxpc3RfbWFrZTEoJDEpOyB9Ci0JCQl8IGluc2VydF9jb2x1bW5fbGlzdCAnLCcg aW5zZXJ0X2NvbHVtbl9pdGVtCi0JCQkJCXsgJCQgPSBsYXBwZW5kKCQxLCAkMyk7IH0KKwkJCWlu c2VydF9jb2x1bW5fbGlzdF9pdGVtcyBvcHRfdHJhaWxpbmdfY29tbWEJCQl7ICQkID0gJDE7IH0K KwkJOworCitpbnNlcnRfY29sdW1uX2xpc3RfaXRlbXM6CisJCQlpbnNlcnRfY29sdW1uX2l0ZW0J CQkJCQkJCQl7ICQkID0gbGlzdF9tYWtlMSgkMSk7IH0KKwkJCXwgaW5zZXJ0X2NvbHVtbl9saXN0 X2l0ZW1zICcsJyBpbnNlcnRfY29sdW1uX2l0ZW0JeyAkJCA9IGxhcHBlbmQoJDEsICQzKTsgfQog CQk7CiAKIGluc2VydF9jb2x1bW5faXRlbToKQEAgLTEyNjg0LDggKzEyODI2LDEyIEBAIFVwZGF0 ZVN0bXQ6IG9wdF93aXRoX2NsYXVzZSBVUERBVEUgcmVsYXRpb25fZXhwcl9vcHRfYWxpYXMKIAkJ OwogCiBzZXRfY2xhdXNlX2xpc3Q6Ci0JCQlzZXRfY2xhdXNlCQkJCQkJCXsgJCQgPSAkMTsgfQot CQkJfCBzZXRfY2xhdXNlX2xpc3QgJywnIHNldF9jbGF1c2UJeyAkJCA9IGxpc3RfY29uY2F0KCQx LCQzKTsgfQorCQkJc2V0X2NsYXVzZV9saXN0X2l0ZW1zIG9wdF90cmFpbGluZ19jb21tYQl7ICQk ID0gJDE7IH0KKwkJOworCitzZXRfY2xhdXNlX2xpc3RfaXRlbXM6CisJCQlzZXRfY2xhdXNlCQkJ CQkJCQkJeyAkJCA9ICQxOyB9CisJCQl8IHNldF9jbGF1c2VfbGlzdF9pdGVtcyAnLCcgc2V0X2Ns YXVzZQkJeyAkJCA9IGxpc3RfY29uY2F0KCQxLCQzKTsgfQogCQk7CiAKIHNldF9jbGF1c2U6CkBA IC0xMjcyOSwxMCArMTI4NzUsMTMgQEAgc2V0X3RhcmdldDoKIAkJOwogCiBzZXRfdGFyZ2V0X2xp c3Q6Ci0JCQlzZXRfdGFyZ2V0CQkJCQkJCQl7ICQkID0gbGlzdF9tYWtlMSgkMSk7IH0KLQkJCXwg c2V0X3RhcmdldF9saXN0ICcsJyBzZXRfdGFyZ2V0CQl7ICQkID0gbGFwcGVuZCgkMSwkMyk7IH0K KwkJCXNldF90YXJnZXRfbGlzdF9pdGVtcyBvcHRfdHJhaWxpbmdfY29tbWEJCXsgJCQgPSAkMTsg fQogCQk7CiAKK3NldF90YXJnZXRfbGlzdF9pdGVtczoKKwkJCXNldF90YXJnZXQJCQkJCQkJCQkJ eyAkJCA9IGxpc3RfbWFrZTEoJDEpOyB9CisJCQl8IHNldF90YXJnZXRfbGlzdF9pdGVtcyAnLCcg c2V0X3RhcmdldAkJCXsgJCQgPSBsYXBwZW5kKCQxLCQzKTsgfQorCQk7CiAKIC8qKioqKioqKioq KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioq KioqKioqKioqKgogICoKQEAgLTEzMjMyLDIzICsxMzM4MSwyMyBAQCBvcHRfbWF0ZXJpYWxpemVk OgogCQk7CiAKIG9wdF9zZWFyY2hfY2xhdXNlOgotCQlTRUFSQ0ggREVQVEggRklSU1RfUCBCWSBj b2x1bW5MaXN0IFNFVCBDb2xJZAorCQlTRUFSQ0ggZGVwdGhfb3JfYnJlYWR0aCBGSVJTVF9QIEJZ IGNvbHVtbkxpc3QgU0VUIENvbElkCiAJCQl7CiAJCQkJQ1RFU2VhcmNoQ2xhdXNlICpuID0gbWFr ZU5vZGUoQ1RFU2VhcmNoQ2xhdXNlKTsKIAogCQkJCW4tPnNlYXJjaF9jb2xfbGlzdCA9ICQ1Owot CQkJCW4tPnNlYXJjaF9icmVhZHRoX2ZpcnN0ID0gZmFsc2U7CisJCQkJbi0+c2VhcmNoX2JyZWFk dGhfZmlyc3QgPSAkMjsKIAkJCQluLT5zZWFyY2hfc2VxX2NvbHVtbiA9ICQ3OwogCQkJCW4tPmxv Y2F0aW9uID0gQDE7CiAJCQkJJCQgPSAoTm9kZSAqKSBuOwogCQkJfQotCQl8IFNFQVJDSCBCUkVB RFRIIEZJUlNUX1AgQlkgY29sdW1uTGlzdCBTRVQgQ29sSWQKKwkJfCBTRUFSQ0ggZGVwdGhfb3Jf YnJlYWR0aCBGSVJTVF9QIEJZIGNvbHVtbkxpc3QgJywnIFNFVCBDb2xJZAogCQkJewogCQkJCUNU RVNlYXJjaENsYXVzZSAqbiA9IG1ha2VOb2RlKENURVNlYXJjaENsYXVzZSk7CiAKIAkJCQluLT5z ZWFyY2hfY29sX2xpc3QgPSAkNTsKLQkJCQluLT5zZWFyY2hfYnJlYWR0aF9maXJzdCA9IHRydWU7 Ci0JCQkJbi0+c2VhcmNoX3NlcV9jb2x1bW4gPSAkNzsKKwkJCQluLT5zZWFyY2hfYnJlYWR0aF9m aXJzdCA9ICQyOworCQkJCW4tPnNlYXJjaF9zZXFfY29sdW1uID0gJDg7CiAJCQkJbi0+bG9jYXRp b24gPSBAMTsKIAkJCQkkJCA9IChOb2RlICopIG47CiAJCQl9CkBAIC0xMzI1OCw2ICsxMzQwNywx MSBAQCBvcHRfc2VhcmNoX2NsYXVzZToKIAkJCX0KIAkJOwogCitkZXB0aF9vcl9icmVhZHRoOgor CQlERVBUSAkJeyAkJCA9IGZhbHNlOyB9CisJCXwgQlJFQURUSAl7ICQkID0gdHJ1ZTsgfQorCTsK Kwogb3B0X2N5Y2xlX2NsYXVzZToKIAkJQ1lDTEUgY29sdW1uTGlzdCBTRVQgQ29sSWQgVE8gQWV4 cHJDb25zdCBERUZBVUxUIEFleHByQ29uc3QgVVNJTkcgQ29sSWQKIAkJCXsKQEAgLTEzMjcxLDYg KzEzNDI1LDE4IEBAIG9wdF9jeWNsZV9jbGF1c2U6CiAJCQkJbi0+bG9jYXRpb24gPSBAMTsKIAkJ CQkkJCA9IChOb2RlICopIG47CiAJCQl9CisJCXwgQ1lDTEUgY29sdW1uTGlzdCAnLCcgU0VUIENv bElkIFRPIEFleHByQ29uc3QgREVGQVVMVCBBZXhwckNvbnN0IFVTSU5HIENvbElkCisJCQl7CisJ CQkJQ1RFQ3ljbGVDbGF1c2UgKm4gPSBtYWtlTm9kZShDVEVDeWNsZUNsYXVzZSk7CisKKwkJCQlu LT5jeWNsZV9jb2xfbGlzdCA9ICQyOworCQkJCW4tPmN5Y2xlX21hcmtfY29sdW1uID0gJDU7CisJ CQkJbi0+Y3ljbGVfbWFya192YWx1ZSA9ICQ3OworCQkJCW4tPmN5Y2xlX21hcmtfZGVmYXVsdCA9 ICQ5OworCQkJCW4tPmN5Y2xlX3BhdGhfY29sdW1uID0gJDExOworCQkJCW4tPmxvY2F0aW9uID0g QDE7CisJCQkJJCQgPSAoTm9kZSAqKSBuOworCQkJfQogCQl8IENZQ0xFIGNvbHVtbkxpc3QgU0VU IENvbElkIFVTSU5HIENvbElkCiAJCQl7CiAJCQkJQ1RFQ3ljbGVDbGF1c2UgKm4gPSBtYWtlTm9k ZShDVEVDeWNsZUNsYXVzZSk7CkBAIC0xMzI4Myw2ICsxMzQ0OSwxOCBAQCBvcHRfY3ljbGVfY2xh dXNlOgogCQkJCW4tPmxvY2F0aW9uID0gQDE7CiAJCQkJJCQgPSAoTm9kZSAqKSBuOwogCQkJfQor CQl8IENZQ0xFIGNvbHVtbkxpc3QgJywnIFNFVCBDb2xJZCBVU0lORyBDb2xJZAorCQkJeworCQkJ CUNURUN5Y2xlQ2xhdXNlICpuID0gbWFrZU5vZGUoQ1RFQ3ljbGVDbGF1c2UpOworCisJCQkJbi0+ Y3ljbGVfY29sX2xpc3QgPSAkMjsKKwkJCQluLT5jeWNsZV9tYXJrX2NvbHVtbiA9ICQ1OworCQkJ CW4tPmN5Y2xlX21hcmtfdmFsdWUgPSBtYWtlQm9vbEFDb25zdCh0cnVlLCAtMSk7CisJCQkJbi0+ Y3ljbGVfbWFya19kZWZhdWx0ID0gbWFrZUJvb2xBQ29uc3QoZmFsc2UsIC0xKTsKKwkJCQluLT5j eWNsZV9wYXRoX2NvbHVtbiA9ICQ3OworCQkJCW4tPmxvY2F0aW9uID0gQDE7CisJCQkJJCQgPSAo Tm9kZSAqKSBuOworCQkJfQogCQl8IC8qRU1QVFkqLwogCQkJewogCQkJCSQkID0gTlVMTDsKQEAg LTEzNDA1LDkgKzEzNTgzLDE4IEBAIHNvcnRfY2xhdXNlOgogCQkJT1JERVIgQlkgc29ydGJ5X2xp c3QJCQkJCXsgJCQgPSAkMzsgfQogCQk7CiAKK3NvcnRieV9saXN0X25vX3RyYWlsaW5nX2NvbW1h OgorCQkJc29ydGJ5CQkJCQkJCQkJCXsgJCQgPSBsaXN0X21ha2UxKCQxKTsgfQorCQkJfCBzb3J0 YnlfbGlzdF9ub190cmFpbGluZ19jb21tYSAnLCcgc29ydGJ5CXsgJCQgPSBsYXBwZW5kKCQxLCAk Myk7IH0KKwkJOworCiBzb3J0YnlfbGlzdDoKLQkJCXNvcnRieQkJCQkJCQkJCXsgJCQgPSBsaXN0 X21ha2UxKCQxKTsgfQotCQkJfCBzb3J0YnlfbGlzdCAnLCcgc29ydGJ5CQkJCXsgJCQgPSBsYXBw ZW5kKCQxLCAkMyk7IH0KKwkJCXNvcnRieV9saXN0X2l0ZW1zIG9wdF90cmFpbGluZ19jb21tYQkJ eyAkJCA9ICQxOyB9CisJCTsKKworc29ydGJ5X2xpc3RfaXRlbXM6CisJCQlzb3J0YnkJCQkJCQkJ CQkJeyAkJCA9IGxpc3RfbWFrZTEoJDEpOyB9CisJCQl8IHNvcnRieV9saXN0X2l0ZW1zICcsJyBz b3J0YnkJCQkJeyAkJCA9IGxhcHBlbmQoJDEsICQzKTsgfQogCQk7CiAKIHNvcnRieToJCWFfZXhw ciBVU0lORyBxdWFsX2FsbF9PcCBvcHRfbnVsbHNfb3JkZXIKQEAgLTEzNjU2LDggKzEzODQzLDEy IEBAIGdyb3VwX2NsYXVzZToKIAkJOwogCiBncm91cF9ieV9saXN0OgotCQkJZ3JvdXBfYnlfaXRl bQkJCQkJCQl7ICQkID0gbGlzdF9tYWtlMSgkMSk7IH0KLQkJCXwgZ3JvdXBfYnlfbGlzdCAnLCcg Z3JvdXBfYnlfaXRlbQkJeyAkJCA9IGxhcHBlbmQoJDEsJDMpOyB9CisJCQlncm91cF9ieV9saXN0 X2l0ZW1zIG9wdF90cmFpbGluZ19jb21tYQkJeyAkJCA9ICQxOyB9CisJCTsKKworZ3JvdXBfYnlf bGlzdF9pdGVtczoKKwkJCWdyb3VwX2J5X2l0ZW0JCQkJCQkJCXsgJCQgPSBsaXN0X21ha2UxKCQx KTsgfQorCQkJfCBncm91cF9ieV9saXN0X2l0ZW1zICcsJyBncm91cF9ieV9pdGVtCQl7ICQkID0g bGFwcGVuZCgkMSwkMyk7IH0KIAkJOwogCiBncm91cF9ieV9pdGVtOgpAQCAtMTM3ODQsOCArMTM5 NzUsMTIgQEAgZnJvbV9jbGF1c2U6CiAJCTsKIAogZnJvbV9saXN0OgorCQkJZnJvbV9saXN0X2l0 ZW1zIG9wdF90cmFpbGluZ19jb21tYQkJeyAkJCA9ICQxOyB9CisJCTsKKworZnJvbV9saXN0X2l0 ZW1zOgogCQkJdGFibGVfcmVmCQkJCQkJCQl7ICQkID0gbGlzdF9tYWtlMSgkMSk7IH0KLQkJCXwg ZnJvbV9saXN0ICcsJyB0YWJsZV9yZWYJCQkJeyAkJCA9IGxhcHBlbmQoJDEsICQzKTsgfQorCQkJ fCBmcm9tX2xpc3RfaXRlbXMgJywnIHRhYmxlX3JlZgkJCXsgJCQgPSBsYXBwZW5kKCQxLCAkMyk7 IH0KIAkJOwogCiAvKgpAQCAtMTQxNDIsMTAgKzE0MzM3LDEzIEBAIGV4dGVuZGVkX3JlbGF0aW9u X2V4cHI6CiAKIAogcmVsYXRpb25fZXhwcl9saXN0OgotCQkJcmVsYXRpb25fZXhwcgkJCQkJCQl7 ICQkID0gbGlzdF9tYWtlMSgkMSk7IH0KLQkJCXwgcmVsYXRpb25fZXhwcl9saXN0ICcsJyByZWxh dGlvbl9leHByCXsgJCQgPSBsYXBwZW5kKCQxLCAkMyk7IH0KKwkJCXJlbGF0aW9uX2V4cHJfbGlz dF9pdGVtcyBvcHRfdHJhaWxpbmdfY29tbWEJCXsgJCQgPSAkMTsgfQogCQk7CiAKK3JlbGF0aW9u X2V4cHJfbGlzdF9pdGVtczoKKwkJCXJlbGF0aW9uX2V4cHIJCQkJCQkJCQl7ICQkID0gbGlzdF9t YWtlMSgkMSk7IH0KKwkJCXwgcmVsYXRpb25fZXhwcl9saXN0X2l0ZW1zICcsJyByZWxhdGlvbl9l eHByCXsgJCQgPSBsYXBwZW5kKCQxLCAkMyk7IH0KKwkJOwogCiAvKgogICogR2l2ZW4gIlVQREFU RSBmb28gc2V0IHNldCAuLi4iLCB3ZSBoYXZlIHRvIGRlY2lkZSB3aXRob3V0IGxvb2tpbmcgYW55 CkBAIC0xNDI0MSw4ICsxNDQzOSwxMiBAQCByb3dzZnJvbV9pdGVtOiBmdW5jX2V4cHJfd2luZG93 bGVzcyBvcHRfY29sX2RlZl9saXN0CiAJCTsKIAogcm93c2Zyb21fbGlzdDoKLQkJCXJvd3Nmcm9t X2l0ZW0JCQkJCQl7ICQkID0gbGlzdF9tYWtlMSgkMSk7IH0KLQkJCXwgcm93c2Zyb21fbGlzdCAn LCcgcm93c2Zyb21faXRlbQl7ICQkID0gbGFwcGVuZCgkMSwgJDMpOyB9CisJCQlyb3dzZnJvbV9s aXN0X2l0ZW1zIG9wdF90cmFpbGluZ19jb21tYQl7ICQkID0gJDE7IH0KKwkJOworCityb3dzZnJv bV9saXN0X2l0ZW1zOgorCQkJcm93c2Zyb21faXRlbQkJCQkJCQl7ICQkID0gbGlzdF9tYWtlMSgk MSk7IH0KKwkJCXwgcm93c2Zyb21fbGlzdF9pdGVtcyAnLCcgcm93c2Zyb21faXRlbQl7ICQkID0g bGFwcGVuZCgkMSwgJDMpOyB9CiAJCTsKIAogb3B0X2NvbF9kZWZfbGlzdDogQVMgJygnIFRhYmxl RnVuY0VsZW1lbnRMaXN0ICcpJwl7ICQkID0gJDM7IH0KQEAgLTE0MjgxLDE0ICsxNDQ4MywxMiBA QCBPcHRUYWJsZUZ1bmNFbGVtZW50TGlzdDoKIAkJOwogCiBUYWJsZUZ1bmNFbGVtZW50TGlzdDoK LQkJCVRhYmxlRnVuY0VsZW1lbnQKLQkJCQl7Ci0JCQkJCSQkID0gbGlzdF9tYWtlMSgkMSk7Ci0J CQkJfQotCQkJfCBUYWJsZUZ1bmNFbGVtZW50TGlzdCAnLCcgVGFibGVGdW5jRWxlbWVudAotCQkJ CXsKLQkJCQkJJCQgPSBsYXBwZW5kKCQxLCAkMyk7Ci0JCQkJfQorCQkJVGFibGVGdW5jRWxlbWVu dExpc3RJdGVtcyBvcHRfdHJhaWxpbmdfY29tbWEJCXsgJCQgPSAkMTsgfQorCQk7CisKK1RhYmxl RnVuY0VsZW1lbnRMaXN0SXRlbXM6CisJCQlUYWJsZUZ1bmNFbGVtZW50CQkJCQkJCQkJeyAkJCA9 IGxpc3RfbWFrZTEoJDEpOyB9CisJCQl8IFRhYmxlRnVuY0VsZW1lbnRMaXN0SXRlbXMgJywnIFRh YmxlRnVuY0VsZW1lbnQJeyAkJCA9IGxhcHBlbmQoJDEsICQzKTsJfQogCQk7CiAKIFRhYmxlRnVu Y0VsZW1lbnQ6CUNvbElkIFR5cGVuYW1lIG9wdF9jb2xsYXRlX2NsYXVzZQpAQCAtMTQzNDEsOCAr MTQ1NDEsMTMgQEAgeG1sdGFibGU6CiAJCQkJfQogCQk7CiAKLXhtbHRhYmxlX2NvbHVtbl9saXN0 OiB4bWx0YWJsZV9jb2x1bW5fZWwJCQkJCXsgJCQgPSBsaXN0X21ha2UxKCQxKTsgfQotCQkJfCB4 bWx0YWJsZV9jb2x1bW5fbGlzdCAnLCcgeG1sdGFibGVfY29sdW1uX2VsCXsgJCQgPSBsYXBwZW5k KCQxLCAkMyk7IH0KK3htbHRhYmxlX2NvbHVtbl9saXN0OgorCQkJeG1sdGFibGVfY29sdW1uX2xp c3RfaXRlbXMgb3B0X3RyYWlsaW5nX2NvbW1hCQl7ICQkID0gJDE7IH0KKwkJOworCit4bWx0YWJs ZV9jb2x1bW5fbGlzdF9pdGVtczoKKwkJCXhtbHRhYmxlX2NvbHVtbl9lbAkJCQkJCQkJCXsgJCQg PSBsaXN0X21ha2UxKCQxKTsgfQorCQkJfCB4bWx0YWJsZV9jb2x1bW5fbGlzdF9pdGVtcyAnLCcg eG1sdGFibGVfY29sdW1uX2VsCXsgJCQgPSBsYXBwZW5kKCQxLCAkMyk7IH0KIAkJOwogCiB4bWx0 YWJsZV9jb2x1bW5fZWw6CkBAIC0xNDQ1OCwxMCArMTQ2NjMsMTIgQEAgeG1sdGFibGVfY29sdW1u X29wdGlvbl9lbDoKIAkJOwogCiB4bWxfbmFtZXNwYWNlX2xpc3Q6Ci0JCQl4bWxfbmFtZXNwYWNl X2VsCi0JCQkJeyAkJCA9IGxpc3RfbWFrZTEoJDEpOyB9Ci0JCQl8IHhtbF9uYW1lc3BhY2VfbGlz dCAnLCcgeG1sX25hbWVzcGFjZV9lbAotCQkJCXsgJCQgPSBsYXBwZW5kKCQxLCAkMyk7IH0KKwkJ CXhtbF9uYW1lc3BhY2VfbGlzdF9pdGVtcyBvcHRfdHJhaWxpbmdfY29tbWEJCQl7ICQkID0gJDE7 IH0KKwkJOworCit4bWxfbmFtZXNwYWNlX2xpc3RfaXRlbXM6CisJCQl4bWxfbmFtZXNwYWNlX2Vs CQkJCQkJCQkJeyAkJCA9IGxpc3RfbWFrZTEoJDEpOyB9CisJCQl8IHhtbF9uYW1lc3BhY2VfbGlz dF9pdGVtcyAnLCcgeG1sX25hbWVzcGFjZV9lbAkJeyAkJCA9IGxhcHBlbmQoJDEsICQzKTsgfQog CQk7CiAKIHhtbF9uYW1lc3BhY2VfZWw6CkBAIC0xNDUxNywxMCArMTQ3MjQsMTMgQEAganNvbl90 YWJsZV9wYXRoX25hbWVfb3B0OgogCQk7CiAKIGpzb25fdGFibGVfY29sdW1uX2RlZmluaXRpb25f bGlzdDoKLQkJCWpzb25fdGFibGVfY29sdW1uX2RlZmluaXRpb24KLQkJCQl7ICQkID0gbGlzdF9t YWtlMSgkMSk7IH0KLQkJCXwganNvbl90YWJsZV9jb2x1bW5fZGVmaW5pdGlvbl9saXN0ICcsJyBq c29uX3RhYmxlX2NvbHVtbl9kZWZpbml0aW9uCi0JCQkJeyAkJCA9IGxhcHBlbmQoJDEsICQzKTsg fQorCQkJanNvbl90YWJsZV9jb2x1bW5fZGVmaW5pdGlvbl9saXN0X2l0ZW1zIG9wdF90cmFpbGlu Z19jb21tYQl7ICQkID0gJDE7IH0KKwkJOworCitqc29uX3RhYmxlX2NvbHVtbl9kZWZpbml0aW9u X2xpc3RfaXRlbXM6CisJCQlqc29uX3RhYmxlX2NvbHVtbl9kZWZpbml0aW9uCQkJCQkJCQl7ICQk ID0gbGlzdF9tYWtlMSgkMSk7IH0KKwkJCXwganNvbl90YWJsZV9jb2x1bW5fZGVmaW5pdGlvbl9s aXN0X2l0ZW1zICcsJyBqc29uX3RhYmxlX2NvbHVtbl9kZWZpbml0aW9uCisJCQkJCQkJCQkJCQkJ CQkJCQl7ICQkID0gbGFwcGVuZCgkMSwgJDMpOyB9CiAJCTsKIAoganNvbl90YWJsZV9jb2x1bW5f ZGVmaW5pdGlvbjoKQEAgLTE1ODQ0LDcgKzE2MDU0LDcgQEAgZnVuY19hcHBsaWNhdGlvbjogZnVu Y19uYW1lICcoJyAnKScKIAkJCQkJCQkJCQkJICAgQ09FUkNFX0VYUExJQ0lUX0NBTEwsCiAJCQkJ CQkJCQkJCSAgIEAxKTsKIAkJCQl9Ci0JCQl8IGZ1bmNfbmFtZSAnKCcgZnVuY19hcmdfbGlzdCBv cHRfc29ydF9jbGF1c2UgJyknCisJCQl8IGZ1bmNfbmFtZSAnKCcgZnVuY19hcmdfbGlzdF9ub190 cmFpbGluZ19jb21tYSBvcHRfc29ydF9jbGF1c2UgJyknCiAJCQkJewogCQkJCQlGdW5jQ2FsbCAg ICpuID0gbWFrZUZ1bmNDYWxsKCQxLCAkMywKIAkJCQkJCQkJCQkJCSBDT0VSQ0VfRVhQTElDSVRf Q0FMTCwKQEAgLTE1ODUzLDYgKzE2MDYzLDE1IEBAIGZ1bmNfYXBwbGljYXRpb246IGZ1bmNfbmFt ZSAnKCcgJyknCiAJCQkJCW4tPmFnZ19vcmRlciA9ICQ0OwogCQkJCQkkJCA9IChOb2RlICopIG47 CiAJCQkJfQorCQkJfCBmdW5jX25hbWUgJygnIGZ1bmNfYXJnX2xpc3Rfbm9fdHJhaWxpbmdfY29t bWEgJywnIG9wdF9zb3J0X2NsYXVzZSAnKScKKwkJCQl7CisJCQkJCUZ1bmNDYWxsICAgKm4gPSBt YWtlRnVuY0NhbGwoJDEsICQzLAorCQkJCQkJCQkJCQkJIENPRVJDRV9FWFBMSUNJVF9DQUxMLAor CQkJCQkJCQkJCQkJIEAxKTsKKworCQkJCQluLT5hZ2dfb3JkZXIgPSAkNTsKKwkJCQkJJCQgPSAo Tm9kZSAqKSBuOworCQkJCX0KIAkJCXwgZnVuY19uYW1lICcoJyBWQVJJQURJQyBmdW5jX2FyZ19l eHByIG9wdF9zb3J0X2NsYXVzZSAnKScKIAkJCQl7CiAJCQkJCUZ1bmNDYWxsICAgKm4gPSBtYWtl RnVuY0NhbGwoJDEsIGxpc3RfbWFrZTEoJDQpLApAQCAtMTU4NjMsNyArMTYwODIsNyBAQCBmdW5j X2FwcGxpY2F0aW9uOiBmdW5jX25hbWUgJygnICcpJwogCQkJCQluLT5hZ2dfb3JkZXIgPSAkNTsK IAkJCQkJJCQgPSAoTm9kZSAqKSBuOwogCQkJCX0KLQkJCXwgZnVuY19uYW1lICcoJyBmdW5jX2Fy Z19saXN0ICcsJyBWQVJJQURJQyBmdW5jX2FyZ19leHByIG9wdF9zb3J0X2NsYXVzZSAnKScKKwkJ CXwgZnVuY19uYW1lICcoJyBmdW5jX2FyZ19saXN0X25vX3RyYWlsaW5nX2NvbW1hICcsJyBWQVJJ QURJQyBmdW5jX2FyZ19leHByIG9wdF9zb3J0X2NsYXVzZSAnKScKIAkJCQl7CiAJCQkJCUZ1bmND YWxsICAgKm4gPSBtYWtlRnVuY0NhbGwoJDEsIGxhcHBlbmQoJDMsICQ2KSwKIAkJCQkJCQkJCQkJ CSBDT0VSQ0VfRVhQTElDSVRfQ0FMTCwKQEAgLTE2NDc4LDggKzE2Njk3LDEzIEBAIG9wdF94bWxf cm9vdF9zdGFuZGFsb25lOiAnLCcgU1RBTkRBTE9ORV9QIFlFU19QCiB4bWxfYXR0cmlidXRlczog WE1MQVRUUklCVVRFUyAnKCcgeG1sX2F0dHJpYnV0ZV9saXN0ICcpJwl7ICQkID0gJDM7IH0KIAkJ OwogCi14bWxfYXR0cmlidXRlX2xpc3Q6CXhtbF9hdHRyaWJ1dGVfZWwJCQkJCXsgJCQgPSBsaXN0 X21ha2UxKCQxKTsgfQotCQkJfCB4bWxfYXR0cmlidXRlX2xpc3QgJywnIHhtbF9hdHRyaWJ1dGVf ZWwJeyAkJCA9IGxhcHBlbmQoJDEsICQzKTsgfQoreG1sX2F0dHJpYnV0ZV9saXN0OgorCQkJeG1s X2F0dHJpYnV0ZV9saXN0X2l0ZW1zIG9wdF90cmFpbGluZ19jb21tYQkJCXsgJCQgPSAkMTsgfQor CQk7CisKK3htbF9hdHRyaWJ1dGVfbGlzdF9pdGVtczoKKwkJCXhtbF9hdHRyaWJ1dGVfZWwJCQkJ CQkJCQl7ICQkID0gbGlzdF9tYWtlMSgkMSk7IH0KKwkJCXwgeG1sX2F0dHJpYnV0ZV9saXN0X2l0 ZW1zICcsJyB4bWxfYXR0cmlidXRlX2VsCQl7ICQkID0gbGFwcGVuZCgkMSwgJDMpOyB9CiAJCTsK IAogeG1sX2F0dHJpYnV0ZV9lbDogYV9leHByIEFTIENvbExhYmVsCkBAIC0xNjU4OSw5ICsxNjgx MywxMyBAQCB3aW5kb3dfY2xhdXNlOgogCQk7CiAKIHdpbmRvd19kZWZpbml0aW9uX2xpc3Q6Ci0J CQl3aW5kb3dfZGVmaW5pdGlvbgkJCQkJCXsgJCQgPSBsaXN0X21ha2UxKCQxKTsgfQotCQkJfCB3 aW5kb3dfZGVmaW5pdGlvbl9saXN0ICcsJyB3aW5kb3dfZGVmaW5pdGlvbgotCQkJCQkJCQkJCQkJ CXsgJCQgPSBsYXBwZW5kKCQxLCAkMyk7IH0KKwkJCXdpbmRvd19kZWZpbml0aW9uX2xpc3RfaXRl bXMgb3B0X3RyYWlsaW5nX2NvbW1hCXsgJCQgPSAkMTsgfQorCQk7CisKK3dpbmRvd19kZWZpbml0 aW9uX2xpc3RfaXRlbXM6CisJCQl3aW5kb3dfZGVmaW5pdGlvbgkJCQkJCQkJeyAkJCA9IGxpc3Rf bWFrZTEoJDEpOyB9CisJCQl8IHdpbmRvd19kZWZpbml0aW9uX2xpc3RfaXRlbXMgJywnIHdpbmRv d19kZWZpbml0aW9uCisJCQkJCQkJCQkJCQkJCQl7ICQkID0gbGFwcGVuZCgkMSwgJDMpOyB9CiAJ CTsKIAogd2luZG93X2RlZmluaXRpb246CkBAIC0xNjgzMCwxNiArMTcwNTgsMTcgQEAgb3B0X3dp bmRvd19leGNsdXNpb25fY2xhdXNlOgogICogd2l0aG91dCBjb25mbGljdGluZyB3aXRoIHRoZSBw YXJlbnRoZXNpemVkIGFfZXhwciBwcm9kdWN0aW9uLiAgV2l0aG91dCB0aGUKICAqIFJPVyBrZXl3 b3JkLCB0aGVyZSBtdXN0IGJlIG1vcmUgdGhhbiBvbmUgYV9leHByIGluc2lkZSB0aGUgcGFyZW5z LgogICovCi1yb3c6CQlST1cgJygnIGV4cHJfbGlzdCAnKScJCQkJCXsgJCQgPSAkMzsgfQotCQkJ fCBST1cgJygnICcpJwkJCQkJCQl7ICQkID0gTklMOyB9Ci0JCQl8ICcoJyBleHByX2xpc3QgJywn IGFfZXhwciAnKScJCQl7ICQkID0gbGFwcGVuZCgkMiwgJDQpOyB9Cityb3c6CQlST1cgJygnIGV4 cHJfbGlzdF9ub190cmFpbGluZ19jb21tYSAnKScJCQkgCXsgJCQgPSAkMzsgfQorCQkJfCBST1cg JygnICcpJwkJCQkJCQkJCQl7ICQkID0gTklMOyB9CisJCQl8ICcoJyBleHByX2xpc3Rfbm9fdHJh aWxpbmdfY29tbWEgJywnIGFfZXhwciAnKScgIAl7ICQkID0gbGFwcGVuZCgkMiwgJDQpOyB9CiAJ CTsKIAotZXhwbGljaXRfcm93OglST1cgJygnIGV4cHJfbGlzdCAnKScJCQkJeyAkJCA9ICQzOyB9 Ci0JCQl8IFJPVyAnKCcgJyknCQkJCQkJCXsgJCQgPSBOSUw7IH0KK2V4cGxpY2l0X3JvdzoJUk9X ICcoJyBleHByX2xpc3Rfbm9fdHJhaWxpbmdfY29tbWEgJyknCSAgIAkJeyAkJCA9ICQzOyB9CisJ CQl8IFJPVyAnKCcgZXhwcl9saXN0X25vX3RyYWlsaW5nX2NvbW1hICcsJyAnKScJCXsgJCQgPSAk MzsgfQorCQkJfCBST1cgJygnICcpJwkJCQkJCQkgICAJCQl7ICQkID0gTklMOyB9CiAJCTsKIAot aW1wbGljaXRfcm93OgknKCcgZXhwcl9saXN0ICcsJyBhX2V4cHIgJyknCQl7ICQkID0gbGFwcGVu ZCgkMiwgJDQpOyB9CitpbXBsaWNpdF9yb3c6CScoJyBleHByX2xpc3Rfbm9fdHJhaWxpbmdfY29t bWEgJywnIGFfZXhwciAnKScJeyAkJCA9IGxhcHBlbmQoJDIsICQ0KTsgfQogCQk7CiAKIHN1Yl90 eXBlOglBTlkJCQkJCQkJCQkJeyAkJCA9IEFOWV9TVUJMSU5LOyB9CkBAIC0xNjkwMSwyNSArMTcx MzAsMzQgQEAgc3VicXVlcnlfT3A6CiAgKi8KIAkJCTsKIAotZXhwcl9saXN0OglhX2V4cHIKLQkJ CQl7Ci0JCQkJCSQkID0gbGlzdF9tYWtlMSgkMSk7Ci0JCQkJfQotCQkJfCBleHByX2xpc3QgJywn IGFfZXhwcgotCQkJCXsKLQkJCQkJJCQgPSBsYXBwZW5kKCQxLCAkMyk7Ci0JCQkJfQorZXhwcl9s aXN0X25vX3RyYWlsaW5nX2NvbW1hOgorCQkJYV9leHByCQkJCQkJCQl7ICQkID0gbGlzdF9tYWtl MSgkMSk7IH0KKwkJCXwgZXhwcl9saXN0X25vX3RyYWlsaW5nX2NvbW1hICcsJyBhX2V4cHIJCXsg JCQgPSBsYXBwZW5kKCQxLCAkMyk7IH0KKwkJOworCitleHByX2xpc3Q6CisJCQlleHByX2xpc3Rf aXRlbXMgb3B0X3RyYWlsaW5nX2NvbW1hCXsgJCQgPSAkMTsgfQorCQk7CisKK2V4cHJfbGlzdF9p dGVtczoKKwkJCWFfZXhwcgkJCQkJCQkJeyAkJCA9IGxpc3RfbWFrZTEoJDEpOyB9CisJCQl8IGV4 cHJfbGlzdF9pdGVtcyAnLCcgYV9leHByCQl7ICQkID0gbGFwcGVuZCgkMSwgJDMpOyB9CiAJCTsK IAogLyogZnVuY3Rpb24gYXJndW1lbnRzIGNhbiBoYXZlIG5hbWVzICovCi1mdW5jX2FyZ19saXN0 OiAgZnVuY19hcmdfZXhwcgotCQkJCXsKLQkJCQkJJCQgPSBsaXN0X21ha2UxKCQxKTsKLQkJCQl9 Ci0JCQl8IGZ1bmNfYXJnX2xpc3QgJywnIGZ1bmNfYXJnX2V4cHIKLQkJCQl7Ci0JCQkJCSQkID0g bGFwcGVuZCgkMSwgJDMpOwotCQkJCX0KK2Z1bmNfYXJnX2xpc3Rfbm9fdHJhaWxpbmdfY29tbWE6 CisJCQlmdW5jX2FyZ19leHByCQkJCQkJCQl7ICQkID0gbGlzdF9tYWtlMSgkMSk7IH0KKwkJCXwg ZnVuY19hcmdfbGlzdF9ub190cmFpbGluZ19jb21tYSAnLCcgZnVuY19hcmdfZXhwcgorCQkJCQkJ CQkJCQkJCQl7ICQkID0gbGFwcGVuZCgkMSwgJDMpOyB9CisJCTsKKworZnVuY19hcmdfbGlzdDoK KwkJCWZ1bmNfYXJnX2xpc3RfaXRlbXMgb3B0X3RyYWlsaW5nX2NvbW1hCQl7ICQkID0gJDE7IH0K KwkJOworCitmdW5jX2FyZ19saXN0X2l0ZW1zOgorCQkJZnVuY19hcmdfZXhwcgkJCQkJCQkJeyAk JCA9IGxpc3RfbWFrZTEoJDEpOyB9CisJCQl8IGZ1bmNfYXJnX2xpc3RfaXRlbXMgJywnIGZ1bmNf YXJnX2V4cHIJCXsgJCQgPSBsYXBwZW5kKCQxLCAkMyk7IH0KIAkJOwogCiBmdW5jX2FyZ19leHBy OiAgYV9leHByCkBAIC0xNjk1Miw4ICsxNzE5MCwxMiBAQCBmdW5jX2FyZ19saXN0X29wdDoJZnVu Y19hcmdfbGlzdAkJCQkJeyAkJCA9ICQxOyB9CiAJCQl8IC8qRU1QVFkqLwkJCQkJCQkJeyAkJCA9 IE5JTDsgfQogCQk7CiAKLXR5cGVfbGlzdDoJVHlwZW5hbWUJCQkJCQkJCXsgJCQgPSBsaXN0X21h a2UxKCQxKTsgfQotCQkJfCB0eXBlX2xpc3QgJywnIFR5cGVuYW1lCQkJCXsgJCQgPSBsYXBwZW5k KCQxLCAkMyk7IH0KK3R5cGVfbGlzdDoKKwkJCXR5cGVfbGlzdF9pdGVtcyBvcHRfdHJhaWxpbmdf Y29tbWEJCXsgJCQgPSAkMTsgfQorCit0eXBlX2xpc3RfaXRlbXM6CisJCQlUeXBlbmFtZQkJCQkJ CQkJeyAkJCA9IGxpc3RfbWFrZTEoJDEpOyB9CisJCQl8IHR5cGVfbGlzdF9pdGVtcyAnLCcgVHlw ZW5hbWUJCQl7ICQkID0gbGFwcGVuZCgkMSwgJDMpOyB9CiAJCTsKIAogYXJyYXlfZXhwcjogJ1sn IGV4cHJfbGlzdCAnXScKQEAgLTE2OTcwLDEwICsxNzIxMiwxNCBAQCBhcnJheV9leHByOiAnWycg ZXhwcl9saXN0ICddJwogCQkJCX0KIAkJOwogCi1hcnJheV9leHByX2xpc3Q6IGFycmF5X2V4cHIJ CQkJCQkJeyAkJCA9IGxpc3RfbWFrZTEoJDEpOyB9Ci0JCQl8IGFycmF5X2V4cHJfbGlzdCAnLCcg YXJyYXlfZXhwcgkJeyAkJCA9IGxhcHBlbmQoJDEsICQzKTsgfQorYXJyYXlfZXhwcl9saXN0Ogor CQkJYXJyYXlfZXhwcl9saXN0X2l0ZW1zIG9wdF90cmFpbGluZ19jb21tYQkJeyAkJCA9ICQxOyB9 CiAJCTsKIAorYXJyYXlfZXhwcl9saXN0X2l0ZW1zOgorCQkJYXJyYXlfZXhwcgkJCQkJCQkJCQl7 ICQkID0gbGlzdF9tYWtlMSgkMSk7IH0KKwkJCXwgYXJyYXlfZXhwcl9saXN0X2l0ZW1zICcsJyBh cnJheV9leHByCQkJeyAkJCA9IGxhcHBlbmQoJDEsICQzKTsgfQorCQk7CiAKIGV4dHJhY3RfbGlz dDoKIAkJCWV4dHJhY3RfYXJnIEZST00gYV9leHByCkBAIC0xNzQzOSw3ICsxNzY4NSw3IEBAIGpz b25fYWdncmVnYXRlX2Z1bmM6CiAJCTsKIAoganNvbl9hcnJheV9hZ2dyZWdhdGVfb3JkZXJfYnlf Y2xhdXNlX29wdDoKLQkJCU9SREVSIEJZIHNvcnRieV9saXN0CQkJCQl7ICQkID0gJDM7IH0KKwkJ CU9SREVSIEJZIHNvcnRieV9saXN0X25vX3RyYWlsaW5nX2NvbW1hCXsgJCQgPSAkMzsgfQogCQkJ fCAvKiBFTVBUWSAqLwkJCQkJCQl7ICQkID0gTklMOyB9CiAJCTsKIApAQCAtMTc0NTQsOSArMTc3 MDAsMTMgQEAgb3B0X3RhcmdldF9saXN0OiB0YXJnZXRfbGlzdAkJCQkJCXsgJCQgPSAkMTsgfQog CQk7CiAKIHRhcmdldF9saXN0OgorCQkJdGFyZ2V0X2xpc3RfaXRlbXMgIG9wdF90cmFpbGluZ19j b21tYQl7ICQkID0gJDE7IH0KKwkJCTsKKwordGFyZ2V0X2xpc3RfaXRlbXM6CiAJCQl0YXJnZXRf ZWwJCQkJCQkJCXsgJCQgPSBsaXN0X21ha2UxKCQxKTsgfQotCQkJfCB0YXJnZXRfbGlzdCAnLCcg dGFyZ2V0X2VsCQkJCXsgJCQgPSBsYXBwZW5kKCQxLCAkMyk7IH0KLQkJOworCQkJfCB0YXJnZXRf bGlzdF9pdGVtcyAnLCcgdGFyZ2V0X2VsCQl7ICQkID0gbGFwcGVuZCgkMSwgJDMpOyB9CisJCQk7 CiAKIHRhcmdldF9lbDoJYV9leHByIEFTIENvbExhYmVsCiAJCQkJewpAQCAtMTc1MDUsOCArMTc3 NTUsMTIgQEAgdGFyZ2V0X2VsOglhX2V4cHIgQVMgQ29sTGFiZWwKICAqKioqKioqKioqKioqKioq KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioq KioqKi8KIAogcXVhbGlmaWVkX25hbWVfbGlzdDoKLQkJCXF1YWxpZmllZF9uYW1lCQkJCQkJCXsg JCQgPSBsaXN0X21ha2UxKCQxKTsgfQotCQkJfCBxdWFsaWZpZWRfbmFtZV9saXN0ICcsJyBxdWFs aWZpZWRfbmFtZSB7ICQkID0gbGFwcGVuZCgkMSwgJDMpOyB9CisJCQlxdWFsaWZpZWRfbmFtZV9s aXN0X2l0ZW1zIG9wdF90cmFpbGluZ19jb21tYQl7ICQkID0gJDE7IH0KKwkJOworCitxdWFsaWZp ZWRfbmFtZV9saXN0X2l0ZW1zOgorCQkJcXVhbGlmaWVkX25hbWUJCQkJCQkJCQl7ICQkID0gbGlz dF9tYWtlMSgkMSk7IH0KKwkJCXwgcXVhbGlmaWVkX25hbWVfbGlzdF9pdGVtcyAnLCcgcXVhbGlm aWVkX25hbWUJeyAkJCA9IGxhcHBlbmQoJDEsICQzKTsgfQogCQk7CiAKIC8qCkBAIC0xNzUyNywx MiArMTc3ODEsMTQgQEAgcXVhbGlmaWVkX25hbWU6CiAJCQkJfQogCQk7CiAKLW5hbWVfbGlzdDoJ bmFtZQotCQkJCQl7ICQkID0gbGlzdF9tYWtlMShtYWtlU3RyaW5nKCQxKSk7IH0KLQkJCXwgbmFt ZV9saXN0ICcsJyBuYW1lCi0JCQkJCXsgJCQgPSBsYXBwZW5kKCQxLCBtYWtlU3RyaW5nKCQzKSk7 IH0KK25hbWVfbGlzdDoKKwkJCW5hbWVfbGlzdF9pdGVtcyBvcHRfdHJhaWxpbmdfY29tbWEJCXsg JCQgPSAkMTsgfQogCQk7CiAKK25hbWVfbGlzdF9pdGVtczoKKwkJCW5hbWUJCQkJCQkJCQl7ICQk ID0gbGlzdF9tYWtlMShtYWtlU3RyaW5nKCQxKSk7IH0KKwkJCXwgbmFtZV9saXN0X2l0ZW1zICcs JyBuYW1lCQkJCXsgJCQgPSBsYXBwZW5kKCQxLCBtYWtlU3RyaW5nKCQzKSk7IH0KKwkJOwogCiBu YW1lOgkJQ29sSWQJCQkJCQkJCQl7ICQkID0gJDE7IH07CiAKQEAgLTE3NTk0LDcgKzE3ODUwLDcg QEAgQWV4cHJDb25zdDogSWNvbnN0CiAJCQkJCXQtPmxvY2F0aW9uID0gQDE7CiAJCQkJCSQkID0g bWFrZVN0cmluZ0NvbnN0Q2FzdCgkMiwgQDIsIHQpOwogCQkJCX0KLQkJCXwgZnVuY19uYW1lICco JyBmdW5jX2FyZ19saXN0IG9wdF9zb3J0X2NsYXVzZSAnKScgU2NvbnN0CisJCQl8IGZ1bmNfbmFt ZSAnKCcgZnVuY19hcmdfbGlzdF9ub190cmFpbGluZ19jb21tYSBvcHRfc29ydF9jbGF1c2UgJykn IFNjb25zdAogCQkJCXsKIAkJCQkJLyogZ2VuZXJpYyBzeW50YXggd2l0aCBhIHR5cGUgbW9kaWZp ZXIgKi8KIAkJCQkJVHlwZU5hbWUgICAqdCA9IG1ha2VUeXBlTmFtZUZyb21OYW1lTGlzdCgkMSk7 CkBAIC0xNzc1MSwxMiArMTgwMDcsMTQgQEAgUm9sZVNwZWM6CU5vblJlc2VydmVkV29yZAogCQkJ CX0KIAkJOwogCi1yb2xlX2xpc3Q6CVJvbGVTcGVjCi0JCQkJeyAkJCA9IGxpc3RfbWFrZTEoJDEp OyB9Ci0JCQl8IHJvbGVfbGlzdCAnLCcgUm9sZVNwZWMKLQkJCQl7ICQkID0gbGFwcGVuZCgkMSwg JDMpOyB9Cityb2xlX2xpc3Q6CisJCQlyb2xlX2xpc3RfaXRlbXMgb3B0X3RyYWlsaW5nX2NvbW1h CXsgJCQgPSAkMTsgfQogCQk7CiAKK3JvbGVfbGlzdF9pdGVtczoKKwkJCVJvbGVTcGVjCQkJCQkJ CXsgJCQgPSBsaXN0X21ha2UxKCQxKTsgfQorCQkJfCByb2xlX2xpc3RfaXRlbXMgJywnIFJvbGVT cGVjCQl7ICQkID0gbGFwcGVuZCgkMSwgJDMpOyB9CisJCTsKIAogLyoqKioqKioqKioqKioqKioq KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioq KioqCiAgKgotLSAKMi40Ny4zCgo= --0000000000006041100647be2069--