Skip to content

Commit 2633dae

Browse files
author
Álvaro Herrera
committed
Standardize LSN formatting by zero padding
This commit standardizes the output format for LSNs to ensure consistent representation across various tools and messages. Previously, LSNs were inconsistently printed as `%X/%X` in some contexts, while others used zero-padding. This often led to confusion when comparing. To address this, the LSN format is now uniformly set to `%X/%08X`, ensuring the lower 32-bit part is always zero-padded to eight hexadecimal digits. Author: Japin Li <japinli@hotmail.com> Reviewed-by: Masahiko Sawada <sawada.mshk@gmail.com> Reviewed-by: Álvaro Herrera <alvherre@kurilemu.de> Discussion: https://postgr.es/m/ME0P300MB0445CA53CA0E4B8C1879AF84B641A@ME0P300MB0445.AUSP300.PROD.OUTLOOK.COM
1 parent 62a17a9 commit 2633dae

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

67 files changed

+681
-681
lines changed

contrib/amcheck/verify_nbtree.c

Lines changed: 22 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -913,7 +913,7 @@ bt_report_duplicate(BtreeCheckState *state,
913913
(errcode(ERRCODE_INDEX_CORRUPTED),
914914
errmsg("index uniqueness is violated for index \"%s\"",
915915
RelationGetRelationName(state->rel)),
916-
errdetail("Index %s%s and%s%s (point to heap %s and %s) page lsn=%X/%X.",
916+
errdetail("Index %s%s and%s%s (point to heap %s and %s) page lsn=%X/%08X.",
917917
itid, pposting, nitid, pnposting, htid, nhtid,
918918
LSN_FORMAT_ARGS(state->targetlsn))));
919919
}
@@ -1058,7 +1058,7 @@ bt_leftmost_ignoring_half_dead(BtreeCheckState *state,
10581058
(errcode(ERRCODE_NO_DATA),
10591059
errmsg_internal("harmless interrupted page deletion detected in index \"%s\"",
10601060
RelationGetRelationName(state->rel)),
1061-
errdetail_internal("Block=%u right block=%u page lsn=%X/%X.",
1061+
errdetail_internal("Block=%u right block=%u page lsn=%X/%08X.",
10621062
reached, reached_from,
10631063
LSN_FORMAT_ARGS(pagelsn))));
10641064

@@ -1283,7 +1283,7 @@ bt_target_page_check(BtreeCheckState *state)
12831283
(errcode(ERRCODE_INDEX_CORRUPTED),
12841284
errmsg("wrong number of high key index tuple attributes in index \"%s\"",
12851285
RelationGetRelationName(state->rel)),
1286-
errdetail_internal("Index block=%u natts=%u block type=%s page lsn=%X/%X.",
1286+
errdetail_internal("Index block=%u natts=%u block type=%s page lsn=%X/%08X.",
12871287
state->targetblock,
12881288
BTreeTupleGetNAtts(itup, state->rel),
12891289
P_ISLEAF(topaque) ? "heap" : "index",
@@ -1332,7 +1332,7 @@ bt_target_page_check(BtreeCheckState *state)
13321332
(errcode(ERRCODE_INDEX_CORRUPTED),
13331333
errmsg("index tuple size does not equal lp_len in index \"%s\"",
13341334
RelationGetRelationName(state->rel)),
1335-
errdetail_internal("Index tid=(%u,%u) tuple size=%zu lp_len=%u page lsn=%X/%X.",
1335+
errdetail_internal("Index tid=(%u,%u) tuple size=%zu lp_len=%u page lsn=%X/%08X.",
13361336
state->targetblock, offset,
13371337
tupsize, ItemIdGetLength(itemid),
13381338
LSN_FORMAT_ARGS(state->targetlsn)),
@@ -1356,7 +1356,7 @@ bt_target_page_check(BtreeCheckState *state)
13561356
(errcode(ERRCODE_INDEX_CORRUPTED),
13571357
errmsg("wrong number of index tuple attributes in index \"%s\"",
13581358
RelationGetRelationName(state->rel)),
1359-
errdetail_internal("Index tid=%s natts=%u points to %s tid=%s page lsn=%X/%X.",
1359+
errdetail_internal("Index tid=%s natts=%u points to %s tid=%s page lsn=%X/%08X.",
13601360
itid,
13611361
BTreeTupleGetNAtts(itup, state->rel),
13621362
P_ISLEAF(topaque) ? "heap" : "index",
@@ -1406,7 +1406,7 @@ bt_target_page_check(BtreeCheckState *state)
14061406
(errcode(ERRCODE_INDEX_CORRUPTED),
14071407
errmsg("could not find tuple using search from root page in index \"%s\"",
14081408
RelationGetRelationName(state->rel)),
1409-
errdetail_internal("Index tid=%s points to heap tid=%s page lsn=%X/%X.",
1409+
errdetail_internal("Index tid=%s points to heap tid=%s page lsn=%X/%08X.",
14101410
itid, htid,
14111411
LSN_FORMAT_ARGS(state->targetlsn))));
14121412
}
@@ -1435,7 +1435,7 @@ bt_target_page_check(BtreeCheckState *state)
14351435
(errcode(ERRCODE_INDEX_CORRUPTED),
14361436
errmsg_internal("posting list contains misplaced TID in index \"%s\"",
14371437
RelationGetRelationName(state->rel)),
1438-
errdetail_internal("Index tid=%s posting list offset=%d page lsn=%X/%X.",
1438+
errdetail_internal("Index tid=%s posting list offset=%d page lsn=%X/%08X.",
14391439
itid, i,
14401440
LSN_FORMAT_ARGS(state->targetlsn))));
14411441
}
@@ -1488,7 +1488,7 @@ bt_target_page_check(BtreeCheckState *state)
14881488
(errcode(ERRCODE_INDEX_CORRUPTED),
14891489
errmsg("index row size %zu exceeds maximum for index \"%s\"",
14901490
tupsize, RelationGetRelationName(state->rel)),
1491-
errdetail_internal("Index tid=%s points to %s tid=%s page lsn=%X/%X.",
1491+
errdetail_internal("Index tid=%s points to %s tid=%s page lsn=%X/%08X.",
14921492
itid,
14931493
P_ISLEAF(topaque) ? "heap" : "index",
14941494
htid,
@@ -1595,7 +1595,7 @@ bt_target_page_check(BtreeCheckState *state)
15951595
(errcode(ERRCODE_INDEX_CORRUPTED),
15961596
errmsg("high key invariant violated for index \"%s\"",
15971597
RelationGetRelationName(state->rel)),
1598-
errdetail_internal("Index tid=%s points to %s tid=%s page lsn=%X/%X.",
1598+
errdetail_internal("Index tid=%s points to %s tid=%s page lsn=%X/%08X.",
15991599
itid,
16001600
P_ISLEAF(topaque) ? "heap" : "index",
16011601
htid,
@@ -1641,9 +1641,7 @@ bt_target_page_check(BtreeCheckState *state)
16411641
(errcode(ERRCODE_INDEX_CORRUPTED),
16421642
errmsg("item order invariant violated for index \"%s\"",
16431643
RelationGetRelationName(state->rel)),
1644-
errdetail_internal("Lower index tid=%s (points to %s tid=%s) "
1645-
"higher index tid=%s (points to %s tid=%s) "
1646-
"page lsn=%X/%X.",
1644+
errdetail_internal("Lower index tid=%s (points to %s tid=%s) higher index tid=%s (points to %s tid=%s) page lsn=%X/%08X.",
16471645
itid,
16481646
P_ISLEAF(topaque) ? "heap" : "index",
16491647
htid,
@@ -1760,7 +1758,7 @@ bt_target_page_check(BtreeCheckState *state)
17601758
(errcode(ERRCODE_INDEX_CORRUPTED),
17611759
errmsg("cross page item order invariant violated for index \"%s\"",
17621760
RelationGetRelationName(state->rel)),
1763-
errdetail_internal("Last item on page tid=(%u,%u) page lsn=%X/%X.",
1761+
errdetail_internal("Last item on page tid=(%u,%u) page lsn=%X/%08X.",
17641762
state->targetblock, offset,
17651763
LSN_FORMAT_ARGS(state->targetlsn))));
17661764
}
@@ -1813,7 +1811,7 @@ bt_target_page_check(BtreeCheckState *state)
18131811
(errcode(ERRCODE_INDEX_CORRUPTED),
18141812
errmsg("right block of leaf block is non-leaf for index \"%s\"",
18151813
RelationGetRelationName(state->rel)),
1816-
errdetail_internal("Block=%u page lsn=%X/%X.",
1814+
errdetail_internal("Block=%u page lsn=%X/%08X.",
18171815
state->targetblock,
18181816
LSN_FORMAT_ARGS(state->targetlsn))));
18191817

@@ -2237,7 +2235,7 @@ bt_child_highkey_check(BtreeCheckState *state,
22372235
(errcode(ERRCODE_INDEX_CORRUPTED),
22382236
errmsg("the first child of leftmost target page is not leftmost of its level in index \"%s\"",
22392237
RelationGetRelationName(state->rel)),
2240-
errdetail_internal("Target block=%u child block=%u target page lsn=%X/%X.",
2238+
errdetail_internal("Target block=%u child block=%u target page lsn=%X/%08X.",
22412239
state->targetblock, blkno,
22422240
LSN_FORMAT_ARGS(state->targetlsn))));
22432241

@@ -2323,7 +2321,7 @@ bt_child_highkey_check(BtreeCheckState *state,
23232321
(errcode(ERRCODE_INDEX_CORRUPTED),
23242322
errmsg("child high key is greater than rightmost pivot key on target level in index \"%s\"",
23252323
RelationGetRelationName(state->rel)),
2326-
errdetail_internal("Target block=%u child block=%u target page lsn=%X/%X.",
2324+
errdetail_internal("Target block=%u child block=%u target page lsn=%X/%08X.",
23272325
state->targetblock, blkno,
23282326
LSN_FORMAT_ARGS(state->targetlsn))));
23292327
pivotkey_offset = P_HIKEY;
@@ -2353,7 +2351,7 @@ bt_child_highkey_check(BtreeCheckState *state,
23532351
(errcode(ERRCODE_INDEX_CORRUPTED),
23542352
errmsg("can't find left sibling high key in index \"%s\"",
23552353
RelationGetRelationName(state->rel)),
2356-
errdetail_internal("Target block=%u child block=%u target page lsn=%X/%X.",
2354+
errdetail_internal("Target block=%u child block=%u target page lsn=%X/%08X.",
23572355
state->targetblock, blkno,
23582356
LSN_FORMAT_ARGS(state->targetlsn))));
23592357
itup = state->lowkey;
@@ -2365,7 +2363,7 @@ bt_child_highkey_check(BtreeCheckState *state,
23652363
(errcode(ERRCODE_INDEX_CORRUPTED),
23662364
errmsg("mismatch between parent key and child high key in index \"%s\"",
23672365
RelationGetRelationName(state->rel)),
2368-
errdetail_internal("Target block=%u child block=%u target page lsn=%X/%X.",
2366+
errdetail_internal("Target block=%u child block=%u target page lsn=%X/%08X.",
23692367
state->targetblock, blkno,
23702368
LSN_FORMAT_ARGS(state->targetlsn))));
23712369
}
@@ -2505,7 +2503,7 @@ bt_child_check(BtreeCheckState *state, BTScanInsert targetkey,
25052503
(errcode(ERRCODE_INDEX_CORRUPTED),
25062504
errmsg("downlink to deleted page found in index \"%s\"",
25072505
RelationGetRelationName(state->rel)),
2508-
errdetail_internal("Parent block=%u child block=%u parent page lsn=%X/%X.",
2506+
errdetail_internal("Parent block=%u child block=%u parent page lsn=%X/%08X.",
25092507
state->targetblock, childblock,
25102508
LSN_FORMAT_ARGS(state->targetlsn))));
25112509

@@ -2546,7 +2544,7 @@ bt_child_check(BtreeCheckState *state, BTScanInsert targetkey,
25462544
(errcode(ERRCODE_INDEX_CORRUPTED),
25472545
errmsg("down-link lower bound invariant violated for index \"%s\"",
25482546
RelationGetRelationName(state->rel)),
2549-
errdetail_internal("Parent block=%u child index tid=(%u,%u) parent page lsn=%X/%X.",
2547+
errdetail_internal("Parent block=%u child index tid=(%u,%u) parent page lsn=%X/%08X.",
25502548
state->targetblock, childblock, offset,
25512549
LSN_FORMAT_ARGS(state->targetlsn))));
25522550
}
@@ -2616,7 +2614,7 @@ bt_downlink_missing_check(BtreeCheckState *state, bool rightsplit,
26162614
(errcode(ERRCODE_NO_DATA),
26172615
errmsg_internal("harmless interrupted page split detected in index \"%s\"",
26182616
RelationGetRelationName(state->rel)),
2619-
errdetail_internal("Block=%u level=%u left sibling=%u page lsn=%X/%X.",
2617+
errdetail_internal("Block=%u level=%u left sibling=%u page lsn=%X/%08X.",
26202618
blkno, opaque->btpo_level,
26212619
opaque->btpo_prev,
26222620
LSN_FORMAT_ARGS(pagelsn))));
@@ -2638,7 +2636,7 @@ bt_downlink_missing_check(BtreeCheckState *state, bool rightsplit,
26382636
(errcode(ERRCODE_INDEX_CORRUPTED),
26392637
errmsg("leaf index block lacks downlink in index \"%s\"",
26402638
RelationGetRelationName(state->rel)),
2641-
errdetail_internal("Block=%u page lsn=%X/%X.",
2639+
errdetail_internal("Block=%u page lsn=%X/%08X.",
26422640
blkno,
26432641
LSN_FORMAT_ARGS(pagelsn))));
26442642

@@ -2704,7 +2702,7 @@ bt_downlink_missing_check(BtreeCheckState *state, bool rightsplit,
27042702
(errcode(ERRCODE_INDEX_CORRUPTED),
27052703
errmsg_internal("downlink to deleted leaf page found in index \"%s\"",
27062704
RelationGetRelationName(state->rel)),
2707-
errdetail_internal("Top parent/target block=%u leaf block=%u top parent/under check lsn=%X/%X.",
2705+
errdetail_internal("Top parent/target block=%u leaf block=%u top parent/under check lsn=%X/%08X.",
27082706
blkno, childblk,
27092707
LSN_FORMAT_ARGS(pagelsn))));
27102708

@@ -2730,7 +2728,7 @@ bt_downlink_missing_check(BtreeCheckState *state, bool rightsplit,
27302728
(errcode(ERRCODE_INDEX_CORRUPTED),
27312729
errmsg("internal index block lacks downlink in index \"%s\"",
27322730
RelationGetRelationName(state->rel)),
2733-
errdetail_internal("Block=%u level=%u page lsn=%X/%X.",
2731+
errdetail_internal("Block=%u level=%u page lsn=%X/%08X.",
27342732
blkno, opaque->btpo_level,
27352733
LSN_FORMAT_ARGS(pagelsn))));
27362734
}

contrib/pageinspect/expected/gist.out

Lines changed: 9 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -5,21 +5,21 @@ CREATE UNLOGGED TABLE test_gist AS SELECT point(i,i) p, i::text t FROM
55
CREATE INDEX test_gist_idx ON test_gist USING gist (p);
66
-- Page 0 is the root, the rest are leaf pages
77
SELECT * FROM gist_page_opaque_info(get_raw_page('test_gist_idx', 0));
8-
lsn | nsn | rightlink | flags
9-
-----+-----+------------+-------
10-
0/1 | 0/0 | 4294967295 | {}
8+
lsn | nsn | rightlink | flags
9+
------------+------------+------------+-------
10+
0/00000001 | 0/00000000 | 4294967295 | {}
1111
(1 row)
1212

1313
SELECT * FROM gist_page_opaque_info(get_raw_page('test_gist_idx', 1));
14-
lsn | nsn | rightlink | flags
15-
-----+-----+------------+--------
16-
0/1 | 0/0 | 4294967295 | {leaf}
14+
lsn | nsn | rightlink | flags
15+
------------+------------+------------+--------
16+
0/00000001 | 0/00000000 | 4294967295 | {leaf}
1717
(1 row)
1818

1919
SELECT * FROM gist_page_opaque_info(get_raw_page('test_gist_idx', 2));
20-
lsn | nsn | rightlink | flags
21-
-----+-----+-----------+--------
22-
0/1 | 0/0 | 1 | {leaf}
20+
lsn | nsn | rightlink | flags
21+
------------+------------+-----------+--------
22+
0/00000001 | 0/00000000 | 1 | {leaf}
2323
(1 row)
2424

2525
SELECT * FROM gist_page_items(get_raw_page('test_gist_idx', 0), 'test_gist_idx');

contrib/pageinspect/expected/page.out

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -265,9 +265,9 @@ SELECT fsm_page_contents(decode(repeat('00', :block_size), 'hex'));
265265
(1 row)
266266

267267
SELECT page_header(decode(repeat('00', :block_size), 'hex'));
268-
page_header
269-
-----------------------
270-
(0/0,0,0,0,0,0,0,0,0)
268+
page_header
269+
------------------------------
270+
(0/00000000,0,0,0,0,0,0,0,0)
271271
(1 row)
272272

273273
SELECT page_checksum(decode(repeat('00', :block_size), 'hex'), 1);

contrib/pageinspect/rawpage.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -282,7 +282,7 @@ page_header(PG_FUNCTION_ARGS)
282282
{
283283
char lsnchar[64];
284284

285-
snprintf(lsnchar, sizeof(lsnchar), "%X/%X", LSN_FORMAT_ARGS(lsn));
285+
snprintf(lsnchar, sizeof(lsnchar), "%X/%08X", LSN_FORMAT_ARGS(lsn));
286286
values[0] = CStringGetTextDatum(lsnchar);
287287
}
288288
else

contrib/pg_walinspect/expected/pg_walinspect.out

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -19,14 +19,14 @@ INSERT INTO sample_tbl SELECT * FROM generate_series(3, 4);
1919
-- ===================================================================
2020
-- Invalid input LSN.
2121
SELECT * FROM pg_get_wal_record_info('0/0');
22-
ERROR: could not read WAL at LSN 0/0
22+
ERROR: could not read WAL at LSN 0/00000000
2323
-- Invalid start LSN.
2424
SELECT * FROM pg_get_wal_records_info('0/0', :'wal_lsn1');
25-
ERROR: could not read WAL at LSN 0/0
25+
ERROR: could not read WAL at LSN 0/00000000
2626
SELECT * FROM pg_get_wal_stats('0/0', :'wal_lsn1');
27-
ERROR: could not read WAL at LSN 0/0
27+
ERROR: could not read WAL at LSN 0/00000000
2828
SELECT * FROM pg_get_wal_block_info('0/0', :'wal_lsn1');
29-
ERROR: could not read WAL at LSN 0/0
29+
ERROR: could not read WAL at LSN 0/00000000
3030
-- Start LSN > End LSN.
3131
SELECT * FROM pg_get_wal_records_info(:'wal_lsn2', :'wal_lsn1');
3232
ERROR: WAL start LSN must be less than end LSN

contrib/pg_walinspect/pg_walinspect.c

Lines changed: 10 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -105,7 +105,7 @@ InitXLogReaderState(XLogRecPtr lsn)
105105
if (lsn < XLOG_BLCKSZ)
106106
ereport(ERROR,
107107
(errcode(ERRCODE_INVALID_PARAMETER_VALUE),
108-
errmsg("could not read WAL at LSN %X/%X",
108+
errmsg("could not read WAL at LSN %X/%08X",
109109
LSN_FORMAT_ARGS(lsn))));
110110

111111
private_data = (ReadLocalXLogPageNoWaitPrivate *)
@@ -128,8 +128,8 @@ InitXLogReaderState(XLogRecPtr lsn)
128128

129129
if (XLogRecPtrIsInvalid(first_valid_record))
130130
ereport(ERROR,
131-
(errmsg("could not find a valid record after %X/%X",
132-
LSN_FORMAT_ARGS(lsn))));
131+
errmsg("could not find a valid record after %X/%08X",
132+
LSN_FORMAT_ARGS(lsn)));
133133

134134
return xlogreader;
135135
}
@@ -168,12 +168,12 @@ ReadNextXLogRecord(XLogReaderState *xlogreader)
168168
if (errormsg)
169169
ereport(ERROR,
170170
(errcode_for_file_access(),
171-
errmsg("could not read WAL at %X/%X: %s",
171+
errmsg("could not read WAL at %X/%08X: %s",
172172
LSN_FORMAT_ARGS(xlogreader->EndRecPtr), errormsg)));
173173
else
174174
ereport(ERROR,
175175
(errcode_for_file_access(),
176-
errmsg("could not read WAL at %X/%X",
176+
errmsg("could not read WAL at %X/%08X",
177177
LSN_FORMAT_ARGS(xlogreader->EndRecPtr))));
178178
}
179179

@@ -479,7 +479,7 @@ pg_get_wal_record_info(PG_FUNCTION_ARGS)
479479
ereport(ERROR,
480480
(errcode(ERRCODE_INVALID_PARAMETER_VALUE),
481481
errmsg("WAL input LSN must be less than current LSN"),
482-
errdetail("Current WAL LSN on the database system is at %X/%X.",
482+
errdetail("Current WAL LSN on the database system is at %X/%08X.",
483483
LSN_FORMAT_ARGS(curr_lsn))));
484484

485485
/* Build a tuple descriptor for our result type. */
@@ -491,7 +491,7 @@ pg_get_wal_record_info(PG_FUNCTION_ARGS)
491491
if (!ReadNextXLogRecord(xlogreader))
492492
ereport(ERROR,
493493
(errcode(ERRCODE_INVALID_PARAMETER_VALUE),
494-
errmsg("could not read WAL at %X/%X",
494+
errmsg("could not read WAL at %X/%08X",
495495
LSN_FORMAT_ARGS(xlogreader->EndRecPtr))));
496496

497497
GetWALRecordInfo(xlogreader, values, nulls, PG_GET_WAL_RECORD_INFO_COLS);
@@ -521,7 +521,7 @@ ValidateInputLSNs(XLogRecPtr start_lsn, XLogRecPtr *end_lsn)
521521
ereport(ERROR,
522522
(errcode(ERRCODE_INVALID_PARAMETER_VALUE),
523523
errmsg("WAL start LSN must be less than current LSN"),
524-
errdetail("Current WAL LSN on the database system is at %X/%X.",
524+
errdetail("Current WAL LSN on the database system is at %X/%08X.",
525525
LSN_FORMAT_ARGS(curr_lsn))));
526526

527527
if (start_lsn > *end_lsn)
@@ -827,7 +827,7 @@ pg_get_wal_records_info_till_end_of_wal(PG_FUNCTION_ARGS)
827827
ereport(ERROR,
828828
(errcode(ERRCODE_INVALID_PARAMETER_VALUE),
829829
errmsg("WAL start LSN must be less than current LSN"),
830-
errdetail("Current WAL LSN on the database system is at %X/%X.",
830+
errdetail("Current WAL LSN on the database system is at %X/%08X.",
831831
LSN_FORMAT_ARGS(end_lsn))));
832832

833833
GetWALRecordsInfo(fcinfo, start_lsn, end_lsn);
@@ -846,7 +846,7 @@ pg_get_wal_stats_till_end_of_wal(PG_FUNCTION_ARGS)
846846
ereport(ERROR,
847847
(errcode(ERRCODE_INVALID_PARAMETER_VALUE),
848848
errmsg("WAL start LSN must be less than current LSN"),
849-
errdetail("Current WAL LSN on the database system is at %X/%X.",
849+
errdetail("Current WAL LSN on the database system is at %X/%08X.",
850850
LSN_FORMAT_ARGS(end_lsn))));
851851

852852
GetWalStats(fcinfo, start_lsn, end_lsn, stats_per_record);

doc/src/sgml/catalogs.sgml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7971,7 +7971,7 @@ SCRAM-SHA-256$<replaceable>&lt;iteration count&gt;</replaceable>:<replaceable>&l
79717971
</para>
79727972
<para>
79737973
Finish LSN of the transaction whose changes are to be skipped, if a valid
7974-
LSN; otherwise <literal>0/0</literal>.
7974+
LSN; otherwise <literal>0/0000000</literal>.
79757975
</para></entry>
79767976
</row>
79777977

0 commit comments

Comments
 (0)