{"diffoscope-json-version": 1, "source1": "/input1", "source2": "/input2", "unified_diff": null, "details": [{"source1": "zipinfo {}", "source2": "zipinfo {}", "unified_diff": "@@ -1,124 +1,124 @@\n-Zip file size: 451795 bytes, number of entries: 122\n+Zip file size: 459461 bytes, number of entries: 122\n -rw----     2.0 fat        0 bx stor 70-Jan-01 00:00 META-INF/\n -rw----     2.0 fat     3750 bX stor 70-Jan-01 00:00 META-INF/DEPENDENCIES\n -rw----     2.0 fat    11358 bX stor 70-Jan-01 00:00 META-INF/LICENSE\n -rw----     2.0 fat       25 bX stor 70-Jan-01 00:00 META-INF/MANIFEST.MF\n -rw----     2.0 fat      175 bX stor 70-Jan-01 00:00 META-INF/NOTICE\n -rw----     2.0 fat        0 bx stor 70-Jan-01 00:00 META-INF/dubbo/\n -rw----     2.0 fat        0 bx stor 70-Jan-01 00:00 META-INF/dubbo/internal/\n -rw----     2.0 fat       63 bX stor 70-Jan-01 00:00 META-INF/dubbo/internal/org.apache.dubbo.common.status.StatusChecker\n -rw----     2.0 fat       85 bX stor 70-Jan-01 00:00 META-INF/dubbo/internal/org.apache.dubbo.event.EventListener\n -rw----     2.0 fat       77 bX stor 70-Jan-01 00:00 META-INF/dubbo/internal/org.apache.dubbo.metadata.ServiceNameMapping\n -rw----     2.0 fat       87 bX stor 70-Jan-01 00:00 META-INF/dubbo/internal/org.apache.dubbo.metadata.WritableMetadataService\n--rw----     2.0 fat      148 bX stor 70-Jan-01 00:00 META-INF/dubbo/internal/org.apache.dubbo.registry.RegistryFactory\n+-rw----     2.0 fat      149 bX stor 70-Jan-01 00:00 META-INF/dubbo/internal/org.apache.dubbo.registry.RegistryFactory\n -rw----     2.0 fat       73 bX stor 70-Jan-01 00:00 META-INF/dubbo/internal/org.apache.dubbo.registry.client.RegistryClusterIdentifier\n -rw----     2.0 fat       64 bX stor 70-Jan-01 00:00 META-INF/dubbo/internal/org.apache.dubbo.registry.client.ServiceDiscovery\n -rw----     2.0 fat       71 bX stor 70-Jan-01 00:00 META-INF/dubbo/internal/org.apache.dubbo.registry.client.ServiceDiscoveryFactory\n--rw----     2.0 fat      568 bX stor 70-Jan-01 00:00 META-INF/dubbo/internal/org.apache.dubbo.registry.client.ServiceInstanceCustomizer\n--rw----     2.0 fat      176 bX stor 70-Jan-01 00:00 META-INF/dubbo/internal/org.apache.dubbo.registry.client.metadata.MetadataServiceURLBuilder\n+-rw----     2.0 fat      574 bX stor 70-Jan-01 00:00 META-INF/dubbo/internal/org.apache.dubbo.registry.client.ServiceInstanceCustomizer\n+-rw----     2.0 fat      177 bX stor 70-Jan-01 00:00 META-INF/dubbo/internal/org.apache.dubbo.registry.client.metadata.MetadataServiceURLBuilder\n -rw----     2.0 fat       84 bX stor 70-Jan-01 00:00 META-INF/dubbo/internal/org.apache.dubbo.registry.client.metadata.SubscribedURLsSynthesizer\n -rw----     2.0 fat       84 bX stor 70-Jan-01 00:00 META-INF/dubbo/internal/org.apache.dubbo.registry.client.migration.MigrationAddressComparator\n -rw----     2.0 fat       78 bX stor 70-Jan-01 00:00 META-INF/dubbo/internal/org.apache.dubbo.registry.client.selector.ServiceInstanceSelector\n -rw----     2.0 fat       74 bX stor 70-Jan-01 00:00 META-INF/dubbo/internal/org.apache.dubbo.registry.integration.RegistryProtocolListener\n--rw----     2.0 fat      164 bX stor 70-Jan-01 00:00 META-INF/dubbo/internal/org.apache.dubbo.rpc.Protocol\n+-rw----     2.0 fat      165 bX stor 70-Jan-01 00:00 META-INF/dubbo/internal/org.apache.dubbo.rpc.Protocol\n -rw----     2.0 fat        0 bx stor 70-Jan-01 00:00 META-INF/maven/\n -rw----     2.0 fat        0 bx stor 70-Jan-01 00:00 META-INF/maven/org.apache.dubbo/\n -rw----     2.0 fat        0 bx stor 70-Jan-01 00:00 META-INF/maven/org.apache.dubbo/dubbo-registry-api/\n -rw----     2.0 fat        0 bX stor 70-Jan-01 00:00 META-INF/maven/org.apache.dubbo/dubbo-registry-api/pom.properties\n--rw----     2.0 fat     3313 bX stor 70-Jan-01 00:00 META-INF/maven/org.apache.dubbo/dubbo-registry-api/pom.xml\n+-rw----     2.0 fat     3225 bX stor 70-Jan-01 00:00 META-INF/maven/org.apache.dubbo/dubbo-registry-api/pom.xml\n -rw----     2.0 fat        0 bx stor 70-Jan-01 00:00 org/\n -rw----     2.0 fat        0 bx stor 70-Jan-01 00:00 org/apache/\n -rw----     2.0 fat        0 bx stor 70-Jan-01 00:00 org/apache/dubbo/\n -rw----     2.0 fat        0 bx stor 70-Jan-01 00:00 org/apache/dubbo/registry/\n--rw----     2.0 fat     1312 bX stor 70-Jan-01 00:00 org/apache/dubbo/registry/AddressListener.java\n--rw----     2.0 fat     2669 bX stor 70-Jan-01 00:00 org/apache/dubbo/registry/Constants.java\n--rw----     2.0 fat     5145 bX stor 70-Jan-01 00:00 org/apache/dubbo/registry/ListenerRegistryWrapper.java\n+-rw----     2.0 fat     1348 bX stor 70-Jan-01 00:00 org/apache/dubbo/registry/AddressListener.java\n+-rw----     2.0 fat     2765 bX stor 70-Jan-01 00:00 org/apache/dubbo/registry/Constants.java\n+-rw----     2.0 fat     5303 bX stor 70-Jan-01 00:00 org/apache/dubbo/registry/ListenerRegistryWrapper.java\n -rw----     2.0 fat     2612 bX stor 70-Jan-01 00:00 org/apache/dubbo/registry/NotifyListener.java\n -rw----     2.0 fat     1338 bX stor 70-Jan-01 00:00 org/apache/dubbo/registry/Registry.java\n -rw----     2.0 fat     2003 bX stor 70-Jan-01 00:00 org/apache/dubbo/registry/RegistryFactory.java\n--rw----     2.0 fat     1529 bX stor 70-Jan-01 00:00 org/apache/dubbo/registry/RegistryFactoryWrapper.java\n+-rw----     2.0 fat     1567 bX stor 70-Jan-01 00:00 org/apache/dubbo/registry/RegistryFactoryWrapper.java\n -rw----     2.0 fat     5634 bX stor 70-Jan-01 00:00 org/apache/dubbo/registry/RegistryService.java\n--rw----     2.0 fat     1166 bX stor 70-Jan-01 00:00 org/apache/dubbo/registry/RegistryServiceListener.java\n+-rw----     2.0 fat     1207 bX stor 70-Jan-01 00:00 org/apache/dubbo/registry/RegistryServiceListener.java\n -rw----     2.0 fat        0 bx stor 70-Jan-01 00:00 org/apache/dubbo/registry/client/\n--rw----     2.0 fat     2099 bX stor 70-Jan-01 00:00 org/apache/dubbo/registry/client/AbstractServiceDiscovery.java\n--rw----     2.0 fat     1731 bX stor 70-Jan-01 00:00 org/apache/dubbo/registry/client/AbstractServiceDiscoveryFactory.java\n--rw----     2.0 fat     1381 bX stor 70-Jan-01 00:00 org/apache/dubbo/registry/client/DefaultRegistryClusterIdentifier.java\n--rw----     2.0 fat     2160 bX stor 70-Jan-01 00:00 org/apache/dubbo/registry/client/DefaultServiceDiscoveryFactory.java\n--rw----     2.0 fat     6064 bX stor 70-Jan-01 00:00 org/apache/dubbo/registry/client/DefaultServiceInstance.java\n--rw----     2.0 fat    10791 bX stor 70-Jan-01 00:00 org/apache/dubbo/registry/client/EventPublishingServiceDiscovery.java\n--rw----     2.0 fat     8176 bX stor 70-Jan-01 00:00 org/apache/dubbo/registry/client/FileSystemServiceDiscovery.java\n--rw----     2.0 fat    12067 bX stor 70-Jan-01 00:00 org/apache/dubbo/registry/client/InstanceAddressURL.java\n--rw----     2.0 fat     1504 bX stor 70-Jan-01 00:00 org/apache/dubbo/registry/client/RegistryClusterIdentifier.java\n--rw----     2.0 fat    11945 bX stor 70-Jan-01 00:00 org/apache/dubbo/registry/client/ServiceDiscovery.java\n--rw----     2.0 fat     1974 bX stor 70-Jan-01 00:00 org/apache/dubbo/registry/client/ServiceDiscoveryFactory.java\n--rw----     2.0 fat    21022 bX stor 70-Jan-01 00:00 org/apache/dubbo/registry/client/ServiceDiscoveryRegistry.java\n--rw----     2.0 fat    11484 bX stor 70-Jan-01 00:00 org/apache/dubbo/registry/client/ServiceDiscoveryRegistryDirectory.java\n--rw----     2.0 fat     1677 bX stor 70-Jan-01 00:00 org/apache/dubbo/registry/client/ServiceDiscoveryRegistryFactory.java\n--rw----     2.0 fat     3498 bX stor 70-Jan-01 00:00 org/apache/dubbo/registry/client/ServiceInstance.java\n--rw----     2.0 fat     1494 bX stor 70-Jan-01 00:00 org/apache/dubbo/registry/client/ServiceInstanceCustomizer.java\n+-rw----     2.0 fat     2155 bX stor 70-Jan-01 00:00 org/apache/dubbo/registry/client/AbstractServiceDiscovery.java\n+-rw----     2.0 fat     1773 bX stor 70-Jan-01 00:00 org/apache/dubbo/registry/client/AbstractServiceDiscoveryFactory.java\n+-rw----     2.0 fat     1415 bX stor 70-Jan-01 00:00 org/apache/dubbo/registry/client/DefaultRegistryClusterIdentifier.java\n+-rw----     2.0 fat     2209 bX stor 70-Jan-01 00:00 org/apache/dubbo/registry/client/DefaultServiceDiscoveryFactory.java\n+-rw----     2.0 fat     6285 bX stor 70-Jan-01 00:00 org/apache/dubbo/registry/client/DefaultServiceInstance.java\n+-rw----     2.0 fat    11106 bX stor 70-Jan-01 00:00 org/apache/dubbo/registry/client/EventPublishingServiceDiscovery.java\n+-rw----     2.0 fat     8397 bX stor 70-Jan-01 00:00 org/apache/dubbo/registry/client/FileSystemServiceDiscovery.java\n+-rw----     2.0 fat    12446 bX stor 70-Jan-01 00:00 org/apache/dubbo/registry/client/InstanceAddressURL.java\n+-rw----     2.0 fat     1540 bX stor 70-Jan-01 00:00 org/apache/dubbo/registry/client/RegistryClusterIdentifier.java\n+-rw----     2.0 fat    12232 bX stor 70-Jan-01 00:00 org/apache/dubbo/registry/client/ServiceDiscovery.java\n+-rw----     2.0 fat     2027 bX stor 70-Jan-01 00:00 org/apache/dubbo/registry/client/ServiceDiscoveryFactory.java\n+-rw----     2.0 fat    21520 bX stor 70-Jan-01 00:00 org/apache/dubbo/registry/client/ServiceDiscoveryRegistry.java\n+-rw----     2.0 fat    11749 bX stor 70-Jan-01 00:00 org/apache/dubbo/registry/client/ServiceDiscoveryRegistryDirectory.java\n+-rw----     2.0 fat     1715 bX stor 70-Jan-01 00:00 org/apache/dubbo/registry/client/ServiceDiscoveryRegistryFactory.java\n+-rw----     2.0 fat     3624 bX stor 70-Jan-01 00:00 org/apache/dubbo/registry/client/ServiceInstance.java\n+-rw----     2.0 fat     1532 bX stor 70-Jan-01 00:00 org/apache/dubbo/registry/client/ServiceInstanceCustomizer.java\n -rw----     2.0 fat        0 bx stor 70-Jan-01 00:00 org/apache/dubbo/registry/client/event/\n--rw----     2.0 fat     1270 bX stor 70-Jan-01 00:00 org/apache/dubbo/registry/client/event/ServiceDiscoveryDestroyedEvent.java\n--rw----     2.0 fat     1275 bX stor 70-Jan-01 00:00 org/apache/dubbo/registry/client/event/ServiceDiscoveryDestroyingEvent.java\n--rw----     2.0 fat     2159 bX stor 70-Jan-01 00:00 org/apache/dubbo/registry/client/event/ServiceDiscoveryEvent.java\n--rw----     2.0 fat     1659 bX stor 70-Jan-01 00:00 org/apache/dubbo/registry/client/event/ServiceDiscoveryExceptionEvent.java\n--rw----     2.0 fat     1316 bX stor 70-Jan-01 00:00 org/apache/dubbo/registry/client/event/ServiceDiscoveryInitializedEvent.java\n--rw----     2.0 fat     1322 bX stor 70-Jan-01 00:00 org/apache/dubbo/registry/client/event/ServiceDiscoveryInitializingEvent.java\n--rw----     2.0 fat     1653 bX stor 70-Jan-01 00:00 org/apache/dubbo/registry/client/event/ServiceInstanceEvent.java\n--rw----     2.0 fat     1351 bX stor 70-Jan-01 00:00 org/apache/dubbo/registry/client/event/ServiceInstancePreRegisteredEvent.java\n--rw----     2.0 fat     1359 bX stor 70-Jan-01 00:00 org/apache/dubbo/registry/client/event/ServiceInstancePreUnregisteredEvent.java\n--rw----     2.0 fat     1344 bX stor 70-Jan-01 00:00 org/apache/dubbo/registry/client/event/ServiceInstanceRegisteredEvent.java\n--rw----     2.0 fat     1381 bX stor 70-Jan-01 00:00 org/apache/dubbo/registry/client/event/ServiceInstanceUnregisteredEvent.java\n--rw----     2.0 fat     2214 bX stor 70-Jan-01 00:00 org/apache/dubbo/registry/client/event/ServiceInstancesChangedEvent.java\n+-rw----     2.0 fat     1303 bX stor 70-Jan-01 00:00 org/apache/dubbo/registry/client/event/ServiceDiscoveryDestroyedEvent.java\n+-rw----     2.0 fat     1308 bX stor 70-Jan-01 00:00 org/apache/dubbo/registry/client/event/ServiceDiscoveryDestroyingEvent.java\n+-rw----     2.0 fat     2226 bX stor 70-Jan-01 00:00 org/apache/dubbo/registry/client/event/ServiceDiscoveryEvent.java\n+-rw----     2.0 fat     1707 bX stor 70-Jan-01 00:00 org/apache/dubbo/registry/client/event/ServiceDiscoveryExceptionEvent.java\n+-rw----     2.0 fat     1349 bX stor 70-Jan-01 00:00 org/apache/dubbo/registry/client/event/ServiceDiscoveryInitializedEvent.java\n+-rw----     2.0 fat     1355 bX stor 70-Jan-01 00:00 org/apache/dubbo/registry/client/event/ServiceDiscoveryInitializingEvent.java\n+-rw----     2.0 fat     1700 bX stor 70-Jan-01 00:00 org/apache/dubbo/registry/client/event/ServiceInstanceEvent.java\n+-rw----     2.0 fat     1385 bX stor 70-Jan-01 00:00 org/apache/dubbo/registry/client/event/ServiceInstancePreRegisteredEvent.java\n+-rw----     2.0 fat     1393 bX stor 70-Jan-01 00:00 org/apache/dubbo/registry/client/event/ServiceInstancePreUnregisteredEvent.java\n+-rw----     2.0 fat     1378 bX stor 70-Jan-01 00:00 org/apache/dubbo/registry/client/event/ServiceInstanceRegisteredEvent.java\n+-rw----     2.0 fat     1416 bX stor 70-Jan-01 00:00 org/apache/dubbo/registry/client/event/ServiceInstanceUnregisteredEvent.java\n+-rw----     2.0 fat     2278 bX stor 70-Jan-01 00:00 org/apache/dubbo/registry/client/event/ServiceInstancesChangedEvent.java\n -rw----     2.0 fat        0 bx stor 70-Jan-01 00:00 org/apache/dubbo/registry/client/event/listener/\n--rw----     2.0 fat     3618 bX stor 70-Jan-01 00:00 org/apache/dubbo/registry/client/event/listener/LoggingEventListener.java\n--rw----     2.0 fat    11317 bX stor 70-Jan-01 00:00 org/apache/dubbo/registry/client/event/listener/ServiceInstancesChangedListener.java\n+-rw----     2.0 fat     3703 bX stor 70-Jan-01 00:00 org/apache/dubbo/registry/client/event/listener/LoggingEventListener.java\n+-rw----     2.0 fat    11585 bX stor 70-Jan-01 00:00 org/apache/dubbo/registry/client/event/listener/ServiceInstancesChangedListener.java\n -rw----     2.0 fat        0 bx stor 70-Jan-01 00:00 org/apache/dubbo/registry/client/metadata/\n--rw----     2.0 fat     3702 bX stor 70-Jan-01 00:00 org/apache/dubbo/registry/client/metadata/MetadataServiceNameMapping.java\n--rw----     2.0 fat     1495 bX stor 70-Jan-01 00:00 org/apache/dubbo/registry/client/metadata/MetadataServiceURLBuilder.java\n--rw----     2.0 fat     2794 bX stor 70-Jan-01 00:00 org/apache/dubbo/registry/client/metadata/MetadataServiceURLParamsMetadataCustomizer.java\n--rw----     2.0 fat     4771 bX stor 70-Jan-01 00:00 org/apache/dubbo/registry/client/metadata/MetadataUtils.java\n--rw----     2.0 fat     2296 bX stor 70-Jan-01 00:00 org/apache/dubbo/registry/client/metadata/ProtocolPortsMetadataCustomizer.java\n--rw----     2.0 fat     2755 bX stor 70-Jan-01 00:00 org/apache/dubbo/registry/client/metadata/RestProtocolSubscribedURLsSynthesizer.java\n--rw----     2.0 fat     4021 bX stor 70-Jan-01 00:00 org/apache/dubbo/registry/client/metadata/ServiceInstanceMetadataCustomizer.java\n--rw----     2.0 fat    13453 bX stor 70-Jan-01 00:00 org/apache/dubbo/registry/client/metadata/ServiceInstanceMetadataUtils.java\n--rw----     2.0 fat     2159 bX stor 70-Jan-01 00:00 org/apache/dubbo/registry/client/metadata/SpringCloudMetadataServiceURLBuilder.java\n--rw----     2.0 fat     3710 bX stor 70-Jan-01 00:00 org/apache/dubbo/registry/client/metadata/StandardMetadataServiceURLBuilder.java\n--rw----     2.0 fat     2120 bX stor 70-Jan-01 00:00 org/apache/dubbo/registry/client/metadata/SubscribedURLsSynthesizer.java\n+-rw----     2.0 fat     3788 bX stor 70-Jan-01 00:00 org/apache/dubbo/registry/client/metadata/MetadataServiceNameMapping.java\n+-rw----     2.0 fat     1535 bX stor 70-Jan-01 00:00 org/apache/dubbo/registry/client/metadata/MetadataServiceURLBuilder.java\n+-rw----     2.0 fat     2859 bX stor 70-Jan-01 00:00 org/apache/dubbo/registry/client/metadata/MetadataServiceURLParamsMetadataCustomizer.java\n+-rw----     2.0 fat     4873 bX stor 70-Jan-01 00:00 org/apache/dubbo/registry/client/metadata/MetadataUtils.java\n+-rw----     2.0 fat     2351 bX stor 70-Jan-01 00:00 org/apache/dubbo/registry/client/metadata/ProtocolPortsMetadataCustomizer.java\n+-rw----     2.0 fat     2822 bX stor 70-Jan-01 00:00 org/apache/dubbo/registry/client/metadata/RestProtocolSubscribedURLsSynthesizer.java\n+-rw----     2.0 fat     4109 bX stor 70-Jan-01 00:00 org/apache/dubbo/registry/client/metadata/ServiceInstanceMetadataCustomizer.java\n+-rw----     2.0 fat    13771 bX stor 70-Jan-01 00:00 org/apache/dubbo/registry/client/metadata/ServiceInstanceMetadataUtils.java\n+-rw----     2.0 fat     2210 bX stor 70-Jan-01 00:00 org/apache/dubbo/registry/client/metadata/SpringCloudMetadataServiceURLBuilder.java\n+-rw----     2.0 fat     3799 bX stor 70-Jan-01 00:00 org/apache/dubbo/registry/client/metadata/StandardMetadataServiceURLBuilder.java\n+-rw----     2.0 fat     2175 bX stor 70-Jan-01 00:00 org/apache/dubbo/registry/client/metadata/SubscribedURLsSynthesizer.java\n -rw----     2.0 fat        0 bx stor 70-Jan-01 00:00 org/apache/dubbo/registry/client/metadata/store/\n--rw----     2.0 fat    11874 bX stor 70-Jan-01 00:00 org/apache/dubbo/registry/client/metadata/store/InMemoryWritableMetadataService.java\n--rw----     2.0 fat     7562 bX stor 70-Jan-01 00:00 org/apache/dubbo/registry/client/metadata/store/RemoteMetadataServiceImpl.java\n+-rw----     2.0 fat    12175 bX stor 70-Jan-01 00:00 org/apache/dubbo/registry/client/metadata/store/InMemoryWritableMetadataService.java\n+-rw----     2.0 fat     7705 bX stor 70-Jan-01 00:00 org/apache/dubbo/registry/client/metadata/store/RemoteMetadataServiceImpl.java\n -rw----     2.0 fat        0 bx stor 70-Jan-01 00:00 org/apache/dubbo/registry/client/migration/\n--rw----     2.0 fat     3221 bX stor 70-Jan-01 00:00 org/apache/dubbo/registry/client/migration/DefaultMigrationAddressComparator.java\n--rw----     2.0 fat      920 bX stor 70-Jan-01 00:00 org/apache/dubbo/registry/client/migration/InvokersChangedListener.java\n--rw----     2.0 fat     1108 bX stor 70-Jan-01 00:00 org/apache/dubbo/registry/client/migration/MigrationAddressComparator.java\n--rw----     2.0 fat    14787 bX stor 70-Jan-01 00:00 org/apache/dubbo/registry/client/migration/MigrationInvoker.java\n--rw----     2.0 fat     2745 bX stor 70-Jan-01 00:00 org/apache/dubbo/registry/client/migration/MigrationRuleHandler.java\n--rw----     2.0 fat     4504 bX stor 70-Jan-01 00:00 org/apache/dubbo/registry/client/migration/MigrationRuleListener.java\n--rw----     2.0 fat     2612 bX stor 70-Jan-01 00:00 org/apache/dubbo/registry/client/migration/ServiceDiscoveryMigrationInvoker.java\n--rw----     2.0 fat     1027 bX stor 70-Jan-01 00:00 org/apache/dubbo/registry/client/package-info.java\n+-rw----     2.0 fat     3295 bX stor 70-Jan-01 00:00 org/apache/dubbo/registry/client/migration/DefaultMigrationAddressComparator.java\n+-rw----     2.0 fat      940 bX stor 70-Jan-01 00:00 org/apache/dubbo/registry/client/migration/InvokersChangedListener.java\n+-rw----     2.0 fat     1133 bX stor 70-Jan-01 00:00 org/apache/dubbo/registry/client/migration/MigrationAddressComparator.java\n+-rw----     2.0 fat    15177 bX stor 70-Jan-01 00:00 org/apache/dubbo/registry/client/migration/MigrationInvoker.java\n+-rw----     2.0 fat     2816 bX stor 70-Jan-01 00:00 org/apache/dubbo/registry/client/migration/MigrationRuleHandler.java\n+-rw----     2.0 fat     4616 bX stor 70-Jan-01 00:00 org/apache/dubbo/registry/client/migration/MigrationRuleListener.java\n+-rw----     2.0 fat     2672 bX stor 70-Jan-01 00:00 org/apache/dubbo/registry/client/migration/ServiceDiscoveryMigrationInvoker.java\n+-rw----     2.0 fat     1049 bX stor 70-Jan-01 00:00 org/apache/dubbo/registry/client/package-info.java\n -rw----     2.0 fat        0 bx stor 70-Jan-01 00:00 org/apache/dubbo/registry/client/selector/\n--rw----     2.0 fat     1705 bX stor 70-Jan-01 00:00 org/apache/dubbo/registry/client/selector/RandomServiceInstanceSelector.java\n--rw----     2.0 fat     1699 bX stor 70-Jan-01 00:00 org/apache/dubbo/registry/client/selector/ServiceInstanceSelector.java\n+-rw----     2.0 fat     1752 bX stor 70-Jan-01 00:00 org/apache/dubbo/registry/client/selector/RandomServiceInstanceSelector.java\n+-rw----     2.0 fat     1742 bX stor 70-Jan-01 00:00 org/apache/dubbo/registry/client/selector/ServiceInstanceSelector.java\n -rw----     2.0 fat        0 bx stor 70-Jan-01 00:00 org/apache/dubbo/registry/integration/\n--rw----     2.0 fat     3892 bX stor 70-Jan-01 00:00 org/apache/dubbo/registry/integration/AbstractConfiguratorListener.java\n--rw----     2.0 fat    11260 bX stor 70-Jan-01 00:00 org/apache/dubbo/registry/integration/DynamicDirectory.java\n--rw----     2.0 fat     3267 bX stor 70-Jan-01 00:00 org/apache/dubbo/registry/integration/InterfaceCompatibleRegistryProtocol.java\n--rw----     2.0 fat      916 bX stor 70-Jan-01 00:00 org/apache/dubbo/registry/integration/InvokersChangedListener.java\n+-rw----     2.0 fat     3989 bX stor 70-Jan-01 00:00 org/apache/dubbo/registry/integration/AbstractConfiguratorListener.java\n+-rw----     2.0 fat    11545 bX stor 70-Jan-01 00:00 org/apache/dubbo/registry/integration/DynamicDirectory.java\n+-rw----     2.0 fat     3340 bX stor 70-Jan-01 00:00 org/apache/dubbo/registry/integration/InterfaceCompatibleRegistryProtocol.java\n+-rw----     2.0 fat      937 bX stor 70-Jan-01 00:00 org/apache/dubbo/registry/integration/InvokersChangedListener.java\n -rw----     2.0 fat    29242 bX stor 70-Jan-01 00:00 org/apache/dubbo/registry/integration/RegistryDirectory.java\n--rw----     2.0 fat    37486 bX stor 70-Jan-01 00:00 org/apache/dubbo/registry/integration/RegistryProtocol.java\n--rw----     2.0 fat     2095 bX stor 70-Jan-01 00:00 org/apache/dubbo/registry/integration/RegistryProtocolListener.java\n+-rw----     2.0 fat    38329 bX stor 70-Jan-01 00:00 org/apache/dubbo/registry/integration/RegistryProtocol.java\n+-rw----     2.0 fat     2148 bX stor 70-Jan-01 00:00 org/apache/dubbo/registry/integration/RegistryProtocolListener.java\n -rw----     2.0 fat        0 bx stor 70-Jan-01 00:00 org/apache/dubbo/registry/retry/\n--rw----     2.0 fat     4424 bX stor 70-Jan-01 00:00 org/apache/dubbo/registry/retry/AbstractRetryTask.java\n+-rw----     2.0 fat     4557 bX stor 70-Jan-01 00:00 org/apache/dubbo/registry/retry/AbstractRetryTask.java\n -rw----     2.0 fat     1487 bX stor 70-Jan-01 00:00 org/apache/dubbo/registry/retry/FailedRegisteredTask.java\n -rw----     2.0 fat     1760 bX stor 70-Jan-01 00:00 org/apache/dubbo/registry/retry/FailedSubscribedTask.java\n -rw----     2.0 fat     1499 bX stor 70-Jan-01 00:00 org/apache/dubbo/registry/retry/FailedUnregisteredTask.java\n -rw----     2.0 fat     1770 bX stor 70-Jan-01 00:00 org/apache/dubbo/registry/retry/FailedUnsubscribedTask.java\n--rw----     2.0 fat     1438 bX stor 70-Jan-01 00:00 org/apache/dubbo/registry/retry/ReExportTask.java\n+-rw----     2.0 fat     1479 bX stor 70-Jan-01 00:00 org/apache/dubbo/registry/retry/ReExportTask.java\n -rw----     2.0 fat        0 bx stor 70-Jan-01 00:00 org/apache/dubbo/registry/status/\n -rw----     2.0 fat     2086 bX stor 70-Jan-01 00:00 org/apache/dubbo/registry/status/RegistryStatusChecker.java\n -rw----     2.0 fat        0 bx stor 70-Jan-01 00:00 org/apache/dubbo/registry/support/\n -rw----     2.0 fat    21375 bX stor 70-Jan-01 00:00 org/apache/dubbo/registry/support/AbstractRegistry.java\n -rw----     2.0 fat     7562 bX stor 70-Jan-01 00:00 org/apache/dubbo/registry/support/AbstractRegistryFactory.java\n -rw----     2.0 fat    17966 bX stor 70-Jan-01 00:00 org/apache/dubbo/registry/support/FailbackRegistry.java\n -rw----     2.0 fat     1362 bX stor 70-Jan-01 00:00 org/apache/dubbo/registry/support/SkipFailbackWrapperException.java\n-122 files, 424157 bytes uncompressed, 424157 bytes compressed:  0.0%\n+122 files, 431823 bytes uncompressed, 431823 bytes compressed:  0.0%\n"}, {"source1": "zipdetails --redact --scan --utc {}", "source2": "zipdetails --redact --scan --utc {}", "unified_diff": "@@ -305,6620 +305,6620 @@\n #          Zero length filename\n #\n 04115 Extra ID #1           5455 (21589) 'Extended Timestamp [UT]'\n 04117   Length              0005 (5)\n 04119   Flags               01 (1) 'Modification'\n 0411A   Modification Time   00000000 (0) 'Thu Jan  1 00:00:00 1970'\n 0411E PAYLOAD               XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX\n-                            XXXXXXXXXXXXXXX\n+                            XXXXXXXXXXXXXXXX\n \n-041B2 DATA DESCRIPTOR       08074B50 (134695760)\n-041B6 CRC                   83C8809D (2210955421)\n-041BA Compressed Size       00000094 (148)\n-041BE Uncompressed Size     00000094 (148)\n-\n-041C2 LOCAL HEADER #13      04034B50 (67324752)\n-041C6 Extract Zip Spec      14 (20) '2.0'\n-041C7 Extract OS            00 (0) 'MS-DOS'\n-041C8 General Purpose Flag  0008 (8)\n-      [Bit  3]              1 'Streamed'\n-041CA Compression Method    0000 (0) 'Stored'\n-041CC Modification Time     EC210000 (3961585664) 'Wed Jan  1 00:00:00 2098'\n-041D0 CRC                   00000000 (0)\n-041D4 Compressed Size       00000000 (0)\n-041D8 Uncompressed Size     00000000 (0)\n-041DC Filename Length       0052 (82)\n-041DE Extra Length          0009 (9)\n-041E0 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n-#\n-# WARNING: Offset 0x41E0: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n-#          Zero length filename\n-#\n-04232 Extra ID #1           5455 (21589) 'Extended Timestamp [UT]'\n-04234   Length              0005 (5)\n-04236   Flags               01 (1) 'Modification'\n-04237   Modification Time   00000000 (0) 'Thu Jan  1 00:00:00 1970'\n-0423B PAYLOAD               XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX\n-\n-04284 DATA DESCRIPTOR       08074B50 (134695760)\n-04288 CRC                   290EDBFF (688839679)\n-0428C Compressed Size       00000049 (73)\n-04290 Uncompressed Size     00000049 (73)\n-\n-04294 LOCAL HEADER #14      04034B50 (67324752)\n-04298 Extract Zip Spec      14 (20) '2.0'\n-04299 Extract OS            00 (0) 'MS-DOS'\n-0429A General Purpose Flag  0008 (8)\n-      [Bit  3]              1 'Streamed'\n-0429C Compression Method    0000 (0) 'Stored'\n-0429E Modification Time     EC210000 (3961585664) 'Wed Jan  1 00:00:00 2098'\n-042A2 CRC                   00000000 (0)\n-042A6 Compressed Size       00000000 (0)\n-042AA Uncompressed Size     00000000 (0)\n-042AE Filename Length       0049 (73)\n-042B0 Extra Length          0009 (9)\n-042B2 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n-#\n-# WARNING: Offset 0x42B2: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n-#          Zero length filename\n-#\n-042FB Extra ID #1           5455 (21589) 'Extended Timestamp [UT]'\n-042FD   Length              0005 (5)\n-042FF   Flags               01 (1) 'Modification'\n-04300   Modification Time   00000000 (0) 'Thu Jan  1 00:00:00 1970'\n-04304 PAYLOAD               XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX\n-\n-04344 DATA DESCRIPTOR       08074B50 (134695760)\n-04348 CRC                   1BD83592 (467154322)\n-0434C Compressed Size       00000040 (64)\n-04350 Uncompressed Size     00000040 (64)\n-\n-04354 LOCAL HEADER #15      04034B50 (67324752)\n-04358 Extract Zip Spec      14 (20) '2.0'\n-04359 Extract OS            00 (0) 'MS-DOS'\n-0435A General Purpose Flag  0008 (8)\n-      [Bit  3]              1 'Streamed'\n-0435C Compression Method    0000 (0) 'Stored'\n-0435E Modification Time     EC210000 (3961585664) 'Wed Jan  1 00:00:00 2098'\n-04362 CRC                   00000000 (0)\n-04366 Compressed Size       00000000 (0)\n-0436A Uncompressed Size     00000000 (0)\n-0436E Filename Length       0050 (80)\n-04370 Extra Length          0009 (9)\n-04372 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n-#\n-# WARNING: Offset 0x4372: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n-#          Zero length filename\n-#\n-043C2 Extra ID #1           5455 (21589) 'Extended Timestamp [UT]'\n-043C4   Length              0005 (5)\n-043C6   Flags               01 (1) 'Modification'\n-043C7   Modification Time   00000000 (0) 'Thu Jan  1 00:00:00 1970'\n-043CB PAYLOAD               XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX\n-\n-04412 DATA DESCRIPTOR       08074B50 (134695760)\n-04416 CRC                   C6FA5A39 (3338295865)\n-0441A Compressed Size       00000047 (71)\n-0441E Uncompressed Size     00000047 (71)\n-\n-04422 LOCAL HEADER #16      04034B50 (67324752)\n-04426 Extract Zip Spec      14 (20) '2.0'\n-04427 Extract OS            00 (0) 'MS-DOS'\n-04428 General Purpose Flag  0008 (8)\n-      [Bit  3]              1 'Streamed'\n-0442A Compression Method    0000 (0) 'Stored'\n-0442C Modification Time     EC210000 (3961585664) 'Wed Jan  1 00:00:00 2098'\n-04430 CRC                   00000000 (0)\n-04434 Compressed Size       00000000 (0)\n-04438 Uncompressed Size     00000000 (0)\n-0443C Filename Length       0052 (82)\n-0443E Extra Length          0009 (9)\n-04440 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n-#\n-# WARNING: Offset 0x4440: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n-#          Zero length filename\n-#\n-04492 Extra ID #1           5455 (21589) 'Extended Timestamp [UT]'\n-04494   Length              0005 (5)\n-04496   Flags               01 (1) 'Modification'\n-04497   Modification Time   00000000 (0) 'Thu Jan  1 00:00:00 1970'\n-0449B PAYLOAD\n-\n-046D3 DATA DESCRIPTOR       08074B50 (134695760)\n-046D7 CRC                   2E8D92A5 (781030053)\n-046DB Compressed Size       00000238 (568)\n-046DF Uncompressed Size     00000238 (568)\n-\n-046E3 LOCAL HEADER #17      04034B50 (67324752)\n-046E7 Extract Zip Spec      14 (20) '2.0'\n-046E8 Extract OS            00 (0) 'MS-DOS'\n-046E9 General Purpose Flag  0008 (8)\n-      [Bit  3]              1 'Streamed'\n-046EB Compression Method    0000 (0) 'Stored'\n-046ED Modification Time     EC210000 (3961585664) 'Wed Jan  1 00:00:00 2098'\n-046F1 CRC                   00000000 (0)\n-046F5 Compressed Size       00000000 (0)\n-046F9 Uncompressed Size     00000000 (0)\n-046FD Filename Length       005B (91)\n-046FF Extra Length          0009 (9)\n-04701 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n-#\n-# WARNING: Offset 0x4701: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n-#          Zero length filename\n-#\n-0475C Extra ID #1           5455 (21589) 'Extended Timestamp [UT]'\n-0475E   Length              0005 (5)\n-04760   Flags               01 (1) 'Modification'\n-04761   Modification Time   00000000 (0) 'Thu Jan  1 00:00:00 1970'\n-04765 PAYLOAD               XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX\n-                            XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX\n-\n-04815 DATA DESCRIPTOR       08074B50 (134695760)\n-04819 CRC                   2937F90B (691534091)\n-0481D Compressed Size       000000B0 (176)\n-04821 Uncompressed Size     000000B0 (176)\n-\n-04825 LOCAL HEADER #18      04034B50 (67324752)\n-04829 Extract Zip Spec      14 (20) '2.0'\n-0482A Extract OS            00 (0) 'MS-DOS'\n-0482B General Purpose Flag  0008 (8)\n-      [Bit  3]              1 'Streamed'\n-0482D Compression Method    0000 (0) 'Stored'\n-0482F Modification Time     EC210000 (3961585664) 'Wed Jan  1 00:00:00 2098'\n-04833 CRC                   00000000 (0)\n-04837 Compressed Size       00000000 (0)\n-0483B Uncompressed Size     00000000 (0)\n-0483F Filename Length       005B (91)\n-04841 Extra Length          0009 (9)\n-04843 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n-#\n-# WARNING: Offset 0x4843: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n-#          Zero length filename\n-#\n-0489E Extra ID #1           5455 (21589) 'Extended Timestamp [UT]'\n-048A0   Length              0005 (5)\n-048A2   Flags               01 (1) 'Modification'\n-048A3   Modification Time   00000000 (0) 'Thu Jan  1 00:00:00 1970'\n-048A7 PAYLOAD               XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX\n-\n-048FB DATA DESCRIPTOR       08074B50 (134695760)\n-048FF CRC                   A49FCF77 (2761936759)\n-04903 Compressed Size       00000054 (84)\n-04907 Uncompressed Size     00000054 (84)\n-\n-0490B LOCAL HEADER #19      04034B50 (67324752)\n-0490F Extract Zip Spec      14 (20) '2.0'\n-04910 Extract OS            00 (0) 'MS-DOS'\n-04911 General Purpose Flag  0008 (8)\n-      [Bit  3]              1 'Streamed'\n-04913 Compression Method    0000 (0) 'Stored'\n-04915 Modification Time     EC210000 (3961585664) 'Wed Jan  1 00:00:00 2098'\n-04919 CRC                   00000000 (0)\n-0491D Compressed Size       00000000 (0)\n-04921 Uncompressed Size     00000000 (0)\n-04925 Filename Length       005D (93)\n-04927 Extra Length          0009 (9)\n-04929 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n-#\n-# WARNING: Offset 0x4929: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n-#          Zero length filename\n-#\n-04986 Extra ID #1           5455 (21589) 'Extended Timestamp [UT]'\n-04988   Length              0005 (5)\n-0498A   Flags               01 (1) 'Modification'\n-0498B   Modification Time   00000000 (0) 'Thu Jan  1 00:00:00 1970'\n-0498F PAYLOAD               XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX\n-\n-049E3 DATA DESCRIPTOR       08074B50 (134695760)\n-049E7 CRC                   F515114D (4111798605)\n-049EB Compressed Size       00000054 (84)\n-049EF Uncompressed Size     00000054 (84)\n-\n-049F3 LOCAL HEADER #20      04034B50 (67324752)\n-049F7 Extract Zip Spec      14 (20) '2.0'\n-049F8 Extract OS            00 (0) 'MS-DOS'\n-049F9 General Purpose Flag  0008 (8)\n-      [Bit  3]              1 'Streamed'\n-049FB Compression Method    0000 (0) 'Stored'\n-049FD Modification Time     EC210000 (3961585664) 'Wed Jan  1 00:00:00 2098'\n-04A01 CRC                   00000000 (0)\n-04A05 Compressed Size       00000000 (0)\n-04A09 Uncompressed Size     00000000 (0)\n-04A0D Filename Length       0059 (89)\n-04A0F Extra Length          0009 (9)\n-04A11 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n-#\n-# WARNING: Offset 0x4A11: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n-#          Zero length filename\n-#\n-04A6A Extra ID #1           5455 (21589) 'Extended Timestamp [UT]'\n-04A6C   Length              0005 (5)\n-04A6E   Flags               01 (1) 'Modification'\n-04A6F   Modification Time   00000000 (0) 'Thu Jan  1 00:00:00 1970'\n-04A73 PAYLOAD               XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX\n-\n-04AC1 DATA DESCRIPTOR       08074B50 (134695760)\n-04AC5 CRC                   285254BA (676484282)\n-04AC9 Compressed Size       0000004E (78)\n-04ACD Uncompressed Size     0000004E (78)\n-\n-04AD1 LOCAL HEADER #21      04034B50 (67324752)\n-04AD5 Extract Zip Spec      14 (20) '2.0'\n-04AD6 Extract OS            00 (0) 'MS-DOS'\n-04AD7 General Purpose Flag  0008 (8)\n-      [Bit  3]              1 'Streamed'\n-04AD9 Compression Method    0000 (0) 'Stored'\n-04ADB Modification Time     EC210000 (3961585664) 'Wed Jan  1 00:00:00 2098'\n-04ADF CRC                   00000000 (0)\n-04AE3 Compressed Size       00000000 (0)\n-04AE7 Uncompressed Size     00000000 (0)\n-04AEB Filename Length       0056 (86)\n-04AED Extra Length          0009 (9)\n-04AEF Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n-#\n-# WARNING: Offset 0x4AEF: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n-#          Zero length filename\n-#\n-04B45 Extra ID #1           5455 (21589) 'Extended Timestamp [UT]'\n-04B47   Length              0005 (5)\n-04B49   Flags               01 (1) 'Modification'\n-04B4A   Modification Time   00000000 (0) 'Thu Jan  1 00:00:00 1970'\n-04B4E PAYLOAD               XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX\n-\n-04B98 DATA DESCRIPTOR       08074B50 (134695760)\n-04B9C CRC                   9DAB4985 (2645248389)\n-04BA0 Compressed Size       0000004A (74)\n-04BA4 Uncompressed Size     0000004A (74)\n-\n-04BA8 LOCAL HEADER #22      04034B50 (67324752)\n-04BAC Extract Zip Spec      14 (20) '2.0'\n-04BAD Extract OS            00 (0) 'MS-DOS'\n-04BAE General Purpose Flag  0008 (8)\n-      [Bit  3]              1 'Streamed'\n-04BB0 Compression Method    0000 (0) 'Stored'\n-04BB2 Modification Time     EC210000 (3961585664) 'Wed Jan  1 00:00:00 2098'\n-04BB6 CRC                   00000000 (0)\n-04BBA Compressed Size       00000000 (0)\n-04BBE Uncompressed Size     00000000 (0)\n-04BC2 Filename Length       0035 (53)\n-04BC4 Extra Length          0009 (9)\n-04BC6 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n-#\n-# WARNING: Offset 0x4BC6: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n-#          Zero length filename\n-#\n-04BFB Extra ID #1           5455 (21589) 'Extended Timestamp [UT]'\n-04BFD   Length              0005 (5)\n-04BFF   Flags               01 (1) 'Modification'\n-04C00   Modification Time   00000000 (0) 'Thu Jan  1 00:00:00 1970'\n-04C04 PAYLOAD               XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX\n-                            XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX\n-\n-04CA8 DATA DESCRIPTOR       08074B50 (134695760)\n-04CAC CRC                   7DCDDED9 (2110643929)\n-04CB0 Compressed Size       000000A4 (164)\n-04CB4 Uncompressed Size     000000A4 (164)\n-\n-04CB8 LOCAL HEADER #23      04034B50 (67324752)\n-04CBC Extract Zip Spec      14 (20) '2.0'\n-04CBD Extract OS            00 (0) 'MS-DOS'\n-04CBE General Purpose Flag  0000 (0)\n-04CC0 Compression Method    0000 (0) 'Stored'\n-04CC2 Modification Time     EC210000 (3961585664) 'Wed Jan  1 00:00:00 2098'\n-04CC6 CRC                   00000000 (0)\n-04CCA Compressed Size       00000000 (0)\n-04CCE Uncompressed Size     00000000 (0)\n-04CD2 Filename Length       000F (15)\n-04CD4 Extra Length          0009 (9)\n-04CD6 Filename              'XXXXXXXXXXXXXXX'\n-#\n-# WARNING: Offset 0x4CD6: Filename 'XXXXXXXXXXXXXXX'\n-#          Zero length filename\n-#\n-04CE5 Extra ID #1           5455 (21589) 'Extended Timestamp [UT]'\n-04CE7   Length              0005 (5)\n-04CE9   Flags               01 (1) 'Modification'\n-04CEA   Modification Time   00000000 (0) 'Thu Jan  1 00:00:00 1970'\n-\n-04CEE LOCAL HEADER #24      04034B50 (67324752)\n-04CF2 Extract Zip Spec      14 (20) '2.0'\n-04CF3 Extract OS            00 (0) 'MS-DOS'\n-04CF4 General Purpose Flag  0000 (0)\n-04CF6 Compression Method    0000 (0) 'Stored'\n-04CF8 Modification Time     EC210000 (3961585664) 'Wed Jan  1 00:00:00 2098'\n-04CFC CRC                   00000000 (0)\n-04D00 Compressed Size       00000000 (0)\n-04D04 Uncompressed Size     00000000 (0)\n-04D08 Filename Length       0020 (32)\n-04D0A Extra Length          0009 (9)\n-04D0C Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n-#\n-# WARNING: Offset 0x4D0C: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n-#          Zero length filename\n-#\n-04D2C Extra ID #1           5455 (21589) 'Extended Timestamp [UT]'\n-04D2E   Length              0005 (5)\n-04D30   Flags               01 (1) 'Modification'\n-04D31   Modification Time   00000000 (0) 'Thu Jan  1 00:00:00 1970'\n-\n-04D35 LOCAL HEADER #25      04034B50 (67324752)\n-04D39 Extract Zip Spec      14 (20) '2.0'\n-04D3A Extract OS            00 (0) 'MS-DOS'\n-04D3B General Purpose Flag  0000 (0)\n-04D3D Compression Method    0000 (0) 'Stored'\n-04D3F Modification Time     EC210000 (3961585664) 'Wed Jan  1 00:00:00 2098'\n-04D43 CRC                   00000000 (0)\n-04D47 Compressed Size       00000000 (0)\n-04D4B Uncompressed Size     00000000 (0)\n-04D4F Filename Length       0033 (51)\n-04D51 Extra Length          0009 (9)\n-04D53 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n-#\n-# WARNING: Offset 0x4D53: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n-#          Zero length filename\n-#\n-04D86 Extra ID #1           5455 (21589) 'Extended Timestamp [UT]'\n-04D88   Length              0005 (5)\n-04D8A   Flags               01 (1) 'Modification'\n-04D8B   Modification Time   00000000 (0) 'Thu Jan  1 00:00:00 1970'\n-\n-04D8F LOCAL HEADER #26      04034B50 (67324752)\n-04D93 Extract Zip Spec      14 (20) '2.0'\n-04D94 Extract OS            00 (0) 'MS-DOS'\n-04D95 General Purpose Flag  0008 (8)\n-      [Bit  3]              1 'Streamed'\n-04D97 Compression Method    0000 (0) 'Stored'\n-04D99 Modification Time     EC210000 (3961585664) 'Wed Jan  1 00:00:00 2098'\n-04D9D CRC                   00000000 (0)\n-04DA1 Compressed Size       00000000 (0)\n-04DA5 Uncompressed Size     00000000 (0)\n-04DA9 Filename Length       0041 (65)\n-04DAB Extra Length          0009 (9)\n-04DAD Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n-#\n-# WARNING: Offset 0x4DAD: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n-#          Zero length filename\n-#\n-04DEE Extra ID #1           5455 (21589) 'Extended Timestamp [UT]'\n-04DF0   Length              0005 (5)\n-04DF2   Flags               01 (1) 'Modification'\n-04DF3   Modification Time   00000000 (0) 'Thu Jan  1 00:00:00 1970'\n-\n-04DF7 DATA DESCRIPTOR       08074B50 (134695760)\n-04DFB CRC                   00000000 (0)\n-04DFF Compressed Size       00000000 (0)\n-04E03 Uncompressed Size     00000000 (0)\n-\n-04E07 LOCAL HEADER #27      04034B50 (67324752)\n-04E0B Extract Zip Spec      14 (20) '2.0'\n-04E0C Extract OS            00 (0) 'MS-DOS'\n-04E0D General Purpose Flag  0008 (8)\n-      [Bit  3]              1 'Streamed'\n-04E0F Compression Method    0000 (0) 'Stored'\n-04E11 Modification Time     EC210000 (3961585664) 'Wed Jan  1 00:00:00 2098'\n-04E15 CRC                   00000000 (0)\n-04E19 Compressed Size       00000000 (0)\n-04E1D Uncompressed Size     00000000 (0)\n-04E21 Filename Length       003A (58)\n-04E23 Extra Length          0009 (9)\n-04E25 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n-#\n-# WARNING: Offset 0x4E25: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n-#          Zero length filename\n-#\n-04E5F Extra ID #1           5455 (21589) 'Extended Timestamp [UT]'\n-04E61   Length              0005 (5)\n-04E63   Flags               01 (1) 'Modification'\n-04E64   Modification Time   00000000 (0) 'Thu Jan  1 00:00:00 1970'\n-04E68 PAYLOAD\n-\n-05B59 DATA DESCRIPTOR       08074B50 (134695760)\n-05B5D CRC                   050B85C5 (84641221)\n-05B61 Compressed Size       00000CF1 (3313)\n-05B65 Uncompressed Size     00000CF1 (3313)\n-\n-05B69 LOCAL HEADER #28      04034B50 (67324752)\n-05B6D Extract Zip Spec      14 (20) '2.0'\n-05B6E Extract OS            00 (0) 'MS-DOS'\n-05B6F General Purpose Flag  0000 (0)\n-05B71 Compression Method    0000 (0) 'Stored'\n-05B73 Modification Time     EC210000 (3961585664) 'Wed Jan  1 00:00:00 2098'\n-05B77 CRC                   00000000 (0)\n-05B7B Compressed Size       00000000 (0)\n-05B7F Uncompressed Size     00000000 (0)\n-05B83 Filename Length       0004 (4)\n-05B85 Extra Length          0009 (9)\n-05B87 Filename              'XXXX'\n-#\n-# WARNING: Offset 0x5B87: Filename 'XXXX'\n-#          Zero length filename\n-#\n-05B8B Extra ID #1           5455 (21589) 'Extended Timestamp [UT]'\n-05B8D   Length              0005 (5)\n-05B8F   Flags               01 (1) 'Modification'\n-05B90   Modification Time   00000000 (0) 'Thu Jan  1 00:00:00 1970'\n-\n-05B94 LOCAL HEADER #29      04034B50 (67324752)\n-05B98 Extract Zip Spec      14 (20) '2.0'\n-05B99 Extract OS            00 (0) 'MS-DOS'\n-05B9A General Purpose Flag  0000 (0)\n-05B9C Compression Method    0000 (0) 'Stored'\n-05B9E Modification Time     EC210000 (3961585664) 'Wed Jan  1 00:00:00 2098'\n-05BA2 CRC                   00000000 (0)\n-05BA6 Compressed Size       00000000 (0)\n-05BAA Uncompressed Size     00000000 (0)\n-05BAE Filename Length       000B (11)\n-05BB0 Extra Length          0009 (9)\n-05BB2 Filename              'XXXXXXXXXXX'\n-#\n-# WARNING: Offset 0x5BB2: Filename 'XXXXXXXXXXX'\n-#          Zero length filename\n-#\n-05BBD Extra ID #1           5455 (21589) 'Extended Timestamp [UT]'\n-05BBF   Length              0005 (5)\n-05BC1   Flags               01 (1) 'Modification'\n-05BC2   Modification Time   00000000 (0) 'Thu Jan  1 00:00:00 1970'\n-\n-05BC6 LOCAL HEADER #30      04034B50 (67324752)\n-05BCA Extract Zip Spec      14 (20) '2.0'\n-05BCB Extract OS            00 (0) 'MS-DOS'\n-05BCC General Purpose Flag  0000 (0)\n-05BCE Compression Method    0000 (0) 'Stored'\n-05BD0 Modification Time     EC210000 (3961585664) 'Wed Jan  1 00:00:00 2098'\n-05BD4 CRC                   00000000 (0)\n-05BD8 Compressed Size       00000000 (0)\n-05BDC Uncompressed Size     00000000 (0)\n-05BE0 Filename Length       0011 (17)\n-05BE2 Extra Length          0009 (9)\n-05BE4 Filename              'XXXXXXXXXXXXXXXXX'\n-#\n-# WARNING: Offset 0x5BE4: Filename 'XXXXXXXXXXXXXXXXX'\n-#          Zero length filename\n-#\n-05BF5 Extra ID #1           5455 (21589) 'Extended Timestamp [UT]'\n-05BF7   Length              0005 (5)\n-05BF9   Flags               01 (1) 'Modification'\n-05BFA   Modification Time   00000000 (0) 'Thu Jan  1 00:00:00 1970'\n-\n-05BFE LOCAL HEADER #31      04034B50 (67324752)\n-05C02 Extract Zip Spec      14 (20) '2.0'\n-05C03 Extract OS            00 (0) 'MS-DOS'\n-05C04 General Purpose Flag  0000 (0)\n-05C06 Compression Method    0000 (0) 'Stored'\n-05C08 Modification Time     EC210000 (3961585664) 'Wed Jan  1 00:00:00 2098'\n-05C0C CRC                   00000000 (0)\n-05C10 Compressed Size       00000000 (0)\n-05C14 Uncompressed Size     00000000 (0)\n-05C18 Filename Length       001A (26)\n-05C1A Extra Length          0009 (9)\n-05C1C Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXX'\n-#\n-# WARNING: Offset 0x5C1C: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXX'\n-#          Zero length filename\n-#\n-05C36 Extra ID #1           5455 (21589) 'Extended Timestamp [UT]'\n-05C38   Length              0005 (5)\n-05C3A   Flags               01 (1) 'Modification'\n-05C3B   Modification Time   00000000 (0) 'Thu Jan  1 00:00:00 1970'\n-\n-05C3F LOCAL HEADER #32      04034B50 (67324752)\n-05C43 Extract Zip Spec      14 (20) '2.0'\n-05C44 Extract OS            00 (0) 'MS-DOS'\n-05C45 General Purpose Flag  0008 (8)\n-      [Bit  3]              1 'Streamed'\n-05C47 Compression Method    0000 (0) 'Stored'\n-05C49 Modification Time     EC210000 (3961585664) 'Wed Jan  1 00:00:00 2098'\n-05C4D CRC                   00000000 (0)\n-05C51 Compressed Size       00000000 (0)\n-05C55 Uncompressed Size     00000000 (0)\n-05C59 Filename Length       002E (46)\n-05C5B Extra Length          0009 (9)\n-05C5D Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n-#\n-# WARNING: Offset 0x5C5D: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n-#          Zero length filename\n-#\n-05C8B Extra ID #1           5455 (21589) 'Extended Timestamp [UT]'\n-05C8D   Length              0005 (5)\n-05C8F   Flags               01 (1) 'Modification'\n-05C90   Modification Time   00000000 (0) 'Thu Jan  1 00:00:00 1970'\n-05C94 PAYLOAD\n-\n-061B4 DATA DESCRIPTOR       08074B50 (134695760)\n-061B8 CRC                   D4B8B1A6 (3568873894)\n-061BC Compressed Size       00000520 (1312)\n-061C0 Uncompressed Size     00000520 (1312)\n-\n-061C4 LOCAL HEADER #33      04034B50 (67324752)\n-061C8 Extract Zip Spec      14 (20) '2.0'\n-061C9 Extract OS            00 (0) 'MS-DOS'\n-061CA General Purpose Flag  0008 (8)\n-      [Bit  3]              1 'Streamed'\n-061CC Compression Method    0000 (0) 'Stored'\n-061CE Modification Time     EC210000 (3961585664) 'Wed Jan  1 00:00:00 2098'\n-061D2 CRC                   00000000 (0)\n-061D6 Compressed Size       00000000 (0)\n-061DA Uncompressed Size     00000000 (0)\n-061DE Filename Length       0028 (40)\n-061E0 Extra Length          0009 (9)\n-061E2 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n-#\n-# WARNING: Offset 0x61E2: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n-#          Zero length filename\n-#\n-0620A Extra ID #1           5455 (21589) 'Extended Timestamp [UT]'\n-0620C   Length              0005 (5)\n-0620E   Flags               01 (1) 'Modification'\n-0620F   Modification Time   00000000 (0) 'Thu Jan  1 00:00:00 1970'\n-06213 PAYLOAD\n-\n-06C80 DATA DESCRIPTOR       08074B50 (134695760)\n-06C84 CRC                   9303661A (2466473498)\n-06C88 Compressed Size       00000A6D (2669)\n-06C8C Uncompressed Size     00000A6D (2669)\n-\n-06C90 LOCAL HEADER #34      04034B50 (67324752)\n-06C94 Extract Zip Spec      14 (20) '2.0'\n-06C95 Extract OS            00 (0) 'MS-DOS'\n-06C96 General Purpose Flag  0008 (8)\n-      [Bit  3]              1 'Streamed'\n-06C98 Compression Method    0000 (0) 'Stored'\n-06C9A Modification Time     EC210000 (3961585664) 'Wed Jan  1 00:00:00 2098'\n-06C9E CRC                   00000000 (0)\n-06CA2 Compressed Size       00000000 (0)\n-06CA6 Uncompressed Size     00000000 (0)\n-06CAA Filename Length       0036 (54)\n-06CAC Extra Length          0009 (9)\n-06CAE Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n-#\n-# WARNING: Offset 0x6CAE: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n-#          Zero length filename\n-#\n-06CE4 Extra ID #1           5455 (21589) 'Extended Timestamp [UT]'\n-06CE6   Length              0005 (5)\n-06CE8   Flags               01 (1) 'Modification'\n-06CE9   Modification Time   00000000 (0) 'Thu Jan  1 00:00:00 1970'\n-06CED PAYLOAD\n-\n-08106 DATA DESCRIPTOR       08074B50 (134695760)\n-0810A CRC                   8391A9ED (2207361517)\n-0810E Compressed Size       00001419 (5145)\n-08112 Uncompressed Size     00001419 (5145)\n-\n-08116 LOCAL HEADER #35      04034B50 (67324752)\n-0811A Extract Zip Spec      14 (20) '2.0'\n-0811B Extract OS            00 (0) 'MS-DOS'\n-0811C General Purpose Flag  0008 (8)\n-      [Bit  3]              1 'Streamed'\n-0811E Compression Method    0000 (0) 'Stored'\n-08120 Modification Time     EC210000 (3961585664) 'Wed Jan  1 00:00:00 2098'\n-08124 CRC                   00000000 (0)\n-08128 Compressed Size       00000000 (0)\n-0812C Uncompressed Size     00000000 (0)\n-08130 Filename Length       002D (45)\n-08132 Extra Length          0009 (9)\n-08134 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n-#\n-# WARNING: Offset 0x8134: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n-#          Zero length filename\n-#\n-08161 Extra ID #1           5455 (21589) 'Extended Timestamp [UT]'\n-08163   Length              0005 (5)\n-08165   Flags               01 (1) 'Modification'\n-08166   Modification Time   00000000 (0) 'Thu Jan  1 00:00:00 1970'\n-0816A PAYLOAD\n-\n-08B9E DATA DESCRIPTOR       08074B50 (134695760)\n-08BA2 CRC                   4C19B653 (1276753491)\n-08BA6 Compressed Size       00000A34 (2612)\n-08BAA Uncompressed Size     00000A34 (2612)\n-\n-08BAE LOCAL HEADER #36      04034B50 (67324752)\n-08BB2 Extract Zip Spec      14 (20) '2.0'\n-08BB3 Extract OS            00 (0) 'MS-DOS'\n-08BB4 General Purpose Flag  0008 (8)\n-      [Bit  3]              1 'Streamed'\n-08BB6 Compression Method    0000 (0) 'Stored'\n-08BB8 Modification Time     EC210000 (3961585664) 'Wed Jan  1 00:00:00 2098'\n-08BBC CRC                   00000000 (0)\n-08BC0 Compressed Size       00000000 (0)\n-08BC4 Uncompressed Size     00000000 (0)\n-08BC8 Filename Length       0027 (39)\n-08BCA Extra Length          0009 (9)\n-08BCC Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n-#\n-# WARNING: Offset 0x8BCC: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n-#          Zero length filename\n-#\n-08BF3 Extra ID #1           5455 (21589) 'Extended Timestamp [UT]'\n-08BF5   Length              0005 (5)\n-08BF7   Flags               01 (1) 'Modification'\n-08BF8   Modification Time   00000000 (0) 'Thu Jan  1 00:00:00 1970'\n-08BFC PAYLOAD\n-\n-09136 DATA DESCRIPTOR       08074B50 (134695760)\n-0913A CRC                   92D33C56 (2463317078)\n-0913E Compressed Size       0000053A (1338)\n-09142 Uncompressed Size     0000053A (1338)\n-\n-09146 LOCAL HEADER #37      04034B50 (67324752)\n-0914A Extract Zip Spec      14 (20) '2.0'\n-0914B Extract OS            00 (0) 'MS-DOS'\n-0914C General Purpose Flag  0008 (8)\n-      [Bit  3]              1 'Streamed'\n-0914E Compression Method    0000 (0) 'Stored'\n-09150 Modification Time     EC210000 (3961585664) 'Wed Jan  1 00:00:00 2098'\n-09154 CRC                   00000000 (0)\n-09158 Compressed Size       00000000 (0)\n-0915C Uncompressed Size     00000000 (0)\n-09160 Filename Length       002E (46)\n-09162 Extra Length          0009 (9)\n-09164 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n-#\n-# WARNING: Offset 0x9164: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n-#          Zero length filename\n-#\n-09192 Extra ID #1           5455 (21589) 'Extended Timestamp [UT]'\n-09194   Length              0005 (5)\n-09196   Flags               01 (1) 'Modification'\n-09197   Modification Time   00000000 (0) 'Thu Jan  1 00:00:00 1970'\n-0919B PAYLOAD\n-\n-0996E DATA DESCRIPTOR       08074B50 (134695760)\n-09972 CRC                   8AC6D7E1 (2328287201)\n-09976 Compressed Size       000007D3 (2003)\n-0997A Uncompressed Size     000007D3 (2003)\n-\n-0997E LOCAL HEADER #38      04034B50 (67324752)\n-09982 Extract Zip Spec      14 (20) '2.0'\n-09983 Extract OS            00 (0) 'MS-DOS'\n-09984 General Purpose Flag  0008 (8)\n-      [Bit  3]              1 'Streamed'\n-09986 Compression Method    0000 (0) 'Stored'\n-09988 Modification Time     EC210000 (3961585664) 'Wed Jan  1 00:00:00 2098'\n-0998C CRC                   00000000 (0)\n-09990 Compressed Size       00000000 (0)\n-09994 Uncompressed Size     00000000 (0)\n-09998 Filename Length       0035 (53)\n-0999A Extra Length          0009 (9)\n-0999C Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n-#\n-# WARNING: Offset 0x999C: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n-#          Zero length filename\n-#\n-099D1 Extra ID #1           5455 (21589) 'Extended Timestamp [UT]'\n-099D3   Length              0005 (5)\n-099D5   Flags               01 (1) 'Modification'\n-099D6   Modification Time   00000000 (0) 'Thu Jan  1 00:00:00 1970'\n-099DA PAYLOAD\n-\n-09FD3 DATA DESCRIPTOR       08074B50 (134695760)\n-09FD7 CRC                   BDE39003 (3185807363)\n-09FDB Compressed Size       000005F9 (1529)\n-09FDF Uncompressed Size     000005F9 (1529)\n-\n-09FE3 LOCAL HEADER #39      04034B50 (67324752)\n-09FE7 Extract Zip Spec      14 (20) '2.0'\n-09FE8 Extract OS            00 (0) 'MS-DOS'\n-09FE9 General Purpose Flag  0008 (8)\n-      [Bit  3]              1 'Streamed'\n-09FEB Compression Method    0000 (0) 'Stored'\n-09FED Modification Time     EC210000 (3961585664) 'Wed Jan  1 00:00:00 2098'\n-09FF1 CRC                   00000000 (0)\n-09FF5 Compressed Size       00000000 (0)\n-09FF9 Uncompressed Size     00000000 (0)\n-09FFD Filename Length       002E (46)\n-09FFF Extra Length          0009 (9)\n-0A001 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n-#\n-# WARNING: Offset 0xA001: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n-#          Zero length filename\n-#\n-0A02F Extra ID #1           5455 (21589) 'Extended Timestamp [UT]'\n-0A031   Length              0005 (5)\n-0A033   Flags               01 (1) 'Modification'\n-0A034   Modification Time   00000000 (0) 'Thu Jan  1 00:00:00 1970'\n-0A038 PAYLOAD\n-\n-0B63A DATA DESCRIPTOR       08074B50 (134695760)\n-0B63E CRC                   6C2E2D81 (1814965633)\n-0B642 Compressed Size       00001602 (5634)\n-0B646 Uncompressed Size     00001602 (5634)\n-\n-0B64A LOCAL HEADER #40      04034B50 (67324752)\n-0B64E Extract Zip Spec      14 (20) '2.0'\n-0B64F Extract OS            00 (0) 'MS-DOS'\n-0B650 General Purpose Flag  0008 (8)\n-      [Bit  3]              1 'Streamed'\n-0B652 Compression Method    0000 (0) 'Stored'\n-0B654 Modification Time     EC210000 (3961585664) 'Wed Jan  1 00:00:00 2098'\n-0B658 CRC                   00000000 (0)\n-0B65C Compressed Size       00000000 (0)\n-0B660 Uncompressed Size     00000000 (0)\n-0B664 Filename Length       0036 (54)\n-0B666 Extra Length          0009 (9)\n-0B668 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n-#\n-# WARNING: Offset 0xB668: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n-#          Zero length filename\n-#\n-0B69E Extra ID #1           5455 (21589) 'Extended Timestamp [UT]'\n-0B6A0   Length              0005 (5)\n-0B6A2   Flags               01 (1) 'Modification'\n-0B6A3   Modification Time   00000000 (0) 'Thu Jan  1 00:00:00 1970'\n-0B6A7 PAYLOAD\n-\n-0BB35 DATA DESCRIPTOR       08074B50 (134695760)\n-0BB39 CRC                   350310AE (889393326)\n-0BB3D Compressed Size       0000048E (1166)\n-0BB41 Uncompressed Size     0000048E (1166)\n-\n-0BB45 LOCAL HEADER #41      04034B50 (67324752)\n-0BB49 Extract Zip Spec      14 (20) '2.0'\n-0BB4A Extract OS            00 (0) 'MS-DOS'\n-0BB4B General Purpose Flag  0000 (0)\n-0BB4D Compression Method    0000 (0) 'Stored'\n-0BB4F Modification Time     EC210000 (3961585664) 'Wed Jan  1 00:00:00 2098'\n-0BB53 CRC                   00000000 (0)\n-0BB57 Compressed Size       00000000 (0)\n-0BB5B Uncompressed Size     00000000 (0)\n-0BB5F Filename Length       0021 (33)\n-0BB61 Extra Length          0009 (9)\n-0BB63 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n-#\n-# WARNING: Offset 0xBB63: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n-#          Zero length filename\n-#\n-0BB84 Extra ID #1           5455 (21589) 'Extended Timestamp [UT]'\n-0BB86   Length              0005 (5)\n-0BB88   Flags               01 (1) 'Modification'\n-0BB89   Modification Time   00000000 (0) 'Thu Jan  1 00:00:00 1970'\n-\n-0BB8D LOCAL HEADER #42      04034B50 (67324752)\n-0BB91 Extract Zip Spec      14 (20) '2.0'\n-0BB92 Extract OS            00 (0) 'MS-DOS'\n-0BB93 General Purpose Flag  0008 (8)\n-      [Bit  3]              1 'Streamed'\n-0BB95 Compression Method    0000 (0) 'Stored'\n-0BB97 Modification Time     EC210000 (3961585664) 'Wed Jan  1 00:00:00 2098'\n-0BB9B CRC                   00000000 (0)\n-0BB9F Compressed Size       00000000 (0)\n-0BBA3 Uncompressed Size     00000000 (0)\n-0BBA7 Filename Length       003E (62)\n-0BBA9 Extra Length          0009 (9)\n-0BBAB Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n-#\n-# WARNING: Offset 0xBBAB: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n-#          Zero length filename\n-#\n-0BBE9 Extra ID #1           5455 (21589) 'Extended Timestamp [UT]'\n-0BBEB   Length              0005 (5)\n-0BBED   Flags               01 (1) 'Modification'\n-0BBEE   Modification Time   00000000 (0) 'Thu Jan  1 00:00:00 1970'\n-0BBF2 PAYLOAD\n-\n-0C425 DATA DESCRIPTOR       08074B50 (134695760)\n-0C429 CRC                   D05840B7 (3495444663)\n-0C42D Compressed Size       00000833 (2099)\n-0C431 Uncompressed Size     00000833 (2099)\n-\n-0C435 LOCAL HEADER #43      04034B50 (67324752)\n-0C439 Extract Zip Spec      14 (20) '2.0'\n-0C43A Extract OS            00 (0) 'MS-DOS'\n-0C43B General Purpose Flag  0008 (8)\n-      [Bit  3]              1 'Streamed'\n-0C43D Compression Method    0000 (0) 'Stored'\n-0C43F Modification Time     EC210000 (3961585664) 'Wed Jan  1 00:00:00 2098'\n-0C443 CRC                   00000000 (0)\n-0C447 Compressed Size       00000000 (0)\n-0C44B Uncompressed Size     00000000 (0)\n-0C44F Filename Length       0045 (69)\n-0C451 Extra Length          0009 (9)\n-0C453 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n-#\n-# WARNING: Offset 0xC453: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n-#          Zero length filename\n-#\n-0C498 Extra ID #1           5455 (21589) 'Extended Timestamp [UT]'\n-0C49A   Length              0005 (5)\n-0C49C   Flags               01 (1) 'Modification'\n-0C49D   Modification Time   00000000 (0) 'Thu Jan  1 00:00:00 1970'\n-0C4A1 PAYLOAD\n-\n-0CB64 DATA DESCRIPTOR       08074B50 (134695760)\n-0CB68 CRC                   D9AD2407 (3652002823)\n-0CB6C Compressed Size       000006C3 (1731)\n-0CB70 Uncompressed Size     000006C3 (1731)\n-\n-0CB74 LOCAL HEADER #44      04034B50 (67324752)\n-0CB78 Extract Zip Spec      14 (20) '2.0'\n-0CB79 Extract OS            00 (0) 'MS-DOS'\n-0CB7A General Purpose Flag  0008 (8)\n-      [Bit  3]              1 'Streamed'\n-0CB7C Compression Method    0000 (0) 'Stored'\n-0CB7E Modification Time     EC210000 (3961585664) 'Wed Jan  1 00:00:00 2098'\n-0CB82 CRC                   00000000 (0)\n-0CB86 Compressed Size       00000000 (0)\n-0CB8A Uncompressed Size     00000000 (0)\n-0CB8E Filename Length       0046 (70)\n-0CB90 Extra Length          0009 (9)\n-0CB92 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n-#\n-# WARNING: Offset 0xCB92: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n-#          Zero length filename\n-#\n-0CBD8 Extra ID #1           5455 (21589) 'Extended Timestamp [UT]'\n-0CBDA   Length              0005 (5)\n-0CBDC   Flags               01 (1) 'Modification'\n-0CBDD   Modification Time   00000000 (0) 'Thu Jan  1 00:00:00 1970'\n-0CBE1 PAYLOAD\n-\n-0D146 DATA DESCRIPTOR       08074B50 (134695760)\n-0D14A CRC                   6AAAC02C (1789575212)\n-0D14E Compressed Size       00000565 (1381)\n-0D152 Uncompressed Size     00000565 (1381)\n-\n-0D156 LOCAL HEADER #45      04034B50 (67324752)\n-0D15A Extract Zip Spec      14 (20) '2.0'\n-0D15B Extract OS            00 (0) 'MS-DOS'\n-0D15C General Purpose Flag  0008 (8)\n-      [Bit  3]              1 'Streamed'\n-0D15E Compression Method    0000 (0) 'Stored'\n-0D160 Modification Time     EC210000 (3961585664) 'Wed Jan  1 00:00:00 2098'\n-0D164 CRC                   00000000 (0)\n-0D168 Compressed Size       00000000 (0)\n-0D16C Uncompressed Size     00000000 (0)\n-0D170 Filename Length       0044 (68)\n-0D172 Extra Length          0009 (9)\n-0D174 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n-#\n-# WARNING: Offset 0xD174: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n-#          Zero length filename\n-#\n-0D1B8 Extra ID #1           5455 (21589) 'Extended Timestamp [UT]'\n-0D1BA   Length              0005 (5)\n-0D1BC   Flags               01 (1) 'Modification'\n-0D1BD   Modification Time   00000000 (0) 'Thu Jan  1 00:00:00 1970'\n-0D1C1 PAYLOAD\n-\n-0DA31 DATA DESCRIPTOR       08074B50 (134695760)\n-0DA35 CRC                   5F8855A5 (1602770341)\n-0DA39 Compressed Size       00000870 (2160)\n-0DA3D Uncompressed Size     00000870 (2160)\n-\n-0DA41 LOCAL HEADER #46      04034B50 (67324752)\n-0DA45 Extract Zip Spec      14 (20) '2.0'\n-0DA46 Extract OS            00 (0) 'MS-DOS'\n-0DA47 General Purpose Flag  0008 (8)\n-      [Bit  3]              1 'Streamed'\n-0DA49 Compression Method    0000 (0) 'Stored'\n-0DA4B Modification Time     EC210000 (3961585664) 'Wed Jan  1 00:00:00 2098'\n-0DA4F CRC                   00000000 (0)\n-0DA53 Compressed Size       00000000 (0)\n-0DA57 Uncompressed Size     00000000 (0)\n-0DA5B Filename Length       003C (60)\n-0DA5D Extra Length          0009 (9)\n-0DA5F Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n-#\n-# WARNING: Offset 0xDA5F: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n-#          Zero length filename\n-#\n-0DA9B Extra ID #1           5455 (21589) 'Extended Timestamp [UT]'\n-0DA9D   Length              0005 (5)\n-0DA9F   Flags               01 (1) 'Modification'\n-0DAA0   Modification Time   00000000 (0) 'Thu Jan  1 00:00:00 1970'\n-0DAA4 PAYLOAD\n-\n-0F254 DATA DESCRIPTOR       08074B50 (134695760)\n-0F258 CRC                   C2AD0276 (3266118262)\n-0F25C Compressed Size       000017B0 (6064)\n-0F260 Uncompressed Size     000017B0 (6064)\n-\n-0F264 LOCAL HEADER #47      04034B50 (67324752)\n-0F268 Extract Zip Spec      14 (20) '2.0'\n-0F269 Extract OS            00 (0) 'MS-DOS'\n-0F26A General Purpose Flag  0008 (8)\n-      [Bit  3]              1 'Streamed'\n-0F26C Compression Method    0000 (0) 'Stored'\n-0F26E Modification Time     EC210000 (3961585664) 'Wed Jan  1 00:00:00 2098'\n-0F272 CRC                   00000000 (0)\n-0F276 Compressed Size       00000000 (0)\n-0F27A Uncompressed Size     00000000 (0)\n-0F27E Filename Length       0045 (69)\n-0F280 Extra Length          0009 (9)\n-0F282 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n-#\n-# WARNING: Offset 0xF282: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n-#          Zero length filename\n-#\n-0F2C7 Extra ID #1           5455 (21589) 'Extended Timestamp [UT]'\n-0F2C9   Length              0005 (5)\n-0F2CB   Flags               01 (1) 'Modification'\n-0F2CC   Modification Time   00000000 (0) 'Thu Jan  1 00:00:00 1970'\n-0F2D0 PAYLOAD\n-\n-11CF7 DATA DESCRIPTOR       08074B50 (134695760)\n-11CFB CRC                   77B5952D (2008388909)\n-11CFF Compressed Size       00002A27 (10791)\n-11D03 Uncompressed Size     00002A27 (10791)\n-\n-11D07 LOCAL HEADER #48      04034B50 (67324752)\n-11D0B Extract Zip Spec      14 (20) '2.0'\n-11D0C Extract OS            00 (0) 'MS-DOS'\n-11D0D General Purpose Flag  0008 (8)\n-      [Bit  3]              1 'Streamed'\n-11D0F Compression Method    0000 (0) 'Stored'\n-11D11 Modification Time     EC210000 (3961585664) 'Wed Jan  1 00:00:00 2098'\n-11D15 CRC                   00000000 (0)\n-11D19 Compressed Size       00000000 (0)\n-11D1D Uncompressed Size     00000000 (0)\n-11D21 Filename Length       0040 (64)\n-11D23 Extra Length          0009 (9)\n-11D25 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n-#\n-# WARNING: Offset 0x11D25: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n-#          Zero length filename\n-#\n-11D65 Extra ID #1           5455 (21589) 'Extended Timestamp [UT]'\n-11D67   Length              0005 (5)\n-11D69   Flags               01 (1) 'Modification'\n-11D6A   Modification Time   00000000 (0) 'Thu Jan  1 00:00:00 1970'\n-11D6E PAYLOAD\n-\n-13D5E DATA DESCRIPTOR       08074B50 (134695760)\n-13D62 CRC                   013987D8 (20547544)\n-13D66 Compressed Size       00001FF0 (8176)\n-13D6A Uncompressed Size     00001FF0 (8176)\n-\n-13D6E LOCAL HEADER #49      04034B50 (67324752)\n-13D72 Extract Zip Spec      14 (20) '2.0'\n-13D73 Extract OS            00 (0) 'MS-DOS'\n-13D74 General Purpose Flag  0008 (8)\n-      [Bit  3]              1 'Streamed'\n-13D76 Compression Method    0000 (0) 'Stored'\n-13D78 Modification Time     EC210000 (3961585664) 'Wed Jan  1 00:00:00 2098'\n-13D7C CRC                   00000000 (0)\n-13D80 Compressed Size       00000000 (0)\n-13D84 Uncompressed Size     00000000 (0)\n-13D88 Filename Length       0038 (56)\n-13D8A Extra Length          0009 (9)\n-13D8C Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n-#\n-# WARNING: Offset 0x13D8C: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n-#          Zero length filename\n-#\n-13DC4 Extra ID #1           5455 (21589) 'Extended Timestamp [UT]'\n-13DC6   Length              0005 (5)\n-13DC8   Flags               01 (1) 'Modification'\n-13DC9   Modification Time   00000000 (0) 'Thu Jan  1 00:00:00 1970'\n-13DCD PAYLOAD\n-\n-16CF0 DATA DESCRIPTOR       08074B50 (134695760)\n-16CF4 CRC                   E564338A (3848549258)\n-16CF8 Compressed Size       00002F23 (12067)\n-16CFC Uncompressed Size     00002F23 (12067)\n-\n-16D00 LOCAL HEADER #50      04034B50 (67324752)\n-16D04 Extract Zip Spec      14 (20) '2.0'\n-16D05 Extract OS            00 (0) 'MS-DOS'\n-16D06 General Purpose Flag  0008 (8)\n-      [Bit  3]              1 'Streamed'\n-16D08 Compression Method    0000 (0) 'Stored'\n-16D0A Modification Time     EC210000 (3961585664) 'Wed Jan  1 00:00:00 2098'\n-16D0E CRC                   00000000 (0)\n-16D12 Compressed Size       00000000 (0)\n-16D16 Uncompressed Size     00000000 (0)\n-16D1A Filename Length       003F (63)\n-16D1C Extra Length          0009 (9)\n-16D1E Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n-#\n-# WARNING: Offset 0x16D1E: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n-#          Zero length filename\n-#\n-16D5D Extra ID #1           5455 (21589) 'Extended Timestamp [UT]'\n-16D5F   Length              0005 (5)\n-16D61   Flags               01 (1) 'Modification'\n-16D62   Modification Time   00000000 (0) 'Thu Jan  1 00:00:00 1970'\n-16D66 PAYLOAD\n-\n-17346 DATA DESCRIPTOR       08074B50 (134695760)\n-1734A CRC                   4D393448 (1295594568)\n-1734E Compressed Size       000005E0 (1504)\n-17352 Uncompressed Size     000005E0 (1504)\n-\n-17356 LOCAL HEADER #51      04034B50 (67324752)\n-1735A Extract Zip Spec      14 (20) '2.0'\n-1735B Extract OS            00 (0) 'MS-DOS'\n-1735C General Purpose Flag  0008 (8)\n-      [Bit  3]              1 'Streamed'\n-1735E Compression Method    0000 (0) 'Stored'\n-17360 Modification Time     EC210000 (3961585664) 'Wed Jan  1 00:00:00 2098'\n-17364 CRC                   00000000 (0)\n-17368 Compressed Size       00000000 (0)\n-1736C Uncompressed Size     00000000 (0)\n-17370 Filename Length       0036 (54)\n-17372 Extra Length          0009 (9)\n-17374 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n-#\n-# WARNING: Offset 0x17374: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n-#          Zero length filename\n-#\n-173AA Extra ID #1           5455 (21589) 'Extended Timestamp [UT]'\n-173AC   Length              0005 (5)\n-173AE   Flags               01 (1) 'Modification'\n-173AF   Modification Time   00000000 (0) 'Thu Jan  1 00:00:00 1970'\n-173B3 PAYLOAD\n-\n-1A25C DATA DESCRIPTOR       08074B50 (134695760)\n-1A260 CRC                   6E2B9BED (1848351725)\n-1A264 Compressed Size       00002EA9 (11945)\n-1A268 Uncompressed Size     00002EA9 (11945)\n-\n-1A26C LOCAL HEADER #52      04034B50 (67324752)\n-1A270 Extract Zip Spec      14 (20) '2.0'\n-1A271 Extract OS            00 (0) 'MS-DOS'\n-1A272 General Purpose Flag  0008 (8)\n-      [Bit  3]              1 'Streamed'\n-1A274 Compression Method    0000 (0) 'Stored'\n-1A276 Modification Time     EC210000 (3961585664) 'Wed Jan  1 00:00:00 2098'\n-1A27A CRC                   00000000 (0)\n-1A27E Compressed Size       00000000 (0)\n-1A282 Uncompressed Size     00000000 (0)\n-1A286 Filename Length       003D (61)\n-1A288 Extra Length          0009 (9)\n-1A28A Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n-#\n-# WARNING: Offset 0x1A28A: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n-#          Zero length filename\n-#\n-1A2C7 Extra ID #1           5455 (21589) 'Extended Timestamp [UT]'\n-1A2C9   Length              0005 (5)\n-1A2CB   Flags               01 (1) 'Modification'\n-1A2CC   Modification Time   00000000 (0) 'Thu Jan  1 00:00:00 1970'\n-1A2D0 PAYLOAD\n-\n-1AA86 DATA DESCRIPTOR       08074B50 (134695760)\n-1AA8A CRC                   9F02351C (2667722012)\n-1AA8E Compressed Size       000007B6 (1974)\n-1AA92 Uncompressed Size     000007B6 (1974)\n-\n-1AA96 LOCAL HEADER #53      04034B50 (67324752)\n-1AA9A Extract Zip Spec      14 (20) '2.0'\n-1AA9B Extract OS            00 (0) 'MS-DOS'\n-1AA9C General Purpose Flag  0008 (8)\n-      [Bit  3]              1 'Streamed'\n-1AA9E Compression Method    0000 (0) 'Stored'\n-1AAA0 Modification Time     EC210000 (3961585664) 'Wed Jan  1 00:00:00 2098'\n-1AAA4 CRC                   00000000 (0)\n-1AAA8 Compressed Size       00000000 (0)\n-1AAAC Uncompressed Size     00000000 (0)\n-1AAB0 Filename Length       003E (62)\n-1AAB2 Extra Length          0009 (9)\n-1AAB4 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n-#\n-# WARNING: Offset 0x1AAB4: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n-#          Zero length filename\n-#\n-1AAF2 Extra ID #1           5455 (21589) 'Extended Timestamp [UT]'\n-1AAF4   Length              0005 (5)\n-1AAF6   Flags               01 (1) 'Modification'\n-1AAF7   Modification Time   00000000 (0) 'Thu Jan  1 00:00:00 1970'\n-1AAFB PAYLOAD\n-\n-1FD19 DATA DESCRIPTOR       08074B50 (134695760)\n-1FD1D CRC                   88D1E805 (2295457797)\n-1FD21 Compressed Size       0000521E (21022)\n-1FD25 Uncompressed Size     0000521E (21022)\n-\n-1FD29 LOCAL HEADER #54      04034B50 (67324752)\n-1FD2D Extract Zip Spec      14 (20) '2.0'\n-1FD2E Extract OS            00 (0) 'MS-DOS'\n-1FD2F General Purpose Flag  0008 (8)\n-      [Bit  3]              1 'Streamed'\n-1FD31 Compression Method    0000 (0) 'Stored'\n-1FD33 Modification Time     EC210000 (3961585664) 'Wed Jan  1 00:00:00 2098'\n-1FD37 CRC                   00000000 (0)\n-1FD3B Compressed Size       00000000 (0)\n-1FD3F Uncompressed Size     00000000 (0)\n-1FD43 Filename Length       0047 (71)\n-1FD45 Extra Length          0009 (9)\n-1FD47 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n-#\n-# WARNING: Offset 0x1FD47: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n-#          Zero length filename\n-#\n-1FD8E Extra ID #1           5455 (21589) 'Extended Timestamp [UT]'\n-1FD90   Length              0005 (5)\n-1FD92   Flags               01 (1) 'Modification'\n-1FD93   Modification Time   00000000 (0) 'Thu Jan  1 00:00:00 1970'\n-1FD97 PAYLOAD\n-\n-22A73 DATA DESCRIPTOR       08074B50 (134695760)\n-22A77 CRC                   1C63503A (476270650)\n-22A7B Compressed Size       00002CDC (11484)\n-22A7F Uncompressed Size     00002CDC (11484)\n-\n-22A83 LOCAL HEADER #55      04034B50 (67324752)\n-22A87 Extract Zip Spec      14 (20) '2.0'\n-22A88 Extract OS            00 (0) 'MS-DOS'\n-22A89 General Purpose Flag  0008 (8)\n-      [Bit  3]              1 'Streamed'\n-22A8B Compression Method    0000 (0) 'Stored'\n-22A8D Modification Time     EC210000 (3961585664) 'Wed Jan  1 00:00:00 2098'\n-22A91 CRC                   00000000 (0)\n-22A95 Compressed Size       00000000 (0)\n-22A99 Uncompressed Size     00000000 (0)\n-22A9D Filename Length       0045 (69)\n-22A9F Extra Length          0009 (9)\n-22AA1 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n-#\n-# WARNING: Offset 0x22AA1: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n-#          Zero length filename\n-#\n-22AE6 Extra ID #1           5455 (21589) 'Extended Timestamp [UT]'\n-22AE8   Length              0005 (5)\n-22AEA   Flags               01 (1) 'Modification'\n-22AEB   Modification Time   00000000 (0) 'Thu Jan  1 00:00:00 1970'\n-22AEF PAYLOAD\n-\n-2317C DATA DESCRIPTOR       08074B50 (134695760)\n-23180 CRC                   A7D42D9C (2815700380)\n-23184 Compressed Size       0000068D (1677)\n-23188 Uncompressed Size     0000068D (1677)\n-\n-2318C LOCAL HEADER #56      04034B50 (67324752)\n-23190 Extract Zip Spec      14 (20) '2.0'\n-23191 Extract OS            00 (0) 'MS-DOS'\n-23192 General Purpose Flag  0008 (8)\n-      [Bit  3]              1 'Streamed'\n-23194 Compression Method    0000 (0) 'Stored'\n-23196 Modification Time     EC210000 (3961585664) 'Wed Jan  1 00:00:00 2098'\n-2319A CRC                   00000000 (0)\n-2319E Compressed Size       00000000 (0)\n-231A2 Uncompressed Size     00000000 (0)\n-231A6 Filename Length       0035 (53)\n-231A8 Extra Length          0009 (9)\n-231AA Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n-#\n-# WARNING: Offset 0x231AA: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n-#          Zero length filename\n-#\n-231DF Extra ID #1           5455 (21589) 'Extended Timestamp [UT]'\n-231E1   Length              0005 (5)\n-231E3   Flags               01 (1) 'Modification'\n-231E4   Modification Time   00000000 (0) 'Thu Jan  1 00:00:00 1970'\n-231E8 PAYLOAD\n-\n-23F92 DATA DESCRIPTOR       08074B50 (134695760)\n-23F96 CRC                   F623C4B3 (4129539251)\n-23F9A Compressed Size       00000DAA (3498)\n-23F9E Uncompressed Size     00000DAA (3498)\n-\n-23FA2 LOCAL HEADER #57      04034B50 (67324752)\n-23FA6 Extract Zip Spec      14 (20) '2.0'\n-23FA7 Extract OS            00 (0) 'MS-DOS'\n-23FA8 General Purpose Flag  0008 (8)\n-      [Bit  3]              1 'Streamed'\n-23FAA Compression Method    0000 (0) 'Stored'\n-23FAC Modification Time     EC210000 (3961585664) 'Wed Jan  1 00:00:00 2098'\n-23FB0 CRC                   00000000 (0)\n-23FB4 Compressed Size       00000000 (0)\n-23FB8 Uncompressed Size     00000000 (0)\n-23FBC Filename Length       003F (63)\n-23FBE Extra Length          0009 (9)\n-23FC0 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n-#\n-# WARNING: Offset 0x23FC0: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n-#          Zero length filename\n-#\n-23FFF Extra ID #1           5455 (21589) 'Extended Timestamp [UT]'\n-24001   Length              0005 (5)\n-24003   Flags               01 (1) 'Modification'\n-24004   Modification Time   00000000 (0) 'Thu Jan  1 00:00:00 1970'\n-24008 PAYLOAD\n-\n-245DE DATA DESCRIPTOR       08074B50 (134695760)\n-245E2 CRC                   5B09319E (1527329182)\n-245E6 Compressed Size       000005D6 (1494)\n-245EA Uncompressed Size     000005D6 (1494)\n-\n-245EE LOCAL HEADER #58      04034B50 (67324752)\n-245F2 Extract Zip Spec      14 (20) '2.0'\n-245F3 Extract OS            00 (0) 'MS-DOS'\n-245F4 General Purpose Flag  0000 (0)\n-245F6 Compression Method    0000 (0) 'Stored'\n-245F8 Modification Time     EC210000 (3961585664) 'Wed Jan  1 00:00:00 2098'\n-245FC CRC                   00000000 (0)\n-24600 Compressed Size       00000000 (0)\n-24604 Uncompressed Size     00000000 (0)\n-24608 Filename Length       0027 (39)\n-2460A Extra Length          0009 (9)\n-2460C Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n-#\n-# WARNING: Offset 0x2460C: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n-#          Zero length filename\n-#\n-24633 Extra ID #1           5455 (21589) 'Extended Timestamp [UT]'\n-24635   Length              0005 (5)\n-24637   Flags               01 (1) 'Modification'\n-24638   Modification Time   00000000 (0) 'Thu Jan  1 00:00:00 1970'\n-\n-2463C LOCAL HEADER #59      04034B50 (67324752)\n-24640 Extract Zip Spec      14 (20) '2.0'\n-24641 Extract OS            00 (0) 'MS-DOS'\n-24642 General Purpose Flag  0008 (8)\n-      [Bit  3]              1 'Streamed'\n-24644 Compression Method    0000 (0) 'Stored'\n-24646 Modification Time     EC210000 (3961585664) 'Wed Jan  1 00:00:00 2098'\n-2464A CRC                   00000000 (0)\n-2464E Compressed Size       00000000 (0)\n-24652 Uncompressed Size     00000000 (0)\n-24656 Filename Length       004A (74)\n-24658 Extra Length          0009 (9)\n-2465A Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n-#\n-# WARNING: Offset 0x2465A: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n-#          Zero length filename\n-#\n-246A4 Extra ID #1           5455 (21589) 'Extended Timestamp [UT]'\n-246A6   Length              0005 (5)\n-246A8   Flags               01 (1) 'Modification'\n-246A9   Modification Time   00000000 (0) 'Thu Jan  1 00:00:00 1970'\n-246AD PAYLOAD\n-\n-24BA3 DATA DESCRIPTOR       08074B50 (134695760)\n-24BA7 CRC                   504AAFAB (1347071915)\n-24BAB Compressed Size       000004F6 (1270)\n-24BAF Uncompressed Size     000004F6 (1270)\n-\n-24BB3 LOCAL HEADER #60      04034B50 (67324752)\n-24BB7 Extract Zip Spec      14 (20) '2.0'\n-24BB8 Extract OS            00 (0) 'MS-DOS'\n-24BB9 General Purpose Flag  0008 (8)\n-      [Bit  3]              1 'Streamed'\n-24BBB Compression Method    0000 (0) 'Stored'\n-24BBD Modification Time     EC210000 (3961585664) 'Wed Jan  1 00:00:00 2098'\n-24BC1 CRC                   00000000 (0)\n-24BC5 Compressed Size       00000000 (0)\n-24BC9 Uncompressed Size     00000000 (0)\n-24BCD Filename Length       004B (75)\n-24BCF Extra Length          0009 (9)\n-24BD1 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n-#\n-# WARNING: Offset 0x24BD1: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n-#          Zero length filename\n-#\n-24C1C Extra ID #1           5455 (21589) 'Extended Timestamp [UT]'\n-24C1E   Length              0005 (5)\n-24C20   Flags               01 (1) 'Modification'\n-24C21   Modification Time   00000000 (0) 'Thu Jan  1 00:00:00 1970'\n-24C25 PAYLOAD\n-\n-25120 DATA DESCRIPTOR       08074B50 (134695760)\n-25124 CRC                   24C1B311 (616674065)\n-25128 Compressed Size       000004FB (1275)\n-2512C Uncompressed Size     000004FB (1275)\n-\n-25130 LOCAL HEADER #61      04034B50 (67324752)\n-25134 Extract Zip Spec      14 (20) '2.0'\n-25135 Extract OS            00 (0) 'MS-DOS'\n-25136 General Purpose Flag  0008 (8)\n-      [Bit  3]              1 'Streamed'\n-25138 Compression Method    0000 (0) 'Stored'\n-2513A Modification Time     EC210000 (3961585664) 'Wed Jan  1 00:00:00 2098'\n-2513E CRC                   00000000 (0)\n-25142 Compressed Size       00000000 (0)\n-25146 Uncompressed Size     00000000 (0)\n-2514A Filename Length       0041 (65)\n-2514C Extra Length          0009 (9)\n-2514E Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n-#\n-# WARNING: Offset 0x2514E: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n-#          Zero length filename\n-#\n-2518F Extra ID #1           5455 (21589) 'Extended Timestamp [UT]'\n-25191   Length              0005 (5)\n-25193   Flags               01 (1) 'Modification'\n-25194   Modification Time   00000000 (0) 'Thu Jan  1 00:00:00 1970'\n-25198 PAYLOAD\n-\n-25A07 DATA DESCRIPTOR       08074B50 (134695760)\n-25A0B CRC                   F122AA0E (4045580814)\n-25A0F Compressed Size       0000086F (2159)\n-25A13 Uncompressed Size     0000086F (2159)\n-\n-25A17 LOCAL HEADER #62      04034B50 (67324752)\n-25A1B Extract Zip Spec      14 (20) '2.0'\n-25A1C Extract OS            00 (0) 'MS-DOS'\n-25A1D General Purpose Flag  0008 (8)\n-      [Bit  3]              1 'Streamed'\n-25A1F Compression Method    0000 (0) 'Stored'\n-25A21 Modification Time     EC210000 (3961585664) 'Wed Jan  1 00:00:00 2098'\n-25A25 CRC                   00000000 (0)\n-25A29 Compressed Size       00000000 (0)\n-25A2D Uncompressed Size     00000000 (0)\n-25A31 Filename Length       004A (74)\n-25A33 Extra Length          0009 (9)\n-25A35 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n-#\n-# WARNING: Offset 0x25A35: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n-#          Zero length filename\n-#\n-25A7F Extra ID #1           5455 (21589) 'Extended Timestamp [UT]'\n-25A81   Length              0005 (5)\n-25A83   Flags               01 (1) 'Modification'\n-25A84   Modification Time   00000000 (0) 'Thu Jan  1 00:00:00 1970'\n-25A88 PAYLOAD\n-\n-26103 DATA DESCRIPTOR       08074B50 (134695760)\n-26107 CRC                   267DEE50 (645787216)\n-2610B Compressed Size       0000067B (1659)\n-2610F Uncompressed Size     0000067B (1659)\n-\n-26113 LOCAL HEADER #63      04034B50 (67324752)\n-26117 Extract Zip Spec      14 (20) '2.0'\n-26118 Extract OS            00 (0) 'MS-DOS'\n-26119 General Purpose Flag  0008 (8)\n-      [Bit  3]              1 'Streamed'\n-2611B Compression Method    0000 (0) 'Stored'\n-2611D Modification Time     EC210000 (3961585664) 'Wed Jan  1 00:00:00 2098'\n-26121 CRC                   00000000 (0)\n-26125 Compressed Size       00000000 (0)\n-26129 Uncompressed Size     00000000 (0)\n-2612D Filename Length       004C (76)\n-2612F Extra Length          0009 (9)\n-26131 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n-#\n-# WARNING: Offset 0x26131: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n-#          Zero length filename\n-#\n-2617D Extra ID #1           5455 (21589) 'Extended Timestamp [UT]'\n-2617F   Length              0005 (5)\n-26181   Flags               01 (1) 'Modification'\n-26182   Modification Time   00000000 (0) 'Thu Jan  1 00:00:00 1970'\n-26186 PAYLOAD\n-\n-266AA DATA DESCRIPTOR       08074B50 (134695760)\n-266AE CRC                   398D4C03 (965561347)\n-266B2 Compressed Size       00000524 (1316)\n-266B6 Uncompressed Size     00000524 (1316)\n-\n-266BA LOCAL HEADER #64      04034B50 (67324752)\n-266BE Extract Zip Spec      14 (20) '2.0'\n-266BF Extract OS            00 (0) 'MS-DOS'\n-266C0 General Purpose Flag  0008 (8)\n-      [Bit  3]              1 'Streamed'\n-266C2 Compression Method    0000 (0) 'Stored'\n-266C4 Modification Time     EC210000 (3961585664) 'Wed Jan  1 00:00:00 2098'\n-266C8 CRC                   00000000 (0)\n-266CC Compressed Size       00000000 (0)\n-266D0 Uncompressed Size     00000000 (0)\n-266D4 Filename Length       004D (77)\n-266D6 Extra Length          0009 (9)\n-266D8 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n-#\n-# WARNING: Offset 0x266D8: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n-#          Zero length filename\n-#\n-26725 Extra ID #1           5455 (21589) 'Extended Timestamp [UT]'\n-26727   Length              0005 (5)\n-26729   Flags               01 (1) 'Modification'\n-2672A   Modification Time   00000000 (0) 'Thu Jan  1 00:00:00 1970'\n-2672E PAYLOAD\n-\n-26C58 DATA DESCRIPTOR       08074B50 (134695760)\n-26C5C CRC                   120048C8 (302008520)\n-26C60 Compressed Size       0000052A (1322)\n-26C64 Uncompressed Size     0000052A (1322)\n-\n-26C68 LOCAL HEADER #65      04034B50 (67324752)\n-26C6C Extract Zip Spec      14 (20) '2.0'\n-26C6D Extract OS            00 (0) 'MS-DOS'\n-26C6E General Purpose Flag  0008 (8)\n-      [Bit  3]              1 'Streamed'\n-26C70 Compression Method    0000 (0) 'Stored'\n-26C72 Modification Time     EC210000 (3961585664) 'Wed Jan  1 00:00:00 2098'\n-26C76 CRC                   00000000 (0)\n-26C7A Compressed Size       00000000 (0)\n-26C7E Uncompressed Size     00000000 (0)\n-26C82 Filename Length       0040 (64)\n-26C84 Extra Length          0009 (9)\n-26C86 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n-#\n-# WARNING: Offset 0x26C86: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n-#          Zero length filename\n-#\n-26CC6 Extra ID #1           5455 (21589) 'Extended Timestamp [UT]'\n-26CC8   Length              0005 (5)\n-26CCA   Flags               01 (1) 'Modification'\n-26CCB   Modification Time   00000000 (0) 'Thu Jan  1 00:00:00 1970'\n-26CCF PAYLOAD\n-\n-27344 DATA DESCRIPTOR       08074B50 (134695760)\n-27348 CRC                   7B9FC9D5 (2074069461)\n-2734C Compressed Size       00000675 (1653)\n-27350 Uncompressed Size     00000675 (1653)\n-\n-27354 LOCAL HEADER #66      04034B50 (67324752)\n-27358 Extract Zip Spec      14 (20) '2.0'\n-27359 Extract OS            00 (0) 'MS-DOS'\n-2735A General Purpose Flag  0008 (8)\n-      [Bit  3]              1 'Streamed'\n-2735C Compression Method    0000 (0) 'Stored'\n-2735E Modification Time     EC210000 (3961585664) 'Wed Jan  1 00:00:00 2098'\n-27362 CRC                   00000000 (0)\n-27366 Compressed Size       00000000 (0)\n-2736A Uncompressed Size     00000000 (0)\n-2736E Filename Length       004D (77)\n-27370 Extra Length          0009 (9)\n-27372 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n-#\n-# WARNING: Offset 0x27372: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n-#          Zero length filename\n-#\n-273BF Extra ID #1           5455 (21589) 'Extended Timestamp [UT]'\n-273C1   Length              0005 (5)\n-273C3   Flags               01 (1) 'Modification'\n-273C4   Modification Time   00000000 (0) 'Thu Jan  1 00:00:00 1970'\n-273C8 PAYLOAD\n-\n-2790F DATA DESCRIPTOR       08074B50 (134695760)\n-27913 CRC                   A2914700 (2727429888)\n-27917 Compressed Size       00000547 (1351)\n-2791B Uncompressed Size     00000547 (1351)\n-\n-2791F LOCAL HEADER #67      04034B50 (67324752)\n-27923 Extract Zip Spec      14 (20) '2.0'\n-27924 Extract OS            00 (0) 'MS-DOS'\n-27925 General Purpose Flag  0008 (8)\n-      [Bit  3]              1 'Streamed'\n-27927 Compression Method    0000 (0) 'Stored'\n-27929 Modification Time     EC210000 (3961585664) 'Wed Jan  1 00:00:00 2098'\n-2792D CRC                   00000000 (0)\n-27931 Compressed Size       00000000 (0)\n-27935 Uncompressed Size     00000000 (0)\n-27939 Filename Length       004F (79)\n-2793B Extra Length          0009 (9)\n-2793D Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n-#\n-# WARNING: Offset 0x2793D: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n-#          Zero length filename\n-#\n-2798C Extra ID #1           5455 (21589) 'Extended Timestamp [UT]'\n-2798E   Length              0005 (5)\n-27990   Flags               01 (1) 'Modification'\n-27991   Modification Time   00000000 (0) 'Thu Jan  1 00:00:00 1970'\n-27995 PAYLOAD\n-\n-27EE4 DATA DESCRIPTOR       08074B50 (134695760)\n-27EE8 CRC                   A0D533A5 (2698326949)\n-27EEC Compressed Size       0000054F (1359)\n-27EF0 Uncompressed Size     0000054F (1359)\n-\n-27EF4 LOCAL HEADER #68      04034B50 (67324752)\n-27EF8 Extract Zip Spec      14 (20) '2.0'\n-27EF9 Extract OS            00 (0) 'MS-DOS'\n-27EFA General Purpose Flag  0008 (8)\n-      [Bit  3]              1 'Streamed'\n-27EFC Compression Method    0000 (0) 'Stored'\n-27EFE Modification Time     EC210000 (3961585664) 'Wed Jan  1 00:00:00 2098'\n-27F02 CRC                   00000000 (0)\n-27F06 Compressed Size       00000000 (0)\n-27F0A Uncompressed Size     00000000 (0)\n-27F0E Filename Length       004A (74)\n-27F10 Extra Length          0009 (9)\n-27F12 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n-#\n-# WARNING: Offset 0x27F12: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n-#          Zero length filename\n-#\n-27F5C Extra ID #1           5455 (21589) 'Extended Timestamp [UT]'\n-27F5E   Length              0005 (5)\n-27F60   Flags               01 (1) 'Modification'\n-27F61   Modification Time   00000000 (0) 'Thu Jan  1 00:00:00 1970'\n-27F65 PAYLOAD\n-\n-284A5 DATA DESCRIPTOR       08074B50 (134695760)\n-284A9 CRC                   DD6C864E (3714877006)\n-284AD Compressed Size       00000540 (1344)\n-284B1 Uncompressed Size     00000540 (1344)\n-\n-284B5 LOCAL HEADER #69      04034B50 (67324752)\n-284B9 Extract Zip Spec      14 (20) '2.0'\n-284BA Extract OS            00 (0) 'MS-DOS'\n-284BB General Purpose Flag  0008 (8)\n-      [Bit  3]              1 'Streamed'\n-284BD Compression Method    0000 (0) 'Stored'\n-284BF Modification Time     EC210000 (3961585664) 'Wed Jan  1 00:00:00 2098'\n-284C3 CRC                   00000000 (0)\n-284C7 Compressed Size       00000000 (0)\n-284CB Uncompressed Size     00000000 (0)\n-284CF Filename Length       004C (76)\n-284D1 Extra Length          0009 (9)\n-284D3 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n-#\n-# WARNING: Offset 0x284D3: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n-#          Zero length filename\n-#\n-2851F Extra ID #1           5455 (21589) 'Extended Timestamp [UT]'\n-28521   Length              0005 (5)\n-28523   Flags               01 (1) 'Modification'\n-28524   Modification Time   00000000 (0) 'Thu Jan  1 00:00:00 1970'\n-28528 PAYLOAD\n-\n-28A8D DATA DESCRIPTOR       08074B50 (134695760)\n-28A91 CRC                   F868DDB6 (4167622070)\n-28A95 Compressed Size       00000565 (1381)\n-28A99 Uncompressed Size     00000565 (1381)\n-\n-28A9D LOCAL HEADER #70      04034B50 (67324752)\n-28AA1 Extract Zip Spec      14 (20) '2.0'\n-28AA2 Extract OS            00 (0) 'MS-DOS'\n-28AA3 General Purpose Flag  0008 (8)\n-      [Bit  3]              1 'Streamed'\n-28AA5 Compression Method    0000 (0) 'Stored'\n-28AA7 Modification Time     EC210000 (3961585664) 'Wed Jan  1 00:00:00 2098'\n-28AAB CRC                   00000000 (0)\n-28AAF Compressed Size       00000000 (0)\n-28AB3 Uncompressed Size     00000000 (0)\n-28AB7 Filename Length       0048 (72)\n-28AB9 Extra Length          0009 (9)\n-28ABB Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n-#\n-# WARNING: Offset 0x28ABB: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n-#          Zero length filename\n-#\n-28B03 Extra ID #1           5455 (21589) 'Extended Timestamp [UT]'\n-28B05   Length              0005 (5)\n-28B07   Flags               01 (1) 'Modification'\n-28B08   Modification Time   00000000 (0) 'Thu Jan  1 00:00:00 1970'\n-28B0C PAYLOAD\n-\n-293B2 DATA DESCRIPTOR       08074B50 (134695760)\n-293B6 CRC                   97496C8E (2538171534)\n-293BA Compressed Size       000008A6 (2214)\n-293BE Uncompressed Size     000008A6 (2214)\n-\n-293C2 LOCAL HEADER #71      04034B50 (67324752)\n-293C6 Extract Zip Spec      14 (20) '2.0'\n-293C7 Extract OS            00 (0) 'MS-DOS'\n-293C8 General Purpose Flag  0000 (0)\n-293CA Compression Method    0000 (0) 'Stored'\n-293CC Modification Time     EC210000 (3961585664) 'Wed Jan  1 00:00:00 2098'\n-293D0 CRC                   00000000 (0)\n-293D4 Compressed Size       00000000 (0)\n-293D8 Uncompressed Size     00000000 (0)\n-293DC Filename Length       0030 (48)\n-293DE Extra Length          0009 (9)\n-293E0 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n-#\n-# WARNING: Offset 0x293E0: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n-#          Zero length filename\n-#\n-29410 Extra ID #1           5455 (21589) 'Extended Timestamp [UT]'\n-29412   Length              0005 (5)\n-29414   Flags               01 (1) 'Modification'\n-29415   Modification Time   00000000 (0) 'Thu Jan  1 00:00:00 1970'\n-\n-29419 LOCAL HEADER #72      04034B50 (67324752)\n-2941D Extract Zip Spec      14 (20) '2.0'\n-2941E Extract OS            00 (0) 'MS-DOS'\n-2941F General Purpose Flag  0008 (8)\n-      [Bit  3]              1 'Streamed'\n-29421 Compression Method    0000 (0) 'Stored'\n-29423 Modification Time     EC210000 (3961585664) 'Wed Jan  1 00:00:00 2098'\n-29427 CRC                   00000000 (0)\n-2942B Compressed Size       00000000 (0)\n-2942F Uncompressed Size     00000000 (0)\n-29433 Filename Length       0049 (73)\n-29435 Extra Length          0009 (9)\n-29437 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n-#\n-# WARNING: Offset 0x29437: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n-#          Zero length filename\n-#\n-29480 Extra ID #1           5455 (21589) 'Extended Timestamp [UT]'\n-29482   Length              0005 (5)\n-29484   Flags               01 (1) 'Modification'\n-29485   Modification Time   00000000 (0) 'Thu Jan  1 00:00:00 1970'\n-29489 PAYLOAD\n-\n-2A2AB DATA DESCRIPTOR       08074B50 (134695760)\n-2A2AF CRC                   C309C134 (3272196404)\n-2A2B3 Compressed Size       00000E22 (3618)\n-2A2B7 Uncompressed Size     00000E22 (3618)\n-\n-2A2BB LOCAL HEADER #73      04034B50 (67324752)\n-2A2BF Extract Zip Spec      14 (20) '2.0'\n-2A2C0 Extract OS            00 (0) 'MS-DOS'\n-2A2C1 General Purpose Flag  0008 (8)\n-      [Bit  3]              1 'Streamed'\n-2A2C3 Compression Method    0000 (0) 'Stored'\n-2A2C5 Modification Time     EC210000 (3961585664) 'Wed Jan  1 00:00:00 2098'\n-2A2C9 CRC                   00000000 (0)\n-2A2CD Compressed Size       00000000 (0)\n-2A2D1 Uncompressed Size     00000000 (0)\n-2A2D5 Filename Length       0054 (84)\n-2A2D7 Extra Length          0009 (9)\n-2A2D9 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n-#\n-# WARNING: Offset 0x2A2D9: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n-#          Zero length filename\n-#\n-2A32D Extra ID #1           5455 (21589) 'Extended Timestamp [UT]'\n-2A32F   Length              0005 (5)\n-2A331   Flags               01 (1) 'Modification'\n-2A332   Modification Time   00000000 (0) 'Thu Jan  1 00:00:00 1970'\n-2A336 PAYLOAD\n-\n-2CF6B DATA DESCRIPTOR       08074B50 (134695760)\n-2CF6F CRC                   BD334F2B (3174256427)\n-2CF73 Compressed Size       00002C35 (11317)\n-2CF77 Uncompressed Size     00002C35 (11317)\n-\n-2CF7B LOCAL HEADER #74      04034B50 (67324752)\n-2CF7F Extract Zip Spec      14 (20) '2.0'\n-2CF80 Extract OS            00 (0) 'MS-DOS'\n-2CF81 General Purpose Flag  0000 (0)\n-2CF83 Compression Method    0000 (0) 'Stored'\n-2CF85 Modification Time     EC210000 (3961585664) 'Wed Jan  1 00:00:00 2098'\n-2CF89 CRC                   00000000 (0)\n-2CF8D Compressed Size       00000000 (0)\n-2CF91 Uncompressed Size     00000000 (0)\n-2CF95 Filename Length       002A (42)\n-2CF97 Extra Length          0009 (9)\n-2CF99 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n-#\n-# WARNING: Offset 0x2CF99: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n-#          Zero length filename\n-#\n-2CFC3 Extra ID #1           5455 (21589) 'Extended Timestamp [UT]'\n-2CFC5   Length              0005 (5)\n-2CFC7   Flags               01 (1) 'Modification'\n-2CFC8   Modification Time   00000000 (0) 'Thu Jan  1 00:00:00 1970'\n-\n-2CFCC LOCAL HEADER #75      04034B50 (67324752)\n-2CFD0 Extract Zip Spec      14 (20) '2.0'\n-2CFD1 Extract OS            00 (0) 'MS-DOS'\n-2CFD2 General Purpose Flag  0008 (8)\n-      [Bit  3]              1 'Streamed'\n-2CFD4 Compression Method    0000 (0) 'Stored'\n-2CFD6 Modification Time     EC210000 (3961585664) 'Wed Jan  1 00:00:00 2098'\n-2CFDA CRC                   00000000 (0)\n-2CFDE Compressed Size       00000000 (0)\n-2CFE2 Uncompressed Size     00000000 (0)\n-2CFE6 Filename Length       0049 (73)\n-2CFE8 Extra Length          0009 (9)\n-2CFEA Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n-#\n-# WARNING: Offset 0x2CFEA: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n-#          Zero length filename\n-#\n-2D033 Extra ID #1           5455 (21589) 'Extended Timestamp [UT]'\n-2D035   Length              0005 (5)\n-2D037   Flags               01 (1) 'Modification'\n-2D038   Modification Time   00000000 (0) 'Thu Jan  1 00:00:00 1970'\n-2D03C PAYLOAD\n-\n-2DEB2 DATA DESCRIPTOR       08074B50 (134695760)\n-2DEB6 CRC                   8764F382 (2271540098)\n-2DEBA Compressed Size       00000E76 (3702)\n-2DEBE Uncompressed Size     00000E76 (3702)\n-\n-2DEC2 LOCAL HEADER #76      04034B50 (67324752)\n-2DEC6 Extract Zip Spec      14 (20) '2.0'\n-2DEC7 Extract OS            00 (0) 'MS-DOS'\n-2DEC8 General Purpose Flag  0008 (8)\n-      [Bit  3]              1 'Streamed'\n-2DECA Compression Method    0000 (0) 'Stored'\n-2DECC Modification Time     EC210000 (3961585664) 'Wed Jan  1 00:00:00 2098'\n-2DED0 CRC                   00000000 (0)\n-2DED4 Compressed Size       00000000 (0)\n-2DED8 Uncompressed Size     00000000 (0)\n-2DEDC Filename Length       0048 (72)\n-2DEDE Extra Length          0009 (9)\n-2DEE0 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n-#\n-# WARNING: Offset 0x2DEE0: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n-#          Zero length filename\n-#\n-2DF28 Extra ID #1           5455 (21589) 'Extended Timestamp [UT]'\n-2DF2A   Length              0005 (5)\n-2DF2C   Flags               01 (1) 'Modification'\n-2DF2D   Modification Time   00000000 (0) 'Thu Jan  1 00:00:00 1970'\n-2DF31 PAYLOAD\n-\n-2E508 DATA DESCRIPTOR       08074B50 (134695760)\n-2E50C CRC                   E42AC0C2 (3828007106)\n-2E510 Compressed Size       000005D7 (1495)\n-2E514 Uncompressed Size     000005D7 (1495)\n-\n-2E518 LOCAL HEADER #77      04034B50 (67324752)\n-2E51C Extract Zip Spec      14 (20) '2.0'\n-2E51D Extract OS            00 (0) 'MS-DOS'\n-2E51E General Purpose Flag  0008 (8)\n-      [Bit  3]              1 'Streamed'\n-2E520 Compression Method    0000 (0) 'Stored'\n-2E522 Modification Time     EC210000 (3961585664) 'Wed Jan  1 00:00:00 2098'\n-2E526 CRC                   00000000 (0)\n-2E52A Compressed Size       00000000 (0)\n-2E52E Uncompressed Size     00000000 (0)\n-2E532 Filename Length       0059 (89)\n-2E534 Extra Length          0009 (9)\n-2E536 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n-#\n-# WARNING: Offset 0x2E536: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n-#          Zero length filename\n-#\n-2E58F Extra ID #1           5455 (21589) 'Extended Timestamp [UT]'\n-2E591   Length              0005 (5)\n-2E593   Flags               01 (1) 'Modification'\n-2E594   Modification Time   00000000 (0) 'Thu Jan  1 00:00:00 1970'\n-2E598 PAYLOAD\n-\n-2F082 DATA DESCRIPTOR       08074B50 (134695760)\n-2F086 CRC                   33C91E00 (868818432)\n-2F08A Compressed Size       00000AEA (2794)\n-2F08E Uncompressed Size     00000AEA (2794)\n-\n-2F092 LOCAL HEADER #78      04034B50 (67324752)\n-2F096 Extract Zip Spec      14 (20) '2.0'\n-2F097 Extract OS            00 (0) 'MS-DOS'\n-2F098 General Purpose Flag  0008 (8)\n-      [Bit  3]              1 'Streamed'\n-2F09A Compression Method    0000 (0) 'Stored'\n-2F09C Modification Time     EC210000 (3961585664) 'Wed Jan  1 00:00:00 2098'\n-2F0A0 CRC                   00000000 (0)\n-2F0A4 Compressed Size       00000000 (0)\n-2F0A8 Uncompressed Size     00000000 (0)\n-2F0AC Filename Length       003C (60)\n-2F0AE Extra Length          0009 (9)\n-2F0B0 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n-#\n-# WARNING: Offset 0x2F0B0: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n-#          Zero length filename\n-#\n-2F0EC Extra ID #1           5455 (21589) 'Extended Timestamp [UT]'\n-2F0EE   Length              0005 (5)\n-2F0F0   Flags               01 (1) 'Modification'\n-2F0F1   Modification Time   00000000 (0) 'Thu Jan  1 00:00:00 1970'\n-2F0F5 PAYLOAD\n-\n-30398 DATA DESCRIPTOR       08074B50 (134695760)\n-3039C CRC                   055EEF97 (90107799)\n-303A0 Compressed Size       000012A3 (4771)\n-303A4 Uncompressed Size     000012A3 (4771)\n-\n-303A8 LOCAL HEADER #79      04034B50 (67324752)\n-303AC Extract Zip Spec      14 (20) '2.0'\n-303AD Extract OS            00 (0) 'MS-DOS'\n-303AE General Purpose Flag  0008 (8)\n-      [Bit  3]              1 'Streamed'\n-303B0 Compression Method    0000 (0) 'Stored'\n-303B2 Modification Time     EC210000 (3961585664) 'Wed Jan  1 00:00:00 2098'\n-303B6 CRC                   00000000 (0)\n-303BA Compressed Size       00000000 (0)\n-303BE Uncompressed Size     00000000 (0)\n-303C2 Filename Length       004E (78)\n-303C4 Extra Length          0009 (9)\n-303C6 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n-#\n-# WARNING: Offset 0x303C6: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n-#          Zero length filename\n-#\n-30414 Extra ID #1           5455 (21589) 'Extended Timestamp [UT]'\n-30416   Length              0005 (5)\n-30418   Flags               01 (1) 'Modification'\n-30419   Modification Time   00000000 (0) 'Thu Jan  1 00:00:00 1970'\n-3041D PAYLOAD\n-\n-30D15 DATA DESCRIPTOR       08074B50 (134695760)\n-30D19 CRC                   02F66D1C (49704220)\n-30D1D Compressed Size       000008F8 (2296)\n-30D21 Uncompressed Size     000008F8 (2296)\n-\n-30D25 LOCAL HEADER #80      04034B50 (67324752)\n-30D29 Extract Zip Spec      14 (20) '2.0'\n-30D2A Extract OS            00 (0) 'MS-DOS'\n-30D2B General Purpose Flag  0008 (8)\n-      [Bit  3]              1 'Streamed'\n-30D2D Compression Method    0000 (0) 'Stored'\n-30D2F Modification Time     EC210000 (3961585664) 'Wed Jan  1 00:00:00 2098'\n-30D33 CRC                   00000000 (0)\n-30D37 Compressed Size       00000000 (0)\n-30D3B Uncompressed Size     00000000 (0)\n-30D3F Filename Length       0054 (84)\n-30D41 Extra Length          0009 (9)\n-30D43 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n-#\n-# WARNING: Offset 0x30D43: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n-#          Zero length filename\n-#\n-30D97 Extra ID #1           5455 (21589) 'Extended Timestamp [UT]'\n-30D99   Length              0005 (5)\n-30D9B   Flags               01 (1) 'Modification'\n-30D9C   Modification Time   00000000 (0) 'Thu Jan  1 00:00:00 1970'\n-30DA0 PAYLOAD\n-\n-31863 DATA DESCRIPTOR       08074B50 (134695760)\n-31867 CRC                   0266C937 (40290615)\n-3186B Compressed Size       00000AC3 (2755)\n-3186F Uncompressed Size     00000AC3 (2755)\n-\n-31873 LOCAL HEADER #81      04034B50 (67324752)\n-31877 Extract Zip Spec      14 (20) '2.0'\n-31878 Extract OS            00 (0) 'MS-DOS'\n-31879 General Purpose Flag  0008 (8)\n-      [Bit  3]              1 'Streamed'\n-3187B Compression Method    0000 (0) 'Stored'\n-3187D Modification Time     EC210000 (3961585664) 'Wed Jan  1 00:00:00 2098'\n-31881 CRC                   00000000 (0)\n-31885 Compressed Size       00000000 (0)\n-31889 Uncompressed Size     00000000 (0)\n-3188D Filename Length       0050 (80)\n-3188F Extra Length          0009 (9)\n-31891 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n-#\n-# WARNING: Offset 0x31891: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n-#          Zero length filename\n-#\n-318E1 Extra ID #1           5455 (21589) 'Extended Timestamp [UT]'\n-318E3   Length              0005 (5)\n-318E5   Flags               01 (1) 'Modification'\n-318E6   Modification Time   00000000 (0) 'Thu Jan  1 00:00:00 1970'\n-318EA PAYLOAD\n-\n-3289F DATA DESCRIPTOR       08074B50 (134695760)\n-328A3 CRC                   BFC681E5 (3217457637)\n-328A7 Compressed Size       00000FB5 (4021)\n-328AB Uncompressed Size     00000FB5 (4021)\n-\n-328AF LOCAL HEADER #82      04034B50 (67324752)\n-328B3 Extract Zip Spec      14 (20) '2.0'\n-328B4 Extract OS            00 (0) 'MS-DOS'\n-328B5 General Purpose Flag  0008 (8)\n-      [Bit  3]              1 'Streamed'\n-328B7 Compression Method    0000 (0) 'Stored'\n-328B9 Modification Time     EC210000 (3961585664) 'Wed Jan  1 00:00:00 2098'\n-328BD CRC                   00000000 (0)\n-328C1 Compressed Size       00000000 (0)\n-328C5 Uncompressed Size     00000000 (0)\n-328C9 Filename Length       004B (75)\n-328CB Extra Length          0009 (9)\n-328CD Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n-#\n-# WARNING: Offset 0x328CD: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n-#          Zero length filename\n-#\n-32918 Extra ID #1           5455 (21589) 'Extended Timestamp [UT]'\n-3291A   Length              0005 (5)\n-3291C   Flags               01 (1) 'Modification'\n-3291D   Modification Time   00000000 (0) 'Thu Jan  1 00:00:00 1970'\n-32921 PAYLOAD\n-\n-35DAE DATA DESCRIPTOR       08074B50 (134695760)\n-35DB2 CRC                   3C5C28F1 (1012672753)\n-35DB6 Compressed Size       0000348D (13453)\n-35DBA Uncompressed Size     0000348D (13453)\n-\n-35DBE LOCAL HEADER #83      04034B50 (67324752)\n-35DC2 Extract Zip Spec      14 (20) '2.0'\n-35DC3 Extract OS            00 (0) 'MS-DOS'\n-35DC4 General Purpose Flag  0008 (8)\n-      [Bit  3]              1 'Streamed'\n-35DC6 Compression Method    0000 (0) 'Stored'\n-35DC8 Modification Time     EC210000 (3961585664) 'Wed Jan  1 00:00:00 2098'\n-35DCC CRC                   00000000 (0)\n-35DD0 Compressed Size       00000000 (0)\n-35DD4 Uncompressed Size     00000000 (0)\n-35DD8 Filename Length       0053 (83)\n-35DDA Extra Length          0009 (9)\n-35DDC Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n-#\n-# WARNING: Offset 0x35DDC: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n-#          Zero length filename\n-#\n-35E2F Extra ID #1           5455 (21589) 'Extended Timestamp [UT]'\n-35E31   Length              0005 (5)\n-35E33   Flags               01 (1) 'Modification'\n-35E34   Modification Time   00000000 (0) 'Thu Jan  1 00:00:00 1970'\n-35E38 PAYLOAD\n-\n-366A7 DATA DESCRIPTOR       08074B50 (134695760)\n-366AB CRC                   81760C22 (2171997218)\n-366AF Compressed Size       0000086F (2159)\n-366B3 Uncompressed Size     0000086F (2159)\n-\n-366B7 LOCAL HEADER #84      04034B50 (67324752)\n-366BB Extract Zip Spec      14 (20) '2.0'\n-366BC Extract OS            00 (0) 'MS-DOS'\n-366BD General Purpose Flag  0008 (8)\n-      [Bit  3]              1 'Streamed'\n-366BF Compression Method    0000 (0) 'Stored'\n-366C1 Modification Time     EC210000 (3961585664) 'Wed Jan  1 00:00:00 2098'\n-366C5 CRC                   00000000 (0)\n-366C9 Compressed Size       00000000 (0)\n-366CD Uncompressed Size     00000000 (0)\n-366D1 Filename Length       0050 (80)\n-366D3 Extra Length          0009 (9)\n-366D5 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n-#\n-# WARNING: Offset 0x366D5: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n-#          Zero length filename\n-#\n-36725 Extra ID #1           5455 (21589) 'Extended Timestamp [UT]'\n-36727   Length              0005 (5)\n-36729   Flags               01 (1) 'Modification'\n-3672A   Modification Time   00000000 (0) 'Thu Jan  1 00:00:00 1970'\n-3672E PAYLOAD\n-\n-375AC DATA DESCRIPTOR       08074B50 (134695760)\n-375B0 CRC                   7D70DC8D (2104548493)\n-375B4 Compressed Size       00000E7E (3710)\n-375B8 Uncompressed Size     00000E7E (3710)\n-\n-375BC LOCAL HEADER #85      04034B50 (67324752)\n-375C0 Extract Zip Spec      14 (20) '2.0'\n-375C1 Extract OS            00 (0) 'MS-DOS'\n-375C2 General Purpose Flag  0008 (8)\n-      [Bit  3]              1 'Streamed'\n-375C4 Compression Method    0000 (0) 'Stored'\n-375C6 Modification Time     EC210000 (3961585664) 'Wed Jan  1 00:00:00 2098'\n-375CA CRC                   00000000 (0)\n-375CE Compressed Size       00000000 (0)\n-375D2 Uncompressed Size     00000000 (0)\n-375D6 Filename Length       0048 (72)\n-375D8 Extra Length          0009 (9)\n-375DA Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n-#\n-# WARNING: Offset 0x375DA: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n-#          Zero length filename\n-#\n-37622 Extra ID #1           5455 (21589) 'Extended Timestamp [UT]'\n-37624   Length              0005 (5)\n-37626   Flags               01 (1) 'Modification'\n-37627   Modification Time   00000000 (0) 'Thu Jan  1 00:00:00 1970'\n-3762B PAYLOAD\n-\n-37E73 DATA DESCRIPTOR       08074B50 (134695760)\n-37E77 CRC                   BE3056BF (3190838975)\n-37E7B Compressed Size       00000848 (2120)\n-37E7F Uncompressed Size     00000848 (2120)\n-\n-37E83 LOCAL HEADER #86      04034B50 (67324752)\n-37E87 Extract Zip Spec      14 (20) '2.0'\n-37E88 Extract OS            00 (0) 'MS-DOS'\n-37E89 General Purpose Flag  0000 (0)\n-37E8B Compression Method    0000 (0) 'Stored'\n-37E8D Modification Time     EC210000 (3961585664) 'Wed Jan  1 00:00:00 2098'\n-37E91 CRC                   00000000 (0)\n-37E95 Compressed Size       00000000 (0)\n-37E99 Uncompressed Size     00000000 (0)\n-37E9D Filename Length       0030 (48)\n-37E9F Extra Length          0009 (9)\n-37EA1 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n-#\n-# WARNING: Offset 0x37EA1: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n-#          Zero length filename\n-#\n-37ED1 Extra ID #1           5455 (21589) 'Extended Timestamp [UT]'\n-37ED3   Length              0005 (5)\n-37ED5   Flags               01 (1) 'Modification'\n-37ED6   Modification Time   00000000 (0) 'Thu Jan  1 00:00:00 1970'\n-\n-37EDA LOCAL HEADER #87      04034B50 (67324752)\n-37EDE Extract Zip Spec      14 (20) '2.0'\n-37EDF Extract OS            00 (0) 'MS-DOS'\n-37EE0 General Purpose Flag  0008 (8)\n-      [Bit  3]              1 'Streamed'\n-37EE2 Compression Method    0000 (0) 'Stored'\n-37EE4 Modification Time     EC210000 (3961585664) 'Wed Jan  1 00:00:00 2098'\n-37EE8 CRC                   00000000 (0)\n-37EEC Compressed Size       00000000 (0)\n-37EF0 Uncompressed Size     00000000 (0)\n-37EF4 Filename Length       0054 (84)\n-37EF6 Extra Length          0009 (9)\n-37EF8 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n-#\n-# WARNING: Offset 0x37EF8: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n-#          Zero length filename\n-#\n-37F4C Extra ID #1           5455 (21589) 'Extended Timestamp [UT]'\n-37F4E   Length              0005 (5)\n-37F50   Flags               01 (1) 'Modification'\n-37F51   Modification Time   00000000 (0) 'Thu Jan  1 00:00:00 1970'\n-37F55 PAYLOAD\n-\n-3ADB7 DATA DESCRIPTOR       08074B50 (134695760)\n-3ADBB CRC                   E322696B (3810683243)\n-3ADBF Compressed Size       00002E62 (11874)\n-3ADC3 Uncompressed Size     00002E62 (11874)\n-\n-3ADC7 LOCAL HEADER #88      04034B50 (67324752)\n-3ADCB Extract Zip Spec      14 (20) '2.0'\n-3ADCC Extract OS            00 (0) 'MS-DOS'\n-3ADCD General Purpose Flag  0008 (8)\n-      [Bit  3]              1 'Streamed'\n-3ADCF Compression Method    0000 (0) 'Stored'\n-3ADD1 Modification Time     EC210000 (3961585664) 'Wed Jan  1 00:00:00 2098'\n-3ADD5 CRC                   00000000 (0)\n-3ADD9 Compressed Size       00000000 (0)\n-3ADDD Uncompressed Size     00000000 (0)\n-3ADE1 Filename Length       004E (78)\n-3ADE3 Extra Length          0009 (9)\n-3ADE5 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n-#\n-# WARNING: Offset 0x3ADE5: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n-#          Zero length filename\n-#\n-3AE33 Extra ID #1           5455 (21589) 'Extended Timestamp [UT]'\n-3AE35   Length              0005 (5)\n-3AE37   Flags               01 (1) 'Modification'\n-3AE38   Modification Time   00000000 (0) 'Thu Jan  1 00:00:00 1970'\n-3AE3C PAYLOAD\n-\n-3CBC6 DATA DESCRIPTOR       08074B50 (134695760)\n-3CBCA CRC                   6CE6F13F (1827074367)\n-3CBCE Compressed Size       00001D8A (7562)\n-3CBD2 Uncompressed Size     00001D8A (7562)\n-\n-3CBD6 LOCAL HEADER #89      04034B50 (67324752)\n-3CBDA Extract Zip Spec      14 (20) '2.0'\n-3CBDB Extract OS            00 (0) 'MS-DOS'\n-3CBDC General Purpose Flag  0000 (0)\n-3CBDE Compression Method    0000 (0) 'Stored'\n-3CBE0 Modification Time     EC210000 (3961585664) 'Wed Jan  1 00:00:00 2098'\n-3CBE4 CRC                   00000000 (0)\n-3CBE8 Compressed Size       00000000 (0)\n-3CBEC Uncompressed Size     00000000 (0)\n-3CBF0 Filename Length       002B (43)\n-3CBF2 Extra Length          0009 (9)\n-3CBF4 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n-#\n-# WARNING: Offset 0x3CBF4: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n-#          Zero length filename\n-#\n-3CC1F Extra ID #1           5455 (21589) 'Extended Timestamp [UT]'\n-3CC21   Length              0005 (5)\n-3CC23   Flags               01 (1) 'Modification'\n-3CC24   Modification Time   00000000 (0) 'Thu Jan  1 00:00:00 1970'\n-\n-3CC28 LOCAL HEADER #90      04034B50 (67324752)\n-3CC2C Extract Zip Spec      14 (20) '2.0'\n-3CC2D Extract OS            00 (0) 'MS-DOS'\n-3CC2E General Purpose Flag  0008 (8)\n-      [Bit  3]              1 'Streamed'\n-3CC30 Compression Method    0000 (0) 'Stored'\n-3CC32 Modification Time     EC210000 (3961585664) 'Wed Jan  1 00:00:00 2098'\n-3CC36 CRC                   00000000 (0)\n-3CC3A Compressed Size       00000000 (0)\n-3CC3E Uncompressed Size     00000000 (0)\n-3CC42 Filename Length       0051 (81)\n-3CC44 Extra Length          0009 (9)\n-3CC46 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n-#\n-# WARNING: Offset 0x3CC46: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n-#          Zero length filename\n-#\n-3CC97 Extra ID #1           5455 (21589) 'Extended Timestamp [UT]'\n-3CC99   Length              0005 (5)\n-3CC9B   Flags               01 (1) 'Modification'\n-3CC9C   Modification Time   00000000 (0) 'Thu Jan  1 00:00:00 1970'\n-3CCA0 PAYLOAD\n-\n-3D935 DATA DESCRIPTOR       08074B50 (134695760)\n-3D939 CRC                   C9115A1F (3373357599)\n-3D93D Compressed Size       00000C95 (3221)\n-3D941 Uncompressed Size     00000C95 (3221)\n-\n-3D945 LOCAL HEADER #91      04034B50 (67324752)\n-3D949 Extract Zip Spec      14 (20) '2.0'\n-3D94A Extract OS            00 (0) 'MS-DOS'\n-3D94B General Purpose Flag  0008 (8)\n-      [Bit  3]              1 'Streamed'\n-3D94D Compression Method    0000 (0) 'Stored'\n-3D94F Modification Time     EC210000 (3961585664) 'Wed Jan  1 00:00:00 2098'\n-3D953 CRC                   00000000 (0)\n-3D957 Compressed Size       00000000 (0)\n-3D95B Uncompressed Size     00000000 (0)\n-3D95F Filename Length       0047 (71)\n-3D961 Extra Length          0009 (9)\n-3D963 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n-#\n-# WARNING: Offset 0x3D963: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n-#          Zero length filename\n-#\n-3D9AA Extra ID #1           5455 (21589) 'Extended Timestamp [UT]'\n-3D9AC   Length              0005 (5)\n-3D9AE   Flags               01 (1) 'Modification'\n-3D9AF   Modification Time   00000000 (0) 'Thu Jan  1 00:00:00 1970'\n-3D9B3 PAYLOAD\n-\n-3DD4B DATA DESCRIPTOR       08074B50 (134695760)\n-3DD4F CRC                   2197D7D3 (563599315)\n-3DD53 Compressed Size       00000398 (920)\n-3DD57 Uncompressed Size     00000398 (920)\n-\n-3DD5B LOCAL HEADER #92      04034B50 (67324752)\n-3DD5F Extract Zip Spec      14 (20) '2.0'\n-3DD60 Extract OS            00 (0) 'MS-DOS'\n-3DD61 General Purpose Flag  0008 (8)\n-      [Bit  3]              1 'Streamed'\n-3DD63 Compression Method    0000 (0) 'Stored'\n-3DD65 Modification Time     EC210000 (3961585664) 'Wed Jan  1 00:00:00 2098'\n-3DD69 CRC                   00000000 (0)\n-3DD6D Compressed Size       00000000 (0)\n-3DD71 Uncompressed Size     00000000 (0)\n-3DD75 Filename Length       004A (74)\n-3DD77 Extra Length          0009 (9)\n-3DD79 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n-#\n-# WARNING: Offset 0x3DD79: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n-#          Zero length filename\n-#\n-3DDC3 Extra ID #1           5455 (21589) 'Extended Timestamp [UT]'\n-3DDC5   Length              0005 (5)\n-3DDC7   Flags               01 (1) 'Modification'\n-3DDC8   Modification Time   00000000 (0) 'Thu Jan  1 00:00:00 1970'\n-3DDCC PAYLOAD\n-\n-3E220 DATA DESCRIPTOR       08074B50 (134695760)\n-3E224 CRC                   D03865FF (3493357055)\n-3E228 Compressed Size       00000454 (1108)\n-3E22C Uncompressed Size     00000454 (1108)\n-\n-3E230 LOCAL HEADER #93      04034B50 (67324752)\n-3E234 Extract Zip Spec      14 (20) '2.0'\n-3E235 Extract OS            00 (0) 'MS-DOS'\n-3E236 General Purpose Flag  0008 (8)\n-      [Bit  3]              1 'Streamed'\n-3E238 Compression Method    0000 (0) 'Stored'\n-3E23A Modification Time     EC210000 (3961585664) 'Wed Jan  1 00:00:00 2098'\n-3E23E CRC                   00000000 (0)\n-3E242 Compressed Size       00000000 (0)\n-3E246 Uncompressed Size     00000000 (0)\n-3E24A Filename Length       0040 (64)\n-3E24C Extra Length          0009 (9)\n-3E24E Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n-#\n-# WARNING: Offset 0x3E24E: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n-#          Zero length filename\n-#\n-3E28E Extra ID #1           5455 (21589) 'Extended Timestamp [UT]'\n-3E290   Length              0005 (5)\n-3E292   Flags               01 (1) 'Modification'\n-3E293   Modification Time   00000000 (0) 'Thu Jan  1 00:00:00 1970'\n-3E297 PAYLOAD\n-\n-41C5A DATA DESCRIPTOR       08074B50 (134695760)\n-41C5E CRC                   D6056B09 (3590679305)\n-41C62 Compressed Size       000039C3 (14787)\n-41C66 Uncompressed Size     000039C3 (14787)\n-\n-41C6A LOCAL HEADER #94      04034B50 (67324752)\n-41C6E Extract Zip Spec      14 (20) '2.0'\n-41C6F Extract OS            00 (0) 'MS-DOS'\n-41C70 General Purpose Flag  0008 (8)\n-      [Bit  3]              1 'Streamed'\n-41C72 Compression Method    0000 (0) 'Stored'\n-41C74 Modification Time     EC210000 (3961585664) 'Wed Jan  1 00:00:00 2098'\n-41C78 CRC                   00000000 (0)\n-41C7C Compressed Size       00000000 (0)\n-41C80 Uncompressed Size     00000000 (0)\n-41C84 Filename Length       0044 (68)\n-41C86 Extra Length          0009 (9)\n-41C88 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n-#\n-# WARNING: Offset 0x41C88: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n-#          Zero length filename\n-#\n-41CCC Extra ID #1           5455 (21589) 'Extended Timestamp [UT]'\n-41CCE   Length              0005 (5)\n-41CD0   Flags               01 (1) 'Modification'\n-41CD1   Modification Time   00000000 (0) 'Thu Jan  1 00:00:00 1970'\n-41CD5 PAYLOAD\n-\n-4278E DATA DESCRIPTOR       08074B50 (134695760)\n-42792 CRC                   8A132C8F (2316512399)\n-42796 Compressed Size       00000AB9 (2745)\n-4279A Uncompressed Size     00000AB9 (2745)\n-\n-4279E LOCAL HEADER #95      04034B50 (67324752)\n-427A2 Extract Zip Spec      14 (20) '2.0'\n-427A3 Extract OS            00 (0) 'MS-DOS'\n-427A4 General Purpose Flag  0008 (8)\n-      [Bit  3]              1 'Streamed'\n-427A6 Compression Method    0000 (0) 'Stored'\n-427A8 Modification Time     EC210000 (3961585664) 'Wed Jan  1 00:00:00 2098'\n-427AC CRC                   00000000 (0)\n-427B0 Compressed Size       00000000 (0)\n-427B4 Uncompressed Size     00000000 (0)\n-427B8 Filename Length       0045 (69)\n-427BA Extra Length          0009 (9)\n-427BC Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n-#\n-# WARNING: Offset 0x427BC: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n-#          Zero length filename\n-#\n-42801 Extra ID #1           5455 (21589) 'Extended Timestamp [UT]'\n-42803   Length              0005 (5)\n-42805   Flags               01 (1) 'Modification'\n-42806   Modification Time   00000000 (0) 'Thu Jan  1 00:00:00 1970'\n-4280A PAYLOAD\n-\n-439A2 DATA DESCRIPTOR       08074B50 (134695760)\n-439A6 CRC                   F9713EB9 (4184948409)\n-439AA Compressed Size       00001198 (4504)\n-439AE Uncompressed Size     00001198 (4504)\n-\n-439B2 LOCAL HEADER #96      04034B50 (67324752)\n-439B6 Extract Zip Spec      14 (20) '2.0'\n-439B7 Extract OS            00 (0) 'MS-DOS'\n-439B8 General Purpose Flag  0008 (8)\n-      [Bit  3]              1 'Streamed'\n-439BA Compression Method    0000 (0) 'Stored'\n-439BC Modification Time     EC210000 (3961585664) 'Wed Jan  1 00:00:00 2098'\n-439C0 CRC                   00000000 (0)\n-439C4 Compressed Size       00000000 (0)\n-439C8 Uncompressed Size     00000000 (0)\n-439CC Filename Length       0050 (80)\n-439CE Extra Length          0009 (9)\n-439D0 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n-#\n-# WARNING: Offset 0x439D0: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n-#          Zero length filename\n-#\n-43A20 Extra ID #1           5455 (21589) 'Extended Timestamp [UT]'\n-43A22   Length              0005 (5)\n-43A24   Flags               01 (1) 'Modification'\n-43A25   Modification Time   00000000 (0) 'Thu Jan  1 00:00:00 1970'\n-43A29 PAYLOAD\n-\n-4445D DATA DESCRIPTOR       08074B50 (134695760)\n-44461 CRC                   5914D57F (1494537599)\n-44465 Compressed Size       00000A34 (2612)\n-44469 Uncompressed Size     00000A34 (2612)\n-\n-4446D LOCAL HEADER #97      04034B50 (67324752)\n-44471 Extract Zip Spec      14 (20) '2.0'\n-44472 Extract OS            00 (0) 'MS-DOS'\n-44473 General Purpose Flag  0008 (8)\n-      [Bit  3]              1 'Streamed'\n-44475 Compression Method    0000 (0) 'Stored'\n-44477 Modification Time     EC210000 (3961585664) 'Wed Jan  1 00:00:00 2098'\n-4447B CRC                   00000000 (0)\n-4447F Compressed Size       00000000 (0)\n-44483 Uncompressed Size     00000000 (0)\n-44487 Filename Length       0032 (50)\n-44489 Extra Length          0009 (9)\n-4448B Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n-#\n-# WARNING: Offset 0x4448B: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n-#          Zero length filename\n-#\n-444BD Extra ID #1           5455 (21589) 'Extended Timestamp [UT]'\n-444BF   Length              0005 (5)\n-444C1   Flags               01 (1) 'Modification'\n-444C2   Modification Time   00000000 (0) 'Thu Jan  1 00:00:00 1970'\n-444C6 PAYLOAD\n-\n-448C9 DATA DESCRIPTOR       08074B50 (134695760)\n-448CD CRC                   F9948D9B (4187262363)\n-448D1 Compressed Size       00000403 (1027)\n-448D5 Uncompressed Size     00000403 (1027)\n-\n-448D9 LOCAL HEADER #98      04034B50 (67324752)\n-448DD Extract Zip Spec      14 (20) '2.0'\n-448DE Extract OS            00 (0) 'MS-DOS'\n-448DF General Purpose Flag  0000 (0)\n-448E1 Compression Method    0000 (0) 'Stored'\n-448E3 Modification Time     EC210000 (3961585664) 'Wed Jan  1 00:00:00 2098'\n-448E7 CRC                   00000000 (0)\n-448EB Compressed Size       00000000 (0)\n-448EF Uncompressed Size     00000000 (0)\n-448F3 Filename Length       002A (42)\n-448F5 Extra Length          0009 (9)\n-448F7 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n-#\n-# WARNING: Offset 0x448F7: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n-#          Zero length filename\n-#\n-44921 Extra ID #1           5455 (21589) 'Extended Timestamp [UT]'\n-44923   Length              0005 (5)\n-44925   Flags               01 (1) 'Modification'\n-44926   Modification Time   00000000 (0) 'Thu Jan  1 00:00:00 1970'\n-\n-4492A LOCAL HEADER #99      04034B50 (67324752)\n-4492E Extract Zip Spec      14 (20) '2.0'\n-4492F Extract OS            00 (0) 'MS-DOS'\n-44930 General Purpose Flag  0008 (8)\n-      [Bit  3]              1 'Streamed'\n-44932 Compression Method    0000 (0) 'Stored'\n-44934 Modification Time     EC210000 (3961585664) 'Wed Jan  1 00:00:00 2098'\n-44938 CRC                   00000000 (0)\n-4493C Compressed Size       00000000 (0)\n-44940 Uncompressed Size     00000000 (0)\n-44944 Filename Length       004C (76)\n-44946 Extra Length          0009 (9)\n-44948 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n-#\n-# WARNING: Offset 0x44948: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n-#          Zero length filename\n-#\n-44994 Extra ID #1           5455 (21589) 'Extended Timestamp [UT]'\n-44996   Length              0005 (5)\n-44998   Flags               01 (1) 'Modification'\n-44999   Modification Time   00000000 (0) 'Thu Jan  1 00:00:00 1970'\n-4499D PAYLOAD\n-\n-45046 DATA DESCRIPTOR       08074B50 (134695760)\n-4504A CRC                   D0D8B588 (3503863176)\n-4504E Compressed Size       000006A9 (1705)\n-45052 Uncompressed Size     000006A9 (1705)\n-\n-45056 LOCAL HEADER #100     04034B50 (67324752)\n-4505A Extract Zip Spec      14 (20) '2.0'\n-4505B Extract OS            00 (0) 'MS-DOS'\n-4505C General Purpose Flag  0008 (8)\n-      [Bit  3]              1 'Streamed'\n-4505E Compression Method    0000 (0) 'Stored'\n-45060 Modification Time     EC210000 (3961585664) 'Wed Jan  1 00:00:00 2098'\n-45064 CRC                   00000000 (0)\n-45068 Compressed Size       00000000 (0)\n-4506C Uncompressed Size     00000000 (0)\n-45070 Filename Length       0046 (70)\n-45072 Extra Length          0009 (9)\n-45074 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n-#\n-# WARNING: Offset 0x45074: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n-#          Zero length filename\n-#\n-450BA Extra ID #1           5455 (21589) 'Extended Timestamp [UT]'\n-450BC   Length              0005 (5)\n-450BE   Flags               01 (1) 'Modification'\n-450BF   Modification Time   00000000 (0) 'Thu Jan  1 00:00:00 1970'\n-450C3 PAYLOAD\n-\n-45766 DATA DESCRIPTOR       08074B50 (134695760)\n-4576A CRC                   DDD86D2D (3721948461)\n-4576E Compressed Size       000006A3 (1699)\n-45772 Uncompressed Size     000006A3 (1699)\n-\n-45776 LOCAL HEADER #101     04034B50 (67324752)\n-4577A Extract Zip Spec      14 (20) '2.0'\n-4577B Extract OS            00 (0) 'MS-DOS'\n-4577C General Purpose Flag  0000 (0)\n-4577E Compression Method    0000 (0) 'Stored'\n-45780 Modification Time     EC210000 (3961585664) 'Wed Jan  1 00:00:00 2098'\n-45784 CRC                   00000000 (0)\n-45788 Compressed Size       00000000 (0)\n-4578C Uncompressed Size     00000000 (0)\n-45790 Filename Length       0026 (38)\n-45792 Extra Length          0009 (9)\n-45794 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n-#\n-# WARNING: Offset 0x45794: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n-#          Zero length filename\n-#\n-457BA Extra ID #1           5455 (21589) 'Extended Timestamp [UT]'\n-457BC   Length              0005 (5)\n-457BE   Flags               01 (1) 'Modification'\n-457BF   Modification Time   00000000 (0) 'Thu Jan  1 00:00:00 1970'\n-\n-457C3 LOCAL HEADER #102     04034B50 (67324752)\n-457C7 Extract Zip Spec      14 (20) '2.0'\n-457C8 Extract OS            00 (0) 'MS-DOS'\n-457C9 General Purpose Flag  0008 (8)\n-      [Bit  3]              1 'Streamed'\n-457CB Compression Method    0000 (0) 'Stored'\n-457CD Modification Time     EC210000 (3961585664) 'Wed Jan  1 00:00:00 2098'\n-457D1 CRC                   00000000 (0)\n-457D5 Compressed Size       00000000 (0)\n-457D9 Uncompressed Size     00000000 (0)\n-457DD Filename Length       0047 (71)\n-457DF Extra Length          0009 (9)\n-457E1 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n-#\n-# WARNING: Offset 0x457E1: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n-#          Zero length filename\n-#\n-45828 Extra ID #1           5455 (21589) 'Extended Timestamp [UT]'\n-4582A   Length              0005 (5)\n-4582C   Flags               01 (1) 'Modification'\n-4582D   Modification Time   00000000 (0) 'Thu Jan  1 00:00:00 1970'\n-45831 PAYLOAD\n-\n-46765 DATA DESCRIPTOR       08074B50 (134695760)\n-46769 CRC                   F2CE052F (4073588015)\n-4676D Compressed Size       00000F34 (3892)\n-46771 Uncompressed Size     00000F34 (3892)\n-\n-46775 LOCAL HEADER #103     04034B50 (67324752)\n-46779 Extract Zip Spec      14 (20) '2.0'\n-4677A Extract OS            00 (0) 'MS-DOS'\n-4677B General Purpose Flag  0008 (8)\n-      [Bit  3]              1 'Streamed'\n-4677D Compression Method    0000 (0) 'Stored'\n-4677F Modification Time     EC210000 (3961585664) 'Wed Jan  1 00:00:00 2098'\n-46783 CRC                   00000000 (0)\n-46787 Compressed Size       00000000 (0)\n-4678B Uncompressed Size     00000000 (0)\n-4678F Filename Length       003B (59)\n-46791 Extra Length          0009 (9)\n-46793 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n-#\n-# WARNING: Offset 0x46793: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n-#          Zero length filename\n-#\n-467CE Extra ID #1           5455 (21589) 'Extended Timestamp [UT]'\n-467D0   Length              0005 (5)\n-467D2   Flags               01 (1) 'Modification'\n-467D3   Modification Time   00000000 (0) 'Thu Jan  1 00:00:00 1970'\n-467D7 PAYLOAD\n-\n-493D3 DATA DESCRIPTOR       08074B50 (134695760)\n-493D7 CRC                   BF63BCF2 (3210984690)\n-493DB Compressed Size       00002BFC (11260)\n-493DF Uncompressed Size     00002BFC (11260)\n-\n-493E3 LOCAL HEADER #104     04034B50 (67324752)\n-493E7 Extract Zip Spec      14 (20) '2.0'\n-493E8 Extract OS            00 (0) 'MS-DOS'\n-493E9 General Purpose Flag  0008 (8)\n-      [Bit  3]              1 'Streamed'\n-493EB Compression Method    0000 (0) 'Stored'\n-493ED Modification Time     EC210000 (3961585664) 'Wed Jan  1 00:00:00 2098'\n-493F1 CRC                   00000000 (0)\n-493F5 Compressed Size       00000000 (0)\n-493F9 Uncompressed Size     00000000 (0)\n-493FD Filename Length       004E (78)\n-493FF Extra Length          0009 (9)\n-49401 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n-#\n-# WARNING: Offset 0x49401: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n-#          Zero length filename\n-#\n-4944F Extra ID #1           5455 (21589) 'Extended Timestamp [UT]'\n-49451   Length              0005 (5)\n-49453   Flags               01 (1) 'Modification'\n-49454   Modification Time   00000000 (0) 'Thu Jan  1 00:00:00 1970'\n-49458 PAYLOAD\n-\n-4A11B DATA DESCRIPTOR       08074B50 (134695760)\n-4A11F CRC                   E2D6B20B (3805721099)\n-4A123 Compressed Size       00000CC3 (3267)\n-4A127 Uncompressed Size     00000CC3 (3267)\n-\n-4A12B LOCAL HEADER #105     04034B50 (67324752)\n-4A12F Extract Zip Spec      14 (20) '2.0'\n-4A130 Extract OS            00 (0) 'MS-DOS'\n-4A131 General Purpose Flag  0008 (8)\n-      [Bit  3]              1 'Streamed'\n-4A133 Compression Method    0000 (0) 'Stored'\n-4A135 Modification Time     EC210000 (3961585664) 'Wed Jan  1 00:00:00 2098'\n-4A139 CRC                   00000000 (0)\n-4A13D Compressed Size       00000000 (0)\n-4A141 Uncompressed Size     00000000 (0)\n-4A145 Filename Length       0042 (66)\n-4A147 Extra Length          0009 (9)\n-4A149 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n-#\n-# WARNING: Offset 0x4A149: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n-#          Zero length filename\n-#\n-4A18B Extra ID #1           5455 (21589) 'Extended Timestamp [UT]'\n-4A18D   Length              0005 (5)\n-4A18F   Flags               01 (1) 'Modification'\n-4A190   Modification Time   00000000 (0) 'Thu Jan  1 00:00:00 1970'\n-4A194 PAYLOAD\n-\n-4A528 DATA DESCRIPTOR       08074B50 (134695760)\n-4A52C CRC                   ACAF58B5 (2897172661)\n-4A530 Compressed Size       00000394 (916)\n-4A534 Uncompressed Size     00000394 (916)\n-\n-4A538 LOCAL HEADER #106     04034B50 (67324752)\n-4A53C Extract Zip Spec      14 (20) '2.0'\n-4A53D Extract OS            00 (0) 'MS-DOS'\n-4A53E General Purpose Flag  0008 (8)\n-      [Bit  3]              1 'Streamed'\n-4A540 Compression Method    0000 (0) 'Stored'\n-4A542 Modification Time     EC210000 (3961585664) 'Wed Jan  1 00:00:00 2098'\n-4A546 CRC                   00000000 (0)\n-4A54A Compressed Size       00000000 (0)\n-4A54E Uncompressed Size     00000000 (0)\n-4A552 Filename Length       003C (60)\n-4A554 Extra Length          0009 (9)\n-4A556 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n-#\n-# WARNING: Offset 0x4A556: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n-#          Zero length filename\n-#\n-4A592 Extra ID #1           5455 (21589) 'Extended Timestamp [UT]'\n-4A594   Length              0005 (5)\n-4A596   Flags               01 (1) 'Modification'\n-4A597   Modification Time   00000000 (0) 'Thu Jan  1 00:00:00 1970'\n-4A59B PAYLOAD\n-\n-517D5 DATA DESCRIPTOR       08074B50 (134695760)\n-517D9 CRC                   963EDCDB (2520702171)\n-517DD Compressed Size       0000723A (29242)\n-517E1 Uncompressed Size     0000723A (29242)\n-\n-517E5 LOCAL HEADER #107     04034B50 (67324752)\n-517E9 Extract Zip Spec      14 (20) '2.0'\n-517EA Extract OS            00 (0) 'MS-DOS'\n-517EB General Purpose Flag  0008 (8)\n-      [Bit  3]              1 'Streamed'\n-517ED Compression Method    0000 (0) 'Stored'\n-517EF Modification Time     EC210000 (3961585664) 'Wed Jan  1 00:00:00 2098'\n-517F3 CRC                   00000000 (0)\n-517F7 Compressed Size       00000000 (0)\n-517FB Uncompressed Size     00000000 (0)\n-517FF Filename Length       003B (59)\n-51801 Extra Length          0009 (9)\n-51803 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n-#\n-# WARNING: Offset 0x51803: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n-#          Zero length filename\n-#\n-5183E Extra ID #1           5455 (21589) 'Extended Timestamp [UT]'\n-51840   Length              0005 (5)\n-51842   Flags               01 (1) 'Modification'\n-51843   Modification Time   00000000 (0) 'Thu Jan  1 00:00:00 1970'\n-51847 PAYLOAD\n-\n-5AAB5 DATA DESCRIPTOR       08074B50 (134695760)\n-5AAB9 CRC                   FA47221B (4198965787)\n-5AABD Compressed Size       0000926E (37486)\n-5AAC1 Uncompressed Size     0000926E (37486)\n-\n-5AAC5 LOCAL HEADER #108     04034B50 (67324752)\n-5AAC9 Extract Zip Spec      14 (20) '2.0'\n-5AACA Extract OS            00 (0) 'MS-DOS'\n-5AACB General Purpose Flag  0008 (8)\n-      [Bit  3]              1 'Streamed'\n-5AACD Compression Method    0000 (0) 'Stored'\n-5AACF Modification Time     EC210000 (3961585664) 'Wed Jan  1 00:00:00 2098'\n-5AAD3 CRC                   00000000 (0)\n-5AAD7 Compressed Size       00000000 (0)\n-5AADB Uncompressed Size     00000000 (0)\n-5AADF Filename Length       0043 (67)\n-5AAE1 Extra Length          0009 (9)\n-5AAE3 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n-#\n-# WARNING: Offset 0x5AAE3: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n-#          Zero length filename\n-#\n-5AB26 Extra ID #1           5455 (21589) 'Extended Timestamp [UT]'\n-5AB28   Length              0005 (5)\n-5AB2A   Flags               01 (1) 'Modification'\n-5AB2B   Modification Time   00000000 (0) 'Thu Jan  1 00:00:00 1970'\n-5AB2F PAYLOAD\n-\n-5B35E DATA DESCRIPTOR       08074B50 (134695760)\n-5B362 CRC                   14A86D48 (346582344)\n-5B366 Compressed Size       0000082F (2095)\n-5B36A Uncompressed Size     0000082F (2095)\n-\n-5B36E LOCAL HEADER #109     04034B50 (67324752)\n-5B372 Extract Zip Spec      14 (20) '2.0'\n-5B373 Extract OS            00 (0) 'MS-DOS'\n-5B374 General Purpose Flag  0000 (0)\n-5B376 Compression Method    0000 (0) 'Stored'\n-5B378 Modification Time     EC210000 (3961585664) 'Wed Jan  1 00:00:00 2098'\n-5B37C CRC                   00000000 (0)\n-5B380 Compressed Size       00000000 (0)\n-5B384 Uncompressed Size     00000000 (0)\n-5B388 Filename Length       0020 (32)\n-5B38A Extra Length          0009 (9)\n-5B38C Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n-#\n-# WARNING: Offset 0x5B38C: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n-#          Zero length filename\n-#\n-5B3AC Extra ID #1           5455 (21589) 'Extended Timestamp [UT]'\n-5B3AE   Length              0005 (5)\n-5B3B0   Flags               01 (1) 'Modification'\n-5B3B1   Modification Time   00000000 (0) 'Thu Jan  1 00:00:00 1970'\n-\n-5B3B5 LOCAL HEADER #110     04034B50 (67324752)\n-5B3B9 Extract Zip Spec      14 (20) '2.0'\n-5B3BA Extract OS            00 (0) 'MS-DOS'\n-5B3BB General Purpose Flag  0008 (8)\n-      [Bit  3]              1 'Streamed'\n-5B3BD Compression Method    0000 (0) 'Stored'\n-5B3BF Modification Time     EC210000 (3961585664) 'Wed Jan  1 00:00:00 2098'\n-5B3C3 CRC                   00000000 (0)\n-5B3C7 Compressed Size       00000000 (0)\n-5B3CB Uncompressed Size     00000000 (0)\n-5B3CF Filename Length       0036 (54)\n-5B3D1 Extra Length          0009 (9)\n-5B3D3 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n-#\n-# WARNING: Offset 0x5B3D3: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n-#          Zero length filename\n-#\n-5B409 Extra ID #1           5455 (21589) 'Extended Timestamp [UT]'\n-5B40B   Length              0005 (5)\n-5B40D   Flags               01 (1) 'Modification'\n-5B40E   Modification Time   00000000 (0) 'Thu Jan  1 00:00:00 1970'\n-5B412 PAYLOAD\n-\n-5C55A DATA DESCRIPTOR       08074B50 (134695760)\n-5C55E CRC                   A7748368 (2809430888)\n-5C562 Compressed Size       00001148 (4424)\n-5C566 Uncompressed Size     00001148 (4424)\n-\n-5C56A LOCAL HEADER #111     04034B50 (67324752)\n-5C56E Extract Zip Spec      14 (20) '2.0'\n-5C56F Extract OS            00 (0) 'MS-DOS'\n-5C570 General Purpose Flag  0008 (8)\n-      [Bit  3]              1 'Streamed'\n-5C572 Compression Method    0000 (0) 'Stored'\n-5C574 Modification Time     EC210000 (3961585664) 'Wed Jan  1 00:00:00 2098'\n-5C578 CRC                   00000000 (0)\n-5C57C Compressed Size       00000000 (0)\n-5C580 Uncompressed Size     00000000 (0)\n-5C584 Filename Length       0039 (57)\n-5C586 Extra Length          0009 (9)\n-5C588 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n-#\n-# WARNING: Offset 0x5C588: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n-#          Zero length filename\n-#\n-5C5C1 Extra ID #1           5455 (21589) 'Extended Timestamp [UT]'\n-5C5C3   Length              0005 (5)\n-5C5C5   Flags               01 (1) 'Modification'\n-5C5C6   Modification Time   00000000 (0) 'Thu Jan  1 00:00:00 1970'\n-5C5CA PAYLOAD\n-\n-5CB99 DATA DESCRIPTOR       08074B50 (134695760)\n-5CB9D CRC                   5117C509 (1360512265)\n-5CBA1 Compressed Size       000005CF (1487)\n-5CBA5 Uncompressed Size     000005CF (1487)\n-\n-5CBA9 LOCAL HEADER #112     04034B50 (67324752)\n-5CBAD Extract Zip Spec      14 (20) '2.0'\n-5CBAE Extract OS            00 (0) 'MS-DOS'\n-5CBAF General Purpose Flag  0008 (8)\n-      [Bit  3]              1 'Streamed'\n-5CBB1 Compression Method    0000 (0) 'Stored'\n-5CBB3 Modification Time     EC210000 (3961585664) 'Wed Jan  1 00:00:00 2098'\n-5CBB7 CRC                   00000000 (0)\n-5CBBB Compressed Size       00000000 (0)\n-5CBBF Uncompressed Size     00000000 (0)\n-5CBC3 Filename Length       0039 (57)\n-5CBC5 Extra Length          0009 (9)\n-5CBC7 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n-#\n-# WARNING: Offset 0x5CBC7: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n-#          Zero length filename\n-#\n-5CC00 Extra ID #1           5455 (21589) 'Extended Timestamp [UT]'\n-5CC02   Length              0005 (5)\n-5CC04   Flags               01 (1) 'Modification'\n-5CC05   Modification Time   00000000 (0) 'Thu Jan  1 00:00:00 1970'\n-5CC09 PAYLOAD\n-\n-5D2E9 DATA DESCRIPTOR       08074B50 (134695760)\n-5D2ED CRC                   FCC4145B (4240708699)\n-5D2F1 Compressed Size       000006E0 (1760)\n-5D2F5 Uncompressed Size     000006E0 (1760)\n-\n-5D2F9 LOCAL HEADER #113     04034B50 (67324752)\n-5D2FD Extract Zip Spec      14 (20) '2.0'\n-5D2FE Extract OS            00 (0) 'MS-DOS'\n-5D2FF General Purpose Flag  0008 (8)\n-      [Bit  3]              1 'Streamed'\n-5D301 Compression Method    0000 (0) 'Stored'\n-5D303 Modification Time     EC210000 (3961585664) 'Wed Jan  1 00:00:00 2098'\n-5D307 CRC                   00000000 (0)\n-5D30B Compressed Size       00000000 (0)\n-5D30F Uncompressed Size     00000000 (0)\n-5D313 Filename Length       003B (59)\n-5D315 Extra Length          0009 (9)\n-5D317 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n-#\n-# WARNING: Offset 0x5D317: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n-#          Zero length filename\n-#\n-5D352 Extra ID #1           5455 (21589) 'Extended Timestamp [UT]'\n-5D354   Length              0005 (5)\n-5D356   Flags               01 (1) 'Modification'\n-5D357   Modification Time   00000000 (0) 'Thu Jan  1 00:00:00 1970'\n-5D35B PAYLOAD\n-\n-5D936 DATA DESCRIPTOR       08074B50 (134695760)\n-5D93A CRC                   A6BC7A6B (2797369963)\n-5D93E Compressed Size       000005DB (1499)\n-5D942 Uncompressed Size     000005DB (1499)\n-\n-5D946 LOCAL HEADER #114     04034B50 (67324752)\n-5D94A Extract Zip Spec      14 (20) '2.0'\n-5D94B Extract OS            00 (0) 'MS-DOS'\n-5D94C General Purpose Flag  0008 (8)\n-      [Bit  3]              1 'Streamed'\n-5D94E Compression Method    0000 (0) 'Stored'\n-5D950 Modification Time     EC210000 (3961585664) 'Wed Jan  1 00:00:00 2098'\n-5D954 CRC                   00000000 (0)\n-5D958 Compressed Size       00000000 (0)\n-5D95C Uncompressed Size     00000000 (0)\n-5D960 Filename Length       003B (59)\n-5D962 Extra Length          0009 (9)\n-5D964 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n-#\n-# WARNING: Offset 0x5D964: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n-#          Zero length filename\n-#\n-5D99F Extra ID #1           5455 (21589) 'Extended Timestamp [UT]'\n-5D9A1   Length              0005 (5)\n-5D9A3   Flags               01 (1) 'Modification'\n-5D9A4   Modification Time   00000000 (0) 'Thu Jan  1 00:00:00 1970'\n-5D9A8 PAYLOAD\n-\n-5E092 DATA DESCRIPTOR       08074B50 (134695760)\n-5E096 CRC                   CDD77CC5 (3453451461)\n-5E09A Compressed Size       000006EA (1770)\n-5E09E Uncompressed Size     000006EA (1770)\n-\n-5E0A2 LOCAL HEADER #115     04034B50 (67324752)\n-5E0A6 Extract Zip Spec      14 (20) '2.0'\n-5E0A7 Extract OS            00 (0) 'MS-DOS'\n-5E0A8 General Purpose Flag  0008 (8)\n-      [Bit  3]              1 'Streamed'\n-5E0AA Compression Method    0000 (0) 'Stored'\n-5E0AC Modification Time     EC210000 (3961585664) 'Wed Jan  1 00:00:00 2098'\n-5E0B0 CRC                   00000000 (0)\n-5E0B4 Compressed Size       00000000 (0)\n-5E0B8 Uncompressed Size     00000000 (0)\n-5E0BC Filename Length       0031 (49)\n-5E0BE Extra Length          0009 (9)\n-5E0C0 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n-#\n-# WARNING: Offset 0x5E0C0: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n-#          Zero length filename\n-#\n-5E0F1 Extra ID #1           5455 (21589) 'Extended Timestamp [UT]'\n-5E0F3   Length              0005 (5)\n-5E0F5   Flags               01 (1) 'Modification'\n-5E0F6   Modification Time   00000000 (0) 'Thu Jan  1 00:00:00 1970'\n-5E0FA PAYLOAD\n-\n-5E698 DATA DESCRIPTOR       08074B50 (134695760)\n-5E69C CRC                   1D384067 (490225767)\n-5E6A0 Compressed Size       0000059E (1438)\n-5E6A4 Uncompressed Size     0000059E (1438)\n-\n-5E6A8 LOCAL HEADER #116     04034B50 (67324752)\n-5E6AC Extract Zip Spec      14 (20) '2.0'\n-5E6AD Extract OS            00 (0) 'MS-DOS'\n-5E6AE General Purpose Flag  0000 (0)\n-5E6B0 Compression Method    0000 (0) 'Stored'\n-5E6B2 Modification Time     EC210000 (3961585664) 'Wed Jan  1 00:00:00 2098'\n-5E6B6 CRC                   00000000 (0)\n-5E6BA Compressed Size       00000000 (0)\n-5E6BE Uncompressed Size     00000000 (0)\n-5E6C2 Filename Length       0021 (33)\n-5E6C4 Extra Length          0009 (9)\n-5E6C6 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n-#\n-# WARNING: Offset 0x5E6C6: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n-#          Zero length filename\n-#\n-5E6E7 Extra ID #1           5455 (21589) 'Extended Timestamp [UT]'\n-5E6E9   Length              0005 (5)\n-5E6EB   Flags               01 (1) 'Modification'\n-5E6EC   Modification Time   00000000 (0) 'Thu Jan  1 00:00:00 1970'\n-\n-5E6F0 LOCAL HEADER #117     04034B50 (67324752)\n-5E6F4 Extract Zip Spec      14 (20) '2.0'\n-5E6F5 Extract OS            00 (0) 'MS-DOS'\n-5E6F6 General Purpose Flag  0008 (8)\n-      [Bit  3]              1 'Streamed'\n-5E6F8 Compression Method    0000 (0) 'Stored'\n-5E6FA Modification Time     EC210000 (3961585664) 'Wed Jan  1 00:00:00 2098'\n-5E6FE CRC                   00000000 (0)\n-5E702 Compressed Size       00000000 (0)\n-5E706 Uncompressed Size     00000000 (0)\n-5E70A Filename Length       003B (59)\n-5E70C Extra Length          0009 (9)\n-5E70E Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n-#\n-# WARNING: Offset 0x5E70E: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n-#          Zero length filename\n-#\n-5E749 Extra ID #1           5455 (21589) 'Extended Timestamp [UT]'\n-5E74B   Length              0005 (5)\n-5E74D   Flags               01 (1) 'Modification'\n-5E74E   Modification Time   00000000 (0) 'Thu Jan  1 00:00:00 1970'\n-5E752 PAYLOAD\n-\n-5EF78 DATA DESCRIPTOR       08074B50 (134695760)\n-5EF7C CRC                   F2E8FAB9 (4075354809)\n-5EF80 Compressed Size       00000826 (2086)\n-5EF84 Uncompressed Size     00000826 (2086)\n-\n-5EF88 LOCAL HEADER #118     04034B50 (67324752)\n-5EF8C Extract Zip Spec      14 (20) '2.0'\n-5EF8D Extract OS            00 (0) 'MS-DOS'\n-5EF8E General Purpose Flag  0000 (0)\n-5EF90 Compression Method    0000 (0) 'Stored'\n-5EF92 Modification Time     EC210000 (3961585664) 'Wed Jan  1 00:00:00 2098'\n-5EF96 CRC                   00000000 (0)\n-5EF9A Compressed Size       00000000 (0)\n-5EF9E Uncompressed Size     00000000 (0)\n-5EFA2 Filename Length       0022 (34)\n-5EFA4 Extra Length          0009 (9)\n-5EFA6 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n-#\n-# WARNING: Offset 0x5EFA6: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n-#          Zero length filename\n-#\n-5EFC8 Extra ID #1           5455 (21589) 'Extended Timestamp [UT]'\n-5EFCA   Length              0005 (5)\n-5EFCC   Flags               01 (1) 'Modification'\n-5EFCD   Modification Time   00000000 (0) 'Thu Jan  1 00:00:00 1970'\n-\n-5EFD1 LOCAL HEADER #119     04034B50 (67324752)\n-5EFD5 Extract Zip Spec      14 (20) '2.0'\n-5EFD6 Extract OS            00 (0) 'MS-DOS'\n-5EFD7 General Purpose Flag  0008 (8)\n-      [Bit  3]              1 'Streamed'\n-5EFD9 Compression Method    0000 (0) 'Stored'\n-5EFDB Modification Time     EC210000 (3961585664) 'Wed Jan  1 00:00:00 2098'\n-5EFDF CRC                   00000000 (0)\n-5EFE3 Compressed Size       00000000 (0)\n-5EFE7 Uncompressed Size     00000000 (0)\n-5EFEB Filename Length       0037 (55)\n-5EFED Extra Length          0009 (9)\n-5EFEF Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n-#\n-# WARNING: Offset 0x5EFEF: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n-#          Zero length filename\n-#\n-5F026 Extra ID #1           5455 (21589) 'Extended Timestamp [UT]'\n-5F028   Length              0005 (5)\n-5F02A   Flags               01 (1) 'Modification'\n-5F02B   Modification Time   00000000 (0) 'Thu Jan  1 00:00:00 1970'\n-5F02F PAYLOAD\n-\n-643AE DATA DESCRIPTOR       08074B50 (134695760)\n-643B2 CRC                   5DDCD4C5 (1574753477)\n-643B6 Compressed Size       0000537F (21375)\n-643BA Uncompressed Size     0000537F (21375)\n-\n-643BE LOCAL HEADER #120     04034B50 (67324752)\n-643C2 Extract Zip Spec      14 (20) '2.0'\n-643C3 Extract OS            00 (0) 'MS-DOS'\n-643C4 General Purpose Flag  0008 (8)\n-      [Bit  3]              1 'Streamed'\n-643C6 Compression Method    0000 (0) 'Stored'\n-643C8 Modification Time     EC210000 (3961585664) 'Wed Jan  1 00:00:00 2098'\n-643CC CRC                   00000000 (0)\n-643D0 Compressed Size       00000000 (0)\n-643D4 Uncompressed Size     00000000 (0)\n-643D8 Filename Length       003E (62)\n-643DA Extra Length          0009 (9)\n-643DC Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n-#\n-# WARNING: Offset 0x643DC: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n-#          Zero length filename\n-#\n-6441A Extra ID #1           5455 (21589) 'Extended Timestamp [UT]'\n-6441C   Length              0005 (5)\n-6441E   Flags               01 (1) 'Modification'\n-6441F   Modification Time   00000000 (0) 'Thu Jan  1 00:00:00 1970'\n-64423 PAYLOAD\n-\n-661AD DATA DESCRIPTOR       08074B50 (134695760)\n-661B1 CRC                   5BC81E29 (1539841577)\n-661B5 Compressed Size       00001D8A (7562)\n-661B9 Uncompressed Size     00001D8A (7562)\n-\n-661BD LOCAL HEADER #121     04034B50 (67324752)\n-661C1 Extract Zip Spec      14 (20) '2.0'\n-661C2 Extract OS            00 (0) 'MS-DOS'\n-661C3 General Purpose Flag  0008 (8)\n-      [Bit  3]              1 'Streamed'\n-661C5 Compression Method    0000 (0) 'Stored'\n-661C7 Modification Time     EC210000 (3961585664) 'Wed Jan  1 00:00:00 2098'\n-661CB CRC                   00000000 (0)\n-661CF Compressed Size       00000000 (0)\n-661D3 Uncompressed Size     00000000 (0)\n-661D7 Filename Length       0037 (55)\n-661D9 Extra Length          0009 (9)\n-661DB Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n-#\n-# WARNING: Offset 0x661DB: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n-#          Zero length filename\n-#\n-66212 Extra ID #1           5455 (21589) 'Extended Timestamp [UT]'\n-66214   Length              0005 (5)\n-66216   Flags               01 (1) 'Modification'\n-66217   Modification Time   00000000 (0) 'Thu Jan  1 00:00:00 1970'\n-6621B PAYLOAD\n-\n-6A849 DATA DESCRIPTOR       08074B50 (134695760)\n-6A84D CRC                   A266F3B2 (2724656050)\n-6A851 Compressed Size       0000462E (17966)\n-6A855 Uncompressed Size     0000462E (17966)\n-\n-6A859 LOCAL HEADER #122     04034B50 (67324752)\n-6A85D Extract Zip Spec      14 (20) '2.0'\n-6A85E Extract OS            00 (0) 'MS-DOS'\n-6A85F General Purpose Flag  0008 (8)\n-      [Bit  3]              1 'Streamed'\n-6A861 Compression Method    0000 (0) 'Stored'\n-6A863 Modification Time     EC210000 (3961585664) 'Wed Jan  1 00:00:00 2098'\n-6A867 CRC                   00000000 (0)\n-6A86B Compressed Size       00000000 (0)\n-6A86F Uncompressed Size     00000000 (0)\n-6A873 Filename Length       0043 (67)\n-6A875 Extra Length          0009 (9)\n-6A877 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n-#\n-# WARNING: Offset 0x6A877: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n-#          Zero length filename\n-#\n-6A8BA Extra ID #1           5455 (21589) 'Extended Timestamp [UT]'\n-6A8BC   Length              0005 (5)\n-6A8BE   Flags               01 (1) 'Modification'\n-6A8BF   Modification Time   00000000 (0) 'Thu Jan  1 00:00:00 1970'\n-6A8C3 PAYLOAD\n-\n-6AE15 DATA DESCRIPTOR       08074B50 (134695760)\n-6AE19 CRC                   952E3CF5 (2502835445)\n-6AE1D Compressed Size       00000552 (1362)\n-6AE21 Uncompressed Size     00000552 (1362)\n-\n-6AE25 CENTRAL HEADER #1     02014B50 (33639248)\n-6AE29 Created Zip Spec      14 (20) '2.0'\n-6AE2A Created OS            00 (0) 'MS-DOS'\n-6AE2B Extract Zip Spec      14 (20) '2.0'\n-6AE2C Extract OS            00 (0) 'MS-DOS'\n-6AE2D General Purpose Flag  0000 (0)\n-6AE2F Compression Method    0000 (0) 'Stored'\n-6AE31 Modification Time     EC210000 (3961585664) 'Wed Jan  1 00:00:00 2098'\n-6AE35 CRC                   00000000 (0)\n-6AE39 Compressed Size       00000000 (0)\n-6AE3D Uncompressed Size     00000000 (0)\n-6AE41 Filename Length       0009 (9)\n-6AE43 Extra Length          0009 (9)\n-6AE45 Comment Length        0000 (0)\n-6AE47 Disk Start            0000 (0)\n-6AE49 Int File Attributes   0000 (0)\n-      [Bit 0]               0 'Binary Data'\n-6AE4B Ext File Attributes   00000000 (0)\n-6AE4F Local Header Offset   00000000 (0)\n-6AE53 Filename              'XXXXXXXXX'\n-#\n-# WARNING: Offset 0x6AE53: Filename 'XXXXXXXXX'\n-#          Zero length filename\n-#\n-6AE5C Extra ID #1           5455 (21589) 'Extended Timestamp [UT]'\n-6AE5E   Length              0005 (5)\n-6AE60   Flags               01 (1) 'Modification'\n-6AE61   Modification Time   00000000 (0) 'Thu Jan  1 00:00:00 1970'\n-\n-6AE65 CENTRAL HEADER #2     02014B50 (33639248)\n-6AE69 Created Zip Spec      14 (20) '2.0'\n-6AE6A Created OS            00 (0) 'MS-DOS'\n-6AE6B Extract Zip Spec      14 (20) '2.0'\n-6AE6C Extract OS            00 (0) 'MS-DOS'\n-6AE6D General Purpose Flag  0008 (8)\n-      [Bit  3]              1 'Streamed'\n-6AE6F Compression Method    0000 (0) 'Stored'\n-6AE71 Modification Time     EC210000 (3961585664) 'Wed Jan  1 00:00:00 2098'\n-6AE75 CRC                   85C487C6 (2244249542)\n-6AE79 Compressed Size       00000EA6 (3750)\n-6AE7D Uncompressed Size     00000EA6 (3750)\n-6AE81 Filename Length       0015 (21)\n-6AE83 Extra Length          0009 (9)\n-6AE85 Comment Length        0000 (0)\n-6AE87 Disk Start            0000 (0)\n-6AE89 Int File Attributes   0000 (0)\n-      [Bit 0]               0 'Binary Data'\n-6AE8B Ext File Attributes   00000000 (0)\n-6AE8F Local Header Offset   00000030 (48)\n-6AE93 Filename              'XXXXXXXXXXXXXXXXXXXXX'\n-#\n-# WARNING: Offset 0x6AE93: Filename 'XXXXXXXXXXXXXXXXXXXXX'\n-#          Zero length filename\n-#\n-6AEA8 Extra ID #1           5455 (21589) 'Extended Timestamp [UT]'\n-6AEAA   Length              0005 (5)\n-6AEAC   Flags               01 (1) 'Modification'\n-6AEAD   Modification Time   00000000 (0) 'Thu Jan  1 00:00:00 1970'\n-\n-6AEB1 CENTRAL HEADER #3     02014B50 (33639248)\n-6AEB5 Created Zip Spec      14 (20) '2.0'\n-6AEB6 Created OS            00 (0) 'MS-DOS'\n-6AEB7 Extract Zip Spec      14 (20) '2.0'\n-6AEB8 Extract OS            00 (0) 'MS-DOS'\n-6AEB9 General Purpose Flag  0008 (8)\n-      [Bit  3]              1 'Streamed'\n-6AEBB Compression Method    0000 (0) 'Stored'\n-6AEBD Modification Time     EC210000 (3961585664) 'Wed Jan  1 00:00:00 2098'\n-6AEC1 CRC                   86E2B4B4 (2263004340)\n-6AEC5 Compressed Size       00002C5E (11358)\n-6AEC9 Uncompressed Size     00002C5E (11358)\n-6AECD Filename Length       0010 (16)\n-6AECF Extra Length          0009 (9)\n-6AED1 Comment Length        0000 (0)\n-6AED3 Disk Start            0000 (0)\n-6AED5 Int File Attributes   0000 (0)\n-      [Bit 0]               0 'Binary Data'\n-6AED7 Ext File Attributes   00000000 (0)\n-6AEDB Local Header Offset   00000F22 (3874)\n-6AEDF Filename              'XXXXXXXXXXXXXXXX'\n-#\n-# WARNING: Offset 0x6AEDF: Filename 'XXXXXXXXXXXXXXXX'\n-#          Zero length filename\n-#\n-6AEEF Extra ID #1           5455 (21589) 'Extended Timestamp [UT]'\n-6AEF1   Length              0005 (5)\n-6AEF3   Flags               01 (1) 'Modification'\n-6AEF4   Modification Time   00000000 (0) 'Thu Jan  1 00:00:00 1970'\n-\n-6AEF8 CENTRAL HEADER #4     02014B50 (33639248)\n-6AEFC Created Zip Spec      14 (20) '2.0'\n-6AEFD Created OS            00 (0) 'MS-DOS'\n-6AEFE Extract Zip Spec      14 (20) '2.0'\n-6AEFF Extract OS            00 (0) 'MS-DOS'\n-6AF00 General Purpose Flag  0008 (8)\n-      [Bit  3]              1 'Streamed'\n-6AF02 Compression Method    0000 (0) 'Stored'\n-6AF04 Modification Time     EC210000 (3961585664) 'Wed Jan  1 00:00:00 2098'\n-6AF08 CRC                   EE027FB2 (3993141170)\n-6AF0C Compressed Size       00000019 (25)\n-6AF10 Uncompressed Size     00000019 (25)\n-6AF14 Filename Length       0014 (20)\n-6AF16 Extra Length          0009 (9)\n-6AF18 Comment Length        0000 (0)\n-6AF1A Disk Start            0000 (0)\n-6AF1C Int File Attributes   0000 (0)\n-      [Bit 0]               0 'Binary Data'\n-6AF1E Ext File Attributes   00000000 (0)\n-6AF22 Local Header Offset   00003BC7 (15303)\n-6AF26 Filename              'XXXXXXXXXXXXXXXXXXXX'\n-#\n-# WARNING: Offset 0x6AF26: Filename 'XXXXXXXXXXXXXXXXXXXX'\n-#          Zero length filename\n-#\n-6AF3A Extra ID #1           5455 (21589) 'Extended Timestamp [UT]'\n-6AF3C   Length              0005 (5)\n-6AF3E   Flags               01 (1) 'Modification'\n-6AF3F   Modification Time   00000000 (0) 'Thu Jan  1 00:00:00 1970'\n-\n-6AF43 CENTRAL HEADER #5     02014B50 (33639248)\n-6AF47 Created Zip Spec      14 (20) '2.0'\n-6AF48 Created OS            00 (0) 'MS-DOS'\n-6AF49 Extract Zip Spec      14 (20) '2.0'\n-6AF4A Extract OS            00 (0) 'MS-DOS'\n-6AF4B General Purpose Flag  0008 (8)\n-      [Bit  3]              1 'Streamed'\n-6AF4D Compression Method    0000 (0) 'Stored'\n-6AF4F Modification Time     EC210000 (3961585664) 'Wed Jan  1 00:00:00 2098'\n-6AF53 CRC                   EA9E0E3C (3936226876)\n-6AF57 Compressed Size       000000AF (175)\n-6AF5B Uncompressed Size     000000AF (175)\n-6AF5F Filename Length       000F (15)\n-6AF61 Extra Length          0009 (9)\n-6AF63 Comment Length        0000 (0)\n-6AF65 Disk Start            0000 (0)\n-6AF67 Int File Attributes   0000 (0)\n-      [Bit 0]               0 'Binary Data'\n-6AF69 Ext File Attributes   00000000 (0)\n-6AF6D Local Header Offset   00003C2B (15403)\n-6AF71 Filename              'XXXXXXXXXXXXXXX'\n-#\n-# WARNING: Offset 0x6AF71: Filename 'XXXXXXXXXXXXXXX'\n-#          Zero length filename\n-#\n-6AF80 Extra ID #1           5455 (21589) 'Extended Timestamp [UT]'\n-6AF82   Length              0005 (5)\n-6AF84   Flags               01 (1) 'Modification'\n-6AF85   Modification Time   00000000 (0) 'Thu Jan  1 00:00:00 1970'\n-\n-6AF89 CENTRAL HEADER #6     02014B50 (33639248)\n-6AF8D Created Zip Spec      14 (20) '2.0'\n-6AF8E Created OS            00 (0) 'MS-DOS'\n-6AF8F Extract Zip Spec      14 (20) '2.0'\n-6AF90 Extract OS            00 (0) 'MS-DOS'\n-6AF91 General Purpose Flag  0000 (0)\n-6AF93 Compression Method    0000 (0) 'Stored'\n-6AF95 Modification Time     EC210000 (3961585664) 'Wed Jan  1 00:00:00 2098'\n-6AF99 CRC                   00000000 (0)\n-6AF9D Compressed Size       00000000 (0)\n-6AFA1 Uncompressed Size     00000000 (0)\n-6AFA5 Filename Length       000F (15)\n-6AFA7 Extra Length          0009 (9)\n-6AFA9 Comment Length        0000 (0)\n-6AFAB Disk Start            0000 (0)\n-6AFAD Int File Attributes   0000 (0)\n-      [Bit 0]               0 'Binary Data'\n-6AFAF Ext File Attributes   00000000 (0)\n-6AFB3 Local Header Offset   00003D20 (15648)\n-6AFB7 Filename              'XXXXXXXXXXXXXXX'\n-#\n-# WARNING: Offset 0x6AFB7: Filename 'XXXXXXXXXXXXXXX'\n-#          Zero length filename\n-#\n-6AFC6 Extra ID #1           5455 (21589) 'Extended Timestamp [UT]'\n-6AFC8   Length              0005 (5)\n-6AFCA   Flags               01 (1) 'Modification'\n-6AFCB   Modification Time   00000000 (0) 'Thu Jan  1 00:00:00 1970'\n-\n-6AFCF CENTRAL HEADER #7     02014B50 (33639248)\n-6AFD3 Created Zip Spec      14 (20) '2.0'\n-6AFD4 Created OS            00 (0) 'MS-DOS'\n-6AFD5 Extract Zip Spec      14 (20) '2.0'\n-6AFD6 Extract OS            00 (0) 'MS-DOS'\n-6AFD7 General Purpose Flag  0000 (0)\n-6AFD9 Compression Method    0000 (0) 'Stored'\n-6AFDB Modification Time     EC210000 (3961585664) 'Wed Jan  1 00:00:00 2098'\n-6AFDF CRC                   00000000 (0)\n-6AFE3 Compressed Size       00000000 (0)\n-6AFE7 Uncompressed Size     00000000 (0)\n-6AFEB Filename Length       0018 (24)\n-6AFED Extra Length          0009 (9)\n-6AFEF Comment Length        0000 (0)\n-6AFF1 Disk Start            0000 (0)\n-6AFF3 Int File Attributes   0000 (0)\n-      [Bit 0]               0 'Binary Data'\n-6AFF5 Ext File Attributes   00000000 (0)\n-6AFF9 Local Header Offset   00003D56 (15702)\n-6AFFD Filename              'XXXXXXXXXXXXXXXXXXXXXXXX'\n-#\n-# WARNING: Offset 0x6AFFD: Filename 'XXXXXXXXXXXXXXXXXXXXXXXX'\n-#          Zero length filename\n-#\n-6B015 Extra ID #1           5455 (21589) 'Extended Timestamp [UT]'\n-6B017   Length              0005 (5)\n-6B019   Flags               01 (1) 'Modification'\n-6B01A   Modification Time   00000000 (0) 'Thu Jan  1 00:00:00 1970'\n-\n-6B01E CENTRAL HEADER #8     02014B50 (33639248)\n-6B022 Created Zip Spec      14 (20) '2.0'\n-6B023 Created OS            00 (0) 'MS-DOS'\n-6B024 Extract Zip Spec      14 (20) '2.0'\n-6B025 Extract OS            00 (0) 'MS-DOS'\n-6B026 General Purpose Flag  0008 (8)\n-      [Bit  3]              1 'Streamed'\n-6B028 Compression Method    0000 (0) 'Stored'\n-6B02A Modification Time     EC210000 (3961585664) 'Wed Jan  1 00:00:00 2098'\n-6B02E CRC                   764EE4B3 (1984881843)\n-6B032 Compressed Size       0000003F (63)\n-6B036 Uncompressed Size     0000003F (63)\n-6B03A Filename Length       0044 (68)\n-6B03C Extra Length          0009 (9)\n-6B03E Comment Length        0000 (0)\n-6B040 Disk Start            0000 (0)\n-6B042 Int File Attributes   0000 (0)\n-      [Bit 0]               0 'Binary Data'\n-6B044 Ext File Attributes   00000000 (0)\n-6B048 Local Header Offset   00003D95 (15765)\n-6B04C Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n-#\n-# WARNING: Offset 0x6B04C: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n-#          Zero length filename\n-#\n-6B090 Extra ID #1           5455 (21589) 'Extended Timestamp [UT]'\n-6B092   Length              0005 (5)\n-6B094   Flags               01 (1) 'Modification'\n-6B095   Modification Time   00000000 (0) 'Thu Jan  1 00:00:00 1970'\n-\n-6B099 CENTRAL HEADER #9     02014B50 (33639248)\n-6B09D Created Zip Spec      14 (20) '2.0'\n-6B09E Created OS            00 (0) 'MS-DOS'\n-6B09F Extract Zip Spec      14 (20) '2.0'\n-6B0A0 Extract OS            00 (0) 'MS-DOS'\n-6B0A1 General Purpose Flag  0008 (8)\n-      [Bit  3]              1 'Streamed'\n-6B0A3 Compression Method    0000 (0) 'Stored'\n-6B0A5 Modification Time     EC210000 (3961585664) 'Wed Jan  1 00:00:00 2098'\n-6B0A9 CRC                   0FE2368F (266483343)\n-6B0AD Compressed Size       00000055 (85)\n-6B0B1 Uncompressed Size     00000055 (85)\n-6B0B5 Filename Length       003C (60)\n-6B0B7 Extra Length          0009 (9)\n-6B0B9 Comment Length        0000 (0)\n-6B0BB Disk Start            0000 (0)\n-6B0BD Int File Attributes   0000 (0)\n-      [Bit 0]               0 'Binary Data'\n-6B0BF Ext File Attributes   00000000 (0)\n-6B0C3 Local Header Offset   00003E4F (15951)\n-6B0C7 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n-#\n-# WARNING: Offset 0x6B0C7: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n-#          Zero length filename\n-#\n-6B103 Extra ID #1           5455 (21589) 'Extended Timestamp [UT]'\n-6B105   Length              0005 (5)\n-6B107   Flags               01 (1) 'Modification'\n-6B108   Modification Time   00000000 (0) 'Thu Jan  1 00:00:00 1970'\n-\n-6B10C CENTRAL HEADER #10    02014B50 (33639248)\n-6B110 Created Zip Spec      14 (20) '2.0'\n-6B111 Created OS            00 (0) 'MS-DOS'\n-6B112 Extract Zip Spec      14 (20) '2.0'\n-6B113 Extract OS            00 (0) 'MS-DOS'\n-6B114 General Purpose Flag  0008 (8)\n-      [Bit  3]              1 'Streamed'\n-6B116 Compression Method    0000 (0) 'Stored'\n-6B118 Modification Time     EC210000 (3961585664) 'Wed Jan  1 00:00:00 2098'\n-6B11C CRC                   93CA6C9E (2479516830)\n-6B120 Compressed Size       0000004D (77)\n-6B124 Uncompressed Size     0000004D (77)\n-6B128 Filename Length       0044 (68)\n-6B12A Extra Length          0009 (9)\n-6B12C Comment Length        0000 (0)\n-6B12E Disk Start            0000 (0)\n-6B130 Int File Attributes   0000 (0)\n-      [Bit 0]               0 'Binary Data'\n-6B132 Ext File Attributes   00000000 (0)\n-6B136 Local Header Offset   00003F17 (16151)\n-6B13A Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n-#\n-# WARNING: Offset 0x6B13A: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n-#          Zero length filename\n-#\n-6B17E Extra ID #1           5455 (21589) 'Extended Timestamp [UT]'\n-6B180   Length              0005 (5)\n-6B182   Flags               01 (1) 'Modification'\n-6B183   Modification Time   00000000 (0) 'Thu Jan  1 00:00:00 1970'\n-\n-6B187 CENTRAL HEADER #11    02014B50 (33639248)\n-6B18B Created Zip Spec      14 (20) '2.0'\n-6B18C Created OS            00 (0) 'MS-DOS'\n-6B18D Extract Zip Spec      14 (20) '2.0'\n-6B18E Extract OS            00 (0) 'MS-DOS'\n-6B18F General Purpose Flag  0008 (8)\n-      [Bit  3]              1 'Streamed'\n-6B191 Compression Method    0000 (0) 'Stored'\n-6B193 Modification Time     EC210000 (3961585664) 'Wed Jan  1 00:00:00 2098'\n-6B197 CRC                   4B7CAED5 (1266462421)\n-6B19B Compressed Size       00000057 (87)\n-6B19F Uncompressed Size     00000057 (87)\n-6B1A3 Filename Length       0049 (73)\n-6B1A5 Extra Length          0009 (9)\n-6B1A7 Comment Length        0000 (0)\n-6B1A9 Disk Start            0000 (0)\n-6B1AB Int File Attributes   0000 (0)\n-      [Bit 0]               0 'Binary Data'\n-6B1AD Ext File Attributes   00000000 (0)\n-6B1B1 Local Header Offset   00003FDF (16351)\n-6B1B5 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n-#\n-# WARNING: Offset 0x6B1B5: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n-#          Zero length filename\n-#\n-6B1FE Extra ID #1           5455 (21589) 'Extended Timestamp [UT]'\n-6B200   Length              0005 (5)\n-6B202   Flags               01 (1) 'Modification'\n-6B203   Modification Time   00000000 (0) 'Thu Jan  1 00:00:00 1970'\n-\n-6B207 CENTRAL HEADER #12    02014B50 (33639248)\n-6B20B Created Zip Spec      14 (20) '2.0'\n-6B20C Created OS            00 (0) 'MS-DOS'\n-6B20D Extract Zip Spec      14 (20) '2.0'\n-6B20E Extract OS            00 (0) 'MS-DOS'\n-6B20F General Purpose Flag  0008 (8)\n-      [Bit  3]              1 'Streamed'\n-6B211 Compression Method    0000 (0) 'Stored'\n-6B213 Modification Time     EC210000 (3961585664) 'Wed Jan  1 00:00:00 2098'\n-6B217 CRC                   83C8809D (2210955421)\n-6B21B Compressed Size       00000094 (148)\n-6B21F Uncompressed Size     00000094 (148)\n-6B223 Filename Length       0041 (65)\n-6B225 Extra Length          0009 (9)\n-6B227 Comment Length        0000 (0)\n-6B229 Disk Start            0000 (0)\n-6B22B Int File Attributes   0000 (0)\n-      [Bit 0]               0 'Binary Data'\n-6B22D Ext File Attributes   00000000 (0)\n-6B231 Local Header Offset   000040B6 (16566)\n-6B235 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n-#\n-# WARNING: Offset 0x6B235: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n-#          Zero length filename\n-#\n-6B276 Extra ID #1           5455 (21589) 'Extended Timestamp [UT]'\n-6B278   Length              0005 (5)\n-6B27A   Flags               01 (1) 'Modification'\n-6B27B   Modification Time   00000000 (0) 'Thu Jan  1 00:00:00 1970'\n-\n-6B27F CENTRAL HEADER #13    02014B50 (33639248)\n-6B283 Created Zip Spec      14 (20) '2.0'\n-6B284 Created OS            00 (0) 'MS-DOS'\n-6B285 Extract Zip Spec      14 (20) '2.0'\n-6B286 Extract OS            00 (0) 'MS-DOS'\n-6B287 General Purpose Flag  0008 (8)\n-      [Bit  3]              1 'Streamed'\n-6B289 Compression Method    0000 (0) 'Stored'\n-6B28B Modification Time     EC210000 (3961585664) 'Wed Jan  1 00:00:00 2098'\n-6B28F CRC                   290EDBFF (688839679)\n-6B293 Compressed Size       00000049 (73)\n-6B297 Uncompressed Size     00000049 (73)\n-6B29B Filename Length       0052 (82)\n-6B29D Extra Length          0009 (9)\n-6B29F Comment Length        0000 (0)\n-6B2A1 Disk Start            0000 (0)\n-6B2A3 Int File Attributes   0000 (0)\n-      [Bit 0]               0 'Binary Data'\n-6B2A5 Ext File Attributes   00000000 (0)\n-6B2A9 Local Header Offset   000041C2 (16834)\n-6B2AD Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n-#\n-# WARNING: Offset 0x6B2AD: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n-#          Zero length filename\n-#\n-6B2FF Extra ID #1           5455 (21589) 'Extended Timestamp [UT]'\n-6B301   Length              0005 (5)\n-6B303   Flags               01 (1) 'Modification'\n-6B304   Modification Time   00000000 (0) 'Thu Jan  1 00:00:00 1970'\n-\n-6B308 CENTRAL HEADER #14    02014B50 (33639248)\n-6B30C Created Zip Spec      14 (20) '2.0'\n-6B30D Created OS            00 (0) 'MS-DOS'\n-6B30E Extract Zip Spec      14 (20) '2.0'\n-6B30F Extract OS            00 (0) 'MS-DOS'\n-6B310 General Purpose Flag  0008 (8)\n-      [Bit  3]              1 'Streamed'\n-6B312 Compression Method    0000 (0) 'Stored'\n-6B314 Modification Time     EC210000 (3961585664) 'Wed Jan  1 00:00:00 2098'\n-6B318 CRC                   1BD83592 (467154322)\n-6B31C Compressed Size       00000040 (64)\n-6B320 Uncompressed Size     00000040 (64)\n-6B324 Filename Length       0049 (73)\n-6B326 Extra Length          0009 (9)\n-6B328 Comment Length        0000 (0)\n-6B32A Disk Start            0000 (0)\n-6B32C Int File Attributes   0000 (0)\n-      [Bit 0]               0 'Binary Data'\n-6B32E Ext File Attributes   00000000 (0)\n-6B332 Local Header Offset   00004294 (17044)\n-6B336 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n-#\n-# WARNING: Offset 0x6B336: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n-#          Zero length filename\n-#\n-6B37F Extra ID #1           5455 (21589) 'Extended Timestamp [UT]'\n-6B381   Length              0005 (5)\n-6B383   Flags               01 (1) 'Modification'\n-6B384   Modification Time   00000000 (0) 'Thu Jan  1 00:00:00 1970'\n-\n-6B388 CENTRAL HEADER #15    02014B50 (33639248)\n-6B38C Created Zip Spec      14 (20) '2.0'\n-6B38D Created OS            00 (0) 'MS-DOS'\n-6B38E Extract Zip Spec      14 (20) '2.0'\n-6B38F Extract OS            00 (0) 'MS-DOS'\n-6B390 General Purpose Flag  0008 (8)\n-      [Bit  3]              1 'Streamed'\n-6B392 Compression Method    0000 (0) 'Stored'\n-6B394 Modification Time     EC210000 (3961585664) 'Wed Jan  1 00:00:00 2098'\n-6B398 CRC                   C6FA5A39 (3338295865)\n-6B39C Compressed Size       00000047 (71)\n-6B3A0 Uncompressed Size     00000047 (71)\n-6B3A4 Filename Length       0050 (80)\n-6B3A6 Extra Length          0009 (9)\n-6B3A8 Comment Length        0000 (0)\n-6B3AA Disk Start            0000 (0)\n-6B3AC Int File Attributes   0000 (0)\n-      [Bit 0]               0 'Binary Data'\n-6B3AE Ext File Attributes   00000000 (0)\n-6B3B2 Local Header Offset   00004354 (17236)\n-6B3B6 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n-#\n-# WARNING: Offset 0x6B3B6: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n-#          Zero length filename\n-#\n-6B406 Extra ID #1           5455 (21589) 'Extended Timestamp [UT]'\n-6B408   Length              0005 (5)\n-6B40A   Flags               01 (1) 'Modification'\n-6B40B   Modification Time   00000000 (0) 'Thu Jan  1 00:00:00 1970'\n-\n-6B40F CENTRAL HEADER #16    02014B50 (33639248)\n-6B413 Created Zip Spec      14 (20) '2.0'\n-6B414 Created OS            00 (0) 'MS-DOS'\n-6B415 Extract Zip Spec      14 (20) '2.0'\n-6B416 Extract OS            00 (0) 'MS-DOS'\n-6B417 General Purpose Flag  0008 (8)\n-      [Bit  3]              1 'Streamed'\n-6B419 Compression Method    0000 (0) 'Stored'\n-6B41B Modification Time     EC210000 (3961585664) 'Wed Jan  1 00:00:00 2098'\n-6B41F CRC                   2E8D92A5 (781030053)\n-6B423 Compressed Size       00000238 (568)\n-6B427 Uncompressed Size     00000238 (568)\n-6B42B Filename Length       0052 (82)\n-6B42D Extra Length          0009 (9)\n-6B42F Comment Length        0000 (0)\n-6B431 Disk Start            0000 (0)\n-6B433 Int File Attributes   0000 (0)\n-      [Bit 0]               0 'Binary Data'\n-6B435 Ext File Attributes   00000000 (0)\n-6B439 Local Header Offset   00004422 (17442)\n-6B43D Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n-#\n-# WARNING: Offset 0x6B43D: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n-#          Zero length filename\n-#\n-6B48F Extra ID #1           5455 (21589) 'Extended Timestamp [UT]'\n-6B491   Length              0005 (5)\n-6B493   Flags               01 (1) 'Modification'\n-6B494   Modification Time   00000000 (0) 'Thu Jan  1 00:00:00 1970'\n-\n-6B498 CENTRAL HEADER #17    02014B50 (33639248)\n-6B49C Created Zip Spec      14 (20) '2.0'\n-6B49D Created OS            00 (0) 'MS-DOS'\n-6B49E Extract Zip Spec      14 (20) '2.0'\n-6B49F Extract OS            00 (0) 'MS-DOS'\n-6B4A0 General Purpose Flag  0008 (8)\n-      [Bit  3]              1 'Streamed'\n-6B4A2 Compression Method    0000 (0) 'Stored'\n-6B4A4 Modification Time     EC210000 (3961585664) 'Wed Jan  1 00:00:00 2098'\n-6B4A8 CRC                   2937F90B (691534091)\n-6B4AC Compressed Size       000000B0 (176)\n-6B4B0 Uncompressed Size     000000B0 (176)\n-6B4B4 Filename Length       005B (91)\n-6B4B6 Extra Length          0009 (9)\n-6B4B8 Comment Length        0000 (0)\n-6B4BA Disk Start            0000 (0)\n-6B4BC Int File Attributes   0000 (0)\n-      [Bit 0]               0 'Binary Data'\n-6B4BE Ext File Attributes   00000000 (0)\n-6B4C2 Local Header Offset   000046E3 (18147)\n-6B4C6 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n-#\n-# WARNING: Offset 0x6B4C6: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n-#          Zero length filename\n-#\n-6B521 Extra ID #1           5455 (21589) 'Extended Timestamp [UT]'\n-6B523   Length              0005 (5)\n-6B525   Flags               01 (1) 'Modification'\n-6B526   Modification Time   00000000 (0) 'Thu Jan  1 00:00:00 1970'\n-\n-6B52A CENTRAL HEADER #18    02014B50 (33639248)\n-6B52E Created Zip Spec      14 (20) '2.0'\n-6B52F Created OS            00 (0) 'MS-DOS'\n-6B530 Extract Zip Spec      14 (20) '2.0'\n-6B531 Extract OS            00 (0) 'MS-DOS'\n-6B532 General Purpose Flag  0008 (8)\n-      [Bit  3]              1 'Streamed'\n-6B534 Compression Method    0000 (0) 'Stored'\n-6B536 Modification Time     EC210000 (3961585664) 'Wed Jan  1 00:00:00 2098'\n-6B53A CRC                   A49FCF77 (2761936759)\n-6B53E Compressed Size       00000054 (84)\n-6B542 Uncompressed Size     00000054 (84)\n-6B546 Filename Length       005B (91)\n-6B548 Extra Length          0009 (9)\n-6B54A Comment Length        0000 (0)\n-6B54C Disk Start            0000 (0)\n-6B54E Int File Attributes   0000 (0)\n-      [Bit 0]               0 'Binary Data'\n-6B550 Ext File Attributes   00000000 (0)\n-6B554 Local Header Offset   00004825 (18469)\n-6B558 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n-#\n-# WARNING: Offset 0x6B558: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n-#          Zero length filename\n-#\n-6B5B3 Extra ID #1           5455 (21589) 'Extended Timestamp [UT]'\n-6B5B5   Length              0005 (5)\n-6B5B7   Flags               01 (1) 'Modification'\n-6B5B8   Modification Time   00000000 (0) 'Thu Jan  1 00:00:00 1970'\n-\n-6B5BC CENTRAL HEADER #19    02014B50 (33639248)\n-6B5C0 Created Zip Spec      14 (20) '2.0'\n-6B5C1 Created OS            00 (0) 'MS-DOS'\n-6B5C2 Extract Zip Spec      14 (20) '2.0'\n-6B5C3 Extract OS            00 (0) 'MS-DOS'\n-6B5C4 General Purpose Flag  0008 (8)\n-      [Bit  3]              1 'Streamed'\n-6B5C6 Compression Method    0000 (0) 'Stored'\n-6B5C8 Modification Time     EC210000 (3961585664) 'Wed Jan  1 00:00:00 2098'\n-6B5CC CRC                   F515114D (4111798605)\n-6B5D0 Compressed Size       00000054 (84)\n-6B5D4 Uncompressed Size     00000054 (84)\n-6B5D8 Filename Length       005D (93)\n-6B5DA Extra Length          0009 (9)\n-6B5DC Comment Length        0000 (0)\n-6B5DE Disk Start            0000 (0)\n-6B5E0 Int File Attributes   0000 (0)\n-      [Bit 0]               0 'Binary Data'\n-6B5E2 Ext File Attributes   00000000 (0)\n-6B5E6 Local Header Offset   0000490B (18699)\n-6B5EA Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n-#\n-# WARNING: Offset 0x6B5EA: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n-#          Zero length filename\n-#\n-6B647 Extra ID #1           5455 (21589) 'Extended Timestamp [UT]'\n-6B649   Length              0005 (5)\n-6B64B   Flags               01 (1) 'Modification'\n-6B64C   Modification Time   00000000 (0) 'Thu Jan  1 00:00:00 1970'\n-\n-6B650 CENTRAL HEADER #20    02014B50 (33639248)\n-6B654 Created Zip Spec      14 (20) '2.0'\n-6B655 Created OS            00 (0) 'MS-DOS'\n-6B656 Extract Zip Spec      14 (20) '2.0'\n-6B657 Extract OS            00 (0) 'MS-DOS'\n-6B658 General Purpose Flag  0008 (8)\n-      [Bit  3]              1 'Streamed'\n-6B65A Compression Method    0000 (0) 'Stored'\n-6B65C Modification Time     EC210000 (3961585664) 'Wed Jan  1 00:00:00 2098'\n-6B660 CRC                   285254BA (676484282)\n-6B664 Compressed Size       0000004E (78)\n-6B668 Uncompressed Size     0000004E (78)\n-6B66C Filename Length       0059 (89)\n-6B66E Extra Length          0009 (9)\n-6B670 Comment Length        0000 (0)\n-6B672 Disk Start            0000 (0)\n-6B674 Int File Attributes   0000 (0)\n-      [Bit 0]               0 'Binary Data'\n-6B676 Ext File Attributes   00000000 (0)\n-6B67A Local Header Offset   000049F3 (18931)\n-6B67E Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n-#\n-# WARNING: Offset 0x6B67E: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n-#          Zero length filename\n-#\n-6B6D7 Extra ID #1           5455 (21589) 'Extended Timestamp [UT]'\n-6B6D9   Length              0005 (5)\n-6B6DB   Flags               01 (1) 'Modification'\n-6B6DC   Modification Time   00000000 (0) 'Thu Jan  1 00:00:00 1970'\n-\n-6B6E0 CENTRAL HEADER #21    02014B50 (33639248)\n-6B6E4 Created Zip Spec      14 (20) '2.0'\n-6B6E5 Created OS            00 (0) 'MS-DOS'\n-6B6E6 Extract Zip Spec      14 (20) '2.0'\n-6B6E7 Extract OS            00 (0) 'MS-DOS'\n-6B6E8 General Purpose Flag  0008 (8)\n-      [Bit  3]              1 'Streamed'\n-6B6EA Compression Method    0000 (0) 'Stored'\n-6B6EC Modification Time     EC210000 (3961585664) 'Wed Jan  1 00:00:00 2098'\n-6B6F0 CRC                   9DAB4985 (2645248389)\n-6B6F4 Compressed Size       0000004A (74)\n-6B6F8 Uncompressed Size     0000004A (74)\n-6B6FC Filename Length       0056 (86)\n-6B6FE Extra Length          0009 (9)\n-6B700 Comment Length        0000 (0)\n-6B702 Disk Start            0000 (0)\n-6B704 Int File Attributes   0000 (0)\n-      [Bit 0]               0 'Binary Data'\n-6B706 Ext File Attributes   00000000 (0)\n-6B70A Local Header Offset   00004AD1 (19153)\n-6B70E Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n-#\n-# WARNING: Offset 0x6B70E: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n-#          Zero length filename\n-#\n-6B764 Extra ID #1           5455 (21589) 'Extended Timestamp [UT]'\n-6B766   Length              0005 (5)\n-6B768   Flags               01 (1) 'Modification'\n-6B769   Modification Time   00000000 (0) 'Thu Jan  1 00:00:00 1970'\n-\n-6B76D CENTRAL HEADER #22    02014B50 (33639248)\n-6B771 Created Zip Spec      14 (20) '2.0'\n-6B772 Created OS            00 (0) 'MS-DOS'\n-6B773 Extract Zip Spec      14 (20) '2.0'\n-6B774 Extract OS            00 (0) 'MS-DOS'\n-6B775 General Purpose Flag  0008 (8)\n-      [Bit  3]              1 'Streamed'\n-6B777 Compression Method    0000 (0) 'Stored'\n-6B779 Modification Time     EC210000 (3961585664) 'Wed Jan  1 00:00:00 2098'\n-6B77D CRC                   7DCDDED9 (2110643929)\n-6B781 Compressed Size       000000A4 (164)\n-6B785 Uncompressed Size     000000A4 (164)\n-6B789 Filename Length       0035 (53)\n-6B78B Extra Length          0009 (9)\n-6B78D Comment Length        0000 (0)\n-6B78F Disk Start            0000 (0)\n-6B791 Int File Attributes   0000 (0)\n-      [Bit 0]               0 'Binary Data'\n-6B793 Ext File Attributes   00000000 (0)\n-6B797 Local Header Offset   00004BA8 (19368)\n-6B79B Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n-#\n-# WARNING: Offset 0x6B79B: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n-#          Zero length filename\n-#\n-6B7D0 Extra ID #1           5455 (21589) 'Extended Timestamp [UT]'\n-6B7D2   Length              0005 (5)\n-6B7D4   Flags               01 (1) 'Modification'\n-6B7D5   Modification Time   00000000 (0) 'Thu Jan  1 00:00:00 1970'\n-\n-6B7D9 CENTRAL HEADER #23    02014B50 (33639248)\n-6B7DD Created Zip Spec      14 (20) '2.0'\n-6B7DE Created OS            00 (0) 'MS-DOS'\n-6B7DF Extract Zip Spec      14 (20) '2.0'\n-6B7E0 Extract OS            00 (0) 'MS-DOS'\n-6B7E1 General Purpose Flag  0000 (0)\n-6B7E3 Compression Method    0000 (0) 'Stored'\n-6B7E5 Modification Time     EC210000 (3961585664) 'Wed Jan  1 00:00:00 2098'\n-6B7E9 CRC                   00000000 (0)\n-6B7ED Compressed Size       00000000 (0)\n-6B7F1 Uncompressed Size     00000000 (0)\n-6B7F5 Filename Length       000F (15)\n-6B7F7 Extra Length          0009 (9)\n-6B7F9 Comment Length        0000 (0)\n-6B7FB Disk Start            0000 (0)\n-6B7FD Int File Attributes   0000 (0)\n-      [Bit 0]               0 'Binary Data'\n-6B7FF Ext File Attributes   00000000 (0)\n-6B803 Local Header Offset   00004CB8 (19640)\n-6B807 Filename              'XXXXXXXXXXXXXXX'\n-#\n-# WARNING: Offset 0x6B807: Filename 'XXXXXXXXXXXXXXX'\n-#          Zero length filename\n-#\n-6B816 Extra ID #1           5455 (21589) 'Extended Timestamp [UT]'\n-6B818   Length              0005 (5)\n-6B81A   Flags               01 (1) 'Modification'\n-6B81B   Modification Time   00000000 (0) 'Thu Jan  1 00:00:00 1970'\n-\n-6B81F CENTRAL HEADER #24    02014B50 (33639248)\n-6B823 Created Zip Spec      14 (20) '2.0'\n-6B824 Created OS            00 (0) 'MS-DOS'\n-6B825 Extract Zip Spec      14 (20) '2.0'\n-6B826 Extract OS            00 (0) 'MS-DOS'\n-6B827 General Purpose Flag  0000 (0)\n-6B829 Compression Method    0000 (0) 'Stored'\n-6B82B Modification Time     EC210000 (3961585664) 'Wed Jan  1 00:00:00 2098'\n-6B82F CRC                   00000000 (0)\n-6B833 Compressed Size       00000000 (0)\n-6B837 Uncompressed Size     00000000 (0)\n-6B83B Filename Length       0020 (32)\n-6B83D Extra Length          0009 (9)\n-6B83F Comment Length        0000 (0)\n-6B841 Disk Start            0000 (0)\n-6B843 Int File Attributes   0000 (0)\n-      [Bit 0]               0 'Binary Data'\n-6B845 Ext File Attributes   00000000 (0)\n-6B849 Local Header Offset   00004CEE (19694)\n-6B84D Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n-#\n-# WARNING: Offset 0x6B84D: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n-#          Zero length filename\n-#\n-6B86D Extra ID #1           5455 (21589) 'Extended Timestamp [UT]'\n-6B86F   Length              0005 (5)\n-6B871   Flags               01 (1) 'Modification'\n-6B872   Modification Time   00000000 (0) 'Thu Jan  1 00:00:00 1970'\n-\n-6B876 CENTRAL HEADER #25    02014B50 (33639248)\n-6B87A Created Zip Spec      14 (20) '2.0'\n-6B87B Created OS            00 (0) 'MS-DOS'\n-6B87C Extract Zip Spec      14 (20) '2.0'\n-6B87D Extract OS            00 (0) 'MS-DOS'\n-6B87E General Purpose Flag  0000 (0)\n-6B880 Compression Method    0000 (0) 'Stored'\n-6B882 Modification Time     EC210000 (3961585664) 'Wed Jan  1 00:00:00 2098'\n-6B886 CRC                   00000000 (0)\n-6B88A Compressed Size       00000000 (0)\n-6B88E Uncompressed Size     00000000 (0)\n-6B892 Filename Length       0033 (51)\n-6B894 Extra Length          0009 (9)\n-6B896 Comment Length        0000 (0)\n-6B898 Disk Start            0000 (0)\n-6B89A Int File Attributes   0000 (0)\n-      [Bit 0]               0 'Binary Data'\n-6B89C Ext File Attributes   00000000 (0)\n-6B8A0 Local Header Offset   00004D35 (19765)\n-6B8A4 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n-#\n-# WARNING: Offset 0x6B8A4: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n-#          Zero length filename\n-#\n-6B8D7 Extra ID #1           5455 (21589) 'Extended Timestamp [UT]'\n-6B8D9   Length              0005 (5)\n-6B8DB   Flags               01 (1) 'Modification'\n-6B8DC   Modification Time   00000000 (0) 'Thu Jan  1 00:00:00 1970'\n-\n-6B8E0 CENTRAL HEADER #26    02014B50 (33639248)\n-6B8E4 Created Zip Spec      14 (20) '2.0'\n-6B8E5 Created OS            00 (0) 'MS-DOS'\n-6B8E6 Extract Zip Spec      14 (20) '2.0'\n-6B8E7 Extract OS            00 (0) 'MS-DOS'\n-6B8E8 General Purpose Flag  0008 (8)\n-      [Bit  3]              1 'Streamed'\n-6B8EA Compression Method    0000 (0) 'Stored'\n-6B8EC Modification Time     EC210000 (3961585664) 'Wed Jan  1 00:00:00 2098'\n-6B8F0 CRC                   00000000 (0)\n-6B8F4 Compressed Size       00000000 (0)\n-6B8F8 Uncompressed Size     00000000 (0)\n-6B8FC Filename Length       0041 (65)\n-6B8FE Extra Length          0009 (9)\n-6B900 Comment Length        0000 (0)\n-6B902 Disk Start            0000 (0)\n-6B904 Int File Attributes   0000 (0)\n-      [Bit 0]               0 'Binary Data'\n-6B906 Ext File Attributes   00000000 (0)\n-6B90A Local Header Offset   00004D8F (19855)\n-6B90E Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n-#\n-# WARNING: Offset 0x6B90E: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n-#          Zero length filename\n-#\n-6B94F Extra ID #1           5455 (21589) 'Extended Timestamp [UT]'\n-6B951   Length              0005 (5)\n-6B953   Flags               01 (1) 'Modification'\n-6B954   Modification Time   00000000 (0) 'Thu Jan  1 00:00:00 1970'\n-\n-6B958 CENTRAL HEADER #27    02014B50 (33639248)\n-6B95C Created Zip Spec      14 (20) '2.0'\n-6B95D Created OS            00 (0) 'MS-DOS'\n-6B95E Extract Zip Spec      14 (20) '2.0'\n-6B95F Extract OS            00 (0) 'MS-DOS'\n-6B960 General Purpose Flag  0008 (8)\n-      [Bit  3]              1 'Streamed'\n-6B962 Compression Method    0000 (0) 'Stored'\n-6B964 Modification Time     EC210000 (3961585664) 'Wed Jan  1 00:00:00 2098'\n-6B968 CRC                   050B85C5 (84641221)\n-6B96C Compressed Size       00000CF1 (3313)\n-6B970 Uncompressed Size     00000CF1 (3313)\n-6B974 Filename Length       003A (58)\n-6B976 Extra Length          0009 (9)\n-6B978 Comment Length        0000 (0)\n-6B97A Disk Start            0000 (0)\n-6B97C Int File Attributes   0000 (0)\n-      [Bit 0]               0 'Binary Data'\n-6B97E Ext File Attributes   00000000 (0)\n-6B982 Local Header Offset   00004E07 (19975)\n-6B986 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n-#\n-# WARNING: Offset 0x6B986: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n-#          Zero length filename\n-#\n-6B9C0 Extra ID #1           5455 (21589) 'Extended Timestamp [UT]'\n-6B9C2   Length              0005 (5)\n-6B9C4   Flags               01 (1) 'Modification'\n-6B9C5   Modification Time   00000000 (0) 'Thu Jan  1 00:00:00 1970'\n-\n-6B9C9 CENTRAL HEADER #28    02014B50 (33639248)\n-6B9CD Created Zip Spec      14 (20) '2.0'\n-6B9CE Created OS            00 (0) 'MS-DOS'\n-6B9CF Extract Zip Spec      14 (20) '2.0'\n-6B9D0 Extract OS            00 (0) 'MS-DOS'\n-6B9D1 General Purpose Flag  0000 (0)\n-6B9D3 Compression Method    0000 (0) 'Stored'\n-6B9D5 Modification Time     EC210000 (3961585664) 'Wed Jan  1 00:00:00 2098'\n-6B9D9 CRC                   00000000 (0)\n-6B9DD Compressed Size       00000000 (0)\n-6B9E1 Uncompressed Size     00000000 (0)\n-6B9E5 Filename Length       0004 (4)\n-6B9E7 Extra Length          0009 (9)\n-6B9E9 Comment Length        0000 (0)\n-6B9EB Disk Start            0000 (0)\n-6B9ED Int File Attributes   0000 (0)\n-      [Bit 0]               0 'Binary Data'\n-6B9EF Ext File Attributes   00000000 (0)\n-6B9F3 Local Header Offset   00005B69 (23401)\n-6B9F7 Filename              'XXXX'\n-#\n-# WARNING: Offset 0x6B9F7: Filename 'XXXX'\n-#          Zero length filename\n-#\n-6B9FB Extra ID #1           5455 (21589) 'Extended Timestamp [UT]'\n-6B9FD   Length              0005 (5)\n-6B9FF   Flags               01 (1) 'Modification'\n-6BA00   Modification Time   00000000 (0) 'Thu Jan  1 00:00:00 1970'\n-\n-6BA04 CENTRAL HEADER #29    02014B50 (33639248)\n-6BA08 Created Zip Spec      14 (20) '2.0'\n-6BA09 Created OS            00 (0) 'MS-DOS'\n-6BA0A Extract Zip Spec      14 (20) '2.0'\n-6BA0B Extract OS            00 (0) 'MS-DOS'\n-6BA0C General Purpose Flag  0000 (0)\n-6BA0E Compression Method    0000 (0) 'Stored'\n-6BA10 Modification Time     EC210000 (3961585664) 'Wed Jan  1 00:00:00 2098'\n-6BA14 CRC                   00000000 (0)\n-6BA18 Compressed Size       00000000 (0)\n-6BA1C Uncompressed Size     00000000 (0)\n-6BA20 Filename Length       000B (11)\n-6BA22 Extra Length          0009 (9)\n-6BA24 Comment Length        0000 (0)\n-6BA26 Disk Start            0000 (0)\n-6BA28 Int File Attributes   0000 (0)\n-      [Bit 0]               0 'Binary Data'\n-6BA2A Ext File Attributes   00000000 (0)\n-6BA2E Local Header Offset   00005B94 (23444)\n-6BA32 Filename              'XXXXXXXXXXX'\n-#\n-# WARNING: Offset 0x6BA32: Filename 'XXXXXXXXXXX'\n-#          Zero length filename\n-#\n-6BA3D Extra ID #1           5455 (21589) 'Extended Timestamp [UT]'\n-6BA3F   Length              0005 (5)\n-6BA41   Flags               01 (1) 'Modification'\n-6BA42   Modification Time   00000000 (0) 'Thu Jan  1 00:00:00 1970'\n-\n-6BA46 CENTRAL HEADER #30    02014B50 (33639248)\n-6BA4A Created Zip Spec      14 (20) '2.0'\n-6BA4B Created OS            00 (0) 'MS-DOS'\n-6BA4C Extract Zip Spec      14 (20) '2.0'\n-6BA4D Extract OS            00 (0) 'MS-DOS'\n-6BA4E General Purpose Flag  0000 (0)\n-6BA50 Compression Method    0000 (0) 'Stored'\n-6BA52 Modification Time     EC210000 (3961585664) 'Wed Jan  1 00:00:00 2098'\n-6BA56 CRC                   00000000 (0)\n-6BA5A Compressed Size       00000000 (0)\n-6BA5E Uncompressed Size     00000000 (0)\n-6BA62 Filename Length       0011 (17)\n-6BA64 Extra Length          0009 (9)\n-6BA66 Comment Length        0000 (0)\n-6BA68 Disk Start            0000 (0)\n-6BA6A Int File Attributes   0000 (0)\n-      [Bit 0]               0 'Binary Data'\n-6BA6C Ext File Attributes   00000000 (0)\n-6BA70 Local Header Offset   00005BC6 (23494)\n-6BA74 Filename              'XXXXXXXXXXXXXXXXX'\n-#\n-# WARNING: Offset 0x6BA74: Filename 'XXXXXXXXXXXXXXXXX'\n-#          Zero length filename\n-#\n-6BA85 Extra ID #1           5455 (21589) 'Extended Timestamp [UT]'\n-6BA87   Length              0005 (5)\n-6BA89   Flags               01 (1) 'Modification'\n-6BA8A   Modification Time   00000000 (0) 'Thu Jan  1 00:00:00 1970'\n-\n-6BA8E CENTRAL HEADER #31    02014B50 (33639248)\n-6BA92 Created Zip Spec      14 (20) '2.0'\n-6BA93 Created OS            00 (0) 'MS-DOS'\n-6BA94 Extract Zip Spec      14 (20) '2.0'\n-6BA95 Extract OS            00 (0) 'MS-DOS'\n-6BA96 General Purpose Flag  0000 (0)\n-6BA98 Compression Method    0000 (0) 'Stored'\n-6BA9A Modification Time     EC210000 (3961585664) 'Wed Jan  1 00:00:00 2098'\n-6BA9E CRC                   00000000 (0)\n-6BAA2 Compressed Size       00000000 (0)\n-6BAA6 Uncompressed Size     00000000 (0)\n-6BAAA Filename Length       001A (26)\n-6BAAC Extra Length          0009 (9)\n-6BAAE Comment Length        0000 (0)\n-6BAB0 Disk Start            0000 (0)\n-6BAB2 Int File Attributes   0000 (0)\n-      [Bit 0]               0 'Binary Data'\n-6BAB4 Ext File Attributes   00000000 (0)\n-6BAB8 Local Header Offset   00005BFE (23550)\n-6BABC Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXX'\n-#\n-# WARNING: Offset 0x6BABC: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXX'\n-#          Zero length filename\n-#\n-6BAD6 Extra ID #1           5455 (21589) 'Extended Timestamp [UT]'\n-6BAD8   Length              0005 (5)\n-6BADA   Flags               01 (1) 'Modification'\n-6BADB   Modification Time   00000000 (0) 'Thu Jan  1 00:00:00 1970'\n-\n-6BADF CENTRAL HEADER #32    02014B50 (33639248)\n-6BAE3 Created Zip Spec      14 (20) '2.0'\n-6BAE4 Created OS            00 (0) 'MS-DOS'\n-6BAE5 Extract Zip Spec      14 (20) '2.0'\n-6BAE6 Extract OS            00 (0) 'MS-DOS'\n-6BAE7 General Purpose Flag  0008 (8)\n-      [Bit  3]              1 'Streamed'\n-6BAE9 Compression Method    0000 (0) 'Stored'\n-6BAEB Modification Time     EC210000 (3961585664) 'Wed Jan  1 00:00:00 2098'\n-6BAEF CRC                   D4B8B1A6 (3568873894)\n-6BAF3 Compressed Size       00000520 (1312)\n-6BAF7 Uncompressed Size     00000520 (1312)\n-6BAFB Filename Length       002E (46)\n-6BAFD Extra Length          0009 (9)\n-6BAFF Comment Length        0000 (0)\n-6BB01 Disk Start            0000 (0)\n-6BB03 Int File Attributes   0000 (0)\n-      [Bit 0]               0 'Binary Data'\n-6BB05 Ext File Attributes   00000000 (0)\n-6BB09 Local Header Offset   00005C3F (23615)\n-6BB0D Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n-#\n-# WARNING: Offset 0x6BB0D: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n-#          Zero length filename\n-#\n-6BB3B Extra ID #1           5455 (21589) 'Extended Timestamp [UT]'\n-6BB3D   Length              0005 (5)\n-6BB3F   Flags               01 (1) 'Modification'\n-6BB40   Modification Time   00000000 (0) 'Thu Jan  1 00:00:00 1970'\n-\n-6BB44 CENTRAL HEADER #33    02014B50 (33639248)\n-6BB48 Created Zip Spec      14 (20) '2.0'\n-6BB49 Created OS            00 (0) 'MS-DOS'\n-6BB4A Extract Zip Spec      14 (20) '2.0'\n-6BB4B Extract OS            00 (0) 'MS-DOS'\n-6BB4C General Purpose Flag  0008 (8)\n-      [Bit  3]              1 'Streamed'\n-6BB4E Compression Method    0000 (0) 'Stored'\n-6BB50 Modification Time     EC210000 (3961585664) 'Wed Jan  1 00:00:00 2098'\n-6BB54 CRC                   9303661A (2466473498)\n-6BB58 Compressed Size       00000A6D (2669)\n-6BB5C Uncompressed Size     00000A6D (2669)\n-6BB60 Filename Length       0028 (40)\n-6BB62 Extra Length          0009 (9)\n-6BB64 Comment Length        0000 (0)\n-6BB66 Disk Start            0000 (0)\n-6BB68 Int File Attributes   0000 (0)\n-      [Bit 0]               0 'Binary Data'\n-6BB6A Ext File Attributes   00000000 (0)\n-6BB6E Local Header Offset   000061C4 (25028)\n-6BB72 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n-#\n-# WARNING: Offset 0x6BB72: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n-#          Zero length filename\n-#\n-6BB9A Extra ID #1           5455 (21589) 'Extended Timestamp [UT]'\n-6BB9C   Length              0005 (5)\n-6BB9E   Flags               01 (1) 'Modification'\n-6BB9F   Modification Time   00000000 (0) 'Thu Jan  1 00:00:00 1970'\n-\n-6BBA3 CENTRAL HEADER #34    02014B50 (33639248)\n-6BBA7 Created Zip Spec      14 (20) '2.0'\n-6BBA8 Created OS            00 (0) 'MS-DOS'\n-6BBA9 Extract Zip Spec      14 (20) '2.0'\n-6BBAA Extract OS            00 (0) 'MS-DOS'\n-6BBAB General Purpose Flag  0008 (8)\n-      [Bit  3]              1 'Streamed'\n-6BBAD Compression Method    0000 (0) 'Stored'\n-6BBAF Modification Time     EC210000 (3961585664) 'Wed Jan  1 00:00:00 2098'\n-6BBB3 CRC                   8391A9ED (2207361517)\n-6BBB7 Compressed Size       00001419 (5145)\n-6BBBB Uncompressed Size     00001419 (5145)\n-6BBBF Filename Length       0036 (54)\n-6BBC1 Extra Length          0009 (9)\n-6BBC3 Comment Length        0000 (0)\n-6BBC5 Disk Start            0000 (0)\n-6BBC7 Int File Attributes   0000 (0)\n-      [Bit 0]               0 'Binary Data'\n-6BBC9 Ext File Attributes   00000000 (0)\n-6BBCD Local Header Offset   00006C90 (27792)\n-6BBD1 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n-#\n-# WARNING: Offset 0x6BBD1: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n-#          Zero length filename\n-#\n-6BC07 Extra ID #1           5455 (21589) 'Extended Timestamp [UT]'\n-6BC09   Length              0005 (5)\n-6BC0B   Flags               01 (1) 'Modification'\n-6BC0C   Modification Time   00000000 (0) 'Thu Jan  1 00:00:00 1970'\n-\n-6BC10 CENTRAL HEADER #35    02014B50 (33639248)\n-6BC14 Created Zip Spec      14 (20) '2.0'\n-6BC15 Created OS            00 (0) 'MS-DOS'\n-6BC16 Extract Zip Spec      14 (20) '2.0'\n-6BC17 Extract OS            00 (0) 'MS-DOS'\n-6BC18 General Purpose Flag  0008 (8)\n-      [Bit  3]              1 'Streamed'\n-6BC1A Compression Method    0000 (0) 'Stored'\n-6BC1C Modification Time     EC210000 (3961585664) 'Wed Jan  1 00:00:00 2098'\n-6BC20 CRC                   4C19B653 (1276753491)\n-6BC24 Compressed Size       00000A34 (2612)\n-6BC28 Uncompressed Size     00000A34 (2612)\n-6BC2C Filename Length       002D (45)\n-6BC2E Extra Length          0009 (9)\n-6BC30 Comment Length        0000 (0)\n-6BC32 Disk Start            0000 (0)\n-6BC34 Int File Attributes   0000 (0)\n-      [Bit 0]               0 'Binary Data'\n-6BC36 Ext File Attributes   00000000 (0)\n-6BC3A Local Header Offset   00008116 (33046)\n-6BC3E Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n-#\n-# WARNING: Offset 0x6BC3E: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n-#          Zero length filename\n-#\n-6BC6B Extra ID #1           5455 (21589) 'Extended Timestamp [UT]'\n-6BC6D   Length              0005 (5)\n-6BC6F   Flags               01 (1) 'Modification'\n-6BC70   Modification Time   00000000 (0) 'Thu Jan  1 00:00:00 1970'\n-\n-6BC74 CENTRAL HEADER #36    02014B50 (33639248)\n-6BC78 Created Zip Spec      14 (20) '2.0'\n-6BC79 Created OS            00 (0) 'MS-DOS'\n-6BC7A Extract Zip Spec      14 (20) '2.0'\n-6BC7B Extract OS            00 (0) 'MS-DOS'\n-6BC7C General Purpose Flag  0008 (8)\n-      [Bit  3]              1 'Streamed'\n-6BC7E Compression Method    0000 (0) 'Stored'\n-6BC80 Modification Time     EC210000 (3961585664) 'Wed Jan  1 00:00:00 2098'\n-6BC84 CRC                   92D33C56 (2463317078)\n-6BC88 Compressed Size       0000053A (1338)\n-6BC8C Uncompressed Size     0000053A (1338)\n-6BC90 Filename Length       0027 (39)\n-6BC92 Extra Length          0009 (9)\n-6BC94 Comment Length        0000 (0)\n-6BC96 Disk Start            0000 (0)\n-6BC98 Int File Attributes   0000 (0)\n-      [Bit 0]               0 'Binary Data'\n-6BC9A Ext File Attributes   00000000 (0)\n-6BC9E Local Header Offset   00008BAE (35758)\n-6BCA2 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n-#\n-# WARNING: Offset 0x6BCA2: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n-#          Zero length filename\n-#\n-6BCC9 Extra ID #1           5455 (21589) 'Extended Timestamp [UT]'\n-6BCCB   Length              0005 (5)\n-6BCCD   Flags               01 (1) 'Modification'\n-6BCCE   Modification Time   00000000 (0) 'Thu Jan  1 00:00:00 1970'\n-\n-6BCD2 CENTRAL HEADER #37    02014B50 (33639248)\n-6BCD6 Created Zip Spec      14 (20) '2.0'\n-6BCD7 Created OS            00 (0) 'MS-DOS'\n-6BCD8 Extract Zip Spec      14 (20) '2.0'\n-6BCD9 Extract OS            00 (0) 'MS-DOS'\n-6BCDA General Purpose Flag  0008 (8)\n-      [Bit  3]              1 'Streamed'\n-6BCDC Compression Method    0000 (0) 'Stored'\n-6BCDE Modification Time     EC210000 (3961585664) 'Wed Jan  1 00:00:00 2098'\n-6BCE2 CRC                   8AC6D7E1 (2328287201)\n-6BCE6 Compressed Size       000007D3 (2003)\n-6BCEA Uncompressed Size     000007D3 (2003)\n-6BCEE Filename Length       002E (46)\n-6BCF0 Extra Length          0009 (9)\n-6BCF2 Comment Length        0000 (0)\n-6BCF4 Disk Start            0000 (0)\n-6BCF6 Int File Attributes   0000 (0)\n-      [Bit 0]               0 'Binary Data'\n-6BCF8 Ext File Attributes   00000000 (0)\n-6BCFC Local Header Offset   00009146 (37190)\n-6BD00 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n-#\n-# WARNING: Offset 0x6BD00: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n-#          Zero length filename\n-#\n-6BD2E Extra ID #1           5455 (21589) 'Extended Timestamp [UT]'\n-6BD30   Length              0005 (5)\n-6BD32   Flags               01 (1) 'Modification'\n-6BD33   Modification Time   00000000 (0) 'Thu Jan  1 00:00:00 1970'\n-\n-6BD37 CENTRAL HEADER #38    02014B50 (33639248)\n-6BD3B Created Zip Spec      14 (20) '2.0'\n-6BD3C Created OS            00 (0) 'MS-DOS'\n-6BD3D Extract Zip Spec      14 (20) '2.0'\n-6BD3E Extract OS            00 (0) 'MS-DOS'\n-6BD3F General Purpose Flag  0008 (8)\n-      [Bit  3]              1 'Streamed'\n-6BD41 Compression Method    0000 (0) 'Stored'\n-6BD43 Modification Time     EC210000 (3961585664) 'Wed Jan  1 00:00:00 2098'\n-6BD47 CRC                   BDE39003 (3185807363)\n-6BD4B Compressed Size       000005F9 (1529)\n-6BD4F Uncompressed Size     000005F9 (1529)\n-6BD53 Filename Length       0035 (53)\n-6BD55 Extra Length          0009 (9)\n-6BD57 Comment Length        0000 (0)\n-6BD59 Disk Start            0000 (0)\n-6BD5B Int File Attributes   0000 (0)\n-      [Bit 0]               0 'Binary Data'\n-6BD5D Ext File Attributes   00000000 (0)\n-6BD61 Local Header Offset   0000997E (39294)\n-6BD65 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n-#\n-# WARNING: Offset 0x6BD65: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n-#          Zero length filename\n-#\n-6BD9A Extra ID #1           5455 (21589) 'Extended Timestamp [UT]'\n-6BD9C   Length              0005 (5)\n-6BD9E   Flags               01 (1) 'Modification'\n-6BD9F   Modification Time   00000000 (0) 'Thu Jan  1 00:00:00 1970'\n-\n-6BDA3 CENTRAL HEADER #39    02014B50 (33639248)\n-6BDA7 Created Zip Spec      14 (20) '2.0'\n-6BDA8 Created OS            00 (0) 'MS-DOS'\n-6BDA9 Extract Zip Spec      14 (20) '2.0'\n-6BDAA Extract OS            00 (0) 'MS-DOS'\n-6BDAB General Purpose Flag  0008 (8)\n-      [Bit  3]              1 'Streamed'\n-6BDAD Compression Method    0000 (0) 'Stored'\n-6BDAF Modification Time     EC210000 (3961585664) 'Wed Jan  1 00:00:00 2098'\n-6BDB3 CRC                   6C2E2D81 (1814965633)\n-6BDB7 Compressed Size       00001602 (5634)\n-6BDBB Uncompressed Size     00001602 (5634)\n-6BDBF Filename Length       002E (46)\n-6BDC1 Extra Length          0009 (9)\n-6BDC3 Comment Length        0000 (0)\n-6BDC5 Disk Start            0000 (0)\n-6BDC7 Int File Attributes   0000 (0)\n-      [Bit 0]               0 'Binary Data'\n-6BDC9 Ext File Attributes   00000000 (0)\n-6BDCD Local Header Offset   00009FE3 (40931)\n-6BDD1 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n-#\n-# WARNING: Offset 0x6BDD1: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n-#          Zero length filename\n-#\n-6BDFF Extra ID #1           5455 (21589) 'Extended Timestamp [UT]'\n-6BE01   Length              0005 (5)\n-6BE03   Flags               01 (1) 'Modification'\n-6BE04   Modification Time   00000000 (0) 'Thu Jan  1 00:00:00 1970'\n-\n-6BE08 CENTRAL HEADER #40    02014B50 (33639248)\n-6BE0C Created Zip Spec      14 (20) '2.0'\n-6BE0D Created OS            00 (0) 'MS-DOS'\n-6BE0E Extract Zip Spec      14 (20) '2.0'\n-6BE0F Extract OS            00 (0) 'MS-DOS'\n-6BE10 General Purpose Flag  0008 (8)\n-      [Bit  3]              1 'Streamed'\n-6BE12 Compression Method    0000 (0) 'Stored'\n-6BE14 Modification Time     EC210000 (3961585664) 'Wed Jan  1 00:00:00 2098'\n-6BE18 CRC                   350310AE (889393326)\n-6BE1C Compressed Size       0000048E (1166)\n-6BE20 Uncompressed Size     0000048E (1166)\n-6BE24 Filename Length       0036 (54)\n-6BE26 Extra Length          0009 (9)\n-6BE28 Comment Length        0000 (0)\n-6BE2A Disk Start            0000 (0)\n-6BE2C Int File Attributes   0000 (0)\n-      [Bit 0]               0 'Binary Data'\n-6BE2E Ext File Attributes   00000000 (0)\n-6BE32 Local Header Offset   0000B64A (46666)\n-6BE36 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n-#\n-# WARNING: Offset 0x6BE36: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n-#          Zero length filename\n-#\n-6BE6C Extra ID #1           5455 (21589) 'Extended Timestamp [UT]'\n-6BE6E   Length              0005 (5)\n-6BE70   Flags               01 (1) 'Modification'\n-6BE71   Modification Time   00000000 (0) 'Thu Jan  1 00:00:00 1970'\n-\n-6BE75 CENTRAL HEADER #41    02014B50 (33639248)\n-6BE79 Created Zip Spec      14 (20) '2.0'\n-6BE7A Created OS            00 (0) 'MS-DOS'\n-6BE7B Extract Zip Spec      14 (20) '2.0'\n-6BE7C Extract OS            00 (0) 'MS-DOS'\n-6BE7D General Purpose Flag  0000 (0)\n-6BE7F Compression Method    0000 (0) 'Stored'\n-6BE81 Modification Time     EC210000 (3961585664) 'Wed Jan  1 00:00:00 2098'\n-6BE85 CRC                   00000000 (0)\n-6BE89 Compressed Size       00000000 (0)\n-6BE8D Uncompressed Size     00000000 (0)\n-6BE91 Filename Length       0021 (33)\n-6BE93 Extra Length          0009 (9)\n-6BE95 Comment Length        0000 (0)\n-6BE97 Disk Start            0000 (0)\n-6BE99 Int File Attributes   0000 (0)\n-      [Bit 0]               0 'Binary Data'\n-6BE9B Ext File Attributes   00000000 (0)\n-6BE9F Local Header Offset   0000BB45 (47941)\n-6BEA3 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n-#\n-# WARNING: Offset 0x6BEA3: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n-#          Zero length filename\n-#\n-6BEC4 Extra ID #1           5455 (21589) 'Extended Timestamp [UT]'\n-6BEC6   Length              0005 (5)\n-6BEC8   Flags               01 (1) 'Modification'\n-6BEC9   Modification Time   00000000 (0) 'Thu Jan  1 00:00:00 1970'\n-\n-6BECD CENTRAL HEADER #42    02014B50 (33639248)\n-6BED1 Created Zip Spec      14 (20) '2.0'\n-6BED2 Created OS            00 (0) 'MS-DOS'\n-6BED3 Extract Zip Spec      14 (20) '2.0'\n-6BED4 Extract OS            00 (0) 'MS-DOS'\n-6BED5 General Purpose Flag  0008 (8)\n-      [Bit  3]              1 'Streamed'\n-6BED7 Compression Method    0000 (0) 'Stored'\n-6BED9 Modification Time     EC210000 (3961585664) 'Wed Jan  1 00:00:00 2098'\n-6BEDD CRC                   D05840B7 (3495444663)\n-6BEE1 Compressed Size       00000833 (2099)\n-6BEE5 Uncompressed Size     00000833 (2099)\n-6BEE9 Filename Length       003E (62)\n-6BEEB Extra Length          0009 (9)\n-6BEED Comment Length        0000 (0)\n-6BEEF Disk Start            0000 (0)\n-6BEF1 Int File Attributes   0000 (0)\n-      [Bit 0]               0 'Binary Data'\n-6BEF3 Ext File Attributes   00000000 (0)\n-6BEF7 Local Header Offset   0000BB8D (48013)\n-6BEFB Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n-#\n-# WARNING: Offset 0x6BEFB: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n-#          Zero length filename\n-#\n-6BF39 Extra ID #1           5455 (21589) 'Extended Timestamp [UT]'\n-6BF3B   Length              0005 (5)\n-6BF3D   Flags               01 (1) 'Modification'\n-6BF3E   Modification Time   00000000 (0) 'Thu Jan  1 00:00:00 1970'\n-\n-6BF42 CENTRAL HEADER #43    02014B50 (33639248)\n-6BF46 Created Zip Spec      14 (20) '2.0'\n-6BF47 Created OS            00 (0) 'MS-DOS'\n-6BF48 Extract Zip Spec      14 (20) '2.0'\n-6BF49 Extract OS            00 (0) 'MS-DOS'\n-6BF4A General Purpose Flag  0008 (8)\n-      [Bit  3]              1 'Streamed'\n-6BF4C Compression Method    0000 (0) 'Stored'\n-6BF4E Modification Time     EC210000 (3961585664) 'Wed Jan  1 00:00:00 2098'\n-6BF52 CRC                   D9AD2407 (3652002823)\n-6BF56 Compressed Size       000006C3 (1731)\n-6BF5A Uncompressed Size     000006C3 (1731)\n-6BF5E Filename Length       0045 (69)\n-6BF60 Extra Length          0009 (9)\n-6BF62 Comment Length        0000 (0)\n-6BF64 Disk Start            0000 (0)\n-6BF66 Int File Attributes   0000 (0)\n-      [Bit 0]               0 'Binary Data'\n-6BF68 Ext File Attributes   00000000 (0)\n-6BF6C Local Header Offset   0000C435 (50229)\n-6BF70 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n-#\n-# WARNING: Offset 0x6BF70: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n-#          Zero length filename\n-#\n-6BFB5 Extra ID #1           5455 (21589) 'Extended Timestamp [UT]'\n-6BFB7   Length              0005 (5)\n-6BFB9   Flags               01 (1) 'Modification'\n-6BFBA   Modification Time   00000000 (0) 'Thu Jan  1 00:00:00 1970'\n-\n-6BFBE CENTRAL HEADER #44    02014B50 (33639248)\n-6BFC2 Created Zip Spec      14 (20) '2.0'\n-6BFC3 Created OS            00 (0) 'MS-DOS'\n-6BFC4 Extract Zip Spec      14 (20) '2.0'\n-6BFC5 Extract OS            00 (0) 'MS-DOS'\n-6BFC6 General Purpose Flag  0008 (8)\n-      [Bit  3]              1 'Streamed'\n-6BFC8 Compression Method    0000 (0) 'Stored'\n-6BFCA Modification Time     EC210000 (3961585664) 'Wed Jan  1 00:00:00 2098'\n-6BFCE CRC                   6AAAC02C (1789575212)\n-6BFD2 Compressed Size       00000565 (1381)\n-6BFD6 Uncompressed Size     00000565 (1381)\n-6BFDA Filename Length       0046 (70)\n-6BFDC Extra Length          0009 (9)\n-6BFDE Comment Length        0000 (0)\n-6BFE0 Disk Start            0000 (0)\n-6BFE2 Int File Attributes   0000 (0)\n-      [Bit 0]               0 'Binary Data'\n-6BFE4 Ext File Attributes   00000000 (0)\n-6BFE8 Local Header Offset   0000CB74 (52084)\n-6BFEC Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n-#\n-# WARNING: Offset 0x6BFEC: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n-#          Zero length filename\n-#\n-6C032 Extra ID #1           5455 (21589) 'Extended Timestamp [UT]'\n-6C034   Length              0005 (5)\n-6C036   Flags               01 (1) 'Modification'\n-6C037   Modification Time   00000000 (0) 'Thu Jan  1 00:00:00 1970'\n-\n-6C03B CENTRAL HEADER #45    02014B50 (33639248)\n-6C03F Created Zip Spec      14 (20) '2.0'\n-6C040 Created OS            00 (0) 'MS-DOS'\n-6C041 Extract Zip Spec      14 (20) '2.0'\n-6C042 Extract OS            00 (0) 'MS-DOS'\n-6C043 General Purpose Flag  0008 (8)\n-      [Bit  3]              1 'Streamed'\n-6C045 Compression Method    0000 (0) 'Stored'\n-6C047 Modification Time     EC210000 (3961585664) 'Wed Jan  1 00:00:00 2098'\n-6C04B CRC                   5F8855A5 (1602770341)\n-6C04F Compressed Size       00000870 (2160)\n-6C053 Uncompressed Size     00000870 (2160)\n-6C057 Filename Length       0044 (68)\n-6C059 Extra Length          0009 (9)\n-6C05B Comment Length        0000 (0)\n-6C05D Disk Start            0000 (0)\n-6C05F Int File Attributes   0000 (0)\n-      [Bit 0]               0 'Binary Data'\n-6C061 Ext File Attributes   00000000 (0)\n-6C065 Local Header Offset   0000D156 (53590)\n-6C069 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n-#\n-# WARNING: Offset 0x6C069: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n-#          Zero length filename\n-#\n-6C0AD Extra ID #1           5455 (21589) 'Extended Timestamp [UT]'\n-6C0AF   Length              0005 (5)\n-6C0B1   Flags               01 (1) 'Modification'\n-6C0B2   Modification Time   00000000 (0) 'Thu Jan  1 00:00:00 1970'\n-\n-6C0B6 CENTRAL HEADER #46    02014B50 (33639248)\n-6C0BA Created Zip Spec      14 (20) '2.0'\n-6C0BB Created OS            00 (0) 'MS-DOS'\n-6C0BC Extract Zip Spec      14 (20) '2.0'\n-6C0BD Extract OS            00 (0) 'MS-DOS'\n-6C0BE General Purpose Flag  0008 (8)\n-      [Bit  3]              1 'Streamed'\n-6C0C0 Compression Method    0000 (0) 'Stored'\n-6C0C2 Modification Time     EC210000 (3961585664) 'Wed Jan  1 00:00:00 2098'\n-6C0C6 CRC                   C2AD0276 (3266118262)\n-6C0CA Compressed Size       000017B0 (6064)\n-6C0CE Uncompressed Size     000017B0 (6064)\n-6C0D2 Filename Length       003C (60)\n-6C0D4 Extra Length          0009 (9)\n-6C0D6 Comment Length        0000 (0)\n-6C0D8 Disk Start            0000 (0)\n-6C0DA Int File Attributes   0000 (0)\n-      [Bit 0]               0 'Binary Data'\n-6C0DC Ext File Attributes   00000000 (0)\n-6C0E0 Local Header Offset   0000DA41 (55873)\n-6C0E4 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n-#\n-# WARNING: Offset 0x6C0E4: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n-#          Zero length filename\n-#\n-6C120 Extra ID #1           5455 (21589) 'Extended Timestamp [UT]'\n-6C122   Length              0005 (5)\n-6C124   Flags               01 (1) 'Modification'\n-6C125   Modification Time   00000000 (0) 'Thu Jan  1 00:00:00 1970'\n-\n-6C129 CENTRAL HEADER #47    02014B50 (33639248)\n-6C12D Created Zip Spec      14 (20) '2.0'\n-6C12E Created OS            00 (0) 'MS-DOS'\n-6C12F Extract Zip Spec      14 (20) '2.0'\n-6C130 Extract OS            00 (0) 'MS-DOS'\n-6C131 General Purpose Flag  0008 (8)\n-      [Bit  3]              1 'Streamed'\n-6C133 Compression Method    0000 (0) 'Stored'\n-6C135 Modification Time     EC210000 (3961585664) 'Wed Jan  1 00:00:00 2098'\n-6C139 CRC                   77B5952D (2008388909)\n-6C13D Compressed Size       00002A27 (10791)\n-6C141 Uncompressed Size     00002A27 (10791)\n-6C145 Filename Length       0045 (69)\n-6C147 Extra Length          0009 (9)\n-6C149 Comment Length        0000 (0)\n-6C14B Disk Start            0000 (0)\n-6C14D Int File Attributes   0000 (0)\n-      [Bit 0]               0 'Binary Data'\n-6C14F Ext File Attributes   00000000 (0)\n-6C153 Local Header Offset   0000F264 (62052)\n-6C157 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n-#\n-# WARNING: Offset 0x6C157: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n-#          Zero length filename\n-#\n-6C19C Extra ID #1           5455 (21589) 'Extended Timestamp [UT]'\n-6C19E   Length              0005 (5)\n-6C1A0   Flags               01 (1) 'Modification'\n-6C1A1   Modification Time   00000000 (0) 'Thu Jan  1 00:00:00 1970'\n-\n-6C1A5 CENTRAL HEADER #48    02014B50 (33639248)\n-6C1A9 Created Zip Spec      14 (20) '2.0'\n-6C1AA Created OS            00 (0) 'MS-DOS'\n-6C1AB Extract Zip Spec      14 (20) '2.0'\n-6C1AC Extract OS            00 (0) 'MS-DOS'\n-6C1AD General Purpose Flag  0008 (8)\n-      [Bit  3]              1 'Streamed'\n-6C1AF Compression Method    0000 (0) 'Stored'\n-6C1B1 Modification Time     EC210000 (3961585664) 'Wed Jan  1 00:00:00 2098'\n-6C1B5 CRC                   013987D8 (20547544)\n-6C1B9 Compressed Size       00001FF0 (8176)\n-6C1BD Uncompressed Size     00001FF0 (8176)\n-6C1C1 Filename Length       0040 (64)\n-6C1C3 Extra Length          0009 (9)\n-6C1C5 Comment Length        0000 (0)\n-6C1C7 Disk Start            0000 (0)\n-6C1C9 Int File Attributes   0000 (0)\n-      [Bit 0]               0 'Binary Data'\n-6C1CB Ext File Attributes   00000000 (0)\n-6C1CF Local Header Offset   00011D07 (72967)\n-6C1D3 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n-#\n-# WARNING: Offset 0x6C1D3: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n-#          Zero length filename\n-#\n-6C213 Extra ID #1           5455 (21589) 'Extended Timestamp [UT]'\n-6C215   Length              0005 (5)\n-6C217   Flags               01 (1) 'Modification'\n-6C218   Modification Time   00000000 (0) 'Thu Jan  1 00:00:00 1970'\n-\n-6C21C CENTRAL HEADER #49    02014B50 (33639248)\n-6C220 Created Zip Spec      14 (20) '2.0'\n-6C221 Created OS            00 (0) 'MS-DOS'\n-6C222 Extract Zip Spec      14 (20) '2.0'\n-6C223 Extract OS            00 (0) 'MS-DOS'\n-6C224 General Purpose Flag  0008 (8)\n-      [Bit  3]              1 'Streamed'\n-6C226 Compression Method    0000 (0) 'Stored'\n-6C228 Modification Time     EC210000 (3961585664) 'Wed Jan  1 00:00:00 2098'\n-6C22C CRC                   E564338A (3848549258)\n-6C230 Compressed Size       00002F23 (12067)\n-6C234 Uncompressed Size     00002F23 (12067)\n-6C238 Filename Length       0038 (56)\n-6C23A Extra Length          0009 (9)\n-6C23C Comment Length        0000 (0)\n-6C23E Disk Start            0000 (0)\n-6C240 Int File Attributes   0000 (0)\n-      [Bit 0]               0 'Binary Data'\n-6C242 Ext File Attributes   00000000 (0)\n-6C246 Local Header Offset   00013D6E (81262)\n-6C24A Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n-#\n-# WARNING: Offset 0x6C24A: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n-#          Zero length filename\n-#\n-6C282 Extra ID #1           5455 (21589) 'Extended Timestamp [UT]'\n-6C284   Length              0005 (5)\n-6C286   Flags               01 (1) 'Modification'\n-6C287   Modification Time   00000000 (0) 'Thu Jan  1 00:00:00 1970'\n-\n-6C28B CENTRAL HEADER #50    02014B50 (33639248)\n-6C28F Created Zip Spec      14 (20) '2.0'\n-6C290 Created OS            00 (0) 'MS-DOS'\n-6C291 Extract Zip Spec      14 (20) '2.0'\n-6C292 Extract OS            00 (0) 'MS-DOS'\n-6C293 General Purpose Flag  0008 (8)\n-      [Bit  3]              1 'Streamed'\n-6C295 Compression Method    0000 (0) 'Stored'\n-6C297 Modification Time     EC210000 (3961585664) 'Wed Jan  1 00:00:00 2098'\n-6C29B CRC                   4D393448 (1295594568)\n-6C29F Compressed Size       000005E0 (1504)\n-6C2A3 Uncompressed Size     000005E0 (1504)\n-6C2A7 Filename Length       003F (63)\n-6C2A9 Extra Length          0009 (9)\n-6C2AB Comment Length        0000 (0)\n-6C2AD Disk Start            0000 (0)\n-6C2AF Int File Attributes   0000 (0)\n-      [Bit 0]               0 'Binary Data'\n-6C2B1 Ext File Attributes   00000000 (0)\n-6C2B5 Local Header Offset   00016D00 (93440)\n-6C2B9 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n-#\n-# WARNING: Offset 0x6C2B9: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n-#          Zero length filename\n-#\n-6C2F8 Extra ID #1           5455 (21589) 'Extended Timestamp [UT]'\n-6C2FA   Length              0005 (5)\n-6C2FC   Flags               01 (1) 'Modification'\n-6C2FD   Modification Time   00000000 (0) 'Thu Jan  1 00:00:00 1970'\n-\n-6C301 CENTRAL HEADER #51    02014B50 (33639248)\n-6C305 Created Zip Spec      14 (20) '2.0'\n-6C306 Created OS            00 (0) 'MS-DOS'\n-6C307 Extract Zip Spec      14 (20) '2.0'\n-6C308 Extract OS            00 (0) 'MS-DOS'\n-6C309 General Purpose Flag  0008 (8)\n-      [Bit  3]              1 'Streamed'\n-6C30B Compression Method    0000 (0) 'Stored'\n-6C30D Modification Time     EC210000 (3961585664) 'Wed Jan  1 00:00:00 2098'\n-6C311 CRC                   6E2B9BED (1848351725)\n-6C315 Compressed Size       00002EA9 (11945)\n-6C319 Uncompressed Size     00002EA9 (11945)\n-6C31D Filename Length       0036 (54)\n-6C31F Extra Length          0009 (9)\n-6C321 Comment Length        0000 (0)\n-6C323 Disk Start            0000 (0)\n-6C325 Int File Attributes   0000 (0)\n-      [Bit 0]               0 'Binary Data'\n-6C327 Ext File Attributes   00000000 (0)\n-6C32B Local Header Offset   00017356 (95062)\n-6C32F Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n-#\n-# WARNING: Offset 0x6C32F: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n-#          Zero length filename\n-#\n-6C365 Extra ID #1           5455 (21589) 'Extended Timestamp [UT]'\n-6C367   Length              0005 (5)\n-6C369   Flags               01 (1) 'Modification'\n-6C36A   Modification Time   00000000 (0) 'Thu Jan  1 00:00:00 1970'\n-\n-6C36E CENTRAL HEADER #52    02014B50 (33639248)\n-6C372 Created Zip Spec      14 (20) '2.0'\n-6C373 Created OS            00 (0) 'MS-DOS'\n-6C374 Extract Zip Spec      14 (20) '2.0'\n-6C375 Extract OS            00 (0) 'MS-DOS'\n-6C376 General Purpose Flag  0008 (8)\n-      [Bit  3]              1 'Streamed'\n-6C378 Compression Method    0000 (0) 'Stored'\n-6C37A Modification Time     EC210000 (3961585664) 'Wed Jan  1 00:00:00 2098'\n-6C37E CRC                   9F02351C (2667722012)\n-6C382 Compressed Size       000007B6 (1974)\n-6C386 Uncompressed Size     000007B6 (1974)\n-6C38A Filename Length       003D (61)\n-6C38C Extra Length          0009 (9)\n-6C38E Comment Length        0000 (0)\n-6C390 Disk Start            0000 (0)\n-6C392 Int File Attributes   0000 (0)\n-      [Bit 0]               0 'Binary Data'\n-6C394 Ext File Attributes   00000000 (0)\n-6C398 Local Header Offset   0001A26C (107116)\n-6C39C Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n-#\n-# WARNING: Offset 0x6C39C: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n-#          Zero length filename\n-#\n-6C3D9 Extra ID #1           5455 (21589) 'Extended Timestamp [UT]'\n-6C3DB   Length              0005 (5)\n-6C3DD   Flags               01 (1) 'Modification'\n-6C3DE   Modification Time   00000000 (0) 'Thu Jan  1 00:00:00 1970'\n-\n-6C3E2 CENTRAL HEADER #53    02014B50 (33639248)\n-6C3E6 Created Zip Spec      14 (20) '2.0'\n-6C3E7 Created OS            00 (0) 'MS-DOS'\n-6C3E8 Extract Zip Spec      14 (20) '2.0'\n-6C3E9 Extract OS            00 (0) 'MS-DOS'\n-6C3EA General Purpose Flag  0008 (8)\n-      [Bit  3]              1 'Streamed'\n-6C3EC Compression Method    0000 (0) 'Stored'\n-6C3EE Modification Time     EC210000 (3961585664) 'Wed Jan  1 00:00:00 2098'\n-6C3F2 CRC                   88D1E805 (2295457797)\n-6C3F6 Compressed Size       0000521E (21022)\n-6C3FA Uncompressed Size     0000521E (21022)\n-6C3FE Filename Length       003E (62)\n-6C400 Extra Length          0009 (9)\n-6C402 Comment Length        0000 (0)\n-6C404 Disk Start            0000 (0)\n-6C406 Int File Attributes   0000 (0)\n-      [Bit 0]               0 'Binary Data'\n-6C408 Ext File Attributes   00000000 (0)\n-6C40C Local Header Offset   0001AA96 (109206)\n-6C410 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n-#\n-# WARNING: Offset 0x6C410: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n-#          Zero length filename\n-#\n-6C44E Extra ID #1           5455 (21589) 'Extended Timestamp [UT]'\n-6C450   Length              0005 (5)\n-6C452   Flags               01 (1) 'Modification'\n-6C453   Modification Time   00000000 (0) 'Thu Jan  1 00:00:00 1970'\n-\n-6C457 CENTRAL HEADER #54    02014B50 (33639248)\n-6C45B Created Zip Spec      14 (20) '2.0'\n-6C45C Created OS            00 (0) 'MS-DOS'\n-6C45D Extract Zip Spec      14 (20) '2.0'\n-6C45E Extract OS            00 (0) 'MS-DOS'\n-6C45F General Purpose Flag  0008 (8)\n-      [Bit  3]              1 'Streamed'\n-6C461 Compression Method    0000 (0) 'Stored'\n-6C463 Modification Time     EC210000 (3961585664) 'Wed Jan  1 00:00:00 2098'\n-6C467 CRC                   1C63503A (476270650)\n-6C46B Compressed Size       00002CDC (11484)\n-6C46F Uncompressed Size     00002CDC (11484)\n-6C473 Filename Length       0047 (71)\n-6C475 Extra Length          0009 (9)\n-6C477 Comment Length        0000 (0)\n-6C479 Disk Start            0000 (0)\n-6C47B Int File Attributes   0000 (0)\n-      [Bit 0]               0 'Binary Data'\n-6C47D Ext File Attributes   00000000 (0)\n-6C481 Local Header Offset   0001FD29 (130345)\n-6C485 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n-#\n-# WARNING: Offset 0x6C485: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n-#          Zero length filename\n-#\n-6C4CC Extra ID #1           5455 (21589) 'Extended Timestamp [UT]'\n-6C4CE   Length              0005 (5)\n-6C4D0   Flags               01 (1) 'Modification'\n-6C4D1   Modification Time   00000000 (0) 'Thu Jan  1 00:00:00 1970'\n-\n-6C4D5 CENTRAL HEADER #55    02014B50 (33639248)\n-6C4D9 Created Zip Spec      14 (20) '2.0'\n-6C4DA Created OS            00 (0) 'MS-DOS'\n-6C4DB Extract Zip Spec      14 (20) '2.0'\n-6C4DC Extract OS            00 (0) 'MS-DOS'\n-6C4DD General Purpose Flag  0008 (8)\n-      [Bit  3]              1 'Streamed'\n-6C4DF Compression Method    0000 (0) 'Stored'\n-6C4E1 Modification Time     EC210000 (3961585664) 'Wed Jan  1 00:00:00 2098'\n-6C4E5 CRC                   A7D42D9C (2815700380)\n-6C4E9 Compressed Size       0000068D (1677)\n-6C4ED Uncompressed Size     0000068D (1677)\n-6C4F1 Filename Length       0045 (69)\n-6C4F3 Extra Length          0009 (9)\n-6C4F5 Comment Length        0000 (0)\n-6C4F7 Disk Start            0000 (0)\n-6C4F9 Int File Attributes   0000 (0)\n-      [Bit 0]               0 'Binary Data'\n-6C4FB Ext File Attributes   00000000 (0)\n-6C4FF Local Header Offset   00022A83 (141955)\n-6C503 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n-#\n-# WARNING: Offset 0x6C503: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n-#          Zero length filename\n-#\n-6C548 Extra ID #1           5455 (21589) 'Extended Timestamp [UT]'\n-6C54A   Length              0005 (5)\n-6C54C   Flags               01 (1) 'Modification'\n-6C54D   Modification Time   00000000 (0) 'Thu Jan  1 00:00:00 1970'\n-\n-6C551 CENTRAL HEADER #56    02014B50 (33639248)\n-6C555 Created Zip Spec      14 (20) '2.0'\n-6C556 Created OS            00 (0) 'MS-DOS'\n-6C557 Extract Zip Spec      14 (20) '2.0'\n-6C558 Extract OS            00 (0) 'MS-DOS'\n-6C559 General Purpose Flag  0008 (8)\n-      [Bit  3]              1 'Streamed'\n-6C55B Compression Method    0000 (0) 'Stored'\n-6C55D Modification Time     EC210000 (3961585664) 'Wed Jan  1 00:00:00 2098'\n-6C561 CRC                   F623C4B3 (4129539251)\n-6C565 Compressed Size       00000DAA (3498)\n-6C569 Uncompressed Size     00000DAA (3498)\n-6C56D Filename Length       0035 (53)\n-6C56F Extra Length          0009 (9)\n-6C571 Comment Length        0000 (0)\n-6C573 Disk Start            0000 (0)\n-6C575 Int File Attributes   0000 (0)\n-      [Bit 0]               0 'Binary Data'\n-6C577 Ext File Attributes   00000000 (0)\n-6C57B Local Header Offset   0002318C (143756)\n-6C57F Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n-#\n-# WARNING: Offset 0x6C57F: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n-#          Zero length filename\n-#\n-6C5B4 Extra ID #1           5455 (21589) 'Extended Timestamp [UT]'\n-6C5B6   Length              0005 (5)\n-6C5B8   Flags               01 (1) 'Modification'\n-6C5B9   Modification Time   00000000 (0) 'Thu Jan  1 00:00:00 1970'\n-\n-6C5BD CENTRAL HEADER #57    02014B50 (33639248)\n-6C5C1 Created Zip Spec      14 (20) '2.0'\n-6C5C2 Created OS            00 (0) 'MS-DOS'\n-6C5C3 Extract Zip Spec      14 (20) '2.0'\n-6C5C4 Extract OS            00 (0) 'MS-DOS'\n-6C5C5 General Purpose Flag  0008 (8)\n-      [Bit  3]              1 'Streamed'\n-6C5C7 Compression Method    0000 (0) 'Stored'\n-6C5C9 Modification Time     EC210000 (3961585664) 'Wed Jan  1 00:00:00 2098'\n-6C5CD CRC                   5B09319E (1527329182)\n-6C5D1 Compressed Size       000005D6 (1494)\n-6C5D5 Uncompressed Size     000005D6 (1494)\n-6C5D9 Filename Length       003F (63)\n-6C5DB Extra Length          0009 (9)\n-6C5DD Comment Length        0000 (0)\n-6C5DF Disk Start            0000 (0)\n-6C5E1 Int File Attributes   0000 (0)\n-      [Bit 0]               0 'Binary Data'\n-6C5E3 Ext File Attributes   00000000 (0)\n-6C5E7 Local Header Offset   00023FA2 (147362)\n-6C5EB Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n-#\n-# WARNING: Offset 0x6C5EB: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n-#          Zero length filename\n-#\n-6C62A Extra ID #1           5455 (21589) 'Extended Timestamp [UT]'\n-6C62C   Length              0005 (5)\n-6C62E   Flags               01 (1) 'Modification'\n-6C62F   Modification Time   00000000 (0) 'Thu Jan  1 00:00:00 1970'\n-\n-6C633 CENTRAL HEADER #58    02014B50 (33639248)\n-6C637 Created Zip Spec      14 (20) '2.0'\n-6C638 Created OS            00 (0) 'MS-DOS'\n-6C639 Extract Zip Spec      14 (20) '2.0'\n-6C63A Extract OS            00 (0) 'MS-DOS'\n-6C63B General Purpose Flag  0000 (0)\n-6C63D Compression Method    0000 (0) 'Stored'\n-6C63F Modification Time     EC210000 (3961585664) 'Wed Jan  1 00:00:00 2098'\n-6C643 CRC                   00000000 (0)\n-6C647 Compressed Size       00000000 (0)\n-6C64B Uncompressed Size     00000000 (0)\n-6C64F Filename Length       0027 (39)\n-6C651 Extra Length          0009 (9)\n-6C653 Comment Length        0000 (0)\n-6C655 Disk Start            0000 (0)\n-6C657 Int File Attributes   0000 (0)\n-      [Bit 0]               0 'Binary Data'\n-6C659 Ext File Attributes   00000000 (0)\n-6C65D Local Header Offset   000245EE (148974)\n-6C661 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n-#\n-# WARNING: Offset 0x6C661: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n-#          Zero length filename\n-#\n-6C688 Extra ID #1           5455 (21589) 'Extended Timestamp [UT]'\n-6C68A   Length              0005 (5)\n-6C68C   Flags               01 (1) 'Modification'\n-6C68D   Modification Time   00000000 (0) 'Thu Jan  1 00:00:00 1970'\n-\n-6C691 CENTRAL HEADER #59    02014B50 (33639248)\n-6C695 Created Zip Spec      14 (20) '2.0'\n-6C696 Created OS            00 (0) 'MS-DOS'\n-6C697 Extract Zip Spec      14 (20) '2.0'\n-6C698 Extract OS            00 (0) 'MS-DOS'\n-6C699 General Purpose Flag  0008 (8)\n-      [Bit  3]              1 'Streamed'\n-6C69B Compression Method    0000 (0) 'Stored'\n-6C69D Modification Time     EC210000 (3961585664) 'Wed Jan  1 00:00:00 2098'\n-6C6A1 CRC                   504AAFAB (1347071915)\n-6C6A5 Compressed Size       000004F6 (1270)\n-6C6A9 Uncompressed Size     000004F6 (1270)\n-6C6AD Filename Length       004A (74)\n-6C6AF Extra Length          0009 (9)\n-6C6B1 Comment Length        0000 (0)\n-6C6B3 Disk Start            0000 (0)\n-6C6B5 Int File Attributes   0000 (0)\n-      [Bit 0]               0 'Binary Data'\n-6C6B7 Ext File Attributes   00000000 (0)\n-6C6BB Local Header Offset   0002463C (149052)\n-6C6BF Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n-#\n-# WARNING: Offset 0x6C6BF: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n-#          Zero length filename\n-#\n-6C709 Extra ID #1           5455 (21589) 'Extended Timestamp [UT]'\n-6C70B   Length              0005 (5)\n-6C70D   Flags               01 (1) 'Modification'\n-6C70E   Modification Time   00000000 (0) 'Thu Jan  1 00:00:00 1970'\n-\n-6C712 CENTRAL HEADER #60    02014B50 (33639248)\n-6C716 Created Zip Spec      14 (20) '2.0'\n-6C717 Created OS            00 (0) 'MS-DOS'\n-6C718 Extract Zip Spec      14 (20) '2.0'\n-6C719 Extract OS            00 (0) 'MS-DOS'\n-6C71A General Purpose Flag  0008 (8)\n-      [Bit  3]              1 'Streamed'\n-6C71C Compression Method    0000 (0) 'Stored'\n-6C71E Modification Time     EC210000 (3961585664) 'Wed Jan  1 00:00:00 2098'\n-6C722 CRC                   24C1B311 (616674065)\n-6C726 Compressed Size       000004FB (1275)\n-6C72A Uncompressed Size     000004FB (1275)\n-6C72E Filename Length       004B (75)\n-6C730 Extra Length          0009 (9)\n-6C732 Comment Length        0000 (0)\n-6C734 Disk Start            0000 (0)\n-6C736 Int File Attributes   0000 (0)\n-      [Bit 0]               0 'Binary Data'\n-6C738 Ext File Attributes   00000000 (0)\n-6C73C Local Header Offset   00024BB3 (150451)\n-6C740 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n-#\n-# WARNING: Offset 0x6C740: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n-#          Zero length filename\n-#\n-6C78B Extra ID #1           5455 (21589) 'Extended Timestamp [UT]'\n-6C78D   Length              0005 (5)\n-6C78F   Flags               01 (1) 'Modification'\n-6C790   Modification Time   00000000 (0) 'Thu Jan  1 00:00:00 1970'\n-\n-6C794 CENTRAL HEADER #61    02014B50 (33639248)\n-6C798 Created Zip Spec      14 (20) '2.0'\n-6C799 Created OS            00 (0) 'MS-DOS'\n-6C79A Extract Zip Spec      14 (20) '2.0'\n-6C79B Extract OS            00 (0) 'MS-DOS'\n-6C79C General Purpose Flag  0008 (8)\n-      [Bit  3]              1 'Streamed'\n-6C79E Compression Method    0000 (0) 'Stored'\n-6C7A0 Modification Time     EC210000 (3961585664) 'Wed Jan  1 00:00:00 2098'\n-6C7A4 CRC                   F122AA0E (4045580814)\n-6C7A8 Compressed Size       0000086F (2159)\n-6C7AC Uncompressed Size     0000086F (2159)\n-6C7B0 Filename Length       0041 (65)\n-6C7B2 Extra Length          0009 (9)\n-6C7B4 Comment Length        0000 (0)\n-6C7B6 Disk Start            0000 (0)\n-6C7B8 Int File Attributes   0000 (0)\n-      [Bit 0]               0 'Binary Data'\n-6C7BA Ext File Attributes   00000000 (0)\n-6C7BE Local Header Offset   00025130 (151856)\n-6C7C2 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n-#\n-# WARNING: Offset 0x6C7C2: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n-#          Zero length filename\n-#\n-6C803 Extra ID #1           5455 (21589) 'Extended Timestamp [UT]'\n-6C805   Length              0005 (5)\n-6C807   Flags               01 (1) 'Modification'\n-6C808   Modification Time   00000000 (0) 'Thu Jan  1 00:00:00 1970'\n-\n-6C80C CENTRAL HEADER #62    02014B50 (33639248)\n-6C810 Created Zip Spec      14 (20) '2.0'\n-6C811 Created OS            00 (0) 'MS-DOS'\n-6C812 Extract Zip Spec      14 (20) '2.0'\n-6C813 Extract OS            00 (0) 'MS-DOS'\n-6C814 General Purpose Flag  0008 (8)\n-      [Bit  3]              1 'Streamed'\n-6C816 Compression Method    0000 (0) 'Stored'\n-6C818 Modification Time     EC210000 (3961585664) 'Wed Jan  1 00:00:00 2098'\n-6C81C CRC                   267DEE50 (645787216)\n-6C820 Compressed Size       0000067B (1659)\n-6C824 Uncompressed Size     0000067B (1659)\n-6C828 Filename Length       004A (74)\n-6C82A Extra Length          0009 (9)\n-6C82C Comment Length        0000 (0)\n-6C82E Disk Start            0000 (0)\n-6C830 Int File Attributes   0000 (0)\n-      [Bit 0]               0 'Binary Data'\n-6C832 Ext File Attributes   00000000 (0)\n-6C836 Local Header Offset   00025A17 (154135)\n-6C83A Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n-#\n-# WARNING: Offset 0x6C83A: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n-#          Zero length filename\n-#\n-6C884 Extra ID #1           5455 (21589) 'Extended Timestamp [UT]'\n-6C886   Length              0005 (5)\n-6C888   Flags               01 (1) 'Modification'\n-6C889   Modification Time   00000000 (0) 'Thu Jan  1 00:00:00 1970'\n-\n-6C88D CENTRAL HEADER #63    02014B50 (33639248)\n-6C891 Created Zip Spec      14 (20) '2.0'\n-6C892 Created OS            00 (0) 'MS-DOS'\n-6C893 Extract Zip Spec      14 (20) '2.0'\n-6C894 Extract OS            00 (0) 'MS-DOS'\n-6C895 General Purpose Flag  0008 (8)\n-      [Bit  3]              1 'Streamed'\n-6C897 Compression Method    0000 (0) 'Stored'\n-6C899 Modification Time     EC210000 (3961585664) 'Wed Jan  1 00:00:00 2098'\n-6C89D CRC                   398D4C03 (965561347)\n-6C8A1 Compressed Size       00000524 (1316)\n-6C8A5 Uncompressed Size     00000524 (1316)\n-6C8A9 Filename Length       004C (76)\n-6C8AB Extra Length          0009 (9)\n-6C8AD Comment Length        0000 (0)\n-6C8AF Disk Start            0000 (0)\n-6C8B1 Int File Attributes   0000 (0)\n-      [Bit 0]               0 'Binary Data'\n-6C8B3 Ext File Attributes   00000000 (0)\n-6C8B7 Local Header Offset   00026113 (155923)\n-6C8BB Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n-#\n-# WARNING: Offset 0x6C8BB: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n-#          Zero length filename\n-#\n-6C907 Extra ID #1           5455 (21589) 'Extended Timestamp [UT]'\n-6C909   Length              0005 (5)\n-6C90B   Flags               01 (1) 'Modification'\n-6C90C   Modification Time   00000000 (0) 'Thu Jan  1 00:00:00 1970'\n-\n-6C910 CENTRAL HEADER #64    02014B50 (33639248)\n-6C914 Created Zip Spec      14 (20) '2.0'\n-6C915 Created OS            00 (0) 'MS-DOS'\n-6C916 Extract Zip Spec      14 (20) '2.0'\n-6C917 Extract OS            00 (0) 'MS-DOS'\n-6C918 General Purpose Flag  0008 (8)\n-      [Bit  3]              1 'Streamed'\n-6C91A Compression Method    0000 (0) 'Stored'\n-6C91C Modification Time     EC210000 (3961585664) 'Wed Jan  1 00:00:00 2098'\n-6C920 CRC                   120048C8 (302008520)\n-6C924 Compressed Size       0000052A (1322)\n-6C928 Uncompressed Size     0000052A (1322)\n-6C92C Filename Length       004D (77)\n-6C92E Extra Length          0009 (9)\n-6C930 Comment Length        0000 (0)\n-6C932 Disk Start            0000 (0)\n-6C934 Int File Attributes   0000 (0)\n-      [Bit 0]               0 'Binary Data'\n-6C936 Ext File Attributes   00000000 (0)\n-6C93A Local Header Offset   000266BA (157370)\n-6C93E Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n-#\n-# WARNING: Offset 0x6C93E: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n-#          Zero length filename\n-#\n-6C98B Extra ID #1           5455 (21589) 'Extended Timestamp [UT]'\n-6C98D   Length              0005 (5)\n-6C98F   Flags               01 (1) 'Modification'\n-6C990   Modification Time   00000000 (0) 'Thu Jan  1 00:00:00 1970'\n-\n-6C994 CENTRAL HEADER #65    02014B50 (33639248)\n-6C998 Created Zip Spec      14 (20) '2.0'\n-6C999 Created OS            00 (0) 'MS-DOS'\n-6C99A Extract Zip Spec      14 (20) '2.0'\n-6C99B Extract OS            00 (0) 'MS-DOS'\n-6C99C General Purpose Flag  0008 (8)\n-      [Bit  3]              1 'Streamed'\n-6C99E Compression Method    0000 (0) 'Stored'\n-6C9A0 Modification Time     EC210000 (3961585664) 'Wed Jan  1 00:00:00 2098'\n-6C9A4 CRC                   7B9FC9D5 (2074069461)\n-6C9A8 Compressed Size       00000675 (1653)\n-6C9AC Uncompressed Size     00000675 (1653)\n-6C9B0 Filename Length       0040 (64)\n-6C9B2 Extra Length          0009 (9)\n-6C9B4 Comment Length        0000 (0)\n-6C9B6 Disk Start            0000 (0)\n-6C9B8 Int File Attributes   0000 (0)\n-      [Bit 0]               0 'Binary Data'\n-6C9BA Ext File Attributes   00000000 (0)\n-6C9BE Local Header Offset   00026C68 (158824)\n-6C9C2 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n-#\n-# WARNING: Offset 0x6C9C2: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n-#          Zero length filename\n-#\n-6CA02 Extra ID #1           5455 (21589) 'Extended Timestamp [UT]'\n-6CA04   Length              0005 (5)\n-6CA06   Flags               01 (1) 'Modification'\n-6CA07   Modification Time   00000000 (0) 'Thu Jan  1 00:00:00 1970'\n-\n-6CA0B CENTRAL HEADER #66    02014B50 (33639248)\n-6CA0F Created Zip Spec      14 (20) '2.0'\n-6CA10 Created OS            00 (0) 'MS-DOS'\n-6CA11 Extract Zip Spec      14 (20) '2.0'\n-6CA12 Extract OS            00 (0) 'MS-DOS'\n-6CA13 General Purpose Flag  0008 (8)\n-      [Bit  3]              1 'Streamed'\n-6CA15 Compression Method    0000 (0) 'Stored'\n-6CA17 Modification Time     EC210000 (3961585664) 'Wed Jan  1 00:00:00 2098'\n-6CA1B CRC                   A2914700 (2727429888)\n-6CA1F Compressed Size       00000547 (1351)\n-6CA23 Uncompressed Size     00000547 (1351)\n-6CA27 Filename Length       004D (77)\n-6CA29 Extra Length          0009 (9)\n-6CA2B Comment Length        0000 (0)\n-6CA2D Disk Start            0000 (0)\n-6CA2F Int File Attributes   0000 (0)\n-      [Bit 0]               0 'Binary Data'\n-6CA31 Ext File Attributes   00000000 (0)\n-6CA35 Local Header Offset   00027354 (160596)\n-6CA39 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n-#\n-# WARNING: Offset 0x6CA39: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n-#          Zero length filename\n-#\n-6CA86 Extra ID #1           5455 (21589) 'Extended Timestamp [UT]'\n-6CA88   Length              0005 (5)\n-6CA8A   Flags               01 (1) 'Modification'\n-6CA8B   Modification Time   00000000 (0) 'Thu Jan  1 00:00:00 1970'\n-\n-6CA8F CENTRAL HEADER #67    02014B50 (33639248)\n-6CA93 Created Zip Spec      14 (20) '2.0'\n-6CA94 Created OS            00 (0) 'MS-DOS'\n-6CA95 Extract Zip Spec      14 (20) '2.0'\n-6CA96 Extract OS            00 (0) 'MS-DOS'\n-6CA97 General Purpose Flag  0008 (8)\n-      [Bit  3]              1 'Streamed'\n-6CA99 Compression Method    0000 (0) 'Stored'\n-6CA9B Modification Time     EC210000 (3961585664) 'Wed Jan  1 00:00:00 2098'\n-6CA9F CRC                   A0D533A5 (2698326949)\n-6CAA3 Compressed Size       0000054F (1359)\n-6CAA7 Uncompressed Size     0000054F (1359)\n-6CAAB Filename Length       004F (79)\n-6CAAD Extra Length          0009 (9)\n-6CAAF Comment Length        0000 (0)\n-6CAB1 Disk Start            0000 (0)\n-6CAB3 Int File Attributes   0000 (0)\n-      [Bit 0]               0 'Binary Data'\n-6CAB5 Ext File Attributes   00000000 (0)\n-6CAB9 Local Header Offset   0002791F (162079)\n-6CABD Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n-#\n-# WARNING: Offset 0x6CABD: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n-#          Zero length filename\n-#\n-6CB0C Extra ID #1           5455 (21589) 'Extended Timestamp [UT]'\n-6CB0E   Length              0005 (5)\n-6CB10   Flags               01 (1) 'Modification'\n-6CB11   Modification Time   00000000 (0) 'Thu Jan  1 00:00:00 1970'\n-\n-6CB15 CENTRAL HEADER #68    02014B50 (33639248)\n-6CB19 Created Zip Spec      14 (20) '2.0'\n-6CB1A Created OS            00 (0) 'MS-DOS'\n-6CB1B Extract Zip Spec      14 (20) '2.0'\n-6CB1C Extract OS            00 (0) 'MS-DOS'\n-6CB1D General Purpose Flag  0008 (8)\n-      [Bit  3]              1 'Streamed'\n-6CB1F Compression Method    0000 (0) 'Stored'\n-6CB21 Modification Time     EC210000 (3961585664) 'Wed Jan  1 00:00:00 2098'\n-6CB25 CRC                   DD6C864E (3714877006)\n-6CB29 Compressed Size       00000540 (1344)\n-6CB2D Uncompressed Size     00000540 (1344)\n-6CB31 Filename Length       004A (74)\n-6CB33 Extra Length          0009 (9)\n-6CB35 Comment Length        0000 (0)\n-6CB37 Disk Start            0000 (0)\n-6CB39 Int File Attributes   0000 (0)\n-      [Bit 0]               0 'Binary Data'\n-6CB3B Ext File Attributes   00000000 (0)\n-6CB3F Local Header Offset   00027EF4 (163572)\n-6CB43 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n-#\n-# WARNING: Offset 0x6CB43: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n-#          Zero length filename\n-#\n-6CB8D Extra ID #1           5455 (21589) 'Extended Timestamp [UT]'\n-6CB8F   Length              0005 (5)\n-6CB91   Flags               01 (1) 'Modification'\n-6CB92   Modification Time   00000000 (0) 'Thu Jan  1 00:00:00 1970'\n-\n-6CB96 CENTRAL HEADER #69    02014B50 (33639248)\n-6CB9A Created Zip Spec      14 (20) '2.0'\n-6CB9B Created OS            00 (0) 'MS-DOS'\n-6CB9C Extract Zip Spec      14 (20) '2.0'\n-6CB9D Extract OS            00 (0) 'MS-DOS'\n-6CB9E General Purpose Flag  0008 (8)\n-      [Bit  3]              1 'Streamed'\n-6CBA0 Compression Method    0000 (0) 'Stored'\n-6CBA2 Modification Time     EC210000 (3961585664) 'Wed Jan  1 00:00:00 2098'\n-6CBA6 CRC                   F868DDB6 (4167622070)\n-6CBAA Compressed Size       00000565 (1381)\n-6CBAE Uncompressed Size     00000565 (1381)\n-6CBB2 Filename Length       004C (76)\n-6CBB4 Extra Length          0009 (9)\n-6CBB6 Comment Length        0000 (0)\n-6CBB8 Disk Start            0000 (0)\n-6CBBA Int File Attributes   0000 (0)\n-      [Bit 0]               0 'Binary Data'\n-6CBBC Ext File Attributes   00000000 (0)\n-6CBC0 Local Header Offset   000284B5 (165045)\n-6CBC4 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n-#\n-# WARNING: Offset 0x6CBC4: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n-#          Zero length filename\n-#\n-6CC10 Extra ID #1           5455 (21589) 'Extended Timestamp [UT]'\n-6CC12   Length              0005 (5)\n-6CC14   Flags               01 (1) 'Modification'\n-6CC15   Modification Time   00000000 (0) 'Thu Jan  1 00:00:00 1970'\n-\n-6CC19 CENTRAL HEADER #70    02014B50 (33639248)\n-6CC1D Created Zip Spec      14 (20) '2.0'\n-6CC1E Created OS            00 (0) 'MS-DOS'\n-6CC1F Extract Zip Spec      14 (20) '2.0'\n-6CC20 Extract OS            00 (0) 'MS-DOS'\n-6CC21 General Purpose Flag  0008 (8)\n-      [Bit  3]              1 'Streamed'\n-6CC23 Compression Method    0000 (0) 'Stored'\n-6CC25 Modification Time     EC210000 (3961585664) 'Wed Jan  1 00:00:00 2098'\n-6CC29 CRC                   97496C8E (2538171534)\n-6CC2D Compressed Size       000008A6 (2214)\n-6CC31 Uncompressed Size     000008A6 (2214)\n-6CC35 Filename Length       0048 (72)\n-6CC37 Extra Length          0009 (9)\n-6CC39 Comment Length        0000 (0)\n-6CC3B Disk Start            0000 (0)\n-6CC3D Int File Attributes   0000 (0)\n-      [Bit 0]               0 'Binary Data'\n-6CC3F Ext File Attributes   00000000 (0)\n-6CC43 Local Header Offset   00028A9D (166557)\n-6CC47 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n-#\n-# WARNING: Offset 0x6CC47: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n-#          Zero length filename\n-#\n-6CC8F Extra ID #1           5455 (21589) 'Extended Timestamp [UT]'\n-6CC91   Length              0005 (5)\n-6CC93   Flags               01 (1) 'Modification'\n-6CC94   Modification Time   00000000 (0) 'Thu Jan  1 00:00:00 1970'\n-\n-6CC98 CENTRAL HEADER #71    02014B50 (33639248)\n-6CC9C Created Zip Spec      14 (20) '2.0'\n-6CC9D Created OS            00 (0) 'MS-DOS'\n-6CC9E Extract Zip Spec      14 (20) '2.0'\n-6CC9F Extract OS            00 (0) 'MS-DOS'\n-6CCA0 General Purpose Flag  0000 (0)\n-6CCA2 Compression Method    0000 (0) 'Stored'\n-6CCA4 Modification Time     EC210000 (3961585664) 'Wed Jan  1 00:00:00 2098'\n-6CCA8 CRC                   00000000 (0)\n-6CCAC Compressed Size       00000000 (0)\n-6CCB0 Uncompressed Size     00000000 (0)\n-6CCB4 Filename Length       0030 (48)\n-6CCB6 Extra Length          0009 (9)\n-6CCB8 Comment Length        0000 (0)\n-6CCBA Disk Start            0000 (0)\n-6CCBC Int File Attributes   0000 (0)\n-      [Bit 0]               0 'Binary Data'\n-6CCBE Ext File Attributes   00000000 (0)\n-6CCC2 Local Header Offset   000293C2 (168898)\n-6CCC6 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n-#\n-# WARNING: Offset 0x6CCC6: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n-#          Zero length filename\n-#\n-6CCF6 Extra ID #1           5455 (21589) 'Extended Timestamp [UT]'\n-6CCF8   Length              0005 (5)\n-6CCFA   Flags               01 (1) 'Modification'\n-6CCFB   Modification Time   00000000 (0) 'Thu Jan  1 00:00:00 1970'\n-\n-6CCFF CENTRAL HEADER #72    02014B50 (33639248)\n-6CD03 Created Zip Spec      14 (20) '2.0'\n-6CD04 Created OS            00 (0) 'MS-DOS'\n-6CD05 Extract Zip Spec      14 (20) '2.0'\n-6CD06 Extract OS            00 (0) 'MS-DOS'\n-6CD07 General Purpose Flag  0008 (8)\n-      [Bit  3]              1 'Streamed'\n-6CD09 Compression Method    0000 (0) 'Stored'\n-6CD0B Modification Time     EC210000 (3961585664) 'Wed Jan  1 00:00:00 2098'\n-6CD0F CRC                   C309C134 (3272196404)\n-6CD13 Compressed Size       00000E22 (3618)\n-6CD17 Uncompressed Size     00000E22 (3618)\n-6CD1B Filename Length       0049 (73)\n-6CD1D Extra Length          0009 (9)\n-6CD1F Comment Length        0000 (0)\n-6CD21 Disk Start            0000 (0)\n-6CD23 Int File Attributes   0000 (0)\n-      [Bit 0]               0 'Binary Data'\n-6CD25 Ext File Attributes   00000000 (0)\n-6CD29 Local Header Offset   00029419 (168985)\n-6CD2D Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n-#\n-# WARNING: Offset 0x6CD2D: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n-#          Zero length filename\n-#\n-6CD76 Extra ID #1           5455 (21589) 'Extended Timestamp [UT]'\n-6CD78   Length              0005 (5)\n-6CD7A   Flags               01 (1) 'Modification'\n-6CD7B   Modification Time   00000000 (0) 'Thu Jan  1 00:00:00 1970'\n-\n-6CD7F CENTRAL HEADER #73    02014B50 (33639248)\n-6CD83 Created Zip Spec      14 (20) '2.0'\n-6CD84 Created OS            00 (0) 'MS-DOS'\n-6CD85 Extract Zip Spec      14 (20) '2.0'\n-6CD86 Extract OS            00 (0) 'MS-DOS'\n-6CD87 General Purpose Flag  0008 (8)\n-      [Bit  3]              1 'Streamed'\n-6CD89 Compression Method    0000 (0) 'Stored'\n-6CD8B Modification Time     EC210000 (3961585664) 'Wed Jan  1 00:00:00 2098'\n-6CD8F CRC                   BD334F2B (3174256427)\n-6CD93 Compressed Size       00002C35 (11317)\n-6CD97 Uncompressed Size     00002C35 (11317)\n-6CD9B Filename Length       0054 (84)\n-6CD9D Extra Length          0009 (9)\n-6CD9F Comment Length        0000 (0)\n-6CDA1 Disk Start            0000 (0)\n-6CDA3 Int File Attributes   0000 (0)\n-      [Bit 0]               0 'Binary Data'\n-6CDA5 Ext File Attributes   00000000 (0)\n-6CDA9 Local Header Offset   0002A2BB (172731)\n-6CDAD Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n-#\n-# WARNING: Offset 0x6CDAD: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n-#          Zero length filename\n-#\n-6CE01 Extra ID #1           5455 (21589) 'Extended Timestamp [UT]'\n-6CE03   Length              0005 (5)\n-6CE05   Flags               01 (1) 'Modification'\n-6CE06   Modification Time   00000000 (0) 'Thu Jan  1 00:00:00 1970'\n-\n-6CE0A CENTRAL HEADER #74    02014B50 (33639248)\n-6CE0E Created Zip Spec      14 (20) '2.0'\n-6CE0F Created OS            00 (0) 'MS-DOS'\n-6CE10 Extract Zip Spec      14 (20) '2.0'\n-6CE11 Extract OS            00 (0) 'MS-DOS'\n-6CE12 General Purpose Flag  0000 (0)\n-6CE14 Compression Method    0000 (0) 'Stored'\n-6CE16 Modification Time     EC210000 (3961585664) 'Wed Jan  1 00:00:00 2098'\n-6CE1A CRC                   00000000 (0)\n-6CE1E Compressed Size       00000000 (0)\n-6CE22 Uncompressed Size     00000000 (0)\n-6CE26 Filename Length       002A (42)\n-6CE28 Extra Length          0009 (9)\n-6CE2A Comment Length        0000 (0)\n-6CE2C Disk Start            0000 (0)\n-6CE2E Int File Attributes   0000 (0)\n-      [Bit 0]               0 'Binary Data'\n-6CE30 Ext File Attributes   00000000 (0)\n-6CE34 Local Header Offset   0002CF7B (184187)\n-6CE38 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n-#\n-# WARNING: Offset 0x6CE38: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n-#          Zero length filename\n-#\n-6CE62 Extra ID #1           5455 (21589) 'Extended Timestamp [UT]'\n-6CE64   Length              0005 (5)\n-6CE66   Flags               01 (1) 'Modification'\n-6CE67   Modification Time   00000000 (0) 'Thu Jan  1 00:00:00 1970'\n-\n-6CE6B CENTRAL HEADER #75    02014B50 (33639248)\n-6CE6F Created Zip Spec      14 (20) '2.0'\n-6CE70 Created OS            00 (0) 'MS-DOS'\n-6CE71 Extract Zip Spec      14 (20) '2.0'\n-6CE72 Extract OS            00 (0) 'MS-DOS'\n-6CE73 General Purpose Flag  0008 (8)\n-      [Bit  3]              1 'Streamed'\n-6CE75 Compression Method    0000 (0) 'Stored'\n-6CE77 Modification Time     EC210000 (3961585664) 'Wed Jan  1 00:00:00 2098'\n-6CE7B CRC                   8764F382 (2271540098)\n-6CE7F Compressed Size       00000E76 (3702)\n-6CE83 Uncompressed Size     00000E76 (3702)\n-6CE87 Filename Length       0049 (73)\n-6CE89 Extra Length          0009 (9)\n-6CE8B Comment Length        0000 (0)\n-6CE8D Disk Start            0000 (0)\n-6CE8F Int File Attributes   0000 (0)\n-      [Bit 0]               0 'Binary Data'\n-6CE91 Ext File Attributes   00000000 (0)\n-6CE95 Local Header Offset   0002CFCC (184268)\n-6CE99 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n-#\n-# WARNING: Offset 0x6CE99: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n-#          Zero length filename\n-#\n-6CEE2 Extra ID #1           5455 (21589) 'Extended Timestamp [UT]'\n-6CEE4   Length              0005 (5)\n-6CEE6   Flags               01 (1) 'Modification'\n-6CEE7   Modification Time   00000000 (0) 'Thu Jan  1 00:00:00 1970'\n-\n-6CEEB CENTRAL HEADER #76    02014B50 (33639248)\n-6CEEF Created Zip Spec      14 (20) '2.0'\n-6CEF0 Created OS            00 (0) 'MS-DOS'\n-6CEF1 Extract Zip Spec      14 (20) '2.0'\n-6CEF2 Extract OS            00 (0) 'MS-DOS'\n-6CEF3 General Purpose Flag  0008 (8)\n-      [Bit  3]              1 'Streamed'\n-6CEF5 Compression Method    0000 (0) 'Stored'\n-6CEF7 Modification Time     EC210000 (3961585664) 'Wed Jan  1 00:00:00 2098'\n-6CEFB CRC                   E42AC0C2 (3828007106)\n-6CEFF Compressed Size       000005D7 (1495)\n-6CF03 Uncompressed Size     000005D7 (1495)\n-6CF07 Filename Length       0048 (72)\n-6CF09 Extra Length          0009 (9)\n-6CF0B Comment Length        0000 (0)\n-6CF0D Disk Start            0000 (0)\n-6CF0F Int File Attributes   0000 (0)\n-      [Bit 0]               0 'Binary Data'\n-6CF11 Ext File Attributes   00000000 (0)\n-6CF15 Local Header Offset   0002DEC2 (188098)\n-6CF19 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n-#\n-# WARNING: Offset 0x6CF19: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n-#          Zero length filename\n-#\n-6CF61 Extra ID #1           5455 (21589) 'Extended Timestamp [UT]'\n-6CF63   Length              0005 (5)\n-6CF65   Flags               01 (1) 'Modification'\n-6CF66   Modification Time   00000000 (0) 'Thu Jan  1 00:00:00 1970'\n-\n-6CF6A CENTRAL HEADER #77    02014B50 (33639248)\n-6CF6E Created Zip Spec      14 (20) '2.0'\n-6CF6F Created OS            00 (0) 'MS-DOS'\n-6CF70 Extract Zip Spec      14 (20) '2.0'\n-6CF71 Extract OS            00 (0) 'MS-DOS'\n-6CF72 General Purpose Flag  0008 (8)\n-      [Bit  3]              1 'Streamed'\n-6CF74 Compression Method    0000 (0) 'Stored'\n-6CF76 Modification Time     EC210000 (3961585664) 'Wed Jan  1 00:00:00 2098'\n-6CF7A CRC                   33C91E00 (868818432)\n-6CF7E Compressed Size       00000AEA (2794)\n-6CF82 Uncompressed Size     00000AEA (2794)\n-6CF86 Filename Length       0059 (89)\n-6CF88 Extra Length          0009 (9)\n-6CF8A Comment Length        0000 (0)\n-6CF8C Disk Start            0000 (0)\n-6CF8E Int File Attributes   0000 (0)\n-      [Bit 0]               0 'Binary Data'\n-6CF90 Ext File Attributes   00000000 (0)\n-6CF94 Local Header Offset   0002E518 (189720)\n-6CF98 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n-#\n-# WARNING: Offset 0x6CF98: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n-#          Zero length filename\n-#\n-6CFF1 Extra ID #1           5455 (21589) 'Extended Timestamp [UT]'\n-6CFF3   Length              0005 (5)\n-6CFF5   Flags               01 (1) 'Modification'\n-6CFF6   Modification Time   00000000 (0) 'Thu Jan  1 00:00:00 1970'\n-\n-6CFFA CENTRAL HEADER #78    02014B50 (33639248)\n-6CFFE Created Zip Spec      14 (20) '2.0'\n-6CFFF Created OS            00 (0) 'MS-DOS'\n-6D000 Extract Zip Spec      14 (20) '2.0'\n-6D001 Extract OS            00 (0) 'MS-DOS'\n-6D002 General Purpose Flag  0008 (8)\n-      [Bit  3]              1 'Streamed'\n-6D004 Compression Method    0000 (0) 'Stored'\n-6D006 Modification Time     EC210000 (3961585664) 'Wed Jan  1 00:00:00 2098'\n-6D00A CRC                   055EEF97 (90107799)\n-6D00E Compressed Size       000012A3 (4771)\n-6D012 Uncompressed Size     000012A3 (4771)\n-6D016 Filename Length       003C (60)\n-6D018 Extra Length          0009 (9)\n-6D01A Comment Length        0000 (0)\n-6D01C Disk Start            0000 (0)\n-6D01E Int File Attributes   0000 (0)\n-      [Bit 0]               0 'Binary Data'\n-6D020 Ext File Attributes   00000000 (0)\n-6D024 Local Header Offset   0002F092 (192658)\n-6D028 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n-#\n-# WARNING: Offset 0x6D028: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n-#          Zero length filename\n-#\n-6D064 Extra ID #1           5455 (21589) 'Extended Timestamp [UT]'\n-6D066   Length              0005 (5)\n-6D068   Flags               01 (1) 'Modification'\n-6D069   Modification Time   00000000 (0) 'Thu Jan  1 00:00:00 1970'\n-\n-6D06D CENTRAL HEADER #79    02014B50 (33639248)\n-6D071 Created Zip Spec      14 (20) '2.0'\n-6D072 Created OS            00 (0) 'MS-DOS'\n-6D073 Extract Zip Spec      14 (20) '2.0'\n-6D074 Extract OS            00 (0) 'MS-DOS'\n-6D075 General Purpose Flag  0008 (8)\n-      [Bit  3]              1 'Streamed'\n-6D077 Compression Method    0000 (0) 'Stored'\n-6D079 Modification Time     EC210000 (3961585664) 'Wed Jan  1 00:00:00 2098'\n-6D07D CRC                   02F66D1C (49704220)\n-6D081 Compressed Size       000008F8 (2296)\n-6D085 Uncompressed Size     000008F8 (2296)\n-6D089 Filename Length       004E (78)\n-6D08B Extra Length          0009 (9)\n-6D08D Comment Length        0000 (0)\n-6D08F Disk Start            0000 (0)\n-6D091 Int File Attributes   0000 (0)\n-      [Bit 0]               0 'Binary Data'\n-6D093 Ext File Attributes   00000000 (0)\n-6D097 Local Header Offset   000303A8 (197544)\n-6D09B Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n-#\n-# WARNING: Offset 0x6D09B: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n-#          Zero length filename\n-#\n-6D0E9 Extra ID #1           5455 (21589) 'Extended Timestamp [UT]'\n-6D0EB   Length              0005 (5)\n-6D0ED   Flags               01 (1) 'Modification'\n-6D0EE   Modification Time   00000000 (0) 'Thu Jan  1 00:00:00 1970'\n-\n-6D0F2 CENTRAL HEADER #80    02014B50 (33639248)\n-6D0F6 Created Zip Spec      14 (20) '2.0'\n-6D0F7 Created OS            00 (0) 'MS-DOS'\n-6D0F8 Extract Zip Spec      14 (20) '2.0'\n-6D0F9 Extract OS            00 (0) 'MS-DOS'\n-6D0FA General Purpose Flag  0008 (8)\n-      [Bit  3]              1 'Streamed'\n-6D0FC Compression Method    0000 (0) 'Stored'\n-6D0FE Modification Time     EC210000 (3961585664) 'Wed Jan  1 00:00:00 2098'\n-6D102 CRC                   0266C937 (40290615)\n-6D106 Compressed Size       00000AC3 (2755)\n-6D10A Uncompressed Size     00000AC3 (2755)\n-6D10E Filename Length       0054 (84)\n-6D110 Extra Length          0009 (9)\n-6D112 Comment Length        0000 (0)\n-6D114 Disk Start            0000 (0)\n-6D116 Int File Attributes   0000 (0)\n-      [Bit 0]               0 'Binary Data'\n-6D118 Ext File Attributes   00000000 (0)\n-6D11C Local Header Offset   00030D25 (199973)\n-6D120 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n-#\n-# WARNING: Offset 0x6D120: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n-#          Zero length filename\n-#\n-6D174 Extra ID #1           5455 (21589) 'Extended Timestamp [UT]'\n-6D176   Length              0005 (5)\n-6D178   Flags               01 (1) 'Modification'\n-6D179   Modification Time   00000000 (0) 'Thu Jan  1 00:00:00 1970'\n-\n-6D17D CENTRAL HEADER #81    02014B50 (33639248)\n-6D181 Created Zip Spec      14 (20) '2.0'\n-6D182 Created OS            00 (0) 'MS-DOS'\n-6D183 Extract Zip Spec      14 (20) '2.0'\n-6D184 Extract OS            00 (0) 'MS-DOS'\n-6D185 General Purpose Flag  0008 (8)\n-      [Bit  3]              1 'Streamed'\n-6D187 Compression Method    0000 (0) 'Stored'\n-6D189 Modification Time     EC210000 (3961585664) 'Wed Jan  1 00:00:00 2098'\n-6D18D CRC                   BFC681E5 (3217457637)\n-6D191 Compressed Size       00000FB5 (4021)\n-6D195 Uncompressed Size     00000FB5 (4021)\n-6D199 Filename Length       0050 (80)\n-6D19B Extra Length          0009 (9)\n-6D19D Comment Length        0000 (0)\n-6D19F Disk Start            0000 (0)\n-6D1A1 Int File Attributes   0000 (0)\n-      [Bit 0]               0 'Binary Data'\n-6D1A3 Ext File Attributes   00000000 (0)\n-6D1A7 Local Header Offset   00031873 (202867)\n-6D1AB Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n-#\n-# WARNING: Offset 0x6D1AB: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n-#          Zero length filename\n-#\n-6D1FB Extra ID #1           5455 (21589) 'Extended Timestamp [UT]'\n-6D1FD   Length              0005 (5)\n-6D1FF   Flags               01 (1) 'Modification'\n-6D200   Modification Time   00000000 (0) 'Thu Jan  1 00:00:00 1970'\n-\n-6D204 CENTRAL HEADER #82    02014B50 (33639248)\n-6D208 Created Zip Spec      14 (20) '2.0'\n-6D209 Created OS            00 (0) 'MS-DOS'\n-6D20A Extract Zip Spec      14 (20) '2.0'\n-6D20B Extract OS            00 (0) 'MS-DOS'\n-6D20C General Purpose Flag  0008 (8)\n-      [Bit  3]              1 'Streamed'\n-6D20E Compression Method    0000 (0) 'Stored'\n-6D210 Modification Time     EC210000 (3961585664) 'Wed Jan  1 00:00:00 2098'\n-6D214 CRC                   3C5C28F1 (1012672753)\n-6D218 Compressed Size       0000348D (13453)\n-6D21C Uncompressed Size     0000348D (13453)\n-6D220 Filename Length       004B (75)\n-6D222 Extra Length          0009 (9)\n-6D224 Comment Length        0000 (0)\n-6D226 Disk Start            0000 (0)\n-6D228 Int File Attributes   0000 (0)\n-      [Bit 0]               0 'Binary Data'\n-6D22A Ext File Attributes   00000000 (0)\n-6D22E Local Header Offset   000328AF (207023)\n-6D232 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n-#\n-# WARNING: Offset 0x6D232: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n-#          Zero length filename\n-#\n-6D27D Extra ID #1           5455 (21589) 'Extended Timestamp [UT]'\n-6D27F   Length              0005 (5)\n-6D281   Flags               01 (1) 'Modification'\n-6D282   Modification Time   00000000 (0) 'Thu Jan  1 00:00:00 1970'\n-\n-6D286 CENTRAL HEADER #83    02014B50 (33639248)\n-6D28A Created Zip Spec      14 (20) '2.0'\n-6D28B Created OS            00 (0) 'MS-DOS'\n-6D28C Extract Zip Spec      14 (20) '2.0'\n-6D28D Extract OS            00 (0) 'MS-DOS'\n-6D28E General Purpose Flag  0008 (8)\n-      [Bit  3]              1 'Streamed'\n-6D290 Compression Method    0000 (0) 'Stored'\n-6D292 Modification Time     EC210000 (3961585664) 'Wed Jan  1 00:00:00 2098'\n-6D296 CRC                   81760C22 (2171997218)\n-6D29A Compressed Size       0000086F (2159)\n-6D29E Uncompressed Size     0000086F (2159)\n-6D2A2 Filename Length       0053 (83)\n-6D2A4 Extra Length          0009 (9)\n-6D2A6 Comment Length        0000 (0)\n-6D2A8 Disk Start            0000 (0)\n-6D2AA Int File Attributes   0000 (0)\n-      [Bit 0]               0 'Binary Data'\n-6D2AC Ext File Attributes   00000000 (0)\n-6D2B0 Local Header Offset   00035DBE (220606)\n-6D2B4 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n-#\n-# WARNING: Offset 0x6D2B4: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n-#          Zero length filename\n-#\n-6D307 Extra ID #1           5455 (21589) 'Extended Timestamp [UT]'\n-6D309   Length              0005 (5)\n-6D30B   Flags               01 (1) 'Modification'\n-6D30C   Modification Time   00000000 (0) 'Thu Jan  1 00:00:00 1970'\n-\n-6D310 CENTRAL HEADER #84    02014B50 (33639248)\n-6D314 Created Zip Spec      14 (20) '2.0'\n-6D315 Created OS            00 (0) 'MS-DOS'\n-6D316 Extract Zip Spec      14 (20) '2.0'\n-6D317 Extract OS            00 (0) 'MS-DOS'\n-6D318 General Purpose Flag  0008 (8)\n-      [Bit  3]              1 'Streamed'\n-6D31A Compression Method    0000 (0) 'Stored'\n-6D31C Modification Time     EC210000 (3961585664) 'Wed Jan  1 00:00:00 2098'\n-6D320 CRC                   7D70DC8D (2104548493)\n-6D324 Compressed Size       00000E7E (3710)\n-6D328 Uncompressed Size     00000E7E (3710)\n-6D32C Filename Length       0050 (80)\n-6D32E Extra Length          0009 (9)\n-6D330 Comment Length        0000 (0)\n-6D332 Disk Start            0000 (0)\n-6D334 Int File Attributes   0000 (0)\n-      [Bit 0]               0 'Binary Data'\n-6D336 Ext File Attributes   00000000 (0)\n-6D33A Local Header Offset   000366B7 (222903)\n-6D33E Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n-#\n-# WARNING: Offset 0x6D33E: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n-#          Zero length filename\n-#\n-6D38E Extra ID #1           5455 (21589) 'Extended Timestamp [UT]'\n-6D390   Length              0005 (5)\n-6D392   Flags               01 (1) 'Modification'\n-6D393   Modification Time   00000000 (0) 'Thu Jan  1 00:00:00 1970'\n-\n-6D397 CENTRAL HEADER #85    02014B50 (33639248)\n-6D39B Created Zip Spec      14 (20) '2.0'\n-6D39C Created OS            00 (0) 'MS-DOS'\n-6D39D Extract Zip Spec      14 (20) '2.0'\n-6D39E Extract OS            00 (0) 'MS-DOS'\n-6D39F General Purpose Flag  0008 (8)\n-      [Bit  3]              1 'Streamed'\n-6D3A1 Compression Method    0000 (0) 'Stored'\n-6D3A3 Modification Time     EC210000 (3961585664) 'Wed Jan  1 00:00:00 2098'\n-6D3A7 CRC                   BE3056BF (3190838975)\n-6D3AB Compressed Size       00000848 (2120)\n-6D3AF Uncompressed Size     00000848 (2120)\n-6D3B3 Filename Length       0048 (72)\n-6D3B5 Extra Length          0009 (9)\n-6D3B7 Comment Length        0000 (0)\n-6D3B9 Disk Start            0000 (0)\n-6D3BB Int File Attributes   0000 (0)\n-      [Bit 0]               0 'Binary Data'\n-6D3BD Ext File Attributes   00000000 (0)\n-6D3C1 Local Header Offset   000375BC (226748)\n-6D3C5 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n-#\n-# WARNING: Offset 0x6D3C5: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n-#          Zero length filename\n-#\n-6D40D Extra ID #1           5455 (21589) 'Extended Timestamp [UT]'\n-6D40F   Length              0005 (5)\n-6D411   Flags               01 (1) 'Modification'\n-6D412   Modification Time   00000000 (0) 'Thu Jan  1 00:00:00 1970'\n-\n-6D416 CENTRAL HEADER #86    02014B50 (33639248)\n-6D41A Created Zip Spec      14 (20) '2.0'\n-6D41B Created OS            00 (0) 'MS-DOS'\n-6D41C Extract Zip Spec      14 (20) '2.0'\n-6D41D Extract OS            00 (0) 'MS-DOS'\n-6D41E General Purpose Flag  0000 (0)\n-6D420 Compression Method    0000 (0) 'Stored'\n-6D422 Modification Time     EC210000 (3961585664) 'Wed Jan  1 00:00:00 2098'\n-6D426 CRC                   00000000 (0)\n-6D42A Compressed Size       00000000 (0)\n-6D42E Uncompressed Size     00000000 (0)\n-6D432 Filename Length       0030 (48)\n-6D434 Extra Length          0009 (9)\n-6D436 Comment Length        0000 (0)\n-6D438 Disk Start            0000 (0)\n-6D43A Int File Attributes   0000 (0)\n-      [Bit 0]               0 'Binary Data'\n-6D43C Ext File Attributes   00000000 (0)\n-6D440 Local Header Offset   00037E83 (228995)\n-6D444 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n-#\n-# WARNING: Offset 0x6D444: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n-#          Zero length filename\n-#\n-6D474 Extra ID #1           5455 (21589) 'Extended Timestamp [UT]'\n-6D476   Length              0005 (5)\n-6D478   Flags               01 (1) 'Modification'\n-6D479   Modification Time   00000000 (0) 'Thu Jan  1 00:00:00 1970'\n-\n-6D47D CENTRAL HEADER #87    02014B50 (33639248)\n-6D481 Created Zip Spec      14 (20) '2.0'\n-6D482 Created OS            00 (0) 'MS-DOS'\n-6D483 Extract Zip Spec      14 (20) '2.0'\n-6D484 Extract OS            00 (0) 'MS-DOS'\n-6D485 General Purpose Flag  0008 (8)\n-      [Bit  3]              1 'Streamed'\n-6D487 Compression Method    0000 (0) 'Stored'\n-6D489 Modification Time     EC210000 (3961585664) 'Wed Jan  1 00:00:00 2098'\n-6D48D CRC                   E322696B (3810683243)\n-6D491 Compressed Size       00002E62 (11874)\n-6D495 Uncompressed Size     00002E62 (11874)\n-6D499 Filename Length       0054 (84)\n-6D49B Extra Length          0009 (9)\n-6D49D Comment Length        0000 (0)\n-6D49F Disk Start            0000 (0)\n-6D4A1 Int File Attributes   0000 (0)\n-      [Bit 0]               0 'Binary Data'\n-6D4A3 Ext File Attributes   00000000 (0)\n-6D4A7 Local Header Offset   00037EDA (229082)\n-6D4AB Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n-#\n-# WARNING: Offset 0x6D4AB: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n-#          Zero length filename\n-#\n-6D4FF Extra ID #1           5455 (21589) 'Extended Timestamp [UT]'\n-6D501   Length              0005 (5)\n-6D503   Flags               01 (1) 'Modification'\n-6D504   Modification Time   00000000 (0) 'Thu Jan  1 00:00:00 1970'\n-\n-6D508 CENTRAL HEADER #88    02014B50 (33639248)\n-6D50C Created Zip Spec      14 (20) '2.0'\n-6D50D Created OS            00 (0) 'MS-DOS'\n-6D50E Extract Zip Spec      14 (20) '2.0'\n-6D50F Extract OS            00 (0) 'MS-DOS'\n-6D510 General Purpose Flag  0008 (8)\n-      [Bit  3]              1 'Streamed'\n-6D512 Compression Method    0000 (0) 'Stored'\n-6D514 Modification Time     EC210000 (3961585664) 'Wed Jan  1 00:00:00 2098'\n-6D518 CRC                   6CE6F13F (1827074367)\n-6D51C Compressed Size       00001D8A (7562)\n-6D520 Uncompressed Size     00001D8A (7562)\n-6D524 Filename Length       004E (78)\n-6D526 Extra Length          0009 (9)\n-6D528 Comment Length        0000 (0)\n-6D52A Disk Start            0000 (0)\n-6D52C Int File Attributes   0000 (0)\n-      [Bit 0]               0 'Binary Data'\n-6D52E Ext File Attributes   00000000 (0)\n-6D532 Local Header Offset   0003ADC7 (241095)\n-6D536 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n-#\n-# WARNING: Offset 0x6D536: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n-#          Zero length filename\n-#\n-6D584 Extra ID #1           5455 (21589) 'Extended Timestamp [UT]'\n-6D586   Length              0005 (5)\n-6D588   Flags               01 (1) 'Modification'\n-6D589   Modification Time   00000000 (0) 'Thu Jan  1 00:00:00 1970'\n-\n-6D58D CENTRAL HEADER #89    02014B50 (33639248)\n-6D591 Created Zip Spec      14 (20) '2.0'\n-6D592 Created OS            00 (0) 'MS-DOS'\n-6D593 Extract Zip Spec      14 (20) '2.0'\n-6D594 Extract OS            00 (0) 'MS-DOS'\n-6D595 General Purpose Flag  0000 (0)\n-6D597 Compression Method    0000 (0) 'Stored'\n-6D599 Modification Time     EC210000 (3961585664) 'Wed Jan  1 00:00:00 2098'\n-6D59D CRC                   00000000 (0)\n-6D5A1 Compressed Size       00000000 (0)\n-6D5A5 Uncompressed Size     00000000 (0)\n-6D5A9 Filename Length       002B (43)\n-6D5AB Extra Length          0009 (9)\n-6D5AD Comment Length        0000 (0)\n-6D5AF Disk Start            0000 (0)\n-6D5B1 Int File Attributes   0000 (0)\n-      [Bit 0]               0 'Binary Data'\n-6D5B3 Ext File Attributes   00000000 (0)\n-6D5B7 Local Header Offset   0003CBD6 (248790)\n-6D5BB Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n-#\n-# WARNING: Offset 0x6D5BB: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n-#          Zero length filename\n-#\n-6D5E6 Extra ID #1           5455 (21589) 'Extended Timestamp [UT]'\n-6D5E8   Length              0005 (5)\n-6D5EA   Flags               01 (1) 'Modification'\n-6D5EB   Modification Time   00000000 (0) 'Thu Jan  1 00:00:00 1970'\n-\n-6D5EF CENTRAL HEADER #90    02014B50 (33639248)\n-6D5F3 Created Zip Spec      14 (20) '2.0'\n-6D5F4 Created OS            00 (0) 'MS-DOS'\n-6D5F5 Extract Zip Spec      14 (20) '2.0'\n-6D5F6 Extract OS            00 (0) 'MS-DOS'\n-6D5F7 General Purpose Flag  0008 (8)\n-      [Bit  3]              1 'Streamed'\n-6D5F9 Compression Method    0000 (0) 'Stored'\n-6D5FB Modification Time     EC210000 (3961585664) 'Wed Jan  1 00:00:00 2098'\n-6D5FF CRC                   C9115A1F (3373357599)\n-6D603 Compressed Size       00000C95 (3221)\n-6D607 Uncompressed Size     00000C95 (3221)\n-6D60B Filename Length       0051 (81)\n-6D60D Extra Length          0009 (9)\n-6D60F Comment Length        0000 (0)\n-6D611 Disk Start            0000 (0)\n-6D613 Int File Attributes   0000 (0)\n-      [Bit 0]               0 'Binary Data'\n-6D615 Ext File Attributes   00000000 (0)\n-6D619 Local Header Offset   0003CC28 (248872)\n-6D61D Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n-#\n-# WARNING: Offset 0x6D61D: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n-#          Zero length filename\n-#\n-6D66E Extra ID #1           5455 (21589) 'Extended Timestamp [UT]'\n-6D670   Length              0005 (5)\n-6D672   Flags               01 (1) 'Modification'\n-6D673   Modification Time   00000000 (0) 'Thu Jan  1 00:00:00 1970'\n-\n-6D677 CENTRAL HEADER #91    02014B50 (33639248)\n-6D67B Created Zip Spec      14 (20) '2.0'\n-6D67C Created OS            00 (0) 'MS-DOS'\n-6D67D Extract Zip Spec      14 (20) '2.0'\n-6D67E Extract OS            00 (0) 'MS-DOS'\n-6D67F General Purpose Flag  0008 (8)\n-      [Bit  3]              1 'Streamed'\n-6D681 Compression Method    0000 (0) 'Stored'\n-6D683 Modification Time     EC210000 (3961585664) 'Wed Jan  1 00:00:00 2098'\n-6D687 CRC                   2197D7D3 (563599315)\n-6D68B Compressed Size       00000398 (920)\n-6D68F Uncompressed Size     00000398 (920)\n-6D693 Filename Length       0047 (71)\n-6D695 Extra Length          0009 (9)\n-6D697 Comment Length        0000 (0)\n-6D699 Disk Start            0000 (0)\n-6D69B Int File Attributes   0000 (0)\n-      [Bit 0]               0 'Binary Data'\n-6D69D Ext File Attributes   00000000 (0)\n-6D6A1 Local Header Offset   0003D945 (252229)\n-6D6A5 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n-#\n-# WARNING: Offset 0x6D6A5: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n-#          Zero length filename\n-#\n-6D6EC Extra ID #1           5455 (21589) 'Extended Timestamp [UT]'\n-6D6EE   Length              0005 (5)\n-6D6F0   Flags               01 (1) 'Modification'\n-6D6F1   Modification Time   00000000 (0) 'Thu Jan  1 00:00:00 1970'\n-\n-6D6F5 CENTRAL HEADER #92    02014B50 (33639248)\n-6D6F9 Created Zip Spec      14 (20) '2.0'\n-6D6FA Created OS            00 (0) 'MS-DOS'\n-6D6FB Extract Zip Spec      14 (20) '2.0'\n-6D6FC Extract OS            00 (0) 'MS-DOS'\n-6D6FD General Purpose Flag  0008 (8)\n-      [Bit  3]              1 'Streamed'\n-6D6FF Compression Method    0000 (0) 'Stored'\n-6D701 Modification Time     EC210000 (3961585664) 'Wed Jan  1 00:00:00 2098'\n-6D705 CRC                   D03865FF (3493357055)\n-6D709 Compressed Size       00000454 (1108)\n-6D70D Uncompressed Size     00000454 (1108)\n-6D711 Filename Length       004A (74)\n-6D713 Extra Length          0009 (9)\n-6D715 Comment Length        0000 (0)\n-6D717 Disk Start            0000 (0)\n-6D719 Int File Attributes   0000 (0)\n-      [Bit 0]               0 'Binary Data'\n-6D71B Ext File Attributes   00000000 (0)\n-6D71F Local Header Offset   0003DD5B (253275)\n-6D723 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n-#\n-# WARNING: Offset 0x6D723: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n-#          Zero length filename\n-#\n-6D76D Extra ID #1           5455 (21589) 'Extended Timestamp [UT]'\n-6D76F   Length              0005 (5)\n-6D771   Flags               01 (1) 'Modification'\n-6D772   Modification Time   00000000 (0) 'Thu Jan  1 00:00:00 1970'\n-\n-6D776 CENTRAL HEADER #93    02014B50 (33639248)\n-6D77A Created Zip Spec      14 (20) '2.0'\n-6D77B Created OS            00 (0) 'MS-DOS'\n-6D77C Extract Zip Spec      14 (20) '2.0'\n-6D77D Extract OS            00 (0) 'MS-DOS'\n-6D77E General Purpose Flag  0008 (8)\n-      [Bit  3]              1 'Streamed'\n-6D780 Compression Method    0000 (0) 'Stored'\n-6D782 Modification Time     EC210000 (3961585664) 'Wed Jan  1 00:00:00 2098'\n-6D786 CRC                   D6056B09 (3590679305)\n-6D78A Compressed Size       000039C3 (14787)\n-6D78E Uncompressed Size     000039C3 (14787)\n-6D792 Filename Length       0040 (64)\n-6D794 Extra Length          0009 (9)\n-6D796 Comment Length        0000 (0)\n-6D798 Disk Start            0000 (0)\n-6D79A Int File Attributes   0000 (0)\n-      [Bit 0]               0 'Binary Data'\n-6D79C Ext File Attributes   00000000 (0)\n-6D7A0 Local Header Offset   0003E230 (254512)\n-6D7A4 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n-#\n-# WARNING: Offset 0x6D7A4: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n-#          Zero length filename\n-#\n-6D7E4 Extra ID #1           5455 (21589) 'Extended Timestamp [UT]'\n-6D7E6   Length              0005 (5)\n-6D7E8   Flags               01 (1) 'Modification'\n-6D7E9   Modification Time   00000000 (0) 'Thu Jan  1 00:00:00 1970'\n-\n-6D7ED CENTRAL HEADER #94    02014B50 (33639248)\n-6D7F1 Created Zip Spec      14 (20) '2.0'\n-6D7F2 Created OS            00 (0) 'MS-DOS'\n-6D7F3 Extract Zip Spec      14 (20) '2.0'\n-6D7F4 Extract OS            00 (0) 'MS-DOS'\n-6D7F5 General Purpose Flag  0008 (8)\n-      [Bit  3]              1 'Streamed'\n-6D7F7 Compression Method    0000 (0) 'Stored'\n-6D7F9 Modification Time     EC210000 (3961585664) 'Wed Jan  1 00:00:00 2098'\n-6D7FD CRC                   8A132C8F (2316512399)\n-6D801 Compressed Size       00000AB9 (2745)\n-6D805 Uncompressed Size     00000AB9 (2745)\n-6D809 Filename Length       0044 (68)\n-6D80B Extra Length          0009 (9)\n-6D80D Comment Length        0000 (0)\n-6D80F Disk Start            0000 (0)\n-6D811 Int File Attributes   0000 (0)\n-      [Bit 0]               0 'Binary Data'\n-6D813 Ext File Attributes   00000000 (0)\n-6D817 Local Header Offset   00041C6A (269418)\n-6D81B Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n-#\n-# WARNING: Offset 0x6D81B: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n-#          Zero length filename\n-#\n-6D85F Extra ID #1           5455 (21589) 'Extended Timestamp [UT]'\n-6D861   Length              0005 (5)\n-6D863   Flags               01 (1) 'Modification'\n-6D864   Modification Time   00000000 (0) 'Thu Jan  1 00:00:00 1970'\n-\n-6D868 CENTRAL HEADER #95    02014B50 (33639248)\n-6D86C Created Zip Spec      14 (20) '2.0'\n-6D86D Created OS            00 (0) 'MS-DOS'\n-6D86E Extract Zip Spec      14 (20) '2.0'\n-6D86F Extract OS            00 (0) 'MS-DOS'\n-6D870 General Purpose Flag  0008 (8)\n-      [Bit  3]              1 'Streamed'\n-6D872 Compression Method    0000 (0) 'Stored'\n-6D874 Modification Time     EC210000 (3961585664) 'Wed Jan  1 00:00:00 2098'\n-6D878 CRC                   F9713EB9 (4184948409)\n-6D87C Compressed Size       00001198 (4504)\n-6D880 Uncompressed Size     00001198 (4504)\n-6D884 Filename Length       0045 (69)\n-6D886 Extra Length          0009 (9)\n-6D888 Comment Length        0000 (0)\n-6D88A Disk Start            0000 (0)\n-6D88C Int File Attributes   0000 (0)\n-      [Bit 0]               0 'Binary Data'\n-6D88E Ext File Attributes   00000000 (0)\n-6D892 Local Header Offset   0004279E (272286)\n-6D896 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n-#\n-# WARNING: Offset 0x6D896: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n-#          Zero length filename\n-#\n-6D8DB Extra ID #1           5455 (21589) 'Extended Timestamp [UT]'\n-6D8DD   Length              0005 (5)\n-6D8DF   Flags               01 (1) 'Modification'\n-6D8E0   Modification Time   00000000 (0) 'Thu Jan  1 00:00:00 1970'\n-\n-6D8E4 CENTRAL HEADER #96    02014B50 (33639248)\n-6D8E8 Created Zip Spec      14 (20) '2.0'\n-6D8E9 Created OS            00 (0) 'MS-DOS'\n-6D8EA Extract Zip Spec      14 (20) '2.0'\n-6D8EB Extract OS            00 (0) 'MS-DOS'\n-6D8EC General Purpose Flag  0008 (8)\n-      [Bit  3]              1 'Streamed'\n-6D8EE Compression Method    0000 (0) 'Stored'\n-6D8F0 Modification Time     EC210000 (3961585664) 'Wed Jan  1 00:00:00 2098'\n-6D8F4 CRC                   5914D57F (1494537599)\n-6D8F8 Compressed Size       00000A34 (2612)\n-6D8FC Uncompressed Size     00000A34 (2612)\n-6D900 Filename Length       0050 (80)\n-6D902 Extra Length          0009 (9)\n-6D904 Comment Length        0000 (0)\n-6D906 Disk Start            0000 (0)\n-6D908 Int File Attributes   0000 (0)\n-      [Bit 0]               0 'Binary Data'\n-6D90A Ext File Attributes   00000000 (0)\n-6D90E Local Header Offset   000439B2 (276914)\n-6D912 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n-#\n-# WARNING: Offset 0x6D912: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n-#          Zero length filename\n-#\n-6D962 Extra ID #1           5455 (21589) 'Extended Timestamp [UT]'\n-6D964   Length              0005 (5)\n-6D966   Flags               01 (1) 'Modification'\n-6D967   Modification Time   00000000 (0) 'Thu Jan  1 00:00:00 1970'\n-\n-6D96B CENTRAL HEADER #97    02014B50 (33639248)\n-6D96F Created Zip Spec      14 (20) '2.0'\n-6D970 Created OS            00 (0) 'MS-DOS'\n-6D971 Extract Zip Spec      14 (20) '2.0'\n-6D972 Extract OS            00 (0) 'MS-DOS'\n-6D973 General Purpose Flag  0008 (8)\n-      [Bit  3]              1 'Streamed'\n-6D975 Compression Method    0000 (0) 'Stored'\n-6D977 Modification Time     EC210000 (3961585664) 'Wed Jan  1 00:00:00 2098'\n-6D97B CRC                   F9948D9B (4187262363)\n-6D97F Compressed Size       00000403 (1027)\n-6D983 Uncompressed Size     00000403 (1027)\n-6D987 Filename Length       0032 (50)\n-6D989 Extra Length          0009 (9)\n-6D98B Comment Length        0000 (0)\n-6D98D Disk Start            0000 (0)\n-6D98F Int File Attributes   0000 (0)\n-      [Bit 0]               0 'Binary Data'\n-6D991 Ext File Attributes   00000000 (0)\n-6D995 Local Header Offset   0004446D (279661)\n-6D999 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n-#\n-# WARNING: Offset 0x6D999: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n-#          Zero length filename\n-#\n-6D9CB Extra ID #1           5455 (21589) 'Extended Timestamp [UT]'\n-6D9CD   Length              0005 (5)\n-6D9CF   Flags               01 (1) 'Modification'\n-6D9D0   Modification Time   00000000 (0) 'Thu Jan  1 00:00:00 1970'\n-\n-6D9D4 CENTRAL HEADER #98    02014B50 (33639248)\n-6D9D8 Created Zip Spec      14 (20) '2.0'\n-6D9D9 Created OS            00 (0) 'MS-DOS'\n-6D9DA Extract Zip Spec      14 (20) '2.0'\n-6D9DB Extract OS            00 (0) 'MS-DOS'\n-6D9DC General Purpose Flag  0000 (0)\n-6D9DE Compression Method    0000 (0) 'Stored'\n-6D9E0 Modification Time     EC210000 (3961585664) 'Wed Jan  1 00:00:00 2098'\n-6D9E4 CRC                   00000000 (0)\n-6D9E8 Compressed Size       00000000 (0)\n-6D9EC Uncompressed Size     00000000 (0)\n-6D9F0 Filename Length       002A (42)\n-6D9F2 Extra Length          0009 (9)\n-6D9F4 Comment Length        0000 (0)\n-6D9F6 Disk Start            0000 (0)\n-6D9F8 Int File Attributes   0000 (0)\n-      [Bit 0]               0 'Binary Data'\n-6D9FA Ext File Attributes   00000000 (0)\n-6D9FE Local Header Offset   000448D9 (280793)\n-6DA02 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n-#\n-# WARNING: Offset 0x6DA02: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n-#          Zero length filename\n-#\n-6DA2C Extra ID #1           5455 (21589) 'Extended Timestamp [UT]'\n-6DA2E   Length              0005 (5)\n-6DA30   Flags               01 (1) 'Modification'\n-6DA31   Modification Time   00000000 (0) 'Thu Jan  1 00:00:00 1970'\n-\n-6DA35 CENTRAL HEADER #99    02014B50 (33639248)\n-6DA39 Created Zip Spec      14 (20) '2.0'\n-6DA3A Created OS            00 (0) 'MS-DOS'\n-6DA3B Extract Zip Spec      14 (20) '2.0'\n-6DA3C Extract OS            00 (0) 'MS-DOS'\n-6DA3D General Purpose Flag  0008 (8)\n-      [Bit  3]              1 'Streamed'\n-6DA3F Compression Method    0000 (0) 'Stored'\n-6DA41 Modification Time     EC210000 (3961585664) 'Wed Jan  1 00:00:00 2098'\n-6DA45 CRC                   D0D8B588 (3503863176)\n-6DA49 Compressed Size       000006A9 (1705)\n-6DA4D Uncompressed Size     000006A9 (1705)\n-6DA51 Filename Length       004C (76)\n-6DA53 Extra Length          0009 (9)\n-6DA55 Comment Length        0000 (0)\n-6DA57 Disk Start            0000 (0)\n-6DA59 Int File Attributes   0000 (0)\n-      [Bit 0]               0 'Binary Data'\n-6DA5B Ext File Attributes   00000000 (0)\n-6DA5F Local Header Offset   0004492A (280874)\n-6DA63 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n-#\n-# WARNING: Offset 0x6DA63: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n-#          Zero length filename\n-#\n-6DAAF Extra ID #1           5455 (21589) 'Extended Timestamp [UT]'\n-6DAB1   Length              0005 (5)\n-6DAB3   Flags               01 (1) 'Modification'\n-6DAB4   Modification Time   00000000 (0) 'Thu Jan  1 00:00:00 1970'\n-\n-6DAB8 CENTRAL HEADER #100   02014B50 (33639248)\n-6DABC Created Zip Spec      14 (20) '2.0'\n-6DABD Created OS            00 (0) 'MS-DOS'\n-6DABE Extract Zip Spec      14 (20) '2.0'\n-6DABF Extract OS            00 (0) 'MS-DOS'\n-6DAC0 General Purpose Flag  0008 (8)\n-      [Bit  3]              1 'Streamed'\n-6DAC2 Compression Method    0000 (0) 'Stored'\n-6DAC4 Modification Time     EC210000 (3961585664) 'Wed Jan  1 00:00:00 2098'\n-6DAC8 CRC                   DDD86D2D (3721948461)\n-6DACC Compressed Size       000006A3 (1699)\n-6DAD0 Uncompressed Size     000006A3 (1699)\n-6DAD4 Filename Length       0046 (70)\n-6DAD6 Extra Length          0009 (9)\n-6DAD8 Comment Length        0000 (0)\n-6DADA Disk Start            0000 (0)\n-6DADC Int File Attributes   0000 (0)\n-      [Bit 0]               0 'Binary Data'\n-6DADE Ext File Attributes   00000000 (0)\n-6DAE2 Local Header Offset   00045056 (282710)\n-6DAE6 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n-#\n-# WARNING: Offset 0x6DAE6: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n-#          Zero length filename\n-#\n-6DB2C Extra ID #1           5455 (21589) 'Extended Timestamp [UT]'\n-6DB2E   Length              0005 (5)\n-6DB30   Flags               01 (1) 'Modification'\n-6DB31   Modification Time   00000000 (0) 'Thu Jan  1 00:00:00 1970'\n-\n-6DB35 CENTRAL HEADER #101   02014B50 (33639248)\n-6DB39 Created Zip Spec      14 (20) '2.0'\n-6DB3A Created OS            00 (0) 'MS-DOS'\n-6DB3B Extract Zip Spec      14 (20) '2.0'\n-6DB3C Extract OS            00 (0) 'MS-DOS'\n-6DB3D General Purpose Flag  0000 (0)\n-6DB3F Compression Method    0000 (0) 'Stored'\n-6DB41 Modification Time     EC210000 (3961585664) 'Wed Jan  1 00:00:00 2098'\n-6DB45 CRC                   00000000 (0)\n-6DB49 Compressed Size       00000000 (0)\n-6DB4D Uncompressed Size     00000000 (0)\n-6DB51 Filename Length       0026 (38)\n-6DB53 Extra Length          0009 (9)\n-6DB55 Comment Length        0000 (0)\n-6DB57 Disk Start            0000 (0)\n-6DB59 Int File Attributes   0000 (0)\n-      [Bit 0]               0 'Binary Data'\n-6DB5B Ext File Attributes   00000000 (0)\n-6DB5F Local Header Offset   00045776 (284534)\n-6DB63 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n-#\n-# WARNING: Offset 0x6DB63: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n-#          Zero length filename\n-#\n-6DB89 Extra ID #1           5455 (21589) 'Extended Timestamp [UT]'\n-6DB8B   Length              0005 (5)\n-6DB8D   Flags               01 (1) 'Modification'\n-6DB8E   Modification Time   00000000 (0) 'Thu Jan  1 00:00:00 1970'\n-\n-6DB92 CENTRAL HEADER #102   02014B50 (33639248)\n-6DB96 Created Zip Spec      14 (20) '2.0'\n-6DB97 Created OS            00 (0) 'MS-DOS'\n-6DB98 Extract Zip Spec      14 (20) '2.0'\n-6DB99 Extract OS            00 (0) 'MS-DOS'\n-6DB9A General Purpose Flag  0008 (8)\n-      [Bit  3]              1 'Streamed'\n-6DB9C Compression Method    0000 (0) 'Stored'\n-6DB9E Modification Time     EC210000 (3961585664) 'Wed Jan  1 00:00:00 2098'\n-6DBA2 CRC                   F2CE052F (4073588015)\n-6DBA6 Compressed Size       00000F34 (3892)\n-6DBAA Uncompressed Size     00000F34 (3892)\n-6DBAE Filename Length       0047 (71)\n-6DBB0 Extra Length          0009 (9)\n-6DBB2 Comment Length        0000 (0)\n-6DBB4 Disk Start            0000 (0)\n-6DBB6 Int File Attributes   0000 (0)\n-      [Bit 0]               0 'Binary Data'\n-6DBB8 Ext File Attributes   00000000 (0)\n-6DBBC Local Header Offset   000457C3 (284611)\n-6DBC0 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n-#\n-# WARNING: Offset 0x6DBC0: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n-#          Zero length filename\n-#\n-6DC07 Extra ID #1           5455 (21589) 'Extended Timestamp [UT]'\n-6DC09   Length              0005 (5)\n-6DC0B   Flags               01 (1) 'Modification'\n-6DC0C   Modification Time   00000000 (0) 'Thu Jan  1 00:00:00 1970'\n-\n-6DC10 CENTRAL HEADER #103   02014B50 (33639248)\n-6DC14 Created Zip Spec      14 (20) '2.0'\n-6DC15 Created OS            00 (0) 'MS-DOS'\n-6DC16 Extract Zip Spec      14 (20) '2.0'\n-6DC17 Extract OS            00 (0) 'MS-DOS'\n-6DC18 General Purpose Flag  0008 (8)\n-      [Bit  3]              1 'Streamed'\n-6DC1A Compression Method    0000 (0) 'Stored'\n-6DC1C Modification Time     EC210000 (3961585664) 'Wed Jan  1 00:00:00 2098'\n-6DC20 CRC                   BF63BCF2 (3210984690)\n-6DC24 Compressed Size       00002BFC (11260)\n-6DC28 Uncompressed Size     00002BFC (11260)\n-6DC2C Filename Length       003B (59)\n-6DC2E Extra Length          0009 (9)\n-6DC30 Comment Length        0000 (0)\n-6DC32 Disk Start            0000 (0)\n-6DC34 Int File Attributes   0000 (0)\n-      [Bit 0]               0 'Binary Data'\n-6DC36 Ext File Attributes   00000000 (0)\n-6DC3A Local Header Offset   00046775 (288629)\n-6DC3E Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n-#\n-# WARNING: Offset 0x6DC3E: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n-#          Zero length filename\n-#\n-6DC79 Extra ID #1           5455 (21589) 'Extended Timestamp [UT]'\n-6DC7B   Length              0005 (5)\n-6DC7D   Flags               01 (1) 'Modification'\n-6DC7E   Modification Time   00000000 (0) 'Thu Jan  1 00:00:00 1970'\n-\n-6DC82 CENTRAL HEADER #104   02014B50 (33639248)\n-6DC86 Created Zip Spec      14 (20) '2.0'\n-6DC87 Created OS            00 (0) 'MS-DOS'\n-6DC88 Extract Zip Spec      14 (20) '2.0'\n-6DC89 Extract OS            00 (0) 'MS-DOS'\n-6DC8A General Purpose Flag  0008 (8)\n-      [Bit  3]              1 'Streamed'\n-6DC8C Compression Method    0000 (0) 'Stored'\n-6DC8E Modification Time     EC210000 (3961585664) 'Wed Jan  1 00:00:00 2098'\n-6DC92 CRC                   E2D6B20B (3805721099)\n-6DC96 Compressed Size       00000CC3 (3267)\n-6DC9A Uncompressed Size     00000CC3 (3267)\n-6DC9E Filename Length       004E (78)\n-6DCA0 Extra Length          0009 (9)\n-6DCA2 Comment Length        0000 (0)\n-6DCA4 Disk Start            0000 (0)\n-6DCA6 Int File Attributes   0000 (0)\n-      [Bit 0]               0 'Binary Data'\n-6DCA8 Ext File Attributes   00000000 (0)\n-6DCAC Local Header Offset   000493E3 (300003)\n-6DCB0 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n-#\n-# WARNING: Offset 0x6DCB0: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n-#          Zero length filename\n-#\n-6DCFE Extra ID #1           5455 (21589) 'Extended Timestamp [UT]'\n-6DD00   Length              0005 (5)\n-6DD02   Flags               01 (1) 'Modification'\n-6DD03   Modification Time   00000000 (0) 'Thu Jan  1 00:00:00 1970'\n-\n-6DD07 CENTRAL HEADER #105   02014B50 (33639248)\n-6DD0B Created Zip Spec      14 (20) '2.0'\n-6DD0C Created OS            00 (0) 'MS-DOS'\n-6DD0D Extract Zip Spec      14 (20) '2.0'\n-6DD0E Extract OS            00 (0) 'MS-DOS'\n-6DD0F General Purpose Flag  0008 (8)\n-      [Bit  3]              1 'Streamed'\n-6DD11 Compression Method    0000 (0) 'Stored'\n-6DD13 Modification Time     EC210000 (3961585664) 'Wed Jan  1 00:00:00 2098'\n-6DD17 CRC                   ACAF58B5 (2897172661)\n-6DD1B Compressed Size       00000394 (916)\n-6DD1F Uncompressed Size     00000394 (916)\n-6DD23 Filename Length       0042 (66)\n-6DD25 Extra Length          0009 (9)\n-6DD27 Comment Length        0000 (0)\n-6DD29 Disk Start            0000 (0)\n-6DD2B Int File Attributes   0000 (0)\n-      [Bit 0]               0 'Binary Data'\n-6DD2D Ext File Attributes   00000000 (0)\n-6DD31 Local Header Offset   0004A12B (303403)\n-6DD35 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n-#\n-# WARNING: Offset 0x6DD35: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n-#          Zero length filename\n-#\n-6DD77 Extra ID #1           5455 (21589) 'Extended Timestamp [UT]'\n-6DD79   Length              0005 (5)\n-6DD7B   Flags               01 (1) 'Modification'\n-6DD7C   Modification Time   00000000 (0) 'Thu Jan  1 00:00:00 1970'\n-\n-6DD80 CENTRAL HEADER #106   02014B50 (33639248)\n-6DD84 Created Zip Spec      14 (20) '2.0'\n-6DD85 Created OS            00 (0) 'MS-DOS'\n-6DD86 Extract Zip Spec      14 (20) '2.0'\n-6DD87 Extract OS            00 (0) 'MS-DOS'\n-6DD88 General Purpose Flag  0008 (8)\n-      [Bit  3]              1 'Streamed'\n-6DD8A Compression Method    0000 (0) 'Stored'\n-6DD8C Modification Time     EC210000 (3961585664) 'Wed Jan  1 00:00:00 2098'\n-6DD90 CRC                   963EDCDB (2520702171)\n-6DD94 Compressed Size       0000723A (29242)\n-6DD98 Uncompressed Size     0000723A (29242)\n-6DD9C Filename Length       003C (60)\n-6DD9E Extra Length          0009 (9)\n-6DDA0 Comment Length        0000 (0)\n-6DDA2 Disk Start            0000 (0)\n-6DDA4 Int File Attributes   0000 (0)\n-      [Bit 0]               0 'Binary Data'\n-6DDA6 Ext File Attributes   00000000 (0)\n-6DDAA Local Header Offset   0004A538 (304440)\n-6DDAE Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n-#\n-# WARNING: Offset 0x6DDAE: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n-#          Zero length filename\n-#\n-6DDEA Extra ID #1           5455 (21589) 'Extended Timestamp [UT]'\n-6DDEC   Length              0005 (5)\n-6DDEE   Flags               01 (1) 'Modification'\n-6DDEF   Modification Time   00000000 (0) 'Thu Jan  1 00:00:00 1970'\n-\n-6DDF3 CENTRAL HEADER #107   02014B50 (33639248)\n-6DDF7 Created Zip Spec      14 (20) '2.0'\n-6DDF8 Created OS            00 (0) 'MS-DOS'\n-6DDF9 Extract Zip Spec      14 (20) '2.0'\n-6DDFA Extract OS            00 (0) 'MS-DOS'\n-6DDFB General Purpose Flag  0008 (8)\n-      [Bit  3]              1 'Streamed'\n-6DDFD Compression Method    0000 (0) 'Stored'\n-6DDFF Modification Time     EC210000 (3961585664) 'Wed Jan  1 00:00:00 2098'\n-6DE03 CRC                   FA47221B (4198965787)\n-6DE07 Compressed Size       0000926E (37486)\n-6DE0B Uncompressed Size     0000926E (37486)\n-6DE0F Filename Length       003B (59)\n-6DE11 Extra Length          0009 (9)\n-6DE13 Comment Length        0000 (0)\n-6DE15 Disk Start            0000 (0)\n-6DE17 Int File Attributes   0000 (0)\n-      [Bit 0]               0 'Binary Data'\n-6DE19 Ext File Attributes   00000000 (0)\n-6DE1D Local Header Offset   000517E5 (333797)\n-6DE21 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n-#\n-# WARNING: Offset 0x6DE21: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n-#          Zero length filename\n-#\n-6DE5C Extra ID #1           5455 (21589) 'Extended Timestamp [UT]'\n-6DE5E   Length              0005 (5)\n-6DE60   Flags               01 (1) 'Modification'\n-6DE61   Modification Time   00000000 (0) 'Thu Jan  1 00:00:00 1970'\n-\n-6DE65 CENTRAL HEADER #108   02014B50 (33639248)\n-6DE69 Created Zip Spec      14 (20) '2.0'\n-6DE6A Created OS            00 (0) 'MS-DOS'\n-6DE6B Extract Zip Spec      14 (20) '2.0'\n-6DE6C Extract OS            00 (0) 'MS-DOS'\n-6DE6D General Purpose Flag  0008 (8)\n-      [Bit  3]              1 'Streamed'\n-6DE6F Compression Method    0000 (0) 'Stored'\n-6DE71 Modification Time     EC210000 (3961585664) 'Wed Jan  1 00:00:00 2098'\n-6DE75 CRC                   14A86D48 (346582344)\n-6DE79 Compressed Size       0000082F (2095)\n-6DE7D Uncompressed Size     0000082F (2095)\n-6DE81 Filename Length       0043 (67)\n-6DE83 Extra Length          0009 (9)\n-6DE85 Comment Length        0000 (0)\n-6DE87 Disk Start            0000 (0)\n-6DE89 Int File Attributes   0000 (0)\n-      [Bit 0]               0 'Binary Data'\n-6DE8B Ext File Attributes   00000000 (0)\n-6DE8F Local Header Offset   0005AAC5 (371397)\n-6DE93 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n-#\n-# WARNING: Offset 0x6DE93: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n-#          Zero length filename\n-#\n-6DED6 Extra ID #1           5455 (21589) 'Extended Timestamp [UT]'\n-6DED8   Length              0005 (5)\n-6DEDA   Flags               01 (1) 'Modification'\n-6DEDB   Modification Time   00000000 (0) 'Thu Jan  1 00:00:00 1970'\n-\n-6DEDF CENTRAL HEADER #109   02014B50 (33639248)\n-6DEE3 Created Zip Spec      14 (20) '2.0'\n-6DEE4 Created OS            00 (0) 'MS-DOS'\n-6DEE5 Extract Zip Spec      14 (20) '2.0'\n-6DEE6 Extract OS            00 (0) 'MS-DOS'\n-6DEE7 General Purpose Flag  0000 (0)\n-6DEE9 Compression Method    0000 (0) 'Stored'\n-6DEEB Modification Time     EC210000 (3961585664) 'Wed Jan  1 00:00:00 2098'\n-6DEEF CRC                   00000000 (0)\n-6DEF3 Compressed Size       00000000 (0)\n-6DEF7 Uncompressed Size     00000000 (0)\n-6DEFB Filename Length       0020 (32)\n-6DEFD Extra Length          0009 (9)\n-6DEFF Comment Length        0000 (0)\n-6DF01 Disk Start            0000 (0)\n-6DF03 Int File Attributes   0000 (0)\n-      [Bit 0]               0 'Binary Data'\n-6DF05 Ext File Attributes   00000000 (0)\n-6DF09 Local Header Offset   0005B36E (373614)\n-6DF0D Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n-#\n-# WARNING: Offset 0x6DF0D: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n-#          Zero length filename\n-#\n-6DF2D Extra ID #1           5455 (21589) 'Extended Timestamp [UT]'\n-6DF2F   Length              0005 (5)\n-6DF31   Flags               01 (1) 'Modification'\n-6DF32   Modification Time   00000000 (0) 'Thu Jan  1 00:00:00 1970'\n-\n-6DF36 CENTRAL HEADER #110   02014B50 (33639248)\n-6DF3A Created Zip Spec      14 (20) '2.0'\n-6DF3B Created OS            00 (0) 'MS-DOS'\n-6DF3C Extract Zip Spec      14 (20) '2.0'\n-6DF3D Extract OS            00 (0) 'MS-DOS'\n-6DF3E General Purpose Flag  0008 (8)\n-      [Bit  3]              1 'Streamed'\n-6DF40 Compression Method    0000 (0) 'Stored'\n-6DF42 Modification Time     EC210000 (3961585664) 'Wed Jan  1 00:00:00 2098'\n-6DF46 CRC                   A7748368 (2809430888)\n-6DF4A Compressed Size       00001148 (4424)\n-6DF4E Uncompressed Size     00001148 (4424)\n-6DF52 Filename Length       0036 (54)\n-6DF54 Extra Length          0009 (9)\n-6DF56 Comment Length        0000 (0)\n-6DF58 Disk Start            0000 (0)\n-6DF5A Int File Attributes   0000 (0)\n-      [Bit 0]               0 'Binary Data'\n-6DF5C Ext File Attributes   00000000 (0)\n-6DF60 Local Header Offset   0005B3B5 (373685)\n-6DF64 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n-#\n-# WARNING: Offset 0x6DF64: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n-#          Zero length filename\n-#\n-6DF9A Extra ID #1           5455 (21589) 'Extended Timestamp [UT]'\n-6DF9C   Length              0005 (5)\n-6DF9E   Flags               01 (1) 'Modification'\n-6DF9F   Modification Time   00000000 (0) 'Thu Jan  1 00:00:00 1970'\n-\n-6DFA3 CENTRAL HEADER #111   02014B50 (33639248)\n-6DFA7 Created Zip Spec      14 (20) '2.0'\n-6DFA8 Created OS            00 (0) 'MS-DOS'\n-6DFA9 Extract Zip Spec      14 (20) '2.0'\n-6DFAA Extract OS            00 (0) 'MS-DOS'\n-6DFAB General Purpose Flag  0008 (8)\n-      [Bit  3]              1 'Streamed'\n-6DFAD Compression Method    0000 (0) 'Stored'\n-6DFAF Modification Time     EC210000 (3961585664) 'Wed Jan  1 00:00:00 2098'\n-6DFB3 CRC                   5117C509 (1360512265)\n-6DFB7 Compressed Size       000005CF (1487)\n-6DFBB Uncompressed Size     000005CF (1487)\n-6DFBF Filename Length       0039 (57)\n-6DFC1 Extra Length          0009 (9)\n-6DFC3 Comment Length        0000 (0)\n-6DFC5 Disk Start            0000 (0)\n-6DFC7 Int File Attributes   0000 (0)\n-      [Bit 0]               0 'Binary Data'\n-6DFC9 Ext File Attributes   00000000 (0)\n-6DFCD Local Header Offset   0005C56A (378218)\n-6DFD1 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n-#\n-# WARNING: Offset 0x6DFD1: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n-#          Zero length filename\n-#\n-6E00A Extra ID #1           5455 (21589) 'Extended Timestamp [UT]'\n-6E00C   Length              0005 (5)\n-6E00E   Flags               01 (1) 'Modification'\n-6E00F   Modification Time   00000000 (0) 'Thu Jan  1 00:00:00 1970'\n-\n-6E013 CENTRAL HEADER #112   02014B50 (33639248)\n-6E017 Created Zip Spec      14 (20) '2.0'\n-6E018 Created OS            00 (0) 'MS-DOS'\n-6E019 Extract Zip Spec      14 (20) '2.0'\n-6E01A Extract OS            00 (0) 'MS-DOS'\n-6E01B General Purpose Flag  0008 (8)\n-      [Bit  3]              1 'Streamed'\n-6E01D Compression Method    0000 (0) 'Stored'\n-6E01F Modification Time     EC210000 (3961585664) 'Wed Jan  1 00:00:00 2098'\n-6E023 CRC                   FCC4145B (4240708699)\n-6E027 Compressed Size       000006E0 (1760)\n-6E02B Uncompressed Size     000006E0 (1760)\n-6E02F Filename Length       0039 (57)\n-6E031 Extra Length          0009 (9)\n-6E033 Comment Length        0000 (0)\n-6E035 Disk Start            0000 (0)\n-6E037 Int File Attributes   0000 (0)\n-      [Bit 0]               0 'Binary Data'\n-6E039 Ext File Attributes   00000000 (0)\n-6E03D Local Header Offset   0005CBA9 (379817)\n-6E041 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n-#\n-# WARNING: Offset 0x6E041: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n-#          Zero length filename\n-#\n-6E07A Extra ID #1           5455 (21589) 'Extended Timestamp [UT]'\n-6E07C   Length              0005 (5)\n-6E07E   Flags               01 (1) 'Modification'\n-6E07F   Modification Time   00000000 (0) 'Thu Jan  1 00:00:00 1970'\n-\n-6E083 CENTRAL HEADER #113   02014B50 (33639248)\n-6E087 Created Zip Spec      14 (20) '2.0'\n-6E088 Created OS            00 (0) 'MS-DOS'\n-6E089 Extract Zip Spec      14 (20) '2.0'\n-6E08A Extract OS            00 (0) 'MS-DOS'\n-6E08B General Purpose Flag  0008 (8)\n-      [Bit  3]              1 'Streamed'\n-6E08D Compression Method    0000 (0) 'Stored'\n-6E08F Modification Time     EC210000 (3961585664) 'Wed Jan  1 00:00:00 2098'\n-6E093 CRC                   A6BC7A6B (2797369963)\n-6E097 Compressed Size       000005DB (1499)\n-6E09B Uncompressed Size     000005DB (1499)\n-6E09F Filename Length       003B (59)\n-6E0A1 Extra Length          0009 (9)\n-6E0A3 Comment Length        0000 (0)\n-6E0A5 Disk Start            0000 (0)\n-6E0A7 Int File Attributes   0000 (0)\n-      [Bit 0]               0 'Binary Data'\n-6E0A9 Ext File Attributes   00000000 (0)\n-6E0AD Local Header Offset   0005D2F9 (381689)\n-6E0B1 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n-#\n-# WARNING: Offset 0x6E0B1: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n-#          Zero length filename\n-#\n-6E0EC Extra ID #1           5455 (21589) 'Extended Timestamp [UT]'\n-6E0EE   Length              0005 (5)\n-6E0F0   Flags               01 (1) 'Modification'\n-6E0F1   Modification Time   00000000 (0) 'Thu Jan  1 00:00:00 1970'\n-\n-6E0F5 CENTRAL HEADER #114   02014B50 (33639248)\n-6E0F9 Created Zip Spec      14 (20) '2.0'\n-6E0FA Created OS            00 (0) 'MS-DOS'\n-6E0FB Extract Zip Spec      14 (20) '2.0'\n-6E0FC Extract OS            00 (0) 'MS-DOS'\n-6E0FD General Purpose Flag  0008 (8)\n-      [Bit  3]              1 'Streamed'\n-6E0FF Compression Method    0000 (0) 'Stored'\n-6E101 Modification Time     EC210000 (3961585664) 'Wed Jan  1 00:00:00 2098'\n-6E105 CRC                   CDD77CC5 (3453451461)\n-6E109 Compressed Size       000006EA (1770)\n-6E10D Uncompressed Size     000006EA (1770)\n-6E111 Filename Length       003B (59)\n-6E113 Extra Length          0009 (9)\n-6E115 Comment Length        0000 (0)\n-6E117 Disk Start            0000 (0)\n-6E119 Int File Attributes   0000 (0)\n-      [Bit 0]               0 'Binary Data'\n-6E11B Ext File Attributes   00000000 (0)\n-6E11F Local Header Offset   0005D946 (383302)\n-6E123 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n-#\n-# WARNING: Offset 0x6E123: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n-#          Zero length filename\n-#\n-6E15E Extra ID #1           5455 (21589) 'Extended Timestamp [UT]'\n-6E160   Length              0005 (5)\n-6E162   Flags               01 (1) 'Modification'\n-6E163   Modification Time   00000000 (0) 'Thu Jan  1 00:00:00 1970'\n-\n-6E167 CENTRAL HEADER #115   02014B50 (33639248)\n-6E16B Created Zip Spec      14 (20) '2.0'\n-6E16C Created OS            00 (0) 'MS-DOS'\n-6E16D Extract Zip Spec      14 (20) '2.0'\n-6E16E Extract OS            00 (0) 'MS-DOS'\n-6E16F General Purpose Flag  0008 (8)\n-      [Bit  3]              1 'Streamed'\n-6E171 Compression Method    0000 (0) 'Stored'\n-6E173 Modification Time     EC210000 (3961585664) 'Wed Jan  1 00:00:00 2098'\n-6E177 CRC                   1D384067 (490225767)\n-6E17B Compressed Size       0000059E (1438)\n-6E17F Uncompressed Size     0000059E (1438)\n-6E183 Filename Length       0031 (49)\n-6E185 Extra Length          0009 (9)\n-6E187 Comment Length        0000 (0)\n-6E189 Disk Start            0000 (0)\n-6E18B Int File Attributes   0000 (0)\n-      [Bit 0]               0 'Binary Data'\n-6E18D Ext File Attributes   00000000 (0)\n-6E191 Local Header Offset   0005E0A2 (385186)\n-6E195 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n-#\n-# WARNING: Offset 0x6E195: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n-#          Zero length filename\n-#\n-6E1C6 Extra ID #1           5455 (21589) 'Extended Timestamp [UT]'\n-6E1C8   Length              0005 (5)\n-6E1CA   Flags               01 (1) 'Modification'\n-6E1CB   Modification Time   00000000 (0) 'Thu Jan  1 00:00:00 1970'\n-\n-6E1CF CENTRAL HEADER #116   02014B50 (33639248)\n-6E1D3 Created Zip Spec      14 (20) '2.0'\n-6E1D4 Created OS            00 (0) 'MS-DOS'\n-6E1D5 Extract Zip Spec      14 (20) '2.0'\n-6E1D6 Extract OS            00 (0) 'MS-DOS'\n-6E1D7 General Purpose Flag  0000 (0)\n-6E1D9 Compression Method    0000 (0) 'Stored'\n-6E1DB Modification Time     EC210000 (3961585664) 'Wed Jan  1 00:00:00 2098'\n-6E1DF CRC                   00000000 (0)\n-6E1E3 Compressed Size       00000000 (0)\n-6E1E7 Uncompressed Size     00000000 (0)\n-6E1EB Filename Length       0021 (33)\n-6E1ED Extra Length          0009 (9)\n-6E1EF Comment Length        0000 (0)\n-6E1F1 Disk Start            0000 (0)\n-6E1F3 Int File Attributes   0000 (0)\n-      [Bit 0]               0 'Binary Data'\n-6E1F5 Ext File Attributes   00000000 (0)\n-6E1F9 Local Header Offset   0005E6A8 (386728)\n-6E1FD Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n-#\n-# WARNING: Offset 0x6E1FD: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n-#          Zero length filename\n-#\n-6E21E Extra ID #1           5455 (21589) 'Extended Timestamp [UT]'\n-6E220   Length              0005 (5)\n-6E222   Flags               01 (1) 'Modification'\n-6E223   Modification Time   00000000 (0) 'Thu Jan  1 00:00:00 1970'\n-\n-6E227 CENTRAL HEADER #117   02014B50 (33639248)\n-6E22B Created Zip Spec      14 (20) '2.0'\n-6E22C Created OS            00 (0) 'MS-DOS'\n-6E22D Extract Zip Spec      14 (20) '2.0'\n-6E22E Extract OS            00 (0) 'MS-DOS'\n-6E22F General Purpose Flag  0008 (8)\n-      [Bit  3]              1 'Streamed'\n-6E231 Compression Method    0000 (0) 'Stored'\n-6E233 Modification Time     EC210000 (3961585664) 'Wed Jan  1 00:00:00 2098'\n-6E237 CRC                   F2E8FAB9 (4075354809)\n-6E23B Compressed Size       00000826 (2086)\n-6E23F Uncompressed Size     00000826 (2086)\n-6E243 Filename Length       003B (59)\n-6E245 Extra Length          0009 (9)\n-6E247 Comment Length        0000 (0)\n-6E249 Disk Start            0000 (0)\n-6E24B Int File Attributes   0000 (0)\n-      [Bit 0]               0 'Binary Data'\n-6E24D Ext File Attributes   00000000 (0)\n-6E251 Local Header Offset   0005E6F0 (386800)\n-6E255 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n-#\n-# WARNING: Offset 0x6E255: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n-#          Zero length filename\n-#\n-6E290 Extra ID #1           5455 (21589) 'Extended Timestamp [UT]'\n-6E292   Length              0005 (5)\n-6E294   Flags               01 (1) 'Modification'\n-6E295   Modification Time   00000000 (0) 'Thu Jan  1 00:00:00 1970'\n-\n-6E299 CENTRAL HEADER #118   02014B50 (33639248)\n-6E29D Created Zip Spec      14 (20) '2.0'\n-6E29E Created OS            00 (0) 'MS-DOS'\n-6E29F Extract Zip Spec      14 (20) '2.0'\n-6E2A0 Extract OS            00 (0) 'MS-DOS'\n-6E2A1 General Purpose Flag  0000 (0)\n-6E2A3 Compression Method    0000 (0) 'Stored'\n-6E2A5 Modification Time     EC210000 (3961585664) 'Wed Jan  1 00:00:00 2098'\n-6E2A9 CRC                   00000000 (0)\n-6E2AD Compressed Size       00000000 (0)\n-6E2B1 Uncompressed Size     00000000 (0)\n-6E2B5 Filename Length       0022 (34)\n-6E2B7 Extra Length          0009 (9)\n-6E2B9 Comment Length        0000 (0)\n-6E2BB Disk Start            0000 (0)\n-6E2BD Int File Attributes   0000 (0)\n-      [Bit 0]               0 'Binary Data'\n-6E2BF Ext File Attributes   00000000 (0)\n-6E2C3 Local Header Offset   0005EF88 (389000)\n-6E2C7 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n-#\n-# WARNING: Offset 0x6E2C7: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n-#          Zero length filename\n-#\n-6E2E9 Extra ID #1           5455 (21589) 'Extended Timestamp [UT]'\n-6E2EB   Length              0005 (5)\n-6E2ED   Flags               01 (1) 'Modification'\n-6E2EE   Modification Time   00000000 (0) 'Thu Jan  1 00:00:00 1970'\n-\n-6E2F2 CENTRAL HEADER #119   02014B50 (33639248)\n-6E2F6 Created Zip Spec      14 (20) '2.0'\n-6E2F7 Created OS            00 (0) 'MS-DOS'\n-6E2F8 Extract Zip Spec      14 (20) '2.0'\n-6E2F9 Extract OS            00 (0) 'MS-DOS'\n-6E2FA General Purpose Flag  0008 (8)\n-      [Bit  3]              1 'Streamed'\n-6E2FC Compression Method    0000 (0) 'Stored'\n-6E2FE Modification Time     EC210000 (3961585664) 'Wed Jan  1 00:00:00 2098'\n-6E302 CRC                   5DDCD4C5 (1574753477)\n-6E306 Compressed Size       0000537F (21375)\n-6E30A Uncompressed Size     0000537F (21375)\n-6E30E Filename Length       0037 (55)\n-6E310 Extra Length          0009 (9)\n-6E312 Comment Length        0000 (0)\n-6E314 Disk Start            0000 (0)\n-6E316 Int File Attributes   0000 (0)\n-      [Bit 0]               0 'Binary Data'\n-6E318 Ext File Attributes   00000000 (0)\n-6E31C Local Header Offset   0005EFD1 (389073)\n-6E320 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n-#\n-# WARNING: Offset 0x6E320: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n-#          Zero length filename\n-#\n-6E357 Extra ID #1           5455 (21589) 'Extended Timestamp [UT]'\n-6E359   Length              0005 (5)\n-6E35B   Flags               01 (1) 'Modification'\n-6E35C   Modification Time   00000000 (0) 'Thu Jan  1 00:00:00 1970'\n-\n-6E360 CENTRAL HEADER #120   02014B50 (33639248)\n-6E364 Created Zip Spec      14 (20) '2.0'\n-6E365 Created OS            00 (0) 'MS-DOS'\n-6E366 Extract Zip Spec      14 (20) '2.0'\n-6E367 Extract OS            00 (0) 'MS-DOS'\n-6E368 General Purpose Flag  0008 (8)\n-      [Bit  3]              1 'Streamed'\n-6E36A Compression Method    0000 (0) 'Stored'\n-6E36C Modification Time     EC210000 (3961585664) 'Wed Jan  1 00:00:00 2098'\n-6E370 CRC                   5BC81E29 (1539841577)\n-6E374 Compressed Size       00001D8A (7562)\n-6E378 Uncompressed Size     00001D8A (7562)\n-6E37C Filename Length       003E (62)\n-6E37E Extra Length          0009 (9)\n-6E380 Comment Length        0000 (0)\n-6E382 Disk Start            0000 (0)\n-6E384 Int File Attributes   0000 (0)\n-      [Bit 0]               0 'Binary Data'\n-6E386 Ext File Attributes   00000000 (0)\n-6E38A Local Header Offset   000643BE (410558)\n-6E38E Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n-#\n-# WARNING: Offset 0x6E38E: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n-#          Zero length filename\n-#\n-6E3CC Extra ID #1           5455 (21589) 'Extended Timestamp [UT]'\n-6E3CE   Length              0005 (5)\n-6E3D0   Flags               01 (1) 'Modification'\n-6E3D1   Modification Time   00000000 (0) 'Thu Jan  1 00:00:00 1970'\n-\n-6E3D5 CENTRAL HEADER #121   02014B50 (33639248)\n-6E3D9 Created Zip Spec      14 (20) '2.0'\n-6E3DA Created OS            00 (0) 'MS-DOS'\n-6E3DB Extract Zip Spec      14 (20) '2.0'\n-6E3DC Extract OS            00 (0) 'MS-DOS'\n-6E3DD General Purpose Flag  0008 (8)\n-      [Bit  3]              1 'Streamed'\n-6E3DF Compression Method    0000 (0) 'Stored'\n-6E3E1 Modification Time     EC210000 (3961585664) 'Wed Jan  1 00:00:00 2098'\n-6E3E5 CRC                   A266F3B2 (2724656050)\n-6E3E9 Compressed Size       0000462E (17966)\n-6E3ED Uncompressed Size     0000462E (17966)\n-6E3F1 Filename Length       0037 (55)\n-6E3F3 Extra Length          0009 (9)\n-6E3F5 Comment Length        0000 (0)\n-6E3F7 Disk Start            0000 (0)\n-6E3F9 Int File Attributes   0000 (0)\n-      [Bit 0]               0 'Binary Data'\n-6E3FB Ext File Attributes   00000000 (0)\n-6E3FF Local Header Offset   000661BD (418237)\n-6E403 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n-#\n-# WARNING: Offset 0x6E403: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n-#          Zero length filename\n-#\n-6E43A Extra ID #1           5455 (21589) 'Extended Timestamp [UT]'\n-6E43C   Length              0005 (5)\n-6E43E   Flags               01 (1) 'Modification'\n-6E43F   Modification Time   00000000 (0) 'Thu Jan  1 00:00:00 1970'\n-\n-6E443 CENTRAL HEADER #122   02014B50 (33639248)\n-6E447 Created Zip Spec      14 (20) '2.0'\n-6E448 Created OS            00 (0) 'MS-DOS'\n-6E449 Extract Zip Spec      14 (20) '2.0'\n-6E44A Extract OS            00 (0) 'MS-DOS'\n-6E44B General Purpose Flag  0008 (8)\n-      [Bit  3]              1 'Streamed'\n-6E44D Compression Method    0000 (0) 'Stored'\n-6E44F Modification Time     EC210000 (3961585664) 'Wed Jan  1 00:00:00 2098'\n-6E453 CRC                   952E3CF5 (2502835445)\n-6E457 Compressed Size       00000552 (1362)\n-6E45B Uncompressed Size     00000552 (1362)\n-6E45F Filename Length       0043 (67)\n-6E461 Extra Length          0009 (9)\n-6E463 Comment Length        0000 (0)\n-6E465 Disk Start            0000 (0)\n-6E467 Int File Attributes   0000 (0)\n-      [Bit 0]               0 'Binary Data'\n-6E469 Ext File Attributes   00000000 (0)\n-6E46D Local Header Offset   0006A859 (436313)\n-6E471 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n-#\n-# WARNING: Offset 0x6E471: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n-#          Zero length filename\n-#\n-6E4B4 Extra ID #1           5455 (21589) 'Extended Timestamp [UT]'\n-6E4B6   Length              0005 (5)\n-6E4B8   Flags               01 (1) 'Modification'\n-6E4B9   Modification Time   00000000 (0) 'Thu Jan  1 00:00:00 1970'\n-\n-6E4BD END CENTRAL HEADER    06054B50 (101010256)\n-6E4C1 Number of this disk   0000 (0)\n-6E4C3 Central Dir Disk no   0000 (0)\n-6E4C5 Entries in this disk  007A (122)\n-6E4C7 Total Entries         007A (122)\n-6E4C9 Size of Central Dir   00003698 (13976)\n-6E4CD Offset to Central Dir 0006AE25 (437797)\n-6E4D1 Comment Length        0000 (0)\n+041B3 DATA DESCRIPTOR       08074B50 (134695760)\n+041B7 CRC                   CDA6F1A6 (3450270118)\n+041BB Compressed Size       00000095 (149)\n+041BF Uncompressed Size     00000095 (149)\n+\n+041C3 LOCAL HEADER #13      04034B50 (67324752)\n+041C7 Extract Zip Spec      14 (20) '2.0'\n+041C8 Extract OS            00 (0) 'MS-DOS'\n+041C9 General Purpose Flag  0008 (8)\n+      [Bit  3]              1 'Streamed'\n+041CB Compression Method    0000 (0) 'Stored'\n+041CD Modification Time     EC210000 (3961585664) 'Wed Jan  1 00:00:00 2098'\n+041D1 CRC                   00000000 (0)\n+041D5 Compressed Size       00000000 (0)\n+041D9 Uncompressed Size     00000000 (0)\n+041DD Filename Length       0052 (82)\n+041DF Extra Length          0009 (9)\n+041E1 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+#\n+# WARNING: Offset 0x41E1: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+#          Zero length filename\n+#\n+04233 Extra ID #1           5455 (21589) 'Extended Timestamp [UT]'\n+04235   Length              0005 (5)\n+04237   Flags               01 (1) 'Modification'\n+04238   Modification Time   00000000 (0) 'Thu Jan  1 00:00:00 1970'\n+0423C PAYLOAD               XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX\n+\n+04285 DATA DESCRIPTOR       08074B50 (134695760)\n+04289 CRC                   290EDBFF (688839679)\n+0428D Compressed Size       00000049 (73)\n+04291 Uncompressed Size     00000049 (73)\n+\n+04295 LOCAL HEADER #14      04034B50 (67324752)\n+04299 Extract Zip Spec      14 (20) '2.0'\n+0429A Extract OS            00 (0) 'MS-DOS'\n+0429B General Purpose Flag  0008 (8)\n+      [Bit  3]              1 'Streamed'\n+0429D Compression Method    0000 (0) 'Stored'\n+0429F Modification Time     EC210000 (3961585664) 'Wed Jan  1 00:00:00 2098'\n+042A3 CRC                   00000000 (0)\n+042A7 Compressed Size       00000000 (0)\n+042AB Uncompressed Size     00000000 (0)\n+042AF Filename Length       0049 (73)\n+042B1 Extra Length          0009 (9)\n+042B3 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+#\n+# WARNING: Offset 0x42B3: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+#          Zero length filename\n+#\n+042FC Extra ID #1           5455 (21589) 'Extended Timestamp [UT]'\n+042FE   Length              0005 (5)\n+04300   Flags               01 (1) 'Modification'\n+04301   Modification Time   00000000 (0) 'Thu Jan  1 00:00:00 1970'\n+04305 PAYLOAD               XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX\n+\n+04345 DATA DESCRIPTOR       08074B50 (134695760)\n+04349 CRC                   1BD83592 (467154322)\n+0434D Compressed Size       00000040 (64)\n+04351 Uncompressed Size     00000040 (64)\n+\n+04355 LOCAL HEADER #15      04034B50 (67324752)\n+04359 Extract Zip Spec      14 (20) '2.0'\n+0435A Extract OS            00 (0) 'MS-DOS'\n+0435B General Purpose Flag  0008 (8)\n+      [Bit  3]              1 'Streamed'\n+0435D Compression Method    0000 (0) 'Stored'\n+0435F Modification Time     EC210000 (3961585664) 'Wed Jan  1 00:00:00 2098'\n+04363 CRC                   00000000 (0)\n+04367 Compressed Size       00000000 (0)\n+0436B Uncompressed Size     00000000 (0)\n+0436F Filename Length       0050 (80)\n+04371 Extra Length          0009 (9)\n+04373 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+#\n+# WARNING: Offset 0x4373: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+#          Zero length filename\n+#\n+043C3 Extra ID #1           5455 (21589) 'Extended Timestamp [UT]'\n+043C5   Length              0005 (5)\n+043C7   Flags               01 (1) 'Modification'\n+043C8   Modification Time   00000000 (0) 'Thu Jan  1 00:00:00 1970'\n+043CC PAYLOAD               XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX\n+\n+04413 DATA DESCRIPTOR       08074B50 (134695760)\n+04417 CRC                   C6FA5A39 (3338295865)\n+0441B Compressed Size       00000047 (71)\n+0441F Uncompressed Size     00000047 (71)\n+\n+04423 LOCAL HEADER #16      04034B50 (67324752)\n+04427 Extract Zip Spec      14 (20) '2.0'\n+04428 Extract OS            00 (0) 'MS-DOS'\n+04429 General Purpose Flag  0008 (8)\n+      [Bit  3]              1 'Streamed'\n+0442B Compression Method    0000 (0) 'Stored'\n+0442D Modification Time     EC210000 (3961585664) 'Wed Jan  1 00:00:00 2098'\n+04431 CRC                   00000000 (0)\n+04435 Compressed Size       00000000 (0)\n+04439 Uncompressed Size     00000000 (0)\n+0443D Filename Length       0052 (82)\n+0443F Extra Length          0009 (9)\n+04441 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+#\n+# WARNING: Offset 0x4441: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+#          Zero length filename\n+#\n+04493 Extra ID #1           5455 (21589) 'Extended Timestamp [UT]'\n+04495   Length              0005 (5)\n+04497   Flags               01 (1) 'Modification'\n+04498   Modification Time   00000000 (0) 'Thu Jan  1 00:00:00 1970'\n+0449C PAYLOAD\n+\n+046DA DATA DESCRIPTOR       08074B50 (134695760)\n+046DE CRC                   059BF276 (94106230)\n+046E2 Compressed Size       0000023E (574)\n+046E6 Uncompressed Size     0000023E (574)\n+\n+046EA LOCAL HEADER #17      04034B50 (67324752)\n+046EE Extract Zip Spec      14 (20) '2.0'\n+046EF Extract OS            00 (0) 'MS-DOS'\n+046F0 General Purpose Flag  0008 (8)\n+      [Bit  3]              1 'Streamed'\n+046F2 Compression Method    0000 (0) 'Stored'\n+046F4 Modification Time     EC210000 (3961585664) 'Wed Jan  1 00:00:00 2098'\n+046F8 CRC                   00000000 (0)\n+046FC Compressed Size       00000000 (0)\n+04700 Uncompressed Size     00000000 (0)\n+04704 Filename Length       005B (91)\n+04706 Extra Length          0009 (9)\n+04708 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+#\n+# WARNING: Offset 0x4708: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+#          Zero length filename\n+#\n+04763 Extra ID #1           5455 (21589) 'Extended Timestamp [UT]'\n+04765   Length              0005 (5)\n+04767   Flags               01 (1) 'Modification'\n+04768   Modification Time   00000000 (0) 'Thu Jan  1 00:00:00 1970'\n+0476C PAYLOAD               XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX\n+                            XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX\n+\n+0481D DATA DESCRIPTOR       08074B50 (134695760)\n+04821 CRC                   043D8CD3 (71142611)\n+04825 Compressed Size       000000B1 (177)\n+04829 Uncompressed Size     000000B1 (177)\n+\n+0482D LOCAL HEADER #18      04034B50 (67324752)\n+04831 Extract Zip Spec      14 (20) '2.0'\n+04832 Extract OS            00 (0) 'MS-DOS'\n+04833 General Purpose Flag  0008 (8)\n+      [Bit  3]              1 'Streamed'\n+04835 Compression Method    0000 (0) 'Stored'\n+04837 Modification Time     EC210000 (3961585664) 'Wed Jan  1 00:00:00 2098'\n+0483B CRC                   00000000 (0)\n+0483F Compressed Size       00000000 (0)\n+04843 Uncompressed Size     00000000 (0)\n+04847 Filename Length       005B (91)\n+04849 Extra Length          0009 (9)\n+0484B Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+#\n+# WARNING: Offset 0x484B: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+#          Zero length filename\n+#\n+048A6 Extra ID #1           5455 (21589) 'Extended Timestamp [UT]'\n+048A8   Length              0005 (5)\n+048AA   Flags               01 (1) 'Modification'\n+048AB   Modification Time   00000000 (0) 'Thu Jan  1 00:00:00 1970'\n+048AF PAYLOAD               XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX\n+\n+04903 DATA DESCRIPTOR       08074B50 (134695760)\n+04907 CRC                   A49FCF77 (2761936759)\n+0490B Compressed Size       00000054 (84)\n+0490F Uncompressed Size     00000054 (84)\n+\n+04913 LOCAL HEADER #19      04034B50 (67324752)\n+04917 Extract Zip Spec      14 (20) '2.0'\n+04918 Extract OS            00 (0) 'MS-DOS'\n+04919 General Purpose Flag  0008 (8)\n+      [Bit  3]              1 'Streamed'\n+0491B Compression Method    0000 (0) 'Stored'\n+0491D Modification Time     EC210000 (3961585664) 'Wed Jan  1 00:00:00 2098'\n+04921 CRC                   00000000 (0)\n+04925 Compressed Size       00000000 (0)\n+04929 Uncompressed Size     00000000 (0)\n+0492D Filename Length       005D (93)\n+0492F Extra Length          0009 (9)\n+04931 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+#\n+# WARNING: Offset 0x4931: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+#          Zero length filename\n+#\n+0498E Extra ID #1           5455 (21589) 'Extended Timestamp [UT]'\n+04990   Length              0005 (5)\n+04992   Flags               01 (1) 'Modification'\n+04993   Modification Time   00000000 (0) 'Thu Jan  1 00:00:00 1970'\n+04997 PAYLOAD               XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX\n+\n+049EB DATA DESCRIPTOR       08074B50 (134695760)\n+049EF CRC                   F515114D (4111798605)\n+049F3 Compressed Size       00000054 (84)\n+049F7 Uncompressed Size     00000054 (84)\n+\n+049FB LOCAL HEADER #20      04034B50 (67324752)\n+049FF Extract Zip Spec      14 (20) '2.0'\n+04A00 Extract OS            00 (0) 'MS-DOS'\n+04A01 General Purpose Flag  0008 (8)\n+      [Bit  3]              1 'Streamed'\n+04A03 Compression Method    0000 (0) 'Stored'\n+04A05 Modification Time     EC210000 (3961585664) 'Wed Jan  1 00:00:00 2098'\n+04A09 CRC                   00000000 (0)\n+04A0D Compressed Size       00000000 (0)\n+04A11 Uncompressed Size     00000000 (0)\n+04A15 Filename Length       0059 (89)\n+04A17 Extra Length          0009 (9)\n+04A19 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+#\n+# WARNING: Offset 0x4A19: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+#          Zero length filename\n+#\n+04A72 Extra ID #1           5455 (21589) 'Extended Timestamp [UT]'\n+04A74   Length              0005 (5)\n+04A76   Flags               01 (1) 'Modification'\n+04A77   Modification Time   00000000 (0) 'Thu Jan  1 00:00:00 1970'\n+04A7B PAYLOAD               XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX\n+\n+04AC9 DATA DESCRIPTOR       08074B50 (134695760)\n+04ACD CRC                   285254BA (676484282)\n+04AD1 Compressed Size       0000004E (78)\n+04AD5 Uncompressed Size     0000004E (78)\n+\n+04AD9 LOCAL HEADER #21      04034B50 (67324752)\n+04ADD Extract Zip Spec      14 (20) '2.0'\n+04ADE Extract OS            00 (0) 'MS-DOS'\n+04ADF General Purpose Flag  0008 (8)\n+      [Bit  3]              1 'Streamed'\n+04AE1 Compression Method    0000 (0) 'Stored'\n+04AE3 Modification Time     EC210000 (3961585664) 'Wed Jan  1 00:00:00 2098'\n+04AE7 CRC                   00000000 (0)\n+04AEB Compressed Size       00000000 (0)\n+04AEF Uncompressed Size     00000000 (0)\n+04AF3 Filename Length       0056 (86)\n+04AF5 Extra Length          0009 (9)\n+04AF7 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+#\n+# WARNING: Offset 0x4AF7: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+#          Zero length filename\n+#\n+04B4D Extra ID #1           5455 (21589) 'Extended Timestamp [UT]'\n+04B4F   Length              0005 (5)\n+04B51   Flags               01 (1) 'Modification'\n+04B52   Modification Time   00000000 (0) 'Thu Jan  1 00:00:00 1970'\n+04B56 PAYLOAD               XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX\n+\n+04BA0 DATA DESCRIPTOR       08074B50 (134695760)\n+04BA4 CRC                   9DAB4985 (2645248389)\n+04BA8 Compressed Size       0000004A (74)\n+04BAC Uncompressed Size     0000004A (74)\n+\n+04BB0 LOCAL HEADER #22      04034B50 (67324752)\n+04BB4 Extract Zip Spec      14 (20) '2.0'\n+04BB5 Extract OS            00 (0) 'MS-DOS'\n+04BB6 General Purpose Flag  0008 (8)\n+      [Bit  3]              1 'Streamed'\n+04BB8 Compression Method    0000 (0) 'Stored'\n+04BBA Modification Time     EC210000 (3961585664) 'Wed Jan  1 00:00:00 2098'\n+04BBE CRC                   00000000 (0)\n+04BC2 Compressed Size       00000000 (0)\n+04BC6 Uncompressed Size     00000000 (0)\n+04BCA Filename Length       0035 (53)\n+04BCC Extra Length          0009 (9)\n+04BCE Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+#\n+# WARNING: Offset 0x4BCE: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+#          Zero length filename\n+#\n+04C03 Extra ID #1           5455 (21589) 'Extended Timestamp [UT]'\n+04C05   Length              0005 (5)\n+04C07   Flags               01 (1) 'Modification'\n+04C08   Modification Time   00000000 (0) 'Thu Jan  1 00:00:00 1970'\n+04C0C PAYLOAD               XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX\n+                            XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX\n+\n+04CB1 DATA DESCRIPTOR       08074B50 (134695760)\n+04CB5 CRC                   B5A015DF (3047167455)\n+04CB9 Compressed Size       000000A5 (165)\n+04CBD Uncompressed Size     000000A5 (165)\n+\n+04CC1 LOCAL HEADER #23      04034B50 (67324752)\n+04CC5 Extract Zip Spec      14 (20) '2.0'\n+04CC6 Extract OS            00 (0) 'MS-DOS'\n+04CC7 General Purpose Flag  0000 (0)\n+04CC9 Compression Method    0000 (0) 'Stored'\n+04CCB Modification Time     EC210000 (3961585664) 'Wed Jan  1 00:00:00 2098'\n+04CCF CRC                   00000000 (0)\n+04CD3 Compressed Size       00000000 (0)\n+04CD7 Uncompressed Size     00000000 (0)\n+04CDB Filename Length       000F (15)\n+04CDD Extra Length          0009 (9)\n+04CDF Filename              'XXXXXXXXXXXXXXX'\n+#\n+# WARNING: Offset 0x4CDF: Filename 'XXXXXXXXXXXXXXX'\n+#          Zero length filename\n+#\n+04CEE Extra ID #1           5455 (21589) 'Extended Timestamp [UT]'\n+04CF0   Length              0005 (5)\n+04CF2   Flags               01 (1) 'Modification'\n+04CF3   Modification Time   00000000 (0) 'Thu Jan  1 00:00:00 1970'\n+\n+04CF7 LOCAL HEADER #24      04034B50 (67324752)\n+04CFB Extract Zip Spec      14 (20) '2.0'\n+04CFC Extract OS            00 (0) 'MS-DOS'\n+04CFD General Purpose Flag  0000 (0)\n+04CFF Compression Method    0000 (0) 'Stored'\n+04D01 Modification Time     EC210000 (3961585664) 'Wed Jan  1 00:00:00 2098'\n+04D05 CRC                   00000000 (0)\n+04D09 Compressed Size       00000000 (0)\n+04D0D Uncompressed Size     00000000 (0)\n+04D11 Filename Length       0020 (32)\n+04D13 Extra Length          0009 (9)\n+04D15 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+#\n+# WARNING: Offset 0x4D15: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+#          Zero length filename\n+#\n+04D35 Extra ID #1           5455 (21589) 'Extended Timestamp [UT]'\n+04D37   Length              0005 (5)\n+04D39   Flags               01 (1) 'Modification'\n+04D3A   Modification Time   00000000 (0) 'Thu Jan  1 00:00:00 1970'\n+\n+04D3E LOCAL HEADER #25      04034B50 (67324752)\n+04D42 Extract Zip Spec      14 (20) '2.0'\n+04D43 Extract OS            00 (0) 'MS-DOS'\n+04D44 General Purpose Flag  0000 (0)\n+04D46 Compression Method    0000 (0) 'Stored'\n+04D48 Modification Time     EC210000 (3961585664) 'Wed Jan  1 00:00:00 2098'\n+04D4C CRC                   00000000 (0)\n+04D50 Compressed Size       00000000 (0)\n+04D54 Uncompressed Size     00000000 (0)\n+04D58 Filename Length       0033 (51)\n+04D5A Extra Length          0009 (9)\n+04D5C Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+#\n+# WARNING: Offset 0x4D5C: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+#          Zero length filename\n+#\n+04D8F Extra ID #1           5455 (21589) 'Extended Timestamp [UT]'\n+04D91   Length              0005 (5)\n+04D93   Flags               01 (1) 'Modification'\n+04D94   Modification Time   00000000 (0) 'Thu Jan  1 00:00:00 1970'\n+\n+04D98 LOCAL HEADER #26      04034B50 (67324752)\n+04D9C Extract Zip Spec      14 (20) '2.0'\n+04D9D Extract OS            00 (0) 'MS-DOS'\n+04D9E General Purpose Flag  0008 (8)\n+      [Bit  3]              1 'Streamed'\n+04DA0 Compression Method    0000 (0) 'Stored'\n+04DA2 Modification Time     EC210000 (3961585664) 'Wed Jan  1 00:00:00 2098'\n+04DA6 CRC                   00000000 (0)\n+04DAA Compressed Size       00000000 (0)\n+04DAE Uncompressed Size     00000000 (0)\n+04DB2 Filename Length       0041 (65)\n+04DB4 Extra Length          0009 (9)\n+04DB6 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+#\n+# WARNING: Offset 0x4DB6: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+#          Zero length filename\n+#\n+04DF7 Extra ID #1           5455 (21589) 'Extended Timestamp [UT]'\n+04DF9   Length              0005 (5)\n+04DFB   Flags               01 (1) 'Modification'\n+04DFC   Modification Time   00000000 (0) 'Thu Jan  1 00:00:00 1970'\n+\n+04E00 DATA DESCRIPTOR       08074B50 (134695760)\n+04E04 CRC                   00000000 (0)\n+04E08 Compressed Size       00000000 (0)\n+04E0C Uncompressed Size     00000000 (0)\n+\n+04E10 LOCAL HEADER #27      04034B50 (67324752)\n+04E14 Extract Zip Spec      14 (20) '2.0'\n+04E15 Extract OS            00 (0) 'MS-DOS'\n+04E16 General Purpose Flag  0008 (8)\n+      [Bit  3]              1 'Streamed'\n+04E18 Compression Method    0000 (0) 'Stored'\n+04E1A Modification Time     EC210000 (3961585664) 'Wed Jan  1 00:00:00 2098'\n+04E1E CRC                   00000000 (0)\n+04E22 Compressed Size       00000000 (0)\n+04E26 Uncompressed Size     00000000 (0)\n+04E2A Filename Length       003A (58)\n+04E2C Extra Length          0009 (9)\n+04E2E Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+#\n+# WARNING: Offset 0x4E2E: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+#          Zero length filename\n+#\n+04E68 Extra ID #1           5455 (21589) 'Extended Timestamp [UT]'\n+04E6A   Length              0005 (5)\n+04E6C   Flags               01 (1) 'Modification'\n+04E6D   Modification Time   00000000 (0) 'Thu Jan  1 00:00:00 1970'\n+04E71 PAYLOAD\n+\n+05B0A DATA DESCRIPTOR       08074B50 (134695760)\n+05B0E CRC                   C9D6A7C1 (3386288065)\n+05B12 Compressed Size       00000C99 (3225)\n+05B16 Uncompressed Size     00000C99 (3225)\n+\n+05B1A LOCAL HEADER #28      04034B50 (67324752)\n+05B1E Extract Zip Spec      14 (20) '2.0'\n+05B1F Extract OS            00 (0) 'MS-DOS'\n+05B20 General Purpose Flag  0000 (0)\n+05B22 Compression Method    0000 (0) 'Stored'\n+05B24 Modification Time     EC210000 (3961585664) 'Wed Jan  1 00:00:00 2098'\n+05B28 CRC                   00000000 (0)\n+05B2C Compressed Size       00000000 (0)\n+05B30 Uncompressed Size     00000000 (0)\n+05B34 Filename Length       0004 (4)\n+05B36 Extra Length          0009 (9)\n+05B38 Filename              'XXXX'\n+#\n+# WARNING: Offset 0x5B38: Filename 'XXXX'\n+#          Zero length filename\n+#\n+05B3C Extra ID #1           5455 (21589) 'Extended Timestamp [UT]'\n+05B3E   Length              0005 (5)\n+05B40   Flags               01 (1) 'Modification'\n+05B41   Modification Time   00000000 (0) 'Thu Jan  1 00:00:00 1970'\n+\n+05B45 LOCAL HEADER #29      04034B50 (67324752)\n+05B49 Extract Zip Spec      14 (20) '2.0'\n+05B4A Extract OS            00 (0) 'MS-DOS'\n+05B4B General Purpose Flag  0000 (0)\n+05B4D Compression Method    0000 (0) 'Stored'\n+05B4F Modification Time     EC210000 (3961585664) 'Wed Jan  1 00:00:00 2098'\n+05B53 CRC                   00000000 (0)\n+05B57 Compressed Size       00000000 (0)\n+05B5B Uncompressed Size     00000000 (0)\n+05B5F Filename Length       000B (11)\n+05B61 Extra Length          0009 (9)\n+05B63 Filename              'XXXXXXXXXXX'\n+#\n+# WARNING: Offset 0x5B63: Filename 'XXXXXXXXXXX'\n+#          Zero length filename\n+#\n+05B6E Extra ID #1           5455 (21589) 'Extended Timestamp [UT]'\n+05B70   Length              0005 (5)\n+05B72   Flags               01 (1) 'Modification'\n+05B73   Modification Time   00000000 (0) 'Thu Jan  1 00:00:00 1970'\n+\n+05B77 LOCAL HEADER #30      04034B50 (67324752)\n+05B7B Extract Zip Spec      14 (20) '2.0'\n+05B7C Extract OS            00 (0) 'MS-DOS'\n+05B7D General Purpose Flag  0000 (0)\n+05B7F Compression Method    0000 (0) 'Stored'\n+05B81 Modification Time     EC210000 (3961585664) 'Wed Jan  1 00:00:00 2098'\n+05B85 CRC                   00000000 (0)\n+05B89 Compressed Size       00000000 (0)\n+05B8D Uncompressed Size     00000000 (0)\n+05B91 Filename Length       0011 (17)\n+05B93 Extra Length          0009 (9)\n+05B95 Filename              'XXXXXXXXXXXXXXXXX'\n+#\n+# WARNING: Offset 0x5B95: Filename 'XXXXXXXXXXXXXXXXX'\n+#          Zero length filename\n+#\n+05BA6 Extra ID #1           5455 (21589) 'Extended Timestamp [UT]'\n+05BA8   Length              0005 (5)\n+05BAA   Flags               01 (1) 'Modification'\n+05BAB   Modification Time   00000000 (0) 'Thu Jan  1 00:00:00 1970'\n+\n+05BAF LOCAL HEADER #31      04034B50 (67324752)\n+05BB3 Extract Zip Spec      14 (20) '2.0'\n+05BB4 Extract OS            00 (0) 'MS-DOS'\n+05BB5 General Purpose Flag  0000 (0)\n+05BB7 Compression Method    0000 (0) 'Stored'\n+05BB9 Modification Time     EC210000 (3961585664) 'Wed Jan  1 00:00:00 2098'\n+05BBD CRC                   00000000 (0)\n+05BC1 Compressed Size       00000000 (0)\n+05BC5 Uncompressed Size     00000000 (0)\n+05BC9 Filename Length       001A (26)\n+05BCB Extra Length          0009 (9)\n+05BCD Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXX'\n+#\n+# WARNING: Offset 0x5BCD: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXX'\n+#          Zero length filename\n+#\n+05BE7 Extra ID #1           5455 (21589) 'Extended Timestamp [UT]'\n+05BE9   Length              0005 (5)\n+05BEB   Flags               01 (1) 'Modification'\n+05BEC   Modification Time   00000000 (0) 'Thu Jan  1 00:00:00 1970'\n+\n+05BF0 LOCAL HEADER #32      04034B50 (67324752)\n+05BF4 Extract Zip Spec      14 (20) '2.0'\n+05BF5 Extract OS            00 (0) 'MS-DOS'\n+05BF6 General Purpose Flag  0008 (8)\n+      [Bit  3]              1 'Streamed'\n+05BF8 Compression Method    0000 (0) 'Stored'\n+05BFA Modification Time     EC210000 (3961585664) 'Wed Jan  1 00:00:00 2098'\n+05BFE CRC                   00000000 (0)\n+05C02 Compressed Size       00000000 (0)\n+05C06 Uncompressed Size     00000000 (0)\n+05C0A Filename Length       002E (46)\n+05C0C Extra Length          0009 (9)\n+05C0E Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+#\n+# WARNING: Offset 0x5C0E: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+#          Zero length filename\n+#\n+05C3C Extra ID #1           5455 (21589) 'Extended Timestamp [UT]'\n+05C3E   Length              0005 (5)\n+05C40   Flags               01 (1) 'Modification'\n+05C41   Modification Time   00000000 (0) 'Thu Jan  1 00:00:00 1970'\n+05C45 PAYLOAD\n+\n+06189 DATA DESCRIPTOR       08074B50 (134695760)\n+0618D CRC                   D8E4F331 (3638883121)\n+06191 Compressed Size       00000544 (1348)\n+06195 Uncompressed Size     00000544 (1348)\n+\n+06199 LOCAL HEADER #33      04034B50 (67324752)\n+0619D Extract Zip Spec      14 (20) '2.0'\n+0619E Extract OS            00 (0) 'MS-DOS'\n+0619F General Purpose Flag  0008 (8)\n+      [Bit  3]              1 'Streamed'\n+061A1 Compression Method    0000 (0) 'Stored'\n+061A3 Modification Time     EC210000 (3961585664) 'Wed Jan  1 00:00:00 2098'\n+061A7 CRC                   00000000 (0)\n+061AB Compressed Size       00000000 (0)\n+061AF Uncompressed Size     00000000 (0)\n+061B3 Filename Length       0028 (40)\n+061B5 Extra Length          0009 (9)\n+061B7 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+#\n+# WARNING: Offset 0x61B7: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+#          Zero length filename\n+#\n+061DF Extra ID #1           5455 (21589) 'Extended Timestamp [UT]'\n+061E1   Length              0005 (5)\n+061E3   Flags               01 (1) 'Modification'\n+061E4   Modification Time   00000000 (0) 'Thu Jan  1 00:00:00 1970'\n+061E8 PAYLOAD\n+\n+06CB5 DATA DESCRIPTOR       08074B50 (134695760)\n+06CB9 CRC                   C7E99B2E (3353975598)\n+06CBD Compressed Size       00000ACD (2765)\n+06CC1 Uncompressed Size     00000ACD (2765)\n+\n+06CC5 LOCAL HEADER #34      04034B50 (67324752)\n+06CC9 Extract Zip Spec      14 (20) '2.0'\n+06CCA Extract OS            00 (0) 'MS-DOS'\n+06CCB General Purpose Flag  0008 (8)\n+      [Bit  3]              1 'Streamed'\n+06CCD Compression Method    0000 (0) 'Stored'\n+06CCF Modification Time     EC210000 (3961585664) 'Wed Jan  1 00:00:00 2098'\n+06CD3 CRC                   00000000 (0)\n+06CD7 Compressed Size       00000000 (0)\n+06CDB Uncompressed Size     00000000 (0)\n+06CDF Filename Length       0036 (54)\n+06CE1 Extra Length          0009 (9)\n+06CE3 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+#\n+# WARNING: Offset 0x6CE3: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+#          Zero length filename\n+#\n+06D19 Extra ID #1           5455 (21589) 'Extended Timestamp [UT]'\n+06D1B   Length              0005 (5)\n+06D1D   Flags               01 (1) 'Modification'\n+06D1E   Modification Time   00000000 (0) 'Thu Jan  1 00:00:00 1970'\n+06D22 PAYLOAD\n+\n+081D9 DATA DESCRIPTOR       08074B50 (134695760)\n+081DD CRC                   A4BC4964 (2763802980)\n+081E1 Compressed Size       000014B7 (5303)\n+081E5 Uncompressed Size     000014B7 (5303)\n+\n+081E9 LOCAL HEADER #35      04034B50 (67324752)\n+081ED Extract Zip Spec      14 (20) '2.0'\n+081EE Extract OS            00 (0) 'MS-DOS'\n+081EF General Purpose Flag  0008 (8)\n+      [Bit  3]              1 'Streamed'\n+081F1 Compression Method    0000 (0) 'Stored'\n+081F3 Modification Time     EC210000 (3961585664) 'Wed Jan  1 00:00:00 2098'\n+081F7 CRC                   00000000 (0)\n+081FB Compressed Size       00000000 (0)\n+081FF Uncompressed Size     00000000 (0)\n+08203 Filename Length       002D (45)\n+08205 Extra Length          0009 (9)\n+08207 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+#\n+# WARNING: Offset 0x8207: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+#          Zero length filename\n+#\n+08234 Extra ID #1           5455 (21589) 'Extended Timestamp [UT]'\n+08236   Length              0005 (5)\n+08238   Flags               01 (1) 'Modification'\n+08239   Modification Time   00000000 (0) 'Thu Jan  1 00:00:00 1970'\n+0823D PAYLOAD\n+\n+08C71 DATA DESCRIPTOR       08074B50 (134695760)\n+08C75 CRC                   4C19B653 (1276753491)\n+08C79 Compressed Size       00000A34 (2612)\n+08C7D Uncompressed Size     00000A34 (2612)\n+\n+08C81 LOCAL HEADER #36      04034B50 (67324752)\n+08C85 Extract Zip Spec      14 (20) '2.0'\n+08C86 Extract OS            00 (0) 'MS-DOS'\n+08C87 General Purpose Flag  0008 (8)\n+      [Bit  3]              1 'Streamed'\n+08C89 Compression Method    0000 (0) 'Stored'\n+08C8B Modification Time     EC210000 (3961585664) 'Wed Jan  1 00:00:00 2098'\n+08C8F CRC                   00000000 (0)\n+08C93 Compressed Size       00000000 (0)\n+08C97 Uncompressed Size     00000000 (0)\n+08C9B Filename Length       0027 (39)\n+08C9D Extra Length          0009 (9)\n+08C9F Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+#\n+# WARNING: Offset 0x8C9F: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+#          Zero length filename\n+#\n+08CC6 Extra ID #1           5455 (21589) 'Extended Timestamp [UT]'\n+08CC8   Length              0005 (5)\n+08CCA   Flags               01 (1) 'Modification'\n+08CCB   Modification Time   00000000 (0) 'Thu Jan  1 00:00:00 1970'\n+08CCF PAYLOAD\n+\n+09209 DATA DESCRIPTOR       08074B50 (134695760)\n+0920D CRC                   92D33C56 (2463317078)\n+09211 Compressed Size       0000053A (1338)\n+09215 Uncompressed Size     0000053A (1338)\n+\n+09219 LOCAL HEADER #37      04034B50 (67324752)\n+0921D Extract Zip Spec      14 (20) '2.0'\n+0921E Extract OS            00 (0) 'MS-DOS'\n+0921F General Purpose Flag  0008 (8)\n+      [Bit  3]              1 'Streamed'\n+09221 Compression Method    0000 (0) 'Stored'\n+09223 Modification Time     EC210000 (3961585664) 'Wed Jan  1 00:00:00 2098'\n+09227 CRC                   00000000 (0)\n+0922B Compressed Size       00000000 (0)\n+0922F Uncompressed Size     00000000 (0)\n+09233 Filename Length       002E (46)\n+09235 Extra Length          0009 (9)\n+09237 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+#\n+# WARNING: Offset 0x9237: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+#          Zero length filename\n+#\n+09265 Extra ID #1           5455 (21589) 'Extended Timestamp [UT]'\n+09267   Length              0005 (5)\n+09269   Flags               01 (1) 'Modification'\n+0926A   Modification Time   00000000 (0) 'Thu Jan  1 00:00:00 1970'\n+0926E PAYLOAD\n+\n+09A41 DATA DESCRIPTOR       08074B50 (134695760)\n+09A45 CRC                   8AC6D7E1 (2328287201)\n+09A49 Compressed Size       000007D3 (2003)\n+09A4D Uncompressed Size     000007D3 (2003)\n+\n+09A51 LOCAL HEADER #38      04034B50 (67324752)\n+09A55 Extract Zip Spec      14 (20) '2.0'\n+09A56 Extract OS            00 (0) 'MS-DOS'\n+09A57 General Purpose Flag  0008 (8)\n+      [Bit  3]              1 'Streamed'\n+09A59 Compression Method    0000 (0) 'Stored'\n+09A5B Modification Time     EC210000 (3961585664) 'Wed Jan  1 00:00:00 2098'\n+09A5F CRC                   00000000 (0)\n+09A63 Compressed Size       00000000 (0)\n+09A67 Uncompressed Size     00000000 (0)\n+09A6B Filename Length       0035 (53)\n+09A6D Extra Length          0009 (9)\n+09A6F Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+#\n+# WARNING: Offset 0x9A6F: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+#          Zero length filename\n+#\n+09AA4 Extra ID #1           5455 (21589) 'Extended Timestamp [UT]'\n+09AA6   Length              0005 (5)\n+09AA8   Flags               01 (1) 'Modification'\n+09AA9   Modification Time   00000000 (0) 'Thu Jan  1 00:00:00 1970'\n+09AAD PAYLOAD\n+\n+0A0CC DATA DESCRIPTOR       08074B50 (134695760)\n+0A0D0 CRC                   12C409E5 (314837477)\n+0A0D4 Compressed Size       0000061F (1567)\n+0A0D8 Uncompressed Size     0000061F (1567)\n+\n+0A0DC LOCAL HEADER #39      04034B50 (67324752)\n+0A0E0 Extract Zip Spec      14 (20) '2.0'\n+0A0E1 Extract OS            00 (0) 'MS-DOS'\n+0A0E2 General Purpose Flag  0008 (8)\n+      [Bit  3]              1 'Streamed'\n+0A0E4 Compression Method    0000 (0) 'Stored'\n+0A0E6 Modification Time     EC210000 (3961585664) 'Wed Jan  1 00:00:00 2098'\n+0A0EA CRC                   00000000 (0)\n+0A0EE Compressed Size       00000000 (0)\n+0A0F2 Uncompressed Size     00000000 (0)\n+0A0F6 Filename Length       002E (46)\n+0A0F8 Extra Length          0009 (9)\n+0A0FA Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+#\n+# WARNING: Offset 0xA0FA: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+#          Zero length filename\n+#\n+0A128 Extra ID #1           5455 (21589) 'Extended Timestamp [UT]'\n+0A12A   Length              0005 (5)\n+0A12C   Flags               01 (1) 'Modification'\n+0A12D   Modification Time   00000000 (0) 'Thu Jan  1 00:00:00 1970'\n+0A131 PAYLOAD\n+\n+0B733 DATA DESCRIPTOR       08074B50 (134695760)\n+0B737 CRC                   6C2E2D81 (1814965633)\n+0B73B Compressed Size       00001602 (5634)\n+0B73F Uncompressed Size     00001602 (5634)\n+\n+0B743 LOCAL HEADER #40      04034B50 (67324752)\n+0B747 Extract Zip Spec      14 (20) '2.0'\n+0B748 Extract OS            00 (0) 'MS-DOS'\n+0B749 General Purpose Flag  0008 (8)\n+      [Bit  3]              1 'Streamed'\n+0B74B Compression Method    0000 (0) 'Stored'\n+0B74D Modification Time     EC210000 (3961585664) 'Wed Jan  1 00:00:00 2098'\n+0B751 CRC                   00000000 (0)\n+0B755 Compressed Size       00000000 (0)\n+0B759 Uncompressed Size     00000000 (0)\n+0B75D Filename Length       0036 (54)\n+0B75F Extra Length          0009 (9)\n+0B761 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+#\n+# WARNING: Offset 0xB761: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+#          Zero length filename\n+#\n+0B797 Extra ID #1           5455 (21589) 'Extended Timestamp [UT]'\n+0B799   Length              0005 (5)\n+0B79B   Flags               01 (1) 'Modification'\n+0B79C   Modification Time   00000000 (0) 'Thu Jan  1 00:00:00 1970'\n+0B7A0 PAYLOAD\n+\n+0BC57 DATA DESCRIPTOR       08074B50 (134695760)\n+0BC5B CRC                   ED9B9E6B (3986398827)\n+0BC5F Compressed Size       000004B7 (1207)\n+0BC63 Uncompressed Size     000004B7 (1207)\n+\n+0BC67 LOCAL HEADER #41      04034B50 (67324752)\n+0BC6B Extract Zip Spec      14 (20) '2.0'\n+0BC6C Extract OS            00 (0) 'MS-DOS'\n+0BC6D General Purpose Flag  0000 (0)\n+0BC6F Compression Method    0000 (0) 'Stored'\n+0BC71 Modification Time     EC210000 (3961585664) 'Wed Jan  1 00:00:00 2098'\n+0BC75 CRC                   00000000 (0)\n+0BC79 Compressed Size       00000000 (0)\n+0BC7D Uncompressed Size     00000000 (0)\n+0BC81 Filename Length       0021 (33)\n+0BC83 Extra Length          0009 (9)\n+0BC85 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+#\n+# WARNING: Offset 0xBC85: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+#          Zero length filename\n+#\n+0BCA6 Extra ID #1           5455 (21589) 'Extended Timestamp [UT]'\n+0BCA8   Length              0005 (5)\n+0BCAA   Flags               01 (1) 'Modification'\n+0BCAB   Modification Time   00000000 (0) 'Thu Jan  1 00:00:00 1970'\n+\n+0BCAF LOCAL HEADER #42      04034B50 (67324752)\n+0BCB3 Extract Zip Spec      14 (20) '2.0'\n+0BCB4 Extract OS            00 (0) 'MS-DOS'\n+0BCB5 General Purpose Flag  0008 (8)\n+      [Bit  3]              1 'Streamed'\n+0BCB7 Compression Method    0000 (0) 'Stored'\n+0BCB9 Modification Time     EC210000 (3961585664) 'Wed Jan  1 00:00:00 2098'\n+0BCBD CRC                   00000000 (0)\n+0BCC1 Compressed Size       00000000 (0)\n+0BCC5 Uncompressed Size     00000000 (0)\n+0BCC9 Filename Length       003E (62)\n+0BCCB Extra Length          0009 (9)\n+0BCCD Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+#\n+# WARNING: Offset 0xBCCD: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+#          Zero length filename\n+#\n+0BD0B Extra ID #1           5455 (21589) 'Extended Timestamp [UT]'\n+0BD0D   Length              0005 (5)\n+0BD0F   Flags               01 (1) 'Modification'\n+0BD10   Modification Time   00000000 (0) 'Thu Jan  1 00:00:00 1970'\n+0BD14 PAYLOAD\n+\n+0C57F DATA DESCRIPTOR       08074B50 (134695760)\n+0C583 CRC                   3799B565 (932820325)\n+0C587 Compressed Size       0000086B (2155)\n+0C58B Uncompressed Size     0000086B (2155)\n+\n+0C58F LOCAL HEADER #43      04034B50 (67324752)\n+0C593 Extract Zip Spec      14 (20) '2.0'\n+0C594 Extract OS            00 (0) 'MS-DOS'\n+0C595 General Purpose Flag  0008 (8)\n+      [Bit  3]              1 'Streamed'\n+0C597 Compression Method    0000 (0) 'Stored'\n+0C599 Modification Time     EC210000 (3961585664) 'Wed Jan  1 00:00:00 2098'\n+0C59D CRC                   00000000 (0)\n+0C5A1 Compressed Size       00000000 (0)\n+0C5A5 Uncompressed Size     00000000 (0)\n+0C5A9 Filename Length       0045 (69)\n+0C5AB Extra Length          0009 (9)\n+0C5AD Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+#\n+# WARNING: Offset 0xC5AD: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+#          Zero length filename\n+#\n+0C5F2 Extra ID #1           5455 (21589) 'Extended Timestamp [UT]'\n+0C5F4   Length              0005 (5)\n+0C5F6   Flags               01 (1) 'Modification'\n+0C5F7   Modification Time   00000000 (0) 'Thu Jan  1 00:00:00 1970'\n+0C5FB PAYLOAD\n+\n+0CCE8 DATA DESCRIPTOR       08074B50 (134695760)\n+0CCEC CRC                   0B335580 (187913600)\n+0CCF0 Compressed Size       000006ED (1773)\n+0CCF4 Uncompressed Size     000006ED (1773)\n+\n+0CCF8 LOCAL HEADER #44      04034B50 (67324752)\n+0CCFC Extract Zip Spec      14 (20) '2.0'\n+0CCFD Extract OS            00 (0) 'MS-DOS'\n+0CCFE General Purpose Flag  0008 (8)\n+      [Bit  3]              1 'Streamed'\n+0CD00 Compression Method    0000 (0) 'Stored'\n+0CD02 Modification Time     EC210000 (3961585664) 'Wed Jan  1 00:00:00 2098'\n+0CD06 CRC                   00000000 (0)\n+0CD0A Compressed Size       00000000 (0)\n+0CD0E Uncompressed Size     00000000 (0)\n+0CD12 Filename Length       0046 (70)\n+0CD14 Extra Length          0009 (9)\n+0CD16 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+#\n+# WARNING: Offset 0xCD16: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+#          Zero length filename\n+#\n+0CD5C Extra ID #1           5455 (21589) 'Extended Timestamp [UT]'\n+0CD5E   Length              0005 (5)\n+0CD60   Flags               01 (1) 'Modification'\n+0CD61   Modification Time   00000000 (0) 'Thu Jan  1 00:00:00 1970'\n+0CD65 PAYLOAD\n+\n+0D2EC DATA DESCRIPTOR       08074B50 (134695760)\n+0D2F0 CRC                   4E9CD747 (1318901575)\n+0D2F4 Compressed Size       00000587 (1415)\n+0D2F8 Uncompressed Size     00000587 (1415)\n+\n+0D2FC LOCAL HEADER #45      04034B50 (67324752)\n+0D300 Extract Zip Spec      14 (20) '2.0'\n+0D301 Extract OS            00 (0) 'MS-DOS'\n+0D302 General Purpose Flag  0008 (8)\n+      [Bit  3]              1 'Streamed'\n+0D304 Compression Method    0000 (0) 'Stored'\n+0D306 Modification Time     EC210000 (3961585664) 'Wed Jan  1 00:00:00 2098'\n+0D30A CRC                   00000000 (0)\n+0D30E Compressed Size       00000000 (0)\n+0D312 Uncompressed Size     00000000 (0)\n+0D316 Filename Length       0044 (68)\n+0D318 Extra Length          0009 (9)\n+0D31A Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+#\n+# WARNING: Offset 0xD31A: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+#          Zero length filename\n+#\n+0D35E Extra ID #1           5455 (21589) 'Extended Timestamp [UT]'\n+0D360   Length              0005 (5)\n+0D362   Flags               01 (1) 'Modification'\n+0D363   Modification Time   00000000 (0) 'Thu Jan  1 00:00:00 1970'\n+0D367 PAYLOAD\n+\n+0DC08 DATA DESCRIPTOR       08074B50 (134695760)\n+0DC0C CRC                   A92DE3D2 (2838356946)\n+0DC10 Compressed Size       000008A1 (2209)\n+0DC14 Uncompressed Size     000008A1 (2209)\n+\n+0DC18 LOCAL HEADER #46      04034B50 (67324752)\n+0DC1C Extract Zip Spec      14 (20) '2.0'\n+0DC1D Extract OS            00 (0) 'MS-DOS'\n+0DC1E General Purpose Flag  0008 (8)\n+      [Bit  3]              1 'Streamed'\n+0DC20 Compression Method    0000 (0) 'Stored'\n+0DC22 Modification Time     EC210000 (3961585664) 'Wed Jan  1 00:00:00 2098'\n+0DC26 CRC                   00000000 (0)\n+0DC2A Compressed Size       00000000 (0)\n+0DC2E Uncompressed Size     00000000 (0)\n+0DC32 Filename Length       003C (60)\n+0DC34 Extra Length          0009 (9)\n+0DC36 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+#\n+# WARNING: Offset 0xDC36: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+#          Zero length filename\n+#\n+0DC72 Extra ID #1           5455 (21589) 'Extended Timestamp [UT]'\n+0DC74   Length              0005 (5)\n+0DC76   Flags               01 (1) 'Modification'\n+0DC77   Modification Time   00000000 (0) 'Thu Jan  1 00:00:00 1970'\n+0DC7B PAYLOAD\n+\n+0F508 DATA DESCRIPTOR       08074B50 (134695760)\n+0F50C CRC                   B19E4EA6 (2979942054)\n+0F510 Compressed Size       0000188D (6285)\n+0F514 Uncompressed Size     0000188D (6285)\n+\n+0F518 LOCAL HEADER #47      04034B50 (67324752)\n+0F51C Extract Zip Spec      14 (20) '2.0'\n+0F51D Extract OS            00 (0) 'MS-DOS'\n+0F51E General Purpose Flag  0008 (8)\n+      [Bit  3]              1 'Streamed'\n+0F520 Compression Method    0000 (0) 'Stored'\n+0F522 Modification Time     EC210000 (3961585664) 'Wed Jan  1 00:00:00 2098'\n+0F526 CRC                   00000000 (0)\n+0F52A Compressed Size       00000000 (0)\n+0F52E Uncompressed Size     00000000 (0)\n+0F532 Filename Length       0045 (69)\n+0F534 Extra Length          0009 (9)\n+0F536 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+#\n+# WARNING: Offset 0xF536: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+#          Zero length filename\n+#\n+0F57B Extra ID #1           5455 (21589) 'Extended Timestamp [UT]'\n+0F57D   Length              0005 (5)\n+0F57F   Flags               01 (1) 'Modification'\n+0F580   Modification Time   00000000 (0) 'Thu Jan  1 00:00:00 1970'\n+0F584 PAYLOAD\n+\n+120E6 DATA DESCRIPTOR       08074B50 (134695760)\n+120EA CRC                   25CCFC5A (634190938)\n+120EE Compressed Size       00002B62 (11106)\n+120F2 Uncompressed Size     00002B62 (11106)\n+\n+120F6 LOCAL HEADER #48      04034B50 (67324752)\n+120FA Extract Zip Spec      14 (20) '2.0'\n+120FB Extract OS            00 (0) 'MS-DOS'\n+120FC General Purpose Flag  0008 (8)\n+      [Bit  3]              1 'Streamed'\n+120FE Compression Method    0000 (0) 'Stored'\n+12100 Modification Time     EC210000 (3961585664) 'Wed Jan  1 00:00:00 2098'\n+12104 CRC                   00000000 (0)\n+12108 Compressed Size       00000000 (0)\n+1210C Uncompressed Size     00000000 (0)\n+12110 Filename Length       0040 (64)\n+12112 Extra Length          0009 (9)\n+12114 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+#\n+# WARNING: Offset 0x12114: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+#          Zero length filename\n+#\n+12154 Extra ID #1           5455 (21589) 'Extended Timestamp [UT]'\n+12156   Length              0005 (5)\n+12158   Flags               01 (1) 'Modification'\n+12159   Modification Time   00000000 (0) 'Thu Jan  1 00:00:00 1970'\n+1215D PAYLOAD\n+\n+1422A DATA DESCRIPTOR       08074B50 (134695760)\n+1422E CRC                   DEC94C5D (3737734237)\n+14232 Compressed Size       000020CD (8397)\n+14236 Uncompressed Size     000020CD (8397)\n+\n+1423A LOCAL HEADER #49      04034B50 (67324752)\n+1423E Extract Zip Spec      14 (20) '2.0'\n+1423F Extract OS            00 (0) 'MS-DOS'\n+14240 General Purpose Flag  0008 (8)\n+      [Bit  3]              1 'Streamed'\n+14242 Compression Method    0000 (0) 'Stored'\n+14244 Modification Time     EC210000 (3961585664) 'Wed Jan  1 00:00:00 2098'\n+14248 CRC                   00000000 (0)\n+1424C Compressed Size       00000000 (0)\n+14250 Uncompressed Size     00000000 (0)\n+14254 Filename Length       0038 (56)\n+14256 Extra Length          0009 (9)\n+14258 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+#\n+# WARNING: Offset 0x14258: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+#          Zero length filename\n+#\n+14290 Extra ID #1           5455 (21589) 'Extended Timestamp [UT]'\n+14292   Length              0005 (5)\n+14294   Flags               01 (1) 'Modification'\n+14295   Modification Time   00000000 (0) 'Thu Jan  1 00:00:00 1970'\n+14299 PAYLOAD\n+\n+17337 DATA DESCRIPTOR       08074B50 (134695760)\n+1733B CRC                   71025D3E (1895980350)\n+1733F Compressed Size       0000309E (12446)\n+17343 Uncompressed Size     0000309E (12446)\n+\n+17347 LOCAL HEADER #50      04034B50 (67324752)\n+1734B Extract Zip Spec      14 (20) '2.0'\n+1734C Extract OS            00 (0) 'MS-DOS'\n+1734D General Purpose Flag  0008 (8)\n+      [Bit  3]              1 'Streamed'\n+1734F Compression Method    0000 (0) 'Stored'\n+17351 Modification Time     EC210000 (3961585664) 'Wed Jan  1 00:00:00 2098'\n+17355 CRC                   00000000 (0)\n+17359 Compressed Size       00000000 (0)\n+1735D Uncompressed Size     00000000 (0)\n+17361 Filename Length       003F (63)\n+17363 Extra Length          0009 (9)\n+17365 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+#\n+# WARNING: Offset 0x17365: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+#          Zero length filename\n+#\n+173A4 Extra ID #1           5455 (21589) 'Extended Timestamp [UT]'\n+173A6   Length              0005 (5)\n+173A8   Flags               01 (1) 'Modification'\n+173A9   Modification Time   00000000 (0) 'Thu Jan  1 00:00:00 1970'\n+173AD PAYLOAD\n+\n+179B1 DATA DESCRIPTOR       08074B50 (134695760)\n+179B5 CRC                   BE5FB3B5 (3193942965)\n+179B9 Compressed Size       00000604 (1540)\n+179BD Uncompressed Size     00000604 (1540)\n+\n+179C1 LOCAL HEADER #51      04034B50 (67324752)\n+179C5 Extract Zip Spec      14 (20) '2.0'\n+179C6 Extract OS            00 (0) 'MS-DOS'\n+179C7 General Purpose Flag  0008 (8)\n+      [Bit  3]              1 'Streamed'\n+179C9 Compression Method    0000 (0) 'Stored'\n+179CB Modification Time     EC210000 (3961585664) 'Wed Jan  1 00:00:00 2098'\n+179CF CRC                   00000000 (0)\n+179D3 Compressed Size       00000000 (0)\n+179D7 Uncompressed Size     00000000 (0)\n+179DB Filename Length       0036 (54)\n+179DD Extra Length          0009 (9)\n+179DF Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+#\n+# WARNING: Offset 0x179DF: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+#          Zero length filename\n+#\n+17A15 Extra ID #1           5455 (21589) 'Extended Timestamp [UT]'\n+17A17   Length              0005 (5)\n+17A19   Flags               01 (1) 'Modification'\n+17A1A   Modification Time   00000000 (0) 'Thu Jan  1 00:00:00 1970'\n+17A1E PAYLOAD\n+\n+1A9E6 DATA DESCRIPTOR       08074B50 (134695760)\n+1A9EA CRC                   ED1E1920 (3978172704)\n+1A9EE Compressed Size       00002FC8 (12232)\n+1A9F2 Uncompressed Size     00002FC8 (12232)\n+\n+1A9F6 LOCAL HEADER #52      04034B50 (67324752)\n+1A9FA Extract Zip Spec      14 (20) '2.0'\n+1A9FB Extract OS            00 (0) 'MS-DOS'\n+1A9FC General Purpose Flag  0008 (8)\n+      [Bit  3]              1 'Streamed'\n+1A9FE Compression Method    0000 (0) 'Stored'\n+1AA00 Modification Time     EC210000 (3961585664) 'Wed Jan  1 00:00:00 2098'\n+1AA04 CRC                   00000000 (0)\n+1AA08 Compressed Size       00000000 (0)\n+1AA0C Uncompressed Size     00000000 (0)\n+1AA10 Filename Length       003D (61)\n+1AA12 Extra Length          0009 (9)\n+1AA14 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+#\n+# WARNING: Offset 0x1AA14: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+#          Zero length filename\n+#\n+1AA51 Extra ID #1           5455 (21589) 'Extended Timestamp [UT]'\n+1AA53   Length              0005 (5)\n+1AA55   Flags               01 (1) 'Modification'\n+1AA56   Modification Time   00000000 (0) 'Thu Jan  1 00:00:00 1970'\n+1AA5A PAYLOAD\n+\n+1B245 DATA DESCRIPTOR       08074B50 (134695760)\n+1B249 CRC                   9286ACC7 (2458299591)\n+1B24D Compressed Size       000007EB (2027)\n+1B251 Uncompressed Size     000007EB (2027)\n+\n+1B255 LOCAL HEADER #53      04034B50 (67324752)\n+1B259 Extract Zip Spec      14 (20) '2.0'\n+1B25A Extract OS            00 (0) 'MS-DOS'\n+1B25B General Purpose Flag  0008 (8)\n+      [Bit  3]              1 'Streamed'\n+1B25D Compression Method    0000 (0) 'Stored'\n+1B25F Modification Time     EC210000 (3961585664) 'Wed Jan  1 00:00:00 2098'\n+1B263 CRC                   00000000 (0)\n+1B267 Compressed Size       00000000 (0)\n+1B26B Uncompressed Size     00000000 (0)\n+1B26F Filename Length       003E (62)\n+1B271 Extra Length          0009 (9)\n+1B273 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+#\n+# WARNING: Offset 0x1B273: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+#          Zero length filename\n+#\n+1B2B1 Extra ID #1           5455 (21589) 'Extended Timestamp [UT]'\n+1B2B3   Length              0005 (5)\n+1B2B5   Flags               01 (1) 'Modification'\n+1B2B6   Modification Time   00000000 (0) 'Thu Jan  1 00:00:00 1970'\n+1B2BA PAYLOAD\n+\n+206CA DATA DESCRIPTOR       08074B50 (134695760)\n+206CE CRC                   8EF20CD3 (2398227667)\n+206D2 Compressed Size       00005410 (21520)\n+206D6 Uncompressed Size     00005410 (21520)\n+\n+206DA LOCAL HEADER #54      04034B50 (67324752)\n+206DE Extract Zip Spec      14 (20) '2.0'\n+206DF Extract OS            00 (0) 'MS-DOS'\n+206E0 General Purpose Flag  0008 (8)\n+      [Bit  3]              1 'Streamed'\n+206E2 Compression Method    0000 (0) 'Stored'\n+206E4 Modification Time     EC210000 (3961585664) 'Wed Jan  1 00:00:00 2098'\n+206E8 CRC                   00000000 (0)\n+206EC Compressed Size       00000000 (0)\n+206F0 Uncompressed Size     00000000 (0)\n+206F4 Filename Length       0047 (71)\n+206F6 Extra Length          0009 (9)\n+206F8 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+#\n+# WARNING: Offset 0x206F8: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+#          Zero length filename\n+#\n+2073F Extra ID #1           5455 (21589) 'Extended Timestamp [UT]'\n+20741   Length              0005 (5)\n+20743   Flags               01 (1) 'Modification'\n+20744   Modification Time   00000000 (0) 'Thu Jan  1 00:00:00 1970'\n+20748 PAYLOAD\n+\n+2352D DATA DESCRIPTOR       08074B50 (134695760)\n+23531 CRC                   82D7146C (2195133548)\n+23535 Compressed Size       00002DE5 (11749)\n+23539 Uncompressed Size     00002DE5 (11749)\n+\n+2353D LOCAL HEADER #55      04034B50 (67324752)\n+23541 Extract Zip Spec      14 (20) '2.0'\n+23542 Extract OS            00 (0) 'MS-DOS'\n+23543 General Purpose Flag  0008 (8)\n+      [Bit  3]              1 'Streamed'\n+23545 Compression Method    0000 (0) 'Stored'\n+23547 Modification Time     EC210000 (3961585664) 'Wed Jan  1 00:00:00 2098'\n+2354B CRC                   00000000 (0)\n+2354F Compressed Size       00000000 (0)\n+23553 Uncompressed Size     00000000 (0)\n+23557 Filename Length       0045 (69)\n+23559 Extra Length          0009 (9)\n+2355B Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+#\n+# WARNING: Offset 0x2355B: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+#          Zero length filename\n+#\n+235A0 Extra ID #1           5455 (21589) 'Extended Timestamp [UT]'\n+235A2   Length              0005 (5)\n+235A4   Flags               01 (1) 'Modification'\n+235A5   Modification Time   00000000 (0) 'Thu Jan  1 00:00:00 1970'\n+235A9 PAYLOAD\n+\n+23C5C DATA DESCRIPTOR       08074B50 (134695760)\n+23C60 CRC                   988327A2 (2558732194)\n+23C64 Compressed Size       000006B3 (1715)\n+23C68 Uncompressed Size     000006B3 (1715)\n+\n+23C6C LOCAL HEADER #56      04034B50 (67324752)\n+23C70 Extract Zip Spec      14 (20) '2.0'\n+23C71 Extract OS            00 (0) 'MS-DOS'\n+23C72 General Purpose Flag  0008 (8)\n+      [Bit  3]              1 'Streamed'\n+23C74 Compression Method    0000 (0) 'Stored'\n+23C76 Modification Time     EC210000 (3961585664) 'Wed Jan  1 00:00:00 2098'\n+23C7A CRC                   00000000 (0)\n+23C7E Compressed Size       00000000 (0)\n+23C82 Uncompressed Size     00000000 (0)\n+23C86 Filename Length       0035 (53)\n+23C88 Extra Length          0009 (9)\n+23C8A Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+#\n+# WARNING: Offset 0x23C8A: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+#          Zero length filename\n+#\n+23CBF Extra ID #1           5455 (21589) 'Extended Timestamp [UT]'\n+23CC1   Length              0005 (5)\n+23CC3   Flags               01 (1) 'Modification'\n+23CC4   Modification Time   00000000 (0) 'Thu Jan  1 00:00:00 1970'\n+23CC8 PAYLOAD\n+\n+24AF0 DATA DESCRIPTOR       08074B50 (134695760)\n+24AF4 CRC                   756EE014 (1970200596)\n+24AF8 Compressed Size       00000E28 (3624)\n+24AFC Uncompressed Size     00000E28 (3624)\n+\n+24B00 LOCAL HEADER #57      04034B50 (67324752)\n+24B04 Extract Zip Spec      14 (20) '2.0'\n+24B05 Extract OS            00 (0) 'MS-DOS'\n+24B06 General Purpose Flag  0008 (8)\n+      [Bit  3]              1 'Streamed'\n+24B08 Compression Method    0000 (0) 'Stored'\n+24B0A Modification Time     EC210000 (3961585664) 'Wed Jan  1 00:00:00 2098'\n+24B0E CRC                   00000000 (0)\n+24B12 Compressed Size       00000000 (0)\n+24B16 Uncompressed Size     00000000 (0)\n+24B1A Filename Length       003F (63)\n+24B1C Extra Length          0009 (9)\n+24B1E Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+#\n+# WARNING: Offset 0x24B1E: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+#          Zero length filename\n+#\n+24B5D Extra ID #1           5455 (21589) 'Extended Timestamp [UT]'\n+24B5F   Length              0005 (5)\n+24B61   Flags               01 (1) 'Modification'\n+24B62   Modification Time   00000000 (0) 'Thu Jan  1 00:00:00 1970'\n+24B66 PAYLOAD\n+\n+25162 DATA DESCRIPTOR       08074B50 (134695760)\n+25166 CRC                   3557220F (894902799)\n+2516A Compressed Size       000005FC (1532)\n+2516E Uncompressed Size     000005FC (1532)\n+\n+25172 LOCAL HEADER #58      04034B50 (67324752)\n+25176 Extract Zip Spec      14 (20) '2.0'\n+25177 Extract OS            00 (0) 'MS-DOS'\n+25178 General Purpose Flag  0000 (0)\n+2517A Compression Method    0000 (0) 'Stored'\n+2517C Modification Time     EC210000 (3961585664) 'Wed Jan  1 00:00:00 2098'\n+25180 CRC                   00000000 (0)\n+25184 Compressed Size       00000000 (0)\n+25188 Uncompressed Size     00000000 (0)\n+2518C Filename Length       0027 (39)\n+2518E Extra Length          0009 (9)\n+25190 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+#\n+# WARNING: Offset 0x25190: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+#          Zero length filename\n+#\n+251B7 Extra ID #1           5455 (21589) 'Extended Timestamp [UT]'\n+251B9   Length              0005 (5)\n+251BB   Flags               01 (1) 'Modification'\n+251BC   Modification Time   00000000 (0) 'Thu Jan  1 00:00:00 1970'\n+\n+251C0 LOCAL HEADER #59      04034B50 (67324752)\n+251C4 Extract Zip Spec      14 (20) '2.0'\n+251C5 Extract OS            00 (0) 'MS-DOS'\n+251C6 General Purpose Flag  0008 (8)\n+      [Bit  3]              1 'Streamed'\n+251C8 Compression Method    0000 (0) 'Stored'\n+251CA Modification Time     EC210000 (3961585664) 'Wed Jan  1 00:00:00 2098'\n+251CE CRC                   00000000 (0)\n+251D2 Compressed Size       00000000 (0)\n+251D6 Uncompressed Size     00000000 (0)\n+251DA Filename Length       004A (74)\n+251DC Extra Length          0009 (9)\n+251DE Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+#\n+# WARNING: Offset 0x251DE: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+#          Zero length filename\n+#\n+25228 Extra ID #1           5455 (21589) 'Extended Timestamp [UT]'\n+2522A   Length              0005 (5)\n+2522C   Flags               01 (1) 'Modification'\n+2522D   Modification Time   00000000 (0) 'Thu Jan  1 00:00:00 1970'\n+25231 PAYLOAD\n+\n+25748 DATA DESCRIPTOR       08074B50 (134695760)\n+2574C CRC                   B96C1EAA (3110870698)\n+25750 Compressed Size       00000517 (1303)\n+25754 Uncompressed Size     00000517 (1303)\n+\n+25758 LOCAL HEADER #60      04034B50 (67324752)\n+2575C Extract Zip Spec      14 (20) '2.0'\n+2575D Extract OS            00 (0) 'MS-DOS'\n+2575E General Purpose Flag  0008 (8)\n+      [Bit  3]              1 'Streamed'\n+25760 Compression Method    0000 (0) 'Stored'\n+25762 Modification Time     EC210000 (3961585664) 'Wed Jan  1 00:00:00 2098'\n+25766 CRC                   00000000 (0)\n+2576A Compressed Size       00000000 (0)\n+2576E Uncompressed Size     00000000 (0)\n+25772 Filename Length       004B (75)\n+25774 Extra Length          0009 (9)\n+25776 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+#\n+# WARNING: Offset 0x25776: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+#          Zero length filename\n+#\n+257C1 Extra ID #1           5455 (21589) 'Extended Timestamp [UT]'\n+257C3   Length              0005 (5)\n+257C5   Flags               01 (1) 'Modification'\n+257C6   Modification Time   00000000 (0) 'Thu Jan  1 00:00:00 1970'\n+257CA PAYLOAD\n+\n+25CE6 DATA DESCRIPTOR       08074B50 (134695760)\n+25CEA CRC                   7934C791 (2033502097)\n+25CEE Compressed Size       0000051C (1308)\n+25CF2 Uncompressed Size     0000051C (1308)\n+\n+25CF6 LOCAL HEADER #61      04034B50 (67324752)\n+25CFA Extract Zip Spec      14 (20) '2.0'\n+25CFB Extract OS            00 (0) 'MS-DOS'\n+25CFC General Purpose Flag  0008 (8)\n+      [Bit  3]              1 'Streamed'\n+25CFE Compression Method    0000 (0) 'Stored'\n+25D00 Modification Time     EC210000 (3961585664) 'Wed Jan  1 00:00:00 2098'\n+25D04 CRC                   00000000 (0)\n+25D08 Compressed Size       00000000 (0)\n+25D0C Uncompressed Size     00000000 (0)\n+25D10 Filename Length       0041 (65)\n+25D12 Extra Length          0009 (9)\n+25D14 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+#\n+# WARNING: Offset 0x25D14: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+#          Zero length filename\n+#\n+25D55 Extra ID #1           5455 (21589) 'Extended Timestamp [UT]'\n+25D57   Length              0005 (5)\n+25D59   Flags               01 (1) 'Modification'\n+25D5A   Modification Time   00000000 (0) 'Thu Jan  1 00:00:00 1970'\n+25D5E PAYLOAD\n+\n+26610 DATA DESCRIPTOR       08074B50 (134695760)\n+26614 CRC                   BF357544 (3207951684)\n+26618 Compressed Size       000008B2 (2226)\n+2661C Uncompressed Size     000008B2 (2226)\n+\n+26620 LOCAL HEADER #62      04034B50 (67324752)\n+26624 Extract Zip Spec      14 (20) '2.0'\n+26625 Extract OS            00 (0) 'MS-DOS'\n+26626 General Purpose Flag  0008 (8)\n+      [Bit  3]              1 'Streamed'\n+26628 Compression Method    0000 (0) 'Stored'\n+2662A Modification Time     EC210000 (3961585664) 'Wed Jan  1 00:00:00 2098'\n+2662E CRC                   00000000 (0)\n+26632 Compressed Size       00000000 (0)\n+26636 Uncompressed Size     00000000 (0)\n+2663A Filename Length       004A (74)\n+2663C Extra Length          0009 (9)\n+2663E Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+#\n+# WARNING: Offset 0x2663E: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+#          Zero length filename\n+#\n+26688 Extra ID #1           5455 (21589) 'Extended Timestamp [UT]'\n+2668A   Length              0005 (5)\n+2668C   Flags               01 (1) 'Modification'\n+2668D   Modification Time   00000000 (0) 'Thu Jan  1 00:00:00 1970'\n+26691 PAYLOAD\n+\n+26D3C DATA DESCRIPTOR       08074B50 (134695760)\n+26D40 CRC                   59957DEF (1502969327)\n+26D44 Compressed Size       000006AB (1707)\n+26D48 Uncompressed Size     000006AB (1707)\n+\n+26D4C LOCAL HEADER #63      04034B50 (67324752)\n+26D50 Extract Zip Spec      14 (20) '2.0'\n+26D51 Extract OS            00 (0) 'MS-DOS'\n+26D52 General Purpose Flag  0008 (8)\n+      [Bit  3]              1 'Streamed'\n+26D54 Compression Method    0000 (0) 'Stored'\n+26D56 Modification Time     EC210000 (3961585664) 'Wed Jan  1 00:00:00 2098'\n+26D5A CRC                   00000000 (0)\n+26D5E Compressed Size       00000000 (0)\n+26D62 Uncompressed Size     00000000 (0)\n+26D66 Filename Length       004C (76)\n+26D68 Extra Length          0009 (9)\n+26D6A Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+#\n+# WARNING: Offset 0x26D6A: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+#          Zero length filename\n+#\n+26DB6 Extra ID #1           5455 (21589) 'Extended Timestamp [UT]'\n+26DB8   Length              0005 (5)\n+26DBA   Flags               01 (1) 'Modification'\n+26DBB   Modification Time   00000000 (0) 'Thu Jan  1 00:00:00 1970'\n+26DBF PAYLOAD\n+\n+27304 DATA DESCRIPTOR       08074B50 (134695760)\n+27308 CRC                   30CE65FD (818832893)\n+2730C Compressed Size       00000545 (1349)\n+27310 Uncompressed Size     00000545 (1349)\n+\n+27314 LOCAL HEADER #64      04034B50 (67324752)\n+27318 Extract Zip Spec      14 (20) '2.0'\n+27319 Extract OS            00 (0) 'MS-DOS'\n+2731A General Purpose Flag  0008 (8)\n+      [Bit  3]              1 'Streamed'\n+2731C Compression Method    0000 (0) 'Stored'\n+2731E Modification Time     EC210000 (3961585664) 'Wed Jan  1 00:00:00 2098'\n+27322 CRC                   00000000 (0)\n+27326 Compressed Size       00000000 (0)\n+2732A Uncompressed Size     00000000 (0)\n+2732E Filename Length       004D (77)\n+27330 Extra Length          0009 (9)\n+27332 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+#\n+# WARNING: Offset 0x27332: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+#          Zero length filename\n+#\n+2737F Extra ID #1           5455 (21589) 'Extended Timestamp [UT]'\n+27381   Length              0005 (5)\n+27383   Flags               01 (1) 'Modification'\n+27384   Modification Time   00000000 (0) 'Thu Jan  1 00:00:00 1970'\n+27388 PAYLOAD\n+\n+278D3 DATA DESCRIPTOR       08074B50 (134695760)\n+278D7 CRC                   C145F19E (3242586526)\n+278DB Compressed Size       0000054B (1355)\n+278DF Uncompressed Size     0000054B (1355)\n+\n+278E3 LOCAL HEADER #65      04034B50 (67324752)\n+278E7 Extract Zip Spec      14 (20) '2.0'\n+278E8 Extract OS            00 (0) 'MS-DOS'\n+278E9 General Purpose Flag  0008 (8)\n+      [Bit  3]              1 'Streamed'\n+278EB Compression Method    0000 (0) 'Stored'\n+278ED Modification Time     EC210000 (3961585664) 'Wed Jan  1 00:00:00 2098'\n+278F1 CRC                   00000000 (0)\n+278F5 Compressed Size       00000000 (0)\n+278F9 Uncompressed Size     00000000 (0)\n+278FD Filename Length       0040 (64)\n+278FF Extra Length          0009 (9)\n+27901 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+#\n+# WARNING: Offset 0x27901: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+#          Zero length filename\n+#\n+27941 Extra ID #1           5455 (21589) 'Extended Timestamp [UT]'\n+27943   Length              0005 (5)\n+27945   Flags               01 (1) 'Modification'\n+27946   Modification Time   00000000 (0) 'Thu Jan  1 00:00:00 1970'\n+2794A PAYLOAD\n+\n+27FEE DATA DESCRIPTOR       08074B50 (134695760)\n+27FF2 CRC                   511C2CC7 (1360800967)\n+27FF6 Compressed Size       000006A4 (1700)\n+27FFA Uncompressed Size     000006A4 (1700)\n+\n+27FFE LOCAL HEADER #66      04034B50 (67324752)\n+28002 Extract Zip Spec      14 (20) '2.0'\n+28003 Extract OS            00 (0) 'MS-DOS'\n+28004 General Purpose Flag  0008 (8)\n+      [Bit  3]              1 'Streamed'\n+28006 Compression Method    0000 (0) 'Stored'\n+28008 Modification Time     EC210000 (3961585664) 'Wed Jan  1 00:00:00 2098'\n+2800C CRC                   00000000 (0)\n+28010 Compressed Size       00000000 (0)\n+28014 Uncompressed Size     00000000 (0)\n+28018 Filename Length       004D (77)\n+2801A Extra Length          0009 (9)\n+2801C Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+#\n+# WARNING: Offset 0x2801C: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+#          Zero length filename\n+#\n+28069 Extra ID #1           5455 (21589) 'Extended Timestamp [UT]'\n+2806B   Length              0005 (5)\n+2806D   Flags               01 (1) 'Modification'\n+2806E   Modification Time   00000000 (0) 'Thu Jan  1 00:00:00 1970'\n+28072 PAYLOAD\n+\n+285DB DATA DESCRIPTOR       08074B50 (134695760)\n+285DF CRC                   B5EBBEE9 (3052125929)\n+285E3 Compressed Size       00000569 (1385)\n+285E7 Uncompressed Size     00000569 (1385)\n+\n+285EB LOCAL HEADER #67      04034B50 (67324752)\n+285EF Extract Zip Spec      14 (20) '2.0'\n+285F0 Extract OS            00 (0) 'MS-DOS'\n+285F1 General Purpose Flag  0008 (8)\n+      [Bit  3]              1 'Streamed'\n+285F3 Compression Method    0000 (0) 'Stored'\n+285F5 Modification Time     EC210000 (3961585664) 'Wed Jan  1 00:00:00 2098'\n+285F9 CRC                   00000000 (0)\n+285FD Compressed Size       00000000 (0)\n+28601 Uncompressed Size     00000000 (0)\n+28605 Filename Length       004F (79)\n+28607 Extra Length          0009 (9)\n+28609 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+#\n+# WARNING: Offset 0x28609: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+#          Zero length filename\n+#\n+28658 Extra ID #1           5455 (21589) 'Extended Timestamp [UT]'\n+2865A   Length              0005 (5)\n+2865C   Flags               01 (1) 'Modification'\n+2865D   Modification Time   00000000 (0) 'Thu Jan  1 00:00:00 1970'\n+28661 PAYLOAD\n+\n+28BD2 DATA DESCRIPTOR       08074B50 (134695760)\n+28BD6 CRC                   31557B6E (827685742)\n+28BDA Compressed Size       00000571 (1393)\n+28BDE Uncompressed Size     00000571 (1393)\n+\n+28BE2 LOCAL HEADER #68      04034B50 (67324752)\n+28BE6 Extract Zip Spec      14 (20) '2.0'\n+28BE7 Extract OS            00 (0) 'MS-DOS'\n+28BE8 General Purpose Flag  0008 (8)\n+      [Bit  3]              1 'Streamed'\n+28BEA Compression Method    0000 (0) 'Stored'\n+28BEC Modification Time     EC210000 (3961585664) 'Wed Jan  1 00:00:00 2098'\n+28BF0 CRC                   00000000 (0)\n+28BF4 Compressed Size       00000000 (0)\n+28BF8 Uncompressed Size     00000000 (0)\n+28BFC Filename Length       004A (74)\n+28BFE Extra Length          0009 (9)\n+28C00 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+#\n+# WARNING: Offset 0x28C00: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+#          Zero length filename\n+#\n+28C4A Extra ID #1           5455 (21589) 'Extended Timestamp [UT]'\n+28C4C   Length              0005 (5)\n+28C4E   Flags               01 (1) 'Modification'\n+28C4F   Modification Time   00000000 (0) 'Thu Jan  1 00:00:00 1970'\n+28C53 PAYLOAD\n+\n+291B5 DATA DESCRIPTOR       08074B50 (134695760)\n+291B9 CRC                   9E00A28D (2650841741)\n+291BD Compressed Size       00000562 (1378)\n+291C1 Uncompressed Size     00000562 (1378)\n+\n+291C5 LOCAL HEADER #69      04034B50 (67324752)\n+291C9 Extract Zip Spec      14 (20) '2.0'\n+291CA Extract OS            00 (0) 'MS-DOS'\n+291CB General Purpose Flag  0008 (8)\n+      [Bit  3]              1 'Streamed'\n+291CD Compression Method    0000 (0) 'Stored'\n+291CF Modification Time     EC210000 (3961585664) 'Wed Jan  1 00:00:00 2098'\n+291D3 CRC                   00000000 (0)\n+291D7 Compressed Size       00000000 (0)\n+291DB Uncompressed Size     00000000 (0)\n+291DF Filename Length       004C (76)\n+291E1 Extra Length          0009 (9)\n+291E3 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+#\n+# WARNING: Offset 0x291E3: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+#          Zero length filename\n+#\n+2922F Extra ID #1           5455 (21589) 'Extended Timestamp [UT]'\n+29231   Length              0005 (5)\n+29233   Flags               01 (1) 'Modification'\n+29234   Modification Time   00000000 (0) 'Thu Jan  1 00:00:00 1970'\n+29238 PAYLOAD\n+\n+297C0 DATA DESCRIPTOR       08074B50 (134695760)\n+297C4 CRC                   B8F3B221 (3102978593)\n+297C8 Compressed Size       00000588 (1416)\n+297CC Uncompressed Size     00000588 (1416)\n+\n+297D0 LOCAL HEADER #70      04034B50 (67324752)\n+297D4 Extract Zip Spec      14 (20) '2.0'\n+297D5 Extract OS            00 (0) 'MS-DOS'\n+297D6 General Purpose Flag  0008 (8)\n+      [Bit  3]              1 'Streamed'\n+297D8 Compression Method    0000 (0) 'Stored'\n+297DA Modification Time     EC210000 (3961585664) 'Wed Jan  1 00:00:00 2098'\n+297DE CRC                   00000000 (0)\n+297E2 Compressed Size       00000000 (0)\n+297E6 Uncompressed Size     00000000 (0)\n+297EA Filename Length       0048 (72)\n+297EC Extra Length          0009 (9)\n+297EE Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+#\n+# WARNING: Offset 0x297EE: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+#          Zero length filename\n+#\n+29836 Extra ID #1           5455 (21589) 'Extended Timestamp [UT]'\n+29838   Length              0005 (5)\n+2983A   Flags               01 (1) 'Modification'\n+2983B   Modification Time   00000000 (0) 'Thu Jan  1 00:00:00 1970'\n+2983F PAYLOAD\n+\n+2A125 DATA DESCRIPTOR       08074B50 (134695760)\n+2A129 CRC                   A03840DB (2688041179)\n+2A12D Compressed Size       000008E6 (2278)\n+2A131 Uncompressed Size     000008E6 (2278)\n+\n+2A135 LOCAL HEADER #71      04034B50 (67324752)\n+2A139 Extract Zip Spec      14 (20) '2.0'\n+2A13A Extract OS            00 (0) 'MS-DOS'\n+2A13B General Purpose Flag  0000 (0)\n+2A13D Compression Method    0000 (0) 'Stored'\n+2A13F Modification Time     EC210000 (3961585664) 'Wed Jan  1 00:00:00 2098'\n+2A143 CRC                   00000000 (0)\n+2A147 Compressed Size       00000000 (0)\n+2A14B Uncompressed Size     00000000 (0)\n+2A14F Filename Length       0030 (48)\n+2A151 Extra Length          0009 (9)\n+2A153 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+#\n+# WARNING: Offset 0x2A153: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+#          Zero length filename\n+#\n+2A183 Extra ID #1           5455 (21589) 'Extended Timestamp [UT]'\n+2A185   Length              0005 (5)\n+2A187   Flags               01 (1) 'Modification'\n+2A188   Modification Time   00000000 (0) 'Thu Jan  1 00:00:00 1970'\n+\n+2A18C LOCAL HEADER #72      04034B50 (67324752)\n+2A190 Extract Zip Spec      14 (20) '2.0'\n+2A191 Extract OS            00 (0) 'MS-DOS'\n+2A192 General Purpose Flag  0008 (8)\n+      [Bit  3]              1 'Streamed'\n+2A194 Compression Method    0000 (0) 'Stored'\n+2A196 Modification Time     EC210000 (3961585664) 'Wed Jan  1 00:00:00 2098'\n+2A19A CRC                   00000000 (0)\n+2A19E Compressed Size       00000000 (0)\n+2A1A2 Uncompressed Size     00000000 (0)\n+2A1A6 Filename Length       0049 (73)\n+2A1A8 Extra Length          0009 (9)\n+2A1AA Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+#\n+# WARNING: Offset 0x2A1AA: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+#          Zero length filename\n+#\n+2A1F3 Extra ID #1           5455 (21589) 'Extended Timestamp [UT]'\n+2A1F5   Length              0005 (5)\n+2A1F7   Flags               01 (1) 'Modification'\n+2A1F8   Modification Time   00000000 (0) 'Thu Jan  1 00:00:00 1970'\n+2A1FC PAYLOAD\n+\n+2B073 DATA DESCRIPTOR       08074B50 (134695760)\n+2B077 CRC                   80296188 (2150195592)\n+2B07B Compressed Size       00000E77 (3703)\n+2B07F Uncompressed Size     00000E77 (3703)\n+\n+2B083 LOCAL HEADER #73      04034B50 (67324752)\n+2B087 Extract Zip Spec      14 (20) '2.0'\n+2B088 Extract OS            00 (0) 'MS-DOS'\n+2B089 General Purpose Flag  0008 (8)\n+      [Bit  3]              1 'Streamed'\n+2B08B Compression Method    0000 (0) 'Stored'\n+2B08D Modification Time     EC210000 (3961585664) 'Wed Jan  1 00:00:00 2098'\n+2B091 CRC                   00000000 (0)\n+2B095 Compressed Size       00000000 (0)\n+2B099 Uncompressed Size     00000000 (0)\n+2B09D Filename Length       0054 (84)\n+2B09F Extra Length          0009 (9)\n+2B0A1 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+#\n+# WARNING: Offset 0x2B0A1: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+#          Zero length filename\n+#\n+2B0F5 Extra ID #1           5455 (21589) 'Extended Timestamp [UT]'\n+2B0F7   Length              0005 (5)\n+2B0F9   Flags               01 (1) 'Modification'\n+2B0FA   Modification Time   00000000 (0) 'Thu Jan  1 00:00:00 1970'\n+2B0FE PAYLOAD\n+\n+2DE3F DATA DESCRIPTOR       08074B50 (134695760)\n+2DE43 CRC                   179D40B4 (396181684)\n+2DE47 Compressed Size       00002D41 (11585)\n+2DE4B Uncompressed Size     00002D41 (11585)\n+\n+2DE4F LOCAL HEADER #74      04034B50 (67324752)\n+2DE53 Extract Zip Spec      14 (20) '2.0'\n+2DE54 Extract OS            00 (0) 'MS-DOS'\n+2DE55 General Purpose Flag  0000 (0)\n+2DE57 Compression Method    0000 (0) 'Stored'\n+2DE59 Modification Time     EC210000 (3961585664) 'Wed Jan  1 00:00:00 2098'\n+2DE5D CRC                   00000000 (0)\n+2DE61 Compressed Size       00000000 (0)\n+2DE65 Uncompressed Size     00000000 (0)\n+2DE69 Filename Length       002A (42)\n+2DE6B Extra Length          0009 (9)\n+2DE6D Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+#\n+# WARNING: Offset 0x2DE6D: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+#          Zero length filename\n+#\n+2DE97 Extra ID #1           5455 (21589) 'Extended Timestamp [UT]'\n+2DE99   Length              0005 (5)\n+2DE9B   Flags               01 (1) 'Modification'\n+2DE9C   Modification Time   00000000 (0) 'Thu Jan  1 00:00:00 1970'\n+\n+2DEA0 LOCAL HEADER #75      04034B50 (67324752)\n+2DEA4 Extract Zip Spec      14 (20) '2.0'\n+2DEA5 Extract OS            00 (0) 'MS-DOS'\n+2DEA6 General Purpose Flag  0008 (8)\n+      [Bit  3]              1 'Streamed'\n+2DEA8 Compression Method    0000 (0) 'Stored'\n+2DEAA Modification Time     EC210000 (3961585664) 'Wed Jan  1 00:00:00 2098'\n+2DEAE CRC                   00000000 (0)\n+2DEB2 Compressed Size       00000000 (0)\n+2DEB6 Uncompressed Size     00000000 (0)\n+2DEBA Filename Length       0049 (73)\n+2DEBC Extra Length          0009 (9)\n+2DEBE Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+#\n+# WARNING: Offset 0x2DEBE: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+#          Zero length filename\n+#\n+2DF07 Extra ID #1           5455 (21589) 'Extended Timestamp [UT]'\n+2DF09   Length              0005 (5)\n+2DF0B   Flags               01 (1) 'Modification'\n+2DF0C   Modification Time   00000000 (0) 'Thu Jan  1 00:00:00 1970'\n+2DF10 PAYLOAD\n+\n+2EDDC DATA DESCRIPTOR       08074B50 (134695760)\n+2EDE0 CRC                   D8B03CE3 (3635428579)\n+2EDE4 Compressed Size       00000ECC (3788)\n+2EDE8 Uncompressed Size     00000ECC (3788)\n+\n+2EDEC LOCAL HEADER #76      04034B50 (67324752)\n+2EDF0 Extract Zip Spec      14 (20) '2.0'\n+2EDF1 Extract OS            00 (0) 'MS-DOS'\n+2EDF2 General Purpose Flag  0008 (8)\n+      [Bit  3]              1 'Streamed'\n+2EDF4 Compression Method    0000 (0) 'Stored'\n+2EDF6 Modification Time     EC210000 (3961585664) 'Wed Jan  1 00:00:00 2098'\n+2EDFA CRC                   00000000 (0)\n+2EDFE Compressed Size       00000000 (0)\n+2EE02 Uncompressed Size     00000000 (0)\n+2EE06 Filename Length       0048 (72)\n+2EE08 Extra Length          0009 (9)\n+2EE0A Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+#\n+# WARNING: Offset 0x2EE0A: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+#          Zero length filename\n+#\n+2EE52 Extra ID #1           5455 (21589) 'Extended Timestamp [UT]'\n+2EE54   Length              0005 (5)\n+2EE56   Flags               01 (1) 'Modification'\n+2EE57   Modification Time   00000000 (0) 'Thu Jan  1 00:00:00 1970'\n+2EE5B PAYLOAD\n+\n+2F45A DATA DESCRIPTOR       08074B50 (134695760)\n+2F45E CRC                   EEBAB417 (4005213207)\n+2F462 Compressed Size       000005FF (1535)\n+2F466 Uncompressed Size     000005FF (1535)\n+\n+2F46A LOCAL HEADER #77      04034B50 (67324752)\n+2F46E Extract Zip Spec      14 (20) '2.0'\n+2F46F Extract OS            00 (0) 'MS-DOS'\n+2F470 General Purpose Flag  0008 (8)\n+      [Bit  3]              1 'Streamed'\n+2F472 Compression Method    0000 (0) 'Stored'\n+2F474 Modification Time     EC210000 (3961585664) 'Wed Jan  1 00:00:00 2098'\n+2F478 CRC                   00000000 (0)\n+2F47C Compressed Size       00000000 (0)\n+2F480 Uncompressed Size     00000000 (0)\n+2F484 Filename Length       0059 (89)\n+2F486 Extra Length          0009 (9)\n+2F488 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+#\n+# WARNING: Offset 0x2F488: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+#          Zero length filename\n+#\n+2F4E1 Extra ID #1           5455 (21589) 'Extended Timestamp [UT]'\n+2F4E3   Length              0005 (5)\n+2F4E5   Flags               01 (1) 'Modification'\n+2F4E6   Modification Time   00000000 (0) 'Thu Jan  1 00:00:00 1970'\n+2F4EA PAYLOAD\n+\n+30015 DATA DESCRIPTOR       08074B50 (134695760)\n+30019 CRC                   75D2ADE7 (1976741351)\n+3001D Compressed Size       00000B2B (2859)\n+30021 Uncompressed Size     00000B2B (2859)\n+\n+30025 LOCAL HEADER #78      04034B50 (67324752)\n+30029 Extract Zip Spec      14 (20) '2.0'\n+3002A Extract OS            00 (0) 'MS-DOS'\n+3002B General Purpose Flag  0008 (8)\n+      [Bit  3]              1 'Streamed'\n+3002D Compression Method    0000 (0) 'Stored'\n+3002F Modification Time     EC210000 (3961585664) 'Wed Jan  1 00:00:00 2098'\n+30033 CRC                   00000000 (0)\n+30037 Compressed Size       00000000 (0)\n+3003B Uncompressed Size     00000000 (0)\n+3003F Filename Length       003C (60)\n+30041 Extra Length          0009 (9)\n+30043 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+#\n+# WARNING: Offset 0x30043: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+#          Zero length filename\n+#\n+3007F Extra ID #1           5455 (21589) 'Extended Timestamp [UT]'\n+30081   Length              0005 (5)\n+30083   Flags               01 (1) 'Modification'\n+30084   Modification Time   00000000 (0) 'Thu Jan  1 00:00:00 1970'\n+30088 PAYLOAD\n+\n+31391 DATA DESCRIPTOR       08074B50 (134695760)\n+31395 CRC                   755A196E (1968839022)\n+31399 Compressed Size       00001309 (4873)\n+3139D Uncompressed Size     00001309 (4873)\n+\n+313A1 LOCAL HEADER #79      04034B50 (67324752)\n+313A5 Extract Zip Spec      14 (20) '2.0'\n+313A6 Extract OS            00 (0) 'MS-DOS'\n+313A7 General Purpose Flag  0008 (8)\n+      [Bit  3]              1 'Streamed'\n+313A9 Compression Method    0000 (0) 'Stored'\n+313AB Modification Time     EC210000 (3961585664) 'Wed Jan  1 00:00:00 2098'\n+313AF CRC                   00000000 (0)\n+313B3 Compressed Size       00000000 (0)\n+313B7 Uncompressed Size     00000000 (0)\n+313BB Filename Length       004E (78)\n+313BD Extra Length          0009 (9)\n+313BF Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+#\n+# WARNING: Offset 0x313BF: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+#          Zero length filename\n+#\n+3140D Extra ID #1           5455 (21589) 'Extended Timestamp [UT]'\n+3140F   Length              0005 (5)\n+31411   Flags               01 (1) 'Modification'\n+31412   Modification Time   00000000 (0) 'Thu Jan  1 00:00:00 1970'\n+31416 PAYLOAD\n+\n+31D45 DATA DESCRIPTOR       08074B50 (134695760)\n+31D49 CRC                   59E1F72D (1507981101)\n+31D4D Compressed Size       0000092F (2351)\n+31D51 Uncompressed Size     0000092F (2351)\n+\n+31D55 LOCAL HEADER #80      04034B50 (67324752)\n+31D59 Extract Zip Spec      14 (20) '2.0'\n+31D5A Extract OS            00 (0) 'MS-DOS'\n+31D5B General Purpose Flag  0008 (8)\n+      [Bit  3]              1 'Streamed'\n+31D5D Compression Method    0000 (0) 'Stored'\n+31D5F Modification Time     EC210000 (3961585664) 'Wed Jan  1 00:00:00 2098'\n+31D63 CRC                   00000000 (0)\n+31D67 Compressed Size       00000000 (0)\n+31D6B Uncompressed Size     00000000 (0)\n+31D6F Filename Length       0054 (84)\n+31D71 Extra Length          0009 (9)\n+31D73 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+#\n+# WARNING: Offset 0x31D73: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+#          Zero length filename\n+#\n+31DC7 Extra ID #1           5455 (21589) 'Extended Timestamp [UT]'\n+31DC9   Length              0005 (5)\n+31DCB   Flags               01 (1) 'Modification'\n+31DCC   Modification Time   00000000 (0) 'Thu Jan  1 00:00:00 1970'\n+31DD0 PAYLOAD\n+\n+328D6 DATA DESCRIPTOR       08074B50 (134695760)\n+328DA CRC                   FB40FD46 (4215340358)\n+328DE Compressed Size       00000B06 (2822)\n+328E2 Uncompressed Size     00000B06 (2822)\n+\n+328E6 LOCAL HEADER #81      04034B50 (67324752)\n+328EA Extract Zip Spec      14 (20) '2.0'\n+328EB Extract OS            00 (0) 'MS-DOS'\n+328EC General Purpose Flag  0008 (8)\n+      [Bit  3]              1 'Streamed'\n+328EE Compression Method    0000 (0) 'Stored'\n+328F0 Modification Time     EC210000 (3961585664) 'Wed Jan  1 00:00:00 2098'\n+328F4 CRC                   00000000 (0)\n+328F8 Compressed Size       00000000 (0)\n+328FC Uncompressed Size     00000000 (0)\n+32900 Filename Length       0050 (80)\n+32902 Extra Length          0009 (9)\n+32904 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+#\n+# WARNING: Offset 0x32904: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+#          Zero length filename\n+#\n+32954 Extra ID #1           5455 (21589) 'Extended Timestamp [UT]'\n+32956   Length              0005 (5)\n+32958   Flags               01 (1) 'Modification'\n+32959   Modification Time   00000000 (0) 'Thu Jan  1 00:00:00 1970'\n+3295D PAYLOAD\n+\n+3396A DATA DESCRIPTOR       08074B50 (134695760)\n+3396E CRC                   53F9F17D (1408889213)\n+33972 Compressed Size       0000100D (4109)\n+33976 Uncompressed Size     0000100D (4109)\n+\n+3397A LOCAL HEADER #82      04034B50 (67324752)\n+3397E Extract Zip Spec      14 (20) '2.0'\n+3397F Extract OS            00 (0) 'MS-DOS'\n+33980 General Purpose Flag  0008 (8)\n+      [Bit  3]              1 'Streamed'\n+33982 Compression Method    0000 (0) 'Stored'\n+33984 Modification Time     EC210000 (3961585664) 'Wed Jan  1 00:00:00 2098'\n+33988 CRC                   00000000 (0)\n+3398C Compressed Size       00000000 (0)\n+33990 Uncompressed Size     00000000 (0)\n+33994 Filename Length       004B (75)\n+33996 Extra Length          0009 (9)\n+33998 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+#\n+# WARNING: Offset 0x33998: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+#          Zero length filename\n+#\n+339E3 Extra ID #1           5455 (21589) 'Extended Timestamp [UT]'\n+339E5   Length              0005 (5)\n+339E7   Flags               01 (1) 'Modification'\n+339E8   Modification Time   00000000 (0) 'Thu Jan  1 00:00:00 1970'\n+339EC PAYLOAD\n+\n+36FB7 DATA DESCRIPTOR       08074B50 (134695760)\n+36FBB CRC                   D85C97E6 (3629946854)\n+36FBF Compressed Size       000035CB (13771)\n+36FC3 Uncompressed Size     000035CB (13771)\n+\n+36FC7 LOCAL HEADER #83      04034B50 (67324752)\n+36FCB Extract Zip Spec      14 (20) '2.0'\n+36FCC Extract OS            00 (0) 'MS-DOS'\n+36FCD General Purpose Flag  0008 (8)\n+      [Bit  3]              1 'Streamed'\n+36FCF Compression Method    0000 (0) 'Stored'\n+36FD1 Modification Time     EC210000 (3961585664) 'Wed Jan  1 00:00:00 2098'\n+36FD5 CRC                   00000000 (0)\n+36FD9 Compressed Size       00000000 (0)\n+36FDD Uncompressed Size     00000000 (0)\n+36FE1 Filename Length       0053 (83)\n+36FE3 Extra Length          0009 (9)\n+36FE5 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+#\n+# WARNING: Offset 0x36FE5: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+#          Zero length filename\n+#\n+37038 Extra ID #1           5455 (21589) 'Extended Timestamp [UT]'\n+3703A   Length              0005 (5)\n+3703C   Flags               01 (1) 'Modification'\n+3703D   Modification Time   00000000 (0) 'Thu Jan  1 00:00:00 1970'\n+37041 PAYLOAD\n+\n+378E3 DATA DESCRIPTOR       08074B50 (134695760)\n+378E7 CRC                   790FD089 (2031079561)\n+378EB Compressed Size       000008A2 (2210)\n+378EF Uncompressed Size     000008A2 (2210)\n+\n+378F3 LOCAL HEADER #84      04034B50 (67324752)\n+378F7 Extract Zip Spec      14 (20) '2.0'\n+378F8 Extract OS            00 (0) 'MS-DOS'\n+378F9 General Purpose Flag  0008 (8)\n+      [Bit  3]              1 'Streamed'\n+378FB Compression Method    0000 (0) 'Stored'\n+378FD Modification Time     EC210000 (3961585664) 'Wed Jan  1 00:00:00 2098'\n+37901 CRC                   00000000 (0)\n+37905 Compressed Size       00000000 (0)\n+37909 Uncompressed Size     00000000 (0)\n+3790D Filename Length       0050 (80)\n+3790F Extra Length          0009 (9)\n+37911 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+#\n+# WARNING: Offset 0x37911: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+#          Zero length filename\n+#\n+37961 Extra ID #1           5455 (21589) 'Extended Timestamp [UT]'\n+37963   Length              0005 (5)\n+37965   Flags               01 (1) 'Modification'\n+37966   Modification Time   00000000 (0) 'Thu Jan  1 00:00:00 1970'\n+3796A PAYLOAD\n+\n+38841 DATA DESCRIPTOR       08074B50 (134695760)\n+38845 CRC                   85FEC00A (2248065034)\n+38849 Compressed Size       00000ED7 (3799)\n+3884D Uncompressed Size     00000ED7 (3799)\n+\n+38851 LOCAL HEADER #85      04034B50 (67324752)\n+38855 Extract Zip Spec      14 (20) '2.0'\n+38856 Extract OS            00 (0) 'MS-DOS'\n+38857 General Purpose Flag  0008 (8)\n+      [Bit  3]              1 'Streamed'\n+38859 Compression Method    0000 (0) 'Stored'\n+3885B Modification Time     EC210000 (3961585664) 'Wed Jan  1 00:00:00 2098'\n+3885F CRC                   00000000 (0)\n+38863 Compressed Size       00000000 (0)\n+38867 Uncompressed Size     00000000 (0)\n+3886B Filename Length       0048 (72)\n+3886D Extra Length          0009 (9)\n+3886F Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+#\n+# WARNING: Offset 0x3886F: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+#          Zero length filename\n+#\n+388B7 Extra ID #1           5455 (21589) 'Extended Timestamp [UT]'\n+388B9   Length              0005 (5)\n+388BB   Flags               01 (1) 'Modification'\n+388BC   Modification Time   00000000 (0) 'Thu Jan  1 00:00:00 1970'\n+388C0 PAYLOAD\n+\n+3913F DATA DESCRIPTOR       08074B50 (134695760)\n+39143 CRC                   ACB394E1 (2897450209)\n+39147 Compressed Size       0000087F (2175)\n+3914B Uncompressed Size     0000087F (2175)\n+\n+3914F LOCAL HEADER #86      04034B50 (67324752)\n+39153 Extract Zip Spec      14 (20) '2.0'\n+39154 Extract OS            00 (0) 'MS-DOS'\n+39155 General Purpose Flag  0000 (0)\n+39157 Compression Method    0000 (0) 'Stored'\n+39159 Modification Time     EC210000 (3961585664) 'Wed Jan  1 00:00:00 2098'\n+3915D CRC                   00000000 (0)\n+39161 Compressed Size       00000000 (0)\n+39165 Uncompressed Size     00000000 (0)\n+39169 Filename Length       0030 (48)\n+3916B Extra Length          0009 (9)\n+3916D Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+#\n+# WARNING: Offset 0x3916D: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+#          Zero length filename\n+#\n+3919D Extra ID #1           5455 (21589) 'Extended Timestamp [UT]'\n+3919F   Length              0005 (5)\n+391A1   Flags               01 (1) 'Modification'\n+391A2   Modification Time   00000000 (0) 'Thu Jan  1 00:00:00 1970'\n+\n+391A6 LOCAL HEADER #87      04034B50 (67324752)\n+391AA Extract Zip Spec      14 (20) '2.0'\n+391AB Extract OS            00 (0) 'MS-DOS'\n+391AC General Purpose Flag  0008 (8)\n+      [Bit  3]              1 'Streamed'\n+391AE Compression Method    0000 (0) 'Stored'\n+391B0 Modification Time     EC210000 (3961585664) 'Wed Jan  1 00:00:00 2098'\n+391B4 CRC                   00000000 (0)\n+391B8 Compressed Size       00000000 (0)\n+391BC Uncompressed Size     00000000 (0)\n+391C0 Filename Length       0054 (84)\n+391C2 Extra Length          0009 (9)\n+391C4 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+#\n+# WARNING: Offset 0x391C4: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+#          Zero length filename\n+#\n+39218 Extra ID #1           5455 (21589) 'Extended Timestamp [UT]'\n+3921A   Length              0005 (5)\n+3921C   Flags               01 (1) 'Modification'\n+3921D   Modification Time   00000000 (0) 'Thu Jan  1 00:00:00 1970'\n+39221 PAYLOAD\n+\n+3C1B0 DATA DESCRIPTOR       08074B50 (134695760)\n+3C1B4 CRC                   AF38F813 (2939746323)\n+3C1B8 Compressed Size       00002F8F (12175)\n+3C1BC Uncompressed Size     00002F8F (12175)\n+\n+3C1C0 LOCAL HEADER #88      04034B50 (67324752)\n+3C1C4 Extract Zip Spec      14 (20) '2.0'\n+3C1C5 Extract OS            00 (0) 'MS-DOS'\n+3C1C6 General Purpose Flag  0008 (8)\n+      [Bit  3]              1 'Streamed'\n+3C1C8 Compression Method    0000 (0) 'Stored'\n+3C1CA Modification Time     EC210000 (3961585664) 'Wed Jan  1 00:00:00 2098'\n+3C1CE CRC                   00000000 (0)\n+3C1D2 Compressed Size       00000000 (0)\n+3C1D6 Uncompressed Size     00000000 (0)\n+3C1DA Filename Length       004E (78)\n+3C1DC Extra Length          0009 (9)\n+3C1DE Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+#\n+# WARNING: Offset 0x3C1DE: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+#          Zero length filename\n+#\n+3C22C Extra ID #1           5455 (21589) 'Extended Timestamp [UT]'\n+3C22E   Length              0005 (5)\n+3C230   Flags               01 (1) 'Modification'\n+3C231   Modification Time   00000000 (0) 'Thu Jan  1 00:00:00 1970'\n+3C235 PAYLOAD\n+\n+3E04E DATA DESCRIPTOR       08074B50 (134695760)\n+3E052 CRC                   6659263F (1717118527)\n+3E056 Compressed Size       00001E19 (7705)\n+3E05A Uncompressed Size     00001E19 (7705)\n+\n+3E05E LOCAL HEADER #89      04034B50 (67324752)\n+3E062 Extract Zip Spec      14 (20) '2.0'\n+3E063 Extract OS            00 (0) 'MS-DOS'\n+3E064 General Purpose Flag  0000 (0)\n+3E066 Compression Method    0000 (0) 'Stored'\n+3E068 Modification Time     EC210000 (3961585664) 'Wed Jan  1 00:00:00 2098'\n+3E06C CRC                   00000000 (0)\n+3E070 Compressed Size       00000000 (0)\n+3E074 Uncompressed Size     00000000 (0)\n+3E078 Filename Length       002B (43)\n+3E07A Extra Length          0009 (9)\n+3E07C Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+#\n+# WARNING: Offset 0x3E07C: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+#          Zero length filename\n+#\n+3E0A7 Extra ID #1           5455 (21589) 'Extended Timestamp [UT]'\n+3E0A9   Length              0005 (5)\n+3E0AB   Flags               01 (1) 'Modification'\n+3E0AC   Modification Time   00000000 (0) 'Thu Jan  1 00:00:00 1970'\n+\n+3E0B0 LOCAL HEADER #90      04034B50 (67324752)\n+3E0B4 Extract Zip Spec      14 (20) '2.0'\n+3E0B5 Extract OS            00 (0) 'MS-DOS'\n+3E0B6 General Purpose Flag  0008 (8)\n+      [Bit  3]              1 'Streamed'\n+3E0B8 Compression Method    0000 (0) 'Stored'\n+3E0BA Modification Time     EC210000 (3961585664) 'Wed Jan  1 00:00:00 2098'\n+3E0BE CRC                   00000000 (0)\n+3E0C2 Compressed Size       00000000 (0)\n+3E0C6 Uncompressed Size     00000000 (0)\n+3E0CA Filename Length       0051 (81)\n+3E0CC Extra Length          0009 (9)\n+3E0CE Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+#\n+# WARNING: Offset 0x3E0CE: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+#          Zero length filename\n+#\n+3E11F Extra ID #1           5455 (21589) 'Extended Timestamp [UT]'\n+3E121   Length              0005 (5)\n+3E123   Flags               01 (1) 'Modification'\n+3E124   Modification Time   00000000 (0) 'Thu Jan  1 00:00:00 1970'\n+3E128 PAYLOAD\n+\n+3EE07 DATA DESCRIPTOR       08074B50 (134695760)\n+3EE0B CRC                   1E182794 (504899476)\n+3EE0F Compressed Size       00000CDF (3295)\n+3EE13 Uncompressed Size     00000CDF (3295)\n+\n+3EE17 LOCAL HEADER #91      04034B50 (67324752)\n+3EE1B Extract Zip Spec      14 (20) '2.0'\n+3EE1C Extract OS            00 (0) 'MS-DOS'\n+3EE1D General Purpose Flag  0008 (8)\n+      [Bit  3]              1 'Streamed'\n+3EE1F Compression Method    0000 (0) 'Stored'\n+3EE21 Modification Time     EC210000 (3961585664) 'Wed Jan  1 00:00:00 2098'\n+3EE25 CRC                   00000000 (0)\n+3EE29 Compressed Size       00000000 (0)\n+3EE2D Uncompressed Size     00000000 (0)\n+3EE31 Filename Length       0047 (71)\n+3EE33 Extra Length          0009 (9)\n+3EE35 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+#\n+# WARNING: Offset 0x3EE35: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+#          Zero length filename\n+#\n+3EE7C Extra ID #1           5455 (21589) 'Extended Timestamp [UT]'\n+3EE7E   Length              0005 (5)\n+3EE80   Flags               01 (1) 'Modification'\n+3EE81   Modification Time   00000000 (0) 'Thu Jan  1 00:00:00 1970'\n+3EE85 PAYLOAD\n+\n+3F231 DATA DESCRIPTOR       08074B50 (134695760)\n+3F235 CRC                   6D847AE7 (1837398759)\n+3F239 Compressed Size       000003AC (940)\n+3F23D Uncompressed Size     000003AC (940)\n+\n+3F241 LOCAL HEADER #92      04034B50 (67324752)\n+3F245 Extract Zip Spec      14 (20) '2.0'\n+3F246 Extract OS            00 (0) 'MS-DOS'\n+3F247 General Purpose Flag  0008 (8)\n+      [Bit  3]              1 'Streamed'\n+3F249 Compression Method    0000 (0) 'Stored'\n+3F24B Modification Time     EC210000 (3961585664) 'Wed Jan  1 00:00:00 2098'\n+3F24F CRC                   00000000 (0)\n+3F253 Compressed Size       00000000 (0)\n+3F257 Uncompressed Size     00000000 (0)\n+3F25B Filename Length       004A (74)\n+3F25D Extra Length          0009 (9)\n+3F25F Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+#\n+# WARNING: Offset 0x3F25F: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+#          Zero length filename\n+#\n+3F2A9 Extra ID #1           5455 (21589) 'Extended Timestamp [UT]'\n+3F2AB   Length              0005 (5)\n+3F2AD   Flags               01 (1) 'Modification'\n+3F2AE   Modification Time   00000000 (0) 'Thu Jan  1 00:00:00 1970'\n+3F2B2 PAYLOAD\n+\n+3F71F DATA DESCRIPTOR       08074B50 (134695760)\n+3F723 CRC                   21E16F63 (568422243)\n+3F727 Compressed Size       0000046D (1133)\n+3F72B Uncompressed Size     0000046D (1133)\n+\n+3F72F LOCAL HEADER #93      04034B50 (67324752)\n+3F733 Extract Zip Spec      14 (20) '2.0'\n+3F734 Extract OS            00 (0) 'MS-DOS'\n+3F735 General Purpose Flag  0008 (8)\n+      [Bit  3]              1 'Streamed'\n+3F737 Compression Method    0000 (0) 'Stored'\n+3F739 Modification Time     EC210000 (3961585664) 'Wed Jan  1 00:00:00 2098'\n+3F73D CRC                   00000000 (0)\n+3F741 Compressed Size       00000000 (0)\n+3F745 Uncompressed Size     00000000 (0)\n+3F749 Filename Length       0040 (64)\n+3F74B Extra Length          0009 (9)\n+3F74D Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+#\n+# WARNING: Offset 0x3F74D: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+#          Zero length filename\n+#\n+3F78D Extra ID #1           5455 (21589) 'Extended Timestamp [UT]'\n+3F78F   Length              0005 (5)\n+3F791   Flags               01 (1) 'Modification'\n+3F792   Modification Time   00000000 (0) 'Thu Jan  1 00:00:00 1970'\n+3F796 PAYLOAD\n+\n+432DF DATA DESCRIPTOR       08074B50 (134695760)\n+432E3 CRC                   0709B18C (118075788)\n+432E7 Compressed Size       00003B49 (15177)\n+432EB Uncompressed Size     00003B49 (15177)\n+\n+432EF LOCAL HEADER #94      04034B50 (67324752)\n+432F3 Extract Zip Spec      14 (20) '2.0'\n+432F4 Extract OS            00 (0) 'MS-DOS'\n+432F5 General Purpose Flag  0008 (8)\n+      [Bit  3]              1 'Streamed'\n+432F7 Compression Method    0000 (0) 'Stored'\n+432F9 Modification Time     EC210000 (3961585664) 'Wed Jan  1 00:00:00 2098'\n+432FD CRC                   00000000 (0)\n+43301 Compressed Size       00000000 (0)\n+43305 Uncompressed Size     00000000 (0)\n+43309 Filename Length       0044 (68)\n+4330B Extra Length          0009 (9)\n+4330D Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+#\n+# WARNING: Offset 0x4330D: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+#          Zero length filename\n+#\n+43351 Extra ID #1           5455 (21589) 'Extended Timestamp [UT]'\n+43353   Length              0005 (5)\n+43355   Flags               01 (1) 'Modification'\n+43356   Modification Time   00000000 (0) 'Thu Jan  1 00:00:00 1970'\n+4335A PAYLOAD\n+\n+43E5A DATA DESCRIPTOR       08074B50 (134695760)\n+43E5E CRC                   E2477A52 (3796335186)\n+43E62 Compressed Size       00000B00 (2816)\n+43E66 Uncompressed Size     00000B00 (2816)\n+\n+43E6A LOCAL HEADER #95      04034B50 (67324752)\n+43E6E Extract Zip Spec      14 (20) '2.0'\n+43E6F Extract OS            00 (0) 'MS-DOS'\n+43E70 General Purpose Flag  0008 (8)\n+      [Bit  3]              1 'Streamed'\n+43E72 Compression Method    0000 (0) 'Stored'\n+43E74 Modification Time     EC210000 (3961585664) 'Wed Jan  1 00:00:00 2098'\n+43E78 CRC                   00000000 (0)\n+43E7C Compressed Size       00000000 (0)\n+43E80 Uncompressed Size     00000000 (0)\n+43E84 Filename Length       0045 (69)\n+43E86 Extra Length          0009 (9)\n+43E88 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+#\n+# WARNING: Offset 0x43E88: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+#          Zero length filename\n+#\n+43ECD Extra ID #1           5455 (21589) 'Extended Timestamp [UT]'\n+43ECF   Length              0005 (5)\n+43ED1   Flags               01 (1) 'Modification'\n+43ED2   Modification Time   00000000 (0) 'Thu Jan  1 00:00:00 1970'\n+43ED6 PAYLOAD\n+\n+450DE DATA DESCRIPTOR       08074B50 (134695760)\n+450E2 CRC                   00160E4A (1445450)\n+450E6 Compressed Size       00001208 (4616)\n+450EA Uncompressed Size     00001208 (4616)\n+\n+450EE LOCAL HEADER #96      04034B50 (67324752)\n+450F2 Extract Zip Spec      14 (20) '2.0'\n+450F3 Extract OS            00 (0) 'MS-DOS'\n+450F4 General Purpose Flag  0008 (8)\n+      [Bit  3]              1 'Streamed'\n+450F6 Compression Method    0000 (0) 'Stored'\n+450F8 Modification Time     EC210000 (3961585664) 'Wed Jan  1 00:00:00 2098'\n+450FC CRC                   00000000 (0)\n+45100 Compressed Size       00000000 (0)\n+45104 Uncompressed Size     00000000 (0)\n+45108 Filename Length       0050 (80)\n+4510A Extra Length          0009 (9)\n+4510C Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+#\n+# WARNING: Offset 0x4510C: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+#          Zero length filename\n+#\n+4515C Extra ID #1           5455 (21589) 'Extended Timestamp [UT]'\n+4515E   Length              0005 (5)\n+45160   Flags               01 (1) 'Modification'\n+45161   Modification Time   00000000 (0) 'Thu Jan  1 00:00:00 1970'\n+45165 PAYLOAD\n+\n+45BD5 DATA DESCRIPTOR       08074B50 (134695760)\n+45BD9 CRC                   6EF68498 (1861649560)\n+45BDD Compressed Size       00000A70 (2672)\n+45BE1 Uncompressed Size     00000A70 (2672)\n+\n+45BE5 LOCAL HEADER #97      04034B50 (67324752)\n+45BE9 Extract Zip Spec      14 (20) '2.0'\n+45BEA Extract OS            00 (0) 'MS-DOS'\n+45BEB General Purpose Flag  0008 (8)\n+      [Bit  3]              1 'Streamed'\n+45BED Compression Method    0000 (0) 'Stored'\n+45BEF Modification Time     EC210000 (3961585664) 'Wed Jan  1 00:00:00 2098'\n+45BF3 CRC                   00000000 (0)\n+45BF7 Compressed Size       00000000 (0)\n+45BFB Uncompressed Size     00000000 (0)\n+45BFF Filename Length       0032 (50)\n+45C01 Extra Length          0009 (9)\n+45C03 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+#\n+# WARNING: Offset 0x45C03: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+#          Zero length filename\n+#\n+45C35 Extra ID #1           5455 (21589) 'Extended Timestamp [UT]'\n+45C37   Length              0005 (5)\n+45C39   Flags               01 (1) 'Modification'\n+45C3A   Modification Time   00000000 (0) 'Thu Jan  1 00:00:00 1970'\n+45C3E PAYLOAD\n+\n+46057 DATA DESCRIPTOR       08074B50 (134695760)\n+4605B CRC                   0DCE7BD6 (231635926)\n+4605F Compressed Size       00000419 (1049)\n+46063 Uncompressed Size     00000419 (1049)\n+\n+46067 LOCAL HEADER #98      04034B50 (67324752)\n+4606B Extract Zip Spec      14 (20) '2.0'\n+4606C Extract OS            00 (0) 'MS-DOS'\n+4606D General Purpose Flag  0000 (0)\n+4606F Compression Method    0000 (0) 'Stored'\n+46071 Modification Time     EC210000 (3961585664) 'Wed Jan  1 00:00:00 2098'\n+46075 CRC                   00000000 (0)\n+46079 Compressed Size       00000000 (0)\n+4607D Uncompressed Size     00000000 (0)\n+46081 Filename Length       002A (42)\n+46083 Extra Length          0009 (9)\n+46085 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+#\n+# WARNING: Offset 0x46085: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+#          Zero length filename\n+#\n+460AF Extra ID #1           5455 (21589) 'Extended Timestamp [UT]'\n+460B1   Length              0005 (5)\n+460B3   Flags               01 (1) 'Modification'\n+460B4   Modification Time   00000000 (0) 'Thu Jan  1 00:00:00 1970'\n+\n+460B8 LOCAL HEADER #99      04034B50 (67324752)\n+460BC Extract Zip Spec      14 (20) '2.0'\n+460BD Extract OS            00 (0) 'MS-DOS'\n+460BE General Purpose Flag  0008 (8)\n+      [Bit  3]              1 'Streamed'\n+460C0 Compression Method    0000 (0) 'Stored'\n+460C2 Modification Time     EC210000 (3961585664) 'Wed Jan  1 00:00:00 2098'\n+460C6 CRC                   00000000 (0)\n+460CA Compressed Size       00000000 (0)\n+460CE Uncompressed Size     00000000 (0)\n+460D2 Filename Length       004C (76)\n+460D4 Extra Length          0009 (9)\n+460D6 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+#\n+# WARNING: Offset 0x460D6: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+#          Zero length filename\n+#\n+46122 Extra ID #1           5455 (21589) 'Extended Timestamp [UT]'\n+46124   Length              0005 (5)\n+46126   Flags               01 (1) 'Modification'\n+46127   Modification Time   00000000 (0) 'Thu Jan  1 00:00:00 1970'\n+4612B PAYLOAD\n+\n+46803 DATA DESCRIPTOR       08074B50 (134695760)\n+46807 CRC                   3EC7C431 (1053279281)\n+4680B Compressed Size       000006D8 (1752)\n+4680F Uncompressed Size     000006D8 (1752)\n+\n+46813 LOCAL HEADER #100     04034B50 (67324752)\n+46817 Extract Zip Spec      14 (20) '2.0'\n+46818 Extract OS            00 (0) 'MS-DOS'\n+46819 General Purpose Flag  0008 (8)\n+      [Bit  3]              1 'Streamed'\n+4681B Compression Method    0000 (0) 'Stored'\n+4681D Modification Time     EC210000 (3961585664) 'Wed Jan  1 00:00:00 2098'\n+46821 CRC                   00000000 (0)\n+46825 Compressed Size       00000000 (0)\n+46829 Uncompressed Size     00000000 (0)\n+4682D Filename Length       0046 (70)\n+4682F Extra Length          0009 (9)\n+46831 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+#\n+# WARNING: Offset 0x46831: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+#          Zero length filename\n+#\n+46877 Extra ID #1           5455 (21589) 'Extended Timestamp [UT]'\n+46879   Length              0005 (5)\n+4687B   Flags               01 (1) 'Modification'\n+4687C   Modification Time   00000000 (0) 'Thu Jan  1 00:00:00 1970'\n+46880 PAYLOAD\n+\n+46F4E DATA DESCRIPTOR       08074B50 (134695760)\n+46F52 CRC                   0AF6711C (183922972)\n+46F56 Compressed Size       000006CE (1742)\n+46F5A Uncompressed Size     000006CE (1742)\n+\n+46F5E LOCAL HEADER #101     04034B50 (67324752)\n+46F62 Extract Zip Spec      14 (20) '2.0'\n+46F63 Extract OS            00 (0) 'MS-DOS'\n+46F64 General Purpose Flag  0000 (0)\n+46F66 Compression Method    0000 (0) 'Stored'\n+46F68 Modification Time     EC210000 (3961585664) 'Wed Jan  1 00:00:00 2098'\n+46F6C CRC                   00000000 (0)\n+46F70 Compressed Size       00000000 (0)\n+46F74 Uncompressed Size     00000000 (0)\n+46F78 Filename Length       0026 (38)\n+46F7A Extra Length          0009 (9)\n+46F7C Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+#\n+# WARNING: Offset 0x46F7C: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+#          Zero length filename\n+#\n+46FA2 Extra ID #1           5455 (21589) 'Extended Timestamp [UT]'\n+46FA4   Length              0005 (5)\n+46FA6   Flags               01 (1) 'Modification'\n+46FA7   Modification Time   00000000 (0) 'Thu Jan  1 00:00:00 1970'\n+\n+46FAB LOCAL HEADER #102     04034B50 (67324752)\n+46FAF Extract Zip Spec      14 (20) '2.0'\n+46FB0 Extract OS            00 (0) 'MS-DOS'\n+46FB1 General Purpose Flag  0008 (8)\n+      [Bit  3]              1 'Streamed'\n+46FB3 Compression Method    0000 (0) 'Stored'\n+46FB5 Modification Time     EC210000 (3961585664) 'Wed Jan  1 00:00:00 2098'\n+46FB9 CRC                   00000000 (0)\n+46FBD Compressed Size       00000000 (0)\n+46FC1 Uncompressed Size     00000000 (0)\n+46FC5 Filename Length       0047 (71)\n+46FC7 Extra Length          0009 (9)\n+46FC9 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+#\n+# WARNING: Offset 0x46FC9: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+#          Zero length filename\n+#\n+47010 Extra ID #1           5455 (21589) 'Extended Timestamp [UT]'\n+47012   Length              0005 (5)\n+47014   Flags               01 (1) 'Modification'\n+47015   Modification Time   00000000 (0) 'Thu Jan  1 00:00:00 1970'\n+47019 PAYLOAD\n+\n+47FAE DATA DESCRIPTOR       08074B50 (134695760)\n+47FB2 CRC                   AA7692A4 (2859897508)\n+47FB6 Compressed Size       00000F95 (3989)\n+47FBA Uncompressed Size     00000F95 (3989)\n+\n+47FBE LOCAL HEADER #103     04034B50 (67324752)\n+47FC2 Extract Zip Spec      14 (20) '2.0'\n+47FC3 Extract OS            00 (0) 'MS-DOS'\n+47FC4 General Purpose Flag  0008 (8)\n+      [Bit  3]              1 'Streamed'\n+47FC6 Compression Method    0000 (0) 'Stored'\n+47FC8 Modification Time     EC210000 (3961585664) 'Wed Jan  1 00:00:00 2098'\n+47FCC CRC                   00000000 (0)\n+47FD0 Compressed Size       00000000 (0)\n+47FD4 Uncompressed Size     00000000 (0)\n+47FD8 Filename Length       003B (59)\n+47FDA Extra Length          0009 (9)\n+47FDC Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+#\n+# WARNING: Offset 0x47FDC: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+#          Zero length filename\n+#\n+48017 Extra ID #1           5455 (21589) 'Extended Timestamp [UT]'\n+48019   Length              0005 (5)\n+4801B   Flags               01 (1) 'Modification'\n+4801C   Modification Time   00000000 (0) 'Thu Jan  1 00:00:00 1970'\n+48020 PAYLOAD\n+\n+4AD39 DATA DESCRIPTOR       08074B50 (134695760)\n+4AD3D CRC                   B7357AFB (3073735419)\n+4AD41 Compressed Size       00002D19 (11545)\n+4AD45 Uncompressed Size     00002D19 (11545)\n+\n+4AD49 LOCAL HEADER #104     04034B50 (67324752)\n+4AD4D Extract Zip Spec      14 (20) '2.0'\n+4AD4E Extract OS            00 (0) 'MS-DOS'\n+4AD4F General Purpose Flag  0008 (8)\n+      [Bit  3]              1 'Streamed'\n+4AD51 Compression Method    0000 (0) 'Stored'\n+4AD53 Modification Time     EC210000 (3961585664) 'Wed Jan  1 00:00:00 2098'\n+4AD57 CRC                   00000000 (0)\n+4AD5B Compressed Size       00000000 (0)\n+4AD5F Uncompressed Size     00000000 (0)\n+4AD63 Filename Length       004E (78)\n+4AD65 Extra Length          0009 (9)\n+4AD67 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+#\n+# WARNING: Offset 0x4AD67: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+#          Zero length filename\n+#\n+4ADB5 Extra ID #1           5455 (21589) 'Extended Timestamp [UT]'\n+4ADB7   Length              0005 (5)\n+4ADB9   Flags               01 (1) 'Modification'\n+4ADBA   Modification Time   00000000 (0) 'Thu Jan  1 00:00:00 1970'\n+4ADBE PAYLOAD\n+\n+4BACA DATA DESCRIPTOR       08074B50 (134695760)\n+4BACE CRC                   C79AC1A5 (3348808101)\n+4BAD2 Compressed Size       00000D0C (3340)\n+4BAD6 Uncompressed Size     00000D0C (3340)\n+\n+4BADA LOCAL HEADER #105     04034B50 (67324752)\n+4BADE Extract Zip Spec      14 (20) '2.0'\n+4BADF Extract OS            00 (0) 'MS-DOS'\n+4BAE0 General Purpose Flag  0008 (8)\n+      [Bit  3]              1 'Streamed'\n+4BAE2 Compression Method    0000 (0) 'Stored'\n+4BAE4 Modification Time     EC210000 (3961585664) 'Wed Jan  1 00:00:00 2098'\n+4BAE8 CRC                   00000000 (0)\n+4BAEC Compressed Size       00000000 (0)\n+4BAF0 Uncompressed Size     00000000 (0)\n+4BAF4 Filename Length       0042 (66)\n+4BAF6 Extra Length          0009 (9)\n+4BAF8 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+#\n+# WARNING: Offset 0x4BAF8: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+#          Zero length filename\n+#\n+4BB3A Extra ID #1           5455 (21589) 'Extended Timestamp [UT]'\n+4BB3C   Length              0005 (5)\n+4BB3E   Flags               01 (1) 'Modification'\n+4BB3F   Modification Time   00000000 (0) 'Thu Jan  1 00:00:00 1970'\n+4BB43 PAYLOAD\n+\n+4BEEC DATA DESCRIPTOR       08074B50 (134695760)\n+4BEF0 CRC                   09C52AF8 (163916536)\n+4BEF4 Compressed Size       000003A9 (937)\n+4BEF8 Uncompressed Size     000003A9 (937)\n+\n+4BEFC LOCAL HEADER #106     04034B50 (67324752)\n+4BF00 Extract Zip Spec      14 (20) '2.0'\n+4BF01 Extract OS            00 (0) 'MS-DOS'\n+4BF02 General Purpose Flag  0008 (8)\n+      [Bit  3]              1 'Streamed'\n+4BF04 Compression Method    0000 (0) 'Stored'\n+4BF06 Modification Time     EC210000 (3961585664) 'Wed Jan  1 00:00:00 2098'\n+4BF0A CRC                   00000000 (0)\n+4BF0E Compressed Size       00000000 (0)\n+4BF12 Uncompressed Size     00000000 (0)\n+4BF16 Filename Length       003C (60)\n+4BF18 Extra Length          0009 (9)\n+4BF1A Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+#\n+# WARNING: Offset 0x4BF1A: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+#          Zero length filename\n+#\n+4BF56 Extra ID #1           5455 (21589) 'Extended Timestamp [UT]'\n+4BF58   Length              0005 (5)\n+4BF5A   Flags               01 (1) 'Modification'\n+4BF5B   Modification Time   00000000 (0) 'Thu Jan  1 00:00:00 1970'\n+4BF5F PAYLOAD\n+\n+53199 DATA DESCRIPTOR       08074B50 (134695760)\n+5319D CRC                   963EDCDB (2520702171)\n+531A1 Compressed Size       0000723A (29242)\n+531A5 Uncompressed Size     0000723A (29242)\n+\n+531A9 LOCAL HEADER #107     04034B50 (67324752)\n+531AD Extract Zip Spec      14 (20) '2.0'\n+531AE Extract OS            00 (0) 'MS-DOS'\n+531AF General Purpose Flag  0008 (8)\n+      [Bit  3]              1 'Streamed'\n+531B1 Compression Method    0000 (0) 'Stored'\n+531B3 Modification Time     EC210000 (3961585664) 'Wed Jan  1 00:00:00 2098'\n+531B7 CRC                   00000000 (0)\n+531BB Compressed Size       00000000 (0)\n+531BF Uncompressed Size     00000000 (0)\n+531C3 Filename Length       003B (59)\n+531C5 Extra Length          0009 (9)\n+531C7 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+#\n+# WARNING: Offset 0x531C7: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+#          Zero length filename\n+#\n+53202 Extra ID #1           5455 (21589) 'Extended Timestamp [UT]'\n+53204   Length              0005 (5)\n+53206   Flags               01 (1) 'Modification'\n+53207   Modification Time   00000000 (0) 'Thu Jan  1 00:00:00 1970'\n+5320B PAYLOAD\n+\n+5C7C4 DATA DESCRIPTOR       08074B50 (134695760)\n+5C7C8 CRC                   180ADDBE (403365310)\n+5C7CC Compressed Size       000095B9 (38329)\n+5C7D0 Uncompressed Size     000095B9 (38329)\n+\n+5C7D4 LOCAL HEADER #108     04034B50 (67324752)\n+5C7D8 Extract Zip Spec      14 (20) '2.0'\n+5C7D9 Extract OS            00 (0) 'MS-DOS'\n+5C7DA General Purpose Flag  0008 (8)\n+      [Bit  3]              1 'Streamed'\n+5C7DC Compression Method    0000 (0) 'Stored'\n+5C7DE Modification Time     EC210000 (3961585664) 'Wed Jan  1 00:00:00 2098'\n+5C7E2 CRC                   00000000 (0)\n+5C7E6 Compressed Size       00000000 (0)\n+5C7EA Uncompressed Size     00000000 (0)\n+5C7EE Filename Length       0043 (67)\n+5C7F0 Extra Length          0009 (9)\n+5C7F2 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+#\n+# WARNING: Offset 0x5C7F2: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+#          Zero length filename\n+#\n+5C835 Extra ID #1           5455 (21589) 'Extended Timestamp [UT]'\n+5C837   Length              0005 (5)\n+5C839   Flags               01 (1) 'Modification'\n+5C83A   Modification Time   00000000 (0) 'Thu Jan  1 00:00:00 1970'\n+5C83E PAYLOAD\n+\n+5D0A2 DATA DESCRIPTOR       08074B50 (134695760)\n+5D0A6 CRC                   7701B7FD (1996601341)\n+5D0AA Compressed Size       00000864 (2148)\n+5D0AE Uncompressed Size     00000864 (2148)\n+\n+5D0B2 LOCAL HEADER #109     04034B50 (67324752)\n+5D0B6 Extract Zip Spec      14 (20) '2.0'\n+5D0B7 Extract OS            00 (0) 'MS-DOS'\n+5D0B8 General Purpose Flag  0000 (0)\n+5D0BA Compression Method    0000 (0) 'Stored'\n+5D0BC Modification Time     EC210000 (3961585664) 'Wed Jan  1 00:00:00 2098'\n+5D0C0 CRC                   00000000 (0)\n+5D0C4 Compressed Size       00000000 (0)\n+5D0C8 Uncompressed Size     00000000 (0)\n+5D0CC Filename Length       0020 (32)\n+5D0CE Extra Length          0009 (9)\n+5D0D0 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+#\n+# WARNING: Offset 0x5D0D0: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+#          Zero length filename\n+#\n+5D0F0 Extra ID #1           5455 (21589) 'Extended Timestamp [UT]'\n+5D0F2   Length              0005 (5)\n+5D0F4   Flags               01 (1) 'Modification'\n+5D0F5   Modification Time   00000000 (0) 'Thu Jan  1 00:00:00 1970'\n+\n+5D0F9 LOCAL HEADER #110     04034B50 (67324752)\n+5D0FD Extract Zip Spec      14 (20) '2.0'\n+5D0FE Extract OS            00 (0) 'MS-DOS'\n+5D0FF General Purpose Flag  0008 (8)\n+      [Bit  3]              1 'Streamed'\n+5D101 Compression Method    0000 (0) 'Stored'\n+5D103 Modification Time     EC210000 (3961585664) 'Wed Jan  1 00:00:00 2098'\n+5D107 CRC                   00000000 (0)\n+5D10B Compressed Size       00000000 (0)\n+5D10F Uncompressed Size     00000000 (0)\n+5D113 Filename Length       0036 (54)\n+5D115 Extra Length          0009 (9)\n+5D117 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+#\n+# WARNING: Offset 0x5D117: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+#          Zero length filename\n+#\n+5D14D Extra ID #1           5455 (21589) 'Extended Timestamp [UT]'\n+5D14F   Length              0005 (5)\n+5D151   Flags               01 (1) 'Modification'\n+5D152   Modification Time   00000000 (0) 'Thu Jan  1 00:00:00 1970'\n+5D156 PAYLOAD\n+\n+5E323 DATA DESCRIPTOR       08074B50 (134695760)\n+5E327 CRC                   B5B90B55 (3048803157)\n+5E32B Compressed Size       000011CD (4557)\n+5E32F Uncompressed Size     000011CD (4557)\n+\n+5E333 LOCAL HEADER #111     04034B50 (67324752)\n+5E337 Extract Zip Spec      14 (20) '2.0'\n+5E338 Extract OS            00 (0) 'MS-DOS'\n+5E339 General Purpose Flag  0008 (8)\n+      [Bit  3]              1 'Streamed'\n+5E33B Compression Method    0000 (0) 'Stored'\n+5E33D Modification Time     EC210000 (3961585664) 'Wed Jan  1 00:00:00 2098'\n+5E341 CRC                   00000000 (0)\n+5E345 Compressed Size       00000000 (0)\n+5E349 Uncompressed Size     00000000 (0)\n+5E34D Filename Length       0039 (57)\n+5E34F Extra Length          0009 (9)\n+5E351 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+#\n+# WARNING: Offset 0x5E351: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+#          Zero length filename\n+#\n+5E38A Extra ID #1           5455 (21589) 'Extended Timestamp [UT]'\n+5E38C   Length              0005 (5)\n+5E38E   Flags               01 (1) 'Modification'\n+5E38F   Modification Time   00000000 (0) 'Thu Jan  1 00:00:00 1970'\n+5E393 PAYLOAD\n+\n+5E962 DATA DESCRIPTOR       08074B50 (134695760)\n+5E966 CRC                   5117C509 (1360512265)\n+5E96A Compressed Size       000005CF (1487)\n+5E96E Uncompressed Size     000005CF (1487)\n+\n+5E972 LOCAL HEADER #112     04034B50 (67324752)\n+5E976 Extract Zip Spec      14 (20) '2.0'\n+5E977 Extract OS            00 (0) 'MS-DOS'\n+5E978 General Purpose Flag  0008 (8)\n+      [Bit  3]              1 'Streamed'\n+5E97A Compression Method    0000 (0) 'Stored'\n+5E97C Modification Time     EC210000 (3961585664) 'Wed Jan  1 00:00:00 2098'\n+5E980 CRC                   00000000 (0)\n+5E984 Compressed Size       00000000 (0)\n+5E988 Uncompressed Size     00000000 (0)\n+5E98C Filename Length       0039 (57)\n+5E98E Extra Length          0009 (9)\n+5E990 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+#\n+# WARNING: Offset 0x5E990: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+#          Zero length filename\n+#\n+5E9C9 Extra ID #1           5455 (21589) 'Extended Timestamp [UT]'\n+5E9CB   Length              0005 (5)\n+5E9CD   Flags               01 (1) 'Modification'\n+5E9CE   Modification Time   00000000 (0) 'Thu Jan  1 00:00:00 1970'\n+5E9D2 PAYLOAD\n+\n+5F0B2 DATA DESCRIPTOR       08074B50 (134695760)\n+5F0B6 CRC                   FCC4145B (4240708699)\n+5F0BA Compressed Size       000006E0 (1760)\n+5F0BE Uncompressed Size     000006E0 (1760)\n+\n+5F0C2 LOCAL HEADER #113     04034B50 (67324752)\n+5F0C6 Extract Zip Spec      14 (20) '2.0'\n+5F0C7 Extract OS            00 (0) 'MS-DOS'\n+5F0C8 General Purpose Flag  0008 (8)\n+      [Bit  3]              1 'Streamed'\n+5F0CA Compression Method    0000 (0) 'Stored'\n+5F0CC Modification Time     EC210000 (3961585664) 'Wed Jan  1 00:00:00 2098'\n+5F0D0 CRC                   00000000 (0)\n+5F0D4 Compressed Size       00000000 (0)\n+5F0D8 Uncompressed Size     00000000 (0)\n+5F0DC Filename Length       003B (59)\n+5F0DE Extra Length          0009 (9)\n+5F0E0 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+#\n+# WARNING: Offset 0x5F0E0: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+#          Zero length filename\n+#\n+5F11B Extra ID #1           5455 (21589) 'Extended Timestamp [UT]'\n+5F11D   Length              0005 (5)\n+5F11F   Flags               01 (1) 'Modification'\n+5F120   Modification Time   00000000 (0) 'Thu Jan  1 00:00:00 1970'\n+5F124 PAYLOAD\n+\n+5F6FF DATA DESCRIPTOR       08074B50 (134695760)\n+5F703 CRC                   A6BC7A6B (2797369963)\n+5F707 Compressed Size       000005DB (1499)\n+5F70B Uncompressed Size     000005DB (1499)\n+\n+5F70F LOCAL HEADER #114     04034B50 (67324752)\n+5F713 Extract Zip Spec      14 (20) '2.0'\n+5F714 Extract OS            00 (0) 'MS-DOS'\n+5F715 General Purpose Flag  0008 (8)\n+      [Bit  3]              1 'Streamed'\n+5F717 Compression Method    0000 (0) 'Stored'\n+5F719 Modification Time     EC210000 (3961585664) 'Wed Jan  1 00:00:00 2098'\n+5F71D CRC                   00000000 (0)\n+5F721 Compressed Size       00000000 (0)\n+5F725 Uncompressed Size     00000000 (0)\n+5F729 Filename Length       003B (59)\n+5F72B Extra Length          0009 (9)\n+5F72D Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+#\n+# WARNING: Offset 0x5F72D: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+#          Zero length filename\n+#\n+5F768 Extra ID #1           5455 (21589) 'Extended Timestamp [UT]'\n+5F76A   Length              0005 (5)\n+5F76C   Flags               01 (1) 'Modification'\n+5F76D   Modification Time   00000000 (0) 'Thu Jan  1 00:00:00 1970'\n+5F771 PAYLOAD\n+\n+5FE5B DATA DESCRIPTOR       08074B50 (134695760)\n+5FE5F CRC                   CDD77CC5 (3453451461)\n+5FE63 Compressed Size       000006EA (1770)\n+5FE67 Uncompressed Size     000006EA (1770)\n+\n+5FE6B LOCAL HEADER #115     04034B50 (67324752)\n+5FE6F Extract Zip Spec      14 (20) '2.0'\n+5FE70 Extract OS            00 (0) 'MS-DOS'\n+5FE71 General Purpose Flag  0008 (8)\n+      [Bit  3]              1 'Streamed'\n+5FE73 Compression Method    0000 (0) 'Stored'\n+5FE75 Modification Time     EC210000 (3961585664) 'Wed Jan  1 00:00:00 2098'\n+5FE79 CRC                   00000000 (0)\n+5FE7D Compressed Size       00000000 (0)\n+5FE81 Uncompressed Size     00000000 (0)\n+5FE85 Filename Length       0031 (49)\n+5FE87 Extra Length          0009 (9)\n+5FE89 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+#\n+# WARNING: Offset 0x5FE89: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+#          Zero length filename\n+#\n+5FEBA Extra ID #1           5455 (21589) 'Extended Timestamp [UT]'\n+5FEBC   Length              0005 (5)\n+5FEBE   Flags               01 (1) 'Modification'\n+5FEBF   Modification Time   00000000 (0) 'Thu Jan  1 00:00:00 1970'\n+5FEC3 PAYLOAD\n+\n+6048A DATA DESCRIPTOR       08074B50 (134695760)\n+6048E CRC                   5112EBCA (1360194506)\n+60492 Compressed Size       000005C7 (1479)\n+60496 Uncompressed Size     000005C7 (1479)\n+\n+6049A LOCAL HEADER #116     04034B50 (67324752)\n+6049E Extract Zip Spec      14 (20) '2.0'\n+6049F Extract OS            00 (0) 'MS-DOS'\n+604A0 General Purpose Flag  0000 (0)\n+604A2 Compression Method    0000 (0) 'Stored'\n+604A4 Modification Time     EC210000 (3961585664) 'Wed Jan  1 00:00:00 2098'\n+604A8 CRC                   00000000 (0)\n+604AC Compressed Size       00000000 (0)\n+604B0 Uncompressed Size     00000000 (0)\n+604B4 Filename Length       0021 (33)\n+604B6 Extra Length          0009 (9)\n+604B8 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+#\n+# WARNING: Offset 0x604B8: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+#          Zero length filename\n+#\n+604D9 Extra ID #1           5455 (21589) 'Extended Timestamp [UT]'\n+604DB   Length              0005 (5)\n+604DD   Flags               01 (1) 'Modification'\n+604DE   Modification Time   00000000 (0) 'Thu Jan  1 00:00:00 1970'\n+\n+604E2 LOCAL HEADER #117     04034B50 (67324752)\n+604E6 Extract Zip Spec      14 (20) '2.0'\n+604E7 Extract OS            00 (0) 'MS-DOS'\n+604E8 General Purpose Flag  0008 (8)\n+      [Bit  3]              1 'Streamed'\n+604EA Compression Method    0000 (0) 'Stored'\n+604EC Modification Time     EC210000 (3961585664) 'Wed Jan  1 00:00:00 2098'\n+604F0 CRC                   00000000 (0)\n+604F4 Compressed Size       00000000 (0)\n+604F8 Uncompressed Size     00000000 (0)\n+604FC Filename Length       003B (59)\n+604FE Extra Length          0009 (9)\n+60500 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+#\n+# WARNING: Offset 0x60500: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+#          Zero length filename\n+#\n+6053B Extra ID #1           5455 (21589) 'Extended Timestamp [UT]'\n+6053D   Length              0005 (5)\n+6053F   Flags               01 (1) 'Modification'\n+60540   Modification Time   00000000 (0) 'Thu Jan  1 00:00:00 1970'\n+60544 PAYLOAD\n+\n+60D6A DATA DESCRIPTOR       08074B50 (134695760)\n+60D6E CRC                   F2E8FAB9 (4075354809)\n+60D72 Compressed Size       00000826 (2086)\n+60D76 Uncompressed Size     00000826 (2086)\n+\n+60D7A LOCAL HEADER #118     04034B50 (67324752)\n+60D7E Extract Zip Spec      14 (20) '2.0'\n+60D7F Extract OS            00 (0) 'MS-DOS'\n+60D80 General Purpose Flag  0000 (0)\n+60D82 Compression Method    0000 (0) 'Stored'\n+60D84 Modification Time     EC210000 (3961585664) 'Wed Jan  1 00:00:00 2098'\n+60D88 CRC                   00000000 (0)\n+60D8C Compressed Size       00000000 (0)\n+60D90 Uncompressed Size     00000000 (0)\n+60D94 Filename Length       0022 (34)\n+60D96 Extra Length          0009 (9)\n+60D98 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+#\n+# WARNING: Offset 0x60D98: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+#          Zero length filename\n+#\n+60DBA Extra ID #1           5455 (21589) 'Extended Timestamp [UT]'\n+60DBC   Length              0005 (5)\n+60DBE   Flags               01 (1) 'Modification'\n+60DBF   Modification Time   00000000 (0) 'Thu Jan  1 00:00:00 1970'\n+\n+60DC3 LOCAL HEADER #119     04034B50 (67324752)\n+60DC7 Extract Zip Spec      14 (20) '2.0'\n+60DC8 Extract OS            00 (0) 'MS-DOS'\n+60DC9 General Purpose Flag  0008 (8)\n+      [Bit  3]              1 'Streamed'\n+60DCB Compression Method    0000 (0) 'Stored'\n+60DCD Modification Time     EC210000 (3961585664) 'Wed Jan  1 00:00:00 2098'\n+60DD1 CRC                   00000000 (0)\n+60DD5 Compressed Size       00000000 (0)\n+60DD9 Uncompressed Size     00000000 (0)\n+60DDD Filename Length       0037 (55)\n+60DDF Extra Length          0009 (9)\n+60DE1 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+#\n+# WARNING: Offset 0x60DE1: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+#          Zero length filename\n+#\n+60E18 Extra ID #1           5455 (21589) 'Extended Timestamp [UT]'\n+60E1A   Length              0005 (5)\n+60E1C   Flags               01 (1) 'Modification'\n+60E1D   Modification Time   00000000 (0) 'Thu Jan  1 00:00:00 1970'\n+60E21 PAYLOAD\n+\n+661A0 DATA DESCRIPTOR       08074B50 (134695760)\n+661A4 CRC                   5DDCD4C5 (1574753477)\n+661A8 Compressed Size       0000537F (21375)\n+661AC Uncompressed Size     0000537F (21375)\n+\n+661B0 LOCAL HEADER #120     04034B50 (67324752)\n+661B4 Extract Zip Spec      14 (20) '2.0'\n+661B5 Extract OS            00 (0) 'MS-DOS'\n+661B6 General Purpose Flag  0008 (8)\n+      [Bit  3]              1 'Streamed'\n+661B8 Compression Method    0000 (0) 'Stored'\n+661BA Modification Time     EC210000 (3961585664) 'Wed Jan  1 00:00:00 2098'\n+661BE CRC                   00000000 (0)\n+661C2 Compressed Size       00000000 (0)\n+661C6 Uncompressed Size     00000000 (0)\n+661CA Filename Length       003E (62)\n+661CC Extra Length          0009 (9)\n+661CE Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+#\n+# WARNING: Offset 0x661CE: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+#          Zero length filename\n+#\n+6620C Extra ID #1           5455 (21589) 'Extended Timestamp [UT]'\n+6620E   Length              0005 (5)\n+66210   Flags               01 (1) 'Modification'\n+66211   Modification Time   00000000 (0) 'Thu Jan  1 00:00:00 1970'\n+66215 PAYLOAD\n+\n+67F9F DATA DESCRIPTOR       08074B50 (134695760)\n+67FA3 CRC                   5BC81E29 (1539841577)\n+67FA7 Compressed Size       00001D8A (7562)\n+67FAB Uncompressed Size     00001D8A (7562)\n+\n+67FAF LOCAL HEADER #121     04034B50 (67324752)\n+67FB3 Extract Zip Spec      14 (20) '2.0'\n+67FB4 Extract OS            00 (0) 'MS-DOS'\n+67FB5 General Purpose Flag  0008 (8)\n+      [Bit  3]              1 'Streamed'\n+67FB7 Compression Method    0000 (0) 'Stored'\n+67FB9 Modification Time     EC210000 (3961585664) 'Wed Jan  1 00:00:00 2098'\n+67FBD CRC                   00000000 (0)\n+67FC1 Compressed Size       00000000 (0)\n+67FC5 Uncompressed Size     00000000 (0)\n+67FC9 Filename Length       0037 (55)\n+67FCB Extra Length          0009 (9)\n+67FCD Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+#\n+# WARNING: Offset 0x67FCD: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+#          Zero length filename\n+#\n+68004 Extra ID #1           5455 (21589) 'Extended Timestamp [UT]'\n+68006   Length              0005 (5)\n+68008   Flags               01 (1) 'Modification'\n+68009   Modification Time   00000000 (0) 'Thu Jan  1 00:00:00 1970'\n+6800D PAYLOAD\n+\n+6C63B DATA DESCRIPTOR       08074B50 (134695760)\n+6C63F CRC                   A266F3B2 (2724656050)\n+6C643 Compressed Size       0000462E (17966)\n+6C647 Uncompressed Size     0000462E (17966)\n+\n+6C64B LOCAL HEADER #122     04034B50 (67324752)\n+6C64F Extract Zip Spec      14 (20) '2.0'\n+6C650 Extract OS            00 (0) 'MS-DOS'\n+6C651 General Purpose Flag  0008 (8)\n+      [Bit  3]              1 'Streamed'\n+6C653 Compression Method    0000 (0) 'Stored'\n+6C655 Modification Time     EC210000 (3961585664) 'Wed Jan  1 00:00:00 2098'\n+6C659 CRC                   00000000 (0)\n+6C65D Compressed Size       00000000 (0)\n+6C661 Uncompressed Size     00000000 (0)\n+6C665 Filename Length       0043 (67)\n+6C667 Extra Length          0009 (9)\n+6C669 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+#\n+# WARNING: Offset 0x6C669: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+#          Zero length filename\n+#\n+6C6AC Extra ID #1           5455 (21589) 'Extended Timestamp [UT]'\n+6C6AE   Length              0005 (5)\n+6C6B0   Flags               01 (1) 'Modification'\n+6C6B1   Modification Time   00000000 (0) 'Thu Jan  1 00:00:00 1970'\n+6C6B5 PAYLOAD\n+\n+6CC07 DATA DESCRIPTOR       08074B50 (134695760)\n+6CC0B CRC                   952E3CF5 (2502835445)\n+6CC0F Compressed Size       00000552 (1362)\n+6CC13 Uncompressed Size     00000552 (1362)\n+\n+6CC17 CENTRAL HEADER #1     02014B50 (33639248)\n+6CC1B Created Zip Spec      14 (20) '2.0'\n+6CC1C Created OS            00 (0) 'MS-DOS'\n+6CC1D Extract Zip Spec      14 (20) '2.0'\n+6CC1E Extract OS            00 (0) 'MS-DOS'\n+6CC1F General Purpose Flag  0000 (0)\n+6CC21 Compression Method    0000 (0) 'Stored'\n+6CC23 Modification Time     EC210000 (3961585664) 'Wed Jan  1 00:00:00 2098'\n+6CC27 CRC                   00000000 (0)\n+6CC2B Compressed Size       00000000 (0)\n+6CC2F Uncompressed Size     00000000 (0)\n+6CC33 Filename Length       0009 (9)\n+6CC35 Extra Length          0009 (9)\n+6CC37 Comment Length        0000 (0)\n+6CC39 Disk Start            0000 (0)\n+6CC3B Int File Attributes   0000 (0)\n+      [Bit 0]               0 'Binary Data'\n+6CC3D Ext File Attributes   00000000 (0)\n+6CC41 Local Header Offset   00000000 (0)\n+6CC45 Filename              'XXXXXXXXX'\n+#\n+# WARNING: Offset 0x6CC45: Filename 'XXXXXXXXX'\n+#          Zero length filename\n+#\n+6CC4E Extra ID #1           5455 (21589) 'Extended Timestamp [UT]'\n+6CC50   Length              0005 (5)\n+6CC52   Flags               01 (1) 'Modification'\n+6CC53   Modification Time   00000000 (0) 'Thu Jan  1 00:00:00 1970'\n+\n+6CC57 CENTRAL HEADER #2     02014B50 (33639248)\n+6CC5B Created Zip Spec      14 (20) '2.0'\n+6CC5C Created OS            00 (0) 'MS-DOS'\n+6CC5D Extract Zip Spec      14 (20) '2.0'\n+6CC5E Extract OS            00 (0) 'MS-DOS'\n+6CC5F General Purpose Flag  0008 (8)\n+      [Bit  3]              1 'Streamed'\n+6CC61 Compression Method    0000 (0) 'Stored'\n+6CC63 Modification Time     EC210000 (3961585664) 'Wed Jan  1 00:00:00 2098'\n+6CC67 CRC                   85C487C6 (2244249542)\n+6CC6B Compressed Size       00000EA6 (3750)\n+6CC6F Uncompressed Size     00000EA6 (3750)\n+6CC73 Filename Length       0015 (21)\n+6CC75 Extra Length          0009 (9)\n+6CC77 Comment Length        0000 (0)\n+6CC79 Disk Start            0000 (0)\n+6CC7B Int File Attributes   0000 (0)\n+      [Bit 0]               0 'Binary Data'\n+6CC7D Ext File Attributes   00000000 (0)\n+6CC81 Local Header Offset   00000030 (48)\n+6CC85 Filename              'XXXXXXXXXXXXXXXXXXXXX'\n+#\n+# WARNING: Offset 0x6CC85: Filename 'XXXXXXXXXXXXXXXXXXXXX'\n+#          Zero length filename\n+#\n+6CC9A Extra ID #1           5455 (21589) 'Extended Timestamp [UT]'\n+6CC9C   Length              0005 (5)\n+6CC9E   Flags               01 (1) 'Modification'\n+6CC9F   Modification Time   00000000 (0) 'Thu Jan  1 00:00:00 1970'\n+\n+6CCA3 CENTRAL HEADER #3     02014B50 (33639248)\n+6CCA7 Created Zip Spec      14 (20) '2.0'\n+6CCA8 Created OS            00 (0) 'MS-DOS'\n+6CCA9 Extract Zip Spec      14 (20) '2.0'\n+6CCAA Extract OS            00 (0) 'MS-DOS'\n+6CCAB General Purpose Flag  0008 (8)\n+      [Bit  3]              1 'Streamed'\n+6CCAD Compression Method    0000 (0) 'Stored'\n+6CCAF Modification Time     EC210000 (3961585664) 'Wed Jan  1 00:00:00 2098'\n+6CCB3 CRC                   86E2B4B4 (2263004340)\n+6CCB7 Compressed Size       00002C5E (11358)\n+6CCBB Uncompressed Size     00002C5E (11358)\n+6CCBF Filename Length       0010 (16)\n+6CCC1 Extra Length          0009 (9)\n+6CCC3 Comment Length        0000 (0)\n+6CCC5 Disk Start            0000 (0)\n+6CCC7 Int File Attributes   0000 (0)\n+      [Bit 0]               0 'Binary Data'\n+6CCC9 Ext File Attributes   00000000 (0)\n+6CCCD Local Header Offset   00000F22 (3874)\n+6CCD1 Filename              'XXXXXXXXXXXXXXXX'\n+#\n+# WARNING: Offset 0x6CCD1: Filename 'XXXXXXXXXXXXXXXX'\n+#          Zero length filename\n+#\n+6CCE1 Extra ID #1           5455 (21589) 'Extended Timestamp [UT]'\n+6CCE3   Length              0005 (5)\n+6CCE5   Flags               01 (1) 'Modification'\n+6CCE6   Modification Time   00000000 (0) 'Thu Jan  1 00:00:00 1970'\n+\n+6CCEA CENTRAL HEADER #4     02014B50 (33639248)\n+6CCEE Created Zip Spec      14 (20) '2.0'\n+6CCEF Created OS            00 (0) 'MS-DOS'\n+6CCF0 Extract Zip Spec      14 (20) '2.0'\n+6CCF1 Extract OS            00 (0) 'MS-DOS'\n+6CCF2 General Purpose Flag  0008 (8)\n+      [Bit  3]              1 'Streamed'\n+6CCF4 Compression Method    0000 (0) 'Stored'\n+6CCF6 Modification Time     EC210000 (3961585664) 'Wed Jan  1 00:00:00 2098'\n+6CCFA CRC                   EE027FB2 (3993141170)\n+6CCFE Compressed Size       00000019 (25)\n+6CD02 Uncompressed Size     00000019 (25)\n+6CD06 Filename Length       0014 (20)\n+6CD08 Extra Length          0009 (9)\n+6CD0A Comment Length        0000 (0)\n+6CD0C Disk Start            0000 (0)\n+6CD0E Int File Attributes   0000 (0)\n+      [Bit 0]               0 'Binary Data'\n+6CD10 Ext File Attributes   00000000 (0)\n+6CD14 Local Header Offset   00003BC7 (15303)\n+6CD18 Filename              'XXXXXXXXXXXXXXXXXXXX'\n+#\n+# WARNING: Offset 0x6CD18: Filename 'XXXXXXXXXXXXXXXXXXXX'\n+#          Zero length filename\n+#\n+6CD2C Extra ID #1           5455 (21589) 'Extended Timestamp [UT]'\n+6CD2E   Length              0005 (5)\n+6CD30   Flags               01 (1) 'Modification'\n+6CD31   Modification Time   00000000 (0) 'Thu Jan  1 00:00:00 1970'\n+\n+6CD35 CENTRAL HEADER #5     02014B50 (33639248)\n+6CD39 Created Zip Spec      14 (20) '2.0'\n+6CD3A Created OS            00 (0) 'MS-DOS'\n+6CD3B Extract Zip Spec      14 (20) '2.0'\n+6CD3C Extract OS            00 (0) 'MS-DOS'\n+6CD3D General Purpose Flag  0008 (8)\n+      [Bit  3]              1 'Streamed'\n+6CD3F Compression Method    0000 (0) 'Stored'\n+6CD41 Modification Time     EC210000 (3961585664) 'Wed Jan  1 00:00:00 2098'\n+6CD45 CRC                   EA9E0E3C (3936226876)\n+6CD49 Compressed Size       000000AF (175)\n+6CD4D Uncompressed Size     000000AF (175)\n+6CD51 Filename Length       000F (15)\n+6CD53 Extra Length          0009 (9)\n+6CD55 Comment Length        0000 (0)\n+6CD57 Disk Start            0000 (0)\n+6CD59 Int File Attributes   0000 (0)\n+      [Bit 0]               0 'Binary Data'\n+6CD5B Ext File Attributes   00000000 (0)\n+6CD5F Local Header Offset   00003C2B (15403)\n+6CD63 Filename              'XXXXXXXXXXXXXXX'\n+#\n+# WARNING: Offset 0x6CD63: Filename 'XXXXXXXXXXXXXXX'\n+#          Zero length filename\n+#\n+6CD72 Extra ID #1           5455 (21589) 'Extended Timestamp [UT]'\n+6CD74   Length              0005 (5)\n+6CD76   Flags               01 (1) 'Modification'\n+6CD77   Modification Time   00000000 (0) 'Thu Jan  1 00:00:00 1970'\n+\n+6CD7B CENTRAL HEADER #6     02014B50 (33639248)\n+6CD7F Created Zip Spec      14 (20) '2.0'\n+6CD80 Created OS            00 (0) 'MS-DOS'\n+6CD81 Extract Zip Spec      14 (20) '2.0'\n+6CD82 Extract OS            00 (0) 'MS-DOS'\n+6CD83 General Purpose Flag  0000 (0)\n+6CD85 Compression Method    0000 (0) 'Stored'\n+6CD87 Modification Time     EC210000 (3961585664) 'Wed Jan  1 00:00:00 2098'\n+6CD8B CRC                   00000000 (0)\n+6CD8F Compressed Size       00000000 (0)\n+6CD93 Uncompressed Size     00000000 (0)\n+6CD97 Filename Length       000F (15)\n+6CD99 Extra Length          0009 (9)\n+6CD9B Comment Length        0000 (0)\n+6CD9D Disk Start            0000 (0)\n+6CD9F Int File Attributes   0000 (0)\n+      [Bit 0]               0 'Binary Data'\n+6CDA1 Ext File Attributes   00000000 (0)\n+6CDA5 Local Header Offset   00003D20 (15648)\n+6CDA9 Filename              'XXXXXXXXXXXXXXX'\n+#\n+# WARNING: Offset 0x6CDA9: Filename 'XXXXXXXXXXXXXXX'\n+#          Zero length filename\n+#\n+6CDB8 Extra ID #1           5455 (21589) 'Extended Timestamp [UT]'\n+6CDBA   Length              0005 (5)\n+6CDBC   Flags               01 (1) 'Modification'\n+6CDBD   Modification Time   00000000 (0) 'Thu Jan  1 00:00:00 1970'\n+\n+6CDC1 CENTRAL HEADER #7     02014B50 (33639248)\n+6CDC5 Created Zip Spec      14 (20) '2.0'\n+6CDC6 Created OS            00 (0) 'MS-DOS'\n+6CDC7 Extract Zip Spec      14 (20) '2.0'\n+6CDC8 Extract OS            00 (0) 'MS-DOS'\n+6CDC9 General Purpose Flag  0000 (0)\n+6CDCB Compression Method    0000 (0) 'Stored'\n+6CDCD Modification Time     EC210000 (3961585664) 'Wed Jan  1 00:00:00 2098'\n+6CDD1 CRC                   00000000 (0)\n+6CDD5 Compressed Size       00000000 (0)\n+6CDD9 Uncompressed Size     00000000 (0)\n+6CDDD Filename Length       0018 (24)\n+6CDDF Extra Length          0009 (9)\n+6CDE1 Comment Length        0000 (0)\n+6CDE3 Disk Start            0000 (0)\n+6CDE5 Int File Attributes   0000 (0)\n+      [Bit 0]               0 'Binary Data'\n+6CDE7 Ext File Attributes   00000000 (0)\n+6CDEB Local Header Offset   00003D56 (15702)\n+6CDEF Filename              'XXXXXXXXXXXXXXXXXXXXXXXX'\n+#\n+# WARNING: Offset 0x6CDEF: Filename 'XXXXXXXXXXXXXXXXXXXXXXXX'\n+#          Zero length filename\n+#\n+6CE07 Extra ID #1           5455 (21589) 'Extended Timestamp [UT]'\n+6CE09   Length              0005 (5)\n+6CE0B   Flags               01 (1) 'Modification'\n+6CE0C   Modification Time   00000000 (0) 'Thu Jan  1 00:00:00 1970'\n+\n+6CE10 CENTRAL HEADER #8     02014B50 (33639248)\n+6CE14 Created Zip Spec      14 (20) '2.0'\n+6CE15 Created OS            00 (0) 'MS-DOS'\n+6CE16 Extract Zip Spec      14 (20) '2.0'\n+6CE17 Extract OS            00 (0) 'MS-DOS'\n+6CE18 General Purpose Flag  0008 (8)\n+      [Bit  3]              1 'Streamed'\n+6CE1A Compression Method    0000 (0) 'Stored'\n+6CE1C Modification Time     EC210000 (3961585664) 'Wed Jan  1 00:00:00 2098'\n+6CE20 CRC                   764EE4B3 (1984881843)\n+6CE24 Compressed Size       0000003F (63)\n+6CE28 Uncompressed Size     0000003F (63)\n+6CE2C Filename Length       0044 (68)\n+6CE2E Extra Length          0009 (9)\n+6CE30 Comment Length        0000 (0)\n+6CE32 Disk Start            0000 (0)\n+6CE34 Int File Attributes   0000 (0)\n+      [Bit 0]               0 'Binary Data'\n+6CE36 Ext File Attributes   00000000 (0)\n+6CE3A Local Header Offset   00003D95 (15765)\n+6CE3E Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+#\n+# WARNING: Offset 0x6CE3E: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+#          Zero length filename\n+#\n+6CE82 Extra ID #1           5455 (21589) 'Extended Timestamp [UT]'\n+6CE84   Length              0005 (5)\n+6CE86   Flags               01 (1) 'Modification'\n+6CE87   Modification Time   00000000 (0) 'Thu Jan  1 00:00:00 1970'\n+\n+6CE8B CENTRAL HEADER #9     02014B50 (33639248)\n+6CE8F Created Zip Spec      14 (20) '2.0'\n+6CE90 Created OS            00 (0) 'MS-DOS'\n+6CE91 Extract Zip Spec      14 (20) '2.0'\n+6CE92 Extract OS            00 (0) 'MS-DOS'\n+6CE93 General Purpose Flag  0008 (8)\n+      [Bit  3]              1 'Streamed'\n+6CE95 Compression Method    0000 (0) 'Stored'\n+6CE97 Modification Time     EC210000 (3961585664) 'Wed Jan  1 00:00:00 2098'\n+6CE9B CRC                   0FE2368F (266483343)\n+6CE9F Compressed Size       00000055 (85)\n+6CEA3 Uncompressed Size     00000055 (85)\n+6CEA7 Filename Length       003C (60)\n+6CEA9 Extra Length          0009 (9)\n+6CEAB Comment Length        0000 (0)\n+6CEAD Disk Start            0000 (0)\n+6CEAF Int File Attributes   0000 (0)\n+      [Bit 0]               0 'Binary Data'\n+6CEB1 Ext File Attributes   00000000 (0)\n+6CEB5 Local Header Offset   00003E4F (15951)\n+6CEB9 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+#\n+# WARNING: Offset 0x6CEB9: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+#          Zero length filename\n+#\n+6CEF5 Extra ID #1           5455 (21589) 'Extended Timestamp [UT]'\n+6CEF7   Length              0005 (5)\n+6CEF9   Flags               01 (1) 'Modification'\n+6CEFA   Modification Time   00000000 (0) 'Thu Jan  1 00:00:00 1970'\n+\n+6CEFE CENTRAL HEADER #10    02014B50 (33639248)\n+6CF02 Created Zip Spec      14 (20) '2.0'\n+6CF03 Created OS            00 (0) 'MS-DOS'\n+6CF04 Extract Zip Spec      14 (20) '2.0'\n+6CF05 Extract OS            00 (0) 'MS-DOS'\n+6CF06 General Purpose Flag  0008 (8)\n+      [Bit  3]              1 'Streamed'\n+6CF08 Compression Method    0000 (0) 'Stored'\n+6CF0A Modification Time     EC210000 (3961585664) 'Wed Jan  1 00:00:00 2098'\n+6CF0E CRC                   93CA6C9E (2479516830)\n+6CF12 Compressed Size       0000004D (77)\n+6CF16 Uncompressed Size     0000004D (77)\n+6CF1A Filename Length       0044 (68)\n+6CF1C Extra Length          0009 (9)\n+6CF1E Comment Length        0000 (0)\n+6CF20 Disk Start            0000 (0)\n+6CF22 Int File Attributes   0000 (0)\n+      [Bit 0]               0 'Binary Data'\n+6CF24 Ext File Attributes   00000000 (0)\n+6CF28 Local Header Offset   00003F17 (16151)\n+6CF2C Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+#\n+# WARNING: Offset 0x6CF2C: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+#          Zero length filename\n+#\n+6CF70 Extra ID #1           5455 (21589) 'Extended Timestamp [UT]'\n+6CF72   Length              0005 (5)\n+6CF74   Flags               01 (1) 'Modification'\n+6CF75   Modification Time   00000000 (0) 'Thu Jan  1 00:00:00 1970'\n+\n+6CF79 CENTRAL HEADER #11    02014B50 (33639248)\n+6CF7D Created Zip Spec      14 (20) '2.0'\n+6CF7E Created OS            00 (0) 'MS-DOS'\n+6CF7F Extract Zip Spec      14 (20) '2.0'\n+6CF80 Extract OS            00 (0) 'MS-DOS'\n+6CF81 General Purpose Flag  0008 (8)\n+      [Bit  3]              1 'Streamed'\n+6CF83 Compression Method    0000 (0) 'Stored'\n+6CF85 Modification Time     EC210000 (3961585664) 'Wed Jan  1 00:00:00 2098'\n+6CF89 CRC                   4B7CAED5 (1266462421)\n+6CF8D Compressed Size       00000057 (87)\n+6CF91 Uncompressed Size     00000057 (87)\n+6CF95 Filename Length       0049 (73)\n+6CF97 Extra Length          0009 (9)\n+6CF99 Comment Length        0000 (0)\n+6CF9B Disk Start            0000 (0)\n+6CF9D Int File Attributes   0000 (0)\n+      [Bit 0]               0 'Binary Data'\n+6CF9F Ext File Attributes   00000000 (0)\n+6CFA3 Local Header Offset   00003FDF (16351)\n+6CFA7 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+#\n+# WARNING: Offset 0x6CFA7: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+#          Zero length filename\n+#\n+6CFF0 Extra ID #1           5455 (21589) 'Extended Timestamp [UT]'\n+6CFF2   Length              0005 (5)\n+6CFF4   Flags               01 (1) 'Modification'\n+6CFF5   Modification Time   00000000 (0) 'Thu Jan  1 00:00:00 1970'\n+\n+6CFF9 CENTRAL HEADER #12    02014B50 (33639248)\n+6CFFD Created Zip Spec      14 (20) '2.0'\n+6CFFE Created OS            00 (0) 'MS-DOS'\n+6CFFF Extract Zip Spec      14 (20) '2.0'\n+6D000 Extract OS            00 (0) 'MS-DOS'\n+6D001 General Purpose Flag  0008 (8)\n+      [Bit  3]              1 'Streamed'\n+6D003 Compression Method    0000 (0) 'Stored'\n+6D005 Modification Time     EC210000 (3961585664) 'Wed Jan  1 00:00:00 2098'\n+6D009 CRC                   CDA6F1A6 (3450270118)\n+6D00D Compressed Size       00000095 (149)\n+6D011 Uncompressed Size     00000095 (149)\n+6D015 Filename Length       0041 (65)\n+6D017 Extra Length          0009 (9)\n+6D019 Comment Length        0000 (0)\n+6D01B Disk Start            0000 (0)\n+6D01D Int File Attributes   0000 (0)\n+      [Bit 0]               0 'Binary Data'\n+6D01F Ext File Attributes   00000000 (0)\n+6D023 Local Header Offset   000040B6 (16566)\n+6D027 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+#\n+# WARNING: Offset 0x6D027: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+#          Zero length filename\n+#\n+6D068 Extra ID #1           5455 (21589) 'Extended Timestamp [UT]'\n+6D06A   Length              0005 (5)\n+6D06C   Flags               01 (1) 'Modification'\n+6D06D   Modification Time   00000000 (0) 'Thu Jan  1 00:00:00 1970'\n+\n+6D071 CENTRAL HEADER #13    02014B50 (33639248)\n+6D075 Created Zip Spec      14 (20) '2.0'\n+6D076 Created OS            00 (0) 'MS-DOS'\n+6D077 Extract Zip Spec      14 (20) '2.0'\n+6D078 Extract OS            00 (0) 'MS-DOS'\n+6D079 General Purpose Flag  0008 (8)\n+      [Bit  3]              1 'Streamed'\n+6D07B Compression Method    0000 (0) 'Stored'\n+6D07D Modification Time     EC210000 (3961585664) 'Wed Jan  1 00:00:00 2098'\n+6D081 CRC                   290EDBFF (688839679)\n+6D085 Compressed Size       00000049 (73)\n+6D089 Uncompressed Size     00000049 (73)\n+6D08D Filename Length       0052 (82)\n+6D08F Extra Length          0009 (9)\n+6D091 Comment Length        0000 (0)\n+6D093 Disk Start            0000 (0)\n+6D095 Int File Attributes   0000 (0)\n+      [Bit 0]               0 'Binary Data'\n+6D097 Ext File Attributes   00000000 (0)\n+6D09B Local Header Offset   000041C3 (16835)\n+6D09F Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+#\n+# WARNING: Offset 0x6D09F: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+#          Zero length filename\n+#\n+6D0F1 Extra ID #1           5455 (21589) 'Extended Timestamp [UT]'\n+6D0F3   Length              0005 (5)\n+6D0F5   Flags               01 (1) 'Modification'\n+6D0F6   Modification Time   00000000 (0) 'Thu Jan  1 00:00:00 1970'\n+\n+6D0FA CENTRAL HEADER #14    02014B50 (33639248)\n+6D0FE Created Zip Spec      14 (20) '2.0'\n+6D0FF Created OS            00 (0) 'MS-DOS'\n+6D100 Extract Zip Spec      14 (20) '2.0'\n+6D101 Extract OS            00 (0) 'MS-DOS'\n+6D102 General Purpose Flag  0008 (8)\n+      [Bit  3]              1 'Streamed'\n+6D104 Compression Method    0000 (0) 'Stored'\n+6D106 Modification Time     EC210000 (3961585664) 'Wed Jan  1 00:00:00 2098'\n+6D10A CRC                   1BD83592 (467154322)\n+6D10E Compressed Size       00000040 (64)\n+6D112 Uncompressed Size     00000040 (64)\n+6D116 Filename Length       0049 (73)\n+6D118 Extra Length          0009 (9)\n+6D11A Comment Length        0000 (0)\n+6D11C Disk Start            0000 (0)\n+6D11E Int File Attributes   0000 (0)\n+      [Bit 0]               0 'Binary Data'\n+6D120 Ext File Attributes   00000000 (0)\n+6D124 Local Header Offset   00004295 (17045)\n+6D128 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+#\n+# WARNING: Offset 0x6D128: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+#          Zero length filename\n+#\n+6D171 Extra ID #1           5455 (21589) 'Extended Timestamp [UT]'\n+6D173   Length              0005 (5)\n+6D175   Flags               01 (1) 'Modification'\n+6D176   Modification Time   00000000 (0) 'Thu Jan  1 00:00:00 1970'\n+\n+6D17A CENTRAL HEADER #15    02014B50 (33639248)\n+6D17E Created Zip Spec      14 (20) '2.0'\n+6D17F Created OS            00 (0) 'MS-DOS'\n+6D180 Extract Zip Spec      14 (20) '2.0'\n+6D181 Extract OS            00 (0) 'MS-DOS'\n+6D182 General Purpose Flag  0008 (8)\n+      [Bit  3]              1 'Streamed'\n+6D184 Compression Method    0000 (0) 'Stored'\n+6D186 Modification Time     EC210000 (3961585664) 'Wed Jan  1 00:00:00 2098'\n+6D18A CRC                   C6FA5A39 (3338295865)\n+6D18E Compressed Size       00000047 (71)\n+6D192 Uncompressed Size     00000047 (71)\n+6D196 Filename Length       0050 (80)\n+6D198 Extra Length          0009 (9)\n+6D19A Comment Length        0000 (0)\n+6D19C Disk Start            0000 (0)\n+6D19E Int File Attributes   0000 (0)\n+      [Bit 0]               0 'Binary Data'\n+6D1A0 Ext File Attributes   00000000 (0)\n+6D1A4 Local Header Offset   00004355 (17237)\n+6D1A8 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+#\n+# WARNING: Offset 0x6D1A8: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+#          Zero length filename\n+#\n+6D1F8 Extra ID #1           5455 (21589) 'Extended Timestamp [UT]'\n+6D1FA   Length              0005 (5)\n+6D1FC   Flags               01 (1) 'Modification'\n+6D1FD   Modification Time   00000000 (0) 'Thu Jan  1 00:00:00 1970'\n+\n+6D201 CENTRAL HEADER #16    02014B50 (33639248)\n+6D205 Created Zip Spec      14 (20) '2.0'\n+6D206 Created OS            00 (0) 'MS-DOS'\n+6D207 Extract Zip Spec      14 (20) '2.0'\n+6D208 Extract OS            00 (0) 'MS-DOS'\n+6D209 General Purpose Flag  0008 (8)\n+      [Bit  3]              1 'Streamed'\n+6D20B Compression Method    0000 (0) 'Stored'\n+6D20D Modification Time     EC210000 (3961585664) 'Wed Jan  1 00:00:00 2098'\n+6D211 CRC                   059BF276 (94106230)\n+6D215 Compressed Size       0000023E (574)\n+6D219 Uncompressed Size     0000023E (574)\n+6D21D Filename Length       0052 (82)\n+6D21F Extra Length          0009 (9)\n+6D221 Comment Length        0000 (0)\n+6D223 Disk Start            0000 (0)\n+6D225 Int File Attributes   0000 (0)\n+      [Bit 0]               0 'Binary Data'\n+6D227 Ext File Attributes   00000000 (0)\n+6D22B Local Header Offset   00004423 (17443)\n+6D22F Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+#\n+# WARNING: Offset 0x6D22F: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+#          Zero length filename\n+#\n+6D281 Extra ID #1           5455 (21589) 'Extended Timestamp [UT]'\n+6D283   Length              0005 (5)\n+6D285   Flags               01 (1) 'Modification'\n+6D286   Modification Time   00000000 (0) 'Thu Jan  1 00:00:00 1970'\n+\n+6D28A CENTRAL HEADER #17    02014B50 (33639248)\n+6D28E Created Zip Spec      14 (20) '2.0'\n+6D28F Created OS            00 (0) 'MS-DOS'\n+6D290 Extract Zip Spec      14 (20) '2.0'\n+6D291 Extract OS            00 (0) 'MS-DOS'\n+6D292 General Purpose Flag  0008 (8)\n+      [Bit  3]              1 'Streamed'\n+6D294 Compression Method    0000 (0) 'Stored'\n+6D296 Modification Time     EC210000 (3961585664) 'Wed Jan  1 00:00:00 2098'\n+6D29A CRC                   043D8CD3 (71142611)\n+6D29E Compressed Size       000000B1 (177)\n+6D2A2 Uncompressed Size     000000B1 (177)\n+6D2A6 Filename Length       005B (91)\n+6D2A8 Extra Length          0009 (9)\n+6D2AA Comment Length        0000 (0)\n+6D2AC Disk Start            0000 (0)\n+6D2AE Int File Attributes   0000 (0)\n+      [Bit 0]               0 'Binary Data'\n+6D2B0 Ext File Attributes   00000000 (0)\n+6D2B4 Local Header Offset   000046EA (18154)\n+6D2B8 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+#\n+# WARNING: Offset 0x6D2B8: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+#          Zero length filename\n+#\n+6D313 Extra ID #1           5455 (21589) 'Extended Timestamp [UT]'\n+6D315   Length              0005 (5)\n+6D317   Flags               01 (1) 'Modification'\n+6D318   Modification Time   00000000 (0) 'Thu Jan  1 00:00:00 1970'\n+\n+6D31C CENTRAL HEADER #18    02014B50 (33639248)\n+6D320 Created Zip Spec      14 (20) '2.0'\n+6D321 Created OS            00 (0) 'MS-DOS'\n+6D322 Extract Zip Spec      14 (20) '2.0'\n+6D323 Extract OS            00 (0) 'MS-DOS'\n+6D324 General Purpose Flag  0008 (8)\n+      [Bit  3]              1 'Streamed'\n+6D326 Compression Method    0000 (0) 'Stored'\n+6D328 Modification Time     EC210000 (3961585664) 'Wed Jan  1 00:00:00 2098'\n+6D32C CRC                   A49FCF77 (2761936759)\n+6D330 Compressed Size       00000054 (84)\n+6D334 Uncompressed Size     00000054 (84)\n+6D338 Filename Length       005B (91)\n+6D33A Extra Length          0009 (9)\n+6D33C Comment Length        0000 (0)\n+6D33E Disk Start            0000 (0)\n+6D340 Int File Attributes   0000 (0)\n+      [Bit 0]               0 'Binary Data'\n+6D342 Ext File Attributes   00000000 (0)\n+6D346 Local Header Offset   0000482D (18477)\n+6D34A Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+#\n+# WARNING: Offset 0x6D34A: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+#          Zero length filename\n+#\n+6D3A5 Extra ID #1           5455 (21589) 'Extended Timestamp [UT]'\n+6D3A7   Length              0005 (5)\n+6D3A9   Flags               01 (1) 'Modification'\n+6D3AA   Modification Time   00000000 (0) 'Thu Jan  1 00:00:00 1970'\n+\n+6D3AE CENTRAL HEADER #19    02014B50 (33639248)\n+6D3B2 Created Zip Spec      14 (20) '2.0'\n+6D3B3 Created OS            00 (0) 'MS-DOS'\n+6D3B4 Extract Zip Spec      14 (20) '2.0'\n+6D3B5 Extract OS            00 (0) 'MS-DOS'\n+6D3B6 General Purpose Flag  0008 (8)\n+      [Bit  3]              1 'Streamed'\n+6D3B8 Compression Method    0000 (0) 'Stored'\n+6D3BA Modification Time     EC210000 (3961585664) 'Wed Jan  1 00:00:00 2098'\n+6D3BE CRC                   F515114D (4111798605)\n+6D3C2 Compressed Size       00000054 (84)\n+6D3C6 Uncompressed Size     00000054 (84)\n+6D3CA Filename Length       005D (93)\n+6D3CC Extra Length          0009 (9)\n+6D3CE Comment Length        0000 (0)\n+6D3D0 Disk Start            0000 (0)\n+6D3D2 Int File Attributes   0000 (0)\n+      [Bit 0]               0 'Binary Data'\n+6D3D4 Ext File Attributes   00000000 (0)\n+6D3D8 Local Header Offset   00004913 (18707)\n+6D3DC Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+#\n+# WARNING: Offset 0x6D3DC: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+#          Zero length filename\n+#\n+6D439 Extra ID #1           5455 (21589) 'Extended Timestamp [UT]'\n+6D43B   Length              0005 (5)\n+6D43D   Flags               01 (1) 'Modification'\n+6D43E   Modification Time   00000000 (0) 'Thu Jan  1 00:00:00 1970'\n+\n+6D442 CENTRAL HEADER #20    02014B50 (33639248)\n+6D446 Created Zip Spec      14 (20) '2.0'\n+6D447 Created OS            00 (0) 'MS-DOS'\n+6D448 Extract Zip Spec      14 (20) '2.0'\n+6D449 Extract OS            00 (0) 'MS-DOS'\n+6D44A General Purpose Flag  0008 (8)\n+      [Bit  3]              1 'Streamed'\n+6D44C Compression Method    0000 (0) 'Stored'\n+6D44E Modification Time     EC210000 (3961585664) 'Wed Jan  1 00:00:00 2098'\n+6D452 CRC                   285254BA (676484282)\n+6D456 Compressed Size       0000004E (78)\n+6D45A Uncompressed Size     0000004E (78)\n+6D45E Filename Length       0059 (89)\n+6D460 Extra Length          0009 (9)\n+6D462 Comment Length        0000 (0)\n+6D464 Disk Start            0000 (0)\n+6D466 Int File Attributes   0000 (0)\n+      [Bit 0]               0 'Binary Data'\n+6D468 Ext File Attributes   00000000 (0)\n+6D46C Local Header Offset   000049FB (18939)\n+6D470 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+#\n+# WARNING: Offset 0x6D470: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+#          Zero length filename\n+#\n+6D4C9 Extra ID #1           5455 (21589) 'Extended Timestamp [UT]'\n+6D4CB   Length              0005 (5)\n+6D4CD   Flags               01 (1) 'Modification'\n+6D4CE   Modification Time   00000000 (0) 'Thu Jan  1 00:00:00 1970'\n+\n+6D4D2 CENTRAL HEADER #21    02014B50 (33639248)\n+6D4D6 Created Zip Spec      14 (20) '2.0'\n+6D4D7 Created OS            00 (0) 'MS-DOS'\n+6D4D8 Extract Zip Spec      14 (20) '2.0'\n+6D4D9 Extract OS            00 (0) 'MS-DOS'\n+6D4DA General Purpose Flag  0008 (8)\n+      [Bit  3]              1 'Streamed'\n+6D4DC Compression Method    0000 (0) 'Stored'\n+6D4DE Modification Time     EC210000 (3961585664) 'Wed Jan  1 00:00:00 2098'\n+6D4E2 CRC                   9DAB4985 (2645248389)\n+6D4E6 Compressed Size       0000004A (74)\n+6D4EA Uncompressed Size     0000004A (74)\n+6D4EE Filename Length       0056 (86)\n+6D4F0 Extra Length          0009 (9)\n+6D4F2 Comment Length        0000 (0)\n+6D4F4 Disk Start            0000 (0)\n+6D4F6 Int File Attributes   0000 (0)\n+      [Bit 0]               0 'Binary Data'\n+6D4F8 Ext File Attributes   00000000 (0)\n+6D4FC Local Header Offset   00004AD9 (19161)\n+6D500 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+#\n+# WARNING: Offset 0x6D500: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+#          Zero length filename\n+#\n+6D556 Extra ID #1           5455 (21589) 'Extended Timestamp [UT]'\n+6D558   Length              0005 (5)\n+6D55A   Flags               01 (1) 'Modification'\n+6D55B   Modification Time   00000000 (0) 'Thu Jan  1 00:00:00 1970'\n+\n+6D55F CENTRAL HEADER #22    02014B50 (33639248)\n+6D563 Created Zip Spec      14 (20) '2.0'\n+6D564 Created OS            00 (0) 'MS-DOS'\n+6D565 Extract Zip Spec      14 (20) '2.0'\n+6D566 Extract OS            00 (0) 'MS-DOS'\n+6D567 General Purpose Flag  0008 (8)\n+      [Bit  3]              1 'Streamed'\n+6D569 Compression Method    0000 (0) 'Stored'\n+6D56B Modification Time     EC210000 (3961585664) 'Wed Jan  1 00:00:00 2098'\n+6D56F CRC                   B5A015DF (3047167455)\n+6D573 Compressed Size       000000A5 (165)\n+6D577 Uncompressed Size     000000A5 (165)\n+6D57B Filename Length       0035 (53)\n+6D57D Extra Length          0009 (9)\n+6D57F Comment Length        0000 (0)\n+6D581 Disk Start            0000 (0)\n+6D583 Int File Attributes   0000 (0)\n+      [Bit 0]               0 'Binary Data'\n+6D585 Ext File Attributes   00000000 (0)\n+6D589 Local Header Offset   00004BB0 (19376)\n+6D58D Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+#\n+# WARNING: Offset 0x6D58D: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+#          Zero length filename\n+#\n+6D5C2 Extra ID #1           5455 (21589) 'Extended Timestamp [UT]'\n+6D5C4   Length              0005 (5)\n+6D5C6   Flags               01 (1) 'Modification'\n+6D5C7   Modification Time   00000000 (0) 'Thu Jan  1 00:00:00 1970'\n+\n+6D5CB CENTRAL HEADER #23    02014B50 (33639248)\n+6D5CF Created Zip Spec      14 (20) '2.0'\n+6D5D0 Created OS            00 (0) 'MS-DOS'\n+6D5D1 Extract Zip Spec      14 (20) '2.0'\n+6D5D2 Extract OS            00 (0) 'MS-DOS'\n+6D5D3 General Purpose Flag  0000 (0)\n+6D5D5 Compression Method    0000 (0) 'Stored'\n+6D5D7 Modification Time     EC210000 (3961585664) 'Wed Jan  1 00:00:00 2098'\n+6D5DB CRC                   00000000 (0)\n+6D5DF Compressed Size       00000000 (0)\n+6D5E3 Uncompressed Size     00000000 (0)\n+6D5E7 Filename Length       000F (15)\n+6D5E9 Extra Length          0009 (9)\n+6D5EB Comment Length        0000 (0)\n+6D5ED Disk Start            0000 (0)\n+6D5EF Int File Attributes   0000 (0)\n+      [Bit 0]               0 'Binary Data'\n+6D5F1 Ext File Attributes   00000000 (0)\n+6D5F5 Local Header Offset   00004CC1 (19649)\n+6D5F9 Filename              'XXXXXXXXXXXXXXX'\n+#\n+# WARNING: Offset 0x6D5F9: Filename 'XXXXXXXXXXXXXXX'\n+#          Zero length filename\n+#\n+6D608 Extra ID #1           5455 (21589) 'Extended Timestamp [UT]'\n+6D60A   Length              0005 (5)\n+6D60C   Flags               01 (1) 'Modification'\n+6D60D   Modification Time   00000000 (0) 'Thu Jan  1 00:00:00 1970'\n+\n+6D611 CENTRAL HEADER #24    02014B50 (33639248)\n+6D615 Created Zip Spec      14 (20) '2.0'\n+6D616 Created OS            00 (0) 'MS-DOS'\n+6D617 Extract Zip Spec      14 (20) '2.0'\n+6D618 Extract OS            00 (0) 'MS-DOS'\n+6D619 General Purpose Flag  0000 (0)\n+6D61B Compression Method    0000 (0) 'Stored'\n+6D61D Modification Time     EC210000 (3961585664) 'Wed Jan  1 00:00:00 2098'\n+6D621 CRC                   00000000 (0)\n+6D625 Compressed Size       00000000 (0)\n+6D629 Uncompressed Size     00000000 (0)\n+6D62D Filename Length       0020 (32)\n+6D62F Extra Length          0009 (9)\n+6D631 Comment Length        0000 (0)\n+6D633 Disk Start            0000 (0)\n+6D635 Int File Attributes   0000 (0)\n+      [Bit 0]               0 'Binary Data'\n+6D637 Ext File Attributes   00000000 (0)\n+6D63B Local Header Offset   00004CF7 (19703)\n+6D63F Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+#\n+# WARNING: Offset 0x6D63F: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+#          Zero length filename\n+#\n+6D65F Extra ID #1           5455 (21589) 'Extended Timestamp [UT]'\n+6D661   Length              0005 (5)\n+6D663   Flags               01 (1) 'Modification'\n+6D664   Modification Time   00000000 (0) 'Thu Jan  1 00:00:00 1970'\n+\n+6D668 CENTRAL HEADER #25    02014B50 (33639248)\n+6D66C Created Zip Spec      14 (20) '2.0'\n+6D66D Created OS            00 (0) 'MS-DOS'\n+6D66E Extract Zip Spec      14 (20) '2.0'\n+6D66F Extract OS            00 (0) 'MS-DOS'\n+6D670 General Purpose Flag  0000 (0)\n+6D672 Compression Method    0000 (0) 'Stored'\n+6D674 Modification Time     EC210000 (3961585664) 'Wed Jan  1 00:00:00 2098'\n+6D678 CRC                   00000000 (0)\n+6D67C Compressed Size       00000000 (0)\n+6D680 Uncompressed Size     00000000 (0)\n+6D684 Filename Length       0033 (51)\n+6D686 Extra Length          0009 (9)\n+6D688 Comment Length        0000 (0)\n+6D68A Disk Start            0000 (0)\n+6D68C Int File Attributes   0000 (0)\n+      [Bit 0]               0 'Binary Data'\n+6D68E Ext File Attributes   00000000 (0)\n+6D692 Local Header Offset   00004D3E (19774)\n+6D696 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+#\n+# WARNING: Offset 0x6D696: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+#          Zero length filename\n+#\n+6D6C9 Extra ID #1           5455 (21589) 'Extended Timestamp [UT]'\n+6D6CB   Length              0005 (5)\n+6D6CD   Flags               01 (1) 'Modification'\n+6D6CE   Modification Time   00000000 (0) 'Thu Jan  1 00:00:00 1970'\n+\n+6D6D2 CENTRAL HEADER #26    02014B50 (33639248)\n+6D6D6 Created Zip Spec      14 (20) '2.0'\n+6D6D7 Created OS            00 (0) 'MS-DOS'\n+6D6D8 Extract Zip Spec      14 (20) '2.0'\n+6D6D9 Extract OS            00 (0) 'MS-DOS'\n+6D6DA General Purpose Flag  0008 (8)\n+      [Bit  3]              1 'Streamed'\n+6D6DC Compression Method    0000 (0) 'Stored'\n+6D6DE Modification Time     EC210000 (3961585664) 'Wed Jan  1 00:00:00 2098'\n+6D6E2 CRC                   00000000 (0)\n+6D6E6 Compressed Size       00000000 (0)\n+6D6EA Uncompressed Size     00000000 (0)\n+6D6EE Filename Length       0041 (65)\n+6D6F0 Extra Length          0009 (9)\n+6D6F2 Comment Length        0000 (0)\n+6D6F4 Disk Start            0000 (0)\n+6D6F6 Int File Attributes   0000 (0)\n+      [Bit 0]               0 'Binary Data'\n+6D6F8 Ext File Attributes   00000000 (0)\n+6D6FC Local Header Offset   00004D98 (19864)\n+6D700 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+#\n+# WARNING: Offset 0x6D700: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+#          Zero length filename\n+#\n+6D741 Extra ID #1           5455 (21589) 'Extended Timestamp [UT]'\n+6D743   Length              0005 (5)\n+6D745   Flags               01 (1) 'Modification'\n+6D746   Modification Time   00000000 (0) 'Thu Jan  1 00:00:00 1970'\n+\n+6D74A CENTRAL HEADER #27    02014B50 (33639248)\n+6D74E Created Zip Spec      14 (20) '2.0'\n+6D74F Created OS            00 (0) 'MS-DOS'\n+6D750 Extract Zip Spec      14 (20) '2.0'\n+6D751 Extract OS            00 (0) 'MS-DOS'\n+6D752 General Purpose Flag  0008 (8)\n+      [Bit  3]              1 'Streamed'\n+6D754 Compression Method    0000 (0) 'Stored'\n+6D756 Modification Time     EC210000 (3961585664) 'Wed Jan  1 00:00:00 2098'\n+6D75A CRC                   C9D6A7C1 (3386288065)\n+6D75E Compressed Size       00000C99 (3225)\n+6D762 Uncompressed Size     00000C99 (3225)\n+6D766 Filename Length       003A (58)\n+6D768 Extra Length          0009 (9)\n+6D76A Comment Length        0000 (0)\n+6D76C Disk Start            0000 (0)\n+6D76E Int File Attributes   0000 (0)\n+      [Bit 0]               0 'Binary Data'\n+6D770 Ext File Attributes   00000000 (0)\n+6D774 Local Header Offset   00004E10 (19984)\n+6D778 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+#\n+# WARNING: Offset 0x6D778: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+#          Zero length filename\n+#\n+6D7B2 Extra ID #1           5455 (21589) 'Extended Timestamp [UT]'\n+6D7B4   Length              0005 (5)\n+6D7B6   Flags               01 (1) 'Modification'\n+6D7B7   Modification Time   00000000 (0) 'Thu Jan  1 00:00:00 1970'\n+\n+6D7BB CENTRAL HEADER #28    02014B50 (33639248)\n+6D7BF Created Zip Spec      14 (20) '2.0'\n+6D7C0 Created OS            00 (0) 'MS-DOS'\n+6D7C1 Extract Zip Spec      14 (20) '2.0'\n+6D7C2 Extract OS            00 (0) 'MS-DOS'\n+6D7C3 General Purpose Flag  0000 (0)\n+6D7C5 Compression Method    0000 (0) 'Stored'\n+6D7C7 Modification Time     EC210000 (3961585664) 'Wed Jan  1 00:00:00 2098'\n+6D7CB CRC                   00000000 (0)\n+6D7CF Compressed Size       00000000 (0)\n+6D7D3 Uncompressed Size     00000000 (0)\n+6D7D7 Filename Length       0004 (4)\n+6D7D9 Extra Length          0009 (9)\n+6D7DB Comment Length        0000 (0)\n+6D7DD Disk Start            0000 (0)\n+6D7DF Int File Attributes   0000 (0)\n+      [Bit 0]               0 'Binary Data'\n+6D7E1 Ext File Attributes   00000000 (0)\n+6D7E5 Local Header Offset   00005B1A (23322)\n+6D7E9 Filename              'XXXX'\n+#\n+# WARNING: Offset 0x6D7E9: Filename 'XXXX'\n+#          Zero length filename\n+#\n+6D7ED Extra ID #1           5455 (21589) 'Extended Timestamp [UT]'\n+6D7EF   Length              0005 (5)\n+6D7F1   Flags               01 (1) 'Modification'\n+6D7F2   Modification Time   00000000 (0) 'Thu Jan  1 00:00:00 1970'\n+\n+6D7F6 CENTRAL HEADER #29    02014B50 (33639248)\n+6D7FA Created Zip Spec      14 (20) '2.0'\n+6D7FB Created OS            00 (0) 'MS-DOS'\n+6D7FC Extract Zip Spec      14 (20) '2.0'\n+6D7FD Extract OS            00 (0) 'MS-DOS'\n+6D7FE General Purpose Flag  0000 (0)\n+6D800 Compression Method    0000 (0) 'Stored'\n+6D802 Modification Time     EC210000 (3961585664) 'Wed Jan  1 00:00:00 2098'\n+6D806 CRC                   00000000 (0)\n+6D80A Compressed Size       00000000 (0)\n+6D80E Uncompressed Size     00000000 (0)\n+6D812 Filename Length       000B (11)\n+6D814 Extra Length          0009 (9)\n+6D816 Comment Length        0000 (0)\n+6D818 Disk Start            0000 (0)\n+6D81A Int File Attributes   0000 (0)\n+      [Bit 0]               0 'Binary Data'\n+6D81C Ext File Attributes   00000000 (0)\n+6D820 Local Header Offset   00005B45 (23365)\n+6D824 Filename              'XXXXXXXXXXX'\n+#\n+# WARNING: Offset 0x6D824: Filename 'XXXXXXXXXXX'\n+#          Zero length filename\n+#\n+6D82F Extra ID #1           5455 (21589) 'Extended Timestamp [UT]'\n+6D831   Length              0005 (5)\n+6D833   Flags               01 (1) 'Modification'\n+6D834   Modification Time   00000000 (0) 'Thu Jan  1 00:00:00 1970'\n+\n+6D838 CENTRAL HEADER #30    02014B50 (33639248)\n+6D83C Created Zip Spec      14 (20) '2.0'\n+6D83D Created OS            00 (0) 'MS-DOS'\n+6D83E Extract Zip Spec      14 (20) '2.0'\n+6D83F Extract OS            00 (0) 'MS-DOS'\n+6D840 General Purpose Flag  0000 (0)\n+6D842 Compression Method    0000 (0) 'Stored'\n+6D844 Modification Time     EC210000 (3961585664) 'Wed Jan  1 00:00:00 2098'\n+6D848 CRC                   00000000 (0)\n+6D84C Compressed Size       00000000 (0)\n+6D850 Uncompressed Size     00000000 (0)\n+6D854 Filename Length       0011 (17)\n+6D856 Extra Length          0009 (9)\n+6D858 Comment Length        0000 (0)\n+6D85A Disk Start            0000 (0)\n+6D85C Int File Attributes   0000 (0)\n+      [Bit 0]               0 'Binary Data'\n+6D85E Ext File Attributes   00000000 (0)\n+6D862 Local Header Offset   00005B77 (23415)\n+6D866 Filename              'XXXXXXXXXXXXXXXXX'\n+#\n+# WARNING: Offset 0x6D866: Filename 'XXXXXXXXXXXXXXXXX'\n+#          Zero length filename\n+#\n+6D877 Extra ID #1           5455 (21589) 'Extended Timestamp [UT]'\n+6D879   Length              0005 (5)\n+6D87B   Flags               01 (1) 'Modification'\n+6D87C   Modification Time   00000000 (0) 'Thu Jan  1 00:00:00 1970'\n+\n+6D880 CENTRAL HEADER #31    02014B50 (33639248)\n+6D884 Created Zip Spec      14 (20) '2.0'\n+6D885 Created OS            00 (0) 'MS-DOS'\n+6D886 Extract Zip Spec      14 (20) '2.0'\n+6D887 Extract OS            00 (0) 'MS-DOS'\n+6D888 General Purpose Flag  0000 (0)\n+6D88A Compression Method    0000 (0) 'Stored'\n+6D88C Modification Time     EC210000 (3961585664) 'Wed Jan  1 00:00:00 2098'\n+6D890 CRC                   00000000 (0)\n+6D894 Compressed Size       00000000 (0)\n+6D898 Uncompressed Size     00000000 (0)\n+6D89C Filename Length       001A (26)\n+6D89E Extra Length          0009 (9)\n+6D8A0 Comment Length        0000 (0)\n+6D8A2 Disk Start            0000 (0)\n+6D8A4 Int File Attributes   0000 (0)\n+      [Bit 0]               0 'Binary Data'\n+6D8A6 Ext File Attributes   00000000 (0)\n+6D8AA Local Header Offset   00005BAF (23471)\n+6D8AE Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXX'\n+#\n+# WARNING: Offset 0x6D8AE: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXX'\n+#          Zero length filename\n+#\n+6D8C8 Extra ID #1           5455 (21589) 'Extended Timestamp [UT]'\n+6D8CA   Length              0005 (5)\n+6D8CC   Flags               01 (1) 'Modification'\n+6D8CD   Modification Time   00000000 (0) 'Thu Jan  1 00:00:00 1970'\n+\n+6D8D1 CENTRAL HEADER #32    02014B50 (33639248)\n+6D8D5 Created Zip Spec      14 (20) '2.0'\n+6D8D6 Created OS            00 (0) 'MS-DOS'\n+6D8D7 Extract Zip Spec      14 (20) '2.0'\n+6D8D8 Extract OS            00 (0) 'MS-DOS'\n+6D8D9 General Purpose Flag  0008 (8)\n+      [Bit  3]              1 'Streamed'\n+6D8DB Compression Method    0000 (0) 'Stored'\n+6D8DD Modification Time     EC210000 (3961585664) 'Wed Jan  1 00:00:00 2098'\n+6D8E1 CRC                   D8E4F331 (3638883121)\n+6D8E5 Compressed Size       00000544 (1348)\n+6D8E9 Uncompressed Size     00000544 (1348)\n+6D8ED Filename Length       002E (46)\n+6D8EF Extra Length          0009 (9)\n+6D8F1 Comment Length        0000 (0)\n+6D8F3 Disk Start            0000 (0)\n+6D8F5 Int File Attributes   0000 (0)\n+      [Bit 0]               0 'Binary Data'\n+6D8F7 Ext File Attributes   00000000 (0)\n+6D8FB Local Header Offset   00005BF0 (23536)\n+6D8FF Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+#\n+# WARNING: Offset 0x6D8FF: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+#          Zero length filename\n+#\n+6D92D Extra ID #1           5455 (21589) 'Extended Timestamp [UT]'\n+6D92F   Length              0005 (5)\n+6D931   Flags               01 (1) 'Modification'\n+6D932   Modification Time   00000000 (0) 'Thu Jan  1 00:00:00 1970'\n+\n+6D936 CENTRAL HEADER #33    02014B50 (33639248)\n+6D93A Created Zip Spec      14 (20) '2.0'\n+6D93B Created OS            00 (0) 'MS-DOS'\n+6D93C Extract Zip Spec      14 (20) '2.0'\n+6D93D Extract OS            00 (0) 'MS-DOS'\n+6D93E General Purpose Flag  0008 (8)\n+      [Bit  3]              1 'Streamed'\n+6D940 Compression Method    0000 (0) 'Stored'\n+6D942 Modification Time     EC210000 (3961585664) 'Wed Jan  1 00:00:00 2098'\n+6D946 CRC                   C7E99B2E (3353975598)\n+6D94A Compressed Size       00000ACD (2765)\n+6D94E Uncompressed Size     00000ACD (2765)\n+6D952 Filename Length       0028 (40)\n+6D954 Extra Length          0009 (9)\n+6D956 Comment Length        0000 (0)\n+6D958 Disk Start            0000 (0)\n+6D95A Int File Attributes   0000 (0)\n+      [Bit 0]               0 'Binary Data'\n+6D95C Ext File Attributes   00000000 (0)\n+6D960 Local Header Offset   00006199 (24985)\n+6D964 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+#\n+# WARNING: Offset 0x6D964: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+#          Zero length filename\n+#\n+6D98C Extra ID #1           5455 (21589) 'Extended Timestamp [UT]'\n+6D98E   Length              0005 (5)\n+6D990   Flags               01 (1) 'Modification'\n+6D991   Modification Time   00000000 (0) 'Thu Jan  1 00:00:00 1970'\n+\n+6D995 CENTRAL HEADER #34    02014B50 (33639248)\n+6D999 Created Zip Spec      14 (20) '2.0'\n+6D99A Created OS            00 (0) 'MS-DOS'\n+6D99B Extract Zip Spec      14 (20) '2.0'\n+6D99C Extract OS            00 (0) 'MS-DOS'\n+6D99D General Purpose Flag  0008 (8)\n+      [Bit  3]              1 'Streamed'\n+6D99F Compression Method    0000 (0) 'Stored'\n+6D9A1 Modification Time     EC210000 (3961585664) 'Wed Jan  1 00:00:00 2098'\n+6D9A5 CRC                   A4BC4964 (2763802980)\n+6D9A9 Compressed Size       000014B7 (5303)\n+6D9AD Uncompressed Size     000014B7 (5303)\n+6D9B1 Filename Length       0036 (54)\n+6D9B3 Extra Length          0009 (9)\n+6D9B5 Comment Length        0000 (0)\n+6D9B7 Disk Start            0000 (0)\n+6D9B9 Int File Attributes   0000 (0)\n+      [Bit 0]               0 'Binary Data'\n+6D9BB Ext File Attributes   00000000 (0)\n+6D9BF Local Header Offset   00006CC5 (27845)\n+6D9C3 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+#\n+# WARNING: Offset 0x6D9C3: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+#          Zero length filename\n+#\n+6D9F9 Extra ID #1           5455 (21589) 'Extended Timestamp [UT]'\n+6D9FB   Length              0005 (5)\n+6D9FD   Flags               01 (1) 'Modification'\n+6D9FE   Modification Time   00000000 (0) 'Thu Jan  1 00:00:00 1970'\n+\n+6DA02 CENTRAL HEADER #35    02014B50 (33639248)\n+6DA06 Created Zip Spec      14 (20) '2.0'\n+6DA07 Created OS            00 (0) 'MS-DOS'\n+6DA08 Extract Zip Spec      14 (20) '2.0'\n+6DA09 Extract OS            00 (0) 'MS-DOS'\n+6DA0A General Purpose Flag  0008 (8)\n+      [Bit  3]              1 'Streamed'\n+6DA0C Compression Method    0000 (0) 'Stored'\n+6DA0E Modification Time     EC210000 (3961585664) 'Wed Jan  1 00:00:00 2098'\n+6DA12 CRC                   4C19B653 (1276753491)\n+6DA16 Compressed Size       00000A34 (2612)\n+6DA1A Uncompressed Size     00000A34 (2612)\n+6DA1E Filename Length       002D (45)\n+6DA20 Extra Length          0009 (9)\n+6DA22 Comment Length        0000 (0)\n+6DA24 Disk Start            0000 (0)\n+6DA26 Int File Attributes   0000 (0)\n+      [Bit 0]               0 'Binary Data'\n+6DA28 Ext File Attributes   00000000 (0)\n+6DA2C Local Header Offset   000081E9 (33257)\n+6DA30 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+#\n+# WARNING: Offset 0x6DA30: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+#          Zero length filename\n+#\n+6DA5D Extra ID #1           5455 (21589) 'Extended Timestamp [UT]'\n+6DA5F   Length              0005 (5)\n+6DA61   Flags               01 (1) 'Modification'\n+6DA62   Modification Time   00000000 (0) 'Thu Jan  1 00:00:00 1970'\n+\n+6DA66 CENTRAL HEADER #36    02014B50 (33639248)\n+6DA6A Created Zip Spec      14 (20) '2.0'\n+6DA6B Created OS            00 (0) 'MS-DOS'\n+6DA6C Extract Zip Spec      14 (20) '2.0'\n+6DA6D Extract OS            00 (0) 'MS-DOS'\n+6DA6E General Purpose Flag  0008 (8)\n+      [Bit  3]              1 'Streamed'\n+6DA70 Compression Method    0000 (0) 'Stored'\n+6DA72 Modification Time     EC210000 (3961585664) 'Wed Jan  1 00:00:00 2098'\n+6DA76 CRC                   92D33C56 (2463317078)\n+6DA7A Compressed Size       0000053A (1338)\n+6DA7E Uncompressed Size     0000053A (1338)\n+6DA82 Filename Length       0027 (39)\n+6DA84 Extra Length          0009 (9)\n+6DA86 Comment Length        0000 (0)\n+6DA88 Disk Start            0000 (0)\n+6DA8A Int File Attributes   0000 (0)\n+      [Bit 0]               0 'Binary Data'\n+6DA8C Ext File Attributes   00000000 (0)\n+6DA90 Local Header Offset   00008C81 (35969)\n+6DA94 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+#\n+# WARNING: Offset 0x6DA94: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+#          Zero length filename\n+#\n+6DABB Extra ID #1           5455 (21589) 'Extended Timestamp [UT]'\n+6DABD   Length              0005 (5)\n+6DABF   Flags               01 (1) 'Modification'\n+6DAC0   Modification Time   00000000 (0) 'Thu Jan  1 00:00:00 1970'\n+\n+6DAC4 CENTRAL HEADER #37    02014B50 (33639248)\n+6DAC8 Created Zip Spec      14 (20) '2.0'\n+6DAC9 Created OS            00 (0) 'MS-DOS'\n+6DACA Extract Zip Spec      14 (20) '2.0'\n+6DACB Extract OS            00 (0) 'MS-DOS'\n+6DACC General Purpose Flag  0008 (8)\n+      [Bit  3]              1 'Streamed'\n+6DACE Compression Method    0000 (0) 'Stored'\n+6DAD0 Modification Time     EC210000 (3961585664) 'Wed Jan  1 00:00:00 2098'\n+6DAD4 CRC                   8AC6D7E1 (2328287201)\n+6DAD8 Compressed Size       000007D3 (2003)\n+6DADC Uncompressed Size     000007D3 (2003)\n+6DAE0 Filename Length       002E (46)\n+6DAE2 Extra Length          0009 (9)\n+6DAE4 Comment Length        0000 (0)\n+6DAE6 Disk Start            0000 (0)\n+6DAE8 Int File Attributes   0000 (0)\n+      [Bit 0]               0 'Binary Data'\n+6DAEA Ext File Attributes   00000000 (0)\n+6DAEE Local Header Offset   00009219 (37401)\n+6DAF2 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+#\n+# WARNING: Offset 0x6DAF2: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+#          Zero length filename\n+#\n+6DB20 Extra ID #1           5455 (21589) 'Extended Timestamp [UT]'\n+6DB22   Length              0005 (5)\n+6DB24   Flags               01 (1) 'Modification'\n+6DB25   Modification Time   00000000 (0) 'Thu Jan  1 00:00:00 1970'\n+\n+6DB29 CENTRAL HEADER #38    02014B50 (33639248)\n+6DB2D Created Zip Spec      14 (20) '2.0'\n+6DB2E Created OS            00 (0) 'MS-DOS'\n+6DB2F Extract Zip Spec      14 (20) '2.0'\n+6DB30 Extract OS            00 (0) 'MS-DOS'\n+6DB31 General Purpose Flag  0008 (8)\n+      [Bit  3]              1 'Streamed'\n+6DB33 Compression Method    0000 (0) 'Stored'\n+6DB35 Modification Time     EC210000 (3961585664) 'Wed Jan  1 00:00:00 2098'\n+6DB39 CRC                   12C409E5 (314837477)\n+6DB3D Compressed Size       0000061F (1567)\n+6DB41 Uncompressed Size     0000061F (1567)\n+6DB45 Filename Length       0035 (53)\n+6DB47 Extra Length          0009 (9)\n+6DB49 Comment Length        0000 (0)\n+6DB4B Disk Start            0000 (0)\n+6DB4D Int File Attributes   0000 (0)\n+      [Bit 0]               0 'Binary Data'\n+6DB4F Ext File Attributes   00000000 (0)\n+6DB53 Local Header Offset   00009A51 (39505)\n+6DB57 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+#\n+# WARNING: Offset 0x6DB57: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+#          Zero length filename\n+#\n+6DB8C Extra ID #1           5455 (21589) 'Extended Timestamp [UT]'\n+6DB8E   Length              0005 (5)\n+6DB90   Flags               01 (1) 'Modification'\n+6DB91   Modification Time   00000000 (0) 'Thu Jan  1 00:00:00 1970'\n+\n+6DB95 CENTRAL HEADER #39    02014B50 (33639248)\n+6DB99 Created Zip Spec      14 (20) '2.0'\n+6DB9A Created OS            00 (0) 'MS-DOS'\n+6DB9B Extract Zip Spec      14 (20) '2.0'\n+6DB9C Extract OS            00 (0) 'MS-DOS'\n+6DB9D General Purpose Flag  0008 (8)\n+      [Bit  3]              1 'Streamed'\n+6DB9F Compression Method    0000 (0) 'Stored'\n+6DBA1 Modification Time     EC210000 (3961585664) 'Wed Jan  1 00:00:00 2098'\n+6DBA5 CRC                   6C2E2D81 (1814965633)\n+6DBA9 Compressed Size       00001602 (5634)\n+6DBAD Uncompressed Size     00001602 (5634)\n+6DBB1 Filename Length       002E (46)\n+6DBB3 Extra Length          0009 (9)\n+6DBB5 Comment Length        0000 (0)\n+6DBB7 Disk Start            0000 (0)\n+6DBB9 Int File Attributes   0000 (0)\n+      [Bit 0]               0 'Binary Data'\n+6DBBB Ext File Attributes   00000000 (0)\n+6DBBF Local Header Offset   0000A0DC (41180)\n+6DBC3 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+#\n+# WARNING: Offset 0x6DBC3: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+#          Zero length filename\n+#\n+6DBF1 Extra ID #1           5455 (21589) 'Extended Timestamp [UT]'\n+6DBF3   Length              0005 (5)\n+6DBF5   Flags               01 (1) 'Modification'\n+6DBF6   Modification Time   00000000 (0) 'Thu Jan  1 00:00:00 1970'\n+\n+6DBFA CENTRAL HEADER #40    02014B50 (33639248)\n+6DBFE Created Zip Spec      14 (20) '2.0'\n+6DBFF Created OS            00 (0) 'MS-DOS'\n+6DC00 Extract Zip Spec      14 (20) '2.0'\n+6DC01 Extract OS            00 (0) 'MS-DOS'\n+6DC02 General Purpose Flag  0008 (8)\n+      [Bit  3]              1 'Streamed'\n+6DC04 Compression Method    0000 (0) 'Stored'\n+6DC06 Modification Time     EC210000 (3961585664) 'Wed Jan  1 00:00:00 2098'\n+6DC0A CRC                   ED9B9E6B (3986398827)\n+6DC0E Compressed Size       000004B7 (1207)\n+6DC12 Uncompressed Size     000004B7 (1207)\n+6DC16 Filename Length       0036 (54)\n+6DC18 Extra Length          0009 (9)\n+6DC1A Comment Length        0000 (0)\n+6DC1C Disk Start            0000 (0)\n+6DC1E Int File Attributes   0000 (0)\n+      [Bit 0]               0 'Binary Data'\n+6DC20 Ext File Attributes   00000000 (0)\n+6DC24 Local Header Offset   0000B743 (46915)\n+6DC28 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+#\n+# WARNING: Offset 0x6DC28: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+#          Zero length filename\n+#\n+6DC5E Extra ID #1           5455 (21589) 'Extended Timestamp [UT]'\n+6DC60   Length              0005 (5)\n+6DC62   Flags               01 (1) 'Modification'\n+6DC63   Modification Time   00000000 (0) 'Thu Jan  1 00:00:00 1970'\n+\n+6DC67 CENTRAL HEADER #41    02014B50 (33639248)\n+6DC6B Created Zip Spec      14 (20) '2.0'\n+6DC6C Created OS            00 (0) 'MS-DOS'\n+6DC6D Extract Zip Spec      14 (20) '2.0'\n+6DC6E Extract OS            00 (0) 'MS-DOS'\n+6DC6F General Purpose Flag  0000 (0)\n+6DC71 Compression Method    0000 (0) 'Stored'\n+6DC73 Modification Time     EC210000 (3961585664) 'Wed Jan  1 00:00:00 2098'\n+6DC77 CRC                   00000000 (0)\n+6DC7B Compressed Size       00000000 (0)\n+6DC7F Uncompressed Size     00000000 (0)\n+6DC83 Filename Length       0021 (33)\n+6DC85 Extra Length          0009 (9)\n+6DC87 Comment Length        0000 (0)\n+6DC89 Disk Start            0000 (0)\n+6DC8B Int File Attributes   0000 (0)\n+      [Bit 0]               0 'Binary Data'\n+6DC8D Ext File Attributes   00000000 (0)\n+6DC91 Local Header Offset   0000BC67 (48231)\n+6DC95 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+#\n+# WARNING: Offset 0x6DC95: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+#          Zero length filename\n+#\n+6DCB6 Extra ID #1           5455 (21589) 'Extended Timestamp [UT]'\n+6DCB8   Length              0005 (5)\n+6DCBA   Flags               01 (1) 'Modification'\n+6DCBB   Modification Time   00000000 (0) 'Thu Jan  1 00:00:00 1970'\n+\n+6DCBF CENTRAL HEADER #42    02014B50 (33639248)\n+6DCC3 Created Zip Spec      14 (20) '2.0'\n+6DCC4 Created OS            00 (0) 'MS-DOS'\n+6DCC5 Extract Zip Spec      14 (20) '2.0'\n+6DCC6 Extract OS            00 (0) 'MS-DOS'\n+6DCC7 General Purpose Flag  0008 (8)\n+      [Bit  3]              1 'Streamed'\n+6DCC9 Compression Method    0000 (0) 'Stored'\n+6DCCB Modification Time     EC210000 (3961585664) 'Wed Jan  1 00:00:00 2098'\n+6DCCF CRC                   3799B565 (932820325)\n+6DCD3 Compressed Size       0000086B (2155)\n+6DCD7 Uncompressed Size     0000086B (2155)\n+6DCDB Filename Length       003E (62)\n+6DCDD Extra Length          0009 (9)\n+6DCDF Comment Length        0000 (0)\n+6DCE1 Disk Start            0000 (0)\n+6DCE3 Int File Attributes   0000 (0)\n+      [Bit 0]               0 'Binary Data'\n+6DCE5 Ext File Attributes   00000000 (0)\n+6DCE9 Local Header Offset   0000BCAF (48303)\n+6DCED Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+#\n+# WARNING: Offset 0x6DCED: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+#          Zero length filename\n+#\n+6DD2B Extra ID #1           5455 (21589) 'Extended Timestamp [UT]'\n+6DD2D   Length              0005 (5)\n+6DD2F   Flags               01 (1) 'Modification'\n+6DD30   Modification Time   00000000 (0) 'Thu Jan  1 00:00:00 1970'\n+\n+6DD34 CENTRAL HEADER #43    02014B50 (33639248)\n+6DD38 Created Zip Spec      14 (20) '2.0'\n+6DD39 Created OS            00 (0) 'MS-DOS'\n+6DD3A Extract Zip Spec      14 (20) '2.0'\n+6DD3B Extract OS            00 (0) 'MS-DOS'\n+6DD3C General Purpose Flag  0008 (8)\n+      [Bit  3]              1 'Streamed'\n+6DD3E Compression Method    0000 (0) 'Stored'\n+6DD40 Modification Time     EC210000 (3961585664) 'Wed Jan  1 00:00:00 2098'\n+6DD44 CRC                   0B335580 (187913600)\n+6DD48 Compressed Size       000006ED (1773)\n+6DD4C Uncompressed Size     000006ED (1773)\n+6DD50 Filename Length       0045 (69)\n+6DD52 Extra Length          0009 (9)\n+6DD54 Comment Length        0000 (0)\n+6DD56 Disk Start            0000 (0)\n+6DD58 Int File Attributes   0000 (0)\n+      [Bit 0]               0 'Binary Data'\n+6DD5A Ext File Attributes   00000000 (0)\n+6DD5E Local Header Offset   0000C58F (50575)\n+6DD62 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+#\n+# WARNING: Offset 0x6DD62: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+#          Zero length filename\n+#\n+6DDA7 Extra ID #1           5455 (21589) 'Extended Timestamp [UT]'\n+6DDA9   Length              0005 (5)\n+6DDAB   Flags               01 (1) 'Modification'\n+6DDAC   Modification Time   00000000 (0) 'Thu Jan  1 00:00:00 1970'\n+\n+6DDB0 CENTRAL HEADER #44    02014B50 (33639248)\n+6DDB4 Created Zip Spec      14 (20) '2.0'\n+6DDB5 Created OS            00 (0) 'MS-DOS'\n+6DDB6 Extract Zip Spec      14 (20) '2.0'\n+6DDB7 Extract OS            00 (0) 'MS-DOS'\n+6DDB8 General Purpose Flag  0008 (8)\n+      [Bit  3]              1 'Streamed'\n+6DDBA Compression Method    0000 (0) 'Stored'\n+6DDBC Modification Time     EC210000 (3961585664) 'Wed Jan  1 00:00:00 2098'\n+6DDC0 CRC                   4E9CD747 (1318901575)\n+6DDC4 Compressed Size       00000587 (1415)\n+6DDC8 Uncompressed Size     00000587 (1415)\n+6DDCC Filename Length       0046 (70)\n+6DDCE Extra Length          0009 (9)\n+6DDD0 Comment Length        0000 (0)\n+6DDD2 Disk Start            0000 (0)\n+6DDD4 Int File Attributes   0000 (0)\n+      [Bit 0]               0 'Binary Data'\n+6DDD6 Ext File Attributes   00000000 (0)\n+6DDDA Local Header Offset   0000CCF8 (52472)\n+6DDDE Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+#\n+# WARNING: Offset 0x6DDDE: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+#          Zero length filename\n+#\n+6DE24 Extra ID #1           5455 (21589) 'Extended Timestamp [UT]'\n+6DE26   Length              0005 (5)\n+6DE28   Flags               01 (1) 'Modification'\n+6DE29   Modification Time   00000000 (0) 'Thu Jan  1 00:00:00 1970'\n+\n+6DE2D CENTRAL HEADER #45    02014B50 (33639248)\n+6DE31 Created Zip Spec      14 (20) '2.0'\n+6DE32 Created OS            00 (0) 'MS-DOS'\n+6DE33 Extract Zip Spec      14 (20) '2.0'\n+6DE34 Extract OS            00 (0) 'MS-DOS'\n+6DE35 General Purpose Flag  0008 (8)\n+      [Bit  3]              1 'Streamed'\n+6DE37 Compression Method    0000 (0) 'Stored'\n+6DE39 Modification Time     EC210000 (3961585664) 'Wed Jan  1 00:00:00 2098'\n+6DE3D CRC                   A92DE3D2 (2838356946)\n+6DE41 Compressed Size       000008A1 (2209)\n+6DE45 Uncompressed Size     000008A1 (2209)\n+6DE49 Filename Length       0044 (68)\n+6DE4B Extra Length          0009 (9)\n+6DE4D Comment Length        0000 (0)\n+6DE4F Disk Start            0000 (0)\n+6DE51 Int File Attributes   0000 (0)\n+      [Bit 0]               0 'Binary Data'\n+6DE53 Ext File Attributes   00000000 (0)\n+6DE57 Local Header Offset   0000D2FC (54012)\n+6DE5B Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+#\n+# WARNING: Offset 0x6DE5B: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+#          Zero length filename\n+#\n+6DE9F Extra ID #1           5455 (21589) 'Extended Timestamp [UT]'\n+6DEA1   Length              0005 (5)\n+6DEA3   Flags               01 (1) 'Modification'\n+6DEA4   Modification Time   00000000 (0) 'Thu Jan  1 00:00:00 1970'\n+\n+6DEA8 CENTRAL HEADER #46    02014B50 (33639248)\n+6DEAC Created Zip Spec      14 (20) '2.0'\n+6DEAD Created OS            00 (0) 'MS-DOS'\n+6DEAE Extract Zip Spec      14 (20) '2.0'\n+6DEAF Extract OS            00 (0) 'MS-DOS'\n+6DEB0 General Purpose Flag  0008 (8)\n+      [Bit  3]              1 'Streamed'\n+6DEB2 Compression Method    0000 (0) 'Stored'\n+6DEB4 Modification Time     EC210000 (3961585664) 'Wed Jan  1 00:00:00 2098'\n+6DEB8 CRC                   B19E4EA6 (2979942054)\n+6DEBC Compressed Size       0000188D (6285)\n+6DEC0 Uncompressed Size     0000188D (6285)\n+6DEC4 Filename Length       003C (60)\n+6DEC6 Extra Length          0009 (9)\n+6DEC8 Comment Length        0000 (0)\n+6DECA Disk Start            0000 (0)\n+6DECC Int File Attributes   0000 (0)\n+      [Bit 0]               0 'Binary Data'\n+6DECE Ext File Attributes   00000000 (0)\n+6DED2 Local Header Offset   0000DC18 (56344)\n+6DED6 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+#\n+# WARNING: Offset 0x6DED6: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+#          Zero length filename\n+#\n+6DF12 Extra ID #1           5455 (21589) 'Extended Timestamp [UT]'\n+6DF14   Length              0005 (5)\n+6DF16   Flags               01 (1) 'Modification'\n+6DF17   Modification Time   00000000 (0) 'Thu Jan  1 00:00:00 1970'\n+\n+6DF1B CENTRAL HEADER #47    02014B50 (33639248)\n+6DF1F Created Zip Spec      14 (20) '2.0'\n+6DF20 Created OS            00 (0) 'MS-DOS'\n+6DF21 Extract Zip Spec      14 (20) '2.0'\n+6DF22 Extract OS            00 (0) 'MS-DOS'\n+6DF23 General Purpose Flag  0008 (8)\n+      [Bit  3]              1 'Streamed'\n+6DF25 Compression Method    0000 (0) 'Stored'\n+6DF27 Modification Time     EC210000 (3961585664) 'Wed Jan  1 00:00:00 2098'\n+6DF2B CRC                   25CCFC5A (634190938)\n+6DF2F Compressed Size       00002B62 (11106)\n+6DF33 Uncompressed Size     00002B62 (11106)\n+6DF37 Filename Length       0045 (69)\n+6DF39 Extra Length          0009 (9)\n+6DF3B Comment Length        0000 (0)\n+6DF3D Disk Start            0000 (0)\n+6DF3F Int File Attributes   0000 (0)\n+      [Bit 0]               0 'Binary Data'\n+6DF41 Ext File Attributes   00000000 (0)\n+6DF45 Local Header Offset   0000F518 (62744)\n+6DF49 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+#\n+# WARNING: Offset 0x6DF49: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+#          Zero length filename\n+#\n+6DF8E Extra ID #1           5455 (21589) 'Extended Timestamp [UT]'\n+6DF90   Length              0005 (5)\n+6DF92   Flags               01 (1) 'Modification'\n+6DF93   Modification Time   00000000 (0) 'Thu Jan  1 00:00:00 1970'\n+\n+6DF97 CENTRAL HEADER #48    02014B50 (33639248)\n+6DF9B Created Zip Spec      14 (20) '2.0'\n+6DF9C Created OS            00 (0) 'MS-DOS'\n+6DF9D Extract Zip Spec      14 (20) '2.0'\n+6DF9E Extract OS            00 (0) 'MS-DOS'\n+6DF9F General Purpose Flag  0008 (8)\n+      [Bit  3]              1 'Streamed'\n+6DFA1 Compression Method    0000 (0) 'Stored'\n+6DFA3 Modification Time     EC210000 (3961585664) 'Wed Jan  1 00:00:00 2098'\n+6DFA7 CRC                   DEC94C5D (3737734237)\n+6DFAB Compressed Size       000020CD (8397)\n+6DFAF Uncompressed Size     000020CD (8397)\n+6DFB3 Filename Length       0040 (64)\n+6DFB5 Extra Length          0009 (9)\n+6DFB7 Comment Length        0000 (0)\n+6DFB9 Disk Start            0000 (0)\n+6DFBB Int File Attributes   0000 (0)\n+      [Bit 0]               0 'Binary Data'\n+6DFBD Ext File Attributes   00000000 (0)\n+6DFC1 Local Header Offset   000120F6 (73974)\n+6DFC5 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+#\n+# WARNING: Offset 0x6DFC5: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+#          Zero length filename\n+#\n+6E005 Extra ID #1           5455 (21589) 'Extended Timestamp [UT]'\n+6E007   Length              0005 (5)\n+6E009   Flags               01 (1) 'Modification'\n+6E00A   Modification Time   00000000 (0) 'Thu Jan  1 00:00:00 1970'\n+\n+6E00E CENTRAL HEADER #49    02014B50 (33639248)\n+6E012 Created Zip Spec      14 (20) '2.0'\n+6E013 Created OS            00 (0) 'MS-DOS'\n+6E014 Extract Zip Spec      14 (20) '2.0'\n+6E015 Extract OS            00 (0) 'MS-DOS'\n+6E016 General Purpose Flag  0008 (8)\n+      [Bit  3]              1 'Streamed'\n+6E018 Compression Method    0000 (0) 'Stored'\n+6E01A Modification Time     EC210000 (3961585664) 'Wed Jan  1 00:00:00 2098'\n+6E01E CRC                   71025D3E (1895980350)\n+6E022 Compressed Size       0000309E (12446)\n+6E026 Uncompressed Size     0000309E (12446)\n+6E02A Filename Length       0038 (56)\n+6E02C Extra Length          0009 (9)\n+6E02E Comment Length        0000 (0)\n+6E030 Disk Start            0000 (0)\n+6E032 Int File Attributes   0000 (0)\n+      [Bit 0]               0 'Binary Data'\n+6E034 Ext File Attributes   00000000 (0)\n+6E038 Local Header Offset   0001423A (82490)\n+6E03C Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+#\n+# WARNING: Offset 0x6E03C: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+#          Zero length filename\n+#\n+6E074 Extra ID #1           5455 (21589) 'Extended Timestamp [UT]'\n+6E076   Length              0005 (5)\n+6E078   Flags               01 (1) 'Modification'\n+6E079   Modification Time   00000000 (0) 'Thu Jan  1 00:00:00 1970'\n+\n+6E07D CENTRAL HEADER #50    02014B50 (33639248)\n+6E081 Created Zip Spec      14 (20) '2.0'\n+6E082 Created OS            00 (0) 'MS-DOS'\n+6E083 Extract Zip Spec      14 (20) '2.0'\n+6E084 Extract OS            00 (0) 'MS-DOS'\n+6E085 General Purpose Flag  0008 (8)\n+      [Bit  3]              1 'Streamed'\n+6E087 Compression Method    0000 (0) 'Stored'\n+6E089 Modification Time     EC210000 (3961585664) 'Wed Jan  1 00:00:00 2098'\n+6E08D CRC                   BE5FB3B5 (3193942965)\n+6E091 Compressed Size       00000604 (1540)\n+6E095 Uncompressed Size     00000604 (1540)\n+6E099 Filename Length       003F (63)\n+6E09B Extra Length          0009 (9)\n+6E09D Comment Length        0000 (0)\n+6E09F Disk Start            0000 (0)\n+6E0A1 Int File Attributes   0000 (0)\n+      [Bit 0]               0 'Binary Data'\n+6E0A3 Ext File Attributes   00000000 (0)\n+6E0A7 Local Header Offset   00017347 (95047)\n+6E0AB Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+#\n+# WARNING: Offset 0x6E0AB: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+#          Zero length filename\n+#\n+6E0EA Extra ID #1           5455 (21589) 'Extended Timestamp [UT]'\n+6E0EC   Length              0005 (5)\n+6E0EE   Flags               01 (1) 'Modification'\n+6E0EF   Modification Time   00000000 (0) 'Thu Jan  1 00:00:00 1970'\n+\n+6E0F3 CENTRAL HEADER #51    02014B50 (33639248)\n+6E0F7 Created Zip Spec      14 (20) '2.0'\n+6E0F8 Created OS            00 (0) 'MS-DOS'\n+6E0F9 Extract Zip Spec      14 (20) '2.0'\n+6E0FA Extract OS            00 (0) 'MS-DOS'\n+6E0FB General Purpose Flag  0008 (8)\n+      [Bit  3]              1 'Streamed'\n+6E0FD Compression Method    0000 (0) 'Stored'\n+6E0FF Modification Time     EC210000 (3961585664) 'Wed Jan  1 00:00:00 2098'\n+6E103 CRC                   ED1E1920 (3978172704)\n+6E107 Compressed Size       00002FC8 (12232)\n+6E10B Uncompressed Size     00002FC8 (12232)\n+6E10F Filename Length       0036 (54)\n+6E111 Extra Length          0009 (9)\n+6E113 Comment Length        0000 (0)\n+6E115 Disk Start            0000 (0)\n+6E117 Int File Attributes   0000 (0)\n+      [Bit 0]               0 'Binary Data'\n+6E119 Ext File Attributes   00000000 (0)\n+6E11D Local Header Offset   000179C1 (96705)\n+6E121 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+#\n+# WARNING: Offset 0x6E121: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+#          Zero length filename\n+#\n+6E157 Extra ID #1           5455 (21589) 'Extended Timestamp [UT]'\n+6E159   Length              0005 (5)\n+6E15B   Flags               01 (1) 'Modification'\n+6E15C   Modification Time   00000000 (0) 'Thu Jan  1 00:00:00 1970'\n+\n+6E160 CENTRAL HEADER #52    02014B50 (33639248)\n+6E164 Created Zip Spec      14 (20) '2.0'\n+6E165 Created OS            00 (0) 'MS-DOS'\n+6E166 Extract Zip Spec      14 (20) '2.0'\n+6E167 Extract OS            00 (0) 'MS-DOS'\n+6E168 General Purpose Flag  0008 (8)\n+      [Bit  3]              1 'Streamed'\n+6E16A Compression Method    0000 (0) 'Stored'\n+6E16C Modification Time     EC210000 (3961585664) 'Wed Jan  1 00:00:00 2098'\n+6E170 CRC                   9286ACC7 (2458299591)\n+6E174 Compressed Size       000007EB (2027)\n+6E178 Uncompressed Size     000007EB (2027)\n+6E17C Filename Length       003D (61)\n+6E17E Extra Length          0009 (9)\n+6E180 Comment Length        0000 (0)\n+6E182 Disk Start            0000 (0)\n+6E184 Int File Attributes   0000 (0)\n+      [Bit 0]               0 'Binary Data'\n+6E186 Ext File Attributes   00000000 (0)\n+6E18A Local Header Offset   0001A9F6 (109046)\n+6E18E Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+#\n+# WARNING: Offset 0x6E18E: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+#          Zero length filename\n+#\n+6E1CB Extra ID #1           5455 (21589) 'Extended Timestamp [UT]'\n+6E1CD   Length              0005 (5)\n+6E1CF   Flags               01 (1) 'Modification'\n+6E1D0   Modification Time   00000000 (0) 'Thu Jan  1 00:00:00 1970'\n+\n+6E1D4 CENTRAL HEADER #53    02014B50 (33639248)\n+6E1D8 Created Zip Spec      14 (20) '2.0'\n+6E1D9 Created OS            00 (0) 'MS-DOS'\n+6E1DA Extract Zip Spec      14 (20) '2.0'\n+6E1DB Extract OS            00 (0) 'MS-DOS'\n+6E1DC General Purpose Flag  0008 (8)\n+      [Bit  3]              1 'Streamed'\n+6E1DE Compression Method    0000 (0) 'Stored'\n+6E1E0 Modification Time     EC210000 (3961585664) 'Wed Jan  1 00:00:00 2098'\n+6E1E4 CRC                   8EF20CD3 (2398227667)\n+6E1E8 Compressed Size       00005410 (21520)\n+6E1EC Uncompressed Size     00005410 (21520)\n+6E1F0 Filename Length       003E (62)\n+6E1F2 Extra Length          0009 (9)\n+6E1F4 Comment Length        0000 (0)\n+6E1F6 Disk Start            0000 (0)\n+6E1F8 Int File Attributes   0000 (0)\n+      [Bit 0]               0 'Binary Data'\n+6E1FA Ext File Attributes   00000000 (0)\n+6E1FE Local Header Offset   0001B255 (111189)\n+6E202 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+#\n+# WARNING: Offset 0x6E202: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+#          Zero length filename\n+#\n+6E240 Extra ID #1           5455 (21589) 'Extended Timestamp [UT]'\n+6E242   Length              0005 (5)\n+6E244   Flags               01 (1) 'Modification'\n+6E245   Modification Time   00000000 (0) 'Thu Jan  1 00:00:00 1970'\n+\n+6E249 CENTRAL HEADER #54    02014B50 (33639248)\n+6E24D Created Zip Spec      14 (20) '2.0'\n+6E24E Created OS            00 (0) 'MS-DOS'\n+6E24F Extract Zip Spec      14 (20) '2.0'\n+6E250 Extract OS            00 (0) 'MS-DOS'\n+6E251 General Purpose Flag  0008 (8)\n+      [Bit  3]              1 'Streamed'\n+6E253 Compression Method    0000 (0) 'Stored'\n+6E255 Modification Time     EC210000 (3961585664) 'Wed Jan  1 00:00:00 2098'\n+6E259 CRC                   82D7146C (2195133548)\n+6E25D Compressed Size       00002DE5 (11749)\n+6E261 Uncompressed Size     00002DE5 (11749)\n+6E265 Filename Length       0047 (71)\n+6E267 Extra Length          0009 (9)\n+6E269 Comment Length        0000 (0)\n+6E26B Disk Start            0000 (0)\n+6E26D Int File Attributes   0000 (0)\n+      [Bit 0]               0 'Binary Data'\n+6E26F Ext File Attributes   00000000 (0)\n+6E273 Local Header Offset   000206DA (132826)\n+6E277 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+#\n+# WARNING: Offset 0x6E277: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+#          Zero length filename\n+#\n+6E2BE Extra ID #1           5455 (21589) 'Extended Timestamp [UT]'\n+6E2C0   Length              0005 (5)\n+6E2C2   Flags               01 (1) 'Modification'\n+6E2C3   Modification Time   00000000 (0) 'Thu Jan  1 00:00:00 1970'\n+\n+6E2C7 CENTRAL HEADER #55    02014B50 (33639248)\n+6E2CB Created Zip Spec      14 (20) '2.0'\n+6E2CC Created OS            00 (0) 'MS-DOS'\n+6E2CD Extract Zip Spec      14 (20) '2.0'\n+6E2CE Extract OS            00 (0) 'MS-DOS'\n+6E2CF General Purpose Flag  0008 (8)\n+      [Bit  3]              1 'Streamed'\n+6E2D1 Compression Method    0000 (0) 'Stored'\n+6E2D3 Modification Time     EC210000 (3961585664) 'Wed Jan  1 00:00:00 2098'\n+6E2D7 CRC                   988327A2 (2558732194)\n+6E2DB Compressed Size       000006B3 (1715)\n+6E2DF Uncompressed Size     000006B3 (1715)\n+6E2E3 Filename Length       0045 (69)\n+6E2E5 Extra Length          0009 (9)\n+6E2E7 Comment Length        0000 (0)\n+6E2E9 Disk Start            0000 (0)\n+6E2EB Int File Attributes   0000 (0)\n+      [Bit 0]               0 'Binary Data'\n+6E2ED Ext File Attributes   00000000 (0)\n+6E2F1 Local Header Offset   0002353D (144701)\n+6E2F5 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+#\n+# WARNING: Offset 0x6E2F5: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+#          Zero length filename\n+#\n+6E33A Extra ID #1           5455 (21589) 'Extended Timestamp [UT]'\n+6E33C   Length              0005 (5)\n+6E33E   Flags               01 (1) 'Modification'\n+6E33F   Modification Time   00000000 (0) 'Thu Jan  1 00:00:00 1970'\n+\n+6E343 CENTRAL HEADER #56    02014B50 (33639248)\n+6E347 Created Zip Spec      14 (20) '2.0'\n+6E348 Created OS            00 (0) 'MS-DOS'\n+6E349 Extract Zip Spec      14 (20) '2.0'\n+6E34A Extract OS            00 (0) 'MS-DOS'\n+6E34B General Purpose Flag  0008 (8)\n+      [Bit  3]              1 'Streamed'\n+6E34D Compression Method    0000 (0) 'Stored'\n+6E34F Modification Time     EC210000 (3961585664) 'Wed Jan  1 00:00:00 2098'\n+6E353 CRC                   756EE014 (1970200596)\n+6E357 Compressed Size       00000E28 (3624)\n+6E35B Uncompressed Size     00000E28 (3624)\n+6E35F Filename Length       0035 (53)\n+6E361 Extra Length          0009 (9)\n+6E363 Comment Length        0000 (0)\n+6E365 Disk Start            0000 (0)\n+6E367 Int File Attributes   0000 (0)\n+      [Bit 0]               0 'Binary Data'\n+6E369 Ext File Attributes   00000000 (0)\n+6E36D Local Header Offset   00023C6C (146540)\n+6E371 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+#\n+# WARNING: Offset 0x6E371: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+#          Zero length filename\n+#\n+6E3A6 Extra ID #1           5455 (21589) 'Extended Timestamp [UT]'\n+6E3A8   Length              0005 (5)\n+6E3AA   Flags               01 (1) 'Modification'\n+6E3AB   Modification Time   00000000 (0) 'Thu Jan  1 00:00:00 1970'\n+\n+6E3AF CENTRAL HEADER #57    02014B50 (33639248)\n+6E3B3 Created Zip Spec      14 (20) '2.0'\n+6E3B4 Created OS            00 (0) 'MS-DOS'\n+6E3B5 Extract Zip Spec      14 (20) '2.0'\n+6E3B6 Extract OS            00 (0) 'MS-DOS'\n+6E3B7 General Purpose Flag  0008 (8)\n+      [Bit  3]              1 'Streamed'\n+6E3B9 Compression Method    0000 (0) 'Stored'\n+6E3BB Modification Time     EC210000 (3961585664) 'Wed Jan  1 00:00:00 2098'\n+6E3BF CRC                   3557220F (894902799)\n+6E3C3 Compressed Size       000005FC (1532)\n+6E3C7 Uncompressed Size     000005FC (1532)\n+6E3CB Filename Length       003F (63)\n+6E3CD Extra Length          0009 (9)\n+6E3CF Comment Length        0000 (0)\n+6E3D1 Disk Start            0000 (0)\n+6E3D3 Int File Attributes   0000 (0)\n+      [Bit 0]               0 'Binary Data'\n+6E3D5 Ext File Attributes   00000000 (0)\n+6E3D9 Local Header Offset   00024B00 (150272)\n+6E3DD Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+#\n+# WARNING: Offset 0x6E3DD: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+#          Zero length filename\n+#\n+6E41C Extra ID #1           5455 (21589) 'Extended Timestamp [UT]'\n+6E41E   Length              0005 (5)\n+6E420   Flags               01 (1) 'Modification'\n+6E421   Modification Time   00000000 (0) 'Thu Jan  1 00:00:00 1970'\n+\n+6E425 CENTRAL HEADER #58    02014B50 (33639248)\n+6E429 Created Zip Spec      14 (20) '2.0'\n+6E42A Created OS            00 (0) 'MS-DOS'\n+6E42B Extract Zip Spec      14 (20) '2.0'\n+6E42C Extract OS            00 (0) 'MS-DOS'\n+6E42D General Purpose Flag  0000 (0)\n+6E42F Compression Method    0000 (0) 'Stored'\n+6E431 Modification Time     EC210000 (3961585664) 'Wed Jan  1 00:00:00 2098'\n+6E435 CRC                   00000000 (0)\n+6E439 Compressed Size       00000000 (0)\n+6E43D Uncompressed Size     00000000 (0)\n+6E441 Filename Length       0027 (39)\n+6E443 Extra Length          0009 (9)\n+6E445 Comment Length        0000 (0)\n+6E447 Disk Start            0000 (0)\n+6E449 Int File Attributes   0000 (0)\n+      [Bit 0]               0 'Binary Data'\n+6E44B Ext File Attributes   00000000 (0)\n+6E44F Local Header Offset   00025172 (151922)\n+6E453 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+#\n+# WARNING: Offset 0x6E453: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+#          Zero length filename\n+#\n+6E47A Extra ID #1           5455 (21589) 'Extended Timestamp [UT]'\n+6E47C   Length              0005 (5)\n+6E47E   Flags               01 (1) 'Modification'\n+6E47F   Modification Time   00000000 (0) 'Thu Jan  1 00:00:00 1970'\n+\n+6E483 CENTRAL HEADER #59    02014B50 (33639248)\n+6E487 Created Zip Spec      14 (20) '2.0'\n+6E488 Created OS            00 (0) 'MS-DOS'\n+6E489 Extract Zip Spec      14 (20) '2.0'\n+6E48A Extract OS            00 (0) 'MS-DOS'\n+6E48B General Purpose Flag  0008 (8)\n+      [Bit  3]              1 'Streamed'\n+6E48D Compression Method    0000 (0) 'Stored'\n+6E48F Modification Time     EC210000 (3961585664) 'Wed Jan  1 00:00:00 2098'\n+6E493 CRC                   B96C1EAA (3110870698)\n+6E497 Compressed Size       00000517 (1303)\n+6E49B Uncompressed Size     00000517 (1303)\n+6E49F Filename Length       004A (74)\n+6E4A1 Extra Length          0009 (9)\n+6E4A3 Comment Length        0000 (0)\n+6E4A5 Disk Start            0000 (0)\n+6E4A7 Int File Attributes   0000 (0)\n+      [Bit 0]               0 'Binary Data'\n+6E4A9 Ext File Attributes   00000000 (0)\n+6E4AD Local Header Offset   000251C0 (152000)\n+6E4B1 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+#\n+# WARNING: Offset 0x6E4B1: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+#          Zero length filename\n+#\n+6E4FB Extra ID #1           5455 (21589) 'Extended Timestamp [UT]'\n+6E4FD   Length              0005 (5)\n+6E4FF   Flags               01 (1) 'Modification'\n+6E500   Modification Time   00000000 (0) 'Thu Jan  1 00:00:00 1970'\n+\n+6E504 CENTRAL HEADER #60    02014B50 (33639248)\n+6E508 Created Zip Spec      14 (20) '2.0'\n+6E509 Created OS            00 (0) 'MS-DOS'\n+6E50A Extract Zip Spec      14 (20) '2.0'\n+6E50B Extract OS            00 (0) 'MS-DOS'\n+6E50C General Purpose Flag  0008 (8)\n+      [Bit  3]              1 'Streamed'\n+6E50E Compression Method    0000 (0) 'Stored'\n+6E510 Modification Time     EC210000 (3961585664) 'Wed Jan  1 00:00:00 2098'\n+6E514 CRC                   7934C791 (2033502097)\n+6E518 Compressed Size       0000051C (1308)\n+6E51C Uncompressed Size     0000051C (1308)\n+6E520 Filename Length       004B (75)\n+6E522 Extra Length          0009 (9)\n+6E524 Comment Length        0000 (0)\n+6E526 Disk Start            0000 (0)\n+6E528 Int File Attributes   0000 (0)\n+      [Bit 0]               0 'Binary Data'\n+6E52A Ext File Attributes   00000000 (0)\n+6E52E Local Header Offset   00025758 (153432)\n+6E532 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+#\n+# WARNING: Offset 0x6E532: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+#          Zero length filename\n+#\n+6E57D Extra ID #1           5455 (21589) 'Extended Timestamp [UT]'\n+6E57F   Length              0005 (5)\n+6E581   Flags               01 (1) 'Modification'\n+6E582   Modification Time   00000000 (0) 'Thu Jan  1 00:00:00 1970'\n+\n+6E586 CENTRAL HEADER #61    02014B50 (33639248)\n+6E58A Created Zip Spec      14 (20) '2.0'\n+6E58B Created OS            00 (0) 'MS-DOS'\n+6E58C Extract Zip Spec      14 (20) '2.0'\n+6E58D Extract OS            00 (0) 'MS-DOS'\n+6E58E General Purpose Flag  0008 (8)\n+      [Bit  3]              1 'Streamed'\n+6E590 Compression Method    0000 (0) 'Stored'\n+6E592 Modification Time     EC210000 (3961585664) 'Wed Jan  1 00:00:00 2098'\n+6E596 CRC                   BF357544 (3207951684)\n+6E59A Compressed Size       000008B2 (2226)\n+6E59E Uncompressed Size     000008B2 (2226)\n+6E5A2 Filename Length       0041 (65)\n+6E5A4 Extra Length          0009 (9)\n+6E5A6 Comment Length        0000 (0)\n+6E5A8 Disk Start            0000 (0)\n+6E5AA Int File Attributes   0000 (0)\n+      [Bit 0]               0 'Binary Data'\n+6E5AC Ext File Attributes   00000000 (0)\n+6E5B0 Local Header Offset   00025CF6 (154870)\n+6E5B4 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+#\n+# WARNING: Offset 0x6E5B4: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+#          Zero length filename\n+#\n+6E5F5 Extra ID #1           5455 (21589) 'Extended Timestamp [UT]'\n+6E5F7   Length              0005 (5)\n+6E5F9   Flags               01 (1) 'Modification'\n+6E5FA   Modification Time   00000000 (0) 'Thu Jan  1 00:00:00 1970'\n+\n+6E5FE CENTRAL HEADER #62    02014B50 (33639248)\n+6E602 Created Zip Spec      14 (20) '2.0'\n+6E603 Created OS            00 (0) 'MS-DOS'\n+6E604 Extract Zip Spec      14 (20) '2.0'\n+6E605 Extract OS            00 (0) 'MS-DOS'\n+6E606 General Purpose Flag  0008 (8)\n+      [Bit  3]              1 'Streamed'\n+6E608 Compression Method    0000 (0) 'Stored'\n+6E60A Modification Time     EC210000 (3961585664) 'Wed Jan  1 00:00:00 2098'\n+6E60E CRC                   59957DEF (1502969327)\n+6E612 Compressed Size       000006AB (1707)\n+6E616 Uncompressed Size     000006AB (1707)\n+6E61A Filename Length       004A (74)\n+6E61C Extra Length          0009 (9)\n+6E61E Comment Length        0000 (0)\n+6E620 Disk Start            0000 (0)\n+6E622 Int File Attributes   0000 (0)\n+      [Bit 0]               0 'Binary Data'\n+6E624 Ext File Attributes   00000000 (0)\n+6E628 Local Header Offset   00026620 (157216)\n+6E62C Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+#\n+# WARNING: Offset 0x6E62C: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+#          Zero length filename\n+#\n+6E676 Extra ID #1           5455 (21589) 'Extended Timestamp [UT]'\n+6E678   Length              0005 (5)\n+6E67A   Flags               01 (1) 'Modification'\n+6E67B   Modification Time   00000000 (0) 'Thu Jan  1 00:00:00 1970'\n+\n+6E67F CENTRAL HEADER #63    02014B50 (33639248)\n+6E683 Created Zip Spec      14 (20) '2.0'\n+6E684 Created OS            00 (0) 'MS-DOS'\n+6E685 Extract Zip Spec      14 (20) '2.0'\n+6E686 Extract OS            00 (0) 'MS-DOS'\n+6E687 General Purpose Flag  0008 (8)\n+      [Bit  3]              1 'Streamed'\n+6E689 Compression Method    0000 (0) 'Stored'\n+6E68B Modification Time     EC210000 (3961585664) 'Wed Jan  1 00:00:00 2098'\n+6E68F CRC                   30CE65FD (818832893)\n+6E693 Compressed Size       00000545 (1349)\n+6E697 Uncompressed Size     00000545 (1349)\n+6E69B Filename Length       004C (76)\n+6E69D Extra Length          0009 (9)\n+6E69F Comment Length        0000 (0)\n+6E6A1 Disk Start            0000 (0)\n+6E6A3 Int File Attributes   0000 (0)\n+      [Bit 0]               0 'Binary Data'\n+6E6A5 Ext File Attributes   00000000 (0)\n+6E6A9 Local Header Offset   00026D4C (159052)\n+6E6AD Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+#\n+# WARNING: Offset 0x6E6AD: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+#          Zero length filename\n+#\n+6E6F9 Extra ID #1           5455 (21589) 'Extended Timestamp [UT]'\n+6E6FB   Length              0005 (5)\n+6E6FD   Flags               01 (1) 'Modification'\n+6E6FE   Modification Time   00000000 (0) 'Thu Jan  1 00:00:00 1970'\n+\n+6E702 CENTRAL HEADER #64    02014B50 (33639248)\n+6E706 Created Zip Spec      14 (20) '2.0'\n+6E707 Created OS            00 (0) 'MS-DOS'\n+6E708 Extract Zip Spec      14 (20) '2.0'\n+6E709 Extract OS            00 (0) 'MS-DOS'\n+6E70A General Purpose Flag  0008 (8)\n+      [Bit  3]              1 'Streamed'\n+6E70C Compression Method    0000 (0) 'Stored'\n+6E70E Modification Time     EC210000 (3961585664) 'Wed Jan  1 00:00:00 2098'\n+6E712 CRC                   C145F19E (3242586526)\n+6E716 Compressed Size       0000054B (1355)\n+6E71A Uncompressed Size     0000054B (1355)\n+6E71E Filename Length       004D (77)\n+6E720 Extra Length          0009 (9)\n+6E722 Comment Length        0000 (0)\n+6E724 Disk Start            0000 (0)\n+6E726 Int File Attributes   0000 (0)\n+      [Bit 0]               0 'Binary Data'\n+6E728 Ext File Attributes   00000000 (0)\n+6E72C Local Header Offset   00027314 (160532)\n+6E730 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+#\n+# WARNING: Offset 0x6E730: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+#          Zero length filename\n+#\n+6E77D Extra ID #1           5455 (21589) 'Extended Timestamp [UT]'\n+6E77F   Length              0005 (5)\n+6E781   Flags               01 (1) 'Modification'\n+6E782   Modification Time   00000000 (0) 'Thu Jan  1 00:00:00 1970'\n+\n+6E786 CENTRAL HEADER #65    02014B50 (33639248)\n+6E78A Created Zip Spec      14 (20) '2.0'\n+6E78B Created OS            00 (0) 'MS-DOS'\n+6E78C Extract Zip Spec      14 (20) '2.0'\n+6E78D Extract OS            00 (0) 'MS-DOS'\n+6E78E General Purpose Flag  0008 (8)\n+      [Bit  3]              1 'Streamed'\n+6E790 Compression Method    0000 (0) 'Stored'\n+6E792 Modification Time     EC210000 (3961585664) 'Wed Jan  1 00:00:00 2098'\n+6E796 CRC                   511C2CC7 (1360800967)\n+6E79A Compressed Size       000006A4 (1700)\n+6E79E Uncompressed Size     000006A4 (1700)\n+6E7A2 Filename Length       0040 (64)\n+6E7A4 Extra Length          0009 (9)\n+6E7A6 Comment Length        0000 (0)\n+6E7A8 Disk Start            0000 (0)\n+6E7AA Int File Attributes   0000 (0)\n+      [Bit 0]               0 'Binary Data'\n+6E7AC Ext File Attributes   00000000 (0)\n+6E7B0 Local Header Offset   000278E3 (162019)\n+6E7B4 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+#\n+# WARNING: Offset 0x6E7B4: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+#          Zero length filename\n+#\n+6E7F4 Extra ID #1           5455 (21589) 'Extended Timestamp [UT]'\n+6E7F6   Length              0005 (5)\n+6E7F8   Flags               01 (1) 'Modification'\n+6E7F9   Modification Time   00000000 (0) 'Thu Jan  1 00:00:00 1970'\n+\n+6E7FD CENTRAL HEADER #66    02014B50 (33639248)\n+6E801 Created Zip Spec      14 (20) '2.0'\n+6E802 Created OS            00 (0) 'MS-DOS'\n+6E803 Extract Zip Spec      14 (20) '2.0'\n+6E804 Extract OS            00 (0) 'MS-DOS'\n+6E805 General Purpose Flag  0008 (8)\n+      [Bit  3]              1 'Streamed'\n+6E807 Compression Method    0000 (0) 'Stored'\n+6E809 Modification Time     EC210000 (3961585664) 'Wed Jan  1 00:00:00 2098'\n+6E80D CRC                   B5EBBEE9 (3052125929)\n+6E811 Compressed Size       00000569 (1385)\n+6E815 Uncompressed Size     00000569 (1385)\n+6E819 Filename Length       004D (77)\n+6E81B Extra Length          0009 (9)\n+6E81D Comment Length        0000 (0)\n+6E81F Disk Start            0000 (0)\n+6E821 Int File Attributes   0000 (0)\n+      [Bit 0]               0 'Binary Data'\n+6E823 Ext File Attributes   00000000 (0)\n+6E827 Local Header Offset   00027FFE (163838)\n+6E82B Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+#\n+# WARNING: Offset 0x6E82B: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+#          Zero length filename\n+#\n+6E878 Extra ID #1           5455 (21589) 'Extended Timestamp [UT]'\n+6E87A   Length              0005 (5)\n+6E87C   Flags               01 (1) 'Modification'\n+6E87D   Modification Time   00000000 (0) 'Thu Jan  1 00:00:00 1970'\n+\n+6E881 CENTRAL HEADER #67    02014B50 (33639248)\n+6E885 Created Zip Spec      14 (20) '2.0'\n+6E886 Created OS            00 (0) 'MS-DOS'\n+6E887 Extract Zip Spec      14 (20) '2.0'\n+6E888 Extract OS            00 (0) 'MS-DOS'\n+6E889 General Purpose Flag  0008 (8)\n+      [Bit  3]              1 'Streamed'\n+6E88B Compression Method    0000 (0) 'Stored'\n+6E88D Modification Time     EC210000 (3961585664) 'Wed Jan  1 00:00:00 2098'\n+6E891 CRC                   31557B6E (827685742)\n+6E895 Compressed Size       00000571 (1393)\n+6E899 Uncompressed Size     00000571 (1393)\n+6E89D Filename Length       004F (79)\n+6E89F Extra Length          0009 (9)\n+6E8A1 Comment Length        0000 (0)\n+6E8A3 Disk Start            0000 (0)\n+6E8A5 Int File Attributes   0000 (0)\n+      [Bit 0]               0 'Binary Data'\n+6E8A7 Ext File Attributes   00000000 (0)\n+6E8AB Local Header Offset   000285EB (165355)\n+6E8AF Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+#\n+# WARNING: Offset 0x6E8AF: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+#          Zero length filename\n+#\n+6E8FE Extra ID #1           5455 (21589) 'Extended Timestamp [UT]'\n+6E900   Length              0005 (5)\n+6E902   Flags               01 (1) 'Modification'\n+6E903   Modification Time   00000000 (0) 'Thu Jan  1 00:00:00 1970'\n+\n+6E907 CENTRAL HEADER #68    02014B50 (33639248)\n+6E90B Created Zip Spec      14 (20) '2.0'\n+6E90C Created OS            00 (0) 'MS-DOS'\n+6E90D Extract Zip Spec      14 (20) '2.0'\n+6E90E Extract OS            00 (0) 'MS-DOS'\n+6E90F General Purpose Flag  0008 (8)\n+      [Bit  3]              1 'Streamed'\n+6E911 Compression Method    0000 (0) 'Stored'\n+6E913 Modification Time     EC210000 (3961585664) 'Wed Jan  1 00:00:00 2098'\n+6E917 CRC                   9E00A28D (2650841741)\n+6E91B Compressed Size       00000562 (1378)\n+6E91F Uncompressed Size     00000562 (1378)\n+6E923 Filename Length       004A (74)\n+6E925 Extra Length          0009 (9)\n+6E927 Comment Length        0000 (0)\n+6E929 Disk Start            0000 (0)\n+6E92B Int File Attributes   0000 (0)\n+      [Bit 0]               0 'Binary Data'\n+6E92D Ext File Attributes   00000000 (0)\n+6E931 Local Header Offset   00028BE2 (166882)\n+6E935 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+#\n+# WARNING: Offset 0x6E935: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+#          Zero length filename\n+#\n+6E97F Extra ID #1           5455 (21589) 'Extended Timestamp [UT]'\n+6E981   Length              0005 (5)\n+6E983   Flags               01 (1) 'Modification'\n+6E984   Modification Time   00000000 (0) 'Thu Jan  1 00:00:00 1970'\n+\n+6E988 CENTRAL HEADER #69    02014B50 (33639248)\n+6E98C Created Zip Spec      14 (20) '2.0'\n+6E98D Created OS            00 (0) 'MS-DOS'\n+6E98E Extract Zip Spec      14 (20) '2.0'\n+6E98F Extract OS            00 (0) 'MS-DOS'\n+6E990 General Purpose Flag  0008 (8)\n+      [Bit  3]              1 'Streamed'\n+6E992 Compression Method    0000 (0) 'Stored'\n+6E994 Modification Time     EC210000 (3961585664) 'Wed Jan  1 00:00:00 2098'\n+6E998 CRC                   B8F3B221 (3102978593)\n+6E99C Compressed Size       00000588 (1416)\n+6E9A0 Uncompressed Size     00000588 (1416)\n+6E9A4 Filename Length       004C (76)\n+6E9A6 Extra Length          0009 (9)\n+6E9A8 Comment Length        0000 (0)\n+6E9AA Disk Start            0000 (0)\n+6E9AC Int File Attributes   0000 (0)\n+      [Bit 0]               0 'Binary Data'\n+6E9AE Ext File Attributes   00000000 (0)\n+6E9B2 Local Header Offset   000291C5 (168389)\n+6E9B6 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+#\n+# WARNING: Offset 0x6E9B6: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+#          Zero length filename\n+#\n+6EA02 Extra ID #1           5455 (21589) 'Extended Timestamp [UT]'\n+6EA04   Length              0005 (5)\n+6EA06   Flags               01 (1) 'Modification'\n+6EA07   Modification Time   00000000 (0) 'Thu Jan  1 00:00:00 1970'\n+\n+6EA0B CENTRAL HEADER #70    02014B50 (33639248)\n+6EA0F Created Zip Spec      14 (20) '2.0'\n+6EA10 Created OS            00 (0) 'MS-DOS'\n+6EA11 Extract Zip Spec      14 (20) '2.0'\n+6EA12 Extract OS            00 (0) 'MS-DOS'\n+6EA13 General Purpose Flag  0008 (8)\n+      [Bit  3]              1 'Streamed'\n+6EA15 Compression Method    0000 (0) 'Stored'\n+6EA17 Modification Time     EC210000 (3961585664) 'Wed Jan  1 00:00:00 2098'\n+6EA1B CRC                   A03840DB (2688041179)\n+6EA1F Compressed Size       000008E6 (2278)\n+6EA23 Uncompressed Size     000008E6 (2278)\n+6EA27 Filename Length       0048 (72)\n+6EA29 Extra Length          0009 (9)\n+6EA2B Comment Length        0000 (0)\n+6EA2D Disk Start            0000 (0)\n+6EA2F Int File Attributes   0000 (0)\n+      [Bit 0]               0 'Binary Data'\n+6EA31 Ext File Attributes   00000000 (0)\n+6EA35 Local Header Offset   000297D0 (169936)\n+6EA39 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+#\n+# WARNING: Offset 0x6EA39: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+#          Zero length filename\n+#\n+6EA81 Extra ID #1           5455 (21589) 'Extended Timestamp [UT]'\n+6EA83   Length              0005 (5)\n+6EA85   Flags               01 (1) 'Modification'\n+6EA86   Modification Time   00000000 (0) 'Thu Jan  1 00:00:00 1970'\n+\n+6EA8A CENTRAL HEADER #71    02014B50 (33639248)\n+6EA8E Created Zip Spec      14 (20) '2.0'\n+6EA8F Created OS            00 (0) 'MS-DOS'\n+6EA90 Extract Zip Spec      14 (20) '2.0'\n+6EA91 Extract OS            00 (0) 'MS-DOS'\n+6EA92 General Purpose Flag  0000 (0)\n+6EA94 Compression Method    0000 (0) 'Stored'\n+6EA96 Modification Time     EC210000 (3961585664) 'Wed Jan  1 00:00:00 2098'\n+6EA9A CRC                   00000000 (0)\n+6EA9E Compressed Size       00000000 (0)\n+6EAA2 Uncompressed Size     00000000 (0)\n+6EAA6 Filename Length       0030 (48)\n+6EAA8 Extra Length          0009 (9)\n+6EAAA Comment Length        0000 (0)\n+6EAAC Disk Start            0000 (0)\n+6EAAE Int File Attributes   0000 (0)\n+      [Bit 0]               0 'Binary Data'\n+6EAB0 Ext File Attributes   00000000 (0)\n+6EAB4 Local Header Offset   0002A135 (172341)\n+6EAB8 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+#\n+# WARNING: Offset 0x6EAB8: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+#          Zero length filename\n+#\n+6EAE8 Extra ID #1           5455 (21589) 'Extended Timestamp [UT]'\n+6EAEA   Length              0005 (5)\n+6EAEC   Flags               01 (1) 'Modification'\n+6EAED   Modification Time   00000000 (0) 'Thu Jan  1 00:00:00 1970'\n+\n+6EAF1 CENTRAL HEADER #72    02014B50 (33639248)\n+6EAF5 Created Zip Spec      14 (20) '2.0'\n+6EAF6 Created OS            00 (0) 'MS-DOS'\n+6EAF7 Extract Zip Spec      14 (20) '2.0'\n+6EAF8 Extract OS            00 (0) 'MS-DOS'\n+6EAF9 General Purpose Flag  0008 (8)\n+      [Bit  3]              1 'Streamed'\n+6EAFB Compression Method    0000 (0) 'Stored'\n+6EAFD Modification Time     EC210000 (3961585664) 'Wed Jan  1 00:00:00 2098'\n+6EB01 CRC                   80296188 (2150195592)\n+6EB05 Compressed Size       00000E77 (3703)\n+6EB09 Uncompressed Size     00000E77 (3703)\n+6EB0D Filename Length       0049 (73)\n+6EB0F Extra Length          0009 (9)\n+6EB11 Comment Length        0000 (0)\n+6EB13 Disk Start            0000 (0)\n+6EB15 Int File Attributes   0000 (0)\n+      [Bit 0]               0 'Binary Data'\n+6EB17 Ext File Attributes   00000000 (0)\n+6EB1B Local Header Offset   0002A18C (172428)\n+6EB1F Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+#\n+# WARNING: Offset 0x6EB1F: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+#          Zero length filename\n+#\n+6EB68 Extra ID #1           5455 (21589) 'Extended Timestamp [UT]'\n+6EB6A   Length              0005 (5)\n+6EB6C   Flags               01 (1) 'Modification'\n+6EB6D   Modification Time   00000000 (0) 'Thu Jan  1 00:00:00 1970'\n+\n+6EB71 CENTRAL HEADER #73    02014B50 (33639248)\n+6EB75 Created Zip Spec      14 (20) '2.0'\n+6EB76 Created OS            00 (0) 'MS-DOS'\n+6EB77 Extract Zip Spec      14 (20) '2.0'\n+6EB78 Extract OS            00 (0) 'MS-DOS'\n+6EB79 General Purpose Flag  0008 (8)\n+      [Bit  3]              1 'Streamed'\n+6EB7B Compression Method    0000 (0) 'Stored'\n+6EB7D Modification Time     EC210000 (3961585664) 'Wed Jan  1 00:00:00 2098'\n+6EB81 CRC                   179D40B4 (396181684)\n+6EB85 Compressed Size       00002D41 (11585)\n+6EB89 Uncompressed Size     00002D41 (11585)\n+6EB8D Filename Length       0054 (84)\n+6EB8F Extra Length          0009 (9)\n+6EB91 Comment Length        0000 (0)\n+6EB93 Disk Start            0000 (0)\n+6EB95 Int File Attributes   0000 (0)\n+      [Bit 0]               0 'Binary Data'\n+6EB97 Ext File Attributes   00000000 (0)\n+6EB9B Local Header Offset   0002B083 (176259)\n+6EB9F Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+#\n+# WARNING: Offset 0x6EB9F: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+#          Zero length filename\n+#\n+6EBF3 Extra ID #1           5455 (21589) 'Extended Timestamp [UT]'\n+6EBF5   Length              0005 (5)\n+6EBF7   Flags               01 (1) 'Modification'\n+6EBF8   Modification Time   00000000 (0) 'Thu Jan  1 00:00:00 1970'\n+\n+6EBFC CENTRAL HEADER #74    02014B50 (33639248)\n+6EC00 Created Zip Spec      14 (20) '2.0'\n+6EC01 Created OS            00 (0) 'MS-DOS'\n+6EC02 Extract Zip Spec      14 (20) '2.0'\n+6EC03 Extract OS            00 (0) 'MS-DOS'\n+6EC04 General Purpose Flag  0000 (0)\n+6EC06 Compression Method    0000 (0) 'Stored'\n+6EC08 Modification Time     EC210000 (3961585664) 'Wed Jan  1 00:00:00 2098'\n+6EC0C CRC                   00000000 (0)\n+6EC10 Compressed Size       00000000 (0)\n+6EC14 Uncompressed Size     00000000 (0)\n+6EC18 Filename Length       002A (42)\n+6EC1A Extra Length          0009 (9)\n+6EC1C Comment Length        0000 (0)\n+6EC1E Disk Start            0000 (0)\n+6EC20 Int File Attributes   0000 (0)\n+      [Bit 0]               0 'Binary Data'\n+6EC22 Ext File Attributes   00000000 (0)\n+6EC26 Local Header Offset   0002DE4F (187983)\n+6EC2A Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+#\n+# WARNING: Offset 0x6EC2A: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+#          Zero length filename\n+#\n+6EC54 Extra ID #1           5455 (21589) 'Extended Timestamp [UT]'\n+6EC56   Length              0005 (5)\n+6EC58   Flags               01 (1) 'Modification'\n+6EC59   Modification Time   00000000 (0) 'Thu Jan  1 00:00:00 1970'\n+\n+6EC5D CENTRAL HEADER #75    02014B50 (33639248)\n+6EC61 Created Zip Spec      14 (20) '2.0'\n+6EC62 Created OS            00 (0) 'MS-DOS'\n+6EC63 Extract Zip Spec      14 (20) '2.0'\n+6EC64 Extract OS            00 (0) 'MS-DOS'\n+6EC65 General Purpose Flag  0008 (8)\n+      [Bit  3]              1 'Streamed'\n+6EC67 Compression Method    0000 (0) 'Stored'\n+6EC69 Modification Time     EC210000 (3961585664) 'Wed Jan  1 00:00:00 2098'\n+6EC6D CRC                   D8B03CE3 (3635428579)\n+6EC71 Compressed Size       00000ECC (3788)\n+6EC75 Uncompressed Size     00000ECC (3788)\n+6EC79 Filename Length       0049 (73)\n+6EC7B Extra Length          0009 (9)\n+6EC7D Comment Length        0000 (0)\n+6EC7F Disk Start            0000 (0)\n+6EC81 Int File Attributes   0000 (0)\n+      [Bit 0]               0 'Binary Data'\n+6EC83 Ext File Attributes   00000000 (0)\n+6EC87 Local Header Offset   0002DEA0 (188064)\n+6EC8B Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+#\n+# WARNING: Offset 0x6EC8B: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+#          Zero length filename\n+#\n+6ECD4 Extra ID #1           5455 (21589) 'Extended Timestamp [UT]'\n+6ECD6   Length              0005 (5)\n+6ECD8   Flags               01 (1) 'Modification'\n+6ECD9   Modification Time   00000000 (0) 'Thu Jan  1 00:00:00 1970'\n+\n+6ECDD CENTRAL HEADER #76    02014B50 (33639248)\n+6ECE1 Created Zip Spec      14 (20) '2.0'\n+6ECE2 Created OS            00 (0) 'MS-DOS'\n+6ECE3 Extract Zip Spec      14 (20) '2.0'\n+6ECE4 Extract OS            00 (0) 'MS-DOS'\n+6ECE5 General Purpose Flag  0008 (8)\n+      [Bit  3]              1 'Streamed'\n+6ECE7 Compression Method    0000 (0) 'Stored'\n+6ECE9 Modification Time     EC210000 (3961585664) 'Wed Jan  1 00:00:00 2098'\n+6ECED CRC                   EEBAB417 (4005213207)\n+6ECF1 Compressed Size       000005FF (1535)\n+6ECF5 Uncompressed Size     000005FF (1535)\n+6ECF9 Filename Length       0048 (72)\n+6ECFB Extra Length          0009 (9)\n+6ECFD Comment Length        0000 (0)\n+6ECFF Disk Start            0000 (0)\n+6ED01 Int File Attributes   0000 (0)\n+      [Bit 0]               0 'Binary Data'\n+6ED03 Ext File Attributes   00000000 (0)\n+6ED07 Local Header Offset   0002EDEC (191980)\n+6ED0B Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+#\n+# WARNING: Offset 0x6ED0B: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+#          Zero length filename\n+#\n+6ED53 Extra ID #1           5455 (21589) 'Extended Timestamp [UT]'\n+6ED55   Length              0005 (5)\n+6ED57   Flags               01 (1) 'Modification'\n+6ED58   Modification Time   00000000 (0) 'Thu Jan  1 00:00:00 1970'\n+\n+6ED5C CENTRAL HEADER #77    02014B50 (33639248)\n+6ED60 Created Zip Spec      14 (20) '2.0'\n+6ED61 Created OS            00 (0) 'MS-DOS'\n+6ED62 Extract Zip Spec      14 (20) '2.0'\n+6ED63 Extract OS            00 (0) 'MS-DOS'\n+6ED64 General Purpose Flag  0008 (8)\n+      [Bit  3]              1 'Streamed'\n+6ED66 Compression Method    0000 (0) 'Stored'\n+6ED68 Modification Time     EC210000 (3961585664) 'Wed Jan  1 00:00:00 2098'\n+6ED6C CRC                   75D2ADE7 (1976741351)\n+6ED70 Compressed Size       00000B2B (2859)\n+6ED74 Uncompressed Size     00000B2B (2859)\n+6ED78 Filename Length       0059 (89)\n+6ED7A Extra Length          0009 (9)\n+6ED7C Comment Length        0000 (0)\n+6ED7E Disk Start            0000 (0)\n+6ED80 Int File Attributes   0000 (0)\n+      [Bit 0]               0 'Binary Data'\n+6ED82 Ext File Attributes   00000000 (0)\n+6ED86 Local Header Offset   0002F46A (193642)\n+6ED8A Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+#\n+# WARNING: Offset 0x6ED8A: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+#          Zero length filename\n+#\n+6EDE3 Extra ID #1           5455 (21589) 'Extended Timestamp [UT]'\n+6EDE5   Length              0005 (5)\n+6EDE7   Flags               01 (1) 'Modification'\n+6EDE8   Modification Time   00000000 (0) 'Thu Jan  1 00:00:00 1970'\n+\n+6EDEC CENTRAL HEADER #78    02014B50 (33639248)\n+6EDF0 Created Zip Spec      14 (20) '2.0'\n+6EDF1 Created OS            00 (0) 'MS-DOS'\n+6EDF2 Extract Zip Spec      14 (20) '2.0'\n+6EDF3 Extract OS            00 (0) 'MS-DOS'\n+6EDF4 General Purpose Flag  0008 (8)\n+      [Bit  3]              1 'Streamed'\n+6EDF6 Compression Method    0000 (0) 'Stored'\n+6EDF8 Modification Time     EC210000 (3961585664) 'Wed Jan  1 00:00:00 2098'\n+6EDFC CRC                   755A196E (1968839022)\n+6EE00 Compressed Size       00001309 (4873)\n+6EE04 Uncompressed Size     00001309 (4873)\n+6EE08 Filename Length       003C (60)\n+6EE0A Extra Length          0009 (9)\n+6EE0C Comment Length        0000 (0)\n+6EE0E Disk Start            0000 (0)\n+6EE10 Int File Attributes   0000 (0)\n+      [Bit 0]               0 'Binary Data'\n+6EE12 Ext File Attributes   00000000 (0)\n+6EE16 Local Header Offset   00030025 (196645)\n+6EE1A Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+#\n+# WARNING: Offset 0x6EE1A: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+#          Zero length filename\n+#\n+6EE56 Extra ID #1           5455 (21589) 'Extended Timestamp [UT]'\n+6EE58   Length              0005 (5)\n+6EE5A   Flags               01 (1) 'Modification'\n+6EE5B   Modification Time   00000000 (0) 'Thu Jan  1 00:00:00 1970'\n+\n+6EE5F CENTRAL HEADER #79    02014B50 (33639248)\n+6EE63 Created Zip Spec      14 (20) '2.0'\n+6EE64 Created OS            00 (0) 'MS-DOS'\n+6EE65 Extract Zip Spec      14 (20) '2.0'\n+6EE66 Extract OS            00 (0) 'MS-DOS'\n+6EE67 General Purpose Flag  0008 (8)\n+      [Bit  3]              1 'Streamed'\n+6EE69 Compression Method    0000 (0) 'Stored'\n+6EE6B Modification Time     EC210000 (3961585664) 'Wed Jan  1 00:00:00 2098'\n+6EE6F CRC                   59E1F72D (1507981101)\n+6EE73 Compressed Size       0000092F (2351)\n+6EE77 Uncompressed Size     0000092F (2351)\n+6EE7B Filename Length       004E (78)\n+6EE7D Extra Length          0009 (9)\n+6EE7F Comment Length        0000 (0)\n+6EE81 Disk Start            0000 (0)\n+6EE83 Int File Attributes   0000 (0)\n+      [Bit 0]               0 'Binary Data'\n+6EE85 Ext File Attributes   00000000 (0)\n+6EE89 Local Header Offset   000313A1 (201633)\n+6EE8D Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+#\n+# WARNING: Offset 0x6EE8D: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+#          Zero length filename\n+#\n+6EEDB Extra ID #1           5455 (21589) 'Extended Timestamp [UT]'\n+6EEDD   Length              0005 (5)\n+6EEDF   Flags               01 (1) 'Modification'\n+6EEE0   Modification Time   00000000 (0) 'Thu Jan  1 00:00:00 1970'\n+\n+6EEE4 CENTRAL HEADER #80    02014B50 (33639248)\n+6EEE8 Created Zip Spec      14 (20) '2.0'\n+6EEE9 Created OS            00 (0) 'MS-DOS'\n+6EEEA Extract Zip Spec      14 (20) '2.0'\n+6EEEB Extract OS            00 (0) 'MS-DOS'\n+6EEEC General Purpose Flag  0008 (8)\n+      [Bit  3]              1 'Streamed'\n+6EEEE Compression Method    0000 (0) 'Stored'\n+6EEF0 Modification Time     EC210000 (3961585664) 'Wed Jan  1 00:00:00 2098'\n+6EEF4 CRC                   FB40FD46 (4215340358)\n+6EEF8 Compressed Size       00000B06 (2822)\n+6EEFC Uncompressed Size     00000B06 (2822)\n+6EF00 Filename Length       0054 (84)\n+6EF02 Extra Length          0009 (9)\n+6EF04 Comment Length        0000 (0)\n+6EF06 Disk Start            0000 (0)\n+6EF08 Int File Attributes   0000 (0)\n+      [Bit 0]               0 'Binary Data'\n+6EF0A Ext File Attributes   00000000 (0)\n+6EF0E Local Header Offset   00031D55 (204117)\n+6EF12 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+#\n+# WARNING: Offset 0x6EF12: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+#          Zero length filename\n+#\n+6EF66 Extra ID #1           5455 (21589) 'Extended Timestamp [UT]'\n+6EF68   Length              0005 (5)\n+6EF6A   Flags               01 (1) 'Modification'\n+6EF6B   Modification Time   00000000 (0) 'Thu Jan  1 00:00:00 1970'\n+\n+6EF6F CENTRAL HEADER #81    02014B50 (33639248)\n+6EF73 Created Zip Spec      14 (20) '2.0'\n+6EF74 Created OS            00 (0) 'MS-DOS'\n+6EF75 Extract Zip Spec      14 (20) '2.0'\n+6EF76 Extract OS            00 (0) 'MS-DOS'\n+6EF77 General Purpose Flag  0008 (8)\n+      [Bit  3]              1 'Streamed'\n+6EF79 Compression Method    0000 (0) 'Stored'\n+6EF7B Modification Time     EC210000 (3961585664) 'Wed Jan  1 00:00:00 2098'\n+6EF7F CRC                   53F9F17D (1408889213)\n+6EF83 Compressed Size       0000100D (4109)\n+6EF87 Uncompressed Size     0000100D (4109)\n+6EF8B Filename Length       0050 (80)\n+6EF8D Extra Length          0009 (9)\n+6EF8F Comment Length        0000 (0)\n+6EF91 Disk Start            0000 (0)\n+6EF93 Int File Attributes   0000 (0)\n+      [Bit 0]               0 'Binary Data'\n+6EF95 Ext File Attributes   00000000 (0)\n+6EF99 Local Header Offset   000328E6 (207078)\n+6EF9D Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+#\n+# WARNING: Offset 0x6EF9D: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+#          Zero length filename\n+#\n+6EFED Extra ID #1           5455 (21589) 'Extended Timestamp [UT]'\n+6EFEF   Length              0005 (5)\n+6EFF1   Flags               01 (1) 'Modification'\n+6EFF2   Modification Time   00000000 (0) 'Thu Jan  1 00:00:00 1970'\n+\n+6EFF6 CENTRAL HEADER #82    02014B50 (33639248)\n+6EFFA Created Zip Spec      14 (20) '2.0'\n+6EFFB Created OS            00 (0) 'MS-DOS'\n+6EFFC Extract Zip Spec      14 (20) '2.0'\n+6EFFD Extract OS            00 (0) 'MS-DOS'\n+6EFFE General Purpose Flag  0008 (8)\n+      [Bit  3]              1 'Streamed'\n+6F000 Compression Method    0000 (0) 'Stored'\n+6F002 Modification Time     EC210000 (3961585664) 'Wed Jan  1 00:00:00 2098'\n+6F006 CRC                   D85C97E6 (3629946854)\n+6F00A Compressed Size       000035CB (13771)\n+6F00E Uncompressed Size     000035CB (13771)\n+6F012 Filename Length       004B (75)\n+6F014 Extra Length          0009 (9)\n+6F016 Comment Length        0000 (0)\n+6F018 Disk Start            0000 (0)\n+6F01A Int File Attributes   0000 (0)\n+      [Bit 0]               0 'Binary Data'\n+6F01C Ext File Attributes   00000000 (0)\n+6F020 Local Header Offset   0003397A (211322)\n+6F024 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+#\n+# WARNING: Offset 0x6F024: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+#          Zero length filename\n+#\n+6F06F Extra ID #1           5455 (21589) 'Extended Timestamp [UT]'\n+6F071   Length              0005 (5)\n+6F073   Flags               01 (1) 'Modification'\n+6F074   Modification Time   00000000 (0) 'Thu Jan  1 00:00:00 1970'\n+\n+6F078 CENTRAL HEADER #83    02014B50 (33639248)\n+6F07C Created Zip Spec      14 (20) '2.0'\n+6F07D Created OS            00 (0) 'MS-DOS'\n+6F07E Extract Zip Spec      14 (20) '2.0'\n+6F07F Extract OS            00 (0) 'MS-DOS'\n+6F080 General Purpose Flag  0008 (8)\n+      [Bit  3]              1 'Streamed'\n+6F082 Compression Method    0000 (0) 'Stored'\n+6F084 Modification Time     EC210000 (3961585664) 'Wed Jan  1 00:00:00 2098'\n+6F088 CRC                   790FD089 (2031079561)\n+6F08C Compressed Size       000008A2 (2210)\n+6F090 Uncompressed Size     000008A2 (2210)\n+6F094 Filename Length       0053 (83)\n+6F096 Extra Length          0009 (9)\n+6F098 Comment Length        0000 (0)\n+6F09A Disk Start            0000 (0)\n+6F09C Int File Attributes   0000 (0)\n+      [Bit 0]               0 'Binary Data'\n+6F09E Ext File Attributes   00000000 (0)\n+6F0A2 Local Header Offset   00036FC7 (225223)\n+6F0A6 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+#\n+# WARNING: Offset 0x6F0A6: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+#          Zero length filename\n+#\n+6F0F9 Extra ID #1           5455 (21589) 'Extended Timestamp [UT]'\n+6F0FB   Length              0005 (5)\n+6F0FD   Flags               01 (1) 'Modification'\n+6F0FE   Modification Time   00000000 (0) 'Thu Jan  1 00:00:00 1970'\n+\n+6F102 CENTRAL HEADER #84    02014B50 (33639248)\n+6F106 Created Zip Spec      14 (20) '2.0'\n+6F107 Created OS            00 (0) 'MS-DOS'\n+6F108 Extract Zip Spec      14 (20) '2.0'\n+6F109 Extract OS            00 (0) 'MS-DOS'\n+6F10A General Purpose Flag  0008 (8)\n+      [Bit  3]              1 'Streamed'\n+6F10C Compression Method    0000 (0) 'Stored'\n+6F10E Modification Time     EC210000 (3961585664) 'Wed Jan  1 00:00:00 2098'\n+6F112 CRC                   85FEC00A (2248065034)\n+6F116 Compressed Size       00000ED7 (3799)\n+6F11A Uncompressed Size     00000ED7 (3799)\n+6F11E Filename Length       0050 (80)\n+6F120 Extra Length          0009 (9)\n+6F122 Comment Length        0000 (0)\n+6F124 Disk Start            0000 (0)\n+6F126 Int File Attributes   0000 (0)\n+      [Bit 0]               0 'Binary Data'\n+6F128 Ext File Attributes   00000000 (0)\n+6F12C Local Header Offset   000378F3 (227571)\n+6F130 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+#\n+# WARNING: Offset 0x6F130: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+#          Zero length filename\n+#\n+6F180 Extra ID #1           5455 (21589) 'Extended Timestamp [UT]'\n+6F182   Length              0005 (5)\n+6F184   Flags               01 (1) 'Modification'\n+6F185   Modification Time   00000000 (0) 'Thu Jan  1 00:00:00 1970'\n+\n+6F189 CENTRAL HEADER #85    02014B50 (33639248)\n+6F18D Created Zip Spec      14 (20) '2.0'\n+6F18E Created OS            00 (0) 'MS-DOS'\n+6F18F Extract Zip Spec      14 (20) '2.0'\n+6F190 Extract OS            00 (0) 'MS-DOS'\n+6F191 General Purpose Flag  0008 (8)\n+      [Bit  3]              1 'Streamed'\n+6F193 Compression Method    0000 (0) 'Stored'\n+6F195 Modification Time     EC210000 (3961585664) 'Wed Jan  1 00:00:00 2098'\n+6F199 CRC                   ACB394E1 (2897450209)\n+6F19D Compressed Size       0000087F (2175)\n+6F1A1 Uncompressed Size     0000087F (2175)\n+6F1A5 Filename Length       0048 (72)\n+6F1A7 Extra Length          0009 (9)\n+6F1A9 Comment Length        0000 (0)\n+6F1AB Disk Start            0000 (0)\n+6F1AD Int File Attributes   0000 (0)\n+      [Bit 0]               0 'Binary Data'\n+6F1AF Ext File Attributes   00000000 (0)\n+6F1B3 Local Header Offset   00038851 (231505)\n+6F1B7 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+#\n+# WARNING: Offset 0x6F1B7: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+#          Zero length filename\n+#\n+6F1FF Extra ID #1           5455 (21589) 'Extended Timestamp [UT]'\n+6F201   Length              0005 (5)\n+6F203   Flags               01 (1) 'Modification'\n+6F204   Modification Time   00000000 (0) 'Thu Jan  1 00:00:00 1970'\n+\n+6F208 CENTRAL HEADER #86    02014B50 (33639248)\n+6F20C Created Zip Spec      14 (20) '2.0'\n+6F20D Created OS            00 (0) 'MS-DOS'\n+6F20E Extract Zip Spec      14 (20) '2.0'\n+6F20F Extract OS            00 (0) 'MS-DOS'\n+6F210 General Purpose Flag  0000 (0)\n+6F212 Compression Method    0000 (0) 'Stored'\n+6F214 Modification Time     EC210000 (3961585664) 'Wed Jan  1 00:00:00 2098'\n+6F218 CRC                   00000000 (0)\n+6F21C Compressed Size       00000000 (0)\n+6F220 Uncompressed Size     00000000 (0)\n+6F224 Filename Length       0030 (48)\n+6F226 Extra Length          0009 (9)\n+6F228 Comment Length        0000 (0)\n+6F22A Disk Start            0000 (0)\n+6F22C Int File Attributes   0000 (0)\n+      [Bit 0]               0 'Binary Data'\n+6F22E Ext File Attributes   00000000 (0)\n+6F232 Local Header Offset   0003914F (233807)\n+6F236 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+#\n+# WARNING: Offset 0x6F236: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+#          Zero length filename\n+#\n+6F266 Extra ID #1           5455 (21589) 'Extended Timestamp [UT]'\n+6F268   Length              0005 (5)\n+6F26A   Flags               01 (1) 'Modification'\n+6F26B   Modification Time   00000000 (0) 'Thu Jan  1 00:00:00 1970'\n+\n+6F26F CENTRAL HEADER #87    02014B50 (33639248)\n+6F273 Created Zip Spec      14 (20) '2.0'\n+6F274 Created OS            00 (0) 'MS-DOS'\n+6F275 Extract Zip Spec      14 (20) '2.0'\n+6F276 Extract OS            00 (0) 'MS-DOS'\n+6F277 General Purpose Flag  0008 (8)\n+      [Bit  3]              1 'Streamed'\n+6F279 Compression Method    0000 (0) 'Stored'\n+6F27B Modification Time     EC210000 (3961585664) 'Wed Jan  1 00:00:00 2098'\n+6F27F CRC                   AF38F813 (2939746323)\n+6F283 Compressed Size       00002F8F (12175)\n+6F287 Uncompressed Size     00002F8F (12175)\n+6F28B Filename Length       0054 (84)\n+6F28D Extra Length          0009 (9)\n+6F28F Comment Length        0000 (0)\n+6F291 Disk Start            0000 (0)\n+6F293 Int File Attributes   0000 (0)\n+      [Bit 0]               0 'Binary Data'\n+6F295 Ext File Attributes   00000000 (0)\n+6F299 Local Header Offset   000391A6 (233894)\n+6F29D Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+#\n+# WARNING: Offset 0x6F29D: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+#          Zero length filename\n+#\n+6F2F1 Extra ID #1           5455 (21589) 'Extended Timestamp [UT]'\n+6F2F3   Length              0005 (5)\n+6F2F5   Flags               01 (1) 'Modification'\n+6F2F6   Modification Time   00000000 (0) 'Thu Jan  1 00:00:00 1970'\n+\n+6F2FA CENTRAL HEADER #88    02014B50 (33639248)\n+6F2FE Created Zip Spec      14 (20) '2.0'\n+6F2FF Created OS            00 (0) 'MS-DOS'\n+6F300 Extract Zip Spec      14 (20) '2.0'\n+6F301 Extract OS            00 (0) 'MS-DOS'\n+6F302 General Purpose Flag  0008 (8)\n+      [Bit  3]              1 'Streamed'\n+6F304 Compression Method    0000 (0) 'Stored'\n+6F306 Modification Time     EC210000 (3961585664) 'Wed Jan  1 00:00:00 2098'\n+6F30A CRC                   6659263F (1717118527)\n+6F30E Compressed Size       00001E19 (7705)\n+6F312 Uncompressed Size     00001E19 (7705)\n+6F316 Filename Length       004E (78)\n+6F318 Extra Length          0009 (9)\n+6F31A Comment Length        0000 (0)\n+6F31C Disk Start            0000 (0)\n+6F31E Int File Attributes   0000 (0)\n+      [Bit 0]               0 'Binary Data'\n+6F320 Ext File Attributes   00000000 (0)\n+6F324 Local Header Offset   0003C1C0 (246208)\n+6F328 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+#\n+# WARNING: Offset 0x6F328: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+#          Zero length filename\n+#\n+6F376 Extra ID #1           5455 (21589) 'Extended Timestamp [UT]'\n+6F378   Length              0005 (5)\n+6F37A   Flags               01 (1) 'Modification'\n+6F37B   Modification Time   00000000 (0) 'Thu Jan  1 00:00:00 1970'\n+\n+6F37F CENTRAL HEADER #89    02014B50 (33639248)\n+6F383 Created Zip Spec      14 (20) '2.0'\n+6F384 Created OS            00 (0) 'MS-DOS'\n+6F385 Extract Zip Spec      14 (20) '2.0'\n+6F386 Extract OS            00 (0) 'MS-DOS'\n+6F387 General Purpose Flag  0000 (0)\n+6F389 Compression Method    0000 (0) 'Stored'\n+6F38B Modification Time     EC210000 (3961585664) 'Wed Jan  1 00:00:00 2098'\n+6F38F CRC                   00000000 (0)\n+6F393 Compressed Size       00000000 (0)\n+6F397 Uncompressed Size     00000000 (0)\n+6F39B Filename Length       002B (43)\n+6F39D Extra Length          0009 (9)\n+6F39F Comment Length        0000 (0)\n+6F3A1 Disk Start            0000 (0)\n+6F3A3 Int File Attributes   0000 (0)\n+      [Bit 0]               0 'Binary Data'\n+6F3A5 Ext File Attributes   00000000 (0)\n+6F3A9 Local Header Offset   0003E05E (254046)\n+6F3AD Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+#\n+# WARNING: Offset 0x6F3AD: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+#          Zero length filename\n+#\n+6F3D8 Extra ID #1           5455 (21589) 'Extended Timestamp [UT]'\n+6F3DA   Length              0005 (5)\n+6F3DC   Flags               01 (1) 'Modification'\n+6F3DD   Modification Time   00000000 (0) 'Thu Jan  1 00:00:00 1970'\n+\n+6F3E1 CENTRAL HEADER #90    02014B50 (33639248)\n+6F3E5 Created Zip Spec      14 (20) '2.0'\n+6F3E6 Created OS            00 (0) 'MS-DOS'\n+6F3E7 Extract Zip Spec      14 (20) '2.0'\n+6F3E8 Extract OS            00 (0) 'MS-DOS'\n+6F3E9 General Purpose Flag  0008 (8)\n+      [Bit  3]              1 'Streamed'\n+6F3EB Compression Method    0000 (0) 'Stored'\n+6F3ED Modification Time     EC210000 (3961585664) 'Wed Jan  1 00:00:00 2098'\n+6F3F1 CRC                   1E182794 (504899476)\n+6F3F5 Compressed Size       00000CDF (3295)\n+6F3F9 Uncompressed Size     00000CDF (3295)\n+6F3FD Filename Length       0051 (81)\n+6F3FF Extra Length          0009 (9)\n+6F401 Comment Length        0000 (0)\n+6F403 Disk Start            0000 (0)\n+6F405 Int File Attributes   0000 (0)\n+      [Bit 0]               0 'Binary Data'\n+6F407 Ext File Attributes   00000000 (0)\n+6F40B Local Header Offset   0003E0B0 (254128)\n+6F40F Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+#\n+# WARNING: Offset 0x6F40F: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+#          Zero length filename\n+#\n+6F460 Extra ID #1           5455 (21589) 'Extended Timestamp [UT]'\n+6F462   Length              0005 (5)\n+6F464   Flags               01 (1) 'Modification'\n+6F465   Modification Time   00000000 (0) 'Thu Jan  1 00:00:00 1970'\n+\n+6F469 CENTRAL HEADER #91    02014B50 (33639248)\n+6F46D Created Zip Spec      14 (20) '2.0'\n+6F46E Created OS            00 (0) 'MS-DOS'\n+6F46F Extract Zip Spec      14 (20) '2.0'\n+6F470 Extract OS            00 (0) 'MS-DOS'\n+6F471 General Purpose Flag  0008 (8)\n+      [Bit  3]              1 'Streamed'\n+6F473 Compression Method    0000 (0) 'Stored'\n+6F475 Modification Time     EC210000 (3961585664) 'Wed Jan  1 00:00:00 2098'\n+6F479 CRC                   6D847AE7 (1837398759)\n+6F47D Compressed Size       000003AC (940)\n+6F481 Uncompressed Size     000003AC (940)\n+6F485 Filename Length       0047 (71)\n+6F487 Extra Length          0009 (9)\n+6F489 Comment Length        0000 (0)\n+6F48B Disk Start            0000 (0)\n+6F48D Int File Attributes   0000 (0)\n+      [Bit 0]               0 'Binary Data'\n+6F48F Ext File Attributes   00000000 (0)\n+6F493 Local Header Offset   0003EE17 (257559)\n+6F497 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+#\n+# WARNING: Offset 0x6F497: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+#          Zero length filename\n+#\n+6F4DE Extra ID #1           5455 (21589) 'Extended Timestamp [UT]'\n+6F4E0   Length              0005 (5)\n+6F4E2   Flags               01 (1) 'Modification'\n+6F4E3   Modification Time   00000000 (0) 'Thu Jan  1 00:00:00 1970'\n+\n+6F4E7 CENTRAL HEADER #92    02014B50 (33639248)\n+6F4EB Created Zip Spec      14 (20) '2.0'\n+6F4EC Created OS            00 (0) 'MS-DOS'\n+6F4ED Extract Zip Spec      14 (20) '2.0'\n+6F4EE Extract OS            00 (0) 'MS-DOS'\n+6F4EF General Purpose Flag  0008 (8)\n+      [Bit  3]              1 'Streamed'\n+6F4F1 Compression Method    0000 (0) 'Stored'\n+6F4F3 Modification Time     EC210000 (3961585664) 'Wed Jan  1 00:00:00 2098'\n+6F4F7 CRC                   21E16F63 (568422243)\n+6F4FB Compressed Size       0000046D (1133)\n+6F4FF Uncompressed Size     0000046D (1133)\n+6F503 Filename Length       004A (74)\n+6F505 Extra Length          0009 (9)\n+6F507 Comment Length        0000 (0)\n+6F509 Disk Start            0000 (0)\n+6F50B Int File Attributes   0000 (0)\n+      [Bit 0]               0 'Binary Data'\n+6F50D Ext File Attributes   00000000 (0)\n+6F511 Local Header Offset   0003F241 (258625)\n+6F515 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+#\n+# WARNING: Offset 0x6F515: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+#          Zero length filename\n+#\n+6F55F Extra ID #1           5455 (21589) 'Extended Timestamp [UT]'\n+6F561   Length              0005 (5)\n+6F563   Flags               01 (1) 'Modification'\n+6F564   Modification Time   00000000 (0) 'Thu Jan  1 00:00:00 1970'\n+\n+6F568 CENTRAL HEADER #93    02014B50 (33639248)\n+6F56C Created Zip Spec      14 (20) '2.0'\n+6F56D Created OS            00 (0) 'MS-DOS'\n+6F56E Extract Zip Spec      14 (20) '2.0'\n+6F56F Extract OS            00 (0) 'MS-DOS'\n+6F570 General Purpose Flag  0008 (8)\n+      [Bit  3]              1 'Streamed'\n+6F572 Compression Method    0000 (0) 'Stored'\n+6F574 Modification Time     EC210000 (3961585664) 'Wed Jan  1 00:00:00 2098'\n+6F578 CRC                   0709B18C (118075788)\n+6F57C Compressed Size       00003B49 (15177)\n+6F580 Uncompressed Size     00003B49 (15177)\n+6F584 Filename Length       0040 (64)\n+6F586 Extra Length          0009 (9)\n+6F588 Comment Length        0000 (0)\n+6F58A Disk Start            0000 (0)\n+6F58C Int File Attributes   0000 (0)\n+      [Bit 0]               0 'Binary Data'\n+6F58E Ext File Attributes   00000000 (0)\n+6F592 Local Header Offset   0003F72F (259887)\n+6F596 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+#\n+# WARNING: Offset 0x6F596: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+#          Zero length filename\n+#\n+6F5D6 Extra ID #1           5455 (21589) 'Extended Timestamp [UT]'\n+6F5D8   Length              0005 (5)\n+6F5DA   Flags               01 (1) 'Modification'\n+6F5DB   Modification Time   00000000 (0) 'Thu Jan  1 00:00:00 1970'\n+\n+6F5DF CENTRAL HEADER #94    02014B50 (33639248)\n+6F5E3 Created Zip Spec      14 (20) '2.0'\n+6F5E4 Created OS            00 (0) 'MS-DOS'\n+6F5E5 Extract Zip Spec      14 (20) '2.0'\n+6F5E6 Extract OS            00 (0) 'MS-DOS'\n+6F5E7 General Purpose Flag  0008 (8)\n+      [Bit  3]              1 'Streamed'\n+6F5E9 Compression Method    0000 (0) 'Stored'\n+6F5EB Modification Time     EC210000 (3961585664) 'Wed Jan  1 00:00:00 2098'\n+6F5EF CRC                   E2477A52 (3796335186)\n+6F5F3 Compressed Size       00000B00 (2816)\n+6F5F7 Uncompressed Size     00000B00 (2816)\n+6F5FB Filename Length       0044 (68)\n+6F5FD Extra Length          0009 (9)\n+6F5FF Comment Length        0000 (0)\n+6F601 Disk Start            0000 (0)\n+6F603 Int File Attributes   0000 (0)\n+      [Bit 0]               0 'Binary Data'\n+6F605 Ext File Attributes   00000000 (0)\n+6F609 Local Header Offset   000432EF (275183)\n+6F60D Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+#\n+# WARNING: Offset 0x6F60D: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+#          Zero length filename\n+#\n+6F651 Extra ID #1           5455 (21589) 'Extended Timestamp [UT]'\n+6F653   Length              0005 (5)\n+6F655   Flags               01 (1) 'Modification'\n+6F656   Modification Time   00000000 (0) 'Thu Jan  1 00:00:00 1970'\n+\n+6F65A CENTRAL HEADER #95    02014B50 (33639248)\n+6F65E Created Zip Spec      14 (20) '2.0'\n+6F65F Created OS            00 (0) 'MS-DOS'\n+6F660 Extract Zip Spec      14 (20) '2.0'\n+6F661 Extract OS            00 (0) 'MS-DOS'\n+6F662 General Purpose Flag  0008 (8)\n+      [Bit  3]              1 'Streamed'\n+6F664 Compression Method    0000 (0) 'Stored'\n+6F666 Modification Time     EC210000 (3961585664) 'Wed Jan  1 00:00:00 2098'\n+6F66A CRC                   00160E4A (1445450)\n+6F66E Compressed Size       00001208 (4616)\n+6F672 Uncompressed Size     00001208 (4616)\n+6F676 Filename Length       0045 (69)\n+6F678 Extra Length          0009 (9)\n+6F67A Comment Length        0000 (0)\n+6F67C Disk Start            0000 (0)\n+6F67E Int File Attributes   0000 (0)\n+      [Bit 0]               0 'Binary Data'\n+6F680 Ext File Attributes   00000000 (0)\n+6F684 Local Header Offset   00043E6A (278122)\n+6F688 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+#\n+# WARNING: Offset 0x6F688: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+#          Zero length filename\n+#\n+6F6CD Extra ID #1           5455 (21589) 'Extended Timestamp [UT]'\n+6F6CF   Length              0005 (5)\n+6F6D1   Flags               01 (1) 'Modification'\n+6F6D2   Modification Time   00000000 (0) 'Thu Jan  1 00:00:00 1970'\n+\n+6F6D6 CENTRAL HEADER #96    02014B50 (33639248)\n+6F6DA Created Zip Spec      14 (20) '2.0'\n+6F6DB Created OS            00 (0) 'MS-DOS'\n+6F6DC Extract Zip Spec      14 (20) '2.0'\n+6F6DD Extract OS            00 (0) 'MS-DOS'\n+6F6DE General Purpose Flag  0008 (8)\n+      [Bit  3]              1 'Streamed'\n+6F6E0 Compression Method    0000 (0) 'Stored'\n+6F6E2 Modification Time     EC210000 (3961585664) 'Wed Jan  1 00:00:00 2098'\n+6F6E6 CRC                   6EF68498 (1861649560)\n+6F6EA Compressed Size       00000A70 (2672)\n+6F6EE Uncompressed Size     00000A70 (2672)\n+6F6F2 Filename Length       0050 (80)\n+6F6F4 Extra Length          0009 (9)\n+6F6F6 Comment Length        0000 (0)\n+6F6F8 Disk Start            0000 (0)\n+6F6FA Int File Attributes   0000 (0)\n+      [Bit 0]               0 'Binary Data'\n+6F6FC Ext File Attributes   00000000 (0)\n+6F700 Local Header Offset   000450EE (282862)\n+6F704 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+#\n+# WARNING: Offset 0x6F704: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+#          Zero length filename\n+#\n+6F754 Extra ID #1           5455 (21589) 'Extended Timestamp [UT]'\n+6F756   Length              0005 (5)\n+6F758   Flags               01 (1) 'Modification'\n+6F759   Modification Time   00000000 (0) 'Thu Jan  1 00:00:00 1970'\n+\n+6F75D CENTRAL HEADER #97    02014B50 (33639248)\n+6F761 Created Zip Spec      14 (20) '2.0'\n+6F762 Created OS            00 (0) 'MS-DOS'\n+6F763 Extract Zip Spec      14 (20) '2.0'\n+6F764 Extract OS            00 (0) 'MS-DOS'\n+6F765 General Purpose Flag  0008 (8)\n+      [Bit  3]              1 'Streamed'\n+6F767 Compression Method    0000 (0) 'Stored'\n+6F769 Modification Time     EC210000 (3961585664) 'Wed Jan  1 00:00:00 2098'\n+6F76D CRC                   0DCE7BD6 (231635926)\n+6F771 Compressed Size       00000419 (1049)\n+6F775 Uncompressed Size     00000419 (1049)\n+6F779 Filename Length       0032 (50)\n+6F77B Extra Length          0009 (9)\n+6F77D Comment Length        0000 (0)\n+6F77F Disk Start            0000 (0)\n+6F781 Int File Attributes   0000 (0)\n+      [Bit 0]               0 'Binary Data'\n+6F783 Ext File Attributes   00000000 (0)\n+6F787 Local Header Offset   00045BE5 (285669)\n+6F78B Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+#\n+# WARNING: Offset 0x6F78B: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+#          Zero length filename\n+#\n+6F7BD Extra ID #1           5455 (21589) 'Extended Timestamp [UT]'\n+6F7BF   Length              0005 (5)\n+6F7C1   Flags               01 (1) 'Modification'\n+6F7C2   Modification Time   00000000 (0) 'Thu Jan  1 00:00:00 1970'\n+\n+6F7C6 CENTRAL HEADER #98    02014B50 (33639248)\n+6F7CA Created Zip Spec      14 (20) '2.0'\n+6F7CB Created OS            00 (0) 'MS-DOS'\n+6F7CC Extract Zip Spec      14 (20) '2.0'\n+6F7CD Extract OS            00 (0) 'MS-DOS'\n+6F7CE General Purpose Flag  0000 (0)\n+6F7D0 Compression Method    0000 (0) 'Stored'\n+6F7D2 Modification Time     EC210000 (3961585664) 'Wed Jan  1 00:00:00 2098'\n+6F7D6 CRC                   00000000 (0)\n+6F7DA Compressed Size       00000000 (0)\n+6F7DE Uncompressed Size     00000000 (0)\n+6F7E2 Filename Length       002A (42)\n+6F7E4 Extra Length          0009 (9)\n+6F7E6 Comment Length        0000 (0)\n+6F7E8 Disk Start            0000 (0)\n+6F7EA Int File Attributes   0000 (0)\n+      [Bit 0]               0 'Binary Data'\n+6F7EC Ext File Attributes   00000000 (0)\n+6F7F0 Local Header Offset   00046067 (286823)\n+6F7F4 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+#\n+# WARNING: Offset 0x6F7F4: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+#          Zero length filename\n+#\n+6F81E Extra ID #1           5455 (21589) 'Extended Timestamp [UT]'\n+6F820   Length              0005 (5)\n+6F822   Flags               01 (1) 'Modification'\n+6F823   Modification Time   00000000 (0) 'Thu Jan  1 00:00:00 1970'\n+\n+6F827 CENTRAL HEADER #99    02014B50 (33639248)\n+6F82B Created Zip Spec      14 (20) '2.0'\n+6F82C Created OS            00 (0) 'MS-DOS'\n+6F82D Extract Zip Spec      14 (20) '2.0'\n+6F82E Extract OS            00 (0) 'MS-DOS'\n+6F82F General Purpose Flag  0008 (8)\n+      [Bit  3]              1 'Streamed'\n+6F831 Compression Method    0000 (0) 'Stored'\n+6F833 Modification Time     EC210000 (3961585664) 'Wed Jan  1 00:00:00 2098'\n+6F837 CRC                   3EC7C431 (1053279281)\n+6F83B Compressed Size       000006D8 (1752)\n+6F83F Uncompressed Size     000006D8 (1752)\n+6F843 Filename Length       004C (76)\n+6F845 Extra Length          0009 (9)\n+6F847 Comment Length        0000 (0)\n+6F849 Disk Start            0000 (0)\n+6F84B Int File Attributes   0000 (0)\n+      [Bit 0]               0 'Binary Data'\n+6F84D Ext File Attributes   00000000 (0)\n+6F851 Local Header Offset   000460B8 (286904)\n+6F855 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+#\n+# WARNING: Offset 0x6F855: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+#          Zero length filename\n+#\n+6F8A1 Extra ID #1           5455 (21589) 'Extended Timestamp [UT]'\n+6F8A3   Length              0005 (5)\n+6F8A5   Flags               01 (1) 'Modification'\n+6F8A6   Modification Time   00000000 (0) 'Thu Jan  1 00:00:00 1970'\n+\n+6F8AA CENTRAL HEADER #100   02014B50 (33639248)\n+6F8AE Created Zip Spec      14 (20) '2.0'\n+6F8AF Created OS            00 (0) 'MS-DOS'\n+6F8B0 Extract Zip Spec      14 (20) '2.0'\n+6F8B1 Extract OS            00 (0) 'MS-DOS'\n+6F8B2 General Purpose Flag  0008 (8)\n+      [Bit  3]              1 'Streamed'\n+6F8B4 Compression Method    0000 (0) 'Stored'\n+6F8B6 Modification Time     EC210000 (3961585664) 'Wed Jan  1 00:00:00 2098'\n+6F8BA CRC                   0AF6711C (183922972)\n+6F8BE Compressed Size       000006CE (1742)\n+6F8C2 Uncompressed Size     000006CE (1742)\n+6F8C6 Filename Length       0046 (70)\n+6F8C8 Extra Length          0009 (9)\n+6F8CA Comment Length        0000 (0)\n+6F8CC Disk Start            0000 (0)\n+6F8CE Int File Attributes   0000 (0)\n+      [Bit 0]               0 'Binary Data'\n+6F8D0 Ext File Attributes   00000000 (0)\n+6F8D4 Local Header Offset   00046813 (288787)\n+6F8D8 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+#\n+# WARNING: Offset 0x6F8D8: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+#          Zero length filename\n+#\n+6F91E Extra ID #1           5455 (21589) 'Extended Timestamp [UT]'\n+6F920   Length              0005 (5)\n+6F922   Flags               01 (1) 'Modification'\n+6F923   Modification Time   00000000 (0) 'Thu Jan  1 00:00:00 1970'\n+\n+6F927 CENTRAL HEADER #101   02014B50 (33639248)\n+6F92B Created Zip Spec      14 (20) '2.0'\n+6F92C Created OS            00 (0) 'MS-DOS'\n+6F92D Extract Zip Spec      14 (20) '2.0'\n+6F92E Extract OS            00 (0) 'MS-DOS'\n+6F92F General Purpose Flag  0000 (0)\n+6F931 Compression Method    0000 (0) 'Stored'\n+6F933 Modification Time     EC210000 (3961585664) 'Wed Jan  1 00:00:00 2098'\n+6F937 CRC                   00000000 (0)\n+6F93B Compressed Size       00000000 (0)\n+6F93F Uncompressed Size     00000000 (0)\n+6F943 Filename Length       0026 (38)\n+6F945 Extra Length          0009 (9)\n+6F947 Comment Length        0000 (0)\n+6F949 Disk Start            0000 (0)\n+6F94B Int File Attributes   0000 (0)\n+      [Bit 0]               0 'Binary Data'\n+6F94D Ext File Attributes   00000000 (0)\n+6F951 Local Header Offset   00046F5E (290654)\n+6F955 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+#\n+# WARNING: Offset 0x6F955: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+#          Zero length filename\n+#\n+6F97B Extra ID #1           5455 (21589) 'Extended Timestamp [UT]'\n+6F97D   Length              0005 (5)\n+6F97F   Flags               01 (1) 'Modification'\n+6F980   Modification Time   00000000 (0) 'Thu Jan  1 00:00:00 1970'\n+\n+6F984 CENTRAL HEADER #102   02014B50 (33639248)\n+6F988 Created Zip Spec      14 (20) '2.0'\n+6F989 Created OS            00 (0) 'MS-DOS'\n+6F98A Extract Zip Spec      14 (20) '2.0'\n+6F98B Extract OS            00 (0) 'MS-DOS'\n+6F98C General Purpose Flag  0008 (8)\n+      [Bit  3]              1 'Streamed'\n+6F98E Compression Method    0000 (0) 'Stored'\n+6F990 Modification Time     EC210000 (3961585664) 'Wed Jan  1 00:00:00 2098'\n+6F994 CRC                   AA7692A4 (2859897508)\n+6F998 Compressed Size       00000F95 (3989)\n+6F99C Uncompressed Size     00000F95 (3989)\n+6F9A0 Filename Length       0047 (71)\n+6F9A2 Extra Length          0009 (9)\n+6F9A4 Comment Length        0000 (0)\n+6F9A6 Disk Start            0000 (0)\n+6F9A8 Int File Attributes   0000 (0)\n+      [Bit 0]               0 'Binary Data'\n+6F9AA Ext File Attributes   00000000 (0)\n+6F9AE Local Header Offset   00046FAB (290731)\n+6F9B2 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+#\n+# WARNING: Offset 0x6F9B2: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+#          Zero length filename\n+#\n+6F9F9 Extra ID #1           5455 (21589) 'Extended Timestamp [UT]'\n+6F9FB   Length              0005 (5)\n+6F9FD   Flags               01 (1) 'Modification'\n+6F9FE   Modification Time   00000000 (0) 'Thu Jan  1 00:00:00 1970'\n+\n+6FA02 CENTRAL HEADER #103   02014B50 (33639248)\n+6FA06 Created Zip Spec      14 (20) '2.0'\n+6FA07 Created OS            00 (0) 'MS-DOS'\n+6FA08 Extract Zip Spec      14 (20) '2.0'\n+6FA09 Extract OS            00 (0) 'MS-DOS'\n+6FA0A General Purpose Flag  0008 (8)\n+      [Bit  3]              1 'Streamed'\n+6FA0C Compression Method    0000 (0) 'Stored'\n+6FA0E Modification Time     EC210000 (3961585664) 'Wed Jan  1 00:00:00 2098'\n+6FA12 CRC                   B7357AFB (3073735419)\n+6FA16 Compressed Size       00002D19 (11545)\n+6FA1A Uncompressed Size     00002D19 (11545)\n+6FA1E Filename Length       003B (59)\n+6FA20 Extra Length          0009 (9)\n+6FA22 Comment Length        0000 (0)\n+6FA24 Disk Start            0000 (0)\n+6FA26 Int File Attributes   0000 (0)\n+      [Bit 0]               0 'Binary Data'\n+6FA28 Ext File Attributes   00000000 (0)\n+6FA2C Local Header Offset   00047FBE (294846)\n+6FA30 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+#\n+# WARNING: Offset 0x6FA30: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+#          Zero length filename\n+#\n+6FA6B Extra ID #1           5455 (21589) 'Extended Timestamp [UT]'\n+6FA6D   Length              0005 (5)\n+6FA6F   Flags               01 (1) 'Modification'\n+6FA70   Modification Time   00000000 (0) 'Thu Jan  1 00:00:00 1970'\n+\n+6FA74 CENTRAL HEADER #104   02014B50 (33639248)\n+6FA78 Created Zip Spec      14 (20) '2.0'\n+6FA79 Created OS            00 (0) 'MS-DOS'\n+6FA7A Extract Zip Spec      14 (20) '2.0'\n+6FA7B Extract OS            00 (0) 'MS-DOS'\n+6FA7C General Purpose Flag  0008 (8)\n+      [Bit  3]              1 'Streamed'\n+6FA7E Compression Method    0000 (0) 'Stored'\n+6FA80 Modification Time     EC210000 (3961585664) 'Wed Jan  1 00:00:00 2098'\n+6FA84 CRC                   C79AC1A5 (3348808101)\n+6FA88 Compressed Size       00000D0C (3340)\n+6FA8C Uncompressed Size     00000D0C (3340)\n+6FA90 Filename Length       004E (78)\n+6FA92 Extra Length          0009 (9)\n+6FA94 Comment Length        0000 (0)\n+6FA96 Disk Start            0000 (0)\n+6FA98 Int File Attributes   0000 (0)\n+      [Bit 0]               0 'Binary Data'\n+6FA9A Ext File Attributes   00000000 (0)\n+6FA9E Local Header Offset   0004AD49 (306505)\n+6FAA2 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+#\n+# WARNING: Offset 0x6FAA2: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+#          Zero length filename\n+#\n+6FAF0 Extra ID #1           5455 (21589) 'Extended Timestamp [UT]'\n+6FAF2   Length              0005 (5)\n+6FAF4   Flags               01 (1) 'Modification'\n+6FAF5   Modification Time   00000000 (0) 'Thu Jan  1 00:00:00 1970'\n+\n+6FAF9 CENTRAL HEADER #105   02014B50 (33639248)\n+6FAFD Created Zip Spec      14 (20) '2.0'\n+6FAFE Created OS            00 (0) 'MS-DOS'\n+6FAFF Extract Zip Spec      14 (20) '2.0'\n+6FB00 Extract OS            00 (0) 'MS-DOS'\n+6FB01 General Purpose Flag  0008 (8)\n+      [Bit  3]              1 'Streamed'\n+6FB03 Compression Method    0000 (0) 'Stored'\n+6FB05 Modification Time     EC210000 (3961585664) 'Wed Jan  1 00:00:00 2098'\n+6FB09 CRC                   09C52AF8 (163916536)\n+6FB0D Compressed Size       000003A9 (937)\n+6FB11 Uncompressed Size     000003A9 (937)\n+6FB15 Filename Length       0042 (66)\n+6FB17 Extra Length          0009 (9)\n+6FB19 Comment Length        0000 (0)\n+6FB1B Disk Start            0000 (0)\n+6FB1D Int File Attributes   0000 (0)\n+      [Bit 0]               0 'Binary Data'\n+6FB1F Ext File Attributes   00000000 (0)\n+6FB23 Local Header Offset   0004BADA (309978)\n+6FB27 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+#\n+# WARNING: Offset 0x6FB27: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+#          Zero length filename\n+#\n+6FB69 Extra ID #1           5455 (21589) 'Extended Timestamp [UT]'\n+6FB6B   Length              0005 (5)\n+6FB6D   Flags               01 (1) 'Modification'\n+6FB6E   Modification Time   00000000 (0) 'Thu Jan  1 00:00:00 1970'\n+\n+6FB72 CENTRAL HEADER #106   02014B50 (33639248)\n+6FB76 Created Zip Spec      14 (20) '2.0'\n+6FB77 Created OS            00 (0) 'MS-DOS'\n+6FB78 Extract Zip Spec      14 (20) '2.0'\n+6FB79 Extract OS            00 (0) 'MS-DOS'\n+6FB7A General Purpose Flag  0008 (8)\n+      [Bit  3]              1 'Streamed'\n+6FB7C Compression Method    0000 (0) 'Stored'\n+6FB7E Modification Time     EC210000 (3961585664) 'Wed Jan  1 00:00:00 2098'\n+6FB82 CRC                   963EDCDB (2520702171)\n+6FB86 Compressed Size       0000723A (29242)\n+6FB8A Uncompressed Size     0000723A (29242)\n+6FB8E Filename Length       003C (60)\n+6FB90 Extra Length          0009 (9)\n+6FB92 Comment Length        0000 (0)\n+6FB94 Disk Start            0000 (0)\n+6FB96 Int File Attributes   0000 (0)\n+      [Bit 0]               0 'Binary Data'\n+6FB98 Ext File Attributes   00000000 (0)\n+6FB9C Local Header Offset   0004BEFC (311036)\n+6FBA0 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+#\n+# WARNING: Offset 0x6FBA0: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+#          Zero length filename\n+#\n+6FBDC Extra ID #1           5455 (21589) 'Extended Timestamp [UT]'\n+6FBDE   Length              0005 (5)\n+6FBE0   Flags               01 (1) 'Modification'\n+6FBE1   Modification Time   00000000 (0) 'Thu Jan  1 00:00:00 1970'\n+\n+6FBE5 CENTRAL HEADER #107   02014B50 (33639248)\n+6FBE9 Created Zip Spec      14 (20) '2.0'\n+6FBEA Created OS            00 (0) 'MS-DOS'\n+6FBEB Extract Zip Spec      14 (20) '2.0'\n+6FBEC Extract OS            00 (0) 'MS-DOS'\n+6FBED General Purpose Flag  0008 (8)\n+      [Bit  3]              1 'Streamed'\n+6FBEF Compression Method    0000 (0) 'Stored'\n+6FBF1 Modification Time     EC210000 (3961585664) 'Wed Jan  1 00:00:00 2098'\n+6FBF5 CRC                   180ADDBE (403365310)\n+6FBF9 Compressed Size       000095B9 (38329)\n+6FBFD Uncompressed Size     000095B9 (38329)\n+6FC01 Filename Length       003B (59)\n+6FC03 Extra Length          0009 (9)\n+6FC05 Comment Length        0000 (0)\n+6FC07 Disk Start            0000 (0)\n+6FC09 Int File Attributes   0000 (0)\n+      [Bit 0]               0 'Binary Data'\n+6FC0B Ext File Attributes   00000000 (0)\n+6FC0F Local Header Offset   000531A9 (340393)\n+6FC13 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+#\n+# WARNING: Offset 0x6FC13: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+#          Zero length filename\n+#\n+6FC4E Extra ID #1           5455 (21589) 'Extended Timestamp [UT]'\n+6FC50   Length              0005 (5)\n+6FC52   Flags               01 (1) 'Modification'\n+6FC53   Modification Time   00000000 (0) 'Thu Jan  1 00:00:00 1970'\n+\n+6FC57 CENTRAL HEADER #108   02014B50 (33639248)\n+6FC5B Created Zip Spec      14 (20) '2.0'\n+6FC5C Created OS            00 (0) 'MS-DOS'\n+6FC5D Extract Zip Spec      14 (20) '2.0'\n+6FC5E Extract OS            00 (0) 'MS-DOS'\n+6FC5F General Purpose Flag  0008 (8)\n+      [Bit  3]              1 'Streamed'\n+6FC61 Compression Method    0000 (0) 'Stored'\n+6FC63 Modification Time     EC210000 (3961585664) 'Wed Jan  1 00:00:00 2098'\n+6FC67 CRC                   7701B7FD (1996601341)\n+6FC6B Compressed Size       00000864 (2148)\n+6FC6F Uncompressed Size     00000864 (2148)\n+6FC73 Filename Length       0043 (67)\n+6FC75 Extra Length          0009 (9)\n+6FC77 Comment Length        0000 (0)\n+6FC79 Disk Start            0000 (0)\n+6FC7B Int File Attributes   0000 (0)\n+      [Bit 0]               0 'Binary Data'\n+6FC7D Ext File Attributes   00000000 (0)\n+6FC81 Local Header Offset   0005C7D4 (378836)\n+6FC85 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+#\n+# WARNING: Offset 0x6FC85: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+#          Zero length filename\n+#\n+6FCC8 Extra ID #1           5455 (21589) 'Extended Timestamp [UT]'\n+6FCCA   Length              0005 (5)\n+6FCCC   Flags               01 (1) 'Modification'\n+6FCCD   Modification Time   00000000 (0) 'Thu Jan  1 00:00:00 1970'\n+\n+6FCD1 CENTRAL HEADER #109   02014B50 (33639248)\n+6FCD5 Created Zip Spec      14 (20) '2.0'\n+6FCD6 Created OS            00 (0) 'MS-DOS'\n+6FCD7 Extract Zip Spec      14 (20) '2.0'\n+6FCD8 Extract OS            00 (0) 'MS-DOS'\n+6FCD9 General Purpose Flag  0000 (0)\n+6FCDB Compression Method    0000 (0) 'Stored'\n+6FCDD Modification Time     EC210000 (3961585664) 'Wed Jan  1 00:00:00 2098'\n+6FCE1 CRC                   00000000 (0)\n+6FCE5 Compressed Size       00000000 (0)\n+6FCE9 Uncompressed Size     00000000 (0)\n+6FCED Filename Length       0020 (32)\n+6FCEF Extra Length          0009 (9)\n+6FCF1 Comment Length        0000 (0)\n+6FCF3 Disk Start            0000 (0)\n+6FCF5 Int File Attributes   0000 (0)\n+      [Bit 0]               0 'Binary Data'\n+6FCF7 Ext File Attributes   00000000 (0)\n+6FCFB Local Header Offset   0005D0B2 (381106)\n+6FCFF Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+#\n+# WARNING: Offset 0x6FCFF: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+#          Zero length filename\n+#\n+6FD1F Extra ID #1           5455 (21589) 'Extended Timestamp [UT]'\n+6FD21   Length              0005 (5)\n+6FD23   Flags               01 (1) 'Modification'\n+6FD24   Modification Time   00000000 (0) 'Thu Jan  1 00:00:00 1970'\n+\n+6FD28 CENTRAL HEADER #110   02014B50 (33639248)\n+6FD2C Created Zip Spec      14 (20) '2.0'\n+6FD2D Created OS            00 (0) 'MS-DOS'\n+6FD2E Extract Zip Spec      14 (20) '2.0'\n+6FD2F Extract OS            00 (0) 'MS-DOS'\n+6FD30 General Purpose Flag  0008 (8)\n+      [Bit  3]              1 'Streamed'\n+6FD32 Compression Method    0000 (0) 'Stored'\n+6FD34 Modification Time     EC210000 (3961585664) 'Wed Jan  1 00:00:00 2098'\n+6FD38 CRC                   B5B90B55 (3048803157)\n+6FD3C Compressed Size       000011CD (4557)\n+6FD40 Uncompressed Size     000011CD (4557)\n+6FD44 Filename Length       0036 (54)\n+6FD46 Extra Length          0009 (9)\n+6FD48 Comment Length        0000 (0)\n+6FD4A Disk Start            0000 (0)\n+6FD4C Int File Attributes   0000 (0)\n+      [Bit 0]               0 'Binary Data'\n+6FD4E Ext File Attributes   00000000 (0)\n+6FD52 Local Header Offset   0005D0F9 (381177)\n+6FD56 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+#\n+# WARNING: Offset 0x6FD56: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+#          Zero length filename\n+#\n+6FD8C Extra ID #1           5455 (21589) 'Extended Timestamp [UT]'\n+6FD8E   Length              0005 (5)\n+6FD90   Flags               01 (1) 'Modification'\n+6FD91   Modification Time   00000000 (0) 'Thu Jan  1 00:00:00 1970'\n+\n+6FD95 CENTRAL HEADER #111   02014B50 (33639248)\n+6FD99 Created Zip Spec      14 (20) '2.0'\n+6FD9A Created OS            00 (0) 'MS-DOS'\n+6FD9B Extract Zip Spec      14 (20) '2.0'\n+6FD9C Extract OS            00 (0) 'MS-DOS'\n+6FD9D General Purpose Flag  0008 (8)\n+      [Bit  3]              1 'Streamed'\n+6FD9F Compression Method    0000 (0) 'Stored'\n+6FDA1 Modification Time     EC210000 (3961585664) 'Wed Jan  1 00:00:00 2098'\n+6FDA5 CRC                   5117C509 (1360512265)\n+6FDA9 Compressed Size       000005CF (1487)\n+6FDAD Uncompressed Size     000005CF (1487)\n+6FDB1 Filename Length       0039 (57)\n+6FDB3 Extra Length          0009 (9)\n+6FDB5 Comment Length        0000 (0)\n+6FDB7 Disk Start            0000 (0)\n+6FDB9 Int File Attributes   0000 (0)\n+      [Bit 0]               0 'Binary Data'\n+6FDBB Ext File Attributes   00000000 (0)\n+6FDBF Local Header Offset   0005E333 (385843)\n+6FDC3 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+#\n+# WARNING: Offset 0x6FDC3: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+#          Zero length filename\n+#\n+6FDFC Extra ID #1           5455 (21589) 'Extended Timestamp [UT]'\n+6FDFE   Length              0005 (5)\n+6FE00   Flags               01 (1) 'Modification'\n+6FE01   Modification Time   00000000 (0) 'Thu Jan  1 00:00:00 1970'\n+\n+6FE05 CENTRAL HEADER #112   02014B50 (33639248)\n+6FE09 Created Zip Spec      14 (20) '2.0'\n+6FE0A Created OS            00 (0) 'MS-DOS'\n+6FE0B Extract Zip Spec      14 (20) '2.0'\n+6FE0C Extract OS            00 (0) 'MS-DOS'\n+6FE0D General Purpose Flag  0008 (8)\n+      [Bit  3]              1 'Streamed'\n+6FE0F Compression Method    0000 (0) 'Stored'\n+6FE11 Modification Time     EC210000 (3961585664) 'Wed Jan  1 00:00:00 2098'\n+6FE15 CRC                   FCC4145B (4240708699)\n+6FE19 Compressed Size       000006E0 (1760)\n+6FE1D Uncompressed Size     000006E0 (1760)\n+6FE21 Filename Length       0039 (57)\n+6FE23 Extra Length          0009 (9)\n+6FE25 Comment Length        0000 (0)\n+6FE27 Disk Start            0000 (0)\n+6FE29 Int File Attributes   0000 (0)\n+      [Bit 0]               0 'Binary Data'\n+6FE2B Ext File Attributes   00000000 (0)\n+6FE2F Local Header Offset   0005E972 (387442)\n+6FE33 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+#\n+# WARNING: Offset 0x6FE33: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+#          Zero length filename\n+#\n+6FE6C Extra ID #1           5455 (21589) 'Extended Timestamp [UT]'\n+6FE6E   Length              0005 (5)\n+6FE70   Flags               01 (1) 'Modification'\n+6FE71   Modification Time   00000000 (0) 'Thu Jan  1 00:00:00 1970'\n+\n+6FE75 CENTRAL HEADER #113   02014B50 (33639248)\n+6FE79 Created Zip Spec      14 (20) '2.0'\n+6FE7A Created OS            00 (0) 'MS-DOS'\n+6FE7B Extract Zip Spec      14 (20) '2.0'\n+6FE7C Extract OS            00 (0) 'MS-DOS'\n+6FE7D General Purpose Flag  0008 (8)\n+      [Bit  3]              1 'Streamed'\n+6FE7F Compression Method    0000 (0) 'Stored'\n+6FE81 Modification Time     EC210000 (3961585664) 'Wed Jan  1 00:00:00 2098'\n+6FE85 CRC                   A6BC7A6B (2797369963)\n+6FE89 Compressed Size       000005DB (1499)\n+6FE8D Uncompressed Size     000005DB (1499)\n+6FE91 Filename Length       003B (59)\n+6FE93 Extra Length          0009 (9)\n+6FE95 Comment Length        0000 (0)\n+6FE97 Disk Start            0000 (0)\n+6FE99 Int File Attributes   0000 (0)\n+      [Bit 0]               0 'Binary Data'\n+6FE9B Ext File Attributes   00000000 (0)\n+6FE9F Local Header Offset   0005F0C2 (389314)\n+6FEA3 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+#\n+# WARNING: Offset 0x6FEA3: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+#          Zero length filename\n+#\n+6FEDE Extra ID #1           5455 (21589) 'Extended Timestamp [UT]'\n+6FEE0   Length              0005 (5)\n+6FEE2   Flags               01 (1) 'Modification'\n+6FEE3   Modification Time   00000000 (0) 'Thu Jan  1 00:00:00 1970'\n+\n+6FEE7 CENTRAL HEADER #114   02014B50 (33639248)\n+6FEEB Created Zip Spec      14 (20) '2.0'\n+6FEEC Created OS            00 (0) 'MS-DOS'\n+6FEED Extract Zip Spec      14 (20) '2.0'\n+6FEEE Extract OS            00 (0) 'MS-DOS'\n+6FEEF General Purpose Flag  0008 (8)\n+      [Bit  3]              1 'Streamed'\n+6FEF1 Compression Method    0000 (0) 'Stored'\n+6FEF3 Modification Time     EC210000 (3961585664) 'Wed Jan  1 00:00:00 2098'\n+6FEF7 CRC                   CDD77CC5 (3453451461)\n+6FEFB Compressed Size       000006EA (1770)\n+6FEFF Uncompressed Size     000006EA (1770)\n+6FF03 Filename Length       003B (59)\n+6FF05 Extra Length          0009 (9)\n+6FF07 Comment Length        0000 (0)\n+6FF09 Disk Start            0000 (0)\n+6FF0B Int File Attributes   0000 (0)\n+      [Bit 0]               0 'Binary Data'\n+6FF0D Ext File Attributes   00000000 (0)\n+6FF11 Local Header Offset   0005F70F (390927)\n+6FF15 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+#\n+# WARNING: Offset 0x6FF15: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+#          Zero length filename\n+#\n+6FF50 Extra ID #1           5455 (21589) 'Extended Timestamp [UT]'\n+6FF52   Length              0005 (5)\n+6FF54   Flags               01 (1) 'Modification'\n+6FF55   Modification Time   00000000 (0) 'Thu Jan  1 00:00:00 1970'\n+\n+6FF59 CENTRAL HEADER #115   02014B50 (33639248)\n+6FF5D Created Zip Spec      14 (20) '2.0'\n+6FF5E Created OS            00 (0) 'MS-DOS'\n+6FF5F Extract Zip Spec      14 (20) '2.0'\n+6FF60 Extract OS            00 (0) 'MS-DOS'\n+6FF61 General Purpose Flag  0008 (8)\n+      [Bit  3]              1 'Streamed'\n+6FF63 Compression Method    0000 (0) 'Stored'\n+6FF65 Modification Time     EC210000 (3961585664) 'Wed Jan  1 00:00:00 2098'\n+6FF69 CRC                   5112EBCA (1360194506)\n+6FF6D Compressed Size       000005C7 (1479)\n+6FF71 Uncompressed Size     000005C7 (1479)\n+6FF75 Filename Length       0031 (49)\n+6FF77 Extra Length          0009 (9)\n+6FF79 Comment Length        0000 (0)\n+6FF7B Disk Start            0000 (0)\n+6FF7D Int File Attributes   0000 (0)\n+      [Bit 0]               0 'Binary Data'\n+6FF7F Ext File Attributes   00000000 (0)\n+6FF83 Local Header Offset   0005FE6B (392811)\n+6FF87 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+#\n+# WARNING: Offset 0x6FF87: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+#          Zero length filename\n+#\n+6FFB8 Extra ID #1           5455 (21589) 'Extended Timestamp [UT]'\n+6FFBA   Length              0005 (5)\n+6FFBC   Flags               01 (1) 'Modification'\n+6FFBD   Modification Time   00000000 (0) 'Thu Jan  1 00:00:00 1970'\n+\n+6FFC1 CENTRAL HEADER #116   02014B50 (33639248)\n+6FFC5 Created Zip Spec      14 (20) '2.0'\n+6FFC6 Created OS            00 (0) 'MS-DOS'\n+6FFC7 Extract Zip Spec      14 (20) '2.0'\n+6FFC8 Extract OS            00 (0) 'MS-DOS'\n+6FFC9 General Purpose Flag  0000 (0)\n+6FFCB Compression Method    0000 (0) 'Stored'\n+6FFCD Modification Time     EC210000 (3961585664) 'Wed Jan  1 00:00:00 2098'\n+6FFD1 CRC                   00000000 (0)\n+6FFD5 Compressed Size       00000000 (0)\n+6FFD9 Uncompressed Size     00000000 (0)\n+6FFDD Filename Length       0021 (33)\n+6FFDF Extra Length          0009 (9)\n+6FFE1 Comment Length        0000 (0)\n+6FFE3 Disk Start            0000 (0)\n+6FFE5 Int File Attributes   0000 (0)\n+      [Bit 0]               0 'Binary Data'\n+6FFE7 Ext File Attributes   00000000 (0)\n+6FFEB Local Header Offset   0006049A (394394)\n+6FFEF Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+#\n+# WARNING: Offset 0x6FFEF: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+#          Zero length filename\n+#\n+70010 Extra ID #1           5455 (21589) 'Extended Timestamp [UT]'\n+70012   Length              0005 (5)\n+70014   Flags               01 (1) 'Modification'\n+70015   Modification Time   00000000 (0) 'Thu Jan  1 00:00:00 1970'\n+\n+70019 CENTRAL HEADER #117   02014B50 (33639248)\n+7001D Created Zip Spec      14 (20) '2.0'\n+7001E Created OS            00 (0) 'MS-DOS'\n+7001F Extract Zip Spec      14 (20) '2.0'\n+70020 Extract OS            00 (0) 'MS-DOS'\n+70021 General Purpose Flag  0008 (8)\n+      [Bit  3]              1 'Streamed'\n+70023 Compression Method    0000 (0) 'Stored'\n+70025 Modification Time     EC210000 (3961585664) 'Wed Jan  1 00:00:00 2098'\n+70029 CRC                   F2E8FAB9 (4075354809)\n+7002D Compressed Size       00000826 (2086)\n+70031 Uncompressed Size     00000826 (2086)\n+70035 Filename Length       003B (59)\n+70037 Extra Length          0009 (9)\n+70039 Comment Length        0000 (0)\n+7003B Disk Start            0000 (0)\n+7003D Int File Attributes   0000 (0)\n+      [Bit 0]               0 'Binary Data'\n+7003F Ext File Attributes   00000000 (0)\n+70043 Local Header Offset   000604E2 (394466)\n+70047 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+#\n+# WARNING: Offset 0x70047: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+#          Zero length filename\n+#\n+70082 Extra ID #1           5455 (21589) 'Extended Timestamp [UT]'\n+70084   Length              0005 (5)\n+70086   Flags               01 (1) 'Modification'\n+70087   Modification Time   00000000 (0) 'Thu Jan  1 00:00:00 1970'\n+\n+7008B CENTRAL HEADER #118   02014B50 (33639248)\n+7008F Created Zip Spec      14 (20) '2.0'\n+70090 Created OS            00 (0) 'MS-DOS'\n+70091 Extract Zip Spec      14 (20) '2.0'\n+70092 Extract OS            00 (0) 'MS-DOS'\n+70093 General Purpose Flag  0000 (0)\n+70095 Compression Method    0000 (0) 'Stored'\n+70097 Modification Time     EC210000 (3961585664) 'Wed Jan  1 00:00:00 2098'\n+7009B CRC                   00000000 (0)\n+7009F Compressed Size       00000000 (0)\n+700A3 Uncompressed Size     00000000 (0)\n+700A7 Filename Length       0022 (34)\n+700A9 Extra Length          0009 (9)\n+700AB Comment Length        0000 (0)\n+700AD Disk Start            0000 (0)\n+700AF Int File Attributes   0000 (0)\n+      [Bit 0]               0 'Binary Data'\n+700B1 Ext File Attributes   00000000 (0)\n+700B5 Local Header Offset   00060D7A (396666)\n+700B9 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+#\n+# WARNING: Offset 0x700B9: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+#          Zero length filename\n+#\n+700DB Extra ID #1           5455 (21589) 'Extended Timestamp [UT]'\n+700DD   Length              0005 (5)\n+700DF   Flags               01 (1) 'Modification'\n+700E0   Modification Time   00000000 (0) 'Thu Jan  1 00:00:00 1970'\n+\n+700E4 CENTRAL HEADER #119   02014B50 (33639248)\n+700E8 Created Zip Spec      14 (20) '2.0'\n+700E9 Created OS            00 (0) 'MS-DOS'\n+700EA Extract Zip Spec      14 (20) '2.0'\n+700EB Extract OS            00 (0) 'MS-DOS'\n+700EC General Purpose Flag  0008 (8)\n+      [Bit  3]              1 'Streamed'\n+700EE Compression Method    0000 (0) 'Stored'\n+700F0 Modification Time     EC210000 (3961585664) 'Wed Jan  1 00:00:00 2098'\n+700F4 CRC                   5DDCD4C5 (1574753477)\n+700F8 Compressed Size       0000537F (21375)\n+700FC Uncompressed Size     0000537F (21375)\n+70100 Filename Length       0037 (55)\n+70102 Extra Length          0009 (9)\n+70104 Comment Length        0000 (0)\n+70106 Disk Start            0000 (0)\n+70108 Int File Attributes   0000 (0)\n+      [Bit 0]               0 'Binary Data'\n+7010A Ext File Attributes   00000000 (0)\n+7010E Local Header Offset   00060DC3 (396739)\n+70112 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+#\n+# WARNING: Offset 0x70112: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+#          Zero length filename\n+#\n+70149 Extra ID #1           5455 (21589) 'Extended Timestamp [UT]'\n+7014B   Length              0005 (5)\n+7014D   Flags               01 (1) 'Modification'\n+7014E   Modification Time   00000000 (0) 'Thu Jan  1 00:00:00 1970'\n+\n+70152 CENTRAL HEADER #120   02014B50 (33639248)\n+70156 Created Zip Spec      14 (20) '2.0'\n+70157 Created OS            00 (0) 'MS-DOS'\n+70158 Extract Zip Spec      14 (20) '2.0'\n+70159 Extract OS            00 (0) 'MS-DOS'\n+7015A General Purpose Flag  0008 (8)\n+      [Bit  3]              1 'Streamed'\n+7015C Compression Method    0000 (0) 'Stored'\n+7015E Modification Time     EC210000 (3961585664) 'Wed Jan  1 00:00:00 2098'\n+70162 CRC                   5BC81E29 (1539841577)\n+70166 Compressed Size       00001D8A (7562)\n+7016A Uncompressed Size     00001D8A (7562)\n+7016E Filename Length       003E (62)\n+70170 Extra Length          0009 (9)\n+70172 Comment Length        0000 (0)\n+70174 Disk Start            0000 (0)\n+70176 Int File Attributes   0000 (0)\n+      [Bit 0]               0 'Binary Data'\n+70178 Ext File Attributes   00000000 (0)\n+7017C Local Header Offset   000661B0 (418224)\n+70180 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+#\n+# WARNING: Offset 0x70180: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+#          Zero length filename\n+#\n+701BE Extra ID #1           5455 (21589) 'Extended Timestamp [UT]'\n+701C0   Length              0005 (5)\n+701C2   Flags               01 (1) 'Modification'\n+701C3   Modification Time   00000000 (0) 'Thu Jan  1 00:00:00 1970'\n+\n+701C7 CENTRAL HEADER #121   02014B50 (33639248)\n+701CB Created Zip Spec      14 (20) '2.0'\n+701CC Created OS            00 (0) 'MS-DOS'\n+701CD Extract Zip Spec      14 (20) '2.0'\n+701CE Extract OS            00 (0) 'MS-DOS'\n+701CF General Purpose Flag  0008 (8)\n+      [Bit  3]              1 'Streamed'\n+701D1 Compression Method    0000 (0) 'Stored'\n+701D3 Modification Time     EC210000 (3961585664) 'Wed Jan  1 00:00:00 2098'\n+701D7 CRC                   A266F3B2 (2724656050)\n+701DB Compressed Size       0000462E (17966)\n+701DF Uncompressed Size     0000462E (17966)\n+701E3 Filename Length       0037 (55)\n+701E5 Extra Length          0009 (9)\n+701E7 Comment Length        0000 (0)\n+701E9 Disk Start            0000 (0)\n+701EB Int File Attributes   0000 (0)\n+      [Bit 0]               0 'Binary Data'\n+701ED Ext File Attributes   00000000 (0)\n+701F1 Local Header Offset   00067FAF (425903)\n+701F5 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+#\n+# WARNING: Offset 0x701F5: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+#          Zero length filename\n+#\n+7022C Extra ID #1           5455 (21589) 'Extended Timestamp [UT]'\n+7022E   Length              0005 (5)\n+70230   Flags               01 (1) 'Modification'\n+70231   Modification Time   00000000 (0) 'Thu Jan  1 00:00:00 1970'\n+\n+70235 CENTRAL HEADER #122   02014B50 (33639248)\n+70239 Created Zip Spec      14 (20) '2.0'\n+7023A Created OS            00 (0) 'MS-DOS'\n+7023B Extract Zip Spec      14 (20) '2.0'\n+7023C Extract OS            00 (0) 'MS-DOS'\n+7023D General Purpose Flag  0008 (8)\n+      [Bit  3]              1 'Streamed'\n+7023F Compression Method    0000 (0) 'Stored'\n+70241 Modification Time     EC210000 (3961585664) 'Wed Jan  1 00:00:00 2098'\n+70245 CRC                   952E3CF5 (2502835445)\n+70249 Compressed Size       00000552 (1362)\n+7024D Uncompressed Size     00000552 (1362)\n+70251 Filename Length       0043 (67)\n+70253 Extra Length          0009 (9)\n+70255 Comment Length        0000 (0)\n+70257 Disk Start            0000 (0)\n+70259 Int File Attributes   0000 (0)\n+      [Bit 0]               0 'Binary Data'\n+7025B Ext File Attributes   00000000 (0)\n+7025F Local Header Offset   0006C64B (443979)\n+70263 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+#\n+# WARNING: Offset 0x70263: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+#          Zero length filename\n+#\n+702A6 Extra ID #1           5455 (21589) 'Extended Timestamp [UT]'\n+702A8   Length              0005 (5)\n+702AA   Flags               01 (1) 'Modification'\n+702AB   Modification Time   00000000 (0) 'Thu Jan  1 00:00:00 1970'\n+\n+702AF END CENTRAL HEADER    06054B50 (101010256)\n+702B3 Number of this disk   0000 (0)\n+702B5 Central Dir Disk no   0000 (0)\n+702B7 Entries in this disk  007A (122)\n+702B9 Total Entries         007A (122)\n+702BB Size of Central Dir   00003698 (13976)\n+702BF Offset to Central Dir 0006CC17 (445463)\n+702C3 Comment Length        0000 (0)\n #\n # Warning Count: 244\n #\n # Done\n"}, {"source1": "META-INF/dubbo/internal/org.apache.dubbo.registry.RegistryFactory", "source2": "META-INF/dubbo/internal/org.apache.dubbo.registry.RegistryFactory", "comments": ["Line-ending differences only"], "unified_diff": "@@ -1,2 +1,2 @@\n-service-discovery-registry=org.apache.dubbo.registry.client.ServiceDiscoveryRegistryFactory\n+service-discovery-registry=org.apache.dubbo.registry.client.ServiceDiscoveryRegistryFactory\r\n wrapper=org.apache.dubbo.registry.RegistryFactoryWrapper\n"}, {"source1": "META-INF/dubbo/internal/org.apache.dubbo.registry.client.ServiceInstanceCustomizer", "source2": "META-INF/dubbo/internal/org.apache.dubbo.registry.client.ServiceInstanceCustomizer", "comments": ["Line-ending differences only"], "unified_diff": "@@ -1,6 +1,6 @@\n-metadata-url=org.apache.dubbo.registry.client.metadata.MetadataServiceURLParamsMetadataCustomizer\n-exported-revision=org.apache.dubbo.registry.client.metadata.ExportedServicesRevisionMetadataCustomizer\n-subscribed-revision=org.apache.dubbo.registry.client.metadata.SubscribedServicesRevisionMetadataCustomizer\n-protocol-ports=org.apache.dubbo.registry.client.metadata.ProtocolPortsMetadataCustomizer\n-instance-port=org.apache.dubbo.config.metadata.ServiceInstancePortCustomizer\n-instance-metadata=org.apache.dubbo.registry.client.metadata.ServiceInstanceMetadataCustomizer\n+metadata-url=org.apache.dubbo.registry.client.metadata.MetadataServiceURLParamsMetadataCustomizer\r\n+exported-revision=org.apache.dubbo.registry.client.metadata.ExportedServicesRevisionMetadataCustomizer\r\n+subscribed-revision=org.apache.dubbo.registry.client.metadata.SubscribedServicesRevisionMetadataCustomizer\r\n+protocol-ports=org.apache.dubbo.registry.client.metadata.ProtocolPortsMetadataCustomizer\r\n+instance-port=org.apache.dubbo.config.metadata.ServiceInstancePortCustomizer\r\n+instance-metadata=org.apache.dubbo.registry.client.metadata.ServiceInstanceMetadataCustomizer\r\n"}, {"source1": "META-INF/dubbo/internal/org.apache.dubbo.registry.client.metadata.MetadataServiceURLBuilder", "source2": "META-INF/dubbo/internal/org.apache.dubbo.registry.client.metadata.MetadataServiceURLBuilder", "comments": ["Line-ending differences only"], "unified_diff": "@@ -1,2 +1,2 @@\n-standard=org.apache.dubbo.registry.client.metadata.StandardMetadataServiceURLBuilder\n+standard=org.apache.dubbo.registry.client.metadata.StandardMetadataServiceURLBuilder\r\n spring-cloud=org.apache.dubbo.registry.client.metadata.SpringCloudMetadataServiceURLBuilder\n"}, {"source1": "META-INF/dubbo/internal/org.apache.dubbo.rpc.Protocol", "source2": "META-INF/dubbo/internal/org.apache.dubbo.rpc.Protocol", "comments": ["Line-ending differences only"], "unified_diff": "@@ -1,2 +1,2 @@\n-registry=org.apache.dubbo.registry.integration.InterfaceCompatibleRegistryProtocol\n+registry=org.apache.dubbo.registry.integration.InterfaceCompatibleRegistryProtocol\r\n service-discovery-registry=org.apache.dubbo.registry.integration.RegistryProtocol\n"}, {"source1": "META-INF/maven/org.apache.dubbo/dubbo-registry-api/pom.xml", "source2": "META-INF/maven/org.apache.dubbo/dubbo-registry-api/pom.xml", "unified_diff": null, "details": [{"source1": "META-INF/maven/org.apache.dubbo/dubbo-registry-api/pom.xml", "source2": "META-INF/maven/org.apache.dubbo/dubbo-registry-api/pom.xml", "comments": ["Ordering differences only"], "unified_diff": "@@ -50,20 +50,20 @@\n     </dependency>\n     <dependency>\n       <groupId>org.apache.dubbo</groupId>\n       <artifactId>dubbo-container-api</artifactId>\n       <version>${project.parent.version}</version>\n       <exclusions>\n         <exclusion>\n-          <artifactId>jetty-server</artifactId>\n           <groupId>org.eclipse.jetty</groupId>\n+          <artifactId>jetty-server</artifactId>\n         </exclusion>\n         <exclusion>\n-          <artifactId>jetty-servlet</artifactId>\n           <groupId>org.eclipse.jetty</groupId>\n+          <artifactId>jetty-servlet</artifactId>\n         </exclusion>\n       </exclusions>\n     </dependency>\n     <dependency>\n       <groupId>org.apache.dubbo</groupId>\n       <artifactId>dubbo-metadata-api</artifactId>\n       <version>${project.parent.version}</version>\n"}]}, {"source1": "org/apache/dubbo/registry/AddressListener.java", "source2": "org/apache/dubbo/registry/AddressListener.java", "comments": ["Line-ending differences only"], "unified_diff": "@@ -1,37 +1,37 @@\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;\n-\n-import org.apache.dubbo.common.URL;\n-import org.apache.dubbo.common.extension.SPI;\n-import org.apache.dubbo.rpc.cluster.Directory;\n-\n-import java.util.List;\n-\n-@SPI\n-public interface AddressListener {\n-\n-    /**\n-     * processing when receiving the address list\n-     *\n-     * @param addresses            provider address list\n-     * @param consumerUrl\n-     * @param registryDirectory\n-     */\n-    List<URL> notify(List<URL> addresses, URL consumerUrl, Directory registryDirectory);\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;\r\n+\r\n+import org.apache.dubbo.common.URL;\r\n+import org.apache.dubbo.common.extension.SPI;\r\n+import org.apache.dubbo.rpc.cluster.Directory;\r\n+\r\n+import java.util.List;\r\n+\r\n+@SPI\r\n+public interface AddressListener {\r\n+\r\n+    /**\r\n+     * processing when receiving the address list\r\n+     *\r\n+     * @param addresses            provider address list\r\n+     * @param consumerUrl\r\n+     * @param registryDirectory\r\n+     */\r\n+    List<URL> notify(List<URL> addresses, URL consumerUrl, Directory registryDirectory);\r\n+\r\n }\n"}, {"source1": "org/apache/dubbo/registry/Constants.java", "source2": "org/apache/dubbo/registry/Constants.java", "comments": ["Line-ending differences only"], "unified_diff": "@@ -1,96 +1,96 @@\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-\n-package org.apache.dubbo.registry;\n-\n-public interface Constants {\n-    String REGISTER_IP_KEY = \"register.ip\";\n-\n-    String REGISTER_KEY = \"register\";\n-\n-    String SUBSCRIBE_KEY = \"subscribe\";\n-\n-    String DEFAULT_REGISTRY = \"dubbo\";\n-\n-    String REGISTER = \"register\";\n-\n-    String UNREGISTER = \"unregister\";\n-\n-    String SUBSCRIBE = \"subscribe\";\n-\n-    String UNSUBSCRIBE = \"unsubscribe\";\n-\n-    String CONFIGURATORS_SUFFIX = \".configurators\";\n-\n-    String ADMIN_PROTOCOL = \"admin\";\n-\n-    String PROVIDER_PROTOCOL = \"provider\";\n-\n-    String CONSUMER_PROTOCOL = \"consumer\";\n-\n-    String SCRIPT_PROTOCOL = \"script\";\n-\n-    String CONDITION_PROTOCOL = \"condition\";\n-    String TRACE_PROTOCOL = \"trace\";\n-    /**\n-     * simple the registry for provider.\n-     *\n-     * @since 2.7.0\n-     */\n-    String SIMPLIFIED_KEY = \"simplified\";\n-\n-    /**\n-     * To decide whether register center saves file synchronously, the default value is asynchronously\n-     */\n-    String REGISTRY_FILESAVE_SYNC_KEY = \"save.file\";\n-\n-    /**\n-     * Whether to cache locally, default is true\n-     */\n-    String REGISTRY__LOCAL_FILE_CACHE_ENABLED = \"file.cache\";\n-\n-    /**\n-     * Reconnection period in milliseconds for register center\n-     */\n-    String REGISTRY_RECONNECT_PERIOD_KEY = \"reconnect.period\";\n-\n-    int DEFAULT_SESSION_TIMEOUT = 60 * 1000;\n-\n-    /**\n-     * Default value for the times of retry: 3\n-     */\n-    int DEFAULT_REGISTRY_RETRY_TIMES = 3;\n-\n-    int DEFAULT_REGISTRY_RECONNECT_PERIOD = 3 * 1000;\n-\n-    /**\n-     * Default value for the period of retry interval in milliseconds: 5000\n-     */\n-    int DEFAULT_REGISTRY_RETRY_PERIOD = 5 * 1000;\n-\n-    /**\n-     * Most retry times\n-     */\n-    String REGISTRY_RETRY_TIMES_KEY = \"retry.times\";\n-\n-    /**\n-     * Period of registry center's retry interval\n-     */\n-    String REGISTRY_RETRY_PERIOD_KEY = \"retry.period\";\n-\n-    String SESSION_TIMEOUT_KEY = \"session\";\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+\r\n+package org.apache.dubbo.registry;\r\n+\r\n+public interface Constants {\r\n+    String REGISTER_IP_KEY = \"register.ip\";\r\n+\r\n+    String REGISTER_KEY = \"register\";\r\n+\r\n+    String SUBSCRIBE_KEY = \"subscribe\";\r\n+\r\n+    String DEFAULT_REGISTRY = \"dubbo\";\r\n+\r\n+    String REGISTER = \"register\";\r\n+\r\n+    String UNREGISTER = \"unregister\";\r\n+\r\n+    String SUBSCRIBE = \"subscribe\";\r\n+\r\n+    String UNSUBSCRIBE = \"unsubscribe\";\r\n+\r\n+    String CONFIGURATORS_SUFFIX = \".configurators\";\r\n+\r\n+    String ADMIN_PROTOCOL = \"admin\";\r\n+\r\n+    String PROVIDER_PROTOCOL = \"provider\";\r\n+\r\n+    String CONSUMER_PROTOCOL = \"consumer\";\r\n+\r\n+    String SCRIPT_PROTOCOL = \"script\";\r\n+\r\n+    String CONDITION_PROTOCOL = \"condition\";\r\n+    String TRACE_PROTOCOL = \"trace\";\r\n+    /**\r\n+     * simple the registry for provider.\r\n+     *\r\n+     * @since 2.7.0\r\n+     */\r\n+    String SIMPLIFIED_KEY = \"simplified\";\r\n+\r\n+    /**\r\n+     * To decide whether register center saves file synchronously, the default value is asynchronously\r\n+     */\r\n+    String REGISTRY_FILESAVE_SYNC_KEY = \"save.file\";\r\n+\r\n+    /**\r\n+     * Whether to cache locally, default is true\r\n+     */\r\n+    String REGISTRY__LOCAL_FILE_CACHE_ENABLED = \"file.cache\";\r\n+\r\n+    /**\r\n+     * Reconnection period in milliseconds for register center\r\n+     */\r\n+    String REGISTRY_RECONNECT_PERIOD_KEY = \"reconnect.period\";\r\n+\r\n+    int DEFAULT_SESSION_TIMEOUT = 60 * 1000;\r\n+\r\n+    /**\r\n+     * Default value for the times of retry: 3\r\n+     */\r\n+    int DEFAULT_REGISTRY_RETRY_TIMES = 3;\r\n+\r\n+    int DEFAULT_REGISTRY_RECONNECT_PERIOD = 3 * 1000;\r\n+\r\n+    /**\r\n+     * Default value for the period of retry interval in milliseconds: 5000\r\n+     */\r\n+    int DEFAULT_REGISTRY_RETRY_PERIOD = 5 * 1000;\r\n+\r\n+    /**\r\n+     * Most retry times\r\n+     */\r\n+    String REGISTRY_RETRY_TIMES_KEY = \"retry.times\";\r\n+\r\n+    /**\r\n+     * Period of registry center's retry interval\r\n+     */\r\n+    String REGISTRY_RETRY_PERIOD_KEY = \"retry.period\";\r\n+\r\n+    String SESSION_TIMEOUT_KEY = \"session\";\r\n+}\r\n"}, {"source1": "org/apache/dubbo/registry/ListenerRegistryWrapper.java", "source2": "org/apache/dubbo/registry/ListenerRegistryWrapper.java", "comments": ["Line-ending differences only"], "unified_diff": "@@ -1,158 +1,158 @@\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-\n-package org.apache.dubbo.registry;\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.CollectionUtils;\n-\n-import java.util.List;\n-\n-public class ListenerRegistryWrapper implements Registry {\n-    private static final Logger logger = LoggerFactory.getLogger(ListenerRegistryWrapper.class);\n-\n-    private final Registry registry;\n-    private final List<RegistryServiceListener> listeners;\n-\n-\n-    public ListenerRegistryWrapper(Registry registry, List<RegistryServiceListener> listeners) {\n-        this.registry = registry;\n-        this.listeners = listeners;\n-    }\n-\n-    @Override\n-    public URL getUrl() {\n-        return registry.getUrl();\n-    }\n-\n-    @Override\n-    public boolean isAvailable() {\n-        return registry.isAvailable();\n-    }\n-\n-    @Override\n-    public void destroy() {\n-        registry.destroy();\n-    }\n-\n-    @Override\n-    public void register(URL url) {\n-        try {\n-            registry.register(url);\n-        } finally {\n-            if (CollectionUtils.isNotEmpty(listeners)) {\n-                RuntimeException exception = null;\n-                for (RegistryServiceListener listener : listeners) {\n-                    if (listener != null) {\n-                        try {\n-                            listener.onRegister(url);\n-                        } catch (RuntimeException t) {\n-                            logger.error(t.getMessage(), t);\n-                            exception = t;\n-                        }\n-                    }\n-                }\n-                if (exception != null) {\n-                    throw exception;\n-                }\n-            }\n-        }\n-    }\n-\n-    @Override\n-    public void unregister(URL url) {\n-        try {\n-            registry.unregister(url);\n-        } finally {\n-            if (CollectionUtils.isNotEmpty(listeners)) {\n-                RuntimeException exception = null;\n-                for (RegistryServiceListener listener : listeners) {\n-                    if (listener != null) {\n-                        try {\n-                            listener.onUnregister(url);\n-                        } catch (RuntimeException t) {\n-                            logger.error(t.getMessage(), t);\n-                            exception = t;\n-                        }\n-                    }\n-                }\n-                if (exception != null) {\n-                    throw exception;\n-                }\n-            }\n-        }\n-    }\n-\n-    @Override\n-    public void subscribe(URL url, NotifyListener listener) {\n-        try {\n-            registry.subscribe(url, listener);\n-        } finally {\n-            if (CollectionUtils.isNotEmpty(listeners)) {\n-                RuntimeException exception = null;\n-                for (RegistryServiceListener registryListener : listeners) {\n-                    if (registryListener != null) {\n-                        try {\n-                            registryListener.onSubscribe(url);\n-                        } catch (RuntimeException t) {\n-                            logger.error(t.getMessage(), t);\n-                            exception = t;\n-                        }\n-                    }\n-                }\n-                if (exception != null) {\n-                    throw exception;\n-                }\n-            }\n-        }\n-    }\n-\n-    @Override\n-    public void unsubscribe(URL url, NotifyListener listener) {\n-        try {\n-            registry.unsubscribe(url, listener);\n-        } finally {\n-            if (CollectionUtils.isNotEmpty(listeners)) {\n-                RuntimeException exception = null;\n-                for (RegistryServiceListener registryListener : listeners) {\n-                    if (registryListener != null) {\n-                        try {\n-                            registryListener.onUnsubscribe(url);\n-                        } catch (RuntimeException t) {\n-                            logger.error(t.getMessage(), t);\n-                            exception = t;\n-                        }\n-                    }\n-                }\n-                if (exception != null) {\n-                    throw exception;\n-                }\n-            }\n-        }\n-    }\n-\n-    @Override\n-    public List<URL> lookup(URL url) {\n-        return registry.lookup(url);\n-    }\n-\n-    public Registry getRegistry() {\n-        return registry;\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+\r\n+package org.apache.dubbo.registry;\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.CollectionUtils;\r\n+\r\n+import java.util.List;\r\n+\r\n+public class ListenerRegistryWrapper implements Registry {\r\n+    private static final Logger logger = LoggerFactory.getLogger(ListenerRegistryWrapper.class);\r\n+\r\n+    private final Registry registry;\r\n+    private final List<RegistryServiceListener> listeners;\r\n+\r\n+\r\n+    public ListenerRegistryWrapper(Registry registry, List<RegistryServiceListener> listeners) {\r\n+        this.registry = registry;\r\n+        this.listeners = listeners;\r\n+    }\r\n+\r\n+    @Override\r\n+    public URL getUrl() {\r\n+        return registry.getUrl();\r\n+    }\r\n+\r\n+    @Override\r\n+    public boolean isAvailable() {\r\n+        return registry.isAvailable();\r\n+    }\r\n+\r\n+    @Override\r\n+    public void destroy() {\r\n+        registry.destroy();\r\n+    }\r\n+\r\n+    @Override\r\n+    public void register(URL url) {\r\n+        try {\r\n+            registry.register(url);\r\n+        } finally {\r\n+            if (CollectionUtils.isNotEmpty(listeners)) {\r\n+                RuntimeException exception = null;\r\n+                for (RegistryServiceListener listener : listeners) {\r\n+                    if (listener != null) {\r\n+                        try {\r\n+                            listener.onRegister(url);\r\n+                        } catch (RuntimeException t) {\r\n+                            logger.error(t.getMessage(), t);\r\n+                            exception = t;\r\n+                        }\r\n+                    }\r\n+                }\r\n+                if (exception != null) {\r\n+                    throw exception;\r\n+                }\r\n+            }\r\n+        }\r\n+    }\r\n+\r\n+    @Override\r\n+    public void unregister(URL url) {\r\n+        try {\r\n+            registry.unregister(url);\r\n+        } finally {\r\n+            if (CollectionUtils.isNotEmpty(listeners)) {\r\n+                RuntimeException exception = null;\r\n+                for (RegistryServiceListener listener : listeners) {\r\n+                    if (listener != null) {\r\n+                        try {\r\n+                            listener.onUnregister(url);\r\n+                        } catch (RuntimeException t) {\r\n+                            logger.error(t.getMessage(), t);\r\n+                            exception = t;\r\n+                        }\r\n+                    }\r\n+                }\r\n+                if (exception != null) {\r\n+                    throw exception;\r\n+                }\r\n+            }\r\n+        }\r\n+    }\r\n+\r\n+    @Override\r\n+    public void subscribe(URL url, NotifyListener listener) {\r\n+        try {\r\n+            registry.subscribe(url, listener);\r\n+        } finally {\r\n+            if (CollectionUtils.isNotEmpty(listeners)) {\r\n+                RuntimeException exception = null;\r\n+                for (RegistryServiceListener registryListener : listeners) {\r\n+                    if (registryListener != null) {\r\n+                        try {\r\n+                            registryListener.onSubscribe(url);\r\n+                        } catch (RuntimeException t) {\r\n+                            logger.error(t.getMessage(), t);\r\n+                            exception = t;\r\n+                        }\r\n+                    }\r\n+                }\r\n+                if (exception != null) {\r\n+                    throw exception;\r\n+                }\r\n+            }\r\n+        }\r\n+    }\r\n+\r\n+    @Override\r\n+    public void unsubscribe(URL url, NotifyListener listener) {\r\n+        try {\r\n+            registry.unsubscribe(url, listener);\r\n+        } finally {\r\n+            if (CollectionUtils.isNotEmpty(listeners)) {\r\n+                RuntimeException exception = null;\r\n+                for (RegistryServiceListener registryListener : listeners) {\r\n+                    if (registryListener != null) {\r\n+                        try {\r\n+                            registryListener.onUnsubscribe(url);\r\n+                        } catch (RuntimeException t) {\r\n+                            logger.error(t.getMessage(), t);\r\n+                            exception = t;\r\n+                        }\r\n+                    }\r\n+                }\r\n+                if (exception != null) {\r\n+                    throw exception;\r\n+                }\r\n+            }\r\n+        }\r\n+    }\r\n+\r\n+    @Override\r\n+    public List<URL> lookup(URL url) {\r\n+        return registry.lookup(url);\r\n+    }\r\n+\r\n+    public Registry getRegistry() {\r\n+        return registry;\r\n+    }\r\n+}\r\n"}, {"source1": "org/apache/dubbo/registry/RegistryFactoryWrapper.java", "source2": "org/apache/dubbo/registry/RegistryFactoryWrapper.java", "comments": ["Line-ending differences only"], "unified_diff": "@@ -1,38 +1,38 @@\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-\n-package org.apache.dubbo.registry;\n-\n-import org.apache.dubbo.common.URL;\n-import org.apache.dubbo.common.extension.ExtensionLoader;\n-\n-import java.util.Collections;\n-\n-public class RegistryFactoryWrapper implements RegistryFactory {\n-    private RegistryFactory registryFactory;\n-\n-    public RegistryFactoryWrapper(RegistryFactory registryFactory) {\n-        this.registryFactory = registryFactory;\n-    }\n-\n-    @Override\n-    public Registry getRegistry(URL url) {\n-        return new ListenerRegistryWrapper(registryFactory.getRegistry(url),\n-                Collections.unmodifiableList(ExtensionLoader.getExtensionLoader(RegistryServiceListener.class)\n-                        .getActivateExtension(url, \"registry.listeners\")));\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+\r\n+package org.apache.dubbo.registry;\r\n+\r\n+import org.apache.dubbo.common.URL;\r\n+import org.apache.dubbo.common.extension.ExtensionLoader;\r\n+\r\n+import java.util.Collections;\r\n+\r\n+public class RegistryFactoryWrapper implements RegistryFactory {\r\n+    private RegistryFactory registryFactory;\r\n+\r\n+    public RegistryFactoryWrapper(RegistryFactory registryFactory) {\r\n+        this.registryFactory = registryFactory;\r\n+    }\r\n+\r\n+    @Override\r\n+    public Registry getRegistry(URL url) {\r\n+        return new ListenerRegistryWrapper(registryFactory.getRegistry(url),\r\n+                Collections.unmodifiableList(ExtensionLoader.getExtensionLoader(RegistryServiceListener.class)\r\n+                        .getActivateExtension(url, \"registry.listeners\")));\r\n+    }\r\n+}\r\n"}, {"source1": "org/apache/dubbo/registry/RegistryServiceListener.java", "source2": "org/apache/dubbo/registry/RegistryServiceListener.java", "comments": ["Line-ending differences only"], "unified_diff": "@@ -1,41 +1,41 @@\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-\n-package org.apache.dubbo.registry;\n-\n-import org.apache.dubbo.common.URL;\n-import org.apache.dubbo.common.extension.SPI;\n-\n-@SPI\n-public interface RegistryServiceListener {\n-    default void onRegister(URL url) {\n-\n-    }\n-\n-\n-    default void onUnregister(URL url) {\n-\n-    }\n-\n-    default void onSubscribe(URL url) {\n-\n-    }\n-\n-    default void onUnsubscribe(URL url) {\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+\r\n+package org.apache.dubbo.registry;\r\n+\r\n+import org.apache.dubbo.common.URL;\r\n+import org.apache.dubbo.common.extension.SPI;\r\n+\r\n+@SPI\r\n+public interface RegistryServiceListener {\r\n+    default void onRegister(URL url) {\r\n+\r\n+    }\r\n+\r\n+\r\n+    default void onUnregister(URL url) {\r\n+\r\n+    }\r\n+\r\n+    default void onSubscribe(URL url) {\r\n+\r\n+    }\r\n+\r\n+    default void onUnsubscribe(URL url) {\r\n+\r\n+    }\r\n+}\r\n"}, {"source1": "org/apache/dubbo/registry/client/AbstractServiceDiscovery.java", "source2": "org/apache/dubbo/registry/client/AbstractServiceDiscovery.java", "comments": ["Line-ending differences only"], "unified_diff": "@@ -1,56 +1,56 @@\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.client;\n-\n-import static org.apache.dubbo.registry.client.metadata.ServiceInstanceMetadataUtils.isInstanceUpdated;\n-import static org.apache.dubbo.registry.client.metadata.ServiceInstanceMetadataUtils.resetInstanceUpdateKey;\n-\n-public abstract class AbstractServiceDiscovery implements ServiceDiscovery {\n-\n-    protected ServiceInstance serviceInstance;\n-\n-    @Override\n-    public ServiceInstance getLocalInstance() {\n-        return serviceInstance;\n-    }\n-\n-    @Override\n-    public final void register(ServiceInstance serviceInstance) throws RuntimeException {\n-        this.serviceInstance = serviceInstance;\n-        doRegister(serviceInstance);\n-    }\n-\n-    /**\n-     * It should be implement in kinds of service discovers.\n-     */\n-    public abstract void doRegister(ServiceInstance serviceInstance);\n-\n-    @Override\n-    public final void update(ServiceInstance serviceInstance) throws RuntimeException {\n-        if (!isInstanceUpdated(serviceInstance)) {\n-            return;\n-        }\n-        this.serviceInstance = serviceInstance;\n-        doUpdate(serviceInstance);\n-        resetInstanceUpdateKey(serviceInstance);\n-    }\n-\n-    /**\n-     * It should be implement in kinds of service discovers.\n-     */\n-    public abstract void doUpdate(ServiceInstance serviceInstance);\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.client;\r\n+\r\n+import static org.apache.dubbo.registry.client.metadata.ServiceInstanceMetadataUtils.isInstanceUpdated;\r\n+import static org.apache.dubbo.registry.client.metadata.ServiceInstanceMetadataUtils.resetInstanceUpdateKey;\r\n+\r\n+public abstract class AbstractServiceDiscovery implements ServiceDiscovery {\r\n+\r\n+    protected ServiceInstance serviceInstance;\r\n+\r\n+    @Override\r\n+    public ServiceInstance getLocalInstance() {\r\n+        return serviceInstance;\r\n+    }\r\n+\r\n+    @Override\r\n+    public final void register(ServiceInstance serviceInstance) throws RuntimeException {\r\n+        this.serviceInstance = serviceInstance;\r\n+        doRegister(serviceInstance);\r\n+    }\r\n+\r\n+    /**\r\n+     * It should be implement in kinds of service discovers.\r\n+     */\r\n+    public abstract void doRegister(ServiceInstance serviceInstance);\r\n+\r\n+    @Override\r\n+    public final void update(ServiceInstance serviceInstance) throws RuntimeException {\r\n+        if (!isInstanceUpdated(serviceInstance)) {\r\n+            return;\r\n+        }\r\n+        this.serviceInstance = serviceInstance;\r\n+        doUpdate(serviceInstance);\r\n+        resetInstanceUpdateKey(serviceInstance);\r\n+    }\r\n+\r\n+    /**\r\n+     * It should be implement in kinds of service discovers.\r\n+     */\r\n+    public abstract void doUpdate(ServiceInstance serviceInstance);\r\n+}\r\n"}, {"source1": "org/apache/dubbo/registry/client/AbstractServiceDiscoveryFactory.java", "source2": "org/apache/dubbo/registry/client/AbstractServiceDiscoveryFactory.java", "comments": ["Line-ending differences only"], "unified_diff": "@@ -1,42 +1,42 @@\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.client;\n-\n-import org.apache.dubbo.common.URL;\n-\n-import java.util.concurrent.ConcurrentHashMap;\n-import java.util.concurrent.ConcurrentMap;\n-\n-/**\n- * Abstract {@link ServiceDiscoveryFactory} implementation with cache, the subclass\n- * should implement {@link #createDiscovery(URL)} method to create an instance of {@link ServiceDiscovery}\n- *\n- * @see ServiceDiscoveryFactory\n- * @since 2.7.5\n- */\n-public abstract class AbstractServiceDiscoveryFactory implements ServiceDiscoveryFactory {\n-\n-    private final ConcurrentMap<String, ServiceDiscovery> discoveries = new ConcurrentHashMap<>();\n-\n-    @Override\n-    public ServiceDiscovery getServiceDiscovery(URL registryURL) {\n-        String key = registryURL.toServiceStringWithoutResolving();\n-        return discoveries.computeIfAbsent(key, k -> createDiscovery(registryURL));\n-    }\n-\n-    protected abstract ServiceDiscovery createDiscovery(URL registryURL);\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.client;\r\n+\r\n+import org.apache.dubbo.common.URL;\r\n+\r\n+import java.util.concurrent.ConcurrentHashMap;\r\n+import java.util.concurrent.ConcurrentMap;\r\n+\r\n+/**\r\n+ * Abstract {@link ServiceDiscoveryFactory} implementation with cache, the subclass\r\n+ * should implement {@link #createDiscovery(URL)} method to create an instance of {@link ServiceDiscovery}\r\n+ *\r\n+ * @see ServiceDiscoveryFactory\r\n+ * @since 2.7.5\r\n+ */\r\n+public abstract class AbstractServiceDiscoveryFactory implements ServiceDiscoveryFactory {\r\n+\r\n+    private final ConcurrentMap<String, ServiceDiscovery> discoveries = new ConcurrentHashMap<>();\r\n+\r\n+    @Override\r\n+    public ServiceDiscovery getServiceDiscovery(URL registryURL) {\r\n+        String key = registryURL.toServiceStringWithoutResolving();\r\n+        return discoveries.computeIfAbsent(key, k -> createDiscovery(registryURL));\r\n+    }\r\n+\r\n+    protected abstract ServiceDiscovery createDiscovery(URL registryURL);\r\n+}\r\n"}, {"source1": "org/apache/dubbo/registry/client/DefaultRegistryClusterIdentifier.java", "source2": "org/apache/dubbo/registry/client/DefaultRegistryClusterIdentifier.java", "comments": ["Line-ending differences only"], "unified_diff": "@@ -1,34 +1,34 @@\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.client;\n-\n-import org.apache.dubbo.common.URL;\n-\n-import static org.apache.dubbo.common.constants.CommonConstants.DEFAULT_KEY;\n-import static org.apache.dubbo.common.constants.RegistryConstants.REGISTRY_CLUSTER_KEY;\n-\n-public class DefaultRegistryClusterIdentifier implements RegistryClusterIdentifier {\n-    @Override\n-    public String providerKey(URL url) {\n-        return url.getParameter(REGISTRY_CLUSTER_KEY, DEFAULT_KEY);\n-    }\n-\n-    @Override\n-    public String consumerKey(URL url) {\n-        return url.getParameter(REGISTRY_CLUSTER_KEY);\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.client;\r\n+\r\n+import org.apache.dubbo.common.URL;\r\n+\r\n+import static org.apache.dubbo.common.constants.CommonConstants.DEFAULT_KEY;\r\n+import static org.apache.dubbo.common.constants.RegistryConstants.REGISTRY_CLUSTER_KEY;\r\n+\r\n+public class DefaultRegistryClusterIdentifier implements RegistryClusterIdentifier {\r\n+    @Override\r\n+    public String providerKey(URL url) {\r\n+        return url.getParameter(REGISTRY_CLUSTER_KEY, DEFAULT_KEY);\r\n+    }\r\n+\r\n+    @Override\r\n+    public String consumerKey(URL url) {\r\n+        return url.getParameter(REGISTRY_CLUSTER_KEY);\r\n+    }\r\n+}\r\n"}, {"source1": "org/apache/dubbo/registry/client/DefaultServiceDiscoveryFactory.java", "source2": "org/apache/dubbo/registry/client/DefaultServiceDiscoveryFactory.java", "comments": ["Line-ending 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.client;\n-\n-import org.apache.dubbo.common.URL;\n-import org.apache.dubbo.common.extension.ExtensionLoader;\n-import org.apache.dubbo.common.extension.SPI;\n-\n-import static org.apache.dubbo.common.extension.ExtensionLoader.getExtensionLoader;\n-\n-/**\n- * The default {@link SPI} implementation of {@link ServiceDiscoveryFactory} to {@link #getServiceDiscovery(URL) get the\n- * instance of ServiceDiscovery} via the {@link URL#getProtocol() protocol} from the {@link URL} that will connect\n- * the infrastructure of Service registration and discovery. The {@link URL#getProtocol() protocol} will be used as the\n- * extension name by which the {@link ServiceDiscovery} instance is loaded.\n- *\n- * @see AbstractServiceDiscoveryFactory\n- * @see EventPublishingServiceDiscovery\n- * @since 2.7.5\n- */\n-public class DefaultServiceDiscoveryFactory extends AbstractServiceDiscoveryFactory {\n-\n-    /**\n-     * Create the {@link ServiceDiscovery} by {@link URL#getProtocol() the protocol} from {@link URL connection URL}\n-     *\n-     * @param registryURL\n-     * @return\n-     */\n-    @Override\n-    protected ServiceDiscovery createDiscovery(URL registryURL) {\n-        String protocol = registryURL.getProtocol();\n-        ExtensionLoader<ServiceDiscovery> loader = getExtensionLoader(ServiceDiscovery.class);\n-        return loader.getExtension(protocol);\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.client;\r\n+\r\n+import org.apache.dubbo.common.URL;\r\n+import org.apache.dubbo.common.extension.ExtensionLoader;\r\n+import org.apache.dubbo.common.extension.SPI;\r\n+\r\n+import static org.apache.dubbo.common.extension.ExtensionLoader.getExtensionLoader;\r\n+\r\n+/**\r\n+ * The default {@link SPI} implementation of {@link ServiceDiscoveryFactory} to {@link #getServiceDiscovery(URL) get the\r\n+ * instance of ServiceDiscovery} via the {@link URL#getProtocol() protocol} from the {@link URL} that will connect\r\n+ * the infrastructure of Service registration and discovery. The {@link URL#getProtocol() protocol} will be used as the\r\n+ * extension name by which the {@link ServiceDiscovery} instance is loaded.\r\n+ *\r\n+ * @see AbstractServiceDiscoveryFactory\r\n+ * @see EventPublishingServiceDiscovery\r\n+ * @since 2.7.5\r\n+ */\r\n+public class DefaultServiceDiscoveryFactory extends AbstractServiceDiscoveryFactory {\r\n+\r\n+    /**\r\n+     * Create the {@link ServiceDiscovery} by {@link URL#getProtocol() the protocol} from {@link URL connection URL}\r\n+     *\r\n+     * @param registryURL\r\n+     * @return\r\n+     */\r\n+    @Override\r\n+    protected ServiceDiscovery createDiscovery(URL registryURL) {\r\n+        String protocol = registryURL.getProtocol();\r\n+        ExtensionLoader<ServiceDiscovery> loader = getExtensionLoader(ServiceDiscovery.class);\r\n+        return loader.getExtension(protocol);\r\n+    }\r\n+}\r\n"}, {"source1": "org/apache/dubbo/registry/client/DefaultServiceInstance.java", "source2": "org/apache/dubbo/registry/client/DefaultServiceInstance.java", "comments": ["Line-ending differences only"], "unified_diff": "@@ -1,221 +1,221 @@\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.client;\n-\n-import org.apache.dubbo.metadata.MetadataInfo;\n-\n-import java.util.HashMap;\n-import java.util.Map;\n-import java.util.Objects;\n-\n-import static org.apache.dubbo.common.constants.CommonConstants.REVISION_KEY;\n-\n-/**\n- * The default implementation of {@link ServiceInstance}.\n- *\n- * @since 2.7.5\n- */\n-public class DefaultServiceInstance implements ServiceInstance {\n-\n-    private static final long serialVersionUID = 1149677083747278100L;\n-\n-    private String id;\n-\n-    private String serviceName;\n-\n-    private String host;\n-\n-    private Integer port;\n-\n-    private boolean enabled;\n-\n-    private boolean healthy;\n-\n-    private Map<String, String> metadata = new HashMap<>();\n-\n-    private transient String address;\n-    private transient MetadataInfo serviceMetadata;\n-    // used at runtime\n-    private transient Map<String, String> extendParams = new HashMap<>();\n-\n-    public DefaultServiceInstance() {\n-    }\n-\n-    public DefaultServiceInstance(String id, String serviceName, String host, Integer port) {\n-        if (port != null && port.intValue() < 1) {\n-            throw new IllegalArgumentException(\"The port must be greater than zero!\");\n-        }\n-        this.id = id;\n-        this.serviceName = serviceName;\n-        this.host = host;\n-        this.port = port;\n-        this.enabled = true;\n-        this.healthy = true;\n-    }\n-\n-    public DefaultServiceInstance(String serviceName, String host, Integer port) {\n-        this(host + \":\" + port, serviceName, host, port);\n-    }\n-\n-    public void setId(String id) {\n-        this.id = id;\n-    }\n-\n-    public void setServiceName(String serviceName) {\n-        this.serviceName = serviceName;\n-    }\n-\n-    public void setHost(String host) {\n-        this.host = host;\n-    }\n-\n-    @Override\n-    public String getId() {\n-        return id;\n-    }\n-\n-    @Override\n-    public String getServiceName() {\n-        return serviceName;\n-    }\n-\n-    @Override\n-    public String getHost() {\n-        return host;\n-    }\n-\n-    public void setPort(Integer port) {\n-        this.port = port;\n-    }\n-\n-    @Override\n-    public Integer getPort() {\n-        return port;\n-    }\n-\n-    @Override\n-    public String getAddress() {\n-        if (address == null) {\n-            address = getAddress(host, port);\n-        }\n-        return address;\n-    }\n-\n-    private static String getAddress(String host, int port) {\n-        return port <= 0 ? host : host + ':' + port;\n-    }\n-\n-    @Override\n-    public boolean isEnabled() {\n-        return enabled;\n-    }\n-\n-    public void setEnabled(boolean enabled) {\n-        this.enabled = enabled;\n-    }\n-\n-    @Override\n-    public boolean isHealthy() {\n-        return healthy;\n-    }\n-\n-    public void setHealthy(boolean healthy) {\n-        this.healthy = healthy;\n-    }\n-\n-    @Override\n-    public Map<String, String> getMetadata() {\n-        return metadata;\n-    }\n-\n-    @Override\n-    public Map<String, String> getExtendParams() {\n-        return extendParams;\n-    }\n-\n-    @Override\n-    public Map<String, String> getAllParams() {\n-        Map<String, String> allParams = new HashMap<>((int) ((metadata.size() + extendParams.size()) / 0.75f + 1));\n-        allParams.putAll(metadata);\n-        allParams.putAll(extendParams);\n-        return allParams;\n-    }\n-\n-    public void setMetadata(Map<String, String> metadata) {\n-        this.metadata = metadata;\n-    }\n-\n-    public MetadataInfo getServiceMetadata() {\n-        return serviceMetadata;\n-    }\n-\n-    public void setServiceMetadata(MetadataInfo serviceMetadata) {\n-        this.serviceMetadata = serviceMetadata;\n-    }\n-\n-    @Override\n-    public InstanceAddressURL toURL() {\n-        return new InstanceAddressURL(this, serviceMetadata);\n-    }\n-\n-    @Override\n-    public boolean equals(Object o) {\n-        if (this == o) {\n-            return true;\n-        }\n-        if (!(o instanceof DefaultServiceInstance)) {\n-            return false;\n-        }\n-        DefaultServiceInstance that = (DefaultServiceInstance) o;\n-        boolean equals = Objects.equals(getServiceName(), that.getServiceName()) &&\n-                Objects.equals(getHost(), that.getHost()) &&\n-                Objects.equals(getPort(), that.getPort());\n-        for (Map.Entry<String, String> entry : this.getMetadata().entrySet()) {\n-            if (entry.getKey().equals(REVISION_KEY)) {\n-                continue;\n-            }\n-            equals = equals && entry.getValue().equals(that.getMetadata().get(entry.getKey()));\n-        }\n-\n-        return equals;\n-    }\n-\n-    @Override\n-    public int hashCode() {\n-        int result = Objects.hash(getServiceName(), getHost(), getPort());\n-        for (Map.Entry<String, String> entry : this.getMetadata().entrySet()) {\n-            if (entry.getKey().equals(REVISION_KEY)) {\n-                continue;\n-            }\n-            result = 31 * result + (entry.getValue() == null ? 0 : entry.getValue().hashCode());\n-        }\n-        return result;\n-    }\n-\n-    @Override\n-    public String toString() {\n-        return \"DefaultServiceInstance{\" +\n-                \"id='\" + id + '\\'' +\n-                \", serviceName='\" + serviceName + '\\'' +\n-                \", host='\" + host + '\\'' +\n-                \", port=\" + port +\n-                \", enabled=\" + enabled +\n-                \", healthy=\" + healthy +\n-                \", metadata=\" + metadata +\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.client;\r\n+\r\n+import org.apache.dubbo.metadata.MetadataInfo;\r\n+\r\n+import java.util.HashMap;\r\n+import java.util.Map;\r\n+import java.util.Objects;\r\n+\r\n+import static org.apache.dubbo.common.constants.CommonConstants.REVISION_KEY;\r\n+\r\n+/**\r\n+ * The default implementation of {@link ServiceInstance}.\r\n+ *\r\n+ * @since 2.7.5\r\n+ */\r\n+public class DefaultServiceInstance implements ServiceInstance {\r\n+\r\n+    private static final long serialVersionUID = 1149677083747278100L;\r\n+\r\n+    private String id;\r\n+\r\n+    private String serviceName;\r\n+\r\n+    private String host;\r\n+\r\n+    private Integer port;\r\n+\r\n+    private boolean enabled;\r\n+\r\n+    private boolean healthy;\r\n+\r\n+    private Map<String, String> metadata = new HashMap<>();\r\n+\r\n+    private transient String address;\r\n+    private transient MetadataInfo serviceMetadata;\r\n+    // used at runtime\r\n+    private transient Map<String, String> extendParams = new HashMap<>();\r\n+\r\n+    public DefaultServiceInstance() {\r\n+    }\r\n+\r\n+    public DefaultServiceInstance(String id, String serviceName, String host, Integer port) {\r\n+        if (port != null && port.intValue() < 1) {\r\n+            throw new IllegalArgumentException(\"The port must be greater than zero!\");\r\n+        }\r\n+        this.id = id;\r\n+        this.serviceName = serviceName;\r\n+        this.host = host;\r\n+        this.port = port;\r\n+        this.enabled = true;\r\n+        this.healthy = true;\r\n+    }\r\n+\r\n+    public DefaultServiceInstance(String serviceName, String host, Integer port) {\r\n+        this(host + \":\" + port, serviceName, host, port);\r\n+    }\r\n+\r\n+    public void setId(String id) {\r\n+        this.id = id;\r\n+    }\r\n+\r\n+    public void setServiceName(String serviceName) {\r\n+        this.serviceName = serviceName;\r\n+    }\r\n+\r\n+    public void setHost(String host) {\r\n+        this.host = host;\r\n+    }\r\n+\r\n+    @Override\r\n+    public String getId() {\r\n+        return id;\r\n+    }\r\n+\r\n+    @Override\r\n+    public String getServiceName() {\r\n+        return serviceName;\r\n+    }\r\n+\r\n+    @Override\r\n+    public String getHost() {\r\n+        return host;\r\n+    }\r\n+\r\n+    public void setPort(Integer port) {\r\n+        this.port = port;\r\n+    }\r\n+\r\n+    @Override\r\n+    public Integer getPort() {\r\n+        return port;\r\n+    }\r\n+\r\n+    @Override\r\n+    public String getAddress() {\r\n+        if (address == null) {\r\n+            address = getAddress(host, port);\r\n+        }\r\n+        return address;\r\n+    }\r\n+\r\n+    private static String getAddress(String host, int port) {\r\n+        return port <= 0 ? host : host + ':' + port;\r\n+    }\r\n+\r\n+    @Override\r\n+    public boolean isEnabled() {\r\n+        return enabled;\r\n+    }\r\n+\r\n+    public void setEnabled(boolean enabled) {\r\n+        this.enabled = enabled;\r\n+    }\r\n+\r\n+    @Override\r\n+    public boolean isHealthy() {\r\n+        return healthy;\r\n+    }\r\n+\r\n+    public void setHealthy(boolean healthy) {\r\n+        this.healthy = healthy;\r\n+    }\r\n+\r\n+    @Override\r\n+    public Map<String, String> getMetadata() {\r\n+        return metadata;\r\n+    }\r\n+\r\n+    @Override\r\n+    public Map<String, String> getExtendParams() {\r\n+        return extendParams;\r\n+    }\r\n+\r\n+    @Override\r\n+    public Map<String, String> getAllParams() {\r\n+        Map<String, String> allParams = new HashMap<>((int) ((metadata.size() + extendParams.size()) / 0.75f + 1));\r\n+        allParams.putAll(metadata);\r\n+        allParams.putAll(extendParams);\r\n+        return allParams;\r\n+    }\r\n+\r\n+    public void setMetadata(Map<String, String> metadata) {\r\n+        this.metadata = metadata;\r\n+    }\r\n+\r\n+    public MetadataInfo getServiceMetadata() {\r\n+        return serviceMetadata;\r\n+    }\r\n+\r\n+    public void setServiceMetadata(MetadataInfo serviceMetadata) {\r\n+        this.serviceMetadata = serviceMetadata;\r\n+    }\r\n+\r\n+    @Override\r\n+    public InstanceAddressURL toURL() {\r\n+        return new InstanceAddressURL(this, serviceMetadata);\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 DefaultServiceInstance)) {\r\n+            return false;\r\n+        }\r\n+        DefaultServiceInstance that = (DefaultServiceInstance) o;\r\n+        boolean equals = Objects.equals(getServiceName(), that.getServiceName()) &&\r\n+                Objects.equals(getHost(), that.getHost()) &&\r\n+                Objects.equals(getPort(), that.getPort());\r\n+        for (Map.Entry<String, String> entry : this.getMetadata().entrySet()) {\r\n+            if (entry.getKey().equals(REVISION_KEY)) {\r\n+                continue;\r\n+            }\r\n+            equals = equals && entry.getValue().equals(that.getMetadata().get(entry.getKey()));\r\n+        }\r\n+\r\n+        return equals;\r\n+    }\r\n+\r\n+    @Override\r\n+    public int hashCode() {\r\n+        int result = Objects.hash(getServiceName(), getHost(), getPort());\r\n+        for (Map.Entry<String, String> entry : this.getMetadata().entrySet()) {\r\n+            if (entry.getKey().equals(REVISION_KEY)) {\r\n+                continue;\r\n+            }\r\n+            result = 31 * result + (entry.getValue() == null ? 0 : entry.getValue().hashCode());\r\n+        }\r\n+        return result;\r\n+    }\r\n+\r\n+    @Override\r\n+    public String toString() {\r\n+        return \"DefaultServiceInstance{\" +\r\n+                \"id='\" + id + '\\'' +\r\n+                \", serviceName='\" + serviceName + '\\'' +\r\n+                \", host='\" + host + '\\'' +\r\n+                \", port=\" + port +\r\n+                \", enabled=\" + enabled +\r\n+                \", healthy=\" + healthy +\r\n+                \", metadata=\" + metadata +\r\n+                '}';\r\n+    }\r\n+}\r\n"}, {"source1": "org/apache/dubbo/registry/client/EventPublishingServiceDiscovery.java", "source2": "org/apache/dubbo/registry/client/EventPublishingServiceDiscovery.java", "comments": ["Line-ending differences only"], "unified_diff": "@@ -1,315 +1,315 @@\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.client;\n-\n-import org.apache.dubbo.common.URL;\n-import org.apache.dubbo.common.function.ThrowableAction;\n-import org.apache.dubbo.common.logger.Logger;\n-import org.apache.dubbo.common.logger.LoggerFactory;\n-import org.apache.dubbo.common.utils.Page;\n-import org.apache.dubbo.event.Event;\n-import org.apache.dubbo.event.EventDispatcher;\n-import org.apache.dubbo.registry.client.event.ServiceDiscoveryDestroyedEvent;\n-import org.apache.dubbo.registry.client.event.ServiceDiscoveryDestroyingEvent;\n-import org.apache.dubbo.registry.client.event.ServiceDiscoveryExceptionEvent;\n-import org.apache.dubbo.registry.client.event.ServiceDiscoveryInitializedEvent;\n-import org.apache.dubbo.registry.client.event.ServiceDiscoveryInitializingEvent;\n-import org.apache.dubbo.registry.client.event.ServiceInstancePreRegisteredEvent;\n-import org.apache.dubbo.registry.client.event.ServiceInstancePreUnregisteredEvent;\n-import org.apache.dubbo.registry.client.event.ServiceInstanceRegisteredEvent;\n-import org.apache.dubbo.registry.client.event.ServiceInstanceUnregisteredEvent;\n-import org.apache.dubbo.registry.client.event.listener.ServiceInstancesChangedListener;\n-\n-import java.util.List;\n-import java.util.Map;\n-import java.util.Optional;\n-import java.util.Set;\n-import java.util.concurrent.atomic.AtomicBoolean;\n-\n-import static java.util.Optional.empty;\n-import static java.util.Optional.of;\n-\n-/**\n- * The decorating implementation of {@link ServiceDiscovery} to published the {@link Event Dubbo event} when some actions are\n- * executing, including:\n- * <ul>\n- * <li>Lifecycle actions:</li>\n- * <table cellpadding=\"0\" cellspacing=\"0\" border=\"1\">\n- * <thead>\n- * <tr>\n- * <th>Action</th>\n- * <th>before</th>\n- * <th>After</th>\n- * </tr>\n- * </thead>\n- * <tbody>\n- * <tr>\n- * <td>{@link #INITIALIZE_ACTION start}</td>\n- * <td>{@link ServiceDiscoveryInitializingEvent}</td>\n- * <td>{@link ServiceDiscoveryInitializedEvent}</td>\n- * </tr>\n- * <tr>\n- * <td>{@link #DESTROY_ACTION stop}</td>\n- * <td>{@link ServiceDiscoveryDestroyingEvent}</td>\n- * <td>{@link ServiceDiscoveryDestroyedEvent}</td>\n- * </tr>\n- * </tbody>\n- * </table>\n- * <li>Registration actions:</li>\n- * <table cellpadding=\"0\" cellspacing=\"0\" border=\"1\">\n- * <thead>\n- * <tr>\n- * <th>Action</th>\n- * <th>before</th>\n- * <th>After</th>\n- * </tr>\n- * </thead>\n- * <tbody>\n- * <tr>\n- * <td>{@link #REGISTER_ACTION register}</td>\n- * <td>{@link ServiceInstancePreRegisteredEvent}</td>\n- * <td>{@link ServiceInstanceRegisteredEvent}</td>\n- * </tr>\n- * <tr>\n- * <td>{@link #UPDATE_ACTION update}</td>\n- * <td>N/A</td>\n- * <td>N/A</td>\n- * </tr>\n- * <tr>\n- * <td>{@link #UNREGISTER_ACTION unregister}</td>\n- * <td>N/A</td>\n- * <td>N/A</td>\n- * </tr>\n- * </tbody>\n- * </table>\n- * </ul>\n- *\n- * @see ServiceDiscovery\n- * @see ServiceDiscoveryInitializingEvent\n- * @see ServiceDiscoveryInitializedEvent\n- * @see ServiceInstancePreRegisteredEvent\n- * @see ServiceInstanceRegisteredEvent\n- * @see ServiceDiscoveryDestroyingEvent\n- * @see ServiceDiscoveryDestroyedEvent\n- * @since 2.7.5\n- */\n-final class EventPublishingServiceDiscovery implements ServiceDiscovery {\n-\n-    /**\n-     * @see ServiceInstancePreRegisteredEvent\n-     * @see ServiceInstanceRegisteredEvent\n-     */\n-    protected static final String REGISTER_ACTION = \"register\";\n-\n-    protected static final String UPDATE_ACTION = \"update\";\n-\n-    protected static final String UNREGISTER_ACTION = \"unregister\";\n-\n-    /**\n-     * @see ServiceDiscoveryInitializingEvent\n-     * @see ServiceDiscoveryInitializedEvent\n-     */\n-    protected static final String INITIALIZE_ACTION = \"initialize\";\n-\n-    /**\n-     * @see ServiceDiscoveryDestroyingEvent\n-     * @see ServiceDiscoveryDestroyedEvent\n-     */\n-    protected static final String DESTROY_ACTION = \"destroy\";\n-\n-    protected final EventDispatcher eventDispatcher = EventDispatcher.getDefaultExtension();\n-\n-    protected final AtomicBoolean initialized = new AtomicBoolean(false);\n-\n-    protected final AtomicBoolean destroyed = new AtomicBoolean(false);\n-\n-    protected final Logger logger = LoggerFactory.getLogger(getClass());\n-\n-    private final ServiceDiscovery serviceDiscovery;\n-\n-    protected EventPublishingServiceDiscovery(ServiceDiscovery serviceDiscovery) {\n-        if (serviceDiscovery == null) {\n-            throw new NullPointerException(\"The ServiceDiscovery argument must not be null!\");\n-        }\n-        this.serviceDiscovery = serviceDiscovery;\n-    }\n-\n-    @Override\n-    public final void register(ServiceInstance serviceInstance) throws RuntimeException {\n-\n-        assertDestroyed(REGISTER_ACTION);\n-        assertInitialized(REGISTER_ACTION);\n-\n-        executeWithEvents(\n-                of(new ServiceInstancePreRegisteredEvent(serviceDiscovery, serviceInstance)),\n-                () -> serviceDiscovery.register(serviceInstance),\n-                of(new ServiceInstanceRegisteredEvent(serviceDiscovery, serviceInstance))\n-        );\n-    }\n-\n-    @Override\n-    public final void update(ServiceInstance serviceInstance) throws RuntimeException {\n-\n-        assertDestroyed(UPDATE_ACTION);\n-        assertInitialized(UPDATE_ACTION);\n-\n-        executeWithEvents(\n-                empty(),\n-                () -> serviceDiscovery.update(serviceInstance),\n-                empty()\n-        );\n-    }\n-\n-    @Override\n-    public final void unregister(ServiceInstance serviceInstance) throws RuntimeException {\n-\n-        assertDestroyed(UNREGISTER_ACTION);\n-        assertInitialized(UNREGISTER_ACTION);\n-\n-        executeWithEvents(\n-                of(new ServiceInstancePreUnregisteredEvent(this, serviceInstance)),\n-                () -> serviceDiscovery.unregister(serviceInstance),\n-                of(new ServiceInstanceUnregisteredEvent(this, serviceInstance))\n-        );\n-    }\n-\n-    @Override\n-    public Set<String> getServices() {\n-        return serviceDiscovery.getServices();\n-    }\n-\n-    @Override\n-    public List<ServiceInstance> getInstances(String serviceName) throws NullPointerException {\n-        return serviceDiscovery.getInstances(serviceName);\n-    }\n-\n-    @Override\n-    public Page<ServiceInstance> getInstances(String serviceName, int offset, int pageSize) throws NullPointerException, IllegalArgumentException {\n-        return serviceDiscovery.getInstances(serviceName, offset, pageSize);\n-    }\n-\n-    @Override\n-    public Page<ServiceInstance> getInstances(String serviceName, int offset, int pageSize, boolean healthyOnly) throws NullPointerException, IllegalArgumentException {\n-        return serviceDiscovery.getInstances(serviceName, offset, pageSize, healthyOnly);\n-    }\n-\n-    @Override\n-    public Map<String, Page<ServiceInstance>> getInstances(Iterable<String> serviceNames, int offset, int requestSize) throws NullPointerException, IllegalArgumentException {\n-        return serviceDiscovery.getInstances(serviceNames, offset, requestSize);\n-    }\n-\n-    @Override\n-    public String toString() {\n-        return serviceDiscovery.toString();\n-    }\n-\n-    @Override\n-    public void addServiceInstancesChangedListener(ServiceInstancesChangedListener listener) throws NullPointerException, IllegalArgumentException {\n-        serviceDiscovery.addServiceInstancesChangedListener(listener);\n-        eventDispatcher.addEventListener(listener);\n-    }\n-\n-    @Override\n-    public URL getUrl() {\n-        return serviceDiscovery.getUrl();\n-    }\n-\n-    @Override\n-    public ServiceInstance getLocalInstance() {\n-        return serviceDiscovery.getLocalInstance();\n-    }\n-\n-    @Override\n-    public void initialize(URL registryURL) {\n-\n-        assertInitialized(INITIALIZE_ACTION);\n-\n-        if (isInitialized()) {\n-            if (logger.isWarnEnabled()) {\n-                logger.warn(\"It's ignored to start current ServiceDiscovery, because it has been started.\");\n-            }\n-            return;\n-        }\n-\n-        executeWithEvents(\n-                of(new ServiceDiscoveryInitializingEvent(this, serviceDiscovery)),\n-                () -> serviceDiscovery.initialize(registryURL),\n-                of(new ServiceDiscoveryInitializedEvent(this, serviceDiscovery))\n-        );\n-\n-        // doesn't start -> started\n-        initialized.compareAndSet(false, true);\n-    }\n-\n-    @Override\n-    public void destroy() {\n-\n-        assertDestroyed(DESTROY_ACTION);\n-\n-        if (isDestroyed()) {\n-            if (logger.isWarnEnabled()) {\n-                logger.warn(\"It's ignored to stop current ServiceDiscovery, because it has been stopped.\");\n-            }\n-            return;\n-        }\n-\n-        executeWithEvents(\n-                of(new ServiceDiscoveryDestroyingEvent(this, serviceDiscovery)),\n-                serviceDiscovery::destroy,\n-                of(new ServiceDiscoveryDestroyedEvent(this, serviceDiscovery))\n-        );\n-\n-        // doesn't stop -> stopped\n-        destroyed.compareAndSet(false, true);\n-    }\n-\n-    protected final void executeWithEvents(Optional<? extends Event> beforeEvent,\n-                                           ThrowableAction action,\n-                                           Optional<? extends Event> afterEvent) {\n-        beforeEvent.ifPresent(this::dispatchEvent);\n-        try {\n-            action.execute();\n-        } catch (Throwable e) {\n-            dispatchEvent(new ServiceDiscoveryExceptionEvent(this, serviceDiscovery, e));\n-        }\n-        afterEvent.ifPresent(this::dispatchEvent);\n-    }\n-\n-    private void dispatchEvent(Event event) {\n-        eventDispatcher.dispatch(event);\n-    }\n-\n-    public final boolean isInitialized() {\n-        return initialized.get();\n-    }\n-\n-    public final boolean isDestroyed() {\n-        return destroyed.get();\n-    }\n-\n-    protected void assertDestroyed(String action) throws IllegalStateException {\n-        if (!isInitialized()) {\n-            throw new IllegalStateException(\"The action[\" + action + \"] is rejected, because the ServiceDiscovery is not initialized yet.\");\n-        }\n-    }\n-\n-    protected void assertInitialized(String action) throws IllegalStateException {\n-        if (isDestroyed()) {\n-            throw new IllegalStateException(\"The action[\" + action + \"] is rejected, because the ServiceDiscovery is destroyed already.\");\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.client;\r\n+\r\n+import org.apache.dubbo.common.URL;\r\n+import org.apache.dubbo.common.function.ThrowableAction;\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.Page;\r\n+import org.apache.dubbo.event.Event;\r\n+import org.apache.dubbo.event.EventDispatcher;\r\n+import org.apache.dubbo.registry.client.event.ServiceDiscoveryDestroyedEvent;\r\n+import org.apache.dubbo.registry.client.event.ServiceDiscoveryDestroyingEvent;\r\n+import org.apache.dubbo.registry.client.event.ServiceDiscoveryExceptionEvent;\r\n+import org.apache.dubbo.registry.client.event.ServiceDiscoveryInitializedEvent;\r\n+import org.apache.dubbo.registry.client.event.ServiceDiscoveryInitializingEvent;\r\n+import org.apache.dubbo.registry.client.event.ServiceInstancePreRegisteredEvent;\r\n+import org.apache.dubbo.registry.client.event.ServiceInstancePreUnregisteredEvent;\r\n+import org.apache.dubbo.registry.client.event.ServiceInstanceRegisteredEvent;\r\n+import org.apache.dubbo.registry.client.event.ServiceInstanceUnregisteredEvent;\r\n+import org.apache.dubbo.registry.client.event.listener.ServiceInstancesChangedListener;\r\n+\r\n+import java.util.List;\r\n+import java.util.Map;\r\n+import java.util.Optional;\r\n+import java.util.Set;\r\n+import java.util.concurrent.atomic.AtomicBoolean;\r\n+\r\n+import static java.util.Optional.empty;\r\n+import static java.util.Optional.of;\r\n+\r\n+/**\r\n+ * The decorating implementation of {@link ServiceDiscovery} to published the {@link Event Dubbo event} when some actions are\r\n+ * executing, including:\r\n+ * <ul>\r\n+ * <li>Lifecycle actions:</li>\r\n+ * <table cellpadding=\"0\" cellspacing=\"0\" border=\"1\">\r\n+ * <thead>\r\n+ * <tr>\r\n+ * <th>Action</th>\r\n+ * <th>before</th>\r\n+ * <th>After</th>\r\n+ * </tr>\r\n+ * </thead>\r\n+ * <tbody>\r\n+ * <tr>\r\n+ * <td>{@link #INITIALIZE_ACTION start}</td>\r\n+ * <td>{@link ServiceDiscoveryInitializingEvent}</td>\r\n+ * <td>{@link ServiceDiscoveryInitializedEvent}</td>\r\n+ * </tr>\r\n+ * <tr>\r\n+ * <td>{@link #DESTROY_ACTION stop}</td>\r\n+ * <td>{@link ServiceDiscoveryDestroyingEvent}</td>\r\n+ * <td>{@link ServiceDiscoveryDestroyedEvent}</td>\r\n+ * </tr>\r\n+ * </tbody>\r\n+ * </table>\r\n+ * <li>Registration actions:</li>\r\n+ * <table cellpadding=\"0\" cellspacing=\"0\" border=\"1\">\r\n+ * <thead>\r\n+ * <tr>\r\n+ * <th>Action</th>\r\n+ * <th>before</th>\r\n+ * <th>After</th>\r\n+ * </tr>\r\n+ * </thead>\r\n+ * <tbody>\r\n+ * <tr>\r\n+ * <td>{@link #REGISTER_ACTION register}</td>\r\n+ * <td>{@link ServiceInstancePreRegisteredEvent}</td>\r\n+ * <td>{@link ServiceInstanceRegisteredEvent}</td>\r\n+ * </tr>\r\n+ * <tr>\r\n+ * <td>{@link #UPDATE_ACTION update}</td>\r\n+ * <td>N/A</td>\r\n+ * <td>N/A</td>\r\n+ * </tr>\r\n+ * <tr>\r\n+ * <td>{@link #UNREGISTER_ACTION unregister}</td>\r\n+ * <td>N/A</td>\r\n+ * <td>N/A</td>\r\n+ * </tr>\r\n+ * </tbody>\r\n+ * </table>\r\n+ * </ul>\r\n+ *\r\n+ * @see ServiceDiscovery\r\n+ * @see ServiceDiscoveryInitializingEvent\r\n+ * @see ServiceDiscoveryInitializedEvent\r\n+ * @see ServiceInstancePreRegisteredEvent\r\n+ * @see ServiceInstanceRegisteredEvent\r\n+ * @see ServiceDiscoveryDestroyingEvent\r\n+ * @see ServiceDiscoveryDestroyedEvent\r\n+ * @since 2.7.5\r\n+ */\r\n+final class EventPublishingServiceDiscovery implements ServiceDiscovery {\r\n+\r\n+    /**\r\n+     * @see ServiceInstancePreRegisteredEvent\r\n+     * @see ServiceInstanceRegisteredEvent\r\n+     */\r\n+    protected static final String REGISTER_ACTION = \"register\";\r\n+\r\n+    protected static final String UPDATE_ACTION = \"update\";\r\n+\r\n+    protected static final String UNREGISTER_ACTION = \"unregister\";\r\n+\r\n+    /**\r\n+     * @see ServiceDiscoveryInitializingEvent\r\n+     * @see ServiceDiscoveryInitializedEvent\r\n+     */\r\n+    protected static final String INITIALIZE_ACTION = \"initialize\";\r\n+\r\n+    /**\r\n+     * @see ServiceDiscoveryDestroyingEvent\r\n+     * @see ServiceDiscoveryDestroyedEvent\r\n+     */\r\n+    protected static final String DESTROY_ACTION = \"destroy\";\r\n+\r\n+    protected final EventDispatcher eventDispatcher = EventDispatcher.getDefaultExtension();\r\n+\r\n+    protected final AtomicBoolean initialized = new AtomicBoolean(false);\r\n+\r\n+    protected final AtomicBoolean destroyed = new AtomicBoolean(false);\r\n+\r\n+    protected final Logger logger = LoggerFactory.getLogger(getClass());\r\n+\r\n+    private final ServiceDiscovery serviceDiscovery;\r\n+\r\n+    protected EventPublishingServiceDiscovery(ServiceDiscovery serviceDiscovery) {\r\n+        if (serviceDiscovery == null) {\r\n+            throw new NullPointerException(\"The ServiceDiscovery argument must not be null!\");\r\n+        }\r\n+        this.serviceDiscovery = serviceDiscovery;\r\n+    }\r\n+\r\n+    @Override\r\n+    public final void register(ServiceInstance serviceInstance) throws RuntimeException {\r\n+\r\n+        assertDestroyed(REGISTER_ACTION);\r\n+        assertInitialized(REGISTER_ACTION);\r\n+\r\n+        executeWithEvents(\r\n+                of(new ServiceInstancePreRegisteredEvent(serviceDiscovery, serviceInstance)),\r\n+                () -> serviceDiscovery.register(serviceInstance),\r\n+                of(new ServiceInstanceRegisteredEvent(serviceDiscovery, serviceInstance))\r\n+        );\r\n+    }\r\n+\r\n+    @Override\r\n+    public final void update(ServiceInstance serviceInstance) throws RuntimeException {\r\n+\r\n+        assertDestroyed(UPDATE_ACTION);\r\n+        assertInitialized(UPDATE_ACTION);\r\n+\r\n+        executeWithEvents(\r\n+                empty(),\r\n+                () -> serviceDiscovery.update(serviceInstance),\r\n+                empty()\r\n+        );\r\n+    }\r\n+\r\n+    @Override\r\n+    public final void unregister(ServiceInstance serviceInstance) throws RuntimeException {\r\n+\r\n+        assertDestroyed(UNREGISTER_ACTION);\r\n+        assertInitialized(UNREGISTER_ACTION);\r\n+\r\n+        executeWithEvents(\r\n+                of(new ServiceInstancePreUnregisteredEvent(this, serviceInstance)),\r\n+                () -> serviceDiscovery.unregister(serviceInstance),\r\n+                of(new ServiceInstanceUnregisteredEvent(this, serviceInstance))\r\n+        );\r\n+    }\r\n+\r\n+    @Override\r\n+    public Set<String> getServices() {\r\n+        return serviceDiscovery.getServices();\r\n+    }\r\n+\r\n+    @Override\r\n+    public List<ServiceInstance> getInstances(String serviceName) throws NullPointerException {\r\n+        return serviceDiscovery.getInstances(serviceName);\r\n+    }\r\n+\r\n+    @Override\r\n+    public Page<ServiceInstance> getInstances(String serviceName, int offset, int pageSize) throws NullPointerException, IllegalArgumentException {\r\n+        return serviceDiscovery.getInstances(serviceName, offset, pageSize);\r\n+    }\r\n+\r\n+    @Override\r\n+    public Page<ServiceInstance> getInstances(String serviceName, int offset, int pageSize, boolean healthyOnly) throws NullPointerException, IllegalArgumentException {\r\n+        return serviceDiscovery.getInstances(serviceName, offset, pageSize, healthyOnly);\r\n+    }\r\n+\r\n+    @Override\r\n+    public Map<String, Page<ServiceInstance>> getInstances(Iterable<String> serviceNames, int offset, int requestSize) throws NullPointerException, IllegalArgumentException {\r\n+        return serviceDiscovery.getInstances(serviceNames, offset, requestSize);\r\n+    }\r\n+\r\n+    @Override\r\n+    public String toString() {\r\n+        return serviceDiscovery.toString();\r\n+    }\r\n+\r\n+    @Override\r\n+    public void addServiceInstancesChangedListener(ServiceInstancesChangedListener listener) throws NullPointerException, IllegalArgumentException {\r\n+        serviceDiscovery.addServiceInstancesChangedListener(listener);\r\n+        eventDispatcher.addEventListener(listener);\r\n+    }\r\n+\r\n+    @Override\r\n+    public URL getUrl() {\r\n+        return serviceDiscovery.getUrl();\r\n+    }\r\n+\r\n+    @Override\r\n+    public ServiceInstance getLocalInstance() {\r\n+        return serviceDiscovery.getLocalInstance();\r\n+    }\r\n+\r\n+    @Override\r\n+    public void initialize(URL registryURL) {\r\n+\r\n+        assertInitialized(INITIALIZE_ACTION);\r\n+\r\n+        if (isInitialized()) {\r\n+            if (logger.isWarnEnabled()) {\r\n+                logger.warn(\"It's ignored to start current ServiceDiscovery, because it has been started.\");\r\n+            }\r\n+            return;\r\n+        }\r\n+\r\n+        executeWithEvents(\r\n+                of(new ServiceDiscoveryInitializingEvent(this, serviceDiscovery)),\r\n+                () -> serviceDiscovery.initialize(registryURL),\r\n+                of(new ServiceDiscoveryInitializedEvent(this, serviceDiscovery))\r\n+        );\r\n+\r\n+        // doesn't start -> started\r\n+        initialized.compareAndSet(false, true);\r\n+    }\r\n+\r\n+    @Override\r\n+    public void destroy() {\r\n+\r\n+        assertDestroyed(DESTROY_ACTION);\r\n+\r\n+        if (isDestroyed()) {\r\n+            if (logger.isWarnEnabled()) {\r\n+                logger.warn(\"It's ignored to stop current ServiceDiscovery, because it has been stopped.\");\r\n+            }\r\n+            return;\r\n+        }\r\n+\r\n+        executeWithEvents(\r\n+                of(new ServiceDiscoveryDestroyingEvent(this, serviceDiscovery)),\r\n+                serviceDiscovery::destroy,\r\n+                of(new ServiceDiscoveryDestroyedEvent(this, serviceDiscovery))\r\n+        );\r\n+\r\n+        // doesn't stop -> stopped\r\n+        destroyed.compareAndSet(false, true);\r\n+    }\r\n+\r\n+    protected final void executeWithEvents(Optional<? extends Event> beforeEvent,\r\n+                                           ThrowableAction action,\r\n+                                           Optional<? extends Event> afterEvent) {\r\n+        beforeEvent.ifPresent(this::dispatchEvent);\r\n+        try {\r\n+            action.execute();\r\n+        } catch (Throwable e) {\r\n+            dispatchEvent(new ServiceDiscoveryExceptionEvent(this, serviceDiscovery, e));\r\n+        }\r\n+        afterEvent.ifPresent(this::dispatchEvent);\r\n+    }\r\n+\r\n+    private void dispatchEvent(Event event) {\r\n+        eventDispatcher.dispatch(event);\r\n+    }\r\n+\r\n+    public final boolean isInitialized() {\r\n+        return initialized.get();\r\n+    }\r\n+\r\n+    public final boolean isDestroyed() {\r\n+        return destroyed.get();\r\n+    }\r\n+\r\n+    protected void assertDestroyed(String action) throws IllegalStateException {\r\n+        if (!isInitialized()) {\r\n+            throw new IllegalStateException(\"The action[\" + action + \"] is rejected, because the ServiceDiscovery is not initialized yet.\");\r\n+        }\r\n+    }\r\n+\r\n+    protected void assertInitialized(String action) throws IllegalStateException {\r\n+        if (isDestroyed()) {\r\n+            throw new IllegalStateException(\"The action[\" + action + \"] is rejected, because the ServiceDiscovery is destroyed already.\");\r\n+        }\r\n+    }\r\n+}\r\n"}, {"source1": "org/apache/dubbo/registry/client/FileSystemServiceDiscovery.java", "source2": "org/apache/dubbo/registry/client/FileSystemServiceDiscovery.java", "comments": ["Line-ending differences only"], "unified_diff": "@@ -1,221 +1,221 @@\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.client;\n-\n-import org.apache.dubbo.common.URL;\n-import org.apache.dubbo.common.config.configcenter.ConfigChangedEvent;\n-import org.apache.dubbo.common.config.configcenter.file.FileSystemDynamicConfiguration;\n-import org.apache.dubbo.common.lang.ShutdownHookCallbacks;\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.event.EventListener;\n-import org.apache.dubbo.registry.client.event.ServiceInstancesChangedEvent;\n-\n-import com.alibaba.fastjson.JSON;\n-import org.apache.commons.io.FileUtils;\n-\n-import java.io.File;\n-import java.io.IOException;\n-import java.nio.channels.FileChannel;\n-import java.nio.channels.FileLock;\n-import java.nio.file.LinkOption;\n-import java.nio.file.Path;\n-import java.nio.file.StandardOpenOption;\n-import java.util.List;\n-import java.util.Map;\n-import java.util.Set;\n-import java.util.concurrent.ConcurrentHashMap;\n-import java.util.stream.Collectors;\n-\n-import static com.alibaba.fastjson.JSON.toJSONString;\n-import static java.lang.String.format;\n-import static java.nio.channels.FileChannel.open;\n-import static org.apache.dubbo.common.config.configcenter.DynamicConfiguration.DEFAULT_GROUP;\n-import static org.apache.dubbo.common.config.configcenter.file.FileSystemDynamicConfiguration.CONFIG_CENTER_DIR_PARAM_NAME;\n-\n-/**\n- * File System {@link ServiceDiscovery} implementation\n- *\n- * @see FileSystemDynamicConfiguration\n- * @since 2.7.5\n- */\n-public class FileSystemServiceDiscovery extends AbstractServiceDiscovery implements EventListener<ServiceInstancesChangedEvent> {\n-\n-    private final Logger logger = LoggerFactory.getLogger(getClass());\n-\n-    private final Map<File, FileLock> fileLocksCache = new ConcurrentHashMap<>();\n-\n-    private FileSystemDynamicConfiguration dynamicConfiguration;\n-\n-    @Override\n-    public void onEvent(ServiceInstancesChangedEvent event) {\n-\n-    }\n-\n-    @Override\n-    public void initialize(URL registryURL) throws Exception {\n-        dynamicConfiguration = createDynamicConfiguration(registryURL);\n-        registerDubboShutdownHook();\n-        registerListener();\n-    }\n-\n-    private void registerDubboShutdownHook() {\n-        ShutdownHookCallbacks.INSTANCE.addCallback(this::destroy);\n-    }\n-\n-    private void registerListener() {\n-        getServices().forEach(serviceName -> {\n-            dynamicConfiguration.getConfigKeys(DEFAULT_GROUP).forEach(serviceInstanceId -> {\n-                dynamicConfiguration.addListener(serviceInstanceId, serviceName, this::onConfigChanged);\n-            });\n-        });\n-    }\n-\n-    public void onConfigChanged(ConfigChangedEvent event) {\n-\n-    }\n-\n-    @Override\n-    public void destroy() throws Exception {\n-        dynamicConfiguration.close();\n-        releaseAndRemoveRegistrationFiles();\n-    }\n-\n-    private void releaseAndRemoveRegistrationFiles() {\n-        fileLocksCache.keySet().forEach(file -> {\n-            releaseFileLock(file);\n-            removeFile(file);\n-        });\n-    }\n-\n-    private void removeFile(File file) {\n-        FileUtils.deleteQuietly(file);\n-    }\n-\n-    private String getServiceInstanceId(ServiceInstance serviceInstance) {\n-        String id = serviceInstance.getId();\n-        if (StringUtils.isBlank(id)) {\n-            return serviceInstance.getHost() + \".\" + serviceInstance.getPort();\n-        }\n-        return id;\n-    }\n-\n-    private String getServiceName(ServiceInstance serviceInstance) {\n-        return serviceInstance.getServiceName();\n-    }\n-\n-    @Override\n-    public List<ServiceInstance> getInstances(String serviceName) {\n-        return dynamicConfiguration.getConfigKeys(DEFAULT_GROUP)\n-                .stream()\n-                .map(serviceInstanceId -> dynamicConfiguration.getConfig(serviceInstanceId, serviceName))\n-                .map(content -> JSON.parseObject(content, DefaultServiceInstance.class))\n-                .collect(Collectors.toList());\n-    }\n-\n-    @Override\n-    public URL getUrl() {\n-        return null;\n-    }\n-\n-    @Override\n-    public void doRegister(ServiceInstance serviceInstance) {\n-        String serviceInstanceId = getServiceInstanceId(serviceInstance);\n-        String serviceName = getServiceName(serviceInstance);\n-        String content = toJSONString(serviceInstance);\n-        if (dynamicConfiguration.publishConfig(serviceInstanceId, serviceName, content)) {\n-            lockFile(serviceInstanceId, serviceName);\n-        }\n-    }\n-\n-    private void lockFile(String serviceInstanceId, String serviceName) {\n-        File serviceInstanceFile = serviceInstanceFile(serviceInstanceId, serviceName);\n-        Path serviceInstanceFilePath = serviceInstanceFile.toPath();\n-\n-        fileLocksCache.computeIfAbsent(serviceInstanceFile, file -> {\n-            FileLock fileLock = null;\n-            try {\n-                FileChannel fileChannel = open(serviceInstanceFilePath, StandardOpenOption.READ, StandardOpenOption.WRITE, LinkOption.NOFOLLOW_LINKS);\n-                fileLock = fileChannel.tryLock();\n-            } catch (IOException e) {\n-                if (logger.isErrorEnabled()) {\n-                    logger.error(e.getMessage(), e);\n-                }\n-            }\n-            if (fileLock != null) {\n-                if (logger.isInfoEnabled()) {\n-                    logger.info(format(\"%s has been locked\", serviceInstanceFilePath.toAbsolutePath()));\n-                }\n-            }\n-            return fileLock;\n-        });\n-    }\n-\n-\n-    @Override\n-    public void doUpdate(ServiceInstance serviceInstance) {\n-        register(serviceInstance);\n-    }\n-\n-    @Override\n-    public void unregister(ServiceInstance serviceInstance) throws RuntimeException {\n-        String key = getServiceInstanceId(serviceInstance);\n-        String group = getServiceName(serviceInstance);\n-        releaseFileLock(key, group);\n-        dynamicConfiguration.removeConfig(key, group);\n-    }\n-\n-    private void releaseFileLock(String serviceInstanceId, String serviceName) {\n-        File serviceInstanceFile = serviceInstanceFile(serviceInstanceId, serviceName);\n-        releaseFileLock(serviceInstanceFile);\n-    }\n-\n-    private void releaseFileLock(File serviceInstanceFile) {\n-        fileLocksCache.computeIfPresent(serviceInstanceFile, (f, fileLock) -> {\n-            releaseFileLock(fileLock);\n-            if (logger.isInfoEnabled()) {\n-                logger.info(format(\"The file[%s] has been released\", serviceInstanceFile.getAbsolutePath()));\n-            }\n-            return null;\n-        });\n-    }\n-\n-    private void releaseFileLock(FileLock fileLock) {\n-        try (FileChannel fileChannel = fileLock.channel()) {\n-            fileLock.release();\n-        } catch (IOException e) {\n-            if (logger.isErrorEnabled()) {\n-                logger.error(e.getMessage(), e);\n-            }\n-        }\n-    }\n-\n-    private File serviceInstanceFile(String serviceInstanceId, String serviceName) {\n-        return dynamicConfiguration.configFile(serviceInstanceId, serviceName);\n-    }\n-\n-    @Override\n-    public Set<String> getServices() {\n-        return dynamicConfiguration.getConfigGroups();\n-    }\n-\n-    private static FileSystemDynamicConfiguration createDynamicConfiguration(URL connectionURL) {\n-        String path = System.getProperty(\"user.home\") + File.separator + \".dubbo\" + File.separator + \"registry\";\n-        return new FileSystemDynamicConfiguration(connectionURL.addParameter(CONFIG_CENTER_DIR_PARAM_NAME, path));\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.client;\r\n+\r\n+import org.apache.dubbo.common.URL;\r\n+import org.apache.dubbo.common.config.configcenter.ConfigChangedEvent;\r\n+import org.apache.dubbo.common.config.configcenter.file.FileSystemDynamicConfiguration;\r\n+import org.apache.dubbo.common.lang.ShutdownHookCallbacks;\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.event.EventListener;\r\n+import org.apache.dubbo.registry.client.event.ServiceInstancesChangedEvent;\r\n+\r\n+import com.alibaba.fastjson.JSON;\r\n+import org.apache.commons.io.FileUtils;\r\n+\r\n+import java.io.File;\r\n+import java.io.IOException;\r\n+import java.nio.channels.FileChannel;\r\n+import java.nio.channels.FileLock;\r\n+import java.nio.file.LinkOption;\r\n+import java.nio.file.Path;\r\n+import java.nio.file.StandardOpenOption;\r\n+import java.util.List;\r\n+import java.util.Map;\r\n+import java.util.Set;\r\n+import java.util.concurrent.ConcurrentHashMap;\r\n+import java.util.stream.Collectors;\r\n+\r\n+import static com.alibaba.fastjson.JSON.toJSONString;\r\n+import static java.lang.String.format;\r\n+import static java.nio.channels.FileChannel.open;\r\n+import static org.apache.dubbo.common.config.configcenter.DynamicConfiguration.DEFAULT_GROUP;\r\n+import static org.apache.dubbo.common.config.configcenter.file.FileSystemDynamicConfiguration.CONFIG_CENTER_DIR_PARAM_NAME;\r\n+\r\n+/**\r\n+ * File System {@link ServiceDiscovery} implementation\r\n+ *\r\n+ * @see FileSystemDynamicConfiguration\r\n+ * @since 2.7.5\r\n+ */\r\n+public class FileSystemServiceDiscovery extends AbstractServiceDiscovery implements EventListener<ServiceInstancesChangedEvent> {\r\n+\r\n+    private final Logger logger = LoggerFactory.getLogger(getClass());\r\n+\r\n+    private final Map<File, FileLock> fileLocksCache = new ConcurrentHashMap<>();\r\n+\r\n+    private FileSystemDynamicConfiguration dynamicConfiguration;\r\n+\r\n+    @Override\r\n+    public void onEvent(ServiceInstancesChangedEvent event) {\r\n+\r\n+    }\r\n+\r\n+    @Override\r\n+    public void initialize(URL registryURL) throws Exception {\r\n+        dynamicConfiguration = createDynamicConfiguration(registryURL);\r\n+        registerDubboShutdownHook();\r\n+        registerListener();\r\n+    }\r\n+\r\n+    private void registerDubboShutdownHook() {\r\n+        ShutdownHookCallbacks.INSTANCE.addCallback(this::destroy);\r\n+    }\r\n+\r\n+    private void registerListener() {\r\n+        getServices().forEach(serviceName -> {\r\n+            dynamicConfiguration.getConfigKeys(DEFAULT_GROUP).forEach(serviceInstanceId -> {\r\n+                dynamicConfiguration.addListener(serviceInstanceId, serviceName, this::onConfigChanged);\r\n+            });\r\n+        });\r\n+    }\r\n+\r\n+    public void onConfigChanged(ConfigChangedEvent event) {\r\n+\r\n+    }\r\n+\r\n+    @Override\r\n+    public void destroy() throws Exception {\r\n+        dynamicConfiguration.close();\r\n+        releaseAndRemoveRegistrationFiles();\r\n+    }\r\n+\r\n+    private void releaseAndRemoveRegistrationFiles() {\r\n+        fileLocksCache.keySet().forEach(file -> {\r\n+            releaseFileLock(file);\r\n+            removeFile(file);\r\n+        });\r\n+    }\r\n+\r\n+    private void removeFile(File file) {\r\n+        FileUtils.deleteQuietly(file);\r\n+    }\r\n+\r\n+    private String getServiceInstanceId(ServiceInstance serviceInstance) {\r\n+        String id = serviceInstance.getId();\r\n+        if (StringUtils.isBlank(id)) {\r\n+            return serviceInstance.getHost() + \".\" + serviceInstance.getPort();\r\n+        }\r\n+        return id;\r\n+    }\r\n+\r\n+    private String getServiceName(ServiceInstance serviceInstance) {\r\n+        return serviceInstance.getServiceName();\r\n+    }\r\n+\r\n+    @Override\r\n+    public List<ServiceInstance> getInstances(String serviceName) {\r\n+        return dynamicConfiguration.getConfigKeys(DEFAULT_GROUP)\r\n+                .stream()\r\n+                .map(serviceInstanceId -> dynamicConfiguration.getConfig(serviceInstanceId, serviceName))\r\n+                .map(content -> JSON.parseObject(content, DefaultServiceInstance.class))\r\n+                .collect(Collectors.toList());\r\n+    }\r\n+\r\n+    @Override\r\n+    public URL getUrl() {\r\n+        return null;\r\n+    }\r\n+\r\n+    @Override\r\n+    public void doRegister(ServiceInstance serviceInstance) {\r\n+        String serviceInstanceId = getServiceInstanceId(serviceInstance);\r\n+        String serviceName = getServiceName(serviceInstance);\r\n+        String content = toJSONString(serviceInstance);\r\n+        if (dynamicConfiguration.publishConfig(serviceInstanceId, serviceName, content)) {\r\n+            lockFile(serviceInstanceId, serviceName);\r\n+        }\r\n+    }\r\n+\r\n+    private void lockFile(String serviceInstanceId, String serviceName) {\r\n+        File serviceInstanceFile = serviceInstanceFile(serviceInstanceId, serviceName);\r\n+        Path serviceInstanceFilePath = serviceInstanceFile.toPath();\r\n+\r\n+        fileLocksCache.computeIfAbsent(serviceInstanceFile, file -> {\r\n+            FileLock fileLock = null;\r\n+            try {\r\n+                FileChannel fileChannel = open(serviceInstanceFilePath, StandardOpenOption.READ, StandardOpenOption.WRITE, LinkOption.NOFOLLOW_LINKS);\r\n+                fileLock = fileChannel.tryLock();\r\n+            } catch (IOException e) {\r\n+                if (logger.isErrorEnabled()) {\r\n+                    logger.error(e.getMessage(), e);\r\n+                }\r\n+            }\r\n+            if (fileLock != null) {\r\n+                if (logger.isInfoEnabled()) {\r\n+                    logger.info(format(\"%s has been locked\", serviceInstanceFilePath.toAbsolutePath()));\r\n+                }\r\n+            }\r\n+            return fileLock;\r\n+        });\r\n+    }\r\n+\r\n+\r\n+    @Override\r\n+    public void doUpdate(ServiceInstance serviceInstance) {\r\n+        register(serviceInstance);\r\n+    }\r\n+\r\n+    @Override\r\n+    public void unregister(ServiceInstance serviceInstance) throws RuntimeException {\r\n+        String key = getServiceInstanceId(serviceInstance);\r\n+        String group = getServiceName(serviceInstance);\r\n+        releaseFileLock(key, group);\r\n+        dynamicConfiguration.removeConfig(key, group);\r\n+    }\r\n+\r\n+    private void releaseFileLock(String serviceInstanceId, String serviceName) {\r\n+        File serviceInstanceFile = serviceInstanceFile(serviceInstanceId, serviceName);\r\n+        releaseFileLock(serviceInstanceFile);\r\n+    }\r\n+\r\n+    private void releaseFileLock(File serviceInstanceFile) {\r\n+        fileLocksCache.computeIfPresent(serviceInstanceFile, (f, fileLock) -> {\r\n+            releaseFileLock(fileLock);\r\n+            if (logger.isInfoEnabled()) {\r\n+                logger.info(format(\"The file[%s] has been released\", serviceInstanceFile.getAbsolutePath()));\r\n+            }\r\n+            return null;\r\n+        });\r\n+    }\r\n+\r\n+    private void releaseFileLock(FileLock fileLock) {\r\n+        try (FileChannel fileChannel = fileLock.channel()) {\r\n+            fileLock.release();\r\n+        } catch (IOException e) {\r\n+            if (logger.isErrorEnabled()) {\r\n+                logger.error(e.getMessage(), e);\r\n+            }\r\n+        }\r\n+    }\r\n+\r\n+    private File serviceInstanceFile(String serviceInstanceId, String serviceName) {\r\n+        return dynamicConfiguration.configFile(serviceInstanceId, serviceName);\r\n+    }\r\n+\r\n+    @Override\r\n+    public Set<String> getServices() {\r\n+        return dynamicConfiguration.getConfigGroups();\r\n+    }\r\n+\r\n+    private static FileSystemDynamicConfiguration createDynamicConfiguration(URL connectionURL) {\r\n+        String path = System.getProperty(\"user.home\") + File.separator + \".dubbo\" + File.separator + \"registry\";\r\n+        return new FileSystemDynamicConfiguration(connectionURL.addParameter(CONFIG_CENTER_DIR_PARAM_NAME, path));\r\n+    }\r\n+}\r\n"}, {"source1": "org/apache/dubbo/registry/client/InstanceAddressURL.java", "source2": "org/apache/dubbo/registry/client/InstanceAddressURL.java", "comments": ["Line-ending differences only"], "unified_diff": "@@ -1,379 +1,379 @@\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.client;\n-\n-import org.apache.dubbo.common.URL;\n-import org.apache.dubbo.common.utils.StringUtils;\n-import org.apache.dubbo.metadata.MetadataInfo;\n-import org.apache.dubbo.rpc.RpcContext;\n-\n-import java.util.HashMap;\n-import java.util.Map;\n-import java.util.concurrent.ConcurrentHashMap;\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.REMOTE_APPLICATION_KEY;\n-import static org.apache.dubbo.common.constants.CommonConstants.VERSION_KEY;\n-\n-public class InstanceAddressURL extends URL {\n-    private ServiceInstance instance;\n-    private MetadataInfo metadataInfo;\n-\n-    // cached numbers\n-    private volatile transient Map<String, Number> numbers;\n-    private volatile transient Map<String, Map<String, Number>> methodNumbers;\n-\n-    public InstanceAddressURL() {\n-    }\n-\n-    public InstanceAddressURL(\n-            ServiceInstance instance,\n-            MetadataInfo metadataInfo\n-    ) {\n-        this.instance = instance;\n-        this.metadataInfo = metadataInfo;\n-        this.host = instance.getHost();\n-        this.port = instance.getPort();\n-    }\n-\n-    public ServiceInstance getInstance() {\n-        return instance;\n-    }\n-\n-    public MetadataInfo getMetadataInfo() {\n-        return metadataInfo;\n-    }\n-\n-    @Override\n-    public String getServiceInterface() {\n-        return RpcContext.getContext().getInterfaceName();\n-    }\n-\n-    public String getGroup() {\n-        return RpcContext.getContext().getGroup();\n-    }\n-\n-    public String getVersion() {\n-        return RpcContext.getContext().getVersion();\n-    }\n-\n-    @Override\n-    public String getProtocol() {\n-        return RpcContext.getContext().getProtocol();\n-    }\n-\n-    @Override\n-    public String getProtocolServiceKey() {\n-        return RpcContext.getContext().getProtocolServiceKey();\n-    }\n-\n-    @Override\n-    public String getServiceKey() {\n-        return RpcContext.getContext().getServiceKey();\n-    }\n-\n-    @Override\n-    public String getAddress() {\n-        return instance.getAddress();\n-    }\n-\n-    @Override\n-    public String getPath() {\n-        MetadataInfo.ServiceInfo serviceInfo = metadataInfo.getServiceInfo(getProtocolServiceKey());\n-        return serviceInfo.getPath();\n-    }\n-\n-    @Override\n-    public String getParameter(String key) {\n-        if (VERSION_KEY.equals(key)) {\n-            return getVersion();\n-        } else if (GROUP_KEY.equals(key)) {\n-            return getGroup();\n-        } else if (INTERFACE_KEY.equals(key)) {\n-            return getServiceInterface();\n-        } else if (REMOTE_APPLICATION_KEY.equals(key)) {\n-            return instance.getServiceName();\n-        }\n-\n-        String protocolServiceKey = getProtocolServiceKey();\n-        if (protocolServiceKey == null) {\n-            return getInstanceParameter(key);\n-        }\n-        return getServiceParameter(protocolServiceKey, key);\n-    }\n-\n-    @Override\n-    public String getServiceParameter(String service, String key) {\n-        String value = getInstanceParameter(key);\n-        if (StringUtils.isEmpty(value) && metadataInfo != null) {\n-            value = metadataInfo.getParameter(key, service);\n-        }\n-        return value;\n-    }\n-\n-    /**\n-     * method parameter only exists in ServiceInfo\n-     *\n-     * @param method\n-     * @param key\n-     * @return\n-     */\n-    @Override\n-    public String getServiceMethodParameter(String protocolServiceKey, String method, String key) {\n-        MetadataInfo.ServiceInfo serviceInfo = metadataInfo.getServiceInfo(protocolServiceKey);\n-        String value = serviceInfo.getMethodParameter(method, key, null);\n-        if (StringUtils.isNotEmpty(value)) {\n-            return value;\n-        }\n-        return getParameter(key);\n-    }\n-\n-    @Override\n-    public String getMethodParameter(String method, String key) {\n-        String protocolServiceKey = getProtocolServiceKey();\n-        if (protocolServiceKey == null) {\n-            return null;\n-        }\n-        return getServiceMethodParameter(protocolServiceKey, method, key);\n-    }\n-\n-    /**\n-     * method parameter only exists in ServiceInfo\n-     *\n-     * @param method\n-     * @param key\n-     * @return\n-     */\n-    @Override\n-    public boolean hasServiceMethodParameter(String protocolServiceKey, String method, String key) {\n-        MetadataInfo.ServiceInfo serviceInfo = metadataInfo.getServiceInfo(protocolServiceKey);\n-\n-        if (method == null) {\n-            String suffix = \".\" + key;\n-            for (String fullKey : getParameters().keySet()) {\n-                if (fullKey.endsWith(suffix)) {\n-                    return true;\n-                }\n-            }\n-            return false;\n-        }\n-        if (key == null) {\n-            String prefix = method + \".\";\n-            for (String fullKey : getParameters().keySet()) {\n-                if (fullKey.startsWith(prefix)) {\n-                    return true;\n-                }\n-            }\n-            return false;\n-        }\n-\n-        return serviceInfo.hasMethodParameter(method, key);\n-    }\n-\n-    @Override\n-    public boolean hasMethodParameter(String method, String key) {\n-        String protocolServiceKey = getProtocolServiceKey();\n-        if (protocolServiceKey == null) {\n-            return false;\n-        }\n-        return hasServiceMethodParameter(protocolServiceKey, method, key);\n-    }\n-\n-    /**\n-     * method parameter only exists in ServiceInfo\n-     *\n-     * @param method\n-     * @return\n-     */\n-    @Override\n-    public boolean hasServiceMethodParameter(String protocolServiceKey, String method) {\n-        MetadataInfo.ServiceInfo serviceInfo = metadataInfo.getServiceInfo(protocolServiceKey);\n-        return serviceInfo.hasMethodParameter(method);\n-    }\n-\n-    @Override\n-    public boolean hasMethodParameter(String method) {\n-        String protocolServiceKey = getProtocolServiceKey();\n-        if (protocolServiceKey == null) {\n-            return false;\n-        }\n-        return hasServiceMethodParameter(protocolServiceKey, method);\n-    }\n-\n-    /**\n-     * Avoid calling this method in RPC call.\n-     *\n-     * @return\n-     */\n-    @Override\n-    public Map<String, String> getServiceParameters(String protocolServiceKey) {\n-        Map<String, String> instanceParams = getInstanceMetadata();\n-        Map<String, String> metadataParams = (metadataInfo == null ? new HashMap<>() : metadataInfo.getParameters(protocolServiceKey));\n-        int i = instanceParams == null ? 0 : instanceParams.size();\n-        int j = metadataParams == null ? 0 : metadataParams.size();\n-        Map<String, String> params = new HashMap<>((int) ((i + j) / 0.75) + 1);\n-        if (instanceParams != null) {\n-            params.putAll(instanceParams);\n-        }\n-        if (metadataParams != null) {\n-            params.putAll(metadataParams);\n-        }\n-        return params;\n-    }\n-\n-    @Override\n-    public Map<String, String> getParameters() {\n-        String protocolServiceKey = getProtocolServiceKey();\n-        if (protocolServiceKey == null) {\n-            return getInstance().getAllParams();\n-        }\n-        return getServiceParameters(protocolServiceKey);\n-    }\n-\n-    @Override\n-    public URL addParameter(String key, String value) {\n-        if (StringUtils.isEmpty(key) || StringUtils.isEmpty(value)) {\n-            return this;\n-        }\n-\n-        getInstance().getExtendParams().put(key, value);\n-        return this;\n-    }\n-\n-    @Override\n-    public URL addParameterIfAbsent(String key, String value) {\n-        if (StringUtils.isEmpty(key) || StringUtils.isEmpty(value)) {\n-            return this;\n-        }\n-\n-        getInstance().getExtendParams().putIfAbsent(key, value);\n-        return this;\n-    }\n-\n-    public URL addServiceParameter(String protocolServiceKey, String key, String value) {\n-        if (StringUtils.isEmpty(key) || StringUtils.isEmpty(value)) {\n-            return this;\n-        }\n-\n-        getMetadataInfo().getServiceInfo(protocolServiceKey).addParameter(key, value);\n-        return this;\n-    }\n-\n-    public URL addServiceParameterIfAbsent(String protocolServiceKey, String key, String value) {\n-        if (StringUtils.isEmpty(key) || StringUtils.isEmpty(value)) {\n-            return this;\n-        }\n-\n-        getMetadataInfo().getServiceInfo(protocolServiceKey).addParameterIfAbsent(key, value);\n-        return this;\n-    }\n-\n-    public URL addConsumerParams(String protocolServiceKey, Map<String, String> params) {\n-        getMetadataInfo().getServiceInfo(protocolServiceKey).addConsumerParams(params);\n-        return this;\n-    }\n-\n-    @Override\n-    protected Map<String, Number> getServiceNumbers(String protocolServiceKey) {\n-        return getServiceInfo(protocolServiceKey).getNumbers();\n-    }\n-\n-    @Override\n-    protected Map<String, Number> getNumbers() {\n-        String protocolServiceKey = getProtocolServiceKey();\n-        if (protocolServiceKey == null) {\n-            if (numbers == null) { // concurrent initialization is tolerant\n-                numbers = new ConcurrentHashMap<>();\n-            }\n-            return numbers;\n-        }\n-        return getServiceNumbers(protocolServiceKey);\n-    }\n-\n-    @Override\n-    protected Map<String, Map<String, Number>> getServiceMethodNumbers(String protocolServiceKey) {\n-        return getServiceInfo(protocolServiceKey).getMethodNumbers();\n-    }\n-\n-    @Override\n-    protected Map<String, Map<String, Number>> getMethodNumbers() {\n-        String protocolServiceKey = getProtocolServiceKey();\n-        if (protocolServiceKey == null) {\n-            if (methodNumbers == null) { // concurrent initialization is tolerant\n-                methodNumbers = new ConcurrentHashMap<>();\n-            }\n-            return methodNumbers;\n-        }\n-        return getServiceMethodNumbers(protocolServiceKey);\n-    }\n-\n-    private MetadataInfo.ServiceInfo getServiceInfo(String protocolServiceKey) {\n-        return metadataInfo.getServiceInfo(protocolServiceKey);\n-    }\n-\n-    private String getInstanceParameter(String key) {\n-        String value = this.instance.getMetadata().get(key);\n-        if (StringUtils.isNotEmpty(value)) {\n-            return value;\n-        }\n-        return this.instance.getExtendParams().get(key);\n-    }\n-\n-    private Map<String, String> getInstanceMetadata() {\n-        return this.instance.getMetadata();\n-    }\n-\n-    @Override\n-    public boolean equals(Object obj) {\n-        // instance metadata equals\n-        if (obj == null) {\n-            return false;\n-        }\n-        if (!(obj instanceof InstanceAddressURL)) {\n-            return false;\n-        }\n-\n-        InstanceAddressURL that = (InstanceAddressURL) obj;\n-\n-        return this.getInstance().equals(that.getInstance());\n-    }\n-\n-    @Override\n-    public int hashCode() {\n-        return getInstance().hashCode();\n-    }\n-\n-    public String getServiceString(String service) {\n-        MetadataInfo.ServiceInfo serviceInfo = metadataInfo.getServiceInfo(service);\n-        if (serviceInfo == null) {\n-            return instance.toString();\n-        }\n-        return instance.toString() + serviceInfo.toString();\n-    }\n-\n-    @Override\n-    public String toString() {\n-        if (instance == null) {\n-            return \"{}\";\n-        }\n-        if (metadataInfo == null) {\n-            return instance.toString();\n-        }\n-        return instance.toString() + metadataInfo.toString();\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.client;\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.metadata.MetadataInfo;\r\n+import org.apache.dubbo.rpc.RpcContext;\r\n+\r\n+import java.util.HashMap;\r\n+import java.util.Map;\r\n+import java.util.concurrent.ConcurrentHashMap;\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.REMOTE_APPLICATION_KEY;\r\n+import static org.apache.dubbo.common.constants.CommonConstants.VERSION_KEY;\r\n+\r\n+public class InstanceAddressURL extends URL {\r\n+    private ServiceInstance instance;\r\n+    private MetadataInfo metadataInfo;\r\n+\r\n+    // cached numbers\r\n+    private volatile transient Map<String, Number> numbers;\r\n+    private volatile transient Map<String, Map<String, Number>> methodNumbers;\r\n+\r\n+    public InstanceAddressURL() {\r\n+    }\r\n+\r\n+    public InstanceAddressURL(\r\n+            ServiceInstance instance,\r\n+            MetadataInfo metadataInfo\r\n+    ) {\r\n+        this.instance = instance;\r\n+        this.metadataInfo = metadataInfo;\r\n+        this.host = instance.getHost();\r\n+        this.port = instance.getPort();\r\n+    }\r\n+\r\n+    public ServiceInstance getInstance() {\r\n+        return instance;\r\n+    }\r\n+\r\n+    public MetadataInfo getMetadataInfo() {\r\n+        return metadataInfo;\r\n+    }\r\n+\r\n+    @Override\r\n+    public String getServiceInterface() {\r\n+        return RpcContext.getContext().getInterfaceName();\r\n+    }\r\n+\r\n+    public String getGroup() {\r\n+        return RpcContext.getContext().getGroup();\r\n+    }\r\n+\r\n+    public String getVersion() {\r\n+        return RpcContext.getContext().getVersion();\r\n+    }\r\n+\r\n+    @Override\r\n+    public String getProtocol() {\r\n+        return RpcContext.getContext().getProtocol();\r\n+    }\r\n+\r\n+    @Override\r\n+    public String getProtocolServiceKey() {\r\n+        return RpcContext.getContext().getProtocolServiceKey();\r\n+    }\r\n+\r\n+    @Override\r\n+    public String getServiceKey() {\r\n+        return RpcContext.getContext().getServiceKey();\r\n+    }\r\n+\r\n+    @Override\r\n+    public String getAddress() {\r\n+        return instance.getAddress();\r\n+    }\r\n+\r\n+    @Override\r\n+    public String getPath() {\r\n+        MetadataInfo.ServiceInfo serviceInfo = metadataInfo.getServiceInfo(getProtocolServiceKey());\r\n+        return serviceInfo.getPath();\r\n+    }\r\n+\r\n+    @Override\r\n+    public String getParameter(String key) {\r\n+        if (VERSION_KEY.equals(key)) {\r\n+            return getVersion();\r\n+        } else if (GROUP_KEY.equals(key)) {\r\n+            return getGroup();\r\n+        } else if (INTERFACE_KEY.equals(key)) {\r\n+            return getServiceInterface();\r\n+        } else if (REMOTE_APPLICATION_KEY.equals(key)) {\r\n+            return instance.getServiceName();\r\n+        }\r\n+\r\n+        String protocolServiceKey = getProtocolServiceKey();\r\n+        if (protocolServiceKey == null) {\r\n+            return getInstanceParameter(key);\r\n+        }\r\n+        return getServiceParameter(protocolServiceKey, key);\r\n+    }\r\n+\r\n+    @Override\r\n+    public String getServiceParameter(String service, String key) {\r\n+        String value = getInstanceParameter(key);\r\n+        if (StringUtils.isEmpty(value) && metadataInfo != null) {\r\n+            value = metadataInfo.getParameter(key, service);\r\n+        }\r\n+        return value;\r\n+    }\r\n+\r\n+    /**\r\n+     * method parameter only exists in ServiceInfo\r\n+     *\r\n+     * @param method\r\n+     * @param key\r\n+     * @return\r\n+     */\r\n+    @Override\r\n+    public String getServiceMethodParameter(String protocolServiceKey, String method, String key) {\r\n+        MetadataInfo.ServiceInfo serviceInfo = metadataInfo.getServiceInfo(protocolServiceKey);\r\n+        String value = serviceInfo.getMethodParameter(method, key, null);\r\n+        if (StringUtils.isNotEmpty(value)) {\r\n+            return value;\r\n+        }\r\n+        return getParameter(key);\r\n+    }\r\n+\r\n+    @Override\r\n+    public String getMethodParameter(String method, String key) {\r\n+        String protocolServiceKey = getProtocolServiceKey();\r\n+        if (protocolServiceKey == null) {\r\n+            return null;\r\n+        }\r\n+        return getServiceMethodParameter(protocolServiceKey, method, key);\r\n+    }\r\n+\r\n+    /**\r\n+     * method parameter only exists in ServiceInfo\r\n+     *\r\n+     * @param method\r\n+     * @param key\r\n+     * @return\r\n+     */\r\n+    @Override\r\n+    public boolean hasServiceMethodParameter(String protocolServiceKey, String method, String key) {\r\n+        MetadataInfo.ServiceInfo serviceInfo = metadataInfo.getServiceInfo(protocolServiceKey);\r\n+\r\n+        if (method == null) {\r\n+            String suffix = \".\" + key;\r\n+            for (String fullKey : getParameters().keySet()) {\r\n+                if (fullKey.endsWith(suffix)) {\r\n+                    return true;\r\n+                }\r\n+            }\r\n+            return false;\r\n+        }\r\n+        if (key == null) {\r\n+            String prefix = method + \".\";\r\n+            for (String fullKey : getParameters().keySet()) {\r\n+                if (fullKey.startsWith(prefix)) {\r\n+                    return true;\r\n+                }\r\n+            }\r\n+            return false;\r\n+        }\r\n+\r\n+        return serviceInfo.hasMethodParameter(method, key);\r\n+    }\r\n+\r\n+    @Override\r\n+    public boolean hasMethodParameter(String method, String key) {\r\n+        String protocolServiceKey = getProtocolServiceKey();\r\n+        if (protocolServiceKey == null) {\r\n+            return false;\r\n+        }\r\n+        return hasServiceMethodParameter(protocolServiceKey, method, key);\r\n+    }\r\n+\r\n+    /**\r\n+     * method parameter only exists in ServiceInfo\r\n+     *\r\n+     * @param method\r\n+     * @return\r\n+     */\r\n+    @Override\r\n+    public boolean hasServiceMethodParameter(String protocolServiceKey, String method) {\r\n+        MetadataInfo.ServiceInfo serviceInfo = metadataInfo.getServiceInfo(protocolServiceKey);\r\n+        return serviceInfo.hasMethodParameter(method);\r\n+    }\r\n+\r\n+    @Override\r\n+    public boolean hasMethodParameter(String method) {\r\n+        String protocolServiceKey = getProtocolServiceKey();\r\n+        if (protocolServiceKey == null) {\r\n+            return false;\r\n+        }\r\n+        return hasServiceMethodParameter(protocolServiceKey, method);\r\n+    }\r\n+\r\n+    /**\r\n+     * Avoid calling this method in RPC call.\r\n+     *\r\n+     * @return\r\n+     */\r\n+    @Override\r\n+    public Map<String, String> getServiceParameters(String protocolServiceKey) {\r\n+        Map<String, String> instanceParams = getInstanceMetadata();\r\n+        Map<String, String> metadataParams = (metadataInfo == null ? new HashMap<>() : metadataInfo.getParameters(protocolServiceKey));\r\n+        int i = instanceParams == null ? 0 : instanceParams.size();\r\n+        int j = metadataParams == null ? 0 : metadataParams.size();\r\n+        Map<String, String> params = new HashMap<>((int) ((i + j) / 0.75) + 1);\r\n+        if (instanceParams != null) {\r\n+            params.putAll(instanceParams);\r\n+        }\r\n+        if (metadataParams != null) {\r\n+            params.putAll(metadataParams);\r\n+        }\r\n+        return params;\r\n+    }\r\n+\r\n+    @Override\r\n+    public Map<String, String> getParameters() {\r\n+        String protocolServiceKey = getProtocolServiceKey();\r\n+        if (protocolServiceKey == null) {\r\n+            return getInstance().getAllParams();\r\n+        }\r\n+        return getServiceParameters(protocolServiceKey);\r\n+    }\r\n+\r\n+    @Override\r\n+    public URL addParameter(String key, String value) {\r\n+        if (StringUtils.isEmpty(key) || StringUtils.isEmpty(value)) {\r\n+            return this;\r\n+        }\r\n+\r\n+        getInstance().getExtendParams().put(key, value);\r\n+        return this;\r\n+    }\r\n+\r\n+    @Override\r\n+    public URL addParameterIfAbsent(String key, String value) {\r\n+        if (StringUtils.isEmpty(key) || StringUtils.isEmpty(value)) {\r\n+            return this;\r\n+        }\r\n+\r\n+        getInstance().getExtendParams().putIfAbsent(key, value);\r\n+        return this;\r\n+    }\r\n+\r\n+    public URL addServiceParameter(String protocolServiceKey, String key, String value) {\r\n+        if (StringUtils.isEmpty(key) || StringUtils.isEmpty(value)) {\r\n+            return this;\r\n+        }\r\n+\r\n+        getMetadataInfo().getServiceInfo(protocolServiceKey).addParameter(key, value);\r\n+        return this;\r\n+    }\r\n+\r\n+    public URL addServiceParameterIfAbsent(String protocolServiceKey, String key, String value) {\r\n+        if (StringUtils.isEmpty(key) || StringUtils.isEmpty(value)) {\r\n+            return this;\r\n+        }\r\n+\r\n+        getMetadataInfo().getServiceInfo(protocolServiceKey).addParameterIfAbsent(key, value);\r\n+        return this;\r\n+    }\r\n+\r\n+    public URL addConsumerParams(String protocolServiceKey, Map<String, String> params) {\r\n+        getMetadataInfo().getServiceInfo(protocolServiceKey).addConsumerParams(params);\r\n+        return this;\r\n+    }\r\n+\r\n+    @Override\r\n+    protected Map<String, Number> getServiceNumbers(String protocolServiceKey) {\r\n+        return getServiceInfo(protocolServiceKey).getNumbers();\r\n+    }\r\n+\r\n+    @Override\r\n+    protected Map<String, Number> getNumbers() {\r\n+        String protocolServiceKey = getProtocolServiceKey();\r\n+        if (protocolServiceKey == null) {\r\n+            if (numbers == null) { // concurrent initialization is tolerant\r\n+                numbers = new ConcurrentHashMap<>();\r\n+            }\r\n+            return numbers;\r\n+        }\r\n+        return getServiceNumbers(protocolServiceKey);\r\n+    }\r\n+\r\n+    @Override\r\n+    protected Map<String, Map<String, Number>> getServiceMethodNumbers(String protocolServiceKey) {\r\n+        return getServiceInfo(protocolServiceKey).getMethodNumbers();\r\n+    }\r\n+\r\n+    @Override\r\n+    protected Map<String, Map<String, Number>> getMethodNumbers() {\r\n+        String protocolServiceKey = getProtocolServiceKey();\r\n+        if (protocolServiceKey == null) {\r\n+            if (methodNumbers == null) { // concurrent initialization is tolerant\r\n+                methodNumbers = new ConcurrentHashMap<>();\r\n+            }\r\n+            return methodNumbers;\r\n+        }\r\n+        return getServiceMethodNumbers(protocolServiceKey);\r\n+    }\r\n+\r\n+    private MetadataInfo.ServiceInfo getServiceInfo(String protocolServiceKey) {\r\n+        return metadataInfo.getServiceInfo(protocolServiceKey);\r\n+    }\r\n+\r\n+    private String getInstanceParameter(String key) {\r\n+        String value = this.instance.getMetadata().get(key);\r\n+        if (StringUtils.isNotEmpty(value)) {\r\n+            return value;\r\n+        }\r\n+        return this.instance.getExtendParams().get(key);\r\n+    }\r\n+\r\n+    private Map<String, String> getInstanceMetadata() {\r\n+        return this.instance.getMetadata();\r\n+    }\r\n+\r\n+    @Override\r\n+    public boolean equals(Object obj) {\r\n+        // instance metadata equals\r\n+        if (obj == null) {\r\n+            return false;\r\n+        }\r\n+        if (!(obj instanceof InstanceAddressURL)) {\r\n+            return false;\r\n+        }\r\n+\r\n+        InstanceAddressURL that = (InstanceAddressURL) obj;\r\n+\r\n+        return this.getInstance().equals(that.getInstance());\r\n+    }\r\n+\r\n+    @Override\r\n+    public int hashCode() {\r\n+        return getInstance().hashCode();\r\n+    }\r\n+\r\n+    public String getServiceString(String service) {\r\n+        MetadataInfo.ServiceInfo serviceInfo = metadataInfo.getServiceInfo(service);\r\n+        if (serviceInfo == null) {\r\n+            return instance.toString();\r\n+        }\r\n+        return instance.toString() + serviceInfo.toString();\r\n+    }\r\n+\r\n+    @Override\r\n+    public String toString() {\r\n+        if (instance == null) {\r\n+            return \"{}\";\r\n+        }\r\n+        if (metadataInfo == null) {\r\n+            return instance.toString();\r\n+        }\r\n+        return instance.toString() + metadataInfo.toString();\r\n+    }\r\n+}\r\n"}, {"source1": "org/apache/dubbo/registry/client/RegistryClusterIdentifier.java", "source2": "org/apache/dubbo/registry/client/RegistryClusterIdentifier.java", "comments": ["Line-ending differences only"], "unified_diff": "@@ -1,36 +1,36 @@\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.client;\n-\n-import org.apache.dubbo.common.URL;\n-import org.apache.dubbo.common.extension.ExtensionLoader;\n-import org.apache.dubbo.common.extension.SPI;\n-\n-import static org.apache.dubbo.common.constants.RegistryConstants.REGISTRY_CLUSTER_TYPE_KEY;\n-\n-@SPI\n-public interface RegistryClusterIdentifier {\n-    String providerKey(URL url);\n-\n-    String consumerKey(URL url);\n-\n-    static RegistryClusterIdentifier getExtension(URL url) {\n-        ExtensionLoader<RegistryClusterIdentifier> loader\n-                = ExtensionLoader.getExtensionLoader(RegistryClusterIdentifier.class);\n-        return loader.getExtension(url.getParameter(REGISTRY_CLUSTER_TYPE_KEY, \"default\"));\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.client;\r\n+\r\n+import org.apache.dubbo.common.URL;\r\n+import org.apache.dubbo.common.extension.ExtensionLoader;\r\n+import org.apache.dubbo.common.extension.SPI;\r\n+\r\n+import static org.apache.dubbo.common.constants.RegistryConstants.REGISTRY_CLUSTER_TYPE_KEY;\r\n+\r\n+@SPI\r\n+public interface RegistryClusterIdentifier {\r\n+    String providerKey(URL url);\r\n+\r\n+    String consumerKey(URL url);\r\n+\r\n+    static RegistryClusterIdentifier getExtension(URL url) {\r\n+        ExtensionLoader<RegistryClusterIdentifier> loader\r\n+                = ExtensionLoader.getExtensionLoader(RegistryClusterIdentifier.class);\r\n+        return loader.getExtension(url.getParameter(REGISTRY_CLUSTER_TYPE_KEY, \"default\"));\r\n+    }\r\n+}\r\n"}, {"source1": "org/apache/dubbo/registry/client/ServiceDiscovery.java", "source2": "org/apache/dubbo/registry/client/ServiceDiscovery.java", "comments": ["Line-ending differences only"], "unified_diff": "@@ -1,287 +1,287 @@\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.client;\n-\n-import org.apache.dubbo.common.URL;\n-import org.apache.dubbo.common.extension.SPI;\n-import org.apache.dubbo.common.lang.Prioritized;\n-import org.apache.dubbo.common.utils.Page;\n-import org.apache.dubbo.common.utils.StringUtils;\n-import org.apache.dubbo.event.EventDispatcher;\n-import org.apache.dubbo.event.EventListener;\n-import org.apache.dubbo.registry.NotifyListener;\n-import org.apache.dubbo.registry.client.event.ServiceInstancesChangedEvent;\n-import org.apache.dubbo.registry.client.event.listener.ServiceInstancesChangedListener;\n-\n-import java.util.LinkedHashMap;\n-import java.util.LinkedList;\n-import java.util.List;\n-import java.util.Map;\n-import java.util.Set;\n-import java.util.stream.Stream;\n-\n-import static java.util.Collections.unmodifiableList;\n-import static java.util.Collections.unmodifiableMap;\n-import static org.apache.dubbo.event.EventDispatcher.getDefaultExtension;\n-\n-/**\n- * The common operations of Service Discovery\n- *\n- * @since 2.7.5\n- */\n-@SPI(\"zookeeper\")\n-public interface ServiceDiscovery extends Prioritized {\n-\n-    // ==================================== Lifecycle ==================================== //\n-\n-    /**\n-     * Initializes the {@link ServiceDiscovery}\n-     *\n-     * @param registryURL the {@link URL url} to connect service registry\n-     * @throws Exception If met with error\n-     */\n-    void initialize(URL registryURL) throws Exception;\n-\n-    /**\n-     * Destroy the {@link ServiceDiscovery}\n-     *\n-     * @throws Exception If met with error\n-     */\n-    void destroy() throws Exception;\n-\n-    // ==================================================================================== //\n-\n-    // =================================== Registration =================================== //\n-\n-    /**\n-     * Registers an instance of {@link ServiceInstance}.\n-     *\n-     * @param serviceInstance an instance of {@link ServiceInstance} to be registered\n-     * @throws RuntimeException if failed\n-     */\n-    void register(ServiceInstance serviceInstance) throws RuntimeException;\n-\n-    /**\n-     * Updates the registered {@link ServiceInstance}.\n-     *\n-     * @param serviceInstance the registered {@link ServiceInstance}\n-     * @throws RuntimeException if failed\n-     */\n-    void update(ServiceInstance serviceInstance) throws RuntimeException;\n-\n-    /**\n-     * Unregisters an instance of {@link ServiceInstance}.\n-     *\n-     * @param serviceInstance an instance of {@link ServiceInstance} to be unregistered\n-     * @throws RuntimeException if failed\n-     */\n-    void unregister(ServiceInstance serviceInstance) throws RuntimeException;\n-\n-    // ==================================================================================== //\n-\n-    // ==================================== Discovery ===================================== //\n-\n-    /**\n-     * Get the default size of pagination query\n-     *\n-     * @return the default value is 100\n-     */\n-    default int getDefaultPageSize() {\n-        return 100;\n-    }\n-\n-    /**\n-     * Gets all service names\n-     *\n-     * @return non-null read-only {@link Set}\n-     */\n-    Set<String> getServices();\n-\n-    /**\n-     * Gets all {@link ServiceInstance service instances} by the specified service name.\n-     *\n-     * @param serviceName the service name\n-     * @return non-null {@link List}\n-     * @throws NullPointerException if <code>serviceName</code> is <code>null</code>\n-     */\n-    default List<ServiceInstance> getInstances(String serviceName) throws NullPointerException {\n-\n-        List<ServiceInstance> allInstances = new LinkedList<>();\n-\n-        int offset = 0;\n-\n-        int pageSize = getDefaultPageSize();\n-\n-        Page<ServiceInstance> page = getInstances(serviceName, offset, pageSize);\n-\n-        allInstances.addAll(page.getData());\n-\n-        while (page.hasNext()) {\n-            offset += page.getDataSize();\n-            page = getInstances(serviceName, offset, pageSize);\n-            allInstances.addAll(page.getData());\n-        }\n-\n-        return unmodifiableList(allInstances);\n-    }\n-\n-    /**\n-     * Gets the {@link Page pagination} of {@link ServiceInstance service instances} by the specified service name.\n-     * It's equal to {@link #getInstances(String, int, int, boolean)} with <code>healthyOnly == true</code>\n-     *\n-     * @param serviceName the service name\n-     * @param offset      the offset of request , the number \"0\" indicates first page\n-     * @param pageSize    the number of request, the {@link Integer#MAX_VALUE max value} indicates the range is unlimited\n-     * @return non-null {@link Page} object\n-     * @throws NullPointerException          if <code>serviceName</code> is <code>null</code>\n-     * @throws IllegalArgumentException      if <code>offset</code> or <code>pageSize</code> is negative number\n-     * @throws UnsupportedOperationException if not supported\n-     */\n-    default Page<ServiceInstance> getInstances(String serviceName, int offset, int pageSize) throws NullPointerException,\n-            IllegalArgumentException {\n-        return getInstances(serviceName, offset, pageSize, false);\n-    }\n-\n-    /**\n-     * Get the {@link Page pagination} of {@link ServiceInstance service instances} by the specified service name.\n-     * If <code>healthyOnly == true</code>, filter healthy instances only.\n-     *\n-     * @param serviceName the service name\n-     * @param offset      the offset of request , the number \"0\" indicates first page\n-     * @param pageSize    the number of request, the {@link Integer#MAX_VALUE max value} indicates the range is unlimited\n-     * @param healthyOnly if <code>true</code> , filter healthy instances only\n-     * @return non-null {@link Page} object\n-     * @throws NullPointerException          if <code>serviceName</code> is <code>null</code>\n-     * @throws IllegalArgumentException      if <code>offset</code> or <code>pageSize</code> is negative number\n-     * @throws UnsupportedOperationException if not supported\n-     */\n-    default Page<ServiceInstance> getInstances(String serviceName, int offset, int pageSize, boolean healthyOnly) throws\n-            NullPointerException, IllegalArgumentException, UnsupportedOperationException {\n-        throw new UnsupportedOperationException(\"Current implementation does not support pagination query method.\");\n-    }\n-\n-    /**\n-     * batch-get all {@link ServiceInstance service instances} by the specified service names\n-     *\n-     * @param serviceNames the multiple service names\n-     * @param offset       the offset of request , the number \"0\" indicates first page\n-     * @param requestSize  the number of request, the {@link Integer#MAX_VALUE max value} indicates the range is unlimited\n-     * @return non-null read-only {@link Map} whose key is the service name and value is\n-     * the {@link Page pagination} of {@link ServiceInstance service instances}\n-     * @throws NullPointerException          if <code>serviceName</code> is <code>null</code>\n-     * @throws IllegalArgumentException      if <code>offset</code> or <code>requestSize</code> is negative number\n-     * @throws UnsupportedOperationException if not supported\n-     */\n-    default Map<String, Page<ServiceInstance>> getInstances(Iterable<String> serviceNames, int offset, int requestSize) throws\n-            NullPointerException, IllegalArgumentException {\n-        Map<String, Page<ServiceInstance>> instances = new LinkedHashMap<>();\n-        for (String serviceName : serviceNames) {\n-            instances.put(serviceName, getInstances(serviceName, offset, requestSize));\n-        }\n-        return unmodifiableMap(instances);\n-    }\n-\n-    /**\n-     * Add an instance of {@link ServiceInstancesChangedListener} for specified service\n-     * <p>\n-     * Default, current method will be invoked by {@link ServiceDiscoveryRegistry#subscribe(URL, NotifyListener)\n-     * the ServiceDiscoveryRegistry on the subscription}, and it's mandatory to\n-     * {@link EventDispatcher#addEventListener(EventListener) add} the {@link ServiceInstancesChangedListener} argument\n-     * into {@link EventDispatcher} whether the subclass implements same approach or not, thus this method is used to\n-     * trigger or adapt the vendor's change notification mechanism typically, like Zookeeper Watcher,\n-     * Nacos EventListener. If the registry observes the change, It's suggested that the implementation could invoke\n-     * {@link #dispatchServiceInstancesChangedEvent(String)} method or variants\n-     *\n-     * @param listener an instance of {@link ServiceInstancesChangedListener}\n-     * @throws NullPointerException\n-     * @throws IllegalArgumentException\n-     * @see EventPublishingServiceDiscovery\n-     * @see EventDispatcher\n-     */\n-    default void addServiceInstancesChangedListener(ServiceInstancesChangedListener listener)\n-            throws NullPointerException, IllegalArgumentException {\n-    }\n-\n-    /**\n-     * unsubscribe to instances change event.\n-     * @param listener\n-     * @throws IllegalArgumentException\n-     */\n-    default void removeServiceInstancesChangedListener(ServiceInstancesChangedListener listener)\n-            throws IllegalArgumentException {\n-    }\n-\n-    /**\n-     * Dispatch the {@link ServiceInstancesChangedEvent}\n-     *\n-     * @param serviceName the name of service whose service instances have been changed\n-     */\n-    default void dispatchServiceInstancesChangedEvent(String serviceName) {\n-        dispatchServiceInstancesChangedEvent(serviceName, getInstances(serviceName));\n-    }\n-\n-    /**\n-     * Dispatch the {@link ServiceInstancesChangedEvent}\n-     *\n-     * @param serviceName       the name of service whose service instances have been changed\n-     * @param otherServiceNames the names of other services\n-     */\n-    default void dispatchServiceInstancesChangedEvent(String serviceName, String... otherServiceNames) {\n-        dispatchServiceInstancesChangedEvent(serviceName, getInstances(serviceName));\n-        if (otherServiceNames != null) {\n-            Stream.of(otherServiceNames)\n-                    .filter(StringUtils::isNotEmpty)\n-                    .forEach(this::dispatchServiceInstancesChangedEvent);\n-        }\n-    }\n-\n-    /**\n-     * Dispatch the {@link ServiceInstancesChangedEvent}\n-     *\n-     * @param serviceName      the name of service whose service instances have been changed\n-     * @param serviceInstances the service instances have been changed\n-     */\n-    default void dispatchServiceInstancesChangedEvent(String serviceName, List<ServiceInstance> serviceInstances) {\n-        dispatchServiceInstancesChangedEvent(new ServiceInstancesChangedEvent(serviceName, serviceInstances));\n-    }\n-\n-    /**\n-     * Dispatch the {@link ServiceInstancesChangedEvent}\n-     *\n-     * @param event the {@link ServiceInstancesChangedEvent}\n-     */\n-    default void dispatchServiceInstancesChangedEvent(ServiceInstancesChangedEvent event) {\n-        getDefaultExtension().dispatch(event);\n-    }\n-\n-    // ==================================================================================== //\n-\n-//    String getKey(URL exportedURL);\n-\n-    default URL getUrl() {\n-        return null;\n-    }\n-\n-    ServiceInstance getLocalInstance();\n-\n-    /**\n-     * A human-readable description of the implementation\n-     *\n-     * @return The description.\n-     */\n-    String toString();\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.client;\r\n+\r\n+import org.apache.dubbo.common.URL;\r\n+import org.apache.dubbo.common.extension.SPI;\r\n+import org.apache.dubbo.common.lang.Prioritized;\r\n+import org.apache.dubbo.common.utils.Page;\r\n+import org.apache.dubbo.common.utils.StringUtils;\r\n+import org.apache.dubbo.event.EventDispatcher;\r\n+import org.apache.dubbo.event.EventListener;\r\n+import org.apache.dubbo.registry.NotifyListener;\r\n+import org.apache.dubbo.registry.client.event.ServiceInstancesChangedEvent;\r\n+import org.apache.dubbo.registry.client.event.listener.ServiceInstancesChangedListener;\r\n+\r\n+import java.util.LinkedHashMap;\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.stream.Stream;\r\n+\r\n+import static java.util.Collections.unmodifiableList;\r\n+import static java.util.Collections.unmodifiableMap;\r\n+import static org.apache.dubbo.event.EventDispatcher.getDefaultExtension;\r\n+\r\n+/**\r\n+ * The common operations of Service Discovery\r\n+ *\r\n+ * @since 2.7.5\r\n+ */\r\n+@SPI(\"zookeeper\")\r\n+public interface ServiceDiscovery extends Prioritized {\r\n+\r\n+    // ==================================== Lifecycle ==================================== //\r\n+\r\n+    /**\r\n+     * Initializes the {@link ServiceDiscovery}\r\n+     *\r\n+     * @param registryURL the {@link URL url} to connect service registry\r\n+     * @throws Exception If met with error\r\n+     */\r\n+    void initialize(URL registryURL) throws Exception;\r\n+\r\n+    /**\r\n+     * Destroy the {@link ServiceDiscovery}\r\n+     *\r\n+     * @throws Exception If met with error\r\n+     */\r\n+    void destroy() throws Exception;\r\n+\r\n+    // ==================================================================================== //\r\n+\r\n+    // =================================== Registration =================================== //\r\n+\r\n+    /**\r\n+     * Registers an instance of {@link ServiceInstance}.\r\n+     *\r\n+     * @param serviceInstance an instance of {@link ServiceInstance} to be registered\r\n+     * @throws RuntimeException if failed\r\n+     */\r\n+    void register(ServiceInstance serviceInstance) throws RuntimeException;\r\n+\r\n+    /**\r\n+     * Updates the registered {@link ServiceInstance}.\r\n+     *\r\n+     * @param serviceInstance the registered {@link ServiceInstance}\r\n+     * @throws RuntimeException if failed\r\n+     */\r\n+    void update(ServiceInstance serviceInstance) throws RuntimeException;\r\n+\r\n+    /**\r\n+     * Unregisters an instance of {@link ServiceInstance}.\r\n+     *\r\n+     * @param serviceInstance an instance of {@link ServiceInstance} to be unregistered\r\n+     * @throws RuntimeException if failed\r\n+     */\r\n+    void unregister(ServiceInstance serviceInstance) throws RuntimeException;\r\n+\r\n+    // ==================================================================================== //\r\n+\r\n+    // ==================================== Discovery ===================================== //\r\n+\r\n+    /**\r\n+     * Get the default size of pagination query\r\n+     *\r\n+     * @return the default value is 100\r\n+     */\r\n+    default int getDefaultPageSize() {\r\n+        return 100;\r\n+    }\r\n+\r\n+    /**\r\n+     * Gets all service names\r\n+     *\r\n+     * @return non-null read-only {@link Set}\r\n+     */\r\n+    Set<String> getServices();\r\n+\r\n+    /**\r\n+     * Gets all {@link ServiceInstance service instances} by the specified service name.\r\n+     *\r\n+     * @param serviceName the service name\r\n+     * @return non-null {@link List}\r\n+     * @throws NullPointerException if <code>serviceName</code> is <code>null</code>\r\n+     */\r\n+    default List<ServiceInstance> getInstances(String serviceName) throws NullPointerException {\r\n+\r\n+        List<ServiceInstance> allInstances = new LinkedList<>();\r\n+\r\n+        int offset = 0;\r\n+\r\n+        int pageSize = getDefaultPageSize();\r\n+\r\n+        Page<ServiceInstance> page = getInstances(serviceName, offset, pageSize);\r\n+\r\n+        allInstances.addAll(page.getData());\r\n+\r\n+        while (page.hasNext()) {\r\n+            offset += page.getDataSize();\r\n+            page = getInstances(serviceName, offset, pageSize);\r\n+            allInstances.addAll(page.getData());\r\n+        }\r\n+\r\n+        return unmodifiableList(allInstances);\r\n+    }\r\n+\r\n+    /**\r\n+     * Gets the {@link Page pagination} of {@link ServiceInstance service instances} by the specified service name.\r\n+     * It's equal to {@link #getInstances(String, int, int, boolean)} with <code>healthyOnly == true</code>\r\n+     *\r\n+     * @param serviceName the service name\r\n+     * @param offset      the offset of request , the number \"0\" indicates first page\r\n+     * @param pageSize    the number of request, the {@link Integer#MAX_VALUE max value} indicates the range is unlimited\r\n+     * @return non-null {@link Page} object\r\n+     * @throws NullPointerException          if <code>serviceName</code> is <code>null</code>\r\n+     * @throws IllegalArgumentException      if <code>offset</code> or <code>pageSize</code> is negative number\r\n+     * @throws UnsupportedOperationException if not supported\r\n+     */\r\n+    default Page<ServiceInstance> getInstances(String serviceName, int offset, int pageSize) throws NullPointerException,\r\n+            IllegalArgumentException {\r\n+        return getInstances(serviceName, offset, pageSize, false);\r\n+    }\r\n+\r\n+    /**\r\n+     * Get the {@link Page pagination} of {@link ServiceInstance service instances} by the specified service name.\r\n+     * If <code>healthyOnly == true</code>, filter healthy instances only.\r\n+     *\r\n+     * @param serviceName the service name\r\n+     * @param offset      the offset of request , the number \"0\" indicates first page\r\n+     * @param pageSize    the number of request, the {@link Integer#MAX_VALUE max value} indicates the range is unlimited\r\n+     * @param healthyOnly if <code>true</code> , filter healthy instances only\r\n+     * @return non-null {@link Page} object\r\n+     * @throws NullPointerException          if <code>serviceName</code> is <code>null</code>\r\n+     * @throws IllegalArgumentException      if <code>offset</code> or <code>pageSize</code> is negative number\r\n+     * @throws UnsupportedOperationException if not supported\r\n+     */\r\n+    default Page<ServiceInstance> getInstances(String serviceName, int offset, int pageSize, boolean healthyOnly) throws\r\n+            NullPointerException, IllegalArgumentException, UnsupportedOperationException {\r\n+        throw new UnsupportedOperationException(\"Current implementation does not support pagination query method.\");\r\n+    }\r\n+\r\n+    /**\r\n+     * batch-get all {@link ServiceInstance service instances} by the specified service names\r\n+     *\r\n+     * @param serviceNames the multiple service names\r\n+     * @param offset       the offset of request , the number \"0\" indicates first page\r\n+     * @param requestSize  the number of request, the {@link Integer#MAX_VALUE max value} indicates the range is unlimited\r\n+     * @return non-null read-only {@link Map} whose key is the service name and value is\r\n+     * the {@link Page pagination} of {@link ServiceInstance service instances}\r\n+     * @throws NullPointerException          if <code>serviceName</code> is <code>null</code>\r\n+     * @throws IllegalArgumentException      if <code>offset</code> or <code>requestSize</code> is negative number\r\n+     * @throws UnsupportedOperationException if not supported\r\n+     */\r\n+    default Map<String, Page<ServiceInstance>> getInstances(Iterable<String> serviceNames, int offset, int requestSize) throws\r\n+            NullPointerException, IllegalArgumentException {\r\n+        Map<String, Page<ServiceInstance>> instances = new LinkedHashMap<>();\r\n+        for (String serviceName : serviceNames) {\r\n+            instances.put(serviceName, getInstances(serviceName, offset, requestSize));\r\n+        }\r\n+        return unmodifiableMap(instances);\r\n+    }\r\n+\r\n+    /**\r\n+     * Add an instance of {@link ServiceInstancesChangedListener} for specified service\r\n+     * <p>\r\n+     * Default, current method will be invoked by {@link ServiceDiscoveryRegistry#subscribe(URL, NotifyListener)\r\n+     * the ServiceDiscoveryRegistry on the subscription}, and it's mandatory to\r\n+     * {@link EventDispatcher#addEventListener(EventListener) add} the {@link ServiceInstancesChangedListener} argument\r\n+     * into {@link EventDispatcher} whether the subclass implements same approach or not, thus this method is used to\r\n+     * trigger or adapt the vendor's change notification mechanism typically, like Zookeeper Watcher,\r\n+     * Nacos EventListener. If the registry observes the change, It's suggested that the implementation could invoke\r\n+     * {@link #dispatchServiceInstancesChangedEvent(String)} method or variants\r\n+     *\r\n+     * @param listener an instance of {@link ServiceInstancesChangedListener}\r\n+     * @throws NullPointerException\r\n+     * @throws IllegalArgumentException\r\n+     * @see EventPublishingServiceDiscovery\r\n+     * @see EventDispatcher\r\n+     */\r\n+    default void addServiceInstancesChangedListener(ServiceInstancesChangedListener listener)\r\n+            throws NullPointerException, IllegalArgumentException {\r\n+    }\r\n+\r\n+    /**\r\n+     * unsubscribe to instances change event.\r\n+     * @param listener\r\n+     * @throws IllegalArgumentException\r\n+     */\r\n+    default void removeServiceInstancesChangedListener(ServiceInstancesChangedListener listener)\r\n+            throws IllegalArgumentException {\r\n+    }\r\n+\r\n+    /**\r\n+     * Dispatch the {@link ServiceInstancesChangedEvent}\r\n+     *\r\n+     * @param serviceName the name of service whose service instances have been changed\r\n+     */\r\n+    default void dispatchServiceInstancesChangedEvent(String serviceName) {\r\n+        dispatchServiceInstancesChangedEvent(serviceName, getInstances(serviceName));\r\n+    }\r\n+\r\n+    /**\r\n+     * Dispatch the {@link ServiceInstancesChangedEvent}\r\n+     *\r\n+     * @param serviceName       the name of service whose service instances have been changed\r\n+     * @param otherServiceNames the names of other services\r\n+     */\r\n+    default void dispatchServiceInstancesChangedEvent(String serviceName, String... otherServiceNames) {\r\n+        dispatchServiceInstancesChangedEvent(serviceName, getInstances(serviceName));\r\n+        if (otherServiceNames != null) {\r\n+            Stream.of(otherServiceNames)\r\n+                    .filter(StringUtils::isNotEmpty)\r\n+                    .forEach(this::dispatchServiceInstancesChangedEvent);\r\n+        }\r\n+    }\r\n+\r\n+    /**\r\n+     * Dispatch the {@link ServiceInstancesChangedEvent}\r\n+     *\r\n+     * @param serviceName      the name of service whose service instances have been changed\r\n+     * @param serviceInstances the service instances have been changed\r\n+     */\r\n+    default void dispatchServiceInstancesChangedEvent(String serviceName, List<ServiceInstance> serviceInstances) {\r\n+        dispatchServiceInstancesChangedEvent(new ServiceInstancesChangedEvent(serviceName, serviceInstances));\r\n+    }\r\n+\r\n+    /**\r\n+     * Dispatch the {@link ServiceInstancesChangedEvent}\r\n+     *\r\n+     * @param event the {@link ServiceInstancesChangedEvent}\r\n+     */\r\n+    default void dispatchServiceInstancesChangedEvent(ServiceInstancesChangedEvent event) {\r\n+        getDefaultExtension().dispatch(event);\r\n+    }\r\n+\r\n+    // ==================================================================================== //\r\n+\r\n+//    String getKey(URL exportedURL);\r\n+\r\n+    default URL getUrl() {\r\n+        return null;\r\n+    }\r\n+\r\n+    ServiceInstance getLocalInstance();\r\n+\r\n+    /**\r\n+     * A human-readable description of the implementation\r\n+     *\r\n+     * @return The description.\r\n+     */\r\n+    String toString();\r\n+}\r\n"}, {"source1": "org/apache/dubbo/registry/client/ServiceDiscoveryFactory.java", "source2": "org/apache/dubbo/registry/client/ServiceDiscoveryFactory.java", "comments": ["Line-ending differences only"], "unified_diff": "@@ -1,53 +1,53 @@\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.client;\n-\n-import org.apache.dubbo.common.URL;\n-import org.apache.dubbo.common.extension.ExtensionLoader;\n-import org.apache.dubbo.common.extension.SPI;\n-\n-import static org.apache.dubbo.common.extension.ExtensionLoader.getExtensionLoader;\n-\n-/**\n- * The factory to create {@link ServiceDiscovery}\n- *\n- * @see ServiceDiscovery\n- * @since 2.7.5\n- */\n-@SPI(\"default\")\n-public interface ServiceDiscoveryFactory {\n-\n-    /**\n-     * Get the instance of {@link ServiceDiscovery}\n-     *\n-     * @param registryURL the {@link URL} to connect the registry\n-     * @return non-null\n-     */\n-    ServiceDiscovery getServiceDiscovery(URL registryURL);\n-\n-    /**\n-     * Get the extension instance of {@link ServiceDiscoveryFactory} by {@link URL#getProtocol() the protocol}\n-     *\n-     * @param registryURL the {@link URL} to connect the registry\n-     * @return non-null\n-     */\n-    static ServiceDiscoveryFactory getExtension(URL registryURL) {\n-        String protocol = registryURL.getProtocol();\n-        ExtensionLoader<ServiceDiscoveryFactory> loader = getExtensionLoader(ServiceDiscoveryFactory.class);\n-        return loader.getOrDefaultExtension(protocol);\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.client;\r\n+\r\n+import org.apache.dubbo.common.URL;\r\n+import org.apache.dubbo.common.extension.ExtensionLoader;\r\n+import org.apache.dubbo.common.extension.SPI;\r\n+\r\n+import static org.apache.dubbo.common.extension.ExtensionLoader.getExtensionLoader;\r\n+\r\n+/**\r\n+ * The factory to create {@link ServiceDiscovery}\r\n+ *\r\n+ * @see ServiceDiscovery\r\n+ * @since 2.7.5\r\n+ */\r\n+@SPI(\"default\")\r\n+public interface ServiceDiscoveryFactory {\r\n+\r\n+    /**\r\n+     * Get the instance of {@link ServiceDiscovery}\r\n+     *\r\n+     * @param registryURL the {@link URL} to connect the registry\r\n+     * @return non-null\r\n+     */\r\n+    ServiceDiscovery getServiceDiscovery(URL registryURL);\r\n+\r\n+    /**\r\n+     * Get the extension instance of {@link ServiceDiscoveryFactory} by {@link URL#getProtocol() the protocol}\r\n+     *\r\n+     * @param registryURL the {@link URL} to connect the registry\r\n+     * @return non-null\r\n+     */\r\n+    static ServiceDiscoveryFactory getExtension(URL registryURL) {\r\n+        String protocol = registryURL.getProtocol();\r\n+        ExtensionLoader<ServiceDiscoveryFactory> loader = getExtensionLoader(ServiceDiscoveryFactory.class);\r\n+        return loader.getOrDefaultExtension(protocol);\r\n+    }\r\n+}\r\n"}, {"source1": "org/apache/dubbo/registry/client/ServiceDiscoveryRegistry.java", "source2": "org/apache/dubbo/registry/client/ServiceDiscoveryRegistry.java", "comments": ["Line-ending differences only"], "unified_diff": "@@ -1,498 +1,498 @@\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.client;\n-\n-import org.apache.dubbo.common.URL;\n-import org.apache.dubbo.common.extension.ExtensionLoader;\n-import org.apache.dubbo.common.extension.SPI;\n-import org.apache.dubbo.common.logger.Logger;\n-import org.apache.dubbo.common.logger.LoggerFactory;\n-import org.apache.dubbo.common.utils.CollectionUtils;\n-import org.apache.dubbo.common.utils.StringUtils;\n-import org.apache.dubbo.metadata.MappingChangedEvent;\n-import org.apache.dubbo.metadata.MappingListener;\n-import org.apache.dubbo.metadata.ServiceNameMapping;\n-import org.apache.dubbo.metadata.WritableMetadataService;\n-import org.apache.dubbo.registry.NotifyListener;\n-import org.apache.dubbo.registry.Registry;\n-import org.apache.dubbo.registry.client.event.ServiceInstancesChangedEvent;\n-import org.apache.dubbo.registry.client.event.listener.ServiceInstancesChangedListener;\n-import org.apache.dubbo.registry.client.metadata.SubscribedURLsSynthesizer;\n-import org.apache.dubbo.registry.support.AbstractRegistryFactory;\n-import org.apache.dubbo.registry.support.FailbackRegistry;\n-\n-import java.util.ArrayList;\n-import java.util.Collections;\n-import java.util.HashMap;\n-import java.util.LinkedHashMap;\n-import java.util.LinkedHashSet;\n-import java.util.List;\n-import java.util.Map;\n-import java.util.Objects;\n-import java.util.Set;\n-import java.util.TreeSet;\n-import java.util.stream.Collectors;\n-\n-import static java.lang.String.format;\n-import static java.util.Collections.emptySet;\n-import static java.util.Collections.unmodifiableSet;\n-import static java.util.stream.Collectors.toSet;\n-import static java.util.stream.Stream.of;\n-import static org.apache.dubbo.common.constants.CommonConstants.DUBBO;\n-import static org.apache.dubbo.common.constants.CommonConstants.GROUP_CHAR_SEPARATOR;\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.MAPPING_KEY;\n-import static org.apache.dubbo.common.constants.CommonConstants.PROTOCOL_KEY;\n-import static org.apache.dubbo.common.constants.CommonConstants.PROVIDER_SIDE;\n-import static org.apache.dubbo.common.constants.CommonConstants.SIDE_KEY;\n-import static org.apache.dubbo.common.constants.CommonConstants.VERSION_KEY;\n-import static org.apache.dubbo.common.constants.RegistryConstants.PROVIDED_BY;\n-import static org.apache.dubbo.common.constants.RegistryConstants.REGISTRY_CLUSTER_KEY;\n-import static org.apache.dubbo.common.constants.RegistryConstants.REGISTRY_TYPE_KEY;\n-import static org.apache.dubbo.common.constants.RegistryConstants.SERVICE_REGISTRY_TYPE;\n-import static org.apache.dubbo.common.constants.RegistryConstants.SUBSCRIBED_SERVICE_NAMES_KEY;\n-import static org.apache.dubbo.common.function.ThrowableAction.execute;\n-import static org.apache.dubbo.common.utils.CollectionUtils.isEmpty;\n-import static org.apache.dubbo.common.utils.StringUtils.isBlank;\n-import static org.apache.dubbo.registry.client.ServiceDiscoveryFactory.getExtension;\n-import static org.apache.dubbo.rpc.Constants.ID_KEY;\n-\n-/**\n- * Being different to the traditional registry, {@link ServiceDiscoveryRegistry} that is a new service-oriented\n- * {@link Registry} based on {@link ServiceDiscovery}, it will not interact in the external registry directly,\n- * but store the {@link URL urls} that Dubbo services exported and referenced into {@link WritableMetadataService}\n- * when {@link #register(URL)} and {@link #subscribe(URL, NotifyListener)} methods are executed. After that the exported\n- * {@link URL urls} can be get from {@link WritableMetadataService#getExportedURLs()} and its variant methods. In contrast,\n- * {@link WritableMetadataService#getSubscribedURLs()} method offers the subscribed {@link URL URLs}.\n- * <p>\n- * Every {@link ServiceDiscoveryRegistry} object has its own {@link ServiceDiscovery} instance that was initialized\n- * under {@link #ServiceDiscoveryRegistry(URL) the construction}. As the primary argument of constructor , the\n- * {@link URL} of connection the registry decides what the kind of ServiceDiscovery is. Generally, each\n- * protocol associates with a kind of {@link ServiceDiscovery}'s implementation if present, or the\n- * {@link FileSystemServiceDiscovery} will be the default one. Obviously, it's also allowed to extend\n- * {@link ServiceDiscovery} using {@link SPI the Dubbo SPI}.\n- * In contrast, current {@link ServiceInstance service instance} will not be registered to the registry whether any\n- * Dubbo service is exported or not.\n- * <p>\n- *\n- * @see ServiceDiscovery\n- * @see FailbackRegistry\n- * @see WritableMetadataService\n- * @since 2.7.5\n- */\n-public class ServiceDiscoveryRegistry implements Registry {\n-\n-    protected final Logger logger = LoggerFactory.getLogger(getClass());\n-\n-    private final ServiceDiscovery serviceDiscovery;\n-\n-    private final Set<String> subscribedServices;\n-\n-    private final ServiceNameMapping serviceNameMapping;\n-\n-    private final WritableMetadataService writableMetadataService;\n-\n-    private final Set<String> registeredListeners = new LinkedHashSet<>();\n-\n-    /* apps - listener */\n-    private final Map<String, ServiceInstancesChangedListener> serviceListeners = new HashMap<>();\n-    private final Map<String, String> serviceToAppsMapping = new HashMap<>();\n-\n-    private URL registryURL;\n-\n-    /**\n-     * A cache for all URLs of services that the subscribed services exported\n-     * The key is the service name\n-     * The value is a nested {@link Map} whose key is the revision and value is all URLs of services\n-     */\n-    private final Map<String, Map<String, List<URL>>> serviceRevisionExportedURLsCache = new LinkedHashMap<>();\n-\n-    public ServiceDiscoveryRegistry(URL registryURL) {\n-        this.registryURL = registryURL;\n-        this.serviceDiscovery = createServiceDiscovery(registryURL);\n-        this.subscribedServices = parseServices(registryURL.getParameter(SUBSCRIBED_SERVICE_NAMES_KEY));\n-        this.serviceNameMapping = ServiceNameMapping.getExtension(registryURL.getParameter(MAPPING_KEY));\n-        this.writableMetadataService = WritableMetadataService.getDefaultExtension();\n-    }\n-\n-    public ServiceDiscovery getServiceDiscovery() {\n-        return serviceDiscovery;\n-    }\n-\n-    /**\n-     * Create the {@link ServiceDiscovery} from the registry {@link URL}\n-     *\n-     * @param registryURL the {@link URL} to connect the registry\n-     * @return non-null\n-     */\n-    protected ServiceDiscovery createServiceDiscovery(URL registryURL) {\n-        ServiceDiscovery originalServiceDiscovery = getServiceDiscovery(registryURL);\n-        ServiceDiscovery serviceDiscovery = enhanceEventPublishing(originalServiceDiscovery);\n-        execute(() -> {\n-            serviceDiscovery.initialize(registryURL.addParameter(INTERFACE_KEY, ServiceDiscovery.class.getName())\n-                    .removeParameter(REGISTRY_TYPE_KEY));\n-        });\n-        return serviceDiscovery;\n-    }\n-\n-    private List<SubscribedURLsSynthesizer> initSubscribedURLsSynthesizers() {\n-        ExtensionLoader<SubscribedURLsSynthesizer> loader = ExtensionLoader.getExtensionLoader(SubscribedURLsSynthesizer.class);\n-        return Collections.unmodifiableList(new ArrayList<>(loader.getSupportedExtensionInstances()));\n-    }\n-\n-    /**\n-     * Get the instance {@link ServiceDiscovery} from the registry {@link URL} using\n-     * {@link ServiceDiscoveryFactory} SPI\n-     *\n-     * @param registryURL the {@link URL} to connect the registry\n-     * @return\n-     */\n-    private ServiceDiscovery getServiceDiscovery(URL registryURL) {\n-        ServiceDiscoveryFactory factory = getExtension(registryURL);\n-        return factory.getServiceDiscovery(registryURL);\n-    }\n-\n-    /**\n-     * Enhance the original {@link ServiceDiscovery} with event publishing feature\n-     *\n-     * @param original the original {@link ServiceDiscovery}\n-     * @return {@link EventPublishingServiceDiscovery} instance\n-     */\n-    private ServiceDiscovery enhanceEventPublishing(ServiceDiscovery original) {\n-        return new EventPublishingServiceDiscovery(original);\n-    }\n-\n-    protected boolean shouldRegister(URL providerURL) {\n-\n-        String side = providerURL.getParameter(SIDE_KEY);\n-\n-        boolean should = PROVIDER_SIDE.equals(side); // Only register the Provider.\n-\n-        if (!should) {\n-            if (logger.isDebugEnabled()) {\n-                logger.debug(String.format(\"The URL[%s] should not be registered.\", providerURL.toString()));\n-            }\n-        }\n-\n-        return should;\n-    }\n-\n-    protected boolean shouldSubscribe(URL subscribedURL) {\n-        return !shouldRegister(subscribedURL);\n-    }\n-\n-    @Override\n-    public final void register(URL url) {\n-        if (!shouldRegister(url)) { // Should Not Register\n-            return;\n-        }\n-        doRegister(url);\n-    }\n-\n-    public void doRegister(URL url) {\n-        String registryCluster = serviceDiscovery.getUrl().getParameter(ID_KEY);\n-        if (registryCluster != null && url.getParameter(REGISTRY_CLUSTER_KEY) == null) {\n-            url = url.addParameter(REGISTRY_CLUSTER_KEY, registryCluster);\n-        }\n-        if (writableMetadataService.exportURL(url)) {\n-            if (logger.isInfoEnabled()) {\n-                logger.info(format(\"The URL[%s] registered successfully.\", url.toString()));\n-            }\n-        } else {\n-            if (logger.isWarnEnabled()) {\n-                logger.info(format(\"The URL[%s] has been registered.\", url.toString()));\n-            }\n-        }\n-    }\n-\n-    @Override\n-    public final void unregister(URL url) {\n-        if (!shouldRegister(url)) {\n-            return;\n-        }\n-        doUnregister(url);\n-    }\n-\n-    public void doUnregister(URL url) {\n-        String registryCluster = serviceDiscovery.getUrl().getParameter(ID_KEY);\n-        if (registryCluster != null && url.getParameter(REGISTRY_CLUSTER_KEY) == null) {\n-            url = url.addParameter(REGISTRY_CLUSTER_KEY, registryCluster);\n-        }\n-        if (writableMetadataService.unexportURL(url)) {\n-            if (logger.isInfoEnabled()) {\n-                logger.info(format(\"The URL[%s] deregistered successfully.\", url.toString()));\n-            }\n-        } else {\n-            if (logger.isWarnEnabled()) {\n-                logger.info(format(\"The URL[%s] has been deregistered.\", url.toString()));\n-            }\n-        }\n-    }\n-\n-    @Override\n-    public final void subscribe(URL url, NotifyListener listener) {\n-        if (!shouldSubscribe(url)) { // Should Not Subscribe\n-            return;\n-        }\n-        String registryCluster = serviceDiscovery.getUrl().getParameter(ID_KEY);\n-        if (registryCluster != null && url.getParameter(REGISTRY_CLUSTER_KEY) == null) {\n-            url = url.addParameter(REGISTRY_CLUSTER_KEY, registryCluster);\n-        }\n-        doSubscribe(url, listener);\n-    }\n-\n-    public void doSubscribe(URL url, NotifyListener listener) {\n-        writableMetadataService.subscribeURL(url);\n-\n-        Set<String> serviceNames = getServices(url, listener);\n-\n-        if (CollectionUtils.isEmpty(serviceNames)) {\n-            logger.warn(\"Should has at least one way to know which services this interface belongs to, subscription url: \" + url);\n-            return;\n-        }\n-\n-        subscribeURLs(url, listener, serviceNames);\n-    }\n-\n-    @Override\n-    public final void unsubscribe(URL url, NotifyListener listener) {\n-        if (!shouldSubscribe(url)) { // Should Not Subscribe\n-            return;\n-        }\n-        String registryCluster = serviceDiscovery.getUrl().getParameter(ID_KEY);\n-        if (registryCluster != null && url.getParameter(REGISTRY_CLUSTER_KEY) == null) {\n-            url = url.addParameter(REGISTRY_CLUSTER_KEY, registryCluster);\n-        }\n-        doUnsubscribe(url, listener);\n-    }\n-\n-    public void doUnsubscribe(URL url, NotifyListener listener) {\n-        writableMetadataService.unsubscribeURL(url);\n-        String protocolServiceKey = url.getServiceKey() + GROUP_CHAR_SEPARATOR + url.getParameter(PROTOCOL_KEY, DUBBO);\n-        String serviceNamesKey = serviceToAppsMapping.remove(protocolServiceKey);\n-        ServiceInstancesChangedListener instancesChangedListener = serviceListeners.get(serviceNamesKey);\n-        instancesChangedListener.removeListener(protocolServiceKey);\n-    }\n-\n-    @Override\n-    public List<URL> lookup(URL url) {\n-        throw new UnsupportedOperationException(\"\");\n-    }\n-\n-    @Override\n-    public URL getUrl() {\n-        return registryURL;\n-    }\n-\n-    @Override\n-    public boolean isAvailable() {\n-        return !serviceDiscovery.getServices().isEmpty();\n-    }\n-\n-    @Override\n-    public void destroy() {\n-        AbstractRegistryFactory.removeDestroyedRegistry(this);\n-        execute(() -> {\n-            // stop ServiceDiscovery\n-            serviceDiscovery.destroy();\n-        });\n-    }\n-\n-    protected void subscribeURLs(URL url, NotifyListener listener, Set<String> serviceNames) {\n-        String serviceNamesKey = serviceNames.toString();\n-        String protocolServiceKey = url.getServiceKey() + GROUP_CHAR_SEPARATOR + url.getParameter(PROTOCOL_KEY, DUBBO);\n-        serviceToAppsMapping.put(protocolServiceKey, serviceNamesKey);\n-\n-        // register ServiceInstancesChangedListener\n-        ServiceInstancesChangedListener serviceListener = serviceListeners.computeIfAbsent(serviceNamesKey,\n-                k -> new ServiceInstancesChangedListener(serviceNames, serviceDiscovery));\n-        serviceListener.setUrl(url);\n-        listener.addServiceListener(serviceListener);\n-\n-        serviceListener.addListener(protocolServiceKey, listener);\n-        registerServiceInstancesChangedListener(url, serviceListener);\n-\n-        // FIXME: This will cause redundant duplicate notifications\n-        serviceNames.forEach(serviceName -> {\n-            List<ServiceInstance> serviceInstances = serviceDiscovery.getInstances(serviceName);\n-            if (CollectionUtils.isNotEmpty(serviceInstances)) {\n-                serviceListener.onEvent(new ServiceInstancesChangedEvent(serviceName, serviceInstances));\n-            } else {\n-                logger.info(\"getInstances by serviceName=\" + serviceName + \" is empty, waiting for serviceListener callback. url=\" + url);\n-            }\n-        });\n-\n-        listener.notify(serviceListener.getUrls(protocolServiceKey));\n-\n-    }\n-\n-    /**\n-     * Register the {@link ServiceInstancesChangedListener} If absent\n-     *\n-     * @param url      {@link URL}\n-     * @param listener the {@link ServiceInstancesChangedListener}\n-     */\n-    private void registerServiceInstancesChangedListener(URL url, ServiceInstancesChangedListener listener) {\n-        String listenerId = createListenerId(url, listener);\n-        if (registeredListeners.add(listenerId)) {\n-            serviceDiscovery.addServiceInstancesChangedListener(listener);\n-        }\n-    }\n-\n-    private String createListenerId(URL url, ServiceInstancesChangedListener listener) {\n-        return listener.getServiceNames() + \":\" + url.toString(VERSION_KEY, GROUP_KEY, PROTOCOL_KEY);\n-    }\n-\n-    /**\n-     * 1.developer explicitly specifies the application name this interface belongs to\n-     * 2.check Interface-App mapping\n-     * 3.use the services specified in registry url.\n-     *\n-     * @param subscribedURL\n-     * @return\n-     */\n-    protected Set<String> getServices(URL subscribedURL, final NotifyListener listener) {\n-        Set<String> subscribedServices = new TreeSet<>();\n-\n-        String serviceNames = subscribedURL.getParameter(PROVIDED_BY);\n-        if (StringUtils.isNotEmpty(serviceNames)) {\n-            logger.info(subscribedURL.getServiceInterface() + \" mapping to \" + serviceNames + \" instructed by provided-by set by user.\");\n-            subscribedServices.addAll(parseServices(serviceNames));\n-        }\n-\n-        if (isEmpty(subscribedServices)) {\n-            Set<String> mappedServices = findMappedServices(subscribedURL, new DefaultMappingListener(subscribedURL, subscribedServices, listener));\n-            logger.info(subscribedURL.getServiceInterface() + \" mapping to \" + serviceNames + \" instructed by remote metadata center.\");\n-            subscribedServices.addAll(mappedServices);\n-            if (isEmpty(subscribedServices)) {\n-                logger.info(subscribedURL.getServiceInterface() + \" mapping to \" + serviceNames + \" by default.\");\n-                subscribedServices.addAll(getSubscribedServices());\n-            }\n-        }\n-        return subscribedServices;\n-    }\n-\n-    public static Set<String> parseServices(String literalServices) {\n-        return isBlank(literalServices) ? emptySet() :\n-                unmodifiableSet(of(literalServices.split(\",\"))\n-                        .map(String::trim)\n-                        .filter(StringUtils::isNotEmpty)\n-                        .collect(toSet()));\n-    }\n-\n-    /**\n-     * Get the subscribed service names\n-     *\n-     * @return non-null\n-     */\n-    public Set<String> getSubscribedServices() {\n-        return subscribedServices;\n-    }\n-\n-    /**\n-     * Get the mapped services name by the specified {@link URL}\n-     *\n-     * @param subscribedURL\n-     * @return\n-     */\n-    protected Set<String> findMappedServices(URL subscribedURL, MappingListener listener) {\n-        return serviceNameMapping.getAndListen(subscribedURL, listener);\n-    }\n-\n-    /**\n-     * Create an instance of {@link ServiceDiscoveryRegistry} if supported\n-     *\n-     * @param registryURL the {@link URL url} of registry\n-     * @return <code>null</code> if not supported\n-     */\n-    public static ServiceDiscoveryRegistry create(URL registryURL) {\n-        return supports(registryURL) ? new ServiceDiscoveryRegistry(registryURL) : null;\n-    }\n-\n-    /**\n-     * Supports or not ?\n-     *\n-     * @param registryURL the {@link URL url} of registry\n-     * @return if supported, return <code>true</code>, or <code>false</code>\n-     */\n-    public static boolean supports(URL registryURL) {\n-        return SERVICE_REGISTRY_TYPE.equalsIgnoreCase(registryURL.getParameter(REGISTRY_TYPE_KEY));\n-    }\n-\n-    private static List<URL> filterSubscribedURLs(URL subscribedURL, List<URL> exportedURLs) {\n-        return exportedURLs.stream()\n-                .filter(url -> isSameServiceInterface(subscribedURL, url))\n-                .filter(url -> isSameParameter(subscribedURL, url, VERSION_KEY))\n-                .filter(url -> isSameParameter(subscribedURL, url, GROUP_KEY))\n-                .filter(url -> isCompatibleProtocol(subscribedURL, url))\n-                .collect(Collectors.toList());\n-    }\n-\n-    private static boolean isSameServiceInterface(URL one, URL another) {\n-        return Objects.equals(one.getServiceInterface(), another.getServiceInterface());\n-    }\n-\n-    private static boolean isSameParameter(URL one, URL another, String key) {\n-        return Objects.equals(one.getParameter(key), another.getParameter(key));\n-    }\n-\n-    private static boolean isCompatibleProtocol(URL one, URL another) {\n-        String protocol = one.getParameter(PROTOCOL_KEY);\n-        return isCompatibleProtocol(protocol, another);\n-    }\n-\n-    private static boolean isCompatibleProtocol(String protocol, URL targetURL) {\n-        return protocol == null || Objects.equals(protocol, targetURL.getParameter(PROTOCOL_KEY))\n-                || Objects.equals(protocol, targetURL.getProtocol());\n-    }\n-\n-    private class DefaultMappingListener implements MappingListener {\n-        private URL url;\n-        private Set<String> oldApps;\n-        private NotifyListener listener;\n-\n-        public DefaultMappingListener(URL subscribedURL, Set<String> serviceNames, NotifyListener listener) {\n-            this.url = subscribedURL;\n-            this.oldApps = serviceNames;\n-            this.listener = listener;\n-        }\n-\n-        @Override\n-        public void onEvent(MappingChangedEvent event) {\n-            Set<String> newApps = event.getApps();\n-            Set<String> tempOldApps = oldApps;\n-            oldApps = newApps;\n-\n-            if (CollectionUtils.isEmpty(newApps)) {\n-                return;\n-            }\n-\n-            if (CollectionUtils.isEmpty(tempOldApps) && newApps.size() > 0) {\n-                subscribeURLs(url, listener, newApps);\n-                return;\n-            }\n-\n-            for (String newAppName : newApps) {\n-                if (!tempOldApps.contains(newAppName)) {\n-                    subscribeURLs(url, listener, newApps);\n-                    return;\n-                }\n-            }\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.client;\r\n+\r\n+import org.apache.dubbo.common.URL;\r\n+import org.apache.dubbo.common.extension.ExtensionLoader;\r\n+import org.apache.dubbo.common.extension.SPI;\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.CollectionUtils;\r\n+import org.apache.dubbo.common.utils.StringUtils;\r\n+import org.apache.dubbo.metadata.MappingChangedEvent;\r\n+import org.apache.dubbo.metadata.MappingListener;\r\n+import org.apache.dubbo.metadata.ServiceNameMapping;\r\n+import org.apache.dubbo.metadata.WritableMetadataService;\r\n+import org.apache.dubbo.registry.NotifyListener;\r\n+import org.apache.dubbo.registry.Registry;\r\n+import org.apache.dubbo.registry.client.event.ServiceInstancesChangedEvent;\r\n+import org.apache.dubbo.registry.client.event.listener.ServiceInstancesChangedListener;\r\n+import org.apache.dubbo.registry.client.metadata.SubscribedURLsSynthesizer;\r\n+import org.apache.dubbo.registry.support.AbstractRegistryFactory;\r\n+import org.apache.dubbo.registry.support.FailbackRegistry;\r\n+\r\n+import java.util.ArrayList;\r\n+import java.util.Collections;\r\n+import java.util.HashMap;\r\n+import java.util.LinkedHashMap;\r\n+import java.util.LinkedHashSet;\r\n+import java.util.List;\r\n+import java.util.Map;\r\n+import java.util.Objects;\r\n+import java.util.Set;\r\n+import java.util.TreeSet;\r\n+import java.util.stream.Collectors;\r\n+\r\n+import static java.lang.String.format;\r\n+import static java.util.Collections.emptySet;\r\n+import static java.util.Collections.unmodifiableSet;\r\n+import static java.util.stream.Collectors.toSet;\r\n+import static java.util.stream.Stream.of;\r\n+import static org.apache.dubbo.common.constants.CommonConstants.DUBBO;\r\n+import static org.apache.dubbo.common.constants.CommonConstants.GROUP_CHAR_SEPARATOR;\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.MAPPING_KEY;\r\n+import static org.apache.dubbo.common.constants.CommonConstants.PROTOCOL_KEY;\r\n+import static org.apache.dubbo.common.constants.CommonConstants.PROVIDER_SIDE;\r\n+import static org.apache.dubbo.common.constants.CommonConstants.SIDE_KEY;\r\n+import static org.apache.dubbo.common.constants.CommonConstants.VERSION_KEY;\r\n+import static org.apache.dubbo.common.constants.RegistryConstants.PROVIDED_BY;\r\n+import static org.apache.dubbo.common.constants.RegistryConstants.REGISTRY_CLUSTER_KEY;\r\n+import static org.apache.dubbo.common.constants.RegistryConstants.REGISTRY_TYPE_KEY;\r\n+import static org.apache.dubbo.common.constants.RegistryConstants.SERVICE_REGISTRY_TYPE;\r\n+import static org.apache.dubbo.common.constants.RegistryConstants.SUBSCRIBED_SERVICE_NAMES_KEY;\r\n+import static org.apache.dubbo.common.function.ThrowableAction.execute;\r\n+import static org.apache.dubbo.common.utils.CollectionUtils.isEmpty;\r\n+import static org.apache.dubbo.common.utils.StringUtils.isBlank;\r\n+import static org.apache.dubbo.registry.client.ServiceDiscoveryFactory.getExtension;\r\n+import static org.apache.dubbo.rpc.Constants.ID_KEY;\r\n+\r\n+/**\r\n+ * Being different to the traditional registry, {@link ServiceDiscoveryRegistry} that is a new service-oriented\r\n+ * {@link Registry} based on {@link ServiceDiscovery}, it will not interact in the external registry directly,\r\n+ * but store the {@link URL urls} that Dubbo services exported and referenced into {@link WritableMetadataService}\r\n+ * when {@link #register(URL)} and {@link #subscribe(URL, NotifyListener)} methods are executed. After that the exported\r\n+ * {@link URL urls} can be get from {@link WritableMetadataService#getExportedURLs()} and its variant methods. In contrast,\r\n+ * {@link WritableMetadataService#getSubscribedURLs()} method offers the subscribed {@link URL URLs}.\r\n+ * <p>\r\n+ * Every {@link ServiceDiscoveryRegistry} object has its own {@link ServiceDiscovery} instance that was initialized\r\n+ * under {@link #ServiceDiscoveryRegistry(URL) the construction}. As the primary argument of constructor , the\r\n+ * {@link URL} of connection the registry decides what the kind of ServiceDiscovery is. Generally, each\r\n+ * protocol associates with a kind of {@link ServiceDiscovery}'s implementation if present, or the\r\n+ * {@link FileSystemServiceDiscovery} will be the default one. Obviously, it's also allowed to extend\r\n+ * {@link ServiceDiscovery} using {@link SPI the Dubbo SPI}.\r\n+ * In contrast, current {@link ServiceInstance service instance} will not be registered to the registry whether any\r\n+ * Dubbo service is exported or not.\r\n+ * <p>\r\n+ *\r\n+ * @see ServiceDiscovery\r\n+ * @see FailbackRegistry\r\n+ * @see WritableMetadataService\r\n+ * @since 2.7.5\r\n+ */\r\n+public class ServiceDiscoveryRegistry implements Registry {\r\n+\r\n+    protected final Logger logger = LoggerFactory.getLogger(getClass());\r\n+\r\n+    private final ServiceDiscovery serviceDiscovery;\r\n+\r\n+    private final Set<String> subscribedServices;\r\n+\r\n+    private final ServiceNameMapping serviceNameMapping;\r\n+\r\n+    private final WritableMetadataService writableMetadataService;\r\n+\r\n+    private final Set<String> registeredListeners = new LinkedHashSet<>();\r\n+\r\n+    /* apps - listener */\r\n+    private final Map<String, ServiceInstancesChangedListener> serviceListeners = new HashMap<>();\r\n+    private final Map<String, String> serviceToAppsMapping = new HashMap<>();\r\n+\r\n+    private URL registryURL;\r\n+\r\n+    /**\r\n+     * A cache for all URLs of services that the subscribed services exported\r\n+     * The key is the service name\r\n+     * The value is a nested {@link Map} whose key is the revision and value is all URLs of services\r\n+     */\r\n+    private final Map<String, Map<String, List<URL>>> serviceRevisionExportedURLsCache = new LinkedHashMap<>();\r\n+\r\n+    public ServiceDiscoveryRegistry(URL registryURL) {\r\n+        this.registryURL = registryURL;\r\n+        this.serviceDiscovery = createServiceDiscovery(registryURL);\r\n+        this.subscribedServices = parseServices(registryURL.getParameter(SUBSCRIBED_SERVICE_NAMES_KEY));\r\n+        this.serviceNameMapping = ServiceNameMapping.getExtension(registryURL.getParameter(MAPPING_KEY));\r\n+        this.writableMetadataService = WritableMetadataService.getDefaultExtension();\r\n+    }\r\n+\r\n+    public ServiceDiscovery getServiceDiscovery() {\r\n+        return serviceDiscovery;\r\n+    }\r\n+\r\n+    /**\r\n+     * Create the {@link ServiceDiscovery} from the registry {@link URL}\r\n+     *\r\n+     * @param registryURL the {@link URL} to connect the registry\r\n+     * @return non-null\r\n+     */\r\n+    protected ServiceDiscovery createServiceDiscovery(URL registryURL) {\r\n+        ServiceDiscovery originalServiceDiscovery = getServiceDiscovery(registryURL);\r\n+        ServiceDiscovery serviceDiscovery = enhanceEventPublishing(originalServiceDiscovery);\r\n+        execute(() -> {\r\n+            serviceDiscovery.initialize(registryURL.addParameter(INTERFACE_KEY, ServiceDiscovery.class.getName())\r\n+                    .removeParameter(REGISTRY_TYPE_KEY));\r\n+        });\r\n+        return serviceDiscovery;\r\n+    }\r\n+\r\n+    private List<SubscribedURLsSynthesizer> initSubscribedURLsSynthesizers() {\r\n+        ExtensionLoader<SubscribedURLsSynthesizer> loader = ExtensionLoader.getExtensionLoader(SubscribedURLsSynthesizer.class);\r\n+        return Collections.unmodifiableList(new ArrayList<>(loader.getSupportedExtensionInstances()));\r\n+    }\r\n+\r\n+    /**\r\n+     * Get the instance {@link ServiceDiscovery} from the registry {@link URL} using\r\n+     * {@link ServiceDiscoveryFactory} SPI\r\n+     *\r\n+     * @param registryURL the {@link URL} to connect the registry\r\n+     * @return\r\n+     */\r\n+    private ServiceDiscovery getServiceDiscovery(URL registryURL) {\r\n+        ServiceDiscoveryFactory factory = getExtension(registryURL);\r\n+        return factory.getServiceDiscovery(registryURL);\r\n+    }\r\n+\r\n+    /**\r\n+     * Enhance the original {@link ServiceDiscovery} with event publishing feature\r\n+     *\r\n+     * @param original the original {@link ServiceDiscovery}\r\n+     * @return {@link EventPublishingServiceDiscovery} instance\r\n+     */\r\n+    private ServiceDiscovery enhanceEventPublishing(ServiceDiscovery original) {\r\n+        return new EventPublishingServiceDiscovery(original);\r\n+    }\r\n+\r\n+    protected boolean shouldRegister(URL providerURL) {\r\n+\r\n+        String side = providerURL.getParameter(SIDE_KEY);\r\n+\r\n+        boolean should = PROVIDER_SIDE.equals(side); // Only register the Provider.\r\n+\r\n+        if (!should) {\r\n+            if (logger.isDebugEnabled()) {\r\n+                logger.debug(String.format(\"The URL[%s] should not be registered.\", providerURL.toString()));\r\n+            }\r\n+        }\r\n+\r\n+        return should;\r\n+    }\r\n+\r\n+    protected boolean shouldSubscribe(URL subscribedURL) {\r\n+        return !shouldRegister(subscribedURL);\r\n+    }\r\n+\r\n+    @Override\r\n+    public final void register(URL url) {\r\n+        if (!shouldRegister(url)) { // Should Not Register\r\n+            return;\r\n+        }\r\n+        doRegister(url);\r\n+    }\r\n+\r\n+    public void doRegister(URL url) {\r\n+        String registryCluster = serviceDiscovery.getUrl().getParameter(ID_KEY);\r\n+        if (registryCluster != null && url.getParameter(REGISTRY_CLUSTER_KEY) == null) {\r\n+            url = url.addParameter(REGISTRY_CLUSTER_KEY, registryCluster);\r\n+        }\r\n+        if (writableMetadataService.exportURL(url)) {\r\n+            if (logger.isInfoEnabled()) {\r\n+                logger.info(format(\"The URL[%s] registered successfully.\", url.toString()));\r\n+            }\r\n+        } else {\r\n+            if (logger.isWarnEnabled()) {\r\n+                logger.info(format(\"The URL[%s] has been registered.\", url.toString()));\r\n+            }\r\n+        }\r\n+    }\r\n+\r\n+    @Override\r\n+    public final void unregister(URL url) {\r\n+        if (!shouldRegister(url)) {\r\n+            return;\r\n+        }\r\n+        doUnregister(url);\r\n+    }\r\n+\r\n+    public void doUnregister(URL url) {\r\n+        String registryCluster = serviceDiscovery.getUrl().getParameter(ID_KEY);\r\n+        if (registryCluster != null && url.getParameter(REGISTRY_CLUSTER_KEY) == null) {\r\n+            url = url.addParameter(REGISTRY_CLUSTER_KEY, registryCluster);\r\n+        }\r\n+        if (writableMetadataService.unexportURL(url)) {\r\n+            if (logger.isInfoEnabled()) {\r\n+                logger.info(format(\"The URL[%s] deregistered successfully.\", url.toString()));\r\n+            }\r\n+        } else {\r\n+            if (logger.isWarnEnabled()) {\r\n+                logger.info(format(\"The URL[%s] has been deregistered.\", url.toString()));\r\n+            }\r\n+        }\r\n+    }\r\n+\r\n+    @Override\r\n+    public final void subscribe(URL url, NotifyListener listener) {\r\n+        if (!shouldSubscribe(url)) { // Should Not Subscribe\r\n+            return;\r\n+        }\r\n+        String registryCluster = serviceDiscovery.getUrl().getParameter(ID_KEY);\r\n+        if (registryCluster != null && url.getParameter(REGISTRY_CLUSTER_KEY) == null) {\r\n+            url = url.addParameter(REGISTRY_CLUSTER_KEY, registryCluster);\r\n+        }\r\n+        doSubscribe(url, listener);\r\n+    }\r\n+\r\n+    public void doSubscribe(URL url, NotifyListener listener) {\r\n+        writableMetadataService.subscribeURL(url);\r\n+\r\n+        Set<String> serviceNames = getServices(url, listener);\r\n+\r\n+        if (CollectionUtils.isEmpty(serviceNames)) {\r\n+            logger.warn(\"Should has at least one way to know which services this interface belongs to, subscription url: \" + url);\r\n+            return;\r\n+        }\r\n+\r\n+        subscribeURLs(url, listener, serviceNames);\r\n+    }\r\n+\r\n+    @Override\r\n+    public final void unsubscribe(URL url, NotifyListener listener) {\r\n+        if (!shouldSubscribe(url)) { // Should Not Subscribe\r\n+            return;\r\n+        }\r\n+        String registryCluster = serviceDiscovery.getUrl().getParameter(ID_KEY);\r\n+        if (registryCluster != null && url.getParameter(REGISTRY_CLUSTER_KEY) == null) {\r\n+            url = url.addParameter(REGISTRY_CLUSTER_KEY, registryCluster);\r\n+        }\r\n+        doUnsubscribe(url, listener);\r\n+    }\r\n+\r\n+    public void doUnsubscribe(URL url, NotifyListener listener) {\r\n+        writableMetadataService.unsubscribeURL(url);\r\n+        String protocolServiceKey = url.getServiceKey() + GROUP_CHAR_SEPARATOR + url.getParameter(PROTOCOL_KEY, DUBBO);\r\n+        String serviceNamesKey = serviceToAppsMapping.remove(protocolServiceKey);\r\n+        ServiceInstancesChangedListener instancesChangedListener = serviceListeners.get(serviceNamesKey);\r\n+        instancesChangedListener.removeListener(protocolServiceKey);\r\n+    }\r\n+\r\n+    @Override\r\n+    public List<URL> lookup(URL url) {\r\n+        throw new UnsupportedOperationException(\"\");\r\n+    }\r\n+\r\n+    @Override\r\n+    public URL getUrl() {\r\n+        return registryURL;\r\n+    }\r\n+\r\n+    @Override\r\n+    public boolean isAvailable() {\r\n+        return !serviceDiscovery.getServices().isEmpty();\r\n+    }\r\n+\r\n+    @Override\r\n+    public void destroy() {\r\n+        AbstractRegistryFactory.removeDestroyedRegistry(this);\r\n+        execute(() -> {\r\n+            // stop ServiceDiscovery\r\n+            serviceDiscovery.destroy();\r\n+        });\r\n+    }\r\n+\r\n+    protected void subscribeURLs(URL url, NotifyListener listener, Set<String> serviceNames) {\r\n+        String serviceNamesKey = serviceNames.toString();\r\n+        String protocolServiceKey = url.getServiceKey() + GROUP_CHAR_SEPARATOR + url.getParameter(PROTOCOL_KEY, DUBBO);\r\n+        serviceToAppsMapping.put(protocolServiceKey, serviceNamesKey);\r\n+\r\n+        // register ServiceInstancesChangedListener\r\n+        ServiceInstancesChangedListener serviceListener = serviceListeners.computeIfAbsent(serviceNamesKey,\r\n+                k -> new ServiceInstancesChangedListener(serviceNames, serviceDiscovery));\r\n+        serviceListener.setUrl(url);\r\n+        listener.addServiceListener(serviceListener);\r\n+\r\n+        serviceListener.addListener(protocolServiceKey, listener);\r\n+        registerServiceInstancesChangedListener(url, serviceListener);\r\n+\r\n+        // FIXME: This will cause redundant duplicate notifications\r\n+        serviceNames.forEach(serviceName -> {\r\n+            List<ServiceInstance> serviceInstances = serviceDiscovery.getInstances(serviceName);\r\n+            if (CollectionUtils.isNotEmpty(serviceInstances)) {\r\n+                serviceListener.onEvent(new ServiceInstancesChangedEvent(serviceName, serviceInstances));\r\n+            } else {\r\n+                logger.info(\"getInstances by serviceName=\" + serviceName + \" is empty, waiting for serviceListener callback. url=\" + url);\r\n+            }\r\n+        });\r\n+\r\n+        listener.notify(serviceListener.getUrls(protocolServiceKey));\r\n+\r\n+    }\r\n+\r\n+    /**\r\n+     * Register the {@link ServiceInstancesChangedListener} If absent\r\n+     *\r\n+     * @param url      {@link URL}\r\n+     * @param listener the {@link ServiceInstancesChangedListener}\r\n+     */\r\n+    private void registerServiceInstancesChangedListener(URL url, ServiceInstancesChangedListener listener) {\r\n+        String listenerId = createListenerId(url, listener);\r\n+        if (registeredListeners.add(listenerId)) {\r\n+            serviceDiscovery.addServiceInstancesChangedListener(listener);\r\n+        }\r\n+    }\r\n+\r\n+    private String createListenerId(URL url, ServiceInstancesChangedListener listener) {\r\n+        return listener.getServiceNames() + \":\" + url.toString(VERSION_KEY, GROUP_KEY, PROTOCOL_KEY);\r\n+    }\r\n+\r\n+    /**\r\n+     * 1.developer explicitly specifies the application name this interface belongs to\r\n+     * 2.check Interface-App mapping\r\n+     * 3.use the services specified in registry url.\r\n+     *\r\n+     * @param subscribedURL\r\n+     * @return\r\n+     */\r\n+    protected Set<String> getServices(URL subscribedURL, final NotifyListener listener) {\r\n+        Set<String> subscribedServices = new TreeSet<>();\r\n+\r\n+        String serviceNames = subscribedURL.getParameter(PROVIDED_BY);\r\n+        if (StringUtils.isNotEmpty(serviceNames)) {\r\n+            logger.info(subscribedURL.getServiceInterface() + \" mapping to \" + serviceNames + \" instructed by provided-by set by user.\");\r\n+            subscribedServices.addAll(parseServices(serviceNames));\r\n+        }\r\n+\r\n+        if (isEmpty(subscribedServices)) {\r\n+            Set<String> mappedServices = findMappedServices(subscribedURL, new DefaultMappingListener(subscribedURL, subscribedServices, listener));\r\n+            logger.info(subscribedURL.getServiceInterface() + \" mapping to \" + serviceNames + \" instructed by remote metadata center.\");\r\n+            subscribedServices.addAll(mappedServices);\r\n+            if (isEmpty(subscribedServices)) {\r\n+                logger.info(subscribedURL.getServiceInterface() + \" mapping to \" + serviceNames + \" by default.\");\r\n+                subscribedServices.addAll(getSubscribedServices());\r\n+            }\r\n+        }\r\n+        return subscribedServices;\r\n+    }\r\n+\r\n+    public static Set<String> parseServices(String literalServices) {\r\n+        return isBlank(literalServices) ? emptySet() :\r\n+                unmodifiableSet(of(literalServices.split(\",\"))\r\n+                        .map(String::trim)\r\n+                        .filter(StringUtils::isNotEmpty)\r\n+                        .collect(toSet()));\r\n+    }\r\n+\r\n+    /**\r\n+     * Get the subscribed service names\r\n+     *\r\n+     * @return non-null\r\n+     */\r\n+    public Set<String> getSubscribedServices() {\r\n+        return subscribedServices;\r\n+    }\r\n+\r\n+    /**\r\n+     * Get the mapped services name by the specified {@link URL}\r\n+     *\r\n+     * @param subscribedURL\r\n+     * @return\r\n+     */\r\n+    protected Set<String> findMappedServices(URL subscribedURL, MappingListener listener) {\r\n+        return serviceNameMapping.getAndListen(subscribedURL, listener);\r\n+    }\r\n+\r\n+    /**\r\n+     * Create an instance of {@link ServiceDiscoveryRegistry} if supported\r\n+     *\r\n+     * @param registryURL the {@link URL url} of registry\r\n+     * @return <code>null</code> if not supported\r\n+     */\r\n+    public static ServiceDiscoveryRegistry create(URL registryURL) {\r\n+        return supports(registryURL) ? new ServiceDiscoveryRegistry(registryURL) : null;\r\n+    }\r\n+\r\n+    /**\r\n+     * Supports or not ?\r\n+     *\r\n+     * @param registryURL the {@link URL url} of registry\r\n+     * @return if supported, return <code>true</code>, or <code>false</code>\r\n+     */\r\n+    public static boolean supports(URL registryURL) {\r\n+        return SERVICE_REGISTRY_TYPE.equalsIgnoreCase(registryURL.getParameter(REGISTRY_TYPE_KEY));\r\n+    }\r\n+\r\n+    private static List<URL> filterSubscribedURLs(URL subscribedURL, List<URL> exportedURLs) {\r\n+        return exportedURLs.stream()\r\n+                .filter(url -> isSameServiceInterface(subscribedURL, url))\r\n+                .filter(url -> isSameParameter(subscribedURL, url, VERSION_KEY))\r\n+                .filter(url -> isSameParameter(subscribedURL, url, GROUP_KEY))\r\n+                .filter(url -> isCompatibleProtocol(subscribedURL, url))\r\n+                .collect(Collectors.toList());\r\n+    }\r\n+\r\n+    private static boolean isSameServiceInterface(URL one, URL another) {\r\n+        return Objects.equals(one.getServiceInterface(), another.getServiceInterface());\r\n+    }\r\n+\r\n+    private static boolean isSameParameter(URL one, URL another, String key) {\r\n+        return Objects.equals(one.getParameter(key), another.getParameter(key));\r\n+    }\r\n+\r\n+    private static boolean isCompatibleProtocol(URL one, URL another) {\r\n+        String protocol = one.getParameter(PROTOCOL_KEY);\r\n+        return isCompatibleProtocol(protocol, another);\r\n+    }\r\n+\r\n+    private static boolean isCompatibleProtocol(String protocol, URL targetURL) {\r\n+        return protocol == null || Objects.equals(protocol, targetURL.getParameter(PROTOCOL_KEY))\r\n+                || Objects.equals(protocol, targetURL.getProtocol());\r\n+    }\r\n+\r\n+    private class DefaultMappingListener implements MappingListener {\r\n+        private URL url;\r\n+        private Set<String> oldApps;\r\n+        private NotifyListener listener;\r\n+\r\n+        public DefaultMappingListener(URL subscribedURL, Set<String> serviceNames, NotifyListener listener) {\r\n+            this.url = subscribedURL;\r\n+            this.oldApps = serviceNames;\r\n+            this.listener = listener;\r\n+        }\r\n+\r\n+        @Override\r\n+        public void onEvent(MappingChangedEvent event) {\r\n+            Set<String> newApps = event.getApps();\r\n+            Set<String> tempOldApps = oldApps;\r\n+            oldApps = newApps;\r\n+\r\n+            if (CollectionUtils.isEmpty(newApps)) {\r\n+                return;\r\n+            }\r\n+\r\n+            if (CollectionUtils.isEmpty(tempOldApps) && newApps.size() > 0) {\r\n+                subscribeURLs(url, listener, newApps);\r\n+                return;\r\n+            }\r\n+\r\n+            for (String newAppName : newApps) {\r\n+                if (!tempOldApps.contains(newAppName)) {\r\n+                    subscribeURLs(url, listener, newApps);\r\n+                    return;\r\n+                }\r\n+            }\r\n+        }\r\n+    }\r\n+}\r\n"}, {"source1": "org/apache/dubbo/registry/client/ServiceDiscoveryRegistryDirectory.java", "source2": "org/apache/dubbo/registry/client/ServiceDiscoveryRegistryDirectory.java", "comments": ["Line-ending differences only"], "unified_diff": "@@ -1,265 +1,265 @@\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.client;\n-\n-import org.apache.dubbo.common.URL;\n-import org.apache.dubbo.common.extension.ExtensionLoader;\n-import org.apache.dubbo.common.logger.Logger;\n-import org.apache.dubbo.common.logger.LoggerFactory;\n-import org.apache.dubbo.common.utils.Assert;\n-import org.apache.dubbo.common.utils.CollectionUtils;\n-import org.apache.dubbo.common.utils.NetUtils;\n-import org.apache.dubbo.registry.AddressListener;\n-import org.apache.dubbo.registry.NotifyListener;\n-import org.apache.dubbo.registry.client.event.listener.ServiceInstancesChangedListener;\n-import org.apache.dubbo.registry.integration.DynamicDirectory;\n-import org.apache.dubbo.rpc.Invoker;\n-import org.apache.dubbo.rpc.Protocol;\n-import org.apache.dubbo.rpc.RpcContext;\n-\n-import java.util.ArrayList;\n-import java.util.Collection;\n-import java.util.Collections;\n-import java.util.HashMap;\n-import java.util.List;\n-import java.util.Map;\n-\n-import static org.apache.dubbo.common.constants.CommonConstants.DISABLED_KEY;\n-import static org.apache.dubbo.common.constants.CommonConstants.ENABLED_KEY;\n-import static org.apache.dubbo.common.constants.RegistryConstants.EMPTY_PROTOCOL;\n-\n-public class ServiceDiscoveryRegistryDirectory<T> extends DynamicDirectory<T> implements NotifyListener {\n-    private static final Logger logger = LoggerFactory.getLogger(ServiceDiscoveryRegistryDirectory.class);\n-\n-    // instance address to invoker mapping.\n-    private volatile Map<String, Invoker<T>> urlInvokerMap; // The initial value is null and the midway may be assigned to null, please use the local variable reference\n-\n-    private ServiceInstancesChangedListener listener;\n-\n-    public ServiceDiscoveryRegistryDirectory(Class<T> serviceType, URL url) {\n-        super(serviceType, url);\n-    }\n-\n-    @Override\n-    public boolean isAvailable() {\n-        if (isDestroyed()) {\n-            return false;\n-        }\n-        Map<String, Invoker<T>> localUrlInvokerMap = urlInvokerMap;\n-        if (localUrlInvokerMap != null && localUrlInvokerMap.size() > 0) {\n-            for (Invoker<T> invoker : new ArrayList<>(localUrlInvokerMap.values())) {\n-                if (invoker.isAvailable()) {\n-                    return true;\n-                }\n-            }\n-        }\n-        return false;\n-    }\n-\n-    @Override\n-    public synchronized void notify(List<URL> instanceUrls) {\n-        // Set the context of the address notification thread.\n-        RpcContext.setRpcContext(getConsumerUrl());\n-\n-        /**\n-         * 3.x added for extend URL address\n-         */\n-        ExtensionLoader<AddressListener> addressListenerExtensionLoader = ExtensionLoader.getExtensionLoader(AddressListener.class);\n-        List<AddressListener> supportedListeners = addressListenerExtensionLoader.getActivateExtension(getUrl(), (String[]) null);\n-        if (supportedListeners != null && !supportedListeners.isEmpty()) {\n-            for (AddressListener addressListener : supportedListeners) {\n-                instanceUrls = addressListener.notify(instanceUrls, getConsumerUrl(), this);\n-            }\n-        }\n-\n-        refreshInvoker(instanceUrls);\n-    }\n-\n-    private void refreshInvoker(List<URL> invokerUrls) {\n-        Assert.notNull(invokerUrls, \"invokerUrls should not be null, use empty url list to clear address.\");\n-\n-        if (invokerUrls.size() == 0) {\n-            this.forbidden = true; // Forbid to access\n-            this.invokers = Collections.emptyList();\n-            routerChain.setInvokers(this.invokers);\n-            destroyAllInvokers(); // Close all invokers\n-            return;\n-        }\n-\n-        this.forbidden = false; // Allow to access\n-        Map<String, Invoker<T>> oldUrlInvokerMap = this.urlInvokerMap; // local reference\n-        if (CollectionUtils.isEmpty(invokerUrls)) {\n-            return;\n-        }\n-\n-        Map<String, Invoker<T>> newUrlInvokerMap = toInvokers(invokerUrls);// Translate url list to Invoker map\n-\n-        if (CollectionUtils.isEmptyMap(newUrlInvokerMap)) {\n-            logger.error(new IllegalStateException(\"Cannot create invokers from url address list (total \" + invokerUrls.size() + \")\"));\n-            return;\n-        }\n-\n-        List<Invoker<T>> newInvokers = Collections.unmodifiableList(new ArrayList<>(newUrlInvokerMap.values()));\n-        // pre-route and build cache, notice that route cache should build on original Invoker list.\n-        // toMergeMethodInvokerMap() will wrap some invokers having different groups, those wrapped invokers not should be routed.\n-        routerChain.setInvokers(newInvokers);\n-        this.invokers = multiGroup ? toMergeInvokerList(newInvokers) : newInvokers;\n-        this.urlInvokerMap = newUrlInvokerMap;\n-\n-        if (oldUrlInvokerMap != null) {\n-            try {\n-                destroyUnusedInvokers(oldUrlInvokerMap, newUrlInvokerMap); // Close the unused Invoker\n-            } catch (Exception e) {\n-                logger.warn(\"destroyUnusedInvokers error. \", e);\n-            }\n-        }\n-\n-        // notify invokers refreshed\n-        this.invokersChanged();\n-    }\n-\n-    /**\n-     * Turn urls into invokers, and if url has been refer, will not re-reference.\n-     *\n-     * @param urls\n-     * @return invokers\n-     */\n-    private Map<String, Invoker<T>> toInvokers(List<URL> urls) {\n-        Map<String, Invoker<T>> newUrlInvokerMap = new HashMap<>();\n-        if (urls == null || urls.isEmpty()) {\n-            return newUrlInvokerMap;\n-        }\n-        for (URL url : urls) {\n-            InstanceAddressURL instanceAddressURL = (InstanceAddressURL) url;\n-            if (EMPTY_PROTOCOL.equals(instanceAddressURL.getProtocol())) {\n-                continue;\n-            }\n-            if (!ExtensionLoader.getExtensionLoader(Protocol.class).hasExtension(instanceAddressURL.getProtocol())) {\n-                logger.error(new IllegalStateException(\"Unsupported protocol \" + instanceAddressURL.getProtocol() +\n-                        \" in notified url: \" + instanceAddressURL + \" from registry \" + getUrl().getAddress() +\n-                        \" to consumer \" + NetUtils.getLocalHost() + \", supported protocol: \" +\n-                        ExtensionLoader.getExtensionLoader(Protocol.class).getSupportedExtensions()));\n-                continue;\n-            }\n-\n-            // FIXME, some keys may need to be removed.\n-            instanceAddressURL.addConsumerParams(getConsumerUrl().getProtocolServiceKey(), queryMap);\n-\n-            Invoker<T> invoker = urlInvokerMap == null ? null : urlInvokerMap.get(instanceAddressURL.getAddress());\n-            if (invoker == null || urlChanged(invoker, instanceAddressURL)) { // Not in the cache, refer again\n-                try {\n-                    boolean enabled = true;\n-                    if (instanceAddressURL.hasParameter(DISABLED_KEY)) {\n-                        enabled = !instanceAddressURL.getParameter(DISABLED_KEY, false);\n-                    } else {\n-                        enabled = instanceAddressURL.getParameter(ENABLED_KEY, true);\n-                    }\n-                    if (enabled) {\n-                        invoker = protocol.refer(serviceType, instanceAddressURL);\n-                    }\n-                } catch (Throwable t) {\n-                    logger.error(\"Failed to refer invoker for interface:\" + serviceType + \",url:(\" + instanceAddressURL + \")\" + t.getMessage(), t);\n-                }\n-                if (invoker != null) { // Put new invoker in cache\n-                    newUrlInvokerMap.put(instanceAddressURL.getAddress(), invoker);\n-                }\n-            } else {\n-                newUrlInvokerMap.put(instanceAddressURL.getAddress(), invoker);\n-            }\n-        }\n-        return newUrlInvokerMap;\n-    }\n-\n-    private boolean urlChanged(Invoker<T> invoker, InstanceAddressURL newURL) {\n-        InstanceAddressURL oldURL = (InstanceAddressURL) invoker.getUrl();\n-\n-        if (!newURL.getInstance().equals(oldURL.getInstance())) {\n-            return true;\n-        }\n-\n-        return !oldURL.getMetadataInfo().getServiceInfo(getConsumerUrl().getProtocolServiceKey())\n-                .equals(newURL.getMetadataInfo().getServiceInfo(getConsumerUrl().getProtocolServiceKey()));\n-    }\n-\n-    private List<Invoker<T>> toMergeInvokerList(List<Invoker<T>> invokers) {\n-        return invokers;\n-    }\n-\n-    /**\n-     * Close all invokers\n-     */\n-    @Override\n-    protected void destroyAllInvokers() {\n-        Map<String, Invoker<T>> localUrlInvokerMap = this.urlInvokerMap; // local reference\n-        if (localUrlInvokerMap != null) {\n-            for (Invoker<T> invoker : new ArrayList<>(localUrlInvokerMap.values())) {\n-                try {\n-                    invoker.destroy();\n-                } catch (Throwable t) {\n-                    logger.warn(\"Failed to destroy service \" + serviceKey + \" to provider \" + invoker.getUrl(), t);\n-                }\n-            }\n-            localUrlInvokerMap.clear();\n-        }\n-        invokers = null;\n-    }\n-\n-    /**\n-     * Check whether the invoker in the cache needs to be destroyed\n-     * If set attribute of url: refer.autodestroy=false, the invokers will only increase without decreasing,there may be a refer leak\n-     *\n-     * @param oldUrlInvokerMap\n-     * @param newUrlInvokerMap\n-     */\n-    private void destroyUnusedInvokers(Map<String, Invoker<T>> oldUrlInvokerMap, Map<String, Invoker<T>> newUrlInvokerMap) {\n-        if (newUrlInvokerMap == null || newUrlInvokerMap.size() == 0) {\n-            destroyAllInvokers();\n-            return;\n-        }\n-        // check deleted invoker\n-        List<String> deleted = null;\n-        if (oldUrlInvokerMap != null) {\n-            Collection<Invoker<T>> newInvokers = newUrlInvokerMap.values();\n-            for (Map.Entry<String, Invoker<T>> entry : oldUrlInvokerMap.entrySet()) {\n-                if (!newInvokers.contains(entry.getValue())) {\n-                    if (deleted == null) {\n-                        deleted = new ArrayList<>();\n-                    }\n-                    deleted.add(entry.getKey());\n-                }\n-            }\n-        }\n-\n-        if (deleted != null) {\n-            for (String addressKey : deleted) {\n-                if (addressKey != null) {\n-                    Invoker<T> invoker = oldUrlInvokerMap.remove(addressKey);\n-                    if (invoker != null) {\n-                        try {\n-                            invoker.destroy();\n-                            if (logger.isDebugEnabled()) {\n-                                logger.debug(\"destroy invoker[\" + invoker.getUrl() + \"] success. \");\n-                            }\n-                        } catch (Exception e) {\n-                            logger.warn(\"destroy invoker[\" + invoker.getUrl() + \"] failed. \" + e.getMessage(), e);\n-                        }\n-                    }\n-                }\n-            }\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.client;\r\n+\r\n+import org.apache.dubbo.common.URL;\r\n+import org.apache.dubbo.common.extension.ExtensionLoader;\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.Assert;\r\n+import org.apache.dubbo.common.utils.CollectionUtils;\r\n+import org.apache.dubbo.common.utils.NetUtils;\r\n+import org.apache.dubbo.registry.AddressListener;\r\n+import org.apache.dubbo.registry.NotifyListener;\r\n+import org.apache.dubbo.registry.client.event.listener.ServiceInstancesChangedListener;\r\n+import org.apache.dubbo.registry.integration.DynamicDirectory;\r\n+import org.apache.dubbo.rpc.Invoker;\r\n+import org.apache.dubbo.rpc.Protocol;\r\n+import org.apache.dubbo.rpc.RpcContext;\r\n+\r\n+import java.util.ArrayList;\r\n+import java.util.Collection;\r\n+import java.util.Collections;\r\n+import java.util.HashMap;\r\n+import java.util.List;\r\n+import java.util.Map;\r\n+\r\n+import static org.apache.dubbo.common.constants.CommonConstants.DISABLED_KEY;\r\n+import static org.apache.dubbo.common.constants.CommonConstants.ENABLED_KEY;\r\n+import static org.apache.dubbo.common.constants.RegistryConstants.EMPTY_PROTOCOL;\r\n+\r\n+public class ServiceDiscoveryRegistryDirectory<T> extends DynamicDirectory<T> implements NotifyListener {\r\n+    private static final Logger logger = LoggerFactory.getLogger(ServiceDiscoveryRegistryDirectory.class);\r\n+\r\n+    // instance address to invoker mapping.\r\n+    private volatile Map<String, Invoker<T>> urlInvokerMap; // The initial value is null and the midway may be assigned to null, please use the local variable reference\r\n+\r\n+    private ServiceInstancesChangedListener listener;\r\n+\r\n+    public ServiceDiscoveryRegistryDirectory(Class<T> serviceType, URL url) {\r\n+        super(serviceType, url);\r\n+    }\r\n+\r\n+    @Override\r\n+    public boolean isAvailable() {\r\n+        if (isDestroyed()) {\r\n+            return false;\r\n+        }\r\n+        Map<String, Invoker<T>> localUrlInvokerMap = urlInvokerMap;\r\n+        if (localUrlInvokerMap != null && localUrlInvokerMap.size() > 0) {\r\n+            for (Invoker<T> invoker : new ArrayList<>(localUrlInvokerMap.values())) {\r\n+                if (invoker.isAvailable()) {\r\n+                    return true;\r\n+                }\r\n+            }\r\n+        }\r\n+        return false;\r\n+    }\r\n+\r\n+    @Override\r\n+    public synchronized void notify(List<URL> instanceUrls) {\r\n+        // Set the context of the address notification thread.\r\n+        RpcContext.setRpcContext(getConsumerUrl());\r\n+\r\n+        /**\r\n+         * 3.x added for extend URL address\r\n+         */\r\n+        ExtensionLoader<AddressListener> addressListenerExtensionLoader = ExtensionLoader.getExtensionLoader(AddressListener.class);\r\n+        List<AddressListener> supportedListeners = addressListenerExtensionLoader.getActivateExtension(getUrl(), (String[]) null);\r\n+        if (supportedListeners != null && !supportedListeners.isEmpty()) {\r\n+            for (AddressListener addressListener : supportedListeners) {\r\n+                instanceUrls = addressListener.notify(instanceUrls, getConsumerUrl(), this);\r\n+            }\r\n+        }\r\n+\r\n+        refreshInvoker(instanceUrls);\r\n+    }\r\n+\r\n+    private void refreshInvoker(List<URL> invokerUrls) {\r\n+        Assert.notNull(invokerUrls, \"invokerUrls should not be null, use empty url list to clear address.\");\r\n+\r\n+        if (invokerUrls.size() == 0) {\r\n+            this.forbidden = true; // Forbid to access\r\n+            this.invokers = Collections.emptyList();\r\n+            routerChain.setInvokers(this.invokers);\r\n+            destroyAllInvokers(); // Close all invokers\r\n+            return;\r\n+        }\r\n+\r\n+        this.forbidden = false; // Allow to access\r\n+        Map<String, Invoker<T>> oldUrlInvokerMap = this.urlInvokerMap; // local reference\r\n+        if (CollectionUtils.isEmpty(invokerUrls)) {\r\n+            return;\r\n+        }\r\n+\r\n+        Map<String, Invoker<T>> newUrlInvokerMap = toInvokers(invokerUrls);// Translate url list to Invoker map\r\n+\r\n+        if (CollectionUtils.isEmptyMap(newUrlInvokerMap)) {\r\n+            logger.error(new IllegalStateException(\"Cannot create invokers from url address list (total \" + invokerUrls.size() + \")\"));\r\n+            return;\r\n+        }\r\n+\r\n+        List<Invoker<T>> newInvokers = Collections.unmodifiableList(new ArrayList<>(newUrlInvokerMap.values()));\r\n+        // pre-route and build cache, notice that route cache should build on original Invoker list.\r\n+        // toMergeMethodInvokerMap() will wrap some invokers having different groups, those wrapped invokers not should be routed.\r\n+        routerChain.setInvokers(newInvokers);\r\n+        this.invokers = multiGroup ? toMergeInvokerList(newInvokers) : newInvokers;\r\n+        this.urlInvokerMap = newUrlInvokerMap;\r\n+\r\n+        if (oldUrlInvokerMap != null) {\r\n+            try {\r\n+                destroyUnusedInvokers(oldUrlInvokerMap, newUrlInvokerMap); // Close the unused Invoker\r\n+            } catch (Exception e) {\r\n+                logger.warn(\"destroyUnusedInvokers error. \", e);\r\n+            }\r\n+        }\r\n+\r\n+        // notify invokers refreshed\r\n+        this.invokersChanged();\r\n+    }\r\n+\r\n+    /**\r\n+     * Turn urls into invokers, and if url has been refer, will not re-reference.\r\n+     *\r\n+     * @param urls\r\n+     * @return invokers\r\n+     */\r\n+    private Map<String, Invoker<T>> toInvokers(List<URL> urls) {\r\n+        Map<String, Invoker<T>> newUrlInvokerMap = new HashMap<>();\r\n+        if (urls == null || urls.isEmpty()) {\r\n+            return newUrlInvokerMap;\r\n+        }\r\n+        for (URL url : urls) {\r\n+            InstanceAddressURL instanceAddressURL = (InstanceAddressURL) url;\r\n+            if (EMPTY_PROTOCOL.equals(instanceAddressURL.getProtocol())) {\r\n+                continue;\r\n+            }\r\n+            if (!ExtensionLoader.getExtensionLoader(Protocol.class).hasExtension(instanceAddressURL.getProtocol())) {\r\n+                logger.error(new IllegalStateException(\"Unsupported protocol \" + instanceAddressURL.getProtocol() +\r\n+                        \" in notified url: \" + instanceAddressURL + \" from registry \" + getUrl().getAddress() +\r\n+                        \" to consumer \" + NetUtils.getLocalHost() + \", supported protocol: \" +\r\n+                        ExtensionLoader.getExtensionLoader(Protocol.class).getSupportedExtensions()));\r\n+                continue;\r\n+            }\r\n+\r\n+            // FIXME, some keys may need to be removed.\r\n+            instanceAddressURL.addConsumerParams(getConsumerUrl().getProtocolServiceKey(), queryMap);\r\n+\r\n+            Invoker<T> invoker = urlInvokerMap == null ? null : urlInvokerMap.get(instanceAddressURL.getAddress());\r\n+            if (invoker == null || urlChanged(invoker, instanceAddressURL)) { // Not in the cache, refer again\r\n+                try {\r\n+                    boolean enabled = true;\r\n+                    if (instanceAddressURL.hasParameter(DISABLED_KEY)) {\r\n+                        enabled = !instanceAddressURL.getParameter(DISABLED_KEY, false);\r\n+                    } else {\r\n+                        enabled = instanceAddressURL.getParameter(ENABLED_KEY, true);\r\n+                    }\r\n+                    if (enabled) {\r\n+                        invoker = protocol.refer(serviceType, instanceAddressURL);\r\n+                    }\r\n+                } catch (Throwable t) {\r\n+                    logger.error(\"Failed to refer invoker for interface:\" + serviceType + \",url:(\" + instanceAddressURL + \")\" + t.getMessage(), t);\r\n+                }\r\n+                if (invoker != null) { // Put new invoker in cache\r\n+                    newUrlInvokerMap.put(instanceAddressURL.getAddress(), invoker);\r\n+                }\r\n+            } else {\r\n+                newUrlInvokerMap.put(instanceAddressURL.getAddress(), invoker);\r\n+            }\r\n+        }\r\n+        return newUrlInvokerMap;\r\n+    }\r\n+\r\n+    private boolean urlChanged(Invoker<T> invoker, InstanceAddressURL newURL) {\r\n+        InstanceAddressURL oldURL = (InstanceAddressURL) invoker.getUrl();\r\n+\r\n+        if (!newURL.getInstance().equals(oldURL.getInstance())) {\r\n+            return true;\r\n+        }\r\n+\r\n+        return !oldURL.getMetadataInfo().getServiceInfo(getConsumerUrl().getProtocolServiceKey())\r\n+                .equals(newURL.getMetadataInfo().getServiceInfo(getConsumerUrl().getProtocolServiceKey()));\r\n+    }\r\n+\r\n+    private List<Invoker<T>> toMergeInvokerList(List<Invoker<T>> invokers) {\r\n+        return invokers;\r\n+    }\r\n+\r\n+    /**\r\n+     * Close all invokers\r\n+     */\r\n+    @Override\r\n+    protected void destroyAllInvokers() {\r\n+        Map<String, Invoker<T>> localUrlInvokerMap = this.urlInvokerMap; // local reference\r\n+        if (localUrlInvokerMap != null) {\r\n+            for (Invoker<T> invoker : new ArrayList<>(localUrlInvokerMap.values())) {\r\n+                try {\r\n+                    invoker.destroy();\r\n+                } catch (Throwable t) {\r\n+                    logger.warn(\"Failed to destroy service \" + serviceKey + \" to provider \" + invoker.getUrl(), t);\r\n+                }\r\n+            }\r\n+            localUrlInvokerMap.clear();\r\n+        }\r\n+        invokers = null;\r\n+    }\r\n+\r\n+    /**\r\n+     * Check whether the invoker in the cache needs to be destroyed\r\n+     * If set attribute of url: refer.autodestroy=false, the invokers will only increase without decreasing,there may be a refer leak\r\n+     *\r\n+     * @param oldUrlInvokerMap\r\n+     * @param newUrlInvokerMap\r\n+     */\r\n+    private void destroyUnusedInvokers(Map<String, Invoker<T>> oldUrlInvokerMap, Map<String, Invoker<T>> newUrlInvokerMap) {\r\n+        if (newUrlInvokerMap == null || newUrlInvokerMap.size() == 0) {\r\n+            destroyAllInvokers();\r\n+            return;\r\n+        }\r\n+        // check deleted invoker\r\n+        List<String> deleted = null;\r\n+        if (oldUrlInvokerMap != null) {\r\n+            Collection<Invoker<T>> newInvokers = newUrlInvokerMap.values();\r\n+            for (Map.Entry<String, Invoker<T>> entry : oldUrlInvokerMap.entrySet()) {\r\n+                if (!newInvokers.contains(entry.getValue())) {\r\n+                    if (deleted == null) {\r\n+                        deleted = new ArrayList<>();\r\n+                    }\r\n+                    deleted.add(entry.getKey());\r\n+                }\r\n+            }\r\n+        }\r\n+\r\n+        if (deleted != null) {\r\n+            for (String addressKey : deleted) {\r\n+                if (addressKey != null) {\r\n+                    Invoker<T> invoker = oldUrlInvokerMap.remove(addressKey);\r\n+                    if (invoker != null) {\r\n+                        try {\r\n+                            invoker.destroy();\r\n+                            if (logger.isDebugEnabled()) {\r\n+                                logger.debug(\"destroy invoker[\" + invoker.getUrl() + \"] success. \");\r\n+                            }\r\n+                        } catch (Exception e) {\r\n+                            logger.warn(\"destroy invoker[\" + invoker.getUrl() + \"] failed. \" + e.getMessage(), e);\r\n+                        }\r\n+                    }\r\n+                }\r\n+            }\r\n+        }\r\n+    }\r\n+}\r\n"}, {"source1": "org/apache/dubbo/registry/client/ServiceDiscoveryRegistryFactory.java", "source2": "org/apache/dubbo/registry/client/ServiceDiscoveryRegistryFactory.java", "comments": ["Line-ending differences only"], "unified_diff": "@@ -1,38 +1,38 @@\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.client;\n-\n-import org.apache.dubbo.common.URL;\n-import org.apache.dubbo.registry.Registry;\n-import org.apache.dubbo.registry.support.AbstractRegistryFactory;\n-\n-import static org.apache.dubbo.common.constants.RegistryConstants.REGISTRY_KEY;\n-import static org.apache.dubbo.common.constants.RegistryConstants.SERVICE_REGISTRY_PROTOCOL;\n-import static org.apache.dubbo.registry.Constants.DEFAULT_REGISTRY;\n-\n-public class ServiceDiscoveryRegistryFactory extends AbstractRegistryFactory {\n-\n-    @Override\n-    protected Registry createRegistry(URL url) {\n-        if (SERVICE_REGISTRY_PROTOCOL.equalsIgnoreCase(url.getProtocol())) {\n-            String protocol = url.getParameter(REGISTRY_KEY, DEFAULT_REGISTRY);\n-            url = url.setProtocol(protocol).removeParameter(REGISTRY_KEY);\n-        }\n-        return new ServiceDiscoveryRegistry(url);\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.client;\r\n+\r\n+import org.apache.dubbo.common.URL;\r\n+import org.apache.dubbo.registry.Registry;\r\n+import org.apache.dubbo.registry.support.AbstractRegistryFactory;\r\n+\r\n+import static org.apache.dubbo.common.constants.RegistryConstants.REGISTRY_KEY;\r\n+import static org.apache.dubbo.common.constants.RegistryConstants.SERVICE_REGISTRY_PROTOCOL;\r\n+import static org.apache.dubbo.registry.Constants.DEFAULT_REGISTRY;\r\n+\r\n+public class ServiceDiscoveryRegistryFactory extends AbstractRegistryFactory {\r\n+\r\n+    @Override\r\n+    protected Registry createRegistry(URL url) {\r\n+        if (SERVICE_REGISTRY_PROTOCOL.equalsIgnoreCase(url.getProtocol())) {\r\n+            String protocol = url.getParameter(REGISTRY_KEY, DEFAULT_REGISTRY);\r\n+            url = url.setProtocol(protocol).removeParameter(REGISTRY_KEY);\r\n+        }\r\n+        return new ServiceDiscoveryRegistry(url);\r\n+    }\r\n+\r\n+}\r\n"}, {"source1": "org/apache/dubbo/registry/client/ServiceInstance.java", "source2": "org/apache/dubbo/registry/client/ServiceInstance.java", "comments": ["Line-ending differences only"], "unified_diff": "@@ -1,126 +1,126 @@\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.client;\n-\n-import java.io.Serializable;\n-import java.util.Map;\n-\n-/**\n- * The model class of an instance of a service, which is used for service registration and discovery.\n- * <p>\n- *\n- * @since 2.7.5\n- */\n-public interface ServiceInstance extends Serializable {\n-\n-    /**\n-     * The id of the registered service instance.\n-     *\n-     * @return nullable\n-     */\n-    String getId();\n-\n-    /**\n-     * The name of service that current instance belongs to.\n-     *\n-     * @return non-null\n-     */\n-    String getServiceName();\n-\n-    /**\n-     * The hostname of the registered service instance.\n-     *\n-     * @return non-null\n-     */\n-    String getHost();\n-\n-    /**\n-     * The port of the registered service instance.\n-     *\n-     * @return the positive integer if present\n-     */\n-    Integer getPort();\n-\n-    String getAddress();\n-\n-    /**\n-     * The enable status of the registered service instance.\n-     *\n-     * @return if <code>true</code>, indicates current instance is enabled, or disable, the client should remove this one.\n-     * The default value is <code>true</code>\n-     */\n-    default boolean isEnabled() {\n-        return true;\n-    }\n-\n-    /**\n-     * The registered service instance is health or not.\n-     *\n-     * @return if <code>true</code>, indicates current instance is enabled, or disable, the client may ignore this one.\n-     * The default value is <code>true</code>\n-     */\n-    default boolean isHealthy() {\n-        return true;\n-    }\n-\n-    /**\n-     * The key / value pair metadata associated with the service instance.\n-     *\n-     * @return non-null, mutable and unsorted {@link Map}\n-     */\n-    Map<String, String> getMetadata();\n-\n-    Map<String, String> getExtendParams();\n-\n-    Map<String, String> getAllParams();\n-\n-    /**\n-     * Get the value of metadata by the specified name\n-     *\n-     * @param name the specified name\n-     * @return the value of metadata if found, or <code>null</code>\n-     * @since 2.7.8\n-     */\n-    default String getMetadata(String name) {\n-        return getMetadata(name, null);\n-    }\n-\n-    /**\n-     * Get the value of metadata by the specified name\n-     *\n-     * @param name the specified name\n-     * @return the value of metadata if found, or <code>defaultValue</code>\n-     * @since 2.7.8\n-     */\n-    default String getMetadata(String name, String defaultValue) {\n-        return getMetadata().getOrDefault(name, defaultValue);\n-    }\n-\n-    /**\n-     * @return the hash code of current instance.\n-     */\n-    int hashCode();\n-\n-    /**\n-     * @param another another {@link ServiceInstance}\n-     * @return if equals , return <code>true</code>, or <code>false</code>\n-     */\n-    boolean equals(Object another);\n-\n-    InstanceAddressURL toURL();\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.client;\r\n+\r\n+import java.io.Serializable;\r\n+import java.util.Map;\r\n+\r\n+/**\r\n+ * The model class of an instance of a service, which is used for service registration and discovery.\r\n+ * <p>\r\n+ *\r\n+ * @since 2.7.5\r\n+ */\r\n+public interface ServiceInstance extends Serializable {\r\n+\r\n+    /**\r\n+     * The id of the registered service instance.\r\n+     *\r\n+     * @return nullable\r\n+     */\r\n+    String getId();\r\n+\r\n+    /**\r\n+     * The name of service that current instance belongs to.\r\n+     *\r\n+     * @return non-null\r\n+     */\r\n+    String getServiceName();\r\n+\r\n+    /**\r\n+     * The hostname of the registered service instance.\r\n+     *\r\n+     * @return non-null\r\n+     */\r\n+    String getHost();\r\n+\r\n+    /**\r\n+     * The port of the registered service instance.\r\n+     *\r\n+     * @return the positive integer if present\r\n+     */\r\n+    Integer getPort();\r\n+\r\n+    String getAddress();\r\n+\r\n+    /**\r\n+     * The enable status of the registered service instance.\r\n+     *\r\n+     * @return if <code>true</code>, indicates current instance is enabled, or disable, the client should remove this one.\r\n+     * The default value is <code>true</code>\r\n+     */\r\n+    default boolean isEnabled() {\r\n+        return true;\r\n+    }\r\n+\r\n+    /**\r\n+     * The registered service instance is health or not.\r\n+     *\r\n+     * @return if <code>true</code>, indicates current instance is enabled, or disable, the client may ignore this one.\r\n+     * The default value is <code>true</code>\r\n+     */\r\n+    default boolean isHealthy() {\r\n+        return true;\r\n+    }\r\n+\r\n+    /**\r\n+     * The key / value pair metadata associated with the service instance.\r\n+     *\r\n+     * @return non-null, mutable and unsorted {@link Map}\r\n+     */\r\n+    Map<String, String> getMetadata();\r\n+\r\n+    Map<String, String> getExtendParams();\r\n+\r\n+    Map<String, String> getAllParams();\r\n+\r\n+    /**\r\n+     * Get the value of metadata by the specified name\r\n+     *\r\n+     * @param name the specified name\r\n+     * @return the value of metadata if found, or <code>null</code>\r\n+     * @since 2.7.8\r\n+     */\r\n+    default String getMetadata(String name) {\r\n+        return getMetadata(name, null);\r\n+    }\r\n+\r\n+    /**\r\n+     * Get the value of metadata by the specified name\r\n+     *\r\n+     * @param name the specified name\r\n+     * @return the value of metadata if found, or <code>defaultValue</code>\r\n+     * @since 2.7.8\r\n+     */\r\n+    default String getMetadata(String name, String defaultValue) {\r\n+        return getMetadata().getOrDefault(name, defaultValue);\r\n+    }\r\n+\r\n+    /**\r\n+     * @return the hash code of current instance.\r\n+     */\r\n+    int hashCode();\r\n+\r\n+    /**\r\n+     * @param another another {@link ServiceInstance}\r\n+     * @return if equals , return <code>true</code>, or <code>false</code>\r\n+     */\r\n+    boolean equals(Object another);\r\n+\r\n+    InstanceAddressURL toURL();\r\n+\r\n+}\r\n"}, {"source1": "org/apache/dubbo/registry/client/ServiceInstanceCustomizer.java", "source2": "org/apache/dubbo/registry/client/ServiceInstanceCustomizer.java", "comments": ["Line-ending differences only"], "unified_diff": "@@ -1,38 +1,38 @@\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.client;\n-\n-import org.apache.dubbo.common.extension.SPI;\n-import org.apache.dubbo.common.lang.Prioritized;\n-import org.apache.dubbo.registry.client.event.ServiceInstancePreRegisteredEvent;\n-\n-/**\n- * The interface to customize {@link ServiceInstance the service instance} on {@link ServiceInstancePreRegisteredEvent}\n- *\n- * @see ServiceInstance#getMetadata()\n- * @since 2.7.5\n- */\n-@SPI\n-public interface ServiceInstanceCustomizer extends Prioritized {\n-\n-    /**\n-     * Customizes {@link ServiceInstance the service instance}\n-     *\n-     * @param serviceInstance {@link ServiceInstance the service instance}\n-     */\n-    void customize(ServiceInstance serviceInstance);\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.client;\r\n+\r\n+import org.apache.dubbo.common.extension.SPI;\r\n+import org.apache.dubbo.common.lang.Prioritized;\r\n+import org.apache.dubbo.registry.client.event.ServiceInstancePreRegisteredEvent;\r\n+\r\n+/**\r\n+ * The interface to customize {@link ServiceInstance the service instance} on {@link ServiceInstancePreRegisteredEvent}\r\n+ *\r\n+ * @see ServiceInstance#getMetadata()\r\n+ * @since 2.7.5\r\n+ */\r\n+@SPI\r\n+public interface ServiceInstanceCustomizer extends Prioritized {\r\n+\r\n+    /**\r\n+     * Customizes {@link ServiceInstance the service instance}\r\n+     *\r\n+     * @param serviceInstance {@link ServiceInstance the service instance}\r\n+     */\r\n+    void customize(ServiceInstance serviceInstance);\r\n+}\r\n"}, {"source1": "org/apache/dubbo/registry/client/event/ServiceDiscoveryDestroyedEvent.java", "source2": "org/apache/dubbo/registry/client/event/ServiceDiscoveryDestroyedEvent.java", "comments": ["Line-ending 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.client.event;\n-\n-import org.apache.dubbo.registry.client.ServiceDiscovery;\n-\n-/**\n- * An event raised after the {@link ServiceDiscovery Service Discovery} destroyed.\n- *\n- * @see ServiceDiscovery#destroy()\n- * @since 2.7.5\n- */\n-public class ServiceDiscoveryDestroyedEvent extends ServiceDiscoveryEvent {\n-\n-    public ServiceDiscoveryDestroyedEvent(ServiceDiscovery source, ServiceDiscovery original) {\n-        super(source, original);\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.client.event;\r\n+\r\n+import org.apache.dubbo.registry.client.ServiceDiscovery;\r\n+\r\n+/**\r\n+ * An event raised after the {@link ServiceDiscovery Service Discovery} destroyed.\r\n+ *\r\n+ * @see ServiceDiscovery#destroy()\r\n+ * @since 2.7.5\r\n+ */\r\n+public class ServiceDiscoveryDestroyedEvent extends ServiceDiscoveryEvent {\r\n+\r\n+    public ServiceDiscoveryDestroyedEvent(ServiceDiscovery source, ServiceDiscovery original) {\r\n+        super(source, original);\r\n+    }\r\n+\r\n+}\r\n"}, {"source1": "org/apache/dubbo/registry/client/event/ServiceDiscoveryDestroyingEvent.java", "source2": "org/apache/dubbo/registry/client/event/ServiceDiscoveryDestroyingEvent.java", "comments": ["Line-ending 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.client.event;\n-\n-import org.apache.dubbo.registry.client.ServiceDiscovery;\n-\n-/**\n- * An event raised when the {@link ServiceDiscovery Service Discovery} is destroying.\n- *\n- * @see ServiceDiscovery#destroy()\n- * @since 2.7.5\n- */\n-public class ServiceDiscoveryDestroyingEvent extends ServiceDiscoveryEvent {\n-\n-    public ServiceDiscoveryDestroyingEvent(ServiceDiscovery source, ServiceDiscovery original) {\n-        super(source, original);\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.client.event;\r\n+\r\n+import org.apache.dubbo.registry.client.ServiceDiscovery;\r\n+\r\n+/**\r\n+ * An event raised when the {@link ServiceDiscovery Service Discovery} is destroying.\r\n+ *\r\n+ * @see ServiceDiscovery#destroy()\r\n+ * @since 2.7.5\r\n+ */\r\n+public class ServiceDiscoveryDestroyingEvent extends ServiceDiscoveryEvent {\r\n+\r\n+    public ServiceDiscoveryDestroyingEvent(ServiceDiscovery source, ServiceDiscovery original) {\r\n+        super(source, original);\r\n+    }\r\n+\r\n+}\r\n"}, {"source1": "org/apache/dubbo/registry/client/event/ServiceDiscoveryEvent.java", "source2": "org/apache/dubbo/registry/client/event/ServiceDiscoveryEvent.java", "comments": ["Line-ending 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.client.event;\n-\n-import org.apache.dubbo.event.Event;\n-import org.apache.dubbo.registry.client.ServiceDiscovery;\n-\n-/**\n- * An abstract {@link Event} class for {@link ServiceDiscovery}\n- *\n- * @see Event\n- * @see ServiceDiscovery\n- * @since 2.7.5\n- */\n-public abstract class ServiceDiscoveryEvent extends Event {\n-\n-    private final ServiceDiscovery original;\n-\n-    /**\n-     * Constructs a prototypical Event.\n-     *\n-     * @param source   The object on which the Event initially occurred.\n-     * @param original The original {@link ServiceDiscovery}\n-     * @throws IllegalArgumentException if source is null.\n-     */\n-    public ServiceDiscoveryEvent(ServiceDiscovery source, ServiceDiscovery original) {\n-        super(source);\n-        this.original = original;\n-    }\n-\n-    @Override\n-    public ServiceDiscovery getSource() {\n-        return (ServiceDiscovery) super.getSource();\n-    }\n-\n-    /**\n-     * Get the {@link ServiceDiscovery} on which the Event initially occurred.\n-     *\n-     * @return {@link ServiceDiscovery} instance\n-     */\n-    public final ServiceDiscovery getServiceDiscovery() {\n-        return getSource();\n-    }\n-\n-    /**\n-     * Get the original {@link ServiceDiscovery}\n-     *\n-     * @return the original {@link ServiceDiscovery}\n-     */\n-    public final ServiceDiscovery getOriginal() {\n-        return original;\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.client.event;\r\n+\r\n+import org.apache.dubbo.event.Event;\r\n+import org.apache.dubbo.registry.client.ServiceDiscovery;\r\n+\r\n+/**\r\n+ * An abstract {@link Event} class for {@link ServiceDiscovery}\r\n+ *\r\n+ * @see Event\r\n+ * @see ServiceDiscovery\r\n+ * @since 2.7.5\r\n+ */\r\n+public abstract class ServiceDiscoveryEvent extends Event {\r\n+\r\n+    private final ServiceDiscovery original;\r\n+\r\n+    /**\r\n+     * Constructs a prototypical Event.\r\n+     *\r\n+     * @param source   The object on which the Event initially occurred.\r\n+     * @param original The original {@link ServiceDiscovery}\r\n+     * @throws IllegalArgumentException if source is null.\r\n+     */\r\n+    public ServiceDiscoveryEvent(ServiceDiscovery source, ServiceDiscovery original) {\r\n+        super(source);\r\n+        this.original = original;\r\n+    }\r\n+\r\n+    @Override\r\n+    public ServiceDiscovery getSource() {\r\n+        return (ServiceDiscovery) super.getSource();\r\n+    }\r\n+\r\n+    /**\r\n+     * Get the {@link ServiceDiscovery} on which the Event initially occurred.\r\n+     *\r\n+     * @return {@link ServiceDiscovery} instance\r\n+     */\r\n+    public final ServiceDiscovery getServiceDiscovery() {\r\n+        return getSource();\r\n+    }\r\n+\r\n+    /**\r\n+     * Get the original {@link ServiceDiscovery}\r\n+     *\r\n+     * @return the original {@link ServiceDiscovery}\r\n+     */\r\n+    public final ServiceDiscovery getOriginal() {\r\n+        return original;\r\n+    }\r\n+}\r\n"}, {"source1": "org/apache/dubbo/registry/client/event/ServiceDiscoveryExceptionEvent.java", "source2": "org/apache/dubbo/registry/client/event/ServiceDiscoveryExceptionEvent.java", "comments": ["Line-ending differences only"], "unified_diff": "@@ -1,48 +1,48 @@\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.client.event;\n-\n-import org.apache.dubbo.registry.client.ServiceDiscovery;\n-\n-/**\n- * An event raised when the {@link ServiceDiscovery Service Discovery} met with some exception\n- *\n- * @see ServiceDiscovery\n- * @see org.apache.dubbo.event.Event\n- * @since 2.7.5\n- */\n-public class ServiceDiscoveryExceptionEvent extends ServiceDiscoveryEvent {\n-\n-    private final Throwable cause;\n-\n-    public ServiceDiscoveryExceptionEvent(ServiceDiscovery source, ServiceDiscovery original, Throwable cause) {\n-        super(source, original);\n-        if (cause == null) {\n-            throw new NullPointerException(\"The cause of Exception must not null\");\n-        }\n-        this.cause = cause;\n-    }\n-\n-    /**\n-     * The cause of {@link Throwable}\n-     *\n-     * @return non-nul\n-     */\n-    public Throwable getCause() {\n-        return cause;\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.client.event;\r\n+\r\n+import org.apache.dubbo.registry.client.ServiceDiscovery;\r\n+\r\n+/**\r\n+ * An event raised when the {@link ServiceDiscovery Service Discovery} met with some exception\r\n+ *\r\n+ * @see ServiceDiscovery\r\n+ * @see org.apache.dubbo.event.Event\r\n+ * @since 2.7.5\r\n+ */\r\n+public class ServiceDiscoveryExceptionEvent extends ServiceDiscoveryEvent {\r\n+\r\n+    private final Throwable cause;\r\n+\r\n+    public ServiceDiscoveryExceptionEvent(ServiceDiscovery source, ServiceDiscovery original, Throwable cause) {\r\n+        super(source, original);\r\n+        if (cause == null) {\r\n+            throw new NullPointerException(\"The cause of Exception must not null\");\r\n+        }\r\n+        this.cause = cause;\r\n+    }\r\n+\r\n+    /**\r\n+     * The cause of {@link Throwable}\r\n+     *\r\n+     * @return non-nul\r\n+     */\r\n+    public Throwable getCause() {\r\n+        return cause;\r\n+    }\r\n+}\r\n"}, {"source1": "org/apache/dubbo/registry/client/event/ServiceDiscoveryInitializedEvent.java", "source2": "org/apache/dubbo/registry/client/event/ServiceDiscoveryInitializedEvent.java", "comments": ["Line-ending 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.client.event;\n-\n-import org.apache.dubbo.common.URL;\n-import org.apache.dubbo.registry.client.ServiceDiscovery;\n-\n-/**\n- * An event raised after the {@link ServiceDiscovery Service Discovery} initialized\n- *\n- * @see ServiceDiscovery#initialize(URL)\n- * @since 2.7.5\n- */\n-public class ServiceDiscoveryInitializedEvent extends ServiceDiscoveryEvent {\n-\n-    public ServiceDiscoveryInitializedEvent(ServiceDiscovery source, ServiceDiscovery original) {\n-        super(source, original);\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.client.event;\r\n+\r\n+import org.apache.dubbo.common.URL;\r\n+import org.apache.dubbo.registry.client.ServiceDiscovery;\r\n+\r\n+/**\r\n+ * An event raised after the {@link ServiceDiscovery Service Discovery} initialized\r\n+ *\r\n+ * @see ServiceDiscovery#initialize(URL)\r\n+ * @since 2.7.5\r\n+ */\r\n+public class ServiceDiscoveryInitializedEvent extends ServiceDiscoveryEvent {\r\n+\r\n+    public ServiceDiscoveryInitializedEvent(ServiceDiscovery source, ServiceDiscovery original) {\r\n+        super(source, original);\r\n+    }\r\n+}\r\n"}, {"source1": "org/apache/dubbo/registry/client/event/ServiceDiscoveryInitializingEvent.java", "source2": "org/apache/dubbo/registry/client/event/ServiceDiscoveryInitializingEvent.java", "comments": ["Line-ending 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.client.event;\n-\n-import org.apache.dubbo.common.URL;\n-import org.apache.dubbo.registry.client.ServiceDiscovery;\n-\n-/**\n- * An event raised when the {@link ServiceDiscovery Service Discovery} is initializing.\n- *\n- * @see ServiceDiscovery#initialize(URL)\n- * @since 2.7.5\n- */\n-public class ServiceDiscoveryInitializingEvent extends ServiceDiscoveryEvent {\n-\n-    public ServiceDiscoveryInitializingEvent(ServiceDiscovery source, ServiceDiscovery original) {\n-        super(source, original);\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.client.event;\r\n+\r\n+import org.apache.dubbo.common.URL;\r\n+import org.apache.dubbo.registry.client.ServiceDiscovery;\r\n+\r\n+/**\r\n+ * An event raised when the {@link ServiceDiscovery Service Discovery} is initializing.\r\n+ *\r\n+ * @see ServiceDiscovery#initialize(URL)\r\n+ * @since 2.7.5\r\n+ */\r\n+public class ServiceDiscoveryInitializingEvent extends ServiceDiscoveryEvent {\r\n+\r\n+    public ServiceDiscoveryInitializingEvent(ServiceDiscovery source, ServiceDiscovery original) {\r\n+        super(source, original);\r\n+    }\r\n+}\r\n"}, {"source1": "org/apache/dubbo/registry/client/event/ServiceInstanceEvent.java", "source2": "org/apache/dubbo/registry/client/event/ServiceInstanceEvent.java", "comments": ["Line-ending differences only"], "unified_diff": "@@ -1,47 +1,47 @@\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.client.event;\n-\n-import org.apache.dubbo.event.Event;\n-import org.apache.dubbo.registry.client.ServiceInstance;\n-\n-/**\n- * The {@link Event Dubbo event} for {@link ServiceInstance an service instance}\n- *\n- * @since 2.7.5\n- */\n-public abstract class ServiceInstanceEvent extends Event {\n-\n-    private final ServiceInstance serviceInstance;\n-\n-    /**\n-     * @param serviceInstance {@link ServiceInstance an service instance}\n-     */\n-    public ServiceInstanceEvent(Object source, ServiceInstance serviceInstance) {\n-        super(source);\n-        this.serviceInstance = serviceInstance;\n-    }\n-\n-    /**\n-     * Get current {@link ServiceInstance service instance}\n-     *\n-     * @return current {@link ServiceInstance service instance}\n-     */\n-    public ServiceInstance getServiceInstance() {\n-        return serviceInstance;\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.client.event;\r\n+\r\n+import org.apache.dubbo.event.Event;\r\n+import org.apache.dubbo.registry.client.ServiceInstance;\r\n+\r\n+/**\r\n+ * The {@link Event Dubbo event} for {@link ServiceInstance an service instance}\r\n+ *\r\n+ * @since 2.7.5\r\n+ */\r\n+public abstract class ServiceInstanceEvent extends Event {\r\n+\r\n+    private final ServiceInstance serviceInstance;\r\n+\r\n+    /**\r\n+     * @param serviceInstance {@link ServiceInstance an service instance}\r\n+     */\r\n+    public ServiceInstanceEvent(Object source, ServiceInstance serviceInstance) {\r\n+        super(source);\r\n+        this.serviceInstance = serviceInstance;\r\n+    }\r\n+\r\n+    /**\r\n+     * Get current {@link ServiceInstance service instance}\r\n+     *\r\n+     * @return current {@link ServiceInstance service instance}\r\n+     */\r\n+    public ServiceInstance getServiceInstance() {\r\n+        return serviceInstance;\r\n+    }\r\n+}\r\n"}, {"source1": "org/apache/dubbo/registry/client/event/ServiceInstancePreRegisteredEvent.java", "source2": "org/apache/dubbo/registry/client/event/ServiceInstancePreRegisteredEvent.java", "comments": ["Line-ending differences only"], "unified_diff": "@@ -1,34 +1,34 @@\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.client.event;\n-\n-import org.apache.dubbo.registry.client.ServiceDiscovery;\n-import org.apache.dubbo.registry.client.ServiceInstance;\n-\n-\n-/**\n- * An event raised before a {@link ServiceInstance service instance}\n- * {@link ServiceDiscovery#register(ServiceInstance) registered}\n- *\n- * @since 2.7.5\n- */\n-public class ServiceInstancePreRegisteredEvent extends ServiceInstanceEvent {\n-\n-    public ServiceInstancePreRegisteredEvent(Object source, ServiceInstance serviceInstance) {\n-        super(source, serviceInstance);\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.client.event;\r\n+\r\n+import org.apache.dubbo.registry.client.ServiceDiscovery;\r\n+import org.apache.dubbo.registry.client.ServiceInstance;\r\n+\r\n+\r\n+/**\r\n+ * An event raised before a {@link ServiceInstance service instance}\r\n+ * {@link ServiceDiscovery#register(ServiceInstance) registered}\r\n+ *\r\n+ * @since 2.7.5\r\n+ */\r\n+public class ServiceInstancePreRegisteredEvent extends ServiceInstanceEvent {\r\n+\r\n+    public ServiceInstancePreRegisteredEvent(Object source, ServiceInstance serviceInstance) {\r\n+        super(source, serviceInstance);\r\n+    }\r\n+}\r\n"}, {"source1": "org/apache/dubbo/registry/client/event/ServiceInstancePreUnregisteredEvent.java", "source2": "org/apache/dubbo/registry/client/event/ServiceInstancePreUnregisteredEvent.java", "comments": ["Line-ending differences only"], "unified_diff": "@@ -1,34 +1,34 @@\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.client.event;\n-\n-import org.apache.dubbo.registry.client.ServiceDiscovery;\n-import org.apache.dubbo.registry.client.ServiceInstance;\n-\n-\n-/**\n- * An event raised before a {@link ServiceInstance service instance}\n- * {@link ServiceDiscovery#unregister(ServiceInstance) unregistered}\n- *\n- * @since 2.7.5\n- */\n-public class ServiceInstancePreUnregisteredEvent extends ServiceInstanceEvent {\n-\n-    public ServiceInstancePreUnregisteredEvent(Object source, ServiceInstance serviceInstance) {\n-        super(source, serviceInstance);\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.client.event;\r\n+\r\n+import org.apache.dubbo.registry.client.ServiceDiscovery;\r\n+import org.apache.dubbo.registry.client.ServiceInstance;\r\n+\r\n+\r\n+/**\r\n+ * An event raised before a {@link ServiceInstance service instance}\r\n+ * {@link ServiceDiscovery#unregister(ServiceInstance) unregistered}\r\n+ *\r\n+ * @since 2.7.5\r\n+ */\r\n+public class ServiceInstancePreUnregisteredEvent extends ServiceInstanceEvent {\r\n+\r\n+    public ServiceInstancePreUnregisteredEvent(Object source, ServiceInstance serviceInstance) {\r\n+        super(source, serviceInstance);\r\n+    }\r\n+}\r\n"}, {"source1": "org/apache/dubbo/registry/client/event/ServiceInstanceRegisteredEvent.java", "source2": "org/apache/dubbo/registry/client/event/ServiceInstanceRegisteredEvent.java", "comments": ["Line-ending differences only"], "unified_diff": "@@ -1,34 +1,34 @@\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.client.event;\n-\n-import org.apache.dubbo.registry.client.ServiceDiscovery;\n-import org.apache.dubbo.registry.client.ServiceInstance;\n-\n-\n-/**\n- * An event raised after a {@link ServiceInstance service instance}\n- * {@link ServiceDiscovery#register(ServiceInstance) registered}\n- *\n- * @since 2.7.5\n- */\n-public class ServiceInstanceRegisteredEvent extends ServiceInstanceEvent {\n-\n-    public ServiceInstanceRegisteredEvent(Object source, ServiceInstance serviceInstance) {\n-        super(source, serviceInstance);\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.client.event;\r\n+\r\n+import org.apache.dubbo.registry.client.ServiceDiscovery;\r\n+import org.apache.dubbo.registry.client.ServiceInstance;\r\n+\r\n+\r\n+/**\r\n+ * An event raised after a {@link ServiceInstance service instance}\r\n+ * {@link ServiceDiscovery#register(ServiceInstance) registered}\r\n+ *\r\n+ * @since 2.7.5\r\n+ */\r\n+public class ServiceInstanceRegisteredEvent extends ServiceInstanceEvent {\r\n+\r\n+    public ServiceInstanceRegisteredEvent(Object source, ServiceInstance serviceInstance) {\r\n+        super(source, serviceInstance);\r\n+    }\r\n+}\r\n"}, {"source1": "org/apache/dubbo/registry/client/event/ServiceInstanceUnregisteredEvent.java", "source2": "org/apache/dubbo/registry/client/event/ServiceInstanceUnregisteredEvent.java", "comments": ["Line-ending differences only"], "unified_diff": "@@ -1,35 +1,35 @@\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.client.event;\n-\n-import org.apache.dubbo.registry.client.ServiceDiscovery;\n-import org.apache.dubbo.registry.client.ServiceInstance;\n-\n-\n-/**\n- * An event raised after a {@link ServiceInstance service instance}\n- * {@link ServiceDiscovery#unregister(ServiceInstance) unregistered}\n- *\n- * @see ServiceInstanceEvent\n- * @since 2.7.5\n- */\n-public class ServiceInstanceUnregisteredEvent extends ServiceInstanceEvent {\n-\n-    public ServiceInstanceUnregisteredEvent(Object source, ServiceInstance serviceInstance) {\n-        super(source, serviceInstance);\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.client.event;\r\n+\r\n+import org.apache.dubbo.registry.client.ServiceDiscovery;\r\n+import org.apache.dubbo.registry.client.ServiceInstance;\r\n+\r\n+\r\n+/**\r\n+ * An event raised after a {@link ServiceInstance service instance}\r\n+ * {@link ServiceDiscovery#unregister(ServiceInstance) unregistered}\r\n+ *\r\n+ * @see ServiceInstanceEvent\r\n+ * @since 2.7.5\r\n+ */\r\n+public class ServiceInstanceUnregisteredEvent extends ServiceInstanceEvent {\r\n+\r\n+    public ServiceInstanceUnregisteredEvent(Object source, ServiceInstance serviceInstance) {\r\n+        super(source, serviceInstance);\r\n+    }\r\n+}\r\n"}, {"source1": "org/apache/dubbo/registry/client/event/ServiceInstancesChangedEvent.java", "source2": "org/apache/dubbo/registry/client/event/ServiceInstancesChangedEvent.java", "comments": ["Line-ending differences only"], "unified_diff": "@@ -1,65 +1,65 @@\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.client.event;\n-\n-import org.apache.dubbo.event.Event;\n-import org.apache.dubbo.registry.client.ServiceInstance;\n-import org.apache.dubbo.registry.client.event.listener.ServiceInstancesChangedListener;\n-\n-import java.util.List;\n-\n-import static java.util.Collections.unmodifiableList;\n-\n-/**\n- * An event raised after the {@link ServiceInstance instances} of one service has been changed.\n- *\n- * @see ServiceInstancesChangedListener\n- * @since 2.7.5\n- */\n-public class ServiceInstancesChangedEvent extends Event {\n-\n-    private final String serviceName;\n-\n-    private final List<ServiceInstance> serviceInstances;\n-\n-    /**\n-     * @param serviceName      The name of service that was changed\n-     * @param serviceInstances all {@link ServiceInstance service instances}\n-     * @throws IllegalArgumentException if source is null.\n-     */\n-    public ServiceInstancesChangedEvent(String serviceName, List<ServiceInstance> serviceInstances) {\n-        super(serviceName);\n-        this.serviceName = serviceName;\n-        this.serviceInstances = unmodifiableList(serviceInstances);\n-    }\n-\n-    /**\n-     * @return The name of service that was changed\n-     */\n-    public String getServiceName() {\n-        return serviceName;\n-    }\n-\n-\n-    /**\n-     * @return all {@link ServiceInstance service instances}\n-     */\n-    public List<ServiceInstance> getServiceInstances() {\n-        return serviceInstances;\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.client.event;\r\n+\r\n+import org.apache.dubbo.event.Event;\r\n+import org.apache.dubbo.registry.client.ServiceInstance;\r\n+import org.apache.dubbo.registry.client.event.listener.ServiceInstancesChangedListener;\r\n+\r\n+import java.util.List;\r\n+\r\n+import static java.util.Collections.unmodifiableList;\r\n+\r\n+/**\r\n+ * An event raised after the {@link ServiceInstance instances} of one service has been changed.\r\n+ *\r\n+ * @see ServiceInstancesChangedListener\r\n+ * @since 2.7.5\r\n+ */\r\n+public class ServiceInstancesChangedEvent extends Event {\r\n+\r\n+    private final String serviceName;\r\n+\r\n+    private final List<ServiceInstance> serviceInstances;\r\n+\r\n+    /**\r\n+     * @param serviceName      The name of service that was changed\r\n+     * @param serviceInstances all {@link ServiceInstance service instances}\r\n+     * @throws IllegalArgumentException if source is null.\r\n+     */\r\n+    public ServiceInstancesChangedEvent(String serviceName, List<ServiceInstance> serviceInstances) {\r\n+        super(serviceName);\r\n+        this.serviceName = serviceName;\r\n+        this.serviceInstances = unmodifiableList(serviceInstances);\r\n+    }\r\n+\r\n+    /**\r\n+     * @return The name of service that was changed\r\n+     */\r\n+    public String getServiceName() {\r\n+        return serviceName;\r\n+    }\r\n+\r\n+\r\n+    /**\r\n+     * @return all {@link ServiceInstance service instances}\r\n+     */\r\n+    public List<ServiceInstance> getServiceInstances() {\r\n+        return serviceInstances;\r\n+    }\r\n+\r\n }\n"}, {"source1": "org/apache/dubbo/registry/client/event/listener/LoggingEventListener.java", "source2": "org/apache/dubbo/registry/client/event/listener/LoggingEventListener.java", "comments": ["Line-ending differences only"], "unified_diff": "@@ -1,85 +1,85 @@\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.client.event.listener;\n-\n-import org.apache.dubbo.common.logger.Logger;\n-import org.apache.dubbo.common.logger.LoggerFactory;\n-import org.apache.dubbo.event.Event;\n-import org.apache.dubbo.event.GenericEventListener;\n-import org.apache.dubbo.registry.client.event.ServiceDiscoveryDestroyedEvent;\n-import org.apache.dubbo.registry.client.event.ServiceDiscoveryDestroyingEvent;\n-import org.apache.dubbo.registry.client.event.ServiceDiscoveryInitializedEvent;\n-import org.apache.dubbo.registry.client.event.ServiceDiscoveryInitializingEvent;\n-import org.apache.dubbo.registry.client.event.ServiceInstancePreRegisteredEvent;\n-import org.apache.dubbo.registry.client.event.ServiceInstancePreUnregisteredEvent;\n-import org.apache.dubbo.registry.client.event.ServiceInstanceRegisteredEvent;\n-import org.apache.dubbo.registry.client.event.ServiceInstanceUnregisteredEvent;\n-import org.apache.dubbo.registry.client.event.ServiceInstancesChangedEvent;\n-\n-import static java.lang.String.format;\n-\n-/**\n- * A listener for logging the {@link Event Dubbo event}\n- *\n- * @since 2.7.5\n- */\n-public class LoggingEventListener extends GenericEventListener {\n-\n-    private final Logger logger = LoggerFactory.getLogger(getClass());\n-\n-    public void onEvent(ServiceDiscoveryInitializingEvent event) {\n-        info(\"%s is initializing...\", event.getServiceDiscovery());\n-    }\n-\n-    public void onEvent(ServiceDiscoveryInitializedEvent event) {\n-        info(\"%s is initialized.\", event.getServiceDiscovery());\n-    }\n-\n-    public void onEvent(ServiceInstancePreRegisteredEvent event) {\n-        info(\"%s is registering into %s...\", event.getServiceInstance(), event.getSource());\n-    }\n-\n-    public void onEvent(ServiceInstanceRegisteredEvent event) {\n-        info(\"%s has been registered into %s.\", event.getServiceInstance(), event.getSource());\n-    }\n-\n-    public void onEvent(ServiceInstancesChangedEvent event) {\n-        info(\"The service[name : %s] instances[size : %s] has been changed.\", event.getServiceName(), event.getServiceInstances().size());\n-    }\n-\n-    public void onEvent(ServiceInstancePreUnregisteredEvent event) {\n-        info(\"%s is unregistering from %s...\", event.getServiceInstance(), event.getSource());\n-    }\n-\n-    public void onEvent(ServiceInstanceUnregisteredEvent event) {\n-        info(\"%s has been unregistered from %s.\", event.getServiceInstance(), event.getSource());\n-    }\n-\n-    public void onEvent(ServiceDiscoveryDestroyingEvent event) {\n-        info(\"%s is stopping...\", event.getServiceDiscovery());\n-    }\n-\n-    public void onEvent(ServiceDiscoveryDestroyedEvent event) {\n-        info(\"%s is stopped.\", event.getServiceDiscovery());\n-    }\n-\n-    private void info(String pattern, Object... args) {\n-        if (logger.isInfoEnabled()) {\n-            logger.info(format(pattern, args));\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.client.event.listener;\r\n+\r\n+import org.apache.dubbo.common.logger.Logger;\r\n+import org.apache.dubbo.common.logger.LoggerFactory;\r\n+import org.apache.dubbo.event.Event;\r\n+import org.apache.dubbo.event.GenericEventListener;\r\n+import org.apache.dubbo.registry.client.event.ServiceDiscoveryDestroyedEvent;\r\n+import org.apache.dubbo.registry.client.event.ServiceDiscoveryDestroyingEvent;\r\n+import org.apache.dubbo.registry.client.event.ServiceDiscoveryInitializedEvent;\r\n+import org.apache.dubbo.registry.client.event.ServiceDiscoveryInitializingEvent;\r\n+import org.apache.dubbo.registry.client.event.ServiceInstancePreRegisteredEvent;\r\n+import org.apache.dubbo.registry.client.event.ServiceInstancePreUnregisteredEvent;\r\n+import org.apache.dubbo.registry.client.event.ServiceInstanceRegisteredEvent;\r\n+import org.apache.dubbo.registry.client.event.ServiceInstanceUnregisteredEvent;\r\n+import org.apache.dubbo.registry.client.event.ServiceInstancesChangedEvent;\r\n+\r\n+import static java.lang.String.format;\r\n+\r\n+/**\r\n+ * A listener for logging the {@link Event Dubbo event}\r\n+ *\r\n+ * @since 2.7.5\r\n+ */\r\n+public class LoggingEventListener extends GenericEventListener {\r\n+\r\n+    private final Logger logger = LoggerFactory.getLogger(getClass());\r\n+\r\n+    public void onEvent(ServiceDiscoveryInitializingEvent event) {\r\n+        info(\"%s is initializing...\", event.getServiceDiscovery());\r\n+    }\r\n+\r\n+    public void onEvent(ServiceDiscoveryInitializedEvent event) {\r\n+        info(\"%s is initialized.\", event.getServiceDiscovery());\r\n+    }\r\n+\r\n+    public void onEvent(ServiceInstancePreRegisteredEvent event) {\r\n+        info(\"%s is registering into %s...\", event.getServiceInstance(), event.getSource());\r\n+    }\r\n+\r\n+    public void onEvent(ServiceInstanceRegisteredEvent event) {\r\n+        info(\"%s has been registered into %s.\", event.getServiceInstance(), event.getSource());\r\n+    }\r\n+\r\n+    public void onEvent(ServiceInstancesChangedEvent event) {\r\n+        info(\"The service[name : %s] instances[size : %s] has been changed.\", event.getServiceName(), event.getServiceInstances().size());\r\n+    }\r\n+\r\n+    public void onEvent(ServiceInstancePreUnregisteredEvent event) {\r\n+        info(\"%s is unregistering from %s...\", event.getServiceInstance(), event.getSource());\r\n+    }\r\n+\r\n+    public void onEvent(ServiceInstanceUnregisteredEvent event) {\r\n+        info(\"%s has been unregistered from %s.\", event.getServiceInstance(), event.getSource());\r\n+    }\r\n+\r\n+    public void onEvent(ServiceDiscoveryDestroyingEvent event) {\r\n+        info(\"%s is stopping...\", event.getServiceDiscovery());\r\n+    }\r\n+\r\n+    public void onEvent(ServiceDiscoveryDestroyedEvent event) {\r\n+        info(\"%s is stopped.\", event.getServiceDiscovery());\r\n+    }\r\n+\r\n+    private void info(String pattern, Object... args) {\r\n+        if (logger.isInfoEnabled()) {\r\n+            logger.info(format(pattern, args));\r\n+        }\r\n+    }\r\n+}\r\n"}, {"source1": "org/apache/dubbo/registry/client/event/listener/ServiceInstancesChangedListener.java", "source2": "org/apache/dubbo/registry/client/event/listener/ServiceInstancesChangedListener.java", "comments": ["Line-ending differences only"], "unified_diff": "@@ -1,268 +1,268 @@\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.client.event.listener;\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.event.ConditionalEventListener;\n-import org.apache.dubbo.event.EventListener;\n-import org.apache.dubbo.metadata.MetadataInfo;\n-import org.apache.dubbo.metadata.MetadataInfo.ServiceInfo;\n-import org.apache.dubbo.metadata.MetadataService;\n-import org.apache.dubbo.registry.NotifyListener;\n-import org.apache.dubbo.registry.client.DefaultServiceInstance;\n-import org.apache.dubbo.registry.client.RegistryClusterIdentifier;\n-import org.apache.dubbo.registry.client.ServiceDiscovery;\n-import org.apache.dubbo.registry.client.ServiceInstance;\n-import org.apache.dubbo.registry.client.event.ServiceInstancesChangedEvent;\n-import org.apache.dubbo.registry.client.metadata.MetadataUtils;\n-import org.apache.dubbo.registry.client.metadata.ServiceInstanceMetadataUtils;\n-import org.apache.dubbo.registry.client.metadata.store.RemoteMetadataServiceImpl;\n-\n-import java.util.ArrayList;\n-import java.util.Collections;\n-import java.util.HashMap;\n-import java.util.HashSet;\n-import java.util.LinkedList;\n-import java.util.List;\n-import java.util.Map;\n-import java.util.Objects;\n-import java.util.Set;\n-import java.util.TreeSet;\n-\n-import static org.apache.dubbo.common.constants.CommonConstants.REMOTE_METADATA_STORAGE_TYPE;\n-import static org.apache.dubbo.common.constants.RegistryConstants.REGISTRY_CLUSTER_KEY;\n-import static org.apache.dubbo.metadata.MetadataInfo.DEFAULT_REVISION;\n-import static org.apache.dubbo.registry.client.metadata.ServiceInstanceMetadataUtils.getExportedServicesRevision;\n-\n-/**\n- * The Service Discovery Changed {@link EventListener Event Listener}\n- *\n- * @see ServiceInstancesChangedEvent\n- * @since 2.7.5\n- */\n-public class ServiceInstancesChangedListener implements ConditionalEventListener<ServiceInstancesChangedEvent> {\n-\n-    private static final Logger logger = LoggerFactory.getLogger(ServiceInstancesChangedListener.class);\n-\n-    private final Set<String> serviceNames;\n-    private final ServiceDiscovery serviceDiscovery;\n-    private final String registryId;\n-    private URL url;\n-    private Map<String, Set<NotifyListener>> listeners;\n-\n-    private Map<String, List<ServiceInstance>> allInstances;\n-\n-    private Map<String, List<URL>> serviceUrls;\n-\n-    private Map<String, MetadataInfo> revisionToMetadata;\n-\n-    public ServiceInstancesChangedListener(Set<String> serviceNames, ServiceDiscovery serviceDiscovery) {\n-        this.serviceNames = serviceNames;\n-        this.serviceDiscovery = serviceDiscovery;\n-        this.registryId = serviceDiscovery.getUrl().getParameter(\"id\");\n-        this.listeners = new HashMap<>();\n-        this.allInstances = new HashMap<>();\n-        this.serviceUrls = new HashMap<>();\n-        this.revisionToMetadata = new HashMap<>();\n-    }\n-\n-    /**\n-     * On {@link ServiceInstancesChangedEvent the service instances change event}\n-     *\n-     * @param event {@link ServiceInstancesChangedEvent}\n-     */\n-    public synchronized void onEvent(ServiceInstancesChangedEvent event) {\n-        logger.info(\"Received instance notification, serviceName: \" + event.getServiceName() + \", instances: \" + event.getServiceInstances().size());\n-        String appName = event.getServiceName();\n-        allInstances.put(appName, event.getServiceInstances());\n-        if (logger.isDebugEnabled()) {\n-            logger.debug(event.getServiceInstances().toString());\n-        }\n-\n-        Map<String, List<ServiceInstance>> revisionToInstances = new HashMap<>();\n-        Map<String, Set<String>> localServiceToRevisions = new HashMap<>();\n-        Map<Set<String>, List<URL>> revisionsToUrls = new HashMap();\n-        Map<String, List<URL>> tmpServiceUrls = new HashMap<>();\n-        for (Map.Entry<String, List<ServiceInstance>> entry : allInstances.entrySet()) {\n-            List<ServiceInstance> instances = entry.getValue();\n-            for (ServiceInstance instance : instances) {\n-                String revision = getExportedServicesRevision(instance);\n-                if (DEFAULT_REVISION.equals(revision)) {\n-                    logger.info(\"Find instance without valid service metadata: \" + instance.getAddress());\n-                    continue;\n-                }\n-                List<ServiceInstance> subInstances = revisionToInstances.computeIfAbsent(revision, r -> new LinkedList<>());\n-                subInstances.add(instance);\n-\n-                MetadataInfo metadata = revisionToMetadata.get(revision);\n-                if (metadata == null) {\n-                    metadata = getMetadataInfo(instance);\n-                    logger.info(\"MetadataInfo for instance \" + instance.getAddress() + \"?revision=\" + revision + \" is \" + metadata);\n-                    if (metadata != null) {\n-                        revisionToMetadata.put(revision, metadata);\n-                    } else {\n-\n-                    }\n-                }\n-\n-                if (metadata != null) {\n-                    parseMetadata(revision, metadata, localServiceToRevisions);\n-                    ((DefaultServiceInstance) instance).setServiceMetadata(metadata);\n-                }\n-//                else {\n-//                    logger.error(\"Failed to load service metadata for instance \" + instance);\n-//                    Set<String> set = localServiceToRevisions.computeIfAbsent(url.getServiceKey(), k -> new TreeSet<>());\n-//                    set.add(revision);\n-//                }\n-            }\n-\n-            localServiceToRevisions.forEach((serviceKey, revisions) -> {\n-                List<URL> urls = revisionsToUrls.get(revisions);\n-                if (urls != null) {\n-                    tmpServiceUrls.put(serviceKey, urls);\n-                } else {\n-                    urls = new ArrayList<>();\n-                    for (String r : revisions) {\n-                        for (ServiceInstance i : revisionToInstances.get(r)) {\n-                            urls.add(i.toURL());\n-                        }\n-                    }\n-                    revisionsToUrls.put(revisions, urls);\n-                    tmpServiceUrls.put(serviceKey, urls);\n-                }\n-            });\n-        }\n-\n-        this.serviceUrls = tmpServiceUrls;\n-        this.notifyAddressChanged();\n-    }\n-\n-    private Map<String, Set<String>> parseMetadata(String revision, MetadataInfo metadata, Map<String, Set<String>> localServiceToRevisions) {\n-        Map<String, ServiceInfo> serviceInfos = metadata.getServices();\n-        for (Map.Entry<String, ServiceInfo> entry : serviceInfos.entrySet()) {\n-            Set<String> set = localServiceToRevisions.computeIfAbsent(entry.getKey(), k -> new TreeSet<>());\n-            set.add(revision);\n-        }\n-\n-        return localServiceToRevisions;\n-    }\n-\n-    private MetadataInfo getMetadataInfo(ServiceInstance instance) {\n-        String metadataType = ServiceInstanceMetadataUtils.getMetadataStorageType(instance);\n-        // FIXME, check \"REGISTRY_CLUSTER_KEY\" must be set by every registry implementation.\n-        instance.getExtendParams().putIfAbsent(REGISTRY_CLUSTER_KEY, RegistryClusterIdentifier.getExtension(url).consumerKey(url));\n-        MetadataInfo metadataInfo;\n-        try {\n-            if (logger.isDebugEnabled()) {\n-                logger.info(\"Instance \" + instance.getAddress() + \" is using metadata type \" + metadataType);\n-            }\n-            if (REMOTE_METADATA_STORAGE_TYPE.equals(metadataType)) {\n-                RemoteMetadataServiceImpl remoteMetadataService = MetadataUtils.getRemoteMetadataService();\n-                metadataInfo = remoteMetadataService.getMetadata(instance);\n-            } else {\n-                MetadataService metadataServiceProxy = MetadataUtils.getMetadataServiceProxy(instance, serviceDiscovery);\n-                metadataInfo = metadataServiceProxy.getMetadataInfo(ServiceInstanceMetadataUtils.getExportedServicesRevision(instance));\n-            }\n-            if (logger.isDebugEnabled()) {\n-                logger.info(\"Metadata \" + metadataInfo.toString());\n-            }\n-        } catch (Exception e) {\n-            logger.error(\"Failed to load service metadata, metadata type is \" + metadataType, e);\n-            metadataInfo = null;\n-            // TODO, load metadata backup. Stop getting metadata after x times of failure for one revision?\n-        }\n-        return metadataInfo;\n-    }\n-\n-    private void notifyAddressChanged() {\n-        listeners.forEach((key, notifyListeners) -> {\n-            notifyListeners.forEach(notifyListener -> {\n-                notifyListener.notify(toUrlsWithEmpty(serviceUrls.get(key)));\n-            });\n-        });\n-    }\n-\n-    private List<URL> toUrlsWithEmpty(List<URL> urls) {\n-        if (urls == null) {\n-            urls = Collections.emptyList();\n-        }\n-        return urls;\n-    }\n-\n-    public void addListener(String serviceKey, NotifyListener listener) {\n-        this.listeners.computeIfAbsent(serviceKey, k -> new HashSet<>()).add(listener);\n-    }\n-\n-    public void removeListener(String serviceKey) {\n-        listeners.remove(serviceKey);\n-        if (listeners.isEmpty()) {\n-            serviceDiscovery.removeServiceInstancesChangedListener(this);\n-        }\n-    }\n-\n-    public List<URL> getUrls(String serviceKey) {\n-        return toUrlsWithEmpty(serviceUrls.get(serviceKey));\n-    }\n-\n-    /**\n-     * Get the correlative service name\n-     *\n-     * @return the correlative service name\n-     */\n-    public final Set<String> getServiceNames() {\n-        return serviceNames;\n-    }\n-\n-    public void setUrl(URL url) {\n-        this.url = url;\n-    }\n-\n-    public URL getUrl() {\n-        return url;\n-    }\n-\n-    /**\n-     * @param event {@link ServiceInstancesChangedEvent event}\n-     * @return If service name matches, return <code>true</code>, or <code>false</code>\n-     */\n-    public final boolean accept(ServiceInstancesChangedEvent event) {\n-        return serviceNames.contains(event.getServiceName());\n-    }\n-\n-    public String getRegistryId() {\n-        return registryId;\n-    }\n-\n-    @Override\n-    public boolean equals(Object o) {\n-        if (this == o) {\n-            return true;\n-        }\n-        if (!(o instanceof ServiceInstancesChangedListener)) {\n-            return false;\n-        }\n-        ServiceInstancesChangedListener that = (ServiceInstancesChangedListener) o;\n-        return Objects.equals(getServiceNames(), that.getServiceNames()) && Objects.equals(getRegistryId(), that.getRegistryId());\n-    }\n-\n-    @Override\n-    public int hashCode() {\n-        return Objects.hash(getClass(), getServiceNames(), getRegistryId());\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.client.event.listener;\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.event.ConditionalEventListener;\r\n+import org.apache.dubbo.event.EventListener;\r\n+import org.apache.dubbo.metadata.MetadataInfo;\r\n+import org.apache.dubbo.metadata.MetadataInfo.ServiceInfo;\r\n+import org.apache.dubbo.metadata.MetadataService;\r\n+import org.apache.dubbo.registry.NotifyListener;\r\n+import org.apache.dubbo.registry.client.DefaultServiceInstance;\r\n+import org.apache.dubbo.registry.client.RegistryClusterIdentifier;\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.ServiceInstancesChangedEvent;\r\n+import org.apache.dubbo.registry.client.metadata.MetadataUtils;\r\n+import org.apache.dubbo.registry.client.metadata.ServiceInstanceMetadataUtils;\r\n+import org.apache.dubbo.registry.client.metadata.store.RemoteMetadataServiceImpl;\r\n+\r\n+import java.util.ArrayList;\r\n+import java.util.Collections;\r\n+import java.util.HashMap;\r\n+import java.util.HashSet;\r\n+import java.util.LinkedList;\r\n+import java.util.List;\r\n+import java.util.Map;\r\n+import java.util.Objects;\r\n+import java.util.Set;\r\n+import java.util.TreeSet;\r\n+\r\n+import static org.apache.dubbo.common.constants.CommonConstants.REMOTE_METADATA_STORAGE_TYPE;\r\n+import static org.apache.dubbo.common.constants.RegistryConstants.REGISTRY_CLUSTER_KEY;\r\n+import static org.apache.dubbo.metadata.MetadataInfo.DEFAULT_REVISION;\r\n+import static org.apache.dubbo.registry.client.metadata.ServiceInstanceMetadataUtils.getExportedServicesRevision;\r\n+\r\n+/**\r\n+ * The Service Discovery Changed {@link EventListener Event Listener}\r\n+ *\r\n+ * @see ServiceInstancesChangedEvent\r\n+ * @since 2.7.5\r\n+ */\r\n+public class ServiceInstancesChangedListener implements ConditionalEventListener<ServiceInstancesChangedEvent> {\r\n+\r\n+    private static final Logger logger = LoggerFactory.getLogger(ServiceInstancesChangedListener.class);\r\n+\r\n+    private final Set<String> serviceNames;\r\n+    private final ServiceDiscovery serviceDiscovery;\r\n+    private final String registryId;\r\n+    private URL url;\r\n+    private Map<String, Set<NotifyListener>> listeners;\r\n+\r\n+    private Map<String, List<ServiceInstance>> allInstances;\r\n+\r\n+    private Map<String, List<URL>> serviceUrls;\r\n+\r\n+    private Map<String, MetadataInfo> revisionToMetadata;\r\n+\r\n+    public ServiceInstancesChangedListener(Set<String> serviceNames, ServiceDiscovery serviceDiscovery) {\r\n+        this.serviceNames = serviceNames;\r\n+        this.serviceDiscovery = serviceDiscovery;\r\n+        this.registryId = serviceDiscovery.getUrl().getParameter(\"id\");\r\n+        this.listeners = new HashMap<>();\r\n+        this.allInstances = new HashMap<>();\r\n+        this.serviceUrls = new HashMap<>();\r\n+        this.revisionToMetadata = new HashMap<>();\r\n+    }\r\n+\r\n+    /**\r\n+     * On {@link ServiceInstancesChangedEvent the service instances change event}\r\n+     *\r\n+     * @param event {@link ServiceInstancesChangedEvent}\r\n+     */\r\n+    public synchronized void onEvent(ServiceInstancesChangedEvent event) {\r\n+        logger.info(\"Received instance notification, serviceName: \" + event.getServiceName() + \", instances: \" + event.getServiceInstances().size());\r\n+        String appName = event.getServiceName();\r\n+        allInstances.put(appName, event.getServiceInstances());\r\n+        if (logger.isDebugEnabled()) {\r\n+            logger.debug(event.getServiceInstances().toString());\r\n+        }\r\n+\r\n+        Map<String, List<ServiceInstance>> revisionToInstances = new HashMap<>();\r\n+        Map<String, Set<String>> localServiceToRevisions = new HashMap<>();\r\n+        Map<Set<String>, List<URL>> revisionsToUrls = new HashMap();\r\n+        Map<String, List<URL>> tmpServiceUrls = new HashMap<>();\r\n+        for (Map.Entry<String, List<ServiceInstance>> entry : allInstances.entrySet()) {\r\n+            List<ServiceInstance> instances = entry.getValue();\r\n+            for (ServiceInstance instance : instances) {\r\n+                String revision = getExportedServicesRevision(instance);\r\n+                if (DEFAULT_REVISION.equals(revision)) {\r\n+                    logger.info(\"Find instance without valid service metadata: \" + instance.getAddress());\r\n+                    continue;\r\n+                }\r\n+                List<ServiceInstance> subInstances = revisionToInstances.computeIfAbsent(revision, r -> new LinkedList<>());\r\n+                subInstances.add(instance);\r\n+\r\n+                MetadataInfo metadata = revisionToMetadata.get(revision);\r\n+                if (metadata == null) {\r\n+                    metadata = getMetadataInfo(instance);\r\n+                    logger.info(\"MetadataInfo for instance \" + instance.getAddress() + \"?revision=\" + revision + \" is \" + metadata);\r\n+                    if (metadata != null) {\r\n+                        revisionToMetadata.put(revision, metadata);\r\n+                    } else {\r\n+\r\n+                    }\r\n+                }\r\n+\r\n+                if (metadata != null) {\r\n+                    parseMetadata(revision, metadata, localServiceToRevisions);\r\n+                    ((DefaultServiceInstance) instance).setServiceMetadata(metadata);\r\n+                }\r\n+//                else {\r\n+//                    logger.error(\"Failed to load service metadata for instance \" + instance);\r\n+//                    Set<String> set = localServiceToRevisions.computeIfAbsent(url.getServiceKey(), k -> new TreeSet<>());\r\n+//                    set.add(revision);\r\n+//                }\r\n+            }\r\n+\r\n+            localServiceToRevisions.forEach((serviceKey, revisions) -> {\r\n+                List<URL> urls = revisionsToUrls.get(revisions);\r\n+                if (urls != null) {\r\n+                    tmpServiceUrls.put(serviceKey, urls);\r\n+                } else {\r\n+                    urls = new ArrayList<>();\r\n+                    for (String r : revisions) {\r\n+                        for (ServiceInstance i : revisionToInstances.get(r)) {\r\n+                            urls.add(i.toURL());\r\n+                        }\r\n+                    }\r\n+                    revisionsToUrls.put(revisions, urls);\r\n+                    tmpServiceUrls.put(serviceKey, urls);\r\n+                }\r\n+            });\r\n+        }\r\n+\r\n+        this.serviceUrls = tmpServiceUrls;\r\n+        this.notifyAddressChanged();\r\n+    }\r\n+\r\n+    private Map<String, Set<String>> parseMetadata(String revision, MetadataInfo metadata, Map<String, Set<String>> localServiceToRevisions) {\r\n+        Map<String, ServiceInfo> serviceInfos = metadata.getServices();\r\n+        for (Map.Entry<String, ServiceInfo> entry : serviceInfos.entrySet()) {\r\n+            Set<String> set = localServiceToRevisions.computeIfAbsent(entry.getKey(), k -> new TreeSet<>());\r\n+            set.add(revision);\r\n+        }\r\n+\r\n+        return localServiceToRevisions;\r\n+    }\r\n+\r\n+    private MetadataInfo getMetadataInfo(ServiceInstance instance) {\r\n+        String metadataType = ServiceInstanceMetadataUtils.getMetadataStorageType(instance);\r\n+        // FIXME, check \"REGISTRY_CLUSTER_KEY\" must be set by every registry implementation.\r\n+        instance.getExtendParams().putIfAbsent(REGISTRY_CLUSTER_KEY, RegistryClusterIdentifier.getExtension(url).consumerKey(url));\r\n+        MetadataInfo metadataInfo;\r\n+        try {\r\n+            if (logger.isDebugEnabled()) {\r\n+                logger.info(\"Instance \" + instance.getAddress() + \" is using metadata type \" + metadataType);\r\n+            }\r\n+            if (REMOTE_METADATA_STORAGE_TYPE.equals(metadataType)) {\r\n+                RemoteMetadataServiceImpl remoteMetadataService = MetadataUtils.getRemoteMetadataService();\r\n+                metadataInfo = remoteMetadataService.getMetadata(instance);\r\n+            } else {\r\n+                MetadataService metadataServiceProxy = MetadataUtils.getMetadataServiceProxy(instance, serviceDiscovery);\r\n+                metadataInfo = metadataServiceProxy.getMetadataInfo(ServiceInstanceMetadataUtils.getExportedServicesRevision(instance));\r\n+            }\r\n+            if (logger.isDebugEnabled()) {\r\n+                logger.info(\"Metadata \" + metadataInfo.toString());\r\n+            }\r\n+        } catch (Exception e) {\r\n+            logger.error(\"Failed to load service metadata, metadata type is \" + metadataType, e);\r\n+            metadataInfo = null;\r\n+            // TODO, load metadata backup. Stop getting metadata after x times of failure for one revision?\r\n+        }\r\n+        return metadataInfo;\r\n+    }\r\n+\r\n+    private void notifyAddressChanged() {\r\n+        listeners.forEach((key, notifyListeners) -> {\r\n+            notifyListeners.forEach(notifyListener -> {\r\n+                notifyListener.notify(toUrlsWithEmpty(serviceUrls.get(key)));\r\n+            });\r\n+        });\r\n+    }\r\n+\r\n+    private List<URL> toUrlsWithEmpty(List<URL> urls) {\r\n+        if (urls == null) {\r\n+            urls = Collections.emptyList();\r\n+        }\r\n+        return urls;\r\n+    }\r\n+\r\n+    public void addListener(String serviceKey, NotifyListener listener) {\r\n+        this.listeners.computeIfAbsent(serviceKey, k -> new HashSet<>()).add(listener);\r\n+    }\r\n+\r\n+    public void removeListener(String serviceKey) {\r\n+        listeners.remove(serviceKey);\r\n+        if (listeners.isEmpty()) {\r\n+            serviceDiscovery.removeServiceInstancesChangedListener(this);\r\n+        }\r\n+    }\r\n+\r\n+    public List<URL> getUrls(String serviceKey) {\r\n+        return toUrlsWithEmpty(serviceUrls.get(serviceKey));\r\n+    }\r\n+\r\n+    /**\r\n+     * Get the correlative service name\r\n+     *\r\n+     * @return the correlative service name\r\n+     */\r\n+    public final Set<String> getServiceNames() {\r\n+        return serviceNames;\r\n+    }\r\n+\r\n+    public void setUrl(URL url) {\r\n+        this.url = url;\r\n+    }\r\n+\r\n+    public URL getUrl() {\r\n+        return url;\r\n+    }\r\n+\r\n+    /**\r\n+     * @param event {@link ServiceInstancesChangedEvent event}\r\n+     * @return If service name matches, return <code>true</code>, or <code>false</code>\r\n+     */\r\n+    public final boolean accept(ServiceInstancesChangedEvent event) {\r\n+        return serviceNames.contains(event.getServiceName());\r\n+    }\r\n+\r\n+    public String getRegistryId() {\r\n+        return registryId;\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 ServiceInstancesChangedListener)) {\r\n+            return false;\r\n+        }\r\n+        ServiceInstancesChangedListener that = (ServiceInstancesChangedListener) o;\r\n+        return Objects.equals(getServiceNames(), that.getServiceNames()) && Objects.equals(getRegistryId(), that.getRegistryId());\r\n+    }\r\n+\r\n+    @Override\r\n+    public int hashCode() {\r\n+        return Objects.hash(getClass(), getServiceNames(), getRegistryId());\r\n+    }\r\n+}\r\n"}, {"source1": "org/apache/dubbo/registry/client/metadata/MetadataServiceNameMapping.java", "source2": "org/apache/dubbo/registry/client/metadata/MetadataServiceNameMapping.java", "comments": ["Line-ending differences only"], "unified_diff": "@@ -1,86 +1,86 @@\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.client.metadata;\n-\n-import org.apache.dubbo.common.URL;\n-import org.apache.dubbo.common.utils.CollectionUtils;\n-import org.apache.dubbo.metadata.MappingListener;\n-import org.apache.dubbo.metadata.MetadataService;\n-import org.apache.dubbo.metadata.ServiceNameMapping;\n-import org.apache.dubbo.metadata.report.MetadataReport;\n-import org.apache.dubbo.metadata.report.MetadataReportInstance;\n-import org.apache.dubbo.registry.client.RegistryClusterIdentifier;\n-\n-import java.util.LinkedHashSet;\n-import java.util.List;\n-import java.util.Set;\n-\n-import static java.util.Arrays.asList;\n-import static org.apache.dubbo.common.constants.CommonConstants.GROUP_KEY;\n-import static org.apache.dubbo.common.constants.CommonConstants.VERSION_KEY;\n-import static org.apache.dubbo.rpc.model.ApplicationModel.getName;\n-\n-public class MetadataServiceNameMapping implements ServiceNameMapping {\n-    private static final List<String> IGNORED_SERVICE_INTERFACES = asList(MetadataService.class.getName());\n-\n-    @Override\n-    public void map(URL url) {\n-        String serviceInterface = url.getServiceInterface();\n-        String group = url.getParameter(GROUP_KEY);\n-        String version = url.getParameter(VERSION_KEY);\n-        String protocol = url.getProtocol();\n-\n-        if (IGNORED_SERVICE_INTERFACES.contains(serviceInterface)) {\n-            return;\n-        }\n-        String registryCluster = getRegistryCluster(url);\n-        MetadataReport metadataReport = MetadataReportInstance.getMetadataReport(registryCluster);\n-        metadataReport.registerServiceAppMapping(ServiceNameMapping.buildGroup(serviceInterface, group, version, protocol), getName(), url);\n-    }\n-\n-    @Override\n-    public Set<String> getAndListen(URL url, MappingListener mappingListener) {\n-        String serviceInterface = url.getServiceInterface();\n-        String group = url.getParameter(GROUP_KEY);\n-        String version = url.getParameter(VERSION_KEY);\n-        String protocol = url.getProtocol();\n-\n-        String mappingKey = ServiceNameMapping.buildGroup(serviceInterface, group, version, protocol);\n-        Set<String> serviceNames = new LinkedHashSet<>();\n-        String registryCluster = getRegistryCluster(url);\n-        MetadataReport metadataReport = MetadataReportInstance.getMetadataReport(registryCluster);\n-        Set<String> apps = metadataReport.getServiceAppMapping(\n-                mappingKey,\n-                mappingListener,\n-                url);\n-        if (CollectionUtils.isNotEmpty(apps)) {\n-            serviceNames.addAll(apps);\n-        }\n-\n-        return serviceNames;\n-    }\n-\n-    protected String getRegistryCluster(URL url) {\n-        String registryCluster = RegistryClusterIdentifier.getExtension(url).providerKey(url);\n-\n-        int i = registryCluster.indexOf(\",\");\n-        if (i > 0) {\n-            registryCluster = registryCluster.substring(0, i);\n-        }\n-        return registryCluster;\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.client.metadata;\r\n+\r\n+import org.apache.dubbo.common.URL;\r\n+import org.apache.dubbo.common.utils.CollectionUtils;\r\n+import org.apache.dubbo.metadata.MappingListener;\r\n+import org.apache.dubbo.metadata.MetadataService;\r\n+import org.apache.dubbo.metadata.ServiceNameMapping;\r\n+import org.apache.dubbo.metadata.report.MetadataReport;\r\n+import org.apache.dubbo.metadata.report.MetadataReportInstance;\r\n+import org.apache.dubbo.registry.client.RegistryClusterIdentifier;\r\n+\r\n+import java.util.LinkedHashSet;\r\n+import java.util.List;\r\n+import java.util.Set;\r\n+\r\n+import static java.util.Arrays.asList;\r\n+import static org.apache.dubbo.common.constants.CommonConstants.GROUP_KEY;\r\n+import static org.apache.dubbo.common.constants.CommonConstants.VERSION_KEY;\r\n+import static org.apache.dubbo.rpc.model.ApplicationModel.getName;\r\n+\r\n+public class MetadataServiceNameMapping implements ServiceNameMapping {\r\n+    private static final List<String> IGNORED_SERVICE_INTERFACES = asList(MetadataService.class.getName());\r\n+\r\n+    @Override\r\n+    public void map(URL url) {\r\n+        String serviceInterface = url.getServiceInterface();\r\n+        String group = url.getParameter(GROUP_KEY);\r\n+        String version = url.getParameter(VERSION_KEY);\r\n+        String protocol = url.getProtocol();\r\n+\r\n+        if (IGNORED_SERVICE_INTERFACES.contains(serviceInterface)) {\r\n+            return;\r\n+        }\r\n+        String registryCluster = getRegistryCluster(url);\r\n+        MetadataReport metadataReport = MetadataReportInstance.getMetadataReport(registryCluster);\r\n+        metadataReport.registerServiceAppMapping(ServiceNameMapping.buildGroup(serviceInterface, group, version, protocol), getName(), url);\r\n+    }\r\n+\r\n+    @Override\r\n+    public Set<String> getAndListen(URL url, MappingListener mappingListener) {\r\n+        String serviceInterface = url.getServiceInterface();\r\n+        String group = url.getParameter(GROUP_KEY);\r\n+        String version = url.getParameter(VERSION_KEY);\r\n+        String protocol = url.getProtocol();\r\n+\r\n+        String mappingKey = ServiceNameMapping.buildGroup(serviceInterface, group, version, protocol);\r\n+        Set<String> serviceNames = new LinkedHashSet<>();\r\n+        String registryCluster = getRegistryCluster(url);\r\n+        MetadataReport metadataReport = MetadataReportInstance.getMetadataReport(registryCluster);\r\n+        Set<String> apps = metadataReport.getServiceAppMapping(\r\n+                mappingKey,\r\n+                mappingListener,\r\n+                url);\r\n+        if (CollectionUtils.isNotEmpty(apps)) {\r\n+            serviceNames.addAll(apps);\r\n+        }\r\n+\r\n+        return serviceNames;\r\n+    }\r\n+\r\n+    protected String getRegistryCluster(URL url) {\r\n+        String registryCluster = RegistryClusterIdentifier.getExtension(url).providerKey(url);\r\n+\r\n+        int i = registryCluster.indexOf(\",\");\r\n+        if (i > 0) {\r\n+            registryCluster = registryCluster.substring(0, i);\r\n+        }\r\n+        return registryCluster;\r\n+    }\r\n+}\r\n"}, {"source1": "org/apache/dubbo/registry/client/metadata/MetadataServiceURLBuilder.java", "source2": "org/apache/dubbo/registry/client/metadata/MetadataServiceURLBuilder.java", "comments": ["Line-ending differences only"], "unified_diff": "@@ -1,40 +1,40 @@\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.client.metadata;\n-\n-import org.apache.dubbo.common.URL;\n-import org.apache.dubbo.common.extension.SPI;\n-import org.apache.dubbo.registry.client.ServiceInstance;\n-\n-import java.util.List;\n-\n-/**\n- * Used to build metadata service url from ServiceInstance.\n- *\n- * @since 2.7.5\n- */\n-@SPI\n-public interface MetadataServiceURLBuilder {\n-\n-    /**\n-     * Build the {@link URL URLs} from the specified {@link ServiceInstance}\n-     *\n-     * @param serviceInstance {@link ServiceInstance}\n-     * @return TODO, usually, we generate one metadata url from one instance. There's no scenario to return a metadata url list.\n-     */\n-    List<URL> build(ServiceInstance serviceInstance);\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.client.metadata;\r\n+\r\n+import org.apache.dubbo.common.URL;\r\n+import org.apache.dubbo.common.extension.SPI;\r\n+import org.apache.dubbo.registry.client.ServiceInstance;\r\n+\r\n+import java.util.List;\r\n+\r\n+/**\r\n+ * Used to build metadata service url from ServiceInstance.\r\n+ *\r\n+ * @since 2.7.5\r\n+ */\r\n+@SPI\r\n+public interface MetadataServiceURLBuilder {\r\n+\r\n+    /**\r\n+     * Build the {@link URL URLs} from the specified {@link ServiceInstance}\r\n+     *\r\n+     * @param serviceInstance {@link ServiceInstance}\r\n+     * @return TODO, usually, we generate one metadata url from one instance. There's no scenario to return a metadata url list.\r\n+     */\r\n+    List<URL> build(ServiceInstance serviceInstance);\r\n+}\r\n"}, {"source1": "org/apache/dubbo/registry/client/metadata/MetadataServiceURLParamsMetadataCustomizer.java", "source2": "org/apache/dubbo/registry/client/metadata/MetadataServiceURLParamsMetadataCustomizer.java", "comments": ["Line-ending differences only"], "unified_diff": "@@ -1,65 +1,65 @@\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.client.metadata;\n-\n-import org.apache.dubbo.metadata.MetadataService;\n-import org.apache.dubbo.metadata.WritableMetadataService;\n-import org.apache.dubbo.registry.client.ServiceInstance;\n-import org.apache.dubbo.registry.client.ServiceInstanceCustomizer;\n-\n-import java.util.Map;\n-import java.util.SortedSet;\n-\n-import static org.apache.dubbo.common.utils.StringUtils.isBlank;\n-import static org.apache.dubbo.metadata.MetadataService.toURLs;\n-import static org.apache.dubbo.metadata.WritableMetadataService.getDefaultExtension;\n-import static org.apache.dubbo.registry.client.metadata.ServiceInstanceMetadataUtils.METADATA_SERVICE_URL_PARAMS_PROPERTY_NAME;\n-import static org.apache.dubbo.registry.client.metadata.ServiceInstanceMetadataUtils.getMetadataServiceParameter;\n-\n-public class MetadataServiceURLParamsMetadataCustomizer implements ServiceInstanceCustomizer {\n-\n-    @Override\n-    public void customize(ServiceInstance serviceInstance) {\n-\n-        Map<String, String> metadata = serviceInstance.getMetadata();\n-\n-        String propertyName = resolveMetadataPropertyName(serviceInstance);\n-        String propertyValue = resolveMetadataPropertyValue(serviceInstance);\n-\n-        if (!isBlank(propertyName) && !isBlank(propertyValue)) {\n-            metadata.put(propertyName, propertyValue);\n-        }\n-    }\n-\n-    private String resolveMetadataPropertyName(ServiceInstance serviceInstance) {\n-        return METADATA_SERVICE_URL_PARAMS_PROPERTY_NAME;\n-    }\n-\n-    private String resolveMetadataPropertyValue(ServiceInstance serviceInstance) {\n-        WritableMetadataService writableMetadataService = getDefaultExtension();\n-\n-        String serviceInterface = MetadataService.class.getName();\n-\n-        String group = serviceInstance.getServiceName();\n-\n-        String version = MetadataService.VERSION;\n-\n-        SortedSet<String> urls = writableMetadataService.getExportedURLs(serviceInterface, group, version);\n-\n-        return getMetadataServiceParameter(toURLs(urls));\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.client.metadata;\r\n+\r\n+import org.apache.dubbo.metadata.MetadataService;\r\n+import org.apache.dubbo.metadata.WritableMetadataService;\r\n+import org.apache.dubbo.registry.client.ServiceInstance;\r\n+import org.apache.dubbo.registry.client.ServiceInstanceCustomizer;\r\n+\r\n+import java.util.Map;\r\n+import java.util.SortedSet;\r\n+\r\n+import static org.apache.dubbo.common.utils.StringUtils.isBlank;\r\n+import static org.apache.dubbo.metadata.MetadataService.toURLs;\r\n+import static org.apache.dubbo.metadata.WritableMetadataService.getDefaultExtension;\r\n+import static org.apache.dubbo.registry.client.metadata.ServiceInstanceMetadataUtils.METADATA_SERVICE_URL_PARAMS_PROPERTY_NAME;\r\n+import static org.apache.dubbo.registry.client.metadata.ServiceInstanceMetadataUtils.getMetadataServiceParameter;\r\n+\r\n+public class MetadataServiceURLParamsMetadataCustomizer implements ServiceInstanceCustomizer {\r\n+\r\n+    @Override\r\n+    public void customize(ServiceInstance serviceInstance) {\r\n+\r\n+        Map<String, String> metadata = serviceInstance.getMetadata();\r\n+\r\n+        String propertyName = resolveMetadataPropertyName(serviceInstance);\r\n+        String propertyValue = resolveMetadataPropertyValue(serviceInstance);\r\n+\r\n+        if (!isBlank(propertyName) && !isBlank(propertyValue)) {\r\n+            metadata.put(propertyName, propertyValue);\r\n+        }\r\n+    }\r\n+\r\n+    private String resolveMetadataPropertyName(ServiceInstance serviceInstance) {\r\n+        return METADATA_SERVICE_URL_PARAMS_PROPERTY_NAME;\r\n+    }\r\n+\r\n+    private String resolveMetadataPropertyValue(ServiceInstance serviceInstance) {\r\n+        WritableMetadataService writableMetadataService = getDefaultExtension();\r\n+\r\n+        String serviceInterface = MetadataService.class.getName();\r\n+\r\n+        String group = serviceInstance.getServiceName();\r\n+\r\n+        String version = MetadataService.VERSION;\r\n+\r\n+        SortedSet<String> urls = writableMetadataService.getExportedURLs(serviceInterface, group, version);\r\n+\r\n+        return getMetadataServiceParameter(toURLs(urls));\r\n+    }\r\n+}\r\n"}, {"source1": "org/apache/dubbo/registry/client/metadata/MetadataUtils.java", "source2": "org/apache/dubbo/registry/client/metadata/MetadataUtils.java", "comments": ["Line-ending differences only"], "unified_diff": "@@ -1,102 +1,102 @@\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.client.metadata;\n-\n-import org.apache.dubbo.common.URL;\n-import org.apache.dubbo.common.extension.ExtensionLoader;\n-import org.apache.dubbo.common.utils.CollectionUtils;\n-import org.apache.dubbo.common.utils.StringUtils;\n-import org.apache.dubbo.metadata.MetadataService;\n-import org.apache.dubbo.metadata.WritableMetadataService;\n-import org.apache.dubbo.registry.client.ServiceDiscovery;\n-import org.apache.dubbo.registry.client.ServiceInstance;\n-import org.apache.dubbo.registry.client.metadata.store.RemoteMetadataServiceImpl;\n-import org.apache.dubbo.rpc.Invoker;\n-import org.apache.dubbo.rpc.Protocol;\n-import org.apache.dubbo.rpc.ProxyFactory;\n-\n-import java.util.List;\n-import java.util.Map;\n-import java.util.concurrent.ConcurrentHashMap;\n-import java.util.concurrent.ConcurrentMap;\n-\n-import static org.apache.dubbo.registry.client.metadata.ServiceInstanceMetadataUtils.METADATA_SERVICE_URLS_PROPERTY_NAME;\n-\n-public class MetadataUtils {\n-\n-    private static final Object REMOTE_LOCK = new Object();\n-\n-    public static ConcurrentMap<String, MetadataService> metadataServiceProxies = new ConcurrentHashMap<>();\n-\n-    private static final ProxyFactory proxyFactory = ExtensionLoader.getExtensionLoader(ProxyFactory.class).getAdaptiveExtension();\n-\n-    private static final Protocol protocol = ExtensionLoader.getExtensionLoader(Protocol.class).getAdaptiveExtension();\n-\n-    public static RemoteMetadataServiceImpl remoteMetadataService;\n-\n-    public static WritableMetadataService localMetadataService;\n-\n-    public static RemoteMetadataServiceImpl getRemoteMetadataService() {\n-        if (remoteMetadataService == null) {\n-            synchronized (REMOTE_LOCK) {\n-                if (remoteMetadataService == null) {\n-                    remoteMetadataService = new RemoteMetadataServiceImpl(WritableMetadataService.getDefaultExtension());\n-                }\n-            }\n-        }\n-        return remoteMetadataService;\n-    }\n-\n-    public static void publishServiceDefinition(URL url) {\n-        // store in local\n-        WritableMetadataService.getDefaultExtension().publishServiceDefinition(url);\n-        // send to remote\n-//        if (REMOTE_METADATA_STORAGE_TYPE.equals(url.getParameter(METADATA_KEY))) {\n-        getRemoteMetadataService().publishServiceDefinition(url);\n-//        }\n-    }\n-\n-    public static MetadataService getMetadataServiceProxy(ServiceInstance instance, ServiceDiscovery serviceDiscovery) {\n-        String key = instance.getServiceName() + \"##\" +\n-                ServiceInstanceMetadataUtils.getExportedServicesRevision(instance);\n-        return metadataServiceProxies.computeIfAbsent(key, k -> {\n-            MetadataServiceURLBuilder builder = null;\n-            ExtensionLoader<MetadataServiceURLBuilder> loader\n-                    = ExtensionLoader.getExtensionLoader(MetadataServiceURLBuilder.class);\n-\n-            Map<String, String> metadata = instance.getMetadata();\n-            // METADATA_SERVICE_URLS_PROPERTY_NAME is a unique key exists only on instances of spring-cloud-alibaba.\n-            String dubboURLsJSON = metadata.get(METADATA_SERVICE_URLS_PROPERTY_NAME);\n-            if (StringUtils.isNotEmpty(dubboURLsJSON)) {\n-                builder = loader.getExtension(SpringCloudMetadataServiceURLBuilder.NAME);\n-            } else {\n-                builder = loader.getExtension(StandardMetadataServiceURLBuilder.NAME);\n-            }\n-\n-            List<URL> urls = builder.build(instance);\n-            if (CollectionUtils.isEmpty(urls)) {\n-                throw new IllegalStateException(\"You have enabled introspection service discovery mode for instance \"\n-                        + instance + \", but no metadata service can build from it.\");\n-            }\n-\n-            // Simply rely on the first metadata url, as stated in MetadataServiceURLBuilder.\n-            Invoker<MetadataService> invoker = protocol.refer(MetadataService.class, urls.get(0));\n-\n-            return proxyFactory.getProxy(invoker);\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.client.metadata;\r\n+\r\n+import org.apache.dubbo.common.URL;\r\n+import org.apache.dubbo.common.extension.ExtensionLoader;\r\n+import org.apache.dubbo.common.utils.CollectionUtils;\r\n+import org.apache.dubbo.common.utils.StringUtils;\r\n+import org.apache.dubbo.metadata.MetadataService;\r\n+import org.apache.dubbo.metadata.WritableMetadataService;\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.metadata.store.RemoteMetadataServiceImpl;\r\n+import org.apache.dubbo.rpc.Invoker;\r\n+import org.apache.dubbo.rpc.Protocol;\r\n+import org.apache.dubbo.rpc.ProxyFactory;\r\n+\r\n+import java.util.List;\r\n+import java.util.Map;\r\n+import java.util.concurrent.ConcurrentHashMap;\r\n+import java.util.concurrent.ConcurrentMap;\r\n+\r\n+import static org.apache.dubbo.registry.client.metadata.ServiceInstanceMetadataUtils.METADATA_SERVICE_URLS_PROPERTY_NAME;\r\n+\r\n+public class MetadataUtils {\r\n+\r\n+    private static final Object REMOTE_LOCK = new Object();\r\n+\r\n+    public static ConcurrentMap<String, MetadataService> metadataServiceProxies = new ConcurrentHashMap<>();\r\n+\r\n+    private static final ProxyFactory proxyFactory = ExtensionLoader.getExtensionLoader(ProxyFactory.class).getAdaptiveExtension();\r\n+\r\n+    private static final Protocol protocol = ExtensionLoader.getExtensionLoader(Protocol.class).getAdaptiveExtension();\r\n+\r\n+    public static RemoteMetadataServiceImpl remoteMetadataService;\r\n+\r\n+    public static WritableMetadataService localMetadataService;\r\n+\r\n+    public static RemoteMetadataServiceImpl getRemoteMetadataService() {\r\n+        if (remoteMetadataService == null) {\r\n+            synchronized (REMOTE_LOCK) {\r\n+                if (remoteMetadataService == null) {\r\n+                    remoteMetadataService = new RemoteMetadataServiceImpl(WritableMetadataService.getDefaultExtension());\r\n+                }\r\n+            }\r\n+        }\r\n+        return remoteMetadataService;\r\n+    }\r\n+\r\n+    public static void publishServiceDefinition(URL url) {\r\n+        // store in local\r\n+        WritableMetadataService.getDefaultExtension().publishServiceDefinition(url);\r\n+        // send to remote\r\n+//        if (REMOTE_METADATA_STORAGE_TYPE.equals(url.getParameter(METADATA_KEY))) {\r\n+        getRemoteMetadataService().publishServiceDefinition(url);\r\n+//        }\r\n+    }\r\n+\r\n+    public static MetadataService getMetadataServiceProxy(ServiceInstance instance, ServiceDiscovery serviceDiscovery) {\r\n+        String key = instance.getServiceName() + \"##\" +\r\n+                ServiceInstanceMetadataUtils.getExportedServicesRevision(instance);\r\n+        return metadataServiceProxies.computeIfAbsent(key, k -> {\r\n+            MetadataServiceURLBuilder builder = null;\r\n+            ExtensionLoader<MetadataServiceURLBuilder> loader\r\n+                    = ExtensionLoader.getExtensionLoader(MetadataServiceURLBuilder.class);\r\n+\r\n+            Map<String, String> metadata = instance.getMetadata();\r\n+            // METADATA_SERVICE_URLS_PROPERTY_NAME is a unique key exists only on instances of spring-cloud-alibaba.\r\n+            String dubboURLsJSON = metadata.get(METADATA_SERVICE_URLS_PROPERTY_NAME);\r\n+            if (StringUtils.isNotEmpty(dubboURLsJSON)) {\r\n+                builder = loader.getExtension(SpringCloudMetadataServiceURLBuilder.NAME);\r\n+            } else {\r\n+                builder = loader.getExtension(StandardMetadataServiceURLBuilder.NAME);\r\n+            }\r\n+\r\n+            List<URL> urls = builder.build(instance);\r\n+            if (CollectionUtils.isEmpty(urls)) {\r\n+                throw new IllegalStateException(\"You have enabled introspection service discovery mode for instance \"\r\n+                        + instance + \", but no metadata service can build from it.\");\r\n+            }\r\n+\r\n+            // Simply rely on the first metadata url, as stated in MetadataServiceURLBuilder.\r\n+            Invoker<MetadataService> invoker = protocol.refer(MetadataService.class, urls.get(0));\r\n+\r\n+            return proxyFactory.getProxy(invoker);\r\n+        });\r\n+    }\r\n+}\r\n"}, {"source1": "org/apache/dubbo/registry/client/metadata/ProtocolPortsMetadataCustomizer.java", "source2": "org/apache/dubbo/registry/client/metadata/ProtocolPortsMetadataCustomizer.java", "comments": ["Line-ending differences only"], "unified_diff": "@@ -1,55 +1,55 @@\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.client.metadata;\n-\n-import org.apache.dubbo.common.URL;\n-import org.apache.dubbo.metadata.MetadataService;\n-import org.apache.dubbo.metadata.WritableMetadataService;\n-import org.apache.dubbo.registry.client.ServiceInstance;\n-import org.apache.dubbo.registry.client.ServiceInstanceCustomizer;\n-import org.apache.dubbo.rpc.Protocol;\n-\n-import java.util.HashMap;\n-import java.util.Map;\n-\n-import static org.apache.dubbo.registry.client.metadata.ServiceInstanceMetadataUtils.setEndpoints;\n-\n-/**\n- * A Class to customize the ports of {@link Protocol protocols} into\n- * {@link ServiceInstance#getMetadata() the metadata of service instance}\n- *\n- * @since 2.7.5\n- */\n-public class ProtocolPortsMetadataCustomizer implements ServiceInstanceCustomizer {\n-\n-    @Override\n-    public void customize(ServiceInstance serviceInstance) {\n-        WritableMetadataService writableMetadataService = WritableMetadataService.getDefaultExtension();\n-\n-        Map<String, Integer> protocols = new HashMap<>();\n-        writableMetadataService.getExportedURLs()\n-                .stream()\n-                .map(URL::valueOf)\n-                .filter(url -> !MetadataService.class.getName().equals(url.getServiceInterface()))\n-                .forEach(url -> {\n-                    // TODO, same protocol listen on different ports will override with each other.\n-                    protocols.put(url.getProtocol(), url.getPort());\n-                });\n-\n-        setEndpoints(serviceInstance, protocols);\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.client.metadata;\r\n+\r\n+import org.apache.dubbo.common.URL;\r\n+import org.apache.dubbo.metadata.MetadataService;\r\n+import org.apache.dubbo.metadata.WritableMetadataService;\r\n+import org.apache.dubbo.registry.client.ServiceInstance;\r\n+import org.apache.dubbo.registry.client.ServiceInstanceCustomizer;\r\n+import org.apache.dubbo.rpc.Protocol;\r\n+\r\n+import java.util.HashMap;\r\n+import java.util.Map;\r\n+\r\n+import static org.apache.dubbo.registry.client.metadata.ServiceInstanceMetadataUtils.setEndpoints;\r\n+\r\n+/**\r\n+ * A Class to customize the ports of {@link Protocol protocols} into\r\n+ * {@link ServiceInstance#getMetadata() the metadata of service instance}\r\n+ *\r\n+ * @since 2.7.5\r\n+ */\r\n+public class ProtocolPortsMetadataCustomizer implements ServiceInstanceCustomizer {\r\n+\r\n+    @Override\r\n+    public void customize(ServiceInstance serviceInstance) {\r\n+        WritableMetadataService writableMetadataService = WritableMetadataService.getDefaultExtension();\r\n+\r\n+        Map<String, Integer> protocols = new HashMap<>();\r\n+        writableMetadataService.getExportedURLs()\r\n+                .stream()\r\n+                .map(URL::valueOf)\r\n+                .filter(url -> !MetadataService.class.getName().equals(url.getServiceInterface()))\r\n+                .forEach(url -> {\r\n+                    // TODO, same protocol listen on different ports will override with each other.\r\n+                    protocols.put(url.getProtocol(), url.getPort());\r\n+                });\r\n+\r\n+        setEndpoints(serviceInstance, protocols);\r\n+    }\r\n+}\r\n"}, {"source1": "org/apache/dubbo/registry/client/metadata/RestProtocolSubscribedURLsSynthesizer.java", "source2": "org/apache/dubbo/registry/client/metadata/RestProtocolSubscribedURLsSynthesizer.java", "comments": ["Line-ending 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.client.metadata;\n-\n-import org.apache.dubbo.common.URL;\n-import org.apache.dubbo.common.URLBuilder;\n-import org.apache.dubbo.registry.client.ServiceInstance;\n-import org.apache.dubbo.rpc.Protocol;\n-\n-import java.util.Collection;\n-import java.util.List;\n-import java.util.stream.Collectors;\n-\n-import static java.lang.Boolean.TRUE;\n-import static org.apache.dubbo.common.constants.CommonConstants.APPLICATION_KEY;\n-import static org.apache.dubbo.common.constants.CommonConstants.PROTOCOL_KEY;\n-import static org.apache.dubbo.common.constants.CommonConstants.PROVIDER;\n-import static org.apache.dubbo.common.constants.CommonConstants.SIDE_KEY;\n-import static org.apache.dubbo.registry.Constants.REGISTER_KEY;\n-\n-/**\n- * {@link SubscribedURLsSynthesizer} implementation for REST {@link Protocol protocol}\n- *\n- * @since 2.7.5\n- */\n-public class RestProtocolSubscribedURLsSynthesizer implements SubscribedURLsSynthesizer {\n-\n-    @Override\n-    public boolean supports(URL subscribedURL) {\n-        return \"rest\".equals(subscribedURL.getProtocol()) ||\n-                \"rest\".equals(subscribedURL.getParameter(PROTOCOL_KEY));\n-    }\n-\n-    @Override\n-    public List<URL> synthesize(URL subscribedURL, Collection<ServiceInstance> serviceInstances) {\n-\n-        String protocol = subscribedURL.getParameter(PROTOCOL_KEY);\n-\n-        return serviceInstances.stream().map(serviceInstance -> {\n-            URLBuilder urlBuilder = new URLBuilder()\n-                    .setProtocol(protocol)\n-                    .setHost(serviceInstance.getHost())\n-                    .setPort(serviceInstance.getPort())\n-                    .setPath(subscribedURL.getServiceInterface())\n-                    .addParameter(SIDE_KEY, PROVIDER)\n-                    .addParameter(APPLICATION_KEY, serviceInstance.getServiceName())\n-                    .addParameter(REGISTER_KEY, TRUE.toString());\n-\n-            return urlBuilder.build();\n-        }).collect(Collectors.toList());\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.client.metadata;\r\n+\r\n+import org.apache.dubbo.common.URL;\r\n+import org.apache.dubbo.common.URLBuilder;\r\n+import org.apache.dubbo.registry.client.ServiceInstance;\r\n+import org.apache.dubbo.rpc.Protocol;\r\n+\r\n+import java.util.Collection;\r\n+import java.util.List;\r\n+import java.util.stream.Collectors;\r\n+\r\n+import static java.lang.Boolean.TRUE;\r\n+import static org.apache.dubbo.common.constants.CommonConstants.APPLICATION_KEY;\r\n+import static org.apache.dubbo.common.constants.CommonConstants.PROTOCOL_KEY;\r\n+import static org.apache.dubbo.common.constants.CommonConstants.PROVIDER;\r\n+import static org.apache.dubbo.common.constants.CommonConstants.SIDE_KEY;\r\n+import static org.apache.dubbo.registry.Constants.REGISTER_KEY;\r\n+\r\n+/**\r\n+ * {@link SubscribedURLsSynthesizer} implementation for REST {@link Protocol protocol}\r\n+ *\r\n+ * @since 2.7.5\r\n+ */\r\n+public class RestProtocolSubscribedURLsSynthesizer implements SubscribedURLsSynthesizer {\r\n+\r\n+    @Override\r\n+    public boolean supports(URL subscribedURL) {\r\n+        return \"rest\".equals(subscribedURL.getProtocol()) ||\r\n+                \"rest\".equals(subscribedURL.getParameter(PROTOCOL_KEY));\r\n+    }\r\n+\r\n+    @Override\r\n+    public List<URL> synthesize(URL subscribedURL, Collection<ServiceInstance> serviceInstances) {\r\n+\r\n+        String protocol = subscribedURL.getParameter(PROTOCOL_KEY);\r\n+\r\n+        return serviceInstances.stream().map(serviceInstance -> {\r\n+            URLBuilder urlBuilder = new URLBuilder()\r\n+                    .setProtocol(protocol)\r\n+                    .setHost(serviceInstance.getHost())\r\n+                    .setPort(serviceInstance.getPort())\r\n+                    .setPath(subscribedURL.getServiceInterface())\r\n+                    .addParameter(SIDE_KEY, PROVIDER)\r\n+                    .addParameter(APPLICATION_KEY, serviceInstance.getServiceName())\r\n+                    .addParameter(REGISTER_KEY, TRUE.toString());\r\n+\r\n+            return urlBuilder.build();\r\n+        }).collect(Collectors.toList());\r\n+    }\r\n+\r\n+}\r\n"}, {"source1": "org/apache/dubbo/registry/client/metadata/ServiceInstanceMetadataCustomizer.java", "source2": "org/apache/dubbo/registry/client/metadata/ServiceInstanceMetadataCustomizer.java", "comments": ["Line-ending differences only"], "unified_diff": "@@ -1,88 +1,88 @@\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.client.metadata;\n-\n-import org.apache.dubbo.common.extension.ExtensionLoader;\n-import org.apache.dubbo.common.infra.InfraAdapter;\n-import org.apache.dubbo.common.utils.CollectionUtils;\n-import org.apache.dubbo.metadata.MetadataInfo;\n-import org.apache.dubbo.metadata.MetadataParamsFilter;\n-import org.apache.dubbo.metadata.WritableMetadataService;\n-import org.apache.dubbo.registry.client.ServiceInstance;\n-import org.apache.dubbo.registry.client.ServiceInstanceCustomizer;\n-import org.apache.dubbo.registry.client.metadata.store.InMemoryWritableMetadataService;\n-import org.apache.dubbo.rpc.model.ApplicationModel;\n-\n-import java.util.HashMap;\n-import java.util.Map;\n-import java.util.Set;\n-\n-import static org.apache.dubbo.common.constants.CommonConstants.APPLICATION_KEY;\n-\n-/**\n- *\n- */\n-public class ServiceInstanceMetadataCustomizer implements ServiceInstanceCustomizer {\n-\n-    @Override\n-    public void customize(ServiceInstance serviceInstance) {\n-        Map<String, String> params = new HashMap<>();\n-\n-        ExtensionLoader<MetadataParamsFilter> loader = ExtensionLoader.getExtensionLoader(MetadataParamsFilter.class);\n-        Set<MetadataParamsFilter> paramsFilters = loader.getSupportedExtensionInstances();\n-\n-        InMemoryWritableMetadataService localMetadataService\n-                = (InMemoryWritableMetadataService) WritableMetadataService.getDefaultExtension();\n-        // pick the first interface metadata available.\n-        // FIXME, check the same key in different urls has the same value\n-        MetadataInfo metadataInfo = localMetadataService.getMetadataInfos().values().iterator().next();\n-        MetadataInfo.ServiceInfo serviceInfo = metadataInfo.getServices().values().iterator().next();\n-        Map<String, String> allParams = new HashMap<>(serviceInfo.getUrl().getParameters());\n-\n-        // load instance params users want to load.\n-        // TODO, duplicate logic with that in ApplicationConfig\n-        Set<InfraAdapter> adapters = ExtensionLoader.getExtensionLoader(InfraAdapter.class).getSupportedExtensionInstances();\n-        if (CollectionUtils.isNotEmpty(adapters)) {\n-            Map<String, String> inputParameters = new HashMap<>();\n-            inputParameters.put(APPLICATION_KEY, ApplicationModel.getName());\n-            for (InfraAdapter adapter : adapters) {\n-                Map<String, String> extraParameters = adapter.getExtraAttributes(inputParameters);\n-                if (CollectionUtils.isNotEmptyMap(extraParameters)) {\n-                    extraParameters.forEach(allParams::putIfAbsent);\n-                }\n-            }\n-        }\n-\n-        if (CollectionUtils.isEmpty(paramsFilters)) {\n-            serviceInstance.getMetadata().putAll(allParams);\n-            return;\n-        }\n-\n-        paramsFilters.forEach(filter -> {\n-            String[] included = filter.instanceParamsIncluded();\n-            if (included == null) {\n-                serviceInstance.getMetadata().putAll(allParams);\n-            } else {\n-                for (String p : included) {\n-                    if (allParams.get(p) != null) {\n-                        serviceInstance.getMetadata().put(p, allParams.get(p));\n-                    }\n-                }\n-            }\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.client.metadata;\r\n+\r\n+import org.apache.dubbo.common.extension.ExtensionLoader;\r\n+import org.apache.dubbo.common.infra.InfraAdapter;\r\n+import org.apache.dubbo.common.utils.CollectionUtils;\r\n+import org.apache.dubbo.metadata.MetadataInfo;\r\n+import org.apache.dubbo.metadata.MetadataParamsFilter;\r\n+import org.apache.dubbo.metadata.WritableMetadataService;\r\n+import org.apache.dubbo.registry.client.ServiceInstance;\r\n+import org.apache.dubbo.registry.client.ServiceInstanceCustomizer;\r\n+import org.apache.dubbo.registry.client.metadata.store.InMemoryWritableMetadataService;\r\n+import org.apache.dubbo.rpc.model.ApplicationModel;\r\n+\r\n+import java.util.HashMap;\r\n+import java.util.Map;\r\n+import java.util.Set;\r\n+\r\n+import static org.apache.dubbo.common.constants.CommonConstants.APPLICATION_KEY;\r\n+\r\n+/**\r\n+ *\r\n+ */\r\n+public class ServiceInstanceMetadataCustomizer implements ServiceInstanceCustomizer {\r\n+\r\n+    @Override\r\n+    public void customize(ServiceInstance serviceInstance) {\r\n+        Map<String, String> params = new HashMap<>();\r\n+\r\n+        ExtensionLoader<MetadataParamsFilter> loader = ExtensionLoader.getExtensionLoader(MetadataParamsFilter.class);\r\n+        Set<MetadataParamsFilter> paramsFilters = loader.getSupportedExtensionInstances();\r\n+\r\n+        InMemoryWritableMetadataService localMetadataService\r\n+                = (InMemoryWritableMetadataService) WritableMetadataService.getDefaultExtension();\r\n+        // pick the first interface metadata available.\r\n+        // FIXME, check the same key in different urls has the same value\r\n+        MetadataInfo metadataInfo = localMetadataService.getMetadataInfos().values().iterator().next();\r\n+        MetadataInfo.ServiceInfo serviceInfo = metadataInfo.getServices().values().iterator().next();\r\n+        Map<String, String> allParams = new HashMap<>(serviceInfo.getUrl().getParameters());\r\n+\r\n+        // load instance params users want to load.\r\n+        // TODO, duplicate logic with that in ApplicationConfig\r\n+        Set<InfraAdapter> adapters = ExtensionLoader.getExtensionLoader(InfraAdapter.class).getSupportedExtensionInstances();\r\n+        if (CollectionUtils.isNotEmpty(adapters)) {\r\n+            Map<String, String> inputParameters = new HashMap<>();\r\n+            inputParameters.put(APPLICATION_KEY, ApplicationModel.getName());\r\n+            for (InfraAdapter adapter : adapters) {\r\n+                Map<String, String> extraParameters = adapter.getExtraAttributes(inputParameters);\r\n+                if (CollectionUtils.isNotEmptyMap(extraParameters)) {\r\n+                    extraParameters.forEach(allParams::putIfAbsent);\r\n+                }\r\n+            }\r\n+        }\r\n+\r\n+        if (CollectionUtils.isEmpty(paramsFilters)) {\r\n+            serviceInstance.getMetadata().putAll(allParams);\r\n+            return;\r\n+        }\r\n+\r\n+        paramsFilters.forEach(filter -> {\r\n+            String[] included = filter.instanceParamsIncluded();\r\n+            if (included == null) {\r\n+                serviceInstance.getMetadata().putAll(allParams);\r\n+            } else {\r\n+                for (String p : included) {\r\n+                    if (allParams.get(p) != null) {\r\n+                        serviceInstance.getMetadata().put(p, allParams.get(p));\r\n+                    }\r\n+                }\r\n+            }\r\n+        });\r\n+    }\r\n+}\r\n"}, {"source1": "org/apache/dubbo/registry/client/metadata/ServiceInstanceMetadataUtils.java", "source2": "org/apache/dubbo/registry/client/metadata/ServiceInstanceMetadataUtils.java", "comments": ["Line-ending differences only"], "unified_diff": "@@ -1,318 +1,318 @@\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.client.metadata;\n-\n-import org.apache.dubbo.common.URL;\n-import org.apache.dubbo.common.utils.StringUtils;\n-import org.apache.dubbo.metadata.MetadataInfo;\n-import org.apache.dubbo.metadata.MetadataService;\n-import org.apache.dubbo.metadata.WritableMetadataService;\n-import org.apache.dubbo.registry.client.ServiceDiscovery;\n-import org.apache.dubbo.registry.client.ServiceInstance;\n-import org.apache.dubbo.registry.client.metadata.store.RemoteMetadataServiceImpl;\n-import org.apache.dubbo.registry.support.AbstractRegistryFactory;\n-import org.apache.dubbo.rpc.model.ApplicationModel;\n-\n-import com.alibaba.fastjson.JSON;\n-\n-import java.util.ArrayList;\n-import java.util.HashMap;\n-import java.util.LinkedHashMap;\n-import java.util.List;\n-import java.util.Map;\n-\n-import static java.util.Collections.emptyMap;\n-import static org.apache.dubbo.common.constants.CommonConstants.APPLICATION_KEY;\n-import static org.apache.dubbo.common.constants.CommonConstants.DEFAULT_METADATA_STORAGE_TYPE;\n-import static org.apache.dubbo.common.constants.CommonConstants.GROUP_KEY;\n-import static org.apache.dubbo.common.constants.CommonConstants.PORT_KEY;\n-import static org.apache.dubbo.common.constants.CommonConstants.TIMESTAMP_KEY;\n-import static org.apache.dubbo.common.utils.StringUtils.isBlank;\n-import static org.apache.dubbo.registry.integration.InterfaceCompatibleRegistryProtocol.DEFAULT_REGISTER_PROVIDER_KEYS;\n-import static org.apache.dubbo.rpc.Constants.DEPRECATED_KEY;\n-import static org.apache.dubbo.rpc.Constants.ID_KEY;\n-\n-/**\n- * The Utilities class for the {@link ServiceInstance#getMetadata() metadata of the service instance}\n- *\n- * @see StandardMetadataServiceURLBuilder\n- * @see ServiceInstance#getMetadata()\n- * @see MetadataService\n- * @see URL\n- * @since 2.7.5\n- */\n-public class ServiceInstanceMetadataUtils {\n-\n-    /**\n-     * The prefix of {@link MetadataService} : \"dubbo.metadata-service.\"\n-     */\n-    public static final String METADATA_SERVICE_PREFIX = \"dubbo.metadata-service.\";\n-\n-    public static final String ENDPOINTS = \"dubbo.endpoints\";\n-\n-    /**\n-     * The property name of metadata JSON of {@link MetadataService}'s {@link URL}\n-     */\n-    public static String METADATA_SERVICE_URL_PARAMS_PROPERTY_NAME = METADATA_SERVICE_PREFIX + \"url-params\";\n-\n-    /**\n-     * The {@link URL URLs} property name of {@link MetadataService} :\n-     * \"dubbo.metadata-service.urls\", which is used to be compatible with Dubbo Spring Cloud and\n-     * discovery the metadata of instance\n-     */\n-    public static final String METADATA_SERVICE_URLS_PROPERTY_NAME = METADATA_SERVICE_PREFIX + \"urls\";\n-\n-    /**\n-     * The property name of The revision for all exported Dubbo services.\n-     */\n-    public static String EXPORTED_SERVICES_REVISION_PROPERTY_NAME = \"dubbo.metadata.revision\";\n-\n-    /**\n-     * The property name of metadata storage type.\n-     */\n-    public static String METADATA_STORAGE_TYPE_PROPERTY_NAME = \"dubbo.metadata.storage-type\";\n-\n-    public static String METADATA_CLUSTER_PROPERTY_NAME = \"dubbo.metadata.cluster\";\n-\n-    public static String INSTANCE_REVISION_UPDATED_KEY = \"dubbo.instance.revision.updated\";\n-\n-    /**\n-     * Get the multiple {@link URL urls'} parameters of {@link MetadataService MetadataService's} Metadata\n-     *\n-     * @param serviceInstance the instance of {@link ServiceInstance}\n-     * @return non-null {@link Map}, the key is {@link URL#getProtocol() the protocol of URL}, the value is\n-     * {@link #getMetadataServiceURLParams(ServiceInstance, String)}\n-     */\n-    public static Map<String, Map<String, String>> getMetadataServiceURLsParams(ServiceInstance serviceInstance) {\n-        Map<String, String> metadata = serviceInstance.getMetadata();\n-        String param = metadata.get(METADATA_SERVICE_URL_PARAMS_PROPERTY_NAME);\n-        return isBlank(param) ? emptyMap() : (Map) JSON.parse(param);\n-    }\n-\n-    /**\n-     * Get the {@link URL url's} parameters of {@link MetadataService MetadataService's} Metadata\n-     *\n-     * @param serviceInstance the instance of {@link ServiceInstance}\n-     * @return non-null {@link Map}\n-     */\n-    public static Map<String, String> getMetadataServiceURLParams(ServiceInstance serviceInstance, String protocol) {\n-        Map<String, Map<String, String>> params = getMetadataServiceURLsParams(serviceInstance);\n-        return params.getOrDefault(protocol, emptyMap());\n-    }\n-\n-    public static String getMetadataServiceParameter(List<URL> urls) {\n-\n-        Map<String, Map<String, String>> params = new HashMap<>();\n-\n-        urls.stream()\n-                // remove APPLICATION_KEY because service name must be present\n-                .map(url -> url.removeParameter(APPLICATION_KEY))\n-                // remove GROUP_KEY, always uses application name.\n-                .map(url -> url.removeParameter(GROUP_KEY))\n-                // remove DEPRECATED_KEY because it's always false\n-                .map(url -> url.removeParameter(DEPRECATED_KEY))\n-                // remove TIMESTAMP_KEY because it's nonsense\n-                .map(url -> url.removeParameter(TIMESTAMP_KEY))\n-                .forEach(url -> {\n-                    String protocol = url.getProtocol();\n-                    params.put(protocol, getParams(url));\n-                });\n-\n-        if (params.isEmpty()) {\n-            return null;\n-        }\n-\n-        return JSON.toJSONString(params);\n-    }\n-\n-    private static Map<String, String> getParams(URL providerURL) {\n-        Map<String, String> params = new LinkedHashMap<>();\n-        setDefaultParams(params, providerURL);\n-        params.put(PORT_KEY, String.valueOf(providerURL.getPort()));\n-        return params;\n-    }\n-\n-    /**\n-     * The revision for all exported Dubbo services from the specified {@link ServiceInstance}.\n-     *\n-     * @param serviceInstance the specified {@link ServiceInstance}\n-     * @return <code>null</code> if not exits\n-     */\n-    public static String getExportedServicesRevision(ServiceInstance serviceInstance) {\n-        Map<String, String> metadata = serviceInstance.getMetadata();\n-        return metadata.get(EXPORTED_SERVICES_REVISION_PROPERTY_NAME);\n-    }\n-\n-    /**\n-     * Get metadata's storage type\n-     *\n-     * @param registryURL the {@link URL} to connect the registry\n-     * @return if not found in {@link URL#getParameters() parameters} of {@link URL registry URL}, return\n-     */\n-    public static String getMetadataStorageType(URL registryURL) {\n-        return registryURL.getParameter(METADATA_STORAGE_TYPE_PROPERTY_NAME, DEFAULT_METADATA_STORAGE_TYPE);\n-    }\n-\n-    /**\n-     * Get the metadata's storage type is used to which {@link WritableMetadataService} instance.\n-     *\n-     * @param serviceInstance the specified {@link ServiceInstance}\n-     * @return if not found in {@link ServiceInstance#getMetadata() metadata} of {@link ServiceInstance}, return\n-     */\n-    public static String getMetadataStorageType(ServiceInstance serviceInstance) {\n-        Map<String, String> metadata = serviceInstance.getMetadata();\n-        return metadata.getOrDefault(METADATA_STORAGE_TYPE_PROPERTY_NAME, DEFAULT_METADATA_STORAGE_TYPE);\n-    }\n-\n-    /**\n-     * Set the metadata storage type in specified {@link ServiceInstance service instance}\n-     *\n-     * @param serviceInstance {@link ServiceInstance service instance}\n-     * @param metadataType    remote or local\n-     */\n-    public static void setMetadataStorageType(ServiceInstance serviceInstance, String metadataType) {\n-        Map<String, String> metadata = serviceInstance.getMetadata();\n-        metadata.put(METADATA_STORAGE_TYPE_PROPERTY_NAME, metadataType);\n-    }\n-\n-    public static String getRemoteCluster(ServiceInstance serviceInstance) {\n-        Map<String, String> metadata = serviceInstance.getMetadata();\n-        return metadata.get(METADATA_CLUSTER_PROPERTY_NAME);\n-    }\n-\n-    /**\n-     * Is Dubbo Service instance or not\n-     *\n-     * @param serviceInstance {@link ServiceInstance service instance}\n-     * @return if Dubbo Service instance, return <code>true</code>, or <code>false</code>\n-     */\n-    public static boolean isDubboServiceInstance(ServiceInstance serviceInstance) {\n-        Map<String, String> metadata = serviceInstance.getMetadata();\n-        return metadata.containsKey(METADATA_SERVICE_URL_PARAMS_PROPERTY_NAME)\n-                || metadata.containsKey(METADATA_SERVICE_URLS_PROPERTY_NAME);\n-    }\n-\n-    public static void setEndpoints(ServiceInstance serviceInstance, Map<String, Integer> protocolPorts) {\n-        Map<String, String> metadata = serviceInstance.getMetadata();\n-        List<Endpoint> endpoints = new ArrayList<>();\n-        protocolPorts.forEach((k, v) -> {\n-            Endpoint endpoint = new Endpoint(v, k);\n-            endpoints.add(endpoint);\n-        });\n-\n-        metadata.put(ENDPOINTS, JSON.toJSONString(endpoints));\n-    }\n-\n-    /**\n-     * Get the property value of port by the specified {@link ServiceInstance#getMetadata() the metadata of\n-     * service instance} and protocol\n-     *\n-     * @param serviceInstance {@link ServiceInstance service instance}\n-     * @param protocol        the name of protocol, e.g, dubbo, rest, and so on\n-     * @return if not found, return <code>null</code>\n-     */\n-    public static Integer getProtocolPort(ServiceInstance serviceInstance, String protocol) {\n-        Map<String, String> metadata = serviceInstance.getMetadata();\n-        String rawEndpoints = metadata.get(ENDPOINTS);\n-        if (StringUtils.isNotEmpty(rawEndpoints)) {\n-            List<Endpoint> endpoints = JSON.parseArray(rawEndpoints, Endpoint.class);\n-            for (Endpoint endpoint : endpoints) {\n-                if (endpoint.getProtocol().equals(protocol)) {\n-                    return endpoint.getPort();\n-                }\n-            }\n-        }\n-        return null;\n-    }\n-\n-    public static void calInstanceRevision(ServiceDiscovery serviceDiscovery, ServiceInstance instance) {\n-        String registryCluster = serviceDiscovery.getUrl().getParameter(ID_KEY);\n-        if (registryCluster == null) {\n-            return;\n-        }\n-        MetadataInfo metadataInfo = WritableMetadataService.getDefaultExtension().getMetadataInfos().get(registryCluster);\n-        if (metadataInfo != null) {\n-            String existingInstanceRevision = instance.getMetadata().get(EXPORTED_SERVICES_REVISION_PROPERTY_NAME);\n-            if (!metadataInfo.calAndGetRevision().equals(existingInstanceRevision)) {\n-                instance.getMetadata().put(EXPORTED_SERVICES_REVISION_PROPERTY_NAME, metadataInfo.calAndGetRevision());\n-                if (existingInstanceRevision != null) {// skip the first registration.\n-                    instance.getExtendParams().put(INSTANCE_REVISION_UPDATED_KEY, \"true\");\n-                }\n-            }\n-        }\n-    }\n-\n-    public static boolean isInstanceUpdated(ServiceInstance instance) {\n-        return \"true\".equals(instance.getExtendParams().get(INSTANCE_REVISION_UPDATED_KEY));\n-    }\n-\n-    public static void resetInstanceUpdateKey(ServiceInstance instance) {\n-        instance.getExtendParams().remove(INSTANCE_REVISION_UPDATED_KEY);\n-    }\n-\n-    public static void refreshMetadataAndInstance() {\n-        RemoteMetadataServiceImpl remoteMetadataService = MetadataUtils.getRemoteMetadataService();\n-        remoteMetadataService.publishMetadata(ApplicationModel.getName());\n-\n-        AbstractRegistryFactory.getServiceDiscoveries().forEach(serviceDiscovery -> {\n-            calInstanceRevision(serviceDiscovery, serviceDiscovery.getLocalInstance());\n-            // update service instance revision\n-            serviceDiscovery.update(serviceDiscovery.getLocalInstance());\n-        });\n-    }\n-\n-    /**\n-     * Set the default parameters via the specified {@link URL providerURL}\n-     *\n-     * @param params      the parameters\n-     * @param providerURL the provider's {@link URL}\n-     */\n-    private static void setDefaultParams(Map<String, String> params, URL providerURL) {\n-        for (String parameterName : DEFAULT_REGISTER_PROVIDER_KEYS) {\n-            String parameterValue = providerURL.getParameter(parameterName);\n-            if (!isBlank(parameterValue)) {\n-                params.put(parameterName, parameterValue);\n-            }\n-        }\n-    }\n-\n-    public static class Endpoint {\n-        Integer port;\n-        String protocol;\n-\n-        public Endpoint(Integer port, String protocol) {\n-            this.port = port;\n-            this.protocol = protocol;\n-        }\n-\n-        public Integer getPort() {\n-            return port;\n-        }\n-\n-        public void setPort(Integer port) {\n-            this.port = port;\n-        }\n-\n-        public String getProtocol() {\n-            return protocol;\n-        }\n-\n-        public void setProtocol(String protocol) {\n-            this.protocol = protocol;\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.client.metadata;\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.metadata.MetadataInfo;\r\n+import org.apache.dubbo.metadata.MetadataService;\r\n+import org.apache.dubbo.metadata.WritableMetadataService;\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.metadata.store.RemoteMetadataServiceImpl;\r\n+import org.apache.dubbo.registry.support.AbstractRegistryFactory;\r\n+import org.apache.dubbo.rpc.model.ApplicationModel;\r\n+\r\n+import com.alibaba.fastjson.JSON;\r\n+\r\n+import java.util.ArrayList;\r\n+import java.util.HashMap;\r\n+import java.util.LinkedHashMap;\r\n+import java.util.List;\r\n+import java.util.Map;\r\n+\r\n+import static java.util.Collections.emptyMap;\r\n+import static org.apache.dubbo.common.constants.CommonConstants.APPLICATION_KEY;\r\n+import static org.apache.dubbo.common.constants.CommonConstants.DEFAULT_METADATA_STORAGE_TYPE;\r\n+import static org.apache.dubbo.common.constants.CommonConstants.GROUP_KEY;\r\n+import static org.apache.dubbo.common.constants.CommonConstants.PORT_KEY;\r\n+import static org.apache.dubbo.common.constants.CommonConstants.TIMESTAMP_KEY;\r\n+import static org.apache.dubbo.common.utils.StringUtils.isBlank;\r\n+import static org.apache.dubbo.registry.integration.InterfaceCompatibleRegistryProtocol.DEFAULT_REGISTER_PROVIDER_KEYS;\r\n+import static org.apache.dubbo.rpc.Constants.DEPRECATED_KEY;\r\n+import static org.apache.dubbo.rpc.Constants.ID_KEY;\r\n+\r\n+/**\r\n+ * The Utilities class for the {@link ServiceInstance#getMetadata() metadata of the service instance}\r\n+ *\r\n+ * @see StandardMetadataServiceURLBuilder\r\n+ * @see ServiceInstance#getMetadata()\r\n+ * @see MetadataService\r\n+ * @see URL\r\n+ * @since 2.7.5\r\n+ */\r\n+public class ServiceInstanceMetadataUtils {\r\n+\r\n+    /**\r\n+     * The prefix of {@link MetadataService} : \"dubbo.metadata-service.\"\r\n+     */\r\n+    public static final String METADATA_SERVICE_PREFIX = \"dubbo.metadata-service.\";\r\n+\r\n+    public static final String ENDPOINTS = \"dubbo.endpoints\";\r\n+\r\n+    /**\r\n+     * The property name of metadata JSON of {@link MetadataService}'s {@link URL}\r\n+     */\r\n+    public static String METADATA_SERVICE_URL_PARAMS_PROPERTY_NAME = METADATA_SERVICE_PREFIX + \"url-params\";\r\n+\r\n+    /**\r\n+     * The {@link URL URLs} property name of {@link MetadataService} :\r\n+     * \"dubbo.metadata-service.urls\", which is used to be compatible with Dubbo Spring Cloud and\r\n+     * discovery the metadata of instance\r\n+     */\r\n+    public static final String METADATA_SERVICE_URLS_PROPERTY_NAME = METADATA_SERVICE_PREFIX + \"urls\";\r\n+\r\n+    /**\r\n+     * The property name of The revision for all exported Dubbo services.\r\n+     */\r\n+    public static String EXPORTED_SERVICES_REVISION_PROPERTY_NAME = \"dubbo.metadata.revision\";\r\n+\r\n+    /**\r\n+     * The property name of metadata storage type.\r\n+     */\r\n+    public static String METADATA_STORAGE_TYPE_PROPERTY_NAME = \"dubbo.metadata.storage-type\";\r\n+\r\n+    public static String METADATA_CLUSTER_PROPERTY_NAME = \"dubbo.metadata.cluster\";\r\n+\r\n+    public static String INSTANCE_REVISION_UPDATED_KEY = \"dubbo.instance.revision.updated\";\r\n+\r\n+    /**\r\n+     * Get the multiple {@link URL urls'} parameters of {@link MetadataService MetadataService's} Metadata\r\n+     *\r\n+     * @param serviceInstance the instance of {@link ServiceInstance}\r\n+     * @return non-null {@link Map}, the key is {@link URL#getProtocol() the protocol of URL}, the value is\r\n+     * {@link #getMetadataServiceURLParams(ServiceInstance, String)}\r\n+     */\r\n+    public static Map<String, Map<String, String>> getMetadataServiceURLsParams(ServiceInstance serviceInstance) {\r\n+        Map<String, String> metadata = serviceInstance.getMetadata();\r\n+        String param = metadata.get(METADATA_SERVICE_URL_PARAMS_PROPERTY_NAME);\r\n+        return isBlank(param) ? emptyMap() : (Map) JSON.parse(param);\r\n+    }\r\n+\r\n+    /**\r\n+     * Get the {@link URL url's} parameters of {@link MetadataService MetadataService's} Metadata\r\n+     *\r\n+     * @param serviceInstance the instance of {@link ServiceInstance}\r\n+     * @return non-null {@link Map}\r\n+     */\r\n+    public static Map<String, String> getMetadataServiceURLParams(ServiceInstance serviceInstance, String protocol) {\r\n+        Map<String, Map<String, String>> params = getMetadataServiceURLsParams(serviceInstance);\r\n+        return params.getOrDefault(protocol, emptyMap());\r\n+    }\r\n+\r\n+    public static String getMetadataServiceParameter(List<URL> urls) {\r\n+\r\n+        Map<String, Map<String, String>> params = new HashMap<>();\r\n+\r\n+        urls.stream()\r\n+                // remove APPLICATION_KEY because service name must be present\r\n+                .map(url -> url.removeParameter(APPLICATION_KEY))\r\n+                // remove GROUP_KEY, always uses application name.\r\n+                .map(url -> url.removeParameter(GROUP_KEY))\r\n+                // remove DEPRECATED_KEY because it's always false\r\n+                .map(url -> url.removeParameter(DEPRECATED_KEY))\r\n+                // remove TIMESTAMP_KEY because it's nonsense\r\n+                .map(url -> url.removeParameter(TIMESTAMP_KEY))\r\n+                .forEach(url -> {\r\n+                    String protocol = url.getProtocol();\r\n+                    params.put(protocol, getParams(url));\r\n+                });\r\n+\r\n+        if (params.isEmpty()) {\r\n+            return null;\r\n+        }\r\n+\r\n+        return JSON.toJSONString(params);\r\n+    }\r\n+\r\n+    private static Map<String, String> getParams(URL providerURL) {\r\n+        Map<String, String> params = new LinkedHashMap<>();\r\n+        setDefaultParams(params, providerURL);\r\n+        params.put(PORT_KEY, String.valueOf(providerURL.getPort()));\r\n+        return params;\r\n+    }\r\n+\r\n+    /**\r\n+     * The revision for all exported Dubbo services from the specified {@link ServiceInstance}.\r\n+     *\r\n+     * @param serviceInstance the specified {@link ServiceInstance}\r\n+     * @return <code>null</code> if not exits\r\n+     */\r\n+    public static String getExportedServicesRevision(ServiceInstance serviceInstance) {\r\n+        Map<String, String> metadata = serviceInstance.getMetadata();\r\n+        return metadata.get(EXPORTED_SERVICES_REVISION_PROPERTY_NAME);\r\n+    }\r\n+\r\n+    /**\r\n+     * Get metadata's storage type\r\n+     *\r\n+     * @param registryURL the {@link URL} to connect the registry\r\n+     * @return if not found in {@link URL#getParameters() parameters} of {@link URL registry URL}, return\r\n+     */\r\n+    public static String getMetadataStorageType(URL registryURL) {\r\n+        return registryURL.getParameter(METADATA_STORAGE_TYPE_PROPERTY_NAME, DEFAULT_METADATA_STORAGE_TYPE);\r\n+    }\r\n+\r\n+    /**\r\n+     * Get the metadata's storage type is used to which {@link WritableMetadataService} instance.\r\n+     *\r\n+     * @param serviceInstance the specified {@link ServiceInstance}\r\n+     * @return if not found in {@link ServiceInstance#getMetadata() metadata} of {@link ServiceInstance}, return\r\n+     */\r\n+    public static String getMetadataStorageType(ServiceInstance serviceInstance) {\r\n+        Map<String, String> metadata = serviceInstance.getMetadata();\r\n+        return metadata.getOrDefault(METADATA_STORAGE_TYPE_PROPERTY_NAME, DEFAULT_METADATA_STORAGE_TYPE);\r\n+    }\r\n+\r\n+    /**\r\n+     * Set the metadata storage type in specified {@link ServiceInstance service instance}\r\n+     *\r\n+     * @param serviceInstance {@link ServiceInstance service instance}\r\n+     * @param metadataType    remote or local\r\n+     */\r\n+    public static void setMetadataStorageType(ServiceInstance serviceInstance, String metadataType) {\r\n+        Map<String, String> metadata = serviceInstance.getMetadata();\r\n+        metadata.put(METADATA_STORAGE_TYPE_PROPERTY_NAME, metadataType);\r\n+    }\r\n+\r\n+    public static String getRemoteCluster(ServiceInstance serviceInstance) {\r\n+        Map<String, String> metadata = serviceInstance.getMetadata();\r\n+        return metadata.get(METADATA_CLUSTER_PROPERTY_NAME);\r\n+    }\r\n+\r\n+    /**\r\n+     * Is Dubbo Service instance or not\r\n+     *\r\n+     * @param serviceInstance {@link ServiceInstance service instance}\r\n+     * @return if Dubbo Service instance, return <code>true</code>, or <code>false</code>\r\n+     */\r\n+    public static boolean isDubboServiceInstance(ServiceInstance serviceInstance) {\r\n+        Map<String, String> metadata = serviceInstance.getMetadata();\r\n+        return metadata.containsKey(METADATA_SERVICE_URL_PARAMS_PROPERTY_NAME)\r\n+                || metadata.containsKey(METADATA_SERVICE_URLS_PROPERTY_NAME);\r\n+    }\r\n+\r\n+    public static void setEndpoints(ServiceInstance serviceInstance, Map<String, Integer> protocolPorts) {\r\n+        Map<String, String> metadata = serviceInstance.getMetadata();\r\n+        List<Endpoint> endpoints = new ArrayList<>();\r\n+        protocolPorts.forEach((k, v) -> {\r\n+            Endpoint endpoint = new Endpoint(v, k);\r\n+            endpoints.add(endpoint);\r\n+        });\r\n+\r\n+        metadata.put(ENDPOINTS, JSON.toJSONString(endpoints));\r\n+    }\r\n+\r\n+    /**\r\n+     * Get the property value of port by the specified {@link ServiceInstance#getMetadata() the metadata of\r\n+     * service instance} and protocol\r\n+     *\r\n+     * @param serviceInstance {@link ServiceInstance service instance}\r\n+     * @param protocol        the name of protocol, e.g, dubbo, rest, and so on\r\n+     * @return if not found, return <code>null</code>\r\n+     */\r\n+    public static Integer getProtocolPort(ServiceInstance serviceInstance, String protocol) {\r\n+        Map<String, String> metadata = serviceInstance.getMetadata();\r\n+        String rawEndpoints = metadata.get(ENDPOINTS);\r\n+        if (StringUtils.isNotEmpty(rawEndpoints)) {\r\n+            List<Endpoint> endpoints = JSON.parseArray(rawEndpoints, Endpoint.class);\r\n+            for (Endpoint endpoint : endpoints) {\r\n+                if (endpoint.getProtocol().equals(protocol)) {\r\n+                    return endpoint.getPort();\r\n+                }\r\n+            }\r\n+        }\r\n+        return null;\r\n+    }\r\n+\r\n+    public static void calInstanceRevision(ServiceDiscovery serviceDiscovery, ServiceInstance instance) {\r\n+        String registryCluster = serviceDiscovery.getUrl().getParameter(ID_KEY);\r\n+        if (registryCluster == null) {\r\n+            return;\r\n+        }\r\n+        MetadataInfo metadataInfo = WritableMetadataService.getDefaultExtension().getMetadataInfos().get(registryCluster);\r\n+        if (metadataInfo != null) {\r\n+            String existingInstanceRevision = instance.getMetadata().get(EXPORTED_SERVICES_REVISION_PROPERTY_NAME);\r\n+            if (!metadataInfo.calAndGetRevision().equals(existingInstanceRevision)) {\r\n+                instance.getMetadata().put(EXPORTED_SERVICES_REVISION_PROPERTY_NAME, metadataInfo.calAndGetRevision());\r\n+                if (existingInstanceRevision != null) {// skip the first registration.\r\n+                    instance.getExtendParams().put(INSTANCE_REVISION_UPDATED_KEY, \"true\");\r\n+                }\r\n+            }\r\n+        }\r\n+    }\r\n+\r\n+    public static boolean isInstanceUpdated(ServiceInstance instance) {\r\n+        return \"true\".equals(instance.getExtendParams().get(INSTANCE_REVISION_UPDATED_KEY));\r\n+    }\r\n+\r\n+    public static void resetInstanceUpdateKey(ServiceInstance instance) {\r\n+        instance.getExtendParams().remove(INSTANCE_REVISION_UPDATED_KEY);\r\n+    }\r\n+\r\n+    public static void refreshMetadataAndInstance() {\r\n+        RemoteMetadataServiceImpl remoteMetadataService = MetadataUtils.getRemoteMetadataService();\r\n+        remoteMetadataService.publishMetadata(ApplicationModel.getName());\r\n+\r\n+        AbstractRegistryFactory.getServiceDiscoveries().forEach(serviceDiscovery -> {\r\n+            calInstanceRevision(serviceDiscovery, serviceDiscovery.getLocalInstance());\r\n+            // update service instance revision\r\n+            serviceDiscovery.update(serviceDiscovery.getLocalInstance());\r\n+        });\r\n+    }\r\n+\r\n+    /**\r\n+     * Set the default parameters via the specified {@link URL providerURL}\r\n+     *\r\n+     * @param params      the parameters\r\n+     * @param providerURL the provider's {@link URL}\r\n+     */\r\n+    private static void setDefaultParams(Map<String, String> params, URL providerURL) {\r\n+        for (String parameterName : DEFAULT_REGISTER_PROVIDER_KEYS) {\r\n+            String parameterValue = providerURL.getParameter(parameterName);\r\n+            if (!isBlank(parameterValue)) {\r\n+                params.put(parameterName, parameterValue);\r\n+            }\r\n+        }\r\n+    }\r\n+\r\n+    public static class Endpoint {\r\n+        Integer port;\r\n+        String protocol;\r\n+\r\n+        public Endpoint(Integer port, String protocol) {\r\n+            this.port = port;\r\n+            this.protocol = protocol;\r\n+        }\r\n+\r\n+        public Integer getPort() {\r\n+            return port;\r\n+        }\r\n+\r\n+        public void setPort(Integer port) {\r\n+            this.port = port;\r\n+        }\r\n+\r\n+        public String getProtocol() {\r\n+            return protocol;\r\n+        }\r\n+\r\n+        public void setProtocol(String protocol) {\r\n+            this.protocol = protocol;\r\n+        }\r\n+    }\r\n+}\r\n"}, {"source1": "org/apache/dubbo/registry/client/metadata/SpringCloudMetadataServiceURLBuilder.java", "source2": "org/apache/dubbo/registry/client/metadata/SpringCloudMetadataServiceURLBuilder.java", "comments": ["Line-ending differences only"], "unified_diff": "@@ -1,51 +1,51 @@\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.client.metadata;\n-\n-import org.apache.dubbo.common.URL;\n-import org.apache.dubbo.common.utils.StringUtils;\n-import org.apache.dubbo.registry.client.ServiceInstance;\n-\n-import com.alibaba.fastjson.JSON;\n-\n-import java.util.Collections;\n-import java.util.List;\n-import java.util.Map;\n-import java.util.stream.Collectors;\n-\n-import static org.apache.dubbo.registry.client.metadata.ServiceInstanceMetadataUtils.METADATA_SERVICE_URLS_PROPERTY_NAME;\n-\n-/**\n- * Supporting interaction with Dubbo Spring Cloud at https://github.com/alibaba/spring-cloud-alibaba\n- * Dubbo Spring Cloud is a Dubbo extension that favours a per instance registry model and exposes metadata service.\n- *\n- * @since 2.7.5\n- */\n-public class SpringCloudMetadataServiceURLBuilder implements MetadataServiceURLBuilder {\n-    public static final String NAME = \"spring-cloud\";\n-\n-    @Override\n-    public List<URL> build(ServiceInstance serviceInstance) {\n-        Map<String, String> metadata = serviceInstance.getMetadata();\n-        String dubboURLsJSON = metadata.get(METADATA_SERVICE_URLS_PROPERTY_NAME);\n-        if (StringUtils.isBlank(dubboURLsJSON)) {\n-            return Collections.emptyList();\n-        }\n-        List<String> urlStrings = JSON.parseArray(dubboURLsJSON, String.class);\n-        return urlStrings.stream().map(URL::valueOf).collect(Collectors.toList());\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.client.metadata;\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.client.ServiceInstance;\r\n+\r\n+import com.alibaba.fastjson.JSON;\r\n+\r\n+import java.util.Collections;\r\n+import java.util.List;\r\n+import java.util.Map;\r\n+import java.util.stream.Collectors;\r\n+\r\n+import static org.apache.dubbo.registry.client.metadata.ServiceInstanceMetadataUtils.METADATA_SERVICE_URLS_PROPERTY_NAME;\r\n+\r\n+/**\r\n+ * Supporting interaction with Dubbo Spring Cloud at https://github.com/alibaba/spring-cloud-alibaba\r\n+ * Dubbo Spring Cloud is a Dubbo extension that favours a per instance registry model and exposes metadata service.\r\n+ *\r\n+ * @since 2.7.5\r\n+ */\r\n+public class SpringCloudMetadataServiceURLBuilder implements MetadataServiceURLBuilder {\r\n+    public static final String NAME = \"spring-cloud\";\r\n+\r\n+    @Override\r\n+    public List<URL> build(ServiceInstance serviceInstance) {\r\n+        Map<String, String> metadata = serviceInstance.getMetadata();\r\n+        String dubboURLsJSON = metadata.get(METADATA_SERVICE_URLS_PROPERTY_NAME);\r\n+        if (StringUtils.isBlank(dubboURLsJSON)) {\r\n+            return Collections.emptyList();\r\n+        }\r\n+        List<String> urlStrings = JSON.parseArray(dubboURLsJSON, String.class);\r\n+        return urlStrings.stream().map(URL::valueOf).collect(Collectors.toList());\r\n+    }\r\n+}\r\n"}, {"source1": "org/apache/dubbo/registry/client/metadata/StandardMetadataServiceURLBuilder.java", "source2": "org/apache/dubbo/registry/client/metadata/StandardMetadataServiceURLBuilder.java", "comments": ["Line-ending differences only"], "unified_diff": "@@ -1,89 +1,89 @@\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.client.metadata;\n-\n-import org.apache.dubbo.common.URL;\n-import org.apache.dubbo.common.URLBuilder;\n-import org.apache.dubbo.common.config.ConfigurationUtils;\n-import org.apache.dubbo.metadata.MetadataService;\n-import org.apache.dubbo.registry.client.ServiceInstance;\n-\n-import java.util.ArrayList;\n-import java.util.List;\n-import java.util.Map;\n-\n-import static java.lang.String.valueOf;\n-import static org.apache.dubbo.common.constants.CommonConstants.CONSUMER;\n-import static org.apache.dubbo.common.constants.CommonConstants.GROUP_KEY;\n-import static org.apache.dubbo.common.constants.CommonConstants.PORT_KEY;\n-import static org.apache.dubbo.common.constants.CommonConstants.SIDE_KEY;\n-import static org.apache.dubbo.common.constants.CommonConstants.TIMEOUT_KEY;\n-import static org.apache.dubbo.metadata.MetadataConstants.DEFAULT_METADATA_TIMEOUT_VALUE;\n-import static org.apache.dubbo.metadata.MetadataConstants.METADATA_PROXY_TIMEOUT_KEY;\n-import static org.apache.dubbo.registry.client.metadata.ServiceInstanceMetadataUtils.getMetadataServiceURLsParams;\n-\n-/**\n- * Standard Dubbo provider enabling introspection service discovery mode.\n- *\n- * @see MetadataService\n- * @since 2.7.5\n- */\n-public class StandardMetadataServiceURLBuilder implements MetadataServiceURLBuilder {\n-    \n-    public static final String NAME = \"standard\";\n-\n-    /**\n-     * Build the {@link URL urls} from {@link ServiceInstance#getMetadata() the metadata} of {@link ServiceInstance}\n-     *\n-     * @param serviceInstance {@link ServiceInstance}\n-     * @return the not-null {@link List}\n-     */\n-    @Override\n-    public List<URL> build(ServiceInstance serviceInstance) {\n-\n-        Map<String, Map<String, String>> paramsMap = getMetadataServiceURLsParams(serviceInstance);\n-\n-        List<URL> urls = new ArrayList<>(paramsMap.size());\n-\n-        String serviceName = serviceInstance.getServiceName();\n-\n-        String host = serviceInstance.getHost();\n-\n-        for (Map.Entry<String, Map<String, String>> entry : paramsMap.entrySet()) {\n-            String protocol = entry.getKey();\n-            Map<String, String> params = entry.getValue();\n-            int port = Integer.parseInt(params.get(PORT_KEY));\n-            URLBuilder urlBuilder = new URLBuilder()\n-                    .setHost(host)\n-                    .setPort(port)\n-                    .setProtocol(protocol)\n-                    .setPath(MetadataService.class.getName())\n-                    .addParameter(TIMEOUT_KEY, ConfigurationUtils.get(METADATA_PROXY_TIMEOUT_KEY, DEFAULT_METADATA_TIMEOUT_VALUE))\n-                    .addParameter(SIDE_KEY, CONSUMER);\n-\n-            // add parameters\n-            params.forEach((name, value) -> urlBuilder.addParameter(name, valueOf(value)));\n-\n-            // add the default parameters\n-            urlBuilder.addParameter(GROUP_KEY, serviceName);\n-\n-            urls.add(urlBuilder.build());\n-        }\n-\n-        return urls;\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.client.metadata;\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.config.ConfigurationUtils;\r\n+import org.apache.dubbo.metadata.MetadataService;\r\n+import org.apache.dubbo.registry.client.ServiceInstance;\r\n+\r\n+import java.util.ArrayList;\r\n+import java.util.List;\r\n+import java.util.Map;\r\n+\r\n+import static java.lang.String.valueOf;\r\n+import static org.apache.dubbo.common.constants.CommonConstants.CONSUMER;\r\n+import static org.apache.dubbo.common.constants.CommonConstants.GROUP_KEY;\r\n+import static org.apache.dubbo.common.constants.CommonConstants.PORT_KEY;\r\n+import static org.apache.dubbo.common.constants.CommonConstants.SIDE_KEY;\r\n+import static org.apache.dubbo.common.constants.CommonConstants.TIMEOUT_KEY;\r\n+import static org.apache.dubbo.metadata.MetadataConstants.DEFAULT_METADATA_TIMEOUT_VALUE;\r\n+import static org.apache.dubbo.metadata.MetadataConstants.METADATA_PROXY_TIMEOUT_KEY;\r\n+import static org.apache.dubbo.registry.client.metadata.ServiceInstanceMetadataUtils.getMetadataServiceURLsParams;\r\n+\r\n+/**\r\n+ * Standard Dubbo provider enabling introspection service discovery mode.\r\n+ *\r\n+ * @see MetadataService\r\n+ * @since 2.7.5\r\n+ */\r\n+public class StandardMetadataServiceURLBuilder implements MetadataServiceURLBuilder {\r\n+    \r\n+    public static final String NAME = \"standard\";\r\n+\r\n+    /**\r\n+     * Build the {@link URL urls} from {@link ServiceInstance#getMetadata() the metadata} of {@link ServiceInstance}\r\n+     *\r\n+     * @param serviceInstance {@link ServiceInstance}\r\n+     * @return the not-null {@link List}\r\n+     */\r\n+    @Override\r\n+    public List<URL> build(ServiceInstance serviceInstance) {\r\n+\r\n+        Map<String, Map<String, String>> paramsMap = getMetadataServiceURLsParams(serviceInstance);\r\n+\r\n+        List<URL> urls = new ArrayList<>(paramsMap.size());\r\n+\r\n+        String serviceName = serviceInstance.getServiceName();\r\n+\r\n+        String host = serviceInstance.getHost();\r\n+\r\n+        for (Map.Entry<String, Map<String, String>> entry : paramsMap.entrySet()) {\r\n+            String protocol = entry.getKey();\r\n+            Map<String, String> params = entry.getValue();\r\n+            int port = Integer.parseInt(params.get(PORT_KEY));\r\n+            URLBuilder urlBuilder = new URLBuilder()\r\n+                    .setHost(host)\r\n+                    .setPort(port)\r\n+                    .setProtocol(protocol)\r\n+                    .setPath(MetadataService.class.getName())\r\n+                    .addParameter(TIMEOUT_KEY, ConfigurationUtils.get(METADATA_PROXY_TIMEOUT_KEY, DEFAULT_METADATA_TIMEOUT_VALUE))\r\n+                    .addParameter(SIDE_KEY, CONSUMER);\r\n+\r\n+            // add parameters\r\n+            params.forEach((name, value) -> urlBuilder.addParameter(name, valueOf(value)));\r\n+\r\n+            // add the default parameters\r\n+            urlBuilder.addParameter(GROUP_KEY, serviceName);\r\n+\r\n+            urls.add(urlBuilder.build());\r\n+        }\r\n+\r\n+        return urls;\r\n+    }\r\n+}\r\n"}, {"source1": "org/apache/dubbo/registry/client/metadata/SubscribedURLsSynthesizer.java", "source2": "org/apache/dubbo/registry/client/metadata/SubscribedURLsSynthesizer.java", "comments": ["Line-ending differences only"], "unified_diff": "@@ -1,55 +1,55 @@\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.client.metadata;\n-\n-import org.apache.dubbo.common.URL;\n-import org.apache.dubbo.common.extension.SPI;\n-import org.apache.dubbo.common.lang.Prioritized;\n-import org.apache.dubbo.registry.NotifyListener;\n-import org.apache.dubbo.registry.Registry;\n-import org.apache.dubbo.registry.client.ServiceInstance;\n-\n-import java.util.Collection;\n-import java.util.List;\n-\n-/**\n- * The interface to synthesize the subscribed {@link URL URLs}\n- *\n- * @since 2.7.5\n- */\n-@SPI\n-public interface SubscribedURLsSynthesizer extends Prioritized {\n-\n-    /**\n-     * Supports the synthesis of the subscribed {@link URL URLs} or not\n-     *\n-     * @param subscribedURL the original subscribed {@link URL} from the execution of`\n-     *                      {@link Registry#subscribe(URL, NotifyListener)} method\n-     * @return if supports, return <code>true</code>, or <code>false</code>\n-     */\n-    boolean supports(URL subscribedURL);\n-\n-    /**\n-     * synthesize the subscribed {@link URL URLs}\n-     *\n-     * @param subscribedURL    the original subscribed {@link URL} from the execution of`\n-     *                         {@link Registry#subscribe(URL, NotifyListener)} method\n-     * @param serviceInstances\n-     * @return\n-     */\n-    List<URL> synthesize(URL subscribedURL, Collection<ServiceInstance> serviceInstances);\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.client.metadata;\r\n+\r\n+import org.apache.dubbo.common.URL;\r\n+import org.apache.dubbo.common.extension.SPI;\r\n+import org.apache.dubbo.common.lang.Prioritized;\r\n+import org.apache.dubbo.registry.NotifyListener;\r\n+import org.apache.dubbo.registry.Registry;\r\n+import org.apache.dubbo.registry.client.ServiceInstance;\r\n+\r\n+import java.util.Collection;\r\n+import java.util.List;\r\n+\r\n+/**\r\n+ * The interface to synthesize the subscribed {@link URL URLs}\r\n+ *\r\n+ * @since 2.7.5\r\n+ */\r\n+@SPI\r\n+public interface SubscribedURLsSynthesizer extends Prioritized {\r\n+\r\n+    /**\r\n+     * Supports the synthesis of the subscribed {@link URL URLs} or not\r\n+     *\r\n+     * @param subscribedURL the original subscribed {@link URL} from the execution of`\r\n+     *                      {@link Registry#subscribe(URL, NotifyListener)} method\r\n+     * @return if supports, return <code>true</code>, or <code>false</code>\r\n+     */\r\n+    boolean supports(URL subscribedURL);\r\n+\r\n+    /**\r\n+     * synthesize the subscribed {@link URL URLs}\r\n+     *\r\n+     * @param subscribedURL    the original subscribed {@link URL} from the execution of`\r\n+     *                         {@link Registry#subscribe(URL, NotifyListener)} method\r\n+     * @param serviceInstances\r\n+     * @return\r\n+     */\r\n+    List<URL> synthesize(URL subscribedURL, Collection<ServiceInstance> serviceInstances);\r\n+}\r\n"}, {"source1": "org/apache/dubbo/registry/client/metadata/store/InMemoryWritableMetadataService.java", "source2": "org/apache/dubbo/registry/client/metadata/store/InMemoryWritableMetadataService.java", "comments": ["Line-ending differences only"], "unified_diff": "@@ -1,301 +1,301 @@\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.client.metadata.store;\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.metadata.MetadataInfo;\n-import org.apache.dubbo.metadata.MetadataInfo.ServiceInfo;\n-import org.apache.dubbo.metadata.MetadataService;\n-import org.apache.dubbo.metadata.WritableMetadataService;\n-import org.apache.dubbo.metadata.definition.ServiceDefinitionBuilder;\n-import org.apache.dubbo.metadata.definition.model.ServiceDefinition;\n-import org.apache.dubbo.registry.client.RegistryClusterIdentifier;\n-import org.apache.dubbo.rpc.model.ApplicationModel;\n-import org.apache.dubbo.rpc.support.ProtocolUtils;\n-\n-import com.google.gson.Gson;\n-\n-import java.util.Comparator;\n-import java.util.Map;\n-import java.util.SortedSet;\n-import java.util.TreeSet;\n-import java.util.concurrent.Callable;\n-import java.util.concurrent.ConcurrentHashMap;\n-import java.util.concurrent.ConcurrentMap;\n-import java.util.concurrent.ConcurrentNavigableMap;\n-import java.util.concurrent.ConcurrentSkipListMap;\n-import java.util.concurrent.Semaphore;\n-import java.util.concurrent.locks.Lock;\n-import java.util.concurrent.locks.ReentrantLock;\n-\n-import static java.util.Collections.emptySortedSet;\n-import static java.util.Collections.unmodifiableSortedSet;\n-import static org.apache.dubbo.common.URL.buildKey;\n-import static org.apache.dubbo.common.constants.CommonConstants.CONSUMER_SIDE;\n-import static org.apache.dubbo.common.constants.CommonConstants.INTERFACE_KEY;\n-import static org.apache.dubbo.common.constants.CommonConstants.PROTOCOL_KEY;\n-import static org.apache.dubbo.common.constants.CommonConstants.SIDE_KEY;\n-import static org.apache.dubbo.common.utils.CollectionUtils.isEmpty;\n-import static org.apache.dubbo.rpc.Constants.GENERIC_KEY;\n-\n-/**\n- * The {@link WritableMetadataService} implementation stores the metadata of Dubbo services in memory locally when they\n- * exported. It is used by server (provider).\n- *\n- * @see MetadataService\n- * @see WritableMetadataService\n- * @since 2.7.5\n- */\n-public class InMemoryWritableMetadataService implements WritableMetadataService {\n-\n-    final Logger logger = LoggerFactory.getLogger(getClass());\n-\n-    private final Lock lock = new ReentrantLock();\n-\n-    // =================================== Registration =================================== //\n-\n-    /**\n-     * All exported {@link URL urls} {@link Map} whose key is the return value of {@link URL#getServiceKey()} method\n-     * and value is the {@link SortedSet sorted set} of the {@link URL URLs}\n-     */\n-    ConcurrentNavigableMap<String, SortedSet<URL>> exportedServiceURLs = new ConcurrentSkipListMap<>();\n-    ConcurrentMap<String, MetadataInfo> metadataInfos;\n-    final Semaphore metadataSemaphore = new Semaphore(1);\n-\n-    // ==================================================================================== //\n-\n-    // =================================== Subscription =================================== //\n-\n-    /**\n-     * The subscribed {@link URL urls} {@link Map} of {@link MetadataService},\n-     * whose key is the return value of {@link URL#getServiceKey()} method and value is\n-     * the {@link SortedSet sorted set} of the {@link URL URLs}\n-     */\n-    ConcurrentNavigableMap<String, SortedSet<URL>> subscribedServiceURLs = new ConcurrentSkipListMap<>();\n-\n-    ConcurrentNavigableMap<String, String> serviceDefinitions = new ConcurrentSkipListMap<>();\n-\n-    public InMemoryWritableMetadataService() {\n-        this.metadataInfos = new ConcurrentHashMap<>();\n-    }\n-\n-    @Override\n-    public SortedSet<String> getSubscribedURLs() {\n-        return getAllUnmodifiableServiceURLs(subscribedServiceURLs);\n-    }\n-\n-    private SortedSet<String> getAllUnmodifiableServiceURLs(Map<String, SortedSet<URL>> serviceURLs) {\n-        SortedSet<URL> bizURLs = new TreeSet<>(InMemoryWritableMetadataService.URLComparator.INSTANCE);\n-        for (Map.Entry<String, SortedSet<URL>> entry : serviceURLs.entrySet()) {\n-            SortedSet<URL> urls = entry.getValue();\n-            if (urls != null) {\n-                for (URL url : urls) {\n-                    if (!MetadataService.class.getName().equals(url.getServiceInterface())) {\n-                        bizURLs.add(url);\n-                    }\n-                }\n-            }\n-        }\n-        return MetadataService.toSortedStrings(bizURLs);\n-    }\n-\n-    @Override\n-    public SortedSet<String> getExportedURLs(String serviceInterface, String group, String version, String protocol) {\n-        if (ALL_SERVICE_INTERFACES.equals(serviceInterface)) {\n-            return getAllUnmodifiableServiceURLs(exportedServiceURLs);\n-        }\n-        String serviceKey = buildKey(serviceInterface, group, version);\n-        return unmodifiableSortedSet(getServiceURLs(exportedServiceURLs, serviceKey, protocol));\n-    }\n-\n-    @Override\n-    public boolean exportURL(URL url) {\n-        String registryCluster = RegistryClusterIdentifier.getExtension(url).providerKey(url);\n-        String[] clusters = registryCluster.split(\",\");\n-        for (String cluster : clusters) {\n-            MetadataInfo metadataInfo = metadataInfos.computeIfAbsent(cluster, k -> {\n-                return new MetadataInfo(ApplicationModel.getName());\n-            });\n-            metadataInfo.addService(new ServiceInfo(url));\n-        }\n-        metadataSemaphore.release();\n-        return addURL(exportedServiceURLs, url);\n-    }\n-\n-    @Override\n-    public boolean unexportURL(URL url) {\n-        String registryCluster = RegistryClusterIdentifier.getExtension(url).providerKey(url);\n-        String[] clusters = registryCluster.split(\",\");\n-        for (String cluster : clusters) {\n-            MetadataInfo metadataInfo = metadataInfos.get(cluster);\n-            metadataInfo.removeService(url.getProtocolServiceKey());\n-            if (metadataInfo.getServices().isEmpty()) {\n-                metadataInfos.remove(cluster);\n-            }\n-        }\n-        metadataSemaphore.release();\n-        return removeURL(exportedServiceURLs, url);\n-    }\n-\n-    @Override\n-    public boolean subscribeURL(URL url) {\n-        return addURL(subscribedServiceURLs, url);\n-    }\n-\n-    @Override\n-    public boolean unsubscribeURL(URL url) {\n-        return removeURL(subscribedServiceURLs, url);\n-    }\n-\n-    @Override\n-    public void publishServiceDefinition(URL providerUrl) {\n-        try {\n-            if (!ProtocolUtils.isGeneric(providerUrl.getParameter(GENERIC_KEY))) {\n-                String interfaceName = providerUrl.getParameter(INTERFACE_KEY);\n-                if (StringUtils.isNotEmpty(interfaceName)) {\n-                    Class interfaceClass = Class.forName(interfaceName);\n-                    ServiceDefinition serviceDefinition = ServiceDefinitionBuilder.build(interfaceClass);\n-                    Gson gson = new Gson();\n-                    String data = gson.toJson(serviceDefinition);\n-                    serviceDefinitions.put(providerUrl.getServiceKey(), data);\n-                    return;\n-                }\n-                logger.error(\"publishProvider interfaceName is empty . providerUrl: \" + providerUrl.toFullString());\n-            } else if (CONSUMER_SIDE.equalsIgnoreCase(providerUrl.getParameter(SIDE_KEY))) {\n-                //to avoid consumer generic invoke style error\n-                return;\n-            }\n-        } catch (ClassNotFoundException e) {\n-            //ignore error\n-            logger.error(\"publishProvider getServiceDescriptor error. providerUrl: \" + providerUrl.toFullString(), e);\n-        }\n-    }\n-\n-    @Override\n-    public String getServiceDefinition(String interfaceName, String version, String group) {\n-        return serviceDefinitions.get(URL.buildKey(interfaceName, group, version));\n-    }\n-\n-    @Override\n-    public String getServiceDefinition(String serviceKey) {\n-        return serviceDefinitions.get(serviceKey);\n-    }\n-\n-    @Override\n-    public MetadataInfo getMetadataInfo(String revision) {\n-        if (StringUtils.isEmpty(revision)) {\n-            return null;\n-        }\n-        for (Map.Entry<String, MetadataInfo> entry : metadataInfos.entrySet()) {\n-            MetadataInfo metadataInfo = entry.getValue();\n-            if (revision.equals(metadataInfo.calAndGetRevision())) {\n-                return metadataInfo;\n-            }\n-        }\n-        return null;\n-    }\n-\n-    public void blockUntilUpdated() {\n-        try {\n-            metadataSemaphore.acquire();\n-        } catch (InterruptedException e) {\n-            logger.warn(\"metadata refresh thread has been interrupted unexpectedly while waiting for update.\", e);\n-        }\n-    }\n-\n-    public Map<String, MetadataInfo> getMetadataInfos() {\n-        return metadataInfos;\n-    }\n-\n-    boolean addURL(Map<String, SortedSet<URL>> serviceURLs, URL url) {\n-        return executeMutually(() -> {\n-            SortedSet<URL> urls = serviceURLs.computeIfAbsent(url.getServiceKey(), this::newSortedURLs);\n-            // make sure the parameters of tmpUrl is variable\n-            return urls.add(url);\n-        });\n-    }\n-\n-    boolean removeURL(Map<String, SortedSet<URL>> serviceURLs, URL url) {\n-        return executeMutually(() -> {\n-            String key = url.getServiceKey();\n-            SortedSet<URL> urls = serviceURLs.getOrDefault(key, null);\n-            if (urls == null) {\n-                return true;\n-            }\n-            boolean r = urls.remove(url);\n-            // if it is empty\n-            if (urls.isEmpty()) {\n-                serviceURLs.remove(key);\n-            }\n-            return r;\n-        });\n-    }\n-\n-    private SortedSet<URL> newSortedURLs(String serviceKey) {\n-        return new TreeSet<>(InMemoryWritableMetadataService.URLComparator.INSTANCE);\n-    }\n-\n-    boolean executeMutually(Callable<Boolean> callable) {\n-        boolean success = false;\n-        try {\n-            lock.lock();\n-            try {\n-                success = callable.call();\n-            } catch (Exception e) {\n-                if (logger.isErrorEnabled()) {\n-                    logger.error(e);\n-                }\n-            }\n-        } finally {\n-            lock.unlock();\n-        }\n-        return success;\n-    }\n-\n-    private SortedSet<String> getServiceURLs(Map<String, SortedSet<URL>> exportedServiceURLs, String serviceKey,\n-                                             String protocol) {\n-\n-        SortedSet<URL> serviceURLs = exportedServiceURLs.get(serviceKey);\n-\n-        if (isEmpty(serviceURLs)) {\n-            return emptySortedSet();\n-        }\n-\n-        return MetadataService.toSortedStrings(serviceURLs.stream().filter(url -> isAcceptableProtocol(protocol, url)));\n-    }\n-\n-    private boolean isAcceptableProtocol(String protocol, URL url) {\n-        return protocol == null\n-                || protocol.equals(url.getParameter(PROTOCOL_KEY))\n-                || protocol.equals(url.getProtocol());\n-    }\n-\n-\n-    static class URLComparator implements Comparator<URL> {\n-\n-        public static final URLComparator INSTANCE = new URLComparator();\n-\n-        @Override\n-        public int compare(URL o1, URL o2) {\n-            return o1.toFullString().compareTo(o2.toFullString());\n-        }\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.client.metadata.store;\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.metadata.MetadataInfo;\r\n+import org.apache.dubbo.metadata.MetadataInfo.ServiceInfo;\r\n+import org.apache.dubbo.metadata.MetadataService;\r\n+import org.apache.dubbo.metadata.WritableMetadataService;\r\n+import org.apache.dubbo.metadata.definition.ServiceDefinitionBuilder;\r\n+import org.apache.dubbo.metadata.definition.model.ServiceDefinition;\r\n+import org.apache.dubbo.registry.client.RegistryClusterIdentifier;\r\n+import org.apache.dubbo.rpc.model.ApplicationModel;\r\n+import org.apache.dubbo.rpc.support.ProtocolUtils;\r\n+\r\n+import com.google.gson.Gson;\r\n+\r\n+import java.util.Comparator;\r\n+import java.util.Map;\r\n+import java.util.SortedSet;\r\n+import java.util.TreeSet;\r\n+import java.util.concurrent.Callable;\r\n+import java.util.concurrent.ConcurrentHashMap;\r\n+import java.util.concurrent.ConcurrentMap;\r\n+import java.util.concurrent.ConcurrentNavigableMap;\r\n+import java.util.concurrent.ConcurrentSkipListMap;\r\n+import java.util.concurrent.Semaphore;\r\n+import java.util.concurrent.locks.Lock;\r\n+import java.util.concurrent.locks.ReentrantLock;\r\n+\r\n+import static java.util.Collections.emptySortedSet;\r\n+import static java.util.Collections.unmodifiableSortedSet;\r\n+import static org.apache.dubbo.common.URL.buildKey;\r\n+import static org.apache.dubbo.common.constants.CommonConstants.CONSUMER_SIDE;\r\n+import static org.apache.dubbo.common.constants.CommonConstants.INTERFACE_KEY;\r\n+import static org.apache.dubbo.common.constants.CommonConstants.PROTOCOL_KEY;\r\n+import static org.apache.dubbo.common.constants.CommonConstants.SIDE_KEY;\r\n+import static org.apache.dubbo.common.utils.CollectionUtils.isEmpty;\r\n+import static org.apache.dubbo.rpc.Constants.GENERIC_KEY;\r\n+\r\n+/**\r\n+ * The {@link WritableMetadataService} implementation stores the metadata of Dubbo services in memory locally when they\r\n+ * exported. It is used by server (provider).\r\n+ *\r\n+ * @see MetadataService\r\n+ * @see WritableMetadataService\r\n+ * @since 2.7.5\r\n+ */\r\n+public class InMemoryWritableMetadataService implements WritableMetadataService {\r\n+\r\n+    final Logger logger = LoggerFactory.getLogger(getClass());\r\n+\r\n+    private final Lock lock = new ReentrantLock();\r\n+\r\n+    // =================================== Registration =================================== //\r\n+\r\n+    /**\r\n+     * All exported {@link URL urls} {@link Map} whose key is the return value of {@link URL#getServiceKey()} method\r\n+     * and value is the {@link SortedSet sorted set} of the {@link URL URLs}\r\n+     */\r\n+    ConcurrentNavigableMap<String, SortedSet<URL>> exportedServiceURLs = new ConcurrentSkipListMap<>();\r\n+    ConcurrentMap<String, MetadataInfo> metadataInfos;\r\n+    final Semaphore metadataSemaphore = new Semaphore(1);\r\n+\r\n+    // ==================================================================================== //\r\n+\r\n+    // =================================== Subscription =================================== //\r\n+\r\n+    /**\r\n+     * The subscribed {@link URL urls} {@link Map} of {@link MetadataService},\r\n+     * whose key is the return value of {@link URL#getServiceKey()} method and value is\r\n+     * the {@link SortedSet sorted set} of the {@link URL URLs}\r\n+     */\r\n+    ConcurrentNavigableMap<String, SortedSet<URL>> subscribedServiceURLs = new ConcurrentSkipListMap<>();\r\n+\r\n+    ConcurrentNavigableMap<String, String> serviceDefinitions = new ConcurrentSkipListMap<>();\r\n+\r\n+    public InMemoryWritableMetadataService() {\r\n+        this.metadataInfos = new ConcurrentHashMap<>();\r\n+    }\r\n+\r\n+    @Override\r\n+    public SortedSet<String> getSubscribedURLs() {\r\n+        return getAllUnmodifiableServiceURLs(subscribedServiceURLs);\r\n+    }\r\n+\r\n+    private SortedSet<String> getAllUnmodifiableServiceURLs(Map<String, SortedSet<URL>> serviceURLs) {\r\n+        SortedSet<URL> bizURLs = new TreeSet<>(InMemoryWritableMetadataService.URLComparator.INSTANCE);\r\n+        for (Map.Entry<String, SortedSet<URL>> entry : serviceURLs.entrySet()) {\r\n+            SortedSet<URL> urls = entry.getValue();\r\n+            if (urls != null) {\r\n+                for (URL url : urls) {\r\n+                    if (!MetadataService.class.getName().equals(url.getServiceInterface())) {\r\n+                        bizURLs.add(url);\r\n+                    }\r\n+                }\r\n+            }\r\n+        }\r\n+        return MetadataService.toSortedStrings(bizURLs);\r\n+    }\r\n+\r\n+    @Override\r\n+    public SortedSet<String> getExportedURLs(String serviceInterface, String group, String version, String protocol) {\r\n+        if (ALL_SERVICE_INTERFACES.equals(serviceInterface)) {\r\n+            return getAllUnmodifiableServiceURLs(exportedServiceURLs);\r\n+        }\r\n+        String serviceKey = buildKey(serviceInterface, group, version);\r\n+        return unmodifiableSortedSet(getServiceURLs(exportedServiceURLs, serviceKey, protocol));\r\n+    }\r\n+\r\n+    @Override\r\n+    public boolean exportURL(URL url) {\r\n+        String registryCluster = RegistryClusterIdentifier.getExtension(url).providerKey(url);\r\n+        String[] clusters = registryCluster.split(\",\");\r\n+        for (String cluster : clusters) {\r\n+            MetadataInfo metadataInfo = metadataInfos.computeIfAbsent(cluster, k -> {\r\n+                return new MetadataInfo(ApplicationModel.getName());\r\n+            });\r\n+            metadataInfo.addService(new ServiceInfo(url));\r\n+        }\r\n+        metadataSemaphore.release();\r\n+        return addURL(exportedServiceURLs, url);\r\n+    }\r\n+\r\n+    @Override\r\n+    public boolean unexportURL(URL url) {\r\n+        String registryCluster = RegistryClusterIdentifier.getExtension(url).providerKey(url);\r\n+        String[] clusters = registryCluster.split(\",\");\r\n+        for (String cluster : clusters) {\r\n+            MetadataInfo metadataInfo = metadataInfos.get(cluster);\r\n+            metadataInfo.removeService(url.getProtocolServiceKey());\r\n+            if (metadataInfo.getServices().isEmpty()) {\r\n+                metadataInfos.remove(cluster);\r\n+            }\r\n+        }\r\n+        metadataSemaphore.release();\r\n+        return removeURL(exportedServiceURLs, url);\r\n+    }\r\n+\r\n+    @Override\r\n+    public boolean subscribeURL(URL url) {\r\n+        return addURL(subscribedServiceURLs, url);\r\n+    }\r\n+\r\n+    @Override\r\n+    public boolean unsubscribeURL(URL url) {\r\n+        return removeURL(subscribedServiceURLs, url);\r\n+    }\r\n+\r\n+    @Override\r\n+    public void publishServiceDefinition(URL providerUrl) {\r\n+        try {\r\n+            if (!ProtocolUtils.isGeneric(providerUrl.getParameter(GENERIC_KEY))) {\r\n+                String interfaceName = providerUrl.getParameter(INTERFACE_KEY);\r\n+                if (StringUtils.isNotEmpty(interfaceName)) {\r\n+                    Class interfaceClass = Class.forName(interfaceName);\r\n+                    ServiceDefinition serviceDefinition = ServiceDefinitionBuilder.build(interfaceClass);\r\n+                    Gson gson = new Gson();\r\n+                    String data = gson.toJson(serviceDefinition);\r\n+                    serviceDefinitions.put(providerUrl.getServiceKey(), data);\r\n+                    return;\r\n+                }\r\n+                logger.error(\"publishProvider interfaceName is empty . providerUrl: \" + providerUrl.toFullString());\r\n+            } else if (CONSUMER_SIDE.equalsIgnoreCase(providerUrl.getParameter(SIDE_KEY))) {\r\n+                //to avoid consumer generic invoke style error\r\n+                return;\r\n+            }\r\n+        } catch (ClassNotFoundException e) {\r\n+            //ignore error\r\n+            logger.error(\"publishProvider getServiceDescriptor error. providerUrl: \" + providerUrl.toFullString(), e);\r\n+        }\r\n+    }\r\n+\r\n+    @Override\r\n+    public String getServiceDefinition(String interfaceName, String version, String group) {\r\n+        return serviceDefinitions.get(URL.buildKey(interfaceName, group, version));\r\n+    }\r\n+\r\n+    @Override\r\n+    public String getServiceDefinition(String serviceKey) {\r\n+        return serviceDefinitions.get(serviceKey);\r\n+    }\r\n+\r\n+    @Override\r\n+    public MetadataInfo getMetadataInfo(String revision) {\r\n+        if (StringUtils.isEmpty(revision)) {\r\n+            return null;\r\n+        }\r\n+        for (Map.Entry<String, MetadataInfo> entry : metadataInfos.entrySet()) {\r\n+            MetadataInfo metadataInfo = entry.getValue();\r\n+            if (revision.equals(metadataInfo.calAndGetRevision())) {\r\n+                return metadataInfo;\r\n+            }\r\n+        }\r\n+        return null;\r\n+    }\r\n+\r\n+    public void blockUntilUpdated() {\r\n+        try {\r\n+            metadataSemaphore.acquire();\r\n+        } catch (InterruptedException e) {\r\n+            logger.warn(\"metadata refresh thread has been interrupted unexpectedly while waiting for update.\", e);\r\n+        }\r\n+    }\r\n+\r\n+    public Map<String, MetadataInfo> getMetadataInfos() {\r\n+        return metadataInfos;\r\n+    }\r\n+\r\n+    boolean addURL(Map<String, SortedSet<URL>> serviceURLs, URL url) {\r\n+        return executeMutually(() -> {\r\n+            SortedSet<URL> urls = serviceURLs.computeIfAbsent(url.getServiceKey(), this::newSortedURLs);\r\n+            // make sure the parameters of tmpUrl is variable\r\n+            return urls.add(url);\r\n+        });\r\n+    }\r\n+\r\n+    boolean removeURL(Map<String, SortedSet<URL>> serviceURLs, URL url) {\r\n+        return executeMutually(() -> {\r\n+            String key = url.getServiceKey();\r\n+            SortedSet<URL> urls = serviceURLs.getOrDefault(key, null);\r\n+            if (urls == null) {\r\n+                return true;\r\n+            }\r\n+            boolean r = urls.remove(url);\r\n+            // if it is empty\r\n+            if (urls.isEmpty()) {\r\n+                serviceURLs.remove(key);\r\n+            }\r\n+            return r;\r\n+        });\r\n+    }\r\n+\r\n+    private SortedSet<URL> newSortedURLs(String serviceKey) {\r\n+        return new TreeSet<>(InMemoryWritableMetadataService.URLComparator.INSTANCE);\r\n+    }\r\n+\r\n+    boolean executeMutually(Callable<Boolean> callable) {\r\n+        boolean success = false;\r\n+        try {\r\n+            lock.lock();\r\n+            try {\r\n+                success = callable.call();\r\n+            } catch (Exception e) {\r\n+                if (logger.isErrorEnabled()) {\r\n+                    logger.error(e);\r\n+                }\r\n+            }\r\n+        } finally {\r\n+            lock.unlock();\r\n+        }\r\n+        return success;\r\n+    }\r\n+\r\n+    private SortedSet<String> getServiceURLs(Map<String, SortedSet<URL>> exportedServiceURLs, String serviceKey,\r\n+                                             String protocol) {\r\n+\r\n+        SortedSet<URL> serviceURLs = exportedServiceURLs.get(serviceKey);\r\n+\r\n+        if (isEmpty(serviceURLs)) {\r\n+            return emptySortedSet();\r\n+        }\r\n+\r\n+        return MetadataService.toSortedStrings(serviceURLs.stream().filter(url -> isAcceptableProtocol(protocol, url)));\r\n+    }\r\n+\r\n+    private boolean isAcceptableProtocol(String protocol, URL url) {\r\n+        return protocol == null\r\n+                || protocol.equals(url.getParameter(PROTOCOL_KEY))\r\n+                || protocol.equals(url.getProtocol());\r\n+    }\r\n+\r\n+\r\n+    static class URLComparator implements Comparator<URL> {\r\n+\r\n+        public static final URLComparator INSTANCE = new URLComparator();\r\n+\r\n+        @Override\r\n+        public int compare(URL o1, URL o2) {\r\n+            return o1.toFullString().compareTo(o2.toFullString());\r\n+        }\r\n+    }\r\n+\r\n+}\r\n"}, {"source1": "org/apache/dubbo/registry/client/metadata/store/RemoteMetadataServiceImpl.java", "source2": "org/apache/dubbo/registry/client/metadata/store/RemoteMetadataServiceImpl.java", "comments": ["Line-ending differences only"], "unified_diff": "@@ -1,143 +1,143 @@\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.client.metadata.store;\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.metadata.MetadataInfo;\n-import org.apache.dubbo.metadata.WritableMetadataService;\n-import org.apache.dubbo.metadata.definition.ServiceDefinitionBuilder;\n-import org.apache.dubbo.metadata.definition.model.FullServiceDefinition;\n-import org.apache.dubbo.metadata.report.MetadataReport;\n-import org.apache.dubbo.metadata.report.MetadataReportInstance;\n-import org.apache.dubbo.metadata.report.identifier.MetadataIdentifier;\n-import org.apache.dubbo.metadata.report.identifier.SubscriberMetadataIdentifier;\n-import org.apache.dubbo.registry.client.ServiceInstance;\n-import org.apache.dubbo.registry.client.metadata.ServiceInstanceMetadataUtils;\n-import org.apache.dubbo.remoting.Constants;\n-import org.apache.dubbo.rpc.RpcException;\n-\n-import java.util.Map;\n-\n-import static org.apache.dubbo.common.constants.CommonConstants.APPLICATION_KEY;\n-import static org.apache.dubbo.common.constants.CommonConstants.CONSUMER_SIDE;\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.PID_KEY;\n-import static org.apache.dubbo.common.constants.CommonConstants.PROVIDER_SIDE;\n-import static org.apache.dubbo.common.constants.CommonConstants.SIDE_KEY;\n-import static org.apache.dubbo.common.constants.CommonConstants.TIMESTAMP_KEY;\n-import static org.apache.dubbo.common.constants.CommonConstants.VERSION_KEY;\n-import static org.apache.dubbo.common.constants.RegistryConstants.REGISTRY_CLUSTER_KEY;\n-\n-public class RemoteMetadataServiceImpl {\n-    protected final Logger logger = LoggerFactory.getLogger(getClass());\n-    private WritableMetadataService localMetadataService;\n-\n-    public RemoteMetadataServiceImpl(WritableMetadataService writableMetadataService) {\n-        this.localMetadataService = writableMetadataService;\n-    }\n-\n-    public Map<String, MetadataReport> getMetadataReports() {\n-        return MetadataReportInstance.getMetadataReports(false);\n-    }\n-\n-    public void publishMetadata(String serviceName) {\n-        Map<String, MetadataInfo> metadataInfos = localMetadataService.getMetadataInfos();\n-        metadataInfos.forEach((registryCluster, metadataInfo) -> {\n-            if (!metadataInfo.hasReported()) {\n-                SubscriberMetadataIdentifier identifier = new SubscriberMetadataIdentifier(serviceName, metadataInfo.calAndGetRevision());\n-                metadataInfo.calAndGetRevision();\n-                metadataInfo.getExtendParams().put(REGISTRY_CLUSTER_KEY, registryCluster);\n-                MetadataReport metadataReport = getMetadataReports().get(registryCluster);\n-                if (metadataReport == null) {\n-                    metadataReport = getMetadataReports().entrySet().iterator().next().getValue();\n-                }\n-                logger.info(\"Publishing metadata to \" + metadataReport.getClass().getSimpleName());\n-                if (logger.isDebugEnabled()) {\n-                    logger.debug(metadataInfo.toString());\n-                }\n-                metadataReport.publishAppMetadata(identifier, metadataInfo);\n-                metadataInfo.markReported();\n-            }\n-        });\n-    }\n-\n-    public MetadataInfo getMetadata(ServiceInstance instance) {\n-        SubscriberMetadataIdentifier identifier = new SubscriberMetadataIdentifier(instance.getServiceName(),\n-                ServiceInstanceMetadataUtils.getExportedServicesRevision(instance));\n-\n-        String registryCluster = instance.getExtendParams().get(REGISTRY_CLUSTER_KEY);\n-\n-        MetadataReport metadataReport = getMetadataReports().get(registryCluster);\n-        if (metadataReport == null) {\n-            metadataReport = getMetadataReports().entrySet().iterator().next().getValue();\n-        }\n-        return metadataReport.getAppMetadata(identifier, instance.getExtendParams());\n-    }\n-\n-    public void publishServiceDefinition(URL url) {\n-        String side = url.getParameter(SIDE_KEY);\n-        if (PROVIDER_SIDE.equalsIgnoreCase(side)) {\n-            //TODO, the params part is duplicate with that stored by exportURL(url), can be further optimized in the future.\n-            publishProvider(url);\n-        } else {\n-            //TODO, only useful for ops showing the url parameters, this is duplicate with subscribeURL(url), can be removed in the future.\n-            publishConsumer(url);\n-        }\n-    }\n-\n-    private void publishProvider(URL providerUrl) throws RpcException {\n-        //first add into the list\n-        // remove the individual param\n-        providerUrl = providerUrl.removeParameters(PID_KEY, TIMESTAMP_KEY, Constants.BIND_IP_KEY,\n-                Constants.BIND_PORT_KEY, TIMESTAMP_KEY);\n-\n-        try {\n-            String interfaceName = providerUrl.getParameter(INTERFACE_KEY);\n-            if (StringUtils.isNotEmpty(interfaceName)) {\n-                Class interfaceClass = Class.forName(interfaceName);\n-                FullServiceDefinition fullServiceDefinition = ServiceDefinitionBuilder.buildFullDefinition(interfaceClass,\n-                        providerUrl.getParameters());\n-                for (Map.Entry<String, MetadataReport> entry : getMetadataReports().entrySet()) {\n-                    MetadataReport metadataReport = entry.getValue();\n-                    metadataReport.storeProviderMetadata(new MetadataIdentifier(providerUrl.getServiceInterface(),\n-                            providerUrl.getParameter(VERSION_KEY), providerUrl.getParameter(GROUP_KEY),\n-                            PROVIDER_SIDE, providerUrl.getParameter(APPLICATION_KEY)), fullServiceDefinition);\n-                }\n-                return;\n-            }\n-            logger.error(\"publishProvider interfaceName is empty . providerUrl: \" + providerUrl.toFullString());\n-        } catch (ClassNotFoundException e) {\n-            //ignore error\n-            logger.error(\"publishProvider getServiceDescriptor error. providerUrl: \" + providerUrl.toFullString(), e);\n-        }\n-    }\n-\n-    private void publishConsumer(URL consumerURL) throws RpcException {\n-        final URL url = consumerURL.removeParameters(PID_KEY, TIMESTAMP_KEY, Constants.BIND_IP_KEY,\n-                Constants.BIND_PORT_KEY, TIMESTAMP_KEY);\n-        getMetadataReports().forEach((registryKey, config) -> {\n-            config.storeConsumerMetadata(new MetadataIdentifier(url.getServiceInterface(),\n-                    url.getParameter(VERSION_KEY), url.getParameter(GROUP_KEY), CONSUMER_SIDE,\n-                    url.getParameter(APPLICATION_KEY)), url.getParameters());\n-        });\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.client.metadata.store;\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.metadata.MetadataInfo;\r\n+import org.apache.dubbo.metadata.WritableMetadataService;\r\n+import org.apache.dubbo.metadata.definition.ServiceDefinitionBuilder;\r\n+import org.apache.dubbo.metadata.definition.model.FullServiceDefinition;\r\n+import org.apache.dubbo.metadata.report.MetadataReport;\r\n+import org.apache.dubbo.metadata.report.MetadataReportInstance;\r\n+import org.apache.dubbo.metadata.report.identifier.MetadataIdentifier;\r\n+import org.apache.dubbo.metadata.report.identifier.SubscriberMetadataIdentifier;\r\n+import org.apache.dubbo.registry.client.ServiceInstance;\r\n+import org.apache.dubbo.registry.client.metadata.ServiceInstanceMetadataUtils;\r\n+import org.apache.dubbo.remoting.Constants;\r\n+import org.apache.dubbo.rpc.RpcException;\r\n+\r\n+import java.util.Map;\r\n+\r\n+import static org.apache.dubbo.common.constants.CommonConstants.APPLICATION_KEY;\r\n+import static org.apache.dubbo.common.constants.CommonConstants.CONSUMER_SIDE;\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.PID_KEY;\r\n+import static org.apache.dubbo.common.constants.CommonConstants.PROVIDER_SIDE;\r\n+import static org.apache.dubbo.common.constants.CommonConstants.SIDE_KEY;\r\n+import static org.apache.dubbo.common.constants.CommonConstants.TIMESTAMP_KEY;\r\n+import static org.apache.dubbo.common.constants.CommonConstants.VERSION_KEY;\r\n+import static org.apache.dubbo.common.constants.RegistryConstants.REGISTRY_CLUSTER_KEY;\r\n+\r\n+public class RemoteMetadataServiceImpl {\r\n+    protected final Logger logger = LoggerFactory.getLogger(getClass());\r\n+    private WritableMetadataService localMetadataService;\r\n+\r\n+    public RemoteMetadataServiceImpl(WritableMetadataService writableMetadataService) {\r\n+        this.localMetadataService = writableMetadataService;\r\n+    }\r\n+\r\n+    public Map<String, MetadataReport> getMetadataReports() {\r\n+        return MetadataReportInstance.getMetadataReports(false);\r\n+    }\r\n+\r\n+    public void publishMetadata(String serviceName) {\r\n+        Map<String, MetadataInfo> metadataInfos = localMetadataService.getMetadataInfos();\r\n+        metadataInfos.forEach((registryCluster, metadataInfo) -> {\r\n+            if (!metadataInfo.hasReported()) {\r\n+                SubscriberMetadataIdentifier identifier = new SubscriberMetadataIdentifier(serviceName, metadataInfo.calAndGetRevision());\r\n+                metadataInfo.calAndGetRevision();\r\n+                metadataInfo.getExtendParams().put(REGISTRY_CLUSTER_KEY, registryCluster);\r\n+                MetadataReport metadataReport = getMetadataReports().get(registryCluster);\r\n+                if (metadataReport == null) {\r\n+                    metadataReport = getMetadataReports().entrySet().iterator().next().getValue();\r\n+                }\r\n+                logger.info(\"Publishing metadata to \" + metadataReport.getClass().getSimpleName());\r\n+                if (logger.isDebugEnabled()) {\r\n+                    logger.debug(metadataInfo.toString());\r\n+                }\r\n+                metadataReport.publishAppMetadata(identifier, metadataInfo);\r\n+                metadataInfo.markReported();\r\n+            }\r\n+        });\r\n+    }\r\n+\r\n+    public MetadataInfo getMetadata(ServiceInstance instance) {\r\n+        SubscriberMetadataIdentifier identifier = new SubscriberMetadataIdentifier(instance.getServiceName(),\r\n+                ServiceInstanceMetadataUtils.getExportedServicesRevision(instance));\r\n+\r\n+        String registryCluster = instance.getExtendParams().get(REGISTRY_CLUSTER_KEY);\r\n+\r\n+        MetadataReport metadataReport = getMetadataReports().get(registryCluster);\r\n+        if (metadataReport == null) {\r\n+            metadataReport = getMetadataReports().entrySet().iterator().next().getValue();\r\n+        }\r\n+        return metadataReport.getAppMetadata(identifier, instance.getExtendParams());\r\n+    }\r\n+\r\n+    public void publishServiceDefinition(URL url) {\r\n+        String side = url.getParameter(SIDE_KEY);\r\n+        if (PROVIDER_SIDE.equalsIgnoreCase(side)) {\r\n+            //TODO, the params part is duplicate with that stored by exportURL(url), can be further optimized in the future.\r\n+            publishProvider(url);\r\n+        } else {\r\n+            //TODO, only useful for ops showing the url parameters, this is duplicate with subscribeURL(url), can be removed in the future.\r\n+            publishConsumer(url);\r\n+        }\r\n+    }\r\n+\r\n+    private void publishProvider(URL providerUrl) throws RpcException {\r\n+        //first add into the list\r\n+        // remove the individual param\r\n+        providerUrl = providerUrl.removeParameters(PID_KEY, TIMESTAMP_KEY, Constants.BIND_IP_KEY,\r\n+                Constants.BIND_PORT_KEY, TIMESTAMP_KEY);\r\n+\r\n+        try {\r\n+            String interfaceName = providerUrl.getParameter(INTERFACE_KEY);\r\n+            if (StringUtils.isNotEmpty(interfaceName)) {\r\n+                Class interfaceClass = Class.forName(interfaceName);\r\n+                FullServiceDefinition fullServiceDefinition = ServiceDefinitionBuilder.buildFullDefinition(interfaceClass,\r\n+                        providerUrl.getParameters());\r\n+                for (Map.Entry<String, MetadataReport> entry : getMetadataReports().entrySet()) {\r\n+                    MetadataReport metadataReport = entry.getValue();\r\n+                    metadataReport.storeProviderMetadata(new MetadataIdentifier(providerUrl.getServiceInterface(),\r\n+                            providerUrl.getParameter(VERSION_KEY), providerUrl.getParameter(GROUP_KEY),\r\n+                            PROVIDER_SIDE, providerUrl.getParameter(APPLICATION_KEY)), fullServiceDefinition);\r\n+                }\r\n+                return;\r\n+            }\r\n+            logger.error(\"publishProvider interfaceName is empty . providerUrl: \" + providerUrl.toFullString());\r\n+        } catch (ClassNotFoundException e) {\r\n+            //ignore error\r\n+            logger.error(\"publishProvider getServiceDescriptor error. providerUrl: \" + providerUrl.toFullString(), e);\r\n+        }\r\n+    }\r\n+\r\n+    private void publishConsumer(URL consumerURL) throws RpcException {\r\n+        final URL url = consumerURL.removeParameters(PID_KEY, TIMESTAMP_KEY, Constants.BIND_IP_KEY,\r\n+                Constants.BIND_PORT_KEY, TIMESTAMP_KEY);\r\n+        getMetadataReports().forEach((registryKey, config) -> {\r\n+            config.storeConsumerMetadata(new MetadataIdentifier(url.getServiceInterface(),\r\n+                    url.getParameter(VERSION_KEY), url.getParameter(GROUP_KEY), CONSUMER_SIDE,\r\n+                    url.getParameter(APPLICATION_KEY)), url.getParameters());\r\n+        });\r\n+    }\r\n+\r\n+}\r\n"}, {"source1": "org/apache/dubbo/registry/client/migration/DefaultMigrationAddressComparator.java", "source2": "org/apache/dubbo/registry/client/migration/DefaultMigrationAddressComparator.java", "comments": ["Line-ending differences only"], "unified_diff": "@@ -1,74 +1,74 @@\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.client.migration;\n-\n-import org.apache.dubbo.common.config.ConfigurationUtils;\n-import org.apache.dubbo.common.logger.Logger;\n-import org.apache.dubbo.common.logger.LoggerFactory;\n-import org.apache.dubbo.common.utils.CollectionUtils;\n-import org.apache.dubbo.rpc.Invoker;\n-import org.apache.dubbo.rpc.cluster.ClusterInvoker;\n-\n-import java.util.List;\n-\n-public class DefaultMigrationAddressComparator implements MigrationAddressComparator {\n-    private static final Logger logger = LoggerFactory.getLogger(DefaultMigrationAddressComparator.class);\n-    private static final String MIGRATION_THRESHOLD = \"dubbo.application.migration.threshold\";\n-    private static final String DEFAULT_THRESHOLD_STRING = \"0.8\";\n-    private static final float DEFAULT_THREAD = 0.8f;\n-\n-    @Override\n-    public <T> boolean shouldMigrate(ClusterInvoker<T> serviceDiscoveryInvoker, ClusterInvoker<T> invoker) {\n-        if (!serviceDiscoveryInvoker.isAvailable()) {\n-            logger.info(\"No instance address available, will not migrate.\");\n-            return false;\n-        }\n-        if (!invoker.isAvailable()) {\n-            logger.info(\"No interface address available, will migrate.\");\n-            return true;\n-        }\n-\n-        List<Invoker<T>> invokers1 = serviceDiscoveryInvoker.getDirectory().getAllInvokers();\n-        List<Invoker<T>> invokers2 = invoker.getDirectory().getAllInvokers();\n-\n-        int newAddressSize = CollectionUtils.isNotEmpty(invokers1) ? invokers1.size() : 0;\n-        int oldAddressSize = CollectionUtils.isNotEmpty(invokers2) ? invokers2.size() : 0;\n-\n-        String rawThreshold = ConfigurationUtils.getDynamicProperty(MIGRATION_THRESHOLD, DEFAULT_THRESHOLD_STRING);\n-        float threshold;\n-        try {\n-            threshold = Float.parseFloat(rawThreshold);\n-        } catch (Exception e) {\n-            logger.error(\"Invalid migration threshold \" + rawThreshold);\n-            threshold = DEFAULT_THREAD;\n-        }\n-\n-        logger.info(\"Instance address size \" + newAddressSize + \", interface address size \" + oldAddressSize + \", threshold \" + threshold);\n-\n-        if (newAddressSize != 0 && oldAddressSize == 0) {\n-            return true;\n-        }\n-        if (newAddressSize == 0 && oldAddressSize == 0) {\n-            return false;\n-        }\n-\n-        if (((float)newAddressSize / (float)oldAddressSize) >= threshold) {\n-            return true;\n-        }\n-        return false;\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.client.migration;\r\n+\r\n+import org.apache.dubbo.common.config.ConfigurationUtils;\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.CollectionUtils;\r\n+import org.apache.dubbo.rpc.Invoker;\r\n+import org.apache.dubbo.rpc.cluster.ClusterInvoker;\r\n+\r\n+import java.util.List;\r\n+\r\n+public class DefaultMigrationAddressComparator implements MigrationAddressComparator {\r\n+    private static final Logger logger = LoggerFactory.getLogger(DefaultMigrationAddressComparator.class);\r\n+    private static final String MIGRATION_THRESHOLD = \"dubbo.application.migration.threshold\";\r\n+    private static final String DEFAULT_THRESHOLD_STRING = \"0.8\";\r\n+    private static final float DEFAULT_THREAD = 0.8f;\r\n+\r\n+    @Override\r\n+    public <T> boolean shouldMigrate(ClusterInvoker<T> serviceDiscoveryInvoker, ClusterInvoker<T> invoker) {\r\n+        if (!serviceDiscoveryInvoker.isAvailable()) {\r\n+            logger.info(\"No instance address available, will not migrate.\");\r\n+            return false;\r\n+        }\r\n+        if (!invoker.isAvailable()) {\r\n+            logger.info(\"No interface address available, will migrate.\");\r\n+            return true;\r\n+        }\r\n+\r\n+        List<Invoker<T>> invokers1 = serviceDiscoveryInvoker.getDirectory().getAllInvokers();\r\n+        List<Invoker<T>> invokers2 = invoker.getDirectory().getAllInvokers();\r\n+\r\n+        int newAddressSize = CollectionUtils.isNotEmpty(invokers1) ? invokers1.size() : 0;\r\n+        int oldAddressSize = CollectionUtils.isNotEmpty(invokers2) ? invokers2.size() : 0;\r\n+\r\n+        String rawThreshold = ConfigurationUtils.getDynamicProperty(MIGRATION_THRESHOLD, DEFAULT_THRESHOLD_STRING);\r\n+        float threshold;\r\n+        try {\r\n+            threshold = Float.parseFloat(rawThreshold);\r\n+        } catch (Exception e) {\r\n+            logger.error(\"Invalid migration threshold \" + rawThreshold);\r\n+            threshold = DEFAULT_THREAD;\r\n+        }\r\n+\r\n+        logger.info(\"Instance address size \" + newAddressSize + \", interface address size \" + oldAddressSize + \", threshold \" + threshold);\r\n+\r\n+        if (newAddressSize != 0 && oldAddressSize == 0) {\r\n+            return true;\r\n+        }\r\n+        if (newAddressSize == 0 && oldAddressSize == 0) {\r\n+            return false;\r\n+        }\r\n+\r\n+        if (((float)newAddressSize / (float)oldAddressSize) >= threshold) {\r\n+            return true;\r\n+        }\r\n+        return false;\r\n+    }\r\n+}\r\n"}, {"source1": "org/apache/dubbo/registry/client/migration/InvokersChangedListener.java", "source2": "org/apache/dubbo/registry/client/migration/InvokersChangedListener.java", "comments": ["Line-ending differences only"], "unified_diff": "@@ -1,21 +1,21 @@\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.client.migration;\n-\n-public interface InvokersChangedListener {\n-    void onChange();\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.client.migration;\r\n+\r\n+public interface InvokersChangedListener {\r\n+    void onChange();\r\n }\n"}, {"source1": "org/apache/dubbo/registry/client/migration/MigrationAddressComparator.java", "source2": "org/apache/dubbo/registry/client/migration/MigrationAddressComparator.java", "comments": ["Line-ending differences only"], "unified_diff": "@@ -1,25 +1,25 @@\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.client.migration;\n-\n-import org.apache.dubbo.common.extension.SPI;\n-import org.apache.dubbo.rpc.cluster.ClusterInvoker;\n-\n-@SPI\n-public interface MigrationAddressComparator {\n-    <T> boolean shouldMigrate(ClusterInvoker<T> serviceDiscoveryInvoker, ClusterInvoker<T> invoker);\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.client.migration;\r\n+\r\n+import org.apache.dubbo.common.extension.SPI;\r\n+import org.apache.dubbo.rpc.cluster.ClusterInvoker;\r\n+\r\n+@SPI\r\n+public interface MigrationAddressComparator {\r\n+    <T> boolean shouldMigrate(ClusterInvoker<T> serviceDiscoveryInvoker, ClusterInvoker<T> invoker);\r\n+}\r\n"}, {"source1": "org/apache/dubbo/registry/client/migration/MigrationInvoker.java", "source2": "org/apache/dubbo/registry/client/migration/MigrationInvoker.java", "comments": ["Line-ending differences only"], "unified_diff": "@@ -1,390 +1,390 @@\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.client.migration;\n-\n-import org.apache.dubbo.common.URL;\n-import org.apache.dubbo.common.constants.RegistryConstants;\n-import org.apache.dubbo.common.extension.ExtensionLoader;\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.Registry;\n-import org.apache.dubbo.registry.integration.DynamicDirectory;\n-import org.apache.dubbo.registry.integration.RegistryProtocol;\n-import org.apache.dubbo.rpc.Invocation;\n-import org.apache.dubbo.rpc.Result;\n-import org.apache.dubbo.rpc.RpcException;\n-import org.apache.dubbo.rpc.cluster.Cluster;\n-import org.apache.dubbo.rpc.cluster.ClusterInvoker;\n-import org.apache.dubbo.rpc.cluster.Directory;\n-import org.apache.dubbo.rpc.cluster.support.migration.MigrationClusterInvoker;\n-import org.apache.dubbo.rpc.cluster.support.migration.MigrationRule;\n-\n-import java.util.Set;\n-import java.util.concurrent.atomic.AtomicBoolean;\n-\n-import static org.apache.dubbo.rpc.cluster.Constants.REFER_KEY;\n-\n-public class MigrationInvoker<T> implements MigrationClusterInvoker<T> {\n-    private Logger logger = LoggerFactory.getLogger(MigrationInvoker.class);\n-\n-    private URL url;\n-    private URL consumerUrl;\n-    private Cluster cluster;\n-    private Registry registry;\n-    private Class<T> type;\n-    private RegistryProtocol registryProtocol;\n-\n-    private volatile ClusterInvoker<T> invoker;\n-    private volatile ClusterInvoker<T> serviceDiscoveryInvoker;\n-    private volatile ClusterInvoker<T> currentAvailableInvoker;\n-\n-    private MigrationRule rule;\n-\n-    private boolean migrationMultiRegistry;\n-\n-    public MigrationInvoker(RegistryProtocol registryProtocol,\n-                            Cluster cluster,\n-                            Registry registry,\n-                            Class<T> type,\n-                            URL url,\n-                            URL consumerUrl) {\n-        this(null, null, registryProtocol, cluster, registry, type, url, consumerUrl);\n-    }\n-\n-    public MigrationInvoker(ClusterInvoker<T> invoker,\n-                            ClusterInvoker<T> serviceDiscoveryInvoker,\n-                            RegistryProtocol registryProtocol,\n-                            Cluster cluster,\n-                            Registry registry,\n-                            Class<T> type,\n-                            URL url,\n-                            URL consumerUrl) {\n-        this.invoker = invoker;\n-        this.serviceDiscoveryInvoker = serviceDiscoveryInvoker;\n-        this.registryProtocol = registryProtocol;\n-        this.cluster = cluster;\n-        this.registry = registry;\n-        this.type = type;\n-        this.url = url;\n-        this.consumerUrl = consumerUrl;\n-        this.migrationMultiRegistry = url.getParameter(RegistryConstants.MIGRATION_MULTI_REGISTRY, false);\n-    }\n-\n-    public ClusterInvoker<T> getInvoker() {\n-        return invoker;\n-    }\n-\n-    public void setInvoker(ClusterInvoker<T> invoker) {\n-        this.invoker = invoker;\n-    }\n-\n-    public ClusterInvoker<T> getServiceDiscoveryInvoker() {\n-        return serviceDiscoveryInvoker;\n-    }\n-\n-    public void setServiceDiscoveryInvoker(ClusterInvoker<T> serviceDiscoveryInvoker) {\n-        this.serviceDiscoveryInvoker = serviceDiscoveryInvoker;\n-    }\n-\n-    @Override\n-    public Class<T> getInterface() {\n-        return type;\n-    }\n-\n-    @Override\n-    public synchronized void migrateToServiceDiscoveryInvoker(boolean forceMigrate) {\n-        if (!forceMigrate) {\n-            refreshServiceDiscoveryInvoker();\n-            refreshInterfaceInvoker();\n-            setListener(invoker, () -> {\n-                this.compareAddresses(serviceDiscoveryInvoker, invoker);\n-            });\n-            setListener(serviceDiscoveryInvoker, () -> {\n-                this.compareAddresses(serviceDiscoveryInvoker, invoker);\n-            });\n-        } else {\n-            refreshServiceDiscoveryInvoker();\n-            setListener(serviceDiscoveryInvoker, () -> {\n-                this.destroyInterfaceInvoker(this.invoker);\n-            });\n-        }\n-    }\n-\n-    @Override\n-    public void reRefer(URL newSubscribeUrl) {\n-        // update url to prepare for migration refresh\n-        this.url = url.addParameter(REFER_KEY, StringUtils.toQueryString(newSubscribeUrl.getParameters()));\n-\n-        // re-subscribe immediately\n-        if (invoker != null && !invoker.isDestroyed()) {\n-            doReSubscribe(invoker, newSubscribeUrl);\n-        }\n-        if (serviceDiscoveryInvoker != null && !serviceDiscoveryInvoker.isDestroyed()) {\n-            doReSubscribe(serviceDiscoveryInvoker, newSubscribeUrl);\n-        }\n-    }\n-\n-    private void doReSubscribe(ClusterInvoker<T> invoker, URL newSubscribeUrl) {\n-        DynamicDirectory<T> directory = (DynamicDirectory<T>) invoker.getDirectory();\n-        URL oldSubscribeUrl = directory.getRegisteredConsumerUrl();\n-        Registry registry = directory.getRegistry();\n-        registry.unregister(directory.getRegisteredConsumerUrl());\n-        directory.unSubscribe(RegistryProtocol.toSubscribeUrl(oldSubscribeUrl));\n-        registry.register(directory.getRegisteredConsumerUrl());\n-\n-        directory.setRegisteredConsumerUrl(newSubscribeUrl);\n-        directory.buildRouterChain(newSubscribeUrl);\n-        directory.subscribe(RegistryProtocol.toSubscribeUrl(newSubscribeUrl));\n-    }\n-\n-    @Override\n-    public synchronized void fallbackToInterfaceInvoker() {\n-        refreshInterfaceInvoker();\n-        setListener(invoker, () -> {\n-            this.destroyServiceDiscoveryInvoker(this.serviceDiscoveryInvoker);\n-        });\n-    }\n-\n-    @Override\n-    public Result invoke(Invocation invocation) throws RpcException {\n-        if (!checkInvokerAvailable(serviceDiscoveryInvoker)) {\n-            if (logger.isDebugEnabled()) {\n-                logger.debug(\"Using interface addresses to handle invocation, interface \" + type.getName() + \", total address size \" + (invoker.getDirectory().getAllInvokers() == null ? \"is null\" : invoker.getDirectory().getAllInvokers().size()));\n-            }\n-            return invoker.invoke(invocation);\n-        }\n-\n-        if (!checkInvokerAvailable(invoker)) {\n-            if (logger.isDebugEnabled()) {\n-                logger.debug(\"Using instance addresses to handle invocation, interface \" + type.getName() + \", total address size \" + (serviceDiscoveryInvoker.getDirectory().getAllInvokers() == null ? \" is null \" : serviceDiscoveryInvoker.getDirectory().getAllInvokers().size()));\n-            }\n-            return serviceDiscoveryInvoker.invoke(invocation);\n-        }\n-\n-        return currentAvailableInvoker.invoke(invocation);\n-    }\n-\n-    @Override\n-    public boolean isAvailable() {\n-        return (invoker != null && invoker.isAvailable())\n-                || (serviceDiscoveryInvoker != null && serviceDiscoveryInvoker.isAvailable());\n-    }\n-\n-    @Override\n-    public void destroy() {\n-        if (invoker != null) {\n-            invoker.destroy();\n-        }\n-        if (serviceDiscoveryInvoker != null) {\n-            serviceDiscoveryInvoker.destroy();\n-        }\n-    }\n-\n-    @Override\n-    public URL getUrl() {\n-        if (invoker != null) {\n-            return invoker.getUrl();\n-        } else if (serviceDiscoveryInvoker != null) {\n-            return serviceDiscoveryInvoker.getUrl();\n-        }\n-\n-        return consumerUrl;\n-    }\n-\n-    @Override\n-    public URL getRegistryUrl() {\n-        if (invoker != null) {\n-            return invoker.getRegistryUrl();\n-        } else if (serviceDiscoveryInvoker != null) {\n-            serviceDiscoveryInvoker.getRegistryUrl();\n-        }\n-        return url;\n-    }\n-\n-    @Override\n-    public Directory<T> getDirectory() {\n-        if (invoker != null) {\n-            return invoker.getDirectory();\n-        } else if (serviceDiscoveryInvoker != null) {\n-            return serviceDiscoveryInvoker.getDirectory();\n-        }\n-        return null;\n-    }\n-\n-    @Override\n-    public boolean isDestroyed() {\n-        return (invoker == null || invoker.isDestroyed())\n-                && (serviceDiscoveryInvoker == null || serviceDiscoveryInvoker.isDestroyed());\n-    }\n-\n-\n-    @Override\n-    public AtomicBoolean invokersChanged() {\n-        return invokersChanged;\n-    }\n-\n-    private volatile AtomicBoolean invokersChanged = new AtomicBoolean(true);\n-\n-    private synchronized void compareAddresses(ClusterInvoker<T> serviceDiscoveryInvoker, ClusterInvoker<T> invoker) {\n-        this.invokersChanged.set(true);\n-        if (logger.isDebugEnabled()) {\n-            logger.info(invoker.getDirectory().getAllInvokers() == null ? \"null\" : invoker.getDirectory().getAllInvokers().size() + \"\");\n-        }\n-\n-        Set<MigrationAddressComparator> detectors = ExtensionLoader.getExtensionLoader(MigrationAddressComparator.class).getSupportedExtensionInstances();\n-        if (detectors != null && detectors.stream().allMatch(migrationDetector -> migrationDetector.shouldMigrate(serviceDiscoveryInvoker, invoker))) {\n-            discardInterfaceInvokerAddress(invoker);\n-        } else {\n-            discardServiceDiscoveryInvokerAddress(serviceDiscoveryInvoker);\n-        }\n-    }\n-\n-    private synchronized void setAddressChanged() {\n-        this.invokersChanged.set(true);\n-    }\n-\n-    public synchronized void destroyServiceDiscoveryInvoker(ClusterInvoker<?> serviceDiscoveryInvoker) {\n-        if (checkInvokerAvailable(this.invoker)) {\n-            this.currentAvailableInvoker = this.invoker;\n-        }\n-        if (serviceDiscoveryInvoker != null) {\n-            if (logger.isDebugEnabled()) {\n-                logger.debug(\"Destroying instance address invokers, will not listen for address changes until re-subscribed, \" + type.getName());\n-            }\n-            serviceDiscoveryInvoker.destroy();\n-        }\n-    }\n-\n-    public synchronized void discardServiceDiscoveryInvokerAddress(ClusterInvoker<?> serviceDiscoveryInvoker) {\n-        if (checkInvokerAvailable(this.invoker)) {\n-            this.currentAvailableInvoker = this.invoker;\n-        }\n-        if (serviceDiscoveryInvoker != null) {\n-            if (logger.isDebugEnabled()) {\n-                logger.debug(\"Discarding instance addresses, total size \" + (null == serviceDiscoveryInvoker.getDirectory().getAllInvokers() ? \"null\" : serviceDiscoveryInvoker.getDirectory().getAllInvokers().size()));\n-            }\n-            serviceDiscoveryInvoker.getDirectory().discordAddresses();\n-        }\n-    }\n-\n-    public synchronized void refreshServiceDiscoveryInvoker() {\n-        clearListener(serviceDiscoveryInvoker);\n-        if (needRefresh(serviceDiscoveryInvoker)) {\n-            if (logger.isDebugEnabled()) {\n-                logger.debug(\"Re-subscribing instance addresses, current interface \" + type.getName());\n-            }\n-            serviceDiscoveryInvoker = registryProtocol.getServiceDiscoveryInvoker(cluster, registry, type, url);\n-\n-            if (migrationMultiRegistry) {\n-                setListener(serviceDiscoveryInvoker, () -> {\n-                    this.setAddressChanged();\n-                });\n-            }\n-        }\n-    }\n-\n-    private void clearListener(ClusterInvoker<T> invoker) {\n-        if (migrationMultiRegistry) {\n-            return;\n-        }\n-\n-        if (invoker == null) {\n-            return;\n-        }\n-        DynamicDirectory<T> directory = (DynamicDirectory<T>) invoker.getDirectory();\n-        directory.setInvokersChangedListener(null);\n-    }\n-\n-    private void setListener(ClusterInvoker<T> invoker, InvokersChangedListener listener) {\n-        if (invoker == null) {\n-            return;\n-        }\n-        DynamicDirectory<T> directory = (DynamicDirectory<T>) invoker.getDirectory();\n-        directory.setInvokersChangedListener(listener);\n-    }\n-\n-    public synchronized void refreshInterfaceInvoker() {\n-        clearListener(invoker);\n-        if (needRefresh(invoker)) {\n-            // FIXME invoker.destroy();\n-            if (logger.isDebugEnabled()) {\n-                logger.debug(\"Re-subscribing interface addresses for interface \" + type.getName());\n-            }\n-            invoker = registryProtocol.getInvoker(cluster, registry, type, url);\n-\n-            if (migrationMultiRegistry) {\n-                setListener(serviceDiscoveryInvoker, () -> {\n-                    this.setAddressChanged();\n-                });\n-            }\n-        }\n-    }\n-\n-    public synchronized void destroyInterfaceInvoker(ClusterInvoker<T> invoker) {\n-        if (checkInvokerAvailable(this.serviceDiscoveryInvoker)) {\n-            this.currentAvailableInvoker = this.serviceDiscoveryInvoker;\n-        }\n-        if (invoker != null) {\n-            if (logger.isDebugEnabled()) {\n-                logger.debug(\"Destroying interface address invokers, will not listen for address changes until re-subscribed, \" + type.getName());\n-            }\n-            invoker.destroy();\n-        }\n-    }\n-\n-    public synchronized void discardInterfaceInvokerAddress(ClusterInvoker<T> invoker) {\n-        if (this.serviceDiscoveryInvoker != null) {\n-            this.currentAvailableInvoker = this.serviceDiscoveryInvoker;\n-        }\n-        if (invoker != null) {\n-            if (logger.isDebugEnabled()) {\n-                logger.debug(\"Discarding interface addresses, total address size \" + (null == invoker.getDirectory().getAllInvokers() ? \"null\" : invoker.getDirectory().getAllInvokers().size()));\n-            }\n-            invoker.getDirectory().discordAddresses();\n-        }\n-    }\n-\n-    private boolean needRefresh(ClusterInvoker<T> invoker) {\n-        return invoker == null || invoker.isDestroyed();\n-    }\n-\n-    public boolean checkInvokerAvailable(ClusterInvoker<T> invoker) {\n-        return invoker != null && !invoker.isDestroyed() && invoker.isAvailable();\n-    }\n-\n-    @Override\n-    public boolean isServiceInvoker() {\n-        return false;\n-    }\n-\n-    @Override\n-    public MigrationRule getMigrationRule() {\n-        return rule;\n-    }\n-\n-    @Override\n-    public void setMigrationRule(MigrationRule rule) {\n-        this.rule = rule;\n-    }\n-\n-    @Override\n-    public boolean isMigrationMultiRegistry() {\n-        return migrationMultiRegistry;\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.client.migration;\r\n+\r\n+import org.apache.dubbo.common.URL;\r\n+import org.apache.dubbo.common.constants.RegistryConstants;\r\n+import org.apache.dubbo.common.extension.ExtensionLoader;\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.Registry;\r\n+import org.apache.dubbo.registry.integration.DynamicDirectory;\r\n+import org.apache.dubbo.registry.integration.RegistryProtocol;\r\n+import org.apache.dubbo.rpc.Invocation;\r\n+import org.apache.dubbo.rpc.Result;\r\n+import org.apache.dubbo.rpc.RpcException;\r\n+import org.apache.dubbo.rpc.cluster.Cluster;\r\n+import org.apache.dubbo.rpc.cluster.ClusterInvoker;\r\n+import org.apache.dubbo.rpc.cluster.Directory;\r\n+import org.apache.dubbo.rpc.cluster.support.migration.MigrationClusterInvoker;\r\n+import org.apache.dubbo.rpc.cluster.support.migration.MigrationRule;\r\n+\r\n+import java.util.Set;\r\n+import java.util.concurrent.atomic.AtomicBoolean;\r\n+\r\n+import static org.apache.dubbo.rpc.cluster.Constants.REFER_KEY;\r\n+\r\n+public class MigrationInvoker<T> implements MigrationClusterInvoker<T> {\r\n+    private Logger logger = LoggerFactory.getLogger(MigrationInvoker.class);\r\n+\r\n+    private URL url;\r\n+    private URL consumerUrl;\r\n+    private Cluster cluster;\r\n+    private Registry registry;\r\n+    private Class<T> type;\r\n+    private RegistryProtocol registryProtocol;\r\n+\r\n+    private volatile ClusterInvoker<T> invoker;\r\n+    private volatile ClusterInvoker<T> serviceDiscoveryInvoker;\r\n+    private volatile ClusterInvoker<T> currentAvailableInvoker;\r\n+\r\n+    private MigrationRule rule;\r\n+\r\n+    private boolean migrationMultiRegistry;\r\n+\r\n+    public MigrationInvoker(RegistryProtocol registryProtocol,\r\n+                            Cluster cluster,\r\n+                            Registry registry,\r\n+                            Class<T> type,\r\n+                            URL url,\r\n+                            URL consumerUrl) {\r\n+        this(null, null, registryProtocol, cluster, registry, type, url, consumerUrl);\r\n+    }\r\n+\r\n+    public MigrationInvoker(ClusterInvoker<T> invoker,\r\n+                            ClusterInvoker<T> serviceDiscoveryInvoker,\r\n+                            RegistryProtocol registryProtocol,\r\n+                            Cluster cluster,\r\n+                            Registry registry,\r\n+                            Class<T> type,\r\n+                            URL url,\r\n+                            URL consumerUrl) {\r\n+        this.invoker = invoker;\r\n+        this.serviceDiscoveryInvoker = serviceDiscoveryInvoker;\r\n+        this.registryProtocol = registryProtocol;\r\n+        this.cluster = cluster;\r\n+        this.registry = registry;\r\n+        this.type = type;\r\n+        this.url = url;\r\n+        this.consumerUrl = consumerUrl;\r\n+        this.migrationMultiRegistry = url.getParameter(RegistryConstants.MIGRATION_MULTI_REGISTRY, false);\r\n+    }\r\n+\r\n+    public ClusterInvoker<T> getInvoker() {\r\n+        return invoker;\r\n+    }\r\n+\r\n+    public void setInvoker(ClusterInvoker<T> invoker) {\r\n+        this.invoker = invoker;\r\n+    }\r\n+\r\n+    public ClusterInvoker<T> getServiceDiscoveryInvoker() {\r\n+        return serviceDiscoveryInvoker;\r\n+    }\r\n+\r\n+    public void setServiceDiscoveryInvoker(ClusterInvoker<T> serviceDiscoveryInvoker) {\r\n+        this.serviceDiscoveryInvoker = serviceDiscoveryInvoker;\r\n+    }\r\n+\r\n+    @Override\r\n+    public Class<T> getInterface() {\r\n+        return type;\r\n+    }\r\n+\r\n+    @Override\r\n+    public synchronized void migrateToServiceDiscoveryInvoker(boolean forceMigrate) {\r\n+        if (!forceMigrate) {\r\n+            refreshServiceDiscoveryInvoker();\r\n+            refreshInterfaceInvoker();\r\n+            setListener(invoker, () -> {\r\n+                this.compareAddresses(serviceDiscoveryInvoker, invoker);\r\n+            });\r\n+            setListener(serviceDiscoveryInvoker, () -> {\r\n+                this.compareAddresses(serviceDiscoveryInvoker, invoker);\r\n+            });\r\n+        } else {\r\n+            refreshServiceDiscoveryInvoker();\r\n+            setListener(serviceDiscoveryInvoker, () -> {\r\n+                this.destroyInterfaceInvoker(this.invoker);\r\n+            });\r\n+        }\r\n+    }\r\n+\r\n+    @Override\r\n+    public void reRefer(URL newSubscribeUrl) {\r\n+        // update url to prepare for migration refresh\r\n+        this.url = url.addParameter(REFER_KEY, StringUtils.toQueryString(newSubscribeUrl.getParameters()));\r\n+\r\n+        // re-subscribe immediately\r\n+        if (invoker != null && !invoker.isDestroyed()) {\r\n+            doReSubscribe(invoker, newSubscribeUrl);\r\n+        }\r\n+        if (serviceDiscoveryInvoker != null && !serviceDiscoveryInvoker.isDestroyed()) {\r\n+            doReSubscribe(serviceDiscoveryInvoker, newSubscribeUrl);\r\n+        }\r\n+    }\r\n+\r\n+    private void doReSubscribe(ClusterInvoker<T> invoker, URL newSubscribeUrl) {\r\n+        DynamicDirectory<T> directory = (DynamicDirectory<T>) invoker.getDirectory();\r\n+        URL oldSubscribeUrl = directory.getRegisteredConsumerUrl();\r\n+        Registry registry = directory.getRegistry();\r\n+        registry.unregister(directory.getRegisteredConsumerUrl());\r\n+        directory.unSubscribe(RegistryProtocol.toSubscribeUrl(oldSubscribeUrl));\r\n+        registry.register(directory.getRegisteredConsumerUrl());\r\n+\r\n+        directory.setRegisteredConsumerUrl(newSubscribeUrl);\r\n+        directory.buildRouterChain(newSubscribeUrl);\r\n+        directory.subscribe(RegistryProtocol.toSubscribeUrl(newSubscribeUrl));\r\n+    }\r\n+\r\n+    @Override\r\n+    public synchronized void fallbackToInterfaceInvoker() {\r\n+        refreshInterfaceInvoker();\r\n+        setListener(invoker, () -> {\r\n+            this.destroyServiceDiscoveryInvoker(this.serviceDiscoveryInvoker);\r\n+        });\r\n+    }\r\n+\r\n+    @Override\r\n+    public Result invoke(Invocation invocation) throws RpcException {\r\n+        if (!checkInvokerAvailable(serviceDiscoveryInvoker)) {\r\n+            if (logger.isDebugEnabled()) {\r\n+                logger.debug(\"Using interface addresses to handle invocation, interface \" + type.getName() + \", total address size \" + (invoker.getDirectory().getAllInvokers() == null ? \"is null\" : invoker.getDirectory().getAllInvokers().size()));\r\n+            }\r\n+            return invoker.invoke(invocation);\r\n+        }\r\n+\r\n+        if (!checkInvokerAvailable(invoker)) {\r\n+            if (logger.isDebugEnabled()) {\r\n+                logger.debug(\"Using instance addresses to handle invocation, interface \" + type.getName() + \", total address size \" + (serviceDiscoveryInvoker.getDirectory().getAllInvokers() == null ? \" is null \" : serviceDiscoveryInvoker.getDirectory().getAllInvokers().size()));\r\n+            }\r\n+            return serviceDiscoveryInvoker.invoke(invocation);\r\n+        }\r\n+\r\n+        return currentAvailableInvoker.invoke(invocation);\r\n+    }\r\n+\r\n+    @Override\r\n+    public boolean isAvailable() {\r\n+        return (invoker != null && invoker.isAvailable())\r\n+                || (serviceDiscoveryInvoker != null && serviceDiscoveryInvoker.isAvailable());\r\n+    }\r\n+\r\n+    @Override\r\n+    public void destroy() {\r\n+        if (invoker != null) {\r\n+            invoker.destroy();\r\n+        }\r\n+        if (serviceDiscoveryInvoker != null) {\r\n+            serviceDiscoveryInvoker.destroy();\r\n+        }\r\n+    }\r\n+\r\n+    @Override\r\n+    public URL getUrl() {\r\n+        if (invoker != null) {\r\n+            return invoker.getUrl();\r\n+        } else if (serviceDiscoveryInvoker != null) {\r\n+            return serviceDiscoveryInvoker.getUrl();\r\n+        }\r\n+\r\n+        return consumerUrl;\r\n+    }\r\n+\r\n+    @Override\r\n+    public URL getRegistryUrl() {\r\n+        if (invoker != null) {\r\n+            return invoker.getRegistryUrl();\r\n+        } else if (serviceDiscoveryInvoker != null) {\r\n+            serviceDiscoveryInvoker.getRegistryUrl();\r\n+        }\r\n+        return url;\r\n+    }\r\n+\r\n+    @Override\r\n+    public Directory<T> getDirectory() {\r\n+        if (invoker != null) {\r\n+            return invoker.getDirectory();\r\n+        } else if (serviceDiscoveryInvoker != null) {\r\n+            return serviceDiscoveryInvoker.getDirectory();\r\n+        }\r\n+        return null;\r\n+    }\r\n+\r\n+    @Override\r\n+    public boolean isDestroyed() {\r\n+        return (invoker == null || invoker.isDestroyed())\r\n+                && (serviceDiscoveryInvoker == null || serviceDiscoveryInvoker.isDestroyed());\r\n+    }\r\n+\r\n+\r\n+    @Override\r\n+    public AtomicBoolean invokersChanged() {\r\n+        return invokersChanged;\r\n+    }\r\n+\r\n+    private volatile AtomicBoolean invokersChanged = new AtomicBoolean(true);\r\n+\r\n+    private synchronized void compareAddresses(ClusterInvoker<T> serviceDiscoveryInvoker, ClusterInvoker<T> invoker) {\r\n+        this.invokersChanged.set(true);\r\n+        if (logger.isDebugEnabled()) {\r\n+            logger.info(invoker.getDirectory().getAllInvokers() == null ? \"null\" : invoker.getDirectory().getAllInvokers().size() + \"\");\r\n+        }\r\n+\r\n+        Set<MigrationAddressComparator> detectors = ExtensionLoader.getExtensionLoader(MigrationAddressComparator.class).getSupportedExtensionInstances();\r\n+        if (detectors != null && detectors.stream().allMatch(migrationDetector -> migrationDetector.shouldMigrate(serviceDiscoveryInvoker, invoker))) {\r\n+            discardInterfaceInvokerAddress(invoker);\r\n+        } else {\r\n+            discardServiceDiscoveryInvokerAddress(serviceDiscoveryInvoker);\r\n+        }\r\n+    }\r\n+\r\n+    private synchronized void setAddressChanged() {\r\n+        this.invokersChanged.set(true);\r\n+    }\r\n+\r\n+    public synchronized void destroyServiceDiscoveryInvoker(ClusterInvoker<?> serviceDiscoveryInvoker) {\r\n+        if (checkInvokerAvailable(this.invoker)) {\r\n+            this.currentAvailableInvoker = this.invoker;\r\n+        }\r\n+        if (serviceDiscoveryInvoker != null) {\r\n+            if (logger.isDebugEnabled()) {\r\n+                logger.debug(\"Destroying instance address invokers, will not listen for address changes until re-subscribed, \" + type.getName());\r\n+            }\r\n+            serviceDiscoveryInvoker.destroy();\r\n+        }\r\n+    }\r\n+\r\n+    public synchronized void discardServiceDiscoveryInvokerAddress(ClusterInvoker<?> serviceDiscoveryInvoker) {\r\n+        if (checkInvokerAvailable(this.invoker)) {\r\n+            this.currentAvailableInvoker = this.invoker;\r\n+        }\r\n+        if (serviceDiscoveryInvoker != null) {\r\n+            if (logger.isDebugEnabled()) {\r\n+                logger.debug(\"Discarding instance addresses, total size \" + (null == serviceDiscoveryInvoker.getDirectory().getAllInvokers() ? \"null\" : serviceDiscoveryInvoker.getDirectory().getAllInvokers().size()));\r\n+            }\r\n+            serviceDiscoveryInvoker.getDirectory().discordAddresses();\r\n+        }\r\n+    }\r\n+\r\n+    public synchronized void refreshServiceDiscoveryInvoker() {\r\n+        clearListener(serviceDiscoveryInvoker);\r\n+        if (needRefresh(serviceDiscoveryInvoker)) {\r\n+            if (logger.isDebugEnabled()) {\r\n+                logger.debug(\"Re-subscribing instance addresses, current interface \" + type.getName());\r\n+            }\r\n+            serviceDiscoveryInvoker = registryProtocol.getServiceDiscoveryInvoker(cluster, registry, type, url);\r\n+\r\n+            if (migrationMultiRegistry) {\r\n+                setListener(serviceDiscoveryInvoker, () -> {\r\n+                    this.setAddressChanged();\r\n+                });\r\n+            }\r\n+        }\r\n+    }\r\n+\r\n+    private void clearListener(ClusterInvoker<T> invoker) {\r\n+        if (migrationMultiRegistry) {\r\n+            return;\r\n+        }\r\n+\r\n+        if (invoker == null) {\r\n+            return;\r\n+        }\r\n+        DynamicDirectory<T> directory = (DynamicDirectory<T>) invoker.getDirectory();\r\n+        directory.setInvokersChangedListener(null);\r\n+    }\r\n+\r\n+    private void setListener(ClusterInvoker<T> invoker, InvokersChangedListener listener) {\r\n+        if (invoker == null) {\r\n+            return;\r\n+        }\r\n+        DynamicDirectory<T> directory = (DynamicDirectory<T>) invoker.getDirectory();\r\n+        directory.setInvokersChangedListener(listener);\r\n+    }\r\n+\r\n+    public synchronized void refreshInterfaceInvoker() {\r\n+        clearListener(invoker);\r\n+        if (needRefresh(invoker)) {\r\n+            // FIXME invoker.destroy();\r\n+            if (logger.isDebugEnabled()) {\r\n+                logger.debug(\"Re-subscribing interface addresses for interface \" + type.getName());\r\n+            }\r\n+            invoker = registryProtocol.getInvoker(cluster, registry, type, url);\r\n+\r\n+            if (migrationMultiRegistry) {\r\n+                setListener(serviceDiscoveryInvoker, () -> {\r\n+                    this.setAddressChanged();\r\n+                });\r\n+            }\r\n+        }\r\n+    }\r\n+\r\n+    public synchronized void destroyInterfaceInvoker(ClusterInvoker<T> invoker) {\r\n+        if (checkInvokerAvailable(this.serviceDiscoveryInvoker)) {\r\n+            this.currentAvailableInvoker = this.serviceDiscoveryInvoker;\r\n+        }\r\n+        if (invoker != null) {\r\n+            if (logger.isDebugEnabled()) {\r\n+                logger.debug(\"Destroying interface address invokers, will not listen for address changes until re-subscribed, \" + type.getName());\r\n+            }\r\n+            invoker.destroy();\r\n+        }\r\n+    }\r\n+\r\n+    public synchronized void discardInterfaceInvokerAddress(ClusterInvoker<T> invoker) {\r\n+        if (this.serviceDiscoveryInvoker != null) {\r\n+            this.currentAvailableInvoker = this.serviceDiscoveryInvoker;\r\n+        }\r\n+        if (invoker != null) {\r\n+            if (logger.isDebugEnabled()) {\r\n+                logger.debug(\"Discarding interface addresses, total address size \" + (null == invoker.getDirectory().getAllInvokers() ? \"null\" : invoker.getDirectory().getAllInvokers().size()));\r\n+            }\r\n+            invoker.getDirectory().discordAddresses();\r\n+        }\r\n+    }\r\n+\r\n+    private boolean needRefresh(ClusterInvoker<T> invoker) {\r\n+        return invoker == null || invoker.isDestroyed();\r\n+    }\r\n+\r\n+    public boolean checkInvokerAvailable(ClusterInvoker<T> invoker) {\r\n+        return invoker != null && !invoker.isDestroyed() && invoker.isAvailable();\r\n+    }\r\n+\r\n+    @Override\r\n+    public boolean isServiceInvoker() {\r\n+        return false;\r\n+    }\r\n+\r\n+    @Override\r\n+    public MigrationRule getMigrationRule() {\r\n+        return rule;\r\n+    }\r\n+\r\n+    @Override\r\n+    public void setMigrationRule(MigrationRule rule) {\r\n+        this.rule = rule;\r\n+    }\r\n+\r\n+    @Override\r\n+    public boolean isMigrationMultiRegistry() {\r\n+        return migrationMultiRegistry;\r\n+    }\r\n+\r\n+}\r\n"}, {"source1": "org/apache/dubbo/registry/client/migration/MigrationRuleHandler.java", "source2": "org/apache/dubbo/registry/client/migration/MigrationRuleHandler.java", "comments": ["Line-ending differences only"], "unified_diff": "@@ -1,71 +1,71 @@\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.client.migration;\n-\n-import org.apache.dubbo.common.extension.Activate;\n-import org.apache.dubbo.common.logger.Logger;\n-import org.apache.dubbo.common.logger.LoggerFactory;\n-import org.apache.dubbo.rpc.cluster.support.migration.MigrationRule;\n-import org.apache.dubbo.rpc.cluster.support.migration.MigrationStep;\n-\n-@Activate\n-public class MigrationRuleHandler<T> {\n-    private static final Logger logger = LoggerFactory.getLogger(MigrationRuleHandler.class);\n-\n-    private MigrationInvoker<T> migrationInvoker;\n-\n-    public MigrationRuleHandler(MigrationInvoker<T> invoker) {\n-        this.migrationInvoker = invoker;\n-    }\n-\n-    private MigrationStep currentStep;\n-\n-    public void doMigrate(String rawRule) {\n-        MigrationRule rule = MigrationRule.parse(rawRule);\n-\n-        if (null != currentStep && currentStep.equals(rule.getStep())) {\n-            if (logger.isInfoEnabled()) {\n-                logger.info(\"Migration step is not change. rule.getStep is \" + currentStep.name());\n-            }\n-            return;\n-        } else {\n-            currentStep = rule.getStep();\n-        }\n-\n-        migrationInvoker.setMigrationRule(rule);\n-\n-        if (migrationInvoker.isMigrationMultiRegistry()) {\n-            if (migrationInvoker.isServiceInvoker()) {\n-                migrationInvoker.refreshServiceDiscoveryInvoker();\n-            } else {\n-                migrationInvoker.refreshInterfaceInvoker();\n-            }\n-        } else {\n-            switch (rule.getStep()) {\n-                case APPLICATION_FIRST:\n-                    migrationInvoker.migrateToServiceDiscoveryInvoker(false);\n-                    break;\n-                case FORCE_APPLICATION:\n-                    migrationInvoker.migrateToServiceDiscoveryInvoker(true);\n-                    break;\n-                case FORCE_INTERFACE:\n-                default:\n-                    migrationInvoker.fallbackToInterfaceInvoker();\n-            }\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.client.migration;\r\n+\r\n+import org.apache.dubbo.common.extension.Activate;\r\n+import org.apache.dubbo.common.logger.Logger;\r\n+import org.apache.dubbo.common.logger.LoggerFactory;\r\n+import org.apache.dubbo.rpc.cluster.support.migration.MigrationRule;\r\n+import org.apache.dubbo.rpc.cluster.support.migration.MigrationStep;\r\n+\r\n+@Activate\r\n+public class MigrationRuleHandler<T> {\r\n+    private static final Logger logger = LoggerFactory.getLogger(MigrationRuleHandler.class);\r\n+\r\n+    private MigrationInvoker<T> migrationInvoker;\r\n+\r\n+    public MigrationRuleHandler(MigrationInvoker<T> invoker) {\r\n+        this.migrationInvoker = invoker;\r\n+    }\r\n+\r\n+    private MigrationStep currentStep;\r\n+\r\n+    public void doMigrate(String rawRule) {\r\n+        MigrationRule rule = MigrationRule.parse(rawRule);\r\n+\r\n+        if (null != currentStep && currentStep.equals(rule.getStep())) {\r\n+            if (logger.isInfoEnabled()) {\r\n+                logger.info(\"Migration step is not change. rule.getStep is \" + currentStep.name());\r\n+            }\r\n+            return;\r\n+        } else {\r\n+            currentStep = rule.getStep();\r\n+        }\r\n+\r\n+        migrationInvoker.setMigrationRule(rule);\r\n+\r\n+        if (migrationInvoker.isMigrationMultiRegistry()) {\r\n+            if (migrationInvoker.isServiceInvoker()) {\r\n+                migrationInvoker.refreshServiceDiscoveryInvoker();\r\n+            } else {\r\n+                migrationInvoker.refreshInterfaceInvoker();\r\n+            }\r\n+        } else {\r\n+            switch (rule.getStep()) {\r\n+                case APPLICATION_FIRST:\r\n+                    migrationInvoker.migrateToServiceDiscoveryInvoker(false);\r\n+                    break;\r\n+                case FORCE_APPLICATION:\r\n+                    migrationInvoker.migrateToServiceDiscoveryInvoker(true);\r\n+                    break;\r\n+                case FORCE_INTERFACE:\r\n+                default:\r\n+                    migrationInvoker.fallbackToInterfaceInvoker();\r\n+            }\r\n+        }\r\n+    }\r\n+}\r\n"}, {"source1": "org/apache/dubbo/registry/client/migration/MigrationRuleListener.java", "source2": "org/apache/dubbo/registry/client/migration/MigrationRuleListener.java", "comments": ["Line-ending differences only"], "unified_diff": "@@ -1,112 +1,112 @@\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.client.migration;\n-\n-import org.apache.dubbo.common.URL;\n-import org.apache.dubbo.common.config.configcenter.ConfigChangedEvent;\n-import org.apache.dubbo.common.config.configcenter.ConfigurationListener;\n-import org.apache.dubbo.common.config.configcenter.DynamicConfiguration;\n-import org.apache.dubbo.common.extension.Activate;\n-import org.apache.dubbo.common.logger.Logger;\n-import org.apache.dubbo.common.logger.LoggerFactory;\n-import org.apache.dubbo.common.utils.CollectionUtils;\n-import org.apache.dubbo.common.utils.ConcurrentHashSet;\n-import org.apache.dubbo.common.utils.StringUtils;\n-import org.apache.dubbo.registry.integration.RegistryProtocol;\n-import org.apache.dubbo.registry.integration.RegistryProtocolListener;\n-import org.apache.dubbo.rpc.Exporter;\n-import org.apache.dubbo.rpc.cluster.ClusterInvoker;\n-import org.apache.dubbo.rpc.cluster.support.migration.MigrationRule;\n-import org.apache.dubbo.rpc.model.ApplicationModel;\n-\n-import java.util.Optional;\n-import java.util.Set;\n-\n-import static org.apache.dubbo.common.constants.RegistryConstants.INIT;\n-\n-@Activate\n-public class MigrationRuleListener implements RegistryProtocolListener, ConfigurationListener {\n-    private static final Logger logger = LoggerFactory.getLogger(MigrationRuleListener.class);\n-\n-    private Set<MigrationRuleHandler> listeners = new ConcurrentHashSet<>();\n-    private DynamicConfiguration configuration;\n-\n-    private volatile String rawRule;\n-\n-    public MigrationRuleListener() {\n-        Optional<DynamicConfiguration> optional =  ApplicationModel.getEnvironment().getDynamicConfiguration();\n-\n-        if (optional.isPresent()) {\n-            this.configuration = optional.get();\n-\n-            logger.info(\"Listening for migration rules on dataId-\" + MigrationRule.RULE_KEY + \" group-\" + MigrationRule.DUBBO_SERVICEDISCOVERY_MIGRATION_GROUP);\n-            configuration.addListener(MigrationRule.RULE_KEY, MigrationRule.DUBBO_SERVICEDISCOVERY_MIGRATION_GROUP, this);\n-\n-            rawRule = configuration.getConfig(MigrationRule.RULE_KEY, MigrationRule.DUBBO_SERVICEDISCOVERY_MIGRATION_GROUP);\n-            if (StringUtils.isEmpty(rawRule)) {\n-                rawRule = INIT;\n-            }\n-\n-        } else {\n-            if (logger.isWarnEnabled()) {\n-                logger.warn(\"config center is not configured!\");\n-            }\n-\n-            rawRule = INIT;\n-        }\n-\n-        process(new ConfigChangedEvent(MigrationRule.RULE_KEY, MigrationRule.DUBBO_SERVICEDISCOVERY_MIGRATION_GROUP, rawRule));\n-    }\n-\n-    @Override\n-    public synchronized void process(ConfigChangedEvent event) {\n-        rawRule = event.getContent();\n-        if (StringUtils.isEmpty(rawRule)) {\n-            logger.warn(\"Received empty migration rule, will ignore.\");\n-            return;\n-        }\n-\n-        logger.info(\"Using the following migration rule to migrate:\");\n-        logger.info(rawRule);\n-\n-        if (CollectionUtils.isNotEmpty(listeners)) {\n-            listeners.forEach(listener -> listener.doMigrate(rawRule));\n-        }\n-    }\n-\n-    @Override\n-    public synchronized void onExport(RegistryProtocol registryProtocol, Exporter<?> exporter) {\n-\n-    }\n-\n-    @Override\n-    public synchronized  void onRefer(RegistryProtocol registryProtocol, ClusterInvoker<?> invoker, URL url) {\n-        MigrationInvoker<?> migrationInvoker = (MigrationInvoker<?>) invoker;\n-\n-        MigrationRuleHandler<?> migrationListener = new MigrationRuleHandler<>(migrationInvoker);\n-        listeners.add(migrationListener);\n-\n-        migrationListener.doMigrate(rawRule);\n-    }\n-\n-    @Override\n-    public void onDestroy() {\n-        if (null != configuration) {\n-            configuration.removeListener(MigrationRule.RULE_KEY, this);\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.client.migration;\r\n+\r\n+import org.apache.dubbo.common.URL;\r\n+import org.apache.dubbo.common.config.configcenter.ConfigChangedEvent;\r\n+import org.apache.dubbo.common.config.configcenter.ConfigurationListener;\r\n+import org.apache.dubbo.common.config.configcenter.DynamicConfiguration;\r\n+import org.apache.dubbo.common.extension.Activate;\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.CollectionUtils;\r\n+import org.apache.dubbo.common.utils.ConcurrentHashSet;\r\n+import org.apache.dubbo.common.utils.StringUtils;\r\n+import org.apache.dubbo.registry.integration.RegistryProtocol;\r\n+import org.apache.dubbo.registry.integration.RegistryProtocolListener;\r\n+import org.apache.dubbo.rpc.Exporter;\r\n+import org.apache.dubbo.rpc.cluster.ClusterInvoker;\r\n+import org.apache.dubbo.rpc.cluster.support.migration.MigrationRule;\r\n+import org.apache.dubbo.rpc.model.ApplicationModel;\r\n+\r\n+import java.util.Optional;\r\n+import java.util.Set;\r\n+\r\n+import static org.apache.dubbo.common.constants.RegistryConstants.INIT;\r\n+\r\n+@Activate\r\n+public class MigrationRuleListener implements RegistryProtocolListener, ConfigurationListener {\r\n+    private static final Logger logger = LoggerFactory.getLogger(MigrationRuleListener.class);\r\n+\r\n+    private Set<MigrationRuleHandler> listeners = new ConcurrentHashSet<>();\r\n+    private DynamicConfiguration configuration;\r\n+\r\n+    private volatile String rawRule;\r\n+\r\n+    public MigrationRuleListener() {\r\n+        Optional<DynamicConfiguration> optional =  ApplicationModel.getEnvironment().getDynamicConfiguration();\r\n+\r\n+        if (optional.isPresent()) {\r\n+            this.configuration = optional.get();\r\n+\r\n+            logger.info(\"Listening for migration rules on dataId-\" + MigrationRule.RULE_KEY + \" group-\" + MigrationRule.DUBBO_SERVICEDISCOVERY_MIGRATION_GROUP);\r\n+            configuration.addListener(MigrationRule.RULE_KEY, MigrationRule.DUBBO_SERVICEDISCOVERY_MIGRATION_GROUP, this);\r\n+\r\n+            rawRule = configuration.getConfig(MigrationRule.RULE_KEY, MigrationRule.DUBBO_SERVICEDISCOVERY_MIGRATION_GROUP);\r\n+            if (StringUtils.isEmpty(rawRule)) {\r\n+                rawRule = INIT;\r\n+            }\r\n+\r\n+        } else {\r\n+            if (logger.isWarnEnabled()) {\r\n+                logger.warn(\"config center is not configured!\");\r\n+            }\r\n+\r\n+            rawRule = INIT;\r\n+        }\r\n+\r\n+        process(new ConfigChangedEvent(MigrationRule.RULE_KEY, MigrationRule.DUBBO_SERVICEDISCOVERY_MIGRATION_GROUP, rawRule));\r\n+    }\r\n+\r\n+    @Override\r\n+    public synchronized void process(ConfigChangedEvent event) {\r\n+        rawRule = event.getContent();\r\n+        if (StringUtils.isEmpty(rawRule)) {\r\n+            logger.warn(\"Received empty migration rule, will ignore.\");\r\n+            return;\r\n+        }\r\n+\r\n+        logger.info(\"Using the following migration rule to migrate:\");\r\n+        logger.info(rawRule);\r\n+\r\n+        if (CollectionUtils.isNotEmpty(listeners)) {\r\n+            listeners.forEach(listener -> listener.doMigrate(rawRule));\r\n+        }\r\n+    }\r\n+\r\n+    @Override\r\n+    public synchronized void onExport(RegistryProtocol registryProtocol, Exporter<?> exporter) {\r\n+\r\n+    }\r\n+\r\n+    @Override\r\n+    public synchronized  void onRefer(RegistryProtocol registryProtocol, ClusterInvoker<?> invoker, URL url) {\r\n+        MigrationInvoker<?> migrationInvoker = (MigrationInvoker<?>) invoker;\r\n+\r\n+        MigrationRuleHandler<?> migrationListener = new MigrationRuleHandler<>(migrationInvoker);\r\n+        listeners.add(migrationListener);\r\n+\r\n+        migrationListener.doMigrate(rawRule);\r\n+    }\r\n+\r\n+    @Override\r\n+    public void onDestroy() {\r\n+        if (null != configuration) {\r\n+            configuration.removeListener(MigrationRule.RULE_KEY, this);\r\n+        }\r\n+    }\r\n+}\r\n"}, {"source1": "org/apache/dubbo/registry/client/migration/ServiceDiscoveryMigrationInvoker.java", "source2": "org/apache/dubbo/registry/client/migration/ServiceDiscoveryMigrationInvoker.java", "comments": ["Line-ending differences only"], "unified_diff": "@@ -1,61 +1,61 @@\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.client.migration;\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.registry.Registry;\n-import org.apache.dubbo.registry.integration.RegistryProtocol;\n-import org.apache.dubbo.rpc.Invocation;\n-import org.apache.dubbo.rpc.Result;\n-import org.apache.dubbo.rpc.RpcException;\n-import org.apache.dubbo.rpc.cluster.Cluster;\n-import org.apache.dubbo.rpc.cluster.ClusterInvoker;\n-\n-public class ServiceDiscoveryMigrationInvoker<T> extends MigrationInvoker<T> {\n-    private static final Logger logger = LoggerFactory.getLogger(ServiceDiscoveryMigrationInvoker.class);\n-\n-    public ServiceDiscoveryMigrationInvoker(RegistryProtocol registryProtocol, Cluster cluster, Registry registry, Class<T> type, URL url, URL consumerUrl) {\n-        super(registryProtocol, cluster, registry, type, url, consumerUrl);\n-    }\n-\n-    @Override\n-    public boolean isServiceInvoker() {\n-        return true;\n-    }\n-\n-    @Override\n-    public synchronized void fallbackToInterfaceInvoker() {\n-        logger.error(\"Service discovery registry type does not support discovery of interface level addresses, \" + getRegistryUrl());\n-        migrateToServiceDiscoveryInvoker(true);\n-    }\n-\n-    @Override\n-    public synchronized void migrateToServiceDiscoveryInvoker(boolean forceMigrate) {\n-        refreshServiceDiscoveryInvoker();\n-    }\n-\n-    @Override\n-    public Result invoke(Invocation invocation) throws RpcException {\n-        ClusterInvoker<T> invoker = getServiceDiscoveryInvoker();\n-        if (invoker == null) {\n-            throw new IllegalStateException(\"There's no service discovery invoker available for service \" + invocation.getServiceName());\n-        }\n-        return invoker.invoke(invocation);\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.client.migration;\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.registry.Registry;\r\n+import org.apache.dubbo.registry.integration.RegistryProtocol;\r\n+import org.apache.dubbo.rpc.Invocation;\r\n+import org.apache.dubbo.rpc.Result;\r\n+import org.apache.dubbo.rpc.RpcException;\r\n+import org.apache.dubbo.rpc.cluster.Cluster;\r\n+import org.apache.dubbo.rpc.cluster.ClusterInvoker;\r\n+\r\n+public class ServiceDiscoveryMigrationInvoker<T> extends MigrationInvoker<T> {\r\n+    private static final Logger logger = LoggerFactory.getLogger(ServiceDiscoveryMigrationInvoker.class);\r\n+\r\n+    public ServiceDiscoveryMigrationInvoker(RegistryProtocol registryProtocol, Cluster cluster, Registry registry, Class<T> type, URL url, URL consumerUrl) {\r\n+        super(registryProtocol, cluster, registry, type, url, consumerUrl);\r\n+    }\r\n+\r\n+    @Override\r\n+    public boolean isServiceInvoker() {\r\n+        return true;\r\n+    }\r\n+\r\n+    @Override\r\n+    public synchronized void fallbackToInterfaceInvoker() {\r\n+        logger.error(\"Service discovery registry type does not support discovery of interface level addresses, \" + getRegistryUrl());\r\n+        migrateToServiceDiscoveryInvoker(true);\r\n+    }\r\n+\r\n+    @Override\r\n+    public synchronized void migrateToServiceDiscoveryInvoker(boolean forceMigrate) {\r\n+        refreshServiceDiscoveryInvoker();\r\n+    }\r\n+\r\n+    @Override\r\n+    public Result invoke(Invocation invocation) throws RpcException {\r\n+        ClusterInvoker<T> invoker = getServiceDiscoveryInvoker();\r\n+        if (invoker == null) {\r\n+            throw new IllegalStateException(\"There's no service discovery invoker available for service \" + invocation.getServiceName());\r\n+        }\r\n+        return invoker.invoke(invocation);\r\n+    }\r\n }\n"}, {"source1": "org/apache/dubbo/registry/client/package-info.java", "source2": "org/apache/dubbo/registry/client/package-info.java", "comments": ["Line-ending differences only"], "unified_diff": "@@ -1,23 +1,23 @@\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-/**\n- * * The inspiration of service registration and discovery comes from\n- * <a href=\"https://spring.io/projects/spring-cloud-commons\">Spring Cloud Commons</a>.\n- *\n- * @since 2.7.5\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+/**\r\n+ * * The inspiration of service registration and discovery comes from\r\n+ * <a href=\"https://spring.io/projects/spring-cloud-commons\">Spring Cloud Commons</a>.\r\n+ *\r\n+ * @since 2.7.5\r\n+ */\r\n package org.apache.dubbo.registry.client;\n"}, {"source1": "org/apache/dubbo/registry/client/selector/RandomServiceInstanceSelector.java", "source2": "org/apache/dubbo/registry/client/selector/RandomServiceInstanceSelector.java", "comments": ["Line-ending differences only"], "unified_diff": "@@ -1,47 +1,47 @@\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.client.selector;\n-\n-import org.apache.dubbo.common.URL;\n-import org.apache.dubbo.registry.client.ServiceInstance;\n-\n-import java.util.List;\n-import java.util.concurrent.ThreadLocalRandom;\n-\n-/**\n- * The {@link ServiceInstanceSelector} implementation based on Random algorithm\n- *\n- * @see ThreadLocalRandom\n- * @see ServiceInstanceSelector\n- * @since 2.7.5\n- */\n-public class RandomServiceInstanceSelector implements ServiceInstanceSelector {\n-\n-    @Override\n-    public ServiceInstance select(URL registryURL, List<ServiceInstance> serviceInstances) {\n-        int size = serviceInstances.size();\n-        if (size < 1) {\n-            return null;\n-        }\n-        int index = size == 1 ? 0 : selectIndexRandomly(size);\n-        return serviceInstances.get(index);\n-    }\n-\n-    protected int selectIndexRandomly(int size) {\n-        return ThreadLocalRandom.current().nextInt(size);\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.client.selector;\r\n+\r\n+import org.apache.dubbo.common.URL;\r\n+import org.apache.dubbo.registry.client.ServiceInstance;\r\n+\r\n+import java.util.List;\r\n+import java.util.concurrent.ThreadLocalRandom;\r\n+\r\n+/**\r\n+ * The {@link ServiceInstanceSelector} implementation based on Random algorithm\r\n+ *\r\n+ * @see ThreadLocalRandom\r\n+ * @see ServiceInstanceSelector\r\n+ * @since 2.7.5\r\n+ */\r\n+public class RandomServiceInstanceSelector implements ServiceInstanceSelector {\r\n+\r\n+    @Override\r\n+    public ServiceInstance select(URL registryURL, List<ServiceInstance> serviceInstances) {\r\n+        int size = serviceInstances.size();\r\n+        if (size < 1) {\r\n+            return null;\r\n+        }\r\n+        int index = size == 1 ? 0 : selectIndexRandomly(size);\r\n+        return serviceInstances.get(index);\r\n+    }\r\n+\r\n+    protected int selectIndexRandomly(int size) {\r\n+        return ThreadLocalRandom.current().nextInt(size);\r\n+    }\r\n+}\r\n"}, {"source1": "org/apache/dubbo/registry/client/selector/ServiceInstanceSelector.java", "source2": "org/apache/dubbo/registry/client/selector/ServiceInstanceSelector.java", "comments": ["Line-ending differences only"], "unified_diff": "@@ -1,43 +1,43 @@\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.client.selector;\n-\n-import org.apache.dubbo.common.URL;\n-import org.apache.dubbo.common.extension.Adaptive;\n-import org.apache.dubbo.common.extension.SPI;\n-import org.apache.dubbo.registry.client.ServiceInstance;\n-\n-import java.util.List;\n-\n-/**\n- * The {@link ServiceInstance} Selector\n- *\n- * @since 2.7.5\n- */\n-@SPI(\"random\")\n-public interface ServiceInstanceSelector {\n-\n-    /**\n-     * Select an instance of {@link ServiceInstance} by the specified {@link ServiceInstance service instances}\n-     *\n-     * @param registryURL      The {@link URL url} of registry\n-     * @param serviceInstances the specified {@link ServiceInstance service instances}\n-     * @return an instance of {@link ServiceInstance} if available, or <code>null</code>\n-     */\n-    @Adaptive(\"service-instance-selector\")\n-    ServiceInstance select(URL registryURL, List<ServiceInstance> serviceInstances);\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.client.selector;\r\n+\r\n+import org.apache.dubbo.common.URL;\r\n+import org.apache.dubbo.common.extension.Adaptive;\r\n+import org.apache.dubbo.common.extension.SPI;\r\n+import org.apache.dubbo.registry.client.ServiceInstance;\r\n+\r\n+import java.util.List;\r\n+\r\n+/**\r\n+ * The {@link ServiceInstance} Selector\r\n+ *\r\n+ * @since 2.7.5\r\n+ */\r\n+@SPI(\"random\")\r\n+public interface ServiceInstanceSelector {\r\n+\r\n+    /**\r\n+     * Select an instance of {@link ServiceInstance} by the specified {@link ServiceInstance service instances}\r\n+     *\r\n+     * @param registryURL      The {@link URL url} of registry\r\n+     * @param serviceInstances the specified {@link ServiceInstance service instances}\r\n+     * @return an instance of {@link ServiceInstance} if available, or <code>null</code>\r\n+     */\r\n+    @Adaptive(\"service-instance-selector\")\r\n+    ServiceInstance select(URL registryURL, List<ServiceInstance> serviceInstances);\r\n+}\r\n"}, {"source1": "org/apache/dubbo/registry/integration/AbstractConfiguratorListener.java", "source2": "org/apache/dubbo/registry/integration/AbstractConfiguratorListener.java", "comments": ["Line-ending differences only"], "unified_diff": "@@ -1,97 +1,97 @@\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.integration;\n-\n-import org.apache.dubbo.common.config.configcenter.ConfigChangeType;\n-import org.apache.dubbo.common.config.configcenter.ConfigChangedEvent;\n-import org.apache.dubbo.common.config.configcenter.ConfigurationListener;\n-import org.apache.dubbo.common.config.configcenter.DynamicConfiguration;\n-import org.apache.dubbo.common.extension.ExtensionLoader;\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.rpc.cluster.Configurator;\n-import org.apache.dubbo.rpc.cluster.configurator.parser.ConfigParser;\n-import org.apache.dubbo.rpc.cluster.governance.GovernanceRuleRepository;\n-\n-import java.util.Collections;\n-import java.util.List;\n-\n-/**\n- * AbstractConfiguratorListener\n- */\n-public abstract class AbstractConfiguratorListener implements ConfigurationListener {\n-    private static final Logger logger = LoggerFactory.getLogger(AbstractConfiguratorListener.class);\n-\n-    protected List<Configurator> configurators = Collections.emptyList();\n-    protected GovernanceRuleRepository ruleRepository = ExtensionLoader.getExtensionLoader(\n-            GovernanceRuleRepository.class).getDefaultExtension();\n-\n-    protected final void initWith(String key) {\n-        ruleRepository.addListener(key, this);\n-        String rawConfig = ruleRepository.getRule(key, DynamicConfiguration.DEFAULT_GROUP);\n-        if (!StringUtils.isEmpty(rawConfig)) {\n-            genConfiguratorsFromRawRule(rawConfig);\n-        }\n-    }\n-\n-    protected final void stopListen(String key) {\n-        ruleRepository.removeListener(key, this);\n-    }\n-\n-    @Override\n-    public void process(ConfigChangedEvent event) {\n-        if (logger.isInfoEnabled()) {\n-            logger.info(\"Notification of overriding rule, change type is: \" + event.getChangeType() +\n-                    \", raw config content is:\\n \" + event.getContent());\n-        }\n-\n-        if (event.getChangeType().equals(ConfigChangeType.DELETED)) {\n-            configurators.clear();\n-        } else {\n-            if (!genConfiguratorsFromRawRule(event.getContent())) {\n-                return;\n-            }\n-        }\n-\n-        notifyOverrides();\n-    }\n-\n-    private boolean genConfiguratorsFromRawRule(String rawConfig) {\n-        boolean parseSuccess = true;\n-        try {\n-            // parseConfigurators will recognize app/service config automatically.\n-            configurators = Configurator.toConfigurators(ConfigParser.parseConfigurators(rawConfig))\n-                    .orElse(configurators);\n-        } catch (Exception e) {\n-            logger.error(\"Failed to parse raw dynamic config and it will not take effect, the raw config is: \" +\n-                    rawConfig, e);\n-            parseSuccess = false;\n-        }\n-        return parseSuccess;\n-    }\n-\n-    protected abstract void notifyOverrides();\n-\n-    public List<Configurator> getConfigurators() {\n-        return configurators;\n-    }\n-\n-    public void setConfigurators(List<Configurator> configurators) {\n-        this.configurators = configurators;\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.integration;\r\n+\r\n+import org.apache.dubbo.common.config.configcenter.ConfigChangeType;\r\n+import org.apache.dubbo.common.config.configcenter.ConfigChangedEvent;\r\n+import org.apache.dubbo.common.config.configcenter.ConfigurationListener;\r\n+import org.apache.dubbo.common.config.configcenter.DynamicConfiguration;\r\n+import org.apache.dubbo.common.extension.ExtensionLoader;\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.rpc.cluster.Configurator;\r\n+import org.apache.dubbo.rpc.cluster.configurator.parser.ConfigParser;\r\n+import org.apache.dubbo.rpc.cluster.governance.GovernanceRuleRepository;\r\n+\r\n+import java.util.Collections;\r\n+import java.util.List;\r\n+\r\n+/**\r\n+ * AbstractConfiguratorListener\r\n+ */\r\n+public abstract class AbstractConfiguratorListener implements ConfigurationListener {\r\n+    private static final Logger logger = LoggerFactory.getLogger(AbstractConfiguratorListener.class);\r\n+\r\n+    protected List<Configurator> configurators = Collections.emptyList();\r\n+    protected GovernanceRuleRepository ruleRepository = ExtensionLoader.getExtensionLoader(\r\n+            GovernanceRuleRepository.class).getDefaultExtension();\r\n+\r\n+    protected final void initWith(String key) {\r\n+        ruleRepository.addListener(key, this);\r\n+        String rawConfig = ruleRepository.getRule(key, DynamicConfiguration.DEFAULT_GROUP);\r\n+        if (!StringUtils.isEmpty(rawConfig)) {\r\n+            genConfiguratorsFromRawRule(rawConfig);\r\n+        }\r\n+    }\r\n+\r\n+    protected final void stopListen(String key) {\r\n+        ruleRepository.removeListener(key, this);\r\n+    }\r\n+\r\n+    @Override\r\n+    public void process(ConfigChangedEvent event) {\r\n+        if (logger.isInfoEnabled()) {\r\n+            logger.info(\"Notification of overriding rule, change type is: \" + event.getChangeType() +\r\n+                    \", raw config content is:\\n \" + event.getContent());\r\n+        }\r\n+\r\n+        if (event.getChangeType().equals(ConfigChangeType.DELETED)) {\r\n+            configurators.clear();\r\n+        } else {\r\n+            if (!genConfiguratorsFromRawRule(event.getContent())) {\r\n+                return;\r\n+            }\r\n+        }\r\n+\r\n+        notifyOverrides();\r\n+    }\r\n+\r\n+    private boolean genConfiguratorsFromRawRule(String rawConfig) {\r\n+        boolean parseSuccess = true;\r\n+        try {\r\n+            // parseConfigurators will recognize app/service config automatically.\r\n+            configurators = Configurator.toConfigurators(ConfigParser.parseConfigurators(rawConfig))\r\n+                    .orElse(configurators);\r\n+        } catch (Exception e) {\r\n+            logger.error(\"Failed to parse raw dynamic config and it will not take effect, the raw config is: \" +\r\n+                    rawConfig, e);\r\n+            parseSuccess = false;\r\n+        }\r\n+        return parseSuccess;\r\n+    }\r\n+\r\n+    protected abstract void notifyOverrides();\r\n+\r\n+    public List<Configurator> getConfigurators() {\r\n+        return configurators;\r\n+    }\r\n+\r\n+    public void setConfigurators(List<Configurator> configurators) {\r\n+        this.configurators = configurators;\r\n+    }\r\n+}\r\n"}, {"source1": "org/apache/dubbo/registry/integration/DynamicDirectory.java", "source2": "org/apache/dubbo/registry/integration/DynamicDirectory.java", "comments": ["Line-ending differences only"], "unified_diff": "@@ -1,285 +1,285 @@\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.integration;\n-\n-import org.apache.dubbo.common.URL;\n-import org.apache.dubbo.common.URLBuilder;\n-import org.apache.dubbo.common.Version;\n-import org.apache.dubbo.common.extension.ExtensionLoader;\n-import org.apache.dubbo.common.logger.Logger;\n-import org.apache.dubbo.common.logger.LoggerFactory;\n-import org.apache.dubbo.common.utils.NetUtils;\n-import org.apache.dubbo.registry.NotifyListener;\n-import org.apache.dubbo.registry.Registry;\n-import org.apache.dubbo.registry.client.event.listener.ServiceInstancesChangedListener;\n-import org.apache.dubbo.registry.client.migration.InvokersChangedListener;\n-import org.apache.dubbo.rpc.Invocation;\n-import org.apache.dubbo.rpc.Invoker;\n-import org.apache.dubbo.rpc.Protocol;\n-import org.apache.dubbo.rpc.RpcException;\n-import org.apache.dubbo.rpc.cluster.Cluster;\n-import org.apache.dubbo.rpc.cluster.Configurator;\n-import org.apache.dubbo.rpc.cluster.RouterChain;\n-import org.apache.dubbo.rpc.cluster.RouterFactory;\n-import org.apache.dubbo.rpc.cluster.directory.AbstractDirectory;\n-\n-import java.util.Collections;\n-import java.util.List;\n-\n-import static org.apache.dubbo.common.constants.CommonConstants.ANY_VALUE;\n-import static org.apache.dubbo.common.constants.CommonConstants.DUBBO;\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.MONITOR_KEY;\n-import static org.apache.dubbo.common.constants.CommonConstants.PROTOCOL_KEY;\n-import static org.apache.dubbo.common.constants.RegistryConstants.CATEGORY_KEY;\n-import static org.apache.dubbo.common.constants.RegistryConstants.CONSUMERS_CATEGORY;\n-import static org.apache.dubbo.registry.Constants.REGISTER_IP_KEY;\n-import static org.apache.dubbo.registry.Constants.REGISTER_KEY;\n-import static org.apache.dubbo.registry.Constants.SIMPLIFIED_KEY;\n-import static org.apache.dubbo.registry.integration.RegistryProtocol.DEFAULT_REGISTER_CONSUMER_KEYS;\n-import static org.apache.dubbo.remoting.Constants.CHECK_KEY;\n-\n-\n-/**\n- * RegistryDirectory\n- */\n-public abstract class DynamicDirectory<T> extends AbstractDirectory<T> implements NotifyListener {\n-\n-    private static final Logger logger = LoggerFactory.getLogger(DynamicDirectory.class);\n-\n-    protected static final Cluster CLUSTER = ExtensionLoader.getExtensionLoader(Cluster.class).getAdaptiveExtension();\n-\n-    protected static final RouterFactory ROUTER_FACTORY = ExtensionLoader.getExtensionLoader(RouterFactory.class)\n-            .getAdaptiveExtension();\n-\n-    protected final String serviceKey; // Initialization at construction time, assertion not null\n-    protected final Class<T> serviceType; // Initialization at construction time, assertion not null\n-    protected final URL directoryUrl; // Initialization at construction time, assertion not null, and always assign non null value\n-    protected final boolean multiGroup;\n-    protected Protocol protocol; // Initialization at the time of injection, the assertion is not null\n-    protected Registry registry; // Initialization at the time of injection, the assertion is not null\n-    protected volatile boolean forbidden = false;\n-    protected boolean shouldRegister;\n-    protected boolean shouldSimplified;\n-\n-    protected volatile URL overrideDirectoryUrl; // Initialization at construction time, assertion not null, and always assign non null value\n-\n-    protected volatile URL registeredConsumerUrl;\n-\n-    /**\n-     * override rules\n-     * Priority: override>-D>consumer>provider\n-     * Rule one: for a certain provider <ip:port,timeout=100>\n-     * Rule two: for all providers <* ,timeout=5000>\n-     */\n-    protected volatile List<Configurator> configurators; // The initial value is null and the midway may be assigned to null, please use the local variable reference\n-\n-    protected volatile List<Invoker<T>> invokers;\n-    // Set<invokerUrls> cache invokeUrls to invokers mapping.\n-\n-    protected ServiceInstancesChangedListener serviceListener;\n-\n-    public DynamicDirectory(Class<T> serviceType, URL url) {\n-        super(url, true);\n-        if (serviceType == null) {\n-            throw new IllegalArgumentException(\"service type is null.\");\n-        }\n-\n-        shouldRegister = !ANY_VALUE.equals(url.getServiceInterface()) && url.getParameter(REGISTER_KEY, true);\n-        shouldSimplified = url.getParameter(SIMPLIFIED_KEY, false);\n-        if (url.getServiceKey() == null || url.getServiceKey().length() == 0) {\n-            throw new IllegalArgumentException(\"registry serviceKey is null.\");\n-        }\n-        this.serviceType = serviceType;\n-        this.serviceKey = super.getConsumerUrl().getServiceKey();\n-\n-        this.overrideDirectoryUrl = this.directoryUrl = turnRegistryUrlToConsumerUrl(url);\n-        String group = directoryUrl.getParameter(GROUP_KEY, \"\");\n-        this.multiGroup = group != null && (ANY_VALUE.equals(group) || group.contains(\",\"));\n-    }\n-\n-    @Override\n-    public void addServiceListener(ServiceInstancesChangedListener instanceListener) {\n-        this.serviceListener = instanceListener;\n-    }\n-\n-    private URL turnRegistryUrlToConsumerUrl(URL url) {\n-        return URLBuilder.from(url)\n-                .setHost(queryMap.get(REGISTER_IP_KEY) == null ? url.getHost() : queryMap.get(REGISTER_IP_KEY))\n-                .setPort(0)\n-                .setProtocol(queryMap.get(PROTOCOL_KEY) == null ? DUBBO : queryMap.get(PROTOCOL_KEY))\n-                .setPath(queryMap.get(INTERFACE_KEY))\n-                .clearParameters()\n-                .addParameters(queryMap)\n-                .removeParameter(MONITOR_KEY)\n-                .build();\n-    }\n-\n-    public void setProtocol(Protocol protocol) {\n-        this.protocol = protocol;\n-    }\n-\n-    public void setRegistry(Registry registry) {\n-        this.registry = registry;\n-    }\n-\n-    public Registry getRegistry() {\n-        return registry;\n-    }\n-\n-    public boolean isShouldRegister() {\n-        return shouldRegister;\n-    }\n-\n-    public void subscribe(URL url) {\n-        setConsumerUrl(url);\n-        registry.subscribe(url, this);\n-    }\n-\n-    public void unSubscribe(URL url) {\n-        setConsumerUrl(null);\n-        registry.unsubscribe(url, this);\n-    }\n-\n-    @Override\n-    public List<Invoker<T>> doList(Invocation invocation) {\n-        if (forbidden) {\n-            // 1. No service provider 2. Service providers are disabled\n-            throw new RpcException(RpcException.FORBIDDEN_EXCEPTION, \"No provider available from registry \" +\n-                    getUrl().getAddress() + \" for service \" + getConsumerUrl().getServiceKey() + \" on consumer \" +\n-                    NetUtils.getLocalHost() + \" use dubbo version \" + Version.getVersion() +\n-                    \", please check status of providers(disabled, not registered or in blacklist).\");\n-        }\n-\n-        if (multiGroup) {\n-            return this.invokers == null ? Collections.emptyList() : this.invokers;\n-        }\n-\n-        List<Invoker<T>> invokers = null;\n-        try {\n-            // Get invokers from cache, only runtime routers will be executed.\n-            invokers = routerChain.route(getConsumerUrl(), invocation);\n-        } catch (Throwable t) {\n-            logger.error(\"Failed to execute router: \" + getUrl() + \", cause: \" + t.getMessage(), t);\n-        }\n-\n-        return invokers == null ? Collections.emptyList() : invokers;\n-    }\n-\n-    @Override\n-    public Class<T> getInterface() {\n-        return serviceType;\n-    }\n-\n-    @Override\n-    public List<Invoker<T>> getAllInvokers() {\n-        return invokers;\n-    }\n-\n-    @Override\n-    public URL getConsumerUrl() {\n-        return this.overrideDirectoryUrl;\n-    }\n-\n-    public URL getRegisteredConsumerUrl() {\n-        return registeredConsumerUrl;\n-    }\n-\n-    public void setRegisteredConsumerUrl(URL url) {\n-        if (!shouldSimplified) {\n-            this.registeredConsumerUrl = url.addParameters(CATEGORY_KEY, CONSUMERS_CATEGORY, CHECK_KEY,\n-                    String.valueOf(false));\n-        } else {\n-            this.registeredConsumerUrl = URL.valueOf(url, DEFAULT_REGISTER_CONSUMER_KEYS, null).addParameters(\n-                    CATEGORY_KEY, CONSUMERS_CATEGORY, CHECK_KEY, String.valueOf(false));\n-        }\n-    }\n-\n-    public void buildRouterChain(URL url) {\n-        this.setRouterChain(RouterChain.buildChain(url));\n-    }\n-\n-    public List<Invoker<T>> getInvokers() {\n-        return invokers;\n-    }\n-\n-    @Override\n-    public void destroy() {\n-        if (isDestroyed()) {\n-            return;\n-        }\n-\n-        // unregister.\n-        try {\n-            if (getRegisteredConsumerUrl() != null && registry != null && registry.isAvailable()) {\n-                registry.unregister(getRegisteredConsumerUrl());\n-            }\n-        } catch (Throwable t) {\n-            logger.warn(\"unexpected error when unregister service \" + serviceKey + \"from registry\" + registry.getUrl(), t);\n-        }\n-        // unsubscribe.\n-        try {\n-            if (getConsumerUrl() != null && registry != null && registry.isAvailable()) {\n-                registry.unsubscribe(getConsumerUrl(), this);\n-            }\n-        } catch (Throwable t) {\n-            logger.warn(\"unexpected error when unsubscribe service \" + serviceKey + \"from registry\" + registry.getUrl(), t);\n-        }\n-        super.destroy(); // must be executed after unsubscribing\n-        try {\n-            destroyAllInvokers();\n-        } catch (Throwable t) {\n-            logger.warn(\"Failed to destroy service \" + serviceKey, t);\n-        }\n-\n-        invokersChangedListener = null;\n-    }\n-\n-    @Override\n-    public void discordAddresses() {\n-        try {\n-            destroyAllInvokers();\n-        } catch (Throwable t) {\n-            logger.warn(\"Failed to destroy service \" + serviceKey, t);\n-        }\n-    }\n-\n-    private volatile InvokersChangedListener invokersChangedListener;\n-    private volatile boolean addressChanged;\n-\n-    public void setInvokersChangedListener(InvokersChangedListener listener) {\n-        this.invokersChangedListener = listener;\n-        if (addressChanged) {\n-            if (invokersChangedListener != null) {\n-                invokersChangedListener.onChange();\n-                this.addressChanged = false;\n-            }\n-        }\n-    }\n-\n-    protected void invokersChanged() {\n-        if (invokersChangedListener != null) {\n-            invokersChangedListener.onChange();\n-            this.addressChanged = false;\n-        } else {\n-            this.addressChanged = true;\n-        }\n-    }\n-\n-    protected abstract void destroyAllInvokers();\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.integration;\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.Version;\r\n+import org.apache.dubbo.common.extension.ExtensionLoader;\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.NetUtils;\r\n+import org.apache.dubbo.registry.NotifyListener;\r\n+import org.apache.dubbo.registry.Registry;\r\n+import org.apache.dubbo.registry.client.event.listener.ServiceInstancesChangedListener;\r\n+import org.apache.dubbo.registry.client.migration.InvokersChangedListener;\r\n+import org.apache.dubbo.rpc.Invocation;\r\n+import org.apache.dubbo.rpc.Invoker;\r\n+import org.apache.dubbo.rpc.Protocol;\r\n+import org.apache.dubbo.rpc.RpcException;\r\n+import org.apache.dubbo.rpc.cluster.Cluster;\r\n+import org.apache.dubbo.rpc.cluster.Configurator;\r\n+import org.apache.dubbo.rpc.cluster.RouterChain;\r\n+import org.apache.dubbo.rpc.cluster.RouterFactory;\r\n+import org.apache.dubbo.rpc.cluster.directory.AbstractDirectory;\r\n+\r\n+import java.util.Collections;\r\n+import java.util.List;\r\n+\r\n+import static org.apache.dubbo.common.constants.CommonConstants.ANY_VALUE;\r\n+import static org.apache.dubbo.common.constants.CommonConstants.DUBBO;\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.MONITOR_KEY;\r\n+import static org.apache.dubbo.common.constants.CommonConstants.PROTOCOL_KEY;\r\n+import static org.apache.dubbo.common.constants.RegistryConstants.CATEGORY_KEY;\r\n+import static org.apache.dubbo.common.constants.RegistryConstants.CONSUMERS_CATEGORY;\r\n+import static org.apache.dubbo.registry.Constants.REGISTER_IP_KEY;\r\n+import static org.apache.dubbo.registry.Constants.REGISTER_KEY;\r\n+import static org.apache.dubbo.registry.Constants.SIMPLIFIED_KEY;\r\n+import static org.apache.dubbo.registry.integration.RegistryProtocol.DEFAULT_REGISTER_CONSUMER_KEYS;\r\n+import static org.apache.dubbo.remoting.Constants.CHECK_KEY;\r\n+\r\n+\r\n+/**\r\n+ * RegistryDirectory\r\n+ */\r\n+public abstract class DynamicDirectory<T> extends AbstractDirectory<T> implements NotifyListener {\r\n+\r\n+    private static final Logger logger = LoggerFactory.getLogger(DynamicDirectory.class);\r\n+\r\n+    protected static final Cluster CLUSTER = ExtensionLoader.getExtensionLoader(Cluster.class).getAdaptiveExtension();\r\n+\r\n+    protected static final RouterFactory ROUTER_FACTORY = ExtensionLoader.getExtensionLoader(RouterFactory.class)\r\n+            .getAdaptiveExtension();\r\n+\r\n+    protected final String serviceKey; // Initialization at construction time, assertion not null\r\n+    protected final Class<T> serviceType; // Initialization at construction time, assertion not null\r\n+    protected final URL directoryUrl; // Initialization at construction time, assertion not null, and always assign non null value\r\n+    protected final boolean multiGroup;\r\n+    protected Protocol protocol; // Initialization at the time of injection, the assertion is not null\r\n+    protected Registry registry; // Initialization at the time of injection, the assertion is not null\r\n+    protected volatile boolean forbidden = false;\r\n+    protected boolean shouldRegister;\r\n+    protected boolean shouldSimplified;\r\n+\r\n+    protected volatile URL overrideDirectoryUrl; // Initialization at construction time, assertion not null, and always assign non null value\r\n+\r\n+    protected volatile URL registeredConsumerUrl;\r\n+\r\n+    /**\r\n+     * override rules\r\n+     * Priority: override>-D>consumer>provider\r\n+     * Rule one: for a certain provider <ip:port,timeout=100>\r\n+     * Rule two: for all providers <* ,timeout=5000>\r\n+     */\r\n+    protected volatile List<Configurator> configurators; // The initial value is null and the midway may be assigned to null, please use the local variable reference\r\n+\r\n+    protected volatile List<Invoker<T>> invokers;\r\n+    // Set<invokerUrls> cache invokeUrls to invokers mapping.\r\n+\r\n+    protected ServiceInstancesChangedListener serviceListener;\r\n+\r\n+    public DynamicDirectory(Class<T> serviceType, URL url) {\r\n+        super(url, true);\r\n+        if (serviceType == null) {\r\n+            throw new IllegalArgumentException(\"service type is null.\");\r\n+        }\r\n+\r\n+        shouldRegister = !ANY_VALUE.equals(url.getServiceInterface()) && url.getParameter(REGISTER_KEY, true);\r\n+        shouldSimplified = url.getParameter(SIMPLIFIED_KEY, false);\r\n+        if (url.getServiceKey() == null || url.getServiceKey().length() == 0) {\r\n+            throw new IllegalArgumentException(\"registry serviceKey is null.\");\r\n+        }\r\n+        this.serviceType = serviceType;\r\n+        this.serviceKey = super.getConsumerUrl().getServiceKey();\r\n+\r\n+        this.overrideDirectoryUrl = this.directoryUrl = turnRegistryUrlToConsumerUrl(url);\r\n+        String group = directoryUrl.getParameter(GROUP_KEY, \"\");\r\n+        this.multiGroup = group != null && (ANY_VALUE.equals(group) || group.contains(\",\"));\r\n+    }\r\n+\r\n+    @Override\r\n+    public void addServiceListener(ServiceInstancesChangedListener instanceListener) {\r\n+        this.serviceListener = instanceListener;\r\n+    }\r\n+\r\n+    private URL turnRegistryUrlToConsumerUrl(URL url) {\r\n+        return URLBuilder.from(url)\r\n+                .setHost(queryMap.get(REGISTER_IP_KEY) == null ? url.getHost() : queryMap.get(REGISTER_IP_KEY))\r\n+                .setPort(0)\r\n+                .setProtocol(queryMap.get(PROTOCOL_KEY) == null ? DUBBO : queryMap.get(PROTOCOL_KEY))\r\n+                .setPath(queryMap.get(INTERFACE_KEY))\r\n+                .clearParameters()\r\n+                .addParameters(queryMap)\r\n+                .removeParameter(MONITOR_KEY)\r\n+                .build();\r\n+    }\r\n+\r\n+    public void setProtocol(Protocol protocol) {\r\n+        this.protocol = protocol;\r\n+    }\r\n+\r\n+    public void setRegistry(Registry registry) {\r\n+        this.registry = registry;\r\n+    }\r\n+\r\n+    public Registry getRegistry() {\r\n+        return registry;\r\n+    }\r\n+\r\n+    public boolean isShouldRegister() {\r\n+        return shouldRegister;\r\n+    }\r\n+\r\n+    public void subscribe(URL url) {\r\n+        setConsumerUrl(url);\r\n+        registry.subscribe(url, this);\r\n+    }\r\n+\r\n+    public void unSubscribe(URL url) {\r\n+        setConsumerUrl(null);\r\n+        registry.unsubscribe(url, this);\r\n+    }\r\n+\r\n+    @Override\r\n+    public List<Invoker<T>> doList(Invocation invocation) {\r\n+        if (forbidden) {\r\n+            // 1. No service provider 2. Service providers are disabled\r\n+            throw new RpcException(RpcException.FORBIDDEN_EXCEPTION, \"No provider available from registry \" +\r\n+                    getUrl().getAddress() + \" for service \" + getConsumerUrl().getServiceKey() + \" on consumer \" +\r\n+                    NetUtils.getLocalHost() + \" use dubbo version \" + Version.getVersion() +\r\n+                    \", please check status of providers(disabled, not registered or in blacklist).\");\r\n+        }\r\n+\r\n+        if (multiGroup) {\r\n+            return this.invokers == null ? Collections.emptyList() : this.invokers;\r\n+        }\r\n+\r\n+        List<Invoker<T>> invokers = null;\r\n+        try {\r\n+            // Get invokers from cache, only runtime routers will be executed.\r\n+            invokers = routerChain.route(getConsumerUrl(), invocation);\r\n+        } catch (Throwable t) {\r\n+            logger.error(\"Failed to execute router: \" + getUrl() + \", cause: \" + t.getMessage(), t);\r\n+        }\r\n+\r\n+        return invokers == null ? Collections.emptyList() : invokers;\r\n+    }\r\n+\r\n+    @Override\r\n+    public Class<T> getInterface() {\r\n+        return serviceType;\r\n+    }\r\n+\r\n+    @Override\r\n+    public List<Invoker<T>> getAllInvokers() {\r\n+        return invokers;\r\n+    }\r\n+\r\n+    @Override\r\n+    public URL getConsumerUrl() {\r\n+        return this.overrideDirectoryUrl;\r\n+    }\r\n+\r\n+    public URL getRegisteredConsumerUrl() {\r\n+        return registeredConsumerUrl;\r\n+    }\r\n+\r\n+    public void setRegisteredConsumerUrl(URL url) {\r\n+        if (!shouldSimplified) {\r\n+            this.registeredConsumerUrl = url.addParameters(CATEGORY_KEY, CONSUMERS_CATEGORY, CHECK_KEY,\r\n+                    String.valueOf(false));\r\n+        } else {\r\n+            this.registeredConsumerUrl = URL.valueOf(url, DEFAULT_REGISTER_CONSUMER_KEYS, null).addParameters(\r\n+                    CATEGORY_KEY, CONSUMERS_CATEGORY, CHECK_KEY, String.valueOf(false));\r\n+        }\r\n+    }\r\n+\r\n+    public void buildRouterChain(URL url) {\r\n+        this.setRouterChain(RouterChain.buildChain(url));\r\n+    }\r\n+\r\n+    public List<Invoker<T>> getInvokers() {\r\n+        return invokers;\r\n+    }\r\n+\r\n+    @Override\r\n+    public void destroy() {\r\n+        if (isDestroyed()) {\r\n+            return;\r\n+        }\r\n+\r\n+        // unregister.\r\n+        try {\r\n+            if (getRegisteredConsumerUrl() != null && registry != null && registry.isAvailable()) {\r\n+                registry.unregister(getRegisteredConsumerUrl());\r\n+            }\r\n+        } catch (Throwable t) {\r\n+            logger.warn(\"unexpected error when unregister service \" + serviceKey + \"from registry\" + registry.getUrl(), t);\r\n+        }\r\n+        // unsubscribe.\r\n+        try {\r\n+            if (getConsumerUrl() != null && registry != null && registry.isAvailable()) {\r\n+                registry.unsubscribe(getConsumerUrl(), this);\r\n+            }\r\n+        } catch (Throwable t) {\r\n+            logger.warn(\"unexpected error when unsubscribe service \" + serviceKey + \"from registry\" + registry.getUrl(), t);\r\n+        }\r\n+        super.destroy(); // must be executed after unsubscribing\r\n+        try {\r\n+            destroyAllInvokers();\r\n+        } catch (Throwable t) {\r\n+            logger.warn(\"Failed to destroy service \" + serviceKey, t);\r\n+        }\r\n+\r\n+        invokersChangedListener = null;\r\n+    }\r\n+\r\n+    @Override\r\n+    public void discordAddresses() {\r\n+        try {\r\n+            destroyAllInvokers();\r\n+        } catch (Throwable t) {\r\n+            logger.warn(\"Failed to destroy service \" + serviceKey, t);\r\n+        }\r\n+    }\r\n+\r\n+    private volatile InvokersChangedListener invokersChangedListener;\r\n+    private volatile boolean addressChanged;\r\n+\r\n+    public void setInvokersChangedListener(InvokersChangedListener listener) {\r\n+        this.invokersChangedListener = listener;\r\n+        if (addressChanged) {\r\n+            if (invokersChangedListener != null) {\r\n+                invokersChangedListener.onChange();\r\n+                this.addressChanged = false;\r\n+            }\r\n+        }\r\n+    }\r\n+\r\n+    protected void invokersChanged() {\r\n+        if (invokersChangedListener != null) {\r\n+            invokersChangedListener.onChange();\r\n+            this.addressChanged = false;\r\n+        } else {\r\n+            this.addressChanged = true;\r\n+        }\r\n+    }\r\n+\r\n+    protected abstract void destroyAllInvokers();\r\n+}\r\n"}, {"source1": "org/apache/dubbo/registry/integration/InterfaceCompatibleRegistryProtocol.java", "source2": "org/apache/dubbo/registry/integration/InterfaceCompatibleRegistryProtocol.java", "comments": ["Line-ending differences only"], "unified_diff": "@@ -1,73 +1,73 @@\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.integration;\n-\n-import org.apache.dubbo.common.URL;\n-import org.apache.dubbo.common.URLBuilder;\n-import org.apache.dubbo.registry.Registry;\n-import org.apache.dubbo.registry.client.ServiceDiscoveryRegistryDirectory;\n-import org.apache.dubbo.registry.client.migration.MigrationInvoker;\n-import org.apache.dubbo.rpc.Invoker;\n-import org.apache.dubbo.rpc.cluster.Cluster;\n-import org.apache.dubbo.rpc.cluster.ClusterInvoker;\n-\n-import static org.apache.dubbo.common.constants.RegistryConstants.REGISTRY_KEY;\n-import static org.apache.dubbo.common.constants.RegistryConstants.REGISTRY_PROTOCOL;\n-import static org.apache.dubbo.registry.Constants.DEFAULT_REGISTRY;\n-\n-/**\n- * RegistryProtocol\n- */\n-public class InterfaceCompatibleRegistryProtocol extends RegistryProtocol {\n-\n-    @Override\n-    protected URL getRegistryUrl(Invoker<?> originInvoker) {\n-        URL registryUrl = originInvoker.getUrl();\n-        if (REGISTRY_PROTOCOL.equals(registryUrl.getProtocol())) {\n-            String protocol = registryUrl.getParameter(REGISTRY_KEY, DEFAULT_REGISTRY);\n-            registryUrl = registryUrl.setProtocol(protocol).removeParameter(REGISTRY_KEY);\n-        }\n-        return registryUrl;\n-    }\n-\n-    @Override\n-    protected URL getRegistryUrl(URL url) {\n-        return URLBuilder.from(url)\n-                .setProtocol(url.getParameter(REGISTRY_KEY, DEFAULT_REGISTRY))\n-                .removeParameter(REGISTRY_KEY)\n-                .build();\n-    }\n-\n-    @Override\n-    public <T> ClusterInvoker<T> getInvoker(Cluster cluster, Registry registry, Class<T> type, URL url) {\n-        DynamicDirectory<T> directory = new RegistryDirectory<>(type, url);\n-        return doCreateInvoker(directory, cluster, registry, type);\n-    }\n-\n-    @Override\n-    public <T> ClusterInvoker<T> getServiceDiscoveryInvoker(Cluster cluster, Registry registry, Class<T> type, URL url) {\n-        registry = registryFactory.getRegistry(super.getRegistryUrl(url));\n-        DynamicDirectory<T> directory = new ServiceDiscoveryRegistryDirectory<>(type, url);\n-        return doCreateInvoker(directory, cluster, registry, type);\n-    }\n-\n-    protected <T> ClusterInvoker<T> getMigrationInvoker(RegistryProtocol registryProtocol, Cluster cluster, Registry registry, Class<T> type, URL url, URL consumerUrl) {\n-//        ClusterInvoker<T> invoker = getInvoker(cluster, registry, type, url);\n-        return new MigrationInvoker<T>(registryProtocol, cluster, registry, type, url, consumerUrl);\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.integration;\r\n+\r\n+import org.apache.dubbo.common.URL;\r\n+import org.apache.dubbo.common.URLBuilder;\r\n+import org.apache.dubbo.registry.Registry;\r\n+import org.apache.dubbo.registry.client.ServiceDiscoveryRegistryDirectory;\r\n+import org.apache.dubbo.registry.client.migration.MigrationInvoker;\r\n+import org.apache.dubbo.rpc.Invoker;\r\n+import org.apache.dubbo.rpc.cluster.Cluster;\r\n+import org.apache.dubbo.rpc.cluster.ClusterInvoker;\r\n+\r\n+import static org.apache.dubbo.common.constants.RegistryConstants.REGISTRY_KEY;\r\n+import static org.apache.dubbo.common.constants.RegistryConstants.REGISTRY_PROTOCOL;\r\n+import static org.apache.dubbo.registry.Constants.DEFAULT_REGISTRY;\r\n+\r\n+/**\r\n+ * RegistryProtocol\r\n+ */\r\n+public class InterfaceCompatibleRegistryProtocol extends RegistryProtocol {\r\n+\r\n+    @Override\r\n+    protected URL getRegistryUrl(Invoker<?> originInvoker) {\r\n+        URL registryUrl = originInvoker.getUrl();\r\n+        if (REGISTRY_PROTOCOL.equals(registryUrl.getProtocol())) {\r\n+            String protocol = registryUrl.getParameter(REGISTRY_KEY, DEFAULT_REGISTRY);\r\n+            registryUrl = registryUrl.setProtocol(protocol).removeParameter(REGISTRY_KEY);\r\n+        }\r\n+        return registryUrl;\r\n+    }\r\n+\r\n+    @Override\r\n+    protected URL getRegistryUrl(URL url) {\r\n+        return URLBuilder.from(url)\r\n+                .setProtocol(url.getParameter(REGISTRY_KEY, DEFAULT_REGISTRY))\r\n+                .removeParameter(REGISTRY_KEY)\r\n+                .build();\r\n+    }\r\n+\r\n+    @Override\r\n+    public <T> ClusterInvoker<T> getInvoker(Cluster cluster, Registry registry, Class<T> type, URL url) {\r\n+        DynamicDirectory<T> directory = new RegistryDirectory<>(type, url);\r\n+        return doCreateInvoker(directory, cluster, registry, type);\r\n+    }\r\n+\r\n+    @Override\r\n+    public <T> ClusterInvoker<T> getServiceDiscoveryInvoker(Cluster cluster, Registry registry, Class<T> type, URL url) {\r\n+        registry = registryFactory.getRegistry(super.getRegistryUrl(url));\r\n+        DynamicDirectory<T> directory = new ServiceDiscoveryRegistryDirectory<>(type, url);\r\n+        return doCreateInvoker(directory, cluster, registry, type);\r\n+    }\r\n+\r\n+    protected <T> ClusterInvoker<T> getMigrationInvoker(RegistryProtocol registryProtocol, Cluster cluster, Registry registry, Class<T> type, URL url, URL consumerUrl) {\r\n+//        ClusterInvoker<T> invoker = getInvoker(cluster, registry, type, url);\r\n+        return new MigrationInvoker<T>(registryProtocol, cluster, registry, type, url, consumerUrl);\r\n+    }\r\n+\r\n+}\r\n"}, {"source1": "org/apache/dubbo/registry/integration/InvokersChangedListener.java", "source2": "org/apache/dubbo/registry/integration/InvokersChangedListener.java", "comments": ["Line-ending differences only"], "unified_diff": "@@ -1,21 +1,21 @@\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.integration;\n-\n-public interface InvokersChangedListener {\n-    void onChange();\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.integration;\r\n+\r\n+public interface InvokersChangedListener {\r\n+    void onChange();\r\n+}\r\n"}, {"source1": "org/apache/dubbo/registry/integration/RegistryProtocol.java", "source2": "org/apache/dubbo/registry/integration/RegistryProtocol.java", "comments": ["Line-ending differences only"], "unified_diff": "@@ -1,843 +1,843 @@\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.integration;\n-\n-import org.apache.dubbo.common.URL;\n-import org.apache.dubbo.common.config.ConfigurationUtils;\n-import org.apache.dubbo.common.config.configcenter.DynamicConfiguration;\n-import org.apache.dubbo.common.extension.ExtensionLoader;\n-import org.apache.dubbo.common.logger.Logger;\n-import org.apache.dubbo.common.logger.LoggerFactory;\n-import org.apache.dubbo.common.timer.HashedWheelTimer;\n-import org.apache.dubbo.common.utils.CollectionUtils;\n-import org.apache.dubbo.common.utils.NamedThreadFactory;\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.RegistryFactory;\n-import org.apache.dubbo.registry.RegistryService;\n-import org.apache.dubbo.registry.client.ServiceDiscoveryRegistryDirectory;\n-import org.apache.dubbo.registry.client.migration.ServiceDiscoveryMigrationInvoker;\n-import org.apache.dubbo.registry.retry.ReExportTask;\n-import org.apache.dubbo.registry.support.SkipFailbackWrapperException;\n-import org.apache.dubbo.rpc.Exporter;\n-import org.apache.dubbo.rpc.Invoker;\n-import org.apache.dubbo.rpc.Protocol;\n-import org.apache.dubbo.rpc.ProtocolServer;\n-import org.apache.dubbo.rpc.ProxyFactory;\n-import org.apache.dubbo.rpc.RpcException;\n-import org.apache.dubbo.rpc.cluster.Cluster;\n-import org.apache.dubbo.rpc.cluster.ClusterInvoker;\n-import org.apache.dubbo.rpc.cluster.Configurator;\n-import org.apache.dubbo.rpc.cluster.governance.GovernanceRuleRepository;\n-import org.apache.dubbo.rpc.cluster.support.MergeableCluster;\n-import org.apache.dubbo.rpc.cluster.support.migration.MigrationClusterInvoker;\n-import org.apache.dubbo.rpc.model.ApplicationModel;\n-import org.apache.dubbo.rpc.model.ProviderModel;\n-import org.apache.dubbo.rpc.protocol.InvokerWrapper;\n-\n-import java.util.ArrayList;\n-import java.util.HashMap;\n-import java.util.List;\n-import java.util.Map;\n-import java.util.concurrent.ConcurrentHashMap;\n-import java.util.concurrent.ConcurrentMap;\n-import java.util.concurrent.ExecutorService;\n-import java.util.concurrent.TimeUnit;\n-\n-import static java.util.concurrent.Executors.newSingleThreadExecutor;\n-import static org.apache.dubbo.common.constants.CommonConstants.APPLICATION_KEY;\n-import static org.apache.dubbo.common.constants.CommonConstants.CLUSTER_KEY;\n-import static org.apache.dubbo.common.constants.CommonConstants.COMMA_SPLIT_PATTERN;\n-import static org.apache.dubbo.common.constants.CommonConstants.DUBBO_VERSION_KEY;\n-import static org.apache.dubbo.common.constants.CommonConstants.EXTRA_KEYS_KEY;\n-import static org.apache.dubbo.common.constants.CommonConstants.GROUP_KEY;\n-import static org.apache.dubbo.common.constants.CommonConstants.HIDDEN_KEY_PREFIX;\n-import static org.apache.dubbo.common.constants.CommonConstants.INTERFACE_KEY;\n-import static org.apache.dubbo.common.constants.CommonConstants.LOADBALANCE_KEY;\n-import static org.apache.dubbo.common.constants.CommonConstants.METHODS_KEY;\n-import static org.apache.dubbo.common.constants.CommonConstants.MONITOR_KEY;\n-import static org.apache.dubbo.common.constants.CommonConstants.PATH_KEY;\n-import static org.apache.dubbo.common.constants.CommonConstants.RELEASE_KEY;\n-import static org.apache.dubbo.common.constants.CommonConstants.TIMEOUT_KEY;\n-import static org.apache.dubbo.common.constants.CommonConstants.TIMESTAMP_KEY;\n-import static org.apache.dubbo.common.constants.CommonConstants.VERSION_KEY;\n-import static org.apache.dubbo.common.constants.CommonConstants.ON_CONNECT_KEY;\n-import static org.apache.dubbo.common.constants.CommonConstants.ON_DISCONNECT_KEY;\n-import static org.apache.dubbo.common.constants.FilterConstants.VALIDATION_KEY;\n-import static org.apache.dubbo.common.constants.QosConstants.ACCEPT_FOREIGN_IP;\n-import static org.apache.dubbo.common.constants.QosConstants.QOS_ENABLE;\n-import static org.apache.dubbo.common.constants.QosConstants.QOS_HOST;\n-import static org.apache.dubbo.common.constants.QosConstants.QOS_PORT;\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.OVERRIDE_PROTOCOL;\n-import static org.apache.dubbo.common.constants.RegistryConstants.PROVIDERS_CATEGORY;\n-import static org.apache.dubbo.common.constants.RegistryConstants.REGISTRY_KEY;\n-import static org.apache.dubbo.common.constants.RegistryConstants.REGISTRY_PROTOCOL;\n-import static org.apache.dubbo.common.constants.RegistryConstants.ROUTERS_CATEGORY;\n-import static org.apache.dubbo.common.constants.RegistryConstants.SERVICE_REGISTRY_PROTOCOL;\n-import static org.apache.dubbo.common.utils.UrlUtils.classifyUrls;\n-import static org.apache.dubbo.registry.Constants.CONFIGURATORS_SUFFIX;\n-import static org.apache.dubbo.registry.Constants.CONSUMER_PROTOCOL;\n-import static org.apache.dubbo.registry.Constants.DEFAULT_REGISTRY_RETRY_PERIOD;\n-import static org.apache.dubbo.registry.Constants.PROVIDER_PROTOCOL;\n-import static org.apache.dubbo.registry.Constants.REGISTER_IP_KEY;\n-import static org.apache.dubbo.registry.Constants.REGISTER_KEY;\n-import static org.apache.dubbo.registry.Constants.REGISTRY_RETRY_PERIOD_KEY;\n-import static org.apache.dubbo.registry.Constants.SIMPLIFIED_KEY;\n-import static org.apache.dubbo.remoting.Constants.BIND_IP_KEY;\n-import static org.apache.dubbo.remoting.Constants.BIND_PORT_KEY;\n-import static org.apache.dubbo.remoting.Constants.CHECK_KEY;\n-import static org.apache.dubbo.remoting.Constants.CODEC_KEY;\n-import static org.apache.dubbo.remoting.Constants.CONNECTIONS_KEY;\n-import static org.apache.dubbo.remoting.Constants.EXCHANGER_KEY;\n-import static org.apache.dubbo.remoting.Constants.SERIALIZATION_KEY;\n-import static org.apache.dubbo.rpc.Constants.DEPRECATED_KEY;\n-import static org.apache.dubbo.rpc.Constants.INTERFACES;\n-import static org.apache.dubbo.rpc.Constants.MOCK_KEY;\n-import static org.apache.dubbo.rpc.Constants.TOKEN_KEY;\n-import static org.apache.dubbo.rpc.cluster.Constants.EXPORT_KEY;\n-import static org.apache.dubbo.rpc.cluster.Constants.REFER_KEY;\n-import static org.apache.dubbo.rpc.cluster.Constants.WARMUP_KEY;\n-import static org.apache.dubbo.rpc.cluster.Constants.WEIGHT_KEY;\n-\n-/**\n- * TODO, replace RegistryProtocol completely in the future.\n- */\n-public class RegistryProtocol implements Protocol {\n-    public static final String[] DEFAULT_REGISTER_PROVIDER_KEYS = {\n-            APPLICATION_KEY, CODEC_KEY, EXCHANGER_KEY, SERIALIZATION_KEY, CLUSTER_KEY, CONNECTIONS_KEY, DEPRECATED_KEY,\n-            GROUP_KEY, LOADBALANCE_KEY, MOCK_KEY, PATH_KEY, TIMEOUT_KEY, TOKEN_KEY, VERSION_KEY, WARMUP_KEY,\n-            WEIGHT_KEY, TIMESTAMP_KEY, DUBBO_VERSION_KEY, RELEASE_KEY\n-    };\n-\n-    public static final String[] DEFAULT_REGISTER_CONSUMER_KEYS = {\n-            APPLICATION_KEY, VERSION_KEY, GROUP_KEY, DUBBO_VERSION_KEY, RELEASE_KEY\n-    };\n-\n-    private final static Logger logger = LoggerFactory.getLogger(InterfaceCompatibleRegistryProtocol.class);\n-    private final Map<URL, NotifyListener> overrideListeners = new ConcurrentHashMap<>();\n-    private final Map<String, ServiceConfigurationListener> serviceConfigurationListeners = new ConcurrentHashMap<>();\n-    private final ProviderConfigurationListener providerConfigurationListener = new ProviderConfigurationListener();\n-    // To solve the problem of RMI repeated exposure port conflicts, the services that have been exposed are no longer exposed.\n-    // providerurl <--> exporter\n-    private final ConcurrentMap<String, ExporterChangeableWrapper<?>> bounds = new ConcurrentHashMap<>();\n-    protected Protocol protocol;\n-    protected RegistryFactory registryFactory;\n-    protected ProxyFactory proxyFactory;\n-\n-    private ConcurrentMap<URL, ReExportTask> reExportFailedTasks = new ConcurrentHashMap<>();\n-    private HashedWheelTimer retryTimer = new HashedWheelTimer(new NamedThreadFactory(\"DubboReexportTimer\", true), DEFAULT_REGISTRY_RETRY_PERIOD, TimeUnit.MILLISECONDS, 128);\n-\n-    // get the parameters which shouldn't been displayed in url string(Starting with .)\n-    private static String[] getHiddenKeys(URL url) {\n-        Map<String, String> params = url.getParameters();\n-        if (CollectionUtils.isNotEmptyMap(params)) {\n-            return params.keySet().stream()\n-                    .filter(k -> k.startsWith(HIDDEN_KEY_PREFIX))\n-                    .toArray(String[]::new);\n-        } else {\n-            return new String[0];\n-        }\n-    }\n-\n-    public void setProtocol(Protocol protocol) {\n-        this.protocol = protocol;\n-    }\n-\n-    public void setRegistryFactory(RegistryFactory registryFactory) {\n-        this.registryFactory = registryFactory;\n-    }\n-\n-    public void setProxyFactory(ProxyFactory proxyFactory) {\n-        this.proxyFactory = proxyFactory;\n-    }\n-\n-    @Override\n-    public int getDefaultPort() {\n-        return 9090;\n-    }\n-\n-    public Map<URL, NotifyListener> getOverrideListeners() {\n-        return overrideListeners;\n-    }\n-\n-    private void registerStatedUrl(URL registryUrl, URL registeredProviderUrl, boolean registered) {\n-        ProviderModel model = ApplicationModel.getProviderModel(registeredProviderUrl.getServiceKey());\n-        model.addStatedUrl(new ProviderModel.RegisterStatedURL(\n-                registeredProviderUrl,\n-                registryUrl,\n-                registered));\n-    }\n-\n-    @Override\n-    public <T> Exporter<T> export(final Invoker<T> originInvoker) throws RpcException {\n-        URL registryUrl = getRegistryUrl(originInvoker);\n-        // url to export locally\n-        URL providerUrl = getProviderUrl(originInvoker);\n-\n-        // Subscribe the override data\n-        // FIXME When the provider subscribes, it will affect the scene : a certain JVM exposes the service and call\n-        //  the same service. Because the subscribed is cached key with the name of the service, it causes the\n-        //  subscription information to cover.\n-        final URL overrideSubscribeUrl = getSubscribedOverrideUrl(providerUrl);\n-        final OverrideListener overrideSubscribeListener = new OverrideListener(overrideSubscribeUrl, originInvoker);\n-        overrideListeners.put(overrideSubscribeUrl, overrideSubscribeListener);\n-\n-        providerUrl = overrideUrlWithConfig(providerUrl, overrideSubscribeListener);\n-        // export invoker\n-        final ExporterChangeableWrapper<T> exporter = doLocalExport(originInvoker, providerUrl);\n-\n-        // url to registry\n-        final Registry registry = getRegistry(originInvoker);\n-        final URL registeredProviderUrl = getUrlToRegistry(providerUrl, registryUrl);\n-\n-        // decide if we need to delay publish\n-        boolean register = providerUrl.getParameter(REGISTER_KEY, true);\n-        if (register) {\n-            registry.register(registeredProviderUrl);\n-        }\n-\n-        // register stated url on provider model\n-        registerStatedUrl(registryUrl, registeredProviderUrl, register);\n-\n-\n-        exporter.setRegisterUrl(registeredProviderUrl);\n-        exporter.setSubscribeUrl(overrideSubscribeUrl);\n-\n-        // Deprecated! Subscribe to override rules in 2.6.x or before.\n-        registry.subscribe(overrideSubscribeUrl, overrideSubscribeListener);\n-\n-        notifyExport(exporter);\n-        //Ensure that a new exporter instance is returned every time export\n-        return new DestroyableExporter<>(exporter);\n-    }\n-\n-    private <T> void notifyExport(ExporterChangeableWrapper<T> exporter) {\n-        List<RegistryProtocolListener> listeners = ExtensionLoader.getExtensionLoader(RegistryProtocolListener.class)\n-                .getActivateExtension(exporter.getOriginInvoker().getUrl(), \"registry.protocol.listener\");\n-        if (CollectionUtils.isNotEmpty(listeners)) {\n-            for (RegistryProtocolListener listener : listeners) {\n-                listener.onExport(this, exporter);\n-            }\n-        }\n-    }\n-\n-    private URL overrideUrlWithConfig(URL providerUrl, OverrideListener listener) {\n-        providerUrl = providerConfigurationListener.overrideUrl(providerUrl);\n-        ServiceConfigurationListener serviceConfigurationListener = new ServiceConfigurationListener(providerUrl, listener);\n-        serviceConfigurationListeners.put(providerUrl.getServiceKey(), serviceConfigurationListener);\n-        return serviceConfigurationListener.overrideUrl(providerUrl);\n-    }\n-\n-    @SuppressWarnings(\"unchecked\")\n-    private <T> ExporterChangeableWrapper<T> doLocalExport(final Invoker<T> originInvoker, URL providerUrl) {\n-        String key = getCacheKey(originInvoker);\n-\n-        return (ExporterChangeableWrapper<T>) bounds.computeIfAbsent(key, s -> {\n-            Invoker<?> invokerDelegate = new InvokerDelegate<>(originInvoker, providerUrl);\n-            return new ExporterChangeableWrapper<>((Exporter<T>) protocol.export(invokerDelegate), originInvoker);\n-        });\n-    }\n-\n-    public <T> void reExport(Exporter<T> exporter, URL newInvokerUrl) {\n-        if (exporter instanceof ExporterChangeableWrapper) {\n-            ExporterChangeableWrapper<T> exporterWrapper = (ExporterChangeableWrapper<T>) exporter;\n-            Invoker<T> originInvoker = exporterWrapper.getOriginInvoker();\n-            reExport(originInvoker, newInvokerUrl);\n-        }\n-    }\n-\n-    /**\n-     * Reexport the invoker of the modified url\n-     *\n-     * @param originInvoker\n-     * @param newInvokerUrl\n-     * @param <T>\n-     */\n-    @SuppressWarnings(\"unchecked\")\n-    public <T> void reExport(final Invoker<T> originInvoker, URL newInvokerUrl) {\n-        String key = getCacheKey(originInvoker);\n-        ExporterChangeableWrapper<T> exporter = (ExporterChangeableWrapper<T>) bounds.get(key);\n-        URL registeredUrl = exporter.getRegisterUrl();\n-\n-        URL registryUrl = getRegistryUrl(originInvoker);\n-        URL newProviderUrl = getUrlToRegistry(newInvokerUrl, registryUrl);\n-\n-        // update local exporter\n-        Invoker<T> invokerDelegate = new InvokerDelegate<T>(originInvoker, newInvokerUrl);\n-        exporter.setExporter(protocol.export(invokerDelegate));\n-\n-        // update registry\n-        if (!newProviderUrl.equals(registeredUrl)) {\n-            try {\n-                doReExport(originInvoker, exporter, registryUrl, registeredUrl, newProviderUrl);\n-            } catch (Exception e) {\n-                ReExportTask oldTask = reExportFailedTasks.get(registeredUrl);\n-                if (oldTask != null) {\n-                    return;\n-                }\n-                ReExportTask task = new ReExportTask(\n-                        () -> doReExport(originInvoker, exporter, registryUrl, registeredUrl, newProviderUrl),\n-                        registeredUrl,\n-                        null\n-                );\n-                oldTask = reExportFailedTasks.putIfAbsent(registeredUrl, task);\n-                if (oldTask == null) {\n-                    // never has a retry task. then start a new task for retry.\n-                    retryTimer.newTimeout(task, registryUrl.getParameter(REGISTRY_RETRY_PERIOD_KEY, DEFAULT_REGISTRY_RETRY_PERIOD), TimeUnit.MILLISECONDS);\n-                }\n-            }\n-        }\n-    }\n-\n-    private <T> void doReExport(final Invoker<T> originInvoker, ExporterChangeableWrapper<T> exporter,\n-                                URL registryUrl, URL oldProviderUrl, URL newProviderUrl) {\n-        if (getProviderUrl(originInvoker).getParameter(REGISTER_KEY, true)) {\n-            Registry registry = null;\n-            try {\n-                registry = getRegistry(originInvoker);\n-            } catch (Exception e) {\n-                throw new SkipFailbackWrapperException(e);\n-            }\n-\n-            logger.info(\"Try to unregister old url: \" + oldProviderUrl);\n-            registry.reExportUnregister(oldProviderUrl);\n-\n-            logger.info(\"Try to register new url: \" + newProviderUrl);\n-            registry.reExportRegister(newProviderUrl);\n-        }\n-        try {\n-            ProviderModel.RegisterStatedURL statedUrl = getStatedUrl(registryUrl, newProviderUrl);\n-            statedUrl.setProviderUrl(newProviderUrl);\n-            exporter.setRegisterUrl(newProviderUrl);\n-        } catch (Exception e) {\n-            throw new SkipFailbackWrapperException(e);\n-        }\n-    }\n-\n-    private ProviderModel.RegisterStatedURL getStatedUrl(URL registryUrl, URL providerUrl) {\n-        ProviderModel providerModel = ApplicationModel.getServiceRepository()\n-                .lookupExportedService(providerUrl.getServiceKey());\n-\n-        List<ProviderModel.RegisterStatedURL> statedUrls = providerModel.getStatedUrl();\n-        return statedUrls.stream()\n-                .filter(u -> u.getRegistryUrl().equals(registryUrl)\n-                        && u.getProviderUrl().getProtocol().equals(providerUrl.getProtocol()))\n-                .findFirst().orElseThrow(() -> new IllegalStateException(\"There should have at least one registered url.\"));\n-    }\n-\n-    /**\n-     * Get an instance of registry based on the address of invoker\n-     *\n-     * @param originInvoker\n-     * @return\n-     */\n-    protected Registry getRegistry(final Invoker<?> originInvoker) {\n-        URL registryUrl = getRegistryUrl(originInvoker);\n-        return registryFactory.getRegistry(registryUrl);\n-    }\n-\n-    protected URL getRegistryUrl(Invoker<?> originInvoker) {\n-        return originInvoker.getUrl();\n-    }\n-\n-    protected URL getRegistryUrl(URL url) {\n-        if (SERVICE_REGISTRY_PROTOCOL.equals(url.getProtocol())) {\n-            return url;\n-        }\n-        return url.addParameter(REGISTRY_KEY, url.getProtocol()).setProtocol(SERVICE_REGISTRY_PROTOCOL);\n-    }\n-\n-    /**\n-     * Return the url that is registered to the registry and filter the url parameter once\n-     *\n-     * @param providerUrl\n-     * @return url to registry.\n-     */\n-    private URL getUrlToRegistry(final URL providerUrl, final URL registryUrl) {\n-\n-        URL registeredProviderUrl = removeUselessParameters(providerUrl);\n-\n-        //The address you see at the registry\n-        if (!registryUrl.getParameter(SIMPLIFIED_KEY, false)) {\n-            return registeredProviderUrl.removeParameters(getHiddenKeys(registeredProviderUrl)).removeParameters(\n-                    MONITOR_KEY, BIND_IP_KEY, BIND_PORT_KEY, QOS_ENABLE, QOS_HOST, QOS_PORT, ACCEPT_FOREIGN_IP, VALIDATION_KEY,\n-                    INTERFACES);\n-        } else {\n-            String extraKeys = registryUrl.getParameter(EXTRA_KEYS_KEY, \"\");\n-            // if path is not the same as interface name then we should keep INTERFACE_KEY,\n-            // otherwise, the registry structure of zookeeper would be '/dubbo/path/providers',\n-            // but what we expect is '/dubbo/interface/providers'\n-            if (!registeredProviderUrl.getPath().equals(registeredProviderUrl.getParameter(INTERFACE_KEY))) {\n-                if (StringUtils.isNotEmpty(extraKeys)) {\n-                    extraKeys += \",\";\n-                }\n-                extraKeys += INTERFACE_KEY;\n-            }\n-            String[] paramsToRegistry = getParamsToRegistry(DEFAULT_REGISTER_PROVIDER_KEYS\n-                    , COMMA_SPLIT_PATTERN.split(extraKeys));\n-            return URL.valueOf(registeredProviderUrl, paramsToRegistry, registeredProviderUrl.getParameter(METHODS_KEY, (String[]) null));\n-        }\n-\n-    }\n-\n-    /**\n-     * Remove information that does not require registration\n-     * @param providerUrl\n-     * @return\n-     */\n-    private URL removeUselessParameters(URL providerUrl) {\n-        return providerUrl.removeParameters(ON_CONNECT_KEY, ON_DISCONNECT_KEY);\n-    }\n-\n-    private URL getSubscribedOverrideUrl(URL registeredProviderUrl) {\n-        return registeredProviderUrl.setProtocol(PROVIDER_PROTOCOL)\n-                .addParameters(CATEGORY_KEY, CONFIGURATORS_CATEGORY, CHECK_KEY, String.valueOf(false));\n-    }\n-\n-    /**\n-     * Get the address of the providerUrl through the url of the invoker\n-     *\n-     * @param originInvoker\n-     * @return\n-     */\n-    private URL getProviderUrl(final Invoker<?> originInvoker) {\n-        String export = originInvoker.getUrl().getParameterAndDecoded(EXPORT_KEY);\n-        if (export == null || export.length() == 0) {\n-            throw new IllegalArgumentException(\"The registry export url is null! registry: \" + originInvoker.getUrl());\n-        }\n-        return URL.valueOf(export);\n-    }\n-\n-    /**\n-     * Get the key cached in bounds by invoker\n-     *\n-     * @param originInvoker\n-     * @return\n-     */\n-    private String getCacheKey(final Invoker<?> originInvoker) {\n-        URL providerUrl = getProviderUrl(originInvoker);\n-        String key = providerUrl.removeParameters(\"dynamic\", \"enabled\").toFullString();\n-        return key;\n-    }\n-\n-    @Override\n-    @SuppressWarnings(\"unchecked\")\n-    public <T> Invoker<T> refer(Class<T> type, URL url) throws RpcException {\n-        url = getRegistryUrl(url);\n-        Registry registry = registryFactory.getRegistry(url);\n-        if (RegistryService.class.equals(type)) {\n-            return proxyFactory.getInvoker((T) registry, type, url);\n-        }\n-\n-        // group=\"a,b\" or group=\"*\"\n-        Map<String, String> qs = StringUtils.parseQueryString(url.getParameterAndDecoded(REFER_KEY));\n-        String group = qs.get(GROUP_KEY);\n-        if (group != null && group.length() > 0) {\n-            if ((COMMA_SPLIT_PATTERN.split(group)).length > 1 || \"*\".equals(group)) {\n-                return doRefer(Cluster.getCluster(MergeableCluster.NAME), registry, type, url, qs);\n-            }\n-        }\n-\n-        Cluster cluster = Cluster.getCluster(qs.get(CLUSTER_KEY));\n-        return doRefer(cluster, registry, type, url, qs);\n-    }\n-\n-    protected <T> Invoker<T> doRefer(Cluster cluster, Registry registry, Class<T> type, URL url, Map<String, String> parameters) {\n-        URL consumerUrl = new URL(CONSUMER_PROTOCOL, parameters.remove(REGISTER_IP_KEY), 0, type.getName(), parameters);\n-        ClusterInvoker<T> migrationInvoker = getMigrationInvoker(this, cluster, registry, type, url, consumerUrl);\n-        return interceptInvoker(migrationInvoker, url, consumerUrl);\n-    }\n-\n-    protected <T> ClusterInvoker<T> getMigrationInvoker(RegistryProtocol registryProtocol, Cluster cluster, Registry registry, Class<T> type, URL url, URL consumerUrl) {\n-        return new ServiceDiscoveryMigrationInvoker<T>(registryProtocol, cluster, registry, type, url, consumerUrl);\n-    }\n-\n-    protected <T> Invoker<T> interceptInvoker(ClusterInvoker<T> invoker, URL url, URL consumerUrl) {\n-        List<RegistryProtocolListener> listeners = findRegistryProtocolListeners(url);\n-        if (CollectionUtils.isEmpty(listeners)) {\n-            return invoker;\n-        }\n-\n-        for (RegistryProtocolListener listener : listeners) {\n-            listener.onRefer(this, invoker, consumerUrl);\n-        }\n-        return invoker;\n-    }\n-\n-    public <T> ClusterInvoker<T> getServiceDiscoveryInvoker(Cluster cluster, Registry registry, Class<T> type, URL url) {\n-        DynamicDirectory<T> directory = new ServiceDiscoveryRegistryDirectory<>(type, url);\n-        return doCreateInvoker(directory, cluster, registry, type);\n-    }\n-\n-    public <T> ClusterInvoker<T> getInvoker(Cluster cluster, Registry registry, Class<T> type, URL url) {\n-        // FIXME, this method is currently not used, create the right registry before enable.\n-        DynamicDirectory<T> directory = new RegistryDirectory<>(type, url);\n-        return doCreateInvoker(directory, cluster, registry, type);\n-    }\n-\n-    protected <T> ClusterInvoker<T> doCreateInvoker(DynamicDirectory<T> directory, Cluster cluster, Registry registry, Class<T> type) {\n-        directory.setRegistry(registry);\n-        directory.setProtocol(protocol);\n-        // all attributes of REFER_KEY\n-        Map<String, String> parameters = new HashMap<String, String>(directory.getConsumerUrl().getParameters());\n-        URL urlToRegistry = new URL(CONSUMER_PROTOCOL, parameters.remove(REGISTER_IP_KEY), 0, type.getName(), parameters);\n-        if (directory.isShouldRegister()) {\n-            directory.setRegisteredConsumerUrl(urlToRegistry);\n-            registry.register(directory.getRegisteredConsumerUrl());\n-        }\n-        directory.buildRouterChain(urlToRegistry);\n-        directory.subscribe(toSubscribeUrl(urlToRegistry));\n-\n-        return (ClusterInvoker<T>) cluster.join(directory);\n-    }\n-\n-    public <T> void reRefer(ClusterInvoker<?> invoker, URL newSubscribeUrl) {\n-        if (!(invoker instanceof MigrationClusterInvoker)) {\n-            logger.error(\"Only invoker type of MigrationClusterInvoker supports reRefer, current invoker is \" + invoker.getClass());\n-            return;\n-        }\n-\n-        MigrationClusterInvoker<?> migrationClusterInvoker = (MigrationClusterInvoker<?>)invoker;\n-        migrationClusterInvoker.reRefer(newSubscribeUrl);\n-    }\n-\n-    public static URL toSubscribeUrl(URL url) {\n-        return url.addParameter(CATEGORY_KEY, PROVIDERS_CATEGORY + \",\" + CONFIGURATORS_CATEGORY + \",\" + ROUTERS_CATEGORY);\n-    }\n-\n-    protected List<RegistryProtocolListener> findRegistryProtocolListeners(URL url) {\n-        return ExtensionLoader.getExtensionLoader(RegistryProtocolListener.class)\n-                .getActivateExtension(url, \"registry.protocol.listener\");\n-    }\n-\n-    // available to test\n-    public String[] getParamsToRegistry(String[] defaultKeys, String[] additionalParameterKeys) {\n-        int additionalLen = additionalParameterKeys.length;\n-        String[] registryParams = new String[defaultKeys.length + additionalLen];\n-        System.arraycopy(defaultKeys, 0, registryParams, 0, defaultKeys.length);\n-        System.arraycopy(additionalParameterKeys, 0, registryParams, defaultKeys.length, additionalLen);\n-        return registryParams;\n-    }\n-\n-    @Override\n-    public void destroy() {\n-        List<RegistryProtocolListener> listeners = ExtensionLoader.getExtensionLoader(RegistryProtocolListener.class)\n-                .getLoadedExtensionInstances();\n-        if (CollectionUtils.isNotEmpty(listeners)) {\n-            for (RegistryProtocolListener listener : listeners) {\n-                listener.onDestroy();\n-            }\n-        }\n-\n-        List<Exporter<?>> exporters = new ArrayList<Exporter<?>>(bounds.values());\n-        for (Exporter<?> exporter : exporters) {\n-            exporter.unexport();\n-        }\n-        bounds.clear();\n-\n-        ExtensionLoader.getExtensionLoader(GovernanceRuleRepository.class).getDefaultExtension()\n-                .removeListener(ApplicationModel.getApplication() + CONFIGURATORS_SUFFIX, providerConfigurationListener);\n-    }\n-\n-    @Override\n-    public List<ProtocolServer> getServers() {\n-        return protocol.getServers();\n-    }\n-\n-    // merge the urls of configurators\n-    private static URL getConfiguredInvokerUrl(List<Configurator> configurators, URL url) {\n-        if (configurators != null && configurators.size() > 0) {\n-            for (Configurator configurator : configurators) {\n-                url = configurator.configure(url);\n-            }\n-        }\n-        return url;\n-    }\n-\n-    public static class InvokerDelegate<T> extends InvokerWrapper<T> {\n-        private final Invoker<T> invoker;\n-\n-        /**\n-         * @param invoker\n-         * @param url     invoker.getUrl return this value\n-         */\n-        public InvokerDelegate(Invoker<T> invoker, URL url) {\n-            super(invoker, url);\n-            this.invoker = invoker;\n-        }\n-\n-        public Invoker<T> getInvoker() {\n-            if (invoker instanceof InvokerDelegate) {\n-                return ((InvokerDelegate<T>) invoker).getInvoker();\n-            } else {\n-                return invoker;\n-            }\n-        }\n-    }\n-\n-    private static class DestroyableExporter<T> implements Exporter<T> {\n-\n-        private Exporter<T> exporter;\n-\n-        public DestroyableExporter(Exporter<T> exporter) {\n-            this.exporter = exporter;\n-        }\n-\n-        @Override\n-        public Invoker<T> getInvoker() {\n-            return exporter.getInvoker();\n-        }\n-\n-        @Override\n-        public void unexport() {\n-            exporter.unexport();\n-        }\n-    }\n-\n-    /**\n-     * Reexport: the exporter destroy problem in protocol\n-     * 1.Ensure that the exporter returned by registryprotocol can be normal destroyed\n-     * 2.No need to re-register to the registry after notify\n-     * 3.The invoker passed by the export method , would better to be the invoker of exporter\n-     */\n-    private class OverrideListener implements NotifyListener {\n-        private final URL subscribeUrl;\n-        private final Invoker originInvoker;\n-\n-\n-        private List<Configurator> configurators;\n-\n-        public OverrideListener(URL subscribeUrl, Invoker originalInvoker) {\n-            this.subscribeUrl = subscribeUrl;\n-            this.originInvoker = originalInvoker;\n-        }\n-\n-        /**\n-         * @param urls The list of registered information, is always not empty, The meaning is the same as the\n-         *             return value of {@link org.apache.dubbo.registry.RegistryService#lookup(URL)}.\n-         */\n-        @Override\n-        public synchronized void notify(List<URL> urls) {\n-            logger.debug(\"original override urls: \" + urls);\n-\n-            List<URL> matchedUrls = getMatchedUrls(urls, subscribeUrl.addParameter(CATEGORY_KEY,\n-                    CONFIGURATORS_CATEGORY));\n-            logger.debug(\"subscribe url: \" + subscribeUrl + \", override urls: \" + matchedUrls);\n-\n-            // No matching results\n-            if (matchedUrls.isEmpty()) {\n-                return;\n-            }\n-\n-            this.configurators = Configurator.toConfigurators(classifyUrls(matchedUrls, UrlUtils::isConfigurator))\n-                    .orElse(configurators);\n-\n-            doOverrideIfNecessary();\n-        }\n-\n-        public synchronized void doOverrideIfNecessary() {\n-            final Invoker<?> invoker;\n-            if (originInvoker instanceof InvokerDelegate) {\n-                invoker = ((InvokerDelegate<?>) originInvoker).getInvoker();\n-            } else {\n-                invoker = originInvoker;\n-            }\n-            //The origin invoker\n-            URL originUrl = RegistryProtocol.this.getProviderUrl(invoker);\n-            String key = getCacheKey(originInvoker);\n-            ExporterChangeableWrapper<?> exporter = bounds.get(key);\n-            if (exporter == null) {\n-                logger.warn(new IllegalStateException(\"error state, exporter should not be null\"));\n-                return;\n-            }\n-            //The current, may have been merged many times\n-            URL currentUrl = exporter.getInvoker().getUrl();\n-            //Merged with this configuration\n-            URL newUrl = getConfiguredInvokerUrl(configurators, currentUrl);\n-            newUrl = getConfiguredInvokerUrl(providerConfigurationListener.getConfigurators(), newUrl);\n-            newUrl = getConfiguredInvokerUrl(serviceConfigurationListeners.get(originUrl.getServiceKey())\n-                    .getConfigurators(), newUrl);\n-            if (!currentUrl.equals(newUrl)) {\n-                RegistryProtocol.this.reExport(originInvoker, newUrl);\n-                logger.info(\"exported provider url changed, origin url: \" + originUrl +\n-                        \", old export url: \" + currentUrl + \", new export url: \" + newUrl);\n-            }\n-        }\n-\n-        private List<URL> getMatchedUrls(List<URL> configuratorUrls, URL currentSubscribe) {\n-            List<URL> result = new ArrayList<URL>();\n-            for (URL url : configuratorUrls) {\n-                URL overrideUrl = url;\n-                // Compatible with the old version\n-                if (url.getParameter(CATEGORY_KEY) == null && OVERRIDE_PROTOCOL.equals(url.getProtocol())) {\n-                    overrideUrl = url.addParameter(CATEGORY_KEY, CONFIGURATORS_CATEGORY);\n-                }\n-\n-                // Check whether url is to be applied to the current service\n-                if (UrlUtils.isMatch(currentSubscribe, overrideUrl)) {\n-                    result.add(url);\n-                }\n-            }\n-            return result;\n-        }\n-    }\n-\n-    private class ServiceConfigurationListener extends AbstractConfiguratorListener {\n-        private URL providerUrl;\n-        private OverrideListener notifyListener;\n-\n-        public ServiceConfigurationListener(URL providerUrl, OverrideListener notifyListener) {\n-            this.providerUrl = providerUrl;\n-            this.notifyListener = notifyListener;\n-            this.initWith(DynamicConfiguration.getRuleKey(providerUrl) + CONFIGURATORS_SUFFIX);\n-        }\n-\n-        private <T> URL overrideUrl(URL providerUrl) {\n-            return RegistryProtocol.getConfiguredInvokerUrl(configurators, providerUrl);\n-        }\n-\n-        @Override\n-        protected void notifyOverrides() {\n-            notifyListener.doOverrideIfNecessary();\n-        }\n-    }\n-\n-    private class ProviderConfigurationListener extends AbstractConfiguratorListener {\n-\n-        public ProviderConfigurationListener() {\n-            this.initWith(ApplicationModel.getApplication() + CONFIGURATORS_SUFFIX);\n-        }\n-\n-        /**\n-         * Get existing configuration rule and override provider url before exporting.\n-         *\n-         * @param providerUrl\n-         * @param <T>\n-         * @return\n-         */\n-        private <T> URL overrideUrl(URL providerUrl) {\n-            return RegistryProtocol.getConfiguredInvokerUrl(configurators, providerUrl);\n-        }\n-\n-        @Override\n-        protected void notifyOverrides() {\n-            overrideListeners.values().forEach(listener -> ((OverrideListener) listener).doOverrideIfNecessary());\n-        }\n-    }\n-\n-    /**\n-     * exporter proxy, establish the corresponding relationship between the returned exporter and the exporter\n-     * exported by the protocol, and can modify the relationship at the time of override.\n-     *\n-     * @param <T>\n-     */\n-    private class ExporterChangeableWrapper<T> implements Exporter<T> {\n-\n-        private final ExecutorService executor = newSingleThreadExecutor(new NamedThreadFactory(\"Exporter-Unexport\", true));\n-\n-        private final Invoker<T> originInvoker;\n-        private Exporter<T> exporter;\n-        private URL subscribeUrl;\n-        private URL registerUrl;\n-\n-        public ExporterChangeableWrapper(Exporter<T> exporter, Invoker<T> originInvoker) {\n-            this.exporter = exporter;\n-            this.originInvoker = originInvoker;\n-        }\n-\n-        public Invoker<T> getOriginInvoker() {\n-            return originInvoker;\n-        }\n-\n-        @Override\n-        public Invoker<T> getInvoker() {\n-            return exporter.getInvoker();\n-        }\n-\n-        public void setExporter(Exporter<T> exporter) {\n-            this.exporter = exporter;\n-        }\n-\n-        @Override\n-        public void unexport() {\n-            String key = getCacheKey(this.originInvoker);\n-            bounds.remove(key);\n-\n-            Registry registry = RegistryProtocol.this.getRegistry(originInvoker);\n-            try {\n-                registry.unregister(registerUrl);\n-            } catch (Throwable t) {\n-                logger.warn(t.getMessage(), t);\n-            }\n-            try {\n-                NotifyListener listener = RegistryProtocol.this.overrideListeners.remove(subscribeUrl);\n-                registry.unsubscribe(subscribeUrl, listener);\n-                ExtensionLoader.getExtensionLoader(GovernanceRuleRepository.class).getDefaultExtension()\n-                        .removeListener(subscribeUrl.getServiceKey() + CONFIGURATORS_SUFFIX,\n-                                serviceConfigurationListeners.get(subscribeUrl.getServiceKey()));\n-            } catch (Throwable t) {\n-                logger.warn(t.getMessage(), t);\n-            }\n-\n-            executor.submit(() -> {\n-                try {\n-                    int timeout = ConfigurationUtils.getServerShutdownTimeout();\n-                    if (timeout > 0) {\n-                        logger.info(\"Waiting \" + timeout + \"ms for registry to notify all consumers before unexport. \" +\n-                                \"Usually, this is called when you use dubbo API\");\n-                        Thread.sleep(timeout);\n-                    }\n-                    exporter.unexport();\n-                } catch (Throwable t) {\n-                    logger.warn(t.getMessage(), t);\n-                }\n-            });\n-        }\n-\n-        public void setSubscribeUrl(URL subscribeUrl) {\n-            this.subscribeUrl = subscribeUrl;\n-        }\n-\n-        public void setRegisterUrl(URL registerUrl) {\n-            this.registerUrl = registerUrl;\n-        }\n-\n-        public URL getRegisterUrl() {\n-            return registerUrl;\n-        }\n-    }\n-\n-    // for unit test\n-    private static RegistryProtocol INSTANCE;\n-\n-    // for unit test\n-    public RegistryProtocol() {\n-        INSTANCE = this;\n-    }\n-\n-    // for unit test\n-    public static RegistryProtocol getRegistryProtocol() {\n-        if (INSTANCE == null) {\n-            ExtensionLoader.getExtensionLoader(Protocol.class).getExtension(REGISTRY_PROTOCOL); // load\n-        }\n-        return INSTANCE;\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.integration;\r\n+\r\n+import org.apache.dubbo.common.URL;\r\n+import org.apache.dubbo.common.config.ConfigurationUtils;\r\n+import org.apache.dubbo.common.config.configcenter.DynamicConfiguration;\r\n+import org.apache.dubbo.common.extension.ExtensionLoader;\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.timer.HashedWheelTimer;\r\n+import org.apache.dubbo.common.utils.CollectionUtils;\r\n+import org.apache.dubbo.common.utils.NamedThreadFactory;\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.RegistryFactory;\r\n+import org.apache.dubbo.registry.RegistryService;\r\n+import org.apache.dubbo.registry.client.ServiceDiscoveryRegistryDirectory;\r\n+import org.apache.dubbo.registry.client.migration.ServiceDiscoveryMigrationInvoker;\r\n+import org.apache.dubbo.registry.retry.ReExportTask;\r\n+import org.apache.dubbo.registry.support.SkipFailbackWrapperException;\r\n+import org.apache.dubbo.rpc.Exporter;\r\n+import org.apache.dubbo.rpc.Invoker;\r\n+import org.apache.dubbo.rpc.Protocol;\r\n+import org.apache.dubbo.rpc.ProtocolServer;\r\n+import org.apache.dubbo.rpc.ProxyFactory;\r\n+import org.apache.dubbo.rpc.RpcException;\r\n+import org.apache.dubbo.rpc.cluster.Cluster;\r\n+import org.apache.dubbo.rpc.cluster.ClusterInvoker;\r\n+import org.apache.dubbo.rpc.cluster.Configurator;\r\n+import org.apache.dubbo.rpc.cluster.governance.GovernanceRuleRepository;\r\n+import org.apache.dubbo.rpc.cluster.support.MergeableCluster;\r\n+import org.apache.dubbo.rpc.cluster.support.migration.MigrationClusterInvoker;\r\n+import org.apache.dubbo.rpc.model.ApplicationModel;\r\n+import org.apache.dubbo.rpc.model.ProviderModel;\r\n+import org.apache.dubbo.rpc.protocol.InvokerWrapper;\r\n+\r\n+import java.util.ArrayList;\r\n+import java.util.HashMap;\r\n+import java.util.List;\r\n+import java.util.Map;\r\n+import java.util.concurrent.ConcurrentHashMap;\r\n+import java.util.concurrent.ConcurrentMap;\r\n+import java.util.concurrent.ExecutorService;\r\n+import java.util.concurrent.TimeUnit;\r\n+\r\n+import static java.util.concurrent.Executors.newSingleThreadExecutor;\r\n+import static org.apache.dubbo.common.constants.CommonConstants.APPLICATION_KEY;\r\n+import static org.apache.dubbo.common.constants.CommonConstants.CLUSTER_KEY;\r\n+import static org.apache.dubbo.common.constants.CommonConstants.COMMA_SPLIT_PATTERN;\r\n+import static org.apache.dubbo.common.constants.CommonConstants.DUBBO_VERSION_KEY;\r\n+import static org.apache.dubbo.common.constants.CommonConstants.EXTRA_KEYS_KEY;\r\n+import static org.apache.dubbo.common.constants.CommonConstants.GROUP_KEY;\r\n+import static org.apache.dubbo.common.constants.CommonConstants.HIDDEN_KEY_PREFIX;\r\n+import static org.apache.dubbo.common.constants.CommonConstants.INTERFACE_KEY;\r\n+import static org.apache.dubbo.common.constants.CommonConstants.LOADBALANCE_KEY;\r\n+import static org.apache.dubbo.common.constants.CommonConstants.METHODS_KEY;\r\n+import static org.apache.dubbo.common.constants.CommonConstants.MONITOR_KEY;\r\n+import static org.apache.dubbo.common.constants.CommonConstants.PATH_KEY;\r\n+import static org.apache.dubbo.common.constants.CommonConstants.RELEASE_KEY;\r\n+import static org.apache.dubbo.common.constants.CommonConstants.TIMEOUT_KEY;\r\n+import static org.apache.dubbo.common.constants.CommonConstants.TIMESTAMP_KEY;\r\n+import static org.apache.dubbo.common.constants.CommonConstants.VERSION_KEY;\r\n+import static org.apache.dubbo.common.constants.CommonConstants.ON_CONNECT_KEY;\r\n+import static org.apache.dubbo.common.constants.CommonConstants.ON_DISCONNECT_KEY;\r\n+import static org.apache.dubbo.common.constants.FilterConstants.VALIDATION_KEY;\r\n+import static org.apache.dubbo.common.constants.QosConstants.ACCEPT_FOREIGN_IP;\r\n+import static org.apache.dubbo.common.constants.QosConstants.QOS_ENABLE;\r\n+import static org.apache.dubbo.common.constants.QosConstants.QOS_HOST;\r\n+import static org.apache.dubbo.common.constants.QosConstants.QOS_PORT;\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.OVERRIDE_PROTOCOL;\r\n+import static org.apache.dubbo.common.constants.RegistryConstants.PROVIDERS_CATEGORY;\r\n+import static org.apache.dubbo.common.constants.RegistryConstants.REGISTRY_KEY;\r\n+import static org.apache.dubbo.common.constants.RegistryConstants.REGISTRY_PROTOCOL;\r\n+import static org.apache.dubbo.common.constants.RegistryConstants.ROUTERS_CATEGORY;\r\n+import static org.apache.dubbo.common.constants.RegistryConstants.SERVICE_REGISTRY_PROTOCOL;\r\n+import static org.apache.dubbo.common.utils.UrlUtils.classifyUrls;\r\n+import static org.apache.dubbo.registry.Constants.CONFIGURATORS_SUFFIX;\r\n+import static org.apache.dubbo.registry.Constants.CONSUMER_PROTOCOL;\r\n+import static org.apache.dubbo.registry.Constants.DEFAULT_REGISTRY_RETRY_PERIOD;\r\n+import static org.apache.dubbo.registry.Constants.PROVIDER_PROTOCOL;\r\n+import static org.apache.dubbo.registry.Constants.REGISTER_IP_KEY;\r\n+import static org.apache.dubbo.registry.Constants.REGISTER_KEY;\r\n+import static org.apache.dubbo.registry.Constants.REGISTRY_RETRY_PERIOD_KEY;\r\n+import static org.apache.dubbo.registry.Constants.SIMPLIFIED_KEY;\r\n+import static org.apache.dubbo.remoting.Constants.BIND_IP_KEY;\r\n+import static org.apache.dubbo.remoting.Constants.BIND_PORT_KEY;\r\n+import static org.apache.dubbo.remoting.Constants.CHECK_KEY;\r\n+import static org.apache.dubbo.remoting.Constants.CODEC_KEY;\r\n+import static org.apache.dubbo.remoting.Constants.CONNECTIONS_KEY;\r\n+import static org.apache.dubbo.remoting.Constants.EXCHANGER_KEY;\r\n+import static org.apache.dubbo.remoting.Constants.SERIALIZATION_KEY;\r\n+import static org.apache.dubbo.rpc.Constants.DEPRECATED_KEY;\r\n+import static org.apache.dubbo.rpc.Constants.INTERFACES;\r\n+import static org.apache.dubbo.rpc.Constants.MOCK_KEY;\r\n+import static org.apache.dubbo.rpc.Constants.TOKEN_KEY;\r\n+import static org.apache.dubbo.rpc.cluster.Constants.EXPORT_KEY;\r\n+import static org.apache.dubbo.rpc.cluster.Constants.REFER_KEY;\r\n+import static org.apache.dubbo.rpc.cluster.Constants.WARMUP_KEY;\r\n+import static org.apache.dubbo.rpc.cluster.Constants.WEIGHT_KEY;\r\n+\r\n+/**\r\n+ * TODO, replace RegistryProtocol completely in the future.\r\n+ */\r\n+public class RegistryProtocol implements Protocol {\r\n+    public static final String[] DEFAULT_REGISTER_PROVIDER_KEYS = {\r\n+            APPLICATION_KEY, CODEC_KEY, EXCHANGER_KEY, SERIALIZATION_KEY, CLUSTER_KEY, CONNECTIONS_KEY, DEPRECATED_KEY,\r\n+            GROUP_KEY, LOADBALANCE_KEY, MOCK_KEY, PATH_KEY, TIMEOUT_KEY, TOKEN_KEY, VERSION_KEY, WARMUP_KEY,\r\n+            WEIGHT_KEY, TIMESTAMP_KEY, DUBBO_VERSION_KEY, RELEASE_KEY\r\n+    };\r\n+\r\n+    public static final String[] DEFAULT_REGISTER_CONSUMER_KEYS = {\r\n+            APPLICATION_KEY, VERSION_KEY, GROUP_KEY, DUBBO_VERSION_KEY, RELEASE_KEY\r\n+    };\r\n+\r\n+    private final static Logger logger = LoggerFactory.getLogger(InterfaceCompatibleRegistryProtocol.class);\r\n+    private final Map<URL, NotifyListener> overrideListeners = new ConcurrentHashMap<>();\r\n+    private final Map<String, ServiceConfigurationListener> serviceConfigurationListeners = new ConcurrentHashMap<>();\r\n+    private final ProviderConfigurationListener providerConfigurationListener = new ProviderConfigurationListener();\r\n+    // To solve the problem of RMI repeated exposure port conflicts, the services that have been exposed are no longer exposed.\r\n+    // providerurl <--> exporter\r\n+    private final ConcurrentMap<String, ExporterChangeableWrapper<?>> bounds = new ConcurrentHashMap<>();\r\n+    protected Protocol protocol;\r\n+    protected RegistryFactory registryFactory;\r\n+    protected ProxyFactory proxyFactory;\r\n+\r\n+    private ConcurrentMap<URL, ReExportTask> reExportFailedTasks = new ConcurrentHashMap<>();\r\n+    private HashedWheelTimer retryTimer = new HashedWheelTimer(new NamedThreadFactory(\"DubboReexportTimer\", true), DEFAULT_REGISTRY_RETRY_PERIOD, TimeUnit.MILLISECONDS, 128);\r\n+\r\n+    // get the parameters which shouldn't been displayed in url string(Starting with .)\r\n+    private static String[] getHiddenKeys(URL url) {\r\n+        Map<String, String> params = url.getParameters();\r\n+        if (CollectionUtils.isNotEmptyMap(params)) {\r\n+            return params.keySet().stream()\r\n+                    .filter(k -> k.startsWith(HIDDEN_KEY_PREFIX))\r\n+                    .toArray(String[]::new);\r\n+        } else {\r\n+            return new String[0];\r\n+        }\r\n+    }\r\n+\r\n+    public void setProtocol(Protocol protocol) {\r\n+        this.protocol = protocol;\r\n+    }\r\n+\r\n+    public void setRegistryFactory(RegistryFactory registryFactory) {\r\n+        this.registryFactory = registryFactory;\r\n+    }\r\n+\r\n+    public void setProxyFactory(ProxyFactory proxyFactory) {\r\n+        this.proxyFactory = proxyFactory;\r\n+    }\r\n+\r\n+    @Override\r\n+    public int getDefaultPort() {\r\n+        return 9090;\r\n+    }\r\n+\r\n+    public Map<URL, NotifyListener> getOverrideListeners() {\r\n+        return overrideListeners;\r\n+    }\r\n+\r\n+    private void registerStatedUrl(URL registryUrl, URL registeredProviderUrl, boolean registered) {\r\n+        ProviderModel model = ApplicationModel.getProviderModel(registeredProviderUrl.getServiceKey());\r\n+        model.addStatedUrl(new ProviderModel.RegisterStatedURL(\r\n+                registeredProviderUrl,\r\n+                registryUrl,\r\n+                registered));\r\n+    }\r\n+\r\n+    @Override\r\n+    public <T> Exporter<T> export(final Invoker<T> originInvoker) throws RpcException {\r\n+        URL registryUrl = getRegistryUrl(originInvoker);\r\n+        // url to export locally\r\n+        URL providerUrl = getProviderUrl(originInvoker);\r\n+\r\n+        // Subscribe the override data\r\n+        // FIXME When the provider subscribes, it will affect the scene : a certain JVM exposes the service and call\r\n+        //  the same service. Because the subscribed is cached key with the name of the service, it causes the\r\n+        //  subscription information to cover.\r\n+        final URL overrideSubscribeUrl = getSubscribedOverrideUrl(providerUrl);\r\n+        final OverrideListener overrideSubscribeListener = new OverrideListener(overrideSubscribeUrl, originInvoker);\r\n+        overrideListeners.put(overrideSubscribeUrl, overrideSubscribeListener);\r\n+\r\n+        providerUrl = overrideUrlWithConfig(providerUrl, overrideSubscribeListener);\r\n+        // export invoker\r\n+        final ExporterChangeableWrapper<T> exporter = doLocalExport(originInvoker, providerUrl);\r\n+\r\n+        // url to registry\r\n+        final Registry registry = getRegistry(originInvoker);\r\n+        final URL registeredProviderUrl = getUrlToRegistry(providerUrl, registryUrl);\r\n+\r\n+        // decide if we need to delay publish\r\n+        boolean register = providerUrl.getParameter(REGISTER_KEY, true);\r\n+        if (register) {\r\n+            registry.register(registeredProviderUrl);\r\n+        }\r\n+\r\n+        // register stated url on provider model\r\n+        registerStatedUrl(registryUrl, registeredProviderUrl, register);\r\n+\r\n+\r\n+        exporter.setRegisterUrl(registeredProviderUrl);\r\n+        exporter.setSubscribeUrl(overrideSubscribeUrl);\r\n+\r\n+        // Deprecated! Subscribe to override rules in 2.6.x or before.\r\n+        registry.subscribe(overrideSubscribeUrl, overrideSubscribeListener);\r\n+\r\n+        notifyExport(exporter);\r\n+        //Ensure that a new exporter instance is returned every time export\r\n+        return new DestroyableExporter<>(exporter);\r\n+    }\r\n+\r\n+    private <T> void notifyExport(ExporterChangeableWrapper<T> exporter) {\r\n+        List<RegistryProtocolListener> listeners = ExtensionLoader.getExtensionLoader(RegistryProtocolListener.class)\r\n+                .getActivateExtension(exporter.getOriginInvoker().getUrl(), \"registry.protocol.listener\");\r\n+        if (CollectionUtils.isNotEmpty(listeners)) {\r\n+            for (RegistryProtocolListener listener : listeners) {\r\n+                listener.onExport(this, exporter);\r\n+            }\r\n+        }\r\n+    }\r\n+\r\n+    private URL overrideUrlWithConfig(URL providerUrl, OverrideListener listener) {\r\n+        providerUrl = providerConfigurationListener.overrideUrl(providerUrl);\r\n+        ServiceConfigurationListener serviceConfigurationListener = new ServiceConfigurationListener(providerUrl, listener);\r\n+        serviceConfigurationListeners.put(providerUrl.getServiceKey(), serviceConfigurationListener);\r\n+        return serviceConfigurationListener.overrideUrl(providerUrl);\r\n+    }\r\n+\r\n+    @SuppressWarnings(\"unchecked\")\r\n+    private <T> ExporterChangeableWrapper<T> doLocalExport(final Invoker<T> originInvoker, URL providerUrl) {\r\n+        String key = getCacheKey(originInvoker);\r\n+\r\n+        return (ExporterChangeableWrapper<T>) bounds.computeIfAbsent(key, s -> {\r\n+            Invoker<?> invokerDelegate = new InvokerDelegate<>(originInvoker, providerUrl);\r\n+            return new ExporterChangeableWrapper<>((Exporter<T>) protocol.export(invokerDelegate), originInvoker);\r\n+        });\r\n+    }\r\n+\r\n+    public <T> void reExport(Exporter<T> exporter, URL newInvokerUrl) {\r\n+        if (exporter instanceof ExporterChangeableWrapper) {\r\n+            ExporterChangeableWrapper<T> exporterWrapper = (ExporterChangeableWrapper<T>) exporter;\r\n+            Invoker<T> originInvoker = exporterWrapper.getOriginInvoker();\r\n+            reExport(originInvoker, newInvokerUrl);\r\n+        }\r\n+    }\r\n+\r\n+    /**\r\n+     * Reexport the invoker of the modified url\r\n+     *\r\n+     * @param originInvoker\r\n+     * @param newInvokerUrl\r\n+     * @param <T>\r\n+     */\r\n+    @SuppressWarnings(\"unchecked\")\r\n+    public <T> void reExport(final Invoker<T> originInvoker, URL newInvokerUrl) {\r\n+        String key = getCacheKey(originInvoker);\r\n+        ExporterChangeableWrapper<T> exporter = (ExporterChangeableWrapper<T>) bounds.get(key);\r\n+        URL registeredUrl = exporter.getRegisterUrl();\r\n+\r\n+        URL registryUrl = getRegistryUrl(originInvoker);\r\n+        URL newProviderUrl = getUrlToRegistry(newInvokerUrl, registryUrl);\r\n+\r\n+        // update local exporter\r\n+        Invoker<T> invokerDelegate = new InvokerDelegate<T>(originInvoker, newInvokerUrl);\r\n+        exporter.setExporter(protocol.export(invokerDelegate));\r\n+\r\n+        // update registry\r\n+        if (!newProviderUrl.equals(registeredUrl)) {\r\n+            try {\r\n+                doReExport(originInvoker, exporter, registryUrl, registeredUrl, newProviderUrl);\r\n+            } catch (Exception e) {\r\n+                ReExportTask oldTask = reExportFailedTasks.get(registeredUrl);\r\n+                if (oldTask != null) {\r\n+                    return;\r\n+                }\r\n+                ReExportTask task = new ReExportTask(\r\n+                        () -> doReExport(originInvoker, exporter, registryUrl, registeredUrl, newProviderUrl),\r\n+                        registeredUrl,\r\n+                        null\r\n+                );\r\n+                oldTask = reExportFailedTasks.putIfAbsent(registeredUrl, task);\r\n+                if (oldTask == null) {\r\n+                    // never has a retry task. then start a new task for retry.\r\n+                    retryTimer.newTimeout(task, registryUrl.getParameter(REGISTRY_RETRY_PERIOD_KEY, DEFAULT_REGISTRY_RETRY_PERIOD), TimeUnit.MILLISECONDS);\r\n+                }\r\n+            }\r\n+        }\r\n+    }\r\n+\r\n+    private <T> void doReExport(final Invoker<T> originInvoker, ExporterChangeableWrapper<T> exporter,\r\n+                                URL registryUrl, URL oldProviderUrl, URL newProviderUrl) {\r\n+        if (getProviderUrl(originInvoker).getParameter(REGISTER_KEY, true)) {\r\n+            Registry registry = null;\r\n+            try {\r\n+                registry = getRegistry(originInvoker);\r\n+            } catch (Exception e) {\r\n+                throw new SkipFailbackWrapperException(e);\r\n+            }\r\n+\r\n+            logger.info(\"Try to unregister old url: \" + oldProviderUrl);\r\n+            registry.reExportUnregister(oldProviderUrl);\r\n+\r\n+            logger.info(\"Try to register new url: \" + newProviderUrl);\r\n+            registry.reExportRegister(newProviderUrl);\r\n+        }\r\n+        try {\r\n+            ProviderModel.RegisterStatedURL statedUrl = getStatedUrl(registryUrl, newProviderUrl);\r\n+            statedUrl.setProviderUrl(newProviderUrl);\r\n+            exporter.setRegisterUrl(newProviderUrl);\r\n+        } catch (Exception e) {\r\n+            throw new SkipFailbackWrapperException(e);\r\n+        }\r\n+    }\r\n+\r\n+    private ProviderModel.RegisterStatedURL getStatedUrl(URL registryUrl, URL providerUrl) {\r\n+        ProviderModel providerModel = ApplicationModel.getServiceRepository()\r\n+                .lookupExportedService(providerUrl.getServiceKey());\r\n+\r\n+        List<ProviderModel.RegisterStatedURL> statedUrls = providerModel.getStatedUrl();\r\n+        return statedUrls.stream()\r\n+                .filter(u -> u.getRegistryUrl().equals(registryUrl)\r\n+                        && u.getProviderUrl().getProtocol().equals(providerUrl.getProtocol()))\r\n+                .findFirst().orElseThrow(() -> new IllegalStateException(\"There should have at least one registered url.\"));\r\n+    }\r\n+\r\n+    /**\r\n+     * Get an instance of registry based on the address of invoker\r\n+     *\r\n+     * @param originInvoker\r\n+     * @return\r\n+     */\r\n+    protected Registry getRegistry(final Invoker<?> originInvoker) {\r\n+        URL registryUrl = getRegistryUrl(originInvoker);\r\n+        return registryFactory.getRegistry(registryUrl);\r\n+    }\r\n+\r\n+    protected URL getRegistryUrl(Invoker<?> originInvoker) {\r\n+        return originInvoker.getUrl();\r\n+    }\r\n+\r\n+    protected URL getRegistryUrl(URL url) {\r\n+        if (SERVICE_REGISTRY_PROTOCOL.equals(url.getProtocol())) {\r\n+            return url;\r\n+        }\r\n+        return url.addParameter(REGISTRY_KEY, url.getProtocol()).setProtocol(SERVICE_REGISTRY_PROTOCOL);\r\n+    }\r\n+\r\n+    /**\r\n+     * Return the url that is registered to the registry and filter the url parameter once\r\n+     *\r\n+     * @param providerUrl\r\n+     * @return url to registry.\r\n+     */\r\n+    private URL getUrlToRegistry(final URL providerUrl, final URL registryUrl) {\r\n+\r\n+        URL registeredProviderUrl = removeUselessParameters(providerUrl);\r\n+\r\n+        //The address you see at the registry\r\n+        if (!registryUrl.getParameter(SIMPLIFIED_KEY, false)) {\r\n+            return registeredProviderUrl.removeParameters(getHiddenKeys(registeredProviderUrl)).removeParameters(\r\n+                    MONITOR_KEY, BIND_IP_KEY, BIND_PORT_KEY, QOS_ENABLE, QOS_HOST, QOS_PORT, ACCEPT_FOREIGN_IP, VALIDATION_KEY,\r\n+                    INTERFACES);\r\n+        } else {\r\n+            String extraKeys = registryUrl.getParameter(EXTRA_KEYS_KEY, \"\");\r\n+            // if path is not the same as interface name then we should keep INTERFACE_KEY,\r\n+            // otherwise, the registry structure of zookeeper would be '/dubbo/path/providers',\r\n+            // but what we expect is '/dubbo/interface/providers'\r\n+            if (!registeredProviderUrl.getPath().equals(registeredProviderUrl.getParameter(INTERFACE_KEY))) {\r\n+                if (StringUtils.isNotEmpty(extraKeys)) {\r\n+                    extraKeys += \",\";\r\n+                }\r\n+                extraKeys += INTERFACE_KEY;\r\n+            }\r\n+            String[] paramsToRegistry = getParamsToRegistry(DEFAULT_REGISTER_PROVIDER_KEYS\r\n+                    , COMMA_SPLIT_PATTERN.split(extraKeys));\r\n+            return URL.valueOf(registeredProviderUrl, paramsToRegistry, registeredProviderUrl.getParameter(METHODS_KEY, (String[]) null));\r\n+        }\r\n+\r\n+    }\r\n+\r\n+    /**\r\n+     * Remove information that does not require registration\r\n+     * @param providerUrl\r\n+     * @return\r\n+     */\r\n+    private URL removeUselessParameters(URL providerUrl) {\r\n+        return providerUrl.removeParameters(ON_CONNECT_KEY, ON_DISCONNECT_KEY);\r\n+    }\r\n+\r\n+    private URL getSubscribedOverrideUrl(URL registeredProviderUrl) {\r\n+        return registeredProviderUrl.setProtocol(PROVIDER_PROTOCOL)\r\n+                .addParameters(CATEGORY_KEY, CONFIGURATORS_CATEGORY, CHECK_KEY, String.valueOf(false));\r\n+    }\r\n+\r\n+    /**\r\n+     * Get the address of the providerUrl through the url of the invoker\r\n+     *\r\n+     * @param originInvoker\r\n+     * @return\r\n+     */\r\n+    private URL getProviderUrl(final Invoker<?> originInvoker) {\r\n+        String export = originInvoker.getUrl().getParameterAndDecoded(EXPORT_KEY);\r\n+        if (export == null || export.length() == 0) {\r\n+            throw new IllegalArgumentException(\"The registry export url is null! registry: \" + originInvoker.getUrl());\r\n+        }\r\n+        return URL.valueOf(export);\r\n+    }\r\n+\r\n+    /**\r\n+     * Get the key cached in bounds by invoker\r\n+     *\r\n+     * @param originInvoker\r\n+     * @return\r\n+     */\r\n+    private String getCacheKey(final Invoker<?> originInvoker) {\r\n+        URL providerUrl = getProviderUrl(originInvoker);\r\n+        String key = providerUrl.removeParameters(\"dynamic\", \"enabled\").toFullString();\r\n+        return key;\r\n+    }\r\n+\r\n+    @Override\r\n+    @SuppressWarnings(\"unchecked\")\r\n+    public <T> Invoker<T> refer(Class<T> type, URL url) throws RpcException {\r\n+        url = getRegistryUrl(url);\r\n+        Registry registry = registryFactory.getRegistry(url);\r\n+        if (RegistryService.class.equals(type)) {\r\n+            return proxyFactory.getInvoker((T) registry, type, url);\r\n+        }\r\n+\r\n+        // group=\"a,b\" or group=\"*\"\r\n+        Map<String, String> qs = StringUtils.parseQueryString(url.getParameterAndDecoded(REFER_KEY));\r\n+        String group = qs.get(GROUP_KEY);\r\n+        if (group != null && group.length() > 0) {\r\n+            if ((COMMA_SPLIT_PATTERN.split(group)).length > 1 || \"*\".equals(group)) {\r\n+                return doRefer(Cluster.getCluster(MergeableCluster.NAME), registry, type, url, qs);\r\n+            }\r\n+        }\r\n+\r\n+        Cluster cluster = Cluster.getCluster(qs.get(CLUSTER_KEY));\r\n+        return doRefer(cluster, registry, type, url, qs);\r\n+    }\r\n+\r\n+    protected <T> Invoker<T> doRefer(Cluster cluster, Registry registry, Class<T> type, URL url, Map<String, String> parameters) {\r\n+        URL consumerUrl = new URL(CONSUMER_PROTOCOL, parameters.remove(REGISTER_IP_KEY), 0, type.getName(), parameters);\r\n+        ClusterInvoker<T> migrationInvoker = getMigrationInvoker(this, cluster, registry, type, url, consumerUrl);\r\n+        return interceptInvoker(migrationInvoker, url, consumerUrl);\r\n+    }\r\n+\r\n+    protected <T> ClusterInvoker<T> getMigrationInvoker(RegistryProtocol registryProtocol, Cluster cluster, Registry registry, Class<T> type, URL url, URL consumerUrl) {\r\n+        return new ServiceDiscoveryMigrationInvoker<T>(registryProtocol, cluster, registry, type, url, consumerUrl);\r\n+    }\r\n+\r\n+    protected <T> Invoker<T> interceptInvoker(ClusterInvoker<T> invoker, URL url, URL consumerUrl) {\r\n+        List<RegistryProtocolListener> listeners = findRegistryProtocolListeners(url);\r\n+        if (CollectionUtils.isEmpty(listeners)) {\r\n+            return invoker;\r\n+        }\r\n+\r\n+        for (RegistryProtocolListener listener : listeners) {\r\n+            listener.onRefer(this, invoker, consumerUrl);\r\n+        }\r\n+        return invoker;\r\n+    }\r\n+\r\n+    public <T> ClusterInvoker<T> getServiceDiscoveryInvoker(Cluster cluster, Registry registry, Class<T> type, URL url) {\r\n+        DynamicDirectory<T> directory = new ServiceDiscoveryRegistryDirectory<>(type, url);\r\n+        return doCreateInvoker(directory, cluster, registry, type);\r\n+    }\r\n+\r\n+    public <T> ClusterInvoker<T> getInvoker(Cluster cluster, Registry registry, Class<T> type, URL url) {\r\n+        // FIXME, this method is currently not used, create the right registry before enable.\r\n+        DynamicDirectory<T> directory = new RegistryDirectory<>(type, url);\r\n+        return doCreateInvoker(directory, cluster, registry, type);\r\n+    }\r\n+\r\n+    protected <T> ClusterInvoker<T> doCreateInvoker(DynamicDirectory<T> directory, Cluster cluster, Registry registry, Class<T> type) {\r\n+        directory.setRegistry(registry);\r\n+        directory.setProtocol(protocol);\r\n+        // all attributes of REFER_KEY\r\n+        Map<String, String> parameters = new HashMap<String, String>(directory.getConsumerUrl().getParameters());\r\n+        URL urlToRegistry = new URL(CONSUMER_PROTOCOL, parameters.remove(REGISTER_IP_KEY), 0, type.getName(), parameters);\r\n+        if (directory.isShouldRegister()) {\r\n+            directory.setRegisteredConsumerUrl(urlToRegistry);\r\n+            registry.register(directory.getRegisteredConsumerUrl());\r\n+        }\r\n+        directory.buildRouterChain(urlToRegistry);\r\n+        directory.subscribe(toSubscribeUrl(urlToRegistry));\r\n+\r\n+        return (ClusterInvoker<T>) cluster.join(directory);\r\n+    }\r\n+\r\n+    public <T> void reRefer(ClusterInvoker<?> invoker, URL newSubscribeUrl) {\r\n+        if (!(invoker instanceof MigrationClusterInvoker)) {\r\n+            logger.error(\"Only invoker type of MigrationClusterInvoker supports reRefer, current invoker is \" + invoker.getClass());\r\n+            return;\r\n+        }\r\n+\r\n+        MigrationClusterInvoker<?> migrationClusterInvoker = (MigrationClusterInvoker<?>)invoker;\r\n+        migrationClusterInvoker.reRefer(newSubscribeUrl);\r\n+    }\r\n+\r\n+    public static URL toSubscribeUrl(URL url) {\r\n+        return url.addParameter(CATEGORY_KEY, PROVIDERS_CATEGORY + \",\" + CONFIGURATORS_CATEGORY + \",\" + ROUTERS_CATEGORY);\r\n+    }\r\n+\r\n+    protected List<RegistryProtocolListener> findRegistryProtocolListeners(URL url) {\r\n+        return ExtensionLoader.getExtensionLoader(RegistryProtocolListener.class)\r\n+                .getActivateExtension(url, \"registry.protocol.listener\");\r\n+    }\r\n+\r\n+    // available to test\r\n+    public String[] getParamsToRegistry(String[] defaultKeys, String[] additionalParameterKeys) {\r\n+        int additionalLen = additionalParameterKeys.length;\r\n+        String[] registryParams = new String[defaultKeys.length + additionalLen];\r\n+        System.arraycopy(defaultKeys, 0, registryParams, 0, defaultKeys.length);\r\n+        System.arraycopy(additionalParameterKeys, 0, registryParams, defaultKeys.length, additionalLen);\r\n+        return registryParams;\r\n+    }\r\n+\r\n+    @Override\r\n+    public void destroy() {\r\n+        List<RegistryProtocolListener> listeners = ExtensionLoader.getExtensionLoader(RegistryProtocolListener.class)\r\n+                .getLoadedExtensionInstances();\r\n+        if (CollectionUtils.isNotEmpty(listeners)) {\r\n+            for (RegistryProtocolListener listener : listeners) {\r\n+                listener.onDestroy();\r\n+            }\r\n+        }\r\n+\r\n+        List<Exporter<?>> exporters = new ArrayList<Exporter<?>>(bounds.values());\r\n+        for (Exporter<?> exporter : exporters) {\r\n+            exporter.unexport();\r\n+        }\r\n+        bounds.clear();\r\n+\r\n+        ExtensionLoader.getExtensionLoader(GovernanceRuleRepository.class).getDefaultExtension()\r\n+                .removeListener(ApplicationModel.getApplication() + CONFIGURATORS_SUFFIX, providerConfigurationListener);\r\n+    }\r\n+\r\n+    @Override\r\n+    public List<ProtocolServer> getServers() {\r\n+        return protocol.getServers();\r\n+    }\r\n+\r\n+    // merge the urls of configurators\r\n+    private static URL getConfiguredInvokerUrl(List<Configurator> configurators, URL url) {\r\n+        if (configurators != null && configurators.size() > 0) {\r\n+            for (Configurator configurator : configurators) {\r\n+                url = configurator.configure(url);\r\n+            }\r\n+        }\r\n+        return url;\r\n+    }\r\n+\r\n+    public static class InvokerDelegate<T> extends InvokerWrapper<T> {\r\n+        private final Invoker<T> invoker;\r\n+\r\n+        /**\r\n+         * @param invoker\r\n+         * @param url     invoker.getUrl return this value\r\n+         */\r\n+        public InvokerDelegate(Invoker<T> invoker, URL url) {\r\n+            super(invoker, url);\r\n+            this.invoker = invoker;\r\n+        }\r\n+\r\n+        public Invoker<T> getInvoker() {\r\n+            if (invoker instanceof InvokerDelegate) {\r\n+                return ((InvokerDelegate<T>) invoker).getInvoker();\r\n+            } else {\r\n+                return invoker;\r\n+            }\r\n+        }\r\n+    }\r\n+\r\n+    private static class DestroyableExporter<T> implements Exporter<T> {\r\n+\r\n+        private Exporter<T> exporter;\r\n+\r\n+        public DestroyableExporter(Exporter<T> exporter) {\r\n+            this.exporter = exporter;\r\n+        }\r\n+\r\n+        @Override\r\n+        public Invoker<T> getInvoker() {\r\n+            return exporter.getInvoker();\r\n+        }\r\n+\r\n+        @Override\r\n+        public void unexport() {\r\n+            exporter.unexport();\r\n+        }\r\n+    }\r\n+\r\n+    /**\r\n+     * Reexport: the exporter destroy problem in protocol\r\n+     * 1.Ensure that the exporter returned by registryprotocol can be normal destroyed\r\n+     * 2.No need to re-register to the registry after notify\r\n+     * 3.The invoker passed by the export method , would better to be the invoker of exporter\r\n+     */\r\n+    private class OverrideListener implements NotifyListener {\r\n+        private final URL subscribeUrl;\r\n+        private final Invoker originInvoker;\r\n+\r\n+\r\n+        private List<Configurator> configurators;\r\n+\r\n+        public OverrideListener(URL subscribeUrl, Invoker originalInvoker) {\r\n+            this.subscribeUrl = subscribeUrl;\r\n+            this.originInvoker = originalInvoker;\r\n+        }\r\n+\r\n+        /**\r\n+         * @param urls The list of registered information, is always not empty, The meaning is the same as the\r\n+         *             return value of {@link org.apache.dubbo.registry.RegistryService#lookup(URL)}.\r\n+         */\r\n+        @Override\r\n+        public synchronized void notify(List<URL> urls) {\r\n+            logger.debug(\"original override urls: \" + urls);\r\n+\r\n+            List<URL> matchedUrls = getMatchedUrls(urls, subscribeUrl.addParameter(CATEGORY_KEY,\r\n+                    CONFIGURATORS_CATEGORY));\r\n+            logger.debug(\"subscribe url: \" + subscribeUrl + \", override urls: \" + matchedUrls);\r\n+\r\n+            // No matching results\r\n+            if (matchedUrls.isEmpty()) {\r\n+                return;\r\n+            }\r\n+\r\n+            this.configurators = Configurator.toConfigurators(classifyUrls(matchedUrls, UrlUtils::isConfigurator))\r\n+                    .orElse(configurators);\r\n+\r\n+            doOverrideIfNecessary();\r\n+        }\r\n+\r\n+        public synchronized void doOverrideIfNecessary() {\r\n+            final Invoker<?> invoker;\r\n+            if (originInvoker instanceof InvokerDelegate) {\r\n+                invoker = ((InvokerDelegate<?>) originInvoker).getInvoker();\r\n+            } else {\r\n+                invoker = originInvoker;\r\n+            }\r\n+            //The origin invoker\r\n+            URL originUrl = RegistryProtocol.this.getProviderUrl(invoker);\r\n+            String key = getCacheKey(originInvoker);\r\n+            ExporterChangeableWrapper<?> exporter = bounds.get(key);\r\n+            if (exporter == null) {\r\n+                logger.warn(new IllegalStateException(\"error state, exporter should not be null\"));\r\n+                return;\r\n+            }\r\n+            //The current, may have been merged many times\r\n+            URL currentUrl = exporter.getInvoker().getUrl();\r\n+            //Merged with this configuration\r\n+            URL newUrl = getConfiguredInvokerUrl(configurators, currentUrl);\r\n+            newUrl = getConfiguredInvokerUrl(providerConfigurationListener.getConfigurators(), newUrl);\r\n+            newUrl = getConfiguredInvokerUrl(serviceConfigurationListeners.get(originUrl.getServiceKey())\r\n+                    .getConfigurators(), newUrl);\r\n+            if (!currentUrl.equals(newUrl)) {\r\n+                RegistryProtocol.this.reExport(originInvoker, newUrl);\r\n+                logger.info(\"exported provider url changed, origin url: \" + originUrl +\r\n+                        \", old export url: \" + currentUrl + \", new export url: \" + newUrl);\r\n+            }\r\n+        }\r\n+\r\n+        private List<URL> getMatchedUrls(List<URL> configuratorUrls, URL currentSubscribe) {\r\n+            List<URL> result = new ArrayList<URL>();\r\n+            for (URL url : configuratorUrls) {\r\n+                URL overrideUrl = url;\r\n+                // Compatible with the old version\r\n+                if (url.getParameter(CATEGORY_KEY) == null && OVERRIDE_PROTOCOL.equals(url.getProtocol())) {\r\n+                    overrideUrl = url.addParameter(CATEGORY_KEY, CONFIGURATORS_CATEGORY);\r\n+                }\r\n+\r\n+                // Check whether url is to be applied to the current service\r\n+                if (UrlUtils.isMatch(currentSubscribe, overrideUrl)) {\r\n+                    result.add(url);\r\n+                }\r\n+            }\r\n+            return result;\r\n+        }\r\n+    }\r\n+\r\n+    private class ServiceConfigurationListener extends AbstractConfiguratorListener {\r\n+        private URL providerUrl;\r\n+        private OverrideListener notifyListener;\r\n+\r\n+        public ServiceConfigurationListener(URL providerUrl, OverrideListener notifyListener) {\r\n+            this.providerUrl = providerUrl;\r\n+            this.notifyListener = notifyListener;\r\n+            this.initWith(DynamicConfiguration.getRuleKey(providerUrl) + CONFIGURATORS_SUFFIX);\r\n+        }\r\n+\r\n+        private <T> URL overrideUrl(URL providerUrl) {\r\n+            return RegistryProtocol.getConfiguredInvokerUrl(configurators, providerUrl);\r\n+        }\r\n+\r\n+        @Override\r\n+        protected void notifyOverrides() {\r\n+            notifyListener.doOverrideIfNecessary();\r\n+        }\r\n+    }\r\n+\r\n+    private class ProviderConfigurationListener extends AbstractConfiguratorListener {\r\n+\r\n+        public ProviderConfigurationListener() {\r\n+            this.initWith(ApplicationModel.getApplication() + CONFIGURATORS_SUFFIX);\r\n+        }\r\n+\r\n+        /**\r\n+         * Get existing configuration rule and override provider url before exporting.\r\n+         *\r\n+         * @param providerUrl\r\n+         * @param <T>\r\n+         * @return\r\n+         */\r\n+        private <T> URL overrideUrl(URL providerUrl) {\r\n+            return RegistryProtocol.getConfiguredInvokerUrl(configurators, providerUrl);\r\n+        }\r\n+\r\n+        @Override\r\n+        protected void notifyOverrides() {\r\n+            overrideListeners.values().forEach(listener -> ((OverrideListener) listener).doOverrideIfNecessary());\r\n+        }\r\n+    }\r\n+\r\n+    /**\r\n+     * exporter proxy, establish the corresponding relationship between the returned exporter and the exporter\r\n+     * exported by the protocol, and can modify the relationship at the time of override.\r\n+     *\r\n+     * @param <T>\r\n+     */\r\n+    private class ExporterChangeableWrapper<T> implements Exporter<T> {\r\n+\r\n+        private final ExecutorService executor = newSingleThreadExecutor(new NamedThreadFactory(\"Exporter-Unexport\", true));\r\n+\r\n+        private final Invoker<T> originInvoker;\r\n+        private Exporter<T> exporter;\r\n+        private URL subscribeUrl;\r\n+        private URL registerUrl;\r\n+\r\n+        public ExporterChangeableWrapper(Exporter<T> exporter, Invoker<T> originInvoker) {\r\n+            this.exporter = exporter;\r\n+            this.originInvoker = originInvoker;\r\n+        }\r\n+\r\n+        public Invoker<T> getOriginInvoker() {\r\n+            return originInvoker;\r\n+        }\r\n+\r\n+        @Override\r\n+        public Invoker<T> getInvoker() {\r\n+            return exporter.getInvoker();\r\n+        }\r\n+\r\n+        public void setExporter(Exporter<T> exporter) {\r\n+            this.exporter = exporter;\r\n+        }\r\n+\r\n+        @Override\r\n+        public void unexport() {\r\n+            String key = getCacheKey(this.originInvoker);\r\n+            bounds.remove(key);\r\n+\r\n+            Registry registry = RegistryProtocol.this.getRegistry(originInvoker);\r\n+            try {\r\n+                registry.unregister(registerUrl);\r\n+            } catch (Throwable t) {\r\n+                logger.warn(t.getMessage(), t);\r\n+            }\r\n+            try {\r\n+                NotifyListener listener = RegistryProtocol.this.overrideListeners.remove(subscribeUrl);\r\n+                registry.unsubscribe(subscribeUrl, listener);\r\n+                ExtensionLoader.getExtensionLoader(GovernanceRuleRepository.class).getDefaultExtension()\r\n+                        .removeListener(subscribeUrl.getServiceKey() + CONFIGURATORS_SUFFIX,\r\n+                                serviceConfigurationListeners.get(subscribeUrl.getServiceKey()));\r\n+            } catch (Throwable t) {\r\n+                logger.warn(t.getMessage(), t);\r\n+            }\r\n+\r\n+            executor.submit(() -> {\r\n+                try {\r\n+                    int timeout = ConfigurationUtils.getServerShutdownTimeout();\r\n+                    if (timeout > 0) {\r\n+                        logger.info(\"Waiting \" + timeout + \"ms for registry to notify all consumers before unexport. \" +\r\n+                                \"Usually, this is called when you use dubbo API\");\r\n+                        Thread.sleep(timeout);\r\n+                    }\r\n+                    exporter.unexport();\r\n+                } catch (Throwable t) {\r\n+                    logger.warn(t.getMessage(), t);\r\n+                }\r\n+            });\r\n+        }\r\n+\r\n+        public void setSubscribeUrl(URL subscribeUrl) {\r\n+            this.subscribeUrl = subscribeUrl;\r\n+        }\r\n+\r\n+        public void setRegisterUrl(URL registerUrl) {\r\n+            this.registerUrl = registerUrl;\r\n+        }\r\n+\r\n+        public URL getRegisterUrl() {\r\n+            return registerUrl;\r\n+        }\r\n+    }\r\n+\r\n+    // for unit test\r\n+    private static RegistryProtocol INSTANCE;\r\n+\r\n+    // for unit test\r\n+    public RegistryProtocol() {\r\n+        INSTANCE = this;\r\n+    }\r\n+\r\n+    // for unit test\r\n+    public static RegistryProtocol getRegistryProtocol() {\r\n+        if (INSTANCE == null) {\r\n+            ExtensionLoader.getExtensionLoader(Protocol.class).getExtension(REGISTRY_PROTOCOL); // load\r\n+        }\r\n+        return INSTANCE;\r\n+    }\r\n+}\r\n"}, {"source1": "org/apache/dubbo/registry/integration/RegistryProtocolListener.java", "source2": "org/apache/dubbo/registry/integration/RegistryProtocolListener.java", "comments": ["Line-ending differences only"], "unified_diff": "@@ -1,53 +1,53 @@\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.integration;\n-\n-import org.apache.dubbo.common.URL;\n-import org.apache.dubbo.common.extension.SPI;\n-import org.apache.dubbo.rpc.Exporter;\n-import org.apache.dubbo.rpc.cluster.ClusterInvoker;\n-\n-/**\n- * RegistryProtocol listener is introduced to provide a chance to user to customize or change export and refer behavior\n- * of RegistryProtocol. For example: re-export or re-refer on the fly when certain condition meets.\n- */\n-@SPI\n-public interface RegistryProtocolListener {\n-    /**\n-     * Notify RegistryProtocol's listeners when a service is registered\n-     *\n-     * @param registryProtocol RegistryProtocol instance\n-     * @param exporter         exporter\n-     * @see RegistryProtocol#export(org.apache.dubbo.rpc.Invoker)\n-     */\n-    void onExport(RegistryProtocol registryProtocol, Exporter<?> exporter);\n-\n-    /**\n-     * Notify RegistryProtocol's listeners when a service is subscribed\n-     *\n-     * @param registryProtocol RegistryProtocol instance\n-     * @param invoker          invoker\n-     * @param url\n-     * @see RegistryProtocol#refer(Class, URL)\n-     */\n-    void onRefer(RegistryProtocol registryProtocol, ClusterInvoker<?> invoker, URL url);\n-\n-    /**\n-     * Notify RegistryProtocol's listeners when the protocol is destroyed\n-     */\n-    void onDestroy();\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.integration;\r\n+\r\n+import org.apache.dubbo.common.URL;\r\n+import org.apache.dubbo.common.extension.SPI;\r\n+import org.apache.dubbo.rpc.Exporter;\r\n+import org.apache.dubbo.rpc.cluster.ClusterInvoker;\r\n+\r\n+/**\r\n+ * RegistryProtocol listener is introduced to provide a chance to user to customize or change export and refer behavior\r\n+ * of RegistryProtocol. For example: re-export or re-refer on the fly when certain condition meets.\r\n+ */\r\n+@SPI\r\n+public interface RegistryProtocolListener {\r\n+    /**\r\n+     * Notify RegistryProtocol's listeners when a service is registered\r\n+     *\r\n+     * @param registryProtocol RegistryProtocol instance\r\n+     * @param exporter         exporter\r\n+     * @see RegistryProtocol#export(org.apache.dubbo.rpc.Invoker)\r\n+     */\r\n+    void onExport(RegistryProtocol registryProtocol, Exporter<?> exporter);\r\n+\r\n+    /**\r\n+     * Notify RegistryProtocol's listeners when a service is subscribed\r\n+     *\r\n+     * @param registryProtocol RegistryProtocol instance\r\n+     * @param invoker          invoker\r\n+     * @param url\r\n+     * @see RegistryProtocol#refer(Class, URL)\r\n+     */\r\n+    void onRefer(RegistryProtocol registryProtocol, ClusterInvoker<?> invoker, URL url);\r\n+\r\n+    /**\r\n+     * Notify RegistryProtocol's listeners when the protocol is destroyed\r\n+     */\r\n+    void onDestroy();\r\n+}\r\n"}, {"source1": "org/apache/dubbo/registry/retry/AbstractRetryTask.java", "source2": "org/apache/dubbo/registry/retry/AbstractRetryTask.java", "comments": ["Line-ending differences only"], "unified_diff": "@@ -1,133 +1,133 @@\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-\n-package org.apache.dubbo.registry.retry;\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.timer.Timeout;\n-import org.apache.dubbo.common.timer.Timer;\n-import org.apache.dubbo.common.timer.TimerTask;\n-import org.apache.dubbo.common.utils.StringUtils;\n-import org.apache.dubbo.registry.support.FailbackRegistry;\n-\n-import java.util.concurrent.TimeUnit;\n-\n-import static org.apache.dubbo.registry.Constants.DEFAULT_REGISTRY_RETRY_PERIOD;\n-import static org.apache.dubbo.registry.Constants.DEFAULT_REGISTRY_RETRY_TIMES;\n-import static org.apache.dubbo.registry.Constants.REGISTRY_RETRY_PERIOD_KEY;\n-import static org.apache.dubbo.registry.Constants.REGISTRY_RETRY_TIMES_KEY;\n-\n-/**\n- * AbstractRetryTask\n- */\n-public abstract class AbstractRetryTask implements TimerTask {\n-\n-    protected final Logger logger = LoggerFactory.getLogger(getClass());\n-\n-    /**\n-     * url for retry task\n-     */\n-    protected final URL url;\n-\n-    /**\n-     * registry for this task\n-     */\n-    protected final FailbackRegistry registry;\n-\n-    /**\n-     * retry period\n-     */\n-    final long retryPeriod;\n-\n-    /**\n-     * define the most retry times\n-     */\n-    private final int retryTimes;\n-\n-    /**\n-     * task name for this task\n-     */\n-    private final String taskName;\n-\n-    /**\n-     * times of retry.\n-     * retry task is execute in single thread so that the times is not need volatile.\n-     */\n-    private int times = 1;\n-\n-    private volatile boolean cancel;\n-\n-    AbstractRetryTask(URL url, FailbackRegistry registry, String taskName) {\n-        if (url == null || StringUtils.isBlank(taskName)) {\n-            throw new IllegalArgumentException();\n-        }\n-        this.url = url;\n-        this.registry = registry;\n-        this.taskName = taskName;\n-        cancel = false;\n-        this.retryPeriod = url.getParameter(REGISTRY_RETRY_PERIOD_KEY, DEFAULT_REGISTRY_RETRY_PERIOD);\n-        this.retryTimes = url.getParameter(REGISTRY_RETRY_TIMES_KEY, DEFAULT_REGISTRY_RETRY_TIMES);\n-    }\n-\n-    public void cancel() {\n-        cancel = true;\n-    }\n-\n-    public boolean isCancel() {\n-        return cancel;\n-    }\n-\n-    protected void reput(Timeout timeout, long tick) {\n-        if (timeout == null) {\n-            throw new IllegalArgumentException();\n-        }\n-\n-        Timer timer = timeout.timer();\n-        if (timer.isStop() || timeout.isCancelled() || isCancel()) {\n-            return;\n-        }\n-        times++;\n-        timer.newTimeout(timeout.task(), tick, TimeUnit.MILLISECONDS);\n-    }\n-\n-    @Override\n-    public void run(Timeout timeout) throws Exception {\n-        if (timeout.isCancelled() || timeout.timer().isStop() || isCancel()) {\n-            // other thread cancel this timeout or stop the timer.\n-            return;\n-        }\n-        if (times > retryTimes) {\n-            // reach the most times of retry.\n-            logger.warn(\"Final failed to execute task \" + taskName + \", url: \" + url + \", retry \" + retryTimes + \" times.\");\n-            return;\n-        }\n-        if (logger.isInfoEnabled()) {\n-            logger.info(taskName + \" : \" + url);\n-        }\n-        try {\n-            doRetry(url, registry, timeout);\n-        } catch (Throwable t) { // Ignore all the exceptions and wait for the next retry\n-            logger.warn(\"Failed to execute task \" + taskName + \", url: \" + url + \", waiting for again, cause:\" + t.getMessage(), t);\n-            // reput this task when catch exception.\n-            reput(timeout, retryPeriod);\n-        }\n-    }\n-\n-    protected abstract void doRetry(URL url, FailbackRegistry registry, Timeout timeout);\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+\r\n+package org.apache.dubbo.registry.retry;\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.timer.Timeout;\r\n+import org.apache.dubbo.common.timer.Timer;\r\n+import org.apache.dubbo.common.timer.TimerTask;\r\n+import org.apache.dubbo.common.utils.StringUtils;\r\n+import org.apache.dubbo.registry.support.FailbackRegistry;\r\n+\r\n+import java.util.concurrent.TimeUnit;\r\n+\r\n+import static org.apache.dubbo.registry.Constants.DEFAULT_REGISTRY_RETRY_PERIOD;\r\n+import static org.apache.dubbo.registry.Constants.DEFAULT_REGISTRY_RETRY_TIMES;\r\n+import static org.apache.dubbo.registry.Constants.REGISTRY_RETRY_PERIOD_KEY;\r\n+import static org.apache.dubbo.registry.Constants.REGISTRY_RETRY_TIMES_KEY;\r\n+\r\n+/**\r\n+ * AbstractRetryTask\r\n+ */\r\n+public abstract class AbstractRetryTask implements TimerTask {\r\n+\r\n+    protected final Logger logger = LoggerFactory.getLogger(getClass());\r\n+\r\n+    /**\r\n+     * url for retry task\r\n+     */\r\n+    protected final URL url;\r\n+\r\n+    /**\r\n+     * registry for this task\r\n+     */\r\n+    protected final FailbackRegistry registry;\r\n+\r\n+    /**\r\n+     * retry period\r\n+     */\r\n+    final long retryPeriod;\r\n+\r\n+    /**\r\n+     * define the most retry times\r\n+     */\r\n+    private final int retryTimes;\r\n+\r\n+    /**\r\n+     * task name for this task\r\n+     */\r\n+    private final String taskName;\r\n+\r\n+    /**\r\n+     * times of retry.\r\n+     * retry task is execute in single thread so that the times is not need volatile.\r\n+     */\r\n+    private int times = 1;\r\n+\r\n+    private volatile boolean cancel;\r\n+\r\n+    AbstractRetryTask(URL url, FailbackRegistry registry, String taskName) {\r\n+        if (url == null || StringUtils.isBlank(taskName)) {\r\n+            throw new IllegalArgumentException();\r\n+        }\r\n+        this.url = url;\r\n+        this.registry = registry;\r\n+        this.taskName = taskName;\r\n+        cancel = false;\r\n+        this.retryPeriod = url.getParameter(REGISTRY_RETRY_PERIOD_KEY, DEFAULT_REGISTRY_RETRY_PERIOD);\r\n+        this.retryTimes = url.getParameter(REGISTRY_RETRY_TIMES_KEY, DEFAULT_REGISTRY_RETRY_TIMES);\r\n+    }\r\n+\r\n+    public void cancel() {\r\n+        cancel = true;\r\n+    }\r\n+\r\n+    public boolean isCancel() {\r\n+        return cancel;\r\n+    }\r\n+\r\n+    protected void reput(Timeout timeout, long tick) {\r\n+        if (timeout == null) {\r\n+            throw new IllegalArgumentException();\r\n+        }\r\n+\r\n+        Timer timer = timeout.timer();\r\n+        if (timer.isStop() || timeout.isCancelled() || isCancel()) {\r\n+            return;\r\n+        }\r\n+        times++;\r\n+        timer.newTimeout(timeout.task(), tick, TimeUnit.MILLISECONDS);\r\n+    }\r\n+\r\n+    @Override\r\n+    public void run(Timeout timeout) throws Exception {\r\n+        if (timeout.isCancelled() || timeout.timer().isStop() || isCancel()) {\r\n+            // other thread cancel this timeout or stop the timer.\r\n+            return;\r\n+        }\r\n+        if (times > retryTimes) {\r\n+            // reach the most times of retry.\r\n+            logger.warn(\"Final failed to execute task \" + taskName + \", url: \" + url + \", retry \" + retryTimes + \" times.\");\r\n+            return;\r\n+        }\r\n+        if (logger.isInfoEnabled()) {\r\n+            logger.info(taskName + \" : \" + url);\r\n+        }\r\n+        try {\r\n+            doRetry(url, registry, timeout);\r\n+        } catch (Throwable t) { // Ignore all the exceptions and wait for the next retry\r\n+            logger.warn(\"Failed to execute task \" + taskName + \", url: \" + url + \", waiting for again, cause:\" + t.getMessage(), t);\r\n+            // reput this task when catch exception.\r\n+            reput(timeout, retryPeriod);\r\n+        }\r\n+    }\r\n+\r\n+    protected abstract void doRetry(URL url, FailbackRegistry registry, Timeout timeout);\r\n+}\r\n"}, {"source1": "org/apache/dubbo/registry/retry/ReExportTask.java", "source2": "org/apache/dubbo/registry/retry/ReExportTask.java", "comments": ["Line-ending differences only"], "unified_diff": "@@ -1,41 +1,41 @@\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.retry;\n-\n-import org.apache.dubbo.common.URL;\n-import org.apache.dubbo.common.timer.Timeout;\n-import org.apache.dubbo.registry.support.FailbackRegistry;\n-\n-/**\n- *\n- */\n-public class ReExportTask extends AbstractRetryTask {\n-\n-    private static final String NAME = \"retry re-export\";\n-\n-    private Runnable runnable;\n-\n-    public ReExportTask(Runnable runnable, URL oldUrl, FailbackRegistry registry) {\n-        super(oldUrl, registry, NAME);\n-        this.runnable = runnable;\n-    }\n-\n-    @Override\n-    protected void doRetry(URL oldUrl, FailbackRegistry registry, Timeout timeout) {\n-        runnable.run();\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.retry;\r\n+\r\n+import org.apache.dubbo.common.URL;\r\n+import org.apache.dubbo.common.timer.Timeout;\r\n+import org.apache.dubbo.registry.support.FailbackRegistry;\r\n+\r\n+/**\r\n+ *\r\n+ */\r\n+public class ReExportTask extends AbstractRetryTask {\r\n+\r\n+    private static final String NAME = \"retry re-export\";\r\n+\r\n+    private Runnable runnable;\r\n+\r\n+    public ReExportTask(Runnable runnable, URL oldUrl, FailbackRegistry registry) {\r\n+        super(oldUrl, registry, NAME);\r\n+        this.runnable = runnable;\r\n+    }\r\n+\r\n+    @Override\r\n+    protected void doRetry(URL oldUrl, FailbackRegistry registry, Timeout timeout) {\r\n+        runnable.run();\r\n+    }\r\n+}\r\n"}]}
