{"diffoscope-json-version": 1, "source1": "/input1", "source2": "/input2", "unified_diff": null, "details": [{"source1": "zipinfo {}", "source2": "zipinfo {}", "unified_diff": "@@ -1,8 +1,8 @@\n-Zip file size: 25723 bytes, number of entries: 29\n+Zip file size: 25822 bytes, number of entries: 29\n -rw-r--r--  2.0 unx       64 b- defN 20-Apr-01 08:04 META-INF/MANIFEST.MF\n drwxr-xr-x  2.0 unx        0 b- stor 20-Apr-01 08:04 META-INF/\n drwxr-xr-x  2.0 unx        0 b- stor 20-Apr-01 08:04 org/\n drwxr-xr-x  2.0 unx        0 b- stor 20-Apr-01 08:04 org/apache/\n drwxr-xr-x  2.0 unx        0 b- stor 20-Apr-01 08:04 org/apache/dubbo/\n drwxr-xr-x  2.0 unx        0 b- stor 20-Apr-01 08:04 org/apache/dubbo/registry/\n drwxr-xr-x  2.0 unx        0 b- stor 20-Apr-01 08:04 org/apache/dubbo/registry/nacos/\n@@ -11,21 +11,21 @@\n drwxr-xr-x  2.0 unx        0 b- stor 20-Apr-01 08:04 META-INF/dubbo/internal/\n drwxr-xr-x  2.0 unx        0 b- stor 20-Apr-01 08:04 META-INF/maven/\n drwxr-xr-x  2.0 unx        0 b- stor 20-Apr-01 08:04 META-INF/maven/org.apache.dubbo/\n drwxr-xr-x  2.0 unx        0 b- stor 20-Apr-01 08:04 META-INF/maven/org.apache.dubbo/dubbo-registry-nacos/\n -rw-r--r--  2.0 unx     8297 b- defN 20-Apr-01 08:04 META-INF/DEPENDENCIES\n -rw-r--r--  2.0 unx    11358 b- defN 20-Apr-01 08:04 META-INF/LICENSE\n -rw-r--r--  2.0 unx      177 b- defN 20-Apr-01 08:04 META-INF/NOTICE\n--rw-r--r--  2.0 unx     3577 b- defN 20-Apr-01 08:04 org/apache/dubbo/registry/nacos/NacosNamingServiceWrapper.java\n--rw-r--r--  2.0 unx    23611 b- defN 20-Apr-01 08:04 org/apache/dubbo/registry/nacos/NacosRegistry.java\n--rw-r--r--  2.0 unx     1910 b- defN 20-Apr-01 08:04 org/apache/dubbo/registry/nacos/NacosRegistryFactory.java\n--rw-r--r--  2.0 unx     5828 b- defN 20-Apr-01 08:04 org/apache/dubbo/registry/nacos/NacosServiceDiscovery.java\n--rw-r--r--  2.0 unx     1241 b- defN 20-Apr-01 08:04 org/apache/dubbo/registry/nacos/NacosServiceDiscoveryFactory.java\n--rw-r--r--  2.0 unx     6779 b- defN 20-Apr-01 08:04 org/apache/dubbo/registry/nacos/NacosServiceName.java\n--rw-r--r--  2.0 unx     2744 b- defN 20-Apr-01 08:04 org/apache/dubbo/registry/nacos/util/NacosInstanceManageUtil.java\n--rw-r--r--  2.0 unx     8001 b- defN 20-Apr-01 08:04 org/apache/dubbo/registry/nacos/util/NacosNamingServiceUtils.java\n+-rw-r--r--  2.0 unx     3664 b- defN 20-Apr-01 08:04 org/apache/dubbo/registry/nacos/NacosNamingServiceWrapper.java\n+-rw-r--r--  2.0 unx    24235 b- defN 20-Apr-01 08:04 org/apache/dubbo/registry/nacos/NacosRegistry.java\n+-rw-r--r--  2.0 unx     1959 b- defN 20-Apr-01 08:04 org/apache/dubbo/registry/nacos/NacosRegistryFactory.java\n+-rw-r--r--  2.0 unx     5982 b- defN 20-Apr-01 08:04 org/apache/dubbo/registry/nacos/NacosServiceDiscovery.java\n+-rw-r--r--  2.0 unx     1274 b- defN 20-Apr-01 08:04 org/apache/dubbo/registry/nacos/NacosServiceDiscoveryFactory.java\n+-rw-r--r--  2.0 unx     7013 b- defN 20-Apr-01 08:04 org/apache/dubbo/registry/nacos/NacosServiceName.java\n+-rw-r--r--  2.0 unx     2811 b- defN 20-Apr-01 08:04 org/apache/dubbo/registry/nacos/util/NacosInstanceManageUtil.java\n+-rw-r--r--  2.0 unx     8190 b- defN 20-Apr-01 08:04 org/apache/dubbo/registry/nacos/util/NacosNamingServiceUtils.java\n -rw-r--r--  2.0 unx       58 b- defN 20-Apr-01 08:04 META-INF/dubbo/internal/org.apache.dubbo.registry.RegistryFactory\n -rw-r--r--  2.0 unx       59 b- defN 20-Apr-01 08:04 META-INF/dubbo/internal/org.apache.dubbo.registry.client.ServiceDiscovery\n -rw-r--r--  2.0 unx       66 b- defN 20-Apr-01 08:04 META-INF/dubbo/internal/org.apache.dubbo.registry.client.ServiceDiscoveryFactory\n--rw-r--r--  2.0 unx     3123 b- defN 20-Apr-01 08:04 META-INF/maven/org.apache.dubbo/dubbo-registry-nacos/pom.xml\n+-rw-r--r--  2.0 unx     3041 b- defN 20-Apr-01 08:04 META-INF/maven/org.apache.dubbo/dubbo-registry-nacos/pom.xml\n -rw-r--r--  2.0 unx       75 b- defN 20-Apr-01 08:04 META-INF/maven/org.apache.dubbo/dubbo-registry-nacos/pom.properties\n-29 files, 76968 bytes uncompressed, 21163 bytes compressed:  72.5%\n+29 files, 78323 bytes uncompressed, 21262 bytes compressed:  72.9%\n"}, {"source1": "zipdetails --redact --scan --utc {}", "source2": "zipdetails --redact --scan --utc {}", "unified_diff": "@@ -299,1173 +299,1173 @@\n 19E5 Extract Zip Spec      14 (20) '2.0'\n 19E6 Extract OS            00 (0) 'MS-DOS'\n 19E7 General Purpose Flag  0800 (2048)\n      [Bits 1-2]            0 'Normal Compression'\n      [Bit 11]              1 'Language Encoding'\n 19E9 Compression Method    0008 (8) 'Deflated'\n 19EB Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n-19EF CRC                   BB0161DF (3137429983)\n-19F3 Compressed Size       00000468 (1128)\n-19F7 Uncompressed Size     00000DF9 (3577)\n+19EF CRC                   EDC5D490 (3989165200)\n+19F3 Compressed Size       00000470 (1136)\n+19F7 Uncompressed Size     00000E50 (3664)\n 19FB Filename Length       003E (62)\n 19FD Extra Length          0000 (0)\n 19FF Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n # WARNING: Offset 0x19FF: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n 1A3D PAYLOAD\n \n-1EA5 LOCAL HEADER #18      04034B50 (67324752)\n-1EA9 Extract Zip Spec      14 (20) '2.0'\n-1EAA Extract OS            00 (0) 'MS-DOS'\n-1EAB General Purpose Flag  0800 (2048)\n+1EAD LOCAL HEADER #18      04034B50 (67324752)\n+1EB1 Extract Zip Spec      14 (20) '2.0'\n+1EB2 Extract OS            00 (0) 'MS-DOS'\n+1EB3 General Purpose Flag  0800 (2048)\n      [Bits 1-2]            0 'Normal Compression'\n      [Bit 11]              1 'Language Encoding'\n-1EAD Compression Method    0008 (8) 'Deflated'\n-1EAF Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n-1EB3 CRC                   E2B000EA (3803185386)\n-1EB7 Compressed Size       000013F0 (5104)\n-1EBB Uncompressed Size     00005C3B (23611)\n-1EBF Filename Length       0032 (50)\n-1EC1 Extra Length          0000 (0)\n-1EC3 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+1EB5 Compression Method    0008 (8) 'Deflated'\n+1EB7 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n+1EBB CRC                   F6A25F0D (4137836301)\n+1EBF Compressed Size       00001408 (5128)\n+1EC3 Uncompressed Size     00005EAB (24235)\n+1EC7 Filename Length       0032 (50)\n+1EC9 Extra Length          0000 (0)\n+1ECB Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x1EC3: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x1ECB: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-1EF5 PAYLOAD\n+1EFD PAYLOAD\n \n-32E5 LOCAL HEADER #19      04034B50 (67324752)\n-32E9 Extract Zip Spec      14 (20) '2.0'\n-32EA Extract OS            00 (0) 'MS-DOS'\n-32EB General Purpose Flag  0800 (2048)\n+3305 LOCAL HEADER #19      04034B50 (67324752)\n+3309 Extract Zip Spec      14 (20) '2.0'\n+330A Extract OS            00 (0) 'MS-DOS'\n+330B General Purpose Flag  0800 (2048)\n      [Bits 1-2]            0 'Normal Compression'\n      [Bit 11]              1 'Language Encoding'\n-32ED Compression Method    0008 (8) 'Deflated'\n-32EF Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n-32F3 CRC                   A100EF71 (2701193073)\n-32F7 Compressed Size       0000034A (842)\n-32FB Uncompressed Size     00000776 (1910)\n-32FF Filename Length       0039 (57)\n-3301 Extra Length          0000 (0)\n-3303 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+330D Compression Method    0008 (8) 'Deflated'\n+330F Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n+3313 CRC                   8E75DF39 (2390089529)\n+3317 Compressed Size       00000354 (852)\n+331B Uncompressed Size     000007A7 (1959)\n+331F Filename Length       0039 (57)\n+3321 Extra Length          0000 (0)\n+3323 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x3303: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x3323: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-333C PAYLOAD\n+335C PAYLOAD\n \n-3686 LOCAL HEADER #20      04034B50 (67324752)\n-368A Extract Zip Spec      14 (20) '2.0'\n-368B Extract OS            00 (0) 'MS-DOS'\n-368C General Purpose Flag  0800 (2048)\n+36B0 LOCAL HEADER #20      04034B50 (67324752)\n+36B4 Extract Zip Spec      14 (20) '2.0'\n+36B5 Extract OS            00 (0) 'MS-DOS'\n+36B6 General Purpose Flag  0800 (2048)\n      [Bits 1-2]            0 'Normal Compression'\n      [Bit 11]              1 'Language Encoding'\n-368E Compression Method    0008 (8) 'Deflated'\n-3690 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n-3694 CRC                   2220AA2B (572566059)\n-3698 Compressed Size       00000648 (1608)\n-369C Uncompressed Size     000016C4 (5828)\n-36A0 Filename Length       003A (58)\n-36A2 Extra Length          0000 (0)\n-36A4 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+36B8 Compression Method    0008 (8) 'Deflated'\n+36BA Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n+36BE CRC                   6AA8E21B (1789452827)\n+36C2 Compressed Size       00000659 (1625)\n+36C6 Uncompressed Size     0000175E (5982)\n+36CA Filename Length       003A (58)\n+36CC Extra Length          0000 (0)\n+36CE Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x36A4: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x36CE: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-36DE PAYLOAD\n+3708 PAYLOAD\n \n-3D26 LOCAL HEADER #21      04034B50 (67324752)\n-3D2A Extract Zip Spec      14 (20) '2.0'\n-3D2B Extract OS            00 (0) 'MS-DOS'\n-3D2C General Purpose Flag  0800 (2048)\n+3D61 LOCAL HEADER #21      04034B50 (67324752)\n+3D65 Extract Zip Spec      14 (20) '2.0'\n+3D66 Extract OS            00 (0) 'MS-DOS'\n+3D67 General Purpose Flag  0800 (2048)\n      [Bits 1-2]            0 'Normal Compression'\n      [Bit 11]              1 'Language Encoding'\n-3D2E Compression Method    0008 (8) 'Deflated'\n-3D30 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n-3D34 CRC                   94B18BA4 (2494663588)\n-3D38 Compressed Size       00000269 (617)\n-3D3C Uncompressed Size     000004D9 (1241)\n-3D40 Filename Length       0041 (65)\n-3D42 Extra Length          0000 (0)\n-3D44 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+3D69 Compression Method    0008 (8) 'Deflated'\n+3D6B Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n+3D6F CRC                   22BB3DD7 (582696407)\n+3D73 Compressed Size       00000271 (625)\n+3D77 Uncompressed Size     000004FA (1274)\n+3D7B Filename Length       0041 (65)\n+3D7D Extra Length          0000 (0)\n+3D7F Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x3D44: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x3D7F: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-3D85 PAYLOAD\n+3DC0 PAYLOAD\n \n-3FEE LOCAL HEADER #22      04034B50 (67324752)\n-3FF2 Extract Zip Spec      14 (20) '2.0'\n-3FF3 Extract OS            00 (0) 'MS-DOS'\n-3FF4 General Purpose Flag  0800 (2048)\n+4031 LOCAL HEADER #22      04034B50 (67324752)\n+4035 Extract Zip Spec      14 (20) '2.0'\n+4036 Extract OS            00 (0) 'MS-DOS'\n+4037 General Purpose Flag  0800 (2048)\n      [Bits 1-2]            0 'Normal Compression'\n      [Bit 11]              1 'Language Encoding'\n-3FF6 Compression Method    0008 (8) 'Deflated'\n-3FF8 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n-3FFC CRC                   F3388AB4 (4080569012)\n-4000 Compressed Size       000006FA (1786)\n-4004 Uncompressed Size     00001A7B (6779)\n-4008 Filename Length       0035 (53)\n-400A Extra Length          0000 (0)\n-400C Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+4039 Compression Method    0008 (8) 'Deflated'\n+403B Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n+403F CRC                   B2C3D88B (2999179403)\n+4043 Compressed Size       0000070B (1803)\n+4047 Uncompressed Size     00001B65 (7013)\n+404B Filename Length       0035 (53)\n+404D Extra Length          0000 (0)\n+404F Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x400C: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x404F: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-4041 PAYLOAD\n+4084 PAYLOAD\n \n-473B LOCAL HEADER #23      04034B50 (67324752)\n-473F Extract Zip Spec      14 (20) '2.0'\n-4740 Extract OS            00 (0) 'MS-DOS'\n-4741 General Purpose Flag  0800 (2048)\n+478F LOCAL HEADER #23      04034B50 (67324752)\n+4793 Extract Zip Spec      14 (20) '2.0'\n+4794 Extract OS            00 (0) 'MS-DOS'\n+4795 General Purpose Flag  0800 (2048)\n      [Bits 1-2]            0 'Normal Compression'\n      [Bit 11]              1 'Language Encoding'\n-4743 Compression Method    0008 (8) 'Deflated'\n-4745 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n-4749 CRC                   D4BBF170 (3569086832)\n-474D Compressed Size       0000041C (1052)\n-4751 Uncompressed Size     00000AB8 (2744)\n-4755 Filename Length       0041 (65)\n-4757 Extra Length          0000 (0)\n-4759 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+4797 Compression Method    0008 (8) 'Deflated'\n+4799 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n+479D CRC                   E8B12001 (3903922177)\n+47A1 Compressed Size       00000425 (1061)\n+47A5 Uncompressed Size     00000AFB (2811)\n+47A9 Filename Length       0041 (65)\n+47AB Extra Length          0000 (0)\n+47AD Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x4759: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x47AD: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-479A PAYLOAD\n+47EE PAYLOAD\n \n-4BB6 LOCAL HEADER #24      04034B50 (67324752)\n-4BBA Extract Zip Spec      14 (20) '2.0'\n-4BBB Extract OS            00 (0) 'MS-DOS'\n-4BBC General Purpose Flag  0800 (2048)\n+4C13 LOCAL HEADER #24      04034B50 (67324752)\n+4C17 Extract Zip Spec      14 (20) '2.0'\n+4C18 Extract OS            00 (0) 'MS-DOS'\n+4C19 General Purpose Flag  0800 (2048)\n      [Bits 1-2]            0 'Normal Compression'\n      [Bit 11]              1 'Language Encoding'\n-4BBE Compression Method    0008 (8) 'Deflated'\n-4BC0 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n-4BC4 CRC                   76AAEB5B (1990912859)\n-4BC8 Compressed Size       000007E0 (2016)\n-4BCC Uncompressed Size     00001F41 (8001)\n-4BD0 Filename Length       0041 (65)\n-4BD2 Extra Length          0000 (0)\n-4BD4 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+4C1B Compression Method    0008 (8) 'Deflated'\n+4C1D Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n+4C21 CRC                   0823E298 (136569496)\n+4C25 Compressed Size       000007EC (2028)\n+4C29 Uncompressed Size     00001FFE (8190)\n+4C2D Filename Length       0041 (65)\n+4C2F Extra Length          0000 (0)\n+4C31 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x4BD4: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x4C31: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-4C15 PAYLOAD\n+4C72 PAYLOAD\n \n-53F5 LOCAL HEADER #25      04034B50 (67324752)\n-53F9 Extract Zip Spec      14 (20) '2.0'\n-53FA Extract OS            00 (0) 'MS-DOS'\n-53FB General Purpose Flag  0800 (2048)\n+545E LOCAL HEADER #25      04034B50 (67324752)\n+5462 Extract Zip Spec      14 (20) '2.0'\n+5463 Extract OS            00 (0) 'MS-DOS'\n+5464 General Purpose Flag  0800 (2048)\n      [Bits 1-2]            0 'Normal Compression'\n      [Bit 11]              1 'Language Encoding'\n-53FD Compression Method    0008 (8) 'Deflated'\n-53FF Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n-5403 CRC                   9217B46E (2451027054)\n-5407 Compressed Size       00000032 (50)\n-540B Uncompressed Size     0000003A (58)\n-540F Filename Length       0041 (65)\n-5411 Extra Length          0000 (0)\n-5413 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+5466 Compression Method    0008 (8) 'Deflated'\n+5468 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n+546C CRC                   9217B46E (2451027054)\n+5470 Compressed Size       00000032 (50)\n+5474 Uncompressed Size     0000003A (58)\n+5478 Filename Length       0041 (65)\n+547A Extra Length          0000 (0)\n+547C Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x5413: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x547C: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-5454 PAYLOAD               XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX\n+54BD PAYLOAD               XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX\n \n-5486 LOCAL HEADER #26      04034B50 (67324752)\n-548A Extract Zip Spec      14 (20) '2.0'\n-548B Extract OS            00 (0) 'MS-DOS'\n-548C General Purpose Flag  0800 (2048)\n+54EF LOCAL HEADER #26      04034B50 (67324752)\n+54F3 Extract Zip Spec      14 (20) '2.0'\n+54F4 Extract OS            00 (0) 'MS-DOS'\n+54F5 General Purpose Flag  0800 (2048)\n      [Bits 1-2]            0 'Normal Compression'\n      [Bit 11]              1 'Language Encoding'\n-548E Compression Method    0008 (8) 'Deflated'\n-5490 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n-5494 CRC                   E5088BE5 (3842542565)\n-5498 Compressed Size       00000038 (56)\n-549C Uncompressed Size     0000003B (59)\n-54A0 Filename Length       0049 (73)\n-54A2 Extra Length          0000 (0)\n-54A4 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+54F7 Compression Method    0008 (8) 'Deflated'\n+54F9 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n+54FD CRC                   E5088BE5 (3842542565)\n+5501 Compressed Size       00000038 (56)\n+5505 Uncompressed Size     0000003B (59)\n+5509 Filename Length       0049 (73)\n+550B Extra Length          0000 (0)\n+550D Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x54A4: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x550D: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-54ED PAYLOAD               XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX\n+5556 PAYLOAD               XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX\n \n-5525 LOCAL HEADER #27      04034B50 (67324752)\n-5529 Extract Zip Spec      14 (20) '2.0'\n-552A Extract OS            00 (0) 'MS-DOS'\n-552B General Purpose Flag  0800 (2048)\n+558E LOCAL HEADER #27      04034B50 (67324752)\n+5592 Extract Zip Spec      14 (20) '2.0'\n+5593 Extract OS            00 (0) 'MS-DOS'\n+5594 General Purpose Flag  0800 (2048)\n      [Bits 1-2]            0 'Normal Compression'\n      [Bit 11]              1 'Language Encoding'\n-552D Compression Method    0008 (8) 'Deflated'\n-552F Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n-5533 CRC                   C0B5B005 (3233132549)\n-5537 Compressed Size       0000003F (63)\n-553B Uncompressed Size     00000042 (66)\n-553F Filename Length       0050 (80)\n-5541 Extra Length          0000 (0)\n-5543 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+5596 Compression Method    0008 (8) 'Deflated'\n+5598 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n+559C CRC                   C0B5B005 (3233132549)\n+55A0 Compressed Size       0000003F (63)\n+55A4 Uncompressed Size     00000042 (66)\n+55A8 Filename Length       0050 (80)\n+55AA Extra Length          0000 (0)\n+55AC Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x5543: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x55AC: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-5593 PAYLOAD               XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX\n+55FC PAYLOAD               XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX\n \n-55D2 LOCAL HEADER #28      04034B50 (67324752)\n-55D6 Extract Zip Spec      14 (20) '2.0'\n-55D7 Extract OS            00 (0) 'MS-DOS'\n-55D8 General Purpose Flag  0800 (2048)\n+563B LOCAL HEADER #28      04034B50 (67324752)\n+563F Extract Zip Spec      14 (20) '2.0'\n+5640 Extract OS            00 (0) 'MS-DOS'\n+5641 General Purpose Flag  0800 (2048)\n      [Bits 1-2]            0 'Normal Compression'\n      [Bit 11]              1 'Language Encoding'\n-55DA Compression Method    0008 (8) 'Deflated'\n-55DC Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n-55E0 CRC                   0701BB57 (117554007)\n-55E4 Compressed Size       000003CA (970)\n-55E8 Uncompressed Size     00000C33 (3123)\n-55EC Filename Length       003C (60)\n-55EE Extra Length          0000 (0)\n-55F0 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+5643 Compression Method    0008 (8) 'Deflated'\n+5645 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n+5649 CRC                   6A8F4F7A (1787776890)\n+564D Compressed Size       000003C4 (964)\n+5651 Uncompressed Size     00000BE1 (3041)\n+5655 Filename Length       003C (60)\n+5657 Extra Length          0000 (0)\n+5659 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x55F0: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x5659: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-562C PAYLOAD\n+5695 PAYLOAD\n \n-59F6 LOCAL HEADER #29      04034B50 (67324752)\n-59FA Extract Zip Spec      14 (20) '2.0'\n-59FB Extract OS            00 (0) 'MS-DOS'\n-59FC General Purpose Flag  0800 (2048)\n+5A59 LOCAL HEADER #29      04034B50 (67324752)\n+5A5D Extract Zip Spec      14 (20) '2.0'\n+5A5E Extract OS            00 (0) 'MS-DOS'\n+5A5F General Purpose Flag  0800 (2048)\n      [Bits 1-2]            0 'Normal Compression'\n      [Bit 11]              1 'Language Encoding'\n-59FE Compression Method    0008 (8) 'Deflated'\n-5A00 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n-5A04 CRC                   BACBA827 (3133909031)\n-5A08 Compressed Size       00000049 (73)\n-5A0C Uncompressed Size     0000004B (75)\n-5A10 Filename Length       0043 (67)\n-5A12 Extra Length          0000 (0)\n-5A14 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+5A61 Compression Method    0008 (8) 'Deflated'\n+5A63 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n+5A67 CRC                   BACBA827 (3133909031)\n+5A6B Compressed Size       00000049 (73)\n+5A6F Uncompressed Size     0000004B (75)\n+5A73 Filename Length       0043 (67)\n+5A75 Extra Length          0000 (0)\n+5A77 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x5A14: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x5A77: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-5A57 PAYLOAD               XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX\n+5ABA PAYLOAD               XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX\n \n-5AA0 CENTRAL HEADER #1     02014B50 (33639248)\n-5AA4 Created Zip Spec      14 (20) '2.0'\n-5AA5 Created OS            03 (3) 'Unix'\n-5AA6 Extract Zip Spec      14 (20) '2.0'\n-5AA7 Extract OS            00 (0) 'MS-DOS'\n-5AA8 General Purpose Flag  0800 (2048)\n+5B03 CENTRAL HEADER #1     02014B50 (33639248)\n+5B07 Created Zip Spec      14 (20) '2.0'\n+5B08 Created OS            03 (3) 'Unix'\n+5B09 Extract Zip Spec      14 (20) '2.0'\n+5B0A Extract OS            00 (0) 'MS-DOS'\n+5B0B General Purpose Flag  0800 (2048)\n      [Bits 1-2]            0 'Normal Compression'\n      [Bit 11]              1 'Language Encoding'\n-5AAA Compression Method    0008 (8) 'Deflated'\n-5AAC Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n-5AB0 CRC                   A689EB18 (2794056472)\n-5AB4 Compressed Size       00000042 (66)\n-5AB8 Uncompressed Size     00000040 (64)\n-5ABC Filename Length       0014 (20)\n-5ABE Extra Length          0000 (0)\n-5AC0 Comment Length        0000 (0)\n-5AC2 Disk Start            0000 (0)\n-5AC4 Int File Attributes   0000 (0)\n+5B0D Compression Method    0008 (8) 'Deflated'\n+5B0F Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n+5B13 CRC                   A689EB18 (2794056472)\n+5B17 Compressed Size       00000042 (66)\n+5B1B Uncompressed Size     00000040 (64)\n+5B1F Filename Length       0014 (20)\n+5B21 Extra Length          0000 (0)\n+5B23 Comment Length        0000 (0)\n+5B25 Disk Start            0000 (0)\n+5B27 Int File Attributes   0000 (0)\n      [Bit 0]               0 'Binary Data'\n-5AC6 Ext File Attributes   81A40000 (2175008768)\n+5B29 Ext File Attributes   81A40000 (2175008768)\n      [Bits 16-24]          01A4 (420) 'Unix attrib: rw-r--r--'\n      [Bits 28-31]          08 (8) 'Regular File'\n-5ACA Local Header Offset   00000000 (0)\n-5ACE Filename              'XXXXXXXXXXXXXXXXXXXX'\n+5B2D Local Header Offset   00000000 (0)\n+5B31 Filename              'XXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x5ACE: Filename 'XXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x5B31: Filename 'XXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n \n-5AE2 CENTRAL HEADER #2     02014B50 (33639248)\n-5AE6 Created Zip Spec      14 (20) '2.0'\n-5AE7 Created OS            03 (3) 'Unix'\n-5AE8 Extract Zip Spec      0A (10) '1.0'\n-5AE9 Extract OS            00 (0) 'MS-DOS'\n-5AEA General Purpose Flag  0800 (2048)\n-     [Bit 11]              1 'Language Encoding'\n-5AEC Compression Method    0000 (0) 'Stored'\n-5AEE Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n-5AF2 CRC                   00000000 (0)\n-5AF6 Compressed Size       00000000 (0)\n-5AFA Uncompressed Size     00000000 (0)\n-5AFE Filename Length       0009 (9)\n-5B00 Extra Length          0000 (0)\n-5B02 Comment Length        0000 (0)\n-5B04 Disk Start            0000 (0)\n-5B06 Int File Attributes   0000 (0)\n+5B45 CENTRAL HEADER #2     02014B50 (33639248)\n+5B49 Created Zip Spec      14 (20) '2.0'\n+5B4A Created OS            03 (3) 'Unix'\n+5B4B Extract Zip Spec      0A (10) '1.0'\n+5B4C Extract OS            00 (0) 'MS-DOS'\n+5B4D General Purpose Flag  0800 (2048)\n+     [Bit 11]              1 'Language Encoding'\n+5B4F Compression Method    0000 (0) 'Stored'\n+5B51 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n+5B55 CRC                   00000000 (0)\n+5B59 Compressed Size       00000000 (0)\n+5B5D Uncompressed Size     00000000 (0)\n+5B61 Filename Length       0009 (9)\n+5B63 Extra Length          0000 (0)\n+5B65 Comment Length        0000 (0)\n+5B67 Disk Start            0000 (0)\n+5B69 Int File Attributes   0000 (0)\n      [Bit 0]               0 'Binary Data'\n-5B08 Ext File Attributes   41ED0010 (1106051088)\n+5B6B Ext File Attributes   41ED0010 (1106051088)\n      [Bit 4]               Directory\n      [Bits 16-24]          01ED (493) 'Unix attrib: rwxr-xr-x'\n      [Bits 28-31]          04 (4) 'Directory'\n-5B0C Local Header Offset   00000074 (116)\n-5B10 Filename              'XXXXXXXXX'\n+5B6F Local Header Offset   00000074 (116)\n+5B73 Filename              'XXXXXXXXX'\n #\n-# WARNING: Offset 0x5B10: Filename 'XXXXXXXXX'\n+# WARNING: Offset 0x5B73: Filename 'XXXXXXXXX'\n #          Zero length filename\n #\n-# ERROR: Offset 0x5B10: Directory 'XXXXXXXXX' must end in a '/'\n+# ERROR: Offset 0x5B73: Directory 'XXXXXXXXX' must end in a '/'\n #        'External Attributes' flag this as a directory\n #\n-# WARNING: Offset 0x5AE8: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXX'\n+# WARNING: Offset 0x5B4B: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXX'\n #\n \n-5B19 CENTRAL HEADER #3     02014B50 (33639248)\n-5B1D Created Zip Spec      14 (20) '2.0'\n-5B1E Created OS            03 (3) 'Unix'\n-5B1F Extract Zip Spec      0A (10) '1.0'\n-5B20 Extract OS            00 (0) 'MS-DOS'\n-5B21 General Purpose Flag  0800 (2048)\n-     [Bit 11]              1 'Language Encoding'\n-5B23 Compression Method    0000 (0) 'Stored'\n-5B25 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n-5B29 CRC                   00000000 (0)\n-5B2D Compressed Size       00000000 (0)\n-5B31 Uncompressed Size     00000000 (0)\n-5B35 Filename Length       0004 (4)\n-5B37 Extra Length          0000 (0)\n-5B39 Comment Length        0000 (0)\n-5B3B Disk Start            0000 (0)\n-5B3D Int File Attributes   0000 (0)\n+5B7C CENTRAL HEADER #3     02014B50 (33639248)\n+5B80 Created Zip Spec      14 (20) '2.0'\n+5B81 Created OS            03 (3) 'Unix'\n+5B82 Extract Zip Spec      0A (10) '1.0'\n+5B83 Extract OS            00 (0) 'MS-DOS'\n+5B84 General Purpose Flag  0800 (2048)\n+     [Bit 11]              1 'Language Encoding'\n+5B86 Compression Method    0000 (0) 'Stored'\n+5B88 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n+5B8C CRC                   00000000 (0)\n+5B90 Compressed Size       00000000 (0)\n+5B94 Uncompressed Size     00000000 (0)\n+5B98 Filename Length       0004 (4)\n+5B9A Extra Length          0000 (0)\n+5B9C Comment Length        0000 (0)\n+5B9E Disk Start            0000 (0)\n+5BA0 Int File Attributes   0000 (0)\n      [Bit 0]               0 'Binary Data'\n-5B3F Ext File Attributes   41ED0010 (1106051088)\n+5BA2 Ext File Attributes   41ED0010 (1106051088)\n      [Bit 4]               Directory\n      [Bits 16-24]          01ED (493) 'Unix attrib: rwxr-xr-x'\n      [Bits 28-31]          04 (4) 'Directory'\n-5B43 Local Header Offset   0000009B (155)\n-5B47 Filename              'XXXX'\n+5BA6 Local Header Offset   0000009B (155)\n+5BAA Filename              'XXXX'\n #\n-# WARNING: Offset 0x5B47: Filename 'XXXX'\n+# WARNING: Offset 0x5BAA: Filename 'XXXX'\n #          Zero length filename\n #\n-# ERROR: Offset 0x5B47: Directory 'XXXX' must end in a '/'\n+# ERROR: Offset 0x5BAA: Directory 'XXXX' must end in a '/'\n #        'External Attributes' flag this as a directory\n #\n-# WARNING: Offset 0x5B1F: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXX'\n+# WARNING: Offset 0x5B82: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXX'\n #\n \n-5B4B CENTRAL HEADER #4     02014B50 (33639248)\n-5B4F Created Zip Spec      14 (20) '2.0'\n-5B50 Created OS            03 (3) 'Unix'\n-5B51 Extract Zip Spec      0A (10) '1.0'\n-5B52 Extract OS            00 (0) 'MS-DOS'\n-5B53 General Purpose Flag  0800 (2048)\n-     [Bit 11]              1 'Language Encoding'\n-5B55 Compression Method    0000 (0) 'Stored'\n-5B57 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n-5B5B CRC                   00000000 (0)\n-5B5F Compressed Size       00000000 (0)\n-5B63 Uncompressed Size     00000000 (0)\n-5B67 Filename Length       000B (11)\n-5B69 Extra Length          0000 (0)\n-5B6B Comment Length        0000 (0)\n-5B6D Disk Start            0000 (0)\n-5B6F Int File Attributes   0000 (0)\n+5BAE CENTRAL HEADER #4     02014B50 (33639248)\n+5BB2 Created Zip Spec      14 (20) '2.0'\n+5BB3 Created OS            03 (3) 'Unix'\n+5BB4 Extract Zip Spec      0A (10) '1.0'\n+5BB5 Extract OS            00 (0) 'MS-DOS'\n+5BB6 General Purpose Flag  0800 (2048)\n+     [Bit 11]              1 'Language Encoding'\n+5BB8 Compression Method    0000 (0) 'Stored'\n+5BBA Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n+5BBE CRC                   00000000 (0)\n+5BC2 Compressed Size       00000000 (0)\n+5BC6 Uncompressed Size     00000000 (0)\n+5BCA Filename Length       000B (11)\n+5BCC Extra Length          0000 (0)\n+5BCE Comment Length        0000 (0)\n+5BD0 Disk Start            0000 (0)\n+5BD2 Int File Attributes   0000 (0)\n      [Bit 0]               0 'Binary Data'\n-5B71 Ext File Attributes   41ED0010 (1106051088)\n+5BD4 Ext File Attributes   41ED0010 (1106051088)\n      [Bit 4]               Directory\n      [Bits 16-24]          01ED (493) 'Unix attrib: rwxr-xr-x'\n      [Bits 28-31]          04 (4) 'Directory'\n-5B75 Local Header Offset   000000BD (189)\n-5B79 Filename              'XXXXXXXXXXX'\n+5BD8 Local Header Offset   000000BD (189)\n+5BDC Filename              'XXXXXXXXXXX'\n #\n-# WARNING: Offset 0x5B79: Filename 'XXXXXXXXXXX'\n+# WARNING: Offset 0x5BDC: Filename 'XXXXXXXXXXX'\n #          Zero length filename\n #\n-# ERROR: Offset 0x5B79: Directory 'XXXXXXXXXXX' must end in a '/'\n+# ERROR: Offset 0x5BDC: Directory 'XXXXXXXXXXX' must end in a '/'\n #        'External Attributes' flag this as a directory\n #\n-# WARNING: Offset 0x5B51: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXX'\n+# WARNING: Offset 0x5BB4: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXX'\n #\n \n-5B84 CENTRAL HEADER #5     02014B50 (33639248)\n-5B88 Created Zip Spec      14 (20) '2.0'\n-5B89 Created OS            03 (3) 'Unix'\n-5B8A Extract Zip Spec      0A (10) '1.0'\n-5B8B Extract OS            00 (0) 'MS-DOS'\n-5B8C General Purpose Flag  0800 (2048)\n-     [Bit 11]              1 'Language Encoding'\n-5B8E Compression Method    0000 (0) 'Stored'\n-5B90 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n-5B94 CRC                   00000000 (0)\n-5B98 Compressed Size       00000000 (0)\n-5B9C Uncompressed Size     00000000 (0)\n-5BA0 Filename Length       0011 (17)\n-5BA2 Extra Length          0000 (0)\n-5BA4 Comment Length        0000 (0)\n-5BA6 Disk Start            0000 (0)\n-5BA8 Int File Attributes   0000 (0)\n+5BE7 CENTRAL HEADER #5     02014B50 (33639248)\n+5BEB Created Zip Spec      14 (20) '2.0'\n+5BEC Created OS            03 (3) 'Unix'\n+5BED Extract Zip Spec      0A (10) '1.0'\n+5BEE Extract OS            00 (0) 'MS-DOS'\n+5BEF General Purpose Flag  0800 (2048)\n+     [Bit 11]              1 'Language Encoding'\n+5BF1 Compression Method    0000 (0) 'Stored'\n+5BF3 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n+5BF7 CRC                   00000000 (0)\n+5BFB Compressed Size       00000000 (0)\n+5BFF Uncompressed Size     00000000 (0)\n+5C03 Filename Length       0011 (17)\n+5C05 Extra Length          0000 (0)\n+5C07 Comment Length        0000 (0)\n+5C09 Disk Start            0000 (0)\n+5C0B Int File Attributes   0000 (0)\n      [Bit 0]               0 'Binary Data'\n-5BAA Ext File Attributes   41ED0010 (1106051088)\n+5C0D Ext File Attributes   41ED0010 (1106051088)\n      [Bit 4]               Directory\n      [Bits 16-24]          01ED (493) 'Unix attrib: rwxr-xr-x'\n      [Bits 28-31]          04 (4) 'Directory'\n-5BAE Local Header Offset   000000E6 (230)\n-5BB2 Filename              'XXXXXXXXXXXXXXXXX'\n+5C11 Local Header Offset   000000E6 (230)\n+5C15 Filename              'XXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x5BB2: Filename 'XXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x5C15: Filename 'XXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-# ERROR: Offset 0x5BB2: Directory 'XXXXXXXXXXXXXXXXX' must end in a '/'\n+# ERROR: Offset 0x5C15: Directory 'XXXXXXXXXXXXXXXXX' must end in a '/'\n #        'External Attributes' flag this as a directory\n #\n-# WARNING: Offset 0x5B8A: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x5BED: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXX'\n #\n \n-5BC3 CENTRAL HEADER #6     02014B50 (33639248)\n-5BC7 Created Zip Spec      14 (20) '2.0'\n-5BC8 Created OS            03 (3) 'Unix'\n-5BC9 Extract Zip Spec      0A (10) '1.0'\n-5BCA Extract OS            00 (0) 'MS-DOS'\n-5BCB General Purpose Flag  0800 (2048)\n-     [Bit 11]              1 'Language Encoding'\n-5BCD Compression Method    0000 (0) 'Stored'\n-5BCF Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n-5BD3 CRC                   00000000 (0)\n-5BD7 Compressed Size       00000000 (0)\n-5BDB Uncompressed Size     00000000 (0)\n-5BDF Filename Length       001A (26)\n-5BE1 Extra Length          0000 (0)\n-5BE3 Comment Length        0000 (0)\n-5BE5 Disk Start            0000 (0)\n-5BE7 Int File Attributes   0000 (0)\n+5C26 CENTRAL HEADER #6     02014B50 (33639248)\n+5C2A Created Zip Spec      14 (20) '2.0'\n+5C2B Created OS            03 (3) 'Unix'\n+5C2C Extract Zip Spec      0A (10) '1.0'\n+5C2D Extract OS            00 (0) 'MS-DOS'\n+5C2E General Purpose Flag  0800 (2048)\n+     [Bit 11]              1 'Language Encoding'\n+5C30 Compression Method    0000 (0) 'Stored'\n+5C32 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n+5C36 CRC                   00000000 (0)\n+5C3A Compressed Size       00000000 (0)\n+5C3E Uncompressed Size     00000000 (0)\n+5C42 Filename Length       001A (26)\n+5C44 Extra Length          0000 (0)\n+5C46 Comment Length        0000 (0)\n+5C48 Disk Start            0000 (0)\n+5C4A Int File Attributes   0000 (0)\n      [Bit 0]               0 'Binary Data'\n-5BE9 Ext File Attributes   41ED0010 (1106051088)\n+5C4C Ext File Attributes   41ED0010 (1106051088)\n      [Bit 4]               Directory\n      [Bits 16-24]          01ED (493) 'Unix attrib: rwxr-xr-x'\n      [Bits 28-31]          04 (4) 'Directory'\n-5BED Local Header Offset   00000115 (277)\n-5BF1 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXX'\n+5C50 Local Header Offset   00000115 (277)\n+5C54 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x5BF1: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x5C54: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-# ERROR: Offset 0x5BF1: Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXX' must end in a '/'\n+# ERROR: Offset 0x5C54: Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXX' must end in a '/'\n #        'External Attributes' flag this as a directory\n #\n-# WARNING: Offset 0x5BC9: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x5C2C: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n \n-5C0B CENTRAL HEADER #7     02014B50 (33639248)\n-5C0F Created Zip Spec      14 (20) '2.0'\n-5C10 Created OS            03 (3) 'Unix'\n-5C11 Extract Zip Spec      0A (10) '1.0'\n-5C12 Extract OS            00 (0) 'MS-DOS'\n-5C13 General Purpose Flag  0800 (2048)\n-     [Bit 11]              1 'Language Encoding'\n-5C15 Compression Method    0000 (0) 'Stored'\n-5C17 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n-5C1B CRC                   00000000 (0)\n-5C1F Compressed Size       00000000 (0)\n-5C23 Uncompressed Size     00000000 (0)\n-5C27 Filename Length       0020 (32)\n-5C29 Extra Length          0000 (0)\n-5C2B Comment Length        0000 (0)\n-5C2D Disk Start            0000 (0)\n-5C2F Int File Attributes   0000 (0)\n+5C6E CENTRAL HEADER #7     02014B50 (33639248)\n+5C72 Created Zip Spec      14 (20) '2.0'\n+5C73 Created OS            03 (3) 'Unix'\n+5C74 Extract Zip Spec      0A (10) '1.0'\n+5C75 Extract OS            00 (0) 'MS-DOS'\n+5C76 General Purpose Flag  0800 (2048)\n+     [Bit 11]              1 'Language Encoding'\n+5C78 Compression Method    0000 (0) 'Stored'\n+5C7A Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n+5C7E CRC                   00000000 (0)\n+5C82 Compressed Size       00000000 (0)\n+5C86 Uncompressed Size     00000000 (0)\n+5C8A Filename Length       0020 (32)\n+5C8C Extra Length          0000 (0)\n+5C8E Comment Length        0000 (0)\n+5C90 Disk Start            0000 (0)\n+5C92 Int File Attributes   0000 (0)\n      [Bit 0]               0 'Binary Data'\n-5C31 Ext File Attributes   41ED0010 (1106051088)\n+5C94 Ext File Attributes   41ED0010 (1106051088)\n      [Bit 4]               Directory\n      [Bits 16-24]          01ED (493) 'Unix attrib: rwxr-xr-x'\n      [Bits 28-31]          04 (4) 'Directory'\n-5C35 Local Header Offset   0000014D (333)\n-5C39 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+5C98 Local Header Offset   0000014D (333)\n+5C9C Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x5C39: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x5C9C: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-# ERROR: Offset 0x5C39: Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' must end in a '/'\n+# ERROR: Offset 0x5C9C: Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' must end in a '/'\n #        'External Attributes' flag this as a directory\n #\n-# WARNING: Offset 0x5C11: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x5C74: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n \n-5C59 CENTRAL HEADER #8     02014B50 (33639248)\n-5C5D Created Zip Spec      14 (20) '2.0'\n-5C5E Created OS            03 (3) 'Unix'\n-5C5F Extract Zip Spec      0A (10) '1.0'\n-5C60 Extract OS            00 (0) 'MS-DOS'\n-5C61 General Purpose Flag  0800 (2048)\n-     [Bit 11]              1 'Language Encoding'\n-5C63 Compression Method    0000 (0) 'Stored'\n-5C65 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n-5C69 CRC                   00000000 (0)\n-5C6D Compressed Size       00000000 (0)\n-5C71 Uncompressed Size     00000000 (0)\n-5C75 Filename Length       0025 (37)\n-5C77 Extra Length          0000 (0)\n-5C79 Comment Length        0000 (0)\n-5C7B Disk Start            0000 (0)\n-5C7D Int File Attributes   0000 (0)\n+5CBC CENTRAL HEADER #8     02014B50 (33639248)\n+5CC0 Created Zip Spec      14 (20) '2.0'\n+5CC1 Created OS            03 (3) 'Unix'\n+5CC2 Extract Zip Spec      0A (10) '1.0'\n+5CC3 Extract OS            00 (0) 'MS-DOS'\n+5CC4 General Purpose Flag  0800 (2048)\n+     [Bit 11]              1 'Language Encoding'\n+5CC6 Compression Method    0000 (0) 'Stored'\n+5CC8 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n+5CCC CRC                   00000000 (0)\n+5CD0 Compressed Size       00000000 (0)\n+5CD4 Uncompressed Size     00000000 (0)\n+5CD8 Filename Length       0025 (37)\n+5CDA Extra Length          0000 (0)\n+5CDC Comment Length        0000 (0)\n+5CDE Disk Start            0000 (0)\n+5CE0 Int File Attributes   0000 (0)\n      [Bit 0]               0 'Binary Data'\n-5C7F Ext File Attributes   41ED0010 (1106051088)\n+5CE2 Ext File Attributes   41ED0010 (1106051088)\n      [Bit 4]               Directory\n      [Bits 16-24]          01ED (493) 'Unix attrib: rwxr-xr-x'\n      [Bits 28-31]          04 (4) 'Directory'\n-5C83 Local Header Offset   0000018B (395)\n-5C87 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+5CE6 Local Header Offset   0000018B (395)\n+5CEA Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x5C87: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x5CEA: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-# ERROR: Offset 0x5C87: Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' must end in a '/'\n+# ERROR: Offset 0x5CEA: Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' must end in a '/'\n #        'External Attributes' flag this as a directory\n #\n-# WARNING: Offset 0x5C5F: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x5CC2: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n \n-5CAC CENTRAL HEADER #9     02014B50 (33639248)\n-5CB0 Created Zip Spec      14 (20) '2.0'\n-5CB1 Created OS            03 (3) 'Unix'\n-5CB2 Extract Zip Spec      0A (10) '1.0'\n-5CB3 Extract OS            00 (0) 'MS-DOS'\n-5CB4 General Purpose Flag  0800 (2048)\n-     [Bit 11]              1 'Language Encoding'\n-5CB6 Compression Method    0000 (0) 'Stored'\n-5CB8 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n-5CBC CRC                   00000000 (0)\n-5CC0 Compressed Size       00000000 (0)\n-5CC4 Uncompressed Size     00000000 (0)\n-5CC8 Filename Length       000F (15)\n-5CCA Extra Length          0000 (0)\n-5CCC Comment Length        0000 (0)\n-5CCE Disk Start            0000 (0)\n-5CD0 Int File Attributes   0000 (0)\n+5D0F CENTRAL HEADER #9     02014B50 (33639248)\n+5D13 Created Zip Spec      14 (20) '2.0'\n+5D14 Created OS            03 (3) 'Unix'\n+5D15 Extract Zip Spec      0A (10) '1.0'\n+5D16 Extract OS            00 (0) 'MS-DOS'\n+5D17 General Purpose Flag  0800 (2048)\n+     [Bit 11]              1 'Language Encoding'\n+5D19 Compression Method    0000 (0) 'Stored'\n+5D1B Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n+5D1F CRC                   00000000 (0)\n+5D23 Compressed Size       00000000 (0)\n+5D27 Uncompressed Size     00000000 (0)\n+5D2B Filename Length       000F (15)\n+5D2D Extra Length          0000 (0)\n+5D2F Comment Length        0000 (0)\n+5D31 Disk Start            0000 (0)\n+5D33 Int File Attributes   0000 (0)\n      [Bit 0]               0 'Binary Data'\n-5CD2 Ext File Attributes   41ED0010 (1106051088)\n+5D35 Ext File Attributes   41ED0010 (1106051088)\n      [Bit 4]               Directory\n      [Bits 16-24]          01ED (493) 'Unix attrib: rwxr-xr-x'\n      [Bits 28-31]          04 (4) 'Directory'\n-5CD6 Local Header Offset   000001CE (462)\n-5CDA Filename              'XXXXXXXXXXXXXXX'\n+5D39 Local Header Offset   000001CE (462)\n+5D3D Filename              'XXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x5CDA: Filename 'XXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x5D3D: Filename 'XXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-# ERROR: Offset 0x5CDA: Directory 'XXXXXXXXXXXXXXX' must end in a '/'\n+# ERROR: Offset 0x5D3D: Directory 'XXXXXXXXXXXXXXX' must end in a '/'\n #        'External Attributes' flag this as a directory\n #\n-# WARNING: Offset 0x5CB2: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x5D15: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXX'\n #\n \n-5CE9 CENTRAL HEADER #10    02014B50 (33639248)\n-5CED Created Zip Spec      14 (20) '2.0'\n-5CEE Created OS            03 (3) 'Unix'\n-5CEF Extract Zip Spec      0A (10) '1.0'\n-5CF0 Extract OS            00 (0) 'MS-DOS'\n-5CF1 General Purpose Flag  0800 (2048)\n-     [Bit 11]              1 'Language Encoding'\n-5CF3 Compression Method    0000 (0) 'Stored'\n-5CF5 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n-5CF9 CRC                   00000000 (0)\n-5CFD Compressed Size       00000000 (0)\n-5D01 Uncompressed Size     00000000 (0)\n-5D05 Filename Length       0018 (24)\n-5D07 Extra Length          0000 (0)\n-5D09 Comment Length        0000 (0)\n-5D0B Disk Start            0000 (0)\n-5D0D Int File Attributes   0000 (0)\n+5D4C CENTRAL HEADER #10    02014B50 (33639248)\n+5D50 Created Zip Spec      14 (20) '2.0'\n+5D51 Created OS            03 (3) 'Unix'\n+5D52 Extract Zip Spec      0A (10) '1.0'\n+5D53 Extract OS            00 (0) 'MS-DOS'\n+5D54 General Purpose Flag  0800 (2048)\n+     [Bit 11]              1 'Language Encoding'\n+5D56 Compression Method    0000 (0) 'Stored'\n+5D58 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n+5D5C CRC                   00000000 (0)\n+5D60 Compressed Size       00000000 (0)\n+5D64 Uncompressed Size     00000000 (0)\n+5D68 Filename Length       0018 (24)\n+5D6A Extra Length          0000 (0)\n+5D6C Comment Length        0000 (0)\n+5D6E Disk Start            0000 (0)\n+5D70 Int File Attributes   0000 (0)\n      [Bit 0]               0 'Binary Data'\n-5D0F Ext File Attributes   41ED0010 (1106051088)\n+5D72 Ext File Attributes   41ED0010 (1106051088)\n      [Bit 4]               Directory\n      [Bits 16-24]          01ED (493) 'Unix attrib: rwxr-xr-x'\n      [Bits 28-31]          04 (4) 'Directory'\n-5D13 Local Header Offset   000001FB (507)\n-5D17 Filename              'XXXXXXXXXXXXXXXXXXXXXXXX'\n+5D76 Local Header Offset   000001FB (507)\n+5D7A Filename              'XXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x5D17: Filename 'XXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x5D7A: Filename 'XXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-# ERROR: Offset 0x5D17: Directory 'XXXXXXXXXXXXXXXXXXXXXXXX' must end in a '/'\n+# ERROR: Offset 0x5D7A: Directory 'XXXXXXXXXXXXXXXXXXXXXXXX' must end in a '/'\n #        'External Attributes' flag this as a directory\n #\n-# WARNING: Offset 0x5CEF: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x5D52: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXXXXXXXX'\n #\n \n-5D2F CENTRAL HEADER #11    02014B50 (33639248)\n-5D33 Created Zip Spec      14 (20) '2.0'\n-5D34 Created OS            03 (3) 'Unix'\n-5D35 Extract Zip Spec      0A (10) '1.0'\n-5D36 Extract OS            00 (0) 'MS-DOS'\n-5D37 General Purpose Flag  0800 (2048)\n-     [Bit 11]              1 'Language Encoding'\n-5D39 Compression Method    0000 (0) 'Stored'\n-5D3B Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n-5D3F CRC                   00000000 (0)\n-5D43 Compressed Size       00000000 (0)\n-5D47 Uncompressed Size     00000000 (0)\n-5D4B Filename Length       000F (15)\n-5D4D Extra Length          0000 (0)\n-5D4F Comment Length        0000 (0)\n-5D51 Disk Start            0000 (0)\n-5D53 Int File Attributes   0000 (0)\n+5D92 CENTRAL HEADER #11    02014B50 (33639248)\n+5D96 Created Zip Spec      14 (20) '2.0'\n+5D97 Created OS            03 (3) 'Unix'\n+5D98 Extract Zip Spec      0A (10) '1.0'\n+5D99 Extract OS            00 (0) 'MS-DOS'\n+5D9A General Purpose Flag  0800 (2048)\n+     [Bit 11]              1 'Language Encoding'\n+5D9C Compression Method    0000 (0) 'Stored'\n+5D9E Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n+5DA2 CRC                   00000000 (0)\n+5DA6 Compressed Size       00000000 (0)\n+5DAA Uncompressed Size     00000000 (0)\n+5DAE Filename Length       000F (15)\n+5DB0 Extra Length          0000 (0)\n+5DB2 Comment Length        0000 (0)\n+5DB4 Disk Start            0000 (0)\n+5DB6 Int File Attributes   0000 (0)\n      [Bit 0]               0 'Binary Data'\n-5D55 Ext File Attributes   41ED0010 (1106051088)\n+5DB8 Ext File Attributes   41ED0010 (1106051088)\n      [Bit 4]               Directory\n      [Bits 16-24]          01ED (493) 'Unix attrib: rwxr-xr-x'\n      [Bits 28-31]          04 (4) 'Directory'\n-5D59 Local Header Offset   00000231 (561)\n-5D5D Filename              'XXXXXXXXXXXXXXX'\n+5DBC Local Header Offset   00000231 (561)\n+5DC0 Filename              'XXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x5D5D: Filename 'XXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x5DC0: Filename 'XXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-# ERROR: Offset 0x5D5D: Directory 'XXXXXXXXXXXXXXX' must end in a '/'\n+# ERROR: Offset 0x5DC0: Directory 'XXXXXXXXXXXXXXX' must end in a '/'\n #        'External Attributes' flag this as a directory\n #\n-# WARNING: Offset 0x5D35: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x5D98: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXX'\n #\n \n-5D6C CENTRAL HEADER #12    02014B50 (33639248)\n-5D70 Created Zip Spec      14 (20) '2.0'\n-5D71 Created OS            03 (3) 'Unix'\n-5D72 Extract Zip Spec      0A (10) '1.0'\n-5D73 Extract OS            00 (0) 'MS-DOS'\n-5D74 General Purpose Flag  0800 (2048)\n-     [Bit 11]              1 'Language Encoding'\n-5D76 Compression Method    0000 (0) 'Stored'\n-5D78 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n-5D7C CRC                   00000000 (0)\n-5D80 Compressed Size       00000000 (0)\n-5D84 Uncompressed Size     00000000 (0)\n-5D88 Filename Length       0020 (32)\n-5D8A Extra Length          0000 (0)\n-5D8C Comment Length        0000 (0)\n-5D8E Disk Start            0000 (0)\n-5D90 Int File Attributes   0000 (0)\n+5DCF CENTRAL HEADER #12    02014B50 (33639248)\n+5DD3 Created Zip Spec      14 (20) '2.0'\n+5DD4 Created OS            03 (3) 'Unix'\n+5DD5 Extract Zip Spec      0A (10) '1.0'\n+5DD6 Extract OS            00 (0) 'MS-DOS'\n+5DD7 General Purpose Flag  0800 (2048)\n+     [Bit 11]              1 'Language Encoding'\n+5DD9 Compression Method    0000 (0) 'Stored'\n+5DDB Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n+5DDF CRC                   00000000 (0)\n+5DE3 Compressed Size       00000000 (0)\n+5DE7 Uncompressed Size     00000000 (0)\n+5DEB Filename Length       0020 (32)\n+5DED Extra Length          0000 (0)\n+5DEF Comment Length        0000 (0)\n+5DF1 Disk Start            0000 (0)\n+5DF3 Int File Attributes   0000 (0)\n      [Bit 0]               0 'Binary Data'\n-5D92 Ext File Attributes   41ED0010 (1106051088)\n+5DF5 Ext File Attributes   41ED0010 (1106051088)\n      [Bit 4]               Directory\n      [Bits 16-24]          01ED (493) 'Unix attrib: rwxr-xr-x'\n      [Bits 28-31]          04 (4) 'Directory'\n-5D96 Local Header Offset   0000025E (606)\n-5D9A Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+5DF9 Local Header Offset   0000025E (606)\n+5DFD Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x5D9A: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x5DFD: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-# ERROR: Offset 0x5D9A: Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' must end in a '/'\n+# ERROR: Offset 0x5DFD: Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' must end in a '/'\n #        'External Attributes' flag this as a directory\n #\n-# WARNING: Offset 0x5D72: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x5DD5: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n \n-5DBA CENTRAL HEADER #13    02014B50 (33639248)\n-5DBE Created Zip Spec      14 (20) '2.0'\n-5DBF Created OS            03 (3) 'Unix'\n-5DC0 Extract Zip Spec      0A (10) '1.0'\n-5DC1 Extract OS            00 (0) 'MS-DOS'\n-5DC2 General Purpose Flag  0800 (2048)\n-     [Bit 11]              1 'Language Encoding'\n-5DC4 Compression Method    0000 (0) 'Stored'\n-5DC6 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n-5DCA CRC                   00000000 (0)\n-5DCE Compressed Size       00000000 (0)\n-5DD2 Uncompressed Size     00000000 (0)\n-5DD6 Filename Length       0035 (53)\n-5DD8 Extra Length          0000 (0)\n-5DDA Comment Length        0000 (0)\n-5DDC Disk Start            0000 (0)\n-5DDE Int File Attributes   0000 (0)\n-     [Bit 0]               0 'Binary Data'\n-5DE0 Ext File Attributes   41ED0010 (1106051088)\n-     [Bit 4]               Directory\n-     [Bits 16-24]          01ED (493) 'Unix attrib: rwxr-xr-x'\n-     [Bits 28-31]          04 (4) 'Directory'\n-5DE4 Local Header Offset   0000029C (668)\n-5DE8 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n-#\n-# WARNING: Offset 0x5DE8: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n-#          Zero length filename\n-#\n-# ERROR: Offset 0x5DE8: Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' must end in a '/'\n-#        'External Attributes' flag this as a directory\n-#\n-# WARNING: Offset 0x5DC0: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n-#\n-\n-5E1D CENTRAL HEADER #14    02014B50 (33639248)\n+5E1D CENTRAL HEADER #13    02014B50 (33639248)\n 5E21 Created Zip Spec      14 (20) '2.0'\n 5E22 Created OS            03 (3) 'Unix'\n-5E23 Extract Zip Spec      14 (20) '2.0'\n+5E23 Extract Zip Spec      0A (10) '1.0'\n 5E24 Extract OS            00 (0) 'MS-DOS'\n 5E25 General Purpose Flag  0800 (2048)\n-     [Bits 1-2]            0 'Normal Compression'\n      [Bit 11]              1 'Language Encoding'\n-5E27 Compression Method    0008 (8) 'Deflated'\n+5E27 Compression Method    0000 (0) 'Stored'\n 5E29 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n-5E2D CRC                   3C2DFD2C (1009646892)\n-5E31 Compressed Size       00000676 (1654)\n-5E35 Uncompressed Size     00002069 (8297)\n-5E39 Filename Length       0015 (21)\n+5E2D CRC                   00000000 (0)\n+5E31 Compressed Size       00000000 (0)\n+5E35 Uncompressed Size     00000000 (0)\n+5E39 Filename Length       0035 (53)\n 5E3B Extra Length          0000 (0)\n 5E3D Comment Length        0000 (0)\n 5E3F Disk Start            0000 (0)\n 5E41 Int File Attributes   0000 (0)\n      [Bit 0]               0 'Binary Data'\n-5E43 Ext File Attributes   81A40000 (2175008768)\n-     [Bits 16-24]          01A4 (420) 'Unix attrib: rw-r--r--'\n-     [Bits 28-31]          08 (8) 'Regular File'\n-5E47 Local Header Offset   000002EF (751)\n-5E4B Filename              'XXXXXXXXXXXXXXXXXXXXX'\n+5E43 Ext File Attributes   41ED0010 (1106051088)\n+     [Bit 4]               Directory\n+     [Bits 16-24]          01ED (493) 'Unix attrib: rwxr-xr-x'\n+     [Bits 28-31]          04 (4) 'Directory'\n+5E47 Local Header Offset   0000029C (668)\n+5E4B Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x5E4B: Filename 'XXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x5E4B: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n+# ERROR: Offset 0x5E4B: Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' must end in a '/'\n+#        'External Attributes' flag this as a directory\n+#\n+# WARNING: Offset 0x5E23: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+#\n \n-5E60 CENTRAL HEADER #15    02014B50 (33639248)\n-5E64 Created Zip Spec      14 (20) '2.0'\n-5E65 Created OS            03 (3) 'Unix'\n-5E66 Extract Zip Spec      14 (20) '2.0'\n-5E67 Extract OS            00 (0) 'MS-DOS'\n-5E68 General Purpose Flag  0800 (2048)\n-     [Bits 1-2]            0 'Normal Compression'\n-     [Bit 11]              1 'Language Encoding'\n-5E6A Compression Method    0008 (8) 'Deflated'\n-5E6C Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n-5E70 CRC                   86E2B4B4 (2263004340)\n-5E74 Compressed Size       00000F6D (3949)\n-5E78 Uncompressed Size     00002C5E (11358)\n-5E7C Filename Length       0010 (16)\n-5E7E Extra Length          0000 (0)\n-5E80 Comment Length        0000 (0)\n-5E82 Disk Start            0000 (0)\n-5E84 Int File Attributes   0000 (0)\n+5E80 CENTRAL HEADER #14    02014B50 (33639248)\n+5E84 Created Zip Spec      14 (20) '2.0'\n+5E85 Created OS            03 (3) 'Unix'\n+5E86 Extract Zip Spec      14 (20) '2.0'\n+5E87 Extract OS            00 (0) 'MS-DOS'\n+5E88 General Purpose Flag  0800 (2048)\n+     [Bits 1-2]            0 'Normal Compression'\n+     [Bit 11]              1 'Language Encoding'\n+5E8A Compression Method    0008 (8) 'Deflated'\n+5E8C Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n+5E90 CRC                   3C2DFD2C (1009646892)\n+5E94 Compressed Size       00000676 (1654)\n+5E98 Uncompressed Size     00002069 (8297)\n+5E9C Filename Length       0015 (21)\n+5E9E Extra Length          0000 (0)\n+5EA0 Comment Length        0000 (0)\n+5EA2 Disk Start            0000 (0)\n+5EA4 Int File Attributes   0000 (0)\n      [Bit 0]               0 'Binary Data'\n-5E86 Ext File Attributes   81A40000 (2175008768)\n+5EA6 Ext File Attributes   81A40000 (2175008768)\n      [Bits 16-24]          01A4 (420) 'Unix attrib: rw-r--r--'\n      [Bits 28-31]          08 (8) 'Regular File'\n-5E8A Local Header Offset   00000998 (2456)\n-5E8E Filename              'XXXXXXXXXXXXXXXX'\n+5EAA Local Header Offset   000002EF (751)\n+5EAE Filename              'XXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x5E8E: Filename 'XXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x5EAE: Filename 'XXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n \n-5E9E CENTRAL HEADER #16    02014B50 (33639248)\n-5EA2 Created Zip Spec      14 (20) '2.0'\n-5EA3 Created OS            03 (3) 'Unix'\n-5EA4 Extract Zip Spec      14 (20) '2.0'\n-5EA5 Extract OS            00 (0) 'MS-DOS'\n-5EA6 General Purpose Flag  0800 (2048)\n+5EC3 CENTRAL HEADER #15    02014B50 (33639248)\n+5EC7 Created Zip Spec      14 (20) '2.0'\n+5EC8 Created OS            03 (3) 'Unix'\n+5EC9 Extract Zip Spec      14 (20) '2.0'\n+5ECA Extract OS            00 (0) 'MS-DOS'\n+5ECB General Purpose Flag  0800 (2048)\n      [Bits 1-2]            0 'Normal Compression'\n      [Bit 11]              1 'Language Encoding'\n-5EA8 Compression Method    0008 (8) 'Deflated'\n-5EAA Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n-5EAE CRC                   CE04F4D7 (3456431319)\n-5EB2 Compressed Size       00000081 (129)\n-5EB6 Uncompressed Size     000000B1 (177)\n-5EBA Filename Length       000F (15)\n-5EBC Extra Length          0000 (0)\n-5EBE Comment Length        0000 (0)\n-5EC0 Disk Start            0000 (0)\n-5EC2 Int File Attributes   0000 (0)\n+5ECD Compression Method    0008 (8) 'Deflated'\n+5ECF Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n+5ED3 CRC                   86E2B4B4 (2263004340)\n+5ED7 Compressed Size       00000F6D (3949)\n+5EDB Uncompressed Size     00002C5E (11358)\n+5EDF Filename Length       0010 (16)\n+5EE1 Extra Length          0000 (0)\n+5EE3 Comment Length        0000 (0)\n+5EE5 Disk Start            0000 (0)\n+5EE7 Int File Attributes   0000 (0)\n      [Bit 0]               0 'Binary Data'\n-5EC4 Ext File Attributes   81A40000 (2175008768)\n+5EE9 Ext File Attributes   81A40000 (2175008768)\n      [Bits 16-24]          01A4 (420) 'Unix attrib: rw-r--r--'\n      [Bits 28-31]          08 (8) 'Regular File'\n-5EC8 Local Header Offset   00001933 (6451)\n-5ECC Filename              'XXXXXXXXXXXXXXX'\n+5EED Local Header Offset   00000998 (2456)\n+5EF1 Filename              'XXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x5ECC: Filename 'XXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x5EF1: Filename 'XXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n \n-5EDB CENTRAL HEADER #17    02014B50 (33639248)\n-5EDF Created Zip Spec      14 (20) '2.0'\n-5EE0 Created OS            03 (3) 'Unix'\n-5EE1 Extract Zip Spec      14 (20) '2.0'\n-5EE2 Extract OS            00 (0) 'MS-DOS'\n-5EE3 General Purpose Flag  0800 (2048)\n+5F01 CENTRAL HEADER #16    02014B50 (33639248)\n+5F05 Created Zip Spec      14 (20) '2.0'\n+5F06 Created OS            03 (3) 'Unix'\n+5F07 Extract Zip Spec      14 (20) '2.0'\n+5F08 Extract OS            00 (0) 'MS-DOS'\n+5F09 General Purpose Flag  0800 (2048)\n      [Bits 1-2]            0 'Normal Compression'\n      [Bit 11]              1 'Language Encoding'\n-5EE5 Compression Method    0008 (8) 'Deflated'\n-5EE7 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n-5EEB CRC                   BB0161DF (3137429983)\n-5EEF Compressed Size       00000468 (1128)\n-5EF3 Uncompressed Size     00000DF9 (3577)\n-5EF7 Filename Length       003E (62)\n-5EF9 Extra Length          0000 (0)\n-5EFB Comment Length        0000 (0)\n-5EFD Disk Start            0000 (0)\n-5EFF Int File Attributes   0000 (0)\n+5F0B Compression Method    0008 (8) 'Deflated'\n+5F0D Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n+5F11 CRC                   CE04F4D7 (3456431319)\n+5F15 Compressed Size       00000081 (129)\n+5F19 Uncompressed Size     000000B1 (177)\n+5F1D Filename Length       000F (15)\n+5F1F Extra Length          0000 (0)\n+5F21 Comment Length        0000 (0)\n+5F23 Disk Start            0000 (0)\n+5F25 Int File Attributes   0000 (0)\n      [Bit 0]               0 'Binary Data'\n-5F01 Ext File Attributes   81A40000 (2175008768)\n+5F27 Ext File Attributes   81A40000 (2175008768)\n      [Bits 16-24]          01A4 (420) 'Unix attrib: rw-r--r--'\n      [Bits 28-31]          08 (8) 'Regular File'\n-5F05 Local Header Offset   000019E1 (6625)\n-5F09 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+5F2B Local Header Offset   00001933 (6451)\n+5F2F Filename              'XXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x5F09: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x5F2F: Filename 'XXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n \n-5F47 CENTRAL HEADER #18    02014B50 (33639248)\n-5F4B Created Zip Spec      14 (20) '2.0'\n-5F4C Created OS            03 (3) 'Unix'\n-5F4D Extract Zip Spec      14 (20) '2.0'\n-5F4E Extract OS            00 (0) 'MS-DOS'\n-5F4F General Purpose Flag  0800 (2048)\n+5F3E CENTRAL HEADER #17    02014B50 (33639248)\n+5F42 Created Zip Spec      14 (20) '2.0'\n+5F43 Created OS            03 (3) 'Unix'\n+5F44 Extract Zip Spec      14 (20) '2.0'\n+5F45 Extract OS            00 (0) 'MS-DOS'\n+5F46 General Purpose Flag  0800 (2048)\n      [Bits 1-2]            0 'Normal Compression'\n      [Bit 11]              1 'Language Encoding'\n-5F51 Compression Method    0008 (8) 'Deflated'\n-5F53 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n-5F57 CRC                   E2B000EA (3803185386)\n-5F5B Compressed Size       000013F0 (5104)\n-5F5F Uncompressed Size     00005C3B (23611)\n-5F63 Filename Length       0032 (50)\n-5F65 Extra Length          0000 (0)\n-5F67 Comment Length        0000 (0)\n-5F69 Disk Start            0000 (0)\n-5F6B Int File Attributes   0000 (0)\n+5F48 Compression Method    0008 (8) 'Deflated'\n+5F4A Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n+5F4E CRC                   EDC5D490 (3989165200)\n+5F52 Compressed Size       00000470 (1136)\n+5F56 Uncompressed Size     00000E50 (3664)\n+5F5A Filename Length       003E (62)\n+5F5C Extra Length          0000 (0)\n+5F5E Comment Length        0000 (0)\n+5F60 Disk Start            0000 (0)\n+5F62 Int File Attributes   0000 (0)\n      [Bit 0]               0 'Binary Data'\n-5F6D Ext File Attributes   81A40000 (2175008768)\n+5F64 Ext File Attributes   81A40000 (2175008768)\n      [Bits 16-24]          01A4 (420) 'Unix attrib: rw-r--r--'\n      [Bits 28-31]          08 (8) 'Regular File'\n-5F71 Local Header Offset   00001EA5 (7845)\n-5F75 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+5F68 Local Header Offset   000019E1 (6625)\n+5F6C Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x5F75: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x5F6C: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n \n-5FA7 CENTRAL HEADER #19    02014B50 (33639248)\n-5FAB Created Zip Spec      14 (20) '2.0'\n-5FAC Created OS            03 (3) 'Unix'\n-5FAD Extract Zip Spec      14 (20) '2.0'\n-5FAE Extract OS            00 (0) 'MS-DOS'\n-5FAF General Purpose Flag  0800 (2048)\n+5FAA CENTRAL HEADER #18    02014B50 (33639248)\n+5FAE Created Zip Spec      14 (20) '2.0'\n+5FAF Created OS            03 (3) 'Unix'\n+5FB0 Extract Zip Spec      14 (20) '2.0'\n+5FB1 Extract OS            00 (0) 'MS-DOS'\n+5FB2 General Purpose Flag  0800 (2048)\n      [Bits 1-2]            0 'Normal Compression'\n      [Bit 11]              1 'Language Encoding'\n-5FB1 Compression Method    0008 (8) 'Deflated'\n-5FB3 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n-5FB7 CRC                   A100EF71 (2701193073)\n-5FBB Compressed Size       0000034A (842)\n-5FBF Uncompressed Size     00000776 (1910)\n-5FC3 Filename Length       0039 (57)\n-5FC5 Extra Length          0000 (0)\n-5FC7 Comment Length        0000 (0)\n-5FC9 Disk Start            0000 (0)\n-5FCB Int File Attributes   0000 (0)\n+5FB4 Compression Method    0008 (8) 'Deflated'\n+5FB6 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n+5FBA CRC                   F6A25F0D (4137836301)\n+5FBE Compressed Size       00001408 (5128)\n+5FC2 Uncompressed Size     00005EAB (24235)\n+5FC6 Filename Length       0032 (50)\n+5FC8 Extra Length          0000 (0)\n+5FCA Comment Length        0000 (0)\n+5FCC Disk Start            0000 (0)\n+5FCE Int File Attributes   0000 (0)\n      [Bit 0]               0 'Binary Data'\n-5FCD Ext File Attributes   81A40000 (2175008768)\n+5FD0 Ext File Attributes   81A40000 (2175008768)\n      [Bits 16-24]          01A4 (420) 'Unix attrib: rw-r--r--'\n      [Bits 28-31]          08 (8) 'Regular File'\n-5FD1 Local Header Offset   000032E5 (13029)\n-5FD5 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+5FD4 Local Header Offset   00001EAD (7853)\n+5FD8 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x5FD5: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x5FD8: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n \n-600E CENTRAL HEADER #20    02014B50 (33639248)\n-6012 Created Zip Spec      14 (20) '2.0'\n-6013 Created OS            03 (3) 'Unix'\n-6014 Extract Zip Spec      14 (20) '2.0'\n-6015 Extract OS            00 (0) 'MS-DOS'\n-6016 General Purpose Flag  0800 (2048)\n+600A CENTRAL HEADER #19    02014B50 (33639248)\n+600E Created Zip Spec      14 (20) '2.0'\n+600F Created OS            03 (3) 'Unix'\n+6010 Extract Zip Spec      14 (20) '2.0'\n+6011 Extract OS            00 (0) 'MS-DOS'\n+6012 General Purpose Flag  0800 (2048)\n      [Bits 1-2]            0 'Normal Compression'\n      [Bit 11]              1 'Language Encoding'\n-6018 Compression Method    0008 (8) 'Deflated'\n-601A Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n-601E CRC                   2220AA2B (572566059)\n-6022 Compressed Size       00000648 (1608)\n-6026 Uncompressed Size     000016C4 (5828)\n-602A Filename Length       003A (58)\n-602C Extra Length          0000 (0)\n-602E Comment Length        0000 (0)\n-6030 Disk Start            0000 (0)\n-6032 Int File Attributes   0000 (0)\n+6014 Compression Method    0008 (8) 'Deflated'\n+6016 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n+601A CRC                   8E75DF39 (2390089529)\n+601E Compressed Size       00000354 (852)\n+6022 Uncompressed Size     000007A7 (1959)\n+6026 Filename Length       0039 (57)\n+6028 Extra Length          0000 (0)\n+602A Comment Length        0000 (0)\n+602C Disk Start            0000 (0)\n+602E Int File Attributes   0000 (0)\n      [Bit 0]               0 'Binary Data'\n-6034 Ext File Attributes   81A40000 (2175008768)\n+6030 Ext File Attributes   81A40000 (2175008768)\n      [Bits 16-24]          01A4 (420) 'Unix attrib: rw-r--r--'\n      [Bits 28-31]          08 (8) 'Regular File'\n-6038 Local Header Offset   00003686 (13958)\n-603C Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+6034 Local Header Offset   00003305 (13061)\n+6038 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x603C: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x6038: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n \n-6076 CENTRAL HEADER #21    02014B50 (33639248)\n-607A Created Zip Spec      14 (20) '2.0'\n-607B Created OS            03 (3) 'Unix'\n-607C Extract Zip Spec      14 (20) '2.0'\n-607D Extract OS            00 (0) 'MS-DOS'\n-607E General Purpose Flag  0800 (2048)\n+6071 CENTRAL HEADER #20    02014B50 (33639248)\n+6075 Created Zip Spec      14 (20) '2.0'\n+6076 Created OS            03 (3) 'Unix'\n+6077 Extract Zip Spec      14 (20) '2.0'\n+6078 Extract OS            00 (0) 'MS-DOS'\n+6079 General Purpose Flag  0800 (2048)\n      [Bits 1-2]            0 'Normal Compression'\n      [Bit 11]              1 'Language Encoding'\n-6080 Compression Method    0008 (8) 'Deflated'\n-6082 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n-6086 CRC                   94B18BA4 (2494663588)\n-608A Compressed Size       00000269 (617)\n-608E Uncompressed Size     000004D9 (1241)\n-6092 Filename Length       0041 (65)\n-6094 Extra Length          0000 (0)\n-6096 Comment Length        0000 (0)\n-6098 Disk Start            0000 (0)\n-609A Int File Attributes   0000 (0)\n+607B Compression Method    0008 (8) 'Deflated'\n+607D Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n+6081 CRC                   6AA8E21B (1789452827)\n+6085 Compressed Size       00000659 (1625)\n+6089 Uncompressed Size     0000175E (5982)\n+608D Filename Length       003A (58)\n+608F Extra Length          0000 (0)\n+6091 Comment Length        0000 (0)\n+6093 Disk Start            0000 (0)\n+6095 Int File Attributes   0000 (0)\n      [Bit 0]               0 'Binary Data'\n-609C Ext File Attributes   81A40000 (2175008768)\n+6097 Ext File Attributes   81A40000 (2175008768)\n      [Bits 16-24]          01A4 (420) 'Unix attrib: rw-r--r--'\n      [Bits 28-31]          08 (8) 'Regular File'\n-60A0 Local Header Offset   00003D26 (15654)\n-60A4 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+609B Local Header Offset   000036B0 (14000)\n+609F Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x60A4: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x609F: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n \n-60E5 CENTRAL HEADER #22    02014B50 (33639248)\n-60E9 Created Zip Spec      14 (20) '2.0'\n-60EA Created OS            03 (3) 'Unix'\n-60EB Extract Zip Spec      14 (20) '2.0'\n-60EC Extract OS            00 (0) 'MS-DOS'\n-60ED General Purpose Flag  0800 (2048)\n+60D9 CENTRAL HEADER #21    02014B50 (33639248)\n+60DD Created Zip Spec      14 (20) '2.0'\n+60DE Created OS            03 (3) 'Unix'\n+60DF Extract Zip Spec      14 (20) '2.0'\n+60E0 Extract OS            00 (0) 'MS-DOS'\n+60E1 General Purpose Flag  0800 (2048)\n      [Bits 1-2]            0 'Normal Compression'\n      [Bit 11]              1 'Language Encoding'\n-60EF Compression Method    0008 (8) 'Deflated'\n-60F1 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n-60F5 CRC                   F3388AB4 (4080569012)\n-60F9 Compressed Size       000006FA (1786)\n-60FD Uncompressed Size     00001A7B (6779)\n-6101 Filename Length       0035 (53)\n-6103 Extra Length          0000 (0)\n-6105 Comment Length        0000 (0)\n-6107 Disk Start            0000 (0)\n-6109 Int File Attributes   0000 (0)\n+60E3 Compression Method    0008 (8) 'Deflated'\n+60E5 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n+60E9 CRC                   22BB3DD7 (582696407)\n+60ED Compressed Size       00000271 (625)\n+60F1 Uncompressed Size     000004FA (1274)\n+60F5 Filename Length       0041 (65)\n+60F7 Extra Length          0000 (0)\n+60F9 Comment Length        0000 (0)\n+60FB Disk Start            0000 (0)\n+60FD Int File Attributes   0000 (0)\n      [Bit 0]               0 'Binary Data'\n-610B Ext File Attributes   81A40000 (2175008768)\n+60FF Ext File Attributes   81A40000 (2175008768)\n      [Bits 16-24]          01A4 (420) 'Unix attrib: rw-r--r--'\n      [Bits 28-31]          08 (8) 'Regular File'\n-610F Local Header Offset   00003FEE (16366)\n-6113 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+6103 Local Header Offset   00003D61 (15713)\n+6107 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x6113: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x6107: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n \n-6148 CENTRAL HEADER #23    02014B50 (33639248)\n+6148 CENTRAL HEADER #22    02014B50 (33639248)\n 614C Created Zip Spec      14 (20) '2.0'\n 614D Created OS            03 (3) 'Unix'\n 614E Extract Zip Spec      14 (20) '2.0'\n 614F Extract OS            00 (0) 'MS-DOS'\n 6150 General Purpose Flag  0800 (2048)\n      [Bits 1-2]            0 'Normal Compression'\n      [Bit 11]              1 'Language Encoding'\n 6152 Compression Method    0008 (8) 'Deflated'\n 6154 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n-6158 CRC                   D4BBF170 (3569086832)\n-615C Compressed Size       0000041C (1052)\n-6160 Uncompressed Size     00000AB8 (2744)\n-6164 Filename Length       0041 (65)\n+6158 CRC                   B2C3D88B (2999179403)\n+615C Compressed Size       0000070B (1803)\n+6160 Uncompressed Size     00001B65 (7013)\n+6164 Filename Length       0035 (53)\n 6166 Extra Length          0000 (0)\n 6168 Comment Length        0000 (0)\n 616A Disk Start            0000 (0)\n 616C Int File Attributes   0000 (0)\n      [Bit 0]               0 'Binary Data'\n 616E Ext File Attributes   81A40000 (2175008768)\n      [Bits 16-24]          01A4 (420) 'Unix attrib: rw-r--r--'\n      [Bits 28-31]          08 (8) 'Regular File'\n-6172 Local Header Offset   0000473B (18235)\n-6176 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+6172 Local Header Offset   00004031 (16433)\n+6176 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+#\n+# WARNING: Offset 0x6176: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+#          Zero length filename\n+#\n+\n+61AB CENTRAL HEADER #23    02014B50 (33639248)\n+61AF Created Zip Spec      14 (20) '2.0'\n+61B0 Created OS            03 (3) 'Unix'\n+61B1 Extract Zip Spec      14 (20) '2.0'\n+61B2 Extract OS            00 (0) 'MS-DOS'\n+61B3 General Purpose Flag  0800 (2048)\n+     [Bits 1-2]            0 'Normal Compression'\n+     [Bit 11]              1 'Language Encoding'\n+61B5 Compression Method    0008 (8) 'Deflated'\n+61B7 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n+61BB CRC                   E8B12001 (3903922177)\n+61BF Compressed Size       00000425 (1061)\n+61C3 Uncompressed Size     00000AFB (2811)\n+61C7 Filename Length       0041 (65)\n+61C9 Extra Length          0000 (0)\n+61CB Comment Length        0000 (0)\n+61CD Disk Start            0000 (0)\n+61CF Int File Attributes   0000 (0)\n+     [Bit 0]               0 'Binary Data'\n+61D1 Ext File Attributes   81A40000 (2175008768)\n+     [Bits 16-24]          01A4 (420) 'Unix attrib: rw-r--r--'\n+     [Bits 28-31]          08 (8) 'Regular File'\n+61D5 Local Header Offset   0000478F (18319)\n+61D9 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x6176: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x61D9: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n \n-61B7 CENTRAL HEADER #24    02014B50 (33639248)\n-61BB Created Zip Spec      14 (20) '2.0'\n-61BC Created OS            03 (3) 'Unix'\n-61BD Extract Zip Spec      14 (20) '2.0'\n-61BE Extract OS            00 (0) 'MS-DOS'\n-61BF General Purpose Flag  0800 (2048)\n+621A CENTRAL HEADER #24    02014B50 (33639248)\n+621E Created Zip Spec      14 (20) '2.0'\n+621F Created OS            03 (3) 'Unix'\n+6220 Extract Zip Spec      14 (20) '2.0'\n+6221 Extract OS            00 (0) 'MS-DOS'\n+6222 General Purpose Flag  0800 (2048)\n      [Bits 1-2]            0 'Normal Compression'\n      [Bit 11]              1 'Language Encoding'\n-61C1 Compression Method    0008 (8) 'Deflated'\n-61C3 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n-61C7 CRC                   76AAEB5B (1990912859)\n-61CB Compressed Size       000007E0 (2016)\n-61CF Uncompressed Size     00001F41 (8001)\n-61D3 Filename Length       0041 (65)\n-61D5 Extra Length          0000 (0)\n-61D7 Comment Length        0000 (0)\n-61D9 Disk Start            0000 (0)\n-61DB Int File Attributes   0000 (0)\n+6224 Compression Method    0008 (8) 'Deflated'\n+6226 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n+622A CRC                   0823E298 (136569496)\n+622E Compressed Size       000007EC (2028)\n+6232 Uncompressed Size     00001FFE (8190)\n+6236 Filename Length       0041 (65)\n+6238 Extra Length          0000 (0)\n+623A Comment Length        0000 (0)\n+623C Disk Start            0000 (0)\n+623E Int File Attributes   0000 (0)\n      [Bit 0]               0 'Binary Data'\n-61DD Ext File Attributes   81A40000 (2175008768)\n+6240 Ext File Attributes   81A40000 (2175008768)\n      [Bits 16-24]          01A4 (420) 'Unix attrib: rw-r--r--'\n      [Bits 28-31]          08 (8) 'Regular File'\n-61E1 Local Header Offset   00004BB6 (19382)\n-61E5 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+6244 Local Header Offset   00004C13 (19475)\n+6248 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x61E5: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x6248: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n \n-6226 CENTRAL HEADER #25    02014B50 (33639248)\n-622A Created Zip Spec      14 (20) '2.0'\n-622B Created OS            03 (3) 'Unix'\n-622C Extract Zip Spec      14 (20) '2.0'\n-622D Extract OS            00 (0) 'MS-DOS'\n-622E General Purpose Flag  0800 (2048)\n+6289 CENTRAL HEADER #25    02014B50 (33639248)\n+628D Created Zip Spec      14 (20) '2.0'\n+628E Created OS            03 (3) 'Unix'\n+628F Extract Zip Spec      14 (20) '2.0'\n+6290 Extract OS            00 (0) 'MS-DOS'\n+6291 General Purpose Flag  0800 (2048)\n      [Bits 1-2]            0 'Normal Compression'\n      [Bit 11]              1 'Language Encoding'\n-6230 Compression Method    0008 (8) 'Deflated'\n-6232 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n-6236 CRC                   9217B46E (2451027054)\n-623A Compressed Size       00000032 (50)\n-623E Uncompressed Size     0000003A (58)\n-6242 Filename Length       0041 (65)\n-6244 Extra Length          0000 (0)\n-6246 Comment Length        0000 (0)\n-6248 Disk Start            0000 (0)\n-624A Int File Attributes   0000 (0)\n+6293 Compression Method    0008 (8) 'Deflated'\n+6295 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n+6299 CRC                   9217B46E (2451027054)\n+629D Compressed Size       00000032 (50)\n+62A1 Uncompressed Size     0000003A (58)\n+62A5 Filename Length       0041 (65)\n+62A7 Extra Length          0000 (0)\n+62A9 Comment Length        0000 (0)\n+62AB Disk Start            0000 (0)\n+62AD Int File Attributes   0000 (0)\n      [Bit 0]               0 'Binary Data'\n-624C Ext File Attributes   81A40000 (2175008768)\n+62AF Ext File Attributes   81A40000 (2175008768)\n      [Bits 16-24]          01A4 (420) 'Unix attrib: rw-r--r--'\n      [Bits 28-31]          08 (8) 'Regular File'\n-6250 Local Header Offset   000053F5 (21493)\n-6254 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+62B3 Local Header Offset   0000545E (21598)\n+62B7 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x6254: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x62B7: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n \n-6295 CENTRAL HEADER #26    02014B50 (33639248)\n-6299 Created Zip Spec      14 (20) '2.0'\n-629A Created OS            03 (3) 'Unix'\n-629B Extract Zip Spec      14 (20) '2.0'\n-629C Extract OS            00 (0) 'MS-DOS'\n-629D General Purpose Flag  0800 (2048)\n+62F8 CENTRAL HEADER #26    02014B50 (33639248)\n+62FC Created Zip Spec      14 (20) '2.0'\n+62FD Created OS            03 (3) 'Unix'\n+62FE Extract Zip Spec      14 (20) '2.0'\n+62FF Extract OS            00 (0) 'MS-DOS'\n+6300 General Purpose Flag  0800 (2048)\n      [Bits 1-2]            0 'Normal Compression'\n      [Bit 11]              1 'Language Encoding'\n-629F Compression Method    0008 (8) 'Deflated'\n-62A1 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n-62A5 CRC                   E5088BE5 (3842542565)\n-62A9 Compressed Size       00000038 (56)\n-62AD Uncompressed Size     0000003B (59)\n-62B1 Filename Length       0049 (73)\n-62B3 Extra Length          0000 (0)\n-62B5 Comment Length        0000 (0)\n-62B7 Disk Start            0000 (0)\n-62B9 Int File Attributes   0000 (0)\n+6302 Compression Method    0008 (8) 'Deflated'\n+6304 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n+6308 CRC                   E5088BE5 (3842542565)\n+630C Compressed Size       00000038 (56)\n+6310 Uncompressed Size     0000003B (59)\n+6314 Filename Length       0049 (73)\n+6316 Extra Length          0000 (0)\n+6318 Comment Length        0000 (0)\n+631A Disk Start            0000 (0)\n+631C Int File Attributes   0000 (0)\n      [Bit 0]               0 'Binary Data'\n-62BB Ext File Attributes   81A40000 (2175008768)\n+631E Ext File Attributes   81A40000 (2175008768)\n      [Bits 16-24]          01A4 (420) 'Unix attrib: rw-r--r--'\n      [Bits 28-31]          08 (8) 'Regular File'\n-62BF Local Header Offset   00005486 (21638)\n-62C3 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+6322 Local Header Offset   000054EF (21743)\n+6326 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x62C3: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x6326: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n \n-630C CENTRAL HEADER #27    02014B50 (33639248)\n-6310 Created Zip Spec      14 (20) '2.0'\n-6311 Created OS            03 (3) 'Unix'\n-6312 Extract Zip Spec      14 (20) '2.0'\n-6313 Extract OS            00 (0) 'MS-DOS'\n-6314 General Purpose Flag  0800 (2048)\n+636F CENTRAL HEADER #27    02014B50 (33639248)\n+6373 Created Zip Spec      14 (20) '2.0'\n+6374 Created OS            03 (3) 'Unix'\n+6375 Extract Zip Spec      14 (20) '2.0'\n+6376 Extract OS            00 (0) 'MS-DOS'\n+6377 General Purpose Flag  0800 (2048)\n      [Bits 1-2]            0 'Normal Compression'\n      [Bit 11]              1 'Language Encoding'\n-6316 Compression Method    0008 (8) 'Deflated'\n-6318 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n-631C CRC                   C0B5B005 (3233132549)\n-6320 Compressed Size       0000003F (63)\n-6324 Uncompressed Size     00000042 (66)\n-6328 Filename Length       0050 (80)\n-632A Extra Length          0000 (0)\n-632C Comment Length        0000 (0)\n-632E Disk Start            0000 (0)\n-6330 Int File Attributes   0000 (0)\n+6379 Compression Method    0008 (8) 'Deflated'\n+637B Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n+637F CRC                   C0B5B005 (3233132549)\n+6383 Compressed Size       0000003F (63)\n+6387 Uncompressed Size     00000042 (66)\n+638B Filename Length       0050 (80)\n+638D Extra Length          0000 (0)\n+638F Comment Length        0000 (0)\n+6391 Disk Start            0000 (0)\n+6393 Int File Attributes   0000 (0)\n      [Bit 0]               0 'Binary Data'\n-6332 Ext File Attributes   81A40000 (2175008768)\n+6395 Ext File Attributes   81A40000 (2175008768)\n      [Bits 16-24]          01A4 (420) 'Unix attrib: rw-r--r--'\n      [Bits 28-31]          08 (8) 'Regular File'\n-6336 Local Header Offset   00005525 (21797)\n-633A Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+6399 Local Header Offset   0000558E (21902)\n+639D Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x633A: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x639D: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n \n-638A CENTRAL HEADER #28    02014B50 (33639248)\n-638E Created Zip Spec      14 (20) '2.0'\n-638F Created OS            03 (3) 'Unix'\n-6390 Extract Zip Spec      14 (20) '2.0'\n-6391 Extract OS            00 (0) 'MS-DOS'\n-6392 General Purpose Flag  0800 (2048)\n+63ED CENTRAL HEADER #28    02014B50 (33639248)\n+63F1 Created Zip Spec      14 (20) '2.0'\n+63F2 Created OS            03 (3) 'Unix'\n+63F3 Extract Zip Spec      14 (20) '2.0'\n+63F4 Extract OS            00 (0) 'MS-DOS'\n+63F5 General Purpose Flag  0800 (2048)\n      [Bits 1-2]            0 'Normal Compression'\n      [Bit 11]              1 'Language Encoding'\n-6394 Compression Method    0008 (8) 'Deflated'\n-6396 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n-639A CRC                   0701BB57 (117554007)\n-639E Compressed Size       000003CA (970)\n-63A2 Uncompressed Size     00000C33 (3123)\n-63A6 Filename Length       003C (60)\n-63A8 Extra Length          0000 (0)\n-63AA Comment Length        0000 (0)\n-63AC Disk Start            0000 (0)\n-63AE Int File Attributes   0000 (0)\n+63F7 Compression Method    0008 (8) 'Deflated'\n+63F9 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n+63FD CRC                   6A8F4F7A (1787776890)\n+6401 Compressed Size       000003C4 (964)\n+6405 Uncompressed Size     00000BE1 (3041)\n+6409 Filename Length       003C (60)\n+640B Extra Length          0000 (0)\n+640D Comment Length        0000 (0)\n+640F Disk Start            0000 (0)\n+6411 Int File Attributes   0000 (0)\n      [Bit 0]               0 'Binary Data'\n-63B0 Ext File Attributes   81A40000 (2175008768)\n+6413 Ext File Attributes   81A40000 (2175008768)\n      [Bits 16-24]          01A4 (420) 'Unix attrib: rw-r--r--'\n      [Bits 28-31]          08 (8) 'Regular File'\n-63B4 Local Header Offset   000055D2 (21970)\n-63B8 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+6417 Local Header Offset   0000563B (22075)\n+641B Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x63B8: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x641B: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n \n-63F4 CENTRAL HEADER #29    02014B50 (33639248)\n-63F8 Created Zip Spec      14 (20) '2.0'\n-63F9 Created OS            03 (3) 'Unix'\n-63FA Extract Zip Spec      14 (20) '2.0'\n-63FB Extract OS            00 (0) 'MS-DOS'\n-63FC General Purpose Flag  0800 (2048)\n+6457 CENTRAL HEADER #29    02014B50 (33639248)\n+645B Created Zip Spec      14 (20) '2.0'\n+645C Created OS            03 (3) 'Unix'\n+645D Extract Zip Spec      14 (20) '2.0'\n+645E Extract OS            00 (0) 'MS-DOS'\n+645F General Purpose Flag  0800 (2048)\n      [Bits 1-2]            0 'Normal Compression'\n      [Bit 11]              1 'Language Encoding'\n-63FE Compression Method    0008 (8) 'Deflated'\n-6400 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n-6404 CRC                   BACBA827 (3133909031)\n-6408 Compressed Size       00000049 (73)\n-640C Uncompressed Size     0000004B (75)\n-6410 Filename Length       0043 (67)\n-6412 Extra Length          0000 (0)\n-6414 Comment Length        0000 (0)\n-6416 Disk Start            0000 (0)\n-6418 Int File Attributes   0000 (0)\n+6461 Compression Method    0008 (8) 'Deflated'\n+6463 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n+6467 CRC                   BACBA827 (3133909031)\n+646B Compressed Size       00000049 (73)\n+646F Uncompressed Size     0000004B (75)\n+6473 Filename Length       0043 (67)\n+6475 Extra Length          0000 (0)\n+6477 Comment Length        0000 (0)\n+6479 Disk Start            0000 (0)\n+647B Int File Attributes   0000 (0)\n      [Bit 0]               0 'Binary Data'\n-641A Ext File Attributes   81A40000 (2175008768)\n+647D Ext File Attributes   81A40000 (2175008768)\n      [Bits 16-24]          01A4 (420) 'Unix attrib: rw-r--r--'\n      [Bits 28-31]          08 (8) 'Regular File'\n-641E Local Header Offset   000059F6 (23030)\n-6422 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+6481 Local Header Offset   00005A59 (23129)\n+6485 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x6422: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x6485: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n \n-6465 END CENTRAL HEADER    06054B50 (101010256)\n-6469 Number of this disk   0000 (0)\n-646B Central Dir Disk no   0000 (0)\n-646D Entries in this disk  001D (29)\n-646F Total Entries         001D (29)\n-6471 Size of Central Dir   000009C5 (2501)\n-6475 Offset to Central Dir 00005AA0 (23200)\n-6479 Comment Length        0000 (0)\n+64C8 END CENTRAL HEADER    06054B50 (101010256)\n+64CC Number of this disk   0000 (0)\n+64CE Central Dir Disk no   0000 (0)\n+64D0 Entries in this disk  001D (29)\n+64D2 Total Entries         001D (29)\n+64D4 Size of Central Dir   000009C5 (2501)\n+64D8 Offset to Central Dir 00005B03 (23299)\n+64DC Comment Length        0000 (0)\n #\n # Error Count: 12\n # Warning Count: 70\n #\n # Done\n"}, {"source1": "org/apache/dubbo/registry/nacos/NacosNamingServiceWrapper.java", "source2": "org/apache/dubbo/registry/nacos/NacosNamingServiceWrapper.java", "comments": ["Ordering differences only"], "unified_diff": "@@ -1,87 +1,87 @@\n-/*\n- * Licensed to the Apache Software Foundation (ASF) under one or more\n- * contributor license agreements.  See the NOTICE file distributed with\n- * this work for additional information regarding copyright ownership.\n- * The ASF licenses this file to You under the Apache License, Version 2.0\n- * (the \"License\"); you may not use this file except in compliance with\n- * the License.  You may obtain a copy of the License at\n- *\n- *     http://www.apache.org/licenses/LICENSE-2.0\n- *\n- * Unless required by applicable law or agreed to in writing, software\n- * distributed under the License is distributed on an \"AS IS\" BASIS,\n- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n- * See the License for the specific language governing permissions and\n- * limitations under the License.\n- */\n-package org.apache.dubbo.registry.nacos;\n-\n-import com.alibaba.nacos.api.exception.NacosException;\n-import com.alibaba.nacos.api.naming.NamingService;\n-import com.alibaba.nacos.api.naming.listener.EventListener;\n-import com.alibaba.nacos.api.naming.pojo.Instance;\n-import com.alibaba.nacos.api.naming.pojo.ListView;\n-\n-import java.util.List;\n-\n-public class NacosNamingServiceWrapper {\n-\n-    private static final String INNERCLASS_SYMBOL = \"$\";\n-\n-    private static final String INNERCLASS_COMPATIBLE_SYMBOL = \"___\";\n-\n-    private NamingService namingService;\n-\n-    public NacosNamingServiceWrapper(NamingService namingService) {\n-        this.namingService = namingService;\n-    }\n-\n-\n-    public String getServerStatus() {\n-        return namingService.getServerStatus();\n-    }\n-\n-    public void subscribe(String serviceName, EventListener eventListener) throws NacosException {\n-        namingService.subscribe(handleInnerSymbol(serviceName), eventListener);\n-    }\n-\n-    public void subscribe(String serviceName, String group, EventListener eventListener) throws NacosException {\n-        namingService.subscribe(handleInnerSymbol(serviceName), group, eventListener);\n-    }\n-\n-    public List<Instance> getAllInstances(String serviceName, String group) throws NacosException {\n-        return namingService.getAllInstances(handleInnerSymbol(serviceName), group);\n-    }\n-\n-    public void registerInstance(String serviceName, String group, Instance instance) throws NacosException {\n-        namingService.registerInstance(handleInnerSymbol(serviceName), group, instance);\n-    }\n-\n-    public void deregisterInstance(String serviceName, String group, String ip, int port) throws NacosException {\n-        namingService.deregisterInstance(handleInnerSymbol(serviceName), group, ip, port);\n-    }\n-\n-\n-    public void deregisterInstance(String serviceName, String group, Instance instance) throws NacosException {\n-        namingService.deregisterInstance(handleInnerSymbol(serviceName), group, instance);\n-    }\n-\n-    public ListView<String> getServicesOfServer(int pageNo, int pageSize, String parameter) throws NacosException {\n-        return namingService.getServicesOfServer(pageNo, pageSize, parameter);\n-    }\n-\n-    public List<Instance> selectInstances(String serviceName, boolean healthy) throws NacosException {\n-        return namingService.selectInstances(handleInnerSymbol(serviceName), healthy);\n-    }\n-\n-    /**\n-     * see https://github.com/apache/dubbo/issues/7129\n-     * nacos service name just support `0-9a-zA-Z-._:`, grpc interface is inner interface, need compatible.\n-     */\n-    private String handleInnerSymbol(String serviceName) {\n-        if (serviceName == null) {\n-            return null;\n-        }\n-        return serviceName.replace(INNERCLASS_SYMBOL, INNERCLASS_COMPATIBLE_SYMBOL);\n-    }\n-}\n+/*\r\n+ * Licensed to the Apache Software Foundation (ASF) under one or more\r\n+ * contributor license agreements.  See the NOTICE file distributed with\r\n+ * this work for additional information regarding copyright ownership.\r\n+ * The ASF licenses this file to You under the Apache License, Version 2.0\r\n+ * (the \"License\"); you may not use this file except in compliance with\r\n+ * the License.  You may obtain a copy of the License at\r\n+ *\r\n+ *     http://www.apache.org/licenses/LICENSE-2.0\r\n+ *\r\n+ * Unless required by applicable law or agreed to in writing, software\r\n+ * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n+ * See the License for the specific language governing permissions and\r\n+ * limitations under the License.\r\n+ */\r\n+package org.apache.dubbo.registry.nacos;\r\n+\r\n+import com.alibaba.nacos.api.exception.NacosException;\r\n+import com.alibaba.nacos.api.naming.NamingService;\r\n+import com.alibaba.nacos.api.naming.listener.EventListener;\r\n+import com.alibaba.nacos.api.naming.pojo.Instance;\r\n+import com.alibaba.nacos.api.naming.pojo.ListView;\r\n+\r\n+import java.util.List;\r\n+\r\n+public class NacosNamingServiceWrapper {\r\n+\r\n+    private static final String INNERCLASS_SYMBOL = \"$\";\r\n+\r\n+    private static final String INNERCLASS_COMPATIBLE_SYMBOL = \"___\";\r\n+\r\n+    private NamingService namingService;\r\n+\r\n+    public NacosNamingServiceWrapper(NamingService namingService) {\r\n+        this.namingService = namingService;\r\n+    }\r\n+\r\n+\r\n+    public String getServerStatus() {\r\n+        return namingService.getServerStatus();\r\n+    }\r\n+\r\n+    public void subscribe(String serviceName, EventListener eventListener) throws NacosException {\r\n+        namingService.subscribe(handleInnerSymbol(serviceName), eventListener);\r\n+    }\r\n+\r\n+    public void subscribe(String serviceName, String group, EventListener eventListener) throws NacosException {\r\n+        namingService.subscribe(handleInnerSymbol(serviceName), group, eventListener);\r\n+    }\r\n+\r\n+    public List<Instance> getAllInstances(String serviceName, String group) throws NacosException {\r\n+        return namingService.getAllInstances(handleInnerSymbol(serviceName), group);\r\n+    }\r\n+\r\n+    public void registerInstance(String serviceName, String group, Instance instance) throws NacosException {\r\n+        namingService.registerInstance(handleInnerSymbol(serviceName), group, instance);\r\n+    }\r\n+\r\n+    public void deregisterInstance(String serviceName, String group, String ip, int port) throws NacosException {\r\n+        namingService.deregisterInstance(handleInnerSymbol(serviceName), group, ip, port);\r\n+    }\r\n+\r\n+\r\n+    public void deregisterInstance(String serviceName, String group, Instance instance) throws NacosException {\r\n+        namingService.deregisterInstance(handleInnerSymbol(serviceName), group, instance);\r\n+    }\r\n+\r\n+    public ListView<String> getServicesOfServer(int pageNo, int pageSize, String parameter) throws NacosException {\r\n+        return namingService.getServicesOfServer(pageNo, pageSize, parameter);\r\n+    }\r\n+\r\n+    public List<Instance> selectInstances(String serviceName, boolean healthy) throws NacosException {\r\n+        return namingService.selectInstances(handleInnerSymbol(serviceName), healthy);\r\n+    }\r\n+\r\n+    /**\r\n+     * see https://github.com/apache/dubbo/issues/7129\r\n+     * nacos service name just support `0-9a-zA-Z-._:`, grpc interface is inner interface, need compatible.\r\n+     */\r\n+    private String handleInnerSymbol(String serviceName) {\r\n+        if (serviceName == null) {\r\n+            return null;\r\n+        }\r\n+        return serviceName.replace(INNERCLASS_SYMBOL, INNERCLASS_COMPATIBLE_SYMBOL);\r\n+    }\r\n+}\r\n"}, {"source1": "org/apache/dubbo/registry/nacos/NacosRegistry.java", "source2": "org/apache/dubbo/registry/nacos/NacosRegistry.java", "comments": ["Ordering differences only"], "unified_diff": "@@ -1,624 +1,624 @@\n-/*\n- * Licensed to the Apache Software Foundation (ASF) under one or more\n- * contributor license agreements.  See the NOTICE file distributed with\n- * this work for additional information regarding copyright ownership.\n- * The ASF licenses this file to You under the Apache License, Version 2.0\n- * (the \"License\"); you may not use this file except in compliance with\n- * the License.  You may obtain a copy of the License at\n- *\n- *     http://www.apache.org/licenses/LICENSE-2.0\n- *\n- * Unless required by applicable law or agreed to in writing, software\n- * distributed under the License is distributed on an \"AS IS\" BASIS,\n- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n- * See the License for the specific language governing permissions and\n- * limitations under the License.\n- */\n-package org.apache.dubbo.registry.nacos;\n-\n-\n-import org.apache.dubbo.common.URL;\n-import org.apache.dubbo.common.URLBuilder;\n-import org.apache.dubbo.common.utils.StringUtils;\n-import org.apache.dubbo.common.utils.UrlUtils;\n-import org.apache.dubbo.registry.NotifyListener;\n-import org.apache.dubbo.registry.Registry;\n-import org.apache.dubbo.registry.nacos.util.NacosInstanceManageUtil;\n-import org.apache.dubbo.registry.nacos.util.NacosNamingServiceUtils;\n-import org.apache.dubbo.registry.support.FailbackRegistry;\n-\n-import com.alibaba.nacos.api.common.Constants;\n-import com.alibaba.nacos.api.exception.NacosException;\n-import com.alibaba.nacos.api.naming.NamingService;\n-import com.alibaba.nacos.api.naming.listener.EventListener;\n-import com.alibaba.nacos.api.naming.listener.NamingEvent;\n-import com.alibaba.nacos.api.naming.pojo.Instance;\n-import com.alibaba.nacos.api.naming.pojo.ListView;\n-import com.google.common.collect.Lists;\n-\n-import java.util.ArrayList;\n-import java.util.Arrays;\n-import java.util.Collection;\n-import java.util.HashMap;\n-import java.util.LinkedHashSet;\n-import java.util.LinkedList;\n-import java.util.List;\n-import java.util.Map;\n-import java.util.Set;\n-import java.util.concurrent.Executors;\n-import java.util.concurrent.ScheduledExecutorService;\n-import java.util.concurrent.TimeUnit;\n-import java.util.stream.Collectors;\n-\n-import static org.apache.dubbo.common.constants.CommonConstants.ANY_VALUE;\n-import static org.apache.dubbo.common.constants.CommonConstants.GROUP_KEY;\n-import static org.apache.dubbo.common.constants.CommonConstants.INTERFACE_KEY;\n-import static org.apache.dubbo.common.constants.CommonConstants.PATH_KEY;\n-import static org.apache.dubbo.common.constants.CommonConstants.PROTOCOL_KEY;\n-import static org.apache.dubbo.common.constants.CommonConstants.VERSION_KEY;\n-import static org.apache.dubbo.common.constants.RegistryConstants.CATEGORY_KEY;\n-import static org.apache.dubbo.common.constants.RegistryConstants.CONFIGURATORS_CATEGORY;\n-import static org.apache.dubbo.common.constants.RegistryConstants.CONSUMERS_CATEGORY;\n-import static org.apache.dubbo.common.constants.RegistryConstants.DEFAULT_CATEGORY;\n-import static org.apache.dubbo.common.constants.RegistryConstants.EMPTY_PROTOCOL;\n-import static org.apache.dubbo.common.constants.RegistryConstants.PROVIDERS_CATEGORY;\n-import static org.apache.dubbo.common.constants.RegistryConstants.ROUTERS_CATEGORY;\n-import static org.apache.dubbo.registry.Constants.ADMIN_PROTOCOL;\n-import static org.apache.dubbo.registry.nacos.NacosServiceName.valueOf;\n-\n-/**\n- * Nacos {@link Registry}\n- *\n- * @see #SERVICE_NAME_SEPARATOR\n- * @see #PAGINATION_SIZE\n- * @see #LOOKUP_INTERVAL\n- * @since 2.6.5\n- */\n-public class NacosRegistry extends FailbackRegistry {\n-\n-    /**\n-     * All supported categories\n-     */\n-    private static final List<String> ALL_SUPPORTED_CATEGORIES = Arrays.asList(\n-            PROVIDERS_CATEGORY,\n-            CONSUMERS_CATEGORY,\n-            ROUTERS_CATEGORY,\n-            CONFIGURATORS_CATEGORY\n-    );\n-\n-    private static final int CATEGORY_INDEX = 0;\n-\n-    private static final int SERVICE_INTERFACE_INDEX = 1;\n-\n-    private static final int SERVICE_VERSION_INDEX = 2;\n-\n-    private static final int SERVICE_GROUP_INDEX = 3;\n-\n-    private static final String WILDCARD = \"*\";\n-\n-    /**\n-     * The separator for service name\n-     * Change a constant to be configurable, it's designed for Windows file name that is compatible with old\n-     * Nacos binary release(< 0.6.1)\n-     */\n-    private static final String SERVICE_NAME_SEPARATOR = System.getProperty(\"nacos.service.name.separator\", \":\");\n-\n-    /**\n-     * The pagination size of query for Nacos service names(only for Dubbo-OPS)\n-     */\n-    private static final int PAGINATION_SIZE = Integer.getInteger(\"nacos.service.names.pagination.size\", 100);\n-\n-    /**\n-     * The interval in second of lookup Nacos service names(only for Dubbo-OPS)\n-     */\n-    private static final long LOOKUP_INTERVAL = Long.getLong(\"nacos.service.names.lookup.interval\", 30);\n-\n-    /**\n-     * {@link ScheduledExecutorService} lookup Nacos service names(only for Dubbo-OPS)\n-     */\n-    private volatile ScheduledExecutorService scheduledExecutorService;\n-\n-    private final NacosNamingServiceWrapper namingService;\n-\n-    public NacosRegistry(URL url, NacosNamingServiceWrapper namingService) {\n-        super(url);\n-        this.namingService = namingService;\n-    }\n-\n-    @Override\n-    public boolean isAvailable() {\n-        return \"UP\".equals(namingService.getServerStatus());\n-    }\n-\n-    @Override\n-    public List<URL> lookup(final URL url) {\n-        final List<URL> urls = new LinkedList<>();\n-        execute(namingService -> {\n-            Set<String> serviceNames = getServiceNames(url, null);\n-            for (String serviceName : serviceNames) {\n-                List<Instance> instances = namingService.getAllInstances(serviceName,\n-                        getUrl().getParameter(GROUP_KEY, Constants.DEFAULT_GROUP));\n-                urls.addAll(buildURLs(url, instances));\n-            }\n-        });\n-        return urls;\n-    }\n-\n-    @Override\n-    public void doRegister(URL url) {\n-        final String serviceName = getServiceName(url);\n-\n-        final Instance instance = createInstance(url);\n-        /**\n-         *  namingService.registerInstance with {@link org.apache.dubbo.registry.support.AbstractRegistry#registryUrl}\n-         *  default {@link DEFAULT_GROUP}\n-         *\n-         * in https://github.com/apache/dubbo/issues/5978\n-         */\n-        execute(namingService -> namingService.registerInstance(serviceName,\n-                getUrl().getParameter(GROUP_KEY, Constants.DEFAULT_GROUP), instance));\n-    }\n-\n-    @Override\n-    public void doUnregister(final URL url) {\n-        execute(namingService -> {\n-            String serviceName = getServiceName(url);\n-            Instance instance = createInstance(url);\n-            namingService.deregisterInstance(serviceName,\n-                    getUrl().getParameter(GROUP_KEY, Constants.DEFAULT_GROUP),\n-                    instance.getIp(),\n-                    instance.getPort());\n-        });\n-    }\n-\n-    @Override\n-    public void doSubscribe(final URL url, final NotifyListener listener) {\n-        Set<String> serviceNames = getServiceNames(url, listener);\n-\n-        //Set corresponding serviceNames for easy search later\n-        if (isServiceNamesWithCompatibleMode(url)) {\n-            for (String serviceName : serviceNames) {\n-                NacosInstanceManageUtil.setCorrespondingServiceNames(serviceName, serviceNames);\n-            }\n-        }\n-\n-        doSubscribe(url, listener, serviceNames);\n-    }\n-\n-    private void doSubscribe(final URL url, final NotifyListener listener, final Set<String> serviceNames) {\n-        execute(namingService -> {\n-            if (isServiceNamesWithCompatibleMode(url)) {\n-                List<Instance> allCorrespondingInstanceList = Lists.newArrayList();\n-\n-                /**\n-                 * Get all instances with serviceNames to avoid instance overwrite and but with empty instance mentioned\n-                 * in https://github.com/apache/dubbo/issues/5885 and https://github.com/apache/dubbo/issues/5899\n-                 *\n-                 * namingService.getAllInstances with {@link org.apache.dubbo.registry.support.AbstractRegistry#registryUrl}\n-                 * default {@link DEFAULT_GROUP}\n-                 *\n-                 * in https://github.com/apache/dubbo/issues/5978\n-                 */\n-                for (String serviceName : serviceNames) {\n-                    List<Instance> instances = namingService.getAllInstances(serviceName,\n-                            getUrl().getParameter(GROUP_KEY, Constants.DEFAULT_GROUP));\n-                    NacosInstanceManageUtil.initOrRefreshServiceInstanceList(serviceName, instances);\n-                    allCorrespondingInstanceList.addAll(instances);\n-                }\n-                notifySubscriber(url, listener, allCorrespondingInstanceList);\n-                for (String serviceName : serviceNames) {\n-                    subscribeEventListener(serviceName, url, listener);\n-                }\n-            } else {\n-                List<Instance> instances = new LinkedList<>();\n-                for (String serviceName : serviceNames) {\n-                    instances.addAll(namingService.getAllInstances(serviceName\n-                            , getUrl().getParameter(GROUP_KEY, Constants.DEFAULT_GROUP)));\n-                    notifySubscriber(url, listener, instances);\n-                    subscribeEventListener(serviceName, url, listener);\n-                }\n-            }\n-\n-        });\n-    }\n-\n-    /**\n-     * Since 2.7.6 the legacy service name will be added to serviceNames\n-     * to fix bug with https://github.com/apache/dubbo/issues/5442\n-     *\n-     * @param url\n-     * @return\n-     */\n-    private boolean isServiceNamesWithCompatibleMode(final URL url) {\n-        return !isAdminProtocol(url) && createServiceName(url).isConcrete();\n-    }\n-\n-    @Override\n-    public void doUnsubscribe(URL url, NotifyListener listener) {\n-        if (isAdminProtocol(url)) {\n-            shutdownServiceNamesLookup();\n-        }\n-    }\n-\n-    private void shutdownServiceNamesLookup() {\n-        if (scheduledExecutorService != null) {\n-            scheduledExecutorService.shutdown();\n-        }\n-    }\n-\n-    /**\n-     * Get the service names from the specified {@link URL url}\n-     *\n-     * @param url      {@link URL}\n-     * @param listener {@link NotifyListener}\n-     * @return non-null\n-     */\n-    private Set<String> getServiceNames(URL url, NotifyListener listener) {\n-        if (isAdminProtocol(url)) {\n-            scheduleServiceNamesLookup(url, listener);\n-            return getServiceNamesForOps(url);\n-        } else {\n-            return getServiceNames0(url);\n-        }\n-    }\n-\n-    private Set<String> getServiceNames0(URL url) {\n-        NacosServiceName serviceName = createServiceName(url);\n-\n-        final Set<String> serviceNames;\n-\n-        if (serviceName.isConcrete()) { // is the concrete service name\n-            serviceNames = new LinkedHashSet<>();\n-            serviceNames.add(serviceName.toString());\n-            // Add the legacy service name since 2.7.6\n-            String legacySubscribedServiceName = getLegacySubscribedServiceName(url);\n-            if (!serviceName.toString().equals(legacySubscribedServiceName)) {\n-                //avoid duplicated service names\n-                serviceNames.add(legacySubscribedServiceName);\n-            }\n-        } else {\n-            serviceNames = filterServiceNames(serviceName);\n-        }\n-\n-        return serviceNames;\n-    }\n-\n-    private Set<String> filterServiceNames(NacosServiceName serviceName) {\n-        Set<String> serviceNames = new LinkedHashSet<>();\n-\n-        execute(namingService -> {\n-\n-            serviceNames.addAll(namingService.getServicesOfServer(1, Integer.MAX_VALUE,\n-                    getUrl().getParameter(GROUP_KEY, Constants.DEFAULT_GROUP)).getData()\n-                    .stream()\n-                    .map(NacosServiceName::new)\n-                    .filter(serviceName::isCompatible)\n-                    .map(NacosServiceName::toString)\n-                    .collect(Collectors.toList()));\n-\n-        });\n-\n-        return serviceNames;\n-    }\n-\n-    /**\n-     * Get the legacy subscribed service name for compatible with Dubbo 2.7.3 and below\n-     *\n-     * @param url {@link URL}\n-     * @return non-null\n-     * @since 2.7.6\n-     */\n-    private String getLegacySubscribedServiceName(URL url) {\n-        StringBuilder serviceNameBuilder = new StringBuilder(DEFAULT_CATEGORY);\n-        appendIfPresent(serviceNameBuilder, url, INTERFACE_KEY);\n-        appendIfPresent(serviceNameBuilder, url, VERSION_KEY);\n-        appendIfPresent(serviceNameBuilder, url, GROUP_KEY);\n-        return serviceNameBuilder.toString();\n-    }\n-\n-    private void appendIfPresent(StringBuilder target, URL url, String parameterName) {\n-        String parameterValue = url.getParameter(parameterName);\n-        if (!StringUtils.isBlank(parameterValue)) {\n-            target.append(SERVICE_NAME_SEPARATOR).append(parameterValue);\n-        }\n-    }\n-\n-\n-    private boolean isAdminProtocol(URL url) {\n-        return ADMIN_PROTOCOL.equals(url.getProtocol());\n-    }\n-\n-    private void scheduleServiceNamesLookup(final URL url, final NotifyListener listener) {\n-        if (scheduledExecutorService == null) {\n-            scheduledExecutorService = Executors.newSingleThreadScheduledExecutor();\n-            scheduledExecutorService.scheduleAtFixedRate(() -> {\n-                Set<String> serviceNames = getAllServiceNames();\n-                filterData(serviceNames, serviceName -> {\n-                    boolean accepted = false;\n-                    for (String category : ALL_SUPPORTED_CATEGORIES) {\n-                        String prefix = category + SERVICE_NAME_SEPARATOR;\n-                        if (serviceName != null && serviceName.startsWith(prefix)) {\n-                            accepted = true;\n-                            break;\n-                        }\n-                    }\n-                    return accepted;\n-                });\n-                doSubscribe(url, listener, serviceNames);\n-            }, LOOKUP_INTERVAL, LOOKUP_INTERVAL, TimeUnit.SECONDS);\n-        }\n-    }\n-\n-    /**\n-     * Get the service names for Dubbo OPS\n-     *\n-     * @param url {@link URL}\n-     * @return non-null\n-     */\n-    private Set<String> getServiceNamesForOps(URL url) {\n-        Set<String> serviceNames = getAllServiceNames();\n-        filterServiceNames(serviceNames, url);\n-        return serviceNames;\n-    }\n-\n-    private Set<String> getAllServiceNames() {\n-\n-        final Set<String> serviceNames = new LinkedHashSet<>();\n-\n-        execute(namingService -> {\n-\n-            int pageIndex = 1;\n-            ListView<String> listView = namingService.getServicesOfServer(pageIndex, PAGINATION_SIZE,\n-                    getUrl().getParameter(GROUP_KEY, Constants.DEFAULT_GROUP));\n-            // First page data\n-            List<String> firstPageData = listView.getData();\n-            // Append first page into list\n-            serviceNames.addAll(firstPageData);\n-            // the total count\n-            int count = listView.getCount();\n-            // the number of pages\n-            int pageNumbers = count / PAGINATION_SIZE;\n-            int remainder = count % PAGINATION_SIZE;\n-            // remain\n-            if (remainder > 0) {\n-                pageNumbers += 1;\n-            }\n-            // If more than 1 page\n-            while (pageIndex < pageNumbers) {\n-                listView = namingService.getServicesOfServer(++pageIndex, PAGINATION_SIZE,\n-                        getUrl().getParameter(GROUP_KEY, Constants.DEFAULT_GROUP));\n-                serviceNames.addAll(listView.getData());\n-            }\n-\n-        });\n-\n-        return serviceNames;\n-    }\n-\n-    private void filterServiceNames(Set<String> serviceNames, URL url) {\n-\n-        final List<String> categories = getCategories(url);\n-\n-        final String targetServiceInterface = url.getServiceInterface();\n-\n-        final String targetVersion = url.getParameter(VERSION_KEY, \"\");\n-\n-        final String targetGroup = url.getParameter(GROUP_KEY, \"\");\n-\n-        filterData(serviceNames, serviceName -> {\n-            // split service name to segments\n-            // (required) segments[0] = category\n-            // (required) segments[1] = serviceInterface\n-            // (optional) segments[2] = version\n-            // (optional) segments[3] = group\n-            String[] segments = serviceName.split(SERVICE_NAME_SEPARATOR, -1);\n-            int length = segments.length;\n-            if (length != 4) { // must present 4 segments\n-                return false;\n-            }\n-\n-            String category = segments[CATEGORY_INDEX];\n-            if (!categories.contains(category)) { // no match category\n-                return false;\n-            }\n-\n-            String serviceInterface = segments[SERVICE_INTERFACE_INDEX];\n-            // no match service interface\n-            if (!WILDCARD.equals(targetServiceInterface) &&\n-                    !StringUtils.isEquals(targetServiceInterface, serviceInterface)) {\n-                return false;\n-            }\n-\n-            // no match service version\n-            String version = segments[SERVICE_VERSION_INDEX];\n-            if (!WILDCARD.equals(targetVersion) && !StringUtils.isEquals(targetVersion, version)) {\n-                return false;\n-            }\n-\n-            String group = segments[SERVICE_GROUP_INDEX];\n-            return group == null || WILDCARD.equals(targetGroup) || StringUtils.isEquals(targetGroup, group);\n-        });\n-    }\n-\n-    private <T> void filterData(Collection<T> collection, NacosDataFilter<T> filter) {\n-        // remove if not accept\n-        collection.removeIf(data -> !filter.accept(data));\n-    }\n-\n-    @Deprecated\n-    private List<String> doGetServiceNames(URL url) {\n-        List<String> categories = getCategories(url);\n-        List<String> serviceNames = new ArrayList<>(categories.size());\n-        for (String category : categories) {\n-            final String serviceName = getServiceName(url, category);\n-            serviceNames.add(serviceName);\n-        }\n-        return serviceNames;\n-    }\n-\n-    private List<URL> toUrlWithEmpty(URL consumerURL, Collection<Instance> instances) {\n-        List<URL> urls = buildURLs(consumerURL, instances);\n-        if (urls.size() == 0) {\n-            URL empty = URLBuilder.from(consumerURL)\n-                    .setProtocol(EMPTY_PROTOCOL)\n-                    .addParameter(CATEGORY_KEY, DEFAULT_CATEGORY)\n-                    .build();\n-            urls.add(empty);\n-        }\n-        return urls;\n-    }\n-\n-    private List<URL> buildURLs(URL consumerURL, Collection<Instance> instances) {\n-        List<URL> urls = new LinkedList<>();\n-        if (instances != null && !instances.isEmpty()) {\n-            for (Instance instance : instances) {\n-                URL url = buildURL(instance);\n-                if (UrlUtils.isMatch(consumerURL, url)) {\n-                    urls.add(url);\n-                }\n-            }\n-        }\n-        return urls;\n-    }\n-\n-    private void subscribeEventListener(String serviceName, final URL url, final NotifyListener listener)\n-            throws NacosException {\n-        EventListener eventListener = event -> {\n-            if (event instanceof NamingEvent) {\n-                NamingEvent e = (NamingEvent) event;\n-                List<Instance> instances = e.getInstances();\n-\n-\n-                if (isServiceNamesWithCompatibleMode(url)) {\n-                    /**\n-                     * Get all instances with corresponding serviceNames to avoid instance overwrite and but with empty instance mentioned\n-                     * in https://github.com/apache/dubbo/issues/5885 and https://github.com/apache/dubbo/issues/5899\n-                     */\n-                    NacosInstanceManageUtil.initOrRefreshServiceInstanceList(serviceName, instances);\n-                    instances = NacosInstanceManageUtil.getAllCorrespondingServiceInstanceList(serviceName);\n-                }\n-\n-                notifySubscriber(url, listener, instances);\n-            }\n-        };\n-        namingService.subscribe(serviceName,\n-                getUrl().getParameter(GROUP_KEY, Constants.DEFAULT_GROUP),\n-                eventListener);\n-    }\n-\n-    /**\n-     * Notify the Enabled {@link Instance instances} to subscriber.\n-     *\n-     * @param url       {@link URL}\n-     * @param listener  {@link NotifyListener}\n-     * @param instances all {@link Instance instances}\n-     */\n-    private void notifySubscriber(URL url, NotifyListener listener, Collection<Instance> instances) {\n-        List<Instance> enabledInstances = new LinkedList<>(instances);\n-        if (enabledInstances.size() > 0) {\n-            //  Instances\n-            filterEnabledInstances(enabledInstances);\n-        }\n-        List<URL> urls = toUrlWithEmpty(url, enabledInstances);\n-        NacosRegistry.this.notify(url, listener, urls);\n-    }\n-\n-    /**\n-     * Get the categories from {@link URL}\n-     *\n-     * @param url {@link URL}\n-     * @return non-null array\n-     */\n-    private List<String> getCategories(URL url) {\n-        return ANY_VALUE.equals(url.getServiceInterface()) ?\n-                ALL_SUPPORTED_CATEGORIES : Arrays.asList(DEFAULT_CATEGORY);\n-    }\n-\n-    private URL buildURL(Instance instance) {\n-        Map<String, String> metadata = instance.getMetadata();\n-        String protocol = metadata.get(PROTOCOL_KEY);\n-        String path = metadata.get(PATH_KEY);\n-        return new URL(protocol,\n-                instance.getIp(),\n-                instance.getPort(),\n-                path,\n-                instance.getMetadata());\n-    }\n-\n-    private Instance createInstance(URL url) {\n-        // Append default category if absent\n-        String category = url.getParameter(CATEGORY_KEY, DEFAULT_CATEGORY);\n-        URL newURL = url.addParameter(CATEGORY_KEY, category);\n-        newURL = newURL.addParameter(PROTOCOL_KEY, url.getProtocol());\n-        newURL = newURL.addParameter(PATH_KEY, url.getPath());\n-        newURL = newURL.addParameters(NacosNamingServiceUtils.getNacosPreservedParam(getUrl()));\n-        String ip = url.getHost();\n-        int port = url.getPort();\n-        Instance instance = new Instance();\n-        instance.setIp(ip);\n-        instance.setPort(port);\n-        instance.setMetadata(new HashMap<>(newURL.getParameters()));\n-        return instance;\n-    }\n-\n-    private NacosServiceName createServiceName(URL url) {\n-        return valueOf(url);\n-    }\n-\n-    private String getServiceName(URL url) {\n-        return getServiceName(url, url.getParameter(CATEGORY_KEY, DEFAULT_CATEGORY));\n-    }\n-\n-    private String getServiceName(URL url, String category) {\n-        return category + SERVICE_NAME_SEPARATOR + url.getColonSeparatedKey();\n-    }\n-\n-    private void execute(NamingServiceCallback callback) {\n-        try {\n-            callback.callback(namingService);\n-        } catch (NacosException e) {\n-            if (logger.isErrorEnabled()) {\n-                logger.error(e.getErrMsg(), e);\n-            }\n-        }\n-    }\n-\n-    private void filterEnabledInstances(Collection<Instance> instances) {\n-        filterData(instances, Instance::isEnabled);\n-    }\n-\n-    /**\n-     * A filter for Nacos data\n-     *\n-     * @since 2.6.5\n-     */\n-    private interface NacosDataFilter<T> {\n-\n-        /**\n-         * Tests whether or not the specified data should be accepted.\n-         *\n-         * @param data The data to be tested\n-         * @return <code>true</code> if and only if <code>data</code>\n-         * should be accepted\n-         */\n-        boolean accept(T data);\n-\n-    }\n-\n-    /**\n-     * {@link NamingService} Callback\n-     *\n-     * @since 2.6.5\n-     */\n-    interface NamingServiceCallback {\n-\n-        /**\n-         * Callback\n-         *\n-         * @param namingService {@link NamingService}\n-         * @throws NacosException\n-         */\n-        void callback(NacosNamingServiceWrapper namingService) throws NacosException;\n-\n-    }\n-}\n+/*\r\n+ * Licensed to the Apache Software Foundation (ASF) under one or more\r\n+ * contributor license agreements.  See the NOTICE file distributed with\r\n+ * this work for additional information regarding copyright ownership.\r\n+ * The ASF licenses this file to You under the Apache License, Version 2.0\r\n+ * (the \"License\"); you may not use this file except in compliance with\r\n+ * the License.  You may obtain a copy of the License at\r\n+ *\r\n+ *     http://www.apache.org/licenses/LICENSE-2.0\r\n+ *\r\n+ * Unless required by applicable law or agreed to in writing, software\r\n+ * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n+ * See the License for the specific language governing permissions and\r\n+ * limitations under the License.\r\n+ */\r\n+package org.apache.dubbo.registry.nacos;\r\n+\r\n+\r\n+import org.apache.dubbo.common.URL;\r\n+import org.apache.dubbo.common.URLBuilder;\r\n+import org.apache.dubbo.common.utils.StringUtils;\r\n+import org.apache.dubbo.common.utils.UrlUtils;\r\n+import org.apache.dubbo.registry.NotifyListener;\r\n+import org.apache.dubbo.registry.Registry;\r\n+import org.apache.dubbo.registry.nacos.util.NacosInstanceManageUtil;\r\n+import org.apache.dubbo.registry.nacos.util.NacosNamingServiceUtils;\r\n+import org.apache.dubbo.registry.support.FailbackRegistry;\r\n+\r\n+import com.alibaba.nacos.api.common.Constants;\r\n+import com.alibaba.nacos.api.exception.NacosException;\r\n+import com.alibaba.nacos.api.naming.NamingService;\r\n+import com.alibaba.nacos.api.naming.listener.EventListener;\r\n+import com.alibaba.nacos.api.naming.listener.NamingEvent;\r\n+import com.alibaba.nacos.api.naming.pojo.Instance;\r\n+import com.alibaba.nacos.api.naming.pojo.ListView;\r\n+import com.google.common.collect.Lists;\r\n+\r\n+import java.util.ArrayList;\r\n+import java.util.Arrays;\r\n+import java.util.Collection;\r\n+import java.util.HashMap;\r\n+import java.util.LinkedHashSet;\r\n+import java.util.LinkedList;\r\n+import java.util.List;\r\n+import java.util.Map;\r\n+import java.util.Set;\r\n+import java.util.concurrent.Executors;\r\n+import java.util.concurrent.ScheduledExecutorService;\r\n+import java.util.concurrent.TimeUnit;\r\n+import java.util.stream.Collectors;\r\n+\r\n+import static org.apache.dubbo.common.constants.CommonConstants.ANY_VALUE;\r\n+import static org.apache.dubbo.common.constants.CommonConstants.GROUP_KEY;\r\n+import static org.apache.dubbo.common.constants.CommonConstants.INTERFACE_KEY;\r\n+import static org.apache.dubbo.common.constants.CommonConstants.PATH_KEY;\r\n+import static org.apache.dubbo.common.constants.CommonConstants.PROTOCOL_KEY;\r\n+import static org.apache.dubbo.common.constants.CommonConstants.VERSION_KEY;\r\n+import static org.apache.dubbo.common.constants.RegistryConstants.CATEGORY_KEY;\r\n+import static org.apache.dubbo.common.constants.RegistryConstants.CONFIGURATORS_CATEGORY;\r\n+import static org.apache.dubbo.common.constants.RegistryConstants.CONSUMERS_CATEGORY;\r\n+import static org.apache.dubbo.common.constants.RegistryConstants.DEFAULT_CATEGORY;\r\n+import static org.apache.dubbo.common.constants.RegistryConstants.EMPTY_PROTOCOL;\r\n+import static org.apache.dubbo.common.constants.RegistryConstants.PROVIDERS_CATEGORY;\r\n+import static org.apache.dubbo.common.constants.RegistryConstants.ROUTERS_CATEGORY;\r\n+import static org.apache.dubbo.registry.Constants.ADMIN_PROTOCOL;\r\n+import static org.apache.dubbo.registry.nacos.NacosServiceName.valueOf;\r\n+\r\n+/**\r\n+ * Nacos {@link Registry}\r\n+ *\r\n+ * @see #SERVICE_NAME_SEPARATOR\r\n+ * @see #PAGINATION_SIZE\r\n+ * @see #LOOKUP_INTERVAL\r\n+ * @since 2.6.5\r\n+ */\r\n+public class NacosRegistry extends FailbackRegistry {\r\n+\r\n+    /**\r\n+     * All supported categories\r\n+     */\r\n+    private static final List<String> ALL_SUPPORTED_CATEGORIES = Arrays.asList(\r\n+            PROVIDERS_CATEGORY,\r\n+            CONSUMERS_CATEGORY,\r\n+            ROUTERS_CATEGORY,\r\n+            CONFIGURATORS_CATEGORY\r\n+    );\r\n+\r\n+    private static final int CATEGORY_INDEX = 0;\r\n+\r\n+    private static final int SERVICE_INTERFACE_INDEX = 1;\r\n+\r\n+    private static final int SERVICE_VERSION_INDEX = 2;\r\n+\r\n+    private static final int SERVICE_GROUP_INDEX = 3;\r\n+\r\n+    private static final String WILDCARD = \"*\";\r\n+\r\n+    /**\r\n+     * The separator for service name\r\n+     * Change a constant to be configurable, it's designed for Windows file name that is compatible with old\r\n+     * Nacos binary release(< 0.6.1)\r\n+     */\r\n+    private static final String SERVICE_NAME_SEPARATOR = System.getProperty(\"nacos.service.name.separator\", \":\");\r\n+\r\n+    /**\r\n+     * The pagination size of query for Nacos service names(only for Dubbo-OPS)\r\n+     */\r\n+    private static final int PAGINATION_SIZE = Integer.getInteger(\"nacos.service.names.pagination.size\", 100);\r\n+\r\n+    /**\r\n+     * The interval in second of lookup Nacos service names(only for Dubbo-OPS)\r\n+     */\r\n+    private static final long LOOKUP_INTERVAL = Long.getLong(\"nacos.service.names.lookup.interval\", 30);\r\n+\r\n+    /**\r\n+     * {@link ScheduledExecutorService} lookup Nacos service names(only for Dubbo-OPS)\r\n+     */\r\n+    private volatile ScheduledExecutorService scheduledExecutorService;\r\n+\r\n+    private final NacosNamingServiceWrapper namingService;\r\n+\r\n+    public NacosRegistry(URL url, NacosNamingServiceWrapper namingService) {\r\n+        super(url);\r\n+        this.namingService = namingService;\r\n+    }\r\n+\r\n+    @Override\r\n+    public boolean isAvailable() {\r\n+        return \"UP\".equals(namingService.getServerStatus());\r\n+    }\r\n+\r\n+    @Override\r\n+    public List<URL> lookup(final URL url) {\r\n+        final List<URL> urls = new LinkedList<>();\r\n+        execute(namingService -> {\r\n+            Set<String> serviceNames = getServiceNames(url, null);\r\n+            for (String serviceName : serviceNames) {\r\n+                List<Instance> instances = namingService.getAllInstances(serviceName,\r\n+                        getUrl().getParameter(GROUP_KEY, Constants.DEFAULT_GROUP));\r\n+                urls.addAll(buildURLs(url, instances));\r\n+            }\r\n+        });\r\n+        return urls;\r\n+    }\r\n+\r\n+    @Override\r\n+    public void doRegister(URL url) {\r\n+        final String serviceName = getServiceName(url);\r\n+\r\n+        final Instance instance = createInstance(url);\r\n+        /**\r\n+         *  namingService.registerInstance with {@link org.apache.dubbo.registry.support.AbstractRegistry#registryUrl}\r\n+         *  default {@link DEFAULT_GROUP}\r\n+         *\r\n+         * in https://github.com/apache/dubbo/issues/5978\r\n+         */\r\n+        execute(namingService -> namingService.registerInstance(serviceName,\r\n+                getUrl().getParameter(GROUP_KEY, Constants.DEFAULT_GROUP), instance));\r\n+    }\r\n+\r\n+    @Override\r\n+    public void doUnregister(final URL url) {\r\n+        execute(namingService -> {\r\n+            String serviceName = getServiceName(url);\r\n+            Instance instance = createInstance(url);\r\n+            namingService.deregisterInstance(serviceName,\r\n+                    getUrl().getParameter(GROUP_KEY, Constants.DEFAULT_GROUP),\r\n+                    instance.getIp(),\r\n+                    instance.getPort());\r\n+        });\r\n+    }\r\n+\r\n+    @Override\r\n+    public void doSubscribe(final URL url, final NotifyListener listener) {\r\n+        Set<String> serviceNames = getServiceNames(url, listener);\r\n+\r\n+        //Set corresponding serviceNames for easy search later\r\n+        if (isServiceNamesWithCompatibleMode(url)) {\r\n+            for (String serviceName : serviceNames) {\r\n+                NacosInstanceManageUtil.setCorrespondingServiceNames(serviceName, serviceNames);\r\n+            }\r\n+        }\r\n+\r\n+        doSubscribe(url, listener, serviceNames);\r\n+    }\r\n+\r\n+    private void doSubscribe(final URL url, final NotifyListener listener, final Set<String> serviceNames) {\r\n+        execute(namingService -> {\r\n+            if (isServiceNamesWithCompatibleMode(url)) {\r\n+                List<Instance> allCorrespondingInstanceList = Lists.newArrayList();\r\n+\r\n+                /**\r\n+                 * Get all instances with serviceNames to avoid instance overwrite and but with empty instance mentioned\r\n+                 * in https://github.com/apache/dubbo/issues/5885 and https://github.com/apache/dubbo/issues/5899\r\n+                 *\r\n+                 * namingService.getAllInstances with {@link org.apache.dubbo.registry.support.AbstractRegistry#registryUrl}\r\n+                 * default {@link DEFAULT_GROUP}\r\n+                 *\r\n+                 * in https://github.com/apache/dubbo/issues/5978\r\n+                 */\r\n+                for (String serviceName : serviceNames) {\r\n+                    List<Instance> instances = namingService.getAllInstances(serviceName,\r\n+                            getUrl().getParameter(GROUP_KEY, Constants.DEFAULT_GROUP));\r\n+                    NacosInstanceManageUtil.initOrRefreshServiceInstanceList(serviceName, instances);\r\n+                    allCorrespondingInstanceList.addAll(instances);\r\n+                }\r\n+                notifySubscriber(url, listener, allCorrespondingInstanceList);\r\n+                for (String serviceName : serviceNames) {\r\n+                    subscribeEventListener(serviceName, url, listener);\r\n+                }\r\n+            } else {\r\n+                List<Instance> instances = new LinkedList<>();\r\n+                for (String serviceName : serviceNames) {\r\n+                    instances.addAll(namingService.getAllInstances(serviceName\r\n+                            , getUrl().getParameter(GROUP_KEY, Constants.DEFAULT_GROUP)));\r\n+                    notifySubscriber(url, listener, instances);\r\n+                    subscribeEventListener(serviceName, url, listener);\r\n+                }\r\n+            }\r\n+\r\n+        });\r\n+    }\r\n+\r\n+    /**\r\n+     * Since 2.7.6 the legacy service name will be added to serviceNames\r\n+     * to fix bug with https://github.com/apache/dubbo/issues/5442\r\n+     *\r\n+     * @param url\r\n+     * @return\r\n+     */\r\n+    private boolean isServiceNamesWithCompatibleMode(final URL url) {\r\n+        return !isAdminProtocol(url) && createServiceName(url).isConcrete();\r\n+    }\r\n+\r\n+    @Override\r\n+    public void doUnsubscribe(URL url, NotifyListener listener) {\r\n+        if (isAdminProtocol(url)) {\r\n+            shutdownServiceNamesLookup();\r\n+        }\r\n+    }\r\n+\r\n+    private void shutdownServiceNamesLookup() {\r\n+        if (scheduledExecutorService != null) {\r\n+            scheduledExecutorService.shutdown();\r\n+        }\r\n+    }\r\n+\r\n+    /**\r\n+     * Get the service names from the specified {@link URL url}\r\n+     *\r\n+     * @param url      {@link URL}\r\n+     * @param listener {@link NotifyListener}\r\n+     * @return non-null\r\n+     */\r\n+    private Set<String> getServiceNames(URL url, NotifyListener listener) {\r\n+        if (isAdminProtocol(url)) {\r\n+            scheduleServiceNamesLookup(url, listener);\r\n+            return getServiceNamesForOps(url);\r\n+        } else {\r\n+            return getServiceNames0(url);\r\n+        }\r\n+    }\r\n+\r\n+    private Set<String> getServiceNames0(URL url) {\r\n+        NacosServiceName serviceName = createServiceName(url);\r\n+\r\n+        final Set<String> serviceNames;\r\n+\r\n+        if (serviceName.isConcrete()) { // is the concrete service name\r\n+            serviceNames = new LinkedHashSet<>();\r\n+            serviceNames.add(serviceName.toString());\r\n+            // Add the legacy service name since 2.7.6\r\n+            String legacySubscribedServiceName = getLegacySubscribedServiceName(url);\r\n+            if (!serviceName.toString().equals(legacySubscribedServiceName)) {\r\n+                //avoid duplicated service names\r\n+                serviceNames.add(legacySubscribedServiceName);\r\n+            }\r\n+        } else {\r\n+            serviceNames = filterServiceNames(serviceName);\r\n+        }\r\n+\r\n+        return serviceNames;\r\n+    }\r\n+\r\n+    private Set<String> filterServiceNames(NacosServiceName serviceName) {\r\n+        Set<String> serviceNames = new LinkedHashSet<>();\r\n+\r\n+        execute(namingService -> {\r\n+\r\n+            serviceNames.addAll(namingService.getServicesOfServer(1, Integer.MAX_VALUE,\r\n+                    getUrl().getParameter(GROUP_KEY, Constants.DEFAULT_GROUP)).getData()\r\n+                    .stream()\r\n+                    .map(NacosServiceName::new)\r\n+                    .filter(serviceName::isCompatible)\r\n+                    .map(NacosServiceName::toString)\r\n+                    .collect(Collectors.toList()));\r\n+\r\n+        });\r\n+\r\n+        return serviceNames;\r\n+    }\r\n+\r\n+    /**\r\n+     * Get the legacy subscribed service name for compatible with Dubbo 2.7.3 and below\r\n+     *\r\n+     * @param url {@link URL}\r\n+     * @return non-null\r\n+     * @since 2.7.6\r\n+     */\r\n+    private String getLegacySubscribedServiceName(URL url) {\r\n+        StringBuilder serviceNameBuilder = new StringBuilder(DEFAULT_CATEGORY);\r\n+        appendIfPresent(serviceNameBuilder, url, INTERFACE_KEY);\r\n+        appendIfPresent(serviceNameBuilder, url, VERSION_KEY);\r\n+        appendIfPresent(serviceNameBuilder, url, GROUP_KEY);\r\n+        return serviceNameBuilder.toString();\r\n+    }\r\n+\r\n+    private void appendIfPresent(StringBuilder target, URL url, String parameterName) {\r\n+        String parameterValue = url.getParameter(parameterName);\r\n+        if (!StringUtils.isBlank(parameterValue)) {\r\n+            target.append(SERVICE_NAME_SEPARATOR).append(parameterValue);\r\n+        }\r\n+    }\r\n+\r\n+\r\n+    private boolean isAdminProtocol(URL url) {\r\n+        return ADMIN_PROTOCOL.equals(url.getProtocol());\r\n+    }\r\n+\r\n+    private void scheduleServiceNamesLookup(final URL url, final NotifyListener listener) {\r\n+        if (scheduledExecutorService == null) {\r\n+            scheduledExecutorService = Executors.newSingleThreadScheduledExecutor();\r\n+            scheduledExecutorService.scheduleAtFixedRate(() -> {\r\n+                Set<String> serviceNames = getAllServiceNames();\r\n+                filterData(serviceNames, serviceName -> {\r\n+                    boolean accepted = false;\r\n+                    for (String category : ALL_SUPPORTED_CATEGORIES) {\r\n+                        String prefix = category + SERVICE_NAME_SEPARATOR;\r\n+                        if (serviceName != null && serviceName.startsWith(prefix)) {\r\n+                            accepted = true;\r\n+                            break;\r\n+                        }\r\n+                    }\r\n+                    return accepted;\r\n+                });\r\n+                doSubscribe(url, listener, serviceNames);\r\n+            }, LOOKUP_INTERVAL, LOOKUP_INTERVAL, TimeUnit.SECONDS);\r\n+        }\r\n+    }\r\n+\r\n+    /**\r\n+     * Get the service names for Dubbo OPS\r\n+     *\r\n+     * @param url {@link URL}\r\n+     * @return non-null\r\n+     */\r\n+    private Set<String> getServiceNamesForOps(URL url) {\r\n+        Set<String> serviceNames = getAllServiceNames();\r\n+        filterServiceNames(serviceNames, url);\r\n+        return serviceNames;\r\n+    }\r\n+\r\n+    private Set<String> getAllServiceNames() {\r\n+\r\n+        final Set<String> serviceNames = new LinkedHashSet<>();\r\n+\r\n+        execute(namingService -> {\r\n+\r\n+            int pageIndex = 1;\r\n+            ListView<String> listView = namingService.getServicesOfServer(pageIndex, PAGINATION_SIZE,\r\n+                    getUrl().getParameter(GROUP_KEY, Constants.DEFAULT_GROUP));\r\n+            // First page data\r\n+            List<String> firstPageData = listView.getData();\r\n+            // Append first page into list\r\n+            serviceNames.addAll(firstPageData);\r\n+            // the total count\r\n+            int count = listView.getCount();\r\n+            // the number of pages\r\n+            int pageNumbers = count / PAGINATION_SIZE;\r\n+            int remainder = count % PAGINATION_SIZE;\r\n+            // remain\r\n+            if (remainder > 0) {\r\n+                pageNumbers += 1;\r\n+            }\r\n+            // If more than 1 page\r\n+            while (pageIndex < pageNumbers) {\r\n+                listView = namingService.getServicesOfServer(++pageIndex, PAGINATION_SIZE,\r\n+                        getUrl().getParameter(GROUP_KEY, Constants.DEFAULT_GROUP));\r\n+                serviceNames.addAll(listView.getData());\r\n+            }\r\n+\r\n+        });\r\n+\r\n+        return serviceNames;\r\n+    }\r\n+\r\n+    private void filterServiceNames(Set<String> serviceNames, URL url) {\r\n+\r\n+        final List<String> categories = getCategories(url);\r\n+\r\n+        final String targetServiceInterface = url.getServiceInterface();\r\n+\r\n+        final String targetVersion = url.getParameter(VERSION_KEY, \"\");\r\n+\r\n+        final String targetGroup = url.getParameter(GROUP_KEY, \"\");\r\n+\r\n+        filterData(serviceNames, serviceName -> {\r\n+            // split service name to segments\r\n+            // (required) segments[0] = category\r\n+            // (required) segments[1] = serviceInterface\r\n+            // (optional) segments[2] = version\r\n+            // (optional) segments[3] = group\r\n+            String[] segments = serviceName.split(SERVICE_NAME_SEPARATOR, -1);\r\n+            int length = segments.length;\r\n+            if (length != 4) { // must present 4 segments\r\n+                return false;\r\n+            }\r\n+\r\n+            String category = segments[CATEGORY_INDEX];\r\n+            if (!categories.contains(category)) { // no match category\r\n+                return false;\r\n+            }\r\n+\r\n+            String serviceInterface = segments[SERVICE_INTERFACE_INDEX];\r\n+            // no match service interface\r\n+            if (!WILDCARD.equals(targetServiceInterface) &&\r\n+                    !StringUtils.isEquals(targetServiceInterface, serviceInterface)) {\r\n+                return false;\r\n+            }\r\n+\r\n+            // no match service version\r\n+            String version = segments[SERVICE_VERSION_INDEX];\r\n+            if (!WILDCARD.equals(targetVersion) && !StringUtils.isEquals(targetVersion, version)) {\r\n+                return false;\r\n+            }\r\n+\r\n+            String group = segments[SERVICE_GROUP_INDEX];\r\n+            return group == null || WILDCARD.equals(targetGroup) || StringUtils.isEquals(targetGroup, group);\r\n+        });\r\n+    }\r\n+\r\n+    private <T> void filterData(Collection<T> collection, NacosDataFilter<T> filter) {\r\n+        // remove if not accept\r\n+        collection.removeIf(data -> !filter.accept(data));\r\n+    }\r\n+\r\n+    @Deprecated\r\n+    private List<String> doGetServiceNames(URL url) {\r\n+        List<String> categories = getCategories(url);\r\n+        List<String> serviceNames = new ArrayList<>(categories.size());\r\n+        for (String category : categories) {\r\n+            final String serviceName = getServiceName(url, category);\r\n+            serviceNames.add(serviceName);\r\n+        }\r\n+        return serviceNames;\r\n+    }\r\n+\r\n+    private List<URL> toUrlWithEmpty(URL consumerURL, Collection<Instance> instances) {\r\n+        List<URL> urls = buildURLs(consumerURL, instances);\r\n+        if (urls.size() == 0) {\r\n+            URL empty = URLBuilder.from(consumerURL)\r\n+                    .setProtocol(EMPTY_PROTOCOL)\r\n+                    .addParameter(CATEGORY_KEY, DEFAULT_CATEGORY)\r\n+                    .build();\r\n+            urls.add(empty);\r\n+        }\r\n+        return urls;\r\n+    }\r\n+\r\n+    private List<URL> buildURLs(URL consumerURL, Collection<Instance> instances) {\r\n+        List<URL> urls = new LinkedList<>();\r\n+        if (instances != null && !instances.isEmpty()) {\r\n+            for (Instance instance : instances) {\r\n+                URL url = buildURL(instance);\r\n+                if (UrlUtils.isMatch(consumerURL, url)) {\r\n+                    urls.add(url);\r\n+                }\r\n+            }\r\n+        }\r\n+        return urls;\r\n+    }\r\n+\r\n+    private void subscribeEventListener(String serviceName, final URL url, final NotifyListener listener)\r\n+            throws NacosException {\r\n+        EventListener eventListener = event -> {\r\n+            if (event instanceof NamingEvent) {\r\n+                NamingEvent e = (NamingEvent) event;\r\n+                List<Instance> instances = e.getInstances();\r\n+\r\n+\r\n+                if (isServiceNamesWithCompatibleMode(url)) {\r\n+                    /**\r\n+                     * Get all instances with corresponding serviceNames to avoid instance overwrite and but with empty instance mentioned\r\n+                     * in https://github.com/apache/dubbo/issues/5885 and https://github.com/apache/dubbo/issues/5899\r\n+                     */\r\n+                    NacosInstanceManageUtil.initOrRefreshServiceInstanceList(serviceName, instances);\r\n+                    instances = NacosInstanceManageUtil.getAllCorrespondingServiceInstanceList(serviceName);\r\n+                }\r\n+\r\n+                notifySubscriber(url, listener, instances);\r\n+            }\r\n+        };\r\n+        namingService.subscribe(serviceName,\r\n+                getUrl().getParameter(GROUP_KEY, Constants.DEFAULT_GROUP),\r\n+                eventListener);\r\n+    }\r\n+\r\n+    /**\r\n+     * Notify the Enabled {@link Instance instances} to subscriber.\r\n+     *\r\n+     * @param url       {@link URL}\r\n+     * @param listener  {@link NotifyListener}\r\n+     * @param instances all {@link Instance instances}\r\n+     */\r\n+    private void notifySubscriber(URL url, NotifyListener listener, Collection<Instance> instances) {\r\n+        List<Instance> enabledInstances = new LinkedList<>(instances);\r\n+        if (enabledInstances.size() > 0) {\r\n+            //  Instances\r\n+            filterEnabledInstances(enabledInstances);\r\n+        }\r\n+        List<URL> urls = toUrlWithEmpty(url, enabledInstances);\r\n+        NacosRegistry.this.notify(url, listener, urls);\r\n+    }\r\n+\r\n+    /**\r\n+     * Get the categories from {@link URL}\r\n+     *\r\n+     * @param url {@link URL}\r\n+     * @return non-null array\r\n+     */\r\n+    private List<String> getCategories(URL url) {\r\n+        return ANY_VALUE.equals(url.getServiceInterface()) ?\r\n+                ALL_SUPPORTED_CATEGORIES : Arrays.asList(DEFAULT_CATEGORY);\r\n+    }\r\n+\r\n+    private URL buildURL(Instance instance) {\r\n+        Map<String, String> metadata = instance.getMetadata();\r\n+        String protocol = metadata.get(PROTOCOL_KEY);\r\n+        String path = metadata.get(PATH_KEY);\r\n+        return new URL(protocol,\r\n+                instance.getIp(),\r\n+                instance.getPort(),\r\n+                path,\r\n+                instance.getMetadata());\r\n+    }\r\n+\r\n+    private Instance createInstance(URL url) {\r\n+        // Append default category if absent\r\n+        String category = url.getParameter(CATEGORY_KEY, DEFAULT_CATEGORY);\r\n+        URL newURL = url.addParameter(CATEGORY_KEY, category);\r\n+        newURL = newURL.addParameter(PROTOCOL_KEY, url.getProtocol());\r\n+        newURL = newURL.addParameter(PATH_KEY, url.getPath());\r\n+        newURL = newURL.addParameters(NacosNamingServiceUtils.getNacosPreservedParam(getUrl()));\r\n+        String ip = url.getHost();\r\n+        int port = url.getPort();\r\n+        Instance instance = new Instance();\r\n+        instance.setIp(ip);\r\n+        instance.setPort(port);\r\n+        instance.setMetadata(new HashMap<>(newURL.getParameters()));\r\n+        return instance;\r\n+    }\r\n+\r\n+    private NacosServiceName createServiceName(URL url) {\r\n+        return valueOf(url);\r\n+    }\r\n+\r\n+    private String getServiceName(URL url) {\r\n+        return getServiceName(url, url.getParameter(CATEGORY_KEY, DEFAULT_CATEGORY));\r\n+    }\r\n+\r\n+    private String getServiceName(URL url, String category) {\r\n+        return category + SERVICE_NAME_SEPARATOR + url.getColonSeparatedKey();\r\n+    }\r\n+\r\n+    private void execute(NamingServiceCallback callback) {\r\n+        try {\r\n+            callback.callback(namingService);\r\n+        } catch (NacosException e) {\r\n+            if (logger.isErrorEnabled()) {\r\n+                logger.error(e.getErrMsg(), e);\r\n+            }\r\n+        }\r\n+    }\r\n+\r\n+    private void filterEnabledInstances(Collection<Instance> instances) {\r\n+        filterData(instances, Instance::isEnabled);\r\n+    }\r\n+\r\n+    /**\r\n+     * A filter for Nacos data\r\n+     *\r\n+     * @since 2.6.5\r\n+     */\r\n+    private interface NacosDataFilter<T> {\r\n+\r\n+        /**\r\n+         * Tests whether or not the specified data should be accepted.\r\n+         *\r\n+         * @param data The data to be tested\r\n+         * @return <code>true</code> if and only if <code>data</code>\r\n+         * should be accepted\r\n+         */\r\n+        boolean accept(T data);\r\n+\r\n+    }\r\n+\r\n+    /**\r\n+     * {@link NamingService} Callback\r\n+     *\r\n+     * @since 2.6.5\r\n+     */\r\n+    interface NamingServiceCallback {\r\n+\r\n+        /**\r\n+         * Callback\r\n+         *\r\n+         * @param namingService {@link NamingService}\r\n+         * @throws NacosException\r\n+         */\r\n+        void callback(NacosNamingServiceWrapper namingService) throws NacosException;\r\n+\r\n+    }\r\n+}\r\n"}, {"source1": "org/apache/dubbo/registry/nacos/NacosRegistryFactory.java", "source2": "org/apache/dubbo/registry/nacos/NacosRegistryFactory.java", "comments": ["Ordering differences only"], "unified_diff": "@@ -1,49 +1,49 @@\n-/*\n- * Licensed to the Apache Software Foundation (ASF) under one or more\n- * contributor license agreements.  See the NOTICE file distributed with\n- * this work for additional information regarding copyright ownership.\n- * The ASF licenses this file to You under the Apache License, Version 2.0\n- * (the \"License\"); you may not use this file except in compliance with\n- * the License.  You may obtain a copy of the License at\n- *\n- *     http://www.apache.org/licenses/LICENSE-2.0\n- *\n- * Unless required by applicable law or agreed to in writing, software\n- * distributed under the License is distributed on an \"AS IS\" BASIS,\n- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n- * See the License for the specific language governing permissions and\n- * limitations under the License.\n- */\n-package org.apache.dubbo.registry.nacos;\n-\n-import org.apache.dubbo.common.URL;\n-import org.apache.dubbo.common.utils.StringUtils;\n-import org.apache.dubbo.registry.Registry;\n-import org.apache.dubbo.registry.RegistryFactory;\n-import org.apache.dubbo.registry.support.AbstractRegistryFactory;\n-\n-import static org.apache.dubbo.common.constants.CommonConstants.CONFIG_NAMESPACE_KEY;\n-import static org.apache.dubbo.registry.nacos.util.NacosNamingServiceUtils.createNamingService;\n-\n-/**\n- * Nacos {@link RegistryFactory}\n- *\n- * @since 2.6.5\n- */\n-public class NacosRegistryFactory extends AbstractRegistryFactory {\n-\n-    @Override\n-    protected String createRegistryCacheKey(URL url) {\n-        String namespace = url.getParameter(CONFIG_NAMESPACE_KEY);\n-        url = URL.valueOf(url.toServiceStringWithoutResolving());\n-        if (StringUtils.isNotEmpty(namespace)) {\n-            url = url.addParameter(CONFIG_NAMESPACE_KEY, namespace);\n-        }\n-        return url.toFullString();\n-    }\n-\n-    @Override\n-    protected Registry createRegistry(URL url) {\n-        return new NacosRegistry(url, createNamingService(url));\n-    }\n-}\n+/*\r\n+ * Licensed to the Apache Software Foundation (ASF) under one or more\r\n+ * contributor license agreements.  See the NOTICE file distributed with\r\n+ * this work for additional information regarding copyright ownership.\r\n+ * The ASF licenses this file to You under the Apache License, Version 2.0\r\n+ * (the \"License\"); you may not use this file except in compliance with\r\n+ * the License.  You may obtain a copy of the License at\r\n+ *\r\n+ *     http://www.apache.org/licenses/LICENSE-2.0\r\n+ *\r\n+ * Unless required by applicable law or agreed to in writing, software\r\n+ * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n+ * See the License for the specific language governing permissions and\r\n+ * limitations under the License.\r\n+ */\r\n+package org.apache.dubbo.registry.nacos;\r\n+\r\n+import org.apache.dubbo.common.URL;\r\n+import org.apache.dubbo.common.utils.StringUtils;\r\n+import org.apache.dubbo.registry.Registry;\r\n+import org.apache.dubbo.registry.RegistryFactory;\r\n+import org.apache.dubbo.registry.support.AbstractRegistryFactory;\r\n+\r\n+import static org.apache.dubbo.common.constants.CommonConstants.CONFIG_NAMESPACE_KEY;\r\n+import static org.apache.dubbo.registry.nacos.util.NacosNamingServiceUtils.createNamingService;\r\n+\r\n+/**\r\n+ * Nacos {@link RegistryFactory}\r\n+ *\r\n+ * @since 2.6.5\r\n+ */\r\n+public class NacosRegistryFactory extends AbstractRegistryFactory {\r\n+\r\n+    @Override\r\n+    protected String createRegistryCacheKey(URL url) {\r\n+        String namespace = url.getParameter(CONFIG_NAMESPACE_KEY);\r\n+        url = URL.valueOf(url.toServiceStringWithoutResolving());\r\n+        if (StringUtils.isNotEmpty(namespace)) {\r\n+            url = url.addParameter(CONFIG_NAMESPACE_KEY, namespace);\r\n+        }\r\n+        return url.toFullString();\r\n+    }\r\n+\r\n+    @Override\r\n+    protected Registry createRegistry(URL url) {\r\n+        return new NacosRegistry(url, createNamingService(url));\r\n+    }\r\n+}\r\n"}, {"source1": "org/apache/dubbo/registry/nacos/NacosServiceDiscovery.java", "source2": "org/apache/dubbo/registry/nacos/NacosServiceDiscovery.java", "comments": ["Ordering differences only"], "unified_diff": "@@ -1,154 +1,154 @@\n-/*\n- * Licensed to the Apache Software Foundation (ASF) under one or more\n- * contributor license agreements.  See the NOTICE file distributed with\n- * this work for additional information regarding copyright ownership.\n- * The ASF licenses this file to You under the Apache License, Version 2.0\n- * (the \"License\"); you may not use this file except in compliance with\n- * the License.  You may obtain a copy of the License at\n- *\n- *     http://www.apache.org/licenses/LICENSE-2.0\n- *\n- * Unless required by applicable law or agreed to in writing, software\n- * distributed under the License is distributed on an \"AS IS\" BASIS,\n- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n- * See the License for the specific language governing permissions and\n- * limitations under the License.\n- */\n-package org.apache.dubbo.registry.nacos;\n-\n-import org.apache.dubbo.common.URL;\n-import org.apache.dubbo.common.function.ThrowableFunction;\n-import org.apache.dubbo.common.logger.Logger;\n-import org.apache.dubbo.common.logger.LoggerFactory;\n-import org.apache.dubbo.registry.client.AbstractServiceDiscovery;\n-import org.apache.dubbo.registry.client.ServiceDiscovery;\n-import org.apache.dubbo.registry.client.ServiceInstance;\n-import org.apache.dubbo.registry.client.event.listener.ServiceInstancesChangedListener;\n-import org.apache.dubbo.registry.nacos.util.NacosNamingServiceUtils;\n-\n-import com.alibaba.nacos.api.exception.NacosException;\n-import com.alibaba.nacos.api.naming.listener.NamingEvent;\n-import com.alibaba.nacos.api.naming.pojo.Instance;\n-import com.alibaba.nacos.api.naming.pojo.ListView;\n-\n-import java.util.LinkedHashSet;\n-import java.util.List;\n-import java.util.Map;\n-import java.util.Set;\n-import java.util.stream.Collectors;\n-\n-import static org.apache.dubbo.common.function.ThrowableConsumer.execute;\n-import static org.apache.dubbo.registry.nacos.util.NacosNamingServiceUtils.createNamingService;\n-import static org.apache.dubbo.registry.nacos.util.NacosNamingServiceUtils.getGroup;\n-import static org.apache.dubbo.registry.nacos.util.NacosNamingServiceUtils.toInstance;\n-\n-/**\n- * Nacos {@link ServiceDiscovery} implementation\n- *\n- * @see ServiceDiscovery\n- * @since 2.7.5\n- */\n-public class NacosServiceDiscovery extends AbstractServiceDiscovery {\n-\n-    private final Logger logger = LoggerFactory.getLogger(getClass());\n-\n-    private String group;\n-\n-    private NacosNamingServiceWrapper namingService;\n-\n-    private URL registryURL;\n-\n-    @Override\n-    public void initialize(URL registryURL) throws Exception {\n-        this.namingService = createNamingService(registryURL);\n-        this.group = getGroup(registryURL);\n-        this.registryURL = registryURL;\n-    }\n-\n-    @Override\n-    public void destroy() {\n-        this.namingService = null;\n-    }\n-\n-    @Override\n-    public void doRegister(ServiceInstance serviceInstance) {\n-        execute(namingService, service -> {\n-            Instance instance = toInstance(serviceInstance);\n-            appendPreservedParam(instance);\n-            service.registerInstance(instance.getServiceName(), group, instance);\n-        });\n-    }\n-\n-    @Override\n-    public void doUpdate(ServiceInstance serviceInstance) {\n-        if (this.serviceInstance == null) {\n-            register(serviceInstance);\n-        } else {\n-            unregister(serviceInstance);\n-            register(serviceInstance);\n-        }\n-    }\n-\n-    @Override\n-    public void unregister(ServiceInstance serviceInstance) throws RuntimeException {\n-        execute(namingService, service -> {\n-            Instance instance = toInstance(serviceInstance);\n-            service.deregisterInstance(instance.getServiceName(), group, instance);\n-        });\n-    }\n-\n-    @Override\n-    public Set<String> getServices() {\n-        return ThrowableFunction.execute(namingService, service -> {\n-            ListView<String> view = service.getServicesOfServer(0, Integer.MAX_VALUE, group);\n-            return new LinkedHashSet<>(view.getData());\n-        });\n-    }\n-\n-    @Override\n-    public List<ServiceInstance> getInstances(String serviceName) throws NullPointerException {\n-        return ThrowableFunction.execute(namingService, service ->\n-                service.selectInstances(serviceName, true)\n-                        .stream().map(NacosNamingServiceUtils::toServiceInstance)\n-                        .collect(Collectors.toList())\n-        );\n-    }\n-\n-    @Override\n-    public void addServiceInstancesChangedListener(ServiceInstancesChangedListener listener)\n-            throws NullPointerException, IllegalArgumentException {\n-        execute(namingService, service -> {\n-            listener.getServiceNames().forEach(serviceName -> {\n-                try {\n-                    service.subscribe(serviceName, e -> { // Register Nacos EventListener\n-                        if (e instanceof NamingEvent) {\n-                            NamingEvent event = (NamingEvent) e;\n-                            handleEvent(event, listener);\n-                        }\n-                    });\n-                } catch (NacosException e) {\n-                    e.printStackTrace();\n-                }\n-            });\n-        });\n-    }\n-\n-    @Override\n-    public URL getUrl() {\n-        return registryURL;\n-    }\n-\n-    private void handleEvent(NamingEvent event, ServiceInstancesChangedListener listener) {\n-        String serviceName = event.getServiceName();\n-        List<ServiceInstance> serviceInstances = event.getInstances()\n-                .stream()\n-                .map(NacosNamingServiceUtils::toServiceInstance)\n-                .collect(Collectors.toList());\n-        dispatchServiceInstancesChangedEvent(serviceName, serviceInstances);\n-    }\n-\n-    private void appendPreservedParam(Instance instance) {\n-        Map<String, String> preservedParam = NacosNamingServiceUtils.getNacosPreservedParam(getUrl());\n-        instance.getMetadata().putAll(preservedParam);\n-    }\n-}\n+/*\r\n+ * Licensed to the Apache Software Foundation (ASF) under one or more\r\n+ * contributor license agreements.  See the NOTICE file distributed with\r\n+ * this work for additional information regarding copyright ownership.\r\n+ * The ASF licenses this file to You under the Apache License, Version 2.0\r\n+ * (the \"License\"); you may not use this file except in compliance with\r\n+ * the License.  You may obtain a copy of the License at\r\n+ *\r\n+ *     http://www.apache.org/licenses/LICENSE-2.0\r\n+ *\r\n+ * Unless required by applicable law or agreed to in writing, software\r\n+ * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n+ * See the License for the specific language governing permissions and\r\n+ * limitations under the License.\r\n+ */\r\n+package org.apache.dubbo.registry.nacos;\r\n+\r\n+import org.apache.dubbo.common.URL;\r\n+import org.apache.dubbo.common.function.ThrowableFunction;\r\n+import org.apache.dubbo.common.logger.Logger;\r\n+import org.apache.dubbo.common.logger.LoggerFactory;\r\n+import org.apache.dubbo.registry.client.AbstractServiceDiscovery;\r\n+import org.apache.dubbo.registry.client.ServiceDiscovery;\r\n+import org.apache.dubbo.registry.client.ServiceInstance;\r\n+import org.apache.dubbo.registry.client.event.listener.ServiceInstancesChangedListener;\r\n+import org.apache.dubbo.registry.nacos.util.NacosNamingServiceUtils;\r\n+\r\n+import com.alibaba.nacos.api.exception.NacosException;\r\n+import com.alibaba.nacos.api.naming.listener.NamingEvent;\r\n+import com.alibaba.nacos.api.naming.pojo.Instance;\r\n+import com.alibaba.nacos.api.naming.pojo.ListView;\r\n+\r\n+import java.util.LinkedHashSet;\r\n+import java.util.List;\r\n+import java.util.Map;\r\n+import java.util.Set;\r\n+import java.util.stream.Collectors;\r\n+\r\n+import static org.apache.dubbo.common.function.ThrowableConsumer.execute;\r\n+import static org.apache.dubbo.registry.nacos.util.NacosNamingServiceUtils.createNamingService;\r\n+import static org.apache.dubbo.registry.nacos.util.NacosNamingServiceUtils.getGroup;\r\n+import static org.apache.dubbo.registry.nacos.util.NacosNamingServiceUtils.toInstance;\r\n+\r\n+/**\r\n+ * Nacos {@link ServiceDiscovery} implementation\r\n+ *\r\n+ * @see ServiceDiscovery\r\n+ * @since 2.7.5\r\n+ */\r\n+public class NacosServiceDiscovery extends AbstractServiceDiscovery {\r\n+\r\n+    private final Logger logger = LoggerFactory.getLogger(getClass());\r\n+\r\n+    private String group;\r\n+\r\n+    private NacosNamingServiceWrapper namingService;\r\n+\r\n+    private URL registryURL;\r\n+\r\n+    @Override\r\n+    public void initialize(URL registryURL) throws Exception {\r\n+        this.namingService = createNamingService(registryURL);\r\n+        this.group = getGroup(registryURL);\r\n+        this.registryURL = registryURL;\r\n+    }\r\n+\r\n+    @Override\r\n+    public void destroy() {\r\n+        this.namingService = null;\r\n+    }\r\n+\r\n+    @Override\r\n+    public void doRegister(ServiceInstance serviceInstance) {\r\n+        execute(namingService, service -> {\r\n+            Instance instance = toInstance(serviceInstance);\r\n+            appendPreservedParam(instance);\r\n+            service.registerInstance(instance.getServiceName(), group, instance);\r\n+        });\r\n+    }\r\n+\r\n+    @Override\r\n+    public void doUpdate(ServiceInstance serviceInstance) {\r\n+        if (this.serviceInstance == null) {\r\n+            register(serviceInstance);\r\n+        } else {\r\n+            unregister(serviceInstance);\r\n+            register(serviceInstance);\r\n+        }\r\n+    }\r\n+\r\n+    @Override\r\n+    public void unregister(ServiceInstance serviceInstance) throws RuntimeException {\r\n+        execute(namingService, service -> {\r\n+            Instance instance = toInstance(serviceInstance);\r\n+            service.deregisterInstance(instance.getServiceName(), group, instance);\r\n+        });\r\n+    }\r\n+\r\n+    @Override\r\n+    public Set<String> getServices() {\r\n+        return ThrowableFunction.execute(namingService, service -> {\r\n+            ListView<String> view = service.getServicesOfServer(0, Integer.MAX_VALUE, group);\r\n+            return new LinkedHashSet<>(view.getData());\r\n+        });\r\n+    }\r\n+\r\n+    @Override\r\n+    public List<ServiceInstance> getInstances(String serviceName) throws NullPointerException {\r\n+        return ThrowableFunction.execute(namingService, service ->\r\n+                service.selectInstances(serviceName, true)\r\n+                        .stream().map(NacosNamingServiceUtils::toServiceInstance)\r\n+                        .collect(Collectors.toList())\r\n+        );\r\n+    }\r\n+\r\n+    @Override\r\n+    public void addServiceInstancesChangedListener(ServiceInstancesChangedListener listener)\r\n+            throws NullPointerException, IllegalArgumentException {\r\n+        execute(namingService, service -> {\r\n+            listener.getServiceNames().forEach(serviceName -> {\r\n+                try {\r\n+                    service.subscribe(serviceName, e -> { // Register Nacos EventListener\r\n+                        if (e instanceof NamingEvent) {\r\n+                            NamingEvent event = (NamingEvent) e;\r\n+                            handleEvent(event, listener);\r\n+                        }\r\n+                    });\r\n+                } catch (NacosException e) {\r\n+                    e.printStackTrace();\r\n+                }\r\n+            });\r\n+        });\r\n+    }\r\n+\r\n+    @Override\r\n+    public URL getUrl() {\r\n+        return registryURL;\r\n+    }\r\n+\r\n+    private void handleEvent(NamingEvent event, ServiceInstancesChangedListener listener) {\r\n+        String serviceName = event.getServiceName();\r\n+        List<ServiceInstance> serviceInstances = event.getInstances()\r\n+                .stream()\r\n+                .map(NacosNamingServiceUtils::toServiceInstance)\r\n+                .collect(Collectors.toList());\r\n+        dispatchServiceInstancesChangedEvent(serviceName, serviceInstances);\r\n+    }\r\n+\r\n+    private void appendPreservedParam(Instance instance) {\r\n+        Map<String, String> preservedParam = NacosNamingServiceUtils.getNacosPreservedParam(getUrl());\r\n+        instance.getMetadata().putAll(preservedParam);\r\n+    }\r\n+}\r\n"}, {"source1": "org/apache/dubbo/registry/nacos/NacosServiceDiscoveryFactory.java", "source2": "org/apache/dubbo/registry/nacos/NacosServiceDiscoveryFactory.java", "comments": ["Ordering differences only"], "unified_diff": "@@ -1,33 +1,33 @@\n-/*\n- * Licensed to the Apache Software Foundation (ASF) under one or more\n- * contributor license agreements.  See the NOTICE file distributed with\n- * this work for additional information regarding copyright ownership.\n- * The ASF licenses this file to You under the Apache License, Version 2.0\n- * (the \"License\"); you may not use this file except in compliance with\n- * the License.  You may obtain a copy of the License at\n- *\n- *     http://www.apache.org/licenses/LICENSE-2.0\n- *\n- * Unless required by applicable law or agreed to in writing, software\n- * distributed under the License is distributed on an \"AS IS\" BASIS,\n- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n- * See the License for the specific language governing permissions and\n- * limitations under the License.\n- */\n-package org.apache.dubbo.registry.nacos;\n-\n-import org.apache.dubbo.common.URL;\n-import org.apache.dubbo.registry.client.AbstractServiceDiscoveryFactory;\n-import org.apache.dubbo.registry.client.ServiceDiscovery;\n-\n-/**\n- *\n- */\n-public class NacosServiceDiscoveryFactory extends AbstractServiceDiscoveryFactory {\n-\n-    @Override\n-    protected ServiceDiscovery createDiscovery(URL registryURL) {\n-        return new NacosServiceDiscovery();\n-    }\n-\n-}\n+/*\r\n+ * Licensed to the Apache Software Foundation (ASF) under one or more\r\n+ * contributor license agreements.  See the NOTICE file distributed with\r\n+ * this work for additional information regarding copyright ownership.\r\n+ * The ASF licenses this file to You under the Apache License, Version 2.0\r\n+ * (the \"License\"); you may not use this file except in compliance with\r\n+ * the License.  You may obtain a copy of the License at\r\n+ *\r\n+ *     http://www.apache.org/licenses/LICENSE-2.0\r\n+ *\r\n+ * Unless required by applicable law or agreed to in writing, software\r\n+ * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n+ * See the License for the specific language governing permissions and\r\n+ * limitations under the License.\r\n+ */\r\n+package org.apache.dubbo.registry.nacos;\r\n+\r\n+import org.apache.dubbo.common.URL;\r\n+import org.apache.dubbo.registry.client.AbstractServiceDiscoveryFactory;\r\n+import org.apache.dubbo.registry.client.ServiceDiscovery;\r\n+\r\n+/**\r\n+ *\r\n+ */\r\n+public class NacosServiceDiscoveryFactory extends AbstractServiceDiscoveryFactory {\r\n+\r\n+    @Override\r\n+    protected ServiceDiscovery createDiscovery(URL registryURL) {\r\n+        return new NacosServiceDiscovery();\r\n+    }\r\n+\r\n+}\r\n"}, {"source1": "org/apache/dubbo/registry/nacos/NacosServiceName.java", "source2": "org/apache/dubbo/registry/nacos/NacosServiceName.java", "comments": ["Ordering differences only"], "unified_diff": "@@ -1,234 +1,234 @@\n-/*\n- * Licensed to the Apache Software Foundation (ASF) under one or more\n- * contributor license agreements.  See the NOTICE file distributed with\n- * this work for additional information regarding copyright ownership.\n- * The ASF licenses this file to You under the Apache License, Version 2.0\n- * (the \"License\"); you may not use this file except in compliance with\n- * the License.  You may obtain a copy of the License at\n- *\n- *     http://www.apache.org/licenses/LICENSE-2.0\n- *\n- * Unless required by applicable law or agreed to in writing, software\n- * distributed under the License is distributed on an \"AS IS\" BASIS,\n- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n- * See the License for the specific language governing permissions and\n- * limitations under the License.\n- */\n-package org.apache.dubbo.registry.nacos;\n-\n-import org.apache.dubbo.common.URL;\n-import org.apache.dubbo.common.utils.StringUtils;\n-\n-import java.util.Arrays;\n-import java.util.Objects;\n-\n-import static org.apache.dubbo.common.constants.CommonConstants.GROUP_KEY;\n-import static org.apache.dubbo.common.constants.CommonConstants.INTERFACE_KEY;\n-import static org.apache.dubbo.common.constants.CommonConstants.VERSION_KEY;\n-import static org.apache.dubbo.common.constants.RegistryConstants.CATEGORY_KEY;\n-import static org.apache.dubbo.common.constants.RegistryConstants.DEFAULT_CATEGORY;\n-import static org.apache.dubbo.common.utils.StringUtils.isBlank;\n-\n-/**\n- * The service name of Nacos\n- *\n- * @since 2.7.3\n- */\n-public class NacosServiceName {\n-\n-    public static final String NAME_SEPARATOR = \":\";\n-\n-    public static final String VALUE_SEPARATOR = \",\";\n-\n-    public static final String WILDCARD = \"*\";\n-\n-    public static final String DEFAULT_PARAM_VALUE = \"\";\n-\n-    private static final int CATEGORY_INDEX = 0;\n-\n-    private static final int SERVICE_INTERFACE_INDEX = 1;\n-\n-    private static final int SERVICE_VERSION_INDEX = 2;\n-\n-    private static final int SERVICE_GROUP_INDEX = 3;\n-\n-    private String category;\n-\n-    private String serviceInterface;\n-\n-    private String version;\n-\n-    private String group;\n-\n-    private String value;\n-\n-    public NacosServiceName() {\n-    }\n-\n-    public NacosServiceName(URL url) {\n-        serviceInterface = url.getParameter(INTERFACE_KEY);\n-        category = isConcrete(serviceInterface) ? DEFAULT_CATEGORY : url.getParameter(CATEGORY_KEY);\n-        version = url.getParameter(VERSION_KEY, DEFAULT_PARAM_VALUE);\n-        group = url.getParameter(GROUP_KEY, DEFAULT_PARAM_VALUE);\n-        value = toValue();\n-    }\n-\n-    public NacosServiceName(String value) {\n-        this.value = value;\n-        String[] segments = value.split(NAME_SEPARATOR, -1);\n-        this.category = segments[CATEGORY_INDEX];\n-        this.serviceInterface = segments[SERVICE_INTERFACE_INDEX];\n-        this.version = segments[SERVICE_VERSION_INDEX];\n-        this.group = segments[SERVICE_GROUP_INDEX];\n-    }\n-\n-    /**\n-     * Build an instance of {@link NacosServiceName}\n-     *\n-     * @param url\n-     * @return\n-     */\n-    public static NacosServiceName valueOf(URL url) {\n-        return new NacosServiceName(url);\n-    }\n-\n-    /**\n-     * Is the concrete service name or not\n-     *\n-     * @return if concrete , return <code>true</code>, or <code>false</code>\n-     */\n-    public boolean isConcrete() {\n-        return isConcrete(serviceInterface) && isConcrete(version) && isConcrete(group);\n-    }\n-\n-    public boolean isCompatible(NacosServiceName concreteServiceName) {\n-\n-        if (!concreteServiceName.isConcrete()) { // The argument must be the concrete NacosServiceName\n-            return false;\n-        }\n-\n-        // Not match comparison\n-        if (!StringUtils.isEquals(this.category, concreteServiceName.category)\n-                && !matchRange(this.category, concreteServiceName.category)) {\n-            return false;\n-        }\n-\n-        if (!StringUtils.isEquals(this.serviceInterface, concreteServiceName.serviceInterface)) {\n-            return false;\n-        }\n-\n-        // wildcard condition\n-        if (isWildcard(this.version)) {\n-            return true;\n-        }\n-\n-        if (isWildcard(this.group)) {\n-            return true;\n-        }\n-\n-        // range condition\n-        if (!StringUtils.isEquals(this.version, concreteServiceName.version)\n-                && !matchRange(this.version, concreteServiceName.version)) {\n-            return false;\n-        }\n-\n-        if (!StringUtils.isEquals(this.group, concreteServiceName.group) &&\n-                !matchRange(this.group, concreteServiceName.group)) {\n-            return false;\n-        }\n-\n-        return true;\n-    }\n-\n-    private boolean matchRange(String range, String value) {\n-        if (isBlank(range)) {\n-            return true;\n-        }\n-        if (!isRange(range)) {\n-            return false;\n-        }\n-        String[] values = range.split(VALUE_SEPARATOR);\n-        return Arrays.asList(values).contains(value);\n-    }\n-\n-    private boolean isConcrete(String value) {\n-        return !isWildcard(value) && !isRange(value);\n-    }\n-\n-    private boolean isWildcard(String value) {\n-        return WILDCARD.equals(value);\n-    }\n-\n-    private boolean isRange(String value) {\n-        return value != null && value.indexOf(VALUE_SEPARATOR) > -1 && value.split(VALUE_SEPARATOR).length > 1;\n-    }\n-\n-    public String getCategory() {\n-        return category;\n-    }\n-\n-    public void setCategory(String category) {\n-        this.category = category;\n-    }\n-\n-    public String getServiceInterface() {\n-        return serviceInterface;\n-    }\n-\n-    public void setServiceInterface(String serviceInterface) {\n-        this.serviceInterface = serviceInterface;\n-    }\n-\n-    public String getVersion() {\n-        return version;\n-    }\n-\n-    public void setVersion(String version) {\n-        this.version = version;\n-    }\n-\n-    public String getGroup() {\n-        return group;\n-    }\n-\n-    public void setGroup(String group) {\n-        this.group = group;\n-    }\n-\n-    public String getValue() {\n-        if (value == null) {\n-            value = toValue();\n-        }\n-        return value;\n-    }\n-\n-    private String toValue() {\n-        return new StringBuilder(category)\n-                .append(NAME_SEPARATOR).append(serviceInterface)\n-                .append(NAME_SEPARATOR).append(version)\n-                .append(NAME_SEPARATOR).append(group)\n-                .toString();\n-    }\n-\n-    @Override\n-    public boolean equals(Object o) {\n-        if (this == o) {\n-            return true;\n-        }\n-        if (!(o instanceof NacosServiceName)) {\n-            return false;\n-        }\n-        NacosServiceName that = (NacosServiceName) o;\n-        return Objects.equals(getValue(), that.getValue());\n-    }\n-\n-    @Override\n-    public int hashCode() {\n-        return Objects.hash(getValue());\n-    }\n-\n-    @Override\n-    public String toString() {\n-        return getValue();\n-    }\n-}\n+/*\r\n+ * Licensed to the Apache Software Foundation (ASF) under one or more\r\n+ * contributor license agreements.  See the NOTICE file distributed with\r\n+ * this work for additional information regarding copyright ownership.\r\n+ * The ASF licenses this file to You under the Apache License, Version 2.0\r\n+ * (the \"License\"); you may not use this file except in compliance with\r\n+ * the License.  You may obtain a copy of the License at\r\n+ *\r\n+ *     http://www.apache.org/licenses/LICENSE-2.0\r\n+ *\r\n+ * Unless required by applicable law or agreed to in writing, software\r\n+ * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n+ * See the License for the specific language governing permissions and\r\n+ * limitations under the License.\r\n+ */\r\n+package org.apache.dubbo.registry.nacos;\r\n+\r\n+import org.apache.dubbo.common.URL;\r\n+import org.apache.dubbo.common.utils.StringUtils;\r\n+\r\n+import java.util.Arrays;\r\n+import java.util.Objects;\r\n+\r\n+import static org.apache.dubbo.common.constants.CommonConstants.GROUP_KEY;\r\n+import static org.apache.dubbo.common.constants.CommonConstants.INTERFACE_KEY;\r\n+import static org.apache.dubbo.common.constants.CommonConstants.VERSION_KEY;\r\n+import static org.apache.dubbo.common.constants.RegistryConstants.CATEGORY_KEY;\r\n+import static org.apache.dubbo.common.constants.RegistryConstants.DEFAULT_CATEGORY;\r\n+import static org.apache.dubbo.common.utils.StringUtils.isBlank;\r\n+\r\n+/**\r\n+ * The service name of Nacos\r\n+ *\r\n+ * @since 2.7.3\r\n+ */\r\n+public class NacosServiceName {\r\n+\r\n+    public static final String NAME_SEPARATOR = \":\";\r\n+\r\n+    public static final String VALUE_SEPARATOR = \",\";\r\n+\r\n+    public static final String WILDCARD = \"*\";\r\n+\r\n+    public static final String DEFAULT_PARAM_VALUE = \"\";\r\n+\r\n+    private static final int CATEGORY_INDEX = 0;\r\n+\r\n+    private static final int SERVICE_INTERFACE_INDEX = 1;\r\n+\r\n+    private static final int SERVICE_VERSION_INDEX = 2;\r\n+\r\n+    private static final int SERVICE_GROUP_INDEX = 3;\r\n+\r\n+    private String category;\r\n+\r\n+    private String serviceInterface;\r\n+\r\n+    private String version;\r\n+\r\n+    private String group;\r\n+\r\n+    private String value;\r\n+\r\n+    public NacosServiceName() {\r\n+    }\r\n+\r\n+    public NacosServiceName(URL url) {\r\n+        serviceInterface = url.getParameter(INTERFACE_KEY);\r\n+        category = isConcrete(serviceInterface) ? DEFAULT_CATEGORY : url.getParameter(CATEGORY_KEY);\r\n+        version = url.getParameter(VERSION_KEY, DEFAULT_PARAM_VALUE);\r\n+        group = url.getParameter(GROUP_KEY, DEFAULT_PARAM_VALUE);\r\n+        value = toValue();\r\n+    }\r\n+\r\n+    public NacosServiceName(String value) {\r\n+        this.value = value;\r\n+        String[] segments = value.split(NAME_SEPARATOR, -1);\r\n+        this.category = segments[CATEGORY_INDEX];\r\n+        this.serviceInterface = segments[SERVICE_INTERFACE_INDEX];\r\n+        this.version = segments[SERVICE_VERSION_INDEX];\r\n+        this.group = segments[SERVICE_GROUP_INDEX];\r\n+    }\r\n+\r\n+    /**\r\n+     * Build an instance of {@link NacosServiceName}\r\n+     *\r\n+     * @param url\r\n+     * @return\r\n+     */\r\n+    public static NacosServiceName valueOf(URL url) {\r\n+        return new NacosServiceName(url);\r\n+    }\r\n+\r\n+    /**\r\n+     * Is the concrete service name or not\r\n+     *\r\n+     * @return if concrete , return <code>true</code>, or <code>false</code>\r\n+     */\r\n+    public boolean isConcrete() {\r\n+        return isConcrete(serviceInterface) && isConcrete(version) && isConcrete(group);\r\n+    }\r\n+\r\n+    public boolean isCompatible(NacosServiceName concreteServiceName) {\r\n+\r\n+        if (!concreteServiceName.isConcrete()) { // The argument must be the concrete NacosServiceName\r\n+            return false;\r\n+        }\r\n+\r\n+        // Not match comparison\r\n+        if (!StringUtils.isEquals(this.category, concreteServiceName.category)\r\n+                && !matchRange(this.category, concreteServiceName.category)) {\r\n+            return false;\r\n+        }\r\n+\r\n+        if (!StringUtils.isEquals(this.serviceInterface, concreteServiceName.serviceInterface)) {\r\n+            return false;\r\n+        }\r\n+\r\n+        // wildcard condition\r\n+        if (isWildcard(this.version)) {\r\n+            return true;\r\n+        }\r\n+\r\n+        if (isWildcard(this.group)) {\r\n+            return true;\r\n+        }\r\n+\r\n+        // range condition\r\n+        if (!StringUtils.isEquals(this.version, concreteServiceName.version)\r\n+                && !matchRange(this.version, concreteServiceName.version)) {\r\n+            return false;\r\n+        }\r\n+\r\n+        if (!StringUtils.isEquals(this.group, concreteServiceName.group) &&\r\n+                !matchRange(this.group, concreteServiceName.group)) {\r\n+            return false;\r\n+        }\r\n+\r\n+        return true;\r\n+    }\r\n+\r\n+    private boolean matchRange(String range, String value) {\r\n+        if (isBlank(range)) {\r\n+            return true;\r\n+        }\r\n+        if (!isRange(range)) {\r\n+            return false;\r\n+        }\r\n+        String[] values = range.split(VALUE_SEPARATOR);\r\n+        return Arrays.asList(values).contains(value);\r\n+    }\r\n+\r\n+    private boolean isConcrete(String value) {\r\n+        return !isWildcard(value) && !isRange(value);\r\n+    }\r\n+\r\n+    private boolean isWildcard(String value) {\r\n+        return WILDCARD.equals(value);\r\n+    }\r\n+\r\n+    private boolean isRange(String value) {\r\n+        return value != null && value.indexOf(VALUE_SEPARATOR) > -1 && value.split(VALUE_SEPARATOR).length > 1;\r\n+    }\r\n+\r\n+    public String getCategory() {\r\n+        return category;\r\n+    }\r\n+\r\n+    public void setCategory(String category) {\r\n+        this.category = category;\r\n+    }\r\n+\r\n+    public String getServiceInterface() {\r\n+        return serviceInterface;\r\n+    }\r\n+\r\n+    public void setServiceInterface(String serviceInterface) {\r\n+        this.serviceInterface = serviceInterface;\r\n+    }\r\n+\r\n+    public String getVersion() {\r\n+        return version;\r\n+    }\r\n+\r\n+    public void setVersion(String version) {\r\n+        this.version = version;\r\n+    }\r\n+\r\n+    public String getGroup() {\r\n+        return group;\r\n+    }\r\n+\r\n+    public void setGroup(String group) {\r\n+        this.group = group;\r\n+    }\r\n+\r\n+    public String getValue() {\r\n+        if (value == null) {\r\n+            value = toValue();\r\n+        }\r\n+        return value;\r\n+    }\r\n+\r\n+    private String toValue() {\r\n+        return new StringBuilder(category)\r\n+                .append(NAME_SEPARATOR).append(serviceInterface)\r\n+                .append(NAME_SEPARATOR).append(version)\r\n+                .append(NAME_SEPARATOR).append(group)\r\n+                .toString();\r\n+    }\r\n+\r\n+    @Override\r\n+    public boolean equals(Object o) {\r\n+        if (this == o) {\r\n+            return true;\r\n+        }\r\n+        if (!(o instanceof NacosServiceName)) {\r\n+            return false;\r\n+        }\r\n+        NacosServiceName that = (NacosServiceName) o;\r\n+        return Objects.equals(getValue(), that.getValue());\r\n+    }\r\n+\r\n+    @Override\r\n+    public int hashCode() {\r\n+        return Objects.hash(getValue());\r\n+    }\r\n+\r\n+    @Override\r\n+    public String toString() {\r\n+        return getValue();\r\n+    }\r\n+}\r\n"}, {"source1": "org/apache/dubbo/registry/nacos/util/NacosInstanceManageUtil.java", "source2": "org/apache/dubbo/registry/nacos/util/NacosInstanceManageUtil.java", "comments": ["Ordering differences only"], "unified_diff": "@@ -1,67 +1,67 @@\n-/*\n- * Licensed to the Apache Software Foundation (ASF) under one or more\n- * contributor license agreements.  See the NOTICE file distributed with\n- * this work for additional information regarding copyright ownership.\n- * The ASF licenses this file to You under the Apache License, Version 2.0\n- * (the \"License\"); you may not use this file except in compliance with\n- * the License.  You may obtain a copy of the License at\n- *\n- *     http://www.apache.org/licenses/LICENSE-2.0\n- *\n- * Unless required by applicable law or agreed to in writing, software\n- * distributed under the License is distributed on an \"AS IS\" BASIS,\n- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n- * See the License for the specific language governing permissions and\n- * limitations under the License.\n- */\n-package org.apache.dubbo.registry.nacos.util;\n-\n-import com.alibaba.nacos.api.naming.pojo.Instance;\n-import com.google.common.collect.Lists;\n-import com.google.common.collect.Maps;\n-import org.apache.dubbo.common.utils.CollectionUtils;\n-\n-import java.util.List;\n-import java.util.Map;\n-import java.util.Set;\n-\n-/**\n- * Instance manage util for multiple serviceNames\n- * To resolve bug with https://github.com/apache/dubbo/issues/5885 and https://github.com/apache/dubbo/issues/5899\n- *\n- * @since 2.7.6\n- */\n-public class NacosInstanceManageUtil {\n-\n-    /**\n-     * serviceName -> refreshed instance list\n-     */\n-    private static final Map<String, List<Instance>> SERVICE_INSTANCE_LIST_MAP = Maps.newConcurrentMap();\n-\n-    /**\n-     * serviceName -> corresponding serviceName list\n-     */\n-    private static final Map<String, Set<String>> CORRESPONDING_SERVICE_NAMES_MAP = Maps.newConcurrentMap();\n-\n-    public static void setCorrespondingServiceNames(String serviceName, Set<String> serviceNames) {\n-        CORRESPONDING_SERVICE_NAMES_MAP.put(serviceName, serviceNames);\n-    }\n-\n-    public static void initOrRefreshServiceInstanceList(String serviceName, List<Instance> instanceList) {\n-        SERVICE_INSTANCE_LIST_MAP.put(serviceName, instanceList);\n-    }\n-\n-    public static List<Instance> getAllCorrespondingServiceInstanceList(String serviceName) {\n-        if (!CORRESPONDING_SERVICE_NAMES_MAP.containsKey(serviceName)) {\n-            return Lists.newArrayList();\n-        }\n-        List<Instance> allInstances = Lists.newArrayList();\n-        for (String correspondingServiceName : CORRESPONDING_SERVICE_NAMES_MAP.get(serviceName)) {\n-            if (SERVICE_INSTANCE_LIST_MAP.containsKey(correspondingServiceName) && CollectionUtils.isNotEmpty(SERVICE_INSTANCE_LIST_MAP.get(correspondingServiceName))) {\n-                allInstances.addAll(SERVICE_INSTANCE_LIST_MAP.get(correspondingServiceName));\n-            }\n-        }\n-        return allInstances;\n-    }\n-\n-}\n+/*\r\n+ * Licensed to the Apache Software Foundation (ASF) under one or more\r\n+ * contributor license agreements.  See the NOTICE file distributed with\r\n+ * this work for additional information regarding copyright ownership.\r\n+ * The ASF licenses this file to You under the Apache License, Version 2.0\r\n+ * (the \"License\"); you may not use this file except in compliance with\r\n+ * the License.  You may obtain a copy of the License at\r\n+ *\r\n+ *     http://www.apache.org/licenses/LICENSE-2.0\r\n+ *\r\n+ * Unless required by applicable law or agreed to in writing, software\r\n+ * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n+ * See the License for the specific language governing permissions and\r\n+ * limitations under the License.\r\n+ */\r\n+package org.apache.dubbo.registry.nacos.util;\r\n+\r\n+import com.alibaba.nacos.api.naming.pojo.Instance;\r\n+import com.google.common.collect.Lists;\r\n+import com.google.common.collect.Maps;\r\n+import org.apache.dubbo.common.utils.CollectionUtils;\r\n+\r\n+import java.util.List;\r\n+import java.util.Map;\r\n+import java.util.Set;\r\n+\r\n+/**\r\n+ * Instance manage util for multiple serviceNames\r\n+ * To resolve bug with https://github.com/apache/dubbo/issues/5885 and https://github.com/apache/dubbo/issues/5899\r\n+ *\r\n+ * @since 2.7.6\r\n+ */\r\n+public class NacosInstanceManageUtil {\r\n+\r\n+    /**\r\n+     * serviceName -> refreshed instance list\r\n+     */\r\n+    private static final Map<String, List<Instance>> SERVICE_INSTANCE_LIST_MAP = Maps.newConcurrentMap();\r\n+\r\n+    /**\r\n+     * serviceName -> corresponding serviceName list\r\n+     */\r\n+    private static final Map<String, Set<String>> CORRESPONDING_SERVICE_NAMES_MAP = Maps.newConcurrentMap();\r\n+\r\n+    public static void setCorrespondingServiceNames(String serviceName, Set<String> serviceNames) {\r\n+        CORRESPONDING_SERVICE_NAMES_MAP.put(serviceName, serviceNames);\r\n+    }\r\n+\r\n+    public static void initOrRefreshServiceInstanceList(String serviceName, List<Instance> instanceList) {\r\n+        SERVICE_INSTANCE_LIST_MAP.put(serviceName, instanceList);\r\n+    }\r\n+\r\n+    public static List<Instance> getAllCorrespondingServiceInstanceList(String serviceName) {\r\n+        if (!CORRESPONDING_SERVICE_NAMES_MAP.containsKey(serviceName)) {\r\n+            return Lists.newArrayList();\r\n+        }\r\n+        List<Instance> allInstances = Lists.newArrayList();\r\n+        for (String correspondingServiceName : CORRESPONDING_SERVICE_NAMES_MAP.get(serviceName)) {\r\n+            if (SERVICE_INSTANCE_LIST_MAP.containsKey(correspondingServiceName) && CollectionUtils.isNotEmpty(SERVICE_INSTANCE_LIST_MAP.get(correspondingServiceName))) {\r\n+                allInstances.addAll(SERVICE_INSTANCE_LIST_MAP.get(correspondingServiceName));\r\n+            }\r\n+        }\r\n+        return allInstances;\r\n+    }\r\n+\r\n+}\r\n"}, {"source1": "org/apache/dubbo/registry/nacos/util/NacosNamingServiceUtils.java", "source2": "org/apache/dubbo/registry/nacos/util/NacosNamingServiceUtils.java", "comments": ["Ordering differences only"], "unified_diff": "@@ -1,189 +1,189 @@\n-/*\n- * Licensed to the Apache Software Foundation (ASF) under one or more\n- * contributor license agreements.  See the NOTICE file distributed with\n- * this work for additional information regarding copyright ownership.\n- * The ASF licenses this file to You under the Apache License, Version 2.0\n- * (the \"License\"); you may not use this file except in compliance with\n- * the License.  You may obtain a copy of the License at\n- *\n- *     http://www.apache.org/licenses/LICENSE-2.0\n- *\n- * Unless required by applicable law or agreed to in writing, software\n- * distributed under the License is distributed on an \"AS IS\" BASIS,\n- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n- * See the License for the specific language governing permissions and\n- * limitations under the License.\n- */\n-package org.apache.dubbo.registry.nacos.util;\n-\n-import org.apache.dubbo.common.URL;\n-import org.apache.dubbo.common.logger.Logger;\n-import org.apache.dubbo.common.logger.LoggerFactory;\n-import org.apache.dubbo.common.utils.StringUtils;\n-import org.apache.dubbo.registry.client.DefaultServiceInstance;\n-import org.apache.dubbo.registry.client.ServiceInstance;\n-import org.apache.dubbo.registry.nacos.NacosNamingServiceWrapper;\n-\n-import com.alibaba.nacos.api.NacosFactory;\n-import com.alibaba.nacos.api.PropertyKeyConst;\n-import com.alibaba.nacos.api.exception.NacosException;\n-import com.alibaba.nacos.api.naming.NamingService;\n-import com.alibaba.nacos.api.naming.PreservedMetadataKeys;\n-import com.alibaba.nacos.api.naming.pojo.Instance;\n-import com.alibaba.nacos.api.naming.utils.NamingUtils;\n-\n-import java.util.HashMap;\n-import java.util.Map;\n-import java.util.Properties;\n-\n-import static com.alibaba.nacos.api.PropertyKeyConst.NAMING_LOAD_CACHE_AT_START;\n-import static com.alibaba.nacos.api.PropertyKeyConst.SERVER_ADDR;\n-import static com.alibaba.nacos.api.common.Constants.DEFAULT_GROUP;\n-import static org.apache.dubbo.common.constants.RemotingConstants.BACKUP_KEY;\n-import static org.apache.dubbo.common.utils.StringConstantFieldValuePredicate.of;\n-\n-/**\n- * The utilities class for {@link NamingService}\n- *\n- * @since 2.7.5\n- */\n-public class NacosNamingServiceUtils {\n-\n-    private static final Logger logger = LoggerFactory.getLogger(NacosNamingServiceUtils.class);\n-\n-    /**\n-     * Convert the {@link ServiceInstance} to {@link Instance}\n-     *\n-     * @param serviceInstance {@link ServiceInstance}\n-     * @return non-null\n-     * @since 2.7.5\n-     */\n-    public static Instance toInstance(ServiceInstance serviceInstance) {\n-        Instance instance = new Instance();\n-        instance.setInstanceId(serviceInstance.getId());\n-        instance.setServiceName(serviceInstance.getServiceName());\n-        instance.setIp(serviceInstance.getHost());\n-        instance.setPort(serviceInstance.getPort());\n-        instance.setMetadata(serviceInstance.getMetadata());\n-        instance.setEnabled(serviceInstance.isEnabled());\n-        instance.setHealthy(serviceInstance.isHealthy());\n-        return instance;\n-    }\n-\n-    /**\n-     * Convert the {@link Instance} to {@link ServiceInstance}\n-     *\n-     * @param instance {@link Instance}\n-     * @return non-null\n-     * @since 2.7.5\n-     */\n-    public static ServiceInstance toServiceInstance(Instance instance) {\n-        DefaultServiceInstance serviceInstance = new DefaultServiceInstance(instance.getInstanceId(),\n-                NamingUtils.getServiceName(instance.getServiceName()), instance.getIp(), instance.getPort());\n-        serviceInstance.setMetadata(instance.getMetadata());\n-        serviceInstance.setEnabled(instance.isEnabled());\n-        serviceInstance.setHealthy(instance.isHealthy());\n-        return serviceInstance;\n-    }\n-\n-    /**\n-     * The group of {@link NamingService} to register\n-     *\n-     * @param connectionURL {@link URL connection url}\n-     * @return non-null, \"default\" as default\n-     * @since 2.7.5\n-     */\n-    public static String getGroup(URL connectionURL) {\n-        return connectionURL.getParameter(\"nacos.group\", DEFAULT_GROUP);\n-    }\n-\n-    /**\n-     * Create an instance of {@link NamingService} from specified {@link URL connection url}\n-     *\n-     * @param connectionURL {@link URL connection url}\n-     * @return {@link NamingService}\n-     * @since 2.7.5\n-     */\n-    public static NacosNamingServiceWrapper createNamingService(URL connectionURL) {\n-        Properties nacosProperties = buildNacosProperties(connectionURL);\n-        NamingService namingService;\n-        try {\n-            namingService = NacosFactory.createNamingService(nacosProperties);\n-        } catch (NacosException e) {\n-            if (logger.isErrorEnabled()) {\n-                logger.error(e.getErrMsg(), e);\n-            }\n-            throw new IllegalStateException(e);\n-        }\n-        return new NacosNamingServiceWrapper(namingService);\n-    }\n-\n-    private static Properties buildNacosProperties(URL url) {\n-        Properties properties = new Properties();\n-        setServerAddr(url, properties);\n-        setProperties(url, properties);\n-        return properties;\n-    }\n-\n-    private static void setServerAddr(URL url, Properties properties) {\n-        StringBuilder serverAddrBuilder =\n-                new StringBuilder(url.getHost()) // Host\n-                        .append(\":\")\n-                        .append(url.getPort()); // Port\n-\n-        // Append backup parameter as other servers\n-        String backup = url.getParameter(BACKUP_KEY);\n-        if (backup != null) {\n-            serverAddrBuilder.append(\",\").append(backup);\n-        }\n-\n-        String serverAddr = serverAddrBuilder.toString();\n-        properties.put(SERVER_ADDR, serverAddr);\n-    }\n-\n-    private static void setProperties(URL url, Properties properties) {\n-        // @since 2.7.8 : Refactoring\n-        // Get the parameters from constants\n-        Map<String, String> parameters = url.getParameters(of(PropertyKeyConst.class));\n-        // Put all parameters\n-        properties.putAll(parameters);\n-\n-        putPropertyIfAbsent(url, properties, NAMING_LOAD_CACHE_AT_START, \"true\");\n-    }\n-\n-    private static void putPropertyIfAbsent(URL url, Properties properties, String propertyName) {\n-        String propertyValue = url.getParameter(propertyName);\n-        if (StringUtils.isNotEmpty(propertyValue)) {\n-            properties.setProperty(propertyName, propertyValue);\n-        }\n-    }\n-\n-    private static void putPropertyIfAbsent(URL url, Properties properties, String propertyName, String defaultValue) {\n-        String propertyValue = url.getParameter(propertyName);\n-        if (StringUtils.isNotEmpty(propertyValue)) {\n-            properties.setProperty(propertyName, propertyValue);\n-        } else {\n-            properties.setProperty(propertyName, defaultValue);\n-        }\n-    }\n-\n-    public static Map<String, String> getNacosPreservedParam(URL registryUrl) {\n-        Map<String, String> map = new HashMap<>();\n-        if (registryUrl.getParameter(PreservedMetadataKeys.REGISTER_SOURCE) != null) {\n-            map.put(PreservedMetadataKeys.REGISTER_SOURCE, registryUrl.getParameter(PreservedMetadataKeys.REGISTER_SOURCE));\n-        }\n-        if (registryUrl.getParameter(PreservedMetadataKeys.HEART_BEAT_TIMEOUT) != null) {\n-            map.put(PreservedMetadataKeys.HEART_BEAT_TIMEOUT, registryUrl.getParameter(PreservedMetadataKeys.HEART_BEAT_TIMEOUT));\n-        }\n-        if (registryUrl.getParameter(PreservedMetadataKeys.IP_DELETE_TIMEOUT) != null) {\n-            map.put(PreservedMetadataKeys.IP_DELETE_TIMEOUT, registryUrl.getParameter(PreservedMetadataKeys.IP_DELETE_TIMEOUT));\n-        }\n-        if (registryUrl.getParameter(PreservedMetadataKeys.HEART_BEAT_INTERVAL) != null) {\n-            map.put(PreservedMetadataKeys.HEART_BEAT_INTERVAL, registryUrl.getParameter(PreservedMetadataKeys.HEART_BEAT_INTERVAL));\n-        }\n-        if (registryUrl.getParameter(PreservedMetadataKeys.INSTANCE_ID_GENERATOR) != null) {\n-            map.put(PreservedMetadataKeys.INSTANCE_ID_GENERATOR, registryUrl.getParameter(PreservedMetadataKeys.INSTANCE_ID_GENERATOR));\n-        }\n-        return map;\n-    }\n-}\n+/*\r\n+ * Licensed to the Apache Software Foundation (ASF) under one or more\r\n+ * contributor license agreements.  See the NOTICE file distributed with\r\n+ * this work for additional information regarding copyright ownership.\r\n+ * The ASF licenses this file to You under the Apache License, Version 2.0\r\n+ * (the \"License\"); you may not use this file except in compliance with\r\n+ * the License.  You may obtain a copy of the License at\r\n+ *\r\n+ *     http://www.apache.org/licenses/LICENSE-2.0\r\n+ *\r\n+ * Unless required by applicable law or agreed to in writing, software\r\n+ * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n+ * See the License for the specific language governing permissions and\r\n+ * limitations under the License.\r\n+ */\r\n+package org.apache.dubbo.registry.nacos.util;\r\n+\r\n+import org.apache.dubbo.common.URL;\r\n+import org.apache.dubbo.common.logger.Logger;\r\n+import org.apache.dubbo.common.logger.LoggerFactory;\r\n+import org.apache.dubbo.common.utils.StringUtils;\r\n+import org.apache.dubbo.registry.client.DefaultServiceInstance;\r\n+import org.apache.dubbo.registry.client.ServiceInstance;\r\n+import org.apache.dubbo.registry.nacos.NacosNamingServiceWrapper;\r\n+\r\n+import com.alibaba.nacos.api.NacosFactory;\r\n+import com.alibaba.nacos.api.PropertyKeyConst;\r\n+import com.alibaba.nacos.api.exception.NacosException;\r\n+import com.alibaba.nacos.api.naming.NamingService;\r\n+import com.alibaba.nacos.api.naming.PreservedMetadataKeys;\r\n+import com.alibaba.nacos.api.naming.pojo.Instance;\r\n+import com.alibaba.nacos.api.naming.utils.NamingUtils;\r\n+\r\n+import java.util.HashMap;\r\n+import java.util.Map;\r\n+import java.util.Properties;\r\n+\r\n+import static com.alibaba.nacos.api.PropertyKeyConst.NAMING_LOAD_CACHE_AT_START;\r\n+import static com.alibaba.nacos.api.PropertyKeyConst.SERVER_ADDR;\r\n+import static com.alibaba.nacos.api.common.Constants.DEFAULT_GROUP;\r\n+import static org.apache.dubbo.common.constants.RemotingConstants.BACKUP_KEY;\r\n+import static org.apache.dubbo.common.utils.StringConstantFieldValuePredicate.of;\r\n+\r\n+/**\r\n+ * The utilities class for {@link NamingService}\r\n+ *\r\n+ * @since 2.7.5\r\n+ */\r\n+public class NacosNamingServiceUtils {\r\n+\r\n+    private static final Logger logger = LoggerFactory.getLogger(NacosNamingServiceUtils.class);\r\n+\r\n+    /**\r\n+     * Convert the {@link ServiceInstance} to {@link Instance}\r\n+     *\r\n+     * @param serviceInstance {@link ServiceInstance}\r\n+     * @return non-null\r\n+     * @since 2.7.5\r\n+     */\r\n+    public static Instance toInstance(ServiceInstance serviceInstance) {\r\n+        Instance instance = new Instance();\r\n+        instance.setInstanceId(serviceInstance.getId());\r\n+        instance.setServiceName(serviceInstance.getServiceName());\r\n+        instance.setIp(serviceInstance.getHost());\r\n+        instance.setPort(serviceInstance.getPort());\r\n+        instance.setMetadata(serviceInstance.getMetadata());\r\n+        instance.setEnabled(serviceInstance.isEnabled());\r\n+        instance.setHealthy(serviceInstance.isHealthy());\r\n+        return instance;\r\n+    }\r\n+\r\n+    /**\r\n+     * Convert the {@link Instance} to {@link ServiceInstance}\r\n+     *\r\n+     * @param instance {@link Instance}\r\n+     * @return non-null\r\n+     * @since 2.7.5\r\n+     */\r\n+    public static ServiceInstance toServiceInstance(Instance instance) {\r\n+        DefaultServiceInstance serviceInstance = new DefaultServiceInstance(instance.getInstanceId(),\r\n+                NamingUtils.getServiceName(instance.getServiceName()), instance.getIp(), instance.getPort());\r\n+        serviceInstance.setMetadata(instance.getMetadata());\r\n+        serviceInstance.setEnabled(instance.isEnabled());\r\n+        serviceInstance.setHealthy(instance.isHealthy());\r\n+        return serviceInstance;\r\n+    }\r\n+\r\n+    /**\r\n+     * The group of {@link NamingService} to register\r\n+     *\r\n+     * @param connectionURL {@link URL connection url}\r\n+     * @return non-null, \"default\" as default\r\n+     * @since 2.7.5\r\n+     */\r\n+    public static String getGroup(URL connectionURL) {\r\n+        return connectionURL.getParameter(\"nacos.group\", DEFAULT_GROUP);\r\n+    }\r\n+\r\n+    /**\r\n+     * Create an instance of {@link NamingService} from specified {@link URL connection url}\r\n+     *\r\n+     * @param connectionURL {@link URL connection url}\r\n+     * @return {@link NamingService}\r\n+     * @since 2.7.5\r\n+     */\r\n+    public static NacosNamingServiceWrapper createNamingService(URL connectionURL) {\r\n+        Properties nacosProperties = buildNacosProperties(connectionURL);\r\n+        NamingService namingService;\r\n+        try {\r\n+            namingService = NacosFactory.createNamingService(nacosProperties);\r\n+        } catch (NacosException e) {\r\n+            if (logger.isErrorEnabled()) {\r\n+                logger.error(e.getErrMsg(), e);\r\n+            }\r\n+            throw new IllegalStateException(e);\r\n+        }\r\n+        return new NacosNamingServiceWrapper(namingService);\r\n+    }\r\n+\r\n+    private static Properties buildNacosProperties(URL url) {\r\n+        Properties properties = new Properties();\r\n+        setServerAddr(url, properties);\r\n+        setProperties(url, properties);\r\n+        return properties;\r\n+    }\r\n+\r\n+    private static void setServerAddr(URL url, Properties properties) {\r\n+        StringBuilder serverAddrBuilder =\r\n+                new StringBuilder(url.getHost()) // Host\r\n+                        .append(\":\")\r\n+                        .append(url.getPort()); // Port\r\n+\r\n+        // Append backup parameter as other servers\r\n+        String backup = url.getParameter(BACKUP_KEY);\r\n+        if (backup != null) {\r\n+            serverAddrBuilder.append(\",\").append(backup);\r\n+        }\r\n+\r\n+        String serverAddr = serverAddrBuilder.toString();\r\n+        properties.put(SERVER_ADDR, serverAddr);\r\n+    }\r\n+\r\n+    private static void setProperties(URL url, Properties properties) {\r\n+        // @since 2.7.8 : Refactoring\r\n+        // Get the parameters from constants\r\n+        Map<String, String> parameters = url.getParameters(of(PropertyKeyConst.class));\r\n+        // Put all parameters\r\n+        properties.putAll(parameters);\r\n+\r\n+        putPropertyIfAbsent(url, properties, NAMING_LOAD_CACHE_AT_START, \"true\");\r\n+    }\r\n+\r\n+    private static void putPropertyIfAbsent(URL url, Properties properties, String propertyName) {\r\n+        String propertyValue = url.getParameter(propertyName);\r\n+        if (StringUtils.isNotEmpty(propertyValue)) {\r\n+            properties.setProperty(propertyName, propertyValue);\r\n+        }\r\n+    }\r\n+\r\n+    private static void putPropertyIfAbsent(URL url, Properties properties, String propertyName, String defaultValue) {\r\n+        String propertyValue = url.getParameter(propertyName);\r\n+        if (StringUtils.isNotEmpty(propertyValue)) {\r\n+            properties.setProperty(propertyName, propertyValue);\r\n+        } else {\r\n+            properties.setProperty(propertyName, defaultValue);\r\n+        }\r\n+    }\r\n+\r\n+    public static Map<String, String> getNacosPreservedParam(URL registryUrl) {\r\n+        Map<String, String> map = new HashMap<>();\r\n+        if (registryUrl.getParameter(PreservedMetadataKeys.REGISTER_SOURCE) != null) {\r\n+            map.put(PreservedMetadataKeys.REGISTER_SOURCE, registryUrl.getParameter(PreservedMetadataKeys.REGISTER_SOURCE));\r\n+        }\r\n+        if (registryUrl.getParameter(PreservedMetadataKeys.HEART_BEAT_TIMEOUT) != null) {\r\n+            map.put(PreservedMetadataKeys.HEART_BEAT_TIMEOUT, registryUrl.getParameter(PreservedMetadataKeys.HEART_BEAT_TIMEOUT));\r\n+        }\r\n+        if (registryUrl.getParameter(PreservedMetadataKeys.IP_DELETE_TIMEOUT) != null) {\r\n+            map.put(PreservedMetadataKeys.IP_DELETE_TIMEOUT, registryUrl.getParameter(PreservedMetadataKeys.IP_DELETE_TIMEOUT));\r\n+        }\r\n+        if (registryUrl.getParameter(PreservedMetadataKeys.HEART_BEAT_INTERVAL) != null) {\r\n+            map.put(PreservedMetadataKeys.HEART_BEAT_INTERVAL, registryUrl.getParameter(PreservedMetadataKeys.HEART_BEAT_INTERVAL));\r\n+        }\r\n+        if (registryUrl.getParameter(PreservedMetadataKeys.INSTANCE_ID_GENERATOR) != null) {\r\n+            map.put(PreservedMetadataKeys.INSTANCE_ID_GENERATOR, registryUrl.getParameter(PreservedMetadataKeys.INSTANCE_ID_GENERATOR));\r\n+        }\r\n+        return map;\r\n+    }\r\n+}\r\n"}, {"source1": "META-INF/maven/org.apache.dubbo/dubbo-registry-nacos/pom.xml", "source2": "META-INF/maven/org.apache.dubbo/dubbo-registry-nacos/pom.xml", "comments": ["Format-specific differences are supported for XML files but no file-specific differences were detected; falling back to a binary diff. file(1) reports: XML 1.0 document, ASCII text, with CRLF line terminators"], "has_internal_linenos": true, "unified_diff": "@@ -1,196 +1,191 @@\n 00000000: 3c3f 786d 6c20 7665 7273 696f 6e3d 2231  <?xml version=\"1\n 00000010: 2e30 2220 656e 636f 6469 6e67 3d22 5554  .0\" encoding=\"UT\n-00000020: 462d 3822 3f3e 0d0a 3c21 2d2d 0d0a 2020  F-8\"?>..<!--..  \n-00000030: 4c69 6365 6e73 6564 2074 6f20 7468 6520  Licensed to the \n-00000040: 4170 6163 6865 2053 6f66 7477 6172 6520  Apache Software \n-00000050: 466f 756e 6461 7469 6f6e 2028 4153 4629  Foundation (ASF)\n-00000060: 2075 6e64 6572 206f 6e65 206f 7220 6d6f   under one or mo\n-00000070: 7265 0d0a 2020 636f 6e74 7269 6275 746f  re..  contributo\n-00000080: 7220 6c69 6365 6e73 6520 6167 7265 656d  r license agreem\n-00000090: 656e 7473 2e20 2053 6565 2074 6865 204e  ents.  See the N\n-000000a0: 4f54 4943 4520 6669 6c65 2064 6973 7472  OTICE file distr\n-000000b0: 6962 7574 6564 2077 6974 680d 0a20 2074  ibuted with..  t\n-000000c0: 6869 7320 776f 726b 2066 6f72 2061 6464  his work for add\n-000000d0: 6974 696f 6e61 6c20 696e 666f 726d 6174  itional informat\n-000000e0: 696f 6e20 7265 6761 7264 696e 6720 636f  ion regarding co\n-000000f0: 7079 7269 6768 7420 6f77 6e65 7273 6869  pyright ownershi\n-00000100: 702e 0d0a 2020 5468 6520 4153 4620 6c69  p...  The ASF li\n-00000110: 6365 6e73 6573 2074 6869 7320 6669 6c65  censes this file\n-00000120: 2074 6f20 596f 7520 756e 6465 7220 7468   to You under th\n-00000130: 6520 4170 6163 6865 204c 6963 656e 7365  e Apache License\n-00000140: 2c20 5665 7273 696f 6e20 322e 300d 0a20  , Version 2.0.. \n-00000150: 2028 7468 6520 224c 6963 656e 7365 2229   (the \"License\")\n-00000160: 3b20 796f 7520 6d61 7920 6e6f 7420 7573  ; you may not us\n-00000170: 6520 7468 6973 2066 696c 6520 6578 6365  e this file exce\n-00000180: 7074 2069 6e20 636f 6d70 6c69 616e 6365  pt in compliance\n-00000190: 2077 6974 680d 0a20 2074 6865 204c 6963   with..  the Lic\n-000001a0: 656e 7365 2e20 2059 6f75 206d 6179 206f  ense.  You may o\n-000001b0: 6274 6169 6e20 6120 636f 7079 206f 6620  btain a copy of \n-000001c0: 7468 6520 4c69 6365 6e73 6520 6174 0d0a  the License at..\n-000001d0: 0d0a 2020 2020 2020 6874 7470 3a2f 2f77  ..      http://w\n-000001e0: 7777 2e61 7061 6368 652e 6f72 672f 6c69  ww.apache.org/li\n-000001f0: 6365 6e73 6573 2f4c 4943 454e 5345 2d32  censes/LICENSE-2\n-00000200: 2e30 0d0a 0d0a 2020 556e 6c65 7373 2072  .0....  Unless r\n-00000210: 6571 7569 7265 6420 6279 2061 7070 6c69  equired by appli\n-00000220: 6361 626c 6520 6c61 7720 6f72 2061 6772  cable law or agr\n-00000230: 6565 6420 746f 2069 6e20 7772 6974 696e  eed to in writin\n-00000240: 672c 2073 6f66 7477 6172 650d 0a20 2064  g, software..  d\n-00000250: 6973 7472 6962 7574 6564 2075 6e64 6572  istributed under\n-00000260: 2074 6865 204c 6963 656e 7365 2069 7320   the License is \n-00000270: 6469 7374 7269 6275 7465 6420 6f6e 2061  distributed on a\n-00000280: 6e20 2241 5320 4953 2220 4241 5349 532c  n \"AS IS\" BASIS,\n-00000290: 0d0a 2020 5749 5448 4f55 5420 5741 5252  ..  WITHOUT WARR\n-000002a0: 414e 5449 4553 204f 5220 434f 4e44 4954  ANTIES OR CONDIT\n-000002b0: 494f 4e53 204f 4620 414e 5920 4b49 4e44  IONS OF ANY KIND\n-000002c0: 2c20 6569 7468 6572 2065 7870 7265 7373  , either express\n-000002d0: 206f 7220 696d 706c 6965 642e 0d0a 2020   or implied...  \n-000002e0: 5365 6520 7468 6520 4c69 6365 6e73 6520  See the License \n-000002f0: 666f 7220 7468 6520 7370 6563 6966 6963  for the specific\n-00000300: 206c 616e 6775 6167 6520 676f 7665 726e   language govern\n-00000310: 696e 6720 7065 726d 6973 7369 6f6e 7320  ing permissions \n-00000320: 616e 640d 0a20 206c 696d 6974 6174 696f  and..  limitatio\n-00000330: 6e73 2075 6e64 6572 2074 6865 204c 6963  ns under the Lic\n-00000340: 656e 7365 2e0d 0a20 202d 2d3e 0d0a 3c70  ense...  -->..<p\n-00000350: 726f 6a65 6374 2078 7369 3a73 6368 656d  roject xsi:schem\n-00000360: 614c 6f63 6174 696f 6e3d 2268 7474 703a  aLocation=\"http:\n-00000370: 2f2f 6d61 7665 6e2e 6170 6163 6865 2e6f  //maven.apache.o\n-00000380: 7267 2f50 4f4d 2f34 2e30 2e30 2068 7474  rg/POM/4.0.0 htt\n-00000390: 7073 3a2f 2f6d 6176 656e 2e61 7061 6368  ps://maven.apach\n-000003a0: 652e 6f72 672f 7873 642f 6d61 7665 6e2d  e.org/xsd/maven-\n-000003b0: 342e 302e 302e 7873 6422 2078 6d6c 6e73  4.0.0.xsd\" xmlns\n-000003c0: 3d22 6874 7470 3a2f 2f6d 6176 656e 2e61  =\"http://maven.a\n-000003d0: 7061 6368 652e 6f72 672f 504f 4d2f 342e  pache.org/POM/4.\n-000003e0: 302e 3022 0d0a 2020 2020 786d 6c6e 733a  0.0\"..    xmlns:\n-000003f0: 7873 693d 2268 7474 703a 2f2f 7777 772e  xsi=\"http://www.\n-00000400: 7733 2e6f 7267 2f32 3030 312f 584d 4c53  w3.org/2001/XMLS\n-00000410: 6368 656d 612d 696e 7374 616e 6365 223e  chema-instance\">\n-00000420: 0d0a 2020 3c6d 6f64 656c 5665 7273 696f  ..  <modelVersio\n-00000430: 6e3e 342e 302e 303c 2f6d 6f64 656c 5665  n>4.0.0</modelVe\n-00000440: 7273 696f 6e3e 0d0a 2020 3c70 6172 656e  rsion>..  <paren\n-00000450: 743e 0d0a 2020 2020 3c67 726f 7570 4964  t>..    <groupId\n-00000460: 3e6f 7267 2e61 7061 6368 652e 6475 6262  >org.apache.dubb\n-00000470: 6f3c 2f67 726f 7570 4964 3e0d 0a20 2020  o</groupId>..   \n-00000480: 203c 6172 7469 6661 6374 4964 3e64 7562   <artifactId>dub\n-00000490: 626f 2d72 6567 6973 7472 793c 2f61 7274  bo-registry</art\n-000004a0: 6966 6163 7449 643e 0d0a 2020 2020 3c76  ifactId>..    <v\n-000004b0: 6572 7369 6f6e 3e32 2e37 2e31 303c 2f76  ersion>2.7.10</v\n-000004c0: 6572 7369 6f6e 3e0d 0a20 203c 2f70 6172  ersion>..  </par\n-000004d0: 656e 743e 0d0a 2020 3c67 726f 7570 4964  ent>..  <groupId\n-000004e0: 3e6f 7267 2e61 7061 6368 652e 6475 6262  >org.apache.dubb\n-000004f0: 6f3c 2f67 726f 7570 4964 3e0d 0a20 203c  o</groupId>..  <\n-00000500: 6172 7469 6661 6374 4964 3e64 7562 626f  artifactId>dubbo\n-00000510: 2d72 6567 6973 7472 792d 6e61 636f 733c  -registry-nacos<\n-00000520: 2f61 7274 6966 6163 7449 643e 0d0a 2020  /artifactId>..  \n-00000530: 3c76 6572 7369 6f6e 3e32 2e37 2e31 303c  <version>2.7.10<\n-00000540: 2f76 6572 7369 6f6e 3e0d 0a20 203c 6e61  /version>..  <na\n-00000550: 6d65 3e24 7b70 726f 6a65 6374 2e61 7274  me>${project.art\n-00000560: 6966 6163 7449 647d 3c2f 6e61 6d65 3e0d  ifactId}</name>.\n-00000570: 0a20 203c 6465 7363 7269 7074 696f 6e3e  .  <description>\n-00000580: 5468 6520 4e61 636f 7320 7265 6769 7374  The Nacos regist\n-00000590: 7279 206d 6f64 756c 6520 6f66 2044 7562  ry module of Dub\n-000005a0: 626f 2070 726f 6a65 6374 3c2f 6465 7363  bo project</desc\n-000005b0: 7269 7074 696f 6e3e 0d0a 2020 3c6c 6963  ription>..  <lic\n-000005c0: 656e 7365 733e 0d0a 2020 2020 3c6c 6963  enses>..    <lic\n-000005d0: 656e 7365 3e0d 0a20 2020 2020 203c 6e61  ense>..      <na\n-000005e0: 6d65 3e41 7061 6368 6520 4c69 6365 6e73  me>Apache Licens\n-000005f0: 652c 2056 6572 7369 6f6e 2032 2e30 3c2f  e, Version 2.0</\n-00000600: 6e61 6d65 3e0d 0a20 2020 2020 203c 7572  name>..      <ur\n-00000610: 6c3e 6874 7470 3a2f 2f77 7777 2e61 7061  l>http://www.apa\n-00000620: 6368 652e 6f72 672f 6c69 6365 6e73 6573  che.org/licenses\n-00000630: 2f4c 4943 454e 5345 2d32 2e30 3c2f 7572  /LICENSE-2.0</ur\n-00000640: 6c3e 0d0a 2020 2020 2020 3c64 6973 7472  l>..      <distr\n-00000650: 6962 7574 696f 6e3e 7265 706f 3c2f 6469  ibution>repo</di\n-00000660: 7374 7269 6275 7469 6f6e 3e0d 0a20 2020  stribution>..   \n-00000670: 203c 2f6c 6963 656e 7365 3e0d 0a20 203c   </license>..  <\n-00000680: 2f6c 6963 656e 7365 733e 0d0a 2020 3c64  /licenses>..  <d\n-00000690: 6570 656e 6465 6e63 6965 733e 0d0a 2020  ependencies>..  \n-000006a0: 2020 3c64 6570 656e 6465 6e63 793e 0d0a    <dependency>..\n-000006b0: 2020 2020 2020 3c67 726f 7570 4964 3e6f        <groupId>o\n-000006c0: 7267 2e61 7061 6368 652e 6475 6262 6f3c  rg.apache.dubbo<\n-000006d0: 2f67 726f 7570 4964 3e0d 0a20 2020 2020  /groupId>..     \n-000006e0: 203c 6172 7469 6661 6374 4964 3e64 7562   <artifactId>dub\n-000006f0: 626f 2d72 6567 6973 7472 792d 6170 693c  bo-registry-api<\n-00000700: 2f61 7274 6966 6163 7449 643e 0d0a 2020  /artifactId>..  \n-00000710: 2020 2020 3c76 6572 7369 6f6e 3e24 7b70      <version>${p\n-00000720: 726f 6a65 6374 2e76 6572 7369 6f6e 7d3c  roject.version}<\n-00000730: 2f76 6572 7369 6f6e 3e0d 0a20 2020 203c  /version>..    <\n-00000740: 2f64 6570 656e 6465 6e63 793e 0d0a 2020  /dependency>..  \n-00000750: 2020 3c64 6570 656e 6465 6e63 793e 0d0a    <dependency>..\n-00000760: 2020 2020 2020 3c67 726f 7570 4964 3e6f        <groupId>o\n-00000770: 7267 2e61 7061 6368 652e 6475 6262 6f3c  rg.apache.dubbo<\n-00000780: 2f67 726f 7570 4964 3e0d 0a20 2020 2020  /groupId>..     \n-00000790: 203c 6172 7469 6661 6374 4964 3e64 7562   <artifactId>dub\n-000007a0: 626f 2d63 6f6d 6d6f 6e3c 2f61 7274 6966  bo-common</artif\n-000007b0: 6163 7449 643e 0d0a 2020 2020 2020 3c76  actId>..      <v\n-000007c0: 6572 7369 6f6e 3e24 7b70 726f 6a65 6374  ersion>${project\n-000007d0: 2e76 6572 7369 6f6e 7d3c 2f76 6572 7369  .version}</versi\n-000007e0: 6f6e 3e0d 0a20 2020 203c 2f64 6570 656e  on>..    </depen\n-000007f0: 6465 6e63 793e 0d0a 2020 2020 3c64 6570  dency>..    <dep\n-00000800: 656e 6465 6e63 793e 0d0a 2020 2020 2020  endency>..      \n-00000810: 3c67 726f 7570 4964 3e63 6f6d 2e61 6c69  <groupId>com.ali\n-00000820: 6261 6261 2e6e 6163 6f73 3c2f 6772 6f75  baba.nacos</grou\n-00000830: 7049 643e 0d0a 2020 2020 2020 3c61 7274  pId>..      <art\n-00000840: 6966 6163 7449 643e 6e61 636f 732d 636c  ifactId>nacos-cl\n-00000850: 6965 6e74 3c2f 6172 7469 6661 6374 4964  ient</artifactId\n-00000860: 3e0d 0a20 2020 203c 2f64 6570 656e 6465  >..    </depende\n-00000870: 6e63 793e 0d0a 2020 2020 3c64 6570 656e  ncy>..    <depen\n-00000880: 6465 6e63 793e 0d0a 2020 2020 2020 3c67  dency>..      <g\n-00000890: 726f 7570 4964 3e6f 7267 2e61 7061 6368  roupId>org.apach\n-000008a0: 652e 6475 6262 6f3c 2f67 726f 7570 4964  e.dubbo</groupId\n-000008b0: 3e0d 0a20 2020 2020 203c 6172 7469 6661  >..      <artifa\n-000008c0: 6374 4964 3e64 7562 626f 2d73 6572 6961  ctId>dubbo-seria\n-000008d0: 6c69 7a61 7469 6f6e 2d68 6573 7369 616e  lization-hessian\n-000008e0: 323c 2f61 7274 6966 6163 7449 643e 0d0a  2</artifactId>..\n-000008f0: 2020 2020 2020 3c76 6572 7369 6f6e 3e24        <version>$\n-00000900: 7b70 726f 6a65 6374 2e76 6572 7369 6f6e  {project.version\n-00000910: 7d3c 2f76 6572 7369 6f6e 3e0d 0a20 2020  }</version>..   \n-00000920: 2020 203c 7363 6f70 653e 7465 7374 3c2f     <scope>test</\n-00000930: 7363 6f70 653e 0d0a 2020 2020 3c2f 6465  scope>..    </de\n-00000940: 7065 6e64 656e 6379 3e0d 0a20 2020 203c  pendency>..    <\n-00000950: 6465 7065 6e64 656e 6379 3e0d 0a20 2020  dependency>..   \n-00000960: 2020 203c 6772 6f75 7049 643e 6f72 672e     <groupId>org.\n-00000970: 6170 6163 6865 2e64 7562 626f 3c2f 6772  apache.dubbo</gr\n-00000980: 6f75 7049 643e 0d0a 2020 2020 2020 3c61  oupId>..      <a\n-00000990: 7274 6966 6163 7449 643e 6475 6262 6f2d  rtifactId>dubbo-\n-000009a0: 7270 632d 6475 6262 6f3c 2f61 7274 6966  rpc-dubbo</artif\n-000009b0: 6163 7449 643e 0d0a 2020 2020 2020 3c76  actId>..      <v\n-000009c0: 6572 7369 6f6e 3e24 7b70 726f 6a65 6374  ersion>${project\n-000009d0: 2e76 6572 7369 6f6e 7d3c 2f76 6572 7369  .version}</versi\n-000009e0: 6f6e 3e0d 0a20 2020 2020 203c 7363 6f70  on>..      <scop\n-000009f0: 653e 7465 7374 3c2f 7363 6f70 653e 0d0a  e>test</scope>..\n-00000a00: 2020 2020 3c2f 6465 7065 6e64 656e 6379      </dependency\n-00000a10: 3e0d 0a20 2020 203c 6465 7065 6e64 656e  >..    <dependen\n-00000a20: 6379 3e0d 0a20 2020 2020 203c 6772 6f75  cy>..      <grou\n-00000a30: 7049 643e 6f72 672e 6170 6163 6865 2e64  pId>org.apache.d\n-00000a40: 7562 626f 3c2f 6772 6f75 7049 643e 0d0a  ubbo</groupId>..\n-00000a50: 2020 2020 2020 3c61 7274 6966 6163 7449        <artifactI\n-00000a60: 643e 6475 6262 6f2d 7265 6d6f 7469 6e67  d>dubbo-remoting\n-00000a70: 2d6e 6574 7479 343c 2f61 7274 6966 6163  -netty4</artifac\n-00000a80: 7449 643e 0d0a 2020 2020 2020 3c76 6572  tId>..      <ver\n-00000a90: 7369 6f6e 3e24 7b70 726f 6a65 6374 2e76  sion>${project.v\n-00000aa0: 6572 7369 6f6e 7d3c 2f76 6572 7369 6f6e  ersion}</version\n-00000ab0: 3e0d 0a20 2020 2020 203c 7363 6f70 653e  >..      <scope>\n-00000ac0: 7465 7374 3c2f 7363 6f70 653e 0d0a 2020  test</scope>..  \n-00000ad0: 2020 3c2f 6465 7065 6e64 656e 6379 3e0d    </dependency>.\n-00000ae0: 0a20 2020 203c 6465 7065 6e64 656e 6379  .    <dependency\n-00000af0: 3e0d 0a20 2020 2020 203c 6772 6f75 7049  >..      <groupI\n-00000b00: 643e 6368 2e71 6f73 2e6c 6f67 6261 636b  d>ch.qos.logback\n-00000b10: 3c2f 6772 6f75 7049 643e 0d0a 2020 2020  </groupId>..    \n-00000b20: 2020 3c61 7274 6966 6163 7449 643e 6c6f    <artifactId>lo\n-00000b30: 6762 6163 6b2d 636c 6173 7369 633c 2f61  gback-classic</a\n-00000b40: 7274 6966 6163 7449 643e 0d0a 2020 2020  rtifactId>..    \n-00000b50: 2020 3c73 636f 7065 3e74 6573 743c 2f73    <scope>test</s\n-00000b60: 636f 7065 3e0d 0a20 2020 203c 2f64 6570  cope>..    </dep\n-00000b70: 656e 6465 6e63 793e 0d0a 2020 2020 3c64  endency>..    <d\n-00000b80: 6570 656e 6465 6e63 793e 0d0a 2020 2020  ependency>..    \n-00000b90: 2020 3c67 726f 7570 4964 3e6f 7267 2e73    <groupId>org.s\n-00000ba0: 7072 696e 6766 7261 6d65 776f 726b 3c2f  pringframework</\n-00000bb0: 6772 6f75 7049 643e 0d0a 2020 2020 2020  groupId>..      \n-00000bc0: 3c61 7274 6966 6163 7449 643e 7370 7269  <artifactId>spri\n-00000bd0: 6e67 2d74 6573 743c 2f61 7274 6966 6163  ng-test</artifac\n-00000be0: 7449 643e 0d0a 2020 2020 2020 3c73 636f  tId>..      <sco\n-00000bf0: 7065 3e74 6573 743c 2f73 636f 7065 3e0d  pe>test</scope>.\n-00000c00: 0a20 2020 203c 2f64 6570 656e 6465 6e63  .    </dependenc\n-00000c10: 793e 0d0a 2020 3c2f 6465 7065 6e64 656e  y>..  </dependen\n-00000c20: 6369 6573 3e0d 0a3c 2f70 726f 6a65 6374  cies>..</project\n-00000c30: 3e0d 0a                                  >..\n+00000020: 462d 3822 3f3e 0a3c 212d 2d0a 2020 4c69  F-8\"?>.<!--.  Li\n+00000030: 6365 6e73 6564 2074 6f20 7468 6520 4170  censed to the Ap\n+00000040: 6163 6865 2053 6f66 7477 6172 6520 466f  ache Software Fo\n+00000050: 756e 6461 7469 6f6e 2028 4153 4629 2075  undation (ASF) u\n+00000060: 6e64 6572 206f 6e65 206f 7220 6d6f 7265  nder one or more\n+00000070: 0a20 2063 6f6e 7472 6962 7574 6f72 206c  .  contributor l\n+00000080: 6963 656e 7365 2061 6772 6565 6d65 6e74  icense agreement\n+00000090: 732e 2020 5365 6520 7468 6520 4e4f 5449  s.  See the NOTI\n+000000a0: 4345 2066 696c 6520 6469 7374 7269 6275  CE file distribu\n+000000b0: 7465 6420 7769 7468 0a20 2074 6869 7320  ted with.  this \n+000000c0: 776f 726b 2066 6f72 2061 6464 6974 696f  work for additio\n+000000d0: 6e61 6c20 696e 666f 726d 6174 696f 6e20  nal information \n+000000e0: 7265 6761 7264 696e 6720 636f 7079 7269  regarding copyri\n+000000f0: 6768 7420 6f77 6e65 7273 6869 702e 0a20  ght ownership.. \n+00000100: 2054 6865 2041 5346 206c 6963 656e 7365   The ASF license\n+00000110: 7320 7468 6973 2066 696c 6520 746f 2059  s this file to Y\n+00000120: 6f75 2075 6e64 6572 2074 6865 2041 7061  ou under the Apa\n+00000130: 6368 6520 4c69 6365 6e73 652c 2056 6572  che License, Ver\n+00000140: 7369 6f6e 2032 2e30 0a20 2028 7468 6520  sion 2.0.  (the \n+00000150: 224c 6963 656e 7365 2229 3b20 796f 7520  \"License\"); you \n+00000160: 6d61 7920 6e6f 7420 7573 6520 7468 6973  may not use this\n+00000170: 2066 696c 6520 6578 6365 7074 2069 6e20   file except in \n+00000180: 636f 6d70 6c69 616e 6365 2077 6974 680a  compliance with.\n+00000190: 2020 7468 6520 4c69 6365 6e73 652e 2020    the License.  \n+000001a0: 596f 7520 6d61 7920 6f62 7461 696e 2061  You may obtain a\n+000001b0: 2063 6f70 7920 6f66 2074 6865 204c 6963   copy of the Lic\n+000001c0: 656e 7365 2061 740a 0a20 2020 2020 2068  ense at..      h\n+000001d0: 7474 703a 2f2f 7777 772e 6170 6163 6865  ttp://www.apache\n+000001e0: 2e6f 7267 2f6c 6963 656e 7365 732f 4c49  .org/licenses/LI\n+000001f0: 4345 4e53 452d 322e 300a 0a20 2055 6e6c  CENSE-2.0..  Unl\n+00000200: 6573 7320 7265 7175 6972 6564 2062 7920  ess required by \n+00000210: 6170 706c 6963 6162 6c65 206c 6177 206f  applicable law o\n+00000220: 7220 6167 7265 6564 2074 6f20 696e 2077  r agreed to in w\n+00000230: 7269 7469 6e67 2c20 736f 6674 7761 7265  riting, software\n+00000240: 0a20 2064 6973 7472 6962 7574 6564 2075  .  distributed u\n+00000250: 6e64 6572 2074 6865 204c 6963 656e 7365  nder the License\n+00000260: 2069 7320 6469 7374 7269 6275 7465 6420   is distributed \n+00000270: 6f6e 2061 6e20 2241 5320 4953 2220 4241  on an \"AS IS\" BA\n+00000280: 5349 532c 0a20 2057 4954 484f 5554 2057  SIS,.  WITHOUT W\n+00000290: 4152 5241 4e54 4945 5320 4f52 2043 4f4e  ARRANTIES OR CON\n+000002a0: 4449 5449 4f4e 5320 4f46 2041 4e59 204b  DITIONS OF ANY K\n+000002b0: 494e 442c 2065 6974 6865 7220 6578 7072  IND, either expr\n+000002c0: 6573 7320 6f72 2069 6d70 6c69 6564 2e0a  ess or implied..\n+000002d0: 2020 5365 6520 7468 6520 4c69 6365 6e73    See the Licens\n+000002e0: 6520 666f 7220 7468 6520 7370 6563 6966  e for the specif\n+000002f0: 6963 206c 616e 6775 6167 6520 676f 7665  ic language gove\n+00000300: 726e 696e 6720 7065 726d 6973 7369 6f6e  rning permission\n+00000310: 7320 616e 640a 2020 6c69 6d69 7461 7469  s and.  limitati\n+00000320: 6f6e 7320 756e 6465 7220 7468 6520 4c69  ons under the Li\n+00000330: 6365 6e73 652e 0a20 202d 2d3e 0a3c 7072  cense..  -->.<pr\n+00000340: 6f6a 6563 7420 7873 693a 7363 6865 6d61  oject xsi:schema\n+00000350: 4c6f 6361 7469 6f6e 3d22 6874 7470 3a2f  Location=\"http:/\n+00000360: 2f6d 6176 656e 2e61 7061 6368 652e 6f72  /maven.apache.or\n+00000370: 672f 504f 4d2f 342e 302e 3020 6874 7470  g/POM/4.0.0 http\n+00000380: 733a 2f2f 6d61 7665 6e2e 6170 6163 6865  s://maven.apache\n+00000390: 2e6f 7267 2f78 7364 2f6d 6176 656e 2d34  .org/xsd/maven-4\n+000003a0: 2e30 2e30 2e78 7364 2220 786d 6c6e 733d  .0.0.xsd\" xmlns=\n+000003b0: 2268 7474 703a 2f2f 6d61 7665 6e2e 6170  \"http://maven.ap\n+000003c0: 6163 6865 2e6f 7267 2f50 4f4d 2f34 2e30  ache.org/POM/4.0\n+000003d0: 2e30 220a 2020 2020 786d 6c6e 733a 7873  .0\".    xmlns:xs\n+000003e0: 693d 2268 7474 703a 2f2f 7777 772e 7733  i=\"http://www.w3\n+000003f0: 2e6f 7267 2f32 3030 312f 584d 4c53 6368  .org/2001/XMLSch\n+00000400: 656d 612d 696e 7374 616e 6365 223e 0a20  ema-instance\">. \n+00000410: 203c 6d6f 6465 6c56 6572 7369 6f6e 3e34   <modelVersion>4\n+00000420: 2e30 2e30 3c2f 6d6f 6465 6c56 6572 7369  .0.0</modelVersi\n+00000430: 6f6e 3e0a 2020 3c70 6172 656e 743e 0a20  on>.  <parent>. \n+00000440: 2020 203c 6772 6f75 7049 643e 6f72 672e     <groupId>org.\n+00000450: 6170 6163 6865 2e64 7562 626f 3c2f 6772  apache.dubbo</gr\n+00000460: 6f75 7049 643e 0a20 2020 203c 6172 7469  oupId>.    <arti\n+00000470: 6661 6374 4964 3e64 7562 626f 2d72 6567  factId>dubbo-reg\n+00000480: 6973 7472 793c 2f61 7274 6966 6163 7449  istry</artifactI\n+00000490: 643e 0a20 2020 203c 7665 7273 696f 6e3e  d>.    <version>\n+000004a0: 322e 372e 3130 3c2f 7665 7273 696f 6e3e  2.7.10</version>\n+000004b0: 0a20 203c 2f70 6172 656e 743e 0a20 203c  .  </parent>.  <\n+000004c0: 6772 6f75 7049 643e 6f72 672e 6170 6163  groupId>org.apac\n+000004d0: 6865 2e64 7562 626f 3c2f 6772 6f75 7049  he.dubbo</groupI\n+000004e0: 643e 0a20 203c 6172 7469 6661 6374 4964  d>.  <artifactId\n+000004f0: 3e64 7562 626f 2d72 6567 6973 7472 792d  >dubbo-registry-\n+00000500: 6e61 636f 733c 2f61 7274 6966 6163 7449  nacos</artifactI\n+00000510: 643e 0a20 203c 7665 7273 696f 6e3e 322e  d>.  <version>2.\n+00000520: 372e 3130 3c2f 7665 7273 696f 6e3e 0a20  7.10</version>. \n+00000530: 203c 6e61 6d65 3e24 7b70 726f 6a65 6374   <name>${project\n+00000540: 2e61 7274 6966 6163 7449 647d 3c2f 6e61  .artifactId}</na\n+00000550: 6d65 3e0a 2020 3c64 6573 6372 6970 7469  me>.  <descripti\n+00000560: 6f6e 3e54 6865 204e 6163 6f73 2072 6567  on>The Nacos reg\n+00000570: 6973 7472 7920 6d6f 6475 6c65 206f 6620  istry module of \n+00000580: 4475 6262 6f20 7072 6f6a 6563 743c 2f64  Dubbo project</d\n+00000590: 6573 6372 6970 7469 6f6e 3e0a 2020 3c6c  escription>.  <l\n+000005a0: 6963 656e 7365 733e 0a20 2020 203c 6c69  icenses>.    <li\n+000005b0: 6365 6e73 653e 0a20 2020 2020 203c 6e61  cense>.      <na\n+000005c0: 6d65 3e41 7061 6368 6520 4c69 6365 6e73  me>Apache Licens\n+000005d0: 652c 2056 6572 7369 6f6e 2032 2e30 3c2f  e, Version 2.0</\n+000005e0: 6e61 6d65 3e0a 2020 2020 2020 3c75 726c  name>.      <url\n+000005f0: 3e68 7474 703a 2f2f 7777 772e 6170 6163  >http://www.apac\n+00000600: 6865 2e6f 7267 2f6c 6963 656e 7365 732f  he.org/licenses/\n+00000610: 4c49 4345 4e53 452d 322e 303c 2f75 726c  LICENSE-2.0</url\n+00000620: 3e0a 2020 2020 2020 3c64 6973 7472 6962  >.      <distrib\n+00000630: 7574 696f 6e3e 7265 706f 3c2f 6469 7374  ution>repo</dist\n+00000640: 7269 6275 7469 6f6e 3e0a 2020 2020 3c2f  ribution>.    </\n+00000650: 6c69 6365 6e73 653e 0a20 203c 2f6c 6963  license>.  </lic\n+00000660: 656e 7365 733e 0a20 203c 6465 7065 6e64  enses>.  <depend\n+00000670: 656e 6369 6573 3e0a 2020 2020 3c64 6570  encies>.    <dep\n+00000680: 656e 6465 6e63 793e 0a20 2020 2020 203c  endency>.      <\n+00000690: 6772 6f75 7049 643e 6f72 672e 6170 6163  groupId>org.apac\n+000006a0: 6865 2e64 7562 626f 3c2f 6772 6f75 7049  he.dubbo</groupI\n+000006b0: 643e 0a20 2020 2020 203c 6172 7469 6661  d>.      <artifa\n+000006c0: 6374 4964 3e64 7562 626f 2d72 6567 6973  ctId>dubbo-regis\n+000006d0: 7472 792d 6170 693c 2f61 7274 6966 6163  try-api</artifac\n+000006e0: 7449 643e 0a20 2020 2020 203c 7665 7273  tId>.      <vers\n+000006f0: 696f 6e3e 247b 7072 6f6a 6563 742e 7665  ion>${project.ve\n+00000700: 7273 696f 6e7d 3c2f 7665 7273 696f 6e3e  rsion}</version>\n+00000710: 0a20 2020 203c 2f64 6570 656e 6465 6e63  .    </dependenc\n+00000720: 793e 0a20 2020 203c 6465 7065 6e64 656e  y>.    <dependen\n+00000730: 6379 3e0a 2020 2020 2020 3c67 726f 7570  cy>.      <group\n+00000740: 4964 3e6f 7267 2e61 7061 6368 652e 6475  Id>org.apache.du\n+00000750: 6262 6f3c 2f67 726f 7570 4964 3e0a 2020  bbo</groupId>.  \n+00000760: 2020 2020 3c61 7274 6966 6163 7449 643e      <artifactId>\n+00000770: 6475 6262 6f2d 636f 6d6d 6f6e 3c2f 6172  dubbo-common</ar\n+00000780: 7469 6661 6374 4964 3e0a 2020 2020 2020  tifactId>.      \n+00000790: 3c76 6572 7369 6f6e 3e24 7b70 726f 6a65  <version>${proje\n+000007a0: 6374 2e76 6572 7369 6f6e 7d3c 2f76 6572  ct.version}</ver\n+000007b0: 7369 6f6e 3e0a 2020 2020 3c2f 6465 7065  sion>.    </depe\n+000007c0: 6e64 656e 6379 3e0a 2020 2020 3c64 6570  ndency>.    <dep\n+000007d0: 656e 6465 6e63 793e 0a20 2020 2020 203c  endency>.      <\n+000007e0: 6772 6f75 7049 643e 636f 6d2e 616c 6962  groupId>com.alib\n+000007f0: 6162 612e 6e61 636f 733c 2f67 726f 7570  aba.nacos</group\n+00000800: 4964 3e0a 2020 2020 2020 3c61 7274 6966  Id>.      <artif\n+00000810: 6163 7449 643e 6e61 636f 732d 636c 6965  actId>nacos-clie\n+00000820: 6e74 3c2f 6172 7469 6661 6374 4964 3e0a  nt</artifactId>.\n+00000830: 2020 2020 3c2f 6465 7065 6e64 656e 6379      </dependency\n+00000840: 3e0a 2020 2020 3c64 6570 656e 6465 6e63  >.    <dependenc\n+00000850: 793e 0a20 2020 2020 203c 6772 6f75 7049  y>.      <groupI\n+00000860: 643e 6f72 672e 6170 6163 6865 2e64 7562  d>org.apache.dub\n+00000870: 626f 3c2f 6772 6f75 7049 643e 0a20 2020  bo</groupId>.   \n+00000880: 2020 203c 6172 7469 6661 6374 4964 3e64     <artifactId>d\n+00000890: 7562 626f 2d73 6572 6961 6c69 7a61 7469  ubbo-serializati\n+000008a0: 6f6e 2d68 6573 7369 616e 323c 2f61 7274  on-hessian2</art\n+000008b0: 6966 6163 7449 643e 0a20 2020 2020 203c  ifactId>.      <\n+000008c0: 7665 7273 696f 6e3e 247b 7072 6f6a 6563  version>${projec\n+000008d0: 742e 7665 7273 696f 6e7d 3c2f 7665 7273  t.version}</vers\n+000008e0: 696f 6e3e 0a20 2020 2020 203c 7363 6f70  ion>.      <scop\n+000008f0: 653e 7465 7374 3c2f 7363 6f70 653e 0a20  e>test</scope>. \n+00000900: 2020 203c 2f64 6570 656e 6465 6e63 793e     </dependency>\n+00000910: 0a20 2020 203c 6465 7065 6e64 656e 6379  .    <dependency\n+00000920: 3e0a 2020 2020 2020 3c67 726f 7570 4964  >.      <groupId\n+00000930: 3e6f 7267 2e61 7061 6368 652e 6475 6262  >org.apache.dubb\n+00000940: 6f3c 2f67 726f 7570 4964 3e0a 2020 2020  o</groupId>.    \n+00000950: 2020 3c61 7274 6966 6163 7449 643e 6475    <artifactId>du\n+00000960: 6262 6f2d 7270 632d 6475 6262 6f3c 2f61  bbo-rpc-dubbo</a\n+00000970: 7274 6966 6163 7449 643e 0a20 2020 2020  rtifactId>.     \n+00000980: 203c 7665 7273 696f 6e3e 247b 7072 6f6a   <version>${proj\n+00000990: 6563 742e 7665 7273 696f 6e7d 3c2f 7665  ect.version}</ve\n+000009a0: 7273 696f 6e3e 0a20 2020 2020 203c 7363  rsion>.      <sc\n+000009b0: 6f70 653e 7465 7374 3c2f 7363 6f70 653e  ope>test</scope>\n+000009c0: 0a20 2020 203c 2f64 6570 656e 6465 6e63  .    </dependenc\n+000009d0: 793e 0a20 2020 203c 6465 7065 6e64 656e  y>.    <dependen\n+000009e0: 6379 3e0a 2020 2020 2020 3c67 726f 7570  cy>.      <group\n+000009f0: 4964 3e6f 7267 2e61 7061 6368 652e 6475  Id>org.apache.du\n+00000a00: 6262 6f3c 2f67 726f 7570 4964 3e0a 2020  bbo</groupId>.  \n+00000a10: 2020 2020 3c61 7274 6966 6163 7449 643e      <artifactId>\n+00000a20: 6475 6262 6f2d 7265 6d6f 7469 6e67 2d6e  dubbo-remoting-n\n+00000a30: 6574 7479 343c 2f61 7274 6966 6163 7449  etty4</artifactI\n+00000a40: 643e 0a20 2020 2020 203c 7665 7273 696f  d>.      <versio\n+00000a50: 6e3e 247b 7072 6f6a 6563 742e 7665 7273  n>${project.vers\n+00000a60: 696f 6e7d 3c2f 7665 7273 696f 6e3e 0a20  ion}</version>. \n+00000a70: 2020 2020 203c 7363 6f70 653e 7465 7374       <scope>test\n+00000a80: 3c2f 7363 6f70 653e 0a20 2020 203c 2f64  </scope>.    </d\n+00000a90: 6570 656e 6465 6e63 793e 0a20 2020 203c  ependency>.    <\n+00000aa0: 6465 7065 6e64 656e 6379 3e0a 2020 2020  dependency>.    \n+00000ab0: 2020 3c67 726f 7570 4964 3e63 682e 716f    <groupId>ch.qo\n+00000ac0: 732e 6c6f 6762 6163 6b3c 2f67 726f 7570  s.logback</group\n+00000ad0: 4964 3e0a 2020 2020 2020 3c61 7274 6966  Id>.      <artif\n+00000ae0: 6163 7449 643e 6c6f 6762 6163 6b2d 636c  actId>logback-cl\n+00000af0: 6173 7369 633c 2f61 7274 6966 6163 7449  assic</artifactI\n+00000b00: 643e 0a20 2020 2020 203c 7363 6f70 653e  d>.      <scope>\n+00000b10: 7465 7374 3c2f 7363 6f70 653e 0a20 2020  test</scope>.   \n+00000b20: 203c 2f64 6570 656e 6465 6e63 793e 0a20   </dependency>. \n+00000b30: 2020 203c 6465 7065 6e64 656e 6379 3e0a     <dependency>.\n+00000b40: 2020 2020 2020 3c67 726f 7570 4964 3e6f        <groupId>o\n+00000b50: 7267 2e73 7072 696e 6766 7261 6d65 776f  rg.springframewo\n+00000b60: 726b 3c2f 6772 6f75 7049 643e 0a20 2020  rk</groupId>.   \n+00000b70: 2020 203c 6172 7469 6661 6374 4964 3e73     <artifactId>s\n+00000b80: 7072 696e 672d 7465 7374 3c2f 6172 7469  pring-test</arti\n+00000b90: 6661 6374 4964 3e0a 2020 2020 2020 3c73  factId>.      <s\n+00000ba0: 636f 7065 3e74 6573 743c 2f73 636f 7065  cope>test</scope\n+00000bb0: 3e0a 2020 2020 3c2f 6465 7065 6e64 656e  >.    </dependen\n+00000bc0: 6379 3e0a 2020 3c2f 6465 7065 6e64 656e  cy>.  </dependen\n+00000bd0: 6369 6573 3e0a 3c2f 7072 6f6a 6563 743e  cies>.</project>\n+00000be0: 0a                                       .\n"}]}
